# Directory Structure
```
├── .gitignore
├── package-lock.json
├── package.json
├── README.md
├── smithery.yaml
├── src
│ └── index.ts
└── tsconfig.json
```
# Files
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
```
# Build and Release Folders
bin-debug/
bin-release/
[Oo]bj/
[Bb]in/
# Other files and folders
.settings/
# Executables
*.swf
*.air
*.ipa
*.apk
# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
# should NOT be excluded as they contain compiler settings and other important
# information for Eclipse / Flash Builder.
.vscode/
.env
node_modules/
build
```
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
```markdown
# Better Confluence Communication Server
## Overview
This server implements the Model Context Protocol (MCP) for Confluence integration.
**This version addresses and fixes bugs found in the existing Confluence server, providing a more stable and reliable experience.**
It provides functionalities to execute CQL queries and retrieve page content from Confluence.
This server follows the MCP client-server architecture:
- Acts as an MCP server providing Confluence functionalities
- Connects to Confluence as a data source
- Communicates with MCP clients through a standardized protocol
# How to use
[](https://smithery.ai/server/@zereight/confluence-mcp)
<a href="https://glama.ai/mcp/servers/p7fnmpaukj"><img width="380" height="200" src="https://glama.ai/mcp/servers/p7fnmpaukj/badge" alt="confluence-mcp MCP server" /></a>
## Using with Claude App, Cline, Roo Code
When using with the Claude App, you need to set up your API key and URLs directly.
```json
{
"mcpServers": {
"Confluence communication server": {
"command": "npx",
"args": ["-y", "@zereight/mcp-confluence"],
"env": {
"CONFLUENCE_URL": "https://XXXXXXXX.atlassian.net",
"JIRA_URL": "https://XXXXXXXX.atlassian.net",
"CONFLUENCE_API_MAIL": "Your email",
"CONFLUENCE_API_KEY": "KEY_FROM: https://id.atlassian.com/manage-profile/security/api-tokens",
"CONFLUENCE_IS_CLOUD": "true" // Set to "false" for Server/Data Center
}
}
}
}
```
## Using with Cursor
### Installing via Smithery
To install Confluence communication server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@zereight/confluence-mcp):
```bash
npx -y @smithery/cli install @zereight/confluence-mcp --client claude
```
When using with Cursor, you can set up environment variables and run the server as follows:
```bash
env [email protected] CONFLUENCE_API_KEY=your-key CONFLUENCE_URL=your-confluence-url JIRA_URL=your-jira-url npx -y @zereight/mcp-confluence
```
- `CONFLUENCE_API_MAIL`: Your email address for the Confluence API.
- `CONFLUENCE_API_KEY`: Your Confluence API key.
- `CONFLUENCE_URL`: Your Confluence URL.
- `JIRA_URL`: Your JIRA URL.
- `CONFLUENCE_IS_CLOUD`: Determines Confluence version (Cloud or Server)
- Default: true (Cloud version)
- Set to 'false' explicitly for Server/Data Center version
- Affects API endpoint paths:
- Cloud: `/wiki/rest/api`
- Server: `/rest/api`
### Confluence Tools
- **execute_cql_search**: Executes a CQL query on Confluence to search pages.
- Description: Executes a CQL query on the Confluence instance to search for pages.
- Input Schema:
```json
{
"type": "object",
"properties": {
"cql": {
"type": "string",
"description": "CQL query string"
},
"limit": {
"type": "integer",
"description": "Number of results to return",
"default": 10
}
},
"required": ["cql"]
}
```
- **get_page_content**: Retrieves the content of a specific Confluence page.
- Description: Gets the content of a Confluence page using the page ID.
- Input Schema:
```json
{
"type": "object",
"properties": {
"pageId": {
"type": "string",
"description": "Confluence Page ID"
}
},
"required": ["pageId"]
}
```
- **create_page**: Creates a new Confluence page.
- Description: Creates a new page in the specified Confluence space.
- Input Schema:
```json
{
"type": "object",
"properties": {
"spaceKey": {
"type": "string",
"description": "Space key where the page will be created"
},
"title": {
"type": "string",
"description": "Page title"
},
"content": {
"type": "string",
"description": "Page content in storage format"
},
"parentId": {
"type": "string",
"description": "Parent page ID (optional)"
}
},
"required": ["spaceKey", "title", "content"]
}
```
- **update_page**: Updates an existing Confluence page.
- Description: Updates the content of an existing Confluence page.
- Input Schema:
```json
{
"type": "object",
"properties": {
"pageId": {
"type": "string",
"description": "ID of the page to update"
},
"content": {
"type": "string",
"description": "New page content in storage format"
},
"title": {
"type": "string",
"description": "New page title (optional)"
}
},
"required": ["pageId", "content"]
}
```
### Jira Tools
- **execute_jql_search**: Executes a JQL query on Jira to search issues.
- Description: Executes a JQL query on the Jira instance to search for issues.
- Input Schema:
```json
{
"type": "object",
"properties": {
"jql": {
"type": "string",
"description": "JQL query string"
},
"limit": {
"type": "integer",
"description": "Number of results to return",
"default": 10
}
},
"required": ["jql"]
}
```
- **create_jira_issue**: Creates a new Jira issue.
- Description: Creates a new issue in the specified Jira project.
- Input Schema:
```json
{
"type": "object",
"properties": {
"project": {
"type": "string",
"description": "Project key"
},
"summary": {
"type": "string",
"description": "Issue summary"
},
"description": {
"type": "string",
"description": "Issue description"
},
"issuetype": {
"type": "string",
"description": "Issue type name"
},
"assignee": {
"type": "string",
"description": "Assignee account ID"
},
"priority": {
"type": "string",
"description": "Priority ID"
}
},
"required": ["project", "summary", "issuetype"]
}
```
- **update_jira_issue**: Updates an existing Jira issue.
- Description: Updates fields of an existing Jira issue.
- Input Schema:
```json
{
"type": "object",
"properties": {
"issueKey": {
"type": "string",
"description": "Issue key (e.g., PROJ-123)"
},
"summary": {
"type": "string",
"description": "New issue summary"
},
"description": {
"type": "string",
"description": "New issue description"
},
"assignee": {
"type": "string",
"description": "New assignee account ID"
},
"priority": {
"type": "string",
"description": "New priority ID"
}
},
"required": ["issueKey"]
}
```
- **transition_jira_issue**: Changes the status of a Jira issue.
- Description: Changes the status of a Jira issue using transition ID.
- Input Schema:
```json
{
"type": "object",
"properties": {
"issueKey": {
"type": "string",
"description": "Issue key (e.g. PROJ-123)"
},
"transitionId": {
"type": "string",
"description": "Transition ID to change the issue status"
}
},
"required": ["issueKey", "transitionId"]
}
```
- **get_board_sprints**: Get all sprints from a Jira board.
- Description: Retrieves all sprints from a specified Jira board.
- Input Schema:
```json
{
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Jira board ID"
},
"state": {
"type": "string",
"description": "Filter sprints by state (active, future, closed)",
"enum": ["active", "future", "closed"]
}
},
"required": ["boardId"]
}
```
- **get_sprint_issues**: Get all issues from a sprint.
- Description: Retrieves all issues from a specified sprint.
- Input Schema:
```json
{
"type": "object",
"properties": {
"sprintId": {
"type": "string",
"description": "Sprint ID"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of fields to return for each issue"
}
},
"required": ["sprintId"]
}
```
- **get_current_sprint**: Get current active sprint from a board with its issues.
- Description: Retrieves the current active sprint and its issues from a specified board.
- Input Schema:
```json
{
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Jira board ID"
},
"includeIssues": {
"type": "boolean",
"description": "Whether to include sprint issues in the response",
"default": true
}
},
"required": ["boardId"]
}
```
- **get_epic_issues**: Get all issues belonging to an epic.
- Description: Retrieves all issues that belong to a specified epic.
- Input Schema:
```json
{
"type": "object",
"properties": {
"epicKey": {
"type": "string",
"description": "Epic issue key (e.g. CONNECT-1234)"
},
"fields": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of fields to return for each issue"
}
},
"required": ["epicKey"]
}
```
- **get_user_issues**: Get all issues assigned to or reported by a specific user in a board.
- Description: Retrieves all issues associated with a specific user in a board.
- Input Schema:
```json
{
"type": "object",
"properties": {
"boardId": {
"type": "string",
"description": "Jira board ID"
},
"username": {
"type": "string",
"description": "Username to search issues for"
},
"type": {
"type": "string",
"description": "Type of user association with issues",
"enum": ["assignee", "reporter"],
"default": "assignee"
},
"status": {
"type": "string",
"description": "Filter by issue status",
"enum": ["open", "in_progress", "done", "all"],
"default": "all"
}
},
"required": ["boardId", "username"]
}
```
```
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
```json
{
"compilerOptions": {
"target": "ES2022",
"module": "Node16",
"moduleResolution": "Node16",
"outDir": "./build",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
},
"include": ["src/**/*"],
"exclude": ["node_modules"]
}
```
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
```json
{
"name": "@zereight/mcp-confluence",
"version": "1.0.8",
"description": "MCP server for using the Confluence API",
"license": "MIT",
"author": "zereight",
"type": "module",
"private": false,
"bin": {
"mcp-confluence": "build/index.js"
},
"files": [
"build"
],
"publishConfig": {
"access": "public"
},
"engines": {
"node": ">=14"
},
"scripts": {
"build": "tsc && node -e \"require('fs').chmodSync('build/index.js', '755')\"",
"prepare": "npm run build",
"watch": "tsc --watch",
"inspector": "npx @modelcontextprotocol/inspector build/index.js",
"start": "node build/index.js"
},
"dependencies": {
"@modelcontextprotocol/sdk": "0.6.0",
"axios": "^1.7.9",
"mcp-framework": "^0.1.12",
"okhttp": "^1.1.0"
},
"devDependencies": {
"@types/node": "^20.11.24",
"typescript": "^5.7.2"
}
}
```
--------------------------------------------------------------------------------
/smithery.yaml:
--------------------------------------------------------------------------------
```yaml
# Smithery configuration file: https://smithery.ai/docs/config#smitheryyaml
startCommand:
type: stdio
configSchema:
# JSON Schema defining the configuration options for the MCP.
type: object
required:
- confluenceApiMail
- confluenceApiKey
- confluenceUrl
- jiraUrl
properties:
confluenceApiMail:
type: string
description: Your email address for the Confluence API.
confluenceApiKey:
type: string
description: Your Confluence API key, obtained from Atlassian API Tokens.
confluenceUrl:
type: string
description: Your Confluence URL, e.g., 'https://yourcompany.atlassian.net'.
jiraUrl:
type: string
description: Your JIRA URL, e.g., 'https://yourcompany.atlassian.net'.
commandFunction:
# A function that produces the CLI command to start the MCP on stdio.
|-
config => ({command:'node', args:['build/index.js'], env:{CONFLUENCE_API_MAIL:config.confluenceApiMail, CONFLUENCE_API_KEY:config.confluenceApiKey, CONFLUENCE_URL:config.confluenceUrl, JIRA_URL:config.jiraUrl}})
```