A Model Context Protocol (MCP) server for Bitbucket Cloud REST API.
This Bitbucket MCP server presents 24 tools with basic structure but significant quality gaps. Tool naming follows action-verb conventions (get_, create_, list_, etc.), which is correct. However, tool descriptions are uniformly terse (13-45 characters), falling well below the 50-200 character LLM-optimized baseline. Parameter descriptions exist for major identifiers (workspace, repo_slug, pr_id) but are generic and lack format/constraint details. Input schemas are present and typed (string, object) but lack enum constraints, minLength/maxLength bounds, or detailed format documentation. Output schemas are not visible in the provided code, the implementation delegates to reqwest::Client and returns resp.json() without documenting what fields agents should expect. Error handling is minimal: a generic HTTP error response with status and text, but no recovery guidance or categorization. The server does not implement parameter validation, does not document pagination cursor mechanics, and does not include per-item success/failure for batch operations. Tool composition is sound, each tool has one responsibility, but the interface is API-centric rather than agent-centric (e.g., requires workspace/repo_slug for every PR operation, forcing agents to look them up repeatedly). No tool exhibits the dependency hints, chaining-ID inclusion, or natural-identifier support that would make the agent workflow efficient.
Add a bitbucket pull request comment
Add a bitbucket pull request task
Approve a bitbucket pull request
Create a bitbucket pull request
Decline a bitbucket pull request
Get bitbucket pull request details
Get bitbucket pull request diffstat
Tool descriptions are uniformly under 50 characters and lack LLM-optimized context. Examples: 'Create a bitbucket pull request' (31 chars), 'Approve a bitbucket pull request' (32 chars). The rubric baseline for A-quality tools is 50-200 chars with explicit 'WHAT', 'WHEN', and 'WHAT-IT-RETURNS' guidance.
Input schemas lack enum constraints and format validation. The 'body' parameter in create_pullrequest, update_pullrequest, add_pullrequest_comment, etc. is typed as generic 'object' with minimal description ('Pull request body payload', 'Comment payload with content and optional inline positioning'). Agents cannot infer what fields are required or what values are valid without external API documentation. No minLength, maxLength, pattern, or enum fields.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 33 | - | v1 |
Get bitbucket repository details
Get authenticated bitbucket user details
Get bitbucket workspace details
List bitbucket repository branches with pagination support
List bitbucket repository commits with pagination support
List bitbucket issues with pagination support
List bitbucket repository pipelines with pagination support
List bitbucket pull request activity
List bitbucket pull request comments with pagination support
List bitbucket pull request tasks
List bitbucket pull requests with pagination support
List bitbucket repositories in a workspace with pagination support
List bitbucket repository tags with pagination support
List bitbucket workspaces with pagination support
Merge a bitbucket pull request
Unapprove a bitbucket pull request
Update a bitbucket pull request
Output schemas are not documented in the visible code. The implementation returns resp.json() without declaring what fields the agent should expect. Without output schema documentation, agents cannot reliably extract chaining IDs (pr_id, repo_slug, workspace) from responses, forcing wasteful lookup calls.
List tools (list_pullrequests, list_repositories, list_workspaces, list_branches, list_tags, list_commits, list_pipelines) claim to support pagination but lack visible limit/offset/page_size parameters in the input schema. The description says 'with pagination support' but the schema does not expose page, limit, cursor, or offset parameters. Without pagination controls, agents cannot enforce result limits and risk context window exhaustion.
Error handling is generic and non-actionable. The implementation returns 'Bitbucket API error: {status} - {text}' without categorizing errors as retryable, user-fixable, or fatal. Agents cannot decide whether to retry, ask the user, or give up. No recovery guidance provided (e.g., 'User not found. Try list_users() with a partial name').
Destructive operations (merge_pullrequest, decline_pullrequest, delete operations if they exist) lack dry-run or confirmation support. Agents can irreversibly merge PRs or decline requests without a safety mechanism. No idempotency or REVERSIBLE/IRREVERSIBLE risk classification in parameter schemas.
Parameter descriptions lack format and constraint details. Examples: 'Pull request identifier' (no regex, no format), 'Bitbucket workspace identifier' (no format), 'Pull request update payload' (no schema of required/optional fields). LLMs cannot validate inputs without explicit constraints, increasing API errors and wasted calls.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present. The spec supports tool annotations to signal read-only vs. destructive operations, but none are declared. This forces agents to infer intent from tool names alone.
No dependency hints between tools. For example, add_pullrequest_comment requires workspace, repo_slug, and pr_id, but the list_pullrequests tool does not document that it returns these IDs, and add_pullrequest_comment does not say 'Call list_pullrequests first if you only have a repository name'. This forces agents to guess at multi-step workflows.
All tools require opaque identifiers (workspace, repo_slug, pr_id). The rubric requires tools to accept human-friendly identifiers (names, emails, display names) and resolve them server-side. For example, 'get_pullrequest' should accept 'my-repo' or 'My Workspace' rather than forcing agents to look up workspace and repo_slug IDs first.