@simplysf/simply-atlassian-mcp 0.2.2
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 +129 -0
- package/bin/run.js +50 -0
- package/lib/context.d.ts +32 -0
- package/lib/context.js +32 -0
- package/lib/context.js.map +1 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +22 -0
- package/lib/index.js.map +1 -0
- package/lib/server.d.ts +50 -0
- package/lib/server.js +133 -0
- package/lib/server.js.map +1 -0
- package/lib/tools.d.ts +36 -0
- package/lib/tools.js +586 -0
- package/lib/tools.js.map +1 -0
- package/package.json +170 -0
package/lib/tools.js
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2026, SimplySF.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { addIssuesToSprint, BODY_FORMATS, buildCommentBody, buildCommentEditBody, buildCreateIssueBody, buildIssueLinkBody, buildPageCommentBody, buildPageCreateBody, buildTransitionBody, buildUpdateIssueBody, changelogJson, currentAccount, deleteComment, deleteIssue, deleteIssueLink, deletePage, filterChangelog, issueLinkCreated, jiraTargetUrl, numericId, pageExpand, pageIdForInstance, pageIdFromInput, pageUrl, preparePageUpdate, readBackIssue, resolveTransitionId, updatePage, } from '@simplysf/simply-atlassian-core';
|
|
17
|
+
import { z } from 'zod';
|
|
18
|
+
function tool(spec) {
|
|
19
|
+
return spec;
|
|
20
|
+
}
|
|
21
|
+
// --- Schema building blocks, shared so the wording cannot drift between tools ---
|
|
22
|
+
const issueKey = z.string().describe('Issue key, for example PROJ-123.');
|
|
23
|
+
const commentId = z.string().describe('Comment id, as returned by jira_issue_comment_list.');
|
|
24
|
+
const pageRef = z.string().describe('Confluence page id, or a page URL to read the id from.');
|
|
25
|
+
const limit = (fallback, what) => z.number().int().positive().optional().describe(`Maximum number of ${what} to return. Defaults to ${fallback}.`);
|
|
26
|
+
const fields = z
|
|
27
|
+
.array(z.string())
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('Field names to request instead of the instance default. Raw issue payloads are large; ' +
|
|
30
|
+
'name only the fields you need (for example ["summary", "status", "assignee"]).');
|
|
31
|
+
const body = z
|
|
32
|
+
.record(z.string(), z.unknown())
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Raw Jira request body, for anything the typed properties do not cover such as custom ' +
|
|
35
|
+
'fields. Issue fields belong under "fields". Typed properties are merged over it.');
|
|
36
|
+
const dryRun = z
|
|
37
|
+
.boolean()
|
|
38
|
+
.optional()
|
|
39
|
+
.describe('Return the request that would be sent and send nothing. Use it to preview a change.');
|
|
40
|
+
const confirm = z
|
|
41
|
+
.boolean()
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Required, and must be true, to proceed with this irreversible change.');
|
|
44
|
+
const mentions = z
|
|
45
|
+
.array(z.string())
|
|
46
|
+
.optional()
|
|
47
|
+
.describe('People to @-mention: an account id, or a name or email to resolve. A name that matches ' +
|
|
48
|
+
'more than one active user is an error listing the candidates, so retry with the id.');
|
|
49
|
+
const labels = (verb) => z.array(z.string()).optional().describe(`Labels to ${verb}.`);
|
|
50
|
+
const storageText = z
|
|
51
|
+
.string()
|
|
52
|
+
.optional()
|
|
53
|
+
.describe('Body as plain text; becomes paragraphs with its markup characters escaped.');
|
|
54
|
+
const storageBody = z
|
|
55
|
+
.string()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('Body as raw Confluence storage-format XHTML, including Atlassian macro tags.');
|
|
58
|
+
const WRITE_SHAPE = { dryRun };
|
|
59
|
+
const DESTRUCTIVE_SHAPE = { dryRun, confirm };
|
|
60
|
+
/**
|
|
61
|
+
* Every tool this server can register, one per CLI command. The `test/tools.test.ts` suite
|
|
62
|
+
* cross-checks this list against the CLI package's `command-snapshot.json`, so a command added
|
|
63
|
+
* to the CLI without a tool here fails CI rather than going quietly unexposed.
|
|
64
|
+
*
|
|
65
|
+
* Each handler returns exactly what the matching command returns under `--json`, and the logic
|
|
66
|
+
* between input and request is the core package's — the same functions the command calls — so
|
|
67
|
+
* a dry run, a refusal, or an error reads the same from either surface.
|
|
68
|
+
*/
|
|
69
|
+
export const TOOLS = [
|
|
70
|
+
// --- Jira: identity and users ---
|
|
71
|
+
tool({
|
|
72
|
+
name: 'jira_whoami',
|
|
73
|
+
title: 'Jira: who am I',
|
|
74
|
+
description: 'Report the Jira account the configured credentials belong to. Call this first to confirm ' +
|
|
75
|
+
'the connection works and to learn your own account id.',
|
|
76
|
+
command: ['atlassian', 'jira', 'whoami'],
|
|
77
|
+
kind: 'read',
|
|
78
|
+
inputSchema: {},
|
|
79
|
+
run: (ctx) => currentAccount(ctx.jira()),
|
|
80
|
+
}),
|
|
81
|
+
tool({
|
|
82
|
+
name: 'jira_user_search',
|
|
83
|
+
title: 'Jira: search users',
|
|
84
|
+
description: 'Find Jira users by name or email. Returns account ids, which assignee and mention inputs need.',
|
|
85
|
+
command: ['atlassian', 'jira', 'user', 'search'],
|
|
86
|
+
kind: 'read',
|
|
87
|
+
inputSchema: {
|
|
88
|
+
query: z.string().describe('Name or email to search for.'),
|
|
89
|
+
limit: limit(20, 'users'),
|
|
90
|
+
},
|
|
91
|
+
run: (ctx, input) => ctx.jira().searchUsers(input.query, input.limit ?? 20),
|
|
92
|
+
}),
|
|
93
|
+
tool({
|
|
94
|
+
name: 'jira_user_view',
|
|
95
|
+
title: 'Jira: view a user',
|
|
96
|
+
description: 'Show one Jira user by account id (Cloud) or username (Server/Data Center).',
|
|
97
|
+
command: ['atlassian', 'jira', 'user', 'view'],
|
|
98
|
+
kind: 'read',
|
|
99
|
+
inputSchema: {
|
|
100
|
+
account: z.string().describe('Account id on Cloud, or username on Server/Data Center.'),
|
|
101
|
+
},
|
|
102
|
+
run: (ctx, input) => ctx.jira().getUser(input.account),
|
|
103
|
+
}),
|
|
104
|
+
tool({
|
|
105
|
+
name: 'jira_open',
|
|
106
|
+
title: 'Jira: browser URL for an issue or project',
|
|
107
|
+
description: 'Return the browser URL for an issue key or project key, for handing to a person. ' +
|
|
108
|
+
'Nothing is opened; the CLI command of the same name launches a browser, a server cannot.',
|
|
109
|
+
command: ['atlassian', 'jira', 'open'],
|
|
110
|
+
kind: 'read',
|
|
111
|
+
inputSchema: { target: z.string().describe('Jira issue key or project key.') },
|
|
112
|
+
run: (ctx, input) => Promise.resolve({ url: jiraTargetUrl(ctx.jiraConfig().url, input.target) }),
|
|
113
|
+
}),
|
|
114
|
+
// --- Jira: issues ---
|
|
115
|
+
tool({
|
|
116
|
+
name: 'jira_issue_search',
|
|
117
|
+
title: 'Jira: search issues',
|
|
118
|
+
description: 'Search issues with JQL. Returns an envelope { issues, total?, pages, complete }: "issues" ' +
|
|
119
|
+
'holds raw issue objects, and "complete": false means "limit" cut the results short. ' +
|
|
120
|
+
'Pass "fields" to keep the payload small.',
|
|
121
|
+
command: ['atlassian', 'jira', 'issue', 'search'],
|
|
122
|
+
kind: 'read',
|
|
123
|
+
inputSchema: {
|
|
124
|
+
jql: z.string().describe("JQL query to run, for example 'project = PROJ AND statusCategory != Done'."),
|
|
125
|
+
limit: limit(50, 'issues across all pages'),
|
|
126
|
+
fields,
|
|
127
|
+
},
|
|
128
|
+
run: (ctx, input) => ctx.jira().searchAllIssues({ jql: input.jql, fields: input.fields }, input.limit ?? 50),
|
|
129
|
+
}),
|
|
130
|
+
tool({
|
|
131
|
+
name: 'jira_issue_view',
|
|
132
|
+
title: 'Jira: view an issue',
|
|
133
|
+
description: 'Fetch one issue as the raw API payload. Pass "fields" to limit it, or "expand" for ' +
|
|
134
|
+
'extras such as the changelog.',
|
|
135
|
+
command: ['atlassian', 'jira', 'issue', 'view'],
|
|
136
|
+
kind: 'read',
|
|
137
|
+
inputSchema: {
|
|
138
|
+
issue: issueKey,
|
|
139
|
+
fields,
|
|
140
|
+
expand: z.array(z.string()).optional().describe('Jira expand parameters, for example ["changelog"].'),
|
|
141
|
+
},
|
|
142
|
+
run: (ctx, input) => ctx.jira().getIssue(input.issue, { fields: input.fields, expand: input.expand?.join(',') }),
|
|
143
|
+
}),
|
|
144
|
+
tool({
|
|
145
|
+
name: 'jira_issue_history',
|
|
146
|
+
title: 'Jira: issue change history',
|
|
147
|
+
description: 'List who changed which fields on an issue, when, and the previous and new values, as raw ' +
|
|
148
|
+
'changelog entries oldest first. "complete": false means Jira could not retrieve every entry.',
|
|
149
|
+
command: ['atlassian', 'jira', 'issue', 'history'],
|
|
150
|
+
kind: 'read',
|
|
151
|
+
inputSchema: {
|
|
152
|
+
issue: issueKey,
|
|
153
|
+
limit: limit(50, 'history entries'),
|
|
154
|
+
field: z.string().optional().describe('Only entries that changed this field, case-insensitively.'),
|
|
155
|
+
},
|
|
156
|
+
run: async (ctx, input) => changelogJson(filterChangelog(await ctx.jira().getAllChangelog(input.issue, input.limit ?? 50), input.field)),
|
|
157
|
+
}),
|
|
158
|
+
tool({
|
|
159
|
+
name: 'jira_issue_transitions',
|
|
160
|
+
title: 'Jira: list available transitions',
|
|
161
|
+
description: 'List the workflow transitions an issue can take right now, with their ids and names. ' +
|
|
162
|
+
'Call this before jira_issue_transition when you are not sure of the transition name.',
|
|
163
|
+
command: ['atlassian', 'jira', 'issue', 'transitions'],
|
|
164
|
+
kind: 'read',
|
|
165
|
+
inputSchema: { issue: issueKey },
|
|
166
|
+
run: (ctx, input) => ctx.jira().getTransitions(input.issue),
|
|
167
|
+
}),
|
|
168
|
+
tool({
|
|
169
|
+
name: 'jira_issue_create',
|
|
170
|
+
title: 'Jira: create an issue',
|
|
171
|
+
description: 'Create an issue. Common fields have their own properties; "body" supplies raw fields ' +
|
|
172
|
+
'JSON for anything else, including custom fields. Pass "parent" with type "Subtask" to ' +
|
|
173
|
+
'create a subtask. Use dryRun to see exactly what would be sent.',
|
|
174
|
+
command: ['atlassian', 'jira', 'issue', 'create'],
|
|
175
|
+
kind: 'write',
|
|
176
|
+
inputSchema: {
|
|
177
|
+
project: z.string().optional().describe('Project key the issue belongs to.'),
|
|
178
|
+
type: z.string().optional().describe('Issue type name, for example Task or Bug.'),
|
|
179
|
+
summary: z.string().optional().describe('Issue summary.'),
|
|
180
|
+
description: z.string().optional().describe('Issue description as plain text.'),
|
|
181
|
+
parent: z.string().optional().describe('Parent issue key, making this a subtask of it.'),
|
|
182
|
+
assignee: z.string().optional().describe('Assignee: account id on Cloud, username on Server/Data Center.'),
|
|
183
|
+
priority: z.string().optional().describe('Priority name.'),
|
|
184
|
+
labels: labels('apply'),
|
|
185
|
+
body,
|
|
186
|
+
...WRITE_SHAPE,
|
|
187
|
+
},
|
|
188
|
+
run: async (ctx, input) => {
|
|
189
|
+
const client = ctx.jira();
|
|
190
|
+
const request = buildCreateIssueBody(client, input);
|
|
191
|
+
return input.dryRun === true ? request : client.createIssue(request);
|
|
192
|
+
},
|
|
193
|
+
}),
|
|
194
|
+
tool({
|
|
195
|
+
name: 'jira_issue_update',
|
|
196
|
+
title: 'Jira: update an issue',
|
|
197
|
+
description: 'Change fields on an existing issue. Only the properties you pass are changed; "labels" ' +
|
|
198
|
+
'replaces the whole label set. The issue is re-read afterwards and returned unless verify ' +
|
|
199
|
+
'is false. Use dryRun to preview.',
|
|
200
|
+
command: ['atlassian', 'jira', 'issue', 'update'],
|
|
201
|
+
kind: 'write',
|
|
202
|
+
inputSchema: {
|
|
203
|
+
issue: issueKey,
|
|
204
|
+
summary: z.string().optional().describe('New summary.'),
|
|
205
|
+
description: z.string().optional().describe('New description as plain text.'),
|
|
206
|
+
assignee: z.string().optional().describe('New assignee: account id on Cloud, username on Server/Data Center.'),
|
|
207
|
+
priority: z.string().optional().describe('New priority name.'),
|
|
208
|
+
labels: labels('set, replacing the existing labels'),
|
|
209
|
+
body,
|
|
210
|
+
verify: z.boolean().optional().describe('Re-read the issue after updating and return it. Defaults to true.'),
|
|
211
|
+
...WRITE_SHAPE,
|
|
212
|
+
},
|
|
213
|
+
run: async (ctx, input) => {
|
|
214
|
+
const client = ctx.jira();
|
|
215
|
+
const request = buildUpdateIssueBody(client, input.issue, input);
|
|
216
|
+
if (input.dryRun === true)
|
|
217
|
+
return request;
|
|
218
|
+
await client.updateIssue(input.issue, request);
|
|
219
|
+
if (input.verify === false)
|
|
220
|
+
return { issue: input.issue, updated: true };
|
|
221
|
+
const readBack = await readBackIssue(client, input.issue);
|
|
222
|
+
return readBack.ok ? readBack.issue : { issue: input.issue, updated: true, verified: false };
|
|
223
|
+
},
|
|
224
|
+
}),
|
|
225
|
+
tool({
|
|
226
|
+
name: 'jira_issue_transition',
|
|
227
|
+
title: 'Jira: transition an issue',
|
|
228
|
+
description: 'Move an issue through its workflow by transition id or name (see jira_issue_transitions). ' +
|
|
229
|
+
'Optionally add a comment as part of the transition. Use dryRun to preview.',
|
|
230
|
+
command: ['atlassian', 'jira', 'issue', 'transition'],
|
|
231
|
+
kind: 'write',
|
|
232
|
+
inputSchema: {
|
|
233
|
+
issue: issueKey,
|
|
234
|
+
transition: z.string().describe('Transition id, or its name, for example "Done".'),
|
|
235
|
+
comment: z.string().optional().describe('Comment to add as part of the transition.'),
|
|
236
|
+
byName: z.boolean().optional().describe('Treat "transition" as a name even if it is all digits.'),
|
|
237
|
+
body,
|
|
238
|
+
...WRITE_SHAPE,
|
|
239
|
+
},
|
|
240
|
+
run: async (ctx, input) => {
|
|
241
|
+
const client = ctx.jira();
|
|
242
|
+
const id = await resolveTransitionId(client, input.issue, input.transition, { byName: input.byName });
|
|
243
|
+
const request = buildTransitionBody(client, id, { body: input.body, comment: input.comment });
|
|
244
|
+
if (input.dryRun === true)
|
|
245
|
+
return request;
|
|
246
|
+
await client.transitionIssue(input.issue, request);
|
|
247
|
+
return { issue: input.issue, transition: id, transitioned: true };
|
|
248
|
+
},
|
|
249
|
+
}),
|
|
250
|
+
tool({
|
|
251
|
+
name: 'jira_issue_delete',
|
|
252
|
+
title: 'Jira: delete an issue',
|
|
253
|
+
description: 'Permanently delete an issue. Irreversible: requires confirm: true. Jira refuses to delete ' +
|
|
254
|
+
'an issue that has subtasks unless deleteSubtasks is true. Use dryRun to see what would be ' +
|
|
255
|
+
'deleted without deleting it.',
|
|
256
|
+
command: ['atlassian', 'jira', 'issue', 'delete'],
|
|
257
|
+
kind: 'destructive',
|
|
258
|
+
inputSchema: {
|
|
259
|
+
issue: issueKey,
|
|
260
|
+
deleteSubtasks: z.boolean().optional().describe("Also delete the issue's subtasks."),
|
|
261
|
+
...DESTRUCTIVE_SHAPE,
|
|
262
|
+
},
|
|
263
|
+
run: (ctx, input) => deleteIssue(ctx.jira(), input),
|
|
264
|
+
}),
|
|
265
|
+
// --- Jira: comments ---
|
|
266
|
+
tool({
|
|
267
|
+
name: 'jira_issue_comment_list',
|
|
268
|
+
title: 'Jira: list comments',
|
|
269
|
+
description: 'List the comments on an issue, newest last, with their ids.',
|
|
270
|
+
command: ['atlassian', 'jira', 'issue', 'comment', 'list'],
|
|
271
|
+
kind: 'read',
|
|
272
|
+
inputSchema: { issue: issueKey, limit: limit(25, 'comments') },
|
|
273
|
+
run: (ctx, input) => ctx.jira().getComments(input.issue, { maxResults: input.limit ?? 25 }),
|
|
274
|
+
}),
|
|
275
|
+
tool({
|
|
276
|
+
name: 'jira_issue_comment_add',
|
|
277
|
+
title: 'Jira: add a comment',
|
|
278
|
+
description: 'Add a comment to an issue. "text" is plain text; "mentions" @-mentions people by account ' +
|
|
279
|
+
'id, name, or email. Use dryRun to preview.',
|
|
280
|
+
command: ['atlassian', 'jira', 'issue', 'comment', 'add'],
|
|
281
|
+
kind: 'write',
|
|
282
|
+
inputSchema: {
|
|
283
|
+
issue: issueKey,
|
|
284
|
+
text: z.string().optional().describe('Comment text.'),
|
|
285
|
+
mentions,
|
|
286
|
+
body,
|
|
287
|
+
...WRITE_SHAPE,
|
|
288
|
+
},
|
|
289
|
+
run: async (ctx, input) => {
|
|
290
|
+
const client = ctx.jira();
|
|
291
|
+
const request = await buildCommentBody(client, input.issue, input);
|
|
292
|
+
return input.dryRun === true ? request : client.addComment(input.issue, request);
|
|
293
|
+
},
|
|
294
|
+
}),
|
|
295
|
+
tool({
|
|
296
|
+
name: 'jira_issue_comment_edit',
|
|
297
|
+
title: 'Jira: edit a comment',
|
|
298
|
+
description: 'Replace the text of an existing comment. Use dryRun to preview.',
|
|
299
|
+
command: ['atlassian', 'jira', 'issue', 'comment', 'edit'],
|
|
300
|
+
kind: 'write',
|
|
301
|
+
inputSchema: {
|
|
302
|
+
issue: issueKey,
|
|
303
|
+
comment: commentId,
|
|
304
|
+
text: z.string().optional().describe('Replacement comment text.'),
|
|
305
|
+
mentions,
|
|
306
|
+
body,
|
|
307
|
+
...WRITE_SHAPE,
|
|
308
|
+
},
|
|
309
|
+
run: async (ctx, input) => {
|
|
310
|
+
const client = ctx.jira();
|
|
311
|
+
const request = await buildCommentEditBody(client, input.comment, input);
|
|
312
|
+
return input.dryRun === true ? request : client.updateComment(input.issue, input.comment, request);
|
|
313
|
+
},
|
|
314
|
+
}),
|
|
315
|
+
tool({
|
|
316
|
+
name: 'jira_issue_comment_delete',
|
|
317
|
+
title: 'Jira: delete a comment',
|
|
318
|
+
description: 'Permanently delete a comment. Irreversible: requires confirm: true. Use dryRun to see ' +
|
|
319
|
+
'what would be deleted.',
|
|
320
|
+
command: ['atlassian', 'jira', 'issue', 'comment', 'delete'],
|
|
321
|
+
kind: 'destructive',
|
|
322
|
+
inputSchema: { issue: issueKey, comment: commentId, ...DESTRUCTIVE_SHAPE },
|
|
323
|
+
run: (ctx, input) => deleteComment(ctx.jira(), input),
|
|
324
|
+
}),
|
|
325
|
+
// --- Jira: issue links ---
|
|
326
|
+
tool({
|
|
327
|
+
name: 'jira_issue_link_list',
|
|
328
|
+
title: 'Jira: list issue links',
|
|
329
|
+
description: "Fetch an issue's links (its issuelinks field), each carrying the link id, its type with both " +
|
|
330
|
+
'phrases, and the issue at the other end.',
|
|
331
|
+
command: ['atlassian', 'jira', 'issue', 'link', 'list'],
|
|
332
|
+
kind: 'read',
|
|
333
|
+
inputSchema: { issue: issueKey },
|
|
334
|
+
run: (ctx, input) => ctx.jira().getIssue(input.issue, { fields: ['issuelinks'] }),
|
|
335
|
+
}),
|
|
336
|
+
tool({
|
|
337
|
+
name: 'jira_issue_link_types',
|
|
338
|
+
title: 'Jira: list link types',
|
|
339
|
+
description: 'List the link types this instance allows, with their outward and inward phrases ' +
|
|
340
|
+
'(for example "blocks" / "is blocked by").',
|
|
341
|
+
command: ['atlassian', 'jira', 'issue', 'link', 'types'],
|
|
342
|
+
kind: 'read',
|
|
343
|
+
inputSchema: {},
|
|
344
|
+
run: (ctx) => ctx.jira().getLinkTypes(),
|
|
345
|
+
}),
|
|
346
|
+
tool({
|
|
347
|
+
name: 'jira_issue_link_create',
|
|
348
|
+
title: 'Jira: link two issues',
|
|
349
|
+
description: 'Relate two issues, stated the natural way round: from PROJ-1, "blocks", to PROJ-2 means ' +
|
|
350
|
+
'PROJ-1 blocks PROJ-2. "type" is a phrase or a link type name; either direction\'s phrase ' +
|
|
351
|
+
'is accepted. Use dryRun to preview.',
|
|
352
|
+
command: ['atlassian', 'jira', 'issue', 'link', 'create'],
|
|
353
|
+
kind: 'write',
|
|
354
|
+
inputSchema: {
|
|
355
|
+
from: z.string().describe('Issue the relationship is stated from, for example PROJ-1.'),
|
|
356
|
+
type: z.string().describe('Relationship phrase or link type name, for example "blocks".'),
|
|
357
|
+
to: z.string().describe('Issue the relationship points at, for example PROJ-2.'),
|
|
358
|
+
comment: z.string().optional().describe('Comment to add to the link.'),
|
|
359
|
+
...WRITE_SHAPE,
|
|
360
|
+
},
|
|
361
|
+
run: async (ctx, input) => {
|
|
362
|
+
const client = ctx.jira();
|
|
363
|
+
const { body: request, resolved } = await buildIssueLinkBody(client, input.from, input.type, input.to, input.comment);
|
|
364
|
+
if (input.dryRun === true)
|
|
365
|
+
return request;
|
|
366
|
+
await client.createIssueLink(request);
|
|
367
|
+
return issueLinkCreated(input.from, input.to, resolved);
|
|
368
|
+
},
|
|
369
|
+
}),
|
|
370
|
+
tool({
|
|
371
|
+
name: 'jira_issue_link_delete',
|
|
372
|
+
title: 'Jira: remove an issue link',
|
|
373
|
+
description: 'Remove a link between two issues by link id (see jira_issue_link_list). The result names ' +
|
|
374
|
+
'the relationship that was removed. Use dryRun to preview.',
|
|
375
|
+
command: ['atlassian', 'jira', 'issue', 'link', 'delete'],
|
|
376
|
+
kind: 'write',
|
|
377
|
+
inputSchema: {
|
|
378
|
+
linkId: z.string().describe('Link id, as shown by jira_issue_link_list.'),
|
|
379
|
+
...WRITE_SHAPE,
|
|
380
|
+
},
|
|
381
|
+
run: (ctx, input) => deleteIssueLink(ctx.jira(), input.linkId, { dryRun: input.dryRun }),
|
|
382
|
+
}),
|
|
383
|
+
// --- Jira: agile boards and sprints ---
|
|
384
|
+
tool({
|
|
385
|
+
name: 'jira_board_list',
|
|
386
|
+
title: 'Jira: list boards',
|
|
387
|
+
description: 'List the agile boards visible to the current user, optionally filtered by project or type.',
|
|
388
|
+
command: ['atlassian', 'jira', 'board', 'list'],
|
|
389
|
+
kind: 'read',
|
|
390
|
+
inputSchema: {
|
|
391
|
+
project: z.string().optional().describe('Filter by project key or id.'),
|
|
392
|
+
type: z.string().optional().describe('Filter by board type: scrum or kanban.'),
|
|
393
|
+
limit: limit(50, 'boards'),
|
|
394
|
+
},
|
|
395
|
+
run: (ctx, input) => ctx.jira().getBoards({
|
|
396
|
+
projectKeyOrId: input.project,
|
|
397
|
+
type: input.type,
|
|
398
|
+
maxResults: input.limit ?? 50,
|
|
399
|
+
limit: input.limit ?? 50,
|
|
400
|
+
}),
|
|
401
|
+
}),
|
|
402
|
+
tool({
|
|
403
|
+
name: 'jira_sprint_list',
|
|
404
|
+
title: 'Jira: list sprints',
|
|
405
|
+
description: "List a board's sprints by numeric board id (see jira_board_list). Board names are not " +
|
|
406
|
+
'resolved. Defaults to active and future sprints.',
|
|
407
|
+
command: ['atlassian', 'jira', 'sprint', 'list'],
|
|
408
|
+
kind: 'read',
|
|
409
|
+
inputSchema: {
|
|
410
|
+
board: z.string().describe('Numeric agile board id.'),
|
|
411
|
+
state: z.string().optional().describe('Sprint states as CSV: active, future, closed. Defaults to active,future.'),
|
|
412
|
+
limit: limit(50, 'sprints'),
|
|
413
|
+
},
|
|
414
|
+
run: (ctx, input) => ctx.jira().getSprints(numericId('Board', input.board), {
|
|
415
|
+
state: input.state ?? 'active,future',
|
|
416
|
+
maxResults: input.limit ?? 50,
|
|
417
|
+
limit: input.limit ?? 50,
|
|
418
|
+
}),
|
|
419
|
+
}),
|
|
420
|
+
tool({
|
|
421
|
+
name: 'jira_sprint_issues',
|
|
422
|
+
title: 'Jira: list sprint issues',
|
|
423
|
+
description: 'List the issues in a sprint by numeric sprint id. Pass "fields" to keep the payload small.',
|
|
424
|
+
command: ['atlassian', 'jira', 'sprint', 'issues'],
|
|
425
|
+
kind: 'read',
|
|
426
|
+
inputSchema: {
|
|
427
|
+
sprint: z.string().describe('Numeric sprint id.'),
|
|
428
|
+
fields,
|
|
429
|
+
limit: limit(50, 'issues'),
|
|
430
|
+
},
|
|
431
|
+
run: (ctx, input) => ctx.jira().getSprintIssues(numericId('Sprint', input.sprint), {
|
|
432
|
+
fields: input.fields,
|
|
433
|
+
maxResults: input.limit ?? 50,
|
|
434
|
+
limit: input.limit ?? 50,
|
|
435
|
+
}),
|
|
436
|
+
}),
|
|
437
|
+
tool({
|
|
438
|
+
name: 'jira_sprint_add',
|
|
439
|
+
title: 'Jira: add issues to a sprint',
|
|
440
|
+
description: 'Move existing issues into a sprint by numeric sprint id. Reversible, so no confirm is ' +
|
|
441
|
+
'needed. Large lists are sent in chunks of 50. Use dryRun to preview.',
|
|
442
|
+
command: ['atlassian', 'jira', 'sprint', 'add'],
|
|
443
|
+
kind: 'write',
|
|
444
|
+
inputSchema: {
|
|
445
|
+
sprint: z.string().describe('Numeric sprint id.'),
|
|
446
|
+
issues: z.array(z.string()).min(1).describe('Issue keys to move.'),
|
|
447
|
+
...WRITE_SHAPE,
|
|
448
|
+
},
|
|
449
|
+
run: (ctx, input) => addIssuesToSprint(ctx.jira(), input.sprint, input.issues, { dryRun: input.dryRun }),
|
|
450
|
+
}),
|
|
451
|
+
// --- Confluence: pages ---
|
|
452
|
+
tool({
|
|
453
|
+
name: 'confluence_open',
|
|
454
|
+
title: 'Confluence: browser URL for a page',
|
|
455
|
+
description: 'Return the browser URL for a page id or page URL, for handing to a person. Nothing is ' +
|
|
456
|
+
'opened; the CLI command of the same name launches a browser, a server cannot.',
|
|
457
|
+
command: ['atlassian', 'confluence', 'open'],
|
|
458
|
+
kind: 'read',
|
|
459
|
+
inputSchema: { page: pageRef },
|
|
460
|
+
run: (ctx, input) => Promise.resolve({ url: pageUrl(ctx.confluenceConfig().url, pageIdFromInput(input.page)) }),
|
|
461
|
+
}),
|
|
462
|
+
tool({
|
|
463
|
+
name: 'confluence_page_get',
|
|
464
|
+
title: 'Confluence: get a page',
|
|
465
|
+
description: 'Fetch a page by id or URL as the raw API payload, including its stored body (storage-format ' +
|
|
466
|
+
'XHTML) unless bodyFormat is "none".',
|
|
467
|
+
command: ['atlassian', 'confluence', 'page', 'get'],
|
|
468
|
+
kind: 'read',
|
|
469
|
+
inputSchema: {
|
|
470
|
+
page: pageRef,
|
|
471
|
+
bodyFormat: z
|
|
472
|
+
.enum(BODY_FORMATS)
|
|
473
|
+
.optional()
|
|
474
|
+
.describe('Whether to request the body. "none" skips it entirely; the other values fetch it.'),
|
|
475
|
+
expand: z.array(z.string()).optional().describe('Confluence expansions, replacing the default set.'),
|
|
476
|
+
},
|
|
477
|
+
run: (ctx, input) => ctx
|
|
478
|
+
.confluence()
|
|
479
|
+
.getPage(pageIdFromInput(input.page), { expand: pageExpand(input.bodyFormat ?? 'markdown', input.expand) }),
|
|
480
|
+
}),
|
|
481
|
+
tool({
|
|
482
|
+
name: 'confluence_page_search',
|
|
483
|
+
title: 'Confluence: search pages',
|
|
484
|
+
description: 'Search Confluence content with CQL, for example \'text ~ "release notes" AND space = DOCS\'.',
|
|
485
|
+
command: ['atlassian', 'confluence', 'page', 'search'],
|
|
486
|
+
kind: 'read',
|
|
487
|
+
inputSchema: {
|
|
488
|
+
cql: z.string().describe('CQL query to run.'),
|
|
489
|
+
limit: limit(25, 'results across all pages'),
|
|
490
|
+
},
|
|
491
|
+
run: (ctx, input) => ctx.confluence().searchAllPages(input.cql, input.limit ?? 25),
|
|
492
|
+
}),
|
|
493
|
+
tool({
|
|
494
|
+
name: 'confluence_page_children',
|
|
495
|
+
title: 'Confluence: list child pages',
|
|
496
|
+
description: 'List the direct child pages of a page.',
|
|
497
|
+
command: ['atlassian', 'confluence', 'page', 'children'],
|
|
498
|
+
kind: 'read',
|
|
499
|
+
inputSchema: { page: pageRef, limit: limit(25, 'children') },
|
|
500
|
+
run: (ctx, input) => ctx.confluence().getPageChildren(pageIdFromInput(input.page), { limit: input.limit ?? 25 }),
|
|
501
|
+
}),
|
|
502
|
+
tool({
|
|
503
|
+
name: 'confluence_page_create',
|
|
504
|
+
title: 'Confluence: create a page',
|
|
505
|
+
description: 'Create a page in a space. "text" is plain prose (escaped, paragraphs); "body" is raw ' +
|
|
506
|
+
'storage-format XHTML. Pass "parent" to place it under another page. Use dryRun to preview.',
|
|
507
|
+
command: ['atlassian', 'confluence', 'page', 'create'],
|
|
508
|
+
kind: 'write',
|
|
509
|
+
inputSchema: {
|
|
510
|
+
space: z.string().describe('Space key the page belongs to.'),
|
|
511
|
+
title: z.string().describe('Page title.'),
|
|
512
|
+
parent: z.string().optional().describe('Parent page id or URL; without it the page lands at the space root.'),
|
|
513
|
+
text: storageText,
|
|
514
|
+
body: storageBody,
|
|
515
|
+
...WRITE_SHAPE,
|
|
516
|
+
},
|
|
517
|
+
run: (ctx, input) => {
|
|
518
|
+
const client = ctx.confluence();
|
|
519
|
+
const request = buildPageCreateBody(input, ctx.confluenceConfig().url);
|
|
520
|
+
return input.dryRun === true ? Promise.resolve(request) : client.createContent(request);
|
|
521
|
+
},
|
|
522
|
+
}),
|
|
523
|
+
tool({
|
|
524
|
+
name: 'confluence_page_update',
|
|
525
|
+
title: 'Confluence: update a page',
|
|
526
|
+
description: "REPLACE a page's body or title. The version is handled for you: the page is read and the " +
|
|
527
|
+
'next version sent, and a conflicting edit by someone else fails rather than overwriting ' +
|
|
528
|
+
'their work. Use dryRun to preview.',
|
|
529
|
+
command: ['atlassian', 'confluence', 'page', 'update'],
|
|
530
|
+
kind: 'write',
|
|
531
|
+
inputSchema: {
|
|
532
|
+
page: pageRef,
|
|
533
|
+
title: z.string().optional().describe("New title. Defaults to the page's current title."),
|
|
534
|
+
text: storageText,
|
|
535
|
+
body: storageBody,
|
|
536
|
+
...WRITE_SHAPE,
|
|
537
|
+
},
|
|
538
|
+
run: async (ctx, input) => {
|
|
539
|
+
const client = ctx.confluence();
|
|
540
|
+
const pageId = pageIdForInstance(input.page, ctx.confluenceConfig().url);
|
|
541
|
+
const plan = await preparePageUpdate(client, pageId, input);
|
|
542
|
+
return input.dryRun === true ? plan.payload : updatePage(client, plan);
|
|
543
|
+
},
|
|
544
|
+
}),
|
|
545
|
+
tool({
|
|
546
|
+
name: 'confluence_page_delete',
|
|
547
|
+
title: 'Confluence: trash or destroy a page',
|
|
548
|
+
description: 'Move a page to the space trash, which is reversible and needs no confirm. With purge: true ' +
|
|
549
|
+
'the page is destroyed permanently, which requires confirm: true. Use dryRun to preview.',
|
|
550
|
+
command: ['atlassian', 'confluence', 'page', 'delete'],
|
|
551
|
+
kind: 'destructive',
|
|
552
|
+
inputSchema: {
|
|
553
|
+
page: pageRef,
|
|
554
|
+
purge: z.boolean().optional().describe('Destroy the page permanently instead of trashing it. Requires confirm.'),
|
|
555
|
+
...DESTRUCTIVE_SHAPE,
|
|
556
|
+
},
|
|
557
|
+
requiresConfirm: (input) => input.purge === true,
|
|
558
|
+
run: (ctx, input) => deletePage(ctx.confluence(), pageIdForInstance(input.page, ctx.confluenceConfig().url), input),
|
|
559
|
+
}),
|
|
560
|
+
tool({
|
|
561
|
+
name: 'confluence_page_comment_list',
|
|
562
|
+
title: 'Confluence: list page comments',
|
|
563
|
+
description: 'List the comments on a page with their ids, bodies (storage-format XHTML), and authors.',
|
|
564
|
+
command: ['atlassian', 'confluence', 'page', 'comment', 'list'],
|
|
565
|
+
kind: 'read',
|
|
566
|
+
inputSchema: { page: pageRef, limit: limit(25, 'comments') },
|
|
567
|
+
run: (ctx, input) => ctx
|
|
568
|
+
.confluence()
|
|
569
|
+
.getComments(pageIdForInstance(input.page, ctx.confluenceConfig().url), { limit: input.limit ?? 25 }),
|
|
570
|
+
}),
|
|
571
|
+
tool({
|
|
572
|
+
name: 'confluence_page_comment_add',
|
|
573
|
+
title: 'Confluence: comment on a page',
|
|
574
|
+
description: 'Add a comment to a page. "text" is plain prose (escaped, paragraphs); "body" is raw ' +
|
|
575
|
+
'storage-format XHTML. Use dryRun to preview.',
|
|
576
|
+
command: ['atlassian', 'confluence', 'page', 'comment', 'add'],
|
|
577
|
+
kind: 'write',
|
|
578
|
+
inputSchema: { page: pageRef, text: storageText, body: storageBody, ...WRITE_SHAPE },
|
|
579
|
+
run: (ctx, input) => {
|
|
580
|
+
const client = ctx.confluence();
|
|
581
|
+
const request = buildPageCommentBody(pageIdForInstance(input.page, ctx.confluenceConfig().url), input);
|
|
582
|
+
return input.dryRun === true ? Promise.resolve(request) : client.createContent(request);
|
|
583
|
+
},
|
|
584
|
+
}),
|
|
585
|
+
];
|
|
586
|
+
//# sourceMappingURL=tools.js.map
|
package/lib/tools.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|