禅道mcp
禅道MCP服务器是一个用于查询禅道项目管理系统中项目和Bug的工具。它提供了列出项目、过滤和分页Bug列表、获取详细的Bug信息、自动认证和Token缓存等功能。服务器支持Markdown和JSON两种响应格式,并包括全面的错误处理。
MCP 服务配置
复制以下 JSON 到 OPClaw 或其他 MCP 客户端的配置文件中即可使用
{
"mcpServers": {
"zentao": {
"args": [
"D:\\path\\to\\@orange29233/zentao-mcp\\dist\\index.js"
],
"command": "node",
"env": {
"ZENTAO_DEFAULT_PROJECT": "1",
"ZENTAO_PASSWORD": "your-password",
"ZENTAO_URL": "https://your-zentao-domain.com",
"ZENTAO_USERNAME": "your-username"
}
}
}
}
该服务需要配置环境变量:ZENTAO_DEFAULT_PROJECT、ZENTAO_PASSWORD、ZENTAO_URL、ZENTAO_USERNAME
可用工具 (3 个)
该服务在 MCP 协议中暴露的工具,AI 可按需调用
zentao_list_projects 3 个参数
从禅道系统查询项目列表,支持可选的筛选条件。 此工具从禅道项目管理系统中检索所有项目,支持状态筛选和分页。此工具不会创建或修改项目,仅查询现有项目。 参数: - limit (number): 返回的最大结果数,范围 1-100 (默认: 20) - offset (number): 分页跳过的结果数 (默认: 0) - status (string): 按项目状态筛选 - 'all'(全部), 'active'(进行中), 'closed'(已关闭) (可选) 返回: JSON 格式时,返回结构化数据: { "total": number, // 找到的项目总数 "count": number, // 当前响应中的结果数 "offset": number, // 当前分页偏移量 "projects": [ { "id": string, // 项目 ID "name": string, // 项目名称 "status": string, // 项目状态 (wait/doing/done/pause/closed/...) "begin": string, // 计划开始日期 (YYYY-MM-DD) "end": string, // 计划结束日期 (YYYY-MM-DD) "realBegan": string, // 实际开始日期 (YYYY-MM-DD HH:mm:ss) "realEnd": string, // 实际结束日期 (YYYY-MM-DD HH:mm:ss) "openedBy": string, // 创建者账号 "openedDate": string, // 创建日期 (YYYY-MM-DD HH:mm:ss) "desc": string // 项目描述 } ], "has_more": boolean, // 是否有更多结果可用 "next_offset": number // 下一页的偏移量 (当 has_more 为 true 时) } 示例: - 使用场景: "列出所有进行中的项目" -> 参数 status="active" - 使用场景: "显示前 10 个项目" -> 参数 limit=10 - 使用场景: "获取第 2 页项目" -> 参数 offset=20, limit=20 - 不使用场景: 需要创建或修改项目时 错误处理: - 如果凭据无效,返回 "Error: Authentication failed" - 如果服务器无法访问,返回 "Error: Network connection failed" - 成功时返回带有分页信息的格式化项目列表
该工具无需必填参数,直接调用即可
zentao_list_bugs 13 个参数
从禅道查询 Bug 列表,支持全面的多维度筛选。 此工具从禅道检索 Bug,支持按项目、状态、严重程度、优先级、指派用户、创建者、日期范围等进行筛选。支持分页和多种输出格式。此工具不会创建或修改 Bug,仅查询现有 Bug。 参数: - projectId (number): 项目 ID (如未指定则使用默认值) - status (string): 按状态筛选 - 'all'(全部), 'active'(活跃), 'resolved'(已解决), 'closed'(已关闭) (默认: all) - severity (string): 按严重程度筛选 - '1' (致命), '2' (严重), '3' (一般), '4' (轻微) - priority (string): 按优先级筛选 - '1' (高), '2' (中), '3' (低), '4' (最低) - assignedTo (string): 按指派用户账号筛选 - openedBy (string): 按创建者用户账号筛选 - resolution (string): 按解决方案关键词筛选 - startDate (string): 按创建开始日期筛选 (YYYY-MM-DD 格式) - endDate (string): 按创建结束日期筛选 (YYYY-MM-DD 格式) - limit (number): 返回的最大结果数,范围 1-100 (默认: 20) - offset (number): 分页跳过的结果数 (默认: 0) - orderBy (string): 结果排序方式 - response_format (string): 输出格式 - 'markdown' 供人类阅读, 'json' 供机器读取 (默认: markdown) 返回: JSON 格式时,返回结构化数据: { "bugs": [ { "id": string, // Bug ID "title": string, // Bug 标题 "status": string, // Bug 状态 (active/resolved/closed/...) "severity": number, // 严重程度 (1-4) "priority": number, // 优先级 (1-4) "openedDate": string, // 创建日期 (YYYY-MM-DD HH:mm:ss) "openedBy": string, // 创建者账号 "assignedTo": string, // 指派用户账号 "assignedDate": string, // 指派日期 "resolvedBy": string, // 解决者账号 "resolution": string, // 解决方案描述 "resolvedDate": string, // 解决日期 "closedBy": string, // 关闭者账号 "closedDate": string, // 关闭日期 "project": string, // 项目 ID "product": string, // 产品 ID "steps": string // 复现步骤 } ], "total": number, // 匹配的 Bug 总数 "count": number, // 当前响应中的 Bug 数 "offset": number, // 当前分页偏移量 "has_more": boolean, // 是否有更多结果可用 "next_offset": number, // 下一页偏移量 (当 has_more 为 true 时) "filters": { // 应用的筛选条件参考 "projectId": number, "status": string, "severity": number, "priority": number } } 示例: - 使用场景: "列出项目 1 中的所有 Bug" -> 参数 projectId=1 - 使用场景: "仅显示活跃 Bug" -> 参数 status="active" - 使用场景: "显示严重程度为致命的 Bug" -> 参数 severity="1" - 使用场景: "显示指派给用户 john 的 Bug" -> 参数 assignedTo="john" - 使用场景: "显示上周的 Bug" -> 参数 startDate="2024-01-15", endDate="2024-01-22" 错误处理: - 如果 projectId 无效,返回 "Error: Project not found" - 如果凭据无效,返回 "Error: Authentication failed" - 成功时返回带有分页信息的格式化 Bug 列表
该工具无需必填参数,直接调用即可
zentao_get_bug_details 2 个参数 需填 1 项
根据 ID 检索特定 Bug 的详细信息。 此工具从禅道获取完整的 Bug 信息,包括标题、描述、步骤、状态、指派历史、解决方案详情和相关元数据。此工具不会创建或修改 Bug,仅查询现有 Bug。 参数: - bugId (number): 要检索的 Bug ID (必需) - response_format (string): 输出格式 - 'markdown' 供人类阅读, 'json' 供机器读取 (默认: markdown) 返回: JSON 格式时,返回完整的 Bug 信息结构化数据,包括: - id, title, status, severity, priority, type - 创建信息 (创建者、日期、版本) - 指派详情 (指派给谁、指派日期、截止日期) - 解决信息 (解决者、解决方案、解决版本、解决日期) - 关闭信息 (关闭者、关闭日期) - 关联对象 (项目、产品、执行、计划、需求、任务) - 复现步骤、预期结果、实际结果 - 附件和评论 - 最后编辑信息 示例: - 使用场景: "获取 Bug 12345 的详情" -> 参数 bugId=12345 - 使用场景: "以 JSON 格式显示 Bug #54321" -> 参数 bugId=54321, response_format='json' 错误处理: - 如果 bugId 无效,返回 "Error: Bug not found" - 如果凭据无效,返回 "Error: Authentication failed" - 成功时返回完整的 Bug 详情
必填参数:bugId
服务介绍
Zentao MCP Server
禅道项目管理系统的 MCP (Model Context Protocol) 服务器,提供查询项目和 Bug 的工具。
功能特性
- 查询项目列表,支持状态过滤和分页
- 查询 Bug 列表,支持多维度过滤(项目、状态、严重程度、优先级、指派给、创建者、日期范围)
- 获取 Bug 详细信息
- 自动认证和 Token 缓存(TTL 可配置)
- 支持 Markdown 和 JSON 两种响应格式
- 完整的错误处理和用户友好的错误消息
- TypeScript 类型安全
- Zod 运行时输入验证
npm 包信息
- 包名:
@orange29233/zentao-mcp - 最新版本:
- 许可证: MIT
- Node.js 要求: >= 18
- 仓库: https://github.com/orange29233/zantao-mcp
前置要求
- Node.js 18 或更高版本
- 具有 API 访问权限的禅道实例
快速开始
方式 1: 使用 npm 包(推荐)
直接使用 npx,无需安装:
npx @orange29233/zentao-mcp
或全局安装:
npm install -g @orange29233/zentao-mcp
@orange29233/zentao-mcp
方式 2: 从源码安装(开发调试)
1. 安装依赖
npm install
2. 配置环境变量
复制 .env.example 为 .env 并填入配置:
cp .env.example .env
编辑 .env 文件:
# 必需配置
ZENTAO_URL=https://your-zentao-domain.com
ZENTAO_USERNAME=your-username
ZENTAO_PASSWORD=your-password
ZENTAO_DEFAULT_PROJECT=1
# 可选配置
TTL_SECONDS=3600
LOG_LEVEL=info
环境变量说明
| 变量 | 说明 | 默认值 |
|---|---|---|
ZENTAO_URL |
禅道实例的完整 URL(需包含协议) | - |
ZENTAO_USERNAME |
认证用户名 | - |
ZENTAO_PASSWORD |
认证密码 | - |
ZENTAO_DEFAULT_PROJECT |
默认项目 ID | - |
TTL_SECONDS |
Token 缓存时间(秒) | 3600 |
LOG_LEVEL |
日志级别 (info/debug/error) | info |
3. 编译项目
npm run build
4. 启动服务器
开发模式(支持自动重载):
npm run dev
生产模式:
npm start
测试服务器
使用 MCP Inspector 测试
# 启动 MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js
在 Inspector 中,你可以:
- 查看所有已注册的工具
- 测试每个工具的各种参数
- 查看工具的输入/输出 schema
- 查看实际的 API 调用结果
测试示例
1. 查询所有项目:
Tool: zentao_list_projects
Parameters: {}
2. 查询激活的项目:
Tool: zentao_list_projects
Parameters: {
"status": "active",
"limit": 10
}
3. 查询项目中的 Bug 列表:
Tool: zentao_list_bugs
Parameters: {
"projectId": 1,
"status": "active",
"severity": "1",
"limit": 10,
"response_format": "markdown"
}
4. 获取特定 Bug 详情:
Tool: zentao_get_bug_details
Parameters: {
"bugId": 123,
"response_format": "json"
}
配置到 Claude Desktop
配置文件位置:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
方式 1: 使用 npm 包(推荐)
{
"mcpServers": {
"zentao": {
"command": "npx",
"args": ["-y", "@orange29233/zentao-mcp"],
"env": {
"ZENTAO_URL": "https://your-zentao-domain.com",
"ZENTAO_USERNAME": "your-username",
"ZENTAO_PASSWORD": "your-password",
"ZENTAO_DEFAULT_PROJECT": "1"
}
}
}
}
说明:
npx -y确保自动使用最新版本- 每次启动 Claude Desktop 时会自动检查更新
方式 2: 使用本地克隆(开发调试)
{
"mcpServers": {
"zentao": {
"command": "node",
"args": ["D:\\path\\to\\@orange29233/zentao-mcp\\dist\\index.js"],
"env": {
"ZENTAO_URL": "https://your-zentao-domain.com",
"ZENTAO_USERNAME": "your-username",
"ZENTAO_PASSWORD": "your-password",
"ZENTAO_DEFAULT_PROJECT": "1"
}
}
}
}
macOS 路径示例:
"args": ["/Users/yourname/projects/@orange29233/zentao-mcp/dist/index.js"]
说明: 请将路径替换为您实际的项目路径。
可用工具
zentao_list_projects
查询项目列表,支持可选的过滤条件。
参数:
limit: 返回结果的最大数量(默认: 20,范围: 1-100)offset: 分页偏移量(默认: 0)status: 按项目状态过滤(all/active/closed)
zentao_list_bugs
查询 Bug 列表,支持多维度过滤。
参数:
projectId: 项目 ID(如未指定则使用默认项目)status: 按状态过滤(all/active/resolved/closed)severity: 按严重程度过滤(1-严重,2-较严重,3-一般,4-轻微)priority: 按优先级过滤(1-高,2-中,3-低,4-最低)assignedTo: 按指派用户过滤openedBy: 按创建者过滤startDate: 创建日期范围起始(YYYY-MM-DD 格式)endDate: 创建日期范围结束(YYYY-MM-DD 格式)limit: 返回结果的最大数量(默认: 20,范围: 1-100)offset: 分页偏移量(默认: 0)orderBy: 排序方式(id_desc/id_asc/openedDate_desc/openedDate_asc/severity_desc/severity_asc)response_format: 输出格式(markdown/json,默认: markdown)
zentao_get_bug_details
根据 Bug ID 获取详细的 Bug 信息。
参数:
bugId: Bug ID(必需)response_format: 输出格式(markdown/json,默认: markdown)
API 端点映射
| 工具 | API 端点 | 说明 |
|---|---|---|
| zentao_list_projects | GET /api.php/v1/projects |
获取项目列表 |
| zentao_list_bugs | GET /api.php/v1/projects/:projectId/bugs |
获取项目 Bug 列表 |
| zentao_get_bug_details | GET /api.php/v1/bugs/:bugId |
获取 Bug 详情 |
| 认证 | POST /api.php/v1/tokens |
获取访问令牌 |
错误处理
服务器会针对不同错误类型提供清晰的错误消息:
认证错误
Error: AUTH_ERROR: Authentication failed.
Please check your username and password, or verify ZENTAO_URL is correct.
解决方法:
- 检查
.env文件中的用户名和密码是否正确 - 验证
ZENTAO_URL是否指向正确的禅道实例 - 确认账号没有被锁定或需要修改密码
网络错误
Error: NETWORK_ERROR: Cannot connect to Zentao server.
Please check network connection and ZENTAO_URL.
解决方法:
- 检查网络连接
- 验证
ZENTAO_URL格式是否正确(需要包含协议:https:// 或 http://) - 检查防火墙设置
参数错误
Error: INVALID_PARAMETER: Resource not found.
Please check the ID is correct.
解决方法:
- 使用
zentao_list_projects查看可用的项目 ID - 使用
zentao_list_bugs查看可用的 Bug ID - 检查日期格式是否为 YYYY-MM-DD
API 错误
Error: API_ERROR: API request failed with status 500
解决方法:
- 检查禅道服务器日志
- 确认用户账号有足够的权限
- 联系系统管理员
常见使用场景
场景 1:查看所有正在进行的项目
Tool: zentao_list_projects
Parameters: {
"status": "active",
"response_format": "markdown"
}
场景 2:查看某个项目的严重 Bug
Tool: zentao_list_bugs
Parameters: {
"projectId": 1,
"severity": "1",
"status": "active",
"response_format": "markdown"
}
场景 3:查看我创建的 Bug
Tool: zentao_list_bugs
Parameters: {
"projectId": 1,
"openedBy": "your-username",
"response_format": "markdown"
}
场景 4:查看某个 Bug 的详细信息
Tool: zentao_get_bug_details
Parameters: {
"bugId": 123,
"response_format": "markdown"
}
场景 5:导出 Bug 列表为 JSON(便于程序处理)
Tool: zentao_list_bugs
Parameters: {
"projectId": 1,
"limit": 100,
"response_format": "json"
}
调试技巧
启用详细日志
在 .env 文件中设置:
LOG_LEVEL=debug
查看日志
服务器会在 stderr 输出日志:
[INFO] Zentao MCP Server started successfully
[INFO] Connected to: https://your-zentao-domain.com
[INFO] Using username: your-username
[INFO] Default project ID: 1
[INFO] Token TTL: 3600 seconds
测试连接
手动测试 API 连接:
curl -X POST https://your-zentao-domain.com/api.php/v1/tokens \
-H "Content-Type: application/json" \
-d '{"account":"your-username","password":"your-password"}'
项目结构
| 文件 | 说明 |
|---|---|
src/index.ts |
MCP 服务器入口,配置和工具注册 |
src/types.ts |
TypeScript 类型定义 |
src/constants.ts |
常量和枚举定义 |
src/schemas/tool-input-schemas.ts |
Zod 输入验证 schema |
src/services/zentao-client.ts |
禅道 API 客户端,包含认证和请求逻辑 |
src/tools/projects.ts |
项目查询工具实现 |
src/tools/bugs.ts |
Bug 查询工具实现 |
dist/ |
编译输出目录 |
开发
# 安装依赖
npm install
# 开发模式运行
npm run dev
# 构建生产版本
npm run build
# 清理构建产物
npm run clean
故障排除
服务器启动失败
- 检查 Node.js 版本:
node --version(需要 >= 18) - 检查依赖是否安装:
npm list - 查看错误日志:
npm start 2>&1
工具调用失败
- 验证环境变量配置:
cat .env - 测试禅道 API 连接:使用 curl 或 Postman
- 启用调试日志:
LOG_LEVEL=debug npm start - 检查 Token 是否正确获取
类型错误
如果遇到类型错误,运行:
npm run build
清理并重新安装:
rm -rf node_modules package-lock.json dist
npm install
npm run build
提示
- Token 缓存:Token 会在内存中缓存 TTL_SECONDS 秒(默认 3600 秒)
- 分页:使用
offset和limit参数处理大量数据 - 格式选择:
markdown适合人类阅读,json适合程序处理 - 错误重试:网络错误时会自动重试
- 字符限制:大响应会被截断以保持响应在合理大小内(25,000 字符)
参考资料
许可证
MIT