@crypto512/jicon-mcp 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/.env.example +9 -0
- package/.jicon.json.custom +21 -0
- package/.jicon.json.example +15 -0
- package/.jicon.json.readonly +15 -0
- package/CLAUDE.md +596 -0
- package/CONTRIBUTING.md +371 -0
- package/DEVELOPMENT.md +400 -0
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/TOOL_LIST.md +435 -0
- package/dist/config/constants.d.ts +14 -0
- package/dist/config/constants.d.ts.map +1 -0
- package/dist/config/constants.js +18 -0
- package/dist/config/constants.js.map +1 -0
- package/dist/config/loader.d.ts +35 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +108 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +130 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +32 -0
- package/dist/config/types.js.map +1 -0
- package/dist/confluence/client.d.ts +30 -0
- package/dist/confluence/client.d.ts.map +1 -0
- package/dist/confluence/client.js +176 -0
- package/dist/confluence/client.js.map +1 -0
- package/dist/confluence/defaults.d.ts +23 -0
- package/dist/confluence/defaults.d.ts.map +1 -0
- package/dist/confluence/defaults.js +29 -0
- package/dist/confluence/defaults.js.map +1 -0
- package/dist/confluence/formatters.d.ts +22 -0
- package/dist/confluence/formatters.d.ts.map +1 -0
- package/dist/confluence/formatters.js +125 -0
- package/dist/confluence/formatters.js.map +1 -0
- package/dist/confluence/tools.d.ts +266 -0
- package/dist/confluence/tools.d.ts.map +1 -0
- package/dist/confluence/tools.js +376 -0
- package/dist/confluence/tools.js.map +1 -0
- package/dist/confluence/types.d.ts +122 -0
- package/dist/confluence/types.d.ts.map +1 -0
- package/dist/confluence/types.js +5 -0
- package/dist/confluence/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -0
- package/dist/jira/client.d.ts +46 -0
- package/dist/jira/client.d.ts.map +1 -0
- package/dist/jira/client.js +178 -0
- package/dist/jira/client.js.map +1 -0
- package/dist/jira/defaults.d.ts +19 -0
- package/dist/jira/defaults.d.ts.map +1 -0
- package/dist/jira/defaults.js +57 -0
- package/dist/jira/defaults.js.map +1 -0
- package/dist/jira/formatters.d.ts +22 -0
- package/dist/jira/formatters.d.ts.map +1 -0
- package/dist/jira/formatters.js +128 -0
- package/dist/jira/formatters.js.map +1 -0
- package/dist/jira/tools.d.ts +334 -0
- package/dist/jira/tools.d.ts.map +1 -0
- package/dist/jira/tools.js +372 -0
- package/dist/jira/tools.js.map +1 -0
- package/dist/jira/types.d.ts +110 -0
- package/dist/jira/types.d.ts.map +1 -0
- package/dist/jira/types.js +5 -0
- package/dist/jira/types.js.map +1 -0
- package/dist/permissions/filter.d.ts +30 -0
- package/dist/permissions/filter.d.ts.map +1 -0
- package/dist/permissions/filter.js +89 -0
- package/dist/permissions/filter.js.map +1 -0
- package/dist/permissions/tool-registry.d.ts +49 -0
- package/dist/permissions/tool-registry.d.ts.map +1 -0
- package/dist/permissions/tool-registry.js +111 -0
- package/dist/permissions/tool-registry.js.map +1 -0
- package/dist/tempo/client.d.ts +32 -0
- package/dist/tempo/client.d.ts.map +1 -0
- package/dist/tempo/client.js +125 -0
- package/dist/tempo/client.js.map +1 -0
- package/dist/tempo/formatters.d.ts +30 -0
- package/dist/tempo/formatters.d.ts.map +1 -0
- package/dist/tempo/formatters.js +172 -0
- package/dist/tempo/formatters.js.map +1 -0
- package/dist/tempo/tools.d.ts +184 -0
- package/dist/tempo/tools.d.ts.map +1 -0
- package/dist/tempo/tools.js +392 -0
- package/dist/tempo/tools.js.map +1 -0
- package/dist/tempo/types.d.ts +98 -0
- package/dist/tempo/types.d.ts.map +1 -0
- package/dist/tempo/types.js +5 -0
- package/dist/tempo/types.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/http-client.d.ts +22 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +137 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/response-formatter.d.ts +8 -0
- package/dist/utils/response-formatter.d.ts.map +1 -0
- package/dist/utils/response-formatter.js +38 -0
- package/dist/utils/response-formatter.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira MCP Tools
|
|
3
|
+
*/
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { formatSuccess, formatError, isApiError } from "../utils/response-formatter.js";
|
|
6
|
+
import { formatIssue, formatSearchResults, formatProject, formatProjects, } from "./formatters.js";
|
|
7
|
+
export function createJiraTools(client) {
|
|
8
|
+
return {
|
|
9
|
+
jira_search_issues: {
|
|
10
|
+
description: `Search for Jira issues using JQL (Jira Query Language).
|
|
11
|
+
|
|
12
|
+
JQL Syntax Basics:
|
|
13
|
+
- Field operators: =, !=, >, <, >=, <=, ~, IN, NOT IN
|
|
14
|
+
- Text search: use ~ for "contains" (e.g., summary~"bug")
|
|
15
|
+
- Dates: use functions like startOfDay(), startOfWeek(), etc.
|
|
16
|
+
- Combine: AND, OR, NOT
|
|
17
|
+
- Order: ORDER BY field ASC/DESC
|
|
18
|
+
|
|
19
|
+
Top 10 Useful JQL Queries:
|
|
20
|
+
|
|
21
|
+
1. Recently updated issues (last 7 days):
|
|
22
|
+
updated >= startOfDay(-7)
|
|
23
|
+
|
|
24
|
+
2. My open issues:
|
|
25
|
+
assignee = currentUser() AND status != Done
|
|
26
|
+
|
|
27
|
+
3. Unassigned issues in a project:
|
|
28
|
+
project = PROJ AND assignee is EMPTY AND status != Done
|
|
29
|
+
|
|
30
|
+
4. Issues created this week:
|
|
31
|
+
created >= startOfWeek()
|
|
32
|
+
|
|
33
|
+
5. Overdue issues:
|
|
34
|
+
duedate < now() AND status != Done
|
|
35
|
+
|
|
36
|
+
6. High priority bugs:
|
|
37
|
+
type = Bug AND priority = High AND status != Done
|
|
38
|
+
|
|
39
|
+
7. Issues in current sprint:
|
|
40
|
+
sprint in openSprints()
|
|
41
|
+
|
|
42
|
+
8. Issues updated by me recently:
|
|
43
|
+
updatedBy = currentUser() AND updated >= startOfDay(-3)
|
|
44
|
+
|
|
45
|
+
9. Issues with specific label:
|
|
46
|
+
labels = "urgent" AND status != Done
|
|
47
|
+
|
|
48
|
+
10. Recently resolved issues:
|
|
49
|
+
resolved >= startOfWeek() ORDER BY resolved DESC
|
|
50
|
+
|
|
51
|
+
Common Patterns:
|
|
52
|
+
- Date ranges: created >= "2025-01-01" AND created <= "2025-01-31"
|
|
53
|
+
- Multiple projects: project IN (PROJ1, PROJ2, PROJ3)
|
|
54
|
+
- Exclude resolved: AND resolution = Unresolved
|
|
55
|
+
- Text search: summary~"login" OR description~"login"`,
|
|
56
|
+
inputSchema: z.object({
|
|
57
|
+
jql: z.string().describe("JQL query string"),
|
|
58
|
+
maxResults: z.number().optional().describe("Maximum number of results (default: 50)"),
|
|
59
|
+
fields: z.array(z.string()).optional().describe("Specific fields to return"),
|
|
60
|
+
}),
|
|
61
|
+
handler: async (args) => {
|
|
62
|
+
try {
|
|
63
|
+
const result = await client.searchIssues(args.jql, args.maxResults, args.fields);
|
|
64
|
+
return {
|
|
65
|
+
content: [
|
|
66
|
+
{
|
|
67
|
+
type: "text",
|
|
68
|
+
text: formatSearchResults(result),
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
jira_get_issue: {
|
|
79
|
+
description: "Get detailed information about a specific Jira issue",
|
|
80
|
+
inputSchema: z.object({
|
|
81
|
+
issueKey: z.string().describe('Issue key (e.g., "PROJ-123")'),
|
|
82
|
+
fields: z.array(z.string()).optional().describe("Specific fields to return"),
|
|
83
|
+
expand: z
|
|
84
|
+
.array(z.string())
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('Additional data to expand (e.g., "changelog", "renderedFields")'),
|
|
87
|
+
}),
|
|
88
|
+
handler: async (args) => {
|
|
89
|
+
try {
|
|
90
|
+
const result = await client.getIssue(args.issueKey, args.fields, args.expand);
|
|
91
|
+
return {
|
|
92
|
+
content: [
|
|
93
|
+
{
|
|
94
|
+
type: "text",
|
|
95
|
+
text: formatIssue(result),
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
jira_create_issue: {
|
|
106
|
+
description: "Create a new Jira issue",
|
|
107
|
+
inputSchema: z.object({
|
|
108
|
+
projectKey: z.string().describe("Project key"),
|
|
109
|
+
issueType: z.string().describe('Issue type (e.g., "Bug", "Story", "Task")'),
|
|
110
|
+
summary: z.string().describe("Issue summary"),
|
|
111
|
+
description: z.string().optional().describe("Issue description"),
|
|
112
|
+
priority: z.string().optional().describe("Priority name"),
|
|
113
|
+
assignee: z.string().optional().describe("Assignee username"),
|
|
114
|
+
labels: z.array(z.string()).optional().describe("Array of labels"),
|
|
115
|
+
components: z.array(z.string()).optional().describe("Array of component names"),
|
|
116
|
+
customFields: z
|
|
117
|
+
.record(z.unknown())
|
|
118
|
+
.optional()
|
|
119
|
+
.describe("Custom field values"),
|
|
120
|
+
}),
|
|
121
|
+
handler: async (args) => {
|
|
122
|
+
try {
|
|
123
|
+
const result = await client.createIssue(args);
|
|
124
|
+
return formatSuccess(result);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
jira_update_issue: {
|
|
132
|
+
description: "Update an existing Jira issue",
|
|
133
|
+
inputSchema: z.object({
|
|
134
|
+
issueKey: z.string().describe("Issue key"),
|
|
135
|
+
fields: z.record(z.unknown()).describe("Fields to update"),
|
|
136
|
+
notifyUsers: z
|
|
137
|
+
.boolean()
|
|
138
|
+
.optional()
|
|
139
|
+
.describe("Send notifications (default: true)"),
|
|
140
|
+
}),
|
|
141
|
+
handler: async (args) => {
|
|
142
|
+
try {
|
|
143
|
+
await client.updateIssue(args.issueKey, args.fields, args.notifyUsers);
|
|
144
|
+
return formatSuccess({
|
|
145
|
+
success: true,
|
|
146
|
+
message: `Issue ${args.issueKey} updated successfully`,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
jira_transition_issue: {
|
|
155
|
+
description: "Transition an issue to a different status",
|
|
156
|
+
inputSchema: z.object({
|
|
157
|
+
issueKey: z.string().describe("Issue key"),
|
|
158
|
+
transitionName: z
|
|
159
|
+
.string()
|
|
160
|
+
.describe('Transition name (e.g., "In Progress", "Done")'),
|
|
161
|
+
comment: z.string().optional().describe("Comment to add with transition"),
|
|
162
|
+
fields: z
|
|
163
|
+
.record(z.unknown())
|
|
164
|
+
.optional()
|
|
165
|
+
.describe("Fields to update during transition"),
|
|
166
|
+
}),
|
|
167
|
+
handler: async (args) => {
|
|
168
|
+
try {
|
|
169
|
+
await client.transitionIssue(args.issueKey, args.transitionName, args.comment, args.fields);
|
|
170
|
+
return formatSuccess({
|
|
171
|
+
success: true,
|
|
172
|
+
message: `Issue ${args.issueKey} transitioned to ${args.transitionName}`,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
jira_add_comment: {
|
|
181
|
+
description: "Add a comment to a Jira issue",
|
|
182
|
+
inputSchema: z.object({
|
|
183
|
+
issueKey: z.string().describe("Issue key"),
|
|
184
|
+
comment: z.string().describe("Comment text (supports Jira markdown)"),
|
|
185
|
+
visibility: z
|
|
186
|
+
.object({
|
|
187
|
+
type: z.string(),
|
|
188
|
+
value: z.string(),
|
|
189
|
+
})
|
|
190
|
+
.optional()
|
|
191
|
+
.describe("Visibility restrictions"),
|
|
192
|
+
}),
|
|
193
|
+
handler: async (args) => {
|
|
194
|
+
try {
|
|
195
|
+
const result = await client.addComment(args.issueKey, args.comment, args.visibility);
|
|
196
|
+
return formatSuccess(result);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
jira_get_issue_comments: {
|
|
204
|
+
description: "Retrieve comments from a Jira issue",
|
|
205
|
+
inputSchema: z.object({
|
|
206
|
+
issueKey: z.string().describe("Issue key"),
|
|
207
|
+
maxResults: z.number().optional().describe("Maximum number of comments"),
|
|
208
|
+
orderBy: z
|
|
209
|
+
.string()
|
|
210
|
+
.optional()
|
|
211
|
+
.describe('Sort order ("created" or "-created")'),
|
|
212
|
+
}),
|
|
213
|
+
handler: async (args) => {
|
|
214
|
+
try {
|
|
215
|
+
const result = await client.getComments(args.issueKey, args.maxResults, args.orderBy);
|
|
216
|
+
return formatSuccess(result);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
jira_list_projects: {
|
|
224
|
+
description: "List all accessible Jira projects",
|
|
225
|
+
inputSchema: z.object({
|
|
226
|
+
recent: z.boolean().optional().describe("Only return recent projects"),
|
|
227
|
+
expand: z.array(z.string()).optional().describe("Additional data to expand"),
|
|
228
|
+
}),
|
|
229
|
+
handler: async (args) => {
|
|
230
|
+
try {
|
|
231
|
+
const result = await client.listProjects(args.recent, args.expand);
|
|
232
|
+
return {
|
|
233
|
+
content: [
|
|
234
|
+
{
|
|
235
|
+
type: "text",
|
|
236
|
+
text: formatProjects(result),
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
},
|
|
246
|
+
jira_get_project: {
|
|
247
|
+
description: "Get detailed information about a specific project",
|
|
248
|
+
inputSchema: z.object({
|
|
249
|
+
projectKey: z.string().describe("Project key"),
|
|
250
|
+
expand: z.array(z.string()).optional().describe("Additional data to expand"),
|
|
251
|
+
}),
|
|
252
|
+
handler: async (args) => {
|
|
253
|
+
try {
|
|
254
|
+
const result = await client.getProject(args.projectKey, args.expand);
|
|
255
|
+
return {
|
|
256
|
+
content: [
|
|
257
|
+
{
|
|
258
|
+
type: "text",
|
|
259
|
+
text: formatProject(result),
|
|
260
|
+
},
|
|
261
|
+
],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
jira_get_transitions: {
|
|
270
|
+
description: "Get available transitions for an issue",
|
|
271
|
+
inputSchema: z.object({
|
|
272
|
+
issueKey: z.string().describe("Issue key"),
|
|
273
|
+
}),
|
|
274
|
+
handler: async (args) => {
|
|
275
|
+
try {
|
|
276
|
+
const result = await client.getTransitions(args.issueKey);
|
|
277
|
+
return formatSuccess(result);
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
},
|
|
284
|
+
jira_link_issues: {
|
|
285
|
+
description: "Create a link between two issues",
|
|
286
|
+
inputSchema: z.object({
|
|
287
|
+
issueKey: z.string().describe("Source issue key"),
|
|
288
|
+
linkedIssueKey: z.string().describe("Target issue key"),
|
|
289
|
+
linkType: z.string().describe('Link type (e.g., "Blocks", "Relates to")'),
|
|
290
|
+
comment: z.string().optional().describe("Comment for the link"),
|
|
291
|
+
}),
|
|
292
|
+
handler: async (args) => {
|
|
293
|
+
try {
|
|
294
|
+
await client.linkIssues(args.issueKey, args.linkedIssueKey, args.linkType, args.comment);
|
|
295
|
+
return formatSuccess({
|
|
296
|
+
success: true,
|
|
297
|
+
message: `Linked ${args.issueKey} to ${args.linkedIssueKey} with type ${args.linkType}`,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
jira_get_board: {
|
|
306
|
+
description: "Get information about an Agile board",
|
|
307
|
+
inputSchema: z.object({
|
|
308
|
+
boardId: z.number().describe("Board ID"),
|
|
309
|
+
}),
|
|
310
|
+
handler: async (args) => {
|
|
311
|
+
try {
|
|
312
|
+
const result = await client.getBoard(args.boardId);
|
|
313
|
+
return formatSuccess(result);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
317
|
+
}
|
|
318
|
+
},
|
|
319
|
+
},
|
|
320
|
+
jira_get_sprints: {
|
|
321
|
+
description: "List sprints for a board",
|
|
322
|
+
inputSchema: z.object({
|
|
323
|
+
boardId: z.number().describe("Board ID"),
|
|
324
|
+
state: z
|
|
325
|
+
.enum(["active", "future", "closed"])
|
|
326
|
+
.optional()
|
|
327
|
+
.describe("Sprint state filter"),
|
|
328
|
+
}),
|
|
329
|
+
handler: async (args) => {
|
|
330
|
+
try {
|
|
331
|
+
const result = await client.getSprints(args.boardId, args.state);
|
|
332
|
+
return formatSuccess(result);
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
},
|
|
339
|
+
jira_get_sprint_issues: {
|
|
340
|
+
description: "Get issues in a specific sprint",
|
|
341
|
+
inputSchema: z.object({
|
|
342
|
+
sprintId: z.number().describe("Sprint ID"),
|
|
343
|
+
maxResults: z.number().optional().describe("Maximum number of results"),
|
|
344
|
+
}),
|
|
345
|
+
handler: async (args) => {
|
|
346
|
+
try {
|
|
347
|
+
const result = await client.getSprintIssues(args.sprintId, args.maxResults);
|
|
348
|
+
return formatSuccess(result);
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
},
|
|
355
|
+
jira_get_issue_watchers: {
|
|
356
|
+
description: "Get list of watchers on an issue",
|
|
357
|
+
inputSchema: z.object({
|
|
358
|
+
issueKey: z.string().describe("Issue key"),
|
|
359
|
+
}),
|
|
360
|
+
handler: async (args) => {
|
|
361
|
+
try {
|
|
362
|
+
const result = await client.getIssueWatchers(args.issueKey);
|
|
363
|
+
return formatSuccess(result);
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
return formatError(isApiError(error) ? error : new Error(String(error)));
|
|
367
|
+
}
|
|
368
|
+
},
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/jira/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jira-specific types
|
|
3
|
+
*/
|
|
4
|
+
export interface JiraIssue {
|
|
5
|
+
id: string;
|
|
6
|
+
key: string;
|
|
7
|
+
self: string;
|
|
8
|
+
fields: {
|
|
9
|
+
summary: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
status: {
|
|
12
|
+
name: string;
|
|
13
|
+
statusCategory: {
|
|
14
|
+
name: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
issuetype: {
|
|
18
|
+
name: string;
|
|
19
|
+
iconUrl?: string;
|
|
20
|
+
};
|
|
21
|
+
priority?: {
|
|
22
|
+
name: string;
|
|
23
|
+
iconUrl?: string;
|
|
24
|
+
};
|
|
25
|
+
assignee?: {
|
|
26
|
+
displayName: string;
|
|
27
|
+
emailAddress?: string;
|
|
28
|
+
accountId?: string;
|
|
29
|
+
};
|
|
30
|
+
reporter?: {
|
|
31
|
+
displayName: string;
|
|
32
|
+
emailAddress?: string;
|
|
33
|
+
accountId?: string;
|
|
34
|
+
};
|
|
35
|
+
created: string;
|
|
36
|
+
updated: string;
|
|
37
|
+
labels?: string[];
|
|
38
|
+
components?: Array<{
|
|
39
|
+
name: string;
|
|
40
|
+
}>;
|
|
41
|
+
[key: string]: unknown;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export interface JiraSearchResult {
|
|
45
|
+
issues: JiraIssue[];
|
|
46
|
+
startAt: number;
|
|
47
|
+
maxResults: number;
|
|
48
|
+
total: number;
|
|
49
|
+
}
|
|
50
|
+
export interface JiraProject {
|
|
51
|
+
id: string;
|
|
52
|
+
key: string;
|
|
53
|
+
name: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
lead?: {
|
|
56
|
+
displayName: string;
|
|
57
|
+
emailAddress?: string;
|
|
58
|
+
};
|
|
59
|
+
projectTypeKey: string;
|
|
60
|
+
avatarUrls?: Record<string, string>;
|
|
61
|
+
}
|
|
62
|
+
export interface JiraComment {
|
|
63
|
+
id: string;
|
|
64
|
+
author: {
|
|
65
|
+
displayName: string;
|
|
66
|
+
emailAddress?: string;
|
|
67
|
+
};
|
|
68
|
+
body: string;
|
|
69
|
+
created: string;
|
|
70
|
+
updated: string;
|
|
71
|
+
}
|
|
72
|
+
export interface JiraTransition {
|
|
73
|
+
id: string;
|
|
74
|
+
name: string;
|
|
75
|
+
to: {
|
|
76
|
+
name: string;
|
|
77
|
+
statusCategory: {
|
|
78
|
+
name: string;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export interface JiraBoard {
|
|
83
|
+
id: number;
|
|
84
|
+
name: string;
|
|
85
|
+
type: string;
|
|
86
|
+
location?: {
|
|
87
|
+
projectKey: string;
|
|
88
|
+
projectName: string;
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export interface JiraSprint {
|
|
92
|
+
id: number;
|
|
93
|
+
name: string;
|
|
94
|
+
state: "active" | "future" | "closed";
|
|
95
|
+
startDate?: string;
|
|
96
|
+
endDate?: string;
|
|
97
|
+
completeDate?: string;
|
|
98
|
+
originBoardId: number;
|
|
99
|
+
}
|
|
100
|
+
export interface JiraIssueLink {
|
|
101
|
+
id: string;
|
|
102
|
+
type: {
|
|
103
|
+
name: string;
|
|
104
|
+
inward: string;
|
|
105
|
+
outward: string;
|
|
106
|
+
};
|
|
107
|
+
outwardIssue?: JiraIssue;
|
|
108
|
+
inwardIssue?: JiraIssue;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM,CAAC;YACb,cAAc,EAAE;gBACd,IAAI,EAAE,MAAM,CAAC;aACd,CAAC;SACH,CAAC;QACF,SAAS,EAAE;YACT,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,WAAW,EAAE,MAAM,CAAC;YACpB,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,CAAC,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE;YACd,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission filter for tool execution
|
|
3
|
+
*/
|
|
4
|
+
import type { PermissionsConfig } from "../config/types.js";
|
|
5
|
+
export declare class PermissionFilter {
|
|
6
|
+
private mode;
|
|
7
|
+
private allowedTools;
|
|
8
|
+
constructor(config: PermissionsConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Compute the set of allowed tools based on configuration
|
|
11
|
+
*/
|
|
12
|
+
private computeAllowedTools;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a tool is allowed to execute
|
|
15
|
+
*/
|
|
16
|
+
isToolAllowed(toolName: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Get the list of allowed tools
|
|
19
|
+
*/
|
|
20
|
+
getAllowedTools(): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Get permission denial message
|
|
23
|
+
*/
|
|
24
|
+
getDenialMessage(toolName: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Get current permission mode
|
|
27
|
+
*/
|
|
28
|
+
getMode(): "full" | "readonly" | "custom";
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/permissions/filter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAW5D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,IAAI,CAAiC;IAC7C,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,EAAE,iBAAiB;IAKrC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqC3B;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAI3B;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IA4B1C;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,UAAU,GAAG,QAAQ;CAG1C"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission filter for tool execution
|
|
3
|
+
*/
|
|
4
|
+
import { expandVirtualActions, ALL_JIRA_TOOLS, ALL_CONFLUENCE_TOOLS, ALL_TEMPO_TOOLS, JIRA_READ_TOOLS, CONFLUENCE_READ_TOOLS, TEMPO_READ_TOOLS, } from "./tool-registry.js";
|
|
5
|
+
export class PermissionFilter {
|
|
6
|
+
mode;
|
|
7
|
+
allowedTools;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.mode = config.mode;
|
|
10
|
+
this.allowedTools = this.computeAllowedTools(config);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Compute the set of allowed tools based on configuration
|
|
14
|
+
*/
|
|
15
|
+
computeAllowedTools(config) {
|
|
16
|
+
// Mode "full": allow all tools
|
|
17
|
+
if (this.mode === "full") {
|
|
18
|
+
return new Set([...ALL_JIRA_TOOLS, ...ALL_CONFLUENCE_TOOLS, ...ALL_TEMPO_TOOLS]);
|
|
19
|
+
}
|
|
20
|
+
// Mode "readonly": allow only read tools
|
|
21
|
+
if (this.mode === "readonly") {
|
|
22
|
+
return new Set([...JIRA_READ_TOOLS, ...CONFLUENCE_READ_TOOLS, ...TEMPO_READ_TOOLS]);
|
|
23
|
+
}
|
|
24
|
+
// Mode "custom": use whitelist/blacklist
|
|
25
|
+
if (this.mode === "custom") {
|
|
26
|
+
// Whitelist has priority
|
|
27
|
+
if (config.whitelist.length > 0) {
|
|
28
|
+
const expanded = expandVirtualActions(config.whitelist);
|
|
29
|
+
return new Set(expanded);
|
|
30
|
+
}
|
|
31
|
+
// If no whitelist, use blacklist
|
|
32
|
+
if (config.blacklist.length > 0) {
|
|
33
|
+
const allTools = new Set([...ALL_JIRA_TOOLS, ...ALL_CONFLUENCE_TOOLS, ...ALL_TEMPO_TOOLS]);
|
|
34
|
+
const blacklisted = new Set(expandVirtualActions(config.blacklist));
|
|
35
|
+
// Remove blacklisted tools
|
|
36
|
+
blacklisted.forEach((tool) => allTools.delete(tool));
|
|
37
|
+
return allTools;
|
|
38
|
+
}
|
|
39
|
+
// No whitelist or blacklist in custom mode: allow all (default)
|
|
40
|
+
return new Set([...ALL_JIRA_TOOLS, ...ALL_CONFLUENCE_TOOLS, ...ALL_TEMPO_TOOLS]);
|
|
41
|
+
}
|
|
42
|
+
// Fallback: allow all
|
|
43
|
+
return new Set([...ALL_JIRA_TOOLS, ...ALL_CONFLUENCE_TOOLS, ...ALL_TEMPO_TOOLS]);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a tool is allowed to execute
|
|
47
|
+
*/
|
|
48
|
+
isToolAllowed(toolName) {
|
|
49
|
+
return this.allowedTools.has(toolName);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the list of allowed tools
|
|
53
|
+
*/
|
|
54
|
+
getAllowedTools() {
|
|
55
|
+
return Array.from(this.allowedTools);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get permission denial message
|
|
59
|
+
*/
|
|
60
|
+
getDenialMessage(toolName) {
|
|
61
|
+
const modeDesc = this.mode === "full"
|
|
62
|
+
? "full access"
|
|
63
|
+
: this.mode === "readonly"
|
|
64
|
+
? "read-only"
|
|
65
|
+
: "custom permissions";
|
|
66
|
+
let message = `Tool '${toolName}' is not allowed by current permission configuration (mode: ${modeDesc})`;
|
|
67
|
+
// Suggest similar allowed tools
|
|
68
|
+
const allowed = this.getAllowedTools();
|
|
69
|
+
if (allowed.length > 0) {
|
|
70
|
+
// Find tools from same service
|
|
71
|
+
const service = toolName.split("_")[0]; // "jira" or "confluence"
|
|
72
|
+
const similarTools = allowed.filter((t) => t.startsWith(service));
|
|
73
|
+
if (similarTools.length > 0) {
|
|
74
|
+
message += `\n\nAllowed ${service} tools: ${similarTools.slice(0, 5).join(", ")}`;
|
|
75
|
+
if (similarTools.length > 5) {
|
|
76
|
+
message += ` and ${similarTools.length - 5} more`;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return message;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get current permission mode
|
|
84
|
+
*/
|
|
85
|
+
getMode() {
|
|
86
|
+
return this.mode;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../src/permissions/filter.ts"],"names":[],"mappings":"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"}
|