Skip to main content
Glama
vish288

mcp-atlassian-extended

by vish288

mcp-atlassian-extended

PyPI version PyPI downloads Python License: MIT CI MCP Registry

Install: uvx mcp-atlassian-extended | PyPI | MCP Registry | Changelog

uvx mcp-atlassian-extended                          # with writes
MCP_READ_ONLY=true uvx mcp-atlassian-extended       # locked read-only: write tools are not listed

mcp-atlassian-extended is a Model Context Protocol (MCP) server for Jira and Confluence. It gives an AI assistant 22 tools, 15 resources, and 5 prompts for Jira and Confluence work. The tools create and update issues with custom fields, link issues, manage attachments, and search users. They also run agile boards and sprints, track project versions (API v2), read team calendars, and plan sprint capacity. It extends mcp-atlassian with zero tool overlap. Runs in one of two modes: with writes, or locked read-only (MCP_READ_ONLY=true) so the 10 write tools are never offered to the model.

The server supports the MCP 2026-07-28 specification (often called MCP 2.0) and stays compatible with 2025-11-25 clients. It works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client.

The server supports Jira Cloud, Jira Data Center, Confluence Cloud, and Confluence Data Center (self-hosted). It needs no Atlassian Premium plan.

Built with FastMCP, httpx, and Pydantic.

Protocol support

  • The server implements the MCP 2026-07-28 specification, often called MCP 2.0.

  • It stays compatible with 2025-11-25 clients.

  • Transports: stdio (default) and streamable-http (recommended for remote clients). The sse transport still works, but the 2026-07-28 specification deprecates it, so the server prints a warning.

  • The server uses no roots, sampling, logging, elicitation, or resource subscriptions. The 2026-07-28 deprecations do not affect it.

  • Built on FastMCP 4.x and the MCP Python SDK 2.x.

Error results

Expected failures — a 404, a 401/403, a read-only refusal, an invalid argument — come back as a tool result with isError: true, so an MCP client sees the failure instead of a result that merely happens to contain the word error. The result body is the same {"error": …, "hint": …} object as before, with status_code and body when the failure came from the API; the hint names the fix. This object is the result's text content; structuredContent is not set, because a strict MCP client validates structuredContent against the tool's output schema even when isError is true, and the error envelope does not match it. Genuine bugs are still raised as protocol-level tool errors and logged with a traceback.

On success, a tool carries the same pretty-printed JSON as its text content and that JSON object as structuredContent — the pre-2.0 {"result": "<json string>"} wrapper is gone (a payload that is a JSON array, such as a multi-file upload response, carries text only, since structuredContent must be an object). Tools advertise no outputSchema: upstream fields pass through untyped, and a typed schema is opt-in per tool via output_schema= on @mcp.tool(...) when a client needs one.

Related MCP server: atlassian-mcp

Relationship to mcp-atlassian

This project runs alongside mcp-atlassian, not as a replacement. Configure both servers:

  • mcp-atlassian handles: issues, search, transitions, comments, worklog, pages, Confluence search

  • mcp-atlassian-extended handles: attachments, agile, users, fields, versions (API v2), calendars, time-off

There is no tool overlap — this server only implements tools that mcp-atlassian lacks.

1-Click Installation

Install in Cursor

Install in VS Code Install in VS Code Insiders

💡 Tip: For other AI assistants (Claude Code, Windsurf, IntelliJ, Gemini CLI), visit the Atlassian Extended MCP Installation Gateway.

Prerequisite: Install uv first (required for all uvx install flows). Install uv.

Claude Code

# with writes
claude mcp add atlassian-extended \
  -e JIRA_URL=https://your-company.atlassian.net -e JIRA_USERNAME=your.email@company.com -e JIRA_API_TOKEN=your_api_token \
  -- uvx mcp-atlassian-extended
# locked read-only: write tools are not listed
claude mcp add atlassian-extended -e MCP_READ_ONLY=true \
  -e JIRA_URL=https://your-company.atlassian.net -e JIRA_USERNAME=your.email@company.com -e JIRA_API_TOKEN=your_api_token \
  -- uvx mcp-atlassian-extended

Windsurf & IntelliJ

Windsurf: Add to ~/.codeium/windsurf/mcp_config.json IntelliJ: Add to Settings | Tools | MCP Servers

Note: The actual server config starts at atlassian-extended inside the mcpServers object. Remove MCP_READ_ONLY to allow writes.

{
  "mcpServers": {
    "atlassian-extended": {
      "command": "uvx",
      "args": ["mcp-atlassian-extended"],
      "env": {
        "JIRA_URL": "https://your-company.atlassian.net",
        "JIRA_USERNAME": "your.email@company.com",
        "JIRA_API_TOKEN": "your_api_token",
        "CONFLUENCE_URL": "https://your-company.atlassian.net/wiki",
        "CONFLUENCE_USERNAME": "your.email@company.com",
        "CONFLUENCE_API_TOKEN": "your_api_token",
        "MCP_READ_ONLY": "true"
      }
    }
  }
}

Gemini CLI

# with writes
gemini mcp add -s user -e JIRA_URL=https://your-company.atlassian.net -e JIRA_USERNAME=your.email@company.com -e JIRA_API_TOKEN=your_api_token -e CONFLUENCE_URL=https://your-company.atlassian.net/wiki -e CONFLUENCE_USERNAME=your.email@company.com -e CONFLUENCE_API_TOKEN=your_api_token atlassian-extended uvx mcp-atlassian-extended
# locked read-only
gemini mcp add -s user -e MCP_READ_ONLY=true -e JIRA_URL=https://your-company.atlassian.net -e JIRA_USERNAME=your.email@company.com -e JIRA_API_TOKEN=your_api_token -e CONFLUENCE_URL=https://your-company.atlassian.net/wiki -e CONFLUENCE_USERNAME=your.email@company.com -e CONFLUENCE_API_TOKEN=your_api_token atlassian-extended uvx mcp-atlassian-extended

VS Code

Add to .vscode/mcp.json. Remove MCP_READ_ONLY to allow writes.

{
  "servers": {
    "atlassian-extended": {
      "type": "stdio",
      "command": "uvx",
      "args": ["mcp-atlassian-extended"],
      "env": {
        "JIRA_URL": "https://your-company.atlassian.net",
        "JIRA_USERNAME": "your.email@company.com",
        "JIRA_API_TOKEN": "your_api_token",
        "MCP_READ_ONLY": "true"
      }
    }
  }
}

Codex

# with writes
codex mcp add atlassian-extended --env JIRA_URL=https://your-company.atlassian.net --env JIRA_USERNAME=your.email@company.com --env JIRA_API_TOKEN=your_api_token -- uvx mcp-atlassian-extended
# locked read-only
codex mcp add atlassian-extended --env MCP_READ_ONLY=true --env JIRA_URL=https://your-company.atlassian.net --env JIRA_USERNAME=your.email@company.com --env JIRA_API_TOKEN=your_api_token -- uvx mcp-atlassian-extended

pip / uv

uv pip install mcp-atlassian-extended

Drop MCP_READ_ONLY to allow writes. On a shared or hosted server put it in the deployer's env, not the client config.

Configuration

Jira Cloud (Basic Auth)

Variable

Required

Default

Description

JIRA_URL

Yes

-

Jira instance URL (e.g. https://your-company.atlassian.net)

JIRA_USERNAME

Yes

-

Email address for Jira Cloud

JIRA_API_TOKEN

Yes

-

API token from id.atlassian.com/manage-profile/security/api-tokens

Jira Data Center / Self-Hosted (Bearer Token)

Variable

Required

Default

Description

JIRA_URL

Yes

-

Jira instance URL

JIRA_PAT

Yes

-

Personal access token (see fallback order below)

The server checks these environment variables in order — first match wins:

  1. JIRA_PAT

  2. JIRA_PERSONAL_TOKEN

  3. JIRA_TOKEN

Basic auth wins. If you set both JIRA_USERNAME and JIRA_API_TOKEN, the server uses Basic auth and ignores any personal access token. The server uses Bearer auth only when the Cloud pair is incomplete. To force Bearer, unset JIRA_USERNAME and JIRA_API_TOKEN.

Confluence Cloud (Basic Auth)

Variable

Required

Default

Description

CONFLUENCE_URL

Yes

-

Confluence URL (e.g. https://your-company.atlassian.net/wiki)

CONFLUENCE_USERNAME

Yes

-

Email address for Confluence Cloud

CONFLUENCE_API_TOKEN

Yes

-

API token (same as Jira if same Atlassian account)

Confluence Data Center / Self-Hosted (Bearer Token)

Variable

Required

Default

Description

CONFLUENCE_URL

Yes

-

Confluence instance URL

CONFLUENCE_PAT

Yes

-

Personal access token (see fallback order below)

The server checks these environment variables in order — first match wins:

  1. CONFLUENCE_PAT

  2. CONFLUENCE_PERSONAL_TOKEN

  3. CONFLUENCE_TOKEN

Basic auth wins here too: CONFLUENCE_USERNAME + CONFLUENCE_API_TOKEN take precedence over any personal access token.

All Confluence calendar tools require the Team Calendars add-on (/rest/calendar-services/1.0/). On instances without it every calendar tool returns a 404 with a hint naming the add-on.

Optional settings

Variable

Default

Description

MCP_READ_ONLY

false

Shared name across the mcp-* servers. Any value other than false/0/no/off/empty locks the server read-only: the 10 write tools and write-workflow prompts are not listed, and nothing can turn it back off at runtime

ATLASSIAN_READ_ONLY

false

Per-server alias for MCP_READ_ONLY; either one locks the server read-only. --read-only can only raise the lock

ATLASSIAN_HTTP_BEARER_TOKEN

-

Bearer token (min 16 chars) required to bind an HTTP transport to a non-loopback host; clients send Authorization: Bearer <token>

ATLASSIAN_UPLOAD_DIR

working directory

Only files under this directory may be uploaded (jira_upload_attachment). A relative value is resolved against the working directory.

ATLASSIAN_DOWNLOAD_DIR

./atlassian-downloads

Where jira_download_attachment writes. Created on first download.

JIRA_TIMEOUT

30

HTTP request timeout for Jira in seconds

JIRA_SSL_VERIFY

true

Set to false to skip SSL verification for Jira

CONFLUENCE_TIMEOUT

30

HTTP request timeout for Confluence in seconds

CONFLUENCE_SSL_VERIFY

true

Set to false to skip SSL verification for Confluence

Compatibility

Client

Supported

Install Method

Claude Desktop

Yes

claude_desktop_config.json

Claude Code

Yes

claude mcp add

Cursor

Yes

One-click deeplink or .cursor/mcp.json

Windsurf

Yes

~/.codeium/windsurf/mcp_config.json

VS Code Copilot

Yes

.vscode/mcp.json

Any MCP client

Yes

stdio or HTTP transport

Tools (22)

Category

Count

Tools

Jira Issues

2

create (with custom fields; issue_type="Epic" for epics), update (with custom fields)

Jira Links

2

create link, delete link

Jira Attachments

4

get, upload, download, delete

Jira Users

1

search by name/email

Jira Metadata

3

list projects, list fields, backlog

Jira Agile

4

get board, board config, get sprint, move to sprint

Jira Versions

3

get project versions, create version, update version

Confluence Calendars

3

list (type/search filter), time-off (date range, per-person), sprint capacity

Jira Issues

Tool

Description

jira_create_issue

Create issue with standard and custom fields (issue_type="Epic" creates an epic)

jira_update_issue

Update issue fields and custom fields

Tool

Description

jira_create_link

Create a link between two issues (Relates, Blocks, etc.)

jira_delete_link

Delete an issue link by ID

Jira Attachments

Tool

Description

jira_get_attachments

List attachments on an issue

jira_upload_attachment

Upload file to issue

jira_download_attachment

Download attachment to local file

jira_delete_attachment

Delete an attachment

Jira Users

Tool

Description

jira_search_users

Search users by name/email

Jira Metadata

Tool

Description

jira_list_projects

List all accessible projects

jira_list_fields

List fields (with search/custom filter)

jira_backlog

Get backlog issues for a board

Jira Agile

Tool

Description

jira_get_board

Get board details

jira_board_config

Get board column configuration

jira_get_sprint

Get sprint details

jira_move_to_sprint

Move issues to a sprint

Jira Versions

Tool

Description

jira_get_project_versions

List all versions for a project (REST API v2, Server/DC + Cloud)

jira_create_version

Create a new version in a project (REST API v2)

jira_update_version

Update an existing version (REST API v2)

Confluence Calendars

Tool

Description

confluence_list_calendars

List calendars; optional filter_type and name/space search

confluence_get_time_off

Time-off events for a date range; optional person (exact match) and group_by_person

confluence_sprint_capacity

Calculate sprint capacity with time-off

Resources (15)

The server exposes curated Jira and Confluence workflow guides as MCP resources.

URI

Name

Description

resource://rules/jira-hierarchy

Jira Issue Hierarchy

Epic/story/task/subtask relationships, when to use each level

resource://rules/jira-ticket-writing

Jira Ticket Writing Standards

Summary format, description structure, acceptance criteria placement

resource://rules/acceptance-criteria

Acceptance Criteria Standards

Given/When/Then format, testability, DoD vs AC

resource://rules/sprint-hygiene

Sprint Hygiene Rules

Capacity planning, carryover policy, sprint goals, retrospective items

resource://rules/jira-workflow

Jira Workflow & Automation

Status transitions, automation triggers, post-functions

resource://rules/issue-linking

Issue Linking Best Practices

Link types (blocks, relates, duplicates), cross-project links, epic links

resource://guides/story-points

Story Point Estimation

Fibonacci scale, relative sizing, team calibration, anti-patterns

resource://guides/definition-of-done

Definition of Done Checklists

Checklist format, team-level vs org-level DoD, verification steps

resource://guides/jira-labels

Jira Label Taxonomy

Naming conventions, label categories, label vs component

resource://guides/jql-library

JQL Query Library

Common queries, date functions, custom field syntax, saved filters

resource://guides/custom-fields

Jira Custom Field Governance

Field types, screen schemes, context, naming standards

resource://guides/confluence-spaces

Confluence Space Organization

Space types, permission schemes, archiving, templates

resource://guides/agile-ceremonies

Agile Ceremony Standards

Standup, planning, review, retro formats and time-boxing

resource://guides/git-jira-integration

Git-Jira Integration Patterns

Smart commits, branch naming, PR linking, status transitions

resource://templates/confluence-pages

Confluence Page Templates

ADR, runbook, onboarding, postmortem page structures

Prompts (5)

The server provides MCP prompts — reusable multi-tool workflow templates that clients can surface as slash commands.

Prompt

Parameters

Workflow

create_ticket

project_key, issue_type

Gather fields → set custom fields (DoD, privacy, security) → create → add links

plan_sprint

board_id, sprint_id

Check sprint → review backlog → calculate capacity → suggest scope → move issues

close_ticket

issue_key

Verify DoD → check linked MR → transition statuses → add closing comment

team_availability

team_members, start_date, end_date

Check who is out → per-person time-off → calculate capacity → flag conflicts

manage_attachments

issue_key

List attachments → identify stale/duplicates → upload/download → clean up

Usage Examples

Issue Management

"Create a story in PROJ with custom story points"
→ jira_create_issue(project_key="PROJ", summary="Add OAuth login", issue_type="Story",
    custom_fields={"customfield_10004": 5})

"Update a ticket's priority and add labels"
→ jira_update_issue(issue_key="PROJ-123", fields={"priority": {"name": "High"}, "labels": ["urgent"]})

"Create an epic and link related stories"
→ jira_create_issue(project_key="PROJ", summary="Q1 Auth Overhaul", issue_type="Epic")
→ jira_create_link(link_type="Relates", inward_issue="PROJ-100", outward_issue="PROJ-200")

Attachments

"List attachments on PROJ-123"
→ jira_get_attachments(issue_key="PROJ-123")

"Upload a screenshot to a ticket"
→ jira_upload_attachment(issue_key="PROJ-123", file_path="./screenshot.png")

"Download an attachment"
→ jira_download_attachment(content_url="https://jira.example.com/rest/api/2/attachment/content/456",
    save_path="report.pdf")  # lands in ./atlassian-downloads/report.pdf (or ATLASSIAN_DOWNLOAD_DIR)

Agile & Sprint Management

"Get the current sprint for board 42"
→ jira_get_board(board_id=42) → jira_get_sprint(sprint_id=7)

"Move tickets into the next sprint"
→ jira_move_to_sprint(sprint_id=8, issue_keys=["PROJ-1", "PROJ-2", "PROJ-3"])

"View backlog for board 42"
→ jira_backlog(board_id=42, max_results=50)

Version Management

"List versions for project PROJ"
→ jira_get_project_versions(project_key="PROJ")

"Create a new release version"
→ jira_create_version(project_key="PROJ", name="v2.0.0", release_date="2026-04-01")

"Mark version as released"
→ jira_update_version(version_id="200", released=True)

Time-Off & Sprint Capacity

"Who is out today?"
→ confluence_get_time_off(start_date="today", end_date="today", group_by_person=True)

"Get team time-off for the next two weeks"
→ confluence_get_time_off(start_date="today", end_date="+14d", group_by_person=True)

"Calculate sprint capacity accounting for PTO"
→ confluence_sprint_capacity(
    team_members=["Alice", "Bob", "Carol"],
    sprint_start="2025-03-03", sprint_end="2025-03-14")

Security Considerations

  • Token scope: For Jira Cloud, use API tokens scoped to the minimum required permissions. For Data Center, use PATs with project-level access.

  • Read-only mode: Set MCP_READ_ONLY=true (or ATLASSIAN_READ_ONLY=true) in the launch you control and the server starts locked: the 10 write tools and the write-workflow prompts are not listed, a call to one returns "Unknown tool", and the guard refuses any write that still reaches it. Nothing lifts the lock at runtime — not a false from another source, not a .env file, not tool arguments; any value other than false/0/no/off/empty locks, and --read-only can only raise it. The lock is only as strong as the launch: set it where users cannot edit it (a managed MCP config such as Claude Code managed-mcp.json, a container, k8s or systemd env, or a hosted HTTP deployment). A user who starts the server themselves controls its environment. All write tools are Jira tools; the Confluence tools are read-only in both modes.

  • HTTP transport auth: An HTTP transport (--transport streamable-http/sse) serves every tool with the configured Atlassian credentials to anyone who reaches the port, so a non-loopback bind requires a shared bearer token. Set ATLASSIAN_HTTP_BEARER_TOKEN (≥ 16 chars; openssl rand -hex 32) and clients send it as Authorization: Bearer <token>; the token is compared in constant time. Without it the server refuses to start on any host other than 127.0.0.1/localhost/::1. The server also validates the Host/Origin header on HTTP requests (host_origin_protection="auto") so a DNS-rebinding page cannot drive a loopback-bound server.

  • Upload root restriction: jira_upload_attachment only reads files inside the upload root — ATLASSIAN_UPLOAD_DIR if set, otherwise the working directory. The path is resolved (following symlinks) before the containment check, so a symlink pointing outside the root is rejected; dotfiles and dot-directories below the root are refused. Size is capped at 100 MB.

  • Download directory restriction: jira_download_attachment writes only into the download directory (ATLASSIAN_DOWNLOAD_DIR, default ./atlassian-downloads/, created on first use). save_path must be a bare file name — directories, absolute paths and dotfiles are rejected, not silently stripped. Existing files are never overwritten: a -1, -2 numeric suffix is added and the final path is returned. The downloaded body is capped at 100 MB, mirroring the upload cap. Add atlassian-downloads/ to your project's .gitignore.

  • Desktop-client caveat: clients such as Claude Desktop launch stdio servers with a working directory of / or $HOME, which makes most of the filesystem the upload root (dotfiles excepted). Set ATLASSIAN_UPLOAD_DIR (and, if you like, ATLASSIAN_DOWNLOAD_DIR) explicitly for such clients.

  • Migration (0.11 → 0.12): uploads are now restricted to ATLASSIAN_UPLOAD_DIR (default: the server's working directory) and dotfiles are refused — if your client uploads from ~/Downloads, set ATLASSIAN_UPLOAD_DIR=~/Downloads. Downloads now land in ./atlassian-downloads/ (or ATLASSIAN_DOWNLOAD_DIR) instead of the working directory, save_path is a file name only, and existing files are never overwritten.

  • Download URL validation: The server validates each attachment download URL against the configured Jira URL domain to prevent SSRF.

  • SSL verification: The server enables SSL verification by default for Jira and Confluence. Disable it only for self-signed certificates in trusted networks.

  • MCP tool annotations: Each tool declares readOnlyHint, destructiveHint, and idempotentHint for client-side permission prompts.

  • No credential storage: The server reads tokens from environment variables at startup. It never stores them.

Rate Limits & Permissions

Rate Limits

Jira Cloud enforces per-user rate limits. When rate-limited, tools return a 429 error with a hint to wait. Confluence Calendar API calls may be slower due to the Team Calendars plugin architecture.

Required Permissions

Operation

Minimum Jira Permission

List projects, fields, boards

Browse Projects

Search users

Browse Users

Create/update issues, epics

Create Issues + Edit Issues

Create/delete issue links

Link Issues

Upload/delete attachments

Create Attachments + Delete Own Attachments

Move issues to sprint

Manage Sprints

Create/update versions

Administer Projects

Confluence calendars/time-off

View space content

CLI & Transport Options

# Default: stdio transport (for MCP clients)
uvx mcp-atlassian-extended

# HTTP transport. Use streamable-http for remote clients.
uvx mcp-atlassian-extended --transport streamable-http --port 9000

# A non-loopback HTTP bind requires a shared bearer token (>= 16 chars).
# Clients send it as "Authorization: Bearer <token>".
ATLASSIAN_HTTP_BEARER_TOKEN=$(openssl rand -hex 32) \
  uvx mcp-atlassian-extended --transport streamable-http --host 0.0.0.0 --port 9000

# sse still works, but the MCP 2026-07-28 spec deprecates it. The server prints a warning.
uvx mcp-atlassian-extended --transport sse --host 127.0.0.1 --port 8000

# CLI overrides for config
JIRA_PAT=xxx uvx mcp-atlassian-extended --jira-url https://jira.example.com --read-only

The --jira-token, --jira-api-token, --confluence-token and --confluence-api-token flags still work but are deprecated and hidden from --help: they expose the token to ps and shell history. Set JIRA_PAT / JIRA_API_TOKEN / CONFLUENCE_PAT / CONFLUENCE_API_TOKEN instead.

The server loads .env files from the working directory automatically via python-dotenv.

Partial configuration: You configure Jira and Confluence independently. Set either or both. The server always advertises all 22 tools. A tool for an unconfigured product returns a "not configured" error that names the variables to set. The server does not fail at startup.

Docker

A minimal non-root image is provided. The image defaults to locked read-only (MCP_READ_ONLY=true); pass -e MCP_READ_ONLY=false to allow writes.

docker build -t mcp-atlassian-extended .
docker run --rm -i \
  -e JIRA_URL=https://your-company.atlassian.net \
  -e JIRA_USERNAME=your.email@company.com -e JIRA_API_TOKEN=your_api_token \
  mcp-atlassian-extended

The entry point is the mcp-atlassian-extended command; pass CLI flags after the image name. For an HTTP transport on a published port, also set ATLASSIAN_HTTP_BEARER_TOKEN and run with --transport streamable-http --host 0.0.0.0.

FAQ

Does it support the MCP 2026-07-28 spec (MCP 2.0)?

Yes. It implements the MCP 2026-07-28 specification (MCP 2.0) and stays compatible with 2025-11-25 clients.

Which transports does it support?

It supports stdio (the default) and streamable-http (recommended for remote clients). The sse transport still works, but the 2026-07-28 specification deprecates it.

Can I run mcp-atlassian-extended read-only so the assistant cannot change anything?

Yes. Start it with MCP_READ_ONLY=true (or ATLASSIAN_READ_ONLY=true). The 10 write tools and the write-workflow prompts are then not listed at all, so the model never sees them; a call to one returns "Unknown tool", and nothing can turn writes back on while the process runs. Set it in a launch you control — a managed MCP config, a container or systemd env, or a hosted deployment — because a user who starts the server themselves can start it without the variable.

Does it work with self-hosted Jira and Confluence?

Yes. It supports Jira Cloud, Jira Data Center, Confluence Cloud, and Confluence Data Center. It uses the Jira REST API v2, which works on both Cloud and Server/Data Center.

What permissions and token scopes does it need?

It needs a Jira API token (Cloud) or a personal access token (Data Center). Each operation needs the matching Jira permission. See Required Permissions.

Does it replace mcp-atlassian?

No. It runs alongside mcp-atlassian with zero tool overlap. mcp-atlassian handles core search and CRUD. This server adds attachments, agile boards, versions, and calendars.

Do the Confluence tools need an add-on?

Yes. The three Confluence calendar tools need the Team Calendars add-on. Without it, they return a 404 with a hint that names the add-on.

How many tools does it provide?

It provides 22 tools, 15 resources, and 5 prompts for Jira and Confluence.

  • mcp-gitlab — GitLab integration (83 tools, 7 resources, 6 prompts)

  • mcp-coda — Coda integration (53 tools, 12 resources, 5 prompts)

  • mcp-argocd — Argo CD integration (37 tools, 7 resources, 7 prompts)

Attribution

Inspired by mcp-atlassian by sooperset. Architecture and patterns follow similar conventions.

Development

git clone https://github.com/vish288/mcp-atlassian-extended.git
cd mcp-atlassian-extended
uv sync --all-extras

uv run pytest --cov
uv run ruff check .
uv run ruff format --check .

License

MIT

Available Tools

22 tools
confluence_get_time_offConfluence Get Time OffA
Read-onlyIdempotent

Get time-off events for a date range across all leave calendars.

Pass person for one person's events, or a single day for start_date and end_date to see who is out on that day.

ParametersJSON Schema
NameRequiredDescriptionDefault
personNoReturn only this person's events (exact, case-insensitive name match)
end_dateYesEnd date (YYYY-MM-DD, 'today', '+14d', etc.)
start_dateYesStart date (YYYY-MM-DD, 'today', '+14d', etc.)
calendar_nameNoFilter by calendar name
group_by_personNoGroup results by person

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnly=true, idempotent=true and openWorld=true, so the safety profile is covered. The description adds that results span all leave calendars and that a single-day query returns 'who is out', but says nothing about result ordering, volume, or grouping 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?

Two short sentences, front-loaded with the core purpose, then the two usage patterns. No filler, no restatement of the tool name.

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?

No output schema exists, yet the description gives enough to call the tool correctly (required date range, optional person, implied grouping). It is slightly thin on what the returned events look like, but nothing essential to invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantic value beyond it: it explains that 'person' narrows to one individual's events and that setting start_date=end_date produces a single-day 'who is out' view, which the schema does not convey.

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 ('Get time-off events') plus scope ('across all leave calendars'), which separates it from the sibling confluence_list_calendars. It stops short of explicitly naming that sibling as the alternative, 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 Guidelines4/5

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

It gives two concrete calling patterns: pass 'person' for an individual, or equal start/end dates to see who is out on one day. That is clear context for invocation, though it notes no exclusions or prerequisites (e.g., what happens with no person filter).

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

confluence_list_calendarsConfluence List CalendarsA
Read-onlyIdempotent

List Confluence calendars, optionally narrowed by type or a name/space search.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFilter by calendar name, space name, or space key (case-insensitive)
filter_typeNoFilter by calendar type (e.g. 'leaves')

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, openWorldHint=true and idempotentHint=true, covering the safety profile, so the bar is lowered. The description adds the scoping constraint but no return format, pagination, or result-limit behavior beyond what annotations provide, making it minimally adequate.

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?

A single front-loaded sentence with the core action first and the optional narrowing second. No filler or redundancy.

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, zero-required-parameter list tool with full schema coverage this is close to sufficient, but with no output schema the description says nothing about what a listing returns or how results are bounded, leaving a gap an agent would want covered.

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 100%, so both parameters (search, filter_type) are already documented with clear semantics and a type example ('leaves'). The description only restates them at a high level, so the baseline of 3 applies.

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?

Clear specific verb plus resource: 'List Confluence calendars'. It scopes the operation and hints at filtering. It does not explicitly differentiate from the near siblings confluence_get_time_off or confluence_sprint_capacity, so it falls just short of a 5.

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

Usage Guidelines3/5

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

'Optionally narrowed by type or a name/space search' implies when the filters are appropriate, but there is no explicit when-to-use vs. when-not guidance and no named alternative tool. Usage is inferable rather than stated.

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

confluence_sprint_capacityConfluence Sprint CapacityB
Read-onlyIdempotent

Calculate sprint capacity considering team time-off.

ParametersJSON Schema
NameRequiredDescriptionDefault
sprint_endYesSprint end date: YYYY-MM-DD, 'today', 'tomorrow', '+Nd', '-Nd', 'next week'
sprint_startYesSprint start date: YYYY-MM-DD, 'today', 'tomorrow', '+Nd', '-Nd', 'next week'
team_membersYesFull names exactly as they appear on the calendar
working_days_per_weekNoWorking days per week

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, lowering the bar. The description adds one genuine behavioral detail not in the schema: time-off is factored in automatically (there is no time-off parameter). It still says nothing about how capacity is derived or what the result contains.

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 padding. It is efficient, though its extreme brevity borders on under-specification rather than optimal conciseness.

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?

Parameters are fully covered by the schema and safety is covered by annotations, so the tool is callable as-is. However, with no output schema, the description could usefully state what the capacity result looks like, and it omits any guidance on the calendar/time-off dependency, so it is only minimally 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 100%, so all four parameters (including date-format options and the working_days_per_week default) are already documented. The description adds no parameter meaning beyond that, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific verb and resource ('Calculate sprint capacity'), so the agent knows exactly what computation this performs. It does not, however, differentiate itself from related siblings like confluence_list_calendars and confluence_get_time_off, which supply the underlying data.

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 alternatives, and no statement of prerequisites (e.g., that calendar/time-off data must be accessible). The agent must infer usage entirely from the name and schema.

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

jira_backlogJira BacklogB
Read-onlyIdempotent

Get backlog issues for a board.

Returns a compact field set by default (summary, status, issue type, priority, assignee, labels). Pass fields (e.g. *all) to widen it.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoComma-separated Jira fields to return. Defaults to a compact set; pass '*all' for every field (large responses).summary,status,issuetype,priority,assignee,labels
board_idYesBoard ID
start_atNoIndex of the first result (use next_start_at to page)
max_resultsNoMaximum results

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered without the description. The description's one added behavioral fact — that a compact field set is returned by default and ``*all`` widens it — largely restates the schema text for ``fields``, so it contributes little beyond structured data.

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 core purpose followed immediately by the return-shape note. Nothing is padded and no sentence is redundant.

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 read-only list tool with full schema coverage and clear annotations, the description plus schema cover what an agent needs to invoke it; pagination is documented via start_at/max_results/next_start_at in the schema. Minor gap: no hint about ordering or total counts, but those are secondary here.

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 100%, so the compact-default and '*all' semantics are already documented in the ``fields`` property, including the large-response warning. The description adds no syntax, format, or constraint detail beyond the schema, so the baseline of 3 applies.

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

Purpose4/5

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

"Get backlog issues for a board" states a specific verb (Get) plus resource (backlog issues) and scope (per board), which is enough for an agent to distinguish it from jira_get_sprint or jira_get_board. It stops short of explicitly naming a sibling or the boundary conditions that separate backlog from sprint queries.

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?

The description gives no when-to-use guidance and never mentions alternatives such as jira_get_sprint or issue search tools, even though the sibling list contains several plausible confusables. The only usage hint is about the ``fields`` parameter, not about when to select this tool.

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

jira_board_configJira Board ConfigC
Read-onlyIdempotent

Get board column/status configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYesBoard ID

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds nothing beyond that – no note about output shape, pagination, or what 'configuration' entails (columns, statuses, mappings).

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 tight sentence with no filler, and the key resource term is front-loaded. It could carry one more clause of useful context without bloat, but there is zero waste.

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?

With no output schema, an agent still lacks any sense of what the returned configuration looks like, but the read-only annotations and complete param schema cover the call mechanics. Adequate but thin for a config-retrieval tool.

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 100% with board_id documented as 'Board ID', so the schema carries the parameter burden. The description adds no syntax, format, or sourcing detail beyond it, making the baseline 3 appropriate.

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

Purpose4/5

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

States a specific verb (Get) and resource (board column/status configuration), which is more precise than the generic name. It is distinguishable from jira_get_board, though it never explicitly names or contrasts that sibling. Clear but without sibling differentiation.

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 jira_get_board or jira_list_fields. The usage is only implied by the phrase 'board column/status configuration'. No prerequisites or exclusions are offered.

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

jira_create_issueJira Create IssueA

Create a Jira issue with standard and custom fields.

Pass issue_type="Epic" to create an epic; set your instance's Epic Name custom field through custom_fields (e.g. {"customfield_10009": "My Epic"}).

custom_fields example: {"customfield_10004": 5, "customfield_12345": {"value": "MyTeam"}}

ParametersJSON Schema
NameRequiredDescriptionDefault
labelsNoLabels to set
summaryYesIssue title/summary
priorityNoPriority name
issue_typeNoIssue type nameStory
descriptionNoIssue description
project_keyYesProject key (e.g. PROJ)
custom_fieldsNoCustom fields dict — keys are customfield_NNNNN IDs. Use jira_list_fields to discover IDs for your instance.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/open-world nature is covered. The description adds genuinely useful behavior beyond that: epics need an instance-specific Epic Name custom field, and custom_fields takes typed values like {"value": "MyTeam"}. It omits any statement about side effects (notifications, watchers) or what is returned, so it goes beyond annotations but not far.

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 lines, front-loaded with the core action and followed by the two highest-value edge cases, using inline code for exact syntax. Nothing is padded, though the Epic paragraph and custom_fields example are somewhat tersely juxtaposed without a clear connective.

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, yet the description never says what a successful create returns (presumably an issue key/ID), which an agent needs to chain follow-up calls like jira_update_issue. Parameter coverage is otherwise solid, so the gap is narrow but real for a mutation tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining non-obvious semantics the schema cannot: the special issue_type="Epic" branch requires an Epic Name custom field, and custom_fields entries can be scalars or nested {"value": ...} objects. It also points at jira_list_fields for discovering IDs, which is real added meaning.

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 ("Create a Jira issue") and scopes it to standard and custom fields, which distinguishes it naturally from jira_update_issue and jira_create_version. It stops short of explicitly naming a sibling or clarifying boundaries, so it is clear but not maximally differentiating.

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 Epic note is really the only usage guidance: use issue_type="Epic" and set the Epic Name via custom_fields. There is no statement of when to prefer this tool over alternatives, no prerequisites (project access, required fields per issue type), and no sizing or rate-limit context; usage is implied rather than prescribed.

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

jira_create_versionJira Create VersionB

Create a new version in a Jira project (REST API v2, supports Server/DC and Cloud).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesVersion name
archivedNoMark as archived
releasedNoMark as released
start_dateNoStart date (YYYY-MM-DD)
descriptionNoVersion description
project_keyYesProject key (e.g. PROJ)
release_dateNoRelease date (YYYY-MM-DD)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and openWorldHint=true, so the write/non-deterministic nature is covered. The description adds deployment-scope context (REST API v2, Server/DC and Cloud support) beyond the annotations, but says nothing about permission requirements or the uniqueness/duplicate-name error case that a version-creation call commonly hits.

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?

A single front-loaded sentence with the action first and the compatibility note trailing in parentheses; there is no filler or redundancy.

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?

With a fully documented 7-parameter schema and no output schema, the description need not explain return values, so the structured fields carry most of the load. However, for a mutation tool it omits the practical context an agent needs (auth/permission expectations, duplicate-name failure mode), leaving it merely adequate.

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 100% with all 7 parameters (name, project_key, archived, released, start_date, release_date, description) documented inline, including date formats and defaults. The description adds no parameter semantics beyond the schema, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource ('Create a new version in a Jira project'), so the agent knows exactly what the tool produces. It does not distinguish itself from the sibling jira_update_version or jira_get_project_versions, relying on the verb alone to separate them.

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?

The description offers no when-to-use guidance, no prerequisites (e.g. project admin permission needed to create versions), and no routing to alternatives such as jira_update_version or jira_get_project_versions. The parenthetical about REST API v2 is compatibility context, not usage guidance.

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

jira_delete_attachmentJira Delete AttachmentC
Destructive

Delete a Jira attachment.

ParametersJSON Schema
NameRequiredDescriptionDefault
attachment_idYesNumeric attachment ID to delete

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare destructiveHint=true, readOnlyHint=false, and openWorldHint=true, so the safety profile is covered structurally. However, the description adds nothing beyond the name at all — no note that deletion is permanent/irreversible, no permission requirements, no side effects on issues or comments referencing the attachment.

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 five-word sentence with zero padding — front-loaded verb and resource. It is efficient, though the terseness verges on under-specification rather than deliberate economy.

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 one-parameter destructive operation with full schema coverage and annotations carrying the safety profile, the definition is minimally sufficient to invoke correctly. It still lacks any irreversibility or permission context that an agent authorizing a delete would want before acting.

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?

With a single parameter and 100% schema description coverage ("Numeric attachment ID to delete"), the schema fully documents the input, so baseline 3 applies. The description adds no format, sourcing, or lookup guidance (e.g., how to obtain the attachment ID) beyond what the schema already provides.

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 ("Delete a Jira attachment"), which is unambiguous and distinguishable from sibling attachment tools like jira_download_attachment and jira_upload_attachment. It stops short of naming a sibling or scope explicitly, so it is clear but not maximally differentiated.

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 when-to-use guidance, no prerequisites, and no reference to alternatives (e.g., why not download or re-upload instead of deleting). The agent must infer all routing decisions from the tool name alone.

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

jira_download_attachmentJira Download AttachmentA

Download a Jira attachment into the download directory (default ./atlassian-downloads/).

save_path is a bare file name, not a path. Existing files are never overwritten — a numeric suffix is added — and the final absolute path is returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
save_pathYesFile name (no directories) to save under the download dir
content_urlYesAttachment content URL

TDQS

A3.7/5.0
Behavior4/5

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

Goes meaningfully beyond the annotations by disclosing overwrite behavior (never overwrites; numeric suffix added) and the returned absolute path, which the readOnlyHint=false/openWorldHint=true flags alone would not reveal. It could still note required permissions or failure modes, but the mutation semantics are well covered.

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?

Front-loads the purpose in the first sentence and follows with the two behavioral caveats that matter. Every sentence carries information; sizing is appropriate with no filler.

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?

With no output schema, the description correctly explains the return value (final absolute path) and destination behavior, which is what an agent needs to call it. Minor gap: no hint on where content_url comes from or error conditions.

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 coverage is 100%, so the schema already documents both parameters. The description reinforces that save_path is a bare file name and supplies the default download directory, adding minor value beyond the schema but no syntax or format detail the schema lacks.

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 ('Download a Jira attachment') plus the destination directory, so the action is unambiguous. It does not explicitly distinguish itself from nearby siblings like jira_get_attachments (list) or jira_upload_attachment (reverse direction), leaving a small sibling-overlap risk.

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?

Usage is implied by the clear purpose and the save_path caveat, but there is no explicit when-to-use guidance or routing away from jira_get_attachments. Nothing tells the agent how to obtain content_url or when this is preferred over the list tool.

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

jira_get_attachmentsJira Get AttachmentsC
Read-onlyIdempotent

List attachments on a Jira issue.

ParametersJSON Schema
NameRequiredDescriptionDefault
issue_keyYesJira issue key (e.g. PROJ-123)

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, covering the safety profile, so the description is not the main carrier here. But it adds nothing further — no note on whether results are paginated, what auth/scope is required, or what attachment metadata is returned.

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 filler or redundancy. It is efficient, though it leans toward under-specification rather than deliberate brevity.

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 one-parameter read tool with annotations covering safety, the description is minimally adequate. It omits any hint of the return shape (attachment id/name/size needed to chain into download) and pagination behavior, which an agent would need since there is no output schema.

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 100% and the single issue_key parameter is fully documented in the schema, including a pattern and example. The description adds no syntax or format meaning beyond that, so the baseline 3 applies.

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

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 attachments') scoped to a Jira issue, which functionally separates it from the download/delete/upload attachment siblings. However, it never names an alternative tool or explicitly delineates the boundary, so it falls short of the top band.

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

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 jira_download_attachment (to fetch content) or jira_delete_attachment. Usage is only inferable from the bare purpose statement.

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

jira_get_boardJira Get BoardC
Read-onlyIdempotent

Get details of a Jira agile board.

ParametersJSON Schema
NameRequiredDescriptionDefault
board_idYesBoard ID

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is fully covered by structured fields. The description adds nothing beyond them - no statement of what 'details' are returned, pagination, or permission requirements.

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 filler. It is efficient, though its brevity borders on under-specification rather than genuine conciseness.

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 one-parameter read tool with annotations covering the safety profile and no output schema, the description is minimally adequate. It still leaves open what fields the board details contain and how it relates to sibling board tools.

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 100% for the single board_id parameter, so the schema carries the semantics. The description adds no format, sourcing, or lookup guidance for the ID, making baseline 3 appropriate.

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 (Get) and resource (Jira agile board), so the operation is unambiguous. It does not, however, distinguish itself from nearby siblings like jira_board_config or jira_backlog, which an agent must choose between.

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 indication of when to fetch a board versus using jira_board_config or jira_backlog, and no prerequisites or context are given. The agent must infer the use case entirely from the tool name.

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

jira_get_project_versionsJira Get Project VersionsB
Read-onlyIdempotent

List all versions for a Jira project (REST API v2, supports Server/DC and Cloud).

ParametersJSON Schema
NameRequiredDescriptionDefault
project_keyYesProject key (e.g. PROJ)

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds useful platform context (REST API v2, Server/DC and Cloud) but says nothing about pagination or ordering for a 'list all' operation.

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?

A single front-loaded sentence with no filler; the parenthetical adds real platform/API-version value rather than restating the name.

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 read-only list tool with full annotation and schema coverage and no output schema, the description is nearly sufficient. The only meaningful gap is undisclosed pagination/return behavior for a 'list all' call.

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?

Only one parameter with 100% schema description coverage, so the schema fully documents project_key including its pattern and example. The description adds no meaning beyond the schema, which is the expected baseline here.

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 (List) and resource (versions for a Jira project), which is unambiguous. It is distinguishable from the create/update version siblings by name and verb, but the description does not explicitly position itself against them.

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 when-to-use, prerequisites, or alternative routing is given. The intended use is only implied by the verb 'List', with no exclusions or guidance on choosing this over other version-related tools.

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

jira_get_sprintJira Get SprintC
Read-onlyIdempotent

Get details of a specific sprint.

ParametersJSON Schema
NameRequiredDescriptionDefault
sprint_idYesSprint ID

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds nothing beyond that: it does not say what 'details' are returned, whether the sprint must be active/closed, or any auth requirements, so it contributes no behavioral context of its own.

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

Conciseness4/5

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

One short, front-loaded sentence with no filler. It is efficiently sized, though its brevity shades into 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?

There is no output schema, so the description carries the burden of describing the return value, yet 'details of a specific sprint' says nothing about fields returned (name, state, dates, board). For a retrieval tool with no output schema, this leaves a meaningful gap.

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?

With a single parameter at 100% schema coverage, the schema fully documents sprint_id (integer, minimum 1). The description adds no format, sourcing, or lookup hints beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb ('Get') and resource ('a specific sprint'), so the operation is unambiguous. It does not differentiate itself from sprint-adjacent siblings like jira_move_to_sprint or confluence_sprint_capacity, but those are clearly different operations, so the risk of confusion is low.

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, no prerequisites (e.g., needing board/sprint IDs from jira_get_board or jira_backlog), and no exclusions. The agent must infer usage entirely from the name.

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

jira_list_fieldsJira List FieldsC
Read-onlyIdempotent

List Jira fields, optionally filtered.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoFilter fields by name
custom_onlyNoOnly return custom fields

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds nothing beyond that — no note on whether all fields or only visible/creatable fields are returned, whether the list is paginated, or whether custom fields behave differently.

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 the resource front-loaded and zero filler. It is efficient, though the extreme terseness borders on under-specification rather than genuine economy.

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?

The tool is simple (two optional params, no output schema, fully documented schema, annotations covering safety), so the thin description is minimally viable. It still leaves the return shape and result volume unaddressed, which an agent enumerating fields would want to know.

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 100%, so the schema already documents both parameters fully ("Filter fields by name", "Only return custom fields"). The description's "optionally filtered" adds nothing beyond what the schema provides, so the baseline 3 applies.

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

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 Jira fields"), which is unambiguous on its own. However it offers no differentiation from siblings — no other sibling lists fields, so no disambiguation is needed, but neither is any comparison or scope boundary drawn.

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?

"Optionally filtered" hints that filtering exists but gives no when-to-use guidance, no prerequisites, and no alternatives. An agent gets no help deciding between this and, say, jira_list_projects or any other enumeration tool.

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

jira_list_projectsJira List ProjectsB
Read-onlyIdempotent

List all accessible Jira projects.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety and repeat-call behavior are covered structurally. The description adds one useful behavioral fact — results are permission-scoped ('accessible') and unfiltered ('all') — but says nothing about pagination or the shape/size of the result, which matters for a listing tool with no output 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?

A single front-loaded sentence with zero filler — the verb and resource lead. It is arguably too terse to be maximally useful, but on the conciseness axis it is clean and wastes nothing.

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 zero-parameter read, annotations carry the safety profile, but with no output schema the description is the only place a caller could learn what comes back (list of project keys/names, pagination, result limits) and it omits that. Adequate but with a real gap.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool is 4. The description correctly implies the call needs no input.

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 ('List') and resource ('Jira projects') with a scope qualifier ('all accessible'), so the intent is unambiguous. It does not name or contrast any sibling tool, but no sibling duplicates this function, so differentiation is not really at stake.

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 reach for this tool versus alternatives (e.g. jira_get_project_versions or jira_list_fields), nor any prerequisites or exclusions. Usage is only implied by the tool name, which is the definition of minimal guidance.

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

jira_move_to_sprintJira Move To SprintC

Move issues into a sprint.

ParametersJSON Schema
NameRequiredDescriptionDefault
sprint_idYesTarget sprint ID
issue_keysYesIssue keys to move (e.g. ['PROJ-1', 'PROJ-2'])

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 (a mutation) and openWorldHint=true, so the safety profile is covered. Beyond that, the description adds nothing: no mention of permission requirements, whether the move is atomic across multiple issue_keys, what happens to already-assigned issues, or error behavior on partial failures.

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

Conciseness3/5

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

A single short sentence with zero padding, which is efficient and front-loaded. But it is terse to the point of under-specification for a mutation tool, so it reads more as minimal than as well-calibrated brevity.

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 mutating bulk operation with no output schema and no explicit guidance on sprint state eligibility or failure semantics, the definition leaves meaningful gaps. The annotations cover the read/write nature but not the operational constraints an agent needs before invoking it.

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 100% with only two parameters, so the schema fully documents sprint_id and issue_keys (including the example format). The description adds no syntax or constraint detail beyond that, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb ('Move') and resource ('issues into a sprint'), so the operation is unambiguous. However, it offers no differentiation from related siblings such as jira_get_sprint or jira_backlog, which an agent might otherwise confuse it with.

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?

The description gives no indication of when to use this tool versus alternatives like jira_backlog, nor any prerequisites (e.g. sprint must be active/future, issue must be on the same board). Usage context is entirely absent.

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

jira_search_usersJira Search UsersC
Read-onlyIdempotent

Search for Jira users.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch by name, email, or username
start_atNoIndex of the first result (use next_start_at to page)
max_resultsNoMaximum results

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, idempotentHint=true and openWorldHint=true, so the safety profile is covered. The description contributes nothing further — no mention of match semantics, whether results are paginated by default, or what happens when the query matches nothing.

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 efficiently sized, though its brevity is closer to under-specification than to disciplined conciseness.

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 lookup with fully described parameters and annotation-covered safety, this is adequate to invoke the tool. It still leaves gaps about result shape and paging workflow, and notably the schema's start_at description references a next_start_at parameter that does not exist — context the description could have clarified.

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 100%, so query, start_at and max_results are already documented in the schema, which sets the baseline at 3. The description adds no syntax, format, or matching-behavior hints beyond that.

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 for Jira users"), so an agent immediately knows this queries the user directory rather than issues or projects. However, it offers no scope detail (e.g., matching semantics, whether it searches the whole site or a project) and does nothing to differentiate itself from the surrounding Jira siblings.

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?

The description gives no when-to-use context, no prerequisites, and names no alternatives. An agent must infer on its own that this is the tool for resolving a user to an accountId before operations like jira_create_issue or jira_move_to_sprint.

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

jira_update_issueJira Update IssueC
Idempotent

Update a Jira issue's standard and custom fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoStandard fields to update (summary, description, labels, etc.)
issue_keyYesJira issue key (e.g. PROJ-123)
custom_fieldsNoCustom fields dict — keys are customfield_NNNNN IDs

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and openWorldHint=true. The description adds no behavioral context beyond what annotations provide, such as whether unspecified fields are preserved, permission requirements, or side effects.

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

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 it provides no elaboration that might aid invocation.

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 only basic annotations, the description is too sparse. It does not explain whether the update merges or replaces fields, what happens to unmentioned fields, or any required permissions, leaving significant gaps.

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 100%, so the schema already documents all parameters including the distinction between standard and custom fields. The description's mention of 'standard and custom fields' adds no new semantic detail beyond the schema.

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 ('Update') and resource ('Jira issue'), and adds that both standard and custom fields can be updated. It does not explicitly distinguish from sibling tools like jira_create_issue, but the resource is clear enough to identify the tool.

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 tool versus alternatives such as jira_create_issue or other update tools. There are no prerequisites, no exclusions, and no context about typical scenarios.

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

jira_update_versionJira Update VersionB
Idempotent

Update an existing Jira version (REST API v2, supports Server/DC and Cloud).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew version name
archivedNoMark as archived
releasedNoMark as released
start_dateNoStart date (YYYY-MM-DD)
version_idYesNumeric version ID
descriptionNoNew description
release_dateNoRelease date (YYYY-MM-DD)

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and openWorldHint=true, so the safety and repeat-call profile is covered. The description adds platform/deployment context (REST API v2, Server/DC and Cloud) but says nothing about partial-update semantics, permissions required, or what happens to omitted fields.

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?

A single front-loaded sentence with no filler; the verb, resource and environment support are all packed into one clause with zero waste.

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 7-parameter mutation tool with no output schema, the description covers the bare essentials and annotations carry the safety profile. However it omits partial-update behavior and any hint about the returned version object, leaving meaningful gaps.

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 100%, so every parameter including version_id, name, archived, released and the date fields is already documented in the schema. The description adds no format or semantic detail beyond that, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (Update) and resource (Jira version), which is unambiguous and clearly distinct from jira_create_version and jira_get_project_versions. It does not explicitly contrast itself with any sibling, so it stops short of a 5.

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

Usage Guidelines2/5

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

No when-to-use guidance, no prerequisites, and no mention of alternatives such as jira_create_version or jira_get_project_versions. The agent is left to infer that this applies only to versions that already exist.

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

jira_upload_attachmentJira Upload AttachmentB

Upload a file as an attachment to a Jira issue.

ParametersJSON Schema
NameRequiredDescriptionDefault
filenameNoOverride filename
file_pathYesLocal file path to upload
issue_keyYesJira issue key

TDQS

B3.1/5.0
Behavior2/5

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

Annotations declare readOnlyHint=false and openWorldHint=true, so the write/external nature is partly covered. The description adds nothing further: no attachment size limits, no overwrite behavior for duplicate filenames, no permission requirements, and no indication of what the call returns (e.g. an attachment id). For a mutation tool this is a meaningful gap.

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?

A single, front-loaded sentence with zero filler. Nothing is redundant and the verb+resource appear immediately.

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?

With no output schema and complete parameter documentation, the definition is minimally viable for calling the tool. It is incomplete on the behavioral side, though: return value, size limits, and duplicate-handling are absent, leaving the agent to guess at operational constraints.

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 100%, so issue_key, file_path, and the filename override are already fully documented in the schema. The description contributes no additional semantics such as format constraints or filename behavior, so the baseline 3 applies.

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 (upload) and resource (file as attachment to a Jira issue), which cleanly distinguishes it from the read/delete attachment siblings. It does not, however, explicitly name those siblings or scope conditions, so it stops short of full differentiation.

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, permissions needed), and no reference to the sibling tools jira_get_attachments, jira_download_attachment, or jira_delete_attachment. The agent must infer all routing from the tool name alone.

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. 22 tool updatesv0.15.1
    • Changedconfluence_get_time_off1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedconfluence_list_calendars1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedconfluence_sprint_capacity1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_backlog2 fields changed
      • addedInput schema / properties / fields
        Added value: +{
        +  "default": "summary,status,issuetype,priority,assignee,labels",
        +  "description": "Comma-separated Jira fields to return. Defaults to a compact set; pass '*all' for every field (large responses).",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_board_config1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_create_issue1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_create_link1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_create_version1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_delete_attachment4 fields changed
      • changedInput schema / properties / attachment_id / description
        Previous value: -"Attachment ID to delete"New value: +"Numeric attachment ID to delete"
      • removedInput schema / properties / attachment_id / minLength
        Removed value: -1
      • addedInput schema / properties / attachment_id / pattern
        Added value: +"^\\d+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_delete_link4 fields changed
      • changedInput schema / properties / link_id / description
        Previous value: -"Issue link ID to delete"New value: +"Numeric issue link ID to delete"
      • removedInput schema / properties / link_id / minLength
        Removed value: -1
      • addedInput schema / properties / link_id / pattern
        Added value: +"^\\d+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_download_attachment3 fields changed
      • changedInput schema / properties / save_path / description
        Previous value: -"Local path to save the file"New value: +"File name (no directories) to save under the download dir"
      • removedInput schema / properties / save_path / minLength
        Removed value: -1
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_get_attachments3 fields changed
      • removedInput schema / properties / issue_key / minLength
        Removed value: -1
      • addedInput schema / properties / issue_key / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]+-\\d+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_get_board1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_get_project_versions3 fields changed
      • removedInput schema / properties / project_key / minLength
        Removed value: -1
      • addedInput schema / properties / project_key / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_get_sprint1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_list_fields1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_list_projects1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_move_to_sprint1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_search_users1 field changed
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_update_issue3 fields changed
      • removedInput schema / properties / issue_key / minLength
        Removed value: -1
      • addedInput schema / properties / issue_key / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]+-\\d+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_update_version4 fields changed
      • changedInput schema / properties / version_id / description
        Previous value: -"Version ID"New value: +"Numeric version ID"
      • removedInput schema / properties / version_id / minLength
        Removed value: -1
      • addedInput schema / properties / version_id / pattern
        Added value: +"^\\d+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
    • Changedjira_upload_attachment3 fields changed
      • removedInput schema / properties / issue_key / minLength
        Removed value: -1
      • addedInput schema / properties / issue_key / pattern
        Added value: +"^[A-Za-z][A-Za-z0-9_]+-\\d+$"
      • changedOutput schema / (root)
        Previous value: -{
        -  "properties": {
        -    "result": {
        -      "type": "string"
        -    }
        -  },
        -  "required": [
        -    "result"
        -  ],
        -  "type": "object",
        -  "x-fastmcp-wrap-result": true
        -}New value: +null
  2. 7 tool updatesv0.10.1
    • Removedconfluence_get_person_time_off
    • Changedconfluence_get_time_off1 field changed
      • addedInput schema / properties / person
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Return only this person's events (exact, case-insensitive name match)"
        +}
    • Changedconfluence_list_calendars1 field changed
      • addedInput schema / properties / search
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Filter by calendar name, space name, or space key (case-insensitive)"
        +}
    • Removedconfluence_search_calendars
    • Changedconfluence_sprint_capacity3 fields changed
      • changedInput schema / properties / sprint_end / description
        Previous value: -"Sprint end date"New value: +"Sprint end date: YYYY-MM-DD, 'today', 'tomorrow', '+Nd', '-Nd', 'next week'"
      • changedInput schema / properties / sprint_start / description
        Previous value: -"Sprint start date"New value: +"Sprint start date: YYYY-MM-DD, 'today', 'tomorrow', '+Nd', '-Nd', 'next week'"
      • changedInput schema / properties / team_members / description
        Previous value: -"List of team member names"New value: +"Full names exactly as they appear on the calendar"
    • Removedconfluence_who_is_out
    • Removedjira_create_epic
  3. 2 tool updatesv0.8.1
    • Changedjira_backlog1 field changed
      • addedInput schema / properties / start_at
        Added value: +{
        +  "default": 0,
        +  "description": "Index of the first result (use next_start_at to page)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedjira_search_users1 field changed
      • addedInput schema / properties / start_at
        Added value: +{
        +  "default": 0,
        +  "description": "Index of the first result (use next_start_at to page)",
        +  "minimum": 0,
        +  "type": "integer"
        +}
  4. 26 tool updatesv0.6.13
    • First observedconfluence_get_person_time_off
    • First observedconfluence_get_time_off
    • First observedconfluence_list_calendars
    • First observedconfluence_search_calendars
    • First observedconfluence_sprint_capacity
    • First observedconfluence_who_is_out
    • First observedjira_backlog
    • First observedjira_board_config
    • First observedjira_create_epic
    • First observedjira_create_issue
    • First observedjira_create_link
    • First observedjira_create_version
    • First observedjira_delete_attachment
    • First observedjira_delete_link
    • First observedjira_download_attachment
    • First observedjira_get_attachments
    • First observedjira_get_board
    • First observedjira_get_project_versions
    • First observedjira_get_sprint
    • First observedjira_list_fields
    • First observedjira_list_projects
    • First observedjira_move_to_sprint
    • First observedjira_search_users
    • First observedjira_update_issue
    • First observedjira_update_version
    • First observedjira_upload_attachment

TDQS

B3.2/5.0

Scored across 22 tools

Disambiguation4/5

Most tools target clearly distinct resources: attachments (list/download/upload/delete), versions (create/update/list), boards/sprints, and Confluence calendars are well separated. Minor potential confusion exists around board-related tools (jira_get_board, jira_board_config, jira_backlog) and sprint tools, but descriptions disambiguate them adequately.

Naming Consistency4/5

Names follow a consistent 'product_verb_noun' snake_case convention with jira_/confluence_ prefixes throughout, which is highly predictable. A few entries are noun-only (jira_board_config, jira_backlog, confluence_sprint_capacity) rather than verb-led, a minor deviation from the rest.

Tool Count4/5

22 tools is on the heavier side but justified by an 'extended' server spanning two products (Jira and Confluence) with agile, attachment, version, and time-off domains. Each tool maps to a distinct operation, so little feels redundant despite the count.

Completeness3/5

Coverage is uneven: attachments have full lifecycle and versions have create/update/list, but there is no issue search/get, no delete-issue, no comment tools, and no delete-version. An agent can create and update issues but lacks a general way to retrieve or search them beyond the backlog endpoint.

Maintenance

ActivityActive
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers