@manhq/localmcp 1.0.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 +239 -0
- package/README.vi.md +239 -0
- package/bin/localmcp.js +31 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +333 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/services/atlassian/client.d.ts +4 -0
- package/dist/services/atlassian/client.d.ts.map +1 -0
- package/dist/services/atlassian/client.js +26 -0
- package/dist/services/atlassian/client.js.map +1 -0
- package/dist/services/atlassian/index.d.ts +3 -0
- package/dist/services/atlassian/index.d.ts.map +1 -0
- package/dist/services/atlassian/index.js +7 -0
- package/dist/services/atlassian/index.js.map +1 -0
- package/dist/services/atlassian/tools/confluence.d.ts +3 -0
- package/dist/services/atlassian/tools/confluence.d.ts.map +1 -0
- package/dist/services/atlassian/tools/confluence.js +222 -0
- package/dist/services/atlassian/tools/confluence.js.map +1 -0
- package/dist/services/atlassian/tools/jira.d.ts +3 -0
- package/dist/services/atlassian/tools/jira.d.ts.map +1 -0
- package/dist/services/atlassian/tools/jira.js +266 -0
- package/dist/services/atlassian/tools/jira.js.map +1 -0
- package/dist/services/atlassian/types.d.ts +74 -0
- package/dist/services/atlassian/types.d.ts.map +1 -0
- package/dist/services/atlassian/types.js +2 -0
- package/dist/services/atlassian/types.js.map +1 -0
- package/dist/services/figma/client.d.ts +3 -0
- package/dist/services/figma/client.d.ts.map +1 -0
- package/dist/services/figma/client.js +27 -0
- package/dist/services/figma/client.js.map +1 -0
- package/dist/services/figma/index.d.ts +3 -0
- package/dist/services/figma/index.d.ts.map +1 -0
- package/dist/services/figma/index.js +13 -0
- package/dist/services/figma/index.js.map +1 -0
- package/dist/services/figma/tools/comments.d.ts +3 -0
- package/dist/services/figma/tools/comments.d.ts.map +1 -0
- package/dist/services/figma/tools/comments.js +41 -0
- package/dist/services/figma/tools/comments.js.map +1 -0
- package/dist/services/figma/tools/components.d.ts +3 -0
- package/dist/services/figma/tools/components.d.ts.map +1 -0
- package/dist/services/figma/tools/components.js +101 -0
- package/dist/services/figma/tools/components.js.map +1 -0
- package/dist/services/figma/tools/files.d.ts +3 -0
- package/dist/services/figma/tools/files.d.ts.map +1 -0
- package/dist/services/figma/tools/files.js +86 -0
- package/dist/services/figma/tools/files.js.map +1 -0
- package/dist/services/figma/tools/images.d.ts +3 -0
- package/dist/services/figma/tools/images.d.ts.map +1 -0
- package/dist/services/figma/tools/images.js +67 -0
- package/dist/services/figma/tools/images.js.map +1 -0
- package/dist/services/figma/tools/variables.d.ts +3 -0
- package/dist/services/figma/tools/variables.d.ts.map +1 -0
- package/dist/services/figma/tools/variables.js +44 -0
- package/dist/services/figma/tools/variables.js.map +1 -0
- package/dist/services/figma/types.d.ts +65 -0
- package/dist/services/figma/types.d.ts.map +1 -0
- package/dist/services/figma/types.js +2 -0
- package/dist/services/figma/types.js.map +1 -0
- package/dist/services/google-chat/auth.d.ts +2 -0
- package/dist/services/google-chat/auth.d.ts.map +1 -0
- package/dist/services/google-chat/auth.js +18 -0
- package/dist/services/google-chat/auth.js.map +1 -0
- package/dist/services/google-chat/client.d.ts +3 -0
- package/dist/services/google-chat/client.d.ts.map +1 -0
- package/dist/services/google-chat/client.js +14 -0
- package/dist/services/google-chat/client.js.map +1 -0
- package/dist/services/google-chat/index.d.ts +3 -0
- package/dist/services/google-chat/index.d.ts.map +1 -0
- package/dist/services/google-chat/index.js +5 -0
- package/dist/services/google-chat/index.js.map +1 -0
- package/dist/services/google-chat/tools/messages.d.ts +3 -0
- package/dist/services/google-chat/tools/messages.d.ts.map +1 -0
- package/dist/services/google-chat/tools/messages.js +144 -0
- package/dist/services/google-chat/tools/messages.js.map +1 -0
- package/dist/services/google-chat/types.d.ts +31 -0
- package/dist/services/google-chat/types.d.ts.map +1 -0
- package/dist/services/google-chat/types.js +2 -0
- package/dist/services/google-chat/types.js.map +1 -0
- package/dist/shared/env.d.ts +18 -0
- package/dist/shared/env.d.ts.map +1 -0
- package/dist/shared/env.js +27 -0
- package/dist/shared/env.js.map +1 -0
- package/dist/shared/errors.d.ts +8 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +38 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/response.d.ts +7 -0
- package/dist/shared/response.d.ts.map +1 -0
- package/dist/shared/response.js +7 -0
- package/dist/shared/response.js.map +1 -0
- package/dist/shared/settings.d.ts +36 -0
- package/dist/shared/settings.d.ts.map +1 -0
- package/dist/shared/settings.js +104 -0
- package/dist/shared/settings.js.map +1 -0
- package/docs/atlassian.md +170 -0
- package/docs/figma.md +154 -0
- package/docs/google-chat.md +130 -0
- package/docs/vi/atlassian.md +170 -0
- package/docs/vi/figma.md +154 -0
- package/docs/vi/google-chat.md +130 -0
- package/package.json +53 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getConfluenceClient } from "../client.js";
|
|
3
|
+
import { handleToolError } from "../../../shared/errors.js";
|
|
4
|
+
import { toTextResponse } from "../../../shared/response.js";
|
|
5
|
+
export function registerConfluenceTools(server) {
|
|
6
|
+
server.registerTool("getConfluencePage", {
|
|
7
|
+
description: "Fetch a Confluence page or live document by ID. Returns title, space, version, and body content.",
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
pageId: z.string().describe("Confluence page ID"),
|
|
10
|
+
includeBody: z.boolean().default(false).describe("Include page body content (default false)"),
|
|
11
|
+
}),
|
|
12
|
+
}, async ({ pageId, includeBody }) => {
|
|
13
|
+
try {
|
|
14
|
+
const params = includeBody ? { "body-format": "storage" } : {};
|
|
15
|
+
const { data } = await getConfluenceClient().get(`/api/v2/pages/${pageId}`, { params });
|
|
16
|
+
return toTextResponse(data);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return handleToolError(error);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
server.registerTool("getConfluencePageDescendants", {
|
|
23
|
+
description: "List child pages under a Confluence parent page.",
|
|
24
|
+
inputSchema: z.object({
|
|
25
|
+
pageId: z.string().describe("Parent page ID"),
|
|
26
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Max results (default 25)"),
|
|
27
|
+
}),
|
|
28
|
+
}, async ({ pageId, limit }) => {
|
|
29
|
+
try {
|
|
30
|
+
const { data } = await getConfluenceClient().get(`/api/v2/pages/${pageId}/children`, {
|
|
31
|
+
params: { limit },
|
|
32
|
+
});
|
|
33
|
+
return toTextResponse(data);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
return handleToolError(error);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
server.registerTool("getConfluencePageFooterComments", {
|
|
40
|
+
description: "Retrieve footer-level comments on a Confluence page.",
|
|
41
|
+
inputSchema: z.object({
|
|
42
|
+
pageId: z.string().describe("Page ID"),
|
|
43
|
+
}),
|
|
44
|
+
}, async ({ pageId }) => {
|
|
45
|
+
try {
|
|
46
|
+
const { data } = await getConfluenceClient().get(`/api/v2/pages/${pageId}/footer-comments`);
|
|
47
|
+
return toTextResponse(data);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return handleToolError(error);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
server.registerTool("getConfluencePageInlineComments", {
|
|
54
|
+
description: "Get inline comments tied to specific text in a Confluence page.",
|
|
55
|
+
inputSchema: z.object({
|
|
56
|
+
pageId: z.string().describe("Page ID"),
|
|
57
|
+
}),
|
|
58
|
+
}, async ({ pageId }) => {
|
|
59
|
+
try {
|
|
60
|
+
const { data } = await getConfluenceClient().get(`/api/v2/pages/${pageId}/inline-comments`);
|
|
61
|
+
return toTextResponse(data);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return handleToolError(error);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
server.registerTool("getConfluenceCommentChildren", {
|
|
68
|
+
description: "View reply threads to a Confluence comment.",
|
|
69
|
+
inputSchema: z.object({
|
|
70
|
+
commentId: z.string().describe("Comment ID"),
|
|
71
|
+
}),
|
|
72
|
+
}, async ({ commentId }) => {
|
|
73
|
+
try {
|
|
74
|
+
const { data } = await getConfluenceClient().get(`/api/v2/comments/${commentId}/children`);
|
|
75
|
+
return toTextResponse(data);
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
return handleToolError(error);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
server.registerTool("getConfluenceSpaces", {
|
|
82
|
+
description: "List all Confluence spaces the current user has access to.",
|
|
83
|
+
inputSchema: z.object({
|
|
84
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Max results (default 25)"),
|
|
85
|
+
}),
|
|
86
|
+
}, async ({ limit }) => {
|
|
87
|
+
try {
|
|
88
|
+
const { data } = await getConfluenceClient().get("/api/v2/spaces", {
|
|
89
|
+
params: { limit },
|
|
90
|
+
});
|
|
91
|
+
return toTextResponse(data.results);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return handleToolError(error);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
server.registerTool("getPagesInConfluenceSpace", {
|
|
98
|
+
description: "Enumerate pages within a Confluence space.",
|
|
99
|
+
inputSchema: z.object({
|
|
100
|
+
spaceId: z.string().describe("Space ID"),
|
|
101
|
+
limit: z.number().int().min(1).max(100).default(25).describe("Max results (default 25)"),
|
|
102
|
+
}),
|
|
103
|
+
}, async ({ spaceId, limit }) => {
|
|
104
|
+
try {
|
|
105
|
+
const { data } = await getConfluenceClient().get(`/api/v2/spaces/${spaceId}/pages`, { params: { limit } });
|
|
106
|
+
return toTextResponse(data.results);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
return handleToolError(error);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
server.registerTool("createConfluencePage", {
|
|
113
|
+
description: "Create a new Confluence page in a space.",
|
|
114
|
+
inputSchema: z.object({
|
|
115
|
+
spaceId: z.string().describe("Space ID to create the page in"),
|
|
116
|
+
title: z.string().describe("Page title"),
|
|
117
|
+
content: z.string().describe("Page body in plain text or HTML"),
|
|
118
|
+
parentId: z.string().optional().describe("Parent page ID (optional)"),
|
|
119
|
+
}),
|
|
120
|
+
}, async ({ spaceId, title, content, parentId }) => {
|
|
121
|
+
try {
|
|
122
|
+
const body = {
|
|
123
|
+
spaceId,
|
|
124
|
+
title,
|
|
125
|
+
body: { representation: "storage", value: content },
|
|
126
|
+
};
|
|
127
|
+
if (parentId)
|
|
128
|
+
body.parentId = parentId;
|
|
129
|
+
const { data } = await getConfluenceClient().post("/api/v2/pages", body);
|
|
130
|
+
return toTextResponse({ id: data.id, title: data.title, status: data.status });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
return handleToolError(error);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
server.registerTool("updateConfluencePage", {
|
|
137
|
+
description: "Edit the content or title of an existing Confluence page. Requires the current version number.",
|
|
138
|
+
inputSchema: z.object({
|
|
139
|
+
pageId: z.string().describe("Page ID"),
|
|
140
|
+
title: z.string().describe("Page title (required even if unchanged)"),
|
|
141
|
+
content: z.string().describe("New page body in plain text or HTML"),
|
|
142
|
+
version: z.number().int().describe("Current version number of the page"),
|
|
143
|
+
}),
|
|
144
|
+
}, async ({ pageId, title, content, version }) => {
|
|
145
|
+
try {
|
|
146
|
+
const { data } = await getConfluenceClient().put(`/api/v2/pages/${pageId}`, {
|
|
147
|
+
id: pageId,
|
|
148
|
+
title,
|
|
149
|
+
version: { number: version + 1 },
|
|
150
|
+
body: { representation: "storage", value: content },
|
|
151
|
+
});
|
|
152
|
+
return toTextResponse({ id: data.id, title: data.title, version: data.version });
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return handleToolError(error);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
server.registerTool("createConfluenceFooterComment", {
|
|
159
|
+
description: "Add a footer comment to a Confluence page, or reply to an existing footer comment.",
|
|
160
|
+
inputSchema: z.object({
|
|
161
|
+
pageId: z.string().describe("Page ID"),
|
|
162
|
+
comment: z.string().describe("Comment text"),
|
|
163
|
+
parentCommentId: z.string().optional().describe("Parent comment ID to reply to"),
|
|
164
|
+
}),
|
|
165
|
+
}, async ({ pageId, comment, parentCommentId }) => {
|
|
166
|
+
try {
|
|
167
|
+
const body = {
|
|
168
|
+
pageId,
|
|
169
|
+
body: { representation: "storage", value: comment },
|
|
170
|
+
};
|
|
171
|
+
if (parentCommentId)
|
|
172
|
+
body.parentCommentId = parentCommentId;
|
|
173
|
+
const { data } = await getConfluenceClient().post("/api/v2/footer-comments", body);
|
|
174
|
+
return toTextResponse(data);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
return handleToolError(error);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
server.registerTool("createConfluenceInlineComment", {
|
|
181
|
+
description: "Create a text-anchored inline comment on a Confluence page.",
|
|
182
|
+
inputSchema: z.object({
|
|
183
|
+
pageId: z.string().describe("Page ID"),
|
|
184
|
+
comment: z.string().describe("Comment text"),
|
|
185
|
+
inlineCommentProperties: z.object({
|
|
186
|
+
textSelection: z.string().describe("The text to anchor the comment to"),
|
|
187
|
+
textSelectionMatchCount: z.number().int().default(1).describe("Which occurrence to anchor to (default 1)"),
|
|
188
|
+
textSelectionMatchIndex: z.number().int().default(0).describe("Zero-based index of the match (default 0)"),
|
|
189
|
+
}).describe("Properties to anchor the comment to specific text"),
|
|
190
|
+
}),
|
|
191
|
+
}, async ({ pageId, comment, inlineCommentProperties }) => {
|
|
192
|
+
try {
|
|
193
|
+
const { data } = await getConfluenceClient().post("/api/v2/inline-comments", {
|
|
194
|
+
pageId,
|
|
195
|
+
body: { representation: "storage", value: comment },
|
|
196
|
+
inlineCommentProperties,
|
|
197
|
+
});
|
|
198
|
+
return toTextResponse(data);
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
return handleToolError(error);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
server.registerTool("searchConfluenceUsingCql", {
|
|
205
|
+
description: "Search Confluence content using CQL (Confluence Query Language). Example: 'space = \"DEV\" AND title ~ \"API\"'.",
|
|
206
|
+
inputSchema: z.object({
|
|
207
|
+
cql: z.string().describe("CQL query string"),
|
|
208
|
+
limit: z.number().int().min(1).max(100).default(20).describe("Max results (default 20)"),
|
|
209
|
+
}),
|
|
210
|
+
}, async ({ cql, limit }) => {
|
|
211
|
+
try {
|
|
212
|
+
const { data } = await getConfluenceClient().get("/rest/api/search", {
|
|
213
|
+
params: { cql, limit },
|
|
214
|
+
});
|
|
215
|
+
return toTextResponse(data);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
return handleToolError(error);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=confluence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../../../src/services/atlassian/tools/confluence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.d.ts","sourceRoot":"","sources":["../../../../src/services/atlassian/tools/jira.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmSzD"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getJiraClient } from "../client.js";
|
|
3
|
+
import { handleToolError } from "../../../shared/errors.js";
|
|
4
|
+
import { toTextResponse } from "../../../shared/response.js";
|
|
5
|
+
export function registerJiraTools(server) {
|
|
6
|
+
server.registerTool("getJiraIssue", {
|
|
7
|
+
description: "Retrieve a Jira issue by its ID or key (e.g. PROJECT-123). Returns summary, status, assignee, priority, and description.",
|
|
8
|
+
inputSchema: z.object({
|
|
9
|
+
issueIdOrKey: z.string().describe("Issue ID or key, e.g. 'PROJECT-123'"),
|
|
10
|
+
}),
|
|
11
|
+
}, async ({ issueIdOrKey }) => {
|
|
12
|
+
try {
|
|
13
|
+
const { data } = await getJiraClient().get(`/issue/${issueIdOrKey}`);
|
|
14
|
+
return toTextResponse(data);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return handleToolError(error);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
server.registerTool("searchJiraIssuesUsingJql", {
|
|
21
|
+
description: "Search Jira issues using JQL (Jira Query Language). Example: 'project = PROJ AND status = \"In Progress\"'.",
|
|
22
|
+
inputSchema: z.object({
|
|
23
|
+
jql: z.string().describe("JQL query string"),
|
|
24
|
+
maxResults: z.number().int().positive().max(100).default(20).describe("Max results (default 20)"),
|
|
25
|
+
}),
|
|
26
|
+
}, async ({ jql, maxResults }) => {
|
|
27
|
+
try {
|
|
28
|
+
const { data } = await getJiraClient().post("/issue/search", {
|
|
29
|
+
jql, maxResults,
|
|
30
|
+
fields: ["summary", "status", "assignee", "priority", "issuetype", "created", "updated"],
|
|
31
|
+
});
|
|
32
|
+
return toTextResponse({ total: data.total, issues: data.issues });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return handleToolError(error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
server.registerTool("createJiraIssue", {
|
|
39
|
+
description: "Create a new Jira issue in a project. Returns the created issue key and URL.",
|
|
40
|
+
inputSchema: z.object({
|
|
41
|
+
projectKey: z.string().describe("Project key, e.g. 'PROJ'"),
|
|
42
|
+
summary: z.string().describe("Issue title/summary"),
|
|
43
|
+
issueType: z.string().default("Task").describe("Issue type: 'Task', 'Bug', 'Story', etc."),
|
|
44
|
+
description: z.string().optional().describe("Issue description (plain text)"),
|
|
45
|
+
assigneeAccountId: z.string().optional().describe("Assignee account ID"),
|
|
46
|
+
}),
|
|
47
|
+
}, async ({ projectKey, summary, issueType, description, assigneeAccountId }) => {
|
|
48
|
+
try {
|
|
49
|
+
const fields = {
|
|
50
|
+
project: { key: projectKey },
|
|
51
|
+
summary,
|
|
52
|
+
issuetype: { name: issueType },
|
|
53
|
+
};
|
|
54
|
+
if (description) {
|
|
55
|
+
fields.description = {
|
|
56
|
+
type: "doc", version: 1,
|
|
57
|
+
content: [{ type: "paragraph", content: [{ type: "text", text: description }] }],
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (assigneeAccountId)
|
|
61
|
+
fields.assignee = { accountId: assigneeAccountId };
|
|
62
|
+
const { data } = await getJiraClient().post("/issue", { fields });
|
|
63
|
+
return toTextResponse({ id: data.id, key: data.key, url: data.self });
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return handleToolError(error);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
server.registerTool("editJiraIssue", {
|
|
70
|
+
description: "Modify field values of an existing Jira issue: summary, description, assignee, or priority.",
|
|
71
|
+
inputSchema: z.object({
|
|
72
|
+
issueIdOrKey: z.string().describe("Issue ID or key"),
|
|
73
|
+
summary: z.string().optional().describe("New summary"),
|
|
74
|
+
description: z.string().optional().describe("New description (plain text)"),
|
|
75
|
+
assigneeAccountId: z.string().optional().describe("New assignee account ID"),
|
|
76
|
+
priority: z.string().optional().describe("Priority name, e.g. 'High', 'Medium', 'Low'"),
|
|
77
|
+
}),
|
|
78
|
+
}, async ({ issueIdOrKey, summary, description, assigneeAccountId, priority }) => {
|
|
79
|
+
try {
|
|
80
|
+
const fields = {};
|
|
81
|
+
if (summary)
|
|
82
|
+
fields.summary = summary;
|
|
83
|
+
if (description) {
|
|
84
|
+
fields.description = {
|
|
85
|
+
type: "doc", version: 1,
|
|
86
|
+
content: [{ type: "paragraph", content: [{ type: "text", text: description }] }],
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (assigneeAccountId)
|
|
90
|
+
fields.assignee = { accountId: assigneeAccountId };
|
|
91
|
+
if (priority)
|
|
92
|
+
fields.priority = { name: priority };
|
|
93
|
+
await getJiraClient().put(`/issue/${issueIdOrKey}`, { fields });
|
|
94
|
+
return toTextResponse({ success: true, issueIdOrKey });
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return handleToolError(error);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
server.registerTool("transitionJiraIssue", {
|
|
101
|
+
description: "Execute a workflow state change on a Jira issue, e.g. move to 'In Progress' or 'Done'.",
|
|
102
|
+
inputSchema: z.object({
|
|
103
|
+
issueIdOrKey: z.string().describe("Issue ID or key"),
|
|
104
|
+
status: z.string().describe("Target status name, e.g. 'In Progress', 'Done'"),
|
|
105
|
+
}),
|
|
106
|
+
}, async ({ issueIdOrKey, status }) => {
|
|
107
|
+
try {
|
|
108
|
+
const { data } = await getJiraClient().get(`/issue/${issueIdOrKey}/transitions`);
|
|
109
|
+
const transition = data.transitions.find(t => t.name.toLowerCase() === status.toLowerCase());
|
|
110
|
+
if (!transition) {
|
|
111
|
+
const available = data.transitions.map(t => t.name).join(", ");
|
|
112
|
+
return toTextResponse(`Status "${status}" not found. Available: ${available}`);
|
|
113
|
+
}
|
|
114
|
+
await getJiraClient().post(`/issue/${issueIdOrKey}/transitions`, { transition: { id: transition.id } });
|
|
115
|
+
return toTextResponse({ success: true, issueIdOrKey, status });
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return handleToolError(error);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
server.registerTool("getTransitionsForJiraIssue", {
|
|
122
|
+
description: "List all available workflow transitions for a Jira issue.",
|
|
123
|
+
inputSchema: z.object({
|
|
124
|
+
issueIdOrKey: z.string().describe("Issue ID or key"),
|
|
125
|
+
}),
|
|
126
|
+
}, async ({ issueIdOrKey }) => {
|
|
127
|
+
try {
|
|
128
|
+
const { data } = await getJiraClient().get(`/issue/${issueIdOrKey}/transitions`);
|
|
129
|
+
return toTextResponse(data.transitions);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
return handleToolError(error);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
server.registerTool("addCommentToJiraIssue", {
|
|
136
|
+
description: "Post a comment on a Jira issue.",
|
|
137
|
+
inputSchema: z.object({
|
|
138
|
+
issueIdOrKey: z.string().describe("Issue ID or key"),
|
|
139
|
+
comment: z.string().describe("Comment text"),
|
|
140
|
+
}),
|
|
141
|
+
}, async ({ issueIdOrKey, comment }) => {
|
|
142
|
+
try {
|
|
143
|
+
const { data } = await getJiraClient().post(`/issue/${issueIdOrKey}/comment`, {
|
|
144
|
+
body: {
|
|
145
|
+
type: "doc", version: 1,
|
|
146
|
+
content: [{ type: "paragraph", content: [{ type: "text", text: comment }] }],
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
return toTextResponse(data);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
return handleToolError(error);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
server.registerTool("addWorklogToJiraIssue", {
|
|
156
|
+
description: "Record a time tracking entry on a Jira issue.",
|
|
157
|
+
inputSchema: z.object({
|
|
158
|
+
issueIdOrKey: z.string().describe("Issue ID or key"),
|
|
159
|
+
timeSpent: z.string().describe("Time spent, e.g. '1h 30m', '2h', '30m'"),
|
|
160
|
+
comment: z.string().optional().describe("Optional work description"),
|
|
161
|
+
}),
|
|
162
|
+
}, async ({ issueIdOrKey, timeSpent, comment }) => {
|
|
163
|
+
try {
|
|
164
|
+
const body = { timeSpent };
|
|
165
|
+
if (comment) {
|
|
166
|
+
body.comment = {
|
|
167
|
+
type: "doc", version: 1,
|
|
168
|
+
content: [{ type: "paragraph", content: [{ type: "text", text: comment }] }],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const { data } = await getJiraClient().post(`/issue/${issueIdOrKey}/worklog`, body);
|
|
172
|
+
return toTextResponse(data);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
return handleToolError(error);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
server.registerTool("getVisibleJiraProjects", {
|
|
179
|
+
description: "List all Jira projects the current user has access to.",
|
|
180
|
+
inputSchema: z.object({}),
|
|
181
|
+
}, async () => {
|
|
182
|
+
try {
|
|
183
|
+
const { data } = await getJiraClient().get("/project");
|
|
184
|
+
return toTextResponse(data.map(p => ({
|
|
185
|
+
key: p.key, name: p.name, type: p.projectTypeKey,
|
|
186
|
+
})));
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
return handleToolError(error);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
server.registerTool("getJiraProjectIssueTypesMetadata", {
|
|
193
|
+
description: "List all issue types available in a Jira project.",
|
|
194
|
+
inputSchema: z.object({
|
|
195
|
+
projectKey: z.string().describe("Project key"),
|
|
196
|
+
}),
|
|
197
|
+
}, async ({ projectKey }) => {
|
|
198
|
+
try {
|
|
199
|
+
const { data } = await getJiraClient().get(`/issue/createmeta/${projectKey}/issuetypes`);
|
|
200
|
+
return toTextResponse(data);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return handleToolError(error);
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
server.registerTool("getJiraIssueTypeMetaWithFields", {
|
|
207
|
+
description: "Get field metadata for creating issues of a specific type in a project.",
|
|
208
|
+
inputSchema: z.object({
|
|
209
|
+
projectKey: z.string().describe("Project key"),
|
|
210
|
+
issueTypeId: z.string().describe("Issue type ID"),
|
|
211
|
+
}),
|
|
212
|
+
}, async ({ projectKey, issueTypeId }) => {
|
|
213
|
+
try {
|
|
214
|
+
const { data } = await getJiraClient().get(`/issue/createmeta/${projectKey}/issuetypes/${issueTypeId}`);
|
|
215
|
+
return toTextResponse(data);
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
return handleToolError(error);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
server.registerTool("getIssueLinkTypes", {
|
|
222
|
+
description: "Retrieve all available issue link types (e.g. 'blocks', 'duplicates', 'is cloned by').",
|
|
223
|
+
inputSchema: z.object({}),
|
|
224
|
+
}, async () => {
|
|
225
|
+
try {
|
|
226
|
+
const { data } = await getJiraClient().get("/issueLinkType");
|
|
227
|
+
return toTextResponse(data.issueLinkTypes);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
return handleToolError(error);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
server.registerTool("getJiraIssueRemoteIssueLinks", {
|
|
234
|
+
description: "List external links (e.g. Confluence pages) attached to a Jira issue.",
|
|
235
|
+
inputSchema: z.object({
|
|
236
|
+
issueIdOrKey: z.string().describe("Issue ID or key"),
|
|
237
|
+
}),
|
|
238
|
+
}, async ({ issueIdOrKey }) => {
|
|
239
|
+
try {
|
|
240
|
+
const { data } = await getJiraClient().get(`/issue/${issueIdOrKey}/remotelink`);
|
|
241
|
+
return toTextResponse(data);
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
return handleToolError(error);
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
server.registerTool("lookupJiraAccountId", {
|
|
248
|
+
description: "Find Jira user account IDs by display name or email address.",
|
|
249
|
+
inputSchema: z.object({
|
|
250
|
+
query: z.string().describe("Name or email to search for"),
|
|
251
|
+
}),
|
|
252
|
+
}, async ({ query }) => {
|
|
253
|
+
try {
|
|
254
|
+
const { data } = await getJiraClient().get("/user/search", { params: { query } });
|
|
255
|
+
return toTextResponse(data.map(u => ({
|
|
256
|
+
accountId: u.accountId,
|
|
257
|
+
displayName: u.displayName,
|
|
258
|
+
emailAddress: u.emailAddress,
|
|
259
|
+
})));
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
return handleToolError(error);
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=jira.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira.js","sourceRoot":"","sources":["../../../../src/services/atlassian/tools/jira.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export interface JiraIssue {
|
|
2
|
+
id: string;
|
|
3
|
+
key: string;
|
|
4
|
+
fields: {
|
|
5
|
+
summary: string;
|
|
6
|
+
description?: unknown;
|
|
7
|
+
status: {
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
priority?: {
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
assignee?: {
|
|
14
|
+
accountId: string;
|
|
15
|
+
displayName: string;
|
|
16
|
+
emailAddress: string;
|
|
17
|
+
} | null;
|
|
18
|
+
reporter?: {
|
|
19
|
+
displayName: string;
|
|
20
|
+
emailAddress: string;
|
|
21
|
+
};
|
|
22
|
+
issuetype: {
|
|
23
|
+
name: string;
|
|
24
|
+
};
|
|
25
|
+
created: string;
|
|
26
|
+
updated: string;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface JiraTransition {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
to: {
|
|
33
|
+
name: string;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export interface JiraUser {
|
|
37
|
+
accountId: string;
|
|
38
|
+
displayName: string;
|
|
39
|
+
emailAddress: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ConfluencePage {
|
|
42
|
+
id: string;
|
|
43
|
+
title: string;
|
|
44
|
+
status: string;
|
|
45
|
+
spaceId: string;
|
|
46
|
+
version: {
|
|
47
|
+
number: number;
|
|
48
|
+
};
|
|
49
|
+
body?: {
|
|
50
|
+
storage?: {
|
|
51
|
+
value: string;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface ConfluenceSpace {
|
|
56
|
+
id: string;
|
|
57
|
+
key: string;
|
|
58
|
+
name: string;
|
|
59
|
+
type: string;
|
|
60
|
+
status: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ConfluenceComment {
|
|
63
|
+
id: string;
|
|
64
|
+
status: string;
|
|
65
|
+
body?: {
|
|
66
|
+
storage?: {
|
|
67
|
+
value: string;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
version?: {
|
|
71
|
+
number: number;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/atlassian/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACzB,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QACnF,QAAQ,CAAC,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QACzD,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IACvC,OAAO,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/atlassian/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/services/figma/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK7C,wBAAgB,cAAc,IAAI,aAAa,CA4B9C"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { env } from "../../shared/env.js";
|
|
3
|
+
let figmaClient = null;
|
|
4
|
+
export function getFigmaClient() {
|
|
5
|
+
if (figmaClient)
|
|
6
|
+
return figmaClient;
|
|
7
|
+
if (!env.figma) {
|
|
8
|
+
throw new Error("Figma service is not configured. Run `localmcp config figma`.");
|
|
9
|
+
}
|
|
10
|
+
figmaClient = axios.create({
|
|
11
|
+
baseURL: env.figma.HOST,
|
|
12
|
+
headers: {
|
|
13
|
+
"X-Figma-Token": env.figma.TOKEN,
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
|
+
figmaClient.interceptors.response.use((response) => response, async (error) => {
|
|
17
|
+
if (error.response?.status === 429 && !error.config._retried) {
|
|
18
|
+
error.config._retried = true;
|
|
19
|
+
const retryAfter = parseInt(error.response.headers["retry-after"] ?? "5", 10);
|
|
20
|
+
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
|
|
21
|
+
return figmaClient(error.config);
|
|
22
|
+
}
|
|
23
|
+
return Promise.reject(error);
|
|
24
|
+
});
|
|
25
|
+
return figmaClient;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=client.js.map
|