You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs: add multi-cloud OAuth support documentation (sooperset#548)
- Add section explaining minimal OAuth configuration with ATLASSIAN_OAUTH_ENABLE=true
- Document X-Atlassian-Cloud-Id header for per-request cloud instance selection
- Include Python integration example using official MCP SDK
- Update multi-user authentication notes to mention cloud ID header support
Reported-by: Ivaschenko Pavlo (@pavel1tel)
Github-Issue: sooperset#471
Copy file name to clipboardExpand all lines: README.md
+63Lines changed: 63 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -106,6 +106,9 @@ To use this method, set the following environment variables (or use the correspo
106
106
This option is useful in scenarios where OAuth credential management is centralized or handled by other infrastructure components.
107
107
</details>
108
108
109
+
> [!TIP]
110
+
> **Multi-Cloud OAuth Support**: If you're building a multi-tenant application where users provide their own OAuth tokens, see the [Multi-Cloud OAuth Support](#multi-cloud-oauth-support) section for minimal configuration setup.
111
+
109
112
### 📦 2. Installation
110
113
111
114
MCP Atlassian is distributed as a Docker image. This is the recommended way to run the server, especially for IDE integration. Ensure you have Docker installed.
@@ -371,6 +374,65 @@ Credentials in proxy URLs are masked in logs. If you set `NO_PROXY`, it will be
371
374
372
375
</details>
373
376
377
+
<details>
378
+
<summary>Multi-Cloud OAuth Support</summary>
379
+
380
+
MCP Atlassian supports multi-cloud OAuth scenarios where each user connects to their own Atlassian cloud instance. This is useful for multi-tenant applications, chatbots, or services where users provide their own OAuth tokens.
381
+
382
+
**Minimal OAuth Configuration:**
383
+
384
+
1. Enable minimal OAuth mode (no client credentials required):
385
+
```bash
386
+
docker run -e ATLASSIAN_OAUTH_ENABLE=true -p 9000:9000 \
387
+
ghcr.io/sooperset/mcp-atlassian:latest \
388
+
--transport streamable-http --port 9000
389
+
```
390
+
391
+
2. Users provide authentication via HTTP headers:
392
+
-`Authorization: Bearer <user_oauth_token>`
393
+
-`X-Atlassian-Cloud-Id: <user_cloud_id>`
394
+
395
+
**Example Integration (Python):**
396
+
```python
397
+
import asyncio
398
+
from mcp.client.streamable_http import streamablehttp_client
399
+
from mcp import ClientSession
400
+
401
+
user_token ="user-specific-oauth-token"
402
+
user_cloud_id ="user-specific-cloud-id"
403
+
404
+
asyncdefmain():
405
+
# Connect to streamable HTTP server with custom headers
406
+
asyncwith streamablehttp_client(
407
+
"http://localhost:9000/mcp",
408
+
headers={
409
+
"Authorization": f"Bearer {user_token}",
410
+
"X-Atlassian-Cloud-Id": user_cloud_id
411
+
}
412
+
) as (read_stream, write_stream, _):
413
+
# Create a session using the client streams
414
+
asyncwith ClientSession(read_stream, write_stream) as session:
415
+
# Initialize the connection
416
+
await session.initialize()
417
+
418
+
# Example: Get a Jira issue
419
+
result =await session.call_tool(
420
+
"jira_get_issue",
421
+
{"issue_key": "PROJ-123"}
422
+
)
423
+
print(result)
424
+
425
+
asyncio.run(main())
426
+
```
427
+
428
+
**Configuration Notes:**
429
+
- Each request can use a different cloud instance via the `X-Atlassian-Cloud-Id` header
430
+
- User tokens are isolated per request - no cross-tenant data leakage
431
+
- Falls back to global `ATLASSIAN_OAUTH_CLOUD_ID` if header not provided
432
+
- Compatible with standard OAuth 2.0 bearer token authentication
433
+
434
+
</details>
435
+
374
436
<details> <summary>Single Service Configurations</summary>
375
437
376
438
**For Confluence Cloud only:**
@@ -600,6 +662,7 @@ Here's a complete example of setting up multi-user authentication with streamabl
600
662
> - The server should have its own fallback authentication configured (e.g., via environment variables for API token, PAT, or its own OAuth setup using --oauth-setup). This is used if a request doesn't include user-specific authentication.
601
663
> - **OAuth**: Each user needs their own OAuth access token from your Atlassian OAuth app.
602
664
> - **PAT**: Each user provides their own Personal Access Token.
665
+
> - **Multi-Cloud**: For OAuth users, optionally include `X-Atlassian-Cloud-Id` header to specify which Atlassian cloud instance to use
603
666
> - The server will use the user's token for API calls when provided, falling back to server auth if not
604
667
> - User tokens should have appropriate scopes for their needed operations
0 commit comments