@zuens2020/back-agent-mcp 1.0.2 → 2.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/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/task-manager/task-manager.d.ts +103 -0
- package/dist/task-manager/task-manager.d.ts.map +1 -0
- package/dist/task-manager/task-manager.js +219 -0
- package/dist/task-manager/task-manager.js.map +1 -0
- package/dist/task-manager/task-tools.d.ts +11 -0
- package/dist/task-manager/task-tools.d.ts.map +1 -0
- package/dist/task-manager/task-tools.js +363 -0
- package/dist/task-manager/task-tools.js.map +1 -0
- package/package.json +3 -1
package/dist/index.js
CHANGED
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
9
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
10
|
import { registerExecuteTaskTool } from './server/tools/execute-task.js';
|
|
11
|
+
import { registerTaskManagementTools } from './task-manager/task-tools.js';
|
|
11
12
|
import { logger, setLogLevel, LogLevel } from './utils/logger.js';
|
|
12
13
|
const SERVER_INFO = {
|
|
13
14
|
name: 'back-agent-mcp',
|
|
14
|
-
version: '
|
|
15
|
+
version: '2.0.0',
|
|
15
16
|
};
|
|
16
17
|
/**
|
|
17
18
|
* Start the MCP server
|
|
@@ -37,6 +38,8 @@ async function main() {
|
|
|
37
38
|
logger.debug('Registering tools...');
|
|
38
39
|
registerExecuteTaskTool(server);
|
|
39
40
|
logger.info('Registered tool: execute-task');
|
|
41
|
+
registerTaskManagementTools(server);
|
|
42
|
+
logger.info('Registered task management tools');
|
|
40
43
|
// Create stdio transport for communication
|
|
41
44
|
logger.debug('Creating StdioServerTransport...');
|
|
42
45
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Manager for Back-Agent MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Manages concurrent task execution with status tracking.
|
|
5
|
+
*/
|
|
6
|
+
import { ExecutionResult } from '../claude/executor.js';
|
|
7
|
+
export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
8
|
+
export interface Task {
|
|
9
|
+
id: string;
|
|
10
|
+
task: string;
|
|
11
|
+
workingDirectory?: string;
|
|
12
|
+
timeout: number;
|
|
13
|
+
additionalArgs?: string[];
|
|
14
|
+
status: TaskStatus;
|
|
15
|
+
createdAt: Date;
|
|
16
|
+
startedAt?: Date;
|
|
17
|
+
completedAt?: Date;
|
|
18
|
+
result?: ExecutionResult;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CreateTaskOptions {
|
|
22
|
+
task: string;
|
|
23
|
+
workingDirectory?: string;
|
|
24
|
+
timeout?: number;
|
|
25
|
+
additionalArgs?: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface TaskInfo {
|
|
28
|
+
id: string;
|
|
29
|
+
task: string;
|
|
30
|
+
workingDirectory?: string;
|
|
31
|
+
status: TaskStatus;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
startedAt?: string;
|
|
34
|
+
completedAt?: string;
|
|
35
|
+
error?: string;
|
|
36
|
+
success?: boolean;
|
|
37
|
+
exitCode?: number | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Manages concurrent task execution
|
|
41
|
+
*/
|
|
42
|
+
export declare class TaskManager {
|
|
43
|
+
private tasks;
|
|
44
|
+
private maxConcurrent;
|
|
45
|
+
constructor(maxConcurrent?: number);
|
|
46
|
+
/**
|
|
47
|
+
* Create a new task and start executing it
|
|
48
|
+
*/
|
|
49
|
+
createTask(options: CreateTaskOptions): Promise<string>;
|
|
50
|
+
/**
|
|
51
|
+
* Execute a task (runs asynchronously)
|
|
52
|
+
*/
|
|
53
|
+
private executeTask;
|
|
54
|
+
/**
|
|
55
|
+
* Get task status and info
|
|
56
|
+
*/
|
|
57
|
+
getTask(id: string): TaskInfo | null;
|
|
58
|
+
/**
|
|
59
|
+
* Get task result with full output
|
|
60
|
+
*/
|
|
61
|
+
getTaskResult(id: string): {
|
|
62
|
+
taskInfo: TaskInfo | null;
|
|
63
|
+
stdout?: string;
|
|
64
|
+
stderr?: string;
|
|
65
|
+
} | null;
|
|
66
|
+
/**
|
|
67
|
+
* List all tasks
|
|
68
|
+
*/
|
|
69
|
+
listTasks(): TaskInfo[];
|
|
70
|
+
/**
|
|
71
|
+
* Cancel a task
|
|
72
|
+
*/
|
|
73
|
+
cancelTask(id: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Delete a task from the task list
|
|
76
|
+
*/
|
|
77
|
+
deleteTask(id: string): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Clean up old completed tasks
|
|
80
|
+
*/
|
|
81
|
+
cleanup(olderThanMs?: number): number;
|
|
82
|
+
/**
|
|
83
|
+
* Get count of currently running tasks
|
|
84
|
+
*/
|
|
85
|
+
private getRunningCount;
|
|
86
|
+
/**
|
|
87
|
+
* Get task statistics
|
|
88
|
+
*/
|
|
89
|
+
getStats(): {
|
|
90
|
+
total: number;
|
|
91
|
+
pending: number;
|
|
92
|
+
running: number;
|
|
93
|
+
completed: number;
|
|
94
|
+
failed: number;
|
|
95
|
+
cancelled: number;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Sleep helper
|
|
99
|
+
*/
|
|
100
|
+
private sleep;
|
|
101
|
+
}
|
|
102
|
+
export declare const taskManager: TaskManager;
|
|
103
|
+
//# sourceMappingURL=task-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-manager.d.ts","sourceRoot":"","sources":["../../src/task-manager/task-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG3E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEtF,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,GAAE,MAAU;IAIrC;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB7D;;OAEG;YACW,WAAW;IAmDzB;;OAEG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAoBpC;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG;QACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,IAAI;IAaR;;OAEG;IACH,SAAS,IAAI,QAAQ,EAAE;IAevB;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAgB/B;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAK/B;;OAEG;IACH,OAAO,CAAC,WAAW,GAAE,MAAgB,GAAG,MAAM;IAsB9C;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,QAAQ,IAAI;QACV,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB;IAiBD;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd;AAGD,eAAO,MAAM,WAAW,aAAqB,CAAC"}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Manager for Back-Agent MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Manages concurrent task execution with status tracking.
|
|
5
|
+
*/
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
+
import { executeClaudeTask } from '../claude/executor.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
/**
|
|
10
|
+
* Manages concurrent task execution
|
|
11
|
+
*/
|
|
12
|
+
export class TaskManager {
|
|
13
|
+
tasks = new Map();
|
|
14
|
+
maxConcurrent;
|
|
15
|
+
constructor(maxConcurrent = 3) {
|
|
16
|
+
this.maxConcurrent = maxConcurrent;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Create a new task and start executing it
|
|
20
|
+
*/
|
|
21
|
+
async createTask(options) {
|
|
22
|
+
const id = uuidv4();
|
|
23
|
+
const task = {
|
|
24
|
+
id,
|
|
25
|
+
task: options.task,
|
|
26
|
+
workingDirectory: options.workingDirectory,
|
|
27
|
+
timeout: options.timeout ?? 300,
|
|
28
|
+
additionalArgs: options.additionalArgs,
|
|
29
|
+
status: 'pending',
|
|
30
|
+
createdAt: new Date(),
|
|
31
|
+
};
|
|
32
|
+
this.tasks.set(id, task);
|
|
33
|
+
logger.info(`Task ${id} created: "${options.task.substring(0, 50)}..."`);
|
|
34
|
+
// Start execution asynchronously
|
|
35
|
+
this.executeTask(id);
|
|
36
|
+
return id;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Execute a task (runs asynchronously)
|
|
40
|
+
*/
|
|
41
|
+
async executeTask(id) {
|
|
42
|
+
const task = this.tasks.get(id);
|
|
43
|
+
if (!task) {
|
|
44
|
+
logger.error(`Task ${id} not found`);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Wait for available slot if max concurrent limit reached
|
|
48
|
+
while (this.getRunningCount() >= this.maxConcurrent) {
|
|
49
|
+
await this.sleep(100);
|
|
50
|
+
// Check if task was cancelled while waiting
|
|
51
|
+
if (task.status === 'cancelled') {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (task.status === 'cancelled') {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
task.status = 'running';
|
|
59
|
+
task.startedAt = new Date();
|
|
60
|
+
logger.info(`Task ${id} started`);
|
|
61
|
+
try {
|
|
62
|
+
const result = await executeClaudeTask({
|
|
63
|
+
task: task.task,
|
|
64
|
+
workingDirectory: task.workingDirectory,
|
|
65
|
+
timeout: task.timeout * 1000,
|
|
66
|
+
additionalArgs: task.additionalArgs,
|
|
67
|
+
});
|
|
68
|
+
task.result = result;
|
|
69
|
+
task.completedAt = new Date();
|
|
70
|
+
if (result.success) {
|
|
71
|
+
task.status = 'completed';
|
|
72
|
+
logger.info(`Task ${id} completed successfully`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
task.status = 'failed';
|
|
76
|
+
task.error = result.error ?? 'Task execution failed';
|
|
77
|
+
logger.error(`Task ${id} failed: ${task.error}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
task.status = 'failed';
|
|
82
|
+
task.error = error instanceof Error ? error.message : String(error);
|
|
83
|
+
task.completedAt = new Date();
|
|
84
|
+
logger.error(`Task ${id} error: ${task.error}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get task status and info
|
|
89
|
+
*/
|
|
90
|
+
getTask(id) {
|
|
91
|
+
const task = this.tasks.get(id);
|
|
92
|
+
if (!task) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
id: task.id,
|
|
97
|
+
task: task.task,
|
|
98
|
+
workingDirectory: task.workingDirectory,
|
|
99
|
+
status: task.status,
|
|
100
|
+
createdAt: task.createdAt.toISOString(),
|
|
101
|
+
startedAt: task.startedAt?.toISOString(),
|
|
102
|
+
completedAt: task.completedAt?.toISOString(),
|
|
103
|
+
error: task.error,
|
|
104
|
+
success: task.result?.success,
|
|
105
|
+
exitCode: task.result?.exitCode,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get task result with full output
|
|
110
|
+
*/
|
|
111
|
+
getTaskResult(id) {
|
|
112
|
+
const task = this.tasks.get(id);
|
|
113
|
+
if (!task) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
taskInfo: this.getTask(id),
|
|
118
|
+
stdout: task.result?.stdout,
|
|
119
|
+
stderr: task.result?.stderr,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* List all tasks
|
|
124
|
+
*/
|
|
125
|
+
listTasks() {
|
|
126
|
+
return Array.from(this.tasks.values()).map((task) => ({
|
|
127
|
+
id: task.id,
|
|
128
|
+
task: task.task,
|
|
129
|
+
workingDirectory: task.workingDirectory,
|
|
130
|
+
status: task.status,
|
|
131
|
+
createdAt: task.createdAt.toISOString(),
|
|
132
|
+
startedAt: task.startedAt?.toISOString(),
|
|
133
|
+
completedAt: task.completedAt?.toISOString(),
|
|
134
|
+
error: task.error,
|
|
135
|
+
success: task.result?.success,
|
|
136
|
+
exitCode: task.result?.exitCode,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Cancel a task
|
|
141
|
+
*/
|
|
142
|
+
cancelTask(id) {
|
|
143
|
+
const task = this.tasks.get(id);
|
|
144
|
+
if (!task) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
if (task.status === 'pending' || task.status === 'running') {
|
|
148
|
+
task.status = 'cancelled';
|
|
149
|
+
task.completedAt = new Date();
|
|
150
|
+
logger.info(`Task ${id} cancelled`);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Delete a task from the task list
|
|
157
|
+
*/
|
|
158
|
+
deleteTask(id) {
|
|
159
|
+
logger.info(`Task ${id} deleted`);
|
|
160
|
+
return this.tasks.delete(id);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Clean up old completed tasks
|
|
164
|
+
*/
|
|
165
|
+
cleanup(olderThanMs = 3600000) {
|
|
166
|
+
const now = Date.now();
|
|
167
|
+
let cleaned = 0;
|
|
168
|
+
for (const [id, task] of this.tasks.entries()) {
|
|
169
|
+
if ((task.status === 'completed' || task.status === 'failed' || task.status === 'cancelled') &&
|
|
170
|
+
task.completedAt &&
|
|
171
|
+
now - task.completedAt.getTime() > olderThanMs) {
|
|
172
|
+
this.tasks.delete(id);
|
|
173
|
+
cleaned++;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (cleaned > 0) {
|
|
177
|
+
logger.info(`Cleaned up ${cleaned} old tasks`);
|
|
178
|
+
}
|
|
179
|
+
return cleaned;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get count of currently running tasks
|
|
183
|
+
*/
|
|
184
|
+
getRunningCount() {
|
|
185
|
+
let count = 0;
|
|
186
|
+
for (const task of this.tasks.values()) {
|
|
187
|
+
if (task.status === 'running') {
|
|
188
|
+
count++;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return count;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get task statistics
|
|
195
|
+
*/
|
|
196
|
+
getStats() {
|
|
197
|
+
const stats = {
|
|
198
|
+
total: this.tasks.size,
|
|
199
|
+
pending: 0,
|
|
200
|
+
running: 0,
|
|
201
|
+
completed: 0,
|
|
202
|
+
failed: 0,
|
|
203
|
+
cancelled: 0,
|
|
204
|
+
};
|
|
205
|
+
for (const task of this.tasks.values()) {
|
|
206
|
+
stats[task.status]++;
|
|
207
|
+
}
|
|
208
|
+
return stats;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Sleep helper
|
|
212
|
+
*/
|
|
213
|
+
sleep(ms) {
|
|
214
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Global task manager instance
|
|
218
|
+
export const taskManager = new TaskManager(3);
|
|
219
|
+
//# sourceMappingURL=task-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-manager.js","sourceRoot":"","sources":["../../src/task-manager/task-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Management Tools for MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides tools for managing concurrent task execution.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register all task management tools with the MCP server
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerTaskManagementTools(server: McpServer): void;
|
|
11
|
+
//# sourceMappingURL=task-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tools.d.ts","sourceRoot":"","sources":["../../src/task-manager/task-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAUnE"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Management Tools for MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides tools for managing concurrent task execution.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { taskManager } from './task-manager.js';
|
|
8
|
+
import { logger } from '../utils/logger.js';
|
|
9
|
+
import { createErrorResponse } from '../utils/error-handler.js';
|
|
10
|
+
/**
|
|
11
|
+
* Register all task management tools with the MCP server
|
|
12
|
+
*/
|
|
13
|
+
export function registerTaskManagementTools(server) {
|
|
14
|
+
registerCreateTaskTool(server);
|
|
15
|
+
registerGetTaskStatusTool(server);
|
|
16
|
+
registerGetTaskResultTool(server);
|
|
17
|
+
registerCancelTaskTool(server);
|
|
18
|
+
registerListTasksTool(server);
|
|
19
|
+
registerDeleteTaskTool(server);
|
|
20
|
+
registerGetTaskStatsTool(server);
|
|
21
|
+
logger.info('Registered task management tools');
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a new task
|
|
25
|
+
*/
|
|
26
|
+
const createTaskSchema = z.object({
|
|
27
|
+
task: z.string().describe('The task description to execute'),
|
|
28
|
+
workingDirectory: z.string().optional().describe('The working directory for execution'),
|
|
29
|
+
timeout: z.number().min(1).max(3600).optional().describe('Timeout in seconds (max 3600)'),
|
|
30
|
+
additionalArgs: z.array(z.string()).optional().describe('Additional CLI arguments'),
|
|
31
|
+
});
|
|
32
|
+
function registerCreateTaskTool(server) {
|
|
33
|
+
server.registerTool('create-task', {
|
|
34
|
+
description: 'Create a new background task for execution. Returns the task ID. ' +
|
|
35
|
+
'Tasks run concurrently (max 3 parallel by default). Use get-task-status to check progress.',
|
|
36
|
+
inputSchema: createTaskSchema,
|
|
37
|
+
}, async (input) => {
|
|
38
|
+
const result = createTaskSchema.safeParse(input);
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
return createErrorResponse(new Error(`Invalid input: ${result.error.errors.map(e => e.message).join(', ')}`));
|
|
41
|
+
}
|
|
42
|
+
const { task, workingDirectory, timeout, additionalArgs } = result.data;
|
|
43
|
+
try {
|
|
44
|
+
const taskId = await taskManager.createTask({
|
|
45
|
+
task,
|
|
46
|
+
workingDirectory,
|
|
47
|
+
timeout,
|
|
48
|
+
additionalArgs,
|
|
49
|
+
});
|
|
50
|
+
logger.info(`Created task ${taskId}`);
|
|
51
|
+
return {
|
|
52
|
+
content: [{
|
|
53
|
+
type: 'text',
|
|
54
|
+
text: `## Task Created\n\n` +
|
|
55
|
+
`**Task ID:** ${taskId}\n` +
|
|
56
|
+
`**Task:** ${task.substring(0, 100)}${task.length > 100 ? '...' : ''}\n` +
|
|
57
|
+
`**Status:** pending\n\n` +
|
|
58
|
+
`Use \`get-task-status\` with ID \`${taskId}\` to check progress.\n` +
|
|
59
|
+
`Use \`get-task-result\` with ID \`${taskId}\` to get the result when complete.`,
|
|
60
|
+
}],
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
logger.error(`Error creating task: ${error}`);
|
|
65
|
+
return createErrorResponse(error);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get task status
|
|
71
|
+
*/
|
|
72
|
+
const getTaskStatusSchema = z.object({
|
|
73
|
+
taskId: z.string().describe('The task ID'),
|
|
74
|
+
});
|
|
75
|
+
function registerGetTaskStatusTool(server) {
|
|
76
|
+
server.registerTool('get-task-status', {
|
|
77
|
+
description: 'Get the current status of a task. Returns status, timestamps, and basic info.',
|
|
78
|
+
inputSchema: getTaskStatusSchema,
|
|
79
|
+
}, async (input) => {
|
|
80
|
+
const result = getTaskStatusSchema.safeParse(input);
|
|
81
|
+
if (!result.success) {
|
|
82
|
+
return createErrorResponse(new Error(`Invalid input: ${result.error.errors.map(e => e.message).join(', ')}`));
|
|
83
|
+
}
|
|
84
|
+
const { taskId } = result.data;
|
|
85
|
+
const taskInfo = taskManager.getTask(taskId);
|
|
86
|
+
if (!taskInfo) {
|
|
87
|
+
return {
|
|
88
|
+
content: [{
|
|
89
|
+
type: 'text',
|
|
90
|
+
text: `## Task Not Found\n\nTask with ID \`${taskId}\` does not exist.`,
|
|
91
|
+
}],
|
|
92
|
+
isError: true,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
content: [{
|
|
97
|
+
type: 'text',
|
|
98
|
+
text: formatTaskInfo(taskInfo),
|
|
99
|
+
}],
|
|
100
|
+
};
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get task result with full output
|
|
105
|
+
*/
|
|
106
|
+
function registerGetTaskResultTool(server) {
|
|
107
|
+
server.registerTool('get-task-result', {
|
|
108
|
+
description: 'Get the full result of a task including stdout/stderr output. ' +
|
|
109
|
+
'Only available for completed tasks.',
|
|
110
|
+
inputSchema: getTaskStatusSchema,
|
|
111
|
+
}, async (input) => {
|
|
112
|
+
const result = getTaskStatusSchema.safeParse(input);
|
|
113
|
+
if (!result.success) {
|
|
114
|
+
return createErrorResponse(new Error(`Invalid input: ${result.error.errors.map(e => e.message).join(', ')}`));
|
|
115
|
+
}
|
|
116
|
+
const { taskId } = result.data;
|
|
117
|
+
const taskResult = taskManager.getTaskResult(taskId);
|
|
118
|
+
if (!taskResult) {
|
|
119
|
+
return {
|
|
120
|
+
content: [{
|
|
121
|
+
type: 'text',
|
|
122
|
+
text: `## Task Not Found\n\nTask with ID \`${taskId}\` does not exist.`,
|
|
123
|
+
}],
|
|
124
|
+
isError: true,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const { taskInfo, stdout, stderr } = taskResult;
|
|
128
|
+
// taskInfo is guaranteed to be non-null here since taskResult was not null
|
|
129
|
+
if (!taskInfo) {
|
|
130
|
+
return {
|
|
131
|
+
content: [{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: `## Task Not Found\n\nTask with ID \`${taskId}\` does not exist.`,
|
|
134
|
+
}],
|
|
135
|
+
isError: true,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
let output = formatTaskInfo(taskInfo);
|
|
139
|
+
if (taskInfo.status === 'running' || taskInfo.status === 'pending') {
|
|
140
|
+
output += `\n\n**Note:** Task is still ${taskInfo.status}. Result not available yet.`;
|
|
141
|
+
}
|
|
142
|
+
else if (stdout !== undefined || stderr !== undefined) {
|
|
143
|
+
if (stdout) {
|
|
144
|
+
output += `\n\n### Standard Output:\n\`\`\`\n${stdout.trim()}\n\`\`\``;
|
|
145
|
+
}
|
|
146
|
+
if (stderr) {
|
|
147
|
+
output += `\n\n### Standard Error:\n\`\`\`\n${stderr.trim()}\n\`\`\``;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
content: [{
|
|
152
|
+
type: 'text',
|
|
153
|
+
text: output,
|
|
154
|
+
}],
|
|
155
|
+
};
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Cancel a task
|
|
160
|
+
*/
|
|
161
|
+
function registerCancelTaskTool(server) {
|
|
162
|
+
server.registerTool('cancel-task', {
|
|
163
|
+
description: 'Cancel a pending or running task.',
|
|
164
|
+
inputSchema: getTaskStatusSchema,
|
|
165
|
+
}, async (input) => {
|
|
166
|
+
const result = getTaskStatusSchema.safeParse(input);
|
|
167
|
+
if (!result.success) {
|
|
168
|
+
return createErrorResponse(new Error(`Invalid input: ${result.error.errors.map(e => e.message).join(', ')}`));
|
|
169
|
+
}
|
|
170
|
+
const { taskId } = result.data;
|
|
171
|
+
const cancelled = taskManager.cancelTask(taskId);
|
|
172
|
+
if (!cancelled) {
|
|
173
|
+
const taskInfo = taskManager.getTask(taskId);
|
|
174
|
+
if (!taskInfo) {
|
|
175
|
+
return {
|
|
176
|
+
content: [{
|
|
177
|
+
type: 'text',
|
|
178
|
+
text: `## Task Not Found\n\nTask with ID \`${taskId}\` does not exist.`,
|
|
179
|
+
}],
|
|
180
|
+
isError: true,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
content: [{
|
|
185
|
+
type: 'text',
|
|
186
|
+
text: `## Cannot Cancel Task\n\nTask with ID \`${taskId}\` is ${taskInfo.status} and cannot be cancelled.`,
|
|
187
|
+
}],
|
|
188
|
+
isError: true,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
content: [{
|
|
193
|
+
type: 'text',
|
|
194
|
+
text: `## Task Cancelled\n\nTask \`${taskId}\` has been cancelled.`,
|
|
195
|
+
}],
|
|
196
|
+
};
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Delete a task from the task list
|
|
201
|
+
*/
|
|
202
|
+
function registerDeleteTaskTool(server) {
|
|
203
|
+
server.registerTool('delete-task', {
|
|
204
|
+
description: 'Delete a task from the task list. Use this to clean up old completed tasks.',
|
|
205
|
+
inputSchema: getTaskStatusSchema,
|
|
206
|
+
}, async (input) => {
|
|
207
|
+
const result = getTaskStatusSchema.safeParse(input);
|
|
208
|
+
if (!result.success) {
|
|
209
|
+
return createErrorResponse(new Error(`Invalid input: ${result.error.errors.map(e => e.message).join(', ')}`));
|
|
210
|
+
}
|
|
211
|
+
const { taskId } = result.data;
|
|
212
|
+
const deleted = taskManager.deleteTask(taskId);
|
|
213
|
+
if (!deleted) {
|
|
214
|
+
return {
|
|
215
|
+
content: [{
|
|
216
|
+
type: 'text',
|
|
217
|
+
text: `## Task Not Found\n\nTask with ID \`${taskId}\` does not exist.`,
|
|
218
|
+
}],
|
|
219
|
+
isError: true,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
content: [{
|
|
224
|
+
type: 'text',
|
|
225
|
+
text: `## Task Deleted\n\nTask \`${taskId}\` has been deleted from the task list.`,
|
|
226
|
+
}],
|
|
227
|
+
};
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* List all tasks
|
|
232
|
+
*/
|
|
233
|
+
const listTasksSchema = z.object({
|
|
234
|
+
status: z.enum(['pending', 'running', 'completed', 'failed', 'cancelled']).optional()
|
|
235
|
+
.describe('Filter by status (optional)'),
|
|
236
|
+
limit: z.number().optional().describe('Maximum number of tasks to return (default: 50)'),
|
|
237
|
+
});
|
|
238
|
+
function registerListTasksTool(server) {
|
|
239
|
+
server.registerTool('list-tasks', {
|
|
240
|
+
description: 'List all tasks, optionally filtered by status.',
|
|
241
|
+
inputSchema: listTasksSchema,
|
|
242
|
+
}, async (input) => {
|
|
243
|
+
const result = listTasksSchema.safeParse(input);
|
|
244
|
+
if (!result.success) {
|
|
245
|
+
return createErrorResponse(new Error(`Invalid input: ${result.error.errors.map(e => e.message).join(', ')}`));
|
|
246
|
+
}
|
|
247
|
+
const { status, limit } = result.data;
|
|
248
|
+
let tasks = taskManager.listTasks();
|
|
249
|
+
if (status) {
|
|
250
|
+
tasks = tasks.filter(t => t.status === status);
|
|
251
|
+
}
|
|
252
|
+
if (limit) {
|
|
253
|
+
tasks = tasks.slice(0, limit);
|
|
254
|
+
}
|
|
255
|
+
if (tasks.length === 0) {
|
|
256
|
+
return {
|
|
257
|
+
content: [{
|
|
258
|
+
type: 'text',
|
|
259
|
+
text: `## No Tasks Found\n\n${status ? `No tasks with status "${status}".` : 'No tasks found.'}`,
|
|
260
|
+
}],
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const stats = taskManager.getStats();
|
|
264
|
+
let output = `## Tasks (${tasks.length} shown)\n\n`;
|
|
265
|
+
output += `**Stats:** ${stats.pending} pending, ${stats.running} running, ${stats.completed} completed, ${stats.failed} failed, ${stats.cancelled} cancelled\n\n`;
|
|
266
|
+
for (const task of tasks) {
|
|
267
|
+
output += formatTaskInfoShort(task);
|
|
268
|
+
}
|
|
269
|
+
return {
|
|
270
|
+
content: [{
|
|
271
|
+
type: 'text',
|
|
272
|
+
text: output,
|
|
273
|
+
}],
|
|
274
|
+
};
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Get task statistics
|
|
279
|
+
*/
|
|
280
|
+
function registerGetTaskStatsTool(server) {
|
|
281
|
+
server.registerTool('get-task-stats', {
|
|
282
|
+
description: 'Get statistics about all tasks.',
|
|
283
|
+
inputSchema: z.object({}).optional(),
|
|
284
|
+
}, async () => {
|
|
285
|
+
const stats = taskManager.getStats();
|
|
286
|
+
let output = `## Task Statistics\n\n`;
|
|
287
|
+
output += `| Status | Count |\n`;
|
|
288
|
+
output += `|--------|-------|\n`;
|
|
289
|
+
output += `| Total | ${stats.total} |\n`;
|
|
290
|
+
output += `| Pending | ${stats.pending} |\n`;
|
|
291
|
+
output += `| Running | ${stats.running} |\n`;
|
|
292
|
+
output += `| Completed | ${stats.completed} |\n`;
|
|
293
|
+
output += `| Failed | ${stats.failed} |\n`;
|
|
294
|
+
output += `| Cancelled | ${stats.cancelled} |\n`;
|
|
295
|
+
return {
|
|
296
|
+
content: [{
|
|
297
|
+
type: 'text',
|
|
298
|
+
text: output,
|
|
299
|
+
}],
|
|
300
|
+
};
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Format task info for display
|
|
305
|
+
*/
|
|
306
|
+
function formatTaskInfo(task) {
|
|
307
|
+
let output = `## Task ${task.id}\n\n`;
|
|
308
|
+
output += `| Property | Value |\n`;
|
|
309
|
+
output += `|----------|-------|\n`;
|
|
310
|
+
output += `| Status | **${task.status}** |\n`;
|
|
311
|
+
output += `| Task | ${task.task.substring(0, 100)}${task.task.length > 100 ? '...' : ''} |\n`;
|
|
312
|
+
if (task.workingDirectory) {
|
|
313
|
+
output += `| Working Directory | \`${task.workingDirectory}\` |\n`;
|
|
314
|
+
}
|
|
315
|
+
output += `| Created | ${new Date(task.createdAt).toLocaleString()} |\n`;
|
|
316
|
+
if (task.startedAt) {
|
|
317
|
+
output += `| Started | ${new Date(task.startedAt).toLocaleString()} |\n`;
|
|
318
|
+
}
|
|
319
|
+
if (task.completedAt) {
|
|
320
|
+
output += `| Completed | ${new Date(task.completedAt).toLocaleString()} |\n`;
|
|
321
|
+
const started = new Date(task.startedAt ?? task.createdAt).getTime();
|
|
322
|
+
const completed = new Date(task.completedAt).getTime();
|
|
323
|
+
const duration = ((completed - started) / 1000).toFixed(1);
|
|
324
|
+
output += `| Duration | ${duration}s |\n`;
|
|
325
|
+
}
|
|
326
|
+
if (task.success !== undefined) {
|
|
327
|
+
output += `| Success | ${task.success ? 'Yes' : 'No'} |\n`;
|
|
328
|
+
}
|
|
329
|
+
if (task.exitCode !== undefined && task.exitCode !== null) {
|
|
330
|
+
output += `| Exit Code | ${task.exitCode} |\n`;
|
|
331
|
+
}
|
|
332
|
+
if (task.error) {
|
|
333
|
+
output += `| Error | ${task.error} |\n`;
|
|
334
|
+
}
|
|
335
|
+
return output;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Format short task info for list display
|
|
339
|
+
*/
|
|
340
|
+
function formatTaskInfoShort(task) {
|
|
341
|
+
const statusEmoji = {
|
|
342
|
+
pending: '⏳',
|
|
343
|
+
running: '🔄',
|
|
344
|
+
completed: '✅',
|
|
345
|
+
failed: '❌',
|
|
346
|
+
cancelled: '🛑',
|
|
347
|
+
};
|
|
348
|
+
let output = `### ${statusEmoji[task.status]} ${task.id}\n\n`;
|
|
349
|
+
output += `- **Status:** ${task.status}\n`;
|
|
350
|
+
output += `- **Task:** ${task.task.substring(0, 80)}${task.task.length > 80 ? '...' : ''}\n`;
|
|
351
|
+
output += `- **Created:** ${new Date(task.createdAt).toLocaleString()}\n`;
|
|
352
|
+
if (task.status === 'running' && task.startedAt) {
|
|
353
|
+
const elapsed = ((Date.now() - new Date(task.startedAt).getTime()) / 1000).toFixed(0);
|
|
354
|
+
output += `- **Elapsed:** ${elapsed}s\n`;
|
|
355
|
+
}
|
|
356
|
+
else if (task.completedAt && task.startedAt) {
|
|
357
|
+
const duration = ((new Date(task.completedAt).getTime() - new Date(task.startedAt).getTime()) / 1000).toFixed(1);
|
|
358
|
+
output += `- **Duration:** ${duration}s\n`;
|
|
359
|
+
}
|
|
360
|
+
output += '\n';
|
|
361
|
+
return output;
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=task-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-tools.js","sourceRoot":"","sources":["../../src/task-manager/task-tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zuens2020/back-agent-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "MCP server for executing tasks via Claude Code CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -42,10 +42,12 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
45
|
+
"uuid": "^13.0.0",
|
|
45
46
|
"zod": "^3.23.8"
|
|
46
47
|
},
|
|
47
48
|
"devDependencies": {
|
|
48
49
|
"@types/node": "^22.10.5",
|
|
50
|
+
"@types/uuid": "^10.0.0",
|
|
49
51
|
"tsx": "^4.19.2",
|
|
50
52
|
"typescript": "^5.7.3"
|
|
51
53
|
}
|