@gongrzhe/server-jira 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +374 -0
- package/dist/common/context.d.ts +15 -0
- package/dist/common/context.d.ts.map +1 -0
- package/dist/common/context.js +33 -0
- package/dist/common/context.js.map +1 -0
- package/dist/common/errors.d.ts +26 -0
- package/dist/common/errors.d.ts.map +1 -0
- package/dist/common/errors.js +71 -0
- package/dist/common/errors.js.map +1 -0
- package/dist/common/token-parser.d.ts +53 -0
- package/dist/common/token-parser.d.ts.map +1 -0
- package/dist/common/token-parser.js +117 -0
- package/dist/common/token-parser.js.map +1 -0
- package/dist/common/types.d.ts +151 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/types.js +2 -0
- package/dist/common/types.js.map +1 -0
- package/dist/common/utils.d.ts +9 -0
- package/dist/common/utils.d.ts.map +1 -0
- package/dist/common/utils.js +116 -0
- package/dist/common/utils.js.map +1 -0
- package/dist/common/version.d.ts +2 -0
- package/dist/common/version.d.ts.map +1 -0
- package/dist/common/version.js +3 -0
- package/dist/common/version.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +505 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/atlassian.d.ts +27 -0
- package/dist/operations/atlassian.d.ts.map +1 -0
- package/dist/operations/atlassian.js +27 -0
- package/dist/operations/atlassian.js.map +1 -0
- package/dist/operations/comments.d.ts +117 -0
- package/dist/operations/comments.d.ts.map +1 -0
- package/dist/operations/comments.js +153 -0
- package/dist/operations/comments.js.map +1 -0
- package/dist/operations/issues.d.ts +146 -0
- package/dist/operations/issues.d.ts.map +1 -0
- package/dist/operations/issues.js +250 -0
- package/dist/operations/issues.js.map +1 -0
- package/dist/operations/metadata.d.ts +176 -0
- package/dist/operations/metadata.d.ts.map +1 -0
- package/dist/operations/metadata.js +143 -0
- package/dist/operations/metadata.js.map +1 -0
- package/dist/operations/projects.d.ts +159 -0
- package/dist/operations/projects.d.ts.map +1 -0
- package/dist/operations/projects.js +175 -0
- package/dist/operations/projects.js.map +1 -0
- package/dist/operations/users.d.ts +130 -0
- package/dist/operations/users.d.ts.map +1 -0
- package/dist/operations/users.js +214 -0
- package/dist/operations/users.js.map +1 -0
- package/dist/operations/workflow.d.ts +110 -0
- package/dist/operations/workflow.d.ts.map +1 -0
- package/dist/operations/workflow.js +203 -0
- package/dist/operations/workflow.js.map +1 -0
- package/dist/operations/worklog.d.ts +175 -0
- package/dist/operations/worklog.d.ts.map +1 -0
- package/dist/operations/worklog.js +322 -0
- package/dist/operations/worklog.js.map +1 -0
- package/dist/test-token-discovery.d.ts +6 -0
- package/dist/test-token-discovery.d.ts.map +1 -0
- package/dist/test-token-discovery.js +26 -0
- package/dist/test-token-discovery.js.map +1 -0
- package/package.json +54 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,505 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
6
|
+
import express from 'express';
|
|
7
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
8
|
+
// Import operations
|
|
9
|
+
import * as issues from './operations/issues.js';
|
|
10
|
+
import * as comments from './operations/comments.js';
|
|
11
|
+
import * as projects from './operations/projects.js';
|
|
12
|
+
import * as workflow from './operations/workflow.js';
|
|
13
|
+
import * as users from './operations/users.js';
|
|
14
|
+
import * as metadata from './operations/metadata.js';
|
|
15
|
+
import * as worklog from './operations/worklog.js';
|
|
16
|
+
// Import common utilities
|
|
17
|
+
import { VERSION } from "./common/version.js";
|
|
18
|
+
import { authStorage } from "./common/context.js";
|
|
19
|
+
import { isJiraError, } from './common/errors.js';
|
|
20
|
+
import { truncateText } from './common/utils.js';
|
|
21
|
+
import { getCachedSiteInfo } from './common/token-parser.js';
|
|
22
|
+
const asyncLocalStorage = new AsyncLocalStorage();
|
|
23
|
+
// Factory function to create fresh server instances
|
|
24
|
+
function createStatelessServer() {
|
|
25
|
+
const server = new Server({
|
|
26
|
+
name: "jira-mcp-server",
|
|
27
|
+
version: VERSION,
|
|
28
|
+
}, {
|
|
29
|
+
capabilities: {
|
|
30
|
+
tools: {},
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
34
|
+
return {
|
|
35
|
+
tools: [
|
|
36
|
+
// Issue Management Tools
|
|
37
|
+
{
|
|
38
|
+
name: "jira_get_issue",
|
|
39
|
+
description: "Get details of a specific JIRA issue by key",
|
|
40
|
+
inputSchema: zodToJsonSchema(issues.GetIssueSchema),
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "jira_search_issues",
|
|
44
|
+
description: "Search for JIRA issues using JQL (JIRA Query Language)",
|
|
45
|
+
inputSchema: zodToJsonSchema(issues.SearchIssuesSchema),
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "jira_create_issue",
|
|
49
|
+
description: "Create a new JIRA issue",
|
|
50
|
+
inputSchema: zodToJsonSchema(issues.CreateIssueSchema),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: "jira_update_issue",
|
|
54
|
+
description: "Update an existing JIRA issue",
|
|
55
|
+
inputSchema: zodToJsonSchema(issues.UpdateIssueSchema),
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
name: "jira_delete_issue",
|
|
59
|
+
description: "Delete a JIRA issue",
|
|
60
|
+
inputSchema: zodToJsonSchema(issues.DeleteIssueSchema),
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "jira_assign_issue",
|
|
64
|
+
description: "Assign a JIRA issue to a user",
|
|
65
|
+
inputSchema: zodToJsonSchema(issues.AssignIssueSchema),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "jira_link_issues",
|
|
69
|
+
description: "Create a link between two JIRA issues",
|
|
70
|
+
inputSchema: zodToJsonSchema(issues.LinkIssuesSchema),
|
|
71
|
+
},
|
|
72
|
+
// Comment Tools
|
|
73
|
+
{
|
|
74
|
+
name: "jira_get_comments",
|
|
75
|
+
description: "Get all comments from a JIRA issue",
|
|
76
|
+
inputSchema: zodToJsonSchema(comments.GetCommentsSchema),
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "jira_add_comment",
|
|
80
|
+
description: "Add a comment to a JIRA issue",
|
|
81
|
+
inputSchema: zodToJsonSchema(comments.AddCommentSchema),
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: "jira_update_comment",
|
|
85
|
+
description: "Update an existing comment on a JIRA issue",
|
|
86
|
+
inputSchema: zodToJsonSchema(comments.UpdateCommentSchema),
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "jira_delete_comment",
|
|
90
|
+
description: "Delete a comment from a JIRA issue",
|
|
91
|
+
inputSchema: zodToJsonSchema(comments.DeleteCommentSchema),
|
|
92
|
+
},
|
|
93
|
+
// Project Tools
|
|
94
|
+
{
|
|
95
|
+
name: "jira_list_projects",
|
|
96
|
+
description: "List all accessible JIRA projects",
|
|
97
|
+
inputSchema: zodToJsonSchema(projects.ListProjectsSchema),
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
name: "jira_get_project",
|
|
101
|
+
description: "Get details of a specific JIRA project",
|
|
102
|
+
inputSchema: zodToJsonSchema(projects.GetProjectSchema),
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "jira_get_project_issues",
|
|
106
|
+
description: "Get all issues in a specific JIRA project",
|
|
107
|
+
inputSchema: zodToJsonSchema(projects.GetProjectIssuesSchema),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: "jira_get_project_versions",
|
|
111
|
+
description: "Get all versions of a JIRA project",
|
|
112
|
+
inputSchema: zodToJsonSchema(projects.GetProjectVersionsSchema),
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: "jira_get_project_components",
|
|
116
|
+
description: "Get all components of a JIRA project",
|
|
117
|
+
inputSchema: zodToJsonSchema(projects.GetProjectComponentsSchema),
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "jira_search_projects",
|
|
121
|
+
description: "Search for JIRA projects",
|
|
122
|
+
inputSchema: zodToJsonSchema(projects.SearchProjectsSchema),
|
|
123
|
+
},
|
|
124
|
+
// Workflow Tools
|
|
125
|
+
{
|
|
126
|
+
name: "jira_get_transitions",
|
|
127
|
+
description: "Get available workflow transitions for a JIRA issue",
|
|
128
|
+
inputSchema: zodToJsonSchema(workflow.GetTransitionsSchema),
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: "jira_transition_issue",
|
|
132
|
+
description: "Transition a JIRA issue through workflow",
|
|
133
|
+
inputSchema: zodToJsonSchema(workflow.TransitionIssueSchema),
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: "jira_get_workflows",
|
|
137
|
+
description: "Get workflow information",
|
|
138
|
+
inputSchema: zodToJsonSchema(workflow.GetWorkflowsSchema),
|
|
139
|
+
},
|
|
140
|
+
// User Tools
|
|
141
|
+
{
|
|
142
|
+
name: "jira_get_current_user",
|
|
143
|
+
description: "Get current user information",
|
|
144
|
+
inputSchema: zodToJsonSchema(users.GetCurrentUserSchema),
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "jira_search_users",
|
|
148
|
+
description: "Search for JIRA users",
|
|
149
|
+
inputSchema: zodToJsonSchema(users.SearchUsersSchema),
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
name: "jira_get_watchers",
|
|
153
|
+
description: "Get watchers of a JIRA issue",
|
|
154
|
+
inputSchema: zodToJsonSchema(users.GetWatchersSchema),
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
name: "jira_add_watcher",
|
|
158
|
+
description: "Add a watcher to a JIRA issue",
|
|
159
|
+
inputSchema: zodToJsonSchema(users.AddWatcherSchema),
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: "jira_remove_watcher",
|
|
163
|
+
description: "Remove a watcher from a JIRA issue",
|
|
164
|
+
inputSchema: zodToJsonSchema(users.RemoveWatcherSchema),
|
|
165
|
+
},
|
|
166
|
+
// Metadata Tools
|
|
167
|
+
{
|
|
168
|
+
name: "jira_get_issue_types",
|
|
169
|
+
description: "Get available issue types",
|
|
170
|
+
inputSchema: zodToJsonSchema(metadata.GetIssueTypesSchema),
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "jira_get_priorities",
|
|
174
|
+
description: "Get available issue priorities",
|
|
175
|
+
inputSchema: zodToJsonSchema(metadata.GetPrioritiesSchema),
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
name: "jira_get_statuses",
|
|
179
|
+
description: "Get available issue statuses",
|
|
180
|
+
inputSchema: zodToJsonSchema(metadata.GetStatusesSchema),
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "jira_get_fields",
|
|
184
|
+
description: "Get available fields (system and custom)",
|
|
185
|
+
inputSchema: zodToJsonSchema(metadata.GetFieldsSchema),
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "jira_get_resolutions",
|
|
189
|
+
description: "Get available issue resolutions",
|
|
190
|
+
inputSchema: zodToJsonSchema(metadata.GetResolutionsSchema),
|
|
191
|
+
},
|
|
192
|
+
// Worklog Tools
|
|
193
|
+
{
|
|
194
|
+
name: "jira_get_worklogs",
|
|
195
|
+
description: "Get worklogs (time tracking entries) from a JIRA issue",
|
|
196
|
+
inputSchema: zodToJsonSchema(worklog.GetWorklogsSchema),
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "jira_add_worklog",
|
|
200
|
+
description: "Add a worklog (time tracking entry) to a JIRA issue",
|
|
201
|
+
inputSchema: zodToJsonSchema(worklog.AddWorklogSchema),
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: "jira_update_worklog",
|
|
205
|
+
description: "Update an existing worklog on a JIRA issue",
|
|
206
|
+
inputSchema: zodToJsonSchema(worklog.UpdateWorklogSchema),
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
name: "jira_delete_worklog",
|
|
210
|
+
description: "Delete a worklog from a JIRA issue",
|
|
211
|
+
inputSchema: zodToJsonSchema(worklog.DeleteWorklogSchema),
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
};
|
|
215
|
+
});
|
|
216
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
217
|
+
const context = asyncLocalStorage.getStore();
|
|
218
|
+
const userAuthToken = context?.userToken;
|
|
219
|
+
return await asyncLocalStorage.run({ token: null, userToken: userAuthToken }, async () => {
|
|
220
|
+
try {
|
|
221
|
+
if (!request.params.arguments) {
|
|
222
|
+
throw new Error("Arguments are required");
|
|
223
|
+
}
|
|
224
|
+
const token = userAuthToken;
|
|
225
|
+
if (!token) {
|
|
226
|
+
return {
|
|
227
|
+
content: [{
|
|
228
|
+
type: "text",
|
|
229
|
+
text: JSON.stringify({
|
|
230
|
+
error: "Authentication required",
|
|
231
|
+
message: "Please provide Authorization: Bearer <token> header",
|
|
232
|
+
required_header: "Authorization"
|
|
233
|
+
}, null, 2)
|
|
234
|
+
}],
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// Automatically discover jiraUrl and cloudId from the API token
|
|
238
|
+
let jiraUrl;
|
|
239
|
+
let cloudId;
|
|
240
|
+
try {
|
|
241
|
+
const siteInfo = await getCachedSiteInfo(token);
|
|
242
|
+
jiraUrl = siteInfo.url;
|
|
243
|
+
cloudId = siteInfo.cloudId;
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
return {
|
|
247
|
+
content: [{
|
|
248
|
+
type: "text",
|
|
249
|
+
text: JSON.stringify({
|
|
250
|
+
error: "Failed to discover Jira site",
|
|
251
|
+
message: error.message || "Could not determine Jira instance from token",
|
|
252
|
+
hint: "Please verify your OAuth token has access to a Jira instance"
|
|
253
|
+
}, null, 2)
|
|
254
|
+
}],
|
|
255
|
+
isError: true,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return await authStorage.run({ token, jiraUrl, cloudId }, async () => {
|
|
259
|
+
const toolName = request.params.name;
|
|
260
|
+
const args = request.params.arguments;
|
|
261
|
+
try {
|
|
262
|
+
let result;
|
|
263
|
+
// Route to appropriate handler based on tool name
|
|
264
|
+
switch (toolName) {
|
|
265
|
+
// Issue Management
|
|
266
|
+
case "jira_get_issue":
|
|
267
|
+
result = await issues.getIssue(args);
|
|
268
|
+
break;
|
|
269
|
+
case "jira_search_issues":
|
|
270
|
+
result = await issues.searchIssues(args);
|
|
271
|
+
break;
|
|
272
|
+
case "jira_create_issue":
|
|
273
|
+
result = await issues.createIssue(args);
|
|
274
|
+
break;
|
|
275
|
+
case "jira_update_issue":
|
|
276
|
+
result = await issues.updateIssue(args);
|
|
277
|
+
break;
|
|
278
|
+
case "jira_delete_issue":
|
|
279
|
+
result = await issues.deleteIssue(args);
|
|
280
|
+
break;
|
|
281
|
+
case "jira_assign_issue":
|
|
282
|
+
result = await issues.assignIssue(args);
|
|
283
|
+
break;
|
|
284
|
+
case "jira_link_issues":
|
|
285
|
+
result = await issues.linkIssues(args);
|
|
286
|
+
break;
|
|
287
|
+
// Comments
|
|
288
|
+
case "jira_get_comments":
|
|
289
|
+
result = await comments.getComments(args);
|
|
290
|
+
break;
|
|
291
|
+
case "jira_add_comment":
|
|
292
|
+
result = await comments.addComment(args);
|
|
293
|
+
break;
|
|
294
|
+
case "jira_update_comment":
|
|
295
|
+
result = await comments.updateComment(args);
|
|
296
|
+
break;
|
|
297
|
+
case "jira_delete_comment":
|
|
298
|
+
result = await comments.deleteComment(args);
|
|
299
|
+
break;
|
|
300
|
+
// Projects
|
|
301
|
+
case "jira_list_projects":
|
|
302
|
+
result = await projects.listProjects(args);
|
|
303
|
+
break;
|
|
304
|
+
case "jira_get_project":
|
|
305
|
+
result = await projects.getProject(args);
|
|
306
|
+
break;
|
|
307
|
+
case "jira_get_project_issues":
|
|
308
|
+
result = await projects.getProjectIssues(args);
|
|
309
|
+
break;
|
|
310
|
+
case "jira_get_project_versions":
|
|
311
|
+
result = await projects.getProjectVersions(args);
|
|
312
|
+
break;
|
|
313
|
+
case "jira_get_project_components":
|
|
314
|
+
result = await projects.getProjectComponents(args);
|
|
315
|
+
break;
|
|
316
|
+
case "jira_search_projects":
|
|
317
|
+
result = await projects.searchProjects(args);
|
|
318
|
+
break;
|
|
319
|
+
// Workflow
|
|
320
|
+
case "jira_get_transitions":
|
|
321
|
+
result = await workflow.getTransitions(args);
|
|
322
|
+
break;
|
|
323
|
+
case "jira_transition_issue":
|
|
324
|
+
result = await workflow.transitionIssue(args);
|
|
325
|
+
break;
|
|
326
|
+
case "jira_get_workflows":
|
|
327
|
+
result = await workflow.getWorkflows(args);
|
|
328
|
+
break;
|
|
329
|
+
// Users
|
|
330
|
+
case "jira_get_current_user":
|
|
331
|
+
result = await users.getCurrentUser(args);
|
|
332
|
+
break;
|
|
333
|
+
case "jira_search_users":
|
|
334
|
+
result = await users.searchUsers(args);
|
|
335
|
+
break;
|
|
336
|
+
case "jira_get_watchers":
|
|
337
|
+
result = await users.getWatchers(args);
|
|
338
|
+
break;
|
|
339
|
+
case "jira_add_watcher":
|
|
340
|
+
result = await users.addWatcher(args);
|
|
341
|
+
break;
|
|
342
|
+
case "jira_remove_watcher":
|
|
343
|
+
result = await users.removeWatcher(args);
|
|
344
|
+
break;
|
|
345
|
+
// Metadata
|
|
346
|
+
case "jira_get_issue_types":
|
|
347
|
+
result = await metadata.getIssueTypes(args);
|
|
348
|
+
break;
|
|
349
|
+
case "jira_get_priorities":
|
|
350
|
+
result = await metadata.getPriorities(args);
|
|
351
|
+
break;
|
|
352
|
+
case "jira_get_statuses":
|
|
353
|
+
result = await metadata.getStatuses(args);
|
|
354
|
+
break;
|
|
355
|
+
case "jira_get_fields":
|
|
356
|
+
result = await metadata.getFields(args);
|
|
357
|
+
break;
|
|
358
|
+
case "jira_get_resolutions":
|
|
359
|
+
result = await metadata.getResolutions(args);
|
|
360
|
+
break;
|
|
361
|
+
// Worklog
|
|
362
|
+
case "jira_get_worklogs":
|
|
363
|
+
result = await worklog.getWorklogs(args);
|
|
364
|
+
break;
|
|
365
|
+
case "jira_add_worklog":
|
|
366
|
+
result = await worklog.addWorklog(args);
|
|
367
|
+
break;
|
|
368
|
+
case "jira_update_worklog":
|
|
369
|
+
result = await worklog.updateWorklog(args);
|
|
370
|
+
break;
|
|
371
|
+
case "jira_delete_worklog":
|
|
372
|
+
result = await worklog.deleteWorklog(args);
|
|
373
|
+
break;
|
|
374
|
+
default:
|
|
375
|
+
throw new Error(`Unknown tool: ${toolName}`);
|
|
376
|
+
}
|
|
377
|
+
// Format result for display
|
|
378
|
+
const resultText = typeof result === 'string'
|
|
379
|
+
? result
|
|
380
|
+
: JSON.stringify(result, null, 2);
|
|
381
|
+
return {
|
|
382
|
+
content: [{
|
|
383
|
+
type: "text",
|
|
384
|
+
text: resultText,
|
|
385
|
+
}],
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
let errorMessage = `Error in ${toolName}:`;
|
|
390
|
+
if (isJiraError(error)) {
|
|
391
|
+
errorMessage += ` [${error.statusCode || 'Unknown'}] ${error.message}`;
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
errorMessage += ` ${error.message || 'Unknown error'}`;
|
|
395
|
+
}
|
|
396
|
+
// Truncate very long error messages
|
|
397
|
+
errorMessage = truncateText(errorMessage, 1000);
|
|
398
|
+
return {
|
|
399
|
+
content: [{
|
|
400
|
+
type: "text",
|
|
401
|
+
text: JSON.stringify({
|
|
402
|
+
error: true,
|
|
403
|
+
tool: toolName,
|
|
404
|
+
message: errorMessage,
|
|
405
|
+
timestamp: new Date().toISOString()
|
|
406
|
+
}, null, 2)
|
|
407
|
+
}],
|
|
408
|
+
isError: true,
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
return {
|
|
415
|
+
content: [{
|
|
416
|
+
type: "text",
|
|
417
|
+
text: JSON.stringify({
|
|
418
|
+
error: true,
|
|
419
|
+
message: error.message || 'Unknown error',
|
|
420
|
+
timestamp: new Date().toISOString()
|
|
421
|
+
}, null, 2)
|
|
422
|
+
}],
|
|
423
|
+
isError: true,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
return server;
|
|
429
|
+
}
|
|
430
|
+
// Stateless HTTP server
|
|
431
|
+
async function startStatelessServer() {
|
|
432
|
+
const app = express();
|
|
433
|
+
app.use(express.json());
|
|
434
|
+
console.log('🚀 Starting JIRA MCP Server (Stateless Mode)...');
|
|
435
|
+
app.post('/mcp', async (req, res) => {
|
|
436
|
+
try {
|
|
437
|
+
// Extract auth token from Authorization header
|
|
438
|
+
const authHeader = req.headers.authorization;
|
|
439
|
+
const userAuthToken = authHeader?.startsWith('Bearer ')
|
|
440
|
+
? authHeader.substring(7)
|
|
441
|
+
: undefined;
|
|
442
|
+
// Create fresh instances for complete isolation
|
|
443
|
+
const server = createStatelessServer();
|
|
444
|
+
const transport = new StreamableHTTPServerTransport({
|
|
445
|
+
sessionIdGenerator: undefined, // Key: stateless mode
|
|
446
|
+
});
|
|
447
|
+
// Clean up on request close
|
|
448
|
+
res.on('close', () => {
|
|
449
|
+
transport.close();
|
|
450
|
+
server.close();
|
|
451
|
+
});
|
|
452
|
+
// Set request context with auth token
|
|
453
|
+
await asyncLocalStorage.run({ token: null, userToken: userAuthToken }, async () => {
|
|
454
|
+
await server.connect(transport);
|
|
455
|
+
await transport.handleRequest(req, res, req.body);
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
console.error('Error handling MCP request:', error);
|
|
460
|
+
if (!res.headersSent) {
|
|
461
|
+
res.status(500).json({
|
|
462
|
+
jsonrpc: '2.0',
|
|
463
|
+
error: { code: -32603, message: 'Internal server error' },
|
|
464
|
+
id: null
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
// Disable GET/DELETE for stateless mode
|
|
470
|
+
app.get('/mcp', (req, res) => {
|
|
471
|
+
res.status(405).json({
|
|
472
|
+
jsonrpc: "2.0",
|
|
473
|
+
error: { code: -32000, message: "Method not allowed in stateless mode" },
|
|
474
|
+
id: null
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
app.delete('/mcp', (req, res) => {
|
|
478
|
+
res.status(405).json({
|
|
479
|
+
jsonrpc: "2.0",
|
|
480
|
+
error: { code: -32000, message: "Method not allowed in stateless mode" },
|
|
481
|
+
id: null
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
// Health check endpoint
|
|
485
|
+
app.get('/health', (req, res) => {
|
|
486
|
+
res.json({
|
|
487
|
+
status: 'healthy',
|
|
488
|
+
version: VERSION,
|
|
489
|
+
timestamp: new Date().toISOString(),
|
|
490
|
+
mode: 'stateless'
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
const port = process.env.PORT || 30000;
|
|
494
|
+
app.listen(port, () => {
|
|
495
|
+
console.log(`✅ Stateless JIRA MCP Server listening on port ${port}`);
|
|
496
|
+
console.log(`📡 Endpoint: http://localhost:${port}/mcp`);
|
|
497
|
+
console.log(`🔓 Session management: DISABLED (stateless)`);
|
|
498
|
+
console.log(`🏥 Health check: http://localhost:${port}/health`);
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
startStatelessServer().catch((error) => {
|
|
502
|
+
console.error("Fatal error:", error);
|
|
503
|
+
process.exit(1);
|
|
504
|
+
});
|
|
505
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const GetAccessibleResourcesSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
3
|
+
export declare const GetAtlassianUserInfoSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
4
|
+
interface AtlassianAccessibleResource {
|
|
5
|
+
id: string;
|
|
6
|
+
url: string;
|
|
7
|
+
name: string;
|
|
8
|
+
scopes: string[];
|
|
9
|
+
avatarUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
interface AtlassianUserInfo {
|
|
12
|
+
account_id: string;
|
|
13
|
+
email?: string;
|
|
14
|
+
name?: string;
|
|
15
|
+
picture?: string;
|
|
16
|
+
account_status?: string;
|
|
17
|
+
last_updated?: string;
|
|
18
|
+
nickname?: string;
|
|
19
|
+
locale?: string;
|
|
20
|
+
extended_profile?: Record<string, unknown>;
|
|
21
|
+
account_type?: string;
|
|
22
|
+
email_verified?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare function getAccessibleResources(token?: string): Promise<AtlassianAccessibleResource[]>;
|
|
25
|
+
export declare function getAtlassianUserInfo(token?: string): Promise<AtlassianUserInfo>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=atlassian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlassian.d.ts","sourceRoot":"","sources":["../../operations/atlassian.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,4BAA4B,gDAAe,CAAC;AAEzD,eAAO,MAAM,0BAA0B,gDAAe,CAAC;AAEvD,UAAU,2BAA2B;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAqBD,wBAAsB,sBAAsB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,2BAA2B,EAAE,CAAC,CAKnG;AAED,wBAAsB,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAErF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { requireAuthToken, getAuthToken } from '../common/context.js';
|
|
3
|
+
import { JiraError } from '../common/errors.js';
|
|
4
|
+
export const GetAccessibleResourcesSchema = z.object({});
|
|
5
|
+
export const GetAtlassianUserInfoSchema = z.object({});
|
|
6
|
+
async function callAtlassianApi(endpoint, tokenOverride) {
|
|
7
|
+
const token = tokenOverride ?? getAuthToken() ?? requireAuthToken();
|
|
8
|
+
const response = await fetch(endpoint, {
|
|
9
|
+
headers: {
|
|
10
|
+
Authorization: `Bearer ${token}`,
|
|
11
|
+
Accept: 'application/json',
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
const body = await response.text();
|
|
16
|
+
const message = `Atlassian API request failed: ${response.status} ${response.statusText}${body ? ` - ${body}` : ''}`;
|
|
17
|
+
throw new JiraError(message, response.status);
|
|
18
|
+
}
|
|
19
|
+
return response.json();
|
|
20
|
+
}
|
|
21
|
+
export async function getAccessibleResources(token) {
|
|
22
|
+
return callAtlassianApi('https://api.atlassian.com/oauth/token/accessible-resources', token);
|
|
23
|
+
}
|
|
24
|
+
export async function getAtlassianUserInfo(token) {
|
|
25
|
+
return callAtlassianApi('https://api.atlassian.com/me', token);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=atlassian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atlassian.js","sourceRoot":"","sources":["../../operations/atlassian.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAwBvD,KAAK,UAAU,gBAAgB,CAAI,QAAgB,EAAE,aAAsB;IACzE,MAAM,KAAK,GAAG,aAAa,IAAI,YAAY,EAAE,IAAI,gBAAgB,EAAE,CAAC;IAEpE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACrC,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,MAAM,EAAE,kBAAkB;SAC3B;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACrH,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAc;IACzD,OAAO,gBAAgB,CACrB,4DAA4D,EAC5D,KAAK,CACN,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAc;IACvD,OAAO,gBAAgB,CAAoB,8BAA8B,EAAE,KAAK,CAAC,CAAC;AACpF,CAAC"}
|