Skip to main content
Glama
proprock
by proprock

jira-mini-mcp

A Jira Cloud MCP server for coding agents: 6 read tools, 9 with writes enabled.

CI M8ven Verified PyPI Version Python License: MIT

Model Context Protocol compatible MCP Registry: io.github.proprock/jira-mini-mcp Auth: API token | OAuth 2.0

One job. One tool. Done right.

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.

  • 6-9 tools, not 98 - every one earns its place in context, and the descriptions are tested so an agent picks the right one; see why so few and how it's compared with the alternatives.

  • A write surface of exactly three tools - comment, transition, update. Set READ_ONLY_MODE=true and they never register, not even as a disabled entry the agent can see.

  • Compact, predictable output - stable JSON schemas, Markdown for rich text, no null spam, no self URLs, emails, or avatars; see what the tools return.

  • Roughly 40% less output on the wire - each result is sent once, as JSON in content, rather than again as structuredContent; set STRUCTURED_OUTPUT=true if your host needs the typed copy. See Cheaper output.

  • Nothing is silently cut short - exact totals on comments and changelog, cursor paging on search, and limit=0 to fetch the rest. A failed request is an error, never an empty list.

  • Errors an agent can act on - a wrong transition name lists every valid transition and where it leads, so there is no separate discovery tool. Errors never contain your Jira URL, credentials, or raw response bodies.

  • API token or OAuth - one minute with an API token, or a browser login through your own OAuth 2.0 app with automatic refresh; see Configure.

  • On PyPI - uvx jira-mini-mcp or pip install jira-mini-mcp, no repo clone or git URL required.

Tool

Access

Purpose

search_issues

🟢 read

Find issues with JQL

get_issue

🟢 read

One issue's core state and fields

get_comments

🟢 read

Recent or historical discussion, paginated

get_attachments

🟢 read

Attachment metadata

download_attachment

🟢 read

Fetch one attachment

get_changelog

🟢 read

Field-change history, paginated

add_comment

🔴 write

Post one Markdown comment

transition_issue

🔴 write

Move an issue through its workflow

update_issue

🔴 write

Set issue fields

TIP

SetREAD_ONLY_MODE=true and only the six 🟢 read tools register - the three 🔴 write tools are withheld entirely, see Configure.

More detail lives in docs/: configuration, OAuth setup, and what the tools return, with examples.

Install

uvx jira-mini-mcp

or

pip install jira-mini-mcp

Pin a version when you want a fixed surface: uvx jira-mini-mcp==1.1.0.

Running an unreleased commit straight from GitHub also works:

uvx --from git+https://github.com/proprock/jira-mini-mcp jira-mini-mcp

Requires Python 3.12+ and uv (or pip).

Related MCP server: Simple Jira MCP

Configure

With an API token, three values:

Variable

Meaning

JIRA_BASE_URL

Your site, e.g. https://example.atlassian.net

JIRA_EMAIL

The email your API token belongs to

JIRA_API_TOKEN

A Jira Cloud API token

Add READ_ONLY_MODE=true to withhold the write tools. Every setting, including STRUCTURED_OUTPUT, is in configuration.md.

NOTE

Prefer OAuth to a stored token? Set JIRA_AUTH_METHOD=oauth, register a free OAuth 2.0 (3LO) app, and run jira-mini-mcp login once to authorize in your browser. The server then refreshes its token by itself. Step by step: oauth.md.

Configuration is validated at startup, and an error names the missing setting without printing its value or your Jira URL. Keep the token in the host's own configuration and never commit it. The server acts with your 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 jira-mini-mcp

Put 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": ["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 jira-mini-mcp

Command uvx, argument jira-mini-mcp, and the three environment variables. Add READ_ONLY_MODE=true to withhold the write tools. OAuth host examples are in oauth.md.

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_issue takes 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 called In Progress can produce a status called In 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. To see the options first, ask get_issue(fields=["transitions"]). That is why there is no separate get_transitions tool.

  • update_issue replaces labels and components wholesale. There is no add or remove verb, so read the issue first if you mean to add one value. It takes the same values get_issue returns: assignee as an account id, an email, a display name, or the literal "me", description as Markdown, customfield_* as raw Jira JSON. It refuses status and comment, 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.

Six to 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

Official Atlassian MCP

sooperset/mcp-atlassian

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 or OAuth 2.0 (own app)

OAuth 2.1 or API token

API token, PAT, or OAuth 2.0 (own app)

Tools

6-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 without registering an app of your own, 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 six to 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.

Contributing and security

Setup, checks, the test and eval commands, the branch and commit conventions, and the release model are in CONTRIBUTING.md. Report vulnerabilities privately as described in SECURITY.md. Changes that affect someone running the server are recorded in CHANGELOG.md.

License

MIT. Not an official Atlassian product.

Available Tools

9 tools
add_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
issue_keyYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate readOnly=false, idempotent=false, and destructive=false. The description adds substantial behavioral detail beyond those: the Markdown-to-Jira rich text conversion set, the fact that unsupported markup remains literal, the return shape alignment with get_comments, and the permanent inability to edit/delete the comment.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no waste. The action is front-loaded, the Markdown details are compactly enumerated, and the limitation sentence adds necessary operational context. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter tool, the description covers the action, body formatting behavior, return shape, and an important operational limitation. It does not describe issue_key format, but the tool's low complexity and the return-shape note make the definition essentially complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 richly explains body semantics, specifying which Markdown constructs are converted and that everything else stays literal. However, issue_key is left completely unelaborated — no format, source, or example — so only one of the two parameters receives meaningful semantic enrichment.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Add one comment to an issue.' This clearly distinguishes it from read-oriented siblings like get_comments and from update_issue, and the mention of return shape reinforces its role as a create-comment operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context clear: it creates a comment, returns the same shape as get_comments, and explicitly warns that the server cannot edit or delete the comment afterwards. It does not explicitly name alternatives or when-not-to-use conditions, but the context is strong enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_attachmentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
attachment_idYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, open-world, and idempotent traits. The description adds valuable behavior beyond those by explaining the process-scoped temporary cache and its lifecycle (removed at server shutdown). No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core action and side-effect behavior are front-loaded, and every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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, the description provides the key outcome (local_path), the temporary-cache behavior, and its lifecycle. An agent can call the tool correctly without needing to know return structure, since the return value is explicitly stated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

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 attachment_id. However, it only restates 'by id' and does not explain what an attachment_id is, how to obtain it, or whether it maps to get_attachments output. This adds almost no meaning beyond the parameter name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Download'), a specific resource ('one attachment by id'), and a clear result ('return its local_path'). This is clearly distinguishable from sibling get_attachments, which presumably lists attachments rather than fetching a single one's content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it evident this tool is for fetching a single attachment's local file path, while siblings like get_attachments are more likely for listing or metadata. It does not explicitly name an alternative or state when not to use it, but the context is clear enough for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_attachmentsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
issue_keyYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, covering safety. The description adds the crucial behavior of not downloading content and lists the metadata fields returned, which goes beyond the annotations. It does not contradict the annotations and adds useful behavioral context, though it stops short of detailing output structure or edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no waste. The purpose is front-loaded, key fields are listed compactly, and the alternative tool is stated in one short clause. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple metadata-list tool with one required parameter, the description covers the purpose, returned fields, and the sibling to use for downloads. It omits details like pagination, sorting, or behavior for invalid issue keys, but these are reasonable to leave implied given the annotations (readOnly, idempotent) and the straightforward nature of the operation. Overall, it is sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has only one parameter, issue_key, with zero description coverage. The description implies its meaning by referencing 'an issue' but does not explicitly state the expected format (e.g., project key like 'PROJ-123' vs. numeric ID). Since the burden is higher with 0% coverage, the description partially compensates but lacks explicit parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('attachment metadata') and explicitly enumerates the returned fields (id, filename, mime_type, size, author, created). It clearly distinguishes from the sibling tool download_attachment by stating it does not download content, making the tool's scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states exactly when to use this tool (to list attachment metadata without downloading) and explicitly names the alternative for fetching bytes (download_attachment). This gives the agent clear routing criteria and leaves no ambiguity about selecting the right tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_changelogA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
orderNodesc
start_atNo
issue_keyYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint, openWorldHint), the description discloses meaningful behavior: default ordering, the special limit=0 behavior, tie-breaking by entry id, and the human-readable nature of field changes. This gives the agent a real sense of what happens during pagination and output without needing to guess.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences carry high informational density with no filler: purpose first, then ordering semantics, pagination behavior, and output nature. Each sentence earns its place and the most actionable details are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only, paginated listing tool with no output schema, the description is complete: it names the required resource, defines the two pagination parameters and edge cases, and tells the agent what entries contain. An agent can call this tool correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining order values ('desc' vs 'asc'), how start_at/limit paginate the sorted collection, and the meaning of limit=0. issue_key is implied by 'an issue's field-change history' and by its schema title, so all parameters are effectively covered.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List an issue's field-change history.' This clearly distinguishes it from sibling tools like get_issue and get_comments, which retrieve current state or comments rather than history. The purpose is unambiguous and immediately actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly establishes the context for use—when you need an issue's field-change history—and the detailed pagination semantics helps the agent invoke it correctly. It does not explicitly name alternatives or say when not to use it, but among the siblings its niche is distinct enough that the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_commentsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
orderNodesc
sinceNo
start_atNo
issue_keyYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, the description discloses important non-obvious behavior: pagination is on the logical filtered collection, ties are broken by comment id, limit=0 removes the 100-comment cap, and total reflects the filtered collection. This is rich, useful 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose and then packs dense, relevant details into a few sentences. There is no fluff or repetition; every segment adds meaningful operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five parameters, zero schema descriptions, and no output schema, the description provides enough detail for an agent to invoke the tool correctly. It explains ordering, pagination, filtering, and a result-level concept (total) that would otherwise be unknown.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the full parameter documentation burden. It does: order values, start_at/limit pagination semantics, limit=0's special behavior, since's ISO-8601 offset requirement, and total semantics are all explained. issue_key is obvious from the purpose statement.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a clear, specific verb and resource: 'List an issue's comments.' This distinguishes it from sibling tools like add_comment, get_issue, and get_changelog, whose names/purposes are different. The resource and action are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational guidance: it explains how ordering, pagination, and the since filter behave, including the special limit=0 behavior. It does not explicitly name alternatives or say when not to use this tool, but the context is sufficient and not misleading.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_issueA
Read-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. Requesting 'watches' or 'votes' resolves the real watcher/voter list (watch_count/is_watching/watchers, vote_count/has_voted/voters) via one extra request per field, instead of Jira's own link-only stub. When fields names any customfield_*, the result adds field_names mapping each returned customfield id to its display name. 'transitions' lists the moves available now (id, name, resulting status), the same names transition_issue accepts. Does not include comments, attachments, or changelog history; use the dedicated tools for those.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
issue_keyYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent hints, but the description adds significant behavioral context: fields replacement semantics, default fields, special handling for watches/votes (including an extra request), customfield mapping, and the fact that transitions are returned with status names. This goes well beyond annotations and discloses real behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence adds value. It opens with the core purpose, then logically explains parameter behavior, and ends with exclusions and sibling routing. Well-structured and front-loaded with the most important information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (fields behavior, special values, exclusions) and lack of output schema, the description covers all essential aspects: return shape (default fields, field_names for customfields, transitions list format), edge cases (fields=[]), and what is not included. It gives an agent 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description fully compensates. It thoroughly explains the `fields` parameter: default values, fields=[] behavior, special values for watches/votes, customfield handling, and transitions. The `issue_key` parameter is self-evident from context. The description provides rich semantic detail beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Fetch one issue by key.' It clearly distinguishes from siblings by explicitly listing what it does not include (comments, attachments, changelog) and pointing to dedicated tools, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use alternatives: 'use the dedicated tools for those' for comments, attachments, changelog. It also explains the transitions field relates to transition_issue, implying when to use this tool to preview transitions. Clear exclusions and alternatives are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_issuesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
jqlYes
limitNo
fieldsNo
page_tokenNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent hints; the description adds substantial non-obvious behavior beyond them: pagination contract (next_page_token null on last page, pass back as page_token), limit validation (1..100, 0 invalid), and the field-replacement semantics including the fields=[] edge case. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly packed sentences with the main purpose front-loaded, followed by pagination, then limit, then fields. Each clause earns its place, though the fields sentence is dense and could arguably be split for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers the tricky parts of this tool: pagination mechanics, validation rules, and non-default field behavior. It doesn't detail the shape of the returned items beyond the default field list, but the field list itself gives a strong hint; nothing needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must carry the entire parameter-documentation burden, and it does: jql is implied as the query language, limit gets explicit valid range and default, fields gets full replacement semantics plus a documented default set, and page_token gets its opaque-token contract. This fully compensates for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search), resource (Jira Cloud issues), and method (JQL), which distinguishes it from siblings like get_issue (single issue retrieval) and get_comments. The purpose is unmistakable and requires no inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to use pagination, limit, and fields correctly, which is operational guidance. However, it never names sibling tools like get_issue for single-issue lookup or says when to prefer them over this search tool, leaving use-vs-alternative decisions implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

transition_issueA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
commentNo
issue_keyYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as non-read-only and destructive; the description adds valuable detail: it changes issue state, posts the comment in the same call, explains matching behavior, and describes the error response. This goes well beyond what annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence adds value: purpose, parameter semantics, matching nuance, error handling, comment behavior, and state change. It is front-loaded with the main action and flows logically, with no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a state-changing tool with no output schema, the description covers all critical aspects: how to specify the target, what happens on no match, the comment being posted in the same call, and the state change. The destructive nature is already in annotations, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must explain parameters. It thoroughly explains 'to' (transition name/status, matching rules, error behavior) and 'comment' (Markdown, posted in same call). Issue_key is self-explanatory, but the description compensates fully for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Move an issue through its workflow' – a clear verb+resource. It further explains the 'to' parameter and that it changes issue state, making the purpose unmistakable and distinct from siblings like add_comment or update_issue.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on how to specify the target: prefer transition name over status, matching is case-insensitive and trims spaces, and the error fallback lists all transitions. It doesn't explicitly name alternative tools, but the usage context is clear and well-specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_issueA
DestructiveIdempotent

Set issue fields, taking the same values get_issue returns: summary as text, description as Markdown, assignee as an account id, an email, a display name, or the literal "me" (an ambiguous name is an error listing the candidates), 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsYes
issue_keyYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description discloses key behavioral traits: null clears certain fields, labels and components are replaced in total, ambiguous assignee names return an error listing candidates, and unknown/custom fields are stored as raw Jira JSON. This adds substantial value and aligns with the destructiveHint without contradicting any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is dense but every sentence earns its place. It front-loads the core action and then packs the field-reference mapping and replacement caveats into a compact paragraph. A bulleted list could improve scannability, but the information is efficiently presented with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with a free-form fields object and no output schema, the description covers all critical invocation details: accepted field types, null semantics, list replacement behavior, and restrictions (no status/comment). It leaves no obvious gap that would prevent correct use, even for agents unfamiliar with Jira.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description carries the full burden for the fields object. It meticulously specifies value types for summary, description, assignee, labels, components, priority, duedate, parent, and custom fields, including edge cases like 'me' and ambiguous-name errors. This is far beyond what the bare schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Set issue fields') and then details exactly which fields are supported and their formats. It also distinguishes itself from siblings by explicitly stating it cannot change status (use transition_issue) or add a comment (use add_comment), making the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-not guidance: status changes and comments belong to transition_issue and add_comment respectively. It also instructs the agent to read the issue first before adding to labels/components because they replace the whole list, which is concrete usage advice.

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.

  1. 9 tool updatesv1.3.0
    • Changedadd_comment1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "add_commentDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddownload_attachment1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "download_attachmentDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_attachments1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "get_attachmentsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_changelog1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "get_changelogDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_comments1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "get_commentsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedget_issue1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "get_issueDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsearch_issues1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "search_issuesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedtransition_issue1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "transition_issueDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedupdate_issue1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "update_issueDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 9 tool updates
    • Addedadd_comment
    • Addeddownload_attachment
    • Addedget_attachments
    • Addedget_changelog
    • Addedget_comments
    • Addedget_issue
    • Addedsearch_issues
    • Addedtransition_issue
    • Addedupdate_issue

TDQS

A4.4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource or action: search vs. fetch, comments, attachment metadata vs. download, changelog, add comment, transition, update. The get_issue description explicitly excludes comments, attachments, and changelog, and get_attachments vs. download_attachment are clearly separated by metadata vs. content.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with lowercase and underscores: search_issues, get_issue, get_comments, get_attachments, download_attachment, get_changelog, add_comment, transition_issue, update_issue. No mixing of conventions.

Tool Count5/5

9 tools is well within the ideal 3-15 range, and each tool covers a distinct aspect of Jira issue interaction without redundancy or bloat.

Completeness2/5

The set is missing create_issue and delete_issue, which are core lifecycle operations for an issue tracker. While it covers reading, updating, transitioning, and adding comments, the absence of create/delete is a significant gap that will cause agent failures when those actions are needed.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Provides tools for AI assistants to interact with JIRA APIs, enabling them to read, create, update, and manage JIRA issues through standardized MCP tools.
    6
    4 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides 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
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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