zentao-mcp-server
This MCP server provides an interface to ZenTao for bug lifecycle management.
Authentication: Cached token management (
get_token).Project Discovery: List your projects (
list_my_projects).Bug Management:
Retrieve your bugs (
get_my_bugs) with filters (status, keyword, product/project/project-set IDs) and fallback across endpoints.Get bug details (
get_bug_detail) including activation history and sanitized image links.View full action history (
get_bug_actions).Resolve bugs individually (
resolve_bug) or in batch (batch_resolve_my_bugs) with required structuredsolutionModules(root cause, fix approach, logic change, impact) and optional build version.Close (
close_bug), verify (verify_bug), and comment (comment_bug, requiringsolutionModules).
Attachments: Upload (
upload_attachment) and download (download_attachment) files to/from bugs.Configuration: Set via environment variables (ZenTao URL, account, password, product/project scopes, API path adjustments).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zentao-mcp-serverlist my unresolved bugs"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
zentao-mcp-server(自建)
目标
提供一个可运行的 MCP Server(stdio),连接你的禅道 RESTful API v1。
最小功能:自动获取/缓存 Token + 常用 bug 工具。
Related MCP server: Zentao Bug MCP
非目标
不在仓库内存任何密钥/Token。
不暴露无边界的通用 REST 写接口。
不保证覆盖你禅道的全部 API;优先支持高频 bug 流程,再按你的流程补工具。
依赖
Node.js 18+(需要内置
fetch)
License
MIT - 详见 LICENSE 文件
配置
复制 .env.example 为 .env 并填写:
ZENTAO_BASE_URLZENTAO_ACCOUNTZENTAO_PASSWORD(可选)
ZENTAO_PRODUCT_ID:你的禅道实例若报Need product id时设置(可选)
ZENTAO_PROJECT_ID:按项目查 bug 时设置(直接/projects/{id}/bugs)(可选)
ZENTAO_PROJECT_SET_ID:你的 bug 若在项目集视角,设置项目集 ID(可选)
ZENTAO_DEFAULT_RESOLVED_BUILD:解决 bug 时的默认「解决版本」,默认trunk(很多实例必填)(可选)
ZENTAO_MY_BUGS_PATH:我的 bug 专用接口路径(如/my/bug)(可选)
ZENTAO_BUGS_FALLBACK_PATHS:bug 列表回退路径(逗号分隔)(可选)
ZENTAO_PROJECT_SET_BUGS_PATHS:项目集 bug 路径模板(支持{projectSetId})
注意:不同禅道版本/部署方式的 token 端点与返回结构可能不同;可通过
ZENTAO_TOKEN_PATH/ZENTAO_API_PREFIX调整。默认情况下不需要配置
ZENTAO_API_PREFIX(默认值是/api.php/v1)。安全约束:
ZENTAO_API_PREFIX/ZENTAO_TOKEN_PATH只支持相对路径;默认要求ZENTAO_BASE_URL使用 HTTPS。ZENTAO_BASE_URL可为根路径或子目录部署地址(如https://zentao.example.com/zentao)。
安装与运行
npm i
cp .env.example .env
npm startnpm 安装后的运行
发布到 npm 后,推荐用 npx 启动(适合 MCP 客户端配置):
npx -y @aipper/zentao-mcp-server验证(不依赖 MCP 客户端)
npm i
cp .env.example .env
set -a; source .env; set +a
npm run smoke期望结果:
输出一行
token: xxxx…yyyy source: ...输出
GET /projects status: 200(或你的禅道实际返回码)
Claude Desktop / Cursor 示例(stdio)
优先使用 npx(npm 发布版):
{
"mcpServers": {
"zentao": {
"command": "npx",
"args": ["-y", "@aipper/zentao-mcp-server"],
"env": {
"ZENTAO_BASE_URL": "https://zentao.example.com",
"ZENTAO_ACCOUNT": "your_account",
"ZENTAO_PASSWORD": "your_password"
}
}
}
}本地源码调试可继续用 node src/index.js:
示例(Claude Desktop 的 mcpServers 风格,按你的客户端实际字段为准):
{
"mcpServers": {
"zentao": {
"command": "node",
"args": ["src/index.js"],
"cwd": "/ABS/PATH/TO/zentao",
"env": {
"ZENTAO_BASE_URL": "https://zentao.example.com",
"ZENTAO_ACCOUNT": "your_account",
"ZENTAO_PASSWORD": "your_password"
}
}
}
}常见错误(-32000)
-32000 通常是客户端侧“通用 MCP 调用失败”映射码,优先检查:
env是否完整传入(尤其是ZENTAO_BASE_URL/ZENTAO_ACCOUNT/ZENTAO_PASSWORD)。默认要求 HTTPS;如果你的实例只能走 HTTP,必须显式设置
ZENTAO_ALLOW_INSECURE_HTTP=true,且只建议临时内网调试使用。若报
Need product id,请设置ZENTAO_PRODUCT_ID,或在get_my_bugs传productId。若你的 bug 在“项目集/我的视角”而非产品,建议设置
ZENTAO_PROJECT_SET_ID,并配置ZENTAO_MY_BUGS_PATH=/my/bug。项目集场景下,优先直接调用
get_my_bugs并传projectSetId,必要时再显式传path="/my/bug";不要先依赖list_my_projects找项目。有些项目集本身没有创建实际项目,但仍然存在“我的 bug”;这类数据可能不会出现在
list_my_projects结果里。get_my_bugs会按候选路径回退(包含项目集路径);即使首个路径返回空列表也会继续尝试,并会把多端点结果合并去重。get_my_bugs.total表示最终“我的 bug”总数;若需排查底层一共扫描了多少条,可看raw.scannedTotal。排查时看工具返回里的
raw.triedPaths/raw.paths,可确认每条路径的返回码与命中数量。ZENTAO_API_PREFIX/ZENTAO_TOKEN_PATH是否和你的禅道实例一致,且使用相对路径。MCP 客户端是否真的在执行
npx -y @aipper/zentao-mcp-server(而不是旧的本地命令)。客户端日志中是否有启动报错(如找不到命令、401、超时)。
已实现工具
get_token:获取/刷新 token(始终只回显脱敏后的 token 摘要)list_my_projects:示例:列出“我参与的项目”(字段匹配基于常见返回结构,可能需按你的实例微调;不适合作为项目集 bug 的唯一发现入口)get_my_bugs:获取“指派给我”的 bug(支持status/keyword/limit/page/productId/projectSetId,默认路径/bugs;path仅允许/bugs、/my/bug、/my/bugs)get_bug_detail:按id获取 bug 详情(固定读取/bugs/{id};返回安全裁剪后的 bug 摘要与同源图片链接,不直接透传外部图片地址或原始附件外链)。当 bug 被激活过时,额外返回activation摘要{count, lastActor, lastDate, lastComment},其中lastComment是最近一次激活时测试人员填写的评论(已去除 HTML)。bug 摘要现包含activatedCount/activatedDate。get_bug_actions:按id获取 bug 的动作历史(激活/解决/关闭/评论等)。同一/bugs/{id}端点,返回actions:[{id, actor, action, date, comment, history:[{field, old, new}]}](comment已去 HTML)和activation摘要。当 bug 被激活、需要拿到激活评论/字段变更明细时使用;get_bug_detail的activation.lastComment已覆盖"只看最近一次激活评论"的常见场景,需完整历史再用本工具。resolve_bug:按id调用真正的解决接口POST /bugs/{id}/resolve(默认resolution=fixed;resolvedBuild默认取ZENTAO_DEFAULT_RESOLVED_BUILD/trunk;优先solutionModules,兼容纯文本solution)batch_resolve_my_bugs:批量解决“我的 bug”(同上 resolve API;默认筛选status=active,支持productId/projectSetId/resolvedBuild,默认遇错即停,maxItems上限 100;优先共享solutionModules)close_bug:按id关闭 bugverify_bug:验证结果处理(pass=关闭,fail=激活)comment_bug:按id添加备注
结构化解决说明 solutionModules(推荐)
字段:
rootCause:【根因】触发条件 + 错误行为fixApproach:【修复思路】策略说明logicChange:【改动逻辑】关键分支/校验/流程变化impact:【影响范围】受影响场景 + 结果型回归点
服务端会格式化为多行文本写入禅道,例如:
【根因】
...
【修复思路】
...
【改动逻辑】
...
【影响范围】
...优先级:solutionModules(任一非空字段)> 纯文本 solution > comment 兜底。
解决版本 resolvedBuild:很多禅道实例校验「解决版本不能为空」。请传工具参数 resolvedBuild,或配置 ZENTAO_DEFAULT_RESOLVED_BUILD(默认 trunk)。无版本列表时 trunk 通常可用。
不要用 HTTP 编辑冒充解决:PUT /bugs/{id} 或网页表单“编辑”只可能改字段/状态,不会走 resolve 动作,也不会把 MCP 的 solutionModules 模板写进解决说明。必须用 resolve_bug / batch_resolve_my_bugs。
示例参数:
resolve_bug(推荐):
{
"id": 123,
"resolution": "fixed",
"resolvedBuild": "trunk",
"solutionModules": {
"rootCause": "分页参数为空时仍进入查询构造,导致列表请求异常。",
"fixApproach": "为空参数补默认值,并在构造前做兜底校验。",
"logicChange": "page/size 为空时回落默认值;非法值改为明确错误提示,避免前端重复提交。",
"impact": "列表查询与分页切换;重点回归空参进入与异常提示是否收敛。"
}
}resolve_bug(兼容纯文本):{"id":123,"resolution":"fixed","resolvedBuild":"trunk","solution":"补齐分页参数为空时的默认值分支,避免空值继续进入查询构造;同时收敛异常提示,防止前端重复触发提交"}batch_resolve_my_bugs(推荐共享模块):
{
"status": "active",
"maxItems": 20,
"resolvedBuild": "trunk",
"solutionModules": {
"rootCause": "状态切换时旧数据判空顺序错误,触发空指针。",
"fixApproach": "统一状态切换的判空与分支顺序。",
"logicChange": "保存前增加兜底校验;异常改为明确提示而非静默失败。",
"impact": "状态流转相关保存与切换场景。"
}
}get_my_bugs(项目集):{"status":"active","projectSetId":1001,"limit":50}get_my_bugs(我的):{"status":"active","path":"/my/bug","limit":50}get_my_bugs(项目集 + 我的):{"status":"active","projectSetId":1001,"path":"/my/bug","limit":50}get_my_bugs(按产品):{"status":"active","productId":1,"limit":50}close_bug:{"id":123,"comment":"验证通过,关闭"}verify_bug:{"id":123,"result":"pass","comment":"验证通过"}comment_bug:{"id":123,"comment":"已复现,正在定位根因"}
solutionModules / solution / comment 不要写 Evidence:、Verify:、文件路径、编译命令或“已修复并自测”这类无法说明改动内容的表述。
使用建议:如果用户提到“项目集”“我的 bug”“项目列表里找不到但禅道里能看到 bug”,优先走项目集视角的 get_my_bugs,不要先让用户证明项目已创建。
安全建议
默认要求使用 HTTPS:HTTP 会明文传输账号密码和数据,存在安全风险;如确需兼容老旧实例,需显式设置
ZENTAO_ALLOW_INSECURE_HTTP=true。使用最小权限账号(仅需要的项目权限),避免使用管理员账号。
get_token不再支持回显完整 token。调试日志会自动脱敏
query、body、comment、solution等敏感字段,但仍建议仅在排查问题时临时开启。
调试
如需查看详细日志,可设置环境变量:
ZENTAO_DEBUG=true npx -y @aipper/zentao-mcp-server日志会输出到 stderr,不影响 MCP 协议通信。
发布到 npm
脚本:scripts/release-npm.sh(参考 aiws 的发布流程,默认 dry-run)。
常用命令:
# dry-run:只检查 + npm pack --dry-run,不会发布
npm run release:npm
# 自动递增版本(patch/minor/major)+ commit + tag(不发布)
npm run release:npm -- --bump patch
# 发布(会二次确认;默认自动 patch 递增)
npm run release:npm -- --publish
# 版本对齐 + commit + tag(不发布)
npm run release:npm -- --release v0.1.0注意:
若
package.json为private: true,发布前请改成false并确认包名可用。可加
--require-tag要求 HEAD 上有匹配版本的 tag。若发布时报
403,通常是包名归属问题;建议改为 scoped 包名(如@yourname/zentao-mcp-server)。
Available Tools
11 toolsbatch_resolve_my_bugsA
Batch resolve my bugs via the real resolve API (default status=active, resolution=fixed). REQUIRES shared non-empty solutionModules {rootCause, fixApproach, logicChange, impact} — without it the batch will REJECT with an error. Plain comment/solution is no longer accepted. Requires resolvedBuild or ZENTAO_DEFAULT_RESOLVED_BUILD on instances that validate 解决版本. Prefer projectSetId or /my/bug for project-set scope.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Default 1 | |
| path | No | Optional safe list path override. Allowed values: /bugs, /my/bug, /my/bugs. | |
| limit | No | List page size, default 50 | |
| status | No | Default active | |
| comment | No | IGNORED for resolve — only solutionModules is accepted. This field only appends plain text to the action record if solutionModules is also present. | |
| keyword | No | Optional keyword filter before resolve | |
| maxItems | No | Max resolve count, default 20 | |
| solution | No | IGNORED for resolve — only solutionModules is accepted. This field is kept for backward compatibility only. | |
| productId | No | Optional product id (for instances requiring product scope) | |
| projectId | No | Optional project id. Directly query /projects/{id}/bugs, no cross-project merge. | |
| resolution | No | Default fixed | |
| stopOnError | No | Default true; stop on first resolve failure | |
| projectSetId | No | Optional project-set id. Prefer this for project-set bugs, especially when the project set has no concrete project entries. | |
| resolvedBuild | No | Shared 解决版本 for the batch. Falls back to ZENTAO_DEFAULT_RESOLVED_BUILD. Common value: trunk | |
| solutionModules | No | REQUIRED — resolve WILL REJECT without it. Shared structured solution for the batch. Server formats into multi-line text with 【根因】【修复思路】【改动逻辑】【影响范围】. Write common root cause and shared logic changes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries behavioral disclosure. It explains that solutionModules is required and will reject if missing, that comment is ignored for resolve, that stopOnError is true by default, and fallback to env var. It is transparent about defaults and field priorities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately concise, front-loading the main purpose and key requirements. It uses bullet-like phrasing but could be more streamlined. Every sentence adds value, though some details like 'Prefer projectSetId...' could be integrated elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (15 params, nested object), the description covers input constraints well but misses output details. No output schema, so description should hint at what the batch resolve returns (list of results/errors). This gap prevents a higher score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3. Description adds value beyond schema by clarifying that comment and solution are ignored for resolve, and that solutionModules is structured with server-side formatting. This extra context elevates the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Batch resolve my bugs via the real resolve API', specifying verb, resource, and batch nature. It distinguishes from sibling tools like resolve_bug (singular) by the batch approach and mentions default status and resolution.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides requirements (solutionModules, resolvedBuild) and scope preferences (projectSetId / /my/bug), but does not explicitly contrast with alternatives like resolve_bug. It lacks explicit 'when to use' vs 'when not to use' guidance, relying on the name for context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
close_bugC
Close one bug by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bug ID | |
| comment | No | Optional close comment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fails to disclose important behavioral traits such as whether closing is irreversible, what permissions are needed, side effects (e.g., notifications), or the resulting state of the bug.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise at only 4 words, but it omits necessary details. While front-loaded, it sacrifices completeness for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, no annotations, and 2 parameters, the description is incomplete. It does not explain return values, side effects, or how this tool fits with siblings like resolve_bug.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds minimal value beyond the schema. It reinforces the id parameter but does not explain the comment parameter's usage or any constraints beyond type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (close), resource (bug), and identification method (by ID). It is specific and distinguishes from most siblings, but does not differentiate from the similar-sounding resolve_bug, which could cause confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like resolve_bug or batch_resolve_my_bugs. There is no mention of prerequisites, context, or conditions for closing a bug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comment_bugA
Add comment to one bug by ID. REQUIRES solutionModules {rootCause, fixApproach, logicChange, impact} — server auto-formats into 【根因】【修复思路】【改动逻辑】【影响范围】 multi-line template text. Plain comment without solutionModules is no longer accepted.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bug ID | |
| comment | No | IGNORED for writing — only solutionModules is accepted. Kept for backward compatibility only. | |
| solutionModules | No | REQUIRED — comment will REJECT without it. Structured solution. Server auto-formats into multi-line 【根因】【修复思路】【改动逻辑】【影响范围】 template text. At least one field must be non-empty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that solutionModules is required and auto-formatted, and that the comment field is ignored. No annotations provided, so description carries full burden; lacks info on whether comment appends or replaces.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences plus a list, bolded key terms. Every sentence adds value; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with nested object and no output schema, description explains auto-formatting template. Missing explicit return value, but sufficient for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and description adds significant meaning: clarifies 'comment' is ignored, explains solutionModules fields with good/bad examples, and specifies rejection behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Add comment to one bug by ID', specifying verb, resource, and key requirement (solutionModules). Distinguishes from siblings like resolve_bug and close_bug.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states that plain comment without solutionModules is rejected and that 'comment' parameter is ignored. Provides clear when-to-use context, though no direct sibling comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentA
Download a file/attachment from ZenTao by fileID and save to local disk. Uses API Token auth. Returns saved path and file size.
| Name | Required | Description | Default |
|---|---|---|---|
| fileId | Yes | File ID from bug detail attachments/files list | |
| savePath | Yes | Absolute path to save the downloaded file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It mentions API Token auth and return values (saved path, file size), which adds useful context beyond the schema. However, it omits details like file overwrite behavior, error handling, or required directory existence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the core purpose, and includes essential details (auth, return info) without extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has only 2 parameters, no output schema, and no annotations, the description adequately covers the core functionality and auth method. However, it lacks guidance on error scenarios, permissions, or whether the savePath must pre-exist, leaving gaps for a complete understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds no extra meaning beyond what the schema provides, meeting the baseline for this case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (download), resource (file/attachment from ZenTao), and the key parameter (fileID) with the target (save to local disk). It uniquely distinguishes itself from siblings like 'upload_attachment'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not specify when to use this tool versus alternatives, nor does it mention prerequisites or exclusions. The usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bug_detailA
Get bug detail by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bug ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavior. It only says 'get bug detail' without mentioning what is returned, rate limits, or authentication. For a read operation, it is insufficiently transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description uses one short, clear sentence with no fluff. It is appropriately concise for a simple retrieval tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple structure (1 param, no output schema), the description is adequate but lacks details on the response format. With siblings like 'verify_bug', more context on what 'detail' includes would be helpful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the parameter 'id' is already described as 'Bug ID' in the schema. The description just reiterates 'by ID', adding no extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get bug detail by ID', which is a specific verb and resource. It distinguishes from sibling tools like 'get_my_bugs' (list) and 'resolve_bug' (mutate).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when a specific bug ID is known, but no explicit guidance on when to use alternatives (e.g., 'get_my_bugs' for listing) or when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_bugsA
List bugs assigned to me (supports status/keyword/limit/page filter). For project-set scope, prefer projectSetId or /my/bug instead of relying on list_my_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Default 1 | |
| path | No | Optional safe list path override. Allowed values: /bugs, /my/bug, /my/bugs. | |
| limit | No | Default 20, max 200 | |
| status | No | Optional status filter, e.g. active/resolved/closed | |
| keyword | No | Optional keyword in title/steps/severity/pri | |
| productId | No | Optional product id (for instances requiring product scope) | |
| projectId | No | Optional project id. Directly query /projects/{id}/bugs, no cross-project merge. | |
| projectSetId | No | Optional project-set id. Prefer this when bugs are under project-set scope, especially if no concrete project exists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states the tool lists bugs and supports filters, but fails to mention authentication, rate limits, read-only nature, error handling, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is extremely concise with two sentences, front-loading the main action and purpose, and including only essential guidance without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema and no annotations, the description covers core functionality and parameter relationships but lacks details on return format, pagination behavior, or error scenarios. It is minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by summarizing key filters and providing guidance on when to use projectSetId or alternative path, improving parameter semantics beyond schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists bugs assigned to the user and mentions supported filters (status, keyword, limit, page), distinguishing it from sibling tools like list_my_projects or get_bug_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description advises to prefer projectSetId or '/my/bug' over list_my_projects when dealing with project-set scope, providing helpful usage context. However, it does not explicitly compare with other sibling tools like resolve_bug or close_bug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tokenB
Get or refresh ZenTao API token (cached).
| Name | Required | Description | Default |
|---|---|---|---|
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description carries full burden. Only 'cached' is disclosed. Missing information on whether the operation is destructive, side effects of force, token expiration, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that is front-loaded and to the point, with no unnecessary content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description is insufficient: it omits parameter behavior, caching details, and any usage context beyond the basic function.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and description does not mention parameter 'force'. The agent has no guidance on what the boolean does, leading to potential misuse.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it gets or refreshes a ZenTao API token, noting caching. This is specific and distinct from sibling tools (bug/project tools).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use or alternatives, but no similar sibling tools exist. The description implies usage when a token is needed, but could be more explicit about prerequisites or scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_projectsC
List projects I participate in (heuristic filtering). Not reliable for project-set-only bugs when the project set has no concrete projects.
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions 'heuristic filtering' and a specific unreliability case, which adds transparency, but does not disclose authentication needs, rate limits, or detailed behavior beyond that caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundancy. The main action is front-loaded, and the caveat follows immediately. Every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, no output schema, and no annotations, the description leaves significant gaps. It covers purpose and one usage caveat, but lacks parameter documentation and broader behavioral details, making it insufficient for confident use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not mention the single 'keyword' parameter at all. With 0% schema description coverage, the description fails to explain what the parameter does or how to use it, leaving the agent without necessary guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (list projects) and the scope (I participate in) with a specific qualifier (heuristic filtering). It differentiates from sibling tools which focus on bugs. However, 'heuristic filtering' is somewhat vague.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a negative usage guideline (not reliable for certain project sets) but lacks explicit when-to-use instructions or alternatives. It hints at limitations but does not compare to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_bugA
Resolve one bug by ID via POST /bugs/{id}/resolve. REQUIREs non-empty solutionModules {rootCause, fixApproach, logicChange, impact} — without it the resolve call will REJECT with an error. Plain comment/solution is no longer accepted. Many instances require resolvedBuild (解决版本); pass it or set ZENTAO_DEFAULT_RESOLVED_BUILD (e.g. trunk). Do NOT use raw HTTP PUT/edit as a resolve substitute — it only flips status without writing solution text.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bug ID | |
| comment | No | IGNORED for resolve — only solutionModules is accepted. This field only appends plain text to the action record if solutionModules is also present. | |
| solution | No | IGNORED for resolve — only solutionModules is accepted. This field is kept for backward compatibility only. | |
| resolution | No | Default fixed | |
| resolvedBuild | No | 解决版本 (required by many instances). Falls back to ZENTAO_DEFAULT_RESOLVED_BUILD. Common value: trunk | |
| solutionModules | No | REQUIRED — resolve WILL REJECT without it. Structured solution object. Server formats into multi-line text with 【根因】【修复思路】【改动逻辑】【影响范围】. At least one field must be non-empty. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that solutionModules is required and the call will reject without it. Explains that comment and solution fields are ignored or only appended conditionally. Describes server-side formatting. With no annotations, the description carries the full burden and does so well, though return behavior is not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (3 sentences) and front-loaded with the verb and endpoint. It packs essential information without redundancy, though it could benefit from bullet points for clarity. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, nested object, ignored fields), the description covers key aspects: required modules, ignored fields, fallback for build, and misuse warning. Missing return value details and error scenarios, but output schema is absent and annotations are lacking, so the description does a good job overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value by clarifying that comment and solution are ignored for resolution, explaining the fallback for resolvedBuild, and providing GOOD/BAD examples for solutionModules fields. This goes well beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the exact action ('Resolve one bug by ID via POST /bugs/{id}/resolve'), clearly identifying the verb, resource, and HTTP method. It distinguishes from sibling tools like close_bug and batch_resolve_my_bugs by focusing on single bug resolution with structured solutionModules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool (for proper resolution with solutionModules) and warns against using HTTP PUT/edit as a substitute. Mentions required fields and fallback for resolvedBuild. However, it could be more explicit about when to use this versus sibling tools like batch_resolve_my_bugs or close_bug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_attachmentA
Upload a file (screenshot, log) and attach to a bug as visual evidence. Use after bug fix to provide screenshot proof.
| Name | Required | Description | Default |
|---|---|---|---|
| bugId | Yes | Bug ID to attach to | |
| fileName | No | Optional display name (defaults to file basename) | |
| filePath | Yes | Absolute path to file on disk |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully disclose behavioral traits. However, it does not mention file size limits, format constraints, overwrite behavior, permission requirements, or side effects. The description only states the basic action, leaving the agent uninformed about important execution details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first defines the action, the second provides usage guidance. No extraneous words; adequately front-loaded. Efficient and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (upload + attach), but the description omits return value (e.g., attachment ID), error scenarios, and any constraints (e.g., file size, type restrictions). Given the lack of an output schema and annotations, the description is somewhat incomplete for a fully informed agent decision. Still, core purpose is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds context ('screenshot, log', 'after bug fix') but does not provide extra meaning for the parameters beyond what the schema already gives (e.g., no explanation of what happens if filePath is invalid or the effect of fileName). Neutral contribution.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action (upload a file, attach to bug), specifies typical file types (screenshot, log), and sets the context (visual evidence). Unambiguous and distinct from siblings like download_attachment or comment_bug.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a specific use case: 'Use after bug fix to provide screenshot proof.' This gives clear when-to-use guidance, though it does not explicitly mention when not to use or compare to alternatives. Still helpful for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_bugA
Verify bug result: pass -> close, fail -> activate.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Bug ID | |
| result | No | pass or fail, default pass | |
| comment | No | Optional verification comment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses core behavior: 'pass -> close, fail -> activate'. However, it does not mention permissions, state prerequisites, or irreversibility, which would be expected for a state-changing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise single sentence that is front-loaded with the tool's action. No extraneous words; every word serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description covers the core logic but lacks context on when to use it versus sibling tools (e.g., close_bug) and does not specify prerequisites (e.g., bug state). For a simple tool with complete schema, it is marginally adequate but not fully comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions. The description adds value by linking the result parameter to the outcome (close or activate), which is not explicitly in the schema. This enhances understanding of the parameter's impact.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states verb 'verify' and resource 'bug result', and specifies behavior based on outcome. This distinguishes it from sibling tools like close_bug and resolve_bug by focusing on verification, not just closing or resolving.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies usage for verifying bug results, but does not explicitly state when to use this tool versus alternatives like close_bug or comment_bug. There are no when-not or alternative references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.24- First observed
batch_resolve_my_bugs - First observed
close_bug - First observed
comment_bug - First observed
download_attachment - First observed
get_bug_detail - First observed
get_my_bugs - First observed
get_token - First observed
list_my_projects - First observed
resolve_bug - First observed
upload_attachment - First observed
verify_bug
TDQS
Scored across 11 tools
Each tool targets a distinct operation: listing projects, listing bugs, detail, resolve (single/batch), close, verify, comment, upload/download attachments, and token management. Even with overlapping operations like resolve vs batch resolve, the single vs batch scopes are clearly separated by descriptions.
All tools follow a consistent verb_noun snake_case pattern (e.g., list_my_projects, resolve_bug, upload_attachment). The naming is predictable and clear, with no mixed conventions.
With 11 tools, the server is well-scoped for a bug tracking domain. Each tool serves a specific purpose without redundancy, covering core operations like listing, resolving, commenting, and file attachments.
The tool set is incomplete for a full bug lifecycle. Missing essential tools: create_bug, update_bug (general-purpose), delete_bug, and search bugs beyond 'my bugs'. The list_my_projects tool is noted as unreliable, and there is no tool to list all bugs or manage other entities like users or products.
Maintenance
Related MCP Connectors
An MCP server that provides access to Testiny projects, test cases and test runs
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
A Model Context Protocol (MCP) server for Selise Blocks Cloud integration
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA server implementation of the Model Context Protocol (MCP) for managing development workflow with features like project management, task tracking, and QA review support.3AGPL 3.0
- AlicenseAqualityBmaintenanceMCP server for Zentao that reads bugs, extracts reproduction steps, and allows AI to update bug status after fixing.721 npm5MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server that integrates with Zentao API to provide tools for accessing tasks, bugs, and attachments from project management.2,469 npm-
- AlicenseDqualityCmaintenanceAn MCP server that enables reading and managing Zentao tasks, bugs, requirements, test cases, and test suites via the ZenTao 11.3 Legacy Session API. It integrates with MCP clients like Codex, Claude Desktop, and Cursor.4811 npmMIT