Bitbucket MCP Server
Bitbucket MCP Server
An MCP (Model Context Protocol) server that provides tools for interacting with the Bitbucket API, supporting both Bitbucket Cloud and Bitbucket Server.
Features
Available Tools (29 total)
PR Core (pr_core)
get_pull_request- Full PR details including comments, file changes, and merge infolist_pull_requests- List PRs with filters (state, author, pagination)create_pull_request- Create new pull requestsupdate_pull_request- Update PR details (title, description, reviewers, destination branch)merge_pull_request- Merge pull requests with various strategiesdecline_pull_request- Decline/reject a pull request
PR Comments (pr_comments)
add_comment- Add general, inline, threaded, or suggestion comments to a PRdelete_comment- Delete a comment from a pull request
Code Review (pr_review)
get_pull_request_diff- Structured line-by-line diff with ADDED/REMOVED/CONTEXT typesset_pr_approval- Approve (approved: true) or unapprove (approved: false) a PRset_review_status- Request changes (request_changes: true) or remove the request (false)
PR Tasks — Bitbucket Server only (pr_tasks)
list_pr_tasks- List all tasks on a pull requestcreate_pr_task- Create a new task on a pull requestupdate_pr_task- Update the text of an existing taskset_pr_task_status- Mark a task done (done: true) or reopen it (done: false)delete_pr_task- Delete a task from a pull requestconvert_pr_item- Convert a comment to a task (direction: "to_task") or back ("to_comment")
Commits (commits)
list_pr_commits- List all commits in a pull requestlist_branch_commits- List commits in a branch with date/author/message filtersget_commit_detail- Get the structured diff for a specific commit by SHA
Branches (branches)
list_branches- List branches with filtering and paginationget_branch- Detailed branch info including associated PRs and statsdelete_branch- Delete a branch
Files (files)
list_directory_content- List files and directories in a repository pathget_file_content- Get file content with smart truncation for large filessearch_files- Search for files by glob pattern (case-insensitive, like VS Code Ctrl+P)get_file_blame- Per-line blame: who last modified each line, commit hash, and author timestamp (Bitbucket Server only)
Search — Bitbucket Server only (search)
search_code- Search for code across repositoriessearch_repositories- Search for repositories by name or description
Discovery (discovery)
list_projects- List all accessible Bitbucket projects/workspaceslist_repositories- List repositories in a project or across all accessible projects
Token Optimization
v2.0.0 introduces significant token savings on every LLM request:
Configuration | Tools exposed | Est. tokens |
Bitbucket Server (all groups) | 29 | ~5,100 |
Bitbucket Cloud (auto-filtered) | 21 | ~3,900 |
Custom group preset (e.g. | 12 | ~2,100 |
Bitbucket Cloud automatically hides the 10 server-only tools with no configuration needed.
BITBUCKET_TOOL_GROUPS lets you expose only the groups relevant to your workflow — see Tool Group Filtering below.
Related MCP server: bitbucket-mcp-server
Installation
Using npx (Recommended)
The 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": "your.email@company.com",
"BITBUCKET_TOKEN": "your-http-access-token",
"BITBUCKET_BASE_URL": "https://bitbucket.yourcompany.com"
}
}
}
}From Source
Clone or download this repository
Install dependencies:
npm installBuild the TypeScript code:
npm run build
Authentication Setup
This server uses Bitbucket App Passwords for authentication.
Creating an App Password
Log in to your Bitbucket account
Navigate to: https://bitbucket.org/account/settings/app-passwords/
Click "Create app password"
Give it a descriptive label (e.g., "MCP Server")
Select the following permissions:
Account: Read
Repositories: Read, Write
Pull requests: Read, Write
Click "Create"
Important: Copy the generated password immediately (you won't be able to see it again!)
Running the Setup Script
node scripts/setup-auth.jsThis will guide you through the authentication setup process.
Configuration
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-serverwith the actual path to this directoryyour-usernamewith your Bitbucket username (not email)your-app-passwordwith the app password you created
For Bitbucket Server, use:
{
"mcpServers": {
"bitbucket": {
"command": "node",
"args": ["/absolute/path/to/bitbucket-mcp-server/build/index.js"],
"env": {
"BITBUCKET_USERNAME": "your.email@company.com",
"BITBUCKET_TOKEN": "your-http-access-token",
"BITBUCKET_BASE_URL": "https://bitbucket.yourcompany.com"
}
}
}
}Important for Bitbucket Server users:
Use your full email address as the username (e.g., "john.doe@company.com")
This is required for approval/review actions to work correctly
Tool Group Filtering
Reduce the number of tools sent to the LLM on every request by setting BITBUCKET_TOOL_GROUPS to a comma-separated list of group names. Only tools in the listed groups will be exposed.
Available groups
Group | Tools | Platform |
|
| Both |
|
| Both |
|
| Both |
|
| Server only |
|
| Both |
|
| Both |
|
| Both |
|
| Server only |
|
| Both |
Example presets
PR review workflow (~2,100 tokens):
"env": {
"BITBUCKET_TOOL_GROUPS": "pr_core,pr_review,files"
}Full PR management (~3,500 tokens):
"env": {
"BITBUCKET_TOOL_GROUPS": "pr_core,pr_comments,pr_review,pr_tasks"
}Code exploration only (~1,400 tokens):
"env": {
"BITBUCKET_TOOL_GROUPS": "files,search,discovery"
}When BITBUCKET_TOOL_GROUPS is not set, all applicable tools are exposed (default behaviour). Bitbucket Cloud users always have server-only tools automatically hidden regardless of this setting.
Usage
Once configured, you can use the available tools:
Get Pull Request
{
"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:
Title and description
Author and reviewers
Source and destination branches
Approval status
Links to web UI and diff
Merge commit details (when PR is merged):
merge_commit_hash: The hash of the merge commitmerged_by: Who performed the mergemerged_at: When the merge occurredmerge_commit_message: The merge commit message
Active comments with nested replies (unresolved comments that need attention):
active_comments: Array of active comments (up to 20 most recent top-level comments)Comment text and author
Creation date
Whether it's an inline comment (with file path and line number)
Nested replies (for Bitbucket Server):
replies: Array of reply comments with same structureReplies can be nested multiple levels deep
Parent reference (for Bitbucket Cloud):
parent_id: ID of the parent comment for replies
active_comment_count: Total count of unresolved comments (including nested replies)total_comment_count: Total count of all comments (including resolved and replies)
File changes:
file_changes: Array of all files modified in the PRFile path
Status (added, modified, removed, or renamed)
Old path (for renamed files)
file_changes_summary: Summary statisticsTotal files changed
And more...
Search Code
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:
File path and name
Repository and project information
Matched lines with:
Line number
Full line content
Highlighted segments showing exact matches
Pagination information
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.
List Pull Requests
{
"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:
Array of pull requests with same details as get_pull_request
Total count of matching PRs
Pagination info (has_more, next_start)
Note on Author Filter:
For Bitbucket Cloud: Use the username (e.g., "johndoe")
For Bitbucket Server: Use the full email address (e.g., "john.doe@company.com")
Create Pull Request
{
"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)
}
}Update Pull Request
{
"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:
When updating a PR without specifying the
reviewersparameter, existing reviewers and their approval status are preservedWhen providing the
reviewersparameter:The reviewer list is replaced with the new list
For reviewers that already exist on the PR, their approval status is preserved
New reviewers are added without approval status
This prevents accidentally removing reviewers when you only want to update the PR description or title
Add Comment
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:
suggestionis required and contains the replacement codefile_pathandline_numberare required when using suggestionssuggestion_end_lineis optional and used for multi-line suggestions (defaults toline_number)The comment will be formatted with a ````suggestion` markdown block that may be applicable in the Bitbucket UI
Using Code Snippets Instead of Line Numbers
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 toline_number)search_context: Optional context to disambiguate multiple matchesbefore: Array of lines that should appear before the targetafter: Array of lines that should appear after the target
match_strategy: How to handle multiple matches"strict"(default): Fail with error showing all matches"best": Auto-select the highest confidence match
Error 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:
AI-powered code review tools that analyze diffs
Scripts that automatically add comments based on code patterns
Avoiding line number confusion in large diffs
Note on comment replies:
Use
parent_comment_idto reply to any comment (general or inline)In
get_pull_requestresponses:Bitbucket Server shows replies nested in a
repliesarrayBitbucket Cloud shows a
parent_idfield for reply comments
You can reply to replies, creating nested conversations
Note 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 lines
Add Comment - Complete Usage Guide
The add_comment tool supports multiple scenarios. Here's when and how to use each approach:
1. General PR Comments (No file/line)
Use when: Making overall feedback about the PR
Required params:
comment_textonlyExample: "LGTM!", "Please update the documentation"
2. Reply to Existing Comments
Use when: Continuing a conversation thread
Required params:
comment_text,parent_comment_idWorks for both general and inline comment replies
3. Inline Comments with Line Number
Use when: You know the exact line number from the diff
Required params:
comment_text,file_path,line_numberOptional:
line_type(defaults to CONTEXT)
4. Inline Comments with Code Snippet
Use when: You have the code but not the line number (common for AI tools)
Required params:
comment_text,file_path,code_snippetThe tool will automatically find the line number
Add
search_contextif the code appears multiple timesUse
match_strategy: "best"to auto-select when multiple matches exist
5. Code Suggestions
Use when: Proposing specific code changes
Required params:
comment_text,file_path,line_number,suggestionFor multi-line: also add
suggestion_end_lineCreates applicable suggestion blocks in Bitbucket UI
Decision 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_idCommon Pitfalls to Avoid:
Don't use both
line_numberandcode_snippet- pick oneSuggestions always need
file_pathandline_numberCode snippets must match exactly (including whitespace)
REMOVED lines reference the source file, ADDED/CONTEXT reference the destination
Merge Pull Request
{
"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
}
}List Branches
{
"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:
Branch name and ID
Latest commit hash
Default branch indicator
Pagination info
Delete Branch
{
"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.
Get Branch
{
"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:
Branch details:
Name and ID
Latest commit (hash, message, author, date)
Default branch indicator
Open pull requests from this branch:
PR title and ID
Destination branch
Author and reviewers
Approval status (approved by, changes requested by, pending)
PR URL
Merged pull requests (if
include_merged_prsis true):PR title and ID
Merge date and who merged it
Statistics:
Total open PRs count
Total merged PRs count
Days since last commit
This tool is particularly useful for:
Checking if a branch has open PRs before deletion
Getting an overview of branch activity
Understanding PR review status
Identifying stale branches
List Branch Commits
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": "john.doe@company.com", // 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": "jane.smith@company.com",
"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": "john.doe@example.com"
},
"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": "john.doe@example.com",
"since": "2025-01-01",
"include_merge_commits": false,
"include_build_status": true
}
}This tool is particularly useful for:
Reviewing commit history before releases
Finding commits by specific authors
Tracking changes within date ranges
Searching for specific features or fixes
Analyzing branch activity patterns
Monitoring CI/CD build status for commits (Bitbucket Server only)
List PR Commits
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": "jane.smith@example.com"
},
"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:
Reviewing all changes in a PR before merging
Understanding the development history of a PR
Checking commit messages for quality
Verifying authorship of changes
Analyzing PR complexity by commit count
Monitoring CI/CD build status for all PR commits (Bitbucket Server only)
Get Commit Detail
Get the diff for a specific commit by SHA with structured line-by-line information. Returns files with hunks containing individual lines, each with line numbers and ADDED/REMOVED/CONTEXT type information.
// Basic usage - get full commit diff
{
"tool": "get_commit_detail",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"commit_id": "abc123def456",
"context_lines": 5 // Optional (default: 3)
}
}
// Get diff for a specific file only
{
"tool": "get_commit_detail",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"commit_id": "abc123def456",
"file_path": "src/index.ts"
}
}
// Exclude generated/lock files
{
"tool": "get_commit_detail",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"commit_id": "abc123def456",
"exclude_patterns": ["*.lock", "*.svg", "node_modules/**"]
}
}
// Include only specific file types
{
"tool": "get_commit_detail",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"commit_id": "abc123def456",
"include_patterns": ["*.ts", "src/**/*.js"]
}
}Structured Response Format (Bitbucket Server):
{
"commit_id": "abc123def456",
"files": [
{
"file_path": "src/index.ts",
"old_path": null,
"status": "modified",
"hunks": [
{
"context": "export function foo() {",
"source_start": 10,
"source_span": 5,
"destination_start": 10,
"destination_span": 6,
"lines": [
{
"source_line": 10,
"destination_line": 10,
"type": "CONTEXT",
"content": " const x = 1;"
},
{
"source_line": 11,
"destination_line": 11,
"type": "REMOVED",
"content": " return x;"
},
{
"source_line": 11,
"destination_line": 11,
"type": "ADDED",
"content": " return x + 1;"
}
]
}
]
}
],
"summary": {
"total_files": 3,
"files_included": 1,
"files_excluded": 2
},
"filter_metadata": {
"filters_applied": {
"file_path": "src/index.ts"
}
}
}This tool is particularly useful for:
Reviewing exactly what changed in a specific commit
Auditing a commit before or after it lands on a branch
Getting structured diff data for automated analysis
Get Pull Request Diff
Get the diff/changes for a pull request with structured line-by-line information. Returns files with hunks containing individual lines, each with line numbers and type information for easy inline commenting.
// 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 onlyPatterns support standard glob syntax (e.g.,
*.js,src/**/*.res,!test/**)
Structured Response Format (Bitbucket Server):
The response includes structured line-by-line information with line numbers, making it easy for AI tools to add inline comments:
{
"message": "Pull request diff retrieved successfully",
"pull_request_id": 123,
"from_hash": "abc123...",
"to_hash": "def456...",
"files": [
{
"file_path": "src/components/Button.res",
"old_path": null,
"status": "modified",
"hunks": [
{
"context": "let make = () => {",
"source_start": 27,
"source_span": 6,
"destination_start": 27,
"destination_span": 7,
"lines": [
{
"source_line": 27,
"destination_line": 27,
"type": "CONTEXT",
"content": " let onClick = () => {"
},
{
"source_line": 28,
"destination_line": 28,
"type": "CONTEXT",
"content": " setLoading(true)"
},
{
"source_line": 29,
"destination_line": 29,
"type": "REMOVED",
"content": " oldFunction()"
},
{
"source_line": 29,
"destination_line": 29,
"type": "ADDED",
"content": " newFunction()"
},
{
"source_line": 30,
"destination_line": 30,
"type": "CONTEXT",
"content": " }"
}
]
}
]
}
],
"summary": {
"total_files": 15,
"files_included": 1,
"files_excluded": 14
},
"filter_metadata": {
"filters_applied": {
"file_path": "src/components/Button.res"
},
"excluded_file_list": ["package-lock.json", "logo.svg"]
}
}Line Types and Usage with add_comment:
Line Type | Description | Use with |
| New line (green in diff) | Use |
| Deleted line (red in diff) | Use |
| Unchanged context line | Use |
Example: Adding an inline comment on an ADDED line:
// From the diff response, we see line 29 was added with content " newFunction()"
{
"tool": "add_comment",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"file_path": "src/components/Button.res",
"line_number": 29, // Use destination_line for ADDED
"line_type": "ADDED",
"comment_text": "Consider adding error handling here"
}
}Note: Bitbucket Cloud currently returns raw diff format. The structured format is available for Bitbucket Server only.
Approve Pull Request
{
"tool": "approve_pull_request",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123
}
}Request Changes
{
"tool": "request_changes",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"comment": "Please address the following issues..." // Optional
}
}List Directory Content
{
"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:
Path and branch information
Array of contents with:
Name
Type (file or directory)
Size (for files)
Full path
Total items count
Search Files
Search for files by name or path pattern in a repository. Uses glob patterns with case-insensitive matching (like VS Code's Ctrl+P file search).
// Search for all TypeScript files
{
"tool": "search_files",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pattern": "*.ts"
}
}
// Search for files containing "Controller" in the name
{
"tool": "search_files",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pattern": "**/Controller*"
}
}
// Search within a specific directory
{
"tool": "search_files",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pattern": "*.res",
"path": "src/components"
}
}
// Search on a specific branch with result limit
{
"tool": "search_files",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pattern": "**/*Config*",
"branch": "develop",
"limit": 50
}
}
// Case-insensitive search (matches SomeComponent.res, Somefile.res, etc.)
{
"tool": "search_files",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pattern": "**/someFile*"
}
}Parameters:
workspace: Project key (required)repository: Repository slug (required)pattern: Glob pattern to filter files (optional, returns all files if not specified)Supports standard glob syntax:
*.ts,**/*.java,**/Controller*Case-insensitive matching
path: Subdirectory to search within (optional, defaults to root)branch: Branch name (optional, defaults to default branch)limit: Maximum number of matching files to return (optional, default: 100)
Response:
{
"workspace": "PROJ",
"repository": "my-repo",
"branch": "master",
"search_path": "/",
"pattern": "*.res",
"files": [
"src/App.res",
"src/components/Button.res",
"src/utils/DateUtils.res"
],
"total_files_scanned": 5000,
"total_matched": 150,
"returned": 100,
"truncated": true
}This tool is particularly useful for:
Finding files by name pattern (like VS Code's Ctrl+P)
Discovering all files of a certain type in a repository
Locating configuration files or specific components
Exploring unfamiliar codebases
Get File Content
{
"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:
Automatically truncates large files (>50KB) to prevent token overload
Default line counts based on file type:
Config files (.yml, .json): 200 lines
Documentation (.md, .txt): 300 lines
Code files (.ts, .js, .py): 500 lines
Log files: Last 100 lines
Use
start_line: -50to get last 50 lines (tail functionality)Files larger than 1MB require explicit
full_content: trueor line parameters
Returns file content with:
File path and branch
File size and encoding
Content (full or truncated based on parameters)
Line information (if truncated):
Total lines in file
Range of returned lines
Truncation indicator
Last modified information (commit, author, date)
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"
}
}Get File Blame
Get per-line authorship (blame) for a file — who last modified each line, the commit hash, and author timestamp. Feed the returned commit_id into get_commit_detail to see what actually changed.
Bitbucket Server only. Bitbucket Cloud does not expose a blame API.
// Full-file blame
{
"tool": "get_file_blame",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"file_path": "src/index.ts"
}
}
// Blame for a specific branch and line range
{
"tool": "get_file_blame",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"file_path": "src/index.ts",
"branch": "main",
"start_line": 100,
"line_count": 20
}
}
// Ungrouped — one entry per line
{
"tool": "get_file_blame",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"file_path": "src/index.ts",
"group_by_commit": false
}
}Parameters:
file_path: File path, e.g."src/index.ts"(required)branch: Branch name (optional, defaults to default branch)start_line: Starting line (1-based) to limit output (optional)line_count: Number of lines to return fromstart_line(optional)group_by_commit: Group contiguous lines from the same commit into ranges (default:true)
Response (grouped, default):
{
"file_path": "src/index.ts",
"branch": "main",
"total_lines": 1982,
"returned_lines": { "start": 1, "end": 1982 },
"unique_commits": 42,
"unique_authors": 16,
"grouped": true,
"blame": [
{
"line_start": 1,
"line_end": 4,
"commit_id": "fbbe61e95f51abb8aed8dd5a472074a77b3d0f46",
"commit_display_id": "fbbe61e95f5",
"author": { "name": "Jane Doe", "email": "jane@example.com" },
"date": "2025-04-15T12:01:01.000Z",
"original_file_name": "src/index.ts"
}
]
}Response (ungrouped, group_by_commit: false): each blame entry has a single line field instead of line_start/line_end.
Useful for:
Finding the main authors of a file before requesting reviews
Tracing who introduced a particular line or block
Feeding
commit_idintoget_commit_detailto see the full diff of a blamed changeIdentifying code ownership when refactoring shared modules
List Projects
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 access
limit: 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:
For Bitbucket Cloud, this returns workspaces (not projects in the traditional sense)
For Bitbucket Server, this returns both personal and team projects
This tool is particularly useful for:
Discovering available projects/workspaces for your account
Finding project keys needed for other API calls
Identifying projects you have specific permissions on
Browsing organizational structure
List Repositories
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)Required for Bitbucket Cloud
Optional for Bitbucket Server (omit to list all accessible repos)
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 access
limit: 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://git@bitbucket.yourcompany.com: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:
Bitbucket Cloud requires the
workspaceparameter. If omitted, you'll receive an error messageBitbucket Server allows listing all accessible repos by omitting the
workspaceparameterClone URLs are provided for both HTTP(S) and SSH protocols
This tool is particularly useful for:
Discovering available repositories in a project/workspace
Finding repository slugs needed for other API calls
Identifying repositories you have specific permissions on
Getting clone URLs for repositories
Browsing repository structure within an organization
Search Repositories
Search for repositories by name or description (Bitbucket Server only):
// Basic search
{
"tool": "search_repositories",
"arguments": {
"search_query": "backend",
"limit": 10
}
}
// Search within a specific project
{
"tool": "search_repositories",
"arguments": {
"search_query": "dashboard",
"workspace": "PROJ",
"limit": 25
}
}Returns repository search results with project association.
Decline Pull Request
Decline/reject a pull request:
{
"tool": "decline_pull_request",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"comment": "Closing this PR as the feature is no longer needed" // Optional
}
}Delete Comment
Delete a comment from a pull request:
{
"tool": "delete_comment",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"comment_id": 456
}
}Note: Comments with replies cannot be deleted. Only the comment author, PR author, or repository admin can delete comments.
PR Task Management (Bitbucket Server only)
Tasks are checklist items that can be added to pull requests. They help track action items that need to be completed before merging.
List PR Tasks
{
"tool": "list_pr_tasks",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123
}
}Returns all tasks with their status:
{
"pull_request_id": 123,
"tasks": [
{
"id": 456,
"text": "Update documentation",
"author": "John Doe",
"state": "OPEN",
"created_on": "2025-01-25T10:00:00Z",
"is_resolved": false
}
],
"summary": {
"total": 3,
"open": 2,
"resolved": 1
}
}Create PR Task
{
"tool": "create_pr_task",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"text": "Add unit tests for the new feature"
}
}Update PR Task
{
"tool": "update_pr_task",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"task_id": 456,
"text": "Add unit tests and integration tests"
}
}Mark/Unmark Task as Done
// Mark as done
{
"tool": "mark_pr_task_done",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"task_id": 456
}
}
// Reopen task
{
"tool": "unmark_pr_task_done",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"task_id": 456
}
}Delete PR Task
{
"tool": "delete_pr_task",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"task_id": 456
}
}Convert Between Comments and Tasks
// Convert a comment to a task
{
"tool": "convert_comment_to_task",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"comment_id": 456
}
}
// Convert a task back to a comment
{
"tool": "convert_task_to_comment",
"arguments": {
"workspace": "PROJ",
"repository": "my-repo",
"pull_request_id": 123,
"task_id": 456
}
}Note on Tasks:
Tasks are implemented as comments with
severity: "BLOCKER"in Bitbucket ServerTasks can be in
OPENorRESOLVEDstateOnly the task creator, PR author, or repository admin can edit text or delete tasks
Anyone with read access can mark tasks as done/undone
Development
npm run dev- Watch mode for developmentnpm run build- Build the TypeScript codenpm start- Run the built server
Troubleshooting
Authentication errors: Double-check your username and app password
404 errors: Verify the workspace, repository slug, and PR ID
Permission errors: Ensure your app password has the required permissions
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