Closes the updatePullRequest gap reported in #1, together with two omissions of the same shape found while tracing it. Every change is additive — no tool was removed, renamed or given a new required argument, so upgrading from 1.0.0 needs nothing but the new version number.
Changes
updatePullRequesttakescloseSourceBranchanddraft. Both fields existed on the request model and were serialised correctly, but the tool bound neither, so passing one was accepted, answered200 OK, and changed nothing — and the arity guard counted only the four fields it did bind, so the flag on its own was refused as "nothing to update" (#1). They are the only way to reach either setting once a pull request is open:draft=falsemarks a draft ready for review, andcloseSourceBranch=truemakes the merge delete the branch on a pull request opened without it. Both are nullable, so an omitted flag keeps the current value rather than forcingfalse.- A flag-only update is one
PUTcarrying one field. Bitbucket documents the endpoint as a partial update but publishes no example without atitle, so a400on a body that named no title — and only that combination — is answered by fetching the pull request and resending its own title with the change, the same fallbackupdatePullRequestTaskalready makes for a state-only update. createPullRequest'scloseSourceBranchanddraftare nullable too. As plain booleans they defaulted tofalseand were therefore written into every create body, forcing a value where the caller had expressed no opinion; omitting them now leaves the field out and lets Bitbucket apply its own default.listPullRequestsreportscloseSourceBranchon each entry. The field set had always requested it and the wire model had always deserialised it — only the summary result lacked the property, so the value was fetched and discarded, and "which of these open pull requests will leave their branch behind?" cost onegetPullRequestper entry to answer.
Install
Native AOT binary — recommended. Self-contained, nothing to install, roughly ten milliseconds to start. Every archive below was built and smoke-tested on its own architecture: each release leg publishes the binary and drives a real initialize / tools/list exchange over stdio before uploading, so no binary ships without having answered a handshake on the hardware it targets.
| Platform | RID | Archive |
|---|---|---|
| Windows x64 | win-x64 |
bitbucket-mcp-1.1.0-win-x64.zip |
| Windows ARM64 | win-arm64 |
bitbucket-mcp-1.1.0-win-arm64.zip |
| Linux x64 | linux-x64 |
bitbucket-mcp-1.1.0-linux-x64.tar.gz |
| Linux ARM64 | linux-arm64 |
bitbucket-mcp-1.1.0-linux-arm64.tar.gz |
| macOS Apple silicon | osx-arm64 |
bitbucket-mcp-1.1.0-osx-arm64.tar.gz |
tar -xzf bitbucket-mcp-1.1.0-linux-x64.tar.gz
./bitbucket-mcp --versionNuGet. The same server is on nuget.org as bitbucket-mcp, a .NET tool package carrying the McpServer package type, so dnx (part of the .NET 10 SDK) fetches and runs it in one step:
dnx bitbucket-mcp@1.1.0 --yes statusPublished by trusted publishing — the workflow exchanges its GitHub OIDC token for an API key that lives minutes, so no nuget.org key exists in this repository or in its secrets.
Claude Code plugin. Delivers the server and the pull-request skill together:
/plugin marketplace add lahma/bitbucket-mcp
/plugin install bitbucket-mcp@bitbucket-mcp
Upgrading from 1.0.0
Change the version you pin and nothing else. Both new updatePullRequest arguments are optional and default to leaving the current value alone, and the new closeSourceBranch field on a listPullRequests entry is additive.
One behaviour change worth naming: createPullRequest no longer writes close_source_branch: false and draft: false into every request body. Passing either argument explicitly behaves exactly as before; omitting it now lets Bitbucket apply its own default instead of having false forced on it.