#
tokens: 3560/50000 5/5 files
lines: off (toggle) GitHub
raw markdown copy
# 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

[![smithery badge](https://smithery.ai/badge/@zereight/confluence-mcp)](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}})

```