bitbucket-mcp
Provides tools for managing Bitbucket Cloud pull requests, including reading PR metadata and diffs, posting and replying to comments (general and inline), editing PR titles and descriptions, and viewing pipeline step logs to debug build failures.
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., "@bitbucket-mcpsummarize PR 42 in this repo"
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.
bitbucket-mcp
A Model Context Protocol server for Bitbucket Cloud, optimized for use with Claude Code. Lets the agent read pull request diffs, read and write PR comments (including file + line inline comments), edit the PR Overview (title and description), resolve and unresolve comment threads, find Pipelines builds and read their step logs, check whether a commit is green, and re-run a build.
Status: alpha. Distributed on npm as @mcpkits/bitbucket.
Tools
Read-only:
Tool | Description |
| Fetch a PR's metadata (title, state, author, branches, URL). |
| List PRs filtered by state, author, or branch. |
| Unified diff for a PR, with |
| All comments on a PR (general + inline). |
| Find pipelines by PR, branch, commit, or build number, with each step's UUID and pass/fail. |
| Log output for a pipeline step, with |
| Commit build statuses rolled up to one verdict — "is this commit green?". |
Write:
Tool | Description |
| Post a general comment on a PR. |
| Post a comment on a specific file + line in a PR's diff. |
| Post a threaded reply to an existing PR comment (general or inline). |
| Open a new PR. Defaults source to the current git branch. |
| Update a PR's title, description (Overview), and/or reviewers list. |
| Mark a PR as draft or ready for review. |
| Mark a PR comment resolved or unresolved. |
| Start a build: re-run a branch's pipeline or run a |
All tools accept optional workspace and repo. When you run the server from inside a git checkout, those are inferred from the origin remote. PR-scoped tools accept an optional pr_id; when omitted, the server resolves it by listing open PRs whose source branch matches the current checked-out branch.
Finding pipelines
Most repos have no pull-requests: section in bitbucket-pipelines.yml, so their builds fire on branch push and Bitbucket cannot attribute any pipeline to a PR. list_pipelines handles that: when nothing is attributable to the PR it falls back to the most recent pipelines on the PR's source branch and reports what it did.
match: "pr_head_commit"— the pipeline was PR-triggered or built the PR's head commit.match: "branch_fallback"— these built the source branch, not the PR. Each entry carriesis_requested_commitso you can tell whether it built the commit you asked about.match: "none"— no pipeline ran at all. Distinct from the fallback case, and never silently an empty list.
You can also scope it directly with branch, commit (short or full SHA), or build_number. Steps come back with their UUIDs and pass/fail state, which is what get_pipeline_step_log needs — and it accepts a plain build number in the pipeline_uuid slot, with or without curly braces on UUIDs.
Output size
Diffs and logs are the two things that can blow a context window, so both are capped and both can be narrowed:
get_pr_diff—stat_only: truefor a per-file summary,paths: ["src/foo"]to fetch part of a diff,max_bytes(default 100 KB, keeps the head) otherwise.get_pipeline_step_log—tail_lines: 50for just the end of a failing step,max_bytes(default 100 KB, keeps the tail). To learn only whether a step passed, uselist_pipelinesinstead: it returns each step's state, result, and duration without fetching any log.
Deliberately not included
There is no merge_pr and no set_pr_approval. Merging into a shared branch and approving someone's code are decisions we want a human to keep making, so this server cannot do either.
Related MCP server: Bitbucket MCP Server
Setup
Requires Node 22+.
Solo (you create your own OAuth consumer)
npx -y @mcpkits/bitbucket setupThe wizard:
Opens your browser to your workspace's OAuth consumers page; you create a private consumer with the listed scopes and paste back its key + secret.
Opens the browser again to authorize; you click Grant access.
Detects
claudeonPATHand offers to register the server with Claude Code automatically (user scope).
Restart Claude Code (or open a new session) and you're done.
Team (shared OAuth consumer)
If your team already keeps a Bitbucket OAuth consumer in your password manager, pass the key and secret as env vars and setup will skip the consumer-creation step:
BITBUCKET_CLIENT_KEY=... \
BITBUCKET_CLIENT_SECRET=... \
npx -y @mcpkits/bitbucket setupYou'll be prompted to confirm before the env vars are used.
Migrating from a previous local-build install
Just run npx -y @mcpkits/bitbucket setup. It detects an existing local-dist registration in ~/.claude.json, skips OAuth (your tokens in ~/.config/bitbucket-mcp/config.json are reused), and rewrites the registration to use npx. No re-auth needed.
Other MCP hosts (Claude Desktop, Cursor, etc.)
Add this to your host's MCP config:
{
"mcpServers": {
"bitbucket": {
"command": "npx",
"args": ["-y", "@mcpkits/bitbucket"]
}
}
}For the OAuth credentials and tokens, run npx -y @mcpkits/bitbucket setup once first; they're stored in ~/.config/bitbucket-mcp/config.json and used by every invocation regardless of host.
Config file
Stored at $XDG_CONFIG_HOME/bitbucket-mcp/config.json if XDG_CONFIG_HOME is set, otherwise ~/.config/bitbucket-mcp/config.json. Mode 0600; parent dir mode 0700.
{
"clientKey": "...",
"clientSecret": "...",
"tokens": {
"accessToken": "...",
"refreshToken": "...",
"expiresAt": 1712345678000,
"scopes": [
"account",
"repository",
"pullrequest",
"pullrequest:write",
"pipeline",
"pipeline:write"
]
}
}Never commit this file. Never share it.
Usage
Once registered and loaded, ask the agent things like:
"Summarize PR 42 in this repo."
"What did my latest pipeline fail on?" → the model calls
list_pipelines, thenget_pipeline_step_logon the failing step (or with nostep_uuidat all, which picks the failing step for it)."Is this commit green?" →
get_build_status."Re-run the build, that step is flaky." →
run_pipeline."Leave a comment on line 17 of
src/foo.tsin PR 42 saying 'this needs a null check'." → the model callsadd_pr_inline_comment.
If you're inside a git checkout of the Bitbucket repo, you typically don't need to pass workspace, repo, or pr_id — the server infers them.
Build
End users don't need to clone or build — install via
npx -y @mcpkits/bitbucket setup. This section is for contributors.
Requires Node 22+ and Vite+ (vp).
vp install # install deps
vp check # lint + typecheck
vp test # run tests
vp pack # bundle to dist/bitbucket-mcp.mjsThe build produces a single executable file at dist/bitbucket-mcp.mjs with a #!/usr/bin/env node shebang and the executable bit set.
Subcommands
bitbucket-mcp(no args) /serve— run the MCP server over stdio.setup— interactive wizard. Detects existing OAuth tokens and Claude Code registration to choose between fresh install, migration, or re-registration. HonorsBITBUCKET_CLIENT_KEY+BITBUCKET_CLIENT_SECRETenv vars for team-shared OAuth consumers (asks before using).credentials --key <KEY>— non-interactive: read the secret from stdin (or$BITBUCKET_CLIENT_SECRET), persist both to the config file.authorize— run the OAuth flow using stored credentials; open browser, wait for callback, persist tokens.print-config— emit the JSON payload forclaude mcp add-json bitbucket --scope user.help— show usage.
Security notes
OAuth tokens and consumer secret live in a
0600file in your home directory. No env vars, no shell history.The OAuth callback listener binds only to
127.0.0.1. Thestateparameter is a 32-byte cryptographic random and compared in constant time.Tokens are refreshed transparently. If a refresh fails (e.g. the consumer was revoked), the MCP clears the tokens and asks you to re-run
npx -y @mcpkits/bitbucket setup.run_pipelineneeds thepipeline:writescope. If you set this server up before that scope was requested, re-runnpx -y @mcpkits/bitbucket setup, tick Pipelines → Write on the consumer, and re-authorize. Everything else keeps working without it.This is a Bitbucket Cloud client — Bitbucket Server / Data Center is not supported.
License
MIT
Available Tools
15 toolsadd_pr_commentAdd PR commentA
Post a general comment on a pull request (not tied to a specific file or line). For inline file/line comments, use add_pr_inline_comment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Comment body (Markdown). | |
| repo | No | Bitbucket repo slug. | |
| pr_id | No | Pull request id. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is a non-read-only, non-idempotent mutation. The description adds the behavioral nuance that this is a general comment (not inline), which helps set expectations about the comment's scope. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with the first sentence front-loading the main purpose and scope, and the second sentence offering a clear alternative. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple nature of the tool, full schema coverage, and annotations, the description covers purpose, scope, and alternatives well. The lack of an output schema is mitigated by the fact that return values are not critical for a comment-posting tool. Sibling differentiation is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all four parameters (body, repo, pr_id, workspace) having meaningful descriptions in the schema. The tool description does not add parameter-specific details, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Post') and the resource ('a general comment on a pull request'), explicitly noting it is not tied to a specific file or line. It also distinguishes the tool from the sibling add_pr_inline_comment, making purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool (general comments) and when not to (inline comments), directing users to add_pr_inline_comment as an alternative. This is exactly the kind of usage guidance expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_pr_inline_commentAdd PR inline commentA
Post a comment on a specific file and line within a pull request's diff. Use get_pr_diff first if you need to confirm line numbers are present in the diff. For general PR comments, use add_pr_comment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Comment body (Markdown). | |
| line | Yes | Line number (1-based). | |
| path | Yes | Repo-relative file path. | |
| repo | No | Bitbucket repo slug. | |
| side | No | Which side of the diff to anchor to. Default `new` (the PR's version). | |
| pr_id | No | Pull request id. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate mutating (readOnlyHint=false) and non-destructive (destructiveHint=false). The description adds the critical behavioral nuance that the comment anchors to a specific diff line and that line numbers must exist in the diff, going beyond annotation basics. It doesn't detail side effects like notifications or edits, but no contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The first sentence states the action, the second provides usage guidance. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a straightforward mutation tool with good schema coverage and annotations, the description covers the essential context: what it does, when to prepare with `get_pr_diff`, and how it differs from `add_pr_comment`. With no output schema, the description adequately supports correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for all 7 parameters, setting a baseline of 3. The description adds value by explaining the semantics of `line` ('confirm line numbers are present in the diff') and implicitly mapping 'specific file and line' to `path` and `line` parameters, providing guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Post a comment on a specific file and line within a pull request's diff') with a clear verb and resource. It distinguishes itself from the sibling `add_pr_comment` (general comments) and other comment-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool versus alternatives: 'Use `get_pr_diff` first if you need to confirm line numbers are present in the diff. For general PR comments, use `add_pr_comment`.' This is direct and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_prCreate PRA
Open a new pull request. source_branch defaults to the current git branch when run from inside a checkout. destination_branch defaults to the repository's configured main branch on Bitbucket. description is interpreted as Markdown. reviewers is a list of Bitbucket account UUIDs (including the curly braces).
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| title | Yes | PR title. | |
| reviewers | No | Reviewer account UUIDs (e.g. `{abcd-...}`). | |
| workspace | No | Bitbucket workspace (slug). | |
| description | No | PR description (Markdown). | |
| source_branch | No | Source branch name. Defaults to the current git branch. | |
| destination_branch | No | Destination branch name. Defaults to the repo's main branch. | |
| close_source_branch | No | If true, the source branch is deleted on merge. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation and not destructive. The description adds valuable behavioral details beyond the schema, such as branch default behavior, Markdown interpretation, and the requirement for UUIDs with curly braces. This provides useful context on how the tool behaves in different scenarios.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action. Each clause adds necessary detail about defaults, Markdown, and reviewers, with no fluff. It is a single dense sentence that earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers purpose and parameter details, it leaves a gap about how the tool identifies the repository when not run from a checkout. Only 'title' is required in the schema, and the description does not clarify whether workspace/repo can be inferred or are necessary in other contexts. This ambiguity could lead to incorrect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description largely echoes schema descriptions (e.g., default branches, Markdown). It adds a small nuance about 'when run from inside a checkout' and 'configured main branch,' but this is marginal. The baseline of 3 is appropriate because the schema already documents all parameters well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Open a new pull request,' a specific verb and resource that clearly distinguishes it from sibling tools like update_pr or get_pr. This explicitly states what the tool does and leaves no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context is clear: it creates a new PR, as opposed to the other siblings. However, it does not explicitly mention when not to use it or mention alternatives. The defaults for branches provide useful context, but the description could have stated 'use this instead of update_pr' or similar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_build_statusGet build statusARead-onlyIdempotent
Answer "is this commit green?" in one call, using Bitbucket's commit build statuses (Pipelines results plus anything else that posts a status). Pass commit (a SHA) or pr_id; with neither, it uses the current checkout's HEAD. verdict is FAILED / INPROGRESS / STOPPED / SUCCESSFUL / NO_STATUSES. NO_STATUSES means nothing posted a status — check list_pipelines before concluding a build did not run.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| pr_id | No | Pull request id. | |
| commit | No | Commit SHA. Defaults to the checkout's HEAD. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false, so the safety profile is covered. The description adds valuable behavior: the exact verdict enum values and the meaning of NO_STATUSES, which is not in the schema. This extends beyond annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: purpose first, then usage, then verdict values, then the NO_STATUSES caveat. Every sentence contributes essential information, and the most critical usage points are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explains the verdict values and their semantics. It also addresses the common pitfall of interpreting NO_STATUSES. For a simple read-only status lookup, it covers everything needed to call the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds clarification that commit and pr_id are mutually exclusive options, and that omitting both uses HEAD — a nuance not fully captured by the schema alone (schema only mentions commit defaults to HEAD). This pushes it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately answers 'is this commit green?' and explicitly states the mechanism (Bitbucket commit build statuses). It distinguishes itself from siblings by referencing list_pipelines as an alternative for the NO_STATUSES case, making its purpose unique and clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit instructions on how to select the target: pass commit or pr_id, and defaults to HEAD if neither is given. It also tells the agent when to fall back to list_pipelines (when verdict is NO_STATUSES), giving clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pipeline_step_logGet pipeline step logARead-onlyIdempotent
Fetch the log output of a pipeline step. pipeline_uuid accepts either a pipeline UUID or a plain build number (e.g. 27419); UUIDs work with or without curly braces. Omit step_uuid to get the first failed step's log (or the last step when everything passed). Use tail_lines when you only need the end of the log — that is where failures are. Output is capped at max_bytes (default 100 KB), keeping the end of the log. If you only need whether a step passed, use list_pipelines instead — it returns step state without any log.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| max_bytes | No | Maximum log bytes to return, keeping the end. Default 100000. | |
| step_uuid | No | Step UUID. Defaults to the first failed step, else the last step. | |
| workspace | No | Bitbucket workspace (slug). | |
| tail_lines | No | Return only the last N lines of the log. | |
| pipeline_uuid | Yes | Pipeline UUID or build number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint: false. The description adds valuable behavioral context beyond these: output is capped at max_bytes (default 100 KB) keeping the end, tail_lines returns last N lines, and the default behavior for step_uuid. This enriches the agent's understanding without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded. It leads with the core purpose, then explains parameter behaviors, and ends with an alternative tool. Every sentence provides distinct value, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, 1 required, and no output schema, the description covers all critical aspects: defaults, limits, acceptance criteria for pipeline_uuid, and alternative tools. Nothing an agent needs to correctly call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. However, the description adds substantial meaning: pipeline_uuid accepts build numbers and curly braces, step_uuid has a default based on failure state, tail_lines and max_bytes have specific behaviors. This goes beyond the schema descriptions, making the tool far more usable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches log output of a pipeline step, with a specific verb+resource. It distinguishes itself from siblings by explicitly naming list_pipelines as an alternative for step state, avoiding ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: when to use tail_lines, when to omit step_uuid (to get first failed step), and when to prefer list_pipelines instead. It names the alternative and the condition for selecting it, leaving no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prGet PRARead-onlyIdempotent
Fetch a Bitbucket pull request's metadata (title, state, author, branches, description, URL).
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| pr_id | No | Pull request id. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is well-covered. The description adds a list of metadata fields returned, which is useful, but it does not disclose any additional behavioral aspects like error handling, auth requirements, or rate limits. The added context is moderate, not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that immediately states the action and the resource. No fluff or redundant information; every word contributes to understanding the tool's purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only metadata fetch, the description is fairly complete. It explicitly lists the return fields, which serves as a mini output specification since no output schema exists. However, it omits edge-case behaviors like what happens if the PR doesn't exist, and it doesn't clarify parameter optionality (schema shows all optional). Still, it covers the core expectations well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema describes all three parameters (repo, pr_id, workspace) with 100% coverage, so the description doesn't need to add parameter details. It also doesn't, relying on the schema to provide the necessary semantics. Baseline 3 is appropriate given the schema's thoroughness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and identifies the exact resource ('Bitbucket pull request's metadata'), listing the key fields returned (title, state, author, branches, description, URL). This clearly distinguishes it from sibling tools like list_prs or get_pr_diff, which serve different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for retrieving a single pull request's metadata, but it does not explicitly state when to use this tool over alternatives or any exclusions. For example, it doesn't mention that list_prs should be used for multiple PRs or that get_pr_diff is for changes. Guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pr_diffGet PR diffARead-onlyIdempotent
Fetch the unified diff for a pull request. For a large PR, start with stat_only: true to see which files changed and how big the diff is, then pass paths to fetch only the parts you need. Output is capped at max_bytes (default 100 KB) and the tail is dropped with a note when it overflows.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| paths | No | Limit the diff to these files or directories (repo-relative; a directory matches everything under it). | |
| pr_id | No | Pull request id. | |
| max_bytes | No | Maximum diff bytes to return. Default 100000. | |
| stat_only | No | Return a per-file summary (status, lines added/removed) plus totals instead of the diff text. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint false), the description reveals two important behaviors: the output is capped at max_bytes and the tail is dropped with a note when it overflows, and stat_only:true returns a per-file summary instead of the diff text. These are critical user-facing traits that are not inferable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero wasted words. The first sentence states the core purpose; the second provides actionable usage guidance and a critical limiter (max_bytes). Information is front-loaded and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has six optional parameters, no output schema, and no nested objects, the description covers most concerns an agent would have: how to avoid large diffs, the cap and its effect, and the distinction between summary and full diff. It doesn't detail the exact format of the stat_only summary, but that's a minor gap. The absence of required parameters is addressed indirectly by the tool's design, though not explicitly clarified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes all six parameters (100% coverage), so the baseline is 3. However, the description adds meaning beyond the schema by explaining how to combine stat_only and paths for large PRs (a workflow) and by noting the default max_bytes. It gives practical guidance on parameter usage, justifying a slight bump.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch the unified diff for a pull request.' This clearly states the tool's function and distinguishes it from sibling tools like get_pr (which retrieves PR metadata) and list_prs (which lists PRs). The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on how to handle large PRs: start with stat_only:true, then use paths to fetch specific parts. It also mentions the max_bytes cap and tail-drop behavior, which are practical usage constraints. It does not name alternative tools because no direct alternative exists, but the provided strategy is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pipelinesList pipelinesARead-onlyIdempotent
Find Bitbucket Pipelines builds and their per-step pass/fail state. Scope it with build_number (exact build), commit (SHA, short or full), branch, or pr_id — with none of those it uses the PR for the current branch. PR lookups do not require the repo to have a pull-requests: trigger: when no pipeline is attributable to the PR, this falls back to the most recent pipelines on the PR's source branch and says so in match and note. match: "none" means no pipeline ran at all — distinct from a fallback. Steps include their UUIDs, so this is where you get the arguments for get_pipeline_step_log.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| limit | No | Maximum number of pipelines to return, newest first. Default 5. | |
| pr_id | No | Pull request id. | |
| branch | No | Branch name to list pipelines for. | |
| commit | No | Commit SHA (short or full) to find pipelines for. | |
| workspace | No | Bitbucket workspace (slug). | |
| build_number | No | Fetch one specific build by its build number (e.g. 27419). | |
| include_steps | No | Include each pipeline's steps. Default true; set false for a cheaper answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, and non-destructive traits. The description adds valuable behavioral context: the fallback to source-branch pipelines when no pipeline is attributable to the PR, the semantics of the match field ('none' vs fallback), and that steps include UUIDs used by get_pipeline_step_log. This exceeds the safety profile and explains edge cases without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four dense sentences with no fluff. It leads with the primary purpose, moves to scoping, then edge-case behavior, and finally a cross-reference to a sibling tool. Every sentence adds information; none are redundant or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no required parameters and no output schema, the description covers everything an agent needs: scoping variants, default behavior, fallback semantics, meaning of match and note, and the link to step logs. It's self-sufficient for correct invocation and interpretation of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description adds meaning beyond that by explaining how parameters interact (e.g., 'with none of those it uses the PR for the current branch'), that commit accepts short or full SHAs, and that include_steps controls cost with a default true. This goes beyond simple parameter listings, so it earns above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Find') and resource ('Bitbucket Pipelines builds'), and clarifies the output ('per-step pass/fail state'). It names the scoping parameters and even routes to a sibling tool (get_pipeline_step_log), so an agent can distinguish it from other pipeline-related tools without reading their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly enumerates when to use each scoping parameter (build_number, commit, branch, pr_id), describes the default behavior when none are given (PR of current branch), and explains the fallback logic and the distinction between match: 'none' and a fallback. It also tells the agent to use get_pipeline_step_log when step logs are needed, providing clear guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pr_commentsList PR commentsARead-onlyIdempotent
List all comments on a pull request, including general and inline (file+line) comments. Returns comments sorted oldest-first.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| limit | No | Maximum number of comments to return. Default 100. | |
| pr_id | No | Pull request id. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims 'List all comments' but the schema includes a limit parameter defaulting to 100, making 'all' misleading without mentioning pagination. While annotations correctly indicate readOnlyHint and idempotentHint, the description adds a flawed scope assertion and omits the default limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the action and scope, the second specifies sorting. There is no redundant phrasing or filler, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without an output schema, the description provides only a minimal return description ('sorted oldest-first') and fails to reconcile the limit parameter with the 'all' claim. It does not describe response structure or pagination, leaving agents to infer too much about the actual result set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are fully described in the schema (100% coverage), so the description adds no additional parameter meaning. It does not mention limit, repo, workspace, or pr_id, but the schema already handles those, giving a baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the action ('List'), the resource ('comments on a pull request'), and adds discriminating detail about including both general and inline comments. This distinguishes it from sibling comment-modification tools like add_pr_comment and reply_to_pr_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it obvious this is for fetching comments rather than modifying them, but it does not explicitly mention exclusions or alternative tools. Since sibling names like add_pr_comment and resolve_pr_comment clearly indicate other use cases, the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_prsList PRsARead-onlyIdempotent
List pull requests in a Bitbucket repository. Filter by state, author UUID, or branch. Returns up to limit results sorted newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| limit | No | Maximum number of PRs to return. Default 20. | |
| state | No | PR state filter. Default OPEN. | |
| author | No | Author UUID filter. | |
| branch | No | Source branch filter. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, covering safety. The description adds useful behavioral context: it returns results sorted newest first and respects the `limit` parameter. It does not mention authentication, rate limits, or pagination beyond the limit, but the annotations significantly reduce the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, directly front-loaded with the core purpose, and every clause adds value. No fluff or irrelevant details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list operation with no output schema, the description covers the essential behavior: scope, filters, limit, and sort order. It does not describe the response object fields, but given the openWorldHint and the standard nature of Bitbucket PR data, this is sufficient. Slightly less complete than the ideal because it doesn't mention alternatives or edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter already has a clear description. The tool description restates that filtering is possible by state, author UUID, or branch, but does not add new meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('pull requests in a Bitbucket repository'), and the scope (filterable by state, author, or branch). It effectively distinguishes itself from sibling tools like get_pr (single PR) and create_pr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing PRs with filters but does not explicitly state when to prefer this tool over alternatives like get_pr for a single PR or list_pr_comments for comments. There are no exclusions or when-not-to-use guidance, leaving the context implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_pr_commentReply to PR commentA
Reply to an existing PR comment, creating a threaded reply. For inline comments, the path and line are inherited from the parent — do not use add_pr_inline_comment to reply, since that posts a sibling comment instead of a threaded reply.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Reply body (Markdown). | |
| repo | No | Bitbucket repo slug. | |
| pr_id | No | Pull request id. | |
| workspace | No | Bitbucket workspace (slug). | |
| comment_id | Yes | ID of the comment to reply to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate the tool is a non-read-only, non-destructive write operation. The description adds valuable behavioral context: for inline comments, path and line are inherited from the parent comment. This explains threading semantics beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, followed by targeted guidance about a potential misuse. No redundant or fluff content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple reply tool, the description covers purpose, usage, and the key threading behavior. It lacks explicit return value details, but no output schema is present and the description sufficiently enables correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for all five parameters, so the baseline is 3. The description adds a note about comment_id's role in threading and parent inheritance, but it does not elaborate on other parameter formats or values beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb 'reply' and resource 'PR comment' with the outcome 'threaded reply.' It explicitly distinguishes itself from the sibling tool add_pr_inline_comment, clarifying that this tool creates a threaded reply rather than a sibling comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use context: reply to an existing comment to create a threaded reply. It also provides an explicit exclusion: do not use add_pr_inline_comment because that posts a sibling comment, naming the alternative and its consequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_pr_commentResolve PR commentAIdempotent
Mark a PR comment as resolved or unresolved. Defaults to resolved=true. Use list_pr_comments to see current resolution state.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| pr_id | No | Pull request id. | |
| resolved | No | True to mark resolved (default), false to unresolve. | |
| workspace | No | Bitbucket workspace (slug). | |
| comment_id | Yes | ID of the comment to (un)resolve. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds the default value (resolved=true) and the ability to unresolve, which is useful. Beyond that, it does not disclose additional behavioral traits (e.g., permissions, side effects) but the annotations cover the safety profile adequately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences. The first sentence states the core action, and the second provides the default and a useful pointer to list_pr_comments. Every word earns its place, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and all parameters well-documented in the schema, the description covers the essential aspects: what the tool does, the default behavior, and how to check current state. It could mention edge cases or prerequisites, but for a simple mutation tool, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description does not add much beyond the schema. The default value for `resolved` is already in the schema ('True to mark resolved (default), false to unresolve'), so the description's mention of 'Defaults to resolved=true' is redundant. No extra parameter insights are provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Mark a PR comment as resolved or unresolved.' This is a specific verb (mark) with a specific resource (PR comment) and state change. It distinguishes itself from sibling tools like add_pr_comment and reply_to_pr_comment, which create or reply to comments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for usage: it sets a comment's resolution state with a default. It also directs users to list_pr_comments to check current state, which is helpful. However, it does not explicitly mention alternatives or when not to use the tool, but the clarity of purpose and the reference to list_pr_comments give sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_pipelineRun pipelineADestructive
Start a Bitbucket pipeline — a re-run of a branch's build, or a definition from the custom: section of bitbucket-pipelines.yml. branch defaults to the current git branch; commit pins the build to a specific SHA instead of the branch tip. Consumes build minutes and can deploy, so confirm with the user before running a custom pipeline you did not pick out together. Requires the pipeline:write OAuth scope (re-run bitbucket-mcp setup if the server was set up before that scope existed).
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| branch | No | Branch to build. Defaults to the current git branch. | |
| commit | No | Commit SHA to build. Defaults to the branch tip. | |
| variables | No | Variables to pass to the build. | |
| workspace | No | Bitbucket workspace (slug). | |
| custom_pipeline | No | Name of a definition under `custom:` in bitbucket-pipelines.yml. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description adds significant context: it consumes build minutes, can deploy, and requires a specific OAuth scope. It also warns about the need for user confirmation for custom pipelines. This enriches the agent's understanding of side effects and prerequisites, which is exactly what the dimension rewards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense: it front-loads the core purpose, then explains defaults, then warns about side effects and required scope. Every sentence earns its place, with no room for fluff. The three-sentence structure is well-organized and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, all documented in the schema, and no output schema, the description covers the key behavioral points: what it does, when to use it, what to watch out for (build minutes, deployments, user confirmation), and a concrete prerequisite (OAuth scope). An agent has everything needed to invoke the tool correctly and safely without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are already documented in the schema. The description repeats some key semantics (e.g., branch defaults to current git branch, commit pins to SHA) and mentions custom_pipeline, but it does not add meaning beyond what the schema descriptions already state. Since the schema carries the load, a baseline of 3 is appropriate; the description adds marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (start a Bitbucket pipeline) and specifies two distinct modes: re-running a branch build or executing a definition from the custom section of bitbucket-pipelines.yml. This is a specific verb+resource with enough detail to distinguish it from the sibling tools (e.g., list_pipelines, get_pipeline_step_log) without needing to inspect each one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use the tool and when to exercise caution: it warns to confirm with the user before running a custom pipeline not selected together, and it states the required OAuth scope (pipeline:write) plus a rerun of setup if needed. It also clarifies the default behavior for branch and commit, showing how to control the build target. This level of context is ample for an agent to make the correct call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pr_draft_stateSet PR draft stateAIdempotent
Mark a pull request as draft or ready for review. Pass draft: true to convert to draft, or draft: false to mark ready.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| draft | Yes | True to mark as draft, false to mark ready for review. | |
| pr_id | No | Pull request id. | |
| workspace | No | Bitbucket workspace (slug). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a write operation (readOnlyHint: false), idempotent, and not destructive. The description adds the two-state behavior (draft vs. ready) but does not disclose additional context like auth needs, effects on existing state, or response shape. It aligns with annotations, so no contradiction, but adds minimal value beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise, front-loaded sentence that clearly communicates the core purpose and parameter usage. It contains no fluff or redundant wording, earning a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the schema providing full parameter descriptions, the description covers the essential behavior. It lacks details on how to identify the PR (e.g., pr_id/workspace) but those are in the schema. The absence of an output schema is not a gap here since the action is a state change.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the meaning of the 'draft' parameter by explaining true/false mappings, but this is already present in the schema property description. No additional parameter nuance is provided beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's specific action: 'Mark a pull request as draft or ready for review.' It uses a specific verb ('Mark') and resource ('pull request'), and distinguishes itself from siblings like 'update_pr' by focusing solely on draft state. The directional semantics (draft true/false) are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when toggling draft state) but does not provide explicit guidance on when to use it over alternatives like 'update_pr', nor does it mention exclusions or prerequisites. There is no 'when to use vs alternatives' text, which is a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_prUpdate PRA
Update a pull request's title, description (the PR Overview), and/or reviewers. Pass any combination — fields you omit are left unchanged. The description is interpreted as Markdown. reviewers replaces the full reviewer list with the given Bitbucket account UUIDs (including the curly braces); pass an empty array to clear all reviewers.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | No | Bitbucket repo slug. | |
| pr_id | No | Pull request id. | |
| title | No | New PR title. | |
| reviewers | No | Reviewer account UUIDs (e.g. `{abcd-...}`). Replaces the entire reviewer list. Pass `[]` to clear all reviewers. | |
| workspace | No | Bitbucket workspace (slug). | |
| description | No | New PR description (Markdown). Pass an empty string to clear it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds critical behavioral detail beyond annotations: omitted fields are left unchanged, description is Markdown, and reviewers replace the full list including the UUID curly-brace format. These are non-obvious traits that significantly aid correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences with the purpose front-loaded. Every sentence delivers operational value—no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter optional-input tool without an output schema, the description captures all essential behaviors: partial updates, Markdown handling, and reviewer replacement semantics. It doesn't discuss response/error details, but that is less critical for an update tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the baseline is 3, but the description adds global semantics like 'fields you omit are left unchanged' and 'pass an empty array to clear all reviewers,' which enrich the meaning of omitted and empty values. This elevates it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Update a pull request's title, description (the PR Overview), and/or reviewers,' clearly identifying the action and the specific resource fields. This distinguishes it from sibling tools like get_pr (read-only) and create_pr.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states 'Pass any combination — fields you omit are left unchanged,' which gives a clear usage rule. It doesn't explicitly mention alternatives, but the partial-update semantics are a strong contextual signal for when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.6- Added
get_build_status - Changed
get_pipeline_step_log5 fields changed- added
Input schema / properties / max_bytesAdded value: +{ + "description": "Maximum log bytes to return, keeping the end. Default 100000.", + "maximum": 5000000, + "minimum": 1000, + "type": "integer" +} - changed
Input schema / properties / pipeline_uuid / descriptionPrevious value: -"Pipeline UUID."New value: +"Pipeline UUID or build number." - changed
Input schema / properties / step_uuid / descriptionPrevious value: -"Pipeline step UUID."New value: +"Step UUID. Defaults to the first failed step, else the last step." - added
Input schema / properties / tail_linesAdded value: +{ + "description": "Return only the last N lines of the log.", + "maximum": 100000, + "minimum": 1, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "pipeline_uuid", - "step_uuid" -]New value: +[ + "pipeline_uuid" +]
- Changed
get_pr_diff3 fields changed- added
Input schema / properties / max_bytesAdded value: +{ + "description": "Maximum diff bytes to return. Default 100000.", + "maximum": 5000000, + "minimum": 1000, + "type": "integer" +} - added
Input schema / properties / pathsAdded value: +{ + "description": "Limit the diff to these files or directories (repo-relative; a directory matches everything under it).", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / stat_onlyAdded value: +{ + "description": "Return a per-file summary (status, lines added/removed) plus totals instead of the diff text.", + "type": "boolean" +}
- Removed
get_pr_pipeline_status - Added
list_pipelines - Added
run_pipeline
13 tool updates
v0.1.5- First observed
add_pr_comment - First observed
add_pr_inline_comment - First observed
create_pr - First observed
get_pipeline_step_log - First observed
get_pr - First observed
get_pr_diff - First observed
get_pr_pipeline_status - First observed
list_pr_comments - First observed
list_prs - First observed
reply_to_pr_comment - First observed
resolve_pr_comment - First observed
set_pr_draft_state - First observed
update_pr
TDQS
Scored across 15 tools
Every tool targets a distinct action and resource (e.g., general vs. inline vs. threaded replies for PR comments, pipeline listing vs. step logs vs. build status). Descriptions explicitly cross-reference related tools to prevent misselection, such as clarifying when to use list_pipelines over get_build_status.
All tool names follow a consistent verb_noun snake_case convention (e.g., get_pr, list_prs, add_pr_comment, run_pipeline). The verbs are clear and reused predictably across resource types, and pluralization follows natural language without breaking the pattern.
With 15 tools, the server covers a broad but focused domain—pull requests and pipelines. Each tool provides a distinct capability, and the count sits at the upper boundary of the optimal 3–15 range without feeling bloated or sparse.
The surface covers the full PR lifecycle (create, read, update, draft state, diff, comments) and pipeline operations (list, logs, run, build status). There are no obvious dead ends; even edge cases like large diffs and pipeline fallback behavior are addressed with dedicated parameters.
Maintenance
Related MCP Connectors
The Buildkite MCP server exposes Buildkite product data (pipelines, builds, jobs, and test data) to AI tools, editors, and agents through the Model Context Protocol. It provides capabilities including pipeline creation and management, build monitoring with specialized tools like 'wait_for_build', efficient log querying using Apache Parquet conversion and caching, and OAuth-based authentication for both read-write and read-only access to Buildkite's REST API.
A Model Context Protocol (MCP) application for automated GitHub PR analysis and issue management.…
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
A Model Context Protocol server for Wix AI tools
Related MCP Servers
- AlicenseDqualityDmaintenanceA Model Context Protocol server that enables AI assistants to interact with Bitbucket repositories, pull requests, and other resources through Bitbucket Cloud and Server APIs.33,181165MIT
- AlicenseBqualityDmaintenanceAn MCP server that enables interaction with Bitbucket repositories through the Model Context Protocol, supporting both Bitbucket Cloud and Server with features for PR lifecycle management and code review.195,58928MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol server that integrates Cursor IDE with Bitbucket Cloud, allowing developers to fetch repository information and commit data directly from their Bitbucket workspace.15394MIT
- AlicenseNot gradedqualityBmaintenanceA Model Context Protocol (MCP) server that provides tools for interacting with Bitbucket repositories, pull requests, issues, and more.31ISC