Skip to main content
Glama
applycoding

Jira + GitHub MCP server

by applycoding

Jira + GitHub MCP server

This is a portfolio demo, not a production integration. It shows how an AI agent can call Jira and GitHub through the Model Context Protocol. The default backend is an in-memory fake. Nothing here is affiliated with Atlassian or GitHub, and the live clients are thin REST wrappers rather than a hardened gateway.

CI

What it demonstrates

  • An MCP server built with the official Python SDK (mcp 2.x, MCPServer).

  • Eight tools: search, create, comment, and transition on Jira; list pull requests, summarize a diff, create an issue, and comment on GitHub.

  • Tokens come from the environment. The mock backend starts with no credentials.

  • Input validation, a per-tool rate limit, read-only mode, and allowlists for tools, Jira projects, and GitHub repositories.

  • JSON logs on stderr, so they do not collide with the MCP stdio stream. Argument values are not logged.

Related MCP server: jira-helper

Architecture

flowchart LR
    subgraph hosts [Agent hosts]
        Claude[Claude Desktop]
        Cursor[Cursor]
        Example[examples/agent_example.py]
    end

    subgraph server [jira_github_mcp]
        Guard[Guardrails]
        Tools[Jira and GitHub tools]
        Logs[JSON logs on stderr]
    end

    subgraph data [Backends]
        Mock[In-memory mock]
        Jira[Jira Cloud REST]
        GitHub[GitHub REST]
    end

    Claude --> Guard
    Cursor --> Guard
    Example --> Guard
    Guard --> Tools
    Tools --> Logs
    Tools -->|MCP_BACKEND=mock| Mock
    Tools -->|MCP_BACKEND=live| Jira
    Tools -->|MCP_BACKEND=live| GitHub

A client speaks MCP over stdin and stdout. Each tool call is checked against the allowlists and read-only flag, validated, then rate-limited. The service calls either the mock store or the live REST client. Logs go to stderr.

Tools

Tool

Mode

What it does

jira_search_issues

read

Search issues. Mock filters: project:PLAT, status:"In Progress", type:Bug, key:PLAT-101, plus free text.

jira_create_issue

write

Create a Bug, Task, or Story. Mock issues start as Open.

jira_add_comment

write

Comment on an issue key such as PLAT-101.

jira_transition_issue

write

Change status. Mock workflow: Open → In Progress → In Review → Done, plus Open → Done. Repeating the current status is a no-op.

github_list_pull_requests

read

List pull requests. state is open, closed, or all.

github_get_pr_diff_summary

read

File list with additions, deletions, and a short overview. This is a summary, not the raw patch.

github_create_issue

write

Open a GitHub issue.

github_add_comment

write

Comment on an issue or pull request number.

In live mode, a query that contains =, ~, ORDER BY, or IN ( is sent to Jira as JQL. Anything else is translated from the mock filter syntax. Results are still dropped when they fall outside JIRA_PROJECT_ALLOWLIST.

Mock workspace

The fake data is one small story so a demo agent has something to read:

  • PLAT-101 (Bug, Open) — SSO callback drops state and returns 500.

  • PLAT-102 (Story, In Progress) — audit every agent tool call.

  • MOB-14 (Task, Open) — cache pull request summaries for a mobile review bot.

  • acme/platform#41 — closed spike for an in-memory rate limiter.

  • acme/platform#42 — open PR, structured audit logging (160 additions).

  • acme/platform#43 — open PR, reject SSO callbacks that are missing state.

  • acme/platform#7 — open issue documenting the mock query syntax.

The mock GitHub client only knows acme/platform. Other repositories return not found.

Setup

Requires Python 3.11+.

python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

Run the server on stdio (this is what Claude Desktop and Cursor launch; it waits for MCP messages):

python -m jira_github_mcp

Or the console script: jira-github-mcp.

Try the example client, which starts the server itself, lists the tools, searches Jira for the SSO bug, and summarizes pull request 43:

python examples/agent_example.py

That script forces MCP_BACKEND=mock and MCP_READ_ONLY=true.

Claude Desktop

Merge examples/claude_desktop_config.json into the Claude Desktop config (claude_desktop_config.json). jira-github-mcp must be on the PATH of the app, or replace command with the full path to the executable inside your virtualenv.

Cursor

Project config lives in .cursor/mcp.json. examples/cursor_mcp.json is a starting point: mock backend, read-only, limited to the PLAT project and acme/platform. Use the same Python environment that has this package installed.

Configuration

See .env.example. All of these are optional in mock mode.

Variable

Default

Purpose

MCP_BACKEND

mock

mock or live.

MCP_READ_ONLY

false

When true, write tools return read_only.

MCP_TOOL_ALLOWLIST

empty (all tools)

Comma-separated tool names. Unknown names fail at startup.

JIRA_PROJECT_ALLOWLIST

empty (all projects)

Comma-separated project keys.

GITHUB_REPO_ALLOWLIST

empty (all repos)

Comma-separated owner/repo values.

MCP_RATE_LIMIT_PER_MINUTE

60

Per tool. 0 disables the limit.

LOG_LEVEL

INFO

DEBUG, INFO, WARNING, ERROR, or CRITICAL.

JIRA_BASE_URL

empty

Live only. Must be https://.

JIRA_EMAIL

empty

Jira Cloud account email.

JIRA_API_TOKEN

empty

Jira Cloud API token. Sent as Basic auth with the email.

GITHUB_TOKEN

empty

GitHub token sent as Authorization: Bearer.

Live mode refuses to start until the four credential variables are set. A Jira base URL that is not HTTPS is rejected so the token is not sent in the clear.

Security notes

  • Tokens are read from the environment. They are not written to logs, and the repo has no sample secrets.

  • Logs include the tool name, success flag, error code, and duration. They do not include argument values.

  • Read-only mode and the allowlists are for safe demos. Turn read-only on before pointing a live token at an agent.

  • The rate limit is in-memory and per process. Restarting the server clears it. It is not a quota system.

  • Validation limits string length and checks the shape of issue keys, project keys, and repository names. It is not a JQL sandbox. In live mode, raw JQL is passed to Jira, and the token's own permissions are the real boundary. The project allowlist filters rows after the call.

  • Live HTTP errors return a short status line to the agent. They do not include request headers.

  • This demo does not do SSO, audit storage, secret scanning, or multi-tenant isolation.

Tests and CI

Unit tests talk to the mock store and to live clients with a fake HTTP transport. They do not call Jira or GitHub.

GitHub Actions (.github/workflows/ci.yml) installs the package, runs Ruff, and runs pytest on Python 3.12. That workflow is the test run for this repo.

ruff check .
pytest -q

Layout

src/jira_github_mcp/    MCP server, guardrails, mock and live clients
examples/               Claude Desktop config, Cursor config, example client
tests/                  pytest against the mock backends and fake HTTP
.github/workflows/ci.yml

Limitations

  • Mock mode does not evaluate JQL. Use the field:value filters above.

  • Live mode does not page past the first response, and a diff summary is aggregated from the pull request files API rather than a review of the patch.

  • Jira auth is the Cloud email-plus-API-token pair, not a bearer personal access token.

  • The mock workflow statuses are fixed. Live mode matches a transition by name or destination status, so the caller has to use a name that project actually has.

  • There is no persistence. Mock writes disappear when the process exits.

Available Tools

8 tools
github_add_commentC

Comment on a GitHub issue or pull request number.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
repoYes
ownerYes
numberYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the description's job is to add context. It adds essentially none: no auth/permission requirements, no note that the comment is posted immediately and visible, and no error behavior. The only nuance is that the target may be an issue or a PR.

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?

A single short sentence with no filler and the key concept front-loaded. It is efficient, though its brevity reflects under-specification rather than tight editing of rich content.

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

Completeness2/5

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

For a mutation tool with no output schema, the description should at least clarify auth expectations, whether the comment is posted on issues vs. PRs (partially covered), and what is returned. It omits all of this, leaving the agent with minimal context beyond the name.

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% across 4 required parameters, so the description must compensate. It only clarifies that 'number' refers to an issue or pull request number; owner, repo, and body are left entirely to the schema's title-level fields with no added meaning (e.g., repo format, body length limit).

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

Purpose4/5

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

The description states a specific verb and resource ('Comment on a GitHub issue or pull request'), so an agent knows exactly what the tool does. It does not explicitly differentiate itself from the sibling jira_add_comment or github_create_issue, but the GitHub/comment pairing is unambiguous.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus alternatives such as jira_add_comment or github_create_issue, nor any prerequisites (e.g., the target must already exist). Usage is only implied by the tool name itself.

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

github_create_issueC

Open a GitHub issue in owner/repo.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
repoYes
ownerYes
titleYes

TDQS

C2.7/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is partly covered. The description adds nothing beyond that: no auth requirements, no rate limits, no note about what happens with the optional body, and no mention that this mutates external state.

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?

A single front-loaded sentence with zero filler. It is efficient, though the brevity reflects under-specification rather than disciplined concision.

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

Completeness2/5

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

For a four-parameter mutation tool with no output schema and 0% schema description coverage, the description omits nearly everything an agent needs: which params are required, what the body is for, and what the call returns.

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% and there are 4 parameters, so the description must compensate but does not. It hints at owner/repo via 'owner/repo' but says nothing about the required title field or the optional body field, including its 10,000-character limit.

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

Purpose4/5

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

States a specific verb (open/create) and resource (GitHub issue), and names the target as owner/repo. The platform prefix implicitly distinguishes it from jira_create_issue, but there is no explicit routing language.

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

Usage Guidelines2/5

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

No guidance on when to use this versus jira_create_issue or other issue-creation siblings, and no stated prerequisites (auth, permissions, scope). The agent must infer everything from the name.

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

github_get_pr_diff_summaryB
Read-only

Summarize a pull request diff: files changed, additions, deletions, and a short overview.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
numberYes

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that the result includes files changed, additions, deletions, and an overview, but it does not clarify pagination, rate limits, or the exact shape of the overview.

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 a single, front-loaded sentence that efficiently states the tool's purpose and the main output fields with no wasted words.

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

Completeness3/5

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

For a read-only summary tool with no output schema, the description gives a useful high-level view of the return contents. However, with 0% parameter coverage, it leaves the meaning and expected values of owner/repo/number unexplained.

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 none of the three parameters (owner, repo, number) are documented in the schema. The description does not compensate by explaining what these parameters represent or their expected formats.

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

Purpose4/5

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

The description states a specific verb and resource: 'Summarize a pull request diff', and names the components included in the summary. It clearly distinguishes this from listing pull requests, though it does not explicitly name alternatives in text.

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives such as github_list_pull_requests or other GitHub tools. The intended use is only implied by the tool name and description.

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

github_list_pull_requestsC
Read-only

List pull requests in a repository. state is open, closed, or all.

ParametersJSON Schema
NameRequiredDescriptionDefault
repoYes
ownerYes
stateNoopen
max_resultsNo

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnly, non-destructive, open-world behavior, so safety is covered. The description adds nothing beyond that — no note on result ordering, pagination behavior, or whether listing spans all states by default. 'state is open, closed, or all' simply restates the enum already present in the schema.

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

Conciseness4/5

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

Two short sentences with the purpose front-loaded and no filler. It is efficiently sized; the issue is under-specification rather than padding.

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

Completeness3/5

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

For a simple read-only list tool with annotations covering the safety profile and no output schema, the description is close to adequate. However, the un-explained max_results cap means an agent has no idea results are truncated by default, which is the main missing piece.

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 must carry parameter meaning, yet it addresses only state — and only by repeating the enum values. owner, repo, and especially max_results (default 10, max 50, i.e. a pagination cap) are left entirely unexplained, which is a real gap for a listing tool.

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

Purpose4/5

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

States a specific verb and resource — 'List pull requests in a repository' — which is clearly distinguishable from the other github siblings (get_pr_diff_summary, create_issue, add_comment) and the jira tools. It does not explicitly name or contrast with any sibling, but the resource is unambiguous.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as github_get_pr_diff_summary. The only contextual statement is an enumeration of state values, which is parameter data rather than usage guidance.

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

jira_add_commentC

Add a comment to a Jira issue key such as PLAT-101.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYes
issue_keyYes

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered structurally. The description adds nothing beyond that: it doesn't say who the comment is attributed to, what permissions are required, or what the call returns.

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?

A single, front-loaded sentence with no wasted words. It is efficient, though its brevity comes at the cost of covering more ground.

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

Completeness3/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 with annotations covering the safety profile and no output schema, the essentials are present. Still missing practical context such as required permissions, attribution of the comment, and the result of a successful call.

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 must carry parameter meaning. The 'PLAT-101' example usefully illustrates the issue_key format (already enforced by the schema pattern), but 'body' — the comment text — is never explained, and no additional semantics are added for either parameter.

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

Purpose4/5

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

States a specific verb (add) and resource (comment on a Jira issue) and gives a concrete issue-key example, so an agent can tell it apart from jira_create_issue or github_add_comment. It does not explicitly name which sibling to prefer, but the Jira/comment combination is unambiguous.

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

Usage Guidelines2/5

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

There is no when-to-use guidance, no mention of prerequisites (e.g. the issue must exist, the caller must have comment permission), and no comparison to alternatives. Usage is only inferable from the verb itself.

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

jira_create_issueC

Create a Jira issue. issue_type is Bug, Task, or Story. New issues start as Open.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectYes
summaryYes
issue_typeNoTask
descriptionNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds one genuine behavioral fact beyond the schema: 'New issues start as Open' (initial workflow status). It omits permission requirements and any side effects, but with annotations carrying the safety burden a 3 is appropriate.

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

Conciseness4/5

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

Three short, front-loaded sentences with the core action first. The issue_type enumeration duplicates the schema's enum, which is slightly wasteful, but overall it is tight and readable.

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

Completeness2/5

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

For a mutation tool with no output schema and 0% schema coverage, the description is too thin: it does not clarify which fields are required, what the created issue's key is, or any per-issue-type field requirements. An agent can call it, but with avoidable guesswork.

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 bears the full burden, yet it only restates the issue_type enum values already present in the schema. It says nothing about the required project key pattern, the summary field, or the description field.

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

Purpose4/5

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

States a specific verb+resource ('Create a Jira issue') with no ambiguity about the core action. It does not explicitly differentiate from sibling tools, though the jira_ prefix and 'create' verb make the scope reasonably clear.

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

Usage Guidelines2/5

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

No guidance on when to use this versus alternatives such as jira_search_issues or github_create_issue, and no prerequisites (auth, project existence) are mentioned. The only 'guidance' is a statement of defaults, not a when-to-use condition.

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

jira_search_issuesC
Read-only

Search Jira issues. Use project:KEY, status:"Name", type:Bug, key:KEY-1, or free text.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so safety is covered. The description adds nothing behavioral beyond that: it never mentions pagination, the default/max result window, or what a search returns, which are the traits an agent would actually need here.

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?

Two short sentences, purpose front-loaded ahead of the syntax hints, with no filler. Slightly terse in a way that leaves gaps, but nothing is wasted.

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

Completeness3/5

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

No output schema exists, so the description carries the full burden of describing returns, and it says nothing about result shape, ordering, or pagination. It covers the query syntax adequately for a 2-parameter tool but leaves the output side and 'max_results' semantics unaddressed.

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 carry parameter meaning. It does add real syntax for the required 'query' parameter (project:KEY, status:"Name", type:Bug, key:KEY-1, free text), but leaves 'max_results' and its default of 10 / cap of 50 entirely unexplained.

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

Purpose4/5

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

States a specific verb+resource ('Search Jira issues'), which is clearly distinct from write-oriented siblings like jira_create_issue, jira_add_comment, and jira_transition_issue. It does not explicitly name or differentiate itself from any sibling, but the verb alone is unambiguous.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives, nor any prerequisites, rate limits, or scope caveats. The 'Use project:KEY...' sentence describes query syntax rather than selection guidance, so an agent gets no routing help.

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

jira_transition_issueA
DestructiveIdempotent

Move a Jira issue to a status. Mock workflow: Open, In Progress, In Review, Done.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusYes
issue_keyYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description adds the mock-workflow status list, which is useful context, but says nothing about the consequence of a transition (the prior status being replaced, reversibility, or any permission requirements) for a tool flagged destructive.

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, front-loaded with the action and followed by the constrained value set. No filler or redundancy.

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 mock tool with no output schema, the description covers the operation and the valid status domain; mutation semantics are largely carried by the annotations. Only minor gaps remain around permissions and reversibility.

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 schema alone only exposes a regex pattern for each argument. The description partially compensates by naming the four valid status values, which is genuine added meaning over the pattern, but it says nothing about the issue_key format or behavior.

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

Purpose4/5

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

States a specific verb and resource ('Move a Jira issue to a status') and enumerates the valid target statuses, so an agent knows exactly what the tool accomplishes. It doesn't explicitly name sibling tools, but the verb+resource pair is distinct enough from jira_create_issue and jira_search_issues that differentiation is implicit.

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 implies when to use it (an issue needs a status change) and usefully constrains the status value set to 'Open, In Progress, In Review, Done'. However, it offers no explicit when/when-not guidance, no prerequisites, and no routing away from alternatives like jira_create_issue.

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. 8 tool updatesv0.1.0
    • First observedgithub_add_comment
    • First observedgithub_create_issue
    • First observedgithub_get_pr_diff_summary
    • First observedgithub_list_pull_requests
    • First observedjira_add_comment
    • First observedjira_create_issue
    • First observedjira_search_issues
    • First observedjira_transition_issue

TDQS

B3.2/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct resource and action, with platform prefixes (jira_/github_) preventing cross-confusion between similarly named operations like add_comment. No two tools overlap in purpose, so an agent can select the correct tool without ambiguity.

Naming Consistency5/5

All tools follow a consistent snake_case verb_noun pattern with clear platform prefixes: jira_search_issues, jira_create_issue, github_list_pull_requests, etc. There are no mixed conventions or vague verbs.

Tool Count4/5

Eight tools is within the typical 3-15 range and each is non-redundant. However, covering two distinct platforms with only four tools each feels slightly thin for the apparent scope of a combined Jira + GitHub server.

Completeness2/5

The surface is significantly incomplete for both platforms: Jira lacks issue retrieval, update, and delete, and GitHub lacks PR creation, merging, and issue retrieval/update. An agent trying to perform common lifecycle operations beyond creation and commenting will hit dead ends.

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
    10 npm
    3
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables natural language interaction with Jira Cloud tickets, including listing, searching, creating, and updating issues through a set of MCP tools.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to interact with GitHub via MCP, managing repositories, issues, PRs, and analyzing repository health through tools like list_repositories, read_issues, create_issue, comment_on_pr, and analyze_repo_health.
    -