Bitbucket MCP Server
You can use this MCP server to interact with Bitbucket repositories, branches, files, commits, and pull requests on behalf of an AI agent.
Browse projects/repositories and list branches or directory contents.
Read file content, including server-side line windows or full-file/tail reads.
List and inspect pull requests, including metadata, comments, tasks, changed files, reviewer status, and merge info.
Create, update, merge, decline, and list pull requests, including cross-repository PR dashboards.
Get raw unified PR diffs with file/glob scoping and context controls.
Add comments (general, threaded, inline, code suggestions, or tasks) and edit/delete/resolve/reopen/convert comments and tasks.
Set your review status: approve, request changes, or clear approval.
List PR commits and branch commits, and inspect commit diffs or changed-file lists.
Delete branches with optional expected-head compare-and-swap.
Use safety controls from the README such as read-only mode, disabled tools, protected branches, and rate-limit pacing.
Provides tools for interacting with the Bitbucket API, supporting both Bitbucket Cloud and Bitbucket Server. Enables management of pull requests (creating, updating, listing, approving, commenting), handling code reviews, working with branches, and viewing diffs.
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 MCP Serverlist my open pull requests in the web-app repository"
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 Server
MCP server for Bitbucket — built for AI coding agents that need to work with remote repositories as if they were local clones: grep-fast code search, windowed file reads, compact token-efficient responses, and a transport layer that never trips Bitbucket's rate limits.
Supports Bitbucket Server / Data Center (primary target) and Bitbucket Cloud.
Why v3
v2 | v3 | |
Content search in a repo | 1 listing + up to 3,000 file GETs | 1 archive call cold, 0–1 calls warm |
Search completeness | silently partial under server throttling | complete, with every cap reported |
PR diff tokens | per-line JSON (~4× larger) | raw unified diff |
Read a 100-line window | 2 calls, full file transferred | 1 call, window only |
Blame a window of a huge file | up to 100 calls | 1 call |
Rate-limit safety | none (burst → 429/403) | client-side pacing sized to DC's limiter |
Tools | 33 | 25 (~30% less definition context) |
Measured on a live Data Center instance: a repeated content search went from 519 API calls / ~7s (finding 1 of 8 real matches under burst throttling) to 0 API calls / 24ms finding all 8. Full design and verified API research: REVAMP_PLAN.md.
Related MCP server: bitbucket-mcp-server
Tools (25)
Search (search) — Server/DC only
grep— search file contents with full regex, any branch, like ripgrep on a local clone. Onearchivedownload per repo+commit, streamed in constant memory, cached in-process, freshness-checked every call (responses carryas_of <commit>). Omitqueryfor filename-only glob listing. Modes:content,files,count;glob,path,context,case_insensitive,max_results.search_code— index-backed exact-term search across a whole project in one call (default branch only, case-insensitive, no regex, files <512 KiB, ~1000-result window). Best for cross-repo identifier lookups; usegrepfor everything else.search_repositories— find repos by name/description.
Pull requests (pr_core)
get_pull_request— metadata + reviewer status + merge info in 1 call;include_comments/include_file_changes(default true),include_tasks,comment_limit. Returnsversionfor follow-up mutations.list_pull_requests— repo-scoped; omitrepository(Server) for your PRs across all repos in one call (rolefilter).create_pull_request,update_pull_request,merge_pull_request,decline_pull_request— all mutations acceptversionfrom a prior read (saves a fetch; auto-refetch + retry once on 409 conflicts).
Comments & tasks (pr_comments)
add_comment— general, threaded reply, inline (file_path+line_number, orcode_snippetauto-resolution), codesuggestion, or task (severity: "BLOCKER", Server). Attachments upload via theattachmentsparam (Server).manage_comment—edit/delete/resolve/reopen/to_task/to_commenton any comment or task, one call withversion.
Review (pr_review)
get_pull_request_diff— raw unified diff text; scope withfile_path(server-side),include_patterns/exclude_patterns,context_lines,ignore_whitespace.set_review_status—APPROVED/NEEDS_WORK/UNAPPROVED(mutually exclusive; one call).
Commits (commits)
list_pr_commits,list_branch_commits(server-sidesince-rev/mergesfilters; bounded page-walk for client-sideauthor/until/search),get_commit_detail(unified diff, ordetail: "files"for the changed-file list without bodies).
Branches (branches)
list_branches,get_branch(branch + its PRs),delete_branch(expected_headskips the lookup call).
Files (files)
get_file_content— windowed server-side:start_line/line_counttransfer only that window (≤5000 lines/call).full_content/ negativestart_linefor whole-file or tail reads.get_file_blame— commit-span blame for a line window in 1 call (Server).list_directory_content— paginated, compact.
Attachments (attachments, Server) / Discovery (discovery)
manage_attachments(downloadcapped,delete),list_projects,list_repositories.
Output conventions
Bulk content (diffs, files, grep results) is plain text, not JSON-escaped strings; lists are compact JSON without pretty-printing. Dates are ISO-8601.
Content-derived responses carry
as_of <commit>so the agent knows exactly which state it saw.Truncation is never silent — every cap produces an explicit warning with continuation guidance (
next_start, "narrow the glob", etc.).Mutable entities include
version, so mutations don't need a re-read.
Installation
Requires Node.js 22 or newer (18 and 20 are end-of-life and no longer receive security fixes).
Using npx (recommended)
{
"mcpServers": {
"bitbucket": {
"command": "npx",
"args": ["-y", "@nexus2520/bitbucket-mcp-server"],
"env": {
"BITBUCKET_USERNAME": "your.username",
"BITBUCKET_TOKEN": "your-http-access-token",
"BITBUCKET_BASE_URL": "https://bitbucket.yourcompany.com"
}
}
}
}For Bitbucket Cloud use BITBUCKET_APP_PASSWORD instead of BITBUCKET_TOKEN (and omit BITBUCKET_BASE_URL).
Credential walkthroughs: Cloud app password · Server/DC HTTP token.
From source
git clone https://github.com/pdogra1299/bitbucket-mcp-server.git
cd bitbucket-mcp-server
npm install && npm run build
# point your MCP config at: node <repo>/build/index.jsConfiguration
Every numeric policy is environment-tunable — nothing is hard-coded. The full table lives in src/config/index.ts (CONFIG_REFERENCE). The ones that matter most:
Variable | Default | Purpose |
|
| Client-side sustained request rate (DC's per-user refill is 5/s). |
|
| Burst capacity (DC's server bucket is 60) |
|
| Max in-flight requests across all tools |
|
| In-memory grep cache budget. |
|
| Files larger than this are scanned but not cached |
|
| Branch→SHA freshness memo; |
|
| Abort archive scans past this many extracted MB (falls back to bounded per-file scan) |
|
| Per-request timeout |
| all | Comma-separated groups to expose (validated, enforced at dispatch, fails closed) |
|
| Hide and refuse every state-changing tool (create/update/merge/decline PR, comments, review status, delete branch, attachment delete) |
| — | Comma-separated tool names to hide and refuse regardless of group |
| — | Branch names/globs ( |
| unset = uploads disabled | The only directory attachment uploads may read from (realpath-confined, regular files only) |
|
| Size caps for attachment upload / download |
|
| Wall-clock budget per content scan; exceeding it returns marked PARTIAL results |
|
| Lines longer than this are counted and reported, not regex-scanned (bounds per-line regex cost on minified files) |
The grep engine's guarantees
Memory-bounded: the archive is streamed, never buffered whole; the cache is a hard byte budget with LRU eviction and content-hash dedup across branches. Worst case = budget + a few MB transient.
Fresh: every query re-resolves the branch head; a moved branch can never serve stale results. Merges/deletes made through this server invalidate immediately.
Complete: cache limits never reduce scan coverage — oversized files are still scanned; only true binaries are skipped, and they're counted in the output.
Rate limiting
All requests flow through a token bucket sized to Bitbucket DC's per-user limiter, so 429s are avoided rather than retried-after. If your instance throttles hard anyway, the error message says exactly what to do — the durable fix is asking a Bitbucket admin for a rate-limit exemption for the service account (Admin → Rate limiting → Exemptions), then setting BITBUCKET_RATE_LIMIT_RPS=0.
Security
This server executes tool calls whose arguments come from an LLM, often with a write-capable token. The following controls are built in:
Least privilege by configuration.
BITBUCKET_READ_ONLY=trueremoves every mutating tool from bothtools/listand dispatch — recommended for autonomous agents that only need to read PRs, diffs and code.BITBUCKET_DISABLED_TOOLSdrops individual tools;BITBUCKET_PROTECTED_BRANCHESblocksdelete_branch/merge_pull_requestagainst named branches or globs. Every tool carries MCPreadOnlyHint/destructiveHintannotations so clients can gate confirmations.No request steering.
workspace,repository, commit ids, attachment ids and file paths are charset-validated and percent-encoded per URL segment, so a value likePROJ/../../adminorrepo?limit=1000can never change the REST route a fixed-verb tool hits.Attachment uploads are opt-in and sandboxed. Without
BITBUCKET_ATTACHMENT_ROOTtheattachmentsparameter is refused. With it, the real (symlink-resolved) path must stay inside the root, be a regular file, and fit the size cap; every rejection uses one generic message so the tool is not a filesystem existence oracle. Downloads are size-capped too.Regex denial-of-service guard. Caller regexes (
grepquery,search_coderegex_filter) are length-capped, rejected statically when an unbounded quantifier wraps a group with undelimited variable-width repetition ((a+)+,(\w+\s*)*), probed against adversarial inputs under a vm timeout, and every scan runs against a wall-clock deadline (BITBUCKET_GREP_TIMEOUT_MS) with partial results marked, never silent. Lines longer thanBITBUCKET_GREP_MAX_SCAN_LINE_CHARSare skipped and counted. V8's linear-time regexp fallback is enabled at startup as an extra layer.Credential hygiene. Transport errors are normalized to status + message + response headers before they reach handlers; error objects are never logged whole, and log lines are scrubbed for
Authorization-style values. Cloud pagination followsnextURLs only on the configured origin.Dependency floor. Node ≥ 22;
npm run audit:prodmust report zero high/critical advisories for the published tree (enforced in CI).
Recommended deployment for an autonomous agent:
"env": {
"BITBUCKET_READ_ONLY": "true",
"BITBUCKET_PROTECTED_BRANCHES": "main,release/*"
}Writes (comments, approvals, merges) should then run through a separate, human-confirmed server instance or the hosting application's own approval flow.
Migrating from v2
Removed tools and their v3 equivalents (same capabilities, fewer tools):
v2 | v3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Update Claude Code permission allowlists (mcp__bitbucket__*) accordingly. Diff tools now return unified diff text instead of per-line JSON — line numbers come from @@ headers. Full details in CHANGELOG.md.
Development
npm run build # tsc → build/
npm test # build + node --test (unit + snapshot-engine tests)Architecture: src/config (all policy) · src/core (transport, snapshot engine, caches) · src/handlers (tool logic) · src/tools (definitions, guards, registry) · src/formatting (compact output) · src/types (single barrel).
License
MIT
Available Tools
20 toolsadd_commentA
Add a PR comment: general, threaded reply (parent_comment_id), inline (file_path + line_number), code suggestion (suggestion), or task (severity BLOCKER, Server only). code_snippet auto-resolves line_number from exact diff text when line_number is unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| severity | No | BLOCKER creates a task (Server only) | |
| file_path | No | Inline comment file | |
| line_type | No | Default CONTEXT | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| suggestion | No | Replacement code block; needs file_path + line_number | |
| attachments | No | Local files to upload & embed (Server/DC only). Item: path string or {file_path, alt_text?, render?: image|link|auto} | |
| line_number | No | Inline comment line (or use code_snippet) | |
| code_snippet | No | Exact diff line text to locate (whitespace-sensitive) | |
| comment_text | Yes | ||
| match_strategy | No | On multiple snippet matches (default strict) | |
| search_context | No | Disambiguates repeated code_snippet | |
| pull_request_id | Yes | Pull request ID | |
| parent_comment_id | No | Reply to this comment | |
| suggestion_end_line | No | Multi-line suggestion end |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=false, destructive=false, and the description is consistent with a write operation. It adds meaningful operational detail beyond the annotations: Server-only gating for task/attachments, whitespace-sensitivity of code_snippet, and the strict/best match fallback, though it doesn't warn that repeated calls create duplicate comments.
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?
A single compact sentence that front-loads the modes and puts the code_snippet fallback last. It is dense but every clause carries signal; the only slight cost is that the parenthetical detail makes it feel packed.
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 15-parameter mutation with nested objects and no output schema, the description covers the mode-selection logic and the trickiest parameter interaction (snippet-to-line resolution). Remaining detail like attachments is well handled by the 93% schema coverage, so nothing essential 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 coverage is 93%, so the baseline is 3, but the description genuinely adds semantics: severity BLOCKER creates a task, suggestion requires file_path + line_number, and code_snippet auto-resolves line_number from exact diff text. These are cross-parameter relationships the schema alone doesn't make explicit.
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?
States a specific verb (Add) and resource (PR comment) and then enumerates the five distinct comment modes it supports, so an agent can immediately tell this is the creation tool versus the sibling manage_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 mode list effectively explains when to use each variant (general vs threaded reply vs inline vs suggestion vs task) and when to prefer code_snippet over line_number. It stops short of explicitly saying to use manage_comment for editing/deleting an existing comment, which would have fully closed the loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_pull_requestD
Create a pull request.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| reviewers | No | Reviewer usernames | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| attachments | No | Local files to upload & embed (Server/DC only). Item: path string or {file_path, alt_text?, render?: image|link|auto} | |
| description | No | ||
| source_branch | Yes | ||
| destination_branch | Yes | ||
| close_source_branch | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that: no mention of required permissions, whether the source branch must exist, side effects, or error behavior for a five-required-parameter mutation.
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?
It is a single short sentence, so there is no bloat, but this is under-specification rather than conciseness. The one sentence fails to earn its place by conveying anything not already in the name.
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 nine-parameter mutation tool with five required fields, no output schema, and incomplete schema documentation, the description is wholly inadequate. It provides no information about branch handling, reviewers, attachments, or the result of the call.
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 only 44%, and the description mentions no parameters at all. Critical fields like title, description, source_branch, destination_branch, and close_source_branch have no schema descriptions and receive no clarification from the description, leaving the agent to guess semantics.
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 sentence restates the tool name almost verbatim ('Create a pull request' for create_pull_request), giving no scope, target system, or distinguishing detail. It does convey a write action on a pull request resource, but nothing separates it from siblings like update_pull_request or merge_pull_request.
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?
There is no guidance on when to use this versus update_pull_request, merge_pull_request, or decline_pull_request, nor any prerequisite conditions such as branch existence or permissions. The agent must infer everything from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decline_pull_requestADestructiveIdempotent
Decline a pull request, optionally with a comment. Pass version to save a fetch (Server).
| Name | Required | Description | Default |
|---|---|---|---|
| comment | No | Reason for declining | |
| version | No | Entity version from a prior read; supplying it saves a fetch AND makes the write conditional — it fails on concurrent modification instead of overwriting. Omit to write against the latest state (auto-retried once). | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| pull_request_id | Yes | Pull request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds only a minor note that passing version saves a fetch, without explaining side effects such as notification or state transition.
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 short sentences with no wasted language. The core action is front-loaded, and the optional-parameter guidance follows immediately.
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 complete schema coverage and annotations covering destructive/idempotent behavior, the description is sufficient to invoke the tool correctly. It could do slightly more to describe the consequence of declining a pull request, but no output schema exists and the core call semantics are covered.
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 schema already documents all five parameters thoroughly, especially the conditional-write behavior of version. The description reinforces that comment is optional and version saves a fetch, but adds little 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 and resource: 'Decline a pull request.' This clearly distinguishes it from sibling operations such as merge_pull_request, update_pull_request, and create_pull_request.
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 usage is implied by the verb 'Decline,' but the description does not explicitly say when to use this versus merge_pull_request or update_pull_request. It also gives no exclusions or prerequisites beyond the optional comment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_branchADestructiveIdempotent
Delete a branch. Pass expected_head (commit SHA) to skip the lookup call (Server).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| branch_name | Yes | ||
| expected_head | No | Known head SHA (compare-and-swap) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds a genuinely useful behavioral detail — that expected_head is a compare-and-swap that avoids an extra lookup — but says nothing about irreversibility, required permissions, or what happens to open pull requests on the deleted branch.
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, action first, optimization hint second — well front-loaded. The trailing "(Server)" is cryptic noise that slightly undercuts an otherwise lean statement.
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 destructive mutation with no output schema, the description omits failure modes (e.g., what a stale expected_head returns), protection/permission requirements, and consequences for related resources. Annotations carry the safety signal, but an agent still lacks enough to handle errors confidently.
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 75%, with branch_name entirely undescribed in the schema; the description implicitly identifies it as the target. More importantly, it explains the practical benefit of expected_head (skip the lookup) beyond the schema's terse "Known head SHA (compare-and-swap)", which is real added meaning.
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?
"Delete a branch" is a precise verb+resource statement that cleanly separates it from read-oriented siblings like list_branches and get_branch. It does not explicitly name alternatives, but the operation 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 only usage guidance is conditional: pass expected_head to skip a lookup call. There is no statement of when to prefer this over other branch operations, no prerequisites (e.g., branch protection, permissions), and no caution about the destructive nature of the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_branchARead-only
Get a branch with its latest commit and open PRs (include_merged_prs adds merged ones).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| branch_name | Yes | ||
| include_merged_prs | No | Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuine behavioral detail: the payload includes the latest commit and open PRs, and merged PRs are excluded by default unless include_merged_prs is set. It still does not mention result caps, ordering, or behavior when the branch is absent.
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?
A single sentence with no filler, and the core purpose is front-loaded before the parameter note. The trailing parenthetical is slightly compressed but costs nothing in 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?
With no output schema, the description usefully previews the return contents (latest commit, open PRs, merged toggle), which is the main thing an agent needs. Gaps remain around branch_name format and failure behavior, but for a read-only single-entity getter this is close to sufficient.
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 75%, so the schema already documents workspace, repository, and include_merged_prs. The description adds only that include_merged_prs widens results to merged PRs, and says nothing about branch_name (e.g., slashes or default-branch handling), which the schema leaves bare. Baseline 3 applies when the schema carries most of the load.
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 gives a specific verb+resource ('Get a branch') and adds scope beyond the name: it returns the latest commit and open PRs. That distinguishes it from list_branches (plural listing) and list_branch_commits without needing the schema. It stops short of naming a sibling alternative, so not a 5.
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?
Usage is only implied: an agent can infer this is the single-branch detail lookup versus the plural list_branches. There is no explicit when-to-use statement, no prerequisites (e.g., branch must exist), and no mention of alternatives such as get_pull_request for PR-level detail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commit_detailARead-only
Get a commit diff as raw unified diff text, or detail:"files" for just the changed-file list (no diff bodies).
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | Default diff | |
| commit_id | Yes | Commit SHA | |
| file_path | No | Diff one file only | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| context_lines | No | Default 3 | |
| exclude_patterns | No | ||
| include_patterns | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds useful behavioral context by specifying that the default result is raw unified diff text and that detail:"files" omits diff bodies. It does not mention truncation, size limits, or error behavior for missing commits.
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 definition is a single front-loaded sentence with no wasted text. It states the main output and the key mode switch immediately.
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?
The tool has 8 parameters and no output schema, so the description should carry more burden. It covers the core return format and the files-vs-diff distinction, but leaves filtering options, context-line behavior, and file-list output structure unaddressed.
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 75%, so the baseline is 3. The description usefully clarifies the detail enum and default diff behavior, but it does not explain file_path, context_lines, include_patterns, or exclude_patterns beyond what the schema names provide.
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 and resource: get a commit diff. It clearly distinguishes the two output modes, raw diff vs. changed-file list, but does not differentiate this tool from sibling tools such as get_pull_request_diff or list_pr_commits.
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 implies when to use detail:"files" by saying it returns just the changed-file list with no diff bodies. However, it gives no explicit guidance on when to choose this tool over get_pull_request_diff, list_pr_commits, or list_branch_commits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_file_contentARead-only
Read a file. Windowed by default (start_line/line_count fetch ONLY that window server-side; ≤5000 lines per call). full_content=true or negative start_line (tail) fetches the whole file — prefer windows.
| Name | Required | Description | Default |
|---|---|---|---|
| branch | No | Branch (default: default branch) | |
| file_path | Yes | ||
| workspace | Yes | Project key (e.g., PROJ) | |
| line_count | No | ||
| repository | Yes | Repository slug | |
| start_line | No | 1-based; negative = from end | |
| full_content | No | Entire file regardless of size |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already covers the safety profile, so the description adds real value by disclosing a hard cap (≤5000 lines per call), server-side windowing semantics, and tail behavior via negative start_line. It omits error/binary-file behavior and the default window size, which keeps it at 4 rather than 5.
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 tight sentences with the default behavior front-loaded, then the mode switches, then the recommendation. Every clause carries information; nothing is redundant with the schema or annotations.
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 7-parameter read tool with no output schema, the description covers the critical decision points (window vs. full, size limit, tail mode). The main residual gap is the unspecified default window size when neither start_line nor line_count is given.
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 71%, so the baseline is 3; the description earns above that by explaining parameter interaction the schema does not — that start_line/line_count fetch only that window server-side, and that full_content or a negative start_line both trigger whole-file retrieval. It still doesn't define a default line_count or the meaning of edge values.
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?
"Read a file" is a specific verb+resource, and the description immediately qualifies scope with the windowing model, distinguishing it from list_directory_content by making clear it returns file contents rather than listings. It stops short of naming siblings explicitly, so a 4 rather than a 5.
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?
Gives an explicit preference rule ("prefer windows") and states the exact conditions that switch modes: full_content=true or negative start_line. There are no explicit when-not cases against sibling tools, but the mode-selection guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pull_requestARead-only
Get a pull request: metadata, reviewer status, merge info, comments and changed files. Set include_comments/include_file_changes false for a 1-call metadata read; include_tasks lists open/resolved tasks. Response carries version for follow-up mutations.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| comment_limit | No | Max comments embedded (default 20) | |
| include_tasks | No | Embed PR tasks (Server only, default false) | |
| pull_request_id | Yes | Pull request ID | |
| include_comments | No | Embed active comments (default true) | |
| include_file_changes | No | Embed changed-file list (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely new behavioral context: the response carries `version` for follow-up mutations (optimistic concurrency), defaults are togglable for a single-call metadata read, and include_tasks is Server-only. It does not describe pagination behavior for comments beyond the schema's default.
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 dense sentences, zero filler. Content discovery is front-loaded, followed by the cost-saving mode and the `version` follow-up hint, which is an efficient ordering for an agent scanning for both payload shape and next-step affordance.
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, seven parameters and heavy return payload, the description does enough: it names the payload sections and flags the `version` field agents need for mutations. It leaves return-shape structure and comment pagination unstated, which is a modest remaining gap for a read this rich.
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 baseline is 3. The description earns a notch above by explaining the effect of the two include_* flags (a cheaper metadata-only read) and clarifying that include_tasks surfaces open/resolved tasks rather than a raw boolean, which the schema does not convey.
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?
A specific verb-plus-resource opener ('Get a pull request') immediately followed by an enumeration of what comes back: metadata, reviewer status, merge info, comments, changed files. That enumeration distinguishes it from list_pull_requests, but the relationship to get_pull_request_diff is left implicit.
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?
Gives actionable usage direction: 'Set include_comments/include_file_changes false for a 1-call metadata read' tells the agent exactly how to switch into a cheap mode. It never names an alternative tool or an exclusion case (e.g. when to prefer get_pull_request_diff), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pull_request_diffARead-only
Get a PR diff as raw unified diff text (line numbers derive from @@ headers; +/- prefixes mark ADDED/REMOVED). Scope with file_path (server-side) or include/exclude glob patterns.
| Name | Required | Description | Default |
|---|---|---|---|
| file_path | No | Diff one file only | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| context_lines | No | Default 3; 0 = minimal | |
| pull_request_id | Yes | Pull request ID | |
| exclude_patterns | No | Globs to exclude | |
| include_patterns | No | Globs to include | |
| ignore_whitespace | No | Server only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's job is to add context beyond that, and it does: it discloses the return format and how to interpret '@@' headers and +/- prefixes. It omits limits such as truncation on very large diffs or the cost of fetching an unscoped diff, which would matter operationally.
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 dense sentences with no filler; the output-format fact leads and the scoping options follow. Every clause carries information an agent needs.
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, read-only fetch tool with no output schema, the description covers purpose, format interpretation, and scope control. It leaves unaddressed what happens on very large PRs (truncation, pagination) and how include/exclude and file_path interact when combined.
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, and the description earns an extra point by distinguishing file_path as 'server-side' scoping versus glob patterns, implying the globs are applied after retrieval. That is a meaningful semantic distinction the schema's one-line property descriptions do not convey.
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?
States a specific verb and resource ('Get a PR diff') and pins down the exact output form ('raw unified diff text'), which is more precise than a generic 'get' would be. It never names a sibling such as get_pull_request (metadata) or get_file_content, so the boundary is inferable but not 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 second sentence explains how to narrow scope via file_path or include/exclude globs, which is genuinely actionable. It never says when this tool is preferred over get_pull_request or when a diff would be too large to fetch this way, so usage is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_branch_commitsARead-only
List commits on a branch. since (as a rev) and include_merge_commits filter server-side; author/until/search and date-valued since filter client-side over a bounded page walk (noted when more pages exist).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| since | No | ISO date lower bound, or a commit SHA/ref (exclusive) for a server-side range | |
| start | No | Pagination start (default 0) | |
| until | No | ISO date upper bound | |
| author | No | ||
| search | No | Substring in commit message | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| branch_name | Yes | ||
| include_build_status | No | Server only | |
| include_merge_commits | No | Default true |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint=true, so the description carries real weight and delivers: it discloses which filters execute server-side vs client-side over a bounded page walk, and that truncation is signalled when more pages exist. That is meaningful behavioral context an agent could not derive from the schema. It stops short of describing ordering or what a result row contains.
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 dense sentences with no filler, and the core purpose is front-loaded ahead of the filtering caveats. The second sentence is compressed to the point of being slightly telegraphic, but every clause carries information.
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 11-parameter tool with no output schema and only a readOnly annotation, the description covers the trickiest semantics (server vs client filtering, page-walk bounds) well. It leaves gaps on result ordering, how limit/start interact with the bounded walk, and what include_build_status returns, which an agent would have to guess.
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 82%, so the baseline is 3, but the description adds genuine meaning by clarifying that 'since' doubles as a rev/SHA (exclusive) or an ISO date and that only the rev form is server-side, while author/until/search are applied client-side. That distinction changes how an agent should combine filters and is not spelled out per-parameter in 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 opening clause 'List commits on a branch' gives a specific verb and resource, and the required workspace/repository/branch_name trio is implied by the schema. It does not explicitly name siblings like list_pr_commits or get_commit_detail, so the agent must infer that this is branch-scoped rather than PR-scoped, but the resource 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?
Usage is only implied: the description explains filtering mechanics but never says when to pick this over list_pr_commits or get_commit_detail, nor any prerequisites (e.g., that the branch must exist). An agent can reasonably infer 'use for branch history,' but nothing is stated as a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_branchesBRead-only
List branches (most recently modified first on Server).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| start | No | Pagination start (default 0) | |
| filter | No | Name filter | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds one genuinely useful behavioral detail — results are sorted most-recently-modified-first on Server — but says nothing about pagination behavior, total counts, or whether ordering differs on Cloud.
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?
Single short sentence with the key ordering information front-loaded and no filler. The parenthetical "on Server" is slightly cryptic but does not waste space.
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 five parameters, two required, and no output schema, the definition is minimally sufficient — the schema carries the parameters and the annotation carries safety. It still leaves gaps on pagination semantics and what a branch entry looks like, and the Server-only ordering caveat is not fully explained.
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 limit, start, filter, workspace, and repository are all documented in the schema. The description adds no parameter-level meaning beyond that, which is acceptable at this coverage level.
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?
States a clear verb and resource ("list branches"), which is unambiguous. It does not distinguish itself from neighboring tools such as get_branch or list_branch_commits, so an agent must infer the boundary from the 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?
There is no guidance on when to use this versus get_branch (single branch) or list_branch_commits, and no mention of prerequisites or typical contexts. Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_directory_contentBRead-only
List files and directories at a repository path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Default: root | |
| branch | No | Branch (default: default branch) | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safe-read profile is covered. The description adds the browsing scope but omits useful behavior: whether results are recursive or single-level, how large listings are paginated or truncated, hidden-file handling, and what happens when the path does not 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?
A single front-loaded sentence with no filler, but it is terse to the point of leaving out information that would help an agent call it correctly. Efficient rather than padding, so it earns a 4 rather than lower.
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 four parameters, no output schema, and no annotations beyond readOnlyHint, the description should at least sketch the shape of the result (flat list vs. tree, entry fields). It covers the core operation but leaves an agent guessing about the response and listing semantics.
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 four parameters (path, branch, workspace, repository) are already documented with defaults. The description only echoes the path concept and adds no format, syntax, or edge-case detail beyond the schema, so the baseline 3 applies.
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 pairs a specific verb (List) with a specific resource (files and directories) and scope (at a repository path), making the operation unambiguous. It does not name or contrast with the obvious sibling get_file_content, so it stops short of a 5.
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?
There is no guidance on when to use this versus get_file_content, list_branches, or list_repositories, and no note that workspace/repository are required while path/branch are optional. The agent must infer the selection criteria from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pr_commitsCRead-only
List commits in a pull request.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 25) | |
| start | No | Pagination start (default 0) | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| pull_request_id | Yes | Pull request ID | |
| include_build_status | No | CI status per commit (Server only) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the description adds nothing on safety. It says nothing about pagination behavior, result ordering, or the Server-only limitation on include_build_status — all context an agent would want before calling.
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?
A single efficient sentence with no filler. It is concise, but the brevity reflects under-specification rather than disciplined editing.
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, pagination controls, a platform-conditional flag, and no output schema, the description is too thin. It never mentions pagination defaults, ordering, or what a commit entry contains, leaving the agent to discover behavior at call time.
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 every parameter including limit, start, and include_build_status is already documented in the schema. The description adds no meaning beyond that, which is the baseline for full-coverage schemas.
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?
States a specific verb and resource: list commits scoped to a pull request. The pull-request scoping implicitly distinguishes it from list_branch_commits and get_commit_detail, though neither sibling is named.
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?
No guidance on when to choose this over list_branch_commits or get_commit_detail, and no prerequisites or exclusions. The agent must infer selection from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsBRead-only
List accessible projects/workspaces.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name filter | |
| limit | No | Max results (default 25) | |
| start | No | Pagination start (default 0) | |
| permission | No | e.g. PROJECT_READ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already declares the safety profile, so the description's main contribution is 'accessible', which implies results are permission-filtered to what the caller can see. That is a genuine behavioral detail, but nothing is said about result ordering, pagination semantics, or what happens when the caller has no access.
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?
A single short sentence with zero waste and the core scope front-loaded. It is efficient rather than padded, though it borders on under-specified rather than genuinely concise.
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 read-only list tool with full schema coverage and no output schema, the essentials are present. Missing is anything about how 'projects' relate to the repository tools in the sibling set, or what the returned collection shape/ordering is, which an agent would need to place results correctly.
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 name, limit, start, and permission all documented inline including defaults. The description adds no filter syntax or semantic nuance beyond that, so the baseline 3 applies.
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?
States a specific verb and resource — 'List accessible projects/workspaces' — so an agent knows this is a read/list operation over project entities. It stops short of differentiating from the near-neighbor list_repositories, leaving the project-vs-repo boundary to inference.
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?
No guidance on when to call this versus alternatives such as list_repositories, and no preconditions stated. The agent must infer usage purely from the tool name and the 'accessible' qualifier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pull_requestsARead-only
List pull requests in a repository. Omit repository (Server only) to list YOUR PRs across all repos in one call (filter with role).
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Cross-repo mode only | |
| limit | No | Max results (default 25) | |
| start | No | Pagination start (default 0) | |
| state | No | Default OPEN | |
| author | No | Filter by author username | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | No | Repository slug; omit for cross-repo dashboard (Server) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes safety, so the description appropriately focuses on the non-obvious cross-repo behavior. It discloses the Server-only constraint for omitting `repository` and the fact that this returns your PRs across all repos in one call.
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 tight sentences with no wasted text. The repository-scoped case is stated first, and the cross-repo exception follows immediately.
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 rich schema and readOnly annotation, the description covers the main operational distinction an agent needs: repository-scoped listing versus cross-repo listing. It does not describe the return shape, but for a simple list tool with no output schema that is a minor gap.
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 schema already documents all seven parameters including role, state, limit, start, author, workspace, and repository. The description adds some meaning about repository omission and role filtering, but mostly reinforces what the schema already says.
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 and resource: listing pull requests in a repository. It also distinguishes the cross-repo mode from the normal repository-scoped mode, which differentiates it from siblings such as get_pull_request.
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 clearly explains the key usage branch: omit `repository` to list your PRs across all repos, and use `role` to filter that cross-repo view. It does not explicitly name sibling alternatives like get_pull_request, but the main mode selection is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_repositoriesARead-only
List repositories in a project (or all accessible on Server).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Name filter | |
| limit | No | Max results (default 25) | |
| start | No | Pagination start (default 0) | |
| workspace | No | Project key (required on Cloud) | |
| permission | No | e.g. REPO_READ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the meaningful behavioral note that omitting project scope on Server returns all accessible repositories, but says nothing about pagination behavior, filtering semantics, or result shape.
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?
A single sentence with zero filler, and the scope distinction is front-loaded in the parenthetical. Nothing could be removed without losing information.
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 five-parameter list tool with full schema coverage and a read-only annotation, the description covers the essentials but leaves pagination, filtering interaction, and result ordering unaddressed. Adequate to call correctly, but thin for an agent deciding how to page through 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 all five parameters (name, limit, start, workspace, permission) are already documented in the schema. The description adds no parameter-level detail beyond the project/Server scoping hint, so the baseline 3 applies.
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?
States a specific verb and resource (list repositories) and clarifies scope: project-scoped versus all accessible on Server. It does not name any sibling (e.g., list_projects) to disambiguate, but the resource is distinct enough that an agent can tell it apart from the pull-request and branch 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 parenthetical implies usage context — use with a project, or omit one on Server to get everything accessible — but no alternatives are named and no explicit when-not guidance is given. The Cloud-vs-Server distinction that most affects calling behavior lives only in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_commentADestructiveIdempotent
Edit/delete/resolve/reopen a PR comment or task, or convert between comment and task (to_task/to_comment are Server-only). Pass version (from get_pull_request output) to save a fetch (Server).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | New text (edit only) | |
| action | Yes | ||
| version | No | Entity version from a prior read; supplying it saves a fetch AND makes the write conditional — it fails on concurrent modification instead of overwriting. Omit to write against the latest state (auto-retried once). | |
| workspace | Yes | Project key (e.g., PROJ) | |
| comment_id | Yes | ||
| repository | Yes | Repository slug | |
| pull_request_id | Yes | Pull request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the agent knows delete is irreversible and repeats are safe. The description adds that version enables a conditional write that saves a fetch, but the detailed concurrency behavior (fails on concurrent modification, auto-retry when omitted) lives in the schema, not the description. The parenthetical '(Server)' is unexplained jargon that adds ambiguity rather than clarity.
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 tight sentences with the operation list front-loaded, so the agent gets the core capability immediately. The trailing '(Server)' qualifier is compressed to the point of being cryptic and slightly undercuts the otherwise clean structure.
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 7-parameter destructive mutation tool with no output schema, the description covers operations and the version/optimistic-concurrency angle but omits consequences: whether delete is permanent, whether task conversion alters linked entities, and what a successful call returns. The recurring, unexplained '(Server)' tag leaves an unresolved ambiguity an agent cannot act on.
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 71%, and the description compensates by mapping each enum value to a concrete operation (edit/delete/resolve/reopen/to_task/to_comment), which the schema does not do since enum values carry no per-value descriptions. It also explains that version should come from get_pull_request output, adding provenance the schema lacks; text and comment_id remain undocumented in the description but are covered by 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 opens with a specific set of verbs (edit/delete/resolve/reopen/convert) applied to a clear resource (PR comment or task), which is far more precise than the tool name alone. It implicitly distinguishes itself from add_comment by framing all operations as mutations of an existing comment, though it never names that sibling explicitly.
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?
Usage is implied through the action enumeration, and the note that to_task/to_comment are Server-only is a genuine usage restriction. However, there is no explicit guidance on when to reach for this tool versus add_comment or set_review_status, and no preconditions (permissions, comment ownership) are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_pull_requestCDestructive
Merge a pull request. Pass version to save a fetch.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Entity version from a prior read; supplying it saves a fetch AND makes the write conditional — it fails on concurrent modification instead of overwriting. Omit to write against the latest state (auto-retried once). | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| commit_message | No | ||
| merge_strategy | No | Cloud only | |
| pull_request_id | Yes | Pull request ID | |
| close_source_branch | No | Cloud only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is covered structurally. The description adds nothing beyond that — it doesn't mention irreversibility, merge-conflict failure modes, permission requirements, or that the PR will be closed. The one extra sentence merely restates the `version` schema note.
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 the action front-loaded, which is good. However the second sentence is redundant with the schema's `version` description, so it doesn't earn its place; the space would be better spent on consequences of merging.
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 destructive 7-parameter mutation with no output schema, the description leaves out what an agent needs: what a successful merge returns, how conflicts surface, and whether the source branch is affected. Annotations cover safety but not outcome behavior.
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 86%, so the schema itself documents nearly all parameters including the conditional-write semantics of `version`. The description only echoes the `version` hint, so baseline 3 applies — it neither compensates nor detracts.
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?
States a specific verb and resource ('Merge a pull request'), which is unambiguous against siblings like decline_pull_request or update_pull_request. It doesn't explicitly contrast with those siblings, but the name and verb make selection straightforward.
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?
No guidance on when to merge versus decline, when a merge is appropriate (e.g., approved review state), or prerequisites. The only usage-adjacent sentence is about passing `version` to save a fetch, which is a parameter tip rather than tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_review_statusAIdempotent
Set YOUR reviewer status on a PR: APPROVED, NEEDS_WORK (request changes), or UNAPPROVED (clear). One call; the three states are mutually exclusive.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| comment | No | Optional explanatory comment | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| pull_request_id | Yes | Pull request ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and idempotentHint=true, so the safety profile is covered; the description adds real value by clarifying that UNAPPROVED clears a prior review and that the states are mutually exclusive rather than additive. It stops short of disclosing permission requirements or what happens to an existing review comment when the status is changed.
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, both front-loaded: the action and states come first, the operational caveat second. Nothing is redundant and there is no 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 a 5-parameter mutation with no output schema, the description covers what the tool does and the state model well. It omits the return behavior (e.g., whether the resulting review object is returned) and permission/self-approval constraints, which an agent would still want before invoking.
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 80%, so the baseline is 3, but the description earns an upgrade by glossing the enum: NEEDS_WORK means 'request changes' and UNAPPROVED means 'clear', which the bare enum values do not convey. It says nothing about the optional 'comment' parameter or how it interacts with the status.
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?
Uses a specific verb ('Set') with a precisely scoped resource ('YOUR reviewer status on a PR') and enumerates the three legal states. No sibling tool (update_pull_request, merge_pull_request, decline_pull_request, add_comment) does review-status setting, and the 'YOUR' qualifier makes the personal-reviewer scope 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?
'One call; the three states are mutually exclusive' is a useful usage rule that tells the agent not to chain calls. However, there is no guidance on when to reach for this versus add_comment or update_pull_request, and no stated preconditions such as being a reviewer or not being the PR author.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pull_requestAIdempotent
Update a pull request. Reviewers/approvals are preserved unless reviewers is passed. Pass version (from get/list) to save a fetch.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| version | No | Entity version from a prior read; supplying it saves a fetch AND makes the write conditional — it fails on concurrent modification instead of overwriting. Omit to write against the latest state (auto-retried once). | |
| reviewers | No | Replaces reviewer list; approvals preserved | |
| workspace | Yes | Project key (e.g., PROJ) | |
| repository | Yes | Repository slug | |
| attachments | No | Local files to upload & embed (Server/DC only). Item: path string or {file_path, alt_text?, render?: image|link|auto} | |
| description | No | ||
| pull_request_id | Yes | Pull request ID | |
| destination_branch | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds the operationally important partial-update semantics: reviewers and approvals survive unless `reviewers` is supplied. It still omits what happens to other omitted fields (title/description) and any permission or failure conditions beyond the version note.
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?
Three short sentences, front-loaded with the core action, then the two behavioral caveats. Slight redundancy with the parameter descriptions (reviewer preservation and version fetching are already in the schema), but nothing is padded or buried.
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 9-parameter mutation tool with no output schema, the definition covers the versioning and reviewer clobbering risks but leaves gaps: no statement of permission requirements, no mention of what the response contains, and no note that omitted fields are untouched. Adequate, but not complete enough to call without any 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?
At 67% schema coverage, the schema already documents the two most subtle parameters (`version` concurrency semantics, `reviewers` replacement). The description restates rather than extends these, and says nothing about `title`, `description`, `destination_branch`, or the Server/DC-only `attachments` caveat that sits only in 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?
Names a specific verb+resource (update a pull request) that is clearly distinguishable from read siblings like get_pull_request and list_pull_requests. However, it does not distinguish itself from mutating siblings such as merge_pull_request, decline_pull_request, or set_review_status, so the boundary is only partly drawn.
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?
Gives two concrete usage hints: pass `version` (from get/list) to avoid a fetch, and reviewers are preserved unless `reviewers` is passed. That is useful conditional guidance but only about parameters — there is no statement of when to choose this tool over merge/decline/set_review_status, and no prerequisites such as permissions.
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.
25 tool updates
v3.0.1- Changed
add_comment16 fields changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Local files to upload & embed (Server/DC only). Item: path string or {file_path, alt_text?, render?: image|link|auto}", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "alt_text": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "render": { + "enum": [ + "image", + "link", + "auto" + ], + "type": "string" + } + }, + "required": [ + "file_path" + ], + "type": "object" + } + ] + }, + "type": "array" +} - changed
Input schema / properties / code_snippet / descriptionPrevious value: -"Exact code text from the diff to find and comment on. Use this instead of line_number for auto-detection. Must match exactly including whitespace (optional)"New value: +"Exact diff line text to locate (whitespace-sensitive)" - removed
Input schema / properties / comment_text / descriptionRemoved value: -"The main comment text. For suggestions, this is the explanation before the code suggestion." - changed
Input schema / properties / file_path / descriptionPrevious value: -"File path for inline comment. Required for inline comments. Example: \"src/components/Button.js\" (optional)"New value: +"Inline comment file" - changed
Input schema / properties / line_number / descriptionPrevious value: -"Exact line number in the file. Use this OR code_snippet, not both. Required with file_path unless using code_snippet (optional)"New value: +"Inline comment line (or use code_snippet)" - changed
Input schema / properties / line_type / descriptionPrevious value: -"Type of line: ADDED (green/new lines), REMOVED (red/deleted lines), or CONTEXT (unchanged lines). Default: CONTEXT"New value: +"Default CONTEXT" - changed
Input schema / properties / match_strategy / descriptionPrevious value: -"How to handle multiple matches when using code_snippet. \"strict\": fail with detailed error showing all matches. \"best\": automatically pick the highest confidence match. Default: \"strict\""New value: +"On multiple snippet matches (default strict)" - changed
Input schema / properties / parent_comment_id / descriptionPrevious value: -"ID of comment to reply to. Use this to create threaded conversations (optional)"New value: +"Reply to this comment" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / search_context / descriptionPrevious value: -"Additional context lines to help locate the exact position when using code_snippet. Useful when the same code appears multiple times (optional)"New value: +"Disambiguates repeated code_snippet" - removed
Input schema / properties / search_context / properties / after / descriptionRemoved value: -"Array of code lines that appear AFTER the target line. Helps disambiguate when code_snippet appears multiple times" - removed
Input schema / properties / search_context / properties / before / descriptionRemoved value: -"Array of code lines that appear BEFORE the target line. Helps disambiguate when code_snippet appears multiple times" - added
Input schema / properties / severityAdded value: +{ + "description": "BLOCKER creates a task (Server only)", + "enum": [ + "NORMAL", + "BLOCKER" + ], + "type": "string" +} - changed
Input schema / properties / suggestion / descriptionPrevious value: -"Replacement code for a suggestion. Creates a suggestion block that can be applied in Bitbucket UI. Requires file_path and line_number. For multi-line, include newlines in the string (optional)"New value: +"Replacement code block; needs file_path + line_number" - changed
Input schema / properties / suggestion_end_line / descriptionPrevious value: -"For multi-line suggestions: the last line number to replace. If not provided, only replaces the single line at line_number (optional)"New value: +"Multi-line suggestion end" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Removed
approve_pull_request - Changed
create_pull_request9 fields changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Local files to upload & embed (Server/DC only). Item: path string or {file_path, alt_text?, render?: image|link|auto}", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "alt_text": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "render": { + "enum": [ + "image", + "link", + "auto" + ], + "type": "string" + } + }, + "required": [ + "file_path" + ], + "type": "object" + } + ] + }, + "type": "array" +} - removed
Input schema / properties / close_source_branch / descriptionRemoved value: -"Whether to close source branch after merge (optional, default: false)" - removed
Input schema / properties / description / descriptionRemoved value: -"Description of the pull request (optional)" - removed
Input schema / properties / destination_branch / descriptionRemoved value: -"Destination branch name (e.g., \"main\", \"master\")" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / reviewers / descriptionPrevious value: -"Array of reviewer usernames/emails (optional)"New value: +"Reviewer usernames" - removed
Input schema / properties / source_branch / descriptionRemoved value: -"Source branch name" - removed
Input schema / properties / title / descriptionRemoved value: -"Title of the pull request" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Added
decline_pull_request - Changed
delete_branch5 fields changed- removed
Input schema / properties / branch_name / descriptionRemoved value: -"Branch name to delete" - added
Input schema / properties / expected_headAdded value: +{ + "description": "Known head SHA (compare-and-swap)", + "type": "string" +} - removed
Input schema / properties / forceRemoved value: -{ - "description": "Force delete even if branch is not merged (optional, default: false)", - "type": "boolean" -} - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
get_branch4 fields changed- removed
Input schema / properties / branch_name / descriptionRemoved value: -"Branch name to get details for" - changed
Input schema / properties / include_merged_prs / descriptionPrevious value: -"Include merged PRs from this branch (default: false)"New value: +"Default false" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Added
get_commit_detail - Changed
get_file_content7 fields changed- changed
Input schema / properties / branch / descriptionPrevious value: -"Branch name (optional, defaults to default branch)"New value: +"Branch (default: default branch)" - removed
Input schema / properties / file_path / descriptionRemoved value: -"Path to the file (e.g., \"src/index.ts\")" - changed
Input schema / properties / full_content / descriptionPrevious value: -"Force return full content regardless of size (optional, default: false)"New value: +"Entire file regardless of size" - removed
Input schema / properties / line_count / descriptionRemoved value: -"Number of lines to return (optional, default varies by file size)" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / start_line / descriptionPrevious value: -"Starting line number (1-based). Use negative for lines from end (optional)"New value: +"1-based; negative = from end" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
get_pull_request6 fields changed- added
Input schema / properties / comment_limitAdded value: +{ + "description": "Max comments embedded (default 20)", + "type": "number" +} - added
Input schema / properties / include_commentsAdded value: +{ + "description": "Embed active comments (default true)", + "type": "boolean" +} - added
Input schema / properties / include_file_changesAdded value: +{ + "description": "Embed changed-file list (default true)", + "type": "boolean" +} - added
Input schema / properties / include_tasksAdded value: +{ + "description": "Embed PR tasks (Server only, default false)", + "type": "boolean" +} - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
get_pull_request_diff7 fields changed- changed
Input schema / properties / context_lines / descriptionPrevious value: -"Number of context lines around changes (optional, default: 3)"New value: +"Default 3; 0 = minimal" - changed
Input schema / properties / exclude_patterns / descriptionPrevious value: -"Array of glob patterns to exclude (e.g., [\"*.lock\", \"*.svg\"]) (optional)"New value: +"Globs to exclude" - changed
Input schema / properties / file_path / descriptionPrevious value: -"Specific file path to get diff for (e.g., \"src/index.ts\") (optional)"New value: +"Diff one file only" - added
Input schema / properties / ignore_whitespaceAdded value: +{ + "description": "Server only", + "type": "boolean" +} - changed
Input schema / properties / include_patterns / descriptionPrevious value: -"Array of glob patterns to include (e.g., [\"*.res\", \"src/**/*.js\"]) (optional)"New value: +"Globs to include" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
list_branch_commits11 fields changed- removed
Input schema / properties / author / descriptionRemoved value: -"Filter by author email/username (optional)" - removed
Input schema / properties / branch_name / descriptionRemoved value: -"Branch name to get commits from" - added
Input schema / properties / include_build_statusAdded value: +{ + "description": "Server only", + "type": "boolean" +} - changed
Input schema / properties / include_merge_commits / descriptionPrevious value: -"Include merge commits in results (default: true)"New value: +"Default true" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of commits to return (default: 25)"New value: +"Max results (default 25)" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / search / descriptionPrevious value: -"Search for text in commit messages (optional)"New value: +"Substring in commit message" - changed
Input schema / properties / since / descriptionPrevious value: -"ISO date string - only show commits after this date (optional)"New value: +"ISO date lower bound, or a commit SHA/ref (exclusive) for a server-side range" - changed
Input schema / properties / start / descriptionPrevious value: -"Start index for pagination (default: 0)"New value: +"Pagination start (default 0)" - changed
Input schema / properties / until / descriptionPrevious value: -"ISO date string - only show commits before this date (optional)"New value: +"ISO date upper bound" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
list_branches5 fields changed- changed
Input schema / properties / filter / descriptionPrevious value: -"Filter branches by name pattern (optional)"New value: +"Name filter" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of branches to return (default: 25)"New value: +"Max results (default 25)" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / start / descriptionPrevious value: -"Start index for pagination (default: 0)"New value: +"Pagination start (default 0)" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
list_directory_content4 fields changed- changed
Input schema / properties / branch / descriptionPrevious value: -"Branch name (optional, defaults to default branch)"New value: +"Branch (default: default branch)" - changed
Input schema / properties / path / descriptionPrevious value: -"Directory path (optional, defaults to root, e.g., \"src/components\")"New value: +"Default: root" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Changed
list_pr_commits5 fields changed- added
Input schema / properties / include_build_statusAdded value: +{ + "description": "CI status per commit (Server only)", + "type": "boolean" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of commits to return (default: 25)"New value: +"Max results (default 25)" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / start / descriptionPrevious value: -"Start index for pagination (default: 0)"New value: +"Pagination start (default 0)" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Added
list_projects - Changed
list_pull_requests7 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of PRs to return (default: 25)"New value: +"Max results (default 25)" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug; omit for cross-repo dashboard (Server)" - added
Input schema / properties / roleAdded value: +{ + "description": "Cross-repo mode only", + "enum": [ + "AUTHOR", + "REVIEWER", + "PARTICIPANT" + ], + "type": "string" +} - changed
Input schema / properties / start / descriptionPrevious value: -"Start index for pagination (default: 0)"New value: +"Pagination start (default 0)" - changed
Input schema / properties / state / descriptionPrevious value: -"Filter by PR state: OPEN, MERGED, DECLINED, ALL (default: OPEN)"New value: +"Default OPEN" - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)" - changed
Input schema / requiredPrevious value: -[ - "workspace", - "repository" -]New value: +[ + "workspace" +]
- Added
list_repositories - Added
manage_comment - Changed
merge_pull_request6 fields changed- changed
Input schema / properties / close_source_branch / descriptionPrevious value: -"Whether to close source branch after merge (optional)"New value: +"Cloud only" - removed
Input schema / properties / commit_message / descriptionRemoved value: -"Custom merge commit message (optional)" - changed
Input schema / properties / merge_strategy / descriptionPrevious value: -"Merge strategy: merge-commit, squash, fast-forward (optional)"New value: +"Cloud only" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - added
Input schema / properties / versionAdded value: +{ + "description": "Entity version from a prior read; supplying it saves a fetch AND makes the write conditional — it fails on concurrent modification instead of overwriting. Omit to write against the latest state (auto-retried once).", + "type": "number" +} - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
- Removed
remove_requested_changes - Removed
request_changes - Removed
search_code - Added
set_review_status - Removed
unapprove_pull_request - Changed
update_pull_request8 fields changed- added
Input schema / properties / attachmentsAdded value: +{ + "description": "Local files to upload & embed (Server/DC only). Item: path string or {file_path, alt_text?, render?: image|link|auto}", + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "alt_text": { + "type": "string" + }, + "file_path": { + "type": "string" + }, + "render": { + "enum": [ + "image", + "link", + "auto" + ], + "type": "string" + } + }, + "required": [ + "file_path" + ], + "type": "object" + } + ] + }, + "type": "array" +} - removed
Input schema / properties / description / descriptionRemoved value: -"New description (optional)" - removed
Input schema / properties / destination_branch / descriptionRemoved value: -"New destination branch (optional)" - changed
Input schema / properties / repository / descriptionPrevious value: -"Repository slug (e.g., \"my-repo\")"New value: +"Repository slug" - changed
Input schema / properties / reviewers / descriptionPrevious value: -"New list of reviewer usernames/emails. If provided, replaces the reviewer list (preserving approval status for existing reviewers). If omitted, existing reviewers are preserved. (optional)"New value: +"Replaces reviewer list; approvals preserved" - removed
Input schema / properties / title / descriptionRemoved value: -"New title (optional)" - added
Input schema / properties / versionAdded value: +{ + "description": "Entity version from a prior read; supplying it saves a fetch AND makes the write conditional — it fails on concurrent modification instead of overwriting. Omit to write against the latest state (auto-retried once).", + "type": "number" +} - changed
Input schema / properties / workspace / descriptionPrevious value: -"Bitbucket workspace/project key (e.g., \"PROJ\")"New value: +"Project key (e.g., PROJ)"
19 tool updates
v1.0.0- First observed
add_comment - First observed
approve_pull_request - First observed
create_pull_request - First observed
delete_branch - First observed
get_branch - First observed
get_file_content - First observed
get_pull_request - First observed
get_pull_request_diff - First observed
list_branch_commits - First observed
list_branches - First observed
list_directory_content - First observed
list_pr_commits - First observed
list_pull_requests - First observed
merge_pull_request - First observed
remove_requested_changes - First observed
request_changes - First observed
search_code - First observed
unapprove_pull_request - First observed
update_pull_request
TDQS
Scored across 20 tools
Most tools target clearly distinct resources and actions (PRs, commits, branches, files, projects). Minor overlap exists between get_pull_request (which can include file changes) and get_pull_request_diff, and between list_pr_commits and list_branch_commits, but descriptions clarify the boundaries. add_comment vs manage_comment is well differentiated by verb.
Every tool follows a consistent snake_case verb_noun pattern (get_/list_/create_/update_/merge_/decline_/add_/manage_/set_/delete_). The resource noun is predictable throughout, making the surface highly readable.
20 tools cover several resource domains (PRs, commits, branches, files, projects/repos), so the count is justified but sits at the heavier end. Each tool maps to a distinct operation rather than redundant variants.
PR lifecycle is thoroughly covered (create/list/get/update/merge/decline, comments, review status, diff, commits). Gaps exist: branches support get/list/delete but no create_branch, and files/projects/repos are read-only, though these may be intentional for a review-focused server.
Maintenance
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
A Model Context Protocol (MCP) application for automated GitHub PR analysis and issue management.…
MCP Server for JFrog, providing tools for development and artifact management.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that provides tools for interacting with the Bitbucket API, supporting both Bitbucket Cloud and Bitbucket Server, enabling pull request, branch, file, code review, and search operations.1911,347 npmMIT
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that provides tools for interacting with Bitbucket repositories, pull requests, issues, and more.46 npmISC
- AlicenseBqualityDmaintenanceAn MCP server for Bitbucket Cloud that enables managing pull requests, branches, and repositories in natural language from any MCP-capable client.23253 npm4MIT
- AlicenseBqualityBmaintenanceMCP server for Bitbucket Server integration, enabling project, repository, pull request, source code, branch, and code review operations via the Bitbucket Server APIs.27768 npmMIT