这是一个使用 TypeScript 和 Zod 实现了强大验证的任务管理系统(任务清单)的 MCP 服务器(模型上下文协议)。该服务器可以直接与 Claude Desktop 集成,允许您通过与 Claude 的自然对话来管理您的任务。
想要学习如何开发这个应用程序并了解 MCP?您可以在这里找到详细的步骤教程:这里
模型上下文协议 是由 Anthropic 开发的一个协议,它允许 AI 助手以标准化的方式连接到外部工具和资源。通过这个项目,您可以:
该项目遵循 SOLID 原则,确保代码干净、可维护和可扩展:
src/
├── config/ # ⚙️ 配置
│ └── toolDefinitions.ts # 📋 中央化的 MCP 工具定义
├── handlers/ # 🎯 专门的处理器(SOLID)
│ ├── toolHandlers.ts # 🔧 管理工具操作
│ ├── resourceHandlers.ts # 📊 管理数据资源
│ └── promptHandlers.ts # 💡 管理提示模板
├── schemas/ # 📋 Zod 验证模式
│ ├── common.schemas.ts # 基础模式(UUID、Date 等)
│ └── todo.schemas.ts # 特定任务模式
├── services/ # 🔧 业务逻辑
│ └── todo.services.ts # 任务管理
├── utils/ # 🛠️ 工具
│ └── validation.ts # 验证助手
├── types.ts # 📝 TypeScript 类型
├── server.ts # 🖥️ 主 MCP 服务器(编排)
└── index.ts # 🚀 入口点
每个类都有一个独特的责任:
TOOL_DEFINITIONS 允许添加工具而不触碰处理器TodoServicegraph TB
A[Claude Desktop] --> B[TodoMCPServer]
B --> C{请求类型}
C -->|工具| D[ToolHandlers]
C -->|资源| E[ResourceHandlers]
C -->|提示| F[PromptHandlers]
D --> G[验证层 - Zod]
E --> G
F --> G
G --> H[TodoService]
H --> I[内存存储]
I --> H
H --> G
G --> D
G --> E
G --> F
D --> B
E --> B
F --> B
B --> A
style B fill:#e1f5fe
style D fill:#f3e5f5
style E fill:#e8f5e8
style F fill:#fff3e0
style H fill:#fce4ec
class TodoMCPServer {
private toolHandlers: ToolHandlers; // 委托 CRUD 操作
private resourceHandlers: ResourceHandlers; // 委托资源
private promptHandlers: PromptHandlers; // 委托提示
// 仅配置和路由请求
setupHandlers(): void {
this.server.setRequestHandler(CallToolRequestSchema,
(req) => this.toolHandlers.handleCallTool(req));
// ...
}
}
class ToolHandlers {
handleCallTool(request): Promise<CallToolResult> {
switch (name) {
case "create_todo": return this.handleCreateTodo(request);
case "update_todo": return this.handleUpdateTodo(request);
case "delete_todo": return this.handleDeleteTodo(request);
// ...
}
}
}
class ResourceHandlers {
handleReadResource(request): Promise<ReadResourceResult> {
switch (uri) {
case "todo://all": return this.handleAllTodos(uri);
case "todo://stats": return this.handleTodoStats(uri);
// ...
}
}
}
class PromptHandlers {
handleGetPrompt(request): Promise<GetPromptResult> {
switch (name) {
case "todo-summary": return this.handleTodoSummary(args);
case "todo-prioritization": return this.handleTodoPrioritization(args);
// ...
}
}
}
# 如果使用 Git
git clone <你的仓库>
cd todo-list-mcp-server
# 或者新建文件夹
mkdir todo-list-mcp-server
cd todo-list-mcp-server
# 安装所有依赖
npm install
# 检查是否正确安装
npm list --depth=0
主要依赖项:
@modelcontextprotocol/sdk - 官方 MCP SDKzod - 方案验证typescript - TypeScript 语言tsx - 开发用 TypeScript 执行器# 将 TypeScript 编译为 JavaScript
npm run build
# 检查是否正确编译
ls dist/
# 测试服务器是否正确启动
npm start
你应该看到:
🔧 初始化 MCP 任务清单服务器...
🚀 MCP 任务清单服务器已启动
✅ 强大的验证已启用
🔒 类型安全已保证
按 Ctrl+C 停止。
Windows:
%APPDATA%\Claude\claude_desktop_config.json
macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Linux:
~/.config/Claude/claude_desktop_config.json
⚠️ 重要提示: 使用项目的 绝对路径!
# 查找绝对路径
# Windows:
echo %cd%
# macOS/Linux:
pwd
示例配置:
{
"mcpServers": {
"todo-server": {
"command": "node",
"args": ["C:/Users/你的用户/caminho/para/todo-list-mcp-server/dist/index.js"]
}
}
}
# 列出所有任务
"列出我所有的任务"
# 创建新任务
"创建任务:'学习 TypeScript',优先级高"
# 搜索任务
"搜索包含 '学习' 的任务"
# 标记为完成
"将 ID [uuid] 的任务标记为完成"
# 创建完整任务
"创建任务:'实现身份验证',描述 '添加 OAuth 登录',优先级高,标签 '后端','安全'"
# 按状态筛选
"只显示未完成的任务"
# 按优先级筛选
"列出所有高优先级的任务"
# 获取统计数据
"显示我的任务统计数据"
# 个性化摘要
"生成按优先级分组的任务摘要"
# 优先级帮助
"帮我优先化我的未完成任务"
# 生产力见解
"分析我的生产力并提供建议"
interface Todo {
id: string; // 唯一的 UUID
title: string; // 标题(1-200 字符)
description?: string; // 可选描述(最多 500 字符)
completed: boolean; // 完成状态
createdAt: Date; // 创建日期
completedAt?: Date; // 完成日期(如果适用)
priority: 'low' | 'medium' | 'high'; // 优先级
tags: string[]; // 分类标签(最多 10 个)
}
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"title": "学习 MCP 协议",
"description": "使用 TypeScript 和 Zod 学习 Model Context Protocol",
"completed": false,
"createdAt": "2024-01-15T10:30:00.000Z",
"priority": "high",
"tags": ["学习", "typescript", "mcp"]
}
只读端点用于数据可视化:
| URI | 描述 |
|---|---|
todo://all | 完整的任务列表。 |
todo://stats | 任务统计数据。 |
todo://completed | 仅已完成的任务。 |
todo://pending | 仅未完成的任务。 |
修改数据的操作:
| 工具 | 描述 |
|---|---|
create_todo | 创建新任务。 |
update_todo | 更新现有任务。 |
delete_todo | 删除任务。 |
list_todos | 带过滤器和分页的列表 |
get_todo | 按 ID 搜索任务。 |
search_todos | 文本搜索 |
用于分析的上下文模板:
| 提示 | 描述 |
|---|---|
todo_summary | 个性化摘要 |
todo_prioritization | 优先级帮助。 |
productivity_insights | 生产力分析 |
Zod 确保所有数据在 编译时 和 运行时 都是有效的:
// ❌ 无 Zod - 危险
function createTodo(data: any) {
return {
title: data.title, // 可能是 undefined, null 或空!
priority: data.priority, // 可以是任何字符串!
};
}
// ✅ 有 Zod - 安全
function createTodo(data: unknown) {
const validatedData = validateData(CreateTodoSchema, data);
return {
title: validatedData.title, // ✅ 有效字符串(1-200 字符)
priority: validatedData.priority, // ✅ 'low' | 'medium' | 'high'
};
}
// 基础任务模式
export const TodoSchema = z.object({
id: UuidSchema,
title: NonEmptyStringSchema.max(200),
description: z.string().max(500).optional(),
completed: z.boolean().default(false),
createdAt: DateSchema,
completedAt: DateSchema.optional(),
priority: z.enum(['low', 'medium', 'high']).default('medium'),
tags: z.array(z.string().min(1).max(50)).max(10).default([])
});
// 创建任务模式
export const CreateTodoSchema = z.object({
title: NonEmptyStringSchema.max(200),
description: z.string().max(500).optional(),
priority: z.enum(['low', 'medium', 'high']).default('medium'),
tags: z.array(z.string().min(1).max(50)).max(10).default([])
});
用户: "为我的项目创建以下任务:
1. '项目初始设置' - 高优先级
2. '实现身份验证' - 中优先级
3. '编写测试' - 低优先级"
Claude: [使用 create_todo 工具创建 3 个任务]
用户: "帮我优先化这些任务"
Claude: [使用 todo_prioritization 提示进行分析]
用户: "将第一个任务标记为完成"
Claude: [使用 update_todo 将其标记为 completed: true]
用户: "生成我的生产力报告"
Claude: [使用 productivity_insights 进行全面分析]
- 完成率:75%
- 高优先级任务:80% 已完成
- 最常用标签:前端(60%),后端(40%)
- 改进建议...
用户: "只显示高优先级的未完成任务"
Claude: [使用 list_todos 并过滤状态=pending,优先级=高]
✅ 可持续性 每个文件都有特定的责任 ✅ 可测试性 处理器可以独立测试 ✅ 可扩展性 容易添加新功能 ✅ 重用性 组件可以重用 ✅ 调试性 错误按责任隔离
// 1. 在 config/toolDefinitions.ts 中定义
{
name: "set_deadline",
description: "为任务设置截止日期",
inputSchema: {
type: "object",
properties: {
id: { type: "string", format: "uuid" },
deadline: { type: "string", format: "date" }
},
required: ["id", "deadline"]
}
}
// 2. 在 handlers/toolHandlers.ts 中实现
private async handleSetDeadline(request: CallToolRequest): Promise<CallToolResult> {
const { args } = request.params;
const validatedData = validateData(SetDeadlineSchema, args);
// 实现逻辑...
}
// 3. 在 handleCallTool 的 switch 中添加
case "set_deadline": return this.handleSetDeadline(request);
// 1. 在 resourceHandlers.ts 中添加定义
{
uri: "todo://overdue",