add_issue
Creates a new issue in the specified project.
Work a Backlog space end to end: file and update issues, get a count before pulling any bodies, review the pull requests in the same project's Git repository, and keep the wiki and document tree current.
LABSCO SUMMARY
The reach is unusual for a tracker binding: Backlog's Git repositories are in scope, so a pull request can be opened, updated and commented next to the issue it closes. count_issues is the tool that changes how the rest get used — ask for the number first, fetch bodies only when the number justifies it. It is not a read-only surface either: project, issue, version and watch deletions sit in the same set as the reads, and the way to bound that is the toolset flag, which is also how you keep the catalogue small enough for a client to handle.
A server over the Backlog API, covering projects, issues, comments, wikis, documents, Git repositories and pull requests, watches and notifications.
BACKLOG_DOMAIN naming the space and BACKLOG_API_KEY for a user inside it; every call runs as that user, which get_myself will confirm. It runs from npx or the published Docker image, and for multiple spaces the domain and key are supplied per organization instead. Exposed over HTTP it binds to 127.0.0.1 by default and validates Host and Origin — anything wider needs an allowed-hosts list, and the port must not reach an untrusted network, since it hands out full use of the API key. Remote deployments can use OAuth instead, so each person authenticates as themselves. MIT.
One command plus a key — docker pull ghcr.io/nulab/backlog-mcp-server:latest, then supply credentials
USE CASES
Create the issue against the right project with its type, priority and milestone, add the reproduction as a comment, and link it to the issue it is a regression of.
Ask for the count under the milestone and status you care about before pulling anything, then list only the issues that survive the filter and check the milestone's release date.
Find the open pull requests on the project's repository, read the one linked to the issue, and leave the review comment or update its status without switching tools.
Look at where documents already sit in the project tree, add the write-up in the right place, and update the wiki page that people actually navigate to.
Count what is unread before reading any of it, walk the list in order, mark the ones that matter as read, and reset the counter once the rest have been triaged.
Create the project, then read back the issue types, categories and custom fields it starts with so the first issues are filed against the right vocabulary rather than corrected later.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
add_issueCreates a new issue in the specified project.
add_issue_commentAdds a comment to an issue
add_projectCreates a new project
add_pull_requestCreates a new pull request
add_pull_request_commentAdds a comment to a pull request
add_related_issueRelates an issue to another issue
add_version_milestoneCreates a new version milestone
add_watchingAdds a new watch to an issue
add_wikiCreates a new wiki page
addDocumentAdds a new document to the specified project.
count_issuesReturns count of issues
count_notificationsReturns count of notifications
delete_issueDeletes an issue
delete_projectDeletes a project
delete_versionDeletes a version from a project
delete_watchingDeletes a watch from an issue
get_categoriesReturns list of categories for a project
get_custom_fieldsReturns list of custom fields for a project
get_documentGets information about a document.
get_document_treeGets the document tree of a project.
get_documentsGets a list of documents in a project.
get_git_repositoriesReturns list of Git repositories for a project
get_git_repositoryReturns information about a specific Git repository
get_issueReturns information about a specific issue
get_issue_commentsReturns list of comments for an issue
get_issue_typesReturns list of issue types for a project
get_issuesReturns list of issues
get_myselfReturns information about the authenticated user
get_notificationsReturns list of notifications
get_prioritiesReturns list of priorities
get_projectReturns information about a specific project
get_project_listReturns list of projects
get_project_usersReturns list of users in a specific project
get_pull_requestReturns information about a specific pull request
get_pull_request_commentsReturns list of comments for a pull request
get_pull_requestsReturns list of pull requests for a repository
get_pull_requests_countReturns count of pull requests for a repository
get_related_issuesReturns list of issues related to a specific issue
get_resolutionsReturns list of issue resolutions
get_spaceReturns information about the Backlog space
get_space_activitiesReturns list of space activities
get_user_recent_updatesReturns recent updates (activities) for a specific user
get_user_stars_countReturns the count of stars received by a user
get_usersReturns list of users in the Backlog space
get_version_milestone_listReturns list of versions/milestones in the Backlog space
get_watching_list_countReturns count of watching items for a user
get_watching_list_itemsReturns list of watching items for a user
get_wikiReturns information about a specific wiki page
get_wiki_pagesReturns list of Wiki pages
get_wikis_countReturns count of wiki pages in a project
mark_notification_as_readMark a notification as read
mark_watching_as_readMark a watch as read
remove_related_issueRemoves the relation between an issue and a related issue
reset_unread_notification_countReset unread notification count
update_issueUpdates an existing issue
update_issue_commentUpdates a comment on an issue
update_projectUpdates an existing project
update_pull_requestUpdates an existing pull request
update_pull_request_commentUpdates a comment on a pull request
update_version_milestoneUpdates an existing version milestone
update_watchingUpdates an existing watch note
update_wikiUpdates an existing wiki page
BEFORE YOU INSTALL
62 tools when we connected. Two tools answer to different names than documented: count_notifications, not get_notifications_count, and delete_version, not delete_version_milestone. ENABLE_TOOLSETS or --enable-toolsets limits the list to chosen toolsets; the default is all.
CONTEXT COST
Rated by the size of the 62 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
docker pull ghcr.io/nulab/backlog-mcp-server:latest{
"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_BACKLOG_API_KEY>"
}
}
}
}{
"mcpServers": {
"backlog": {
"command": "npx",
"args": [
"backlog-mcp-server"
],
"env": {
"BACKLOG_DOMAIN": "<YOUR_DOMAIN>.backlog.com",
"BACKLOG_API_KEY": "<YOUR_BACKLOG_API_KEY>"
}
}
}
}git clone https://github.com/nulab/backlog-mcp-server.git
cd backlog-mcp-server
pnpm install
pnpm run buildIn your Backlog space, Personal Settings → Register Application: set the Redirect URI to <YOUR_MCP_SERVER_BASE_URL>/callback and note the Client ID and Client Secret
BACKLOG_DOMAIN=<YOUR_SPACE>.backlog.com \
BACKLOG_OAUTH_CLIENT_ID=<YOUR_BACKLOG_OAUTH_CLIENT_ID> \
BACKLOG_OAUTH_CLIENT_SECRET=<YOUR_BACKLOG_OAUTH_CLIENT_SECRET> \
MCP_SERVER_BASE_URL=<YOUR_MCP_SERVER_BASE_URL> \
node build/index.js --transport http --http-host 0.0.0.0 --http-port 3333 \
--http-allowed-hosts <YOUR_HTTP_ALLOWED_HOSTS>Run it from the clone. <YOUR_HTTP_ALLOWED_HOSTS> is the public hostname your server is reached at, and <YOUR_MCP_SERVER_BASE_URL> is the same hostname as an https:// address. Clients connect to <YOUR_MCP_SERVER_BASE_URL>/mcp and sign in with their own Backlog account; no BACKLOG_API_KEY is needed in this mode.