Model Context Protocol (MCP) server for Confluence Cloud search and management. Enables Claude Code to connect to your Confluence instance for searching, reading, and managing documentation with built-in best-practice linting.
confluence_ping- Test connection and verify authenticationconfluence_whoami- Get authenticated user informationconfluence_list_spaces- List accessible Confluence spaces
confluence_search- Search using CQL (Confluence Query Language)confluence_get_page_by_title- Find pages by exact titleconfluence_list_pages- List pages in a spaceconfluence_get_page- Get full page content and metadataconfluence_get_page_metadata- Get metadata without bodyconfluence_get_children- Get child pages
confluence_create_page- Create new pages (with dry-run)confluence_update_page- Update existing pages (with dry-run)confluence_add_labels- Add labels to pagesconfluence_remove_labels- Remove labels from pagesconfluence_archive_page- Archive pages (with dry-run)
All write operations support dryRun: true for previewing changes.
confluence_lint_page- Check pages for best practice violationsconfluence_suggest_improvements- Get actionable improvement suggestions
Checks for:
- Title conventions (length, formatting, generic terms)
- Missing metadata (owner, last reviewed date)
- Content structure (headings, paragraphs, code blocks)
- Labels (missing or non-standard)
- Staleness (pages not updated in 6+ months)
- Excessive nesting depth (4+ levels)
cd ~/repos/confluence-mcp-server
npm installCreate a .env file from the template:
cp .env.example .envEdit .env with your Confluence details:
# Your Confluence Cloud instance
CONFLUENCE_BASE_URL=https://your-domain.atlassian.net
# Your Atlassian account email
CONFLUENCE_EMAIL=your-email@example.com
# API token (generate at https://id.atlassian.com/manage-profile/security/api-tokens)
CONFLUENCE_API_TOKEN=your-api-token-here
# Enable write operations (default: false)
CONFLUENCE_WRITE_ENABLED=false
# Optional: Restrict write operations to specific spaces
# CONFLUENCE_ALLOWED_SPACES=TEAM,DOCS,WIKI
# Optional: Enable audit logging (default: true)
CONFLUENCE_AUDIT_LOG=true- Go to https://id.atlassian.com/manage-profile/security/api-tokens
- Click "Create API token"
- Give it a name (e.g., "Claude Code MCP")
- Copy the token and paste it into your
.envfile
Edit ~/.claude.json and add to the global mcpServers section:
{
"mcpServers": {
"confluence": {
"type": "stdio",
"command": "/Users/joshuamullet/repos/confluence-mcp-server/start-mcp-server.sh",
"args": [],
"env": {}
}
}
}Important:
- Use the ABSOLUTE path to
start-mcp-server.sh - Add to global
mcpServers, NOT inside a project'smcpServers - Must include
"type": "stdio"field
Fully restart Claude Code to load the new MCP server:
# Exit current session
/exit
# Start new session
claude-codeIn Claude Code, check that the server is loaded:
/mcp
You should see confluence listed with connection status.
Test your Confluence connection:
Can you ping the Confluence server and show me the current user?
Claude will call confluence_ping and confluence_whoami to verify connectivity.
Search all spaces:
Search Confluence for pages about "API documentation"
Search specific space:
Search for pages in the TEAM space that contain "deployment"
Advanced CQL:
Search Confluence using this CQL: type=page AND space=DOCS AND lastModified >= "2025-01-01"
Get page by title:
Get the page titled "Getting Started" from the TEAM space
Get page by ID:
Show me the content of Confluence page 123456
List pages:
List all pages in the DOCS space
Get page tree:
Show me all child pages of page 123456
Lint a page:
Lint Confluence page 123456 for best practice issues
Get improvement suggestions:
Suggest improvements for Confluence page 123456
Example output:
{
"pageId": "123456",
"pageTitle": "API Documentation",
"totalFindings": 3,
"findings": [
{
"severity": "warning",
"category": "metadata",
"message": "Missing owner or contact information",
"recommendation": "Add an 'Owner' or 'Contact' section"
},
{
"severity": "info",
"category": "labels",
"message": "Page has no labels",
"recommendation": "Add labels to improve discoverability"
}
]
}Important: Write operations require CONFLUENCE_WRITE_ENABLED=true in your .env file.
Create a page:
Create a new page in the TEAM space titled "New Feature" with this content:
<h1>Overview</h1>
<p>This is a new feature.</p>
Update a page (dry-run first):
Update page 123456 with a new title "Updated Title" - show me what will change first
Add labels:
Add labels "documentation" and "api" to page 123456
- Uses Confluence Cloud API tokens (not passwords)
- API tokens are stored in
.env(gitignored, never committed) - Authentication via HTTP Basic Auth (email + API token)
- Write operations disabled by default
- Requires explicit
CONFLUENCE_WRITE_ENABLED=true - All write operations support dry-run mode
- Optional space allowlist restricts modifications
- All tool calls are logged to stderr
- Logs include: timestamp, tool name, parameters, success/error
- Sensitive data (API tokens) never logged
- View logs:
tail -f ~/.claude/logs/*.log
- Automatically detects 429 responses
- Returns clear error with retry-after information
- Implements basic retry logic with backoff
-
Check
~/.claude.jsonconfiguration:- Is the server in the global
mcpServerssection? - Is the path to
start-mcp-server.shabsolute and correct? - Is
"type": "stdio"present?
- Is the server in the global
-
Check server starts manually:
cd ~/repos/confluence-mcp-server node mcp-server.js
Should output:
Confluence MCP Server running on stdio -
Check Claude Code logs:
tail -f ~/.claude/logs/*.log
- Verify
CONFLUENCE_BASE_URLis correct (should behttps://your-domain.atlassian.net) - Verify
CONFLUENCE_EMAILmatches your Atlassian account - Regenerate API token if needed
- Test credentials manually:
curl -u "your-email:your-token" "https://your-domain.atlassian.net/wiki/rest/api/space"
- Check
CONFLUENCE_WRITE_ENABLED=truein.env - Restart Claude Code after changing
.env - Verify the setting loaded: server logs show "Write operations: ENABLED"
Error: Missing required environment variables
Solution:
- Ensure
.envfile exists in the server directory - Verify all required variables are set
- Check dotenv is loading (see server startup logs)
CQL (Confluence Query Language) examples:
type=page AND space=TEAM
type=page AND title~"API"
type=page AND space=DOCS AND lastModified >= "2025-01-01"
type=page AND label="documentation"
creator=currentUser()
See Confluence CQL documentation for more.
Most list operations support pagination:
{
"limit": 25, // Results per page (max 100)
"start": 0 // Offset (0 = first page, 25 = second page, etc.)
}All write operations support dry-run:
{
"pageId": "123456",
"title": "New Title",
"dryRun": true // Preview changes without applying
}Returns what would be changed without making actual modifications.
confluence-mcp-server/
├── mcp-server.js # Main MCP server (loads dotenv first)
├── start-mcp-server.sh # Shell wrapper for Claude Code
├── tools/
│ ├── confluence-client.js # Confluence REST API client
│ └── best-practices.js # Linting and suggestions
├── package.json
├── .env # Your credentials (gitignored)
├── .env.example # Template
├── .gitignore
└── README.md
Test individual API calls:
cd ~/repos/confluence-mcp-server
node -e "
import('./tools/confluence-client.js').then(async ({ ConfluenceClient }) => {
const client = new ConfluenceClient(
process.env.CONFLUENCE_BASE_URL,
process.env.CONFLUENCE_EMAIL,
process.env.CONFLUENCE_API_TOKEN
);
const result = await client.ping();
console.log(result);
});
"- Confluence Cloud REST API
- Advanced searching using CQL
- Model Context Protocol
- Confluence API Authentication
ISC