@mtaap/mcp 0.2.12 → 0.2.13
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 +27 -0
- package/dist/cli.js +46 -26
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +392 -1
- package/dist/index.js +52 -25
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +1 -0
- package/dist/server.js +2656 -0
- package/dist/server.js.map +1 -0
- package/package.json +5 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,400 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
3
|
+
import { TaskState, ErrorType } from '@mtaap/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* MCP API Client
|
|
7
|
+
*
|
|
8
|
+
* HTTP client for communicating with the Collab webapp REST API.
|
|
9
|
+
* Replaces direct database access for a lighter, more secure MCP package.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* API Client Configuration
|
|
14
|
+
*/
|
|
15
|
+
interface ApiClientConfig {
|
|
16
|
+
baseUrl: string;
|
|
17
|
+
apiKey: string;
|
|
18
|
+
timeout?: number;
|
|
19
|
+
debug?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Authentication context returned from the API
|
|
23
|
+
*/
|
|
24
|
+
interface AuthContext {
|
|
25
|
+
userId: string;
|
|
26
|
+
organizationId: string | undefined;
|
|
27
|
+
permissions: string[];
|
|
28
|
+
userName: string;
|
|
29
|
+
userEmail: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Project from API
|
|
33
|
+
*/
|
|
34
|
+
interface Project {
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
description: string | null;
|
|
38
|
+
type: string;
|
|
39
|
+
origin: string;
|
|
40
|
+
repositoryUrl: string;
|
|
41
|
+
baseBranch: string;
|
|
42
|
+
tags: string[];
|
|
43
|
+
createdAt: string;
|
|
44
|
+
updatedAt: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Task from API
|
|
48
|
+
*/
|
|
49
|
+
interface Task {
|
|
50
|
+
id: string;
|
|
51
|
+
projectId: string;
|
|
52
|
+
projectName: string;
|
|
53
|
+
epicId: string | null;
|
|
54
|
+
epicName: string | null;
|
|
55
|
+
title: string;
|
|
56
|
+
description: string | null;
|
|
57
|
+
state: TaskState;
|
|
58
|
+
priority: string;
|
|
59
|
+
assigneeId: string | null;
|
|
60
|
+
assigneeName: string | null;
|
|
61
|
+
assigneeEmail: string | null;
|
|
62
|
+
createdBy: string;
|
|
63
|
+
createdByName: string | null;
|
|
64
|
+
assignedAt: string | null;
|
|
65
|
+
startedAt: string | null;
|
|
66
|
+
completedAt: string | null;
|
|
67
|
+
branchName: string | null;
|
|
68
|
+
pullRequestUrl: string | null;
|
|
69
|
+
pullRequestNumber: number | null;
|
|
70
|
+
errorType: string | null;
|
|
71
|
+
errorMessage: string | null;
|
|
72
|
+
verificationStatus: string | null;
|
|
73
|
+
verificationFeedback: string | null;
|
|
74
|
+
verifiedAt: string | null;
|
|
75
|
+
acceptanceCriteria: Array<{
|
|
76
|
+
id: string;
|
|
77
|
+
description: string;
|
|
78
|
+
completed: boolean;
|
|
79
|
+
completedAt: string | null;
|
|
80
|
+
order: number;
|
|
81
|
+
}>;
|
|
82
|
+
progressUpdates?: Array<{
|
|
83
|
+
id: string;
|
|
84
|
+
message: string;
|
|
85
|
+
checkpoints: string[];
|
|
86
|
+
userId: string;
|
|
87
|
+
createdAt: string;
|
|
88
|
+
}>;
|
|
89
|
+
notes?: Array<{
|
|
90
|
+
id: string;
|
|
91
|
+
content: string;
|
|
92
|
+
userId: string;
|
|
93
|
+
userName: string | null;
|
|
94
|
+
createdAt: string;
|
|
95
|
+
}>;
|
|
96
|
+
createdAt: string;
|
|
97
|
+
updatedAt: string;
|
|
98
|
+
archivedAt: string | null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Project context from API
|
|
102
|
+
*/
|
|
103
|
+
interface ProjectContext {
|
|
104
|
+
readme: string;
|
|
105
|
+
stack: string[];
|
|
106
|
+
recentCompleted: Array<{
|
|
107
|
+
id: string;
|
|
108
|
+
title: string;
|
|
109
|
+
completedAt: string | null;
|
|
110
|
+
}>;
|
|
111
|
+
conventions: {
|
|
112
|
+
branchPrefix: string;
|
|
113
|
+
commitFormat: string;
|
|
114
|
+
testCommand: string;
|
|
115
|
+
baseBranch: string;
|
|
116
|
+
notes: string;
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* API Error
|
|
121
|
+
*/
|
|
122
|
+
declare class ApiError extends Error {
|
|
123
|
+
code: string;
|
|
124
|
+
status: number;
|
|
125
|
+
details?: Record<string, unknown> | undefined;
|
|
126
|
+
constructor(message: string, code: string, status: number, details?: Record<string, unknown> | undefined);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* MCP API Client
|
|
130
|
+
*/
|
|
131
|
+
declare class MCPApiClient {
|
|
132
|
+
private baseUrl;
|
|
133
|
+
private apiKey;
|
|
134
|
+
private timeout;
|
|
135
|
+
private debug;
|
|
136
|
+
private authContext;
|
|
137
|
+
constructor(config: ApiClientConfig);
|
|
138
|
+
/**
|
|
139
|
+
* Make an HTTP request to the API
|
|
140
|
+
*/
|
|
141
|
+
private request;
|
|
142
|
+
/**
|
|
143
|
+
* Authenticate and get user context
|
|
144
|
+
*/
|
|
145
|
+
authenticate(): Promise<AuthContext>;
|
|
146
|
+
/**
|
|
147
|
+
* Get cached auth context or authenticate
|
|
148
|
+
*/
|
|
149
|
+
getAuthContext(): Promise<AuthContext>;
|
|
150
|
+
/**
|
|
151
|
+
* List accessible projects
|
|
152
|
+
*/
|
|
153
|
+
listProjects(workspaceType?: string): Promise<Project[]>;
|
|
154
|
+
/**
|
|
155
|
+
* Get single project details
|
|
156
|
+
*/
|
|
157
|
+
getProject(projectId: string): Promise<Project>;
|
|
158
|
+
/**
|
|
159
|
+
* Get project context (README, stack, conventions)
|
|
160
|
+
*/
|
|
161
|
+
getProjectContext(projectId: string): Promise<ProjectContext>;
|
|
162
|
+
/**
|
|
163
|
+
* Create a personal project
|
|
164
|
+
*/
|
|
165
|
+
createPersonalProject(name: string, description: string | undefined, repositoryUrl: string): Promise<{
|
|
166
|
+
success: boolean;
|
|
167
|
+
projectId: string;
|
|
168
|
+
}>;
|
|
169
|
+
/**
|
|
170
|
+
* Create a task in a project
|
|
171
|
+
*/
|
|
172
|
+
createTask(input: {
|
|
173
|
+
projectId: string;
|
|
174
|
+
epicId?: string | null;
|
|
175
|
+
title: string;
|
|
176
|
+
description: string;
|
|
177
|
+
priority?: string;
|
|
178
|
+
acceptanceCriteria: Array<{
|
|
179
|
+
description: string;
|
|
180
|
+
}>;
|
|
181
|
+
}): Promise<{
|
|
182
|
+
success: boolean;
|
|
183
|
+
taskId: string;
|
|
184
|
+
task: Task;
|
|
185
|
+
}>;
|
|
186
|
+
/**
|
|
187
|
+
* List tasks with optional filters
|
|
188
|
+
*/
|
|
189
|
+
listTasks(filters?: {
|
|
190
|
+
projectId?: string;
|
|
191
|
+
state?: TaskState;
|
|
192
|
+
assigneeId?: string;
|
|
193
|
+
includeArchived?: boolean;
|
|
194
|
+
}): Promise<Task[]>;
|
|
195
|
+
/**
|
|
196
|
+
* Get full task details
|
|
197
|
+
*/
|
|
198
|
+
getTask(taskId: string): Promise<Task>;
|
|
199
|
+
/**
|
|
200
|
+
* Assign task to current user and create branch
|
|
201
|
+
*/
|
|
202
|
+
assignTask(taskId: string, projectId: string, expectedState?: TaskState): Promise<{
|
|
203
|
+
success: boolean;
|
|
204
|
+
taskId: string;
|
|
205
|
+
suggestedBranchName?: string;
|
|
206
|
+
baseBranch?: string;
|
|
207
|
+
repositoryUrl?: string;
|
|
208
|
+
currentState?: string;
|
|
209
|
+
message?: string;
|
|
210
|
+
note?: string;
|
|
211
|
+
}>;
|
|
212
|
+
/**
|
|
213
|
+
* Update task progress
|
|
214
|
+
*/
|
|
215
|
+
updateProgress(taskId: string, data: {
|
|
216
|
+
statusMessage?: string;
|
|
217
|
+
completedCheckpointIds?: string[];
|
|
218
|
+
currentCheckpointIndex?: number;
|
|
219
|
+
}): Promise<{
|
|
220
|
+
success: boolean;
|
|
221
|
+
taskId: string;
|
|
222
|
+
}>;
|
|
223
|
+
/**
|
|
224
|
+
* Complete task and prepare for PR creation.
|
|
225
|
+
* Returns PR suggestions for the agent to use when creating the PR locally.
|
|
226
|
+
*/
|
|
227
|
+
completeTask(taskId: string, projectId: string, pullRequestTitle?: string, pullRequestBody?: string): Promise<{
|
|
228
|
+
success: boolean;
|
|
229
|
+
taskId: string;
|
|
230
|
+
suggestedPRTitle?: string;
|
|
231
|
+
suggestedPRBody?: string;
|
|
232
|
+
branchName?: string;
|
|
233
|
+
baseBranch?: string;
|
|
234
|
+
note?: string;
|
|
235
|
+
}>;
|
|
236
|
+
/**
|
|
237
|
+
* Abandon task and optionally delete branch
|
|
238
|
+
*/
|
|
239
|
+
abandonTask(taskId: string, projectId: string, deleteBranch?: boolean): Promise<{
|
|
240
|
+
success: boolean;
|
|
241
|
+
taskId: string;
|
|
242
|
+
state: string;
|
|
243
|
+
branchDeleted: boolean;
|
|
244
|
+
}>;
|
|
245
|
+
/**
|
|
246
|
+
* Archive a task (soft delete)
|
|
247
|
+
*/
|
|
248
|
+
archiveTask(taskId: string, projectId: string): Promise<{
|
|
249
|
+
success: boolean;
|
|
250
|
+
taskId: string;
|
|
251
|
+
archivedAt: string;
|
|
252
|
+
}>;
|
|
253
|
+
/**
|
|
254
|
+
* Unarchive a task (restore)
|
|
255
|
+
*/
|
|
256
|
+
unarchiveTask(taskId: string, projectId: string): Promise<{
|
|
257
|
+
success: boolean;
|
|
258
|
+
taskId: string;
|
|
259
|
+
}>;
|
|
260
|
+
/**
|
|
261
|
+
* Report task error
|
|
262
|
+
*/
|
|
263
|
+
reportError(taskId: string, errorType: ErrorType, errorMessage: string, context?: string): Promise<{
|
|
264
|
+
success: boolean;
|
|
265
|
+
taskId: string;
|
|
266
|
+
}>;
|
|
267
|
+
/**
|
|
268
|
+
* Add note to task
|
|
269
|
+
*/
|
|
270
|
+
addNote(taskId: string, content: string): Promise<{
|
|
271
|
+
success: boolean;
|
|
272
|
+
noteId: string;
|
|
273
|
+
}>;
|
|
274
|
+
/**
|
|
275
|
+
* Request changes on a task in review
|
|
276
|
+
*/
|
|
277
|
+
requestChanges(taskId: string, projectId: string, reviewComments: string, requestedChanges?: string[]): Promise<{
|
|
278
|
+
success: boolean;
|
|
279
|
+
taskId: string;
|
|
280
|
+
noteId: string;
|
|
281
|
+
message: string;
|
|
282
|
+
}>;
|
|
283
|
+
/**
|
|
284
|
+
* Approve a task in review and mark as DONE
|
|
285
|
+
*/
|
|
286
|
+
approveTask(taskId: string, projectId: string, reviewComments?: string): Promise<{
|
|
287
|
+
success: boolean;
|
|
288
|
+
taskId: string;
|
|
289
|
+
message: string;
|
|
290
|
+
}>;
|
|
291
|
+
/**
|
|
292
|
+
* Report branch created by agent
|
|
293
|
+
*/
|
|
294
|
+
reportBranch(taskId: string, projectId: string, branchName: string): Promise<{
|
|
295
|
+
success: boolean;
|
|
296
|
+
taskId: string;
|
|
297
|
+
branchName: string;
|
|
298
|
+
}>;
|
|
299
|
+
/**
|
|
300
|
+
* Report PR created by agent
|
|
301
|
+
*/
|
|
302
|
+
reportPR(taskId: string, projectId: string, pullRequestUrl: string, pullRequestNumber: number): Promise<{
|
|
303
|
+
success: boolean;
|
|
304
|
+
taskId: string;
|
|
305
|
+
pullRequestUrl: string;
|
|
306
|
+
pullRequestNumber: number;
|
|
307
|
+
state: string;
|
|
308
|
+
}>;
|
|
309
|
+
/**
|
|
310
|
+
* Verify a DRAFT task to move it to TODO state
|
|
311
|
+
*/
|
|
312
|
+
verifyTask(taskId: string, projectId: string, approved: boolean, feedback?: string): Promise<{
|
|
313
|
+
success: boolean;
|
|
314
|
+
taskId: string;
|
|
315
|
+
previousState: string;
|
|
316
|
+
newState: string;
|
|
317
|
+
verificationStatus: string;
|
|
318
|
+
message: string;
|
|
319
|
+
feedback?: string;
|
|
320
|
+
}>;
|
|
321
|
+
/**
|
|
322
|
+
* Get state-appropriate prompt for a task
|
|
323
|
+
*/
|
|
324
|
+
getTaskPrompt(taskId: string, projectId: string): Promise<{
|
|
325
|
+
success: boolean;
|
|
326
|
+
taskId: string;
|
|
327
|
+
state: string;
|
|
328
|
+
promptType: string;
|
|
329
|
+
promptDescription: string;
|
|
330
|
+
prompt: string;
|
|
331
|
+
}>;
|
|
332
|
+
/**
|
|
333
|
+
* Update task details (DRAFT/TODO states only)
|
|
334
|
+
*/
|
|
335
|
+
updateTask(taskId: string, projectId: string, data: {
|
|
336
|
+
title?: string;
|
|
337
|
+
description?: string;
|
|
338
|
+
priority?: string;
|
|
339
|
+
acceptanceCriteria?: Array<{
|
|
340
|
+
id?: string;
|
|
341
|
+
description: string;
|
|
342
|
+
}>;
|
|
343
|
+
}): Promise<{
|
|
344
|
+
success: boolean;
|
|
345
|
+
taskId: string;
|
|
346
|
+
previousState: string;
|
|
347
|
+
newState: string;
|
|
348
|
+
revertedToDraft: boolean;
|
|
349
|
+
message: string;
|
|
350
|
+
task: {
|
|
351
|
+
id: string;
|
|
352
|
+
title: string;
|
|
353
|
+
description: string;
|
|
354
|
+
priority: string;
|
|
355
|
+
state: string;
|
|
356
|
+
verificationStatus: string;
|
|
357
|
+
acceptanceCriteria: Array<{
|
|
358
|
+
id: string;
|
|
359
|
+
description: string;
|
|
360
|
+
order: number;
|
|
361
|
+
}>;
|
|
362
|
+
};
|
|
363
|
+
}>;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
declare const VERSION: string;
|
|
367
|
+
|
|
1
368
|
/**
|
|
2
369
|
* Collab MCP Server
|
|
3
370
|
*
|
|
4
371
|
* Model Context Protocol server for AI agent integration.
|
|
5
372
|
* Uses REST API to communicate with the Collab webapp.
|
|
6
373
|
*/
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Initialize an MCP server with all tools registered.
|
|
377
|
+
* This is the core setup used by both stdio and HTTP transports.
|
|
378
|
+
*
|
|
379
|
+
* @param apiClient - The API client for communicating with the Collab webapp
|
|
380
|
+
* @param authContext - The authenticated user context
|
|
381
|
+
* @returns The configured McpServer instance (not yet connected to a transport)
|
|
382
|
+
*/
|
|
383
|
+
declare function initializeMCPServer(apiClient: MCPApiClient, authContext: AuthContext): McpServer;
|
|
384
|
+
/**
|
|
385
|
+
* Connect an MCP server to a transport.
|
|
386
|
+
*
|
|
387
|
+
* @param server - The MCP server instance
|
|
388
|
+
* @param transport - The transport to connect to
|
|
389
|
+
*/
|
|
390
|
+
declare function connectMCPServer(server: McpServer, transport: Transport): Promise<void>;
|
|
391
|
+
/**
|
|
392
|
+
* Create and start an MCP server with stdio transport.
|
|
393
|
+
* This is the main entry point for CLI usage (collab-mcp command).
|
|
394
|
+
*
|
|
395
|
+
* Creates the API client, authenticates, initializes the server with all tools,
|
|
396
|
+
* and connects to stdio transport for communication with Claude Code.
|
|
397
|
+
*/
|
|
7
398
|
declare function createMCPServer(): Promise<void>;
|
|
8
399
|
|
|
9
|
-
export { createMCPServer };
|
|
400
|
+
export { ApiError, type AuthContext, MCPApiClient, VERSION, connectMCPServer, createMCPServer, initializeMCPServer };
|
package/dist/index.js
CHANGED
|
@@ -30,7 +30,12 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
|
-
|
|
33
|
+
ApiError: () => ApiError,
|
|
34
|
+
MCPApiClient: () => MCPApiClient,
|
|
35
|
+
VERSION: () => VERSION,
|
|
36
|
+
connectMCPServer: () => connectMCPServer,
|
|
37
|
+
createMCPServer: () => createMCPServer,
|
|
38
|
+
initializeMCPServer: () => initializeMCPServer
|
|
34
39
|
});
|
|
35
40
|
module.exports = __toCommonJS(src_exports);
|
|
36
41
|
var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
@@ -39,7 +44,7 @@ var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
|
39
44
|
// package.json
|
|
40
45
|
var package_default = {
|
|
41
46
|
name: "@mtaap/mcp",
|
|
42
|
-
version: "0.2.
|
|
47
|
+
version: "0.2.12",
|
|
43
48
|
description: "Model Context Protocol (MCP) server for AI agents to interact with Collab - the multi-tenant collaborative agent development platform",
|
|
44
49
|
mcpName: "collab",
|
|
45
50
|
scripts: {
|
|
@@ -48,7 +53,8 @@ var package_default = {
|
|
|
48
53
|
main: "./dist/index.js",
|
|
49
54
|
types: "./dist/index.d.ts",
|
|
50
55
|
bin: {
|
|
51
|
-
"collab-mcp": "./dist/cli.js"
|
|
56
|
+
"collab-mcp": "./dist/cli.js",
|
|
57
|
+
"collab-mcp-server": "./dist/server.js"
|
|
52
58
|
},
|
|
53
59
|
publishConfig: {
|
|
54
60
|
access: "public"
|
|
@@ -79,11 +85,13 @@ var package_default = {
|
|
|
79
85
|
},
|
|
80
86
|
dependencies: {
|
|
81
87
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
88
|
+
express: "^5.0.1",
|
|
82
89
|
zod: "^4.3.5"
|
|
83
90
|
},
|
|
84
91
|
devDependencies: {
|
|
85
92
|
"@mtaap/config-typescript": "workspace:*",
|
|
86
93
|
"@mtaap/core": "workspace:*",
|
|
94
|
+
"@types/express": "^5.0.0",
|
|
87
95
|
"@types/node": "^22.0.0",
|
|
88
96
|
tsup: "^8.5.1",
|
|
89
97
|
typescript: "^5.4.0"
|
|
@@ -1375,14 +1383,16 @@ Task Creation & Verification:
|
|
|
1375
1383
|
|
|
1376
1384
|
Standard Task Workflow:
|
|
1377
1385
|
list_projects -> get_project_context -> list_tasks(state=TODO) -> get_task -> get_task_prompt (TODO)
|
|
1378
|
-
-> assign_task (returns suggested branch name)
|
|
1379
|
-
-> git
|
|
1380
|
-
->
|
|
1381
|
-
-> report_branch (tell server about the branch)
|
|
1386
|
+
-> assign_task (returns suggested branch name and worktree path)
|
|
1387
|
+
-> git worktree add <worktreePath> -b <branchName> <baseBranch>
|
|
1388
|
+
-> cd <worktreePath>
|
|
1382
1389
|
-> [update_progress...]
|
|
1390
|
+
-> git push -u origin <branchName>
|
|
1391
|
+
-> report_branch (tell server about the branch)
|
|
1383
1392
|
-> complete_task (returns PR suggestions)
|
|
1384
1393
|
-> gh pr create (local gh command)
|
|
1385
1394
|
-> report_pr (tell server about the PR)
|
|
1395
|
+
-> git worktree remove <worktreePath>
|
|
1386
1396
|
|
|
1387
1397
|
Resume Workflow:
|
|
1388
1398
|
check_active_task -> (if active) get_task -> get_task_prompt (IN_PROGRESS) -> update_progress -> complete_task
|
|
@@ -1398,10 +1408,14 @@ Error Recovery:
|
|
|
1398
1408
|
(abandon_task returns IN_PROGRESS tasks to TODO state)
|
|
1399
1409
|
|
|
1400
1410
|
GIT OPERATIONS NOTE:
|
|
1401
|
-
The agent handles all git operations locally
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1411
|
+
The agent handles all git operations locally using git worktrees for isolation.
|
|
1412
|
+
After assign_task returns a suggested branch name and worktree path:
|
|
1413
|
+
1. Create worktree: git worktree add <worktreePath> -b <branchName> <baseBranch>
|
|
1414
|
+
2. Work in worktree directory: cd <worktreePath>
|
|
1415
|
+
3. After completing work, push and call report_branch
|
|
1416
|
+
4. After complete_task, create PR with gh and call report_pr
|
|
1417
|
+
5. Clean up worktree: git worktree remove <worktreePath>
|
|
1418
|
+
Worktrees enable parallel task execution without git conflicts.
|
|
1405
1419
|
|
|
1406
1420
|
TASK STATE FLOW:
|
|
1407
1421
|
DRAFT -> TODO -> IN_PROGRESS -> REVIEW -> DONE
|
|
@@ -1421,7 +1435,7 @@ CONSTRAINTS:
|
|
|
1421
1435
|
- Always check_active_task before starting new work
|
|
1422
1436
|
- Call update_progress frequently to checkpoint
|
|
1423
1437
|
- Agent must have git/gh CLI configured for local git operations`;
|
|
1424
|
-
|
|
1438
|
+
function initializeMCPServer(apiClient, authContext) {
|
|
1425
1439
|
const server = new import_mcp.McpServer(
|
|
1426
1440
|
{
|
|
1427
1441
|
name: "collab",
|
|
@@ -1431,16 +1445,6 @@ async function createMCPServer() {
|
|
|
1431
1445
|
instructions: COLLAB_SERVER_INSTRUCTIONS
|
|
1432
1446
|
}
|
|
1433
1447
|
);
|
|
1434
|
-
const apiClient = createApiClientFromEnv();
|
|
1435
|
-
let authContext;
|
|
1436
|
-
try {
|
|
1437
|
-
authContext = await apiClient.authenticate();
|
|
1438
|
-
} catch (error) {
|
|
1439
|
-
if (error instanceof ApiError) {
|
|
1440
|
-
throw new Error(`Authentication failed: ${error.message}`);
|
|
1441
|
-
}
|
|
1442
|
-
throw error;
|
|
1443
|
-
}
|
|
1444
1448
|
const mockApiKey = {
|
|
1445
1449
|
permissions: authContext.permissions.includes("ADMIN") ? ApiKeyPermission.ADMIN : authContext.permissions.includes("WRITE") ? ApiKeyPermission.WRITE : ApiKeyPermission.READ
|
|
1446
1450
|
};
|
|
@@ -1537,7 +1541,7 @@ async function createMCPServer() {
|
|
|
1537
1541
|
server.registerTool(
|
|
1538
1542
|
"assign_task",
|
|
1539
1543
|
{
|
|
1540
|
-
description: "Atomically claim a task
|
|
1544
|
+
description: "Atomically claim a task. Race-safe - fails if already assigned. Task must be TODO. Returns suggested branch name and worktree path for isolated parallel development.",
|
|
1541
1545
|
inputSchema: {
|
|
1542
1546
|
projectId: import_zod3.z.string().describe("The project ID"),
|
|
1543
1547
|
taskId: import_zod3.z.string().describe("The task ID to assign"),
|
|
@@ -2236,9 +2240,26 @@ async function createMCPServer() {
|
|
|
2236
2240
|
};
|
|
2237
2241
|
}
|
|
2238
2242
|
);
|
|
2239
|
-
|
|
2243
|
+
return server;
|
|
2244
|
+
}
|
|
2245
|
+
async function connectMCPServer(server, transport) {
|
|
2240
2246
|
await server.connect(transport);
|
|
2241
2247
|
}
|
|
2248
|
+
async function createMCPServer() {
|
|
2249
|
+
const apiClient = createApiClientFromEnv();
|
|
2250
|
+
let authContext;
|
|
2251
|
+
try {
|
|
2252
|
+
authContext = await apiClient.authenticate();
|
|
2253
|
+
} catch (error) {
|
|
2254
|
+
if (error instanceof ApiError) {
|
|
2255
|
+
throw new Error(`Authentication failed: ${error.message}`);
|
|
2256
|
+
}
|
|
2257
|
+
throw error;
|
|
2258
|
+
}
|
|
2259
|
+
const server = initializeMCPServer(apiClient, authContext);
|
|
2260
|
+
const transport = new import_stdio.StdioServerTransport();
|
|
2261
|
+
await connectMCPServer(server, transport);
|
|
2262
|
+
}
|
|
2242
2263
|
function handleApiError(error) {
|
|
2243
2264
|
if (error instanceof ApiError) {
|
|
2244
2265
|
return {
|
|
@@ -2275,6 +2296,7 @@ var ActiveTaskSchema = import_zod3.z.object({
|
|
|
2275
2296
|
taskId: import_zod3.z.string().min(1),
|
|
2276
2297
|
projectId: import_zod3.z.string().min(1),
|
|
2277
2298
|
branchName: import_zod3.z.string().optional(),
|
|
2299
|
+
worktreePath: import_zod3.z.string().optional(),
|
|
2278
2300
|
startedAt: import_zod3.z.string().optional()
|
|
2279
2301
|
});
|
|
2280
2302
|
async function checkActiveTask() {
|
|
@@ -2346,6 +2368,11 @@ async function checkActiveTask() {
|
|
|
2346
2368
|
}
|
|
2347
2369
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2348
2370
|
0 && (module.exports = {
|
|
2349
|
-
|
|
2371
|
+
ApiError,
|
|
2372
|
+
MCPApiClient,
|
|
2373
|
+
VERSION,
|
|
2374
|
+
connectMCPServer,
|
|
2375
|
+
createMCPServer,
|
|
2376
|
+
initializeMCPServer
|
|
2350
2377
|
});
|
|
2351
2378
|
//# sourceMappingURL=index.js.map
|