jira-mini-mcp
This server provides nine Jira Cloud MCP tools (six read, three write) focused on giving a coding agent ticket context and the ability to reply or update; read-only mode exposes only the six read tools.
Search issues with JQL, paginated via an opaque
next_page_token, with configurable fields or keys-only results.Fetch a single issue and its core fields (summary, description, status, assignee, reporter, labels, components, dates, links, parent, subtasks, etc.).
List an issue's comments, paginated, ordered newest/oldest first, and optionally filtered by a
sincetimestamp.List attachment metadata without downloading, and download individual attachments to a temporary process-scoped cache.
Read an issue's changelog (field-change history), paginated and ordered.
Add a Markdown comment to an issue.
Transition an issue through its workflow by transition or destination status name, optionally posting a comment in the same call.
Update issue fields like summary, description, assignee (account id or "me"), labels, components, priority, duedate, parent, and custom fields; labels/components are replaced wholesale, and status/comment are explicitly refused.
Optionally start with
READ_ONLY_MODE=trueto register only the six read tools and hide all write capabilities.
Provides read-only integration with Jira Cloud, allowing agents to search issues with JQL, retrieve issue details, comments, attachments, and changelogs.
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-mini-mcpfind open bugs assigned to me in the current sprint"
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.
jira-mini-mcp
A nine-tool Jira Cloud MCP server for coding agents.
General-purpose Atlassian MCP servers expose dozens to hundreds of tools. Every one costs context before the agent does any useful work, and every near-duplicate makes the agent's choice less certain. This server gives a coding agent the Jira context it needs for a ticket, the three ways to answer back, and nothing else.
Tool | Purpose |
| Find issues with JQL |
| One issue's core state and fields |
| Recent or historical discussion, paginated |
| Attachment metadata |
| Fetch one attachment |
| Field-change history, paginated |
| Post one Markdown comment |
| Move an issue through its workflow |
| Set issue fields |
Six read, three write. READ_ONLY_MODE=true registers the six alone.
Install
No installation step: run it straight from GitHub.
uvx --from git+https://github.com/proprock/jira-mini-mcp jira-mini-mcpPin a release when you want a fixed surface:
uvx --from git+https://github.com/proprock/jira-mini-mcp@v0.1.0 jira-mini-mcpRequires Python 3.12+ and uv. The package layout
stays compatible with a later PyPI publication, after which uvx jira-mini-mcp
will be enough.
Related MCP server: Simple Jira MCP
Configure
Three required values, and one optional switch:
Variable | Required | Meaning |
| yes | Your site, e.g. |
| yes | The email your API token belongs to |
| yes | |
| no |
|
Authentication is Jira Cloud Basic auth with the email and token. Jira
Server/Data Center, PAT/Bearer, and OAuth are not supported. Configuration is
validated at startup, and an error names the missing setting without printing its
value or your Jira URL. An unrecognized READ_ONLY_MODE value stops startup
rather than quietly re-enabling the write tools.
Keep the token in the host's own configuration and never commit it. The token carries its account's permissions: an account that cannot transition an issue still cannot, whatever this server exposes.
claude mcp add --env JIRA_BASE_URL=https://example.atlassian.net --env JIRA_EMAIL=you@example.com --env JIRA_API_TOKEN=your-token --transport stdio jira-mini -- uvx --from git+https://github.com/proprock/jira-mini-mcp jira-mini-mcpPut at least one other option between the last --env and the server name, as
above — the CLI otherwise reads the name as another KEY=value pair.
In claude_desktop_config.json:
{
"mcpServers": {
"jira-mini": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/proprock/jira-mini-mcp",
"jira-mini-mcp"
],
"env": {
"JIRA_BASE_URL": "https://example.atlassian.net",
"JIRA_EMAIL": "you@example.com",
"JIRA_API_TOKEN": "your-token"
}
}
}
}codex mcp add jira-mini --env JIRA_BASE_URL=https://example.atlassian.net --env JIRA_EMAIL=you@example.com --env JIRA_API_TOKEN=your-token -- uvx --from git+https://github.com/proprock/jira-mini-mcp jira-mini-mcpCommand uvx, arguments --from, the GitHub URL, jira-mini-mcp, and the three
environment variables. Add READ_ONLY_MODE=true to withhold the write tools.
What the tools return
Structured JSON with stable output schemas, and no second human-readable
rendering of the same result. Jira's rich text becomes Markdown inside the
corresponding string field. Timestamps normalize to UTC ISO-8601 with a Z.
Users are account_id and display_name only — no email, avatar, or self URL.
Known resources use compact shapes:
issuetype = {id, name, hierarchy_level}
status = {id, name, category}
priority = {id, name}
project = {id, key, name}
components = [{id, name}, ...]
issue = {key, summary?, status?, issuetype?}
issuelink = {relationship, issue}Absent and unrequested values are omitted rather than returned as null.
Explicitly requested unknown or customfield_* values are preserved as Jira
JSON. If Jira returns a malformed known resource but the rest is usable, the call
fails with the exact JSON paths and a sanitized partial result rather than
pretending the data was fine.
Fields
search_issues defaults to these seven fields:
summary, status, issuetype, priority, assignee, updated, projectget_issue defaults to these sixteen fields:
summary, description, issuetype, status, priority, assignee, reporter,
labels, components, created, updated, resolutiondate, issuelinks,
project, parent, subtasksAn explicit fields list replaces the default completely; the server adds no
hidden fields. fields=[] returns issue keys only.
Pagination
Large collections never pretend to be complete. get_comments and
get_changelog return start_at, an exact total, and items — more exist
when start_at + len(items) < total, and that sum is the next offset. Both
default to order="desc" (offset zero is the newest item) and to 20 items;
limit=0 returns everything remaining from start_at, with no 100-item cap.
get_comments also takes since, applied before ordering and slicing, so
"what happened since the last release" does not mean loading a multi-year
discussion.
search_issues is the exception. The current
Jira Cloud enhanced search API
is cursor-based with no exact total; its count endpoint is approximate and the
old offset endpoint is being removed. So search returns items and
next_page_token only — pass the token back as page_token, and a null token
means the last page. limit is 1..100; zero is rejected with guidance rather
than silently treated as a default.
Attachments
get_attachments returns metadata only. Only when a file matters does the agent
call download_attachment, which writes into an automatically managed
process-scoped temporary cache and returns a local path. No download directory to
configure, and the cache is removed at shutdown.
Writing to Jira
Three tools, chosen so an agent can close the loop on a ticket it worked:
add_comment(issue_key, body)
transition_issue(issue_key, to, comment=None)
update_issue(issue_key, fields)Issue creation, links, attachment upload, worklogs, and deletion are out of scope. Creation needs per-project, per-type required-field discovery and is a feature in its own right; a link, or a request for one, fits in a comment.
Three things are worth knowing before an agent writes:
transition_issuetakes a name, not an id. A transition name or the name of the status to reach, matched ignoring case. They differ in real workflows — a transition calledIn Progresscan produce a status calledIn Development, and two differently named transitions can reach one status — so prefer the transition name. When nothing matches, the error lists every available transition and where it leads. That listing is the discovery mechanism, which is why there is no separateget_transitionstool.update_issuereplaceslabelsandcomponentswholesale. There is no add or remove verb, so read the issue first if you mean to add one value. It takes the same valuesget_issuereturns:assigneeas an account id or the literal"me",descriptionas Markdown,customfield_*as raw Jira JSON. It refusesstatusandcomment, naming the tool that does each.Markdown is converted, not guessed at. Headings, lists, fenced code, inline marks, and links become Jira rich text; anything outside that set stays literal rather than being reinterpreted.
Each write tool is annotated readOnlyHint=false with honest destructiveHint
and idempotentHint values, which is what READ_ONLY_MODE filters on.
Why so few tools
A tool definition is a name, a description, an input schema, and often an output contract. Depending on the client, all of it enters the model's context before any work happens. A large toolset therefore spends context on capabilities the current task will never use, and raises the chance of picking the wrong tool, confusing similar ones, or passing bad parameters.
Nine compact schemas stay affordable for a whole session, leaving the context budget for source code, issue descriptions, stack traces, and reasoning. The design follows Anthropic's guidance for agent systems: keep toolsets small, role-scoped, and clearly differentiated.
This is a claim, so the repository tests it. The offline half runs with the suite
and checks that every tool is described substantially, that no two descriptions
are near-duplicates, and that every parameter whose behavior cannot be guessed
from its name is explained in prose. The other half puts the real tool
definitions in front of a real model and scores which one it picks — see
evals/README.md.
The same principle shapes the responses. get_issue does not dump hundreds of
comments, the full changelog, attachment contents, or every custom field; large
resources are fetched only when asked for.
Compared with the alternatives
jira-mini-mcp | |||
Scope | Jira only | Jira, Confluence, JSM, Bitbucket, Compass, Loom, and more | Jira and Confluence |
Deployments | Cloud | Cloud | Cloud, Server/Data Center |
Hosting | Local, stdio | Remote, Atlassian-hosted | Local (stdio, Docker) or HTTP |
Auth | API token | OAuth 2.1 or API token | API token, PAT, or OAuth 2.0 |
Tools | 9, always visible | A small default set with on-demand discovery | 98 |
Writes | 3 tools | Yes, admin-gated by category | Yes |
License | MIT | Apache 2.0 | MIT |
The official server is the better choice when you need breadth across Atlassian products, OAuth rather than a stored token, Jira Service Management, or organization-level controls such as permission groups, IP allowlisting, and audit logs. It is Atlassian's own product, it tracks their APIs, and nothing here competes with that.
mcp-atlassian is the better choice when you need Confluence alongside Jira,
Server/Data Center, or simply broader Jira coverage than nine tools.
This server is the better choice for one narrow case: a coding agent working a Jira ticket, where the context every tool definition costs is worth more than the coverage it buys.
Development
uv sync
uv run ruff format --check .
uv run ruff check .
uv run ty check
uv run pytest
uv run pytest --cov=jira_mini_mcp --cov-branch --cov-report=term-missinguv run ruff format . applies formatting. The last command reports statement and
branch coverage with missing lines; it is reviewed before closing each phase, and
the project deliberately has no fail-under percentage until a meaningful baseline
exists.
The default suite is fully offline. HTTP mocks trace to observations against a real Jira Cloud site, but raw responses are never committed: each fixture keeps the observed structure while every tenant, account, issue, cursor, timestamp, and content value is synthetic, and records its own provenance. Write endpoints are exercised only against a disposable issue.
The tool-selection eval needs a model credential and spends money, so it is run deliberately:
uv run python evals/run_eval.pyArchitecture:
agent -> stdio -> MCPServer -> JiraClient -> httpx2.AsyncClient -> Jira REST v3One asynchronous HTTP client is reused for the process lifetime, with an explicit
timeout and bounded retries — a 429 is retried for any method, a 5xx or a dropped
connection only for methods that converge on replay, never a POST. JiraClient
knows nothing about MCP; the tools are thin adapters over it.
Release model
Semantic versioning, Conventional Commits, short-lived branches, pull-request CI,
and tagged releases. CHANGELOG.md records what changed for
someone running the server. v0.1.0 is a GitHub Release with CI-checked wheel and source
distributions attached. PyPI publication is a later step and should use GitHub
Actions with Trusted Publishing rather than a long-lived credential.
License
MIT. Not an official Atlassian product.
Available Tools
9 toolsadd_commentA
Add one comment to an issue. body is Markdown -- headings, lists, fenced code blocks, bold/italic, inline code, links -- converted to Jira's rich text; anything outside that set stays literal. Returns the created comment in the same shape get_comments returns. This server cannot edit or delete a comment afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations by specifying the Markdown-to-rich-text conversion rule (which constructs convert, which stay literal), the return shape matching get_comments, and the key limitation that this server cannot edit or delete the comment afterward. idempotentHint=false already implied each call creates a new record; the description enriches that with the no-edit/delete constraint.
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?
Four sentences, each earning its place: purpose, body format, return shape, limitation. The purpose is front-loaded. The Markdown enumeration is slightly long but necessary for precision about what converts versus what stays literal.
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 purpose, body semantics, return shape (reinforced by the existing output schema), and the post-creation limitation. What's absent — permission requirements, error cases, validation of the issue key — is peripheral for a comment-creation tool and the output schema already documents the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does substantially for body by detailing the accepted Markdown subset and conversion behavior. issue_key receives no explicit treatment, but it is highly self-explanatory in a Jira context (e.g., PROJ-123), so the omission is minor.
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 one comment to an issue.' This clearly distinguishes it from read siblings (get_comments, get_issue, search_issues) and mutation siblings (update_issue, transition_issue) because 'add' uniquely signals comment 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?
The purpose statement implies when to use it — when a comment needs to be created — but there is no explicit when-not guidance or mention of alternatives. The sibling set is mostly reads and other mutations, so the distinct verb mostly self-selects, yet the description never names a condition that would rule it out in favor of another tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentARead-onlyIdempotent
Download one attachment by id into a process-scoped temporary cache and return its local_path. The cache is removed when the server shuts down.
| Name | Required | Description | Default |
|---|---|---|---|
| attachment_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations by explaining that downloads go to a process-scoped temporary cache and that the cache is removed on server shutdown. This gives the agent important expectations about the returned local_path's lifetime and scope.
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, both necessary. The main action and return value are front-loaded, and the cache lifetime detail is placed second, making the description both concise and logically 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?
For a single-parameter tool with a true output schema and read-only/idempotent annotations, the description covers the essential behavioral details: download action, cache scoping, and lifetime. It is slightly incomplete only in that it doesn't mention typical downstream usage of local_path or how it relates to get_attachments.
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 0%, so the description carries the burden of explaining the parameter. It only says 'by id', which essentially restates the schema's 'attachment_id'. It does not clarify where to obtain the id, what format it takes, or distinguish it from other identifiers.
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 action (download one attachment by id) and a concrete outcome (returns local_path), and clearly distinguishes itself from sibling tools like get_attachments by focusing on a single attachment and returning a cached file path rather than listing or retrieving content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given about when to use this tool versus alternatives such as get_attachments or get_issue. The description implies it should be used when an attachment_id is already known, but it does not explicitly state prerequisites, exclusions, or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachmentsARead-onlyIdempotent
List an issue's attachment metadata (id, filename, mime_type, size, author, created) without downloading content. Use download_attachment to fetch a file's bytes.
| Name | Required | Description | Default |
|---|---|---|---|
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint. The description adds meaningful context that content is not downloaded and that only metadata is returned, which helps the agent understand the tool's non-destructive behavior 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?
Two sentences, front-loaded with the action and returned fields, ending with a pointer to the sibling tool. Every word adds value; 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?
This is a simple one-parameter tool with an output schema and safety annotations. The description covers the key metadata-vs-content distinction and names the sibling, making it complete for correct invocation without excessive detail.
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 0%, so the description carries the burden of explaining issue_key. It implies issue_key identifies the issue ('an issue's attachment metadata'), but does not specify format or provide examples. This is minimally viable but leaves ambiguity about the expected key format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('List'), resource ('issue's attachment metadata'), and explicitly lists fields returned (id, filename, mime_type, size, author, created). It also differentiates itself from download_attachment by noting it does not download content, making the purpose unmistakable.
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 download_attachment as the alternative for fetching file bytes, giving a clear when-to-use-this vs when-to-use-that. The condition is stated: metadata vs content, leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_changelogARead-onlyIdempotent
List an issue's field-change history. order='desc' (default) returns newest first; 'asc' returns oldest first. start_at/limit paginate the logical, sorted collection (ties broken by entry id); limit=0 returns every remaining entry from start_at with no cap. Each entry lists human-readable field changes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| order | No | desc | |
| start_at | No | ||
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint, openWorldHint, and idempotentHint. The description adds substantial behavior beyond these: it explains the default order, pagination tie-breaking by entry id, limit=0 behavior, and that entries are human-readable. This enriches the agent's understanding of edge cases and return content.
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 compact yet information-dense. It front-loads the core purpose, then systematically explains ordering, pagination, and output content. No sentence is redundant; every clause contributes to correct usage.
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 moderate complexity (sorting, pagination) and the existence of an output schema (which presumably details the return structure), the description covers all behavioral aspects needed to call the tool correctly. It is complete without needing to enumerate return 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?
Although schema description coverage is 0%, the description fully explains the non-obvious parameters: order (desc/asc), start_at and limit pagination semantics, and limit=0 special case. issue_key is self-explanatory. This adds significant meaning beyond the schema's defaults and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists an issue's field-change history, a specific verb and resource. It is distinct from siblings like get_issue or search_issues, which focus on current state or search, not history.
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 detailed usage instructions for ordering and pagination (order, start_at, limit semantics including limit=0 meaning no cap). It does not explicitly mention alternatives or when not to use, but the tool's purpose is self-evident and the guidance is clear for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commentsARead-onlyIdempotent
List an issue's comments. order='desc' (default) returns newest first; 'asc' returns oldest first. start_at/limit paginate the logical, filtered, sorted collection (ties broken by comment id); limit=0 returns every remaining comment from start_at with no 100-comment cap. since (ISO-8601 with an explicit offset) keeps only comments created at or after that instant, and total reflects the filtered collection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| order | No | desc | |
| since | No | ||
| start_at | No | ||
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses default ordering, pagination semantics, tie-breaking by comment id, the special limit=0 behavior with no 100-comment cap, the since filter format, and that total reflects the filtered collection. This is excellent behavioral 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?
The description is front-loaded with the core purpose and then packs detailed behavior into a compact, well-organized set of clauses. No sentence is wasted; every detail adds necessary invocation semantics.
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 moderate complexity (filtering, sorting, pagination, cap behavior) and the presence of an output schema, the description covers all essential invocation details. It even explains edge-case pagination and how total is computed, making it fully adequate for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates: it explains order values and default, start_at/limit pagination with tie-breaking, limit=0 special behavior, since's ISO-8601 offset requirement and filtering semantics, and the meaning of total. Even issue_key is implied by 'an issue's comments'.
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 'List an issue's comments' states a specific verb and resource, clearly distinguishing this tool from siblings like get_issue, get_attachments, and get_changelog. It leaves no ambiguity about 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 makes it clear the tool retrieves comments for an issue and provides detailed pagination/filtering behavior, giving a strong sense of when to use it. It does not explicitly name alternatives or exclusion conditions, but the purpose statement is sufficiently specific to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issueARead-onlyIdempotent
Fetch one issue by key. fields replaces the default fields entirely -- default: summary, description, issuetype, status, priority, assignee, reporter, labels, components, created, updated, resolutiondate, issuelinks, project, parent, subtasks. fields=[] returns the key with no fields. Does not include comments, attachments, or changelog history; use the dedicated tools for those.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | ||
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it discloses that fields replaces defaults entirely (not merges), that fields=[] returns only the key, and that certain data (comments, attachments, changelog) is deliberately excluded. This is meaningful behavioral disclosure that helps the agent predict the tool's behavior. A small gap is that it doesn't mention pagination or error behavior, but the annotations plus the explicit exclusions are strong.
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 compact and front-loaded: the core action ('Fetch one issue by key') comes first, followed by the most important parameter behavior, then the exclusions. Every sentence earns its place, and the exclusions are grouped efficiently. No fluff or repetition of schema details.
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 has an output schema, so return values are already documented structurally. The description covers the key behavioral aspects an agent needs: what the default fields are, how to override them, and what is not included. It also names sibling tools for the excluded data. The only slight gap is that it doesn't mention whether the response includes any metadata (e.g., expand) or how errors are surfaced, but given the output schema and annotations, the description is largely complete 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 0%, so the description must compensate. It does: it explains the fields parameter's semantics in detail (replaces defaults entirely, default list, fields=[] behavior) and names the required issue_key parameter. The only minor gap is that it doesn't explicitly restate that issue_key is the Jira issue key format (e.g., PROJECT-123), but the parameter name and tool name make that obvious. Given the 0% schema coverage, the description carries the burden well.
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 ('Fetch') and resource ('one issue by key'), and immediately distinguishes itself from sibling tools by explicitly listing what it does not include (comments, attachments, changelog history) and pointing to dedicated tools for those. This makes the tool's purpose unmistakable and differentiates it from get_comments, get_attachments, and get_changelog.
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 explicit guidance on when to use this tool versus alternatives: it says to use dedicated tools for comments, attachments, and changelog history. It also explains the fields parameter behavior, including the default field set and the fields=[] special case, which tells the agent exactly how to control the response. This is clear, actionable usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_issuesARead-onlyIdempotent
Search Jira Cloud issues with JQL. Returns items and an opaque next_page_token (null on the last page); pass it back as page_token for the next page. limit is 1..100 (default 20); 0 is invalid. fields replaces the default fields entirely -- default: summary, status, issuetype, priority, assignee, updated, project. fields=[] returns only the issue key.
| Name | Required | Description | Default |
|---|---|---|---|
| jql | Yes | ||
| limit | No | ||
| fields | No | ||
| page_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral details beyond annotations: pagination semantics (opaque token, null on last page), the fact that fields replaces the default field set entirely, and that fields=[] returns only the issue key. This is exactly the kind of non-obvious behavior an agent needs to know.
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, each dense with useful information. The most important facts (search with JQL, pagination token) are front-loaded, and the fields behavior is explained precisely. No filler or repetition of schema defaults that are already visible.
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 description is complete for a read-only search tool: it covers pagination, limits, field selection, and the output schema exists to explain return values. It doesn't mention error cases (e.g., invalid JQL) or rate limits, but those are minor for a read-only, idempotent operation. The output schema covers return structure, so the description doesn't need to.
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 0%, so the description must compensate. It does: it explains the meaning of jql (Jira query language), the valid range and default for limit, the replacement semantics of fields, and the pagination contract for page_token. It doesn't give JQL syntax examples, but the core semantics of all four parameters are covered, which is strong compensation for zero 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?
The description states a specific verb ('Search'), a resource ('Jira Cloud issues'), and the query mechanism ('with JQL'). It clearly distinguishes this from sibling tools like get_issue (single issue retrieval) and get_comments (comments), so an agent can tell them apart 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?
The description gives clear operational context: it explains pagination via next_page_token/page_token, the valid range for limit, and how fields behaves. It doesn't explicitly say 'use this instead of get_issue when you need to search by JQL', but the purpose is clear enough that an agent can infer when to use it. It lacks explicit exclusions or alternative routing, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transition_issueADestructive
Move an issue through its workflow. to is a transition name or the name of the status to reach, matched ignoring case and surrounding space. A transition's name often differs from the status it leads to (a transition called 'In Progress' can produce status 'In Development'), and two transitions can reach one status, so prefer the transition name; if nothing matches, the error lists every available transition and its resulting status. comment is Markdown and is posted in the same call as the move. Changes issue state.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| comment | No | ||
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral details: matching ignores case and surrounding space, transition names may differ from resulting statuses, duplicate statuses are possible, error responses list all available transitions, comments are Markdown, and the comment is posted atomically with the move. This aligns with destructiveHint=true rather than contradicting it.
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 dense but efficient: every sentence adds value, from the primary purpose to matching rules to error behavior to comment semantics. It is front-loaded with the core action and contains 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 state-changing tool with an output schema and annotation coverage, the description provides all necessary invocation details: how to specify the target, what happens on ambiguity, what the error contains, and how comments are handled. Nothing essential 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 0%, so the description carries full responsibility for explaining parameters. It thoroughly explains 'to' (transition vs status matching, case/space rules, error fallback) and 'comment' (Markdown, posted in same call). 'issue_key' is self-explanatory from its name, and the description handles the rest with no gaps.
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 'Move an issue through its workflow' uses a specific verb and resource, clearly identifying the operation. It also states 'Changes issue state,' which distinguishes it from siblings like add_comment and update_issue without ambiguity.
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 clear context: use this tool to move an issue through its workflow, with detailed guidance on transition names vs status names. It does not explicitly exclude alternatives or name siblings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issueADestructiveIdempotent
Set issue fields, taking the same values get_issue returns: summary as text, description as Markdown, assignee as an account id or the literal "me", labels as a list, components and priority by name, duedate as YYYY-MM-DD, parent as an issue key, and any customfield_* or unknown field as raw Jira JSON. null clears assignee, description, priority, parent, or duedate. labels and components REPLACE the whole list, so read the issue first if you mean to add one. Cannot change status (use transition_issue) or add a comment (use add_comment).
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | ||
| issue_key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by specifying precisely which fields null clears (assignee, description, priority, parent, duedate) and that labels/components REPLACE the entire list rather than append. This is exactly the 'what gets destroyed' context the rubric credits.
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 purpose, then organized as: accepted formats, null semantics, list-replacement warning, and exclusions. Every sentence earns its place; the dense format list is justified because the schema provides zero descriptions.
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 complex tool with an open-ended fields object, the description covers input formats, null-clearing behavior, destructive list semantics, and exclusions with alternatives. The output schema exists, so not describing return values is acceptable per the rubric.
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 0%, so the description bears full responsibility, and it delivers: it defines the value format for every field type (text, Markdown, account id/'me', list, name, YYYY-MM-DD, issue key, raw Jira JSON for customfield_*). The fields object's additionalProperties true is made meaningful by explaining how to handle custom and unknown fields.
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 ('Set issue fields') and enumerates the exact value formats accepted, referencing get_issue as the source of truth. It explicitly distinguishes itself from siblings by noting it cannot change status (transition_issue) or add a comment (add_comment).
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-not guidance with named alternatives: 'Cannot change status (use transition_issue) or add a comment (use add_comment).' Also instructs to read the issue first when intending to add to labels/components, since those lists are replaced wholesale.
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.
9 tool updates
- Added
add_comment - Added
download_attachment - Added
get_attachments - Added
get_changelog - Added
get_comments - Added
get_issue - Added
search_issues - Added
transition_issue - Added
update_issue
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: search vs single-issue fetch, comments vs attachments vs changelog, and update vs transition vs comment. Where overlap could occur, the descriptions explicitly disambiguate boundaries.
All tools follow a consistent snake_case verb_noun pattern like search_issues, get_comments, add_comment, and transition_issue. The get_attachments vs download_attachment distinction is clear from the verbs.
Nine tools is a well-scoped set for a focused Jira issue server. Each tool earns its place, covering search, read, update, transition, comments, attachments, and changelog.
The server covers reading, searching, updating, transitioning, commenting, and attachment download well. However, create_issue is missing, along with attachment upload and comment edit/delete, which are notable gaps for a Jira issue-management surface.
Maintenance
Related MCP Connectors
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Search GitHub, npm, PyPI, StackOverflow, ArXiv from one MCP — built for coding agents.
MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides tools for AI assistants to interact with JIRA APIs, enabling them to read, create, update, and manage JIRA issues through standardized MCP tools.66 npm3MIT
- AlicenseNot gradedqualityAmaintenanceProvides Jira Cloud integration for AI agents, enabling them to search issues with JQL, retrieve detailed issue information, and create new tickets. It supports multiple Jira configurations and provides tools for managing attachments and comments through natural language.MIT
- AlicenseAqualityCmaintenanceEnables AI agents to interact with Jira Cloud, including listing boards and issues, adding comments, and searching users.723 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language interaction with JIRA through MCP, providing 35 tools for issues, comments, transitions, projects, boards, sprints, epics, links, worklogs, versions, attachments, users, and fields.MIT