Back

Atlassian

Jira and Confluence — issues, pages, comments, and search

23 capabilitiesView Source ↗

Atlassian MCP Server

A Model Context Protocol server for Jira and Confluence Cloud — search, issues, pages, comments, and attachments.

This server powers the Atlassian connector of DataToRAG, a hosted MCP gateway with per-user OAuth and Google Workspace tools alongside these — add https://datatorag.com/mcp to your MCP client and connect your Atlassian account from the dashboard. Or run it yourself, standalone.

Tools

Service Operations
Jira search (JQL), get issue, create, update, delete (permanent), transition, get transitions, list fields, search users, get/add/edit/delete comments, get attachment
Confluence search (CQL), list pages, get page, create, edit, delete, get/add comments, get attachment

Key tool details

jira_search — Full JQL support with field selection and pagination.

jira_create_issue / jira_update_issue — Structured parameters for the common fields (project, type, summary, description, assignee, labels, priority), plus additional_fields for anything else the create/edit screens accept, including custom fields.

jira_transition_issue — Moves an issue through its workflow. Use jira_get_transitions first to see which transitions are available from the issue's current status.

jira_delete_issue — Permanently deletes an issue. There is no trash or archive and the key is never reused, so this is unrecoverable through the API and every link to the issue breaks. Transitioning to Done or Won't Do is almost always the right call instead. Deleting an issue that has subtasks fails unless delete_subtasks is true, which destroys them with it.

confluence_get_page / confluence_edit_page — Read and write page bodies in Confluence storage format, with a format parameter on reads.

confluence_searchCQL search across pages, blog posts, and comments.

How authentication works

Each MCP session authenticates with a standard Atlassian OAuth 2.0 (3LO) access token passed in the X-User-Token HTTP header when the session is initialized. The server resolves the token's Atlassian cloud ID automatically (via oauth/token/accessible-resources) and targets that tenant for all Jira and Confluence calls.

There are no app credentials in this server — obtaining and refreshing user tokens is the caller's job. Under the DataToRAG gateway, that's handled by the gateway's per-user OAuth flow; standalone, you need to supply a valid access token yourself.

Scopes required (see datatorag.json): read:jira-work, write:jira-work, read:jira-user, read:confluence-content.all, write:confluence-content, read:confluence-space.summary, offline_access.

Running standalone

pnpm install
pnpm run build
PORT=40001 pnpm run start

The server exposes /mcp (Streamable HTTP) and /health on the configured port. Initialize an MCP session with an X-User-Token header carrying the user's Atlassian access token:

{
  "mcpServers": {
    "atlassian": {
      "type": "streamable-http",
      "url": "http://localhost:40001/mcp",
      "headers": {
        "X-User-Token": "<atlassian-oauth-access-token>"
      }
    }
  }
}

Environment Variables

Variable Default Description
PORT 3000 HTTP server port (the DataToRAG gateway's plugin manager sets this)

Architecture

src/
├── index.ts              # HTTP entry point (StreamableHTTP, /health + /mcp)
├── create-server.ts      # MCP server factory (accepts optional per-session client)
├── atlassian-client.ts   # Atlassian REST client, cloud-ID resolution, token per call
└── tools/
    ├── jira.ts           # Jira tool schemas + handler dispatch
    ├── confluence.ts     # Confluence tool schemas + handler dispatch
    └── response.ts       # Shared response helpers (JSON formatting, truncation)

datatorag.json is the plugin manifest the DataToRAG gateway reads: name, description, and the OAuth block (scopes plus the names of the client-credential env vars — never secret values).

Key implementation details

  • Jira REST v3 for all Jira calls; Confluence v2 API for pages and comments, with the deprecated v1 API retained only for CQL search, which has no v2 equivalent
  • Cloud-ID resolution happens once per client and is reused across calls
  • Space key resolution: Confluence v2 endpoints require numeric space IDs; human-readable keys (like ENG) are resolved and cached per server process
  • Verbose tool schemas: every tool documents its parameters in the description and carries readOnlyHint/destructiveHint annotations

Development

pnpm run dev    # Watch mode — recompiles on change

pnpm test runs tsc in strict mode then the vitest suite, which pins tool annotations and the safety-critical bits of the destructive tools. That is the floor, not the whole story: behaviour still gets a live smoke test against a real Atlassian site, recorded in the commit body.

License

MIT

Capabilities

atlassian-mcp__jira_search_users

Search for Jira users by name, username, or email address. Returns matching user accounts with display names and account IDs.

Parameters

querystring/ Search query — matches against name, username, or email
max_resultsnumber/ Maximum number of results to return (default 10)
atlassian-mcp__jira_search

Search Jira issues using JQL (Jira Query Language). Returns matching issues with key fields. Supports pagination via next_page_token.

Parameters

jqlstring/ JQL query string (e.g. 'project = PROJ AND status = Open')
max_resultsnumber/ Maximum number of results per page (default 50)
next_page_tokenstring/ Pagination token from a previous search response
atlassian-mcp__jira_get_issue

Get detailed information about a specific Jira issue by its key (e.g. PROJ-123). Returns summary, status, priority, assignee, reporter, description, labels, dates, comments count, and attachments.

Parameters

issue_keystring/ The issue key (e.g. PROJ-123)
atlassian-mcp__jira_list_fields

List all available Jira fields (both system and custom). Useful for discovering field IDs needed for creating or updating issues.

atlassian-mcp__jira_create_issue

Create a new Jira issue in the specified project. You can set arbitrary fields at creation via additional_fields (e.g. assignee, priority, labels, components) — required for projects that reject unassigned issues. Returns the created issue key and URL.

Parameters

summarystring/ Issue summary / title
issue_typestring/ Issue type name (default 'Task'). Common values: Task, Bug, Story, Epic
descriptionstring/ Issue description (plain text, will be converted to ADF)
project_keystring/ Project key (e.g. PROJ)
additional_fieldsobject/ Additional fields to set at creation, as a JSON object of field ID to value (e.g. {"assignee": {"accountId": "abc123"}, "priority": {"name": "High"}, "labels": ["foo"]}). Caller is responsible for value shape — pass-through to the Jira API.
atlassian-mcp__jira_update_issue

Update an existing Jira issue. You can change the summary, description, and/or set arbitrary fields via additional_fields.

Parameters

summarystring/ New summary / title
issue_keystring/ The issue key (e.g. PROJ-123)
descriptionstring/ New description (plain text, will be converted to ADF)
additional_fieldsobject/ Additional fields to set, as a JSON object of field ID to value (e.g. {"priority": {"name": "High"}})
atlassian-mcp__jira_add_comment

Add a comment to a Jira issue.

Parameters

commentstring/ Comment text (plain text, will be converted to ADF)
issue_keystring/ The issue key (e.g. PROJ-123)
atlassian-mcp__jira_edit_comment

Edit an existing comment on a Jira issue.

Parameters

commentstring/ New comment text (plain text, will be converted to ADF)
issue_keystring/ The issue key (e.g. PROJ-123)
comment_idstring/ The ID of the comment to edit
atlassian-mcp__jira_delete_comment

Delete a comment from a Jira issue.

Parameters

issue_keystring/ The issue key (e.g. PROJ-123)
comment_idstring/ The ID of the comment to delete
atlassian-mcp__jira_get_comments

Get all comments on a Jira issue.

Parameters

issue_keystring/ The issue key (e.g. PROJ-123)
atlassian-mcp__jira_get_transitions

Get the available workflow transitions for a Jira issue. Use the returned transition IDs with jira_transition_issue to move an issue through its workflow.

Parameters

issue_keystring/ The issue key (e.g. PROJ-123)
atlassian-mcp__jira_transition_issue

Transition a Jira issue to a new workflow status. Use jira_get_transitions first to find valid transition IDs.

Parameters

issue_keystring/ The issue key (e.g. PROJ-123)
transition_idstring/ The transition ID (from jira_get_transitions)
atlassian-mcp__jira_get_attachment

Get metadata for a Jira attachment by its ID. Returns filename, size, MIME type, and content URL.

Parameters

attachment_idstring/ The attachment ID
atlassian-mcp__confluence_list_pages

List pages in a Confluence space. Returns an array of pages with id, title, version, and link.

Parameters

limitnumber/ Maximum number of pages to return (default 25).
space_keystring/ The key of the Confluence space (e.g. 'ENG').
atlassian-mcp__confluence_get_page

Get a single Confluence page by ID. Use format 'text' (default) for reading/summarizing — returns clean text with much less context usage. Use format 'storage' when you need to edit the page, as it returns the full XHTML storage format needed for write-back.

Parameters

formatstring/ Output format. 'text' (default): clean readable text, optimized for reading/summarizing. 'storage': raw XHTML storage format, needed for editing with confluence_edit_page.
page_idstring/ The ID of the page to retrieve.
atlassian-mcp__confluence_create_page

Create a new page in Confluence. Content must be in XHTML storage format.

Parameters

titlestring/ Title of the new page.
contentstring/ Page body in Confluence XHTML storage format (e.g. '<p>Hello</p>').
parent_idstring/ Optional parent page ID to nest this page under.
space_keystring/ The key of the space to create the page in.
atlassian-mcp__confluence_edit_page

Update an existing Confluence page. Content must be in XHTML storage format. If version is not provided the current version is fetched and auto-incremented.

Parameters

titlestring/ New title for the page.
contentstring/ New body in XHTML storage format.
page_idstring/ The ID of the page to update.
versionnumber/ Version number for the update. If omitted the current version is auto-incremented.
atlassian-mcp__confluence_delete_page

Delete a Confluence page by ID.

Parameters

page_idstring/ The ID of the page to delete.
atlassian-mcp__confluence_search

Search Confluence content using CQL (Confluence Query Language). Returns matching pages/content with id, title, version, and link.

Parameters

cqlstring/ CQL query string (e.g. 'type=page AND space=ENG AND title~"onboarding"').
limitnumber/ Maximum number of results to return (default 25).
atlassian-mcp__confluence_get_comments

Get all comments on a Confluence page, including their body content and version info.

Parameters

page_idstring/ The ID of the page whose comments to retrieve.
atlassian-mcp__confluence_add_comment

Add a comment to a Confluence page. Optionally reply to an existing comment by providing parent_comment_id.

Parameters

bodystring/ Comment text (plain text; will be wrapped in <p> tags automatically).
page_idstring/ The ID of the page to comment on.
parent_comment_idstring/ Optional ID of an existing comment to reply to.
atlassian-mcp__confluence_get_attachment

Get metadata for a specific attachment on a Confluence page by filename.

Parameters

page_idstring/ The ID of the page the attachment belongs to.
filenamestring/ Exact filename of the attachment.
atlassian-mcp__jira_delete_issue

Permanently delete a Jira issue. THIS CANNOT BE UNDONE through the API — deleted issues do not go to a trash or archive, and the issue key is not reused, so every link to it breaks. Prefer transitioning the issue to Done or Won't Do, which keeps the history. Deleting an issue that has subtasks fails unless delete_subtasks is true, in which case the subtasks are destroyed with it. Deleting a parent does not delete linked issues, only subtasks.

Parameters

issue_keystring/ The issue key to delete (e.g. PROJ-123)
delete_subtasksboolean/ Also delete the issue's subtasks. Required to be true when the issue has any — without it Jira rejects the whole call rather than deleting partially. Default false.

Connect

Add this to your MCP client config to access all integrations through the gateway.

{
  "mcpServers": {
    "datatorag": {
      "url": "https://datatorag.com/mcp"
    }
  }
}
Atlassian | DataToRAG