Jira Managed MCP Server
The Jira managed MCP server lets agents search, read, and manage Jira issues. It authenticates with either a shared API token (Basic authentication) or, for per-user identity, user-delegated OAuth. With OAuth it’s the enterprise counterpart to the Slack setup guide, and Atlassian’s flow has its own scope model and quirks worth calling out.
After reading this page, you will be able to:
-
Configure the Jira managed MCP server with Basic authentication or Atlassian’s OAuth flow
-
Pick the right scopes for the tools your agents use
-
Walk a user through the consent flow and verify the connection
What this MCP server does
The Jira managed type exposes the following read tools:
-
query: Search for issues using a JQL query. Returns the matching issues as JSON. -
get_issue: Retrieve a single issue by its key, for examplePROJ-123. -
list_projects: Return visible Jira projects, optionally filtered by a search query. -
get_transitions: Return the available workflow transitions for an issue.
It also exposes the following write tools:
-
create_issue: Create a new issue. -
update_issue: Update fields on an existing issue. -
transition_issue: Move an issue to a new workflow state. -
add_comment: Add a comment to an issue. -
add_worklog: Log time spent on an issue. -
create_issue_link: Create a directional link between two issues.
It can also expose Jira issues and projects as SQL-queryable tables, through two more tools that are off by default. See Expose Jira data as SQL tables.
Prerequisites
-
A Jira (Atlassian Cloud) site and its base URL, for example
https://mycompany.atlassian.net. -
Credentials for one of the following authentication modes:
-
Basic Auth: An Atlassian account email and an API token fromid.atlassian.com, with the token stored in the Redpanda Agentic Data Plane secret store. -
User OAuth: Your own Atlassian OAuth 2.0 (3LO) app, created in the Atlassian developer console, plus an OAuth Provider in Redpanda Agentic Data Plane that uses the Atlassian / Jira preset and carries the app’s client credentials. See Configure User-Delegated OAuth.
-
Atlassian’s scope model (user-delegated OAuth)
When you use user-delegated OAuth, Atlassian uses a granular, prefixed scope namespace. Request these scopes as a set:
| Scope | Allows |
|---|---|
|
Read Jira project and issue data and search for issues. Needed for the read tools. |
|
Create and edit issues, post comments, and create worklogs. Needed for the write tools. |
|
Issue a refresh token so Redpanda can refresh expired access tokens without asking the user to consent again. |
Every scope in the server’s Required scopes must also be in the OAuth provider’s scope list, and in the scopes you added to the Atlassian app in the developer console. The Atlassian / Jira preset requests read:jira-work, write:jira-work, read:confluence-content.all, and offline_access. A required scope the provider doesn’t request makes tool calls fail with scope_upgrade_required until each user reconnects and grants it. If the Atlassian app isn’t allowed to grant that scope, every tool call keeps failing.
|
Configure
-
Open MCP servers in the sidebar.
-
Click Add MCP server.
-
Click the Jira card in the marketplace picker.
-
Replace the suggested
Name, and optionally add aDescription. -
In the Jira configuration form:
-
Base URL: Your Jira instance URL, for examplehttps://mycompany.atlassian.net. -
Max Results Per Page(optional): Page size for thequerytool when a call doesn’t set one. Leave it at0to use the default,50. -
Auth: SelectBasic AuthorUser OAuth.-
For
Basic Auth: Provide the account email and the API-token secret reference. -
For
User OAuth: Pick the Atlassian OAuth Provider you configured, and setRequired scopestoread:jira-workandoffline_access. Addwrite:jira-workif your agents use the write tools.
-
-
EnabledunderQueryable(optional): Off by default. Leave it off unless your agents need the two SQL tools. See Expose Jira data as SQL tables.
-
-
Click Create server.
The create form turns Enable code mode on by default for this server type. rpk ai mcp-server create leaves it off unless you pass --code-mode. See Code Mode.
Expose Jira data as SQL tables
The Jira server can present its data as two read-only SQL tables instead of only as tools, so an agent can filter Jira records the way it would query a database. SQL exposure is the Enabled toggle under Queryable in the server’s configuration, and it’s off by default, so an existing server gains nothing until someone turns it on. Turning it on adds two tools:
-
list_tables: Return the table catalog. For each table, the catalog lists its columns and their types, which columns can be filtered and with which operators, whether each filter is exact, the page-size limit, and a schema fingerprint that every query response repeats so a caller can tell when the catalog changed. -
execute_query: Run one query against a table and return a page of rows plus a cursor for the next page.
Both tools read Jira through the server’s configured authentication, so with user-delegated OAuth a query returns only the records the calling user can see, exactly as the other tools do. Neither tool writes to Jira.
The tables are:
| Table | Contents |
|---|---|
|
Jira issues, from Jira’s issue search. Columns: |
|
Jira projects, from Jira’s project search. Columns: |
Not every column can be filtered. A filter is offered only where Jira’s search never drops a matching row, but most filters can return extra rows:
-
On
issues, filter onkey,project,issue_type,status, orpriorityfor a value or a list of up to 100 values, onassigneeorreporterby account ID (and onassignee, whether the issue is unassigned), and oncreatedorupdatedwith a time range. Matching onkey,project,issue_type,status, andpriorityis case-insensitive, so astatusfilter fordonealso returns issues inDone. A time range is widened by 15 hours on each side before it reaches Jira, so it can return issues created or updated outside the range. Only theassigneeandreporterfilters are exact. Thesummary,description, andlabelscolumns can be returned but not filtered. -
On
projects, filter onidorkeyfor a value or a list of up to 50 values, or ontypefor a single value. Matching onkeyandtypeis case-insensitive, and only theidfilter is exact. Thenamecolumn can be returned but not filtered. A query on this table takes one filter per column, and it can’t filter onidandkeytogether, so pick whichever identifier you have.
Because execute_query returns the rows Jira sends back without re-checking them against your filters, an agent that needs exact results must re-apply its filters to the rows it receives. The list_tables catalog marks which filters are exact.
A list longer than the cap fails rather than being silently cut short.
Two more limits are worth designing around:
-
Every query against
issuesneeds a filter. At least one predicate onkey,project,issue_type,status,priority,assignee,reporter,created, orupdatedis required, and an unfiltered query is refused before Jira is called. A query againstprojectshas no such requirement. -
A paged scan is best-effort. A page holds at most 100 rows for
issuesand 50 forprojects, and Jira keeps changing under a multi-page scan, so a long scan can miss a row or return one twice. A cursor is bound to the query that produced it. Reusing one with different filters or against another table is refused instead of quietly starting a new scan.
| With SQL exposure on, the two tools are available to every caller of the server, including agents. Leave it off on a server whose agents should only reach the curated Jira tools. |
Test the consent flow
-
Open the Inspector tab.
-
Run the
querytool with a small JQL filter. -
The first call fails with a connection-required result that carries an Atlassian authorization URL.
-
Open the authorization URL. Atlassian asks you to pick a site (Cloud instance) and approve the scopes.
-
Atlassian redirects back. Your connection appears under Connections.
-
Run the search again. Results come back.
Use with agents
Point an agent at the Server URL on the server’s Connection tab. Each user calling the agent will trigger their own consent flow on first call.
With user-delegated OAuth, set the server’s required_scopes to every scope your agents' tools need before users connect. An Atlassian app can request only scopes you’ve already added to it in the developer console, and if you widen required_scopes later, users who already connected have to consent again.
Troubleshooting
| Symptom | What to check |
|---|---|
|
|
"Resource not found" for a project the user has access to |
Atlassian’s OAuth grants are site-scoped. The user authorized for one Cloud instance; the project lives on another. They need to re-consent with the second site. |
|
The server’s required scopes were extended after users consented, so users reconnect to grant them. If it persists after reconnecting, a required scope is missing from the provider’s scopes or from the Atlassian app. |
|
Refresh tokens expire if unused for ~90 days. The user re-consents. |
Limitations
-
Atlassian app management: The OAuth app and its callback URLs are managed in
developer.atlassian.com, not in Agentic Data Plane. -
Jira Server / Data Center (self-hosted): This MCP type targets Atlassian Cloud. Self-hosted Jira may need a self-managed MCP server instead. See Register a self-managed MCP server.
-
Confluence access: Separate scope namespace; not exposed by this MCP server.
-
SQL exposure is read-only: The
execute_querytool reads issues and projects. Use the write tools to change anything in Jira. See Expose Jira data as SQL tables.