任务编排器是一个用于任务编排和管理的模型上下文协议(MCP)服务器。该工具可将目标分解为可管理的任务,并跟踪其进度。
理想情况下,大语言模型(LLM)应该能够理解何时使用此MCP工具。作为示例提示,类似以下内容可能会起作用:
"为我创建一个新的开发目标。目标是'实现用户认证',该目标适用于'my-web-app'仓库。"
如果您遇到任何问题,请在顶部的“讨论”标签中创建一个新问题告知我们。
任务ID使用点符号表示法(例如,"1"、"1.1"、"1.1.1"),其中每个段表示层次结构中的一个级别。
goalId和taskId的组合保证是唯一的。服务器提供以下工具(基于build/index.js):
create_goal
{
description: string; // 目标描述
repoName: string; // 与此目标关联的仓库名称
}
{
"description": "实现用户认证",
"repoName": "example/auth-service"
}
{ goalId: number }add_tasks
parentId字段。该操作是事务性的:要么批次中的所有任务都成功,要么整个操作失败。{
goalId: number; // 要添加任务的目标ID
tasks: Array<{
title: string; // 任务标题
description: string; // 任务详细描述
parentId?: string | null; // 可选的父任务ID,用于现有任务的子任务。对于在此批次中以层次结构定义的新子任务,请勿使用。
subtasks?: Array<any>; // 要在此任务下创建的嵌套子任务对象数组。
}>;
}
{
"goalId": 1,
"tasks": [
{
"title": "设计数据库架构",
"description": "定义用户、角色和权限的表",
"subtasks": [
{
"title": "创建实体关系图",
"description": "绘制实体关系图"
}
]
},
{
"title": "实现用户注册",
"description": "创建新用户注册的API端点",
"parentId": "1"
}
]
}
HierarchicalTaskResponse[]。HierarchicalTaskResponse对象是简化的,不包括createdAt、updatedAt或parentId。remove_tasks
get_tasks结果中排除,除非includeDeletedTasks设置为true。{
goalId: number; // 要删除任务的目标ID
taskIds: string[]; // 要删除的任务ID(字符串数组)。任务ID使用点符号表示法(例如,"1"、"1.1")。
deleteChildren?: boolean; // 是否与父任务一起删除子任务(布尔值)。默认为`false`。如果为`false`,尝试删除有现有子任务的父任务将抛出错误。
}
{
"goalId": 1,
"taskIds": ["2", "3"]
}
{
"goalId": 1,
"taskIds": ["1"],
"deleteChildren": true
}
{ removedTasks: TaskResponse[], completedParents: TaskResponse[] }。TaskResponse对象是简化的,不包括createdAt、updatedAt或parentId。get_tasks
includeSubtasks时,响应将返回层次化任务对象。否则,将返回不包括createdAt、updatedAt或parentId的简化任务对象。{
goalId: number; // 要获取任务的目标ID
taskIds?: string[]; // 可选:要获取的任务ID(字符串数组)。如果为`null`或为空,则将获取目标的所有任务。
includeSubtasks?: "none" | "first-level" | "recursive"; // 要包含的子任务级别:"none"(仅顶级任务)、"first-level"(顶级任务及其直接子任务)或"recursive"(所有嵌套子任务)。默认为"none"。
includeDeletedTasks?: boolean; // 是否在结果中包含软删除的任务(布尔值)。默认为`false`。
}
{
"goalId": 1,
"includeSubtasks": "recursive",
"includeDeletedTasks": true
}
TaskResponse[]。TaskResponse对象是简化的,不包括createdAt、updatedAt或parentId。complete_task_status
{
goalId: number; // 包含任务的目标ID
taskIds: string[]; // 要更新的任务ID(字符串数组)。任务ID使用点符号表示法(例如,"1"、"1.1")。
completeChildren?: boolean; // 是否递归完成所有子任务(布尔值)。默认为`false`。如果为`false`,则只有在所有子任务都已完成的情况下,才能完成任务。
}
{
"goalId": 1,
"taskIds": ["1", "2"]
}
{
"goalId": 1,
"taskIds": ["1"],
"completeChildren": true
}
TaskResponse[]。TaskResponse对象是简化的,不包括createdAt、updatedAt或parentId。// 创建一个新目标。其顶级任务的ID将从 "1" 开始。
const goal = await callTool('create_goal', {
description: '实现用户认证',
repoName: 'user/repo'
});
// 添加一个顶级任务
const task1 = await callTool('add_tasks', {
goalId: goal.goalId,
tasks: [
{
title: '设置认证中间件',
description: '实现基于JWT的认证'
}
]
});
// task1.addedTasks[0].id 将为 "1"
// 向之前创建的任务 "1" 添加一个子任务
const task2 = await callTool('add_tasks', {
goalId: goal.goalId,
tasks: [
{
title: '创建登录端点',
description: '实现POST /auth/login',
parentId: "1" // ParentId 必须引用一个已经存在的任务ID
}
]
});
// task2.addedTasks[0].id 将为 "1.1"
// 将一个父任务标记为已完成,这也将完成其子任务
await callTool('complete_task_status', {
goalId: 1,
taskIds: ["1"],
completeChildren: true
});
// 递归获取所有任务,包括子任务
const allTasks = await callTool('get_tasks', {
goalId: 1,
includeSubtasks: "recursive"
});
// 尝试在不删除子任务的情况下删除一个父任务(如果有子任务,操作将失败)
try {
await callTool('remove_tasks', {
goalId: 1,
taskIds: ["1"]
});
} catch (error) {
console.error(error.message); // 如果存在子任务,预计会抛出错误
}
// 删除一个父任务及其子任务
await callTool('remove_tasks', {
goalId: 1,
taskIds: ["1"],
deleteChildren: true
});
安装依赖项:
pnpm install
构建项目:
pnpm build
运行测试:
pnpm test
src/ - 源代码
index.ts - 主服务器实现storage.ts - 数据持久层types.ts - TypeScript 类型定义prompts.ts - AI 提示模板__tests__/ - 测试文件本项目采用 MIT 许可证。