@sixtynine-digital/blitz-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/dist/index.d.mts +1 -0
- package/dist/index.mjs +355 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +41 -0
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
|
|
6
|
+
//#region src/config.ts
|
|
7
|
+
function loadConfig() {
|
|
8
|
+
const apiUrl = process.env.BLITZ_API_URL;
|
|
9
|
+
const apiKey = process.env.BLITZ_API_KEY;
|
|
10
|
+
const workspaceSlug = process.env.BLITZ_WORKSPACE_SLUG;
|
|
11
|
+
const missing = [];
|
|
12
|
+
if (!apiUrl) missing.push("BLITZ_API_URL");
|
|
13
|
+
if (!apiKey) missing.push("BLITZ_API_KEY");
|
|
14
|
+
if (!workspaceSlug) missing.push("BLITZ_WORKSPACE_SLUG");
|
|
15
|
+
if (missing.length > 0) throw new Error(`Missing required environment variables: ${missing.join(", ")}\n\nPlease set the following:
|
|
16
|
+
BLITZ_API_URL - Blitz instance URL (e.g. http://localhost:8000)
|
|
17
|
+
BLITZ_API_KEY - API key (format: plane_api_<hex>)
|
|
18
|
+
BLITZ_WORKSPACE_SLUG - Workspace slug`);
|
|
19
|
+
return {
|
|
20
|
+
apiUrl: apiUrl.replace(/\/+$/, ""),
|
|
21
|
+
apiKey,
|
|
22
|
+
workspaceSlug
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/client.ts
|
|
28
|
+
var BlitzClient = class {
|
|
29
|
+
baseUrl;
|
|
30
|
+
apiKey;
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this.baseUrl = `${config.apiUrl}/api/v1`;
|
|
33
|
+
this.apiKey = config.apiKey;
|
|
34
|
+
}
|
|
35
|
+
async request(method, path, body) {
|
|
36
|
+
const url = `${this.baseUrl}/${path.replace(/^\/+/, "")}`;
|
|
37
|
+
const headers = {
|
|
38
|
+
"X-Api-Key": this.apiKey,
|
|
39
|
+
"Content-Type": "application/json"
|
|
40
|
+
};
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
method,
|
|
43
|
+
headers,
|
|
44
|
+
body: body ? JSON.stringify(body) : void 0
|
|
45
|
+
});
|
|
46
|
+
if (response.status === 429) {
|
|
47
|
+
const retryAfter = response.headers.get("Retry-After");
|
|
48
|
+
throw new Error(`Rate limit exceeded. ${retryAfter ? `Retry after ${retryAfter} seconds.` : "Please wait before retrying."}`);
|
|
49
|
+
}
|
|
50
|
+
if (response.status === 204) return;
|
|
51
|
+
const data = await response.json();
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
const message = typeof data === "object" && data !== null ? JSON.stringify(data, null, 2) : String(data);
|
|
54
|
+
throw new Error(`API error (${response.status}): ${message}`);
|
|
55
|
+
}
|
|
56
|
+
return data;
|
|
57
|
+
}
|
|
58
|
+
async get(path) {
|
|
59
|
+
return this.request("GET", path);
|
|
60
|
+
}
|
|
61
|
+
async post(path, body) {
|
|
62
|
+
return this.request("POST", path, body);
|
|
63
|
+
}
|
|
64
|
+
async patch(path, body) {
|
|
65
|
+
return this.request("PATCH", path, body);
|
|
66
|
+
}
|
|
67
|
+
async delete(path) {
|
|
68
|
+
return this.request("DELETE", path);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/tools/projects.ts
|
|
74
|
+
function registerProjectTools(server, client, workspaceSlug) {
|
|
75
|
+
server.tool("list-projects", "List all projects in the Blitz workspace. Returns project names, identifiers, and IDs.", {}, async () => {
|
|
76
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/`);
|
|
77
|
+
return { content: [{
|
|
78
|
+
type: "text",
|
|
79
|
+
text: JSON.stringify(data, null, 2)
|
|
80
|
+
}] };
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//#endregion
|
|
85
|
+
//#region src/tools/states.ts
|
|
86
|
+
function registerStateTools(server, client, workspaceSlug) {
|
|
87
|
+
server.tool("list-states", "List all workflow states for a project. Use this to find valid state IDs when creating or updating work items.", { project_id: z.string().uuid().describe("Project UUID") }, async ({ project_id }) => {
|
|
88
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/states/`);
|
|
89
|
+
return { content: [{
|
|
90
|
+
type: "text",
|
|
91
|
+
text: JSON.stringify(data, null, 2)
|
|
92
|
+
}] };
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/tools/labels.ts
|
|
98
|
+
function registerLabelTools(server, client, workspaceSlug) {
|
|
99
|
+
server.tool("list-labels", "List all labels for a project. Use this to find valid label IDs when creating or updating work items.", { project_id: z.string().uuid().describe("Project UUID") }, async ({ project_id }) => {
|
|
100
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/labels/`);
|
|
101
|
+
return { content: [{
|
|
102
|
+
type: "text",
|
|
103
|
+
text: JSON.stringify(data, null, 2)
|
|
104
|
+
}] };
|
|
105
|
+
});
|
|
106
|
+
server.tool("create-label", "Create a new label in a project.", {
|
|
107
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
108
|
+
name: z.string().min(1).max(255).describe("Label name"),
|
|
109
|
+
color: z.string().optional().describe("Hex color (e.g. #ff0000)"),
|
|
110
|
+
description: z.string().optional().describe("Label description")
|
|
111
|
+
}, async ({ project_id,...body }) => {
|
|
112
|
+
const data = await client.post(`workspaces/${workspaceSlug}/projects/${project_id}/labels/`, body);
|
|
113
|
+
return { content: [{
|
|
114
|
+
type: "text",
|
|
115
|
+
text: JSON.stringify(data, null, 2)
|
|
116
|
+
}] };
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//#endregion
|
|
121
|
+
//#region src/tools/search.ts
|
|
122
|
+
function registerSearchTools(server, client, workspaceSlug) {
|
|
123
|
+
server.tool("search-work-items", "Search for work items (tasks/issues) across the workspace by text query. Searches in title and identifier.", {
|
|
124
|
+
query: z.string().min(1).describe("Search text"),
|
|
125
|
+
project_id: z.string().uuid().optional().describe("Optional project UUID to scope the search")
|
|
126
|
+
}, async ({ query, project_id }) => {
|
|
127
|
+
let path = `workspaces/${workspaceSlug}/work-items/search/?search=${encodeURIComponent(query)}`;
|
|
128
|
+
if (project_id) path += `&project_id=${project_id}`;
|
|
129
|
+
const data = await client.get(path);
|
|
130
|
+
return { content: [{
|
|
131
|
+
type: "text",
|
|
132
|
+
text: JSON.stringify(data, null, 2)
|
|
133
|
+
}] };
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
//#endregion
|
|
138
|
+
//#region src/tools/work-items.ts
|
|
139
|
+
function registerWorkItemTools(server, client, workspaceSlug) {
|
|
140
|
+
server.tool("list-work-items", "List work items (tasks/issues) in a project with pagination and sorting.", {
|
|
141
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
142
|
+
cursor: z.string().optional().describe("Pagination cursor from previous response"),
|
|
143
|
+
per_page: z.number().min(1).max(100).optional().describe("Items per page (default 20)"),
|
|
144
|
+
order_by: z.string().optional().describe("Sort field (e.g. -created_at, priority, state)")
|
|
145
|
+
}, async ({ project_id, cursor, per_page, order_by }) => {
|
|
146
|
+
const params = new URLSearchParams();
|
|
147
|
+
if (cursor) params.set("cursor", cursor);
|
|
148
|
+
if (per_page) params.set("per_page", String(per_page));
|
|
149
|
+
if (order_by) params.set("order_by", order_by);
|
|
150
|
+
const query = params.toString();
|
|
151
|
+
const path = `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${query ? `?${query}` : ""}`;
|
|
152
|
+
const data = await client.get(path);
|
|
153
|
+
return { content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: JSON.stringify(data, null, 2)
|
|
156
|
+
}] };
|
|
157
|
+
});
|
|
158
|
+
server.tool("get-work-item", "Get a work item by its human-readable identifier (e.g. BLZ-42). Returns full details.", { identifier: z.string().min(1).describe("Work item identifier (e.g. PROJ-123)") }, async ({ identifier }) => {
|
|
159
|
+
const data = await client.get(`workspaces/${workspaceSlug}/work-items/${identifier}/`);
|
|
160
|
+
return { content: [{
|
|
161
|
+
type: "text",
|
|
162
|
+
text: JSON.stringify(data, null, 2)
|
|
163
|
+
}] };
|
|
164
|
+
});
|
|
165
|
+
server.tool("get-work-item-by-id", "Get a work item by its project ID and work item UUID.", {
|
|
166
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
167
|
+
work_item_id: z.string().uuid().describe("Work item UUID")
|
|
168
|
+
}, async ({ project_id, work_item_id }) => {
|
|
169
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/`);
|
|
170
|
+
return { content: [{
|
|
171
|
+
type: "text",
|
|
172
|
+
text: JSON.stringify(data, null, 2)
|
|
173
|
+
}] };
|
|
174
|
+
});
|
|
175
|
+
server.tool("create-work-item", "Create a new work item (task/issue) in a project. Use list-projects to find project IDs, list-states for state IDs, and list-labels for label IDs.", {
|
|
176
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
177
|
+
name: z.string().min(1).max(255).describe("Work item title"),
|
|
178
|
+
description_html: z.string().optional().describe("HTML description content"),
|
|
179
|
+
priority: z.enum([
|
|
180
|
+
"urgent",
|
|
181
|
+
"high",
|
|
182
|
+
"medium",
|
|
183
|
+
"low",
|
|
184
|
+
"none"
|
|
185
|
+
]).optional().describe("Priority level"),
|
|
186
|
+
state_id: z.string().uuid().optional().describe("State UUID (use list-states to find valid IDs)"),
|
|
187
|
+
assignees: z.array(z.string().uuid()).optional().describe("Array of user UUIDs to assign"),
|
|
188
|
+
labels: z.array(z.string().uuid()).optional().describe("Array of label UUIDs"),
|
|
189
|
+
start_date: z.string().optional().describe("Start date (YYYY-MM-DD)"),
|
|
190
|
+
target_date: z.string().optional().describe("Target date (YYYY-MM-DD)"),
|
|
191
|
+
parent_id: z.string().uuid().optional().describe("Parent work item UUID for sub-issues")
|
|
192
|
+
}, async ({ project_id,...body }) => {
|
|
193
|
+
const data = await client.post(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/`, body);
|
|
194
|
+
return { content: [{
|
|
195
|
+
type: "text",
|
|
196
|
+
text: JSON.stringify(data, null, 2)
|
|
197
|
+
}] };
|
|
198
|
+
});
|
|
199
|
+
server.tool("update-work-item", "Update an existing work item. Only provide fields you want to change.", {
|
|
200
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
201
|
+
work_item_id: z.string().uuid().describe("Work item UUID"),
|
|
202
|
+
name: z.string().min(1).max(255).optional().describe("New title"),
|
|
203
|
+
description_html: z.string().optional().describe("New HTML description"),
|
|
204
|
+
priority: z.enum([
|
|
205
|
+
"urgent",
|
|
206
|
+
"high",
|
|
207
|
+
"medium",
|
|
208
|
+
"low",
|
|
209
|
+
"none"
|
|
210
|
+
]).optional().describe("New priority level"),
|
|
211
|
+
state_id: z.string().uuid().optional().describe("New state UUID"),
|
|
212
|
+
assignees: z.array(z.string().uuid()).optional().describe("New assignee UUIDs (replaces existing)"),
|
|
213
|
+
labels: z.array(z.string().uuid()).optional().describe("New label UUIDs (replaces existing)"),
|
|
214
|
+
start_date: z.string().nullable().optional().describe("Start date (YYYY-MM-DD) or null to clear"),
|
|
215
|
+
target_date: z.string().nullable().optional().describe("Target date (YYYY-MM-DD) or null to clear")
|
|
216
|
+
}, async ({ project_id, work_item_id,...body }) => {
|
|
217
|
+
const data = await client.patch(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/`, body);
|
|
218
|
+
return { content: [{
|
|
219
|
+
type: "text",
|
|
220
|
+
text: JSON.stringify(data, null, 2)
|
|
221
|
+
}] };
|
|
222
|
+
});
|
|
223
|
+
server.tool("delete-work-item", "Delete a work item. This action cannot be undone.", {
|
|
224
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
225
|
+
work_item_id: z.string().uuid().describe("Work item UUID")
|
|
226
|
+
}, async ({ project_id, work_item_id }) => {
|
|
227
|
+
await client.delete(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/`);
|
|
228
|
+
return { content: [{
|
|
229
|
+
type: "text",
|
|
230
|
+
text: "Work item deleted successfully."
|
|
231
|
+
}] };
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
236
|
+
//#region src/tools/comments.ts
|
|
237
|
+
function registerCommentTools(server, client, workspaceSlug) {
|
|
238
|
+
server.tool("list-comments", "List all comments on a work item.", {
|
|
239
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
240
|
+
work_item_id: z.string().uuid().describe("Work item UUID")
|
|
241
|
+
}, async ({ project_id, work_item_id }) => {
|
|
242
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/comments/`);
|
|
243
|
+
return { content: [{
|
|
244
|
+
type: "text",
|
|
245
|
+
text: JSON.stringify(data, null, 2)
|
|
246
|
+
}] };
|
|
247
|
+
});
|
|
248
|
+
server.tool("add-comment", "Add a comment to a work item.", {
|
|
249
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
250
|
+
work_item_id: z.string().uuid().describe("Work item UUID"),
|
|
251
|
+
comment_html: z.string().min(1).describe("Comment content in HTML format")
|
|
252
|
+
}, async ({ project_id, work_item_id, comment_html }) => {
|
|
253
|
+
const data = await client.post(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/comments/`, { comment_html });
|
|
254
|
+
return { content: [{
|
|
255
|
+
type: "text",
|
|
256
|
+
text: JSON.stringify(data, null, 2)
|
|
257
|
+
}] };
|
|
258
|
+
});
|
|
259
|
+
server.tool("list-activities", "View the activity history (changelog) of a work item. Shows what changed, when, and by whom.", {
|
|
260
|
+
project_id: z.string().uuid().describe("Project UUID"),
|
|
261
|
+
work_item_id: z.string().uuid().describe("Work item UUID")
|
|
262
|
+
}, async ({ project_id, work_item_id }) => {
|
|
263
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/activities/`);
|
|
264
|
+
return { content: [{
|
|
265
|
+
type: "text",
|
|
266
|
+
text: JSON.stringify(data, null, 2)
|
|
267
|
+
}] };
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
//#endregion
|
|
272
|
+
//#region src/tools/index.ts
|
|
273
|
+
function registerAllTools(server, client, workspaceSlug) {
|
|
274
|
+
registerProjectTools(server, client, workspaceSlug);
|
|
275
|
+
registerStateTools(server, client, workspaceSlug);
|
|
276
|
+
registerLabelTools(server, client, workspaceSlug);
|
|
277
|
+
registerSearchTools(server, client, workspaceSlug);
|
|
278
|
+
registerWorkItemTools(server, client, workspaceSlug);
|
|
279
|
+
registerCommentTools(server, client, workspaceSlug);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
//#endregion
|
|
283
|
+
//#region src/resources/projects.ts
|
|
284
|
+
function registerProjectResources(server, client, workspaceSlug) {
|
|
285
|
+
server.registerResource("projects", "blitz://projects", {
|
|
286
|
+
description: "List of all projects in the Blitz workspace with their identifiers, names, and IDs.",
|
|
287
|
+
mimeType: "application/json"
|
|
288
|
+
}, async (uri) => {
|
|
289
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/`);
|
|
290
|
+
return { contents: [{
|
|
291
|
+
uri: uri.href,
|
|
292
|
+
mimeType: "application/json",
|
|
293
|
+
text: JSON.stringify(data, null, 2)
|
|
294
|
+
}] };
|
|
295
|
+
});
|
|
296
|
+
server.registerResource("project-states", new ResourceTemplate("blitz://projects/{project_id}/states", { list: void 0 }), {
|
|
297
|
+
description: "Workflow states for a specific project.",
|
|
298
|
+
mimeType: "application/json"
|
|
299
|
+
}, async (uri, { project_id }) => {
|
|
300
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/states/`);
|
|
301
|
+
return { contents: [{
|
|
302
|
+
uri: uri.href,
|
|
303
|
+
mimeType: "application/json",
|
|
304
|
+
text: JSON.stringify(data, null, 2)
|
|
305
|
+
}] };
|
|
306
|
+
});
|
|
307
|
+
server.registerResource("project-labels", new ResourceTemplate("blitz://projects/{project_id}/labels", { list: void 0 }), {
|
|
308
|
+
description: "Labels for a specific project.",
|
|
309
|
+
mimeType: "application/json"
|
|
310
|
+
}, async (uri, { project_id }) => {
|
|
311
|
+
const data = await client.get(`workspaces/${workspaceSlug}/projects/${project_id}/labels/`);
|
|
312
|
+
return { contents: [{
|
|
313
|
+
uri: uri.href,
|
|
314
|
+
mimeType: "application/json",
|
|
315
|
+
text: JSON.stringify(data, null, 2)
|
|
316
|
+
}] };
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
//#endregion
|
|
321
|
+
//#region src/resources/index.ts
|
|
322
|
+
function registerAllResources(server, client, workspaceSlug) {
|
|
323
|
+
registerProjectResources(server, client, workspaceSlug);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
//#endregion
|
|
327
|
+
//#region src/index.ts
|
|
328
|
+
async function main() {
|
|
329
|
+
const config = loadConfig();
|
|
330
|
+
const client = new BlitzClient(config);
|
|
331
|
+
const server = new McpServer({
|
|
332
|
+
name: "blitz-mcp",
|
|
333
|
+
version: "0.1.0"
|
|
334
|
+
});
|
|
335
|
+
registerAllTools(server, client, config.workspaceSlug);
|
|
336
|
+
registerAllResources(server, client, config.workspaceSlug);
|
|
337
|
+
const transport = new StdioServerTransport();
|
|
338
|
+
await server.connect(transport);
|
|
339
|
+
process.on("SIGINT", async () => {
|
|
340
|
+
await server.close();
|
|
341
|
+
process.exit(0);
|
|
342
|
+
});
|
|
343
|
+
process.on("SIGTERM", async () => {
|
|
344
|
+
await server.close();
|
|
345
|
+
process.exit(0);
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
main().catch((error) => {
|
|
349
|
+
console.error("Failed to start Blitz MCP server:", error);
|
|
350
|
+
process.exit(1);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
//#endregion
|
|
354
|
+
export { };
|
|
355
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["missing: string[]","headers: Record<string, string>"],"sources":["../src/config.ts","../src/client.ts","../src/tools/projects.ts","../src/tools/states.ts","../src/tools/labels.ts","../src/tools/search.ts","../src/tools/work-items.ts","../src/tools/comments.ts","../src/tools/index.ts","../src/resources/projects.ts","../src/resources/index.ts","../src/index.ts"],"sourcesContent":["export interface BlitzConfig {\n apiUrl: string;\n apiKey: string;\n workspaceSlug: string;\n}\n\nexport function loadConfig(): BlitzConfig {\n const apiUrl = process.env.BLITZ_API_URL;\n const apiKey = process.env.BLITZ_API_KEY;\n const workspaceSlug = process.env.BLITZ_WORKSPACE_SLUG;\n\n const missing: string[] = [];\n if (!apiUrl) missing.push(\"BLITZ_API_URL\");\n if (!apiKey) missing.push(\"BLITZ_API_KEY\");\n if (!workspaceSlug) missing.push(\"BLITZ_WORKSPACE_SLUG\");\n\n if (missing.length > 0) {\n throw new Error(\n `Missing required environment variables: ${missing.join(\", \")}\\n\\n` +\n \"Please set the following:\\n\" +\n \" BLITZ_API_URL - Blitz instance URL (e.g. http://localhost:8000)\\n\" +\n \" BLITZ_API_KEY - API key (format: plane_api_<hex>)\\n\" +\n \" BLITZ_WORKSPACE_SLUG - Workspace slug\"\n );\n }\n\n return {\n apiUrl: apiUrl.replace(/\\/+$/, \"\"),\n apiKey,\n workspaceSlug,\n };\n}\n","import type { BlitzConfig } from \"./config.js\";\n\nexport class BlitzClient {\n private baseUrl: string;\n private apiKey: string;\n\n constructor(config: BlitzConfig) {\n this.baseUrl = `${config.apiUrl}/api/v1`;\n this.apiKey = config.apiKey;\n }\n\n private async request<T = unknown>(\n method: string,\n path: string,\n body?: unknown\n ): Promise<T> {\n const url = `${this.baseUrl}/${path.replace(/^\\/+/, \"\")}`;\n\n const headers: Record<string, string> = {\n \"X-Api-Key\": this.apiKey,\n \"Content-Type\": \"application/json\",\n };\n\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (response.status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\");\n throw new Error(\n `Rate limit exceeded. ${retryAfter ? `Retry after ${retryAfter} seconds.` : \"Please wait before retrying.\"}`\n );\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const data = await response.json();\n\n if (!response.ok) {\n const message =\n typeof data === \"object\" && data !== null\n ? JSON.stringify(data, null, 2)\n : String(data);\n throw new Error(`API error (${response.status}): ${message}`);\n }\n\n return data as T;\n }\n\n async get<T = unknown>(path: string): Promise<T> {\n return this.request<T>(\"GET\", path);\n }\n\n async post<T = unknown>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"POST\", path, body);\n }\n\n async patch<T = unknown>(path: string, body: unknown): Promise<T> {\n return this.request<T>(\"PATCH\", path, body);\n }\n\n async delete<T = unknown>(path: string): Promise<T> {\n return this.request<T>(\"DELETE\", path);\n }\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerProjectTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.tool(\n \"list-projects\",\n \"List all projects in the Blitz workspace. Returns project names, identifiers, and IDs.\",\n {},\n async () => {\n const data = await client.get(`workspaces/${workspaceSlug}/projects/`);\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerStateTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.tool(\n \"list-states\",\n \"List all workflow states for a project. Use this to find valid state IDs when creating or updating work items.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n },\n async ({ project_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/states/`\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerLabelTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.tool(\n \"list-labels\",\n \"List all labels for a project. Use this to find valid label IDs when creating or updating work items.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n },\n async ({ project_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/labels/`\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"create-label\",\n \"Create a new label in a project.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n name: z.string().min(1).max(255).describe(\"Label name\"),\n color: z.string().optional().describe(\"Hex color (e.g. #ff0000)\"),\n description: z.string().optional().describe(\"Label description\"),\n },\n async ({ project_id, ...body }) => {\n const data = await client.post(\n `workspaces/${workspaceSlug}/projects/${project_id}/labels/`,\n body\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerSearchTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.tool(\n \"search-work-items\",\n \"Search for work items (tasks/issues) across the workspace by text query. Searches in title and identifier.\",\n {\n query: z.string().min(1).describe(\"Search text\"),\n project_id: z.string().uuid().optional().describe(\"Optional project UUID to scope the search\"),\n },\n async ({ query, project_id }) => {\n let path = `workspaces/${workspaceSlug}/work-items/search/?search=${encodeURIComponent(query)}`;\n if (project_id) {\n path += `&project_id=${project_id}`;\n }\n const data = await client.get(path);\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerWorkItemTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.tool(\n \"list-work-items\",\n \"List work items (tasks/issues) in a project with pagination and sorting.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n cursor: z.string().optional().describe(\"Pagination cursor from previous response\"),\n per_page: z.number().min(1).max(100).optional().describe(\"Items per page (default 20)\"),\n order_by: z.string().optional().describe(\"Sort field (e.g. -created_at, priority, state)\"),\n },\n async ({ project_id, cursor, per_page, order_by }) => {\n const params = new URLSearchParams();\n if (cursor) params.set(\"cursor\", cursor);\n if (per_page) params.set(\"per_page\", String(per_page));\n if (order_by) params.set(\"order_by\", order_by);\n\n const query = params.toString();\n const path = `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${query ? `?${query}` : \"\"}`;\n const data = await client.get(path);\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"get-work-item\",\n \"Get a work item by its human-readable identifier (e.g. BLZ-42). Returns full details.\",\n {\n identifier: z.string().min(1).describe(\"Work item identifier (e.g. PROJ-123)\"),\n },\n async ({ identifier }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/work-items/${identifier}/`\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"get-work-item-by-id\",\n \"Get a work item by its project ID and work item UUID.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n work_item_id: z.string().uuid().describe(\"Work item UUID\"),\n },\n async ({ project_id, work_item_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/`\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"create-work-item\",\n \"Create a new work item (task/issue) in a project. Use list-projects to find project IDs, list-states for state IDs, and list-labels for label IDs.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n name: z.string().min(1).max(255).describe(\"Work item title\"),\n description_html: z.string().optional().describe(\"HTML description content\"),\n priority: z\n .enum([\"urgent\", \"high\", \"medium\", \"low\", \"none\"])\n .optional()\n .describe(\"Priority level\"),\n state_id: z.string().uuid().optional().describe(\"State UUID (use list-states to find valid IDs)\"),\n assignees: z\n .array(z.string().uuid())\n .optional()\n .describe(\"Array of user UUIDs to assign\"),\n labels: z\n .array(z.string().uuid())\n .optional()\n .describe(\"Array of label UUIDs\"),\n start_date: z.string().optional().describe(\"Start date (YYYY-MM-DD)\"),\n target_date: z.string().optional().describe(\"Target date (YYYY-MM-DD)\"),\n parent_id: z.string().uuid().optional().describe(\"Parent work item UUID for sub-issues\"),\n },\n async ({ project_id, ...body }) => {\n const data = await client.post(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/`,\n body\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"update-work-item\",\n \"Update an existing work item. Only provide fields you want to change.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n work_item_id: z.string().uuid().describe(\"Work item UUID\"),\n name: z.string().min(1).max(255).optional().describe(\"New title\"),\n description_html: z.string().optional().describe(\"New HTML description\"),\n priority: z\n .enum([\"urgent\", \"high\", \"medium\", \"low\", \"none\"])\n .optional()\n .describe(\"New priority level\"),\n state_id: z.string().uuid().optional().describe(\"New state UUID\"),\n assignees: z\n .array(z.string().uuid())\n .optional()\n .describe(\"New assignee UUIDs (replaces existing)\"),\n labels: z\n .array(z.string().uuid())\n .optional()\n .describe(\"New label UUIDs (replaces existing)\"),\n start_date: z.string().nullable().optional().describe(\"Start date (YYYY-MM-DD) or null to clear\"),\n target_date: z.string().nullable().optional().describe(\"Target date (YYYY-MM-DD) or null to clear\"),\n },\n async ({ project_id, work_item_id, ...body }) => {\n const data = await client.patch(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/`,\n body\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"delete-work-item\",\n \"Delete a work item. This action cannot be undone.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n work_item_id: z.string().uuid().describe(\"Work item UUID\"),\n },\n async ({ project_id, work_item_id }) => {\n await client.delete(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/`\n );\n return {\n content: [{ type: \"text\", text: \"Work item deleted successfully.\" }],\n };\n }\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerCommentTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.tool(\n \"list-comments\",\n \"List all comments on a work item.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n work_item_id: z.string().uuid().describe(\"Work item UUID\"),\n },\n async ({ project_id, work_item_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/comments/`\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"add-comment\",\n \"Add a comment to a work item.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n work_item_id: z.string().uuid().describe(\"Work item UUID\"),\n comment_html: z.string().min(1).describe(\"Comment content in HTML format\"),\n },\n async ({ project_id, work_item_id, comment_html }) => {\n const data = await client.post(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/comments/`,\n { comment_html }\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n\n server.tool(\n \"list-activities\",\n \"View the activity history (changelog) of a work item. Shows what changed, when, and by whom.\",\n {\n project_id: z.string().uuid().describe(\"Project UUID\"),\n work_item_id: z.string().uuid().describe(\"Work item UUID\"),\n },\n async ({ project_id, work_item_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/work-items/${work_item_id}/activities/`\n );\n return {\n content: [{ type: \"text\", text: JSON.stringify(data, null, 2) }],\n };\n }\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\nimport { registerProjectTools } from \"./projects.js\";\nimport { registerStateTools } from \"./states.js\";\nimport { registerLabelTools } from \"./labels.js\";\nimport { registerSearchTools } from \"./search.js\";\nimport { registerWorkItemTools } from \"./work-items.js\";\nimport { registerCommentTools } from \"./comments.js\";\n\nexport function registerAllTools(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n registerProjectTools(server, client, workspaceSlug);\n registerStateTools(server, client, workspaceSlug);\n registerLabelTools(server, client, workspaceSlug);\n registerSearchTools(server, client, workspaceSlug);\n registerWorkItemTools(server, client, workspaceSlug);\n registerCommentTools(server, client, workspaceSlug);\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\n\nexport function registerProjectResources(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n server.registerResource(\n \"projects\",\n \"blitz://projects\",\n {\n description: \"List of all projects in the Blitz workspace with their identifiers, names, and IDs.\",\n mimeType: \"application/json\",\n },\n async (uri) => {\n const data = await client.get(`workspaces/${workspaceSlug}/projects/`);\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n );\n\n server.registerResource(\n \"project-states\",\n new ResourceTemplate(\"blitz://projects/{project_id}/states\", { list: undefined }),\n {\n description: \"Workflow states for a specific project.\",\n mimeType: \"application/json\",\n },\n async (uri, { project_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/states/`\n );\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n );\n\n server.registerResource(\n \"project-labels\",\n new ResourceTemplate(\"blitz://projects/{project_id}/labels\", { list: undefined }),\n {\n description: \"Labels for a specific project.\",\n mimeType: \"application/json\",\n },\n async (uri, { project_id }) => {\n const data = await client.get(\n `workspaces/${workspaceSlug}/projects/${project_id}/labels/`\n );\n return {\n contents: [\n {\n uri: uri.href,\n mimeType: \"application/json\",\n text: JSON.stringify(data, null, 2),\n },\n ],\n };\n }\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { BlitzClient } from \"../client.js\";\nimport { registerProjectResources } from \"./projects.js\";\n\nexport function registerAllResources(server: McpServer, client: BlitzClient, workspaceSlug: string) {\n registerProjectResources(server, client, workspaceSlug);\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { loadConfig } from \"./config.js\";\nimport { BlitzClient } from \"./client.js\";\nimport { registerAllTools } from \"./tools/index.js\";\nimport { registerAllResources } from \"./resources/index.js\";\n\nasync function main() {\n const config = loadConfig();\n const client = new BlitzClient(config);\n\n const server = new McpServer({\n name: \"blitz-mcp\",\n version: \"0.1.0\",\n });\n\n registerAllTools(server, client, config.workspaceSlug);\n registerAllResources(server, client, config.workspaceSlug);\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n process.on(\"SIGINT\", async () => {\n await server.close();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n await server.close();\n process.exit(0);\n });\n}\n\nmain().catch((error) => {\n console.error(\"Failed to start Blitz MCP server:\", error);\n process.exit(1);\n});\n"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sixtynine-digital/blitz-mcp",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "AGPL-3.0",
|
|
5
|
+
"description": "MCP server for Blitz project management",
|
|
6
|
+
"private": false,
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"blitz-mcp": "./dist/index.mjs"
|
|
10
|
+
},
|
|
11
|
+
"exports": {
|
|
12
|
+
".": "./dist/index.mjs",
|
|
13
|
+
"./package.json": "./package.json"
|
|
14
|
+
},
|
|
15
|
+
"main": "./dist/index.mjs",
|
|
16
|
+
"module": "./dist/index.mjs",
|
|
17
|
+
"types": "./dist/index.d.mts",
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsdown",
|
|
23
|
+
"dev": "tsdown --watch",
|
|
24
|
+
"check:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --max-warnings=0",
|
|
25
|
+
"check:types": "tsc --noEmit",
|
|
26
|
+
"check:format": "prettier . --cache --check",
|
|
27
|
+
"fix:lint": "eslint . --cache --cache-location node_modules/.cache/eslint/ --fix --max-warnings=0",
|
|
28
|
+
"fix:format": "prettier . --cache --write",
|
|
29
|
+
"clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
33
|
+
"zod": "^3.24.4"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@plane/typescript-config": "workspace:*",
|
|
37
|
+
"@types/node": "catalog:",
|
|
38
|
+
"tsdown": "catalog:",
|
|
39
|
+
"typescript": "catalog:"
|
|
40
|
+
}
|
|
41
|
+
}
|