backlog-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@backlog-mcp list high priority issues in project MYPROJ"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
backlog-mcp
An MCP (Model Context Protocol) server for Backlog (Nulab), providing AI agents with read access to Backlog issues and comments via API Key authentication.
Stack
TypeScript ā strict, ESM (NodeNext)
@modelcontextprotocol/sdk ā MCP server + stdio transport
Zod ā config and tool input validation
Axios ā Backlog REST API HTTP client
Related MCP server: Backlog MCP Server
Features
š Simple API Key authentication (no browser or SSO required)
š
backlog_get_issue_listā list issues with rich filtering (project, status, priority, assignee, keyword, etc.)š
backlog_get_issueā fetch a single issue's full detailsš¬
backlog_get_commentsā fetch issue comments with changelog entriesšļø
backlog_get_projectsā list all accessible projects (with IDs and keys for filtering)š„
backlog_get_usersā list project members (get user IDs for assignee filtering)š
backlog_get_attachmentsā list attachments on an issue (with IDs for downloading)ā¬ļø
backlog_download_attachmentā download an attachment to the local filesystemš¦
backlog_export_issue_contextā export issue, comments, and attachments into a local raw Markdown context bundle for LLM summarizationš·ļø
backlog_get_statusesā list all statuses in a project (with IDs for filtering)ā”
backlog_get_prioritiesā list global issue priorities (with IDs for filtering)š
backlog_get_categoriesā list all categories in a project (with IDs for filtering)šÆ
backlog_get_milestonesā list milestones/versions in a project (with IDs for filtering)
Requirements
Node.js >= 20
A Backlog space with API access
A Backlog API Key (generate at Account Settings ā API ā Register API key)
Quick Start (End Users)
No cloning or building required. Uses
npxdirectly ā the MCP client spawns and manages the process automatically via stdio.
Step 1 ā Add to your MCP client
Gemini CLI
gemini mcp add backlog npx -y @cuongph.dev/backlog-mcp --env BACKLOG_BASE_URL=https://yourspace.backlog.com --env BACKLOG_API_KEY=your_api_key_hereCursor
Edit ~/.cursor/mcp.json (global) or .cursor/mcp.json in your project:
{
"mcpServers": {
"backlog": {
"command": "npx",
"args": ["-y", "@cuongph.dev/backlog-mcp"],
"env": {
"BACKLOG_BASE_URL": "https://yourspace.backlog.com",
"BACKLOG_API_KEY": "your_api_key_here"
}
}
}
}Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"backlog": {
"command": "npx",
"args": ["-y", "@cuongph.dev/backlog-mcp"],
"env": {
"BACKLOG_BASE_URL": "https://yourspace.backlog.com",
"BACKLOG_API_KEY": "your_api_key_here"
}
}
}
}Tip: You can omit the
envblock and place the variables in a.envfile at your working directory instead.dotenvis loaded automatically at startup.
Restart your MCP client after saving the config. No separate server process needed ā the client spawns and manages it automatically.
Development Setup
For contributors and developers working on the source code.
1. Clone and install
git clone <repo-url>
cd backlog-mcp
npm install2. Configure environment
cp .env.example .envEdit .env:
BACKLOG_BASE_URL=https://yourspace.backlog.com
BACKLOG_API_KEY=your_api_key_here3. Add to MCP client (local build)
First build the project:
npm run buildThen use the local dist/server.js in your MCP config:
Cursor (~/.cursor/mcp.json):
{
"mcpServers": {
"backlog": {
"command": "node",
"args": ["/absolute/path/to/backlog-mcp/dist/server.js"]
}
}
}The
.envfile in the project root is loaded automatically ā no need to duplicate env vars in the MCP config.
Agent Summary Prompt
After exporting an issue with backlog_export_issue_context, use docs/prompts/backlog_issue_summary.md as the agent prompt template for summarizing task intent, comments, attachments, inferred acceptance criteria, and optional code context.
For Backlog-to-Jira migration, use docs/prompts/backlog_to_jira_migration.md. It keeps Jira description short, posts raw Backlog context, Vietnamese translation, and Vietnamese analysis as separate Jira comments, and uploads matching markdown files with clear names.
MCP Tools
backlog_get_issue_list
Fetch a list of Backlog issues with optional filters.
Input:
Field | Type | Description |
|
| Filter by project key ("MYPROJ") or numeric ID ("12345") ā comma-separated, auto-resolved |
|
| Filter by status: 1=Open, 2=InProgress, 3=Resolved, 4=Closed. Accept |
|
| Filter by priority: 2=High, 3=Normal, 4=Low. Accept |
|
| Filter by assignee user ID(s). Get IDs from |
|
| Filter by category ID(s) |
|
| Filter by milestone ID(s) |
|
| Search keyword in summary and description |
|
| 0=all, 1=child only, 2=parent only, 3=no parent, 4=no child |
|
| Number of issues (1ā100, default 20) |
|
| Pagination offset (default 0) |
|
| Sort field (created, updated, status, priority, dueDate, ...) |
|
| Sort order (default desc) |
Output: Compact table + detailed summaries for each issue (key, type, status, priority, assignee, dates, hours).
backlog_get_issue
Fetch a single Backlog issue by key or numeric ID.
Input:
Field | Type | Description |
|
| Issue key (e.g. |
Output: Full issue details ā summary, description, status, priority, type, assignee, reporter, categories, milestones, versions, dates, estimated/actual hours, URL.
backlog_get_comments
Fetch comments for a Backlog issue.
Input:
Field | Type | Description |
|
| Issue key (e.g. |
|
| Number of comments (1ā100, default 20) |
|
|
|
|
| Return comments with ID >= minId |
|
| Return comments with ID <= maxId |
Output: List of comments with author, date, text content, and field changes (changelog).
backlog_get_projects
Fetch the list of Backlog projects accessible to the current API Key.
Input:
Field | Type | Description |
|
| Omit = all, |
Output: Table of projects with ID, key, name, and archived flag. Use the key in project-scoped tools or projectIdOrKey in backlog_get_issue_list.
backlog_get_users
Fetch project members for a given Backlog project.
Input:
Field | Type | Description |
|
| Required. Project key (e.g. |
|
| Filter by display name or userId (case-insensitive) |
Output: Table of project members with numeric ID, userId, name, email, and role. Use the ID as assigneeId in backlog_get_issue_list.
backlog_get_statuses
Fetch all statuses defined for a Backlog project.
Input:
Field | Type | Description |
|
| Project key (e.g. |
Output: Table of statuses with ID, name, and color. Use IDs in statusId filter of backlog_get_issue_list.
backlog_get_priorities
Fetch the global list of issue priorities (space-wide, not project-specific).
Input: None required.
Output: Table of priorities with ID and name. Use IDs in priorityId filter of backlog_get_issue_list.
backlog_get_categories
Fetch all categories defined for a Backlog project.
Input:
Field | Type | Description |
|
| Project key (e.g. |
Output: Table of categories with ID and name. Use IDs in categoryId filter of backlog_get_issue_list.
backlog_get_milestones
Fetch milestones (versions) for a Backlog project.
Input:
Field | Type | Description |
|
| Project key (e.g. |
|
| Include archived milestones (default: |
Output: Table of milestones with ID, name, start date, due date, and archived flag. Use IDs in milestoneId filter of backlog_get_issue_list.
Project Structure
src/
āāā server.ts # MCP server entry point (factory pattern + Express)
āāā config.ts # Env var validation (Zod)
āāā errors.ts # Typed error classes & factories
āāā utils.ts # Shared helpers (dates, string formatting)
āāā types.ts # Normalized domain types (BacklogIssue, BacklogComment, ...)
āāā types/
ā āāā backlog-api.ts # Raw Backlog API response types
āāā backlog/
ā āāā endpoints.ts # URL builders (API v2)
ā āāā mappers.ts # Raw API payload ā domain types
ā āāā http-client.ts # API Key-authenticated Backlog HTTP client
āāā tools/
ā āāā get-issue-list.ts # backlog_get_issue_list handler
ā āāā get-issue.ts # backlog_get_issue handler
ā āāā get-comments.ts # backlog_get_comments handler
ā āāā get-statuses.ts # backlog_get_statuses handler
ā āāā get-priorities.ts # backlog_get_priorities handler
ā āāā get-categories.ts # backlog_get_categories handler
ā āāā get-milestones.ts # backlog_get_milestones handler
āāā tests/ # Unit tests (Vitest)Development Commands
# Type check (no emit)
npx tsc --noEmit
# Run tests
npm test
# Watch mode
npm run test:watch
# Build for production
npm run build
# Run dev server
npm run devError Codes
Code | Meaning |
|
|
| Unexpected HTTP error from Backlog REST API (e.g. 401, 403, 404) |
| Backlog returned an unexpected response shape |
| Invalid or missing environment variable |
| Tool input failed validation |
Security Notes
.envis git-ignored and must never be committed.Your API Key grants full access to your Backlog space as the associated user ā treat it like a password.
The API Key is only stored locally in
.envand sent as a query parameter over HTTPS.
Available Tools
12 toolsbacklog_download_attachmentA
Download an attachment from a Backlog issue and save it to the local filesystem.
Returns the absolute path where the file was saved, the filename, and the file size. Get the attachmentId from backlog_get_attachments first. The output directory is configured via ATTACHMENT_WORKSPACE in the server's environment.
INPUT:
issueIdOrKey (required): issue key e.g. "BLG-123" or numeric ID
attachmentId (required): numeric ID from backlog_get_attachments
EXAMPLE: { issueIdOrKey: "BLG-123", attachmentId: 42 }
Inputs: issueIdOrKey (required), attachmentId (required).
backlog_export_issue_contextA
Export a Backlog issue into a local raw context bundle for LLM summarization.
Fetches issue details, all comments (paginated), attachment metadata, downloads files, and writes:
raw.md: full markdown context with complete metadata (type, status, resolution, priority, parent, assignee, reporter, categories, milestones, versions, dates, hours), description, attachments, comments, and extracted text
manifest.json: machine-readable export metadata with placement confidence per attachment
Attachment placement is exact only when issue/comment text references the attachment; otherwise inferred by uploader/time or left unmatched. The output directory is configured via ATTACHMENT_WORKSPACE in the server's environment.
INPUT:
issueIdOrKey (required): issue key e.g. "BLG-10474" or numeric ID
outputDir (optional): override export root directory
includeComments/includeAttachments/downloadAttachments (optional booleans, default: true)
extractReadableFiles (optional boolean, default: false)
skipChangelogOnlyComments (optional boolean, default: false) ā skip comments with no text (only field changes)
maxAttachmentBytes (optional): skip files larger than this (default: 10485760 = 10 MB)
placementWindowMinutes (optional): time window for inferred comment placement (default: 10)
EXAMPLE: { issueIdOrKey: "BLG-10474" }
Inputs: issueIdOrKey (required), outputDir, includeComments, includeAttachments, +5 more.
backlog_get_attachmentsA
List all attachments on a Backlog issue.
Returns a table with attachment ID, filename, size, uploader, and upload date. Use the attachment ID with backlog_download_attachment to download a specific file.
INPUT:
issueIdOrKey (required): issue key e.g. "BLG-123" or numeric ID e.g. "12345"
EXAMPLE: { issueIdOrKey: "BLG-123" }
Inputs: issueIdOrKey (required).
backlog_get_categoriesA
Fetch all categories defined for a Backlog project.
Returns each category with its ID and name. Use the IDs to filter issues via backlog_get_issue_list (categoryId param).
Inputs: projectIdOrKey (required).
backlog_get_commentsA
Fetch comments for a Backlog issue.
Returns each comment with: author, date, text content, and field changes (changelog) showing what fields were modified in that activity entry.
PAGINATION: Use minId/maxId to page through comments:
For next page (desc order): use maxId = (lowest comment ID from previous page - 1)
For next page (asc order): use minId = (highest comment ID from previous page + 1)
Inputs: issueIdOrKey (required), count, order, minId, +1 more.
backlog_get_issueA
Fetch a single Backlog issue by key or ID and return its full details.
Returns: summary, description, status, priority, type, assignee, reporter, categories, milestones, versions, dates, estimated/actual hours.
Use backlog_get_comments separately to fetch comments.
Inputs: issueIdOrKey (required).
backlog_get_issue_listB
Fetch a list of Backlog issues with optional filters.
Returns a compact table + detailed summaries for each issue.
FILTERS:
projectIdOrKey: project key (e.g. "MYPROJ") or numeric ID ā auto-resolved. Highly recommended.
statusId: 1=Open, 2=InProgress, 3=Resolved, 4=Closed
priorityId: 2=High, 3=Normal, 4=Low
assigneeId: filter by specific user ID(s)
keyword: full-text search in summary and description
parentChild: 0=all, 1=child only, 2=parent only, 3=no parent, 4=no child
Array fields accept CSV string ("1,2") or JSON array ([1,2]). PAGINATION: Use offset + count to paginate. Max 100 per request.
Inputs: projectIdOrKey, statusId, priorityId, assigneeId, +8 more.
backlog_get_milestonesA
Fetch milestones (versions) for a Backlog project.
Returns each milestone with its ID, name, start date, due date, and archived flag. By default, only active (non-archived) milestones are returned. Set archived=true to include all milestones. Use the IDs to filter issues via backlog_get_issue_list (milestoneId param).
Inputs: projectIdOrKey (required), archived.
backlog_get_prioritiesA
Fetch the global list of issue priorities for this Backlog space.
Priorities are space-wide (not project-specific). Returns each priority with its ID and name. Use the IDs to filter issues via backlog_get_issue_list (priorityId param).
Inputs: no named parameters.
backlog_get_projectsA
Fetch the list of Backlog projects accessible to the authenticated user.
Returns each project with its numeric ID, project key, name, and archived status. Use the numeric ID in the projectId[] filter of backlog_get_issue_list.
Optional filter:
archived: omit = all projects, false = active only (default), true = archived only
Inputs: archived.
backlog_get_statusesA
Fetch all statuses defined for a Backlog project.
Returns each status with its ID, name, and color. Use the IDs to filter issues via backlog_get_issue_list (statusId param).
Inputs: projectIdOrKey (required).
backlog_get_usersA
Fetch project members for a given Backlog project.
Returns a table of users with their numeric ID, userId, display name, email, and role. Use the ID column as assigneeId in backlog_get_issue_list to filter by assignee.
INPUT:
projectIdOrKey (required): project key e.g. "MYPROJ" or numeric ID e.g. "12345"
keyword (optional): filter by display name or userId, case-insensitive
EXAMPLE: List all members of project "MYPROJ" ā { projectIdOrKey: "MYPROJ" } EXAMPLE: Find user named "Nguyen" ā { projectIdOrKey: "MYPROJ", keyword: "nguyen" }
Inputs: projectIdOrKey (required), keyword.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 12 tools
Each tool has a clearly distinct purpose: retrieving projects, issue lists, single issues, comments, attachments, metadata, and exporting context. No two tools overlap in functionality.
All tools follow a consistent 'backlog_verb_noun' pattern (e.g., backlog_get_issue, backlog_download_attachment, backlog_export_issue_context). The naming is uniform and predictable.
With 12 tools, the server covers all necessary read and export operations for Backlog without being bloated. Each tool serves a specific purpose within the domain.
The tool set provides comprehensive read and export capabilities for Backlog issues, including metadata retrieval, issue listing, comments, attachments, and full context export. There are no obvious gaps for its intended read-only scope.
Related MCP Connectors
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
One MCP server for the services your AI needs: memory, files, Microsoft 365, kanban and more.
Kaiku is an issue tracker with a wiki, built so that people and AI agents work in the same place. Its hosted MCP server lets an agent search, read, file and update issues, comment and answer questions, read and write wiki pages, and attach files ā with the permissions of the person whose token it uses. Create a token in Settings ā Connect over MCP and send it as Authorization: Bearer <token> (or in X-Api-Key); the token says which workspace.
Connect any AI agent to 1,000+ apps and 27,000+ actions through one remote MCP server (OAuth).
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceAn MCP server implementation that integrates with Backlog API, enabling project management operations including issues, projects, and wikis through natural language interactions.1210,810 npm3-
- AlicenseCqualityDmaintenanceAn MCP server that connects to Backlog API, providing functionality to search, retrieve, and update issues through natural language commands.410,810 npm6MIT
- -licenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that enables AI agents to interact with Backlog API for managing projects, issues, wikis, Git repositories, and other Backlog features.-
- AlicenseBqualityDmaintenanceA read-only MCP server that enables users to retrieve and interact with Backlog projects, issues, pull requests, and notifications. It provides a secure way to query Backlog data through natural language using tools like Claude Desktop.102 npmMIT