Skip to main content
Glama
Vijay-Duke
by Vijay-Duke
README.md
# MCP Atlassian Server

> **This is a maintained fork of [Vijay-Duke/mcp-atlassian](https://github.com/Vijay-Duke/mcp-atlassian)**
>
> **Why this fork exists:** In January 2026, Atlassian removed the `/rest/api/3/search` endpoint entirely, breaking all Jira search functionality in the original package. This fork migrates to the new `/rest/api/3/search/jql` endpoint and implements the new cursor-based pagination. A [PR has been submitted](https://github.com/Vijay-Duke/mcp-atlassian/pull/73) to upstream, but as of now there are 14+ unmerged PRs in that repo.
>
> **Install this fork:** `npm install @efithor/mcp-atlassian --registry=https://npm.pkg.github.com`

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

A Model Context Protocol (MCP) server for integrating with Atlassian products (Confluence and Jira). This server provides tools for AI assistants to interact with Atlassian Cloud APIs, enabling document management, search, and export capabilities.

## Features

### Confluence Integration
- **Read & Search**: Access pages, spaces, and content
- **Content Management**: Create, update pages and comments
- **Page Hierarchy**: Navigate parent/child page relationships
- **Export**: Export pages as HTML or Markdown with embedded images
- **Attachments**: List, download, and upload attachments
- **Labels**: Manage page labels
- **Users**: Find and query users, track personal activity
- **Personal Dashboard**: View recent pages and mentions

### Jira Integration  
- **Issues**: Read and search issues, get personal tasks
- **Projects**: List and explore projects
- **Boards & Sprints**: List boards, view sprints, track active work
- **Comments**: Add comments to issues
- **Issue Creation**: Create new issues with custom fields
- **User Management**: Get current user details
- **Personal Dashboard**: View your open issues and sprint tasks

## Installation

### Option 1: GitHub Packages (Recommended)

First, configure npm to use GitHub Packages for the `@efithor` scope. Add to your `~/.npmrc`:

```
@efithor:registry=https://npm.pkg.github.com
```

Then install:

```bash
# Install globally
npm install -g @efithor/mcp-atlassian

# Or install locally
npm install @efithor/mcp-atlassian
```

### Option 2: Clone and Build

```bash
# Clone this fork
git clone https://github.com/Efithor/mcp-atlassian.git
cd mcp-atlassian

# Install dependencies
npm install

# Build TypeScript
npm run build
```

### Option 3: Install Directly from GitHub

```bash
# Install directly from this fork
npm install -g github:Efithor/mcp-atlassian

# Or install in your project
npm install github:Efithor/mcp-atlassian
```

## Configuration

### Environment Variables

Create a `.env` file in the root directory:

```env
ATLASSIAN_BASE_URL=https://yourdomain.atlassian.net
ATLASSIAN_EMAIL=your-email@example.com
ATLASSIAN_API_TOKEN=your-api-token
```

### Getting API Token

1. Log in to [Atlassian Account Settings](https://id.atlassian.com/manage-profile/security/api-tokens)
2. Click "Create API token"
3. Give it a label and copy the token
4. Use this token in your `.env` file

### MCP Settings Configuration

Add to your Claude Desktop config file:
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`

#### Option 1: After npm install -g

```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "npx",
      "args": ["@efithor/mcp-atlassian"],
      "env": {
        "ATLASSIAN_BASE_URL": "https://yourdomain.atlassian.net",
        "ATLASSIAN_EMAIL": "your-email@example.com",
        "ATLASSIAN_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}
```

#### Option 2: From Local Clone

```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "node",
      "args": ["/path/to/your/mcp-atlassian/dist/index.js"],
      "env": {
        "ATLASSIAN_BASE_URL": "https://yourdomain.atlassian.net",
        "ATLASSIAN_EMAIL": "your-email@example.com",
        "ATLASSIAN_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}
```

**Example with typical paths:**
```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "node",
      "args": ["~/projects/mcp-atlassian/dist/index.js"],
      "env": {
        "ATLASSIAN_BASE_URL": "https://yourdomain.atlassian.net",
        "ATLASSIAN_EMAIL": "your.email@company.com",
        "ATLASSIAN_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}
```

#### Option 3: Direct from GitHub using uvx (Coming Soon)

You can run the server directly from GitHub without cloning:

```json
{
  "mcpServers": {
    "mcp-atlassian": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/Efithor/mcp-atlassian.git", "mcp-atlassian"],
      "env": {
        "ATLASSIAN_BASE_URL": "https://yourdomain.atlassian.net",
        "ATLASSIAN_EMAIL": "your-email@example.com",
        "ATLASSIAN_API_TOKEN": "YOUR_API_TOKEN"
      }
    }
  }
}
```

**Note:** The uvx method requires the package to be properly configured for Python packaging. This is planned for a future release.

## Available Tools

### Confluence Tools

| Tool | Description |
|------|-------------|
| `get_confluence_current_user` | Get details of the authenticated user |
| `get_confluence_user` | Get details for a specific user |
| `search_confluence_pages_by_user` | Search pages by user activity |
| `list_user_confluence_pages` | List pages authored by a user |
| `list_user_confluence_attachments` | List attachments uploaded by a user |
| `read_confluence_page` | Read a Confluence page by ID or title |
| `search_confluence_pages` | Search pages using CQL (Confluence Query Language) |
| `list_confluence_spaces` | List all accessible spaces |
| `get_confluence_space` | Get details of a specific space |
| `create_confluence_page` | Create a new page |
| `update_confluence_page` | Update existing page content |
| `list_confluence_page_children` | List child pages of a page |
| `list_confluence_page_ancestors` | Get parent hierarchy of a page |
| `export_confluence_page` | Export page as HTML or Markdown with embedded images |
| `list_confluence_attachments` | List page attachments |
| `download_confluence_attachment` | Download specific attachment |
| `upload_confluence_attachment` | Upload file to a page |
| `download_confluence_page_complete` | Download page with all content |
| `add_confluence_comment` | Add comment to a page |
| `list_confluence_page_labels` | Get page labels |
| `add_confluence_page_label` | Add labels to a page |
| `find_confluence_users` | Search for users |
| `get_my_recent_confluence_pages` | List your recent pages |
| `get_confluence_pages_mentioning_me` | Find pages that mention you |

### Jira Tools

| Tool | Description |
|------|-------------|
| `get_jira_current_user` | Get details of the authenticated user |
| `get_jira_user` | Get details for a specific user |
| `search_jira_issues_by_user` | Search issues by user involvement |
| `list_user_jira_issues` | List issues by user role with date filtering |
| `get_user_jira_activity` | Track user activity including comments and transitions |
| `get_user_jira_worklog` | Get time tracking entries with formatted totals |
| `read_jira_issue` | Read issue details by key |
| `search_jira_issues` | Search issues using JQL |
| `list_jira_projects` | List all accessible projects |
| `create_jira_issue` | Create new issue |
| `add_jira_comment` | Add comment to issue |
| `list_jira_boards` | List accessible Scrum/Kanban boards |
| `list_jira_sprints` | List sprints for a board |
| `get_jira_sprint` | Get detailed sprint information |
| `get_my_tasks_in_current_sprint` | Get your tasks in active sprints |
| `get_my_open_issues` | Get all your open issues |

## Usage Examples

### Export Confluence Page

```javascript
// Export as HTML (raw content with embedded images)
{
  "tool": "export_confluence_page",
  "arguments": {
    "pageId": "123456789",
    "format": "html"
  }
}

// Export as Markdown with metadata
{
  "tool": "export_confluence_page",
  "arguments": {
    "pageId": "123456789",
    "format": "markdown"
  }
}
```

### Search Confluence

```javascript
{
  "tool": "search_confluence_pages",
  "arguments": {
    "cql": "space=DEV AND text~'architecture'",
    "limit": 10
  }
}
```

### Create Jira Issue

```javascript
{
  "tool": "create_jira_issue",
  "arguments": {
    "projectKey": "PROJ",
    "issueType": "Task",
    "summary": "Implement new feature",
    "description": "Detailed description here",
    "priority": "Medium"
  }
}
```

### Get Your Sprint Tasks

```javascript
// Get your tasks in the current sprint
{
  "tool": "get_my_tasks_in_current_sprint",
  "arguments": {
    "projectKey": "PROJ"
  }
}

// Get all your open issues
{
  "tool": "get_my_open_issues",
  "arguments": {
    "projectKeys": ["PROJ1", "PROJ2"],
    "maxResults": 50
  }
}
```

### Work with Boards and Sprints

```javascript
// List boards for a project
{
  "tool": "list_jira_boards",
  "arguments": {
    "projectKeyOrId": "PROJ",
    "type": "scrum"
  }
}

// Get active sprints for a board
{
  "tool": "list_jira_sprints",
  "arguments": {
    "boardId": 123,
    "state": "active"
  }
}
```

### User-Specific Jira Operations

```javascript
// Get user details
{
  "tool": "get_jira_user",
  "arguments": {
    "username": "john.doe"
  }
}

// Search issues by user involvement
{
  "tool": "search_jira_issues_by_user",
  "arguments": {
    "username": "john.doe",
    "searchType": "assignee",
    "status": "In Progress",
    "maxResults": 20
  }
}

// Get user's work logs
{
  "tool": "get_user_jira_worklog",
  "arguments": {
    "username": "john.doe",
    "startDate": "2024-01-01",
    "endDate": "2024-01-31",
    "projectKeys": ["PROJ1", "PROJ2"]
  }
}

// Track user activity
{
  "tool": "get_user_jira_activity",
  "arguments": {
    "username": "john.doe",
    "activityType": "all",
    "days": 7
  }
}
```

## Content Format Support

### Markdown ↔ Confluence Storage Format

The server automatically converts between Markdown and Confluence's storage format:
- Write content in Markdown when creating/updating pages
- Read pages in either storage format or converted to Markdown
- Preserves formatting, links, and structure

### Export Formats

- **HTML**: Raw Confluence HTML with all images embedded as base64 data URIs
- **Markdown**: Clean Markdown with YAML frontmatter, includes metadata and embedded images

## Development

```bash
# Run in development mode with console logging
npm run dev

# Build for production
npm run build

# Run built server in MCP mode (no console output)
npm start

# Run built server in development mode (with console output)
npm run start:dev

# Run tests
npm test
```

### Logging Behavior

The server defaults to MCP mode where console output is disabled to prevent interference with the JSON-RPC protocol. Console logging is only enabled when `MCP_SERVER_MODE=false` is set, which is done automatically by the `dev` and `start:dev` scripts.

## Project Structure

```
mcp-atlassian/
├── src/
│   ├── index.ts                 # Main server entry point
│   ├── types/                   # TypeScript type definitions
│   ├── confluence/
│   │   ├── handlers.ts          # Confluence API handlers
│   │   └── tools.ts             # Tool definitions
│   ├── jira/
│   │   ├── handlers.ts          # Jira API handlers
│   │   └── tools.ts             # Tool definitions
│   └── utils/
│       ├── http-client.ts       # Axios HTTP client setup
│       ├── content-converter.ts # Markdown ↔ Storage conversion
│       └── export-converter.ts  # HTML/Markdown export utilities
├── dist/                        # Compiled JavaScript
├── .env                         # Environment variables (not in git)
├── package.json
└── tsconfig.json
```

## Security Notes

- API tokens are stored in environment variables, never in code
- Uses Basic Authentication with API tokens (not passwords)
- All requests are made over HTTPS
- Supports Atlassian Cloud only (not Server/Data Center)

## Limitations

- No delete operations implemented (by design for safety)
- Export to PDF requires browser conversion (HTML → Print → PDF)
- Some Confluence macros may not convert perfectly to Markdown
- Rate limits apply based on Atlassian Cloud API limits

## CI/CD Pipeline

This project uses GitHub Actions for continuous integration and deployment.

### Workflows

#### 🔄 Continuous Integration (`ci.yml`)
- **Triggers**: Push to main/develop, Pull requests
- **Jobs**:
  - **Test**: Runs tests on Node.js 18.x, 20.x, and 22.x
  - **Build**: Compiles TypeScript and validates the build
  - **Lint**: Type checking and security audit
  - **Validate Package**: Ensures package size and structure

#### 📦 Publish to npm (`publish.yml`)
- **Triggers**: GitHub releases, Manual dispatch
- **Features**:
  - Automatic version bumping
  - npm publishing with provenance
  - GitHub release creation
  - Changelog updates

#### 🔒 Security Scanning (`security.yml`)
- **Triggers**: Push to main, PRs, Weekly schedule
- **Scans**:
  - npm audit for vulnerabilities
  - CodeQL analysis
  - OWASP dependency check
  - Snyk security scanning (optional)

#### 🏷️ Release Management (`release.yml`)
- **Triggers**: Version tags, Manual dispatch
- **Features**:
  - Automatic changelog generation
  - GitHub release creation
  - Build artifacts attachment
  - Release notes formatting

#### ✅ PR Validation (`pr-validation.yml`)
- **Triggers**: Pull request events
- **Checks**:
  - Semantic PR title validation
  - PR size labeling
  - Auto-labeling based on files changed

### 🤖 Automated Dependency Updates

Dependabot is configured to:
- Check for npm dependency updates weekly
- Check for GitHub Actions updates weekly
- Group non-major updates together
- Create PRs with proper labels

### Setting Up CI/CD

#### Required GitHub Secrets

1. **NPM_TOKEN**: npm authentication token for publishing
   - Generate at: https://www.npmjs.com/settings/YOUR_USERNAME/tokens
   - Required scopes: `publish`

2. **SNYK_TOKEN** (Optional): For Snyk security scanning
   - Get from: https://app.snyk.io/account

#### Branch Protection

Recommended branch protection rules for `main`:
- Require PR reviews before merging
- Require status checks to pass (CI tests)
- Require branches to be up to date
- Include administrators in restrictions

### Local Development

Before pushing changes:

```bash
# Run tests locally
npm test

# Build the project
npm run build

# Check for security vulnerabilities
npm audit

# Type check
npx tsc --noEmit
```

## Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

## License

MIT License - see LICENSE file for details

## Support

For issues and questions:
- Create an issue in [this fork's GitHub repository](https://github.com/Efithor/mcp-atlassian/issues)
- Check [Atlassian API documentation](https://developer.atlassian.com/cloud/) for API-specific questions
- Review [MCP documentation](https://modelcontextprotocol.io) for protocol-related topics

## Acknowledgments

Built with:
- [Model Context Protocol (MCP)](https://modelcontextprotocol.io)
- [Atlassian REST APIs](https://developer.atlassian.com/cloud/)
- TypeScript, Node.js, Axios

## Contributors

Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):

<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
  <tbody>
    <tr>
      <td align="center" valign="top" width="14.28%"><a href="https://github.com/Vijay-Duke"><img src="https://avatars.githubusercontent.com/u/2405107?v=4?s=100" width="100px;" alt="Vijay Iyengar"/><br /><sub><b>Vijay Iyengar</b></sub></a><br /><a href="https://github.com/Vijay-Duke/mcp-atlassian/commits?author=Vijay-Duke" title="Code">💻</a> <a href="https://github.com/Vijay-Duke/mcp-atlassian/commits?author=Vijay-Duke" title="Documentation">📖</a> <a href="#maintenance-Vijay-Duke" title="Maintenance">🚧</a> <a href="https://github.com/Vijay-Duke/mcp-atlassian/pulls?q=is%3Apr+reviewed-by%3AVijay-Duke" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/Vijay-Duke/mcp-atlassian/commits?author=Vijay-Duke" title="Tests">⚠️</a> <a href="#infra-Vijay-Duke" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
    </tr>
  </tbody>
</table>

<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->

<!-- ALL-CONTRIBUTORS-LIST:END -->

This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!

TDQS

B3.2/5.0

Scored across 40 tools

Disambiguation3/5

Most tools are clearly scoped by product and resource type, and usage notes help distinguish read, get, export, and search variants. However, search_issues_by_user_involvement and list_issues_by_user_role overlap heavily, and search_pages_by_user_involvement vs list_pages_created_by_user creates ambiguity for user-based page lookup.

Naming Consistency4/5

The majority of tools follow a consistent verb_noun pattern with product prefixes like get_confluence_, list_jira_, create_confluence_page, and search_jira_issues. Minor deviations such as get_page_with_attachments, get_my_recent_confluence_pages, and get_my_unresolved_issues break the pattern slightly.

Tool Count2/5

With 40 tools, the server is well beyond the typical well-scoped range, even for a combined Confluence and Jira server. Many tools are narrow user-reporting or variation-on-a-theme operations, which makes the set feel bloated rather than curated.

Completeness3/5

The server covers broad read/search functionality across Confluence and Jira, plus page create/update, issue creation, comments, attachments, labels, spaces, users, and agile boards/sprunts. However, there are important lifecycle gaps: no update/transition/delete for Jira issues, no delete for Confluence pages/attachments/comments, and no comment update/delete.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive