Bitbucket
STDIOBitbucket API交互工具,支持云端和服务器版本
Bitbucket API交互工具,支持云端和服务器版本
An MCP (Model Context Protocol) server that provides tools for interacting with the Bitbucket API, supporting both Bitbucket Cloud and Bitbucket Server.
get_pull_request - Retrieve detailed information about a pull requestlist_pull_requests - List pull requests with filters (state, author, pagination)create_pull_request - Create new pull requestsupdate_pull_request - Update PR details (title, description, reviewers, destination branch)add_comment - Add comments to pull requests (supports replies)merge_pull_request - Merge pull requests with various strategieslist_pr_commits - List all commits that are part of a pull requestdelete_branch - Delete branches after mergelist_branches - List branches with filtering and paginationdelete_branch - Delete branches (with protection checks)get_branch - Get detailed branch information including associated PRslist_branch_commits - List commits in a branch with advanced filteringlist_directory_content - List files and directories in a repository pathget_file_content - Get file content with smart truncation for large filesget_pull_request_diff - Get the diff/changes for a pull requestapprove_pull_request - Approve a pull requestunapprove_pull_request - Remove approval from a pull requestrequest_changes - Request changes on a pull requestremove_requested_changes - Remove change request from a pull requestsearch_code - Search for code across repositories (currently Bitbucket Server only)list_projects - List all accessible Bitbucket projects/workspaces with filteringlist_repositories - List repositories in a project or across all accessible projectsThe easiest way to use this MCP server is directly with npx:
{ "mcpServers": { "bitbucket": { "command": "npx", "args": [ "-y", "@nexus2520/bitbucket-mcp-server" ], "env": { "BITBUCKET_USERNAME": "your-username", "BITBUCKET_APP_PASSWORD": "your-app-password" } } } }
For Bitbucket Server:
{ "mcpServers": { "bitbucket": { "command": "npx", "args": [ "-y", "@nexus2520/bitbucket-mcp-server" ], "env": { "BITBUCKET_USERNAME": "[email protected]", "BITBUCKET_TOKEN": "your-http-access-token", "BITBUCKET_BASE_URL": "https://bitbucket.yourcompany.com" } } } }
npm install
npm run build
This server uses Bitbucket App Passwords for authentication.
node scripts/setup-auth.js
This will guide you through the authentication setup process.
Add the server to your MCP settings file (usually located at ~/.vscode-server/data/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json):
{ "mcpServers": { "bitbucket": { "command": "node", "args": ["/absolute/path/to/bitbucket-mcp-server/build/index.js"], "env": { "BITBUCKET_USERNAME": "your-username", "BITBUCKET_APP_PASSWORD": "your-app-password" } } } }
Replace:
/absolute/path/to/bitbucket-mcp-server with the actual path to this directoryyour-username with your Bitbucket username (not email)your-app-password with the app password you createdFor Bitbucket Server, use:
{ "mcpServers": { "bitbucket": { "command": "node", "args": ["/absolute/path/to/bitbucket-mcp-server/build/index.js"], "env": { "BITBUCKET_USERNAME": "[email protected]", "BITBUCKET_TOKEN": "your-http-access-token", "BITBUCKET_BASE_URL": "https://bitbucket.yourcompany.com" } } } }
Important for Bitbucket Server users:
Once configured, you can use the available tools:
{ "tool": "get_pull_request", "arguments": { "workspace": "PROJ", // Required - your project key "repository": "my-repo", "pull_request_id": 123 } }
Returns detailed information about the pull request including:
merge_commit_hash: The hash of the merge commitmerged_by: Who performed the mergemerged_at: When the merge occurredmerge_commit_message: The merge commit messageactive_comments: Array of active comments (up to 20 most recent top-level comments)
replies: Array of reply comments with same structureparent_id: ID of the parent comment for repliesactive_comment_count: Total count of unresolved comments (including nested replies)total_comment_count: Total count of all comments (including resolved and replies)file_changes: Array of all files modified in the PR
file_changes_summary: Summary statistics
Search for code across Bitbucket repositories (currently only supported for Bitbucket Server):
// Search in a specific repository { "tool": "search_code", "arguments": { "workspace": "PROJ", "repository": "my-repo", "search_query": "TODO", "limit": 50 } } // Search across all repositories in a workspace { "tool": "search_code", "arguments": { "workspace": "PROJ", "search_query": "deprecated", "file_pattern": "*.java", // Optional: filter by file pattern "limit": 100 } } // Search with file pattern filtering { "tool": "search_code", "arguments": { "workspace": "PROJ", "repository": "frontend-app", "search_query": "useState", "file_pattern": "*.tsx", // Only search in .tsx files "start": 0, "limit": 25 } }
Returns search results with:
Example response:
{ "message": "Code search completed successfully", "workspace": "PROJ", "repository": "my-repo", "search_query": "TODO", "results": [ { "file_path": "src/utils/helper.js", "file_name": "helper.js", "repository": "my-repo", "project": "PROJ", "matches": [ { "line_number": 42, "line_content": " // TODO: Implement error handling", "highlighted_segments": [ { "text": " // ", "is_match": false }, { "text": "TODO", "is_match": true }, { "text": ": Implement error handling", "is_match": false } ] } ] } ], "total_count": 15, "start": 0, "limit": 50, "has_more": false }
Note: This tool currently only works with Bitbucket Server. Bitbucket Cloud support is planned for a future release.
{ "tool": "list_pull_requests", "arguments": { "workspace": "PROJ", // Required - your project key "repository": "my-repo", "state": "OPEN", // Optional: OPEN, MERGED, DECLINED, ALL (default: OPEN) "author": "username", // Optional: filter by author (see note below) "limit": 25, // Optional: max results per page (default: 25) "start": 0 // Optional: pagination start index (default: 0) } }
Returns a paginated list of pull requests with:
Note on Author Filter:
{ "tool": "create_pull_request", "arguments": { "workspace": "PROJ", "repository": "my-repo", "title": "Add new feature", "source_branch": "feature/new-feature", "destination_branch": "main", "description": "This PR adds a new feature...", // Optional "reviewers": ["john.doe", "jane.smith"], // Optional "close_source_branch": true // Optional (default: false) } }
{ "tool": "update_pull_request", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "title": "Updated title", // Optional "description": "Updated description", // Optional "destination_branch": "develop", // Optional "reviewers": ["new.reviewer"] // Optional - see note below } }
Important Note on Reviewers:
reviewers parameter, existing reviewers and their approval status are preservedreviewers parameter:
Add a comment to a pull request, either as a general comment or inline on specific code:
// General comment { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "Great work on this PR!" } } // Inline comment on specific line { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "Consider extracting this into a separate function", "file_path": "src/utils/helpers.js", "line_number": 42, "line_type": "CONTEXT" // ADDED, REMOVED, or CONTEXT } } // Reply to existing comment { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "I agree with this suggestion", "parent_comment_id": 456 } } // Add comment with code suggestion (single line) { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "This variable name could be more descriptive.", "file_path": "src/utils/helpers.js", "line_number": 42, "line_type": "CONTEXT", "suggestion": "const userAuthenticationToken = token;" } } // Add comment with multi-line code suggestion { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "This function could be simplified using array methods.", "file_path": "src/utils/calculations.js", "line_number": 50, "suggestion_end_line": 55, "line_type": "CONTEXT", "suggestion": "function calculateTotal(items) {\n return items.reduce((sum, item) => sum + item.price, 0);\n}" } }
The suggestion feature formats comments using GitHub-style markdown suggestion blocks that Bitbucket can render. When adding a suggestion:
suggestion is required and contains the replacement codefile_path and line_number are required when using suggestionssuggestion_end_line is optional and used for multi-line suggestions (defaults to line_number)The add_comment tool now supports finding line numbers automatically using code snippets. This is especially useful when AI tools analyze diffs and may struggle with exact line numbers:
// Add comment using code snippet { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "This variable name could be more descriptive", "file_path": "src/components/Button.res", "code_snippet": "let isDisabled = false", "search_context": { "before": ["let onClick = () => {"], "after": ["setLoading(true)"] } } } // Handle multiple matches with strategy { "tool": "add_comment", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment_text": "Consider extracting this", "file_path": "src/utils/helpers.js", "code_snippet": "return result;", "search_context": { "before": ["const result = calculate();"], "after": ["}"] }, "match_strategy": "best" // Auto-select highest confidence match } }
Code Snippet Parameters:
code_snippet: The exact code line to find (alternative to line_number)search_context: Optional context to disambiguate multiple matches
before: Array of lines that should appear before the targetafter: Array of lines that should appear after the targetmatch_strategy: How to handle multiple matches
"strict" (default): Fail with error showing all matches"best": Auto-select the highest confidence matchError Response for Multiple Matches (strict mode):
{ "error": { "code": "MULTIPLE_MATCHES_FOUND", "message": "Code snippet 'return result;' found in 3 locations", "occurrences": [ { "line_number": 42, "file_path": "src/utils/helpers.js", "preview": " const result = calculate();\n> return result;\n}", "confidence": 0.9, "line_type": "ADDED" }, // ... more matches ], "suggestion": "To resolve, either:\n1. Add more context...\n2. Use match_strategy: 'best'...\n3. Use line_number directly" } }
This feature is particularly useful for:
Note on comment replies:
parent_comment_id to reply to any comment (general or inline)get_pull_request responses:
replies arrayparent_id field for reply commentsNote on inline comments:
file_path: The path to the file as shown in the diffline_number: The line number as shown in the diffline_type:
ADDED - For newly added lines (green in diff)REMOVED - For deleted lines (red in diff)CONTEXT - For unchanged context linesThe add_comment tool supports multiple scenarios. Here's when and how to use each approach:
1. General PR Comments (No file/line)
comment_text only2. Reply to Existing Comments
comment_text, parent_comment_id3. Inline Comments with Line Number
comment_text, file_path, line_numberline_type (defaults to CONTEXT)4. Inline Comments with Code Snippet
comment_text, file_path, code_snippetsearch_context if the code appears multiple timesmatch_strategy: "best" to auto-select when multiple matches exist5. Code Suggestions
comment_text, file_path, line_number, suggestionsuggestion_end_lineDecision Flow for AI/Automated Tools:
1. Do you want to suggest code changes?
   → Use suggestion with line_number
   
2. Do you have the exact line number?
   → Use line_number directly
   
3. Do you have the code snippet but not line number?
   → Use code_snippet (add search_context if needed)
   
4. Is it a general comment about the PR?
   → Use comment_text only
   
5. Are you replying to another comment?
   → Add parent_comment_id
Common Pitfalls to Avoid:
line_number and code_snippet - pick onefile_path and line_number{ "tool": "merge_pull_request", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "merge_strategy": "squash", // Optional: merge-commit, squash, fast-forward "close_source_branch": true, // Optional "commit_message": "Custom merge message" // Optional } }
{ "tool": "list_branches", "arguments": { "workspace": "PROJ", "repository": "my-repo", "filter": "feature", // Optional: filter by name pattern "limit": 25, // Optional (default: 25) "start": 0 // Optional: for pagination (default: 0) } }
Returns a paginated list of branches with:
{ "tool": "delete_branch", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "feature/old-feature", "force": false // Optional (default: false) } }
Note: Branch deletion requires appropriate permissions. The branch will be permanently deleted.
{ "tool": "get_branch", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "feature/new-feature", "include_merged_prs": false // Optional (default: false) } }
Returns comprehensive branch information including:
include_merged_prs is true):
This tool is particularly useful for:
Get all commits in a specific branch with advanced filtering options:
// Basic usage - get recent commits { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "feature/new-feature", "limit": 50 // Optional (default: 25) } } // Filter by date range { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "main", "since": "2025-01-01T00:00:00Z", // ISO date string "until": "2025-01-15T23:59:59Z" // ISO date string } } // Filter by author { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "develop", "author": "[email protected]", // Email or username "limit": 100 } } // Exclude merge commits { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "release/v2.0", "include_merge_commits": false } } // Search in commit messages { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "main", "search": "bugfix", // Search in commit messages "limit": 50 } } // Combine multiple filters { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "develop", "author": "[email protected]", "since": "2025-01-01T00:00:00Z", "include_merge_commits": false, "search": "feature", "limit": 100, "start": 0 // For pagination } } // Include CI/CD build status (Bitbucket Server only) { "tool": "list_branch_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "branch_name": "main", "include_build_status": true, // Fetch build status for each commit "limit": 50 } }
Filter Parameters:
since: ISO date string - only show commits after this dateuntil: ISO date string - only show commits before this dateauthor: Filter by author email/usernameinclude_merge_commits: Boolean to include/exclude merge commits (default: true)search: Search for text in commit messagesinclude_build_status: Boolean to include CI/CD build status (default: false, Bitbucket Server only)Returns detailed commit information:
{ "branch_name": "feature/new-feature", "branch_head": "abc123def456", // Latest commit hash "commits": [ { "hash": "abc123def456", "abbreviated_hash": "abc123d", "message": "Add new feature implementation", "author": { "name": "John Doe", "email": "[email protected]" }, "date": "2025-01-03T10:30:00Z", "parents": ["parent1hash", "parent2hash"], "is_merge_commit": false, "build_status": { // Only present when include_build_status is true "successful": 5, "failed": 0, "in_progress": 1, "unknown": 0 } } // ... more commits ], "total_count": 150, "start": 0, "limit": 25, "has_more": true, "next_start": 25, "filters_applied": { "author": "[email protected]", "since": "2025-01-01", "include_merge_commits": false, "include_build_status": true } }
This tool is particularly useful for:
Get all commits that are part of a pull request:
// Basic usage { "tool": "list_pr_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "limit": 50, // Optional (default: 25) "start": 0 // Optional: for pagination } } // Include CI/CD build status (Bitbucket Server only) { "tool": "list_pr_commits", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "include_build_status": true, // Fetch build status for each commit "limit": 50 } }
Returns commit information for the PR:
{ "pull_request_id": 123, "pull_request_title": "Add awesome feature", "commits": [ { "hash": "def456ghi789", "abbreviated_hash": "def456g", "message": "Initial implementation", "author": { "name": "Jane Smith", "email": "[email protected]" }, "date": "2025-01-02T14:20:00Z", "parents": ["parent1hash"], "is_merge_commit": false, "build_status": { // Only present when include_build_status is true "successful": 3, "failed": 0, "in_progress": 0, "unknown": 0 } } // ... more commits ], "total_count": 5, "start": 0, "limit": 25, "has_more": false }
This tool is particularly useful for:
Get the diff/changes for a pull request with optional filtering capabilities:
// Get full diff (default behavior) { "tool": "get_pull_request_diff", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "context_lines": 5 // Optional (default: 3) } } // Exclude specific file types { "tool": "get_pull_request_diff", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "exclude_patterns": ["*.lock", "*.svg", "node_modules/**", "*.min.js"] } } // Include only specific file types { "tool": "get_pull_request_diff", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "include_patterns": ["*.res", "*.resi", "src/**/*.js"] } } // Get diff for a specific file only { "tool": "get_pull_request_diff", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "file_path": "src/components/Button.res" } } // Combine filters { "tool": "get_pull_request_diff", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "include_patterns": ["src/**/*"], "exclude_patterns": ["*.test.js", "*.spec.js"] } }
Filtering Options:
include_patterns: Array of glob patterns to include (whitelist)exclude_patterns: Array of glob patterns to exclude (blacklist)file_path: Get diff for a specific file only*.js, src/**/*.res, !test/**)Response includes filtering metadata:
{ "message": "Pull request diff retrieved successfully", "pull_request_id": 123, "diff": "..filtered diff content..", "filter_metadata": { "total_files": 15, "included_files": 12, "excluded_files": 3, "excluded_file_list": ["package-lock.json", "logo.svg", "yarn.lock"], "filters_applied": { "exclude_patterns": ["*.lock", "*.svg"] } } }
{ "tool": "approve_pull_request", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123 } }
{ "tool": "request_changes", "arguments": { "workspace": "PROJ", "repository": "my-repo", "pull_request_id": 123, "comment": "Please address the following issues..." // Optional } }
{ "tool": "list_directory_content", "arguments": { "workspace": "PROJ", "repository": "my-repo", "path": "src/components", // Optional (defaults to root) "branch": "main" // Optional (defaults to default branch) } }
Returns directory listing with:
{ "tool": "get_file_content", "arguments": { "workspace": "PROJ", "repository": "my-repo", "file_path": "src/index.ts", "branch": "main", // Optional (defaults to default branch) "start_line": 1, // Optional: starting line (1-based, use negative for from end) "line_count": 100, // Optional: number of lines to return "full_content": false // Optional: force full content (default: false) } }
Smart Truncation Features:
start_line: -50 to get last 50 lines (tail functionality)full_content: true or line parametersReturns file content with:
Example responses:
// Small file - returns full content { "file_path": "package.json", "branch": "main", "size": 1234, "encoding": "utf-8", "content": "{\n \"name\": \"my-project\",\n ...", "last_modified": { "commit_id": "abc123", "author": "John Doe", "date": "2025-01-21T10:00:00Z" } } // Large file - automatically truncated { "file_path": "src/components/LargeComponent.tsx", "branch": "main", "size": 125000, "encoding": "utf-8", "content": "... first 500 lines ...", "line_info": { "total_lines": 3500, "returned_lines": { "start": 1, "end": 500 }, "truncated": true, "message": "Showing lines 1-500 of 3500. File size: 122.1KB" } }
List all accessible Bitbucket projects (Server) or workspaces (Cloud):
// List all accessible projects { "tool": "list_projects", "arguments": { "limit": 25, // Optional (default: 25) "start": 0 // Optional: for pagination (default: 0) } } // Filter by project name { "tool": "list_projects", "arguments": { "name": "backend", // Partial name match "limit": 50 } } // Filter by permission level (Bitbucket Server only) { "tool": "list_projects", "arguments": { "permission": "PROJECT_WRITE", // PROJECT_READ, PROJECT_WRITE, PROJECT_ADMIN "limit": 100 } }
Parameters:
name: Filter by project/workspace name (partial match, optional)permission: Filter by permission level (Bitbucket Server only, optional)
PROJECT_READ: Read accessPROJECT_WRITE: Write accessPROJECT_ADMIN: Admin accesslimit: Maximum number of projects to return (default: 25)start: Start index for pagination (default: 0)Returns project/workspace information:
{ "projects": [ { "key": "PROJ", "id": 1234, "name": "My Project", "description": "Project description", "is_public": false, "type": "NORMAL", // NORMAL or PERSONAL (Server), WORKSPACE (Cloud) "url": "https://bitbucket.yourcompany.com/projects/PROJ" } // ... more projects ], "total_count": 15, "start": 0, "limit": 25, "has_more": false, "next_start": null }
Note:
This tool is particularly useful for:
List repositories within a specific project/workspace or across all accessible repositories:
// List all repositories in a workspace/project { "tool": "list_repositories", "arguments": { "workspace": "PROJ", // Required for Bitbucket Cloud, optional for Server "limit": 25, // Optional (default: 25) "start": 0 // Optional: for pagination (default: 0) } } // List all accessible repositories (Bitbucket Server only) { "tool": "list_repositories", "arguments": { "limit": 100 } } // Filter by repository name { "tool": "list_repositories", "arguments": { "workspace": "PROJ", "name": "frontend", // Partial name match "limit": 50 } } // Filter by permission level (Bitbucket Server only) { "tool": "list_repositories", "arguments": { "workspace": "PROJ", "permission": "REPO_WRITE", // REPO_READ, REPO_WRITE, REPO_ADMIN "limit": 100 } }
Parameters:
workspace: Project key (Server) or workspace slug (Cloud)
name: Filter by repository name (partial match, optional)permission: Filter by permission level (Bitbucket Server only, optional)
REPO_READ: Read accessREPO_WRITE: Write accessREPO_ADMIN: Admin accesslimit: Maximum number of repositories to return (default: 25)start: Start index for pagination (default: 0)Returns repository information:
{ "repositories": [ { "slug": "my-repo", "id": 5678, "name": "My Repository", "description": "Repository description", "project_key": "PROJ", "project_name": "My Project", "state": "AVAILABLE", // AVAILABLE, INITIALISING, INITIALISATION_FAILED (Server) "is_public": false, "is_forkable": true, "clone_urls": { "http": "https://bitbucket.yourcompany.com/scm/PROJ/my-repo.git", "ssh": "ssh://[email protected]:7999/PROJ/my-repo.git" }, "url": "https://bitbucket.yourcompany.com/projects/PROJ/repos/my-repo" } // ... more repositories ], "total_count": 42, "start": 0, "limit": 25, "has_more": true, "next_start": 25, "workspace": "PROJ" }
Important Notes:
workspace parameter. If omitted, you'll receive an error messageworkspace parameterThis tool is particularly useful for:
npm run dev - Watch mode for developmentnpm run build - Build the TypeScript codenpm start - Run the built serverMIT