Backlog MCP Server
The Backlog MCP Server enables AI agents to interact with Backlog's API for comprehensive project management:
Space Management: Retrieve space information, user lists, and authenticated user details
Project Management: Create, read, update, delete, and list projects, including custom fields
Issue Tracking: Create, update, delete, list, and count issues, including comments and issue types
Wiki Management: Create, read, and list wiki pages
Git & Pull Requests: Manage repositories, PRs, and related comments
Notifications: Retrieve, count, mark as read, and reset notifications
Watching Management: List and count watching items for users
Advanced Features: GraphQL-style field selection, token limiting, and enhanced error handling
Provides Git repository management capabilities, including listing repositories and accessing repository information within Backlog projects.
Enables pull request management including creating, updating, listing pull requests and adding or updating comments on pull requests across repositories.
Click on "Install 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 Serverlist open issues in the mobile app project"
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 Server
A Model Context Protocol (MCP) server for interacting with the Backlog API. This server provides tools for managing projects, issues, wiki pages, and more in Backlog through AI agents like Claude Desktop / Cline / Cursor etc.
Features
Project tools (create, read, update, delete)
Issue tracking and comments (create, update, delete, list)
Version/Milestone management (create, read, update, delete)
Wiki page support
Git repository and pull request tools
Notification tools
GraphQL-style field selection for optimized responses
Token limiting for large responses
Related MCP server: Kintone MCP Server
Getting Started
Requirements
Docker
A Backlog account with API access
API key from your Backlog account
Option 1: Install via Docker
The easiest way to use this MCP server is through MCP configurations:
Open MCP settings
Navigate to the MCP configuration section
Add the following configuration:
{
"mcpServers": {
"backlog": {
"command": "docker",
"args": [
"run",
"--pull",
"always",
"-i",
"--rm",
"-e",
"BACKLOG_DOMAIN",
"-e",
"BACKLOG_API_KEY",
"ghcr.io/nulab/backlog-mcp-server"
],
"env": {
"BACKLOG_DOMAIN": "your-domain.backlog.com",
"BACKLOG_API_KEY": "your-api-key"
}
}
}
}Replace your-domain.backlog.com with your Backlog domain and your-api-key with your Backlog API key.
✅ If you cannot use --pull always, you can manually update the image using:
docker pull ghcr.io/nulab/backlog-mcp-server:latestOption 2: Install via npx
You can also run the server directly using npx without cloning the repository. This is a convenient way to run the server without a full installation.
Open MCP settings
Navigate to the MCP configuration section
Add the following configuration:
{
"mcpServers": {
"backlog": {
"command": "npx",
"args": ["backlog-mcp-server"],
"env": {
"BACKLOG_DOMAIN": "your-domain.backlog.com",
"BACKLOG_API_KEY": "your-api-key"
}
}
}
}Replace your-domain.backlog.com with your Backlog domain and your-api-key with your Backlog API key.
Option 3: Manual Setup (Node.js)
Clone and install:
git clone https://github.com/nulab/backlog-mcp-server.git cd backlog-mcp-server pnpm install pnpm run buildCreate
.envfrom template and set required variables:
cp .env.example .envSet the following values in .env:
BACKLOG_DOMAIN=your-domain.backlog.comBACKLOG_API_KEY=your-api-key
Run locally:
pnpm run devSet your json to use as MCP
{
"mcpServers": {
"backlog": {
"command": "node",
"args": ["your-repository-location/build/index.js"],
"env": {
"BACKLOG_DOMAIN": "your-domain.backlog.com",
"BACKLOG_API_KEY": "your-api-key"
}
}
}
}HTTP transport (Streamable HTTP)
By default the server uses stdio. To run the MCP Streamable HTTP transport instead (JSON-RPC over HTTP, same tools as stdio), start with --transport http or set MCP_TRANSPORT=http.
pnpm run build
MCP_TRANSPORT=http MCP_HTTP_PORT=3333 node build/index.jsEndpoint:
POST(andGETfor server-initiated streams) onhttp://<host>:<port><path>(default path/mcp).Protocol: MCP
2026-07-28. The protocol is stateless: there is noinitializehandshake and nomcp-session-idheader. Clients send their metadata in_metaon every request and discover capabilities viaserver/discover. Streamable HTTP also requires theMcp-Methodheader (andMcp-Nameontools/call).Backward compatibility: Clients on
2025-11-25and earlier are still served over the same endpoint, statelessly. Because no session is kept, the 2025 session operations (GET/DELETEwith anmcp-session-id) answer405.Security: Default bind is
127.0.0.1. On a bare loopback bind,HostandOriginare both validated against the localhost set (DNS rebinding protection). Behind a reverse proxy, set--http-allowed-hoststo the public hostname; that turns off the localhostOrigindefault, since a browser client'sOriginis its own site and never this server's hostname. Add--http-allowed-originsto restrict which client origins may reach the server. Do not expose the HTTP port to untrusted networks without authentication and TLS; it allows full use of your Backlog API key via MCP tools.
Environment variables (CLI flags override when both are set):
Variable | Description |
|
|
| Bind address (default |
| Port (default |
| URL path (default |
|
|
| Comma-separated allowed |
| Comma-separated allowed |
OAuth 2.0 Authentication (Remote MCP)
When exposing the MCP server over a network, you can enable OAuth 2.0 authentication so that each user authenticates with their own Backlog account instead of sharing a single API key.
The server implements the MCP Third-Party Authorization Flow by acting as both an OAuth authorization server (for MCP clients) and an OAuth client (for Backlog).
Prerequisites
Register an OAuth application in your Backlog space:
Go to your Backlog space → Personal Settings → Register Application
Set the Redirect URI to
<MCP_SERVER_BASE_URL>/callback(e.g.,https://mcp.example.com/callback)Note the Client ID and Client Secret
Set the following environment variables (in addition to
BACKLOG_DOMAIN):
Variable | Description |
| OAuth Client ID from your Backlog application |
| OAuth Client Secret from your Backlog application |
| Public URL of your MCP server (e.g., |
Note:
BACKLOG_API_KEYis not required when OAuth is enabled — each user authenticates with their own Backlog account.
Example
BACKLOG_DOMAIN=your-space.backlog.com \
BACKLOG_OAUTH_CLIENT_ID=your-client-id \
BACKLOG_OAUTH_CLIENT_SECRET=your-client-secret \
MCP_SERVER_BASE_URL=https://mcp.example.com \
node build/index.js --transport http --http-host 0.0.0.0 --http-port 3333 \
--http-allowed-hosts mcp.example.com--http-allowed-hosts is required in practice when binding to 0.0.0.0: without it there is no DNS rebinding protection, and the server logs a warning at startup.
The server automatically exposes the following OAuth endpoints when OAuth is enabled:
Endpoint | Description |
| OAuth Authorization Server Metadata (RFC 8414) |
| OAuth Protected Resource Metadata (RFC 9728) |
| Dynamic Client Registration (RFC 7591) |
| Authorization endpoint (redirects to Backlog OAuth) |
| Backlog OAuth callback |
| Token endpoint (authorization code & refresh token) |
MCP clients that support the MCP authorization specification will use these endpoints automatically.
Limitations:
OAuth mode currently supports a single Backlog organization. It is not compatible with the multi-organization configuration.
Client registrations and tokens are stored in memory and will be lost on server restart.
Tool Configuration
You can selectively enable or disable specific toolsets using the --enable-toolsets command-line flag or the ENABLE_TOOLSETS environment variable. This allows better control over which tools are available to the AI agent and helps reduce context size.
Available Toolsets
The following toolsets are available (enabled by default when "all" is used):
Toolset | Description |
| Tools for managing Backlog space settings and general information |
| Tools for managing projects, categories, custom fields, and issue types |
| Tools for managing issues and their comments, version milestones |
| Tools for managing wiki pages |
| Tools for managing Git repositories and pull requests |
| Tools for managing user notifications |
| Tools for viewing documents and document trees |
Specifying Toolsets
You can control toolset activation in the following ways:
Using via CLI:
--enable-toolsets space,project,issueOr via environment variable:
ENABLE_TOOLSETS="space,project,issue"If all is specified, all available toolsets will be enabled. This is also the default behavior.
Using selective toolsets can be helpful if the toolset list is too large for your AI agent or if certain tools are causing performance issues. In such cases, disabling unused toolsets may improve stability.
🧩 Tip:
projecttoolset is highly recommended, as many other tools rely on project data as an entry point.
Dynamic Toolset Discovery (Experimental)
If you're using the MCP server with AI agents, you can enable dynamic discovery of toolsets at runtime:
Enabling via CLI:
--dynamic-toolsetsOr via environment variable::
-e DYNAMIC_TOOLSETS=1 \With dynamic toolsets enabled, the LLM will be able to list and activate toolsets on demand via tool interface.
Scope over HTTP: MCP
2026-07-28has no protocol sessions, so an activated toolset is remembered per server process, not per client. On the HTTP transport every connected client shares one toolset state, and it resets when the process restarts. Tool visibility is shared; authorization is not — every call is still authenticated with the caller's own credentials.
Available Tools
Toolset: space
Tools for managing Backlog space settings and general information.
get_space: Returns information about the Backlog space.get_users: Returns list of users in the Backlog space.get_myself: Returns information about the authenticated user.
Toolset: project
Tools for managing projects, categories, custom fields, and issue types.
get_project_list: Returns list of projects.add_project: Creates a new project.get_project: Returns information about a specific project.get_project_users: Returns list of users in a specific project.update_project: Updates an existing project.delete_project: Deletes a project.
Toolset: issue
Tools for managing issues, their comments, and related items like priorities, categories, custom fields, issue types, resolutions, and watching lists.
get_issue: Returns information about a specific issue.get_issues: Returns list of issues.count_issues: Returns count of issues.add_issue: Creates a new issue in the specified project.update_issue: Updates an existing issue.delete_issue: Deletes an issue.get_issue_comments: Returns list of comments for an issue.add_issue_comment: Adds a comment to an issue.update_issue_comment: Updates a comment on an issue.get_related_issues: Returns list of issues related to a specific issue.add_related_issue: Relates an issue to another issue.remove_related_issue: Removes the relation between an issue and a related issue.get_priorities: Returns list of priorities.get_categories: Returns list of categories for a project.get_custom_fields: Returns list of custom fields for a project.get_issue_types: Returns list of issue types for a project.get_resolutions: Returns list of issue resolutions.get_watching_list_items: Returns list of watching items for a user.get_watching_list_count: Returns count of watching items for a user.add_watching: Adds a new watch to an issue.update_watching: Updates an existing watch note.delete_watching: Deletes a watch from an issue.mark_watching_as_read: Marks a watch as read.get_version_milestone_list: Returns list of version milestones for a project.add_version_milestone: Creates a new version milestone for a project.update_version_milestone: Updates an existing version milestone.delete_version_milestone: Deletes a version milestone.
Toolset: wiki
Tools for managing wiki pages.
get_wiki_pages: Returns list of Wiki pages.get_wikis_count: Returns count of wiki pages in a project.get_wiki: Returns information about a specific wiki page.add_wiki: Creates a new wiki page.
Toolset: git
Tools for managing Git repositories and pull requests.
get_git_repositories: Returns list of Git repositories for a project.get_git_repository: Returns information about a specific Git repository.get_pull_requests: Returns list of pull requests for a repository.get_pull_requests_count: Returns count of pull requests for a repository.get_pull_request: Returns information about a specific pull request.add_pull_request: Creates a new pull request.update_pull_request: Updates an existing pull request.get_pull_request_comments: Returns list of comments for a pull request.add_pull_request_comment: Adds a comment to a pull request.update_pull_request_comment: Updates a comment on a pull request.
Toolset: notifications
Tools for managing user notifications.
get_notifications: Returns list of notifications.get_notifications_count: Returns count of notifications.reset_unread_notification_count: Resets unread notification count.mark_notification_as_read: Marks a notification as read.
Toolset: document
Tools for managing documents and document trees in Backlog projects.
get_document_tree: Returns the hierarchical tree of documents for a project, including folders and neget_documents: Returns a flat list of documents in a project or folder.get_document: Returns detailed information about a specific document, including metadata, content, an
Usage Examples
Once the MCP server is configured in AI agents, you can use the tools directly in your conversations. Here are some examples:
Listing Projects
Could you list all my Backlog projects?Creating a New Issue
Create a new bug issue in the PROJECT-KEY project with high priority titled "Fix login page error"Getting Project Details
Show me the details of the PROJECT-KEY projectWorking with Git Repositories
List all Git repositories in the PROJECT-KEY projectManaging Pull Requests
Show me all open pull requests in the repository "repo-name" of PROJECT-KEY projectCreate a new pull request from branch "feature/new-feature" to "main" in the repository "repo-name" of PROJECT-KEY projectWatching Items
Show me all items I'm watchingi18n / Overriding Descriptions
You can override the descriptions of tools by creating a .backlog-mcp-serverrc.json file in your home directory.
The file should contain a JSON object with the tool names as keys and the new descriptions as values.
For example:
{
"TOOL_ADD_ISSUE_COMMENT_DESCRIPTION": "An alternative description",
"TOOL_CREATE_PROJECT_DESCRIPTION": "Create a new project in Backlog"
}When the server starts, it determines the final description for each tool based on the following priority:
Environment variables (e.g.,
BACKLOG_MCP_TOOL_ADD_ISSUE_COMMENT_DESCRIPTION)Entries in
.backlog-mcp-serverrc.json- Supported configuration file formats: .json, .yaml, .ymlBuilt-in fallback values (English)
Sample config:
{
"mcpServers": {
"backlog": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"BACKLOG_DOMAIN",
"-e",
"BACKLOG_API_KEY",
"-v",
"/yourcurrentdir/.backlog-mcp-serverrc.json:/root/.backlog-mcp-serverrc.json:ro",
"ghcr.io/nulab/backlog-mcp-server"
],
"env": {
"BACKLOG_DOMAIN": "your-domain.backlog.com",
"BACKLOG_API_KEY": "your-api-key"
}
}
}
}Exporting Current Translations
You can export the current default translations (including any overrides) by running the binary with the --export-translations flag.
This will print all tool descriptions to stdout, including any customizations you have made.
Example:
docker run -i --rm ghcr.io/nulab/backlog-mcp-server node build/index.js --export-translationsor
npx github:nulab/backlog-mcp-server --export-translationsUsing Environment Variables
Alternatively, you can override tool descriptions via environment variables.
The environment variable names are based on the tool keys, prefixed with BACKLOGMCP and written in uppercase.
Example: To override the TOOL_ADD_ISSUE_COMMENT_DESCRIPTION:
{
"mcpServers": {
"backlog": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e", "BACKLOG_DOMAIN",
"-e", "BACKLOG_API_KEY",
"-e", "BACKLOG_MCP_TOOL_ADD_ISSUE_COMMENT_DESCRIPTION"
"ghcr.io/nulab/backlog-mcp-server"
],
"env": {
"BACKLOG_DOMAIN": "your-domain.backlog.com",
"BACKLOG_API_KEY": "your-api-key",
"BACKLOG_MCP_TOOL_ADD_ISSUE_COMMENT_DESCRIPTION": "An alternative description"
}
}
}
}The server loads the config file synchronously at startup.
Environment variables always take precedence over the config file.
Advanced Features
Tool Name Prefixing
Add prefix to tool names with:
--prefix backlog_or via environment variable:
PREFIX="backlog_"This is especially useful if you're using multiple MCP servers or tools in the same environment and want to avoid name collisions. For example, get_project can become backlog_get_project to distinguish it from similarly named tools provided by other services.
Response Optimization & Token Limits
Field Selection (GraphQL-style)
--optimize-responseOr environment variable:
OPTIMIZE_RESPONSE=1Then, request only specific fields:
get_project(projectIdOrKey: "PROJECT-KEY", fields: "{ name key description }")The AI will use field selection to optimize the response:
get_project(projectIdOrKey: "PROJECT-KEY", fields: "{ name key description }")Benefits:
Reduce response size by requesting only needed fields
Focus on specific data points
Improve performance for large responses
Token Limiting
Large responses are automatically limited to prevent exceeding token limits:
Default limit: 50,000 tokens
Configurable via
MAX_TOKENSenvironment variableResponses exceeding the limit are truncated with a message
You can change this using:
MAX_TOKENS=10000If a response exceeds the limit, it will be truncated with a warning.
Note: This is a best-effort mitigation, not a guaranteed enforcement.
Full Custom Configuration Example
This section demonstrates advanced configuration using multiple environment variables. These are experimental features and may not be supported across all MCP clients. This is not part of the MCP standard specification and should be used with caution.
{
"mcpServers": {
"backlog": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"BACKLOG_DOMAIN",
"-e",
"BACKLOG_API_KEY",
"-e",
"MAX_TOKENS",
"-e",
"OPTIMIZE_RESPONSE",
"-e",
"PREFIX",
"-e",
"ENABLE_TOOLSETS",
"ghcr.io/nulab/backlog-mcp-server"
],
"env": {
"BACKLOG_DOMAIN": "your-domain.backlog.com",
"BACKLOG_API_KEY": "your-api-key",
"MAX_TOKENS": "10000",
"OPTIMIZE_RESPONSE": "1",
"PREFIX": "backlog_",
"ENABLE_TOOLSETS": "space,project,issue",
"ENABLE_DYNAMIC_TOOLSETS": "1"
}
}
}
}Development
Running Tests
pnpm testAdding New Tools
Create a new file in
src/tools/following the pattern of existing toolsCreate a corresponding test file
Add the new tool to
src/tools/tools.tsBuild and test your changes
Command Line Options
The server supports several command line options:
--transport stdio|http: MCP transport (default: stdio). Usehttpfor Streamable HTTP.--http-host,--http-port,--http-path: HTTP bind address, port, and path (defaults:127.0.0.1,3333,/mcp).--http-json-response: Prefer JSON responses over SSE. Applies to2026-07-28clients only; the backward-compatible2025-11-25path is served with the SDK's default response shaping.--http-allowed-hosts: Comma-separated allowedHosthostnames (port-agnostic). Needed when binding to all interfaces, or on a loopback bind behind a reverse proxy.--http-allowed-origins: Comma-separated allowedOriginhostnames for browser-based clients. Defaults to the localhost set on a bare loopback bind, and to noOrigincheck otherwise.--export-translations: Export all translation keys and values--optimize-response: Enable GraphQL-style field selection--max-tokens=NUMBER: Set maximum token limit for responses--prefix=STRING: Optional string prefix to prepend to all tool names (default: "")--enable-toolsets <toolsets...>: Specify which toolsets to enable (comma-separated or multiple arguments). Defaults to "all". Example:--enable-toolsets space,projector--enable-toolsets issue --enable-toolsets gitAvailable toolsets:space,project,issue,wiki,git,notifications.
Example:
node build/index.js --optimize-response --max-tokens=100000 --prefix="backlog_" --enable-toolsets space,issueHTTP example:
node build/index.js --transport http --http-port 3333 --http-path /mcpMulti-Organization Support
This server can be configured to access multiple Backlog organizations from a single MCP server instance.
Configuration
Configure one env pair per organization and set a default organization:
BACKLOG_DEFAULT_ORG=COMPANY_A
BACKLOG_ORG_COMPANY_A_DOMAIN=company-a.backlog.com
BACKLOG_ORG_COMPANY_A_API_KEY=your-company-a-api-key
BACKLOG_ORG_COMPANY_B_DOMAIN=company-b.backlog.com
BACKLOG_ORG_COMPANY_B_API_KEY=your-company-b-api-keyThis works whether the variables come from a local .env, your shell environment, or an MCP client config env block.
Example MCP config:
{
"env": {
"BACKLOG_DEFAULT_ORG": "COMPANY_A",
"BACKLOG_ORG_COMPANY_A_DOMAIN": "company-a.backlog.com",
"BACKLOG_ORG_COMPANY_A_API_KEY": "your-company-a-api-key",
"BACKLOG_ORG_COMPANY_B_DOMAIN": "company-b.backlog.com",
"BACKLOG_ORG_COMPANY_B_API_KEY": "your-company-b-api-key"
}
}If no multi-organization env vars are set, the server falls back to the existing single-organization configuration:
BACKLOG_DOMAIN=your-domain.backlog.com
BACKLOG_API_KEY=your-api-keyTool Usage
All normal tools accept an optional organization input field. When provided, the tool call is routed to that Backlog organization.
Examples:
{
"organization": "COMPANY_B",
"projectKey": "PROJECT"
}If organization is omitted:
the organization named by
BACKLOG_DEFAULT_ORGis usedif multi-organization env vars are present and
BACKLOG_DEFAULT_ORGis missing, the server fails at startup
Organization Discovery
The server provides a list_organizations tool that returns the configured organization names, their domains, and which one is the default.
Example response:
[
{
"name": "COMPANY_A",
"domain": "company-a.backlog.com",
"isDefault": true
},
{
"name": "COMPANY_B",
"domain": "company-b.backlog.com",
"isDefault": false
}
]Notes
For multi-org mode, every organization must define both
BACKLOG_ORG_<NAME>_DOMAINandBACKLOG_ORG_<NAME>_API_KEY.The
<NAME>part is the organization name exposed through theorganizationtool input andlist_organizations.
License
This project is licensed under the MIT License.
Please note: This tool is provided under the MIT License without any warranty or official support.
Use it at your own risk after reviewing the contents and determining its suitability for your needs.
If you encounter any issues, please report them via GitHub Issues.
Maintenance
Related MCP Servers
- Flicense-qualityDmaintenanceIntegrates Backlog project management with Claude via Model Context Protocol, enabling access to projects, issues, and wiki pages through natural language interactions.Last updated1
- AlicenseCqualityCmaintenanceA Model Context Protocol server that enables Claude and other AI assistants to access and update Kintone data through natural language commands, supporting operations like record management, file handling, app administration, and space collaboration.Last updated7911AGPL 3.0
- AlicenseBqualityDmaintenanceProvides access to Backlog API for project management, issue tracking, and file operations through Claude Desktop.Last updated81011MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables Claude Code to directly interact with Redmine project management systems, supporting issue management, project operations, and search features.Last updated229MIT
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nulab/backlog-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server