jira-mcp
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., "@jira-mcplist my open issues assigned to me"
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.
@mohou/jira-mcp
自托管 Jira Server / Data Center 的 MCP server。为一个具体约束而做:Jira 8.5.7 没有 Personal Access Token(PAT 从 8.14 才有),所以认证必须走 Basic Auth;而实例上插件多、自定义字段多,固定工具面覆盖不了。
跑起来是一个进程、一个 MCP server、109 个工具:
55 jira_* 核心实体(issue / comment / worklog / attachment / project / user
/ link / watcher / meta / agile)
54 zephyr * Zephyr Scale(测试用例 / 文件夹 / 测试循环 / 执行 / 测试计划 / 附件 / 自动化结果)Node >= 22.6关于构建:从 GitHub 克隆下来不需要构建 —— 源码直接跑(Node 原生类型擦除)。但从 npm 装下来的包带的是
dist/jira-server.mjs单文件 bundle:Node 不允许擦除node_modules里.ts的类型 (ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING),所以发布物必须是编译后的 JS。bin/jira-server.mjs按磁盘上有什么来选:有src/就用源码(检出目录绝不会跑到过期的构建产物),否则用 bundle。
从 npm 安装
npx @mohou/jira-mcp # 或 npm i -g @mohou/jira-mcp{
"mcpServers": {
"jira": {
"command": "npx",
"args": ["-y", "@mohou/jira-mcp"],
"env": {
"JIRA_BASE_URL": "https://jira.corp.com",
"JIRA_USERNAME": "your.name",
"JIRA_PASSWORD": "***",
"ZEPHYR_ALLOW_INTERNAL_API": "true"
}
}
}
}Related MCP server: jira-mcp
从源码运行
npm install
JIRA_BASE_URL=https://jira.corp.com \
JIRA_USERNAME=your.name JIRA_PASSWORD='***' \
ZEPHYR_ALLOW_INTERNAL_API=true \
npm start入口是 bin/jira-server.mjs(纯 JS 的版本守卫):Node 低于 22.6 会直接给出可读报错,而不是从 TypeScript 里抛一个语法错误。
接入任意 MCP 客户端:
{
"mcpServers": {
"jira": {
"command": "/absolute/path/to/node",
"args": ["/absolute/path/to/jira-mcp/bin/jira-server.mjs"],
"env": {
"JIRA_BASE_URL": "https://jira.corp.com",
"JIRA_USERNAME": "your.name",
"JIRA_PASSWORD": "***",
"ZEPHYR_ALLOW_INTERNAL_API": "true"
}
}
}
}环境变量
变量 | 默认 | 说明 |
| — | 必填 |
| — | 8.5.7 走这条(Basic Auth) |
| — | 8.14+ 才可用;设了就用 Bearer |
| 按上面的变量推断 |
|
|
| 统一只读开关,同时约束核心工具和 Zephyr |
|
| 自签证书设 |
|
| 单次请求超时 |
|
| 对 429/502/503/504 与网络错误的重试次数(尊重 |
|
| 别名文件路径,可指向外部 |
|
|
|
|
| 开启后多 12 个工具(见下) |
| — | Zephyr 工具的默认项目 |
错误信息是可执行的
失败的返回不是裸状态码,而是带着下一步动作:
400 Field 'customfield_20001' cannot be set. It is not on the appropriate screen...
→ 字段 'customfield_20001' 不在该项目/类型的 Screen 上,或字段名不存在。
先用 jira_describe_create / jira_describe_edit 查看当前真正可填的字段。
401 → 认证失败。若该账号走 SSO/Crowd 且无本地密码,或实例开启了 CAPTCHA,Basic Auth 不可用。
404(插件路径) → 路径不存在。若这是插件接口,先确认插件已安装(可调 jira_list_plugins)。为什么这样设计
1. 字段知识是运行时数据,不是代码
customfield_20001 在你们实例里是"部门"、值是 {"id":"10101"},在别人实例里是别的字段。把它写进代码就锁死了 —— 这正是大多数现成 MCP server 的死法。
所以写接口一律 fields 原样透传,字段的形状由两个"填空题"工具在运行时从 Jira 读出来:
jira_describe_create(project, type) → 创建时可填的字段 + 取值形态 + 可选值 + 必填性
jira_describe_edit(issueKey) → 这个 issue 当前能改什么(已按工作流/屏幕过滤)模型看到的实际输出:
项目 PROJ / 类型 Task — 创建时可填 可填 5 个字段(必填 2)
必填:
summary string → "文本"
customfield_20001(部门) option → {"id":"..."} 可选项: 平台组(10101) | 基础架构组(10102)
选填:
assignee user → {"name":"username"} 可选项: alice(alice)
customfield_20002(上线日期) date → "2026-01-01"
按上面的形态填好后调用: jira_create_issue({ fields: {...} })写不进去的字段(attachment、issuelink 等)会被过滤掉,模型不用撞 400。管理员改字段、插件加字段,模板自动跟随,零代码改动。
2. 三层各管一件事,互不越界
层 | 管什么 | 例子 |
| 参数的形状和用法 |
|
| 有哪些工具、打哪个端点 | Tempo 的 |
Jira meta 接口 | 字段有哪些、值怎么填 |
|
types.ts 里的 .describe() 直接进模型看到的 JSON Schema,所以"Server 用 name"这类坑写一次,所有引用它的工具都自动获得正确提示。
3. 入参有类型,返回值也有
入参侧是 src/types.ts 的 T,返回值侧是对称的 src/entity-types.ts 的 E —— issue、comment、worklog、attachment、project、user、serverInfo、paged,以及 testCase / testRun / testResult。
jira_get_issue: defineTool({
readOnly: true, returns: E.issue, // ← 声明后成为 MCP outputSchema,并返回 structuredContent
input: { key: T.issueKey, fields: T.fieldIds.optional() },
run: ({ key, fields }) => jira('GET', `/issue/${key}`, { query: { fields: fields?.join(',') ?? '*all' } }),
}),只声明信封,不声明业务字段。 Jira 的响应字段随实例、插件、版本变化,所以实体类型用 .passthrough() 并只固定稳定部分(id / key / 数组字段名):
// jira_get_issue 的 outputSchema(模型实际看到的)
{ "type": "object", "required": ["id", "key", "fields"],
"properties": { "id": {...}, "key": {...}, "fields": {"description": "...customfield_xxxxx..."} },
"additionalProperties": true } // ← 未声明的字段必须放行两条硬约束(踩过才知道):
约束 | 原因 |
204 类工具不声明 | update/delete/assign/transition 返回空响应,而声明了 outputSchema 就必须给 structuredContent —— 空 body 会让 MCP 结果校验直接失败 |
数组根的工具不声明 | MCP 要求 outputSchema 的对象根; |
当前 109 个工具里 25 个带 outputSchema(我们的核心工具)。Zephyr 的 54 个来自 vendored 上游代码,自带 zod 校验与契约测试,其返回形状随实例变化,所以只在 E 里登记信封、不强加到上游工具上。
4. 8.5.7 兼容性有测试守着
Server 8.5.7 只有 REST API v2(加 Agile 1.0),/rest/api/3 在它上面不存在。test/compat.test.mjs 三道断言守住这条:
src/里没有任何文件引用/rest/api/3tools.d/*.json里没有跑一遍全部工具(读 + 写),断言 mock 收到的每一个请求路径都落在
/rest/api/2/、/rest/agile/1.0/或已声明的插件前缀里
第 3 条上线当天就抓出了一个真 bug:附件上传绕过了路径解析,POST 到了 /issue/... 而不是 /rest/api/2/issue/...。
扩展
加一个工具(代码)
// src/entities/worklog.ts
jira_list_worklogs: defineTool({
readOnly: true, desc: '列 issue 工时',
input: { key: T.issueKey },
run: ({ key }) => jira('GET', `/issue/${key}/worklog`),
}),run 返回对象 → 自动 JSON 化;返回字符串 → 原样给模型;抛异常 → 变成 isError。没有别的约定。
加一个实体
新建 src/entities/xxx.ts 导出一个普通对象,在 src/entities/index.ts 数组合里加一行。
加一个插件(JSON,不用改代码)
// tools.d/plugins.json
"jira_tempo_worklogs": {
"desc": "查 Tempo 工时",
"readOnly": true,
"params": { "from": "string", "to": "string", "projectKey": "projectKey" }, // ← 引用类型注册表
"required": ["from", "to"],
"method": "GET",
"path": "/rest/tempo-timesheets/4/worklogs",
"query": { "from": "{from}", "to": "{to}" }
}"{x}" 整串占位 → 原样传值(保留类型);"a{x}b" → 字符串插值。JSON 里定义的工具会覆盖代码里的同名工具(后覆盖前)。
声明还支持 returns:引用 src/entity-types.ts 里的实体名(例如 "returns": "paged"),声明后 JSON 工具也会带 outputSchema 并返回 structuredContent——和代码里声明的工具完全一致。形状未知时用 anyObject(MCP 要求对象根,这是最宽松且诚实的声明)。
完整的 DSL 参考、校验规则、以及"怎么找到插件的 REST 路径"写在 tools.d/README.md;tools.d/examples/ 里有可复制的模板(该目录不会被自动加载,有测试守着)。
不确定插件端点时,先探一遍(只发 GET,不写任何数据):
JIRA_BASE_URL=... JIRA_USERNAME=... JIRA_PASSWORD=... npm run probe:paths
# 或指定路径:
JIRA_BASE_URL=... ... node scripts/probe-paths.mjs /rest/myplugin/1.0/thing它对 Tempo / ScriptRunner / JSM / Zephyr Scale / Xray / Zephyr Squad / Structure / Insight 的常见路径逐个报告状态码:404 是没有,405 是路径存在但方法不对(脚本会自动补一次 POST),200 是可用的。把输出贴回来就能把可用的那些写成 tools.d/ 声明。
加一个类型
在 src/types.ts 的 T 里加一项,代码和 JSON 立刻都能引用。
逃生口
装了没适配的插件,直接打它的 REST:
jira_request({ method: 'POST', path: '/rest/scriptrunner/latest/custom/foo', body: {...} })/rest/ 开头的路径原样透传,不会被拼成 /rest/api/2/rest/...。
Zephyr Scale
Zephyr 是 vendored 进来的(不是依赖 npm 包),代码在 src/entities/zephyr/,注册到同一个 server。见 NOTICE.md。
默认 42 个工具;
ZEPHYR_ALLOW_INTERNAL_API=true再挂 12 个(/rest/tests/1.0内部 API)覆盖测试用例、文件夹、测试循环、执行结果、测试计划、附件、自动化/Cucumber 结果导入、BDD feature 导出
为什么不用 JSON 声明 Zephyr:它的关键操作不是"一次 REST 调用" ——
测试循环不可变(要建新循环再搬结果)、测试步骤要按 id 读-合并-写(否则静默丢步骤)、状态名大小写敏感且公开 API 不暴露、executedBy 要 Jira user key 而不是用户名。用 JSON 只能写出一个看起来完整、实际会静默失败的子集。
测试
npm run tools:describe # 列出每个工具的输入/输出 schema 结构;--json 看完整 schema,用于检查插件声明
npm test # 离线契约 + 传输层测试(mock Jira,无网络)
npm run verify:vendor # 用上游 Zephyr 自己的测试套件验证 vendoring 没改坏行为
npm run verify:live # 对真实实例逐工具验证
npm run probe:paths # 探测候选插件端点
npm run capture:instance # 抓取真实实例的完整层级结构,用于扩展 schemanpm test 里有一条不变量测试(test/descriptions.test.mjs):任何工具、任何入参、任何输出字段缺 description,或 schema 里出现 $ref,都会失败。这不是洁癖 —— $ref 在不解析它的客户端里等于"没有类型",而模型的工具调用全靠这些描述。
verify:vendor 从上游 pinned commit 拉干净源码,换成我们的 vendored 版本跑它的测试套件。当前结果 17 个测试文件全绿、1175 个用例通过、0 失败(跳过 2 个依赖未 vendoring 的打包文件)。详见 NOTICE.md。
verify:live 默认只调用只读工具(readOnlyHint=true),不产生任何写入,可以安全地对生产实例跑:
JIRA_BASE_URL=https://jira.corp.com JIRA_USERNAME=... JIRA_PASSWORD=... \
ZEPHYR_ALLOW_INTERNAL_API=true npm run verify:live它会先探测版本和连通性,然后自动发现真实取值(项目 key、issue key、board id、sprint id),再逐个验证只读工具,最后写出 verify-report.md。
写操作验证是可选的,而且要过两道闸(test/verify-writes.mjs):
VERIFY_WRITE=1 VERIFY_PROJECT=PROJ \
JIRA_BASE_URL=... JIRA_USERNAME=... JIRA_PASSWORD=... npm run verify:live必须同时给
VERIFY_PROJECT,没有默认值 —— 打错字不会写到别的项目去全部操作发生在一个新建的探针 issue 上,最后在
finally里删掉:创建/更新/指派、评论增改删、工时加删、watcher 加删、附件上传删除、remote link 创建、状态流转唯一触及外部对象的动作是 link 到已有 issue,随后立即删除该 link(那个 issue 本身不被修改)
当前对 mock 的端到端结果:39 通过 / 0 失败 / 15 跳过(只读)+ 写阶段 25 步全通。
"跳过"通常是插件没装或需要真实测试数据,不代表实现有问题。 运行前会先做一轮发现:当前用户、项目、issue、附件 id、JSM 服务台 id、Zephyr 的用例/循环/计划 key、board、sprint。这些 id 决定了有多少工具能被真正验证——发现逻辑抽在 test/discover.mjs 里并有独立测试,因为一旦它退化,验证覆盖面会静默缩水。
观察 Zephyr 的输出契约
Zephyr 那 54 个工具来自 vendored 上游代码,返回的是文本块里的 JSON(content[0].text),既没有 structuredContent 也没有 outputSchema。想给它们挂 schema,必须先知道每个工具真实返回什么 —— 因为一旦声明了 outputSchema,SDK 就要求每次成功调用都交出匹配的 structuredContent,形状不符会直接抛错(server/mcp.js 里就是 throw new McpError(...)),把一个本来能用的工具变成坏的工具。裸数组返回更是结构上就不可能(必须以对象为根)。
ZEPHYR_OUTPUT_CHECKS=1 是为这件事准备的只观察模式:每次成功调用后,把返回按该工具映射的实体做一次 safeParse,结果写到 stderr。它不改变任何返回值;不设这个变量时包装器根本不安装。
ZEPHYR_OUTPUT_CHECKS=1 npm run verify:live[zephyr-output] ok get_test_case -> E.testCase (object)
[zephyr-output] ok get_custom_field_definitions -> E.customFieldDefinition (array(2 items) all match)
[zephyr-output] MISMATCH some_tool -> E.testResult: id: Expected number, received stringMISMATCH 说明那个映射(或那个实体)不对 —— 在搞清楚之前不要给它挂 outputSchema。映射表在 src/entities/zephyr/output-checks.ts,观察结果同时写进 verify-report.md。
一次运行拿全部结果:加 VERIFY_PROBE_PATHS=1,验证结束后会顺便探测候选插件端点,并把结果写进同一份 verify-report.md:
JIRA_BASE_URL=... JIRA_USERNAME=... JIRA_PASSWORD='***' \
ZEPHYR_ALLOW_INTERNAL_API=true VERIFY_PROBE_PATHS=1 npm run verify:live单独探测也可以(probe:paths 会逐个报告候选路径的状态码:200 可用、405 路径存在但方法不对、404 没有)。候选清单在 test/probe-candidates.mjs,可自行增删。
抓取真实结构以扩展 schema
npm run capture:instance 会走一遍完整层级并保存真实结构,目的是让 src/entity-types.ts 的
schema 有据可依而不是靠猜。它采集:
一个 issue 的全字段(
fields=*all+expand=changelog,renderedFields,names,schema,transitions,editmeta), 以及它的评论、工时、附件、watcher、remote link、流转createmeta/editmeta原始响应 → 哪些字段在创建/编辑屏幕上、是否必填、有哪些可选值多个 issue 的采样(默认 3 条,
CAPTURE_LIMIT可调)→ 字段出现率agile 层级:boards → sprints → sprint issues、backlog
Zephyr 完整层级:test case(+ steps/attachments)→ test run(+ items/results/summary)→ test plan、 文件夹树、状态选项、自定义字段定义、环境
产出三个东西,安全性是刻意分开的:
路径 | 内容 | 能否外传 |
| 键名、类型、数组长度、出现/有值次数。字段值全部抹掉 | ⚠️ 见下 |
| 同样内容的机器可读版 | ✅ |
| 原始 payload,含真实值 | ❌ 已在 |
report.md 里多 issue 采样会让你直接看到该留 required 还是必须 optional:
object
id: string *
key: string *
fields: object *
summary: string *
customfield_20001: object ← 没有 * = 只在 1/2 采样里出现,必须 optional
value: string *
| field | present | value shape |
| `summary` | 2/2 | string |
| `customfield_20001` | 1/2 | object{value} |报告里没有字段值,但有字段名(真机上是业务术语)和采样的标识符(项目 key、issue key、board/sprint id、
Zephyr key)。如果你要把报告公开,加 CAPTURE_REDACT=1,标识符会变成占位符;字段名保留——没有它,字段 id
就没法对应到含义。
* = 该键在每一次采样里都出现(只有一个样本时不会打星,那只代表"只采了一次",不代表不稳定)。
注意报告里有字段名(真机上就是业务术语),值没有。接在 verify:live 后面跑也可以:加 CAPTURE=1。
对 Jira 字段,"出现率"本身没有信息量:每个 issue 都会带回全部字段键,值大多是 null。所以报告
额外统计 filled(非 null、非空的值),这才是"这个自定义字段到底有没有在用"的判据。参考实例上
339 个字段键里只有 37 个有值。
报告会拿真实数据校验 schema(## Schema check 段):每个捕获结果都映射到一个实体,逐个用
src/entity-types.ts 里的 schema 验证。所以 schema 不会悄悄漂移——假设错了就是一条 failed check,
而不是某次工具调用崩掉。改完 schema 可以离线复验,不用再开 VPN:
node scripts/capture-instance.mjs --check capture发布
npm run build # esbuild -> dist/jira-server.mjs(单文件,SDK 与 zod 保持 external)
npm publish # prepack 会自动先 builddist/ 在 .gitignore 里(仓库不留构建产物),但 files 显式包含它,且 prepack 保证每次打包都是新构建。发布前的自检:
rm -rf dist && npm pack # 模拟干净检出,确认 prepack 能构建出 dist
npm i -g ./mohou-jira-mcp-*.tgz # 装到别处,确认真的能起为什么必须构建:Node 对 node_modules 下的 .ts 拒绝类型擦除
(ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING),源码形态装到别人机器上起不来。这是发布物必须带 JS 的唯一原因。
目标实例画像
docs/instance-profile.example.md 是一份示例/模板(全是假数据),演示如何记录实测到的服务器版本、认证方式,以及从自定义字段 schema 反推出的插件清单(UPM 对普通账号不可读)。这份画像是工具面裁剪的依据:例如 jira_tempo_worklogs 被移除,就是因为目标机器上只有 Tempo Planner/Teams/Accounts,没有 Tempo Timesheets。
已知边界
JSON DSL 只能表达单次 REST 调用。需要多步或聚合的逻辑写代码。守住这条,否则会退化成没人会用的 DSL。
Zephyr 的写操作在只读模式下是"注册但调用时拒绝"(上游设计),不是从工具列表里消失。
jira_list_plugins需要管理员权限。实测:非管理员账号访问/rest/plugins/1.0/时,Jira Server 返回 空的 406(它用 HTML 错误页回应Accept: application/json)。工具会依次尝试/rest/plugins/1.0/和/rest/plugins/1.0,失败时给出"需要 Jira 管理员权限"的说明;verify:live把这类失败记为 skip 而不是 fail。tools.d/plugins.json里的插件示例未经真实例验证;tools.d/examples/example-tempo-worklogs.json记录了一个反例:那个端点在真实 8.5.7 上返回 405,启用前必须先确认真实路径。创建/更新受 Jira 的 Screen 配置约束 —— 字段不在对应 Screen 上会 400。这是 Jira 的限制,不是本项目的;
jira_describe_create返回的就是屏幕上的字段。
Available Tools
97 toolsadd_test_stepsA
Insert steps into a STEP_BY_STEP script without losing the existing ones (GET then PUT /testcase/{testCaseKey}): reads the current steps, keeps their ids, splices the new ones in and writes the whole list back — needed because PUT deletes every step missing from the list it receives. The stored steps are ordered by their authoritative index before merging, because GET /testcase serves them in an arbitrary array order once a case has been edited; only the insertion changes, existing step ids and their sequence are preserved. position selects the insertion point: "append" (the default), "prepend", or a 0-based index into that ordered sequence, clamped to the step count. Allowed when the current script is STEP_BY_STEP, and when the case has no script CONTENT yet — a case created without a testScript is reported by the API as an empty PLAIN_TEXT script (a stub with no text), and that counts as script-less: a STEP_BY_STEP script is then created. A PLAIN_TEXT or BDD script that really has text is refused; replace it with set_test_script. A step whose "Call to Test" points at its own case is refused too: the API answers 2xx to such a write and stores NOTHING. After the write the tool reads the case back (a second GET) and returns { key, totalSteps } where totalSteps is the count STORED on the case, not the count sent. When the two differ — the stand accepts a write and silently throws it away — the answer also carries stepsSent and a warning saying so; totalSteps is null with a warning when the read-back itself failed.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | New steps in insertion order, without ids (ids belong to already stored steps). A step with testCaseKey is a "Call to Test". | |
| position | No | Where to insert: 'append' (default), 'prepend', or a 0-based index into the existing steps, clamped to the current step count. A numeric index may be given as a number or as digits in a string ("2") — both mean the same position. | |
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden and does so: PUT deletes every step missing from the payload, steps are reordered by the authoritative `index` before merging, a 2xx write can silently store nothing, and the read-back result can report a mismatch or null totalSteps. These are exactly the non-obvious traits an agent cannot infer elsewhere.
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 core action is front-loaded in the first clause, and the length is largely justified by the API quirks it must warn about. It is, however, a dense wall of em-dash-separated clauses rather than clearly separated points, which slightly hurts scanability.
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?
There is no output schema, yet the description fully documents the return shape ({ key, totalSteps }, plus stepsSent and a warning on mismatch, or null totalSteps on read-back failure). Combined with the usage constraints and mutation semantics, nothing an agent needs to call it correctly is missing.
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, but the description goes further by explaining that `position` indexes into the authoritative ordered sequence, is clamped to the step count, and that the `steps` array carries no ids because ids belong to stored steps. It adds real meaning over the schema's field-level text.
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?
States a specific verb (insert steps), the exact resource (a STEP_BY_STEP script) and the mechanism (GET then PUT /testcase/{testCaseKey}), and explicitly contrasts itself with set_test_script for the replace case. An agent can distinguish it from set_test_script without opening either schema.
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?
Explicit when-to-use conditions are given: allowed when the script is STEP_BY_STEP or when the case has no script content (including the empty PLAIN_TEXT stub), and refused for a PLAIN_TEXT/BDD script that really has text, with the alternative named. The self-referencing 'Call to Test' exclusion is also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clone_test_caseA
Copy a test case inside its own project (GET /testcase/{testCaseKey}, then POST /testcase). Copies name, objective, precondition, folder, status, priority, component, owner, estimatedTime, labels, custom fields, parameters and — unless includeScript is false — the script; step ids are dropped so the copy owns its steps. Issue links, attachments and execution history are NOT copied. name defaults to " (copy)" and folder to the source folder. The folder MUST already exist — the API never creates folders implicitly (use create_folder first). A test case name is limited to 255 CHARACTERS, not bytes (the API rejects a longer one with an opaque HTTP 500): an explicit longer name is refused locally before any request, and the default name is shortened to fit — the copied source name is cut on a whole-character boundary (an astral character is dropped rather than split), the " (copy)" marker is kept, and note reports both lengths. An explicitly empty name ("") is sent as-is and rejected with 400 "The field name is required." — omit the parameter to get the default. Names are not deduplicated: cloning twice gives two cases with the same name, and cloning a copy gives "… (copy) (copy)" — unless the source name is already at the limit, where the shortening cuts exactly the previous " (copy)" off and the copy ends up named identically to its source (note says so; pass an explicit name to tell them apart). With includeScript=false the copy has no steps, but the API still reports an empty PLAIN_TEXT testScript — that is what every script-less case looks like here. Returns { key, url, sourceKey, note? }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name of the copy, at most 255 characters (defaults to "<source name> (copy)", shortened to fit) | |
| folder | No | Folder path for the copy, full path from the root starting with "/" (defaults to the source folder) | |
| testCaseKey | Yes | Key of the SOURCE test case, e.g. PROJ-T123 | |
| includeScript | No | Copy the test script too (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: what is copied vs. explicitly NOT copied (issue links, attachments, execution history), the folder-must-exist precondition, the 255-character failure mode and its local pre-check, the 400 on empty name, and non-deduplication semantics. This is exactly the destructive/mutation context an agent needs absent annotation hints.
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?
Purpose is front-loaded and the copy/no-copy inventory is efficient, but the name-limit passage runs long with multiple parentheticals covering astral-character boundaries, repeated '(copy)' markers, and the note field. The information is genuinely useful for edge cases, yet it is denser than a reader needs on first pass.
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?
There is no output schema, and the description compensates by stating the return shape: '{ key, url, sourceKey, note? }'. Combined with the copy semantics and failure modes, an agent has everything needed to invoke and interpret the result.
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, but the description adds substantial meaning beyond the schema: includeScript=false yields a copy with no steps plus a spurious empty PLAIN_TEXT testScript, name defaulting and shortening behavior, the step-id-dropping rule, and the empty-string edge case. This goes well past restating field definitions.
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?
Opening clause gives a precise verb+resource+scope: 'Copy a test case inside its own project,' immediately distinguishing it from create_test_case (new case) and get_test_case (read). The description also enumerates exactly which fields travel with the copy, so an agent knows what the resulting artifact is.
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?
Prerequisites and alternatives are explicit where it matters: 'The folder MUST already exist — the API never creates folders implicitly (use create_folder first)' names the sibling to call first. It also states the when-not implicitly via 'inside its own project,' but never spells out a cross-project alternative, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_environmentA
Create a Zephyr Scale environment in a project (POST /environments). The name must be unique within the project — a duplicate is rejected with 400 — and is the string other tools use to reference the environment, so create it with the exact casing you intend to pass to test results. Returns the created environment object as the API sends it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Environment name, unique within the project and case-sensitive, e.g. "Chrome" | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted | |
| description | No | Free-text description of the environment |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the duplicate-name error (400), the case-sensitive nature of the name, and that the return is the raw created object. It omits auth requirements and idempotency, but core behavior is covered.
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?
Three tightly written sentences, front-loaded with the core action, then key constraints, then return value. Every sentence adds necessary information 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?
Given the simple create operation, full schema description coverage, and lack of an output schema, the description provides all essential context: what it does, a critical error case, case-sensitivity, and what it returns. Nothing critical is missing.
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 is 3, but the description adds meaningful context beyond the schema: it explains why the name must be unique (rejected with 400) and that its exact casing matters because other tools reference it. This enriches the name parameter's semantics.
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?
States a specific verb (Create) and resource (Zephyr Scale environment) with scope (in a project) and even the API endpoint. It clearly distinguishes itself from the sibling list_environments by action, but does not explicitly name an alternative for selection.
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 implicit guidance: it explains the uniqueness constraint and the need to match casing for downstream use, but does not state when to use this tool versus alternatives or mention any prerequisites beyond the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderA
Create a folder for test cases, test plans or test runs / test cycles (POST /folder). name is the FULL path from the root, not a single segment, and every segment must be non-empty and not blank — "/" alone, "/A//B", a trailing "/" and a whitespace-only segment ("/A/ ") are rejected before any HTTP call because the API would create a permanently nameless folder from them. Spaces around a real name are legal and are NOT trimmed. The two rules surface differently: a missing leading "/" is caught by the input schema (an MCP input-validation error), while empty or blank segments are caught by the tool itself (a plain "Invalid folder path ..." message). The other tools never create folders implicitly: create_test_case, create_test_run and create_test_plan fail with 400 on an unknown folder. Not idempotent: an existing path fails with 400 "The folder already exists" and no retry is attempted. With recursive=true (the default) any OTHER 400 on the full path triggers the fallback — every parent prefix is created from the root and the full path is retried once; 403, 409 and 5xx propagate unchanged, so a permission problem is never mistaken for a missing parent. On builds where POST /folder already creates missing ancestors itself that fallback never fires — the reference build is one of them: a two-level-deep new path succeeds even with recursive=false, so recursive is effectively a no-op there. Each folder type has its own tree, so the same path must be created once per type. The public Server/DC API v1 cannot LIST folders, so keep the numeric id returned by create_folder — rename_folder and delete_folder need it (otherwise it can only be found in the Jira UI, or with get_folder_tree when the internal API is enabled). Returns { id, name, type } — id is the id of the LAST segment only, so ancestors created along the way have ids this call never reports (find them with get_folder_tree).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Full path of the folder to create, from the root, starting with "/", e.g. "/Regression/Payments" — every segment is a folder level and must contain at least one non-whitespace character. Segments are stored verbatim: leading and trailing spaces are NOT trimmed, so "/A/ B " and "/A/B" are different folders, but a segment made only of spaces is rejected. | |
| type | Yes | Folder kind: TEST_CASE (test case folders), TEST_PLAN (test plan folders) or TEST_RUN (test cycle folders) | |
| recursive | No | Create missing parent folders after a 400 on the full path (default true). Client-side only — never sent to the API. | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden and does so: it explains pre-flight validation, exact failure modes (400/403/409/5xx), non-idempotency with the specific error text, the recursive fallback semantics and the build where it is a no-op, and that 403 is never mistaken for a missing parent.
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?
Front-loaded with the core action and endpoint, and every sentence carries real information. It is a single dense paragraph with some overlap against the schema's own name rules, and could be broken into bullets for scanability, but nothing is wasted.
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?
With no output schema, the description still explains the return value { id, name, type } and the critical caveat that id is only the last segment, directing the agent to get_folder_tree for ancestor ids. Nothing needed to call it correctly is missing.
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, but the description adds meaning beyond the schema: it clarifies that recursive is client-side only and effectively a no-op on the reference build, and explains that the two path rules surface through different layers (schema vs. tool).
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?
States a specific verb+resource with the underlying endpoint: 'Create a folder for test cases, test plans or test runs / test cycles (POST /folder)'. It also explicitly distinguishes itself from siblings, noting create_test_case/create_test_run/create_test_plan never create folders implicitly and fail with 400 on an unknown folder.
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?
Gives explicit when-to-use context and alternatives: which sibling tools do not create folders, that each folder type has its own tree so a path must be created once per type, that the call is not idempotent, and that the returned id is required by rename_folder/delete_folder.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_caseA
Create a test case (POST /testcase). The folder MUST already exist — the API never creates folders implicitly (use create_folder first). status, priority, component and custom field names must match the ones configured on the instance and are case-sensitive: an unknown or wrong-case value is rejected with 400 and nothing is created (unlike EXECUTION statuses, which the API silently ignores). owner: Jira user key (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. estimatedTime is in milliseconds. name is limited to 255 characters — a longer one is refused locally, because the API answers it with an opaque bodyless HTTP 500. testScript is STEP_BY_STEP with steps, or PLAIN_TEXT/BDD with text; a step carrying testCaseKey is a "Call to Test" that inlines another case. BDD text is stored verbatim and must contain Gherkin step lines only — a "Feature:"/"Scenario:" header is rejected with 400 "Invalid BDD Script". Omitting testScript does NOT leave the case script-less: the server attaches an empty PLAIN_TEXT script, which add_test_steps treats as "no script yet". Returns { key, url }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Test case name | |
| owner | No | Owner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| folder | No | Full folder path from the root starting with "/", e.g. "/Regression/Payments". The folder MUST already exist — the API never creates folders implicitly (use create_folder first). | |
| labels | No | Labels; the API replaces spaces with underscores | |
| status | No | Test case status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones. | |
| priority | No | Priority. Defaults: 'High', 'Normal', 'Low' — case-sensitive; instances may define custom ones. | |
| component | No | Name of a Jira component of the project | |
| objective | No | Objective (HTML allowed) | |
| issueLinks | No | Jira issue keys to link, e.g. ["PROJ-123"] | |
| parameters | No | Test case parameters: { variables: [{name, type: FREE_TEXT | DATA_SET, dataSet?}], entries: [{<variable>: <value>}] } | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted | |
| testScript | No | Test script. STEP_BY_STEP: {type, steps: [{description?, testData?, expectedResult?, testCaseKey?}]}; PLAIN_TEXT/BDD: {type, text}. | |
| customFields | No | Custom field values keyed by field name | |
| precondition | No | Precondition (HTML allowed) | |
| estimatedTime | No | Estimated duration in milliseconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it discloses the 400 on unknown/wrong-case values, the 255-char name limit enforced locally because the API returns a bodyless 500, BDD text stored verbatim, and the side effect that omitting testScript attaches an empty PLAIN_TEXT script. It even states the return shape { key, url }.
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?
Front-loaded with the verb+resource, then organized around prerequisites, value validation, and script semantics. It is dense and long, but nearly every sentence carries actionable constraint information, so little is wasted.
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 15-parameter tool with nested objects, no output schema, and no annotations, the description covers prerequisites, validation failures, side effects, and the return value. Nothing an agent needs to invoke it correctly appears to be missing.
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, but the description adds meaning beyond the schema: the 255-char name limit (schema only sets minLength 1), the folder-must-exist rule, owner user-key semantics, and estimatedTime units. It enriches the schema rather than merely restating it.
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?
Opens with a specific verb+resource ('Create a test case') and even names the underlying endpoint (POST /testcase). It is clearly distinguishable from siblings like create_test_cases_bulk, clone_test_case, and add_test_steps, the last of which it explicitly references.
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?
Gives strong operational context: folder must pre-exist ('use create_folder first'), owner must be resolved with find_jira_user, and it explains the consequence of omitting testScript. However it never explicitly contrasts when to reach for this tool versus create_test_cases_bulk or clone_test_case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_cases_bulkA
Create several test cases in one request (POST /testcase/bulk). Each item takes the same fields as create_test_case; an item without its own projectKey uses the shared projectKey, then ZEPHYR_DEFAULT_PROJECT_KEY. The folder MUST already exist — the API never creates folders implicitly (use create_folder first). Some Server builds ship a broken bulk endpoint (any 5xx, or a JSON 404 — as opposed to the plugin-not-installed HTML 404) while single creation works: the tool then falls back to POST /testcase per item so partial progress survives — on such a build the fallback runs on every call and the bulk shape is never returned. A 4xx from the bulk endpoint is a payload error and is NOT retried. Returns [{ key, url }] on the bulk path, or { note, created: [{ key, url }], failed?: [{ index, name, error }] } when the fallback ran — also when SOME items failed, so always read failed[]. created[] is in input order but carries no index, and failed[] is omitted entirely when every item succeeded; index is the position in the testCases array. When EVERY item fails nothing was created and the call FAILS, with one line per item naming its index, its name and its error, so the payload can be fixed in one pass. A name longer than 255 characters is rejected locally, naming the item.
| Name | Required | Description | Default |
|---|---|---|---|
| testCases | Yes | Test cases to create, each shaped like create_test_case input | |
| projectKey | No | Shared Jira project key for items without their own, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are empty, so the description carries the full burden and does so: it discloses the broken-bulk-endpoint fallback, that 4xx is not retried, the two distinct return shapes, that failed[] is omitted on full success, that created[] lacks indices, that an all-fail call raises with per-item lines, and the 255-char local rejection. This is exactly the behavioral detail an agent needs.
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?
It is long but front-loaded with purpose and folder prerequisite before the failure/return semantics. Nearly every sentence carries operational weight (fallback behavior, return shape, failure mode), though the return-shape discussion is dense and could be tightened without loss.
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?
With no annotations and no output schema, the description fully compensates by documenting both return shapes and the failure contract. Combined with 100% schema coverage on the input side, an agent has everything needed to call this correctly and interpret the result.
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 and the nested item shape. The description still adds value beyond the schema: the cross-reference that each item takes the same fields as create_test_case, the projectKey resolution chain order, and the 255-character name limit that is not expressed in 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?
States a specific verb (create), resource (test cases), and scope (several in one request, POST /testcase/bulk), which distinguishes it from the sibling create_test_case. It also names the shared field semantics and the fallback path, so an agent can tell what the tool actually does end-to-end.
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?
Gives a concrete prerequisite ('use create_folder first' because folders are never created implicitly) and explains the build-specific fallback path, which is useful routing context. It does not explicitly contrast against single create_test_case or state when bulk is preferable beyond the implied 'several items', so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_planA
Create a test plan (POST /testplan). folder must be a TEST_PLAN folder (create_folder with type TEST_PLAN) — The folder MUST already exist — the API never creates folders implicitly (use create_folder first). status is a case-sensitive internal name. owner: Jira user key (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. Returns { key } (e.g. "PROJ-P123") — no UI url, because the test plan page has no stable address across Zephyr Scale versions.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Test plan name | |
| owner | No | Owner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| folder | No | Full path of a TEST_PLAN folder from the root starting with "/", e.g. "/Releases/2026". The folder MUST already exist — the API never creates folders implicitly (use create_folder first). | |
| labels | No | Labels; the API replaces spaces with underscores | |
| status | No | Test plan status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones. Plan statuses are their OWN option set: get_status_options cannot list them (it has no test_plan optionSet) and the test CASE statuses it returns are rejected here with 400 "The value <x> was not found for field status." | |
| objective | No | Objective (HTML allowed) | |
| issueLinks | No | Jira issue keys to link, e.g. ["PROJ-123"] | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted | |
| customFields | No | Custom field values keyed by field name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With empty annotations the description carries the full burden, and it delivers: it discloses the return shape { key } and why no UI url is given, the fact that the API never creates folders implicitly, and non-obvious error behavior (case-sensitive status, 400 when a case status is supplied, get_status_options unable to list plan statuses). This is well beyond what structured fields provide.
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 purpose is front-loaded, but the body is dense with em-dashes and parentheticals, and it duplicates schema descriptions for owner, folder, and status almost word-for-word. That redundancy works against conciseness even though the information itself is useful.
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?
There is no output schema, and the description compensates by documenting the return value ({ key }). For a 9-parameter tool with nested customFields it covers prerequisites and key quirks but says nothing about auth/permission needs, leaving a small gap.
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 the schema already documents all nine parameters, and the description's owner/folder/status text is largely repeated verbatim from the schema. It adds only marginal semantic value (status option-set quirk) beyond what the schema already provides, matching the baseline 3.
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?
States a specific verb+resource ('Create a test plan') and even names the endpoint (POST /testplan), which cleanly separates it from create_test_case, create_test_run, and create_folder in the sibling list. An agent can identify the operation without inspecting the schema.
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?
It gives explicit prerequisites and routes the agent to other tools: the folder must already exist and be created with create_folder (type TEST_PLAN), and owner must be resolved with find_jira_user. It does not state when *not* to use this tool versus update_test_plan, so it stops short of a full 5, but the preconditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_resultA
Record a NEW execution of a run item (POST /testrun/{runKey}/testcase/{caseKey}/testresult). Appends to the execution history of that item — to amend the newest execution instead, use update_last_test_result. Only the fields you pass are sent, and the execution keeps the project default for everything you omit. The test case should already be an item of the run; if it is not, the behavior is VERSION-SPECIFIC — some Server builds silently ADD it to the run as a new item (verified live: testCaseCount grows; the new item's POSITION in items[] is not the head and not the tail — it landed second of three and second of four in two separate runs, so do not rely on where it appears), others reject the call with 400/404. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. scriptResults carry per-step outcomes of a STEP_BY_STEP script as { index (0-based), status, comment? }. An overall status sent TOGETHER with scriptResults is stored as sent (verified live: 'Blocked' with three 'Pass' steps stored 'Blocked') and is NEVER derived from the step statuses — scriptResults without a status leave the execution at the project default ('Not Executed'), so pass status in the SAME call. Some older builds may instead ignore the overall status: read the result back with get_test_run_results rather than sending a second update_last_test_result, which replaces the whole execution. A scriptResults entry whose index is past the last step of the case is discarded silently (HTTP 200, no error). When the same test case is an item of the run several times (e.g. once per environment or assignee), disambiguate with matchEnvironment / matchUserKey; with no selector the API picks one of them itself — measured live it took the FIRST (lowest-id) twin and left the other untouched, so pass a selector whenever the case appears more than once. Selectors only SELECT an existing item — they never set a value, so pass environment as well if the result should carry it. matchUserKey matches executedBy/userKey, not assignedTo. If nothing matches, this build answers 400 "No test execution found …" or an empty-bodied HTTP 500 — the 500 was first seen with matchEnvironment, but other inputs produce it too, so its cause is undetermined; that empty-bodied 500 has been observed to write the execution and add a duplicate item anyway, so the write may or may not have happened — re-read with get_test_run_results instead of retrying. Returns { id } of the created execution.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Execution status. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. | |
| comment | No | Comment (HTML allowed) | |
| version | No | Jira release version name the execution belongs to, e.g. "2026.7" (case-sensitive) | |
| iteration | No | Iteration name as configured in the project (case-sensitive), for runs executed in iterations | |
| assignedTo | No | Assignee. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| executedBy | No | Executor. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| issueLinks | No | Jira issue keys to link, e.g. ["PROJ-123"] | |
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) | |
| environment | No | Environment name as configured in the project (case-sensitive), e.g. "Chrome" | |
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 — should already be one of the run's items | |
| customFields | No | Custom field values keyed by field name | |
| matchUserKey | No | Run-item selector, sent as the 'userKey' QUERY parameter (never in the body): targets the run item by its executor's Jira user key, e.g. 'JIRAUSER10000'. | |
| actualEndDate | No | ISO 8601 | |
| executionTime | No | Execution duration in milliseconds | |
| scriptResults | No | Per-step results (STEP_BY_STEP scripts) | |
| actualStartDate | No | ISO 8601, e.g. 2026-07-20T14:00:00Z | |
| matchEnvironment | No | Run-item selector, sent as the 'environment' QUERY parameter (never in the body): targets the run item with this environment (case-sensitive). Distinct from the 'environment' body field, which sets the environment recorded on the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden — and it does: version-specific auto-add behavior, silent discard of out-of-range scriptResults indices, status never being derived from step statuses, 400/404 and empty-bodied 500 responses, and the warning that a 500 may still have written the execution and duplicated an item. These are exactly the failure modes an agent must know before retrying.
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?
Front-loaded correctly — what it does, the sibling alternative, then hazards. But it runs to roughly 400 words with hedged speculation and low-value specifics ('it landed second of three and second of four', 'its cause is undetermined') that a caller cannot act on; a tighter version would preserve the actionable warnings and drop the field-report narrative.
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 17-parameter mutation tool with nested scriptResults, no annotations and no output schema, the description closes every gap: it documents the return value ({ id }), the selector-vs-body distinction, and the recovery path (re-read with get_test_run_results rather than retry). Nothing an agent needs to call it safely is missing.
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 already 100%, so the baseline is 3. The description still adds real meaning beyond the schema: the status/scriptResults coupling rule, the fact that omitted fields keep project defaults, that selectors only select and never set (so `environment` must be passed separately if the result should carry it), and that matchUserKey targets executedBy, not assignedTo.
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?
States a specific verb+resource ('Record a NEW execution of a run item') and even names the endpoint, then immediately distinguishes itself from update_last_test_result, the sibling it is most likely to be confused with. An agent can route correctly without opening the schema.
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?
Explicit when-to-use vs. when-not: 'to amend the newest execution instead, use update_last_test_result', plus conditional guidance to pass matchEnvironment/matchUserKey whenever a case appears more than once, and to pass `status` in the same call as scriptResults. Alternatives and preconditions are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_results_bulkA
Record NEW executions for several items of ONE test run in a single call (POST /testrun/{runKey}/testresults). The body is the results array itself; in each entry only the fields you pass are sent, and the returned ids are positionally aligned with it. The test case should already be an item of the run; if it is not, the behavior is VERSION-SPECIFIC — some Server builds silently ADD it to the run as a new item (verified live: testCaseCount grows; the new item's POSITION in items[] is not the head and not the tail — it landed second of three and second of four in two separate runs, so do not rely on where it appears), others reject the call with 400/404. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. scriptResults carry per-step outcomes of a STEP_BY_STEP script as { index (0-based), status, comment? }. An overall status sent TOGETHER with scriptResults is stored as sent (verified live: 'Blocked' with three 'Pass' steps stored 'Blocked') and is NEVER derived from the step statuses — scriptResults without a status leave the execution at the project default ('Not Executed'), so pass status in the SAME call. Some older builds may instead ignore the overall status: read the result back with get_test_run_results rather than sending a second update_last_test_result, which replaces the whole execution. A scriptResults entry whose index is past the last step of the case is discarded silently (HTTP 200, no error). matchEnvironment / matchUserKey apply to the WHOLE batch and only SELECT which existing run item to append to — they never set the created result's environment. NOT ATOMIC, and it does NOT abort at the failing entry: when one entry is rejected (unknown testCaseKey, bad status/iteration/version value, unknown custom field) the call answers an error and returns no ids, yet that entry alone is SKIPPED while EVERY other valid entry is COMMITTED — the entries AFTER the failing one just as much as those before it (verified live twice, with ids: [valid, valid, unknown key, valid] committed entries 1, 2 and 4; [unknown key, valid] committed entry 2). So after an error that names ONE entry the batch may already be fully written except for that entry: re-read the run with get_test_run_results BEFORE resending anything and resend only the entries that are genuinely missing — resending the batch or its tail creates DUPLICATE executions. An error that rejects the payload as a whole (a malformed body, an unknown run key, a batch-wide matchEnvironment/matchUserKey the API cannot resolve) is different: it is refused before any entry is processed, so nothing was committed and nothing needs re-reading. Two entries for the same test case create two independent executions (no upsert). Returns the array of created executions ([{ id }, …]).
| Name | Required | Description | Default |
|---|---|---|---|
| results | Yes | One entry per execution to record; each targets a run item by testCaseKey and carries that execution's fields | |
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) | |
| matchUserKey | No | Run-item selector, sent as the 'userKey' QUERY parameter (never in the body): targets the run item by its executor's Jira user key, e.g. 'JIRAUSER10000'. | |
| matchEnvironment | No | Run-item selector, sent as the 'environment' QUERY parameter (never in the body): targets the run item with this environment (case-sensitive). Distinct from the 'environment' body field, which sets the environment recorded on the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so exceptionally: it discloses non-atomic skip-and-commit semantics with concrete id-level evidence, version-specific behavior for non-member test cases, silent discarding of out-of-range scriptResults indices, status defaulting, batch-wide matchEnvironment/matchUserKey scoping, and no-upsert duplicate semantics. These are exactly the behaviors an agent cannot infer from the schema.
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?
It is long, but the length is largely earned by the tool's genuine complexity and it is front-loaded with purpose before behavior. The repeated 'verified live' parentheticals with example id arrays add evidence but are verbose, and a few clauses could be tightened without losing meaning.
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?
There is no output schema, yet the description explicitly states the return shape ([{ id }, …]) and its positional alignment with the request. Combined with the mutation hazards, failure modes, and version caveats it covers, an agent has everything needed to call this safely and correctly.
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, but the description adds real meaning beyond it: the returned ids are positionally aligned with the input array, only the fields passed per entry are sent, and matchEnvironment/matchUserKey select the run item for the whole batch rather than setting the created result's environment. The status/scriptResults interplay is also a semantic clarification the schema does not express.
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 opening sentence states a specific verb (Record), resource (NEW executions for several items of ONE test run), and the endpoint (POST /testrun/{runKey}/testresults). It is immediately distinguishable from the singular create_test_result and from update_last_test_result. An agent knows exactly what class of operation this is.
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 gives strong operational routing: re-read with get_test_run_results instead of sending a second update_last_test_result, and re-read before resending after a partial failure. It does not explicitly contrast itself with create_test_result for single executions, so the selection boundary versus that sibling is left implicit, but recovery and read-back alternatives are named precisely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_runA
Create a test run / test cycle (POST /testrun). Pass the COMPLETE list of test cases in items now — API v1 limitation: a test run is IMMUTABLE — there is no PUT /testrun, so it cannot be renamed, moved or have cases added/removed through the public API; its items are fixed at creation and the run status is derived from item statuses. Escape hatches: recreate_test_run_with_items (public, new key) or the internal-API tools update_test_run / add_test_cases_to_run / remove_test_cases_from_run (same key, require ZEPHYR_ALLOW_INTERNAL_API=true). Each item may also carry its execution result (status, executedBy, executionTime, actual dates, per-step scriptResults, …), which imports a run together with its results in one call; afterwards use the test result tools. A run folder is of type TEST_RUN. The folder MUST already exist — the API never creates folders implicitly (use create_folder first). Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. The run's own status is derived by the server from its item statuses and uses a different vocabulary from the execution statuses above ('Not Executed' / 'In Progress' / 'Done'). A run CANNOT be linked to Jira issues: issueLinks is rejected locally because the API has no such field on a run — link the issues on the test cases instead. Returns { key } of the new run.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Test run name; it cannot be changed later through the public API | |
| items | No | Test cases to include — the ONLY place where the composition of a run can be set. Each entry requires testCaseKey and may carry the execution result fields of that item (status, environment, executedBy, assignedTo, comment, executionTime, actualStartDate, actualEndDate, customFields, issueLinks, scriptResults). | |
| owner | No | Owner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| folder | No | Full path of an existing TEST_RUN folder from the root starting with "/", e.g. "/Regression" | |
| version | No | Free-text version label | |
| iteration | No | Free-text iteration label | |
| issueLinks | No | NOT SUPPORTED for test runs and rejected locally: the API has no such field on its run DTO, so any value (an empty array included) makes POST /testrun answer HTTP 500 and create nothing. Link them with link_issues_to_test_run (internal API) or on the test cases (create_test_case / update_test_case with issueLinks). | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted | |
| testPlanKey | No | Test plan to associate the run with, e.g. PROJ-P123 | |
| customFields | No | Custom field values keyed by field name | |
| plannedEndDate | No | ISO 8601 (passed through as-is) | |
| plannedStartDate | No | ISO 8601, e.g. 2026-07-20T00:00:00Z (passed through as-is) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: immutability, absence of PUT /testrun, items fixed at creation, status derived server-side from item statuses, the distinct status vocabularies, folder non-creation, and local rejection of issueLinks (HTTP 500). These are exactly the behavioral traits an agent needs before invoking a mutation.
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?
It is dense and long, but front-loaded with the core action and the immutability constraint, and virtually every sentence encodes a real constraint (escape hatches, folder prerequisite, issueLinks rejection, return value). Slightly run-on in places, but nothing is filler.
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 12-parameter mutation tool with no output schema and no annotations, the description covers the composition rule, prerequisites, escape hatches, result-import path, and even the return shape ({ key }). An agent has everything needed to call it correctly.
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 the baseline is 3; the description still adds meaning beyond the schema by stressing that items is the ONLY place a run's composition can be set and must be complete, and that each item may carry execution-result fields to import results in one call. The name parameter's immutability is also reinforced.
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 opens with a specific verb+resource ('Create a test run / test cycle') and even names the HTTP endpoint, making it instantly distinguishable from siblings like recreate_test_run_with_items, search_test_runs, and get_test_run.
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?
It explicitly states when to use this tool (pass the COMPLETE items list now, since the run is immutable) and routes the agent to concrete alternatives: recreate_test_run_with_items, and the internal-API tools update_test_run / add_test_cases_to_run / remove_test_cases_from_run with their precondition (ZEPHYR_ALLOW_INTERNAL_API=true). It also flags prerequisites (folder must exist, use create_folder first) and forbids linking issues on a run, redirecting to test cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_attachmentADestructive
Permanently delete one attachment by its numeric id (DELETE /attachments/{id}). Irreversible, and there is no bulk form — one call per attachment. Ids come from list_attachments or from an upload_attachment response; the entity the attachment belongs to is not needed (ids are global, not per-entity). The DELETE itself answers 2xx even for an id that never existed or was already deleted, so the id is verified FIRST with GET /rest/tests/1.0/attachment/{id} (the one endpoint that 404s for a missing attachment): an unknown id fails without deleting anything, at the cost of downloading the attachment's FULL content first — deleting a large attachment transfers the whole file before removing it. Returns { deleted: true, id, existenceVerified: true }, or existenceVerified: false plus a note when that pre-check itself could not answer (the delete is still attempted, so success then does not prove the id existed).
| Name | Required | Description | Default |
|---|---|---|---|
| attachmentId | Yes | Numeric attachment id, as returned by list_attachments or by an upload_attachment response |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true, yet the description goes far beyond: irreversibility, no bulk form, the fact that DELETE returns 2xx for nonexistent ids, the GET pre-check that 404s for missing ids, the side effect of downloading the full attachment content before deletion, and the exact response shape including the existenceVerified:false caveat. This is unusually rich disclosure of non-obvious behavior.
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?
Front-loaded with the core action and irreversibility, then progressively less critical caveats. It is long and dense, but each sentence carries distinct behavioral information rather than filler; the trailing return-shape sentence is the only part that could be trimmed.
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?
No output schema exists, and the description compensates fully by describing the return object and the edge case where existenceVerified is false. For a destructive single-parameter tool, an agent has everything needed to call it and interpret the result.
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 the schema already documents attachmentId, so the baseline is 3. The description adds real meaning beyond the schema: that ids are global rather than per-entity, that they come from list_attachments/upload_attachment responses, and that the pre-check makes the id's validity consequential.
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?
States a specific verb and resource ('Permanently delete one attachment'), the underlying endpoint (DELETE /attachments/{id}), and the scope constraint (one call per attachment, no bulk form). An agent can distinguish it from list_attachments/upload_attachment and from bulk siblings immediately.
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?
Explains where valid ids originate (list_attachments or upload_attachment response) and that the parent entity is not needed because ids are global. It stops short of naming a sibling tool as the alternative to use in a specific situation, but the operational context for when this tool applies is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_test_caseADestructive
Permanently delete a test case (DELETE /testcase/{testCaseKey}). Irreversible: the case, its script and its execution history cannot be restored through the API. Inbound references are NOT checked: a case that other cases invoke as a "Call to Test" step is deleted anyway and those steps keep pointing at a key that no longer resolves. Returns { deleted: true, key }.
| Name | Required | Description | Default |
|---|---|---|---|
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the single destructiveHint=true annotation: it discloses irreversibility, the exact scope of loss (case, script, execution history), the absence of inbound-reference checking, and the concrete consequence of orphaned 'Call to Test' steps. This is exactly the pre-call warning an agent needs before a destructive operation.
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?
Three dense sentences, each earning its place: the action+endpoint, the irreversibility and blast radius, the referential-integrity caveat, and the return shape. The destructive warning is front-loaded rather than buried.
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 one-parameter destructive tool with no output schema, the description supplies everything missing from structured fields: destruction scope, referential side effects, and the return shape ({ deleted: true, key }). An agent can call this correctly and warn the user with no further information.
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% and the single parameter already documents its format ('PROJ-T123'), so the description adds no syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema carries the parameter semantics.
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?
States a specific verb+resource ('Permanently delete a test case') and anchors it to the concrete endpoint DELETE /testcase/{testCaseKey}. It is trivially distinguishable from siblings get_test_case, update_test_case, and clone_test_case without opening any schema.
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?
Usage is implied by the verb and the explicit irreversibility warning, which tells the agent this is the last-resort path rather than a routine edit. However, it never names alternatives (e.g., update_test_case or move_test_cases_to_folder) or states when deletion is appropriate versus when it should be avoided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_test_planADestructive
Permanently delete a test plan (DELETE /testplan/{testPlanKey}). Irreversible — there is no trash and no undo. NOT idempotent and it never confirms a deletion it did not perform: an unknown, mistyped or already-deleted key answers 404 and this tool fails instead of returning { deleted: true } (verified live). The key is not reused afterwards — the next create_test_plan gets a fresh number. Does NOT cascade to the test runs linked to the plan (verified live): the runs survive with their names, testCaseCount and status intact, only the plan↔run trace links die. Delete the runs separately with delete_test_run if that is what you meant. Returns { deleted: true, key }.
| Name | Required | Description | Default |
|---|---|---|---|
| testPlanKey | Yes | Test plan key, e.g. PROJ-P123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give destructiveHint=true; the description goes far beyond, disclosing irreversibility (no trash/undo), non-idempotency, the 404 failure behavior for unknown keys, that the key is not reused, and the verified non-cascading behavior toward linked runs.
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?
Front-loaded with the core action and mostly dense with high-value facts, though it is on the long side with some redundancy around the 404/not-confirming point. Nearly every sentence earns its place.
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?
Covers the return value ({ deleted: true, key }) despite no output schema, and fully describes failure modes, side effects, and sibling routing. Nothing an agent needs to call this destructive tool correctly is missing.
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?
Single parameter with 100% schema coverage documenting the key format (e.g. PROJ-P123). The description adds behavioral nuance about mistyped keys 404-ing but no additional syntax beyond the schema, so baseline 3 applies.
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?
States a specific verb and resource ('Permanently delete a test plan') plus the exact endpoint DELETE /testplan/{testPlanKey}, and clearly differentiates from siblings like delete_test_run and delete_test_case by contrast.
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 routes the agent: if the intent was the linked runs, use delete_test_run instead, and states the plan does not cascade to runs. Also gives the when-not condition (unknown/mistyped/already-deleted key fails with 404 rather than confirming).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_test_runADestructive
Permanently delete a test run / test cycle together with ALL its execution results, its attachments and its test-plan links (DELETE /testrun/{key}). Cannot be undone. API v1 limitation: a test run is IMMUTABLE — there is no PUT /testrun, so it cannot be renamed, moved or have cases added/removed through the public API; its items are fixed at creation and the run status is derived from item statuses. Escape hatches: recreate_test_run_with_items (public, new key) or the internal-API tools update_test_run / add_test_cases_to_run / remove_test_cases_from_run (same key, require ZEPHYR_ALLOW_INTERNAL_API=true). So delete + create_test_run with the full desired items is the public way to change a run's name, folder or composition (the new run gets a NEW key). The DELETE itself answers 2xx for a key that never existed, was already deleted or belongs to another entity type (a TEST CASE key was reported deleted while the case stayed intact), so the key is verified FIRST with GET /testrun/{key}: an unknown key fails without deleting anything. Returns { deleted: true, key, existenceVerified: true }, or existenceVerified: false plus a note when that pre-check itself could not answer (the delete is still attempted, so success then does not prove the run existed).
| Name | Required | Description | Default |
|---|---|---|---|
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry destructiveHint=true; the description adds the irreversibility, the immutability of test runs (no PUT /testrun), the surprising 2xx-on-nonexistent-key DELETE semantics, and the GET pre-check that gates deletion. It even discloses the response shape and the caveat that success does not prove prior existence when the pre-check fails.
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?
Long but dense and front-loaded: destruction scope and irreversibility come first, then the immutability constraint, then escape hatches, then the verification caveat. Almost every sentence carries non-redundant operational detail, though the immutability/escape-hatch passage could be tightened.
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?
No output schema exists, and the description compensates by documenting the return object and the existenceVerified:false edge case. Combined with the verification behavior, key format, and alternative routes, an agent has everything needed to call this correctly and interpret the result.
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% and the single parameter already documents the key format with examples, so the schema does the heavy lifting. The description adds only the endpoint path reference (DELETE /testrun/{key}), which is context rather than parameter meaning. Baseline 3 is appropriate.
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?
States a precise verb+resource ('Permanently delete a test run / test cycle') and immediately enumerates the full blast radius (execution results, attachments, test-plan links), plus the underlying endpoint. An agent can distinguish it from delete_test_case, delete_test_plan and recreate_test_run_with_items without opening a schema.
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 names the alternatives (recreate_test_run_with_items, update_test_run, add_test_cases_to_run, remove_test_cases_from_run) and the conditions that select them, including the ZEPHYR_ALLOW_INTERNAL_API=true prerequisite. It also prescribes the intended public workflow ('delete + create_test_run with the full desired items') for the task the agent will actually want.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentARead-only
Download the content of an attachment to a local file (GET /rest/tests/1.0/attachment/{id}). Address it by attachmentId or by the exact url list_attachments returns — pass exactly one of the two. Attachment content lives outside API v1: /rest/tests/1.0/attachment/{id} is the url the official list endpoint itself hands out, so this tool follows it without requiring ZEPHYR_ALLOW_INTERNAL_API. A supplied url must be on the configured Jira host — credentials are never sent to another host. A query string on the url is sent as request parameters rather than kept in the path, so it is never echoed in an error message (error messages carry the method and the path only, because a query string can carry a token). outputPath is written on the machine running this MCP server and its parent directory must already exist; a failed download writes nothing. Jira answers a url that is not attachment content (a login redirect, an unknown path) with HTTP 200 and an HTML PAGE, so a response whose body starts with or is refused and nothing is written — { savedTo, bytes } therefore means the bytes really came from the attachment endpoint. The refusal names the page it caught (its , or the page's first readable text when it has none) so a login redirect, an error page and a wrong host can be told apart. Set allowHtml: true for an attachment that genuinely is an HTML file. Markup that is not a page (XML, SVG) is never affected. Returns { savedTo, bytes }.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Exact download url as returned by list_attachments; must be on the configured Jira host. Mutually exclusive with attachmentId. | |
| allowHtml | No | Save the response even when it is an HTML page (default false). Only for an attachment that really is an HTML file — it disables the guard against saving a Jira login or error page as attachment content. | |
| outputPath | Yes | Local path to write the file to, on the machine running this MCP server (the parent directory must exist) | |
| attachmentId | No | Numeric attachment id, as returned by list_attachments or by an upload_attachment response; mutually exclusive with url |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the single readOnlyHint annotation: it discloses that outputPath is written on the MCP host, that the parent directory must pre-exist, that a failed download writes nothing, that credentials are never sent to another host, that query strings are moved out of the path so they never leak into errors, and that HTML responses are refused unless allowHtml is set. This is exactly the kind of side-effect and safety context annotations cannot carry.
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?
Long, but almost every sentence carries security or safety information not available elsewhere, and the core purpose is front-loaded in the first clause. Slightly dense, though nothing is padding.
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?
With no output schema, the description still explains the return value ({ savedTo, bytes }) and the guarantee it carries, plus the HTML-refusal behavior and error-message shape. An agent has everything needed to call it correctly and interpret the result.
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, but the description adds real meaning beyond the schema: the mutual exclusivity of url/attachmentId, the constraint that url must be on the configured Jira host, the exact semantics of allowHtml as disabling the page guard, and the parent-directory requirement for outputPath.
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?
States a specific verb+resource ("Download the content of an attachment to a local file") and even names the REST endpoint. An agent can immediately distinguish it from list_attachments, upload_attachment, and delete_attachment among the siblings.
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?
Gives clear usage context: address the attachment by attachmentId or by the exact url list_attachments returns, and pass exactly one of the two. It also routes the agent to list_attachments as the source of a valid url and explains when to set allowHtml. It does not explicitly name alternative download strategies, but the selection guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_feature_filesARead-only
Export BDD test cases as Gherkin .feature files packed in a ZIP archive (GET /automation/testcases). tql is REQUIRED — the API rejects the call without it — and this endpoint uses the testCase.-prefixed TQL dialect, which supports ONLY the fields testCase.key, testCase.projectKey and testCase.name (= and IN) joined by AND: testCase.folder, testCase.status, testCase.priority and testCase.labels are rejected with 400 "Error executing TQL", so a whole folder cannot be exported — select the cases with testCase.key IN (...) instead. Values must be quoted, single or double quotes both work, and spaces around operators are optional here, unlike search_test_cases; lowercase "and", lowercase "testcase." and OR are not accepted, and an OR query answers 200 with an empty body rather than a syntax error. Only cases whose script type is BDD are exported: STEP_BY_STEP and PLAIN_TEXT cases, and keys in an IN list that do not exist, are silently skipped (332 cases yielded 251 .feature files on the reference instance) and the return value does not say which keys were dropped. A query that matches no BDD case — a nonexistent projectKey included — returns HTTP 200 with an EMPTY body, not an empty ZIP, and this tool then reports that the query matched nothing. The archive is flat: one .feature per case, no directories. The server writes "Feature: ", " @TestCaseKey=", " Scenario: ", a blank line, then every stored BDD line prefixed with exactly 8 spaces, so an exported file is only byte-identical to the stored script after that prefix is removed, and it is NOT accepted back by set_test_script / create_test_case (400 "Invalid BDD Script") until the Feature:/@TestCaseKey/Scenario: header is stripped. The archive is written to outputPath only after its 'PK' signature is verified, so an HTML login or error page served with HTTP 200 fails loudly instead of leaving a corrupt file. outputPath's parent directory must already exist, '~' is NOT expanded, and an existing file at outputPath is overwritten without warning on success (a failed call leaves it byte-identical). Reads from Zephyr only, so it stays available in ZEPHYR_READONLY mode. Returns { savedTo, bytes }.
| Name | Required | Description | Default |
|---|---|---|---|
| tql | Yes | TQL query selecting the BDD test cases to export, in the testCase.-prefixed dialect this endpoint requires — only testCase.key, testCase.projectKey and testCase.name are queryable, e.g. 'testCase.projectKey = "PROJ"' or 'testCase.key IN ("PROJ-T1", "PROJ-T2")' | |
| outputPath | Yes | Local path to write the ZIP archive to, on the machine running this MCP server (the parent directory must exist) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, yet the description reconciles it ("Reads from Zephyr only, so it stays available in ZEPHYR_READONLY mode") and adds rich behavior: silent dropping of non-BDD/nonexistent keys, HTTP 200 with an empty body on no match, 'PK' signature verification, overwrite-without-warning of an existing outputPath, and that a failed call leaves it byte-identical. This is well beyond what the annotation conveys.
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?
Purpose is front-loaded and every sentence carries a concrete, non-redundant fact (dialect limits, silent skips, overwrite behavior). It is dense to the point of being a wall of text, so it is not maximally scannable, but nothing reads as filler.
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?
With no output schema, the description still discloses the return value ("Returns { savedTo, bytes }"), which is exactly the gap it needs to close. Combined with the edge-case behavior and file-format caveats, an agent has everything required to invoke it correctly.
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, but the description adds operational meaning beyond the schema: quote requirements, disallowed lowercase/or forms, the exact per-field dialect restrictions, and that '~' is not expanded and the parent directory must pre-exist. It notably omits the same detail it advertises for tql from the schema text on outputPath syntax.
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?
States a specific verb and resource ("Export BDD test cases as Gherkin .feature files packed in a ZIP archive") and cites the underlying endpoint GET /automation/testcases. It is clearly distinguishable from siblings like set_test_script, download_attachment and search_test_cases.
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?
Gives strong context on when the call is viable: tql is REQUIRED, only the testCase.-prefixed dialect works, only BDD-script cases are exported, and it explicitly recommends testCase.key IN (...) since folder/status/priority filters are rejected. It never routes to an alternative for the main purpose (e.g. search_test_cases to discover keys), so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_jira_userARead-only
Search Jira users (GET /rest/api/2/user/search). Use it to resolve the Jira USER KEY (e.g. "JIRAUSER10000") that the owner / executedBy / assignedTo fields of the other tools require — those fields reject usernames and e-mail addresses. Needs the Jira "Browse users" permission, otherwise Jira answers 403. Returns an array of { key, name, displayName, emailAddress }, empty when nothing matches; emailAddress is absent when Jira hides it.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Substring matched against username, display name and e-mail, e.g. "pupkin" | |
| maxResults | No | Maximum number of users to return; when omitted Jira applies its own default (50 on Server/DC) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=true, and the description goes well beyond that: it discloses the required "Browse users" permission and the 403 failure mode, the exact return shape, the empty-array behavior, and the conditionally absent emailAddress field. This is genuinely useful operational context an agent could not infer.
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?
Three dense sentences with the endpoint and purpose front-loaded, followed by prerequisites and return shape. No filler; every clause carries information.
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 two-param read tool with no output schema, the description covers purpose, permission prerequisites, and return values well enough to call it correctly. The only real gap is the absence of routing against the duplicate jira_search_users sibling.
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% and both parameters (query substring semantics, maxResults default of 50) are fully documented in the schema itself. The description adds no parameter-level detail, so the baseline 3 applies.
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?
States a specific verb+resource ("Search Jira users") and even names the underlying endpoint, which is more than most definitions offer. However, it never acknowledges the near-identical sibling jira_search_users, so an agent still cannot tell the two apart from the text alone.
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 the use case: resolve the Jira USER KEY required by owner/executedBy/assignedTo, and warns those fields reject usernames and e-mails. That is strong when-to-use context, but it names no alternative (jira_search_users, jira_get_user, jira_get_current_user, jira_search_assignable) so there is no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issue_test_coverageARead-only
Traceability report for a Jira issue: every linked test case with its latest execution (GET /issuelink/{issueKey}/testcases, then GET /testcase/{key} and GET /testcase/{key}/testresult/latest per case). Costs up to 2 requests per case, so maxCases (integer 1..200, default 50) caps the volume. totalLinked counts LINKS — the API returns one entry per link, so a case linked to the issue twice is counted twice — while cases[] holds one row per DISTINCT case, expanded once. The order the API supplies is not stable between calls, so which cases survive the maxCases cut may vary; the cap is applied AFTER duplicate links are collapsed, so it counts DISTINCT cases. lastResult is { status, environment?, actualEndDate?, executedBy?, comment? } with the absent keys OMITTED, and it carries no execution id/key (use get_latest_result_for_test_case when you need the id). It is the most recently CREATED execution, not the one with the greatest actualEndDate, so a back-dated execution still wins and the date shown may be older than that of a suppressed one. lastResult null means no latest execution could be resolved — never executed, or its test run was deleted — not "untested" by itself; with includeLastResults=false (it defaults to true) the key is absent entirely. Fault-tolerant: a case that cannot be read still appears with its key. An issue with no linked cases returns totalLinked 0 and an empty cases[]; an issue key that does not exist raises 404 (Jira resolves issue keys case-insensitively, and issueKey is echoed back exactly as passed). note is present only when something was truncated or collapsed. Returns { issueKey, totalLinked, returned, note?, cases: [{ key, name, status, lastResult? }] }.
| Name | Required | Description | Default |
|---|---|---|---|
| issueKey | Yes | Jira issue key, e.g. PROJ-123 | |
| maxCases | No | Maximum number of DISTINCT linked cases to expand, integer 1..200 (default 50) | |
| includeLastResults | No | Fetch the latest execution of each case (default true); false skips those reads and omits lastResult from every row |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint available, the description carries the behavioral burden and does so exceptionally: it discloses request cost (up to 2 per case), the dedup-before-cap ordering, unstable API ordering, lastResult null semantics ('never executed or run deleted', not 'untested'), the most-recently-CREATED selection rule that can surface older dates, fault-tolerant partial rows, 404 on unknown keys, and case-insensitive key resolution. This is far beyond what the annotation provides.
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?
Every sentence carries substantive information and the purpose plus cost model are front-loaded, but the whole definition is a single monolithic block with no visual grouping of the many distinct semantics (return shape, ordering, faults). Dense and largely waste-free, but readability suffers from the lack of structure.
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 multi-request, deduplicating, order-unstable tool with no output schema, the description supplies everything an agent needs: the return envelope, lastResult shape with omitted-key and null rules, edge cases (empty issues, 404, truncation note), and default behaviors. Nothing material is left undocumented.
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 already 100%, so the baseline is 3; the description earns extra credit by explaining that maxCases is applied AFTER duplicate links are collapsed (so it counts distinct cases) and by clarifying that includeLastResults=false omits the key entirely rather than nulling it. These interaction details are genuinely new, though most of the parameter content overlaps the already-rich 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?
States a specific verb and resource: a traceability report for a Jira issue covering every linked test case with its latest execution, and even names the underlying endpoints. It distinguishes itself from sibling tools by explicitly routing id-lookups to get_latest_result_for_test_case, so an agent can differentiate it without opening a schema.
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?
Names an alternative (get_latest_result_for_test_case) and the exact condition selecting it ('when you need the id'), plus the includeLastResults toggle for skipping execution reads. It gives clear operational context but does not explicitly contrast against the closely related get_test_cases_linked_to_issue sibling, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_result_for_test_caseARead-only
Read ONE execution of a test case across ALL test runs (GET /testcase/{key}/testresult/latest). WHICH one is the API's choice and it is not the plain "newest": measured live with three executions of one case, it returned the most recently CREATED one (highest id) even though another carried a later execution date, and back-dating the winner did not dislodge it — so neither "latest by date" nor "latest by date you set" is a safe reading. Treat the answer as "an execution the API considers current" and, whenever the specific execution matters, read the run with get_test_run_results instead. Answers 404 when the case has never been executed. Returns the execution object as the API stores it (id, testCaseKey, status, environment, executedBy, scriptResults, …). Read-back quirks seen live: executionDate mirrors actualEndDate, executedBy is duplicated as userKey (both absent when there is no executor), every result created through the API carries automated: true, issueLinks come back as traceLinks, and a case with no script still returns one stepless scriptResults entry.
| Name | Required | Description | Default |
|---|---|---|---|
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, but the description adds substantial behavioral context the annotation cannot: the ambiguous semantics of 'latest', live-verified evidence that it means highest id rather than newest date, the 404 condition, and the returned field shape. It also discloses read-back quirks (executionDate mirrors actualEndDate, executedBy duplicated as userKey, automated: true, issueLinks returned as traceLinks).
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?
Front-loaded with the verb, scope and endpoint, and nearly every sentence earns its place by adding non-obvious information. It is long and one clause ('so neither latest by date nor latest by date you set is a safe reading') restates the preceding point, costing a little tightness.
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?
With no output schema, the description carries the burden of explaining return values and does so, enumerating fields and quirks. Combined with the 404 behavior and the ambiguity of the 'latest' selection, an agent has everything needed to call it correctly and interpret the result.
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?
There is a single parameter and schema description coverage is 100%, with the schema already supplying the format example (PROJ-T123). The description adds no additional meaning about testCaseKey beyond what the schema provides, so the baseline 3 applies.
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?
States a specific verb and resource ('Read ONE execution of a test case across ALL test runs') and pins it to an endpoint, immediately distinguishing it from get_test_run_results and the run-scoped siblings. An agent can identify the tool's scope without opening the schema.
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?
Gives explicit when-to-use-this vs when-to-use-an-alternative guidance ('whenever the specific execution matters, read the run with get_test_run_results instead') and names the failure condition (404 when the case has never been executed). This is a textbook routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_caseARead-only
Read one test case (GET /testcase/{testCaseKey}). A STEP_BY_STEP script comes back with a numeric id on every step; those ids are what update_test_case and set_test_script match on, so read them before editing steps by hand (add_test_steps does it for you). Returns the test case object as the API sends it, restricted to fields when given.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Return only these fields, e.g. ["key","name","status"]; sent to the API as one comma-separated parameter | |
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint=true, so the description carries the rest and does so usefully: STEP_BY_STEP scripts return a numeric id per step that update_test_case and set_test_script match on. That is genuine behavioral context beyond the annotation, though nothing is said about pagination or error behavior.
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?
Three sentences, front-loaded with the core action and endpoint, then the step-id caveat, then the return shape. Every sentence earns its place, with only mild density in the parenthetical.
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?
With no output schema, the description compensates by describing the return ('the test case object as the API sends it, restricted to fields when given') and the step-id structure. Enough for an agent to call and interpret the result, though it doesn't note what happens for non-step scripts or missing keys.
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 the schema already documents both testCaseKey and fields. The phrase 'restricted to fields when given' adds only light confirmation of the fields parameter's effect, so baseline 3 is appropriate.
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?
States a specific verb and resource ('Read one test case') and even gives the underlying endpoint GET /testcase/{testCaseKey}. It clearly distinguishes itself from siblings like search_test_cases, create_test_case, and delete_test_case.
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?
Routes the agent concretely: read step ids before editing steps by hand with update_test_case or set_test_script, and notes add_test_steps does that automation for you. It gives clear context and alternatives, but never explicitly states when to prefer this over search_test_cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_cases_linked_to_issueARead-only
List the test cases linked to a Jira issue (GET /issuelink/{issueKey}/testcases) — traceability from a requirement or bug to its tests. Create such links with link_issues_to_test_cases, or with the issueLinks field of create_test_case. Use get_issue_test_coverage instead to also see the latest execution of each case. Returns the API array of test case objects, one entry per LINK: a case linked to the issue twice appears twice, and the order is not stable between calls — de-duplicate by key before counting. Entries carry the API fields, including lastTestResultStatus — a DENORMALIZED value that is absent while the case has never been executed and is reset to "Not Executed" (not cleared) when the test run holding its executions is deleted, so it can read "Not Executed" for a case that really ran Pass. get_issue_test_coverage resolves the execution live and reports lastResult null in that situation; prefer it when the distinction matters.
| Name | Required | Description | Default |
|---|---|---|---|
| issueKey | Yes | Jira issue key, e.g. PROJ-123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation: it discloses that the result is one entry per LINK (duplicates possible), that ordering is unstable and de-duplication by key is required, and that lastTestResultStatus is a denormalized value with specific staleness semantics after run deletion. This is exactly the kind of behavioral context annotations cannot carry.
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?
Purpose and routing are front-loaded in the first sentences, and the return-value caveats follow in a logical order. It is dense and long, but nearly every sentence carries distinct, non-redundant information; only slight trimming of the lastTestResultStatus explanation would improve it.
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?
With no output schema, the description fully compensates by describing the return shape (array of test case objects, per-link entries), duplicate/order behavior, and the semantics of the key status field. An agent has everything needed to call and interpret the tool.
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 the single issueKey parameter is already documented with an example format in the schema. The description references the key only via the endpoint path and adds no new meaning beyond what the schema provides, so the baseline of 3 applies.
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?
States a specific verb+resource ('List the test cases linked to a Jira issue'), gives the underlying endpoint, and frames the purpose as requirement/bug-to-test traceability. It clearly distinguishes itself from link_issues_to_test_cases (creation) and get_issue_test_coverage (execution-aware variant).
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 names the alternatives and the conditions selecting them: use link_issues_to_test_cases or the issueLinks field of create_test_case to create links, and use get_issue_test_coverage to also see the latest execution of each case. It even states when the distinction matters (denormalized vs live execution resolution).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_planARead-only
Read a test plan by key (GET /testplan/{testPlanKey}). The payload embeds the linked test runs and Jira issues when the plan has any; narrow it with fields. Returns the test plan object as the API sends it.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Return only these fields, e.g. ["key","name","status"]; sent to the API as one comma-separated parameter | |
| testPlanKey | Yes | Test plan key, e.g. PROJ-P123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description adds genuinely useful behavior the annotations cannot express — that the payload embeds linked test runs and Jira issues, and that 'fields' can narrow it, letting an agent avoid extra round trips. It stops short of disclosing permissions, error behavior for a missing key, or payload size concerns.
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?
Front-loaded with the operation and endpoint, followed by the two most decision-relevant facts (embedded links, field narrowing). The trailing 'Returns the test plan object as the API sends it' is somewhat filler given there is no output schema to explain, but it is a single short clause.
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 two-parameter read-only getter with full schema coverage and no output schema, the description gives enough to call it correctly — key-based lookup plus what the response contains. It could go further by stating behavior on a missing/invalid key or noting that omitted fields return the full object.
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% — both 'testPlanKey' (with example PROJ-P123) and the comma-separated semantics of 'fields' are already documented in the schema. The description's 'narrow it with fields' adds only a marginal restatement, so the baseline 3 applies.
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?
States a specific verb+resource+identifier ('Read a test plan by key') and even names the underlying endpoint (GET /testplan/{testPlanKey}), which clearly separates it from a bulk/search tool. It does not explicitly name the nearest sibling (search_test_plans), so an agent must infer that 'by key' is the differentiator.
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?
Use is implied by 'by key' and by the note that 'fields' narrows the payload, but there is no explicit when-to-use/when-not guidance and no named alternative (e.g. search_test_plans or get_test_run) for the case where the caller lacks a key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_runARead-only
Read one test run / test cycle including its items (GET /testrun/{key}). API v1 limitation: a test run is IMMUTABLE — there is no PUT /testrun, so it cannot be renamed, moved or have cases added/removed through the public API; its items are fixed at creation and the run status is derived from item statuses. Escape hatches: recreate_test_run_with_items (public, new key) or the internal-API tools update_test_run / add_test_cases_to_run / remove_test_cases_from_run (same key, require ZEPHYR_ALLOW_INTERNAL_API=true). Use get_test_run_results for the executions of the run and get_test_run_summary for status counts. items[].id is the id of that item's LATEST EXECUTION, not a stable item identifier: it changes with every new result, and it is a different id space from remove_test_cases_from_run's removedItemIds. Returns the run object as the API stores it (key, name, status, owner, folder, items, …), or only the requested fields.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Return only these fields, e.g. ["key","name","status"]; sent to the API as one comma-separated parameter | |
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries the real burden and delivers: immutability (no PUT, items fixed at creation, status derived from item statuses), the internal-API auth flag required for mutation routes, and a non-obvious id-space caveat for items[].id. This is behavior far beyond anything the annotations provide.
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?
Purpose is front-loaded, followed by the immutability constraint, escape hatches, sibling alternatives, and the item-id warning. Every sentence carries information, though the single dense paragraph could be broken up for faster scanning.
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 read-only tool with no output schema, the description both sketches the return shape (key, name, status, owner, folder, items, or the filtered fields) and warns about the volatile items[].id. Nothing an agent needs to call it correctly or interpret results is missing.
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 both parameters are already documented, and the description's mention of returning 'only the requested fields' largely restates the schema. It adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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?
States a specific verb and resource ('Read one test run / test cycle including its items') plus the underlying endpoint GET /testrun/{key}. It distinguishes itself from sibling read tools by naming get_test_run_results and get_test_run_summary as the tools for executions and status counts respectively.
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 routes the agent to alternatives: get_test_run_results for executions, get_test_run_summary for status counts, and the immutability escape hatches (recreate_test_run_with_items, or the internal-API tools gated behind ZEPHYR_ALLOW_INTERNAL_API=true). Both the when-to-use and when-not-to-use cases are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_run_resultsARead-only
Page through the execution results of a test run / test cycle (GET /testrun/{key}/testresults/page). An item can have several executions; onlyLastExecutions=true keeps only the most recent one per item, so it never returns more values than the run has items. Creating a run already seeds one 'Not Executed' execution per item (that execution IS the item's last one), so with onlyLastExecutions=false — the default — total starts at the item count, not at 0. Older Zephyr Scale builds have no /page endpoint: the deprecated flat GET /testrun/{key}/testresults is then read and paginated client-side, and onlyLastExecutions is resolved from the run object, whose items[] name the id of each item's last execution; the note in the response says which path produced the values (a run that does not exist still surfaces as a 404). Values come in the order the API returns them, which is neither run-item order nor execution order. Returns { startAt, maxResults, total, count, isLast, values, note? } where total is the size of the set being paged — the number of results on the server, or the post-deduplication count when onlyLastExecutions is true — and isLast is startAt + count >= total.
| Name | Required | Description | Default |
|---|---|---|---|
| startAt | No | 0-based index of the first result to return (default 0) | |
| maxResults | No | Maximum number of results to return (default 50; the API server-side default is 200) | |
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) | |
| onlyLastExecutions | No | true returns only the last execution of each run item; omitted means the API default (false — all executions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint already covering safety, the description adds substantial behavior: pagination semantics, the total/isLast formula, the note field indicating which path produced values, unspecified ordering, and 404 on missing runs. This is far beyond what annotations convey.
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?
Front-loads the purpose and every sentence carries information, but it is delivered as a single dense paragraph mixing return-value, fallback, and parameter detail. Slightly heavy for a description, though little is wasted.
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?
No output schema exists, so the description fully documents the return shape ({ startAt, maxResults, total, count, isLast, values, note? }) and the meaning of total and isLast. An agent has everything needed to call and interpret results.
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% (baseline 3), and the description adds real meaning: onlyLastExecutions deduplication behavior and the fact that a newly created run already seeds one 'Not Executed' execution so total starts at the item count. It also clarifies maxResults client vs server defaults implicitly.
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?
States a specific verb (page through) and resource (execution results of a test run / test cycle), including the underlying endpoint. It is clearly distinguishable from siblings like get_test_run, get_test_run_summary, and get_latest_result_for_test_case.
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?
Gives clear operational context: onlyLastExecutions semantics, the default, and the older-build fallback path. It does not explicitly name an alternative tool or state when to prefer this over, say, get_latest_result_for_test_case, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_test_run_summaryARead-only
Aggregated execution summary of a test run / test cycle: composite read-only call of GET /testrun/{key} plus every page of its results (with the flat-endpoint fallback of get_test_run_results). Counts the LAST execution of each item — the run object names them, so latestResults and executed never exceed itemCount — grouping by status name verbatim in byStatus; nothing is normalized. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. runStatus is the status of the RUN itself (e.g. 'In Progress', 'Done'), not an execution status. executed counts every counted result whose status is not the literal 'Not Executed'. executionProgressPct = executed/itemCount (executed/latestResults when the run exposes no items), so an item with no counted last execution counts as not executed and note says how many there are. passRatePct is the share of the literal status 'Pass' among executed — 0 when nothing passed, and absent only when executed is 0. Returns { key, name, runStatus, itemCount?, latestResults, executed, executionProgressPct?, byStatus, passRatePct?, note? }.
| Name | Required | Description | Default |
|---|---|---|---|
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true; the description carries the rest and does so richly — counting semantics ('LAST execution of each item'), the guarantee that latestResults/executed never exceed itemCount, case-sensitive verbatim status grouping, and edge cases like passRatePct being absent only when executed is 0. This is far beyond what the annotation provides.
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?
Dense and front-loaded: purpose first, then counting rules, then return shape. Every sentence carries semantic weight about the output contract, though the run-on structure and parentheticals make it heavier than strictly necessary.
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?
No output schema exists, so the description must define the return contract — and it does, enumerating every field (key, name, runStatus, itemCount, latestResults, executed, executionProgressPct, byStatus, passRatePct, note) plus the derivation of the computed fields. Nothing needed to interpret the result is missing.
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?
There is a single parameter with 100% schema description coverage, including an example key format (PROJ-R123 / PROJ-C123). The description adds no additional parameter meaning, so the baseline of 3 applies.
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?
States a specific verb+resource ('aggregated execution summary of a test run / test cycle') and immediately disambiguates it from siblings get_test_run and get_test_run_results by describing it as a composite read that aggregates counts. An agent can tell exactly what this returns versus the raw endpoints.
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 names the underlying endpoint (GET /testrun/{key}) and the fallback path (get_test_run_results), giving the agent context for when this aggregation path applies. It does not, however, explicitly say 'use this instead of get_test_run when you need counts' or state exclusions, so routing is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkARead-only
Verify connectivity and credentials (GET /rest/api/2/myself) and, when ZEPHYR_DEFAULT_PROJECT_KEY is configured, whether the Zephyr Scale plugin answers on /rest/atm/1.0 (GET /environments). Any JSON error from the plugin — including 403 for a project without Zephyr — still counts as reachable; only Jira's generic HTML 404 page or a network failure counts as unreachable. The tool itself fails only when Jira does not answer or rejects the credentials. Returns { ok: true, jiraUser, baseUrl, zephyrPluginReachable } — zephyrPluginReachable is omitted when no default project key is set.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint provided, the description carries the behavioral load and does so richly: it discloses that any JSON error from the plugin (including 403) counts as reachable, that only Jira's HTML 404 or a network failure counts as unreachable, and that the tool itself fails only when Jira is unreachable or rejects credentials. It also describes the return shape, well beyond what the annotation provides.
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?
Three tight sentences, front-loaded with the primary check before the conditional plugin check. Every clause earns its place — the error-classification rules are exactly what an agent needs to interpret results, and the return summary is compact.
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?
There is no output schema, so the description appropriately documents the returned object (ok, jiraUser, baseUrl, zephyrPluginReachable) and the condition under which zephyrPluginReachable is omitted. Combined with the error semantics, an agent has everything needed to call and interpret this tool.
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 tool takes no parameters, so there are no argument semantics to document; the schema is empty with additionalProperties false. Baseline 4 applies since no parameter explanation is needed.
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?
States a specific verb+resource — verify connectivity and credentials via GET /rest/api/2/myself, plus optional Zephyr plugin reachability on /rest/atm/1.0. This is clearly a diagnostic tool, distinct from siblings like jira_get_current_user (which fetches the user) or jira_server_info (which returns server metadata).
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 explains the tool's operating conditions (only checks the plugin when ZEPHYR_DEFAULT_PROJECT_KEY is set) and failure conditions, which gives useful context. However, it never explicitly says when to reach for this tool versus alternatives such as jira_request or jira_get_current_user — the diagnostic use case is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_add_commentB
Add a comment (Server takes wiki markup, not Markdown)
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| body | Yes | comment text; Jira Server takes wiki markup, not Markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Jira id; Server sends ids as strings, numeric ones included |
| body | No | on Server this is wiki markup, not Markdown |
| self | No | absolute URL of this resource on the instance |
| author | No | user reference; Server uses `name`, Cloud uses `accountId` |
| created | No | creation time, ISO 8601 with offset |
| updated | No | last-modified time, ISO 8601 with offset |
| updateAuthor | No | the user who last edited the comment, when it was edited |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false already tells the agent this is a mutation. The description adds a genuinely useful behavioral caveat (Server expects wiki markup, not Markdown), but says nothing about permission requirements, notification side effects, or whether the comment can be edited afterwards.
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?
A single compact line with the key formatting gotcha front-loaded; no wasted words. It is a fragment rather than a full sentence, which slightly limits readability but not utility.
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?
Only two required, fully documented parameters and an output schema, so little is required of the description. It covers the main pitfall (markup format) but omits any mutation context such as permissions or side effects, leaving it minimally adequate.
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% – both 'key' (with an issue-key pattern) and 'body' are documented in the schema, and the description merely repeats the body formatting note. Baseline 3 is correct since the schema carries the parameter burden.
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?
States a specific verb and resource ('Add a comment'), which is unambiguous against the sibling read/update/delete comment tools. It does not explicitly name those siblings, but the tool name plus description make the add-vs-update-vs-delete distinction obvious.
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 on when to use this tool versus jira_update_comment or jira_delete_comment, and no prerequisites stated (e.g. comment permission on the issue). The only usable signal is the verb itself, so context is entirely implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_add_issues_to_sprintC
Move issues into a sprint
| Name | Required | Description | Default |
|---|---|---|---|
| issues | Yes | issue keys, e.g. ["PROJ-1","PROJ-2"] | |
| sprintId | Yes | numeric sprint id (from jira_list_sprints) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the behavioral burden. It does not disclose whether the sprint must be active or future, whether issues already in another sprint are moved or rejected, or what happens on partial failure.
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?
A single front-loaded sentence with no waste, which is good, but it is arguably under-specified rather than truly concise for a mutation tool with meaningful edge cases.
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 two-parameter mutation tool with no output schema and only a minimal annotation, the description omits the operational context an agent needs: sprint state constraints, behavior for issues already in a sprint, and return/failure semantics.
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% and both parameters are documented in-schema, including the cross-reference to jira_list_sprints for sprintId and an example format for issues. The description adds nothing beyond this, so baseline 3 applies.
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?
States a specific verb (move) and resource (issues into a sprint), which is distinguishable from the sibling jira_move_issues_to_backlog by direction. However, it does not explicitly name that sibling or scope the operation, so it stops short of full sibling differentiation.
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 on when to use this tool versus alternatives like jira_move_issues_to_backlog, nor any prerequisites (e.g., sprint must be active/future). Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_add_watcherA
Add a user as a watcher of an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| username | Yes | Username. Jira Server uses `name`, not the Cloud `accountId` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, which just confirms this is a write. The description adds nothing beyond that: it doesn't disclose idempotency (does adding an existing watcher fail or no-op?), permission requirements, or whether the watcher is notified. Minimal but not incorrect.
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?
A single front-loaded sentence with zero filler. Nothing to trim and nothing misplaced.
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 mutation tool with no output schema and only a readOnlyHint=false annotation, the description leaves too much unspecified: idempotency behavior, required permissions, and whether notifications fire. The schema covers inputs fully, but the behavioral surface of the write is undocumented.
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 both params are well documented in the schema (key pattern, username Server-vs-Cloud note). The description contributes no additional parameter meaning, so baseline 3 applies.
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?
Precise verb+resource: 'Add a user as a watcher of an issue'. An agent can immediately distinguish it from jira_get_watchers (read) and jira_remove_watcher (removal) without opening a schema.
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?
Usage is implied by the mutating verb 'add' – this is the action to take when a user needs to watch an issue. But the description names no alternative, no prerequisite (issue existence, user existence), and no when-not condition. Sibling jira_get_watchers and jira_remove_watcher are not referenced.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_add_worklogC
Log work against an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| comment | No | optional worklog comment (wiki markup) | |
| started | Yes | start time, e.g. 2026-01-01T09:00:00.000+0800 | |
| timeSpentSeconds | Yes | time spent in SECONDS |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Jira id; Server sends ids as strings, numeric ones included |
| self | No | absolute URL of this resource on the instance |
| author | No | user reference; Server uses `name`, Cloud uses `accountId` |
| comment | No | worklog comment (wiki markup) |
| started | No | when the work began, ISO 8601 with offset |
| timeSpentSeconds | No | time logged, in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only readOnlyHint=false, so the description carries nearly the full behavioral burden and delivers almost nothing: it omits that this is a mutating create, that it may fail if time tracking is disabled, and that timeSpentSeconds conflicts with the human-readable display format. Only the bare fact of logging work is conveyed.
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?
A single front-loaded sentence with zero filler — nothing wasted. It is arguably under-specified rather than verbose, but on the conciseness axis it is appropriately sized for what it attempts.
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?
An output schema exists, so return values need not be explained, and the input schema is fully documented. What remains missing is behavioral and routing context — this is a write operation in a four-tool worklog family and the description gives no indication of that.
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% and all four parameters (key, timeSpentSeconds, started, comment) are documented in the schema with patterns and format examples. The description adds no syntax or format detail beyond that, so the baseline 3 applies.
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?
"Log work against an issue" names a specific verb (log work) and resource (issue), so the action is unambiguous. It does not, however, distinguish itself from siblings jira_update_worklog, jira_delete_worklog, or jira_list_worklogs, which an agent must open separately to disambiguate.
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?
There is no when-to-use guidance, no prerequisites (timetracking must be enabled, user must have Work On Issues permission), and no pointer to the sibling worklog tools. The agent gets no signal about when creating a worklog is the right choice versus updating or listing one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_assign_issueC
Assign an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| assignee | Yes | username; null unassigns |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries the rest of the burden. It adds nothing about permissions, notification side effects, or the fact that passing a null assignee performs an unassign operation. No contradiction with annotations, but no value added either.
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?
Three words, front-loaded, no waste. It is appropriately terse for a simple two-parameter mutation, though it is on the edge of being under-specified rather than efficient.
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 write tool with no output schema and only a bare readOnlyHint annotation, the description should at minimum note the unassign behavior and any auth/notification implications. None of that is present, leaving the agent to rely entirely on the schema.
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%, and the schema itself documents both 'key' (with pattern and example) and 'assignee' (noting null unassigns). The description adds no meaning beyond that, so the baseline 3 applies.
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 states a verb and resource ('Assign an issue'), so the operation is unambiguous. However, it essentially restates the tool name jira_assign_issue and offers no differentiation from siblings such as jira_update_issue, which can also change an assignee.
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?
There is no when-to-use guidance, no prerequisites (e.g. needing an assignable user from jira_search_assignable), and no mention of alternatives like jira_update_issue. The agent must infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_create_issueA
Create an issue. Call jira_describe_create first for the field template; keys may be field ids or business aliases
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Field object. Keys may be field ids or business aliases; get the value shape from jira_describe_create / jira_describe_edit first |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Jira id; Server sends ids as strings, numeric ones included |
| key | No | issue key of the new issue, e.g. PROJ-123 |
| self | No | absolute URL of this resource on the instance |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only readOnlyHint=false, so the description carries most of the behavioral burden. It usefully discloses the two-phase workflow (describe_create then create) and that the fields object accepts ids or aliases, but says nothing about required fields, permission scope, failure modes, or what a rejected payload looks like. Adequate but with clear gaps for a mutation 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?
Two short sentences, the action statement front-loaded and the prerequisite immediately after. No filler, no restatement of the title.
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?
An output schema exists, so return values need no explanation, and the description covers the one genuinely hard part of this tool: how to construct the opaque fields object. It omits error/permission behavior, which is the only notable gap for a write operation.
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 single parameter is a free-form nested object (additionalProperties), so the schema alone cannot tell an agent what to put in it. The description compensates by stating keys may be field ids or business aliases and pointing to jira_describe_create for value shapes — meaningfully beyond the schema text.
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?
States a specific verb+resource ('Create an issue'), which is unambiguous against the read/update/delete siblings (jira_get_issue, jira_update_issue, jira_delete_issue). It does not explicitly differentiate itself from other create-flavored siblings such as jira_create_remote_link or jira_add_worklog, but the resource is precise enough that misrouting is unlikely.
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?
Gives an explicit prerequisite workflow: 'Call jira_describe_create first for the field template.' This is real routing guidance for the create path. It stops short of naming when-not-to-use conditions (e.g., to modify an existing issue use jira_update_issue), so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_create_remote_linkC
Attach a remote link (e.g. a Confluence page) to an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| url | Yes | target URL | |
| title | Yes | link text shown on the issue | |
| relationship | No | e.g. "is documented by" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, which merely confirms this is a write. The description adds no behavioral context: no permission requirements, no note on whether the link is idempotent or what happens on duplicate URLs, no return information. For a mutation tool this is thin.
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?
A single compact sentence with the verb and resource front-loaded and no filler. It is appropriately sized for a simple tool, though the parenthetical example is the only extra 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 four-parameter, no-output-schema tool with full schema coverage, the description covers the essential action but omits any usage context or behavioral notes. It is minimally viable rather than 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 all four parameters (key, url, title, relationship) are already documented in the schema, including the issue-key pattern and the example relationship string. The description adds nothing beyond that, so baseline 3 applies.
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?
Specific verb ('Attach') plus resource ('remote link') and a concrete example (Confluence page) that disambiguates from jira_link_issues, which handles issue-to-issue links. It never names that sibling explicitly, so differentiation is left to the agent's inference rather than stated.
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?
There is no when-to-use guidance, no mention of prerequisites, and no routing to alternatives such as jira_link_issues (internal links) or jira_get_remote_links (read side). The agent must infer the use case purely from the verb and resource.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_delete_attachmentCDestructive
Delete an attachment
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | attachment id, from jira_list_attachments |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered by structured data. The description adds nothing beyond that — no statement that deletion is permanent/irreversible, no permission requirements, and no error behavior — so it contributes no new behavioral context.
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 a single short sentence with zero filler and the action is front-loaded. It is appropriately terse for a one-parameter operation, though it borders on under-specification rather than deliberate conciseness.
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 destructive, non-read-only mutation with no output schema, the description is too thin: it omits irreversibility, permission needs, and failure modes. The destructiveHint annotation partly compensates, but the definition still leaves an agent without enough context to call this safely.
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 the schema itself documents the single `id` parameter, including its source ("from jira_list_attachments"). The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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 gives a specific verb and resource ("Delete an attachment"), so an agent knows exactly what operation is performed. However, it does not distinguish this tool from the similarly named sibling `delete_attachment` (non-prefixed) or from other delete siblings, leaving ambiguity about which namespace to call.
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?
There is no when-to-use guidance, no preconditions, and no alternatives named. The agent gets no signal about how the attachment id should be obtained or when deletion is appropriate versus using `jira_get_attachment_meta` first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_delete_commentCDestructive
Delete a comment
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| commentId | Yes | comment id, from jira_list_comments |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered structurally. The description adds nothing beyond that: it doesn't state that deletion is permanent/irreversible, whether permissions are required, or what the response looks like.
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?
A single, front-loaded sentence with zero waste. It is efficient, though its brevity leaves it under-specified rather than optimally 'concise'.
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 two-parameter delete with full schema coverage and annotations covering the safety profile, the minimum viable information is present. It still omits confirmation of permanence, which matters for a destructive operation.
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%, including a useful pointer that commentId comes from jira_list_comments, so the schema carries the parameter burden. The description adds no meaning beyond it, making the baseline 3 appropriate.
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 gives a specific verb+resource ('Delete a comment') that an agent can readily distinguish from its siblings jira_add_comment, jira_update_comment and jira_list_comments by name. It is clear but adds no explicit sibling differentiation beyond the naming convention.
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?
There is no guidance on when to use this versus the other comment tools, no prerequisites, and no mention of when deletion is appropriate or inadvisable. The agent must infer everything from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_delete_issueCDestructive
Delete an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| deleteSubtasks | No | also delete its subtasks (default false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered structurally. The description adds nothing beyond that: it does not say the deletion is permanent/irreversible, what happens to subtasks by default, or whether the issue must be unlinked first. With annotations lowering the bar, a bare restatement still leaves meaningful behavioral gaps.
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?
It is a single short sentence with no waste and the action is front-loaded, but it is so terse that it is under-specified rather than genuinely concise. Nothing is padded, but nothing is earned beyond the name either.
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 destructive mutation tool, the definition is incomplete: no mention of irreversibility, subtask handling implications, or required permissions. The annotations cover the destructive flag and the schema covers inputs, but the description does not compensate for the remaining behavioral risk an agent needs to weigh before calling it.
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%, and both parameters (key with pattern and example, deleteSubtasks with default) are fully documented in the schema. The description adds no parameter meaning beyond that, so the baseline of 3 applies.
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 phrase 'Delete an issue' states a specific verb and resource, but it essentially restates the tool name (jira_delete_issue) without differentiating it from sibling delete tools like jira_delete_comment, jira_delete_attachment, or jira_delete_link. An agent can infer the target, but nothing in the text distinguishes scope or intent beyond the name itself.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives or conditions (e.g., when to prefer jira_delete_link or jira_delete_comment for related objects). The agent must infer all usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_delete_linkADestructive
Delete an issue link by its id (find ids in the issue's issuelinks field)
| Name | Required | Description | Default |
|---|---|---|---|
| linkId | Yes | link id, from the issue issuelinks field |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this is a destructive write. The description adds only the source of the link id; it does not state that deletion is permanent or what happens to the linked issues, which is the kind of context that would add value beyond the annotations.
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?
A single front-loaded sentence with a useful parenthetical and no filler. The phrase 'by its id' mildly restates the parameter name, keeping it just under a perfect score.
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 one-parameter destructive tool with annotations covering the safety profile and no output schema, the description supplies everything needed to invoke it correctly: the action, the identifier, and where to find that identifier.
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% for the single linkId parameter, so the schema already documents it. The description's note about the issuelinks field reinforces but does not meaningfully extend the schema's own description.
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 states a specific verb and resource ('Delete an issue link by its id'), which is unambiguous and clearly distinguishable from the link-creation siblings such as jira_link_issues. It does not explicitly name an alternative tool, so it falls just short of the top mark.
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 parenthetical 'find ids in the issue's issuelinks field' gives a prerequisite hint on how to obtain the required input, which is genuinely useful. However, there is no guidance on when to use this versus other link-related tools or any caution about the operation being irreversible.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_delete_worklogCDestructive
Delete a worklog
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| worklogId | Yes | worklog id, from jira_list_worklogs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is known from structured data. The description adds nothing beyond that — no note that deletion is permanent/irreversible, no warning that the worklog is unrecoverable, and no indication of permissions required.
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?
It is a single short fragment with no wasted words and the operation is front-loaded. But the brevity reflects under-specification rather than tight economy, since nothing about behavior or usage is covered.
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 two-parameter delete with full schema coverage and annotations signaling destructiveness, the structured fields carry most of the load. Still, an irreversible mutation tool with no output schema would benefit from at least a note on permanence or confirmation expectations.
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%, and the schema documents both key (with pattern and example) and worklogId (pointing to jira_list_worklogs). The description adds no parameter meaning beyond the schema, so the baseline 3 applies.
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 states a verb (Delete) and a resource (worklog), so the basic operation is identifiable. However, it is essentially the tool name restated with no additional specificity, and it does not distinguish this from close siblings like jira_update_worklog or jira_list_worklogs.
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?
There is no guidance on when to use this tool versus jira_update_worklog, jira_delete_issue, or other destructive siblings, and no mention of prerequisites or exclusions. The only implied usage comes from the name itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_describe_createARead-only
Call before creating an issue. Returns the fields writable for this project/type, which are required, their value shapes and allowed values
| Name | Required | Description | Default |
|---|---|---|---|
| projectKey | Yes | project key, e.g. PROJ | |
| issueTypeName | Yes | issue type name, e.g. Task; list them with jira_get_issue_types |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a safe metadata read, and the description adds valuable return-content detail (writable fields, required flags, value shapes, allowed values) that compensates for the absence of an output schema. It does not mention that results are scoped per project/type beyond the brief parenthetical, leaving some behavior inferred.
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 front-loaded sentences with no waste: the trigger condition first, then a precise enumeration of what is returned. Every clause earns its place.
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?
With no output schema, the description carries the burden and it explains the return payload well enough for the agent to consume it before creating an issue. Annotations cover the safety profile, so remaining gaps are minor.
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% with only two required parameters, both fully documented in the schema (including the pointer to jira_get_issue_types). The description adds no parameter-level meaning, so the baseline of 3 is correct.
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?
States a specific verb+resource: it returns the field metadata (writable fields, required fields, value shapes, allowed values) for issue creation. Clear enough that an agent knows what it does, though it doesn't explicitly contrast itself with the parallel jira_describe_edit sibling.
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?
"Call before creating an issue" gives explicit, actionable timing for when to use it. There is no statement of when not to use it and no named alternative, but the intended invocation point is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_describe_editARead-only
Call before updating an issue. Returns the fields editable on this issue right now (already filtered by workflow/screen)
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read; the description adds the non-obvious behavioral fact that the returned field set is dynamic ("right now") and pre-filtered by workflow/screen. It doesn't mention auth requirements, but for a read-only introspection tool with annotation coverage, this is solid added value.
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 short sentences with the action directive front-loaded ahead of the return-value explanation. Every clause earns its place with no filler.
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 single-param read tool with an annotation covering safety, the description explains both purpose and the nature of the return set. No output schema is needed, and the only minor gap is not distinguishing it from sibling discovery tools like jira_get_fields.
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?
Only one parameter (key) with 100% schema description coverage including a regex pattern and example. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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?
States a specific verb (Returns) and resource (fields editable on this issue right now), and adds the scoping detail that results are already filtered by workflow/screen. It does not explicitly differentiate itself from the similar sibling jira_get_fields (static field list) or jira_describe_create, so it stops just short of a 5.
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?
Gives a clear directive on when to use it: "Call before updating an issue." This ties the tool to the update workflow. It doesn't name alternatives (e.g., jira_get_fields for the unfiltered list) or state when-not to use it, so it's clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_attachment_metaBRead-only
Get attachment metadata (filename/size/author/download url)
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | attachment id, from jira_list_attachments |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | attachment id, as a string or a number depending on the endpoint |
| self | No | absolute URL of this resource on the instance |
| size | No | size in bytes |
| author | No | user reference; Server uses `name`, Cloud uses `accountId` |
| content | No | download URL (absolute) |
| created | No | creation time, ISO 8601 with offset |
| filename | No | file name as uploaded |
| mimeType | No | content type the server detected |
| thumbnail | No | thumbnail URL, when the server generated one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this is a safe read. The description adds the concrete set of metadata fields returned, which is useful context, but says nothing about auth requirements, error behavior for missing attachments, or size/pagination 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?
A single compact sentence with the resource and returned fields front-loaded and no wasted text. It is arguably under-informative rather than verbose, but structurally clean.
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?
An output schema exists so return values need not be explained, yet the description still names the fields. For a single-parameter, read-only tool with full schema coverage, this covers what an agent needs to call it correctly, with only routing guidance missing.
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% and the single 'id' parameter is already documented in the schema (including its source, jira_list_attachments). The description adds no parameter meaning beyond that, so the baseline 3 applies.
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?
States a specific verb (Get) and resource (attachment metadata) and even enumerates the returned fields (filename/size/author/download url). It is clearly distinct from sibling write tools like jira_upload_attachment or jira_delete_attachment, though it does not explicitly name or contrast with a sibling.
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 gives no explicit when-to-use or when-not-to-use guidance. The only routing hint, that the id comes from jira_list_attachments, lives in the input schema rather than the description, so an agent reading only the description gets no selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_board_issuesCRead-only
List the issues on a board
| Name | Required | Description | Default |
|---|---|---|---|
| jql | No | JQL, e.g. project = PROJ AND status = Open | |
| boardId | Yes | numeric board id | |
| maxResults | No | page size (default 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| expand | No | which optional sections the server inlined in this response |
| isLast | No | true when this is the last page |
| issues | Yes | issue array; each item has the shape of jira_get_issue |
| startAt | No | 0-based index of the first item in this page |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds nothing beyond that safe-read implication. It does not explain pagination behavior despite a maxResults parameter, nor how jql interacts with board scope. With annotations lowering the bar, the description still contributes no extra behavioral context.
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?
A single, front-loaded sentence with no waste. It is appropriately sized, though it is terse to the point of under-specification rather than maximally informative.
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?
An output schema exists, so return values need not be described, and all parameters are schema-documented. However, for a list tool sitting among search_issues, get_sprint_issues and list_backlog, the description omits any routing or pagination nuance an agent would need to choose it correctly.
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 all three parameters (jql with example, boardId as numeric id, maxResults page size) are already documented in the schema. The description adds no syntax, format, or interaction detail beyond that, making the baseline 3 appropriate.
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?
States a specific verb (List) and resource (issues) with a scoping qualifier (on a board), which distinguishes it from jira_search_issues and jira_get_sprint_issues by resource scope. However, it does not name or contrast with those siblings explicitly, so an agent must infer the distinction.
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?
There is no when-to-use guidance, no mention of when to prefer this over jira_search_issues or jira_get_sprint_issues, and no prerequisites stated. The only routing signal is the implied 'board' scope in the purpose sentence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_componentsCRead-only
List the components of a project
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | project key, e.g. PROJ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring the safe-read profile, the description contributes nothing further — no pagination behavior, no scope/ordering note, no indication of what a component entry contains. It essentially restates the title.
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?
A single front-loaded sentence with no filler. It is efficient, though its brevity is partly the cause of the missing guidance rather than a virtue of tight writing.
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 trivial single-parameter read tool with annotations covering safety, little else is strictly needed. However, with no output schema, the description offers no hint of the returned component shape or count, leaving a modest gap.
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%, and the 'key' parameter is documented with a format pattern and example, so the schema does the heavy lifting. The description adds no extra meaning about the key, making the baseline 3 appropriate.
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?
States a specific verb and resource ('List the components of a project'), so the agent knows exactly what it does. It does not, however, differentiate itself from nearby siblings like jira_get_versions or jira_get_statuses, which follow the same pattern.
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 on when to use this versus alternatives (e.g. jira_get_project or jira_get_versions) and no prerequisites stated beyond the implicit project key. Usage is only inferable from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_current_userBRead-only
Get the authenticated user
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | user key; on Server it is usually the lower-cased login name |
| name | No | Server login name; Server uses this where Cloud uses accountId |
| self | No | absolute URL of this resource on the instance |
| active | No | false for a deactivated account |
| expand | No | which optional sections the server inlined in this response |
| locale | No | UI locale, e.g. zh_CN |
| timeZone | No | time zone from the user profile |
| accountId | No | Cloud only |
| avatarUrls | No | avatar URLs keyed by size: 16x16, 24x24, 32x32, 48x48 |
| displayName | No | full name as shown in the UI |
| emailAddress | No | absent when Jira hides e-mail addresses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds one piece of behavioral context beyond that: the returned identity is the authenticated caller, not a looked-up user. It says nothing about auth prerequisites, error behavior when unauthenticated, or rate limits, so it does not go far beyond the annotation.
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?
Five words, front-loaded with the verb, no filler. It is arguably too terse to be maximally useful, but nothing in it is wasted.
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?
An output schema exists, so return values need no explanation, and there are no parameters or complex interactions to cover. For a zero-arg read tool the description is essentially sufficient, missing only sibling routing context.
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 tool takes zero parameters, and the schema is an empty object, so there is nothing for the description to disambiguate. The baseline for a parameterless tool applies.
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 states a specific verb (Get) and a specific resource (the authenticated user), and the word 'authenticated' scopes it to the caller's own identity rather than an arbitrary user. That scoping does partly distinguish it from siblings like jira_get_user and jira_search_users, though it never names them.
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?
There is no explicit when-to-use guidance and no mention of alternatives such as jira_get_user or find_jira_user. The agent must infer that this tool is for the current caller and the others are for looking up other users.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_fieldsARead-only
List every field, plugin-provided ones included. Use it to obtain field ids
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this as a safe read, so the safety profile is covered by annotations. The description adds scope context (plugin fields included), which is genuinely useful, but says nothing about ordering, result size, or whether it includes custom fields beyond plugins. Adequate but limited beyond annotations.
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 short clauses with no filler, and the scope statement is front-loaded before the use case. Efficient and front-loaded, though extremely terse.
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 zero-parameter read tool, the description covers what is returned at a high level and its primary purpose (obtaining field ids). No output schema exists, so the return shape is only implied, but nothing critical is missing for invocation.
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?
Zero parameters, so the baseline of 4 applies. There are no parameter semantics for the description to clarify.
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?
States a specific verb+resource ('List every field') and adds a distinguishing scope note ('plugin-provided ones included'). It is clearly separable from metadata siblings like jira_get_issue_types or jira_get_priorities, though it never names them. Clear but without explicit sibling differentiation.
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?
'Use it to obtain field ids' gives an implied usage context, which is helpful. It does not state when not to use it or point to a named alternative among the many metadata tools, so guidance remains thin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_issueARead-only
Get an issue. Returns all fields by default, custom fields included. Use expand to pull extra sections in the same call (e.g. changelog, renderedFields, transitions)
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| expand | No | comma-separated, e.g. changelog,renderedFields,names,schema | |
| fields | No | field ids; custom fields are customfield_xxxxx |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Jira id; Server sends ids as strings, numeric ones included |
| key | Yes | issue key, e.g. PROJ-123 |
| self | No | absolute URL of this resource on the instance |
| expand | No | which optional sections the server inlined in this response |
| fields | Yes | business fields; custom and plugin fields are keyed customfield_xxxxx and their value shape varies by field type |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes this is a safe read, so the bar is lower. The description adds useful behavior beyond annotations: the default is a full-field payload including custom fields, and expand can retrieve additional sections in one round trip. It says nothing about permissions, rate limits, or error behavior for a missing key.
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 short sentences, zero waste, with the core action and default payload front-loaded and the expand hint following. Nothing is padded or repeated.
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?
An output schema exists, so return values need no explanation, and readOnlyHint covers safety. The description supplies the one thing the schema can't: that the default response is all fields including custom fields, and how to widen it via expand. Complete for a simple read-by-key tool.
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 all three parameters are already documented with examples. The description's mention of expand adds the nuance of co-fetching sections in the same call, but duplicates the schema's own example values (changelog, renderedFields) rather than adding new semantics. Baseline 3 applies.
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?
States a specific verb and resource ('Get an issue') and immediately characterizes the default payload ('all fields by default, custom fields included'), which separates it from list/search siblings like jira_search_issues. It never names a sibling explicitly, so differentiation is implied rather than stated.
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 tells the agent how to use the expand parameter to fetch extra sections 'in the same call,' which is genuine usage guidance, but it offers no when-to-use/when-not framing relative to jira_search_issues or jira_get_transitions. Usage context is implied only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_issue_typesBRead-only
List issue types
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds nothing beyond that — no indication of scope (global vs per-project), whether the result is cacheable, or how many types are returned. It merely restates the operation.
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 words, front-loaded verb-first, with zero filler. Appropriately sized for a trivial no-argument lookup, though it is terse to the point of saying only what the name already says.
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 zero-parameter, read-only listing tool with no output schema, the description is minimally adequate: it conveys the operation but not the scope of the data (all issue types vs project-specific) or the shape of the response. Nothing is wrong, but an agent gets no help beyond the name.
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 tool takes zero parameters, so there is nothing for the description to disambiguate; the schema is trivially complete. Baseline 4 applies for a no-argument tool.
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?
States a specific verb ('List') and resource ('issue types'), which cleanly distinguishes it from the nearby resource-lookup siblings such as jira_get_priorities, jira_get_statuses, and jira_get_fields. It stops short of any differentiation statement or scope qualifier, but the purpose is unambiguous.
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 on when to use this versus alternatives, nor any precondition or context (e.g. whether issue types are global or project-scoped). The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_link_typesARead-only
List issue link types. Use the returned name as the link type when linking issues
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| issueLinkTypes | Yes | available issue link types |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares this is a safe read with no side effects, so the safety bar is met by annotations. The description adds that the `name` field is the consumable value for linking, which is useful output-consumption context, but it discloses nothing further about caching, auth, or result shape.
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 short sentences with zero waste: the purpose is front-loaded and the follow-on sentence earns its place by telling the agent what to do with the result.
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?
An output schema exists, so return values need no explanation, and the description supplies the one integration detail an agent needs (use `name` for linking). It is essentially complete for a zero-arg read-only lookup, with only minor room for extra context.
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 tool takes zero parameters, so the baseline is 4. The description's note about the returned `name` concerns output rather than inputs and does not detract from the parameter picture, which is trivially complete.
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?
States a specific verb and resource ('List issue link types'), which is clearly distinct from neighbors like jira_get_issue_types, jira_get_priorities, or jira_get_remote_links. However, it never explicitly names a sibling to contrast with, so it falls short of the top band.
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 second sentence gives real workflow guidance: the returned `name` is the value to pass when linking issues, which routes the agent to jira_link_issues. It does not state exclusions or prerequisites, so it is clear context without full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_prioritiesCRead-only
List priorities
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and the description adds nothing beyond that. With no output schema, it should disclose what is returned (priority names, IDs, ordering) but does not.
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 words, front-loaded with the verb, no filler. It is efficient, though arguably too terse to be informative.
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 (no params, read-only), so a short description is defensible, but with no output schema the description never states what the priorities list contains or how to use it. Minimum viable for a metadata lookup.
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 tool takes zero parameters, so the baseline of 4 applies. The schema is empty and the description adds nothing, but there is nothing to document.
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?
States a specific verb ('List') and resource ('priorities'), so an agent knows this retrieves the available Jira priority values. However, it does not distinguish itself from the many sibling metadata-list tools (jira_get_statuses, jira_get_issue_types, jira_get_fields), and it essentially restates the tool name.
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?
There is no guidance on when to use this versus siblings like jira_get_fields or jira_get_statuses, and no context such as 'use to resolve valid priority names/IDs before creating or updating an issue.' Nothing is said about when-not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_projectCRead-only
Get project details
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | project key, e.g. PROJ |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Jira id; Server sends ids as strings, numeric ones included |
| key | Yes | project key, e.g. PROJ |
| lead | No | user reference; Server uses `name`, Cloud uses `accountId` |
| name | No | project name |
| self | No | absolute URL of this resource on the instance |
| roles | No | role name -> role URL |
| expand | No | which optional sections the server inlined in this response |
| archived | No | true when the project is archived |
| versions | No | version array, when the response expands it |
| avatarUrls | No | project avatar URLs keyed by size |
| components | No | component array, when the response expands it |
| issueTypes | No | issue-type array, when the response expands it |
| description | No | project description, when set |
| assigneeType | No | default assignee rule for the project |
| projectTypeKey | No | software | service_desk | business |
| projectCategory | No | the category this project belongs to, when it has one |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is covered, but the description adds nothing beyond that — it does not say what "details" encompasses, whether archived/deleted projects are resolvable, or what errors occur for an unknown key. With annotations present the bar is lower, yet this description contributes zero additional behavioral context.
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 a single four-word phrase with no wasted words and is trivially front-loaded. Its brevity, however, crosses into under-specification rather than efficient conciseness, so it does not earn a 4.
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 a simple single-parameter read with a fully documented schema and an output schema, so return values need not be explained. It is minimally adequate, but the vague term "details" leaves the agent unsure what project attributes are returned or how this differs from listing projects.
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% and the single required parameter (key) is fully documented in the schema with an example pattern. Per the baseline rule, a 3 is correct when the schema does the heavy lifting and the description adds no parameter meaning beyond it.
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?
"Get project details" gives a clear verb and resource, so the basic action is unambiguous. However, it offers no differentiation from siblings like jira_list_projects (which also deals with projects) or jira_get_issue (same get-by-key pattern), leaving the agent to infer scope from the name alone.
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?
There is no guidance on when to use this tool versus jira_list_projects or other project-related tools, and no stated prerequisites such as required project permissions or whether the project must exist. The agent must guess the intended usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_remote_linksARead-only
List the remote links (e.g. Confluence pages) attached to an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered, and the description adds no behavioral context beyond that: no pagination behavior, no note on what happens for issues with no links, no return shape. For a read-only list tool this leaves the description doing little work.
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?
One sentence, front-loaded with the verb and resource, and every clause earns its place; nothing redundant.
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, single-parameter read-only list operation with full schema coverage and no output schema, the description is sufficient to call the tool correctly. It stops short of 5 only because pagination or result-scope behavior is never hinted at.
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% and the single 'key' parameter is fully documented with a pattern and example, so the schema carries the burden. The description only implicitly ties the issue key to the target issue and adds no format or edge-case detail 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?
States a specific verb (List), resource (remote links), and scope (attached to an issue), and adds a concrete example (Confluence pages) that separates it from the similarly-named jira_get_link_types, jira_link_issues, and jira_create_remote_link siblings.
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?
Usage is implied by 'attached to an issue' — the agent can infer it reads existing remote links for one issue — but there is no explicit when-to-use guidance or naming of alternatives such as jira_get_link_types for link metadata.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_sprintCRead-only
Get a sprint by id
| Name | Required | Description | Default |
|---|---|---|---|
| sprintId | Yes | numeric sprint id (from jira_list_sprints) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | numeric sprint id, as a number here |
| goal | No | sprint goal; absent when none was set |
| name | No | sprint name |
| self | No | absolute URL of this resource on the instance |
| state | No | future | active | closed |
| endDate | No | planned or actual end, ISO 8601 with offset |
| startDate | No | planned or actual start, ISO 8601 with offset |
| completeDate | No | when the sprint completed; absent while it is not closed |
| originBoardId | No | the board this sprint was created from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered, but the description adds nothing beyond that - no note on behavior for a nonexistent sprint id, no error handling, no pagination or return-shape context.
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?
A single short sentence, front-loaded and free of filler. It is efficient, though its brevity edges toward under-specification rather than optimal conciseness.
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 read-only getter with an output schema and full annotation coverage, the description is minimally adequate. It still leaves the agent without usage guidance or failure-mode behavior, which are the only remaining gaps.
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% and there is a single integer parameter, so the schema fully documents it (including the exclusiveMinimum and the pointer to jira_list_sprints). The description adds no meaning beyond that, making the baseline 3 appropriate.
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?
States a specific verb and resource ('Get a sprint'), so the agent knows exactly what it retrieves. It does not distinguish itself from siblings like jira_list_sprints or jira_get_sprint_issues, so it falls short of a 5.
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 offers no when-to-use context, no prerequisites, and no routing to alternatives. The only hint at usage lives in the schema's parameter description ('from jira_list_sprints'), which is not part of the description text.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_sprint_issuesCRead-only
List the issues in a sprint
| Name | Required | Description | Default |
|---|---|---|---|
| jql | No | JQL, e.g. project = PROJ AND status = Open | |
| sprintId | Yes | numeric sprint id (from jira_list_sprints) | |
| maxResults | No | page size (default 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| expand | No | which optional sections the server inlined in this response |
| isLast | No | true when this is the last page |
| issues | Yes | issue array; each item has the shape of jira_get_issue |
| startAt | No | 0-based index of the first item in this page |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description is not required to restate safety. But it adds nothing beyond that: no note on pagination behavior despite a maxResults parameter, no scoping semantics, no indication that jql can further narrow the sprint results. The description carries no behavioral value the annotations don't.
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?
A single short sentence with no padding and the resource front-loaded. It is efficient, though the extreme brevity leans toward under-specification rather than disciplined conciseness.
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?
An output schema exists so return values need not be described, but for a tool sitting among many overlapping issue-listing siblings the description is too thin. It omits how this differs from jira_get_board_issues/jira_search_issues and says nothing about the jql narrowing option or paging, leaving real gaps.
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% – sprintId, jql, and maxResults are all documented in the schema, including the pointer to jira_list_sprints. The description adds no parameter meaning on top of that, so the baseline of 3 applies.
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 states a clear verb+resource ('List the issues in a sprint'), so the basic purpose is legible. However, it does nothing to separate this tool from siblings like jira_get_board_issues, jira_list_backlog, or jira_search_issues, all of which also enumerate issues. Without that differentiation the agent must infer which is appropriate.
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?
There is no when-to-use guidance, no condition that selects this over jira_search_issues or jira_get_board_issues, and no mention of prerequisites such as needing a sprintId obtained from jira_list_sprints. The agent gets no routing help at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_statusesCRead-only
List the statuses of a project
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | project key, e.g. PROJ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered, but the description adds nothing beyond it. It does not say whether statuses are project-workflow-scoped, whether categories/IDs are returned, or whether results are cached or paginated.
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?
A single front-loaded sentence with no waste, but it is terse to the point of under-specification rather than genuinely concise; the brevity leaves real gaps unaddressed.
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 one-parameter read tool with full schema coverage, no output schema, and a readOnly annotation, the definition is minimally adequate. It omits the scope of returned statuses (workflow vs. global) and what the caller can do with them, which would be the natural value-add.
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% and the single 'key' parameter is documented with a pattern and example, so the schema carries the load. The description adds no format or constraint detail beyond it, making the baseline 3 appropriate.
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?
States a specific verb and resource ('List the statuses of a project') with the required project key implied, so an agent knows exactly what it retrieves. It does not, however, distinguish itself from the cluster of sibling metadata getters (jira_get_priorities, jira_get_issue_types, jira_get_fields), so it stops short of a 5.
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 on when to use this versus the other metadata tools, and no mention of prerequisites such as needing a valid project key or the tool being scoped to a project's workflow. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_transitionsARead-only
List the transitions currently available for this issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
Output Schema
| Name | Required | Description |
|---|---|---|
| expand | No | which optional sections the server inlined in this response |
| transitions | Yes | currently available transitions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is covered. The description adds that transitions are scoped to the given issue and are 'currently available' (state-dependent), which is useful context, but does not describe return format, ordering, or whether the key must exist.
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?
A single sentence that is front-loaded with the verb and includes the essential scoping concept. 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?
Output schema is present, so return-value explanation is not needed, and the annotations cover read-only behavior. However, for a tool whose sibling jira_transition_issue performs the mutation, the description is thin on when to use which, leaving a small gap for an agent navigating this cluster.
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 the single parameter 'key' has a clear description with a pattern (issue key, e.g. PROJ-123). The description adds no parameter semantics beyond the schema, so baseline 3 is appropriate for a 1-param tool with full schema coverage.
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?
States a specific verb (List) and resource (transitions available for an issue), making the purpose clear. Sibling tool jira_transition_issue (which performs a transition) is implicitly distinguished by 'List ... available', but the description never names that sibling or explicitly distinguishes listing vs. executing.
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 phrase 'currently available for this issue' implies the tool is a discovery step before calling jira_transition_issue, but no explicit when-to-use or when-not-to-use guidance is given. With output schema present, the flow is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_userCRead-only
Get a user by username
| Name | Required | Description | Default |
|---|---|---|---|
| username | Yes | Username. Jira Server uses `name`, not the Cloud `accountId` |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | user key; on Server it is usually the lower-cased login name |
| name | No | Server login name; Server uses this where Cloud uses accountId |
| self | No | absolute URL of this resource on the instance |
| active | No | false for a deactivated account |
| expand | No | which optional sections the server inlined in this response |
| locale | No | UI locale, e.g. zh_CN |
| timeZone | No | time zone from the user profile |
| accountId | No | Cloud only |
| avatarUrls | No | avatar URLs keyed by size: 16x16, 24x24, 32x32, 48x48 |
| displayName | No | full name as shown in the UI |
| emailAddress | No | absent when Jira hides e-mail addresses |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered, but the description adds nothing beyond that: no indication of what happens when the username does not exist, whether it returns a partial or full user object, or which Jira deployment it targets. A single phrase that merely restates the operation leaves the behavioral picture thin.
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?
A single short sentence with the operation front-loaded and no filler. It is efficient, though the brevity comes at the cost of the disambiguating detail it omits.
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?
With an output schema present, return values need not be described, and readOnlyHint covers safety. But for a lookup tool competing with multiple user-search siblings, the description is not complete enough to route the agent confidently.
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% and the schema itself explains the important Server-vs-Cloud distinction of `name` vs `accountId`. The description only repeats "by username" and adds no syntax, format, or edge-case detail, so this is the baseline 3.
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?
States a specific verb and resource ("Get a user"), so the action is unambiguous. However, it does not distinguish this tool from the very similar siblings find_jira_user, jira_search_users, and jira_get_current_user, leaving the agent to guess which user-lookup tool is appropriate.
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?
There is no guidance on when to use this tool versus the three sibling user-lookup tools. The description neither states prerequisites nor names an alternative, so selection between jira_get_user, find_jira_user, and jira_search_users must be inferred from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_versionsBRead-only
List the versions of a project
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | project key, e.g. PROJ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds nothing beyond that: it does not say whether archived/released versions are included, whether results are paginated, or what a version entry contains. For a read tool the bar is lower, but this description contributes essentially no behavioral context.
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?
A single five-word sentence with the resource and scope front-loaded. There is no filler or 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 simple, single-parameter read operation with annotations and full schema coverage, the description is minimally adequate. However, with no output schema, the agent gets no sense of the returned version shape or whether filtering/pagination applies.
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%; the single 'key' parameter is documented in-schema with its pattern and an example ('project key, e.g. PROJ'). The description adds no further parameter meaning, which is the expected baseline when the schema does the work.
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?
States a specific verb and resource ('List the versions of a project'), so the operation is immediately clear. It does not differentiate itself from structurally similar siblings such as jira_get_components or jira_get_statuses, which follow the identical pattern.
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?
There is no guidance on when to call this versus alternatives, no mention of prerequisites (e.g., the project must exist or be visible to the caller), and no exclusions. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_get_watchersARead-only
List the watchers of an issue, and whether the authenticated user is watching
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
Output Schema
| Name | Required | Description |
|---|---|---|
| self | No | absolute URL of this resource on the instance |
| watchers | Yes | user array; each item has the shape of jira_get_user |
| isWatching | No | whether the authenticated user is watching |
| watchCount | No | how many users watch the issue |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds one genuine behavioral fact beyond the annotations: the response includes the authenticated user's own watch status, not just the watcher list. It says nothing about permissions, visibility restrictions, or ordering, so it adds modest value only.
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?
A single sentence with no filler, front-loading the core action and folding the extra output detail into the same clause. Nothing is wasted and nothing essential is buried.
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?
An output schema exists, so return values need not be described, and annotations cover the safety profile; the one required parameter is fully documented in the schema. For a simple read tool this is nearly complete, with only minor gaps around visibility/permission behavior.
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?
Only one parameter and schema description coverage is 100% – the schema already documents 'key' with a format example and a regex pattern. The description adds no extra meaning about the key, so the baseline 3 applies.
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?
States a specific verb (List) and resource (watchers of an issue) and even adds the output nuance that it reports whether the authenticated user is watching. It does not, however, name the adjacent siblings jira_add_watcher / jira_remove_watcher to make the read-vs-write routing explicit, so it falls short of a 5.
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 verb+resource make the general context (reading watcher state on a known issue key) self-evident, but there is no explicit statement of when to prefer this over jira_get_issue or how it relates to add/remove watcher flows. Usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_jsm_queuesCRead-only
List Jira Service Management queues
| Name | Required | Description | Default |
|---|---|---|---|
| serviceDeskId | Yes | numeric id passed as a string |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| isLast | No | true when this is the last page |
| values | Yes | page contents |
| startAt | No | 0-based index of the first item in this page |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this as a safe read, so the description is not obligated to repeat that. But it adds nothing further – no pagination behavior, no ordering, no rate-limit or scope notes – leaving the behavioral profile no richer than the annotation.
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?
A single front-loaded sentence with zero filler. It is efficient, though its brevity edges toward under-specification rather than true conciseness.
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?
An output schema exists, so return values need not be explained, and the single parameter is fully documented in the schema. Still, for a JSM-specific tool the description says nothing about how serviceDeskId is obtained or what the queues represent, leaving a small but real gap.
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% and there is a single parameter, so the schema already documents serviceDeskId as a numeric string. The description adds no meaning beyond that, which matches the baseline 3 for full-coverage schemas.
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?
States a specific verb (List) and resource (Jira Service Management queues), so the operation is unambiguous. However, it offers no differentiation from sibling tools and no scope detail (e.g., per service desk vs. global), which is why it falls short of a 5.
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?
There is no when-to-use or when-not-to-use guidance, and no indication of prerequisites such as needing a service desk id. The agent gets a bare purpose statement with no routing context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_link_issuesA
Link two issues. type is a link type name from jira_get_link_types. The response carries no id - read the issue's issuelinks field to get it
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | link type name, e.g. Blocks | |
| comment | No | optional comment to add on the outward issue | |
| inwardIssue | Yes | the issue that the link points inward to | |
| outwardIssue | Yes | the issue the link points outward from |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=false, the annotations already signal a mutation. The description adds genuinely useful non-obvious behavior: the response carries no id and the link must be read back from the issue's issuelinks field. It stops short of noting auth requirements or idempotency.
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 tight sentences, front-loaded with the core action, followed by the essential type-sourcing and read-back caveats. No filler.
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?
Since there is no output schema, the description appropriately compensates by explaining the return gotcha (no id, read issuelinks). It is complete enough to call the tool correctly, though a note on permissions or duplicate-link behavior would round it out.
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 the schema already documents all four params (including inward/outward direction). The description adds little beyond reiterating that `type` is a link type name, so the baseline 3 applies.
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?
States a specific verb and resource ('Link two issues'), which an agent can distinguish from siblings like jira_delete_link and jira_create_remote_link. It doesn't explicitly name a sibling to contrast with, but the purpose is unambiguous.
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?
Points the agent to jira_get_link_types for sourcing the `type` value, which is useful routing guidance. However, there is no explicit when-to-use vs alternatives (e.g., server vs remote links) and no stated prerequisites for the operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_attachmentsARead-only
List the attachments of an issue (id and download url included)
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Jira id; Server sends ids as strings, numeric ones included |
| key | No | issue key, e.g. PROJ-123 |
| self | No | absolute URL of this resource on the instance |
| expand | No | which optional sections the server inlined in this response |
| fields | No | the single field this call asked for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds that the listing includes id and download url, which is slightly useful. However, it doesn't disclose any other behavioral traits such as pagination, rate limits, or required permissions. With annotations covering safety, a 3 is appropriate.
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 a single, well-structured sentence that front-loads the action and resource. It is concise and every word earns its place.
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?
An output schema exists, so return values need not be explained. The description mentions that the output includes id and download url, which is a helpful hint. For a simple list tool with one parameter and full schema coverage, the description is nearly complete. It could mention usage relative to siblings, but otherwise it is adequate.
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 parameter 'key' is fully documented in the schema (pattern and example). The description does not add parameter-specific information, but with full schema coverage, the baseline is 3. The description mentions 'of an issue,' which reinforces that the key parameter refers to an issue, but that is already clear. Score 4 because the description slightly reinforces the parameter context without being redundant.
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 a specific verb and resource: 'List the attachments of an issue.' It also mentions the return fields (id and download url), which helps the agent understand the output. It does not explicitly differentiate itself from sibling tools like jira_get_attachment_meta or jira_download_attachment, but the purpose is still clear.
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?
There is no guidance on when to use this tool versus alternatives. For example, it doesn't mention that jira_get_attachment_meta provides metadata or that jira_download_attachment downloads the file. The description only states what it does, leaving the agent to infer usage contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_backlogCRead-only
List the backlog of a board
| Name | Required | Description | Default |
|---|---|---|---|
| boardId | Yes | numeric board id |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| expand | No | which optional sections the server inlined in this response |
| isLast | No | true when this is the last page |
| issues | Yes | issue array; each item has the shape of jira_get_issue |
| startAt | No | 0-based index of the first item in this page |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe read profile is covered. The description adds nothing beyond that – no note on pagination, result ordering, backlog scope definition, or whether it returns issue summaries or full issues – so it leaves the full behavioral burden on structured fields.
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?
A single short sentence with the resource front-loaded and no wasted words. It is efficient, though arguably under-specified rather than deliberately tight.
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?
An output schema exists, so return values need not be explained, and annotations cover safety. Yet for a listing tool with many sibling listers, the absence of scope/pagination/ordering detail leaves an agent without enough to confidently choose or invoke it.
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% for the single boardId parameter, and the description adds no format or semantics beyond 'a board'. With the schema doing the heavy lifting, this is the expected baseline.
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 states a specific verb ('List') and resource ('backlog of a board'), so an agent knows what it does. However, it does not distinguish itself from sibling listing tools like jira_get_board_issues or jira_list_boards, leaving the agent to infer the difference from the name alone.
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?
There is no guidance on when to use this tool versus the many sibling listers (jira_get_board_issues, jira_list_boards, jira_get_sprint_issues) or versus the mutation sibling jira_move_issues_to_backlog. No context or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_boardsCRead-only
List boards
| Name | Required | Description | Default |
|---|---|---|---|
| projectKey | No | project key, e.g. PROJ |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| isLast | No | true when this is the last page |
| values | Yes | page contents |
| startAt | No | 0-based index of the first item in this page |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint=true annotation already establishes this as a safe read operation, so the description is not required to carry the safety burden. However, it adds nothing beyond that — no indication of scoping to a project, pagination, or result volume — so it is only adequate given the annotation coverage.
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 phrase is technically concise with no wasted words, but this is under-specification rather than economy. There is nothing to front-load because the description provides no content at all.
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?
An output schema exists, so return values need not be described, and the parameter is fully documented in the schema. Still, in a large sibling set containing other list-type tools, the description is too thin to tell an agent when this tool applies.
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% and the single projectKey parameter is documented with an example pattern, so the schema already does the heavy lifting. The description adds no syntax, format, or behavioral meaning beyond the schema, making the baseline 3 appropriate.
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?
"List boards" is essentially a restatement of the tool name jira_list_boards, offering no elaboration beyond the verb+resource already implied. It does not distinguish this from siblings such as jira_list_projects, jira_list_sprints, or jira_list_backlog, leaving scope ambiguous.
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?
There is no when-to-use guidance, no statement of what a 'board' is versus a project, sprint, or backlog, and no mention of when the optional projectKey should be supplied. The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_commentsCRead-only
List the comments of an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| startAt | No | 0-based index of the first item in this page |
| comments | Yes | comment array; each item has the shape returned by jira_add_comment |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, covering the safety profile, and the description adds nothing beyond that. It says nothing about pagination, ordering, or result limits for potentially long comment threads, which is the main behavioral fact an agent would want for a list endpoint.
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?
A single short sentence with no filler, and the resource is front-loaded. It is appropriately sized for a one-parameter read tool, though it stops at the minimum rather than using the space it has.
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?
An output schema exists, so return values need not be explained, and the annotations cover safety. However, nothing addresses pagination or thread size, leaving a real gap for a list endpoint even on a simple tool.
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% and the key parameter is documented with a format example in the schema, so the baseline of 3 applies. The description adds no extra meaning about the key beyond what the schema already provides.
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?
States a specific verb (List) and resource (comments of an issue), so the operation is unambiguous. It does not differentiate from siblings such as jira_add_comment, jira_update_comment, or jira_delete_comment, but those differ enough by verb that confusion is unlikely.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives or related tools. The agent must infer from the name alone that this is the read path for issue comments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_pluginsARead-only
List installed UPM plugins when the account may read /rest/plugins/1.0. If UPM is unavailable, falls back to inferring plugin keys from custom field schemas and reports why each UPM path failed
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | what to do when the list is empty or inferred |
| plugins | Yes | installed plugins; empty when UPM refuses or is absent |
| attempts | No | per-path outcomes when UPM was tried |
| pluginInventory | No | "ok", or why the UPM list is unavailable |
| inferredFromFields | No | plugins inferred from custom field schemas when UPM is unavailable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. Beyond that, the description discloses a non-obvious fallback path (inferring plugin keys from custom field schemas) and that it reports why each UPM path failed, which is real behavioral context an agent would otherwise not anticipate.
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, zero filler, with the primary behavior front-loaded and the fallback appended. Every clause carries information.
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?
An output schema exists, so return structure needn't be explained, and the description covers both the happy path and the fallback. It is essentially complete for a parameterless read-only tool, with only minor room for stating the response shape's implications for the inferred-fallback case.
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 tool takes zero parameters, and schema coverage is complete. The baseline of 4 applies since there are no parameters to document and the description sensibly omits parameter discussion.
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?
States a specific verb ("List") and resource ("installed UPM plugins"), and no sibling tool overlaps this capability, so it is trivially distinguishable from the issue/project/board/test-suite tools around it. An agent knows immediately what the tool returns.
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 names the precondition (account may read /rest/plugins/1.0) and the fallback condition (UPM unavailable). It gives clear context for when the tool works, but there is no explicit when-not guidance or named alternative because none exists among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_projectsCRead-only
List projects
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read. The description adds nothing beyond that: no mention of result volume, pagination, ordering, or whether all projects or only visible ones are returned — context that matters for a list endpoint.
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 two-word phrase is front-loaded and free of waste, which suits a parameterless list tool, though it is terse to the point of under-specification rather than elegantly concise.
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 read-only list tool with no parameters and no output schema, the description is minimally adequate, but it omits scope, pagination behavior, and the distinction from jira_get_project, which an agent would need to call it confidently.
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 tool takes zero parameters, so there is nothing for the description to document. Baseline 4 applies per the rubric for parameterless tools.
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 states a verb and resource ('List projects'), so the basic operation is inferable, but it essentially restates the tool name with no added scope or differentiation from siblings like jira_get_project or jira_list_boards.
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?
There is no when-to-use guidance, no mention of how this differs from jira_get_project, and no note about prerequisites, permissions, or pagination. The agent gets no help choosing this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_sprintsCRead-only
List the sprints of a board
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | only sprints in this state; omit for all | |
| boardId | Yes | numeric board id |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| isLast | No | true when this is the last page |
| values | Yes | page contents |
| startAt | No | 0-based index of the first item in this page |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the safety profile is covered, but the description adds nothing beyond it: no mention of pagination, whether all sprints or only non-empty ones are returned, or default filtering behavior. It does not contradict the annotations, but it contributes no behavioral context.
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?
A single short sentence with zero waste, front-loading the verb and resource. It is efficient, though arguably under-specified rather than genuinely concise, which keeps it from a 5.
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?
An output schema exists, so return values need not be explained, and annotations carry the safety profile. What remains unaddressed is scope and pagination behavior for a listing tool, leaving the definition minimally adequate for its low complexity.
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 both parameters (boardId and the state enum) are fully documented in the schema, setting the baseline at 3. The description adds no extra meaning about the state filter or board id format, so it neither compensates nor detracts.
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?
States a specific verb and resource with scope: list sprints, scoped to a board. An agent can tell it retrieves sprint listings rather than issues or boards. However, it does not distinguish itself from close siblings like jira_get_sprint or jira_list_boards, so it falls short of a 5.
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?
There is no guidance on when to use this versus jira_get_sprint (single sprint), jira_get_sprint_issues (issues within a sprint), or jira_list_boards. The boardId requirement is implied but no prerequisites, alternatives, or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_list_worklogsCRead-only
List the worklogs of an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | total matches, which may exceed the items returned |
| startAt | No | 0-based index of the first item in this page |
| worklogs | Yes | worklog array; each item has the shape returned by jira_add_worklog |
| maxResults | No | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe, non-mutating read. The description adds nothing beyond that — no mention of result size, ordering, pagination, or permission requirements. Since an output schema exists it need not explain return fields, but it contributes no behavioral context of its own.
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?
A single short sentence with zero filler and the resource front-loaded. It is efficient, though arguably under-specified rather than optimally tight, which keeps it out of the top band.
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?
With one fully documented parameter, readOnlyHint annotations, and an output schema covering return values, the description is just barely sufficient. It omits any note on result volume, ordering, or pagination that would help an agent call it confidently at scale.
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% and the single 'key' parameter is documented in-schema with a pattern and example (PROJ-123). The phrase 'of an issue' only loosely reinforces that the key is an issue identifier, so the description adds marginal value over the schema; baseline 3 applies.
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 states a specific verb ('List') and resource ('worklogs of an issue'), so there is no ambiguity about what the tool returns. It is distinguishable from its siblings (jira_add_worklog, jira_update_worklog, jira_delete_worklog) by the read verb, though it does not explicitly call out those siblings or contrast scope with jira_list_comments.
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 only states what the tool does; it never says when to use it, what prerequisites exist (e.g., the caller needs an issue key), or which alternatives to prefer. An agent must infer usage entirely from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_move_issues_to_backlogC
Move issues to the backlog
| Name | Required | Description | Default |
|---|---|---|---|
| issues | Yes | issue keys, e.g. ["PROJ-1","PROJ-2"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, confirming a mutation, which the description's 'Move' already implies. The description adds nothing beyond that: it does not say whether issues are removed from an active sprint, whether the move is reversible, what permissions are required, or what the response contains. For a mutation with minimal annotation coverage, this is a real gap.
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?
One short, front-loaded sentence with zero waste, so it is efficient. The terseness is a completeness problem rather than a conciseness one, so it stays near the top of the scale but is not exemplary.
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 mutating bulk operation with no output schema and only a readOnlyHint annotation, the description leaves out the side effects an agent needs (sprint removal, ordering impact) and any return information. It is under-specified relative to the tool's complexity.
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% and the single parameter ('issues', with format example and minItems) is fully documented in the schema. The description adds no additional semantics, so the baseline of 3 applies.
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 gives a specific verb ('Move') and resource ('issues to the backlog'), so the agent knows exactly what operation is performed. It does not, however, distinguish this from related siblings such as jira_add_issues_to_sprint or jira_list_backlog, leaving the agent to infer the difference from the tool names alone.
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?
There is no when-to-use guidance, no mention of alternatives (e.g. adding to a sprint instead), and no prerequisites or context about when backlog is the right destination. The agent gets a bare operation with no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_remove_watcherCDestructive
Remove a user from the watchers of an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| username | Yes | Username. Jira Server uses `name`, not the Cloud `accountId` |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=true, so the safety profile is covered. The description adds nothing beyond that: it says nothing about required permissions, whether removing a non-watcher errors or is a no-op, or whether the change is reversible.
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?
A single front-loaded sentence with no filler or redundancy. It is efficient, though its brevity is partly the reason other dimensions are thin.
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 two-parameter mutation with annotations covering the safety profile and no output schema, the description is minimally adequate. It omits notable behavioral details such as permission requirements and idempotency that an agent would benefit from before calling.
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%, and the schema itself documents both parameters including the useful Jira Server `name` vs Cloud `accountId` note. The description adds no parameter detail beyond the schema, so the baseline of 3 applies.
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?
States a specific verb (Remove) and resource (a user from the watchers of an issue), which is enough to distinguish it from the sibling watcher tools jira_add_watcher and jira_get_watchers. It does not name those siblings explicitly, but the action is unambiguous.
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?
There is no when-to-use guidance, no prerequisite or permission note, and no routing to alternatives beyond what the verb implies. The agent must infer that this is the inverse of jira_add_watcher from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_requestA
Raw Jira REST call. The escape hatch for plugin modules that have no dedicated tool yet
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | request body for POST/PUT/PATCH; JSON-encoded | |
| path | Yes | REST path, e.g. /issue/PROJ-1, or a plugin module like /rest/tempo-timesheets/4/worklogs | |
| query | No | query string parameters as an object | |
| method | Yes | HTTP method on the Jira REST API |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The only annotation is readOnlyHint=false, so the description must carry the behavioral burden, and it largely does not: it never warns that DELETE/PUT/PATCH are possible, that auth/permissions are required, or how responses/errors surface. The word 'raw' hints at unguarded capability, which is useful but thin.
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, roughly fifteen words, with the core identity ('raw Jira REST call') front-loaded and the qualifying scope immediately after. No filler.
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 arbitrary-method, arbitrary-path escape hatch, the minimum an agent needs is guidance that this bypasses safety rails and requires valid auth/permissions, which is absent. The rich schema compensates for input shape, and no output schema means return values need not be explained, but the risk profile is under-described.
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%, including an example path with a plugin module and per-parameter descriptions, so the schema does the heavy lifting. The description adds no additional semantics about parameter format, encoding, or required combinations — baseline 3 is appropriate.
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?
States a concrete action (raw Jira REST call) and immediately frames its role as the fallback for plugin modules lacking a dedicated tool, which differentiates it from the large sibling set of purpose-built Jira tools. It stops short of naming a specific sibling to prefer.
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 escape hatch for plugin modules that have no dedicated tool yet' gives a clear selection condition: reach for this only when no first-class tool exists. No explicit when-not-to-use or named alternative is given, but the implied preference for dedicated tools is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_scriptrunner_runC
Run a ScriptRunner custom endpoint
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ScriptRunner endpoint name - the last path segment, without a leading slash | |
| payload | No | JSON body sent to the endpoint; omit it when the endpoint takes no input |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false signals that this is not a read-only operation, but the description adds no further behavioral context. It does not disclose that running a custom endpoint may execute arbitrary server-side logic, what side effects or permissions are involved, or how errors are handled.
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 a single, front-loaded sentence with no wasted words. It is appropriately concise for a tool whose parameters are fully described by the schema.
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 executes an arbitrary custom endpoint with a nested payload and has an output schema, so return values need not be described. However, the description omits critical context about safety, permissions, side effects, and usage relative to siblings, making it incomplete for an agent to call this tool confidently.
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%, and both parameters are well documented in the schema. The description adds no additional parameter meaning beyond the schema, so the baseline of 3 is appropriate.
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 gives a specific verb and resource: 'Run' a 'ScriptRunner custom endpoint.' An agent can understand the basic action, but the description does not distinguish this tool from sibling tools like jira_request or explain what a ScriptRunner endpoint is, so it falls short of full sibling differentiation.
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 no when-to-use guidance, no exclusions, and no alternatives. It only states the action, leaving the agent to infer when this tool is appropriate versus other Jira request or scripting tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_search_assignableARead-only
Search users assignable to an issue
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| query | No | substring matched against username, display name and e-mail |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so safety is covered. The description adds the assignability constraint (permission-aware result set), which is meaningful behavior beyond the schema. But it doesn't state result limits, pagination, or that it's scoped to a single issue's assignability.
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, front-loaded with the verb and the key constraint (assignable). No waste.
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 2-param read-only search, the description plus schema is minimally sufficient to call correctly. But it lacks differentiation from sibling user-search tools and the freshness/completeness of the assignable list, which matters for agent routing.
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% – both key and query are documented with format and match semantics. The description adds nothing beyond 'assignable to an issue', so baseline 3 applies.
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?
States a specific verb (Search) and resource (users assignable to an issue). This distinguishes it from jira_search_users (searches all users) and find_jira_user, though it doesn't explicitly call out the differentiation.
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?
Implies usage via 'assignable to an issue' – you'd use it when finding someone to assign a specific issue. But no explicit when-to-use vs jira_search_users or find_jira_user, and no guidance on permissions or filtering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_search_issuesCRead-only
Search issues with JQL
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | JQL, e.g. project = PROJ AND status = Open | |
| fields | No | field ids; custom fields are customfield_xxxxx | |
| startAt | No | 0-based index of the first result to return | |
| maxResults | No | page size (default 50) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | total matches, which may exceed the items returned |
| issues | Yes | issue array; each item has the shape of jira_get_issue |
| startAt | Yes | 0-based index of the first item in this page |
| maxResults | Yes | page size the server applied |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already tells the agent this is a safe read operation. The description adds no behavioral context beyond that: it says nothing about pagination defaults, result limits, permission requirements, or whether the search is bounded by any scope. For a search tool with annotations covering safety, this is a minimal contribution.
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 a single, front-loaded sentence with zero filler. It is appropriately sized for a tool whose parameters and return shape are already well documented in structured fields.
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?
An output schema exists, so return values need not be explained, and the input schema is fully documented. However, the tool sits among many Jira search and listing siblings, and the description provides no routing guidance to distinguish this generic JQL search from board, sprint, backlog, or assignable-user searches. That gap is significant for correct tool selection.
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 the schema already documents jql, fields, startAt, and maxResults in detail. The description adds no parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.
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 names a specific verb and resource: 'Search issues', and adds the method 'with JQL'. This is clear enough for an agent to know it performs a JQL-based issue search, but it does not distinguish itself from several close siblings such as jira_get_board_issues, jira_get_sprint_issues, or jira_list_backlog.
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?
There is no explicit guidance on when to use this tool versus alternatives. The phrase 'with JQL' implies that it is the generic query-based search, but the description never states that it is preferred for arbitrary JQL or that board/sprint/backlog tools should be used for scoped searches.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_search_usersBRead-only
Search users (Server matches on username, not accountId)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | substring matched against username, display name and e-mail | |
| maxResults | No | page size; Jira defaults to 50 on Server/DC |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already declaring the safe-read profile, the description adds one genuinely useful behavioral trait: on Jira Server the match is against username rather than accountId, which changes how results should be interpreted. It still says nothing about result caps, paging behavior beyond the schema note, or what a match looks like.
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?
A single short sentence with no filler, front-loaded with the core verb and resource. It is arguably too terse for the crowded user-related sibling set, but nothing in it is wasted.
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 two-parameter read-only search with full schema coverage, the essential mechanics are covered. The notable gap is routing: with jira_get_user, jira_get_current_user, find_jira_user, and jira_search_assignable all present, the description does not tell the agent which user-lookup tool to choose.
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 both 'query' and 'maxResults' are already documented in the schema. The description's Server/username caveat adds a small amount of meaning about how 'query' is matched, but does not supplement the page-size or matching-format details beyond what the schema states.
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?
States a specific verb (Search) and resource (users), so the agent knows this is a lookup operation rather than the single-user fetch of jira_get_user. However, it does not distinguish itself from other user-searching siblings such as find_jira_user or jira_search_assignable, leaving the agent to guess which search variant applies.
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?
There is no when-to-use guidance, no mention of when to prefer jira_get_user, jira_get_current_user, find_jira_user, or jira_search_assignable over this tool. The parenthetical about Server vs Cloud matching is a behavioral note, not a usage rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_server_infoARead-only
Get Jira version information (useful to confirm the Server version and deployment type)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| baseUrl | No | instance root URL, as the server sees itself |
| scmInfo | No | git revision of the running build |
| version | No | Jira version, e.g. 8.5.7 |
| buildDate | No | when this build was produced |
| serverTime | No | the server clock at the moment of the call |
| buildNumber | No | build number of the running Jira |
| serverTitle | No | title configured for this instance |
| deploymentType | No | Server / Cloud |
| versionNumbers | No | version split into numbers, e.g. [8, 5, 7] |
| databaseBuildNumber | No | build number of the database schema |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety. The description adds some context about what information is returned (version, deployment type), but does not disclose other behavioral traits such as authentication requirements or rate limits. With annotations doing the heavy lifting, this is adequate but not rich.
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?
A single, front-loaded sentence that states the tool's purpose without any wasted words. It is appropriately sized for a simple no-argument 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 tool's simplicity (no parameters, read-only, output schema exists), the description provides enough context for an agent to select and invoke it. Return values are covered by the output schema, so no further explanation is required.
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?
There are zero parameters, so the baseline of 4 applies. No additional parameter semantics are needed or provided.
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?
States a specific verb ('Get') and resource ('Jira version information'), and no sibling tool retrieves version data, so it is easily distinguished. The parenthetical further clarifies it returns Server version and deployment type.
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 clear use case ('useful to confirm the Server version and deployment type'), which helps the agent understand when to invoke it. However, it does not name alternatives or explicit when-not conditions, which would be needed for a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_transition_issueC
Apply a workflow transition
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| fields | No | Field object. Keys may be field ids or business aliases; get the value shape from jira_describe_create / jira_describe_edit first | |
| transitionId | Yes | transition id, from jira_get_transitions for this issue |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation (readOnlyHint=false), but the description adds no further behavioral context, such as what the transition changes, whether fields are required for certain transitions, or any side effects. It merely restates the action without disclosing anything beyond the annotation.
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 single phrase is extremely terse and under-specified for a tool that mutates an issue and accepts an optional nested fields object. It is not appropriately sized because it omits necessary context rather than being efficiently concise.
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 complexity of a write operation with a nested fields parameter and no output schema, the description is far too sparse. It leaves the agent without guidance on usage, prerequisites, or behavioral expectations, relying entirely on the schema and tool name.
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 all three parameters are fully documented in the schema itself. The description adds no meaning beyond the schema, which is acceptable at the baseline when the schema carries the burden.
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 states a specific verb and resource ('apply a workflow transition'), but it is essentially a restatement of the tool name and adds no distinguishing detail about scope or effect. It does not differentiate from the closely related sibling jira_get_transitions.
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?
There is no guidance on when to use this tool versus alternatives, nor any mention of prerequisites such as obtaining a transition ID from jira_get_transitions. The description gives no context for when a transition should be applied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_update_commentD
Update a comment
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| body | Yes | comment text; Jira Server takes wiki markup, not Markdown | |
| commentId | Yes | comment id, from jira_list_comments |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Jira id; Server sends ids as strings, numeric ones included |
| body | No | on Server this is wiki markup, not Markdown |
| self | No | absolute URL of this resource on the instance |
| author | No | user reference; Server uses `name`, Cloud uses `accountId` |
| created | No | creation time, ISO 8601 with offset |
| updated | No | last-modified time, ISO 8601 with offset |
| updateAuthor | No | the user who last edited the comment, when it was edited |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only readOnlyHint=false, the description carries the full burden of behavioral disclosure but offers nothing beyond the name. It does not explain that this replaces comment text, requires specific permissions, or what the response contains. This is a critical gap for a mutation 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?
The description is three words, which is concise but under-specified rather than efficient. It does not front-load any useful information beyond the obvious.
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 a mutation tool with no output schema (though output schema exists, the description doesn't reference it), and the need for at least basic behavioral context, the description is completely inadequate. It fails to note that the body parameter replaces the existing comment text or that the commentId must be obtained from jira_list_comments, which is critical for correct invocation.
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 the schema already documents key, commentId, and body with useful details (e.g., comment ID source, wiki markup on Jira Server). The description adds nothing, but baseline 3 is appropriate when the schema does the heavy lifting.
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 'Update a comment' is essentially a tautology that restates the tool name (jira_update_comment). It adds no specifics about which comment or in what context, failing to distinguish from siblings like jira_add_comment or jira_delete_comment beyond the generic verb 'update'.
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?
There is no guidance on when to use this tool versus alternatives such as jira_add_comment (for new comments) or jira_delete_comment. The description provides no context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_update_issueA
Update an issue. Call jira_describe_edit first; use update for add/remove on multi-value fields
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| fields | No | Field object. Keys may be field ids or business aliases; get the value shape from jira_describe_create / jira_describe_edit first | |
| update | No | per-field add/remove operations, e.g. { labels: [{ add: "x" }] }; use this to change a multi-value field instead of replacing it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=false aligns with the description's mutation verb; no contradiction. The description adds a genuine workflow prerequisite (call jira_describe_edit first) and the add/remove-vs-replace distinction, but says nothing about permissions, partial-update failure behavior, or what happens to unspecified fields.
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 compact sentences, the core action front-loaded and the prerequisite/second-parameter caveat immediately after. Zero 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?
For a mutation tool with nested free-form objects, a single annotation, and no output schema, the description covers the essential workflow prerequisite and the fields/update split. It would be stronger with a note on the destructive scope of the mutation (which fields get replaced) or error behavior.
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% and both `fields` and `update` are documented in the schema itself. The description reinforces the `update` add/remove semantics, adding marginal value but no syntax or shape detail beyond what the schema already provides.
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?
States a specific verb+resource ('Update an issue') that clearly separates it from jira_create_issue, jira_delete_issue and jira_transition_issue in the sibling list. It does not, however, explicitly name those siblings or clarify scope beyond the verb itself.
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 routes the agent: call jira_describe_edit first, and use `update` (not `fields`) when changing multi-value fields. That is real when-to-use guidance tied to a specific alternative. It lacks negative guidance (e.g. when to prefer jira_transition_issue or jira_assign_issue), which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_update_worklogC
Update a worklog
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| comment | No | optional worklog comment (wiki markup) | |
| started | No | start time, e.g. 2026-01-01T09:00:00.000+0800 | |
| worklogId | Yes | worklog id, from jira_list_worklogs | |
| timeSpentSeconds | No | time spent in SECONDS |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Jira id; Server sends ids as strings, numeric ones included |
| self | No | absolute URL of this resource on the instance |
| author | No | user reference; Server uses `name`, Cloud uses `accountId` |
| comment | No | worklog comment (wiki markup) |
| started | No | when the work began, ISO 8601 with offset |
| timeSpentSeconds | No | time logged, in seconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=false correctly declares a write operation, and the description does not contradict it. However, the description adds no behavioral context—such as whether updates are partial or full replacements, permission requirements, or idempotency—beyond what the annotation provides.
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 extremely short ('Update a worklog'), front-loading the verb but failing to earn its place by omitting any useful detail. It is concise but under-specified rather than efficiently structured.
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 (5 parameters, mutation, Jira integration) and the presence of an output schema, the description is inadequate. It does not explain that worklogId is obtained from jira_list_worklogs (though the schema does), nor does it clarify return behavior or side effects. For a mutation tool, more context is expected even with a rich schema.
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 all five parameters are thoroughly documented in the schema (e.g., issue key format, wiki markup, seconds). The description adds no parameter meaning, which is the baseline when the schema carries the full load.
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 states a verb ('Update') and a resource ('worklog'), which is minimally viable. However, it does not distinguish itself from sibling tools like jira_add_worklog or jira_delete_worklog; the agent must infer that this modifies an existing worklog identified by key+worklogId.
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?
There is no guidance on when to use this tool versus jira_add_worklog (create) or jira_delete_worklog (remove). The context is implied by 'Update' but no alternatives or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jira_upload_attachmentC
Upload a local file as an issue attachment (multipart)
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | issue key, e.g. PROJ-123 | |
| filePath | Yes | absolute path to a local file |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, so the description carries most of the burden. It notes the transfer is multipart, which is mildly useful, but says nothing about authorization requirements, file size limits, accepted file types, or what happens on success/failure for this mutation.
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?
A single efficient sentence with the action front-loaded and no filler. It is appropriately sized, though the parenthetical '(multipart)' is a minor implementation detail rather than agent-relevant information.
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 two-parameter tool with full schema coverage and no output schema, the description is minimally adequate. However, with thin annotations it leaves unstated the practical constraints of uploading (permissions, size limits, error behavior) that an agent would benefit from.
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 both parameters ('key' with its pattern and example, 'filePath' as absolute path) are already documented. The description's 'local file' phrasing merely echoes the schema, adding no syntax or format detail beyond it. Baseline 3 applies.
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?
States a specific verb+resource ('upload a local file as an issue attachment') that clearly distinguishes it from siblings like jira_delete_attachment, jira_list_attachments, and jira_get_attachment_meta. It does not explicitly name the sibling it replaces, but the name and description are unambiguous on their own.
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?
There is no guidance on when to use this tool versus alternatives, and no prerequisites are mentioned (file must exist locally, permissions required, size limits). The agent must infer usage context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_issues_to_test_casesAIdempotent
Link Jira issues to test cases in bulk (POST /testcase/link-issues). One entry links one test case to one issue; repeat a testCaseKey across entries to link it to several issues. At most 2500 UNIQUE test case keys per call — checked locally, before any request. Additive: it only creates links, never removes existing ones. KNOWN ISSUE: on many Server/DC builds this endpoint answers HTTP 500 with an empty body even for a single valid pair (verified live on such a stand); link through update_test_case (or create_test_case) with the issueLinks field instead — that field REPLACES the case's whole link set, so send the complete final list. Returns the API payload, or { linked: } when the API answers with an empty body (the usual case).
| Name | Required | Description | Default |
|---|---|---|---|
| links | Yes | Pairs of { testCaseKey, issueKey }, e.g. [{ testCaseKey: "PROJ-T1", issueKey: "PROJ-123" }] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds far more than the single idempotentHint annotation: additive-only behavior (never removes links), a 2500-unique-key cap checked locally before any request, the empty-body/HTTP 500 failure mode, and the return shape fallback ({ linked: n }). This is exactly the kind of hard-won behavioral context an agent needs.
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?
Front-loaded with purpose and packed densely; the KNOWN ISSUE and alternative are clearly flagged. It is a long run-on paragraph, but nearly every clause carries operational information, so it is appropriately sized rather than padded.
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?
There is no output schema, and the description compensates by describing the return value and its empty-body fallback. Combined with the limit, additive semantics, and failure-mode guidance, an agent has everything needed to invoke it correctly or fail over to the alternative.
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 the per-entry {testCaseKey, issueKey} shape is documented in the schema, so the baseline is 3. The description still adds real value by explaining the repeat-a-testCaseKey idiom for multi-linking and the 2500 UNIQUE key constraint, which the schema does not express.
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?
Starts with a specific verb+resource+scope: 'Link Jira issues to test cases in bulk', and even cites the endpoint. It is immediately distinguishable from siblings like update_test_case, jira_link_issues, and get_test_cases_linked_to_issue.
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 NOT to use it (the known HTTP 500 failure on many Server/DC builds) and names the concrete alternative path (update_test_case / create_test_case with issueLinks). It also explains the key semantic difference that the alternative REPLACES the link set versus this tool being additive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attachmentsARead-only
List the attachments of a test case, test run (cycle), test result, or of one step of a case or result (GET /testcase/{key}[/step/{i}]/attachments, /testrun/{key}/attachments, /testresult/{id}[/step/{i}]/attachments). Addressing: 'test_case' needs testCaseKey, 'test_run' needs testRunKey, 'test_result' needs testResultId (numeric); an identifier that does not match the target is rejected. stepIndex is accepted for 'test_case' and 'test_result' only — API v1 has no per-step attachments endpoint for runs. These endpoints take no pagination and no fields projection — the full list always comes back. Step attachments are aggregated ASYMMETRICALLY (verified live): the test-case list EXCLUDES attachments that live on the case steps, while the test-result list INCLUDES them — so enumerating a case's evidence needs one extra call per step, and doing the same on a result double-counts. An out-of-range stepIndex answers 404 (an in-range step with no attachments answers []), and a testResultId that does not exist answers [] rather than 404, unlike a bogus test case or run key. Returns the API's array of attachment records as-is; each record carries the numeric id delete_attachment needs and the url download_attachment accepts.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Entity family the attachment belongs to; it decides which identifier is required | |
| stepIndex | No | 0-based index of a single step, instead of the whole entity (targets 'test_case' and 'test_result' only) | |
| testRunKey | No | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) — required when target is 'test_run' | |
| testCaseKey | No | Test case key, e.g. PROJ-T123 — required when target is 'test_case' | |
| testResultId | No | Numeric test result (execution) id — an id, NOT a key; returned by create_test_result, update_last_test_result and get_test_run_results — required when target is 'test_result' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, and the description goes well beyond that: no pagination and no fields projection, asymmetric step aggregation verified live, 404 for out-of-range stepIndex versus [] for an in-range step with no attachments, and [] rather than 404 for a nonexistent testResultId while a bogus case/run key errors. That is exactly the extra behavioral context the annotations cannot carry.
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?
Purpose, addressing rules, and constraints are front-loaded in that order, and the Cross-references to delete_attachment/download_attachment close the loop. The middle section is dense and runs several independent constraints into single sentences, so it is slightly heavier than needed, but nearly every clause carries distinct information.
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?
There is no output schema, and the description compensates by describing the return value: the API's array of attachment records as-is, each carrying the numeric id delete_attachment needs and the url download_attachment accepts. Combined with the error semantics and per-target rules, nothing an agent needs to call this correctly is missing.
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 the baseline is 3, but the description adds real semantics beyond the schema: which target/identifier pairing is required, that an unmatched identifier is rejected, and the divergent error behavior of stepIndex and testResultId (404 vs []). It stops short of restating formats for every field, but the additions are meaningful rather than duplicative.
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?
States a specific verb (List) and resource (attachments) and enumerates the exact entity families it covers: test case, test run/cycle, test result, or a single step of a case/result, with the concrete URL templates. It is clearly distinguishable from the Jira sibling jira_list_attachments and from download_attachment/delete_attachment, which it references by name.
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 maps each target enum value to its required identifier ('test_case' needs testCaseKey, 'test_run' needs testRunKey, 'test_result' needs testResultId), states that mismatched identifiers are rejected, and restricts stepIndex to 'test_case'/'test_result'. It even gives the operational consequence for step enumeration (one extra call per step for cases; double-counting risk for results).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_environmentsARead-only
List the Zephyr Scale environments of a project (GET /environments?projectKey=…). Environments are per-project and are referenced BY NAME (case-sensitive) in test run items and test results, so use this to get the exact spelling. Returns the raw array of environment objects ([{ id, name, description }]); an empty array means the project defines none.
| Name | Required | Description | Default |
|---|---|---|---|
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered; the description goes further by disclosing the return shape (raw array of {id, name, description}), the meaning of an empty array, and the per-project scoping. Useful behavioral context beyond the annotation, though auth/permission needs are unstated.
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?
Three tight sentences, front-loaded with the action and scope, then the reason to call it, then the return format. Every clause carries information an agent needs; nothing is redundant.
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?
With no output schema, the description correctly takes on the burden of describing the return value (raw array, empty-array semantics). Combined with the annotation covering safety and the schema covering the sole parameter, an agent has everything needed to call it correctly.
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% and the single parameter's fallback behavior (ZEPHYR_DEFAULT_PROJECT_KEY) is fully documented in the schema. The description only hints at it via the 'projectKey=…' endpoint snippet, adding no syntax or format detail beyond the schema, so the baseline 3 applies.
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?
States a specific verb and resource ('List the Zephyr Scale environments of a project') and even names the underlying endpoint. It implicitly contrasts with the sibling create_environment, but never names or differentiates siblings explicitly, so it stops short of a 5.
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?
Gives a clear reason to call it: environments are referenced BY NAME and case-sensitively in test run items and results, so this tool is how you obtain the exact spelling. It supplies context but does not state exclusions or point to create_environment as the alternative for adding one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_test_cases_to_folderA
Move test cases into another folder — one partial PUT /testcase/{key} per case that changes only the folder field. Select the cases with EITHER testCaseKeys OR fromFolder (resolved by GET /testcase/search on folder = ""): exactly one of the two, checked before any request. fromFolder matches that folder EXACTLY — cases in its subfolders are not included, and an existing but empty fromFolder moves nothing. The folder MUST already exist — the API never creates folders implicitly (use create_folder first). The TARGET folder is NOT checked before the requests: a path that does not exist still issues one PUT per case, every one of them fails with 400 and the call resolves with movedCount 0 — always read failed[], since the returned folder only echoes what was asked for. Folder paths are case-sensitive and the root "/" is not a valid target (400 "The value / was not found for field folder"), so a case cannot be moved out of all folders here. Duplicate testCaseKeys are de-duplicated: each case is moved once and movedCount counts distinct cases. maxCases caps both selection modes. A failing case does not abort the rest — it is reported in failed. Only the folder field is written (script, step ids, version, labels, status, priority, owner, objective and precondition are preserved) and moving is reversible (move them back the same way). De-duplication is by EXACT string: keys are neither trimmed nor upper-cased, so "PROJ-T1" and "proj-t1" are two candidates and the second one simply fails with 404 on this case-sensitive API. movedCount counts successful writes, so a case already sitting in the target folder counts as moved. maxCases is applied AFTER the duplicates are removed, and note appears only when something needs explaining (cap truncation, ignored duplicates) — a clean full move and an empty fromFolder both return no note. A fromFolder path that does not exist is different from an empty one: the underlying search fails with 400 "Value(s) not found for field folder". Each failed[] entry is { key, error }. Returns { folder, movedCount, moved, failed?, note? }.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | Target folder: full path from the root starting with "/", e.g. "/Regression/Payments"; it must already exist and "/" itself is rejected by the API | |
| maxCases | No | Safety cap on how many cases one call moves, applied in BOTH modes: the fromFolder search stops there and a longer testCaseKeys list is truncated to its first distinct keys (default 200, integer >= 1) | |
| fromFolder | No | Move every case whose folder is EXACTLY this path (starting with "/"); subfolders are not included | |
| projectKey | No | Jira project key for the fromFolder search, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY. Ignored with testCaseKeys, where each key carries its own project | |
| testCaseKeys | No | Explicit list of test case keys to move, e.g. ["PROJ-T1", "PROJ-T2"]; duplicates are ignored |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: the target folder is unchecked so a bad path yields one failing PUT per case and movedCount 0; the case-sensitive API, root '/' rejection, and subfolder-exclusion rules are stated; reversibility, preserved fields, exact-string dedup, post-dedup cap application, and note-emission conditions are all disclosed. This is unusually rich behavioral context.
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?
Front-loaded with purpose, selection, and destination-precheck before diving into edge cases, and every sentence conveys distinct behavioral facts. It is very dense and long, so parsing takes effort, but almost nothing is redundant.
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 5-parameter, two-mode mutation tool with no annotations and no output schema, the description explains the return object ({ folder, movedCount, moved, failed?, note? }), the failed[] entry shape, and per-case failure isolation. Nothing an agent needs to call it correctly is missing.
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 individual parameters are already documented, but the description adds cross-parameter semantics absent from the schema: maxCases is applied AFTER duplicates are removed, projectKey is ignored when testCaseKeys is used, and de-duplication is by exact string with no trimming or case-folding.
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?
States a specific verb and resource ('Move test cases into another folder') and immediately names the mechanism (partial PUT /testcase/{key} changing only the folder field). An agent can distinguish it from siblings like create_folder, rename_folder, and update_test_case without opening any schema.
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 defines the two mutually exclusive selection modes ('EITHER testCaseKeys OR fromFolder... exactly one of the two, checked before any request') and tells the agent to call create_folder first when no destination exists. When-to-use and prerequisites are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recreate_test_run_with_itemsADestructive
Recreate a test run (cycle) under a NEW key with a changed item list, name or folder (GET /testrun/{key} + POST /testrun, plus DELETE /testrun/{key} when deleteOriginal=true). API v1 limitation: a test run is IMMUTABLE — there is no PUT /testrun, so it cannot be renamed, moved or have cases added/removed through the public API; its items are fixed at creation and the run status is derived from item statuses. Escape hatches: recreate_test_run_with_items (public, new key) or the internal-API tools update_test_run / add_test_cases_to_run / remove_test_cases_from_run (same key, require ZEPHYR_ALLOW_INTERNAL_API=true). Items of the new run are: the source items in their original order, minus removeTestCaseKeys, plus addItems appended; of the source items only the planning fields (testCaseKey, environment, assignedTo) are carried over when copyResults is false — all read-only item data is dropped. The new run gets a NEW key and nothing that referenced the old one is updated. Header fields not passed explicitly are inherited from the source run (a JSON null there counts as absent) — EXCEPT testPlanKey, which GET /testrun does not report at all, so the new run starts with no plan association unless you pass it (or re-link with link_test_run_to_plan). A run cannot carry Jira issue links at all: issueLinks is rejected locally, and any value the source run reports is dropped rather than forwarded — link the issues on the test cases instead. removeTestCaseKeys filters the SOURCE items only: a key that also appears in addItems is still added. deleteOriginal runs only after POST /testrun succeeded, so a failed create leaves the source run untouched. copyResults=true carries each kept case's LAST execution over as the initial result of its item, while the item's own environment/assignedTo still win — but GET /testrun reports each item MERGED with its latest execution, so an item whose configured environment/assignedTo were not repeated in that execution has already lost them before this tool reads the run; set them explicitly through addItems when specific values matter. Copied per-step scriptResults are sanitized: this API stores the execution of a case without a STEP_BY_STEP script as an index-less stub, and POST /testrun requires an index on every entry, so entries without a usable index are numbered by position or dropped. removeTestCaseKeys is a SILENT filter (keys that are not items of the run, including nonexistent ones, are ignored), addItems does NOT deduplicate (adding a case that is already an item creates a second item for it, after which test results for that case need matchEnvironment/matchUserKey), and removing every item is allowed and produces a valid run with zero items. The source run survives unless deleteOriginal=true, and is never deleted when creating the new run failed. Returns { key, originalKey, itemCount, copiedResults, deletedOriginal } plus copyResultsNote when result copying hit its page cap. copiedResults counts the KEPT SOURCE items that had a last execution — including the 'Not Executed' execution the server writes for every item at creation, so it is not a count of real executions; addItems entries are never counted, even when they carry a status.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name of the new run (defaults to the source run's name) | |
| owner | No | Owner (defaults to the source run's value). Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| folder | No | Full path of an existing TEST_RUN folder starting with "/", e.g. "/Regression" (defaults to the source run's folder). The folder MUST already exist. | |
| version | No | Version name (defaults to the source run's value) | |
| addItems | No | Extra items appended AFTER the kept source items. Each item requires testCaseKey and may carry full execution result fields (status, environment, executedBy, assignedTo, comment, executionTime, actualStartDate, actualEndDate, customFields, issueLinks, scriptResults). | |
| iteration | No | Iteration name (defaults to the source run's value) | |
| issueLinks | No | NOT SUPPORTED for test runs and rejected locally: the API has no such field on its run DTO, so any value (an empty array included) makes POST /testrun answer HTTP 500 and create nothing. Link them with link_issues_to_test_run (internal API) or on the test cases (create_test_case / update_test_case with issueLinks). | |
| testRunKey | Yes | Key of the SOURCE test run to recreate, e.g. PROJ-R123 (PROJ-C123 on older instances) | |
| copyResults | No | Carry the LAST execution of each kept source item over as the initial result of the new run (default false) | |
| testPlanKey | No | Test plan to associate the new run with, e.g. PROJ-P123 (defaults to the source run's value) | |
| customFields | No | Custom field values keyed by field name (defaults to the source run's values) | |
| deleteOriginal | No | Permanently DELETE the source run with all its execution results after the new run was created successfully (default false). The source run is never deleted otherwise, and never when creating the new run failed. | |
| plannedEndDate | No | ISO 8601 (defaults to the source run's value) | |
| plannedStartDate | No | ISO 8601, e.g. 2026-07-20T09:00:00Z (defaults to the source run's value) | |
| removeTestCaseKeys | No | Source items whose test case key is in this list are DROPPED from the new run, e.g. ["PROJ-T5"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply only destructiveHint=true; the description carries the full behavioral burden and does so richly: DELETE runs only after a successful POST, the source survives otherwise and never on failure, issueLinks is rejected locally, removeTestCaseKeys is a silent filter, addItems does not deduplicate, removing all items is allowed, and copied scriptResults are sanitized. This is far beyond what the annotation provides.
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?
Front-loaded with the core purpose and justified in length by 15 parameters and numerous gotchas, so most sentences earn their place. It is dense single-paragraph prose that would read better with light structuring, and the 'source run survives / never deleted on failure' point is restated near the end after being stated earlier.
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 15-param mutation tool with nested objects and no output schema, the description is complete: it documents the return shape ({key, originalKey, itemCount, copiedResults, deletedOriginal} plus copyResultsNote), the semantics of copiedResults, and every destructive/failure edge case an agent needs before calling.
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 is 3, but the description adds genuine meaning beyond the schema: unspecified header fields inherit from the source run (with JSON null counting as absent), testPlanKey is not reported by GET /testrun so the new run starts plan-less, removeTestCaseKeys filters source items only, and addItems entries are appended without dedup. These interactions and edge cases go past the per-field schema text.
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?
States a specific verb+resource ('Recreate a test run (cycle) under a NEW key') with precise scope (changed item list, name, folder) and grounds it in the actual endpoints used. It explicitly distinguishes itself from siblings update_test_run / add_test_cases_to_run / remove_test_cases_from_run and explains the immutability constraint that forces this tool to exist.
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?
Gives explicit when-to-use guidance: the API v1 immutability limitation, the two escape hatches (this public tool with a new key vs the internal-API tools on the same key), and the ZEPHYR_ALLOW_INTERNAL_API=true prerequisite for the latter. An agent can pick the right tool without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_folderAIdempotent
Rename a folder and/or set its custom fields (PUT /folder/{folderId}). name replaces the name of that ONE folder segment — it is not a path, so it cannot move the folder to another parent, and an empty or whitespace-only name, or "/" or "" in it, is rejected before any HTTP call. The rename changes the full path of this folder and of every folder below it, so paths held elsewhere (the folder argument of create_test_case / create_test_run, TQL folder filters) must be updated afterwards. The API does NOT enforce sibling-name uniqueness here (verified live): renaming a folder to the name of an existing sibling succeeds and leaves two siblings with one name — an ambiguous path — even though create_folder rejects that same path with 400 "already exists". The public Server/DC API v1 cannot LIST folders, so keep the numeric id returned by create_folder — rename_folder and delete_folder need it (otherwise it can only be found in the Jira UI, or with get_folder_tree when the internal API is enabled). Returns { id, name }, where name is the new SINGLE segment — unlike create_folder, which echoes the full path.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name of this one folder — a single segment without "/" or "\" and with at least one non-whitespace character, e.g. "Payments". Surrounding spaces are kept verbatim. | |
| folderId | Yes | Numeric folder id, as returned by create_folder (the public API cannot list folders) | |
| customFields | No | Custom field values keyed by field name; omit to leave them untouched |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide idempotentHint=true, so the description carries most of the burden and delivers: it discloses that the rename propagates to all descendant folder paths, that the API does NOT enforce sibling-name uniqueness (verified live, contradicting create_folder's 400), and that the public API cannot list folders so the numeric id must be retained. This is exactly the behavioral context beyond annotations that an agent needs.
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?
Front-loaded with the action and endpoint, then the constraints and consequences. Dense but nearly every sentence carries distinct information; the parenthetical asides make it slightly longer than strictly necessary but nothing is wasted.
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?
Despite no output schema, the description documents the return value ({ id, name } with the single-segment semantics), covers all three parameters, the uniqueness hazard, and the id-retention requirement. Nothing an agent needs to call this correctly is missing.
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 is 3, but the description adds real meaning beyond the schema: it explains that name replaces ONE segment (not a path), cannot reparent the folder, and contrasts the return's single-segment name with create_folder's full-path echo. customFields omission semantics are already covered by the schema description.
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?
States a specific verb and resource ('Rename a folder') plus the secondary capability ('and/or set its custom fields') and the underlying endpoint PUT /folder/{folderId}. It is immediately distinguishable from siblings create_folder and delete_folder, and it explicitly clarifies that name is a single segment, not a path.
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?
Gives explicit when/when-not guidance: name cannot move a folder, invalid names are rejected before any HTTP call, and the agent is told to update paths held elsewhere (create_test_case/create_test_run folder args, TQL filters) after renaming. It also names the alternative route to finding folder ids (Jira UI or get_folder_tree when the internal API is enabled).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_test_casesARead-only
Search test cases with a TQL query (GET /testcase/search). A query longer than 1500 characters is sent as POST /testcase/search instead, which supports ONLY the fields projectKey, key and name and at most 2500 values per IN list. That POST endpoint is missing or broken on some Zephyr Scale Server builds, so prefer staying under 1500 characters (split a long IN list across calls); when a POST search fails the error says which transport was used and why.
Unknown VALUES are validated inconsistently: an unknown status, priority, component or projectKey is rejected with 400, while an unknown label in an IN list and an unknown key inside key IN (…) are silently skipped and just shrink the result set — a typo there is indistinguishable from no match. isLast is a heuristic, so an exactly full page always reports isLast false even when it is the last one: stop when values is empty.
TQL quick reference:
Test case fields: projectKey, key, name, status, priority, component, folder, estimatedTime, labels, owner, issueKeys + custom fields (field name in double quotes).
Test run (cycle) fields: ONLY projectKey and folder.
Operators: =, >, >=, <, <=, IN; the only logical connector is AND (no OR).
Syntax is strict: spaces around operators are mandatory, string values in double quotes. Folder paths start with "/" ("/" is the root). For single/multi-choice custom fields '=' does not work — use IN.
Examples: projectKey = "PROJ" AND status = "Draft" AND priority = "High" projectKey = "PROJ" AND folder = "/Regression/Payments" projectKey = "PROJ" AND labels IN ("smoke", "ui") projectKey = "PROJ" AND "My Field" IN ("Value") key IN ("PROJ-T50", "PROJ-T90") projectKey = "PROJ" AND issueKeys IN ("PROJ-5")
Returns { startAt, maxResults, count, isLast, values }; isLast is the heuristic count < maxResults. Paginate with startAt (default 0) and maxResults (default 50; the API server-side default is 200).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | TQL query, e.g. projectKey = "PROJ" AND status = "Draft" (see the description for the syntax) | |
| fields | No | Return only these fields, e.g. ["key","name","status"]; sent to the API as one comma-separated parameter | |
| startAt | No | 0-based index of the first result to return (default 0) | |
| maxResults | No | Maximum number of results to return (default 50; the API server-side default is 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, while the description adds substantial non-obvious behavior: the fallback POST endpoint may be missing or broken, unknown values are validated inconsistently with silent skips for some fields, isLast is a heuristic, and pagination should stop on empty values.
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 front-loaded with purpose and the GET/POST transport caveat, then organized into TQL reference and examples. It is lengthy for a tool description and repeats some details (isLast heuristic, pagination defaults) already in the schema, but the length is largely justified by TQL complexity.
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?
With no output schema, the description still explains the return shape ({ startAt, maxResults, count, isLast, values }) and covers TQL syntax, validation quirks, transport limits, and pagination behavior. An agent has everything needed to call the tool correctly.
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 is 3, but the description supplies an extensive TQL quick reference (fields, operators, strict syntax, examples) that is essential for constructing the query parameter and cannot be inferred from the schema alone. It adds less for fields, startAt, and maxResults beyond what the schema already says.
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?
States a specific verb and resource ('Search test cases with a TQL query') and names the exact endpoint, so an agent can distinguish it from get_test_case, create_test_case, and other siblings without opening the schema.
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 clear context for use (TQL search over test cases) and operational guidance such as preferring GET under 1500 characters, but it never names or contrasts alternatives like search_test_runs or get_test_case, so there are no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_test_plansARead-only
Search test plans with a TQL query (GET /testplan/search). For test plans the searchable fields include projectKey, folder, name, status, key, owner and labels (verified live) — the exact set varies by Zephyr Scale version, and an unsupported field fails with 400 "Unrecognized field: ".
folder matches EXACTLY: plans in a subfolder of the given path are NOT returned. A folder path that does not exist is not an error here — it comes back as an empty page (count 0), unlike search_test_cases and search_test_runs, which answer 400 for the same path.
TQL quick reference:
Test case fields: projectKey, key, name, status, priority, component, folder, estimatedTime, labels, owner, issueKeys + custom fields (field name in double quotes).
Test run (cycle) fields: ONLY projectKey and folder.
Operators: =, >, >=, <, <=, IN; the only logical connector is AND (no OR).
Syntax is strict: spaces around operators are mandatory, string values in double quotes. Folder paths start with "/" ("/" is the root). For single/multi-choice custom fields '=' does not work — use IN.
Examples: projectKey = "PROJ" AND status = "Draft" AND priority = "High" projectKey = "PROJ" AND folder = "/Regression/Payments" projectKey = "PROJ" AND labels IN ("smoke", "ui") projectKey = "PROJ" AND "My Field" IN ("Value") key IN ("PROJ-T50", "PROJ-T90") projectKey = "PROJ" AND issueKeys IN ("PROJ-5")
Returns { startAt, maxResults, count, isLast, values }; isLast is the heuristic count < maxResults. Paginate with startAt (default 0) and maxResults (default 50; the API server-side default is 200).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | TQL query, e.g. projectKey = "PROJ" AND folder = "/Releases" | |
| fields | No | Return only these fields, e.g. ["key","name","status"]; sent to the API as one comma-separated parameter | |
| startAt | No | 0-based index of the first result to return (default 0) | |
| maxResults | No | Maximum number of results to return (default 50; the API server-side default is 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, but the description adds substantial behavior: the 400 'Unrecognized field' failure mode for unsupported fields, that a nonexistent folder returns an empty page rather than an error (contrasted with siblings), the exact return envelope, and that isLast is a heuristic (count < maxResults). This is well beyond what the annotation conveys.
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?
Front-loaded with purpose and endpoint, then field list, then edge cases, then TQL reference — a sensible ordering for a complex tool. It is verbose, and the TQL cheat sheet lists test case and test run fields that this tool cannot search, which is mild scope bloat rather than pure signal.
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?
No output schema exists, so the description carries that burden and does so fully by naming the response fields (startAt, maxResults, count, isLast, values) and pagination contract. Query syntax, error semantics, and edge cases are all covered for a fairly complex search tool.
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, but the description adds value the schema cannot: TQL grammar for the query parameter (mandatory spaces, quoted strings, '/' root, IN required for choice fields, AND-only) and the meaningful gap between the tool's maxResults default of 50 and the API's server-side default of 200. Pagination interplay with isLast is also explained.
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?
States a specific verb and resource ('Search test plans with a TQL query') plus the underlying endpoint (GET /testplan/search). It explicitly distinguishes itself from siblings search_test_cases and search_test_runs by contrasting their folder-path error behavior, so an agent can route without opening any schema.
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?
Gives concrete usage context: searchable fields for test plans, operators, syntax rules, and five worked examples. It also distinguishes this tool's semantics from search_test_cases/search_test_runs for the folder case. It stops short of an explicit 'use this when X, use sibling when Y' routing statement, so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_test_runsARead-only
Search test runs / test cycles with TQL (GET /testrun/search). For runs TQL accepts ONLY the fields projectKey and folder — name, status or dates are NOT searchable, and there is no full-text search; read a candidate run with get_test_run instead. A folder clause matches that folder AND its subfolders: folder = "/A" also returns the runs in /A/B. TQL quick reference:
Test case fields: projectKey, key, name, status, priority, component, folder, estimatedTime, labels, owner, issueKeys + custom fields (field name in double quotes).
Test run (cycle) fields: ONLY projectKey and folder.
Operators: =, >, >=, <, <=, IN; the only logical connector is AND (no OR).
Syntax is strict: spaces around operators are mandatory, string values in double quotes. Folder paths start with "/" ("/" is the root). For single/multi-choice custom fields '=' does not work — use IN.
Examples: projectKey = "PROJ" AND status = "Draft" AND priority = "High" projectKey = "PROJ" AND folder = "/Regression/Payments" projectKey = "PROJ" AND labels IN ("smoke", "ui") projectKey = "PROJ" AND "My Field" IN ("Value") key IN ("PROJ-T50", "PROJ-T90") projectKey = "PROJ" AND issueKeys IN ("PROJ-5") Returns { startAt, maxResults, count, isLast, values }; isLast is the heuristic count < maxResults. Paginate with startAt (default 0) and maxResults (default 50; the API server-side default is 200).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | TQL query; for test runs only projectKey and folder are searchable, e.g. projectKey = "PROJ" | |
| fields | No | Return only these fields, e.g. ["key","name","status"]; sent to the API as one comma-separated parameter | |
| startAt | No | 0-based index of the first result to return (default 0) | |
| maxResults | No | Maximum number of results to return (default 50; the API server-side default is 200) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering safety, the description adds substantial behavioral context: strict syntax rules, AND-only connector, mandatory spaces, the '=' vs IN quirk for choice fields, folder-root behavior, and the pagination/return contract including the isLast heuristic. This is far beyond what the annotation provides.
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?
Long but front-loaded: the critical scoping constraint and the get_test_run alternative come first, followed by a dense reference. A few lines (pagination default restated from the schema, overlapping field list plus examples) are mildly redundant, keeping it short of a 5.
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?
There is no output schema, and the description compensates by describing the response shape ({ startAt, maxResults, count, isLast, values }) plus how to paginate. For a syntax-heavy search tool, an agent has everything needed to construct and page a valid query.
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 already documents query/fields/startAt/maxResults, so the baseline is 3. The description still adds real meaning: TQL operators, quoting, AND-only logic, folder path syntax, and the note that maxResults server-side default is 200, which helps an agent tune paging.
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?
Opens with a specific verb+resource ('Search test runs / test cycles with TQL') and even names the endpoint. It immediately distinguishes itself from siblings by stating that name/status/dates are NOT searchable here and pointing to get_test_run for retrieval.
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 the constraints of this tool (only projectKey and folder are searchable, no full-text search) and names the alternative (get_test_run) plus the condition that selects it (reading a candidate run). It also clarifies folder-clause semantics (matches subfolders), which prevents a common misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_test_scriptADestructiveIdempotent
Replace a test case's whole script or change its format (PUT /testcase/{testCaseKey} with a full testScript). DESTRUCTIVE: switching STEP_BY_STEP to PLAIN_TEXT or BDD irreversibly deletes all steps, and a STEP_BY_STEP replacement deletes every stored step whose id is absent from steps. text is required for PLAIN_TEXT and BDD, steps for STEP_BY_STEP — the pairing is validated locally, before any request — but steps: [] passes that check and DELETES every stored step, leaving an empty STEP_BY_STEP script. BDD text is stored verbatim and must contain Gherkin step lines only, no "Feature:"/"Scenario:" header (400 "Invalid BDD Script"). A step whose "Call to Test" points at its own case is refused locally: the API answers 2xx to such a write and stores NOTHING. After the write the tool reads the case back (a second GET) and compares the STORED script with the one sent — its type, the step count for STEP_BY_STEP, and that a non-empty text survived for PLAIN_TEXT/BDD (the text itself is not compared byte-for-byte). Returns { key, url }; when the stand accepted the write and kept the old script, the answer also carries storedType, storedSteps and a warning saying what is really stored, and a warning alone when the read-back itself failed.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Script body — required for PLAIN_TEXT and BDD (Gherkin step lines only), rejected for STEP_BY_STEP | |
| type | Yes | New script format: STEP_BY_STEP, PLAIN_TEXT or BDD | |
| steps | No | Complete final list of steps — required for STEP_BY_STEP, rejected otherwise. Steps omitted here are deleted; keep the ids from get_test_case to update steps in place. | |
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the destructiveHint/idempotentHint annotations: it specifies what is irreversibly deleted, the local validation ordering, the API's silent 2xx-and-store-nothing behavior on self-referencing steps, the BDD verbatim/Gherkin-only constraint, and the read-back verification with its partial-comparison caveat. This is unusually rich operational disclosure.
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?
Front-loaded with purpose and the DESTRUCTIVE warning, and every sentence carries a distinct edge case. It is dense and long, and a few clauses (e.g. the byte-for-byte caveat wording) could be tightened, but little is truly wasted.
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?
No output schema exists, so the description carries the return contract — { key, url } plus the storedType/storedSteps/warning variants when the write is ignored or read-back fails. For a complex, destructive, no-output-schema tool this is complete enough to call correctly.
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, but the description adds real semantics beyond it: the text/steps ↔ type pairing, that steps: [] passes local validation yet wipes all steps, and the exact scope of what is compared on read-back. It doesn't fully document every step sub-field, hence not a 5.
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?
States a precise verb+resource ('Replace a test case's whole script or change its format') and even names the underlying call (PUT /testcase/{testCaseKey} with a full testScript). This clearly separates it from siblings like add_test_steps (incremental) and update_test_case (metadata), so an agent can route without opening the schema.
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?
It gives strong context for when to use it — full script replacement, and the destructive conditions (STEP_BY_STEP→PLAIN_TEXT/BDD, steps: [] deletion, self-referencing Call to Test). However it never explicitly names the alternative tools (add_test_steps, update_test_case) to route the agent, leaving that inference to the reader.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_last_test_resultA
Amend the LAST (most recent) execution of a run item (PUT /testrun/{runKey}/testcase/{caseKey}/testresult). The endpoint REPLACES the execution instead of patching it: fields missing from the body are reset (verified live — an omitted status falls back to the project default 'Not Executed', executedBy becomes null, actualEndDate/executionDate jump to the server time; only comment, environment, executionTime, actualStartDate and scriptResults are kept by the API itself). To stop a comment edit from wiping the verdict, this tool therefore first READS the run item's current execution (one extra GET, two requests on builds without /testresults/page) and re-sends what you did not pass: status, executedBy, assignedTo, environment, comment, executionTime, actualStartDate, actualEndDate, iteration, version — exactly as the API returned them, never invented. So omitting a field means "keep it", not "clear it"; a value the API does not return cannot be preserved; and if the pre-read fails or the item has no execution yet, only your fields are sent. Older executions are unreachable here — record a new one with create_test_result, or edit any execution by id with update_test_result_by_id (internal API, when enabled). The test case should already be an item of the run; if it is not, the behavior is VERSION-SPECIFIC — some Server builds silently ADD it to the run as a new item (verified live: testCaseCount grows; the new item's POSITION in items[] is not the head and not the tail — it landed second of three and second of four in two separate runs, so do not rely on where it appears), others reject the call with 400/404. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. scriptResults carry per-step outcomes of a STEP_BY_STEP script as { index (0-based), status, comment? }. An overall status sent TOGETHER with scriptResults is stored as sent (verified live: 'Blocked' with three 'Pass' steps stored 'Blocked') and is NEVER derived from the step statuses — scriptResults without a status leave the execution at the project default ('Not Executed'), so pass status in the SAME call. Some older builds may instead ignore the overall status: read the result back with get_test_run_results rather than sending a second update_last_test_result, which replaces the whole execution. A scriptResults entry whose index is past the last step of the case is discarded silently (HTTP 200, no error). When the same test case is an item of the run several times (e.g. once per environment or assignee), disambiguate with matchEnvironment / matchUserKey; with no selector the API picks one of them itself — measured live it took the FIRST (lowest-id) twin and left the other untouched, so pass a selector whenever the case appears more than once. Selectors only SELECT an existing item — they never set a value, so pass environment as well if the result should carry it. matchUserKey matches executedBy/userKey, not assignedTo. If nothing matches, this build answers 400 "No test execution found …" or an empty-bodied HTTP 500 — the 500 was first seen with matchEnvironment, but other inputs produce it too, so its cause is undetermined; that empty-bodied 500 has been observed to write the execution and add a duplicate item anyway, so the write may or may not have happened — re-read with get_test_run_results instead of retrying. Returns the API response ({ id } of the amended execution on the audited build), or { updated: true, testRunKey, testCaseKey } when the API answers with an empty body.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Execution status. Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. | |
| comment | No | Comment (HTML allowed) | |
| version | No | Jira release version name the execution belongs to, e.g. "2026.7" (case-sensitive) | |
| iteration | No | Iteration name as configured in the project (case-sensitive), for runs executed in iterations | |
| assignedTo | No | Assignee. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| executedBy | No | Executor. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| issueLinks | No | Jira issue keys to link, e.g. ["PROJ-123"] | |
| testRunKey | Yes | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) | |
| environment | No | Environment name as configured in the project (case-sensitive), e.g. "Chrome" | |
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 — should already be one of the run's items | |
| customFields | No | Custom field values keyed by field name | |
| matchUserKey | No | Run-item selector, sent as the 'userKey' QUERY parameter (never in the body): targets the run item by its executor's Jira user key, e.g. 'JIRAUSER10000'. | |
| actualEndDate | No | ISO 8601 | |
| executionTime | No | Execution duration in milliseconds | |
| scriptResults | No | Per-step results (STEP_BY_STEP scripts) | |
| actualStartDate | No | ISO 8601, e.g. 2026-07-20T14:00:00Z | |
| matchEnvironment | No | Run-item selector, sent as the 'environment' QUERY parameter (never in the body): targets the run item with this environment (case-sensitive). Distinct from the 'environment' body field, which sets the environment recorded on the result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and does so in unusual depth: PUT-replaces-not-patches semantics with concrete evidence of what gets reset (status to 'Not Executed', executedBy to null, dates to server time), the pre-read that preserves omitted fields, the meaning of omission ('keep it', not 'clear it'), and the limits of preservation. It also discloses error behavior (400 'No test execution found', empty-bodied 500 that may still have written data) and version-specific side effects (silent item addition, undetermined position).
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 critical behavior (replacement semantics and the read-then-resend strategy) is front-loaded in the first two sentences, and nearly every sentence carries non-redundant behavioral information. It is nonetheless a dense wall of text with many parenthetical live-verification asides; it is long enough that an agent may skim past the selector and error-handling rules buried mid-paragraph.
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 17-parameter mutation tool with no output schema and no annotations, the description covers what is missing elsewhere: return values ({ id } on the audited build, or { updated: true, testRunKey, testCaseKey } on an empty body), the multi-item disambiguation problem, and every known failure mode. Nothing an agent needs in order to call it safely appears absent.
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 the baseline would be 3, but the description adds semantics the schema cannot express: omitting a field means keep-not-clear, a value the API does not return cannot be preserved, matchUserKey matches executedBy/userKey and not assignedTo, selectors only select and never set a value (so pass `environment` too), status sent with scriptResults is stored as sent and never derived from step statuses, and an out-of-range scriptResults index is silently discarded. This is well beyond type-level documentation.
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 first sentence names the specific verb and resource ('Amend the LAST (most recent) execution of a run item') and even pins the endpoint (PUT /testrun/{runKey}/testcase/{caseKey}/testresult). It explicitly distinguishes itself from the two adjacent tools, create_test_result and update_test_result_by_id, so an agent can route correctly without opening schemas.
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?
It states when to use this tool versus the alternatives ('Older executions are unreachable here — record a new one with create_test_result, or edit any execution by id with update_test_result_by_id'), when to pass matchEnvironment/matchUserKey selectors, and what to do on failure ('re-read with get_test_run_results instead of retrying'). Conditions and exclusions are explicit rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_test_caseAIdempotent
Update a test case (PUT /testcase/{testCaseKey}). PARTIAL: only the fields passed are changed and omitted fields keep their values, so never send empty placeholders. projectKey cannot be changed. issueLinks REPLACES the whole link set instead of adding to it — sending issueLinks: ["PROJ-1"] to a case already linked to PROJ-2 silently unlinks PROJ-2, so read the current links with get_test_case and send the complete final list (link_issues_to_test_cases is the additive alternative). testScript.steps is synchronized BY ID — a step without an id is created, a step with an id is updated, and every stored step whose id is missing from the list is DELETED; always send the complete final list, carrying over the ids from get_test_case. To only add steps use add_test_steps, which does that read-merge-write safely. A name longer than 255 characters is refused locally: the API stores the first 255 characters and still reports success. A step whose "Call to Test" points at its own case is refused locally too: the API answers 2xx to such a write and stores NOTHING, throwing away the other steps of the same request with it. When (and only when) testScript is passed, the tool reads the case back afterwards (one extra GET) and compares the STORED script with the one sent — its type, the step count for STEP_BY_STEP, and that a non-empty text survived for PLAIN_TEXT/BDD (the text itself is not compared byte-for-byte); an update without testScript costs no extra request. The folder MUST already exist — the API never creates folders implicitly (use create_folder first). Returns { key, url }; when the stand accepted the write and kept the old script, the answer also carries storedType, storedSteps and a warning saying what is really stored, and a warning alone when the read-back itself failed. Only the script is verified: the other fields of a partial update are not read back.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Test case name | |
| owner | No | Owner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| folder | No | Full folder path from the root starting with "/", e.g. "/Regression/Payments". The folder MUST already exist — the API never creates folders implicitly (use create_folder first). | |
| labels | No | Labels; the API replaces spaces with underscores | |
| status | No | Test case status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones. | |
| priority | No | Priority. Defaults: 'High', 'Normal', 'Low' — case-sensitive; instances may define custom ones. | |
| component | No | Name of a Jira component of the project | |
| objective | No | Objective (HTML allowed) | |
| issueLinks | No | Jira issue keys to link, e.g. ["PROJ-123"] | |
| parameters | No | Test case parameters: { variables: [{name, type: FREE_TEXT | DATA_SET, dataSet?}], entries: [{<variable>: <value>}] } | |
| testScript | No | Test script. STEP_BY_STEP: {type, steps: [{description?, testData?, expectedResult?, testCaseKey?}]}; PLAIN_TEXT/BDD: {type, text}. | |
| testCaseKey | Yes | Test case key, e.g. PROJ-T123 | |
| customFields | No | Custom field values keyed by field name | |
| precondition | No | Precondition (HTML allowed) | |
| estimatedTime | No | Estimated duration in milliseconds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The lone annotation (idempotentHint) says nothing about the sharp edges this tool has, and the description more than compensates: issueLinks replaces the full link set (silent unlinking), testScript.steps is id-synchronized so missing ids are DELETED, over-length names are truncated with a false success, self-referencing Call-to-Test writes are silently dropped with a 2xx, and only the script is read back for verification. These are exactly the destructive/verification behaviors an agent needs and none are derivable from structured fields.
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?
Front-loaded with the core partial-update rule, then ordered by danger (links, steps, refusals, verification, folder, return shape). Every clause carries operational content, but the prose is dense and long enough that a few points (folder existence, step-id sync) are effectively restated from the schema, slightly diluting conciseness.
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 15-parameter tool with nested objects and no output schema, it still documents the return value ({ key, url }) plus the conditional storedType/storedSteps/warning fields on read-back failure, and it flags that only the script is verified. Nothing an agent needs to invoke this correctly or interpret the result is missing.
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, but the description adds meaning the schema does not: the replace-not-merge semantics of issueLinks, the local refusal of projectKey changes, and how id presence drives create/update/delete of steps. Remaining params are covered identically in the schema, so it does not exceed the schema comprehensively.
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?
States a specific verb+resource ("Update a test case (PUT /testcase/{testCaseKey})") and immediately scopes the operation as a PARTIAL update. It differentiates itself from siblings by naming get_test_case for reading links, add_test_steps for additive step edits, link_issues_to_test_cases for additive linking, and create_folder for folder creation.
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?
Explicit when-to-use and when-to-use-something-else: use add_test_steps to only add steps, link_issues_to_test_cases as the additive alternative to issueLinks, get_test_case to read current links, and create_folder before pointing at a non-existent folder. It also warns against empty placeholders in a partial update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_test_planAIdempotent
Update a test plan (PUT /testplan/{testPlanKey}). PARTIAL update: only the fields you pass are written and omitted fields keep their current value, so never send empty placeholders — they overwrite real data. projectKey cannot be changed. folder must be a TEST_PLAN folder (create_folder with type TEST_PLAN) — The folder MUST already exist — the API never creates folders implicitly (use create_folder first). status is a case-sensitive internal name. owner: Jira user key (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. Returns { key }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Test plan name | |
| owner | No | Owner. Jira *user key* (e.g. 'JIRAUSER10000'), NOT a username or e-mail — resolve it with find_jira_user. | |
| folder | No | Full path of a TEST_PLAN folder from the root starting with "/", e.g. "/Releases/2026". The folder MUST already exist — the API never creates folders implicitly (use create_folder first). | |
| labels | No | Labels; the API replaces spaces with underscores | |
| status | No | Test plan status. Defaults: 'Draft', 'Approved', 'Deprecated' — case-sensitive; instances may define custom ones. Plan statuses are their OWN option set: get_status_options cannot list them (it has no test_plan optionSet) and the test CASE statuses it returns are rejected here with 400 "The value <x> was not found for field status." | |
| objective | No | Objective (HTML allowed) | |
| issueLinks | No | Jira issue keys to link, e.g. ["PROJ-123"] | |
| testPlanKey | Yes | Test plan key, e.g. PROJ-P123 | |
| customFields | No | Custom field values keyed by field name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Only idempotentHint is annotated, so the description carries the real burden and does so: it discloses partial-write semantics with an explicit data-loss warning about empty placeholders, immutability of projectKey, the implicit-folder-creation limitation, a specific 400 error mode for wrong status values, and the return shape { key }.
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?
Front-loads verb, endpoint and the critical partial-update rule, and nearly every clause carries a distinct constraint. It is somewhat dense and run-on with stacked em-dash asides, so it is efficient rather than elegant.
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 9-parameter mutation with nested objects, no output schema and minimal annotations, the description covers prerequisites, immutability, error modes and the return value. An agent has everything needed to call it correctly; the only minor gap is that projectKey is discussed though it is not in the schema.
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% (baseline 3), but the description adds meaning the schema alone would not convey reliably: owner is a Jira user key not a username/email, folder must be a TEST_PLAN folder that already exists, status is a case-sensitive internal name from a private option set, and projectKey is immutable. That is genuine additive semantics over the parameter list.
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?
Names a specific verb and resource ('Update a test plan') and even cites the underlying endpoint PUT /testplan/{testPlanKey}, which separates it cleanly from create_test_plan, get_test_plan and delete_test_plan in the sibling list.
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?
Gives strong operational guidance: partial-update semantics, 'never send empty placeholders', folder must pre-exist via create_folder, owner must be resolved with find_jira_user, and status cannot come from get_status_options. It stops short of routing between sibling tools (e.g. when to prefer search_test_plans to find the key or what to do for a full replace), so it is clear context rather than complete when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_attachmentA
Attach a local file to a test case, test run (cycle), test result, or to one step of a case or result (POST multipart/form-data /testcase/{key}[/step/{i}]/attachments, /testrun/{key}/attachments, /testresult/{id}[/step/{i}]/attachments). Addressing: 'test_case' needs testCaseKey, 'test_run' needs testRunKey, 'test_result' needs testResultId (numeric); an identifier that does not match the target is rejected. stepIndex is accepted for 'test_case' and 'test_result' only — API v1 has no per-step attachments endpoint for runs. filePath is read from the disk of the machine running this MCP server, not from the caller. Uploads are not idempotent: calling twice creates two attachments. A bogus testResultId is rejected here with 404 even though list_attachments answers [] for it (verified live). Returns the attachment metadata the API reports — on the reference build always a bare { id }, with neither the file name nor the size echoed back, so verifying an upload costs a list_attachments call — or { uploaded: true, fileName, size } when the API answers with an empty body.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Entity family the attachment belongs to; it decides which identifier is required | |
| fileName | No | File name to store in Zephyr Scale, extension included; defaults to the basename of filePath. Stored verbatim, Unicode and spaces included — except that the API strips any directory prefix, so "../dir/report.png" is stored as "report.png". | |
| filePath | Yes | Path of the file to read and upload, on the machine running this MCP server (absolute path recommended) | |
| stepIndex | No | 0-based index of a single step, instead of the whole entity (targets 'test_case' and 'test_result' only) | |
| testRunKey | No | Test run (cycle) key, e.g. PROJ-R123 (PROJ-C123 on older instances) — required when target is 'test_run' | |
| testCaseKey | No | Test case key, e.g. PROJ-T123 — required when target is 'test_case' | |
| testResultId | No | Numeric test result (execution) id — an id, NOT a key; returned by create_test_result, update_last_test_result and get_test_run_results — required when target is 'test_result' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it declares non-idempotency ('calling twice creates two attachments'), that filePath resolves on the MCP server's disk rather than the caller's, and the 404-vs-[] divergence between this tool and list_attachments. These are exactly the behaviors an agent cannot infer from the schema.
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?
Front-loaded with the action and endpoint list, then addressing rules, then return semantics. It is long and dense in a single block, and the parenthetical endpoint list is somewhat heavy, but nearly every sentence carries operational information an agent needs.
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?
No output schema exists, and the description compensates by describing the return shape in both cases ('bare { id }' vs '{ uploaded: true, fileName, size }') and noting that verification requires a list_attachments call. For a 7-param mutation tool with no annotations, nothing material is left unstated.
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 already 100%, so the baseline is 3, but the description adds cross-parameter logic the schema cannot express: the target→identifier requirement mapping, that stepIndex only applies to 'test_case'/'test_result', and that testResultId is an id, not a key. This genuinely reduces mis-invocation risk beyond the per-field 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?
States a specific verb and resource ('Attach a local file') and enumerates the exact entity families it can target, immediately distinguishing it from the Jira-side jira_upload_attachment and from upload_automation_results/upload_cucumber_results siblings.
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?
Explains the addressing contract (which identifier each target requires, that a mismatched identifier is rejected) and where stepIndex is valid, plus the API-version limitation for runs. It does not explicitly name a sibling alternative for attaching to Jira issues, so it stops just short of a full when/when-not routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_automation_resultsA
Publish automated execution results from a local ZIP archive (POST multipart/form-data /automation/execution/{projectKey}). The archive must hold JSON files in Zephyr's custom results format: {"version": 1, "executions": [{"source", "result", "testCase": {"key"}}]}. Validation is strict only at the TOP level of an execution: an extra sibling of source/result such as executionTime is rejected with 400 "Invalid Custom Format JSON file", while an extra field inside "testCase" is silently accepted; "version" is not validated at all and "source" is optional (and readable back through no endpoint). Each execution's "result" is a status name — Default statuses: 'Not Executed', 'In Progress', 'Pass', 'Fail', 'Blocked' — case-sensitive internal names; instances may define custom ones. WARNING (verified live): an UNRECOGNIZED result value is NOT rejected — "PASS", "pass", "FAIL", "" and free text are all stored as Blocked with HTTP 200, so a single typo turns a green suite into a Blocked cycle silently; only an absent "result" key errors (400 "Test Result Status is required"). Test case keys are case-sensitive and must exist: one bad key rejects the whole archive and creates no partial cycle. Two executions of the SAME case become two separate run items, and several JSON files in one ZIP are merged into one cycle. A 400 "Invalid ZIP file" also means a structurally valid archive that contains no JSON at all. Always creates a NEW test cycle (test run) — it never appends to an existing one — and returns the API description of that cycle unchanged, or { uploaded: true } for an empty body.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path of the results .zip archive on the machine running this MCP server (absolute path recommended) | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted | |
| autoCreateTestCases | No | Create the test cases referenced by the results that do not exist in the project yet (server default: false). Omitted from the query string entirely when not passed. Verified live: this only affects executions that identify the case by testCase.name with NO key — an explicit testCase.key that does not exist fails with 400 "Test Case with key X not found." whether the flag is true or false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations empty the description carries the full burden, and it delivers exceptional detail: strict top-level validation vs lenient nested fields, the silent 'unrecognized result becomes Blocked with HTTP 200' trap, case-sensitive status names, whole-archive rejection on one bad key, and that it always creates a NEW cycle and never appends. It even documents the return values and the { uploaded: true } empty-body case.
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?
Purpose is front-loaded in the first clause, followed by format, validation behavior, and the WARNING. It is long and dense with nested parentheticals, but nearly every sentence carries distinct operational value; only minor compression would be possible.
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 high-complexity tool with no output schema and no annotations, the description supplies exactly the missing pieces: return shape, all observed error strings, silent-failure semantics, case sensitivity, and cycle-creation behavior. Nothing an agent needs to call it correctly is absent.
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 the schema already documents all three parameters, including the autoCreateTestCases key-vs-name nuance. The description's added semantics (testCase.key/name, result statuses) concern the archive contents rather than the three declared parameters, so baseline 3 applies.
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?
States a specific verb and resource ('Publish automated execution results from a local ZIP archive'), names the exact endpoint, and pins the expected archive format (Zephyr's custom results format), which implicitly separates it from the sibling upload_cucumber_results. An agent can identify the operation without opening the schema.
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?
Usage is implied ('publish automated execution results') and the format constraint hints at the custom-vs-cucumber distinction, but the description never explicitly states when to choose this over upload_cucumber_results or create_test_result/create_test_results_bulk. No prerequisites or exclusions are stated; routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_cucumber_resultsA
Publish Cucumber execution results from a local ZIP archive (POST multipart/form-data /automation/execution/cucumber/{projectKey}). The archive must hold the output of Cucumber's built-in json formatter (one or more .json report files). Every scenario must carry a @TestCaseKey=PROJ-T1 tag naming the BDD test case it reports on — that tag is how the server matches a scenario to an existing test case. Always creates a NEW test cycle (test run) — it never appends to an existing one — and returns the API description of that cycle unchanged, or { uploaded: true } for an empty body.
| Name | Required | Description | Default |
|---|---|---|---|
| filePath | Yes | Path of the results .zip archive on the machine running this MCP server (absolute path recommended) | |
| projectKey | No | Jira project key, e.g. "PROJ"; defaults to ZEPHYR_DEFAULT_PROJECT_KEY when omitted | |
| autoCreateTestCases | No | Create the test cases referenced by the results that do not exist in the project yet (server default: false). Omitted from the query string entirely when not passed. Verified live: this only affects executions that identify the case by testCase.name with NO key — an explicit testCase.key that does not exist fails with 400 "Test Case with key X not found." whether the flag is true or false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the tool ALWAYS creates a new test cycle and never appends, plus the exact return shape (API description of the cycle, or {uploaded: true} for an empty body). It does not mention auth/permission requirements, keeping it just short of a 5.
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?
Three dense sentences, front-loaded with the core purpose followed by format requirements and behavior/return semantics. Nearly every clause earns its place; only minor tightening is possible.
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?
With no annotations and no output schema, the description compensates well by covering input format constraints, matching rules, the new-cycle behavior, and return values. It is complete enough to invoke correctly, missing only explicit sibling routing.
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 the schema already documents all three parameters in detail (including the nuanced autoCreateTestCases caveat). The description adds the tag-to-test-case matching mechanism, but does not add syntax or format details beyond the schema, so baseline 3 applies.
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?
States a specific verb+resource (publish Cucumber execution results from a local ZIP archive) and even names the endpoint, so the agent knows exactly what it does. It implicitly differentiates from the sibling upload_automation_results by pinning the Cucumber format, but never names that sibling explicitly.
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 lays out hard prerequisites (archive must contain Cucumber json-formatter output; every scenario needs a @TestCaseKey tag), which strongly implies when this tool is applicable. However, it never states when to choose it over upload_automation_results or create_test_run, leaving alternative selection to inference.
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.
97 tool updates
v1.0.5- First observed
add_test_steps - First observed
clone_test_case - First observed
create_environment - First observed
create_folder - First observed
create_test_case - First observed
create_test_cases_bulk - First observed
create_test_plan - First observed
create_test_result - First observed
create_test_results_bulk - First observed
create_test_run - First observed
delete_attachment - First observed
delete_test_case - First observed
delete_test_plan - First observed
delete_test_run - First observed
download_attachment - First observed
download_feature_files - First observed
find_jira_user - First observed
get_issue_test_coverage - First observed
get_latest_result_for_test_case - First observed
get_test_case - First observed
get_test_cases_linked_to_issue - First observed
get_test_plan - First observed
get_test_run - First observed
get_test_run_results - First observed
get_test_run_summary - First observed
health_check - First observed
jira_add_comment - First observed
jira_add_issues_to_sprint - First observed
jira_add_watcher - First observed
jira_add_worklog - First observed
jira_assign_issue - First observed
jira_create_issue - First observed
jira_create_remote_link - First observed
jira_delete_attachment - First observed
jira_delete_comment - First observed
jira_delete_issue - First observed
jira_delete_link - First observed
jira_delete_worklog - First observed
jira_describe_create - First observed
jira_describe_edit - First observed
jira_get_attachment_meta - First observed
jira_get_board_issues - First observed
jira_get_components - First observed
jira_get_current_user - First observed
jira_get_fields - First observed
jira_get_issue - First observed
jira_get_issue_types - First observed
jira_get_link_types - First observed
jira_get_priorities - First observed
jira_get_project - First observed
jira_get_remote_links - First observed
jira_get_sprint - First observed
jira_get_sprint_issues - First observed
jira_get_statuses - First observed
jira_get_transitions - First observed
jira_get_user - First observed
jira_get_versions - First observed
jira_get_watchers - First observed
jira_jsm_queues - First observed
jira_link_issues - First observed
jira_list_attachments - First observed
jira_list_backlog - First observed
jira_list_boards - First observed
jira_list_comments - First observed
jira_list_plugins - First observed
jira_list_projects - First observed
jira_list_sprints - First observed
jira_list_worklogs - First observed
jira_move_issues_to_backlog - First observed
jira_remove_watcher - First observed
jira_request - First observed
jira_scriptrunner_run - First observed
jira_search_assignable - First observed
jira_search_issues - First observed
jira_search_users - First observed
jira_server_info - First observed
jira_transition_issue - First observed
jira_update_comment - First observed
jira_update_issue - First observed
jira_update_worklog - First observed
jira_upload_attachment - First observed
link_issues_to_test_cases - First observed
list_attachments - First observed
list_environments - First observed
move_test_cases_to_folder - First observed
recreate_test_run_with_items - First observed
rename_folder - First observed
search_test_cases - First observed
search_test_plans - First observed
search_test_runs - First observed
set_test_script - First observed
update_last_test_result - First observed
update_test_case - First observed
update_test_plan - First observed
upload_attachment - First observed
upload_automation_results - First observed
upload_cucumber_results
TDQS
Scored across 97 tools
Most tools target a distinct resource+action, but the attachment trio is duplicated across domains (jira_list_attachments/jira_upload_attachment/jira_delete_attachment vs list_attachments/upload_attachment/delete_attachment), and create_test_case vs create_test_cases_bulk, create_test_result vs create_test_results_bulk, and the run-result readers (get_test_run_results/get_test_run_summary/get_latest_result_for_test_case) overlap in scope. The extremely detailed, quirk-filled descriptions help an agent choose, but the near-duplicate names still risk misselection.
snake_case is used throughout, but the surface splits into a jira_-prefixed Jira family and an unprefixed Zephyr family, so the same conceptual operation (list_attachments, delete_attachment) appears under two conventions. Within families the verb_noun pattern is mostly consistent, with oddities like jira_list_sprints vs jira_get_sprint and noun-first names such as health_check and find_jira_user.
97 tools is an extreme mismatch for a single server, spanning two large products (Jira core plus Zephyr Scale). The set is far past the 50+ threshold where findability collapses, and many capabilities (bulk vs single, run-result readers, raw jira_request) push the count higher without adding distinct value.
Coverage is exceptional: full CRUD for test cases, runs, plans, folders, results, environments and attachments; test-case scripting (steps, script replacement, clone, bulk, move); traceability/coverage reporting; automation-result ingestion; and Jira issue/comment/worklog/watcher/link/board/sprint operations. Documented gaps (run mutability requiring recreation or internal API) are explicit escape hatches rather than dead ends.
Maintenance
Related MCP Connectors
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
MCP Server for JFrog, providing tools for development and artifact management.
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server for interacting with self-hosted Jira instances using Personal Access Token (PAT) authentication. It enables users to perform CRUD operations on issues, search with JQL, manage comments, and list projects through the Jira REST API.12439 npm13MIT
- AlicenseNot gradedqualityBmaintenanceJira Cloud MCP server providing Jira-first tools for common workflows and full REST API coverage through a generic request tool.449 npmMIT
- FlicenseNot gradedqualityBmaintenanceMCP server for Jira Data Center / Server (self-hosted Jira, REST API v2) that exposes core work-item project-management operations (platform + Agile) as MCP tools.-
- AlicenseNot gradedqualityCmaintenanceA lightweight MCP server for self-hosted Jira Server, exposing REST API v2 tools for search, issue creation/update, transitions, comments, and more to AI clients via MCP protocol.MIT