Cursor 3.23.12 on Windows, Atlassian plugin 0.1.0 (plugin-atlassian-atlassian), endpoint https://mcp.atlassian.com/v2/mcp. The OAuth callback exchange completes and the tokens are saved. The next streamable HTTP call then returns “401 after successful authentication” and the status goes back to needsAuth (v2). The UI stays on “Exchanging token”. The same sequence happened at 9:45, 9:59, 10:12, and 10:32, including after I removed the Atlassian MCP grant under Connected apps and signed in again. The same plugin connects successfully outside the local Cursor app.
Steps to Reproduce
Install the Atlassian plugin 0.1.0 in Cursor 3.23.12 on Windows.
Click Authenticate on the atlassian MCP row.
Finish the Atlassian consent screen and return to Cursor.
The row stays on Exchanging token and the log shows needsAuth (v2).
Expected Behavior
After the token is saved, the Atlassian MCP connects and its tools become available.
Hey, thanks for the detailed report. The Server returned 401 after successful authentication error means Atlassian rejected the token Cursor just received. Most often this points to a stale local sign-in state, not an issue with your Atlassian grant. Let’s try a clean sign-in.
If Grok Bot desktop is open, close it for this test.
In Cursor: Cursor Settings > Tools & MCP.
Open the Atlassian entry and under Environments > Local click Logout.
Check your mcp.json files global and project for another Atlassian entry. If you find one, temporarily remove it or disable it.
Fully close Cursor all windows, then reopen it.
Go back to Tools & MCP, click Authenticate for Atlassian, and complete the consent screen.
If it gets stuck on Exchanging token again, here’s a workaround that helped in similar cases. Disable the plugin and add Atlassian directly in mcp.json, pinning your site:
Thanks. I tested the direct mcp.json configuration as suggested, with the Atlassian plugin disabled.
The connection still gets stuck on “Exchanging token”. The log shows that the OAuth refresh completes and the tokens are persisted, but the subsequent Streamable HTTP connection is rejected:
Auth-related error connecting to streamableHttp server:
Server returned 401 after successful authentication
The client then returns to:
MCP OAuth needsAuth (v2)
Attempt time:
4 October 2026 at approximately 12:41 EEST (UTC+3)
I can confirm that the mcp.json connection was pinned to the relevant Atlassian site.
Could this indicate a Cursor OAuth/resource-audience issue, or is there a specific Atlassian-side authorization setting I should check?
Thanks for the logs and for confirming the single-site configuration. That helps narrow things down.
From the log, it looks like token exchange and refresh are both succeeding, and the tokens are being saved (MCP OAuth tokens persisted, callback exchange completed). Then the very next Streamable HTTP request returns 401 after successful authentication. So at the request stage, Atlassian is rejecting the newly saved token. This does not look like a token persistence issue or a problem with your Atlassian grant.
Since using a direct mcp.json with pinned ?site= and doing a clean re-auth also didn’t help, and the same server connects fine outside the local app, this looks more like something in the desktop token or request handling path, not an issue with your setup or Atlassian config. I’ve passed it to the team. I can’t give a timeline yet, but I’ll follow up in this thread as soon as I have an update.
If you get a chance before then, a couple quick checks would help speed things up:
Does the 401 still happen after a full machine restart, not just restarting Cursor?
If you have another OAuth MCP handy, like Linear or GitHub, does it connect on this same machine without a 401? That would help show whether this is specific to Atlassian v2 or a broader local issue.
On Windows, the GitHub MCP server at https://api.githubcopilot.com/mcp/ connects and then fails about half a second later with Client error: terminated. The row shows “Error · terminated”. This happens with the GitHub plugin and also with a direct entry in ~/.cursor/mcp.json that has the plugin turned off. Authentication uses a fine-grained personal access token sent as Authorization: Bearer.
The token and the server are fine outside Cursor. From the same machine, a manual initialize, initialized, and tools/list sequence returns 200 with 46 tools, and api.github.com/user returns my account. The server answers the optional GET event stream with 405. Limiting toolsets with X-MCP-Toolsets: repos,issues,pull_requests made no difference.
Log from the mcp.json entry (the plugin log is the same):