better-jira-mcp
Allows interaction with Confluence Cloud REST API, enabling agents to search content, retrieve page details and children, create and update pages, and add footer comments.
Allows interaction with Jira Cloud REST API, enabling agents to search, create, update, and retrieve issues, add comments, manage workflow transitions, list components, and find users.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@better-jira-mcp Search Jira for open high-priority bugs in the Payments project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
better-jira-mcp
A thin MCP pass-through to the Jira and Confluence Cloud REST APIs. Built because mcp-atlassian mangles Jira descriptions: it regex-converts markdown into Jira wiki markup and posts that through REST v2, so aws_vpc_endpoint becomes aws*vpc*endpoint, {id} and a + b get eaten as macros, and **bold** comes back escaped.
This server instead parses markdown with a real CommonMark parser (markdown-it-py), emits ADF directly, and talks to Jira REST v3 and Confluence REST v2 (atlas_doc_format), which both speak ADF natively. One converter, no server-side re-interpretation, so bodies round-trip. Every write returns the object re-read so the agent verifies what landed.
Tools
Tool | Description |
| Raw |
Jira | |
| Issue with description (and optionally comments) as markdown |
| JQL search via |
| Markdown description → ADF; component names must match exactly or the call fails; returns the created issue re-read |
| Same, for updates. Refuses |
| Markdown comment → ADF |
| Workflow moves. No inline comment parameter, on purpose |
| Component names and ids for a project |
| Look up accountIds by name or email, for assignee/reporter fields |
Confluence | |
| CQL search |
| Page by id, or space key + title; body (and optionally footer comments) as markdown |
| Direct children of a page |
| Markdown → ADF page under a space (optionally under a parent) |
| Replace body and/or title; handles the version bump |
| Markdown footer comment |
Tool names are prefixed so they don't collide with other MCP servers (GitHub's search_issues, for example).
Quirks from the team guide this addresses directly:
Lossy markdown / paired
_/{}/ paired+– gone; text is text in ADF.Long descriptions break on create – gone; the body is JSON, no newline escaping.
Components fail open – names are resolved to ids against the project and unknown names are rejected with a "did you mean" hint.
Transition comments can be public – transitions don't accept a comment.
Read back what you wrote – done automatically.
Jira's own behaviour (Team field wants a bare UUID, resolution is one-way, status only moves by transition) is documented in the tool descriptions rather than papered over.
Related MCP server: Confluence MCP Server
Installation
No clone needed — uvx can run it straight from GitHub:
uvx --from git+https://github.com/aviddiviner/better-jira-mcp better-jira-mcpOr, for local development:
git clone https://github.com/aviddiviner/better-jira-mcp
cd better-jira-mcp
uv syncYou'll need an Atlassian API token. One token covers Jira and Confluence on the same site.
Zed MCP configuration
Add to settings.json under "context_servers". Same env var names as mcp-atlassian, so you can copy them across; no separate Confluence variables are needed:
{
"context_servers": {
"better-jira": {
"enabled": true,
"command": "uvx",
"args": ["--from", "git+https://github.com/aviddiviner/better-jira-mcp", "better-jira-mcp"],
"env": {
"JIRA_URL": "https://your.atlassian.net",
"JIRA_USERNAME": "you@example.com",
"JIRA_API_TOKEN": "<token>"
}
}
}
}If you cloned it instead, use "command": "uv" with "args": ["run", "--project", "/path/to/better-jira-mcp", "better-jira-mcp"].
Tests
uv run pytestAvailable Tools
16 toolsatlassian_requestAtlassian RequestA
Raw pass-through to any Jira or Confluence REST endpoint. Use when no other tool fits.
Inputs: path (required), method (required), body, params. Returns: result
confluence_add_page_commentConfluence Add Page CommentC
Add a footer comment (markdown) to a page.
Inputs: body (required), page_id (required). Returns: result
confluence_create_pageConfluence Create PageA
Create a Confluence page from markdown and return it re-read.
Inputs: body (required), title (required), space_key (required), parent_id. Returns: result
confluence_get_pageConfluence Get PageA
Get a Confluence page by id, or by space key + exact title. Body is returned as markdown.
Inputs: title, page_id, space_key, include_comments. Returns: result
confluence_get_page_childrenConfluence Get Page ChildrenB
List the direct child pages of a page.
Inputs: page_id (required), limit. Returns: result
confluence_searchConfluence SearchC
Search Confluence with CQL.
Inputs: cql (required), limit. Returns: result
confluence_update_pageConfluence Update PageA
Update a page's body (markdown) and/or title. Handles versioning; returns the page re-read.
The body replaces the whole page. Read it first with confluence_get_page if you want to edit rather than overwrite.
Inputs: page_id (required), body, title, message. Returns: result
jira_add_commentJira Add CommentA
Add a comment (markdown) to an issue.
Inputs: key (required), body (required). Returns: result
jira_create_issueJira Create IssueA
Create an issue and return it re-read from Jira so you can verify it.
Inputs: project (required), summary (required), issue_type (required), fields, +1 more. Returns: result
jira_find_userJira Find UserA
Find users by name or email. Returns accountIds, which is what assignee/reporter fields need: {"assignee": {"accountId": "..."}}.
Inputs: query (required), limit. Returns: result
jira_get_issueJira Get IssueB
Get an issue. Description and comments are returned as markdown.
Inputs: key (required), fields, include_comments. Returns: result
jira_get_transitionsJira Get TransitionsB
List the workflow transitions currently available for an issue.
Inputs: key (required). Returns: result
jira_list_componentsJira List ComponentsA
List a project's components with their ids (names must match exactly when writing).
Inputs: project (required). Returns: result
jira_search_issuesJira Search IssuesC
Search issues with JQL.
Inputs: jql (required), limit, fields, next_page_token. Returns: result
jira_transition_issueJira Transition IssueA
Move an issue through a workflow transition (see jira_get_transitions).
Comments are deliberately not accepted here; add one with jira_add_comment afterwards so its visibility is under your control.
Inputs: key (required), transition_id (required). Returns: result
jira_update_issueJira Update IssueB
Update an issue and return it re-read from Jira.
Inputs: key (required), fields, description. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 16 tools
Every typed tool is scoped to a specific Jira or Confluence resource and action (get, search, create, update, transition, comment). The raw atlassian_request tool is explicitly framed as a fallback, so there is little realistic confusion between tools.
Most tools follow a clear domain_verb_noun pattern (jira_get_issue, confluence_create_page, jira_transition_issue). Minor deviations exist: confluence_search omits the object noun, and atlassian_request breaks the domain prefix convention, but these are understandable exceptions.
16 tools is slightly above the typical sweet spot, but the scope covers two substantial Atlassian products (Jira and Confluence), and each tool has a distinct role. The count feels justified rather than bloated.
The set covers core Jira issue workflows (search, get, create, update, transition, comment) and Confluence page workflows (search, get, create, update, comment). Some operations like deletes or attachments are absent, but the raw atlassian_request tool provides an escape hatch for edge cases.
Maintenance
Related MCP Connectors
MCP-native open-source Notion alternative: read & write pages, databases and kanban boards.
Hosted MCP for Google Workspace, Atlassian and Notion: one OAuth, per-user accounts, write access.
Search your AI chat history (ChatGPT, Claude, Codex) from any MCP client. Remote, private, read-only
AppFlowy MCP server for ChatGPT, Claude and any AI agent: list workspaces, read page tree, list database rows, create database row, update database row, create page, restore from trash and share page in your own AppFlowy account. Cotlet works in the account through your Cloud Browser, a real Chrome where you sign in to AppFlowy yourself; Cotlet does not store your password and you need no AppFlowy API key. About the official AppFlowy API: AppFlowy Cloud has a documented REST API for workspaces, the folder tree and database rows, but no hosted MCP server (checked 25 Oct 2026). The official MCP service is an optional part of the commercial self-hosted edition. Setup and FAQ: https://cotlet.dev/integrations/appflowy-api-mcp-server
Related MCP Servers
- FlicenseAqualityFmaintenanceEnables interaction with Jira and Confluence APIs to search, create, and manage issues, pages, comments, and attachments across both Atlassian platforms.7-
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Atlassian Confluence Cloud by providing tools to create, update, search, and delete pages. It facilitates seamless content management within Confluence spaces using Markdown and the Confluence REST API.6MIT
- AlicenseNot gradedqualityDmaintenanceEnables integration with Atlassian Confluence to browse spaces, search content using CQL, and manage pages directly from MCP-compatible applications. It automatically converts Confluence storage formats into markdown for seamless interaction with AI-driven editors and tools.63 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables creating, fetching, and updating Jira issues via the REST API with support for ADF descriptions and common fields like priority, labels, and issue types.1,677 npm2Apache 2.0