Azure DevOps reference server for the Model Context Protocol (MCP)
Server has 44 tools with consistent naming (verb_noun pattern) and basic descriptions. However, parameter descriptions are largely absent or minimal, and output schemas are not documented in the visible code. Tool definitions use Zod schemas converted to JSON Schema, but the actual schema constraints and parameter documentation are not visible in the provided source. Most tools are READ_ONLY (low risk), but WRITE operations (trigger_pipeline, create_pull_request, create_commit, etc.) lack confirmation patterns and detailed error guidance. Descriptions average ~80-120 chars, below the 194-char baseline for A+ tools. No tool annotations (readOnlyHint, destructiveHint) detected.
Add a comment to a pull request (repositoryId optional; derived from pullRequestId when omitted)
Create a new branch from an existing one
Create a commit on an existing branch using file changes. - Provide plain branch names (no "refs/heads/"). - ⚠️ Each file path may appear only once per commit request—combine all edits to a file into a single change entry. - Prefer multiple commits when you have sparse or unrelated edits; smaller focused commits keep review context clear. 🎯 RECOMMENDED: Use the SEARCH/REPLACE format (much easier, no line counting!). **Option 1: SEARCH/REPLACE format (EASIEST)** Simply provide the exact text to find and replace: ```json { "changes": [{ "path": "src/api/services/function-call.ts", "search": "return axios.post(apiUrl, payload, requestConfig);", "replace": "return axios.post(apiUrl, payload, requestConfig).then(r => { processResponse(r); return r; });" }] } ``` The server fetches the file, performs the replacement, and generates the diff automatically. No line counting, no hunk headers, no context lines needed! **Option 2: UNIFIED DIFF format (Advanced)** If you prefer full control, provide complete unified diffs: - Each patch MUST have complete hunk headers: @@ -oldStart,oldLines +newStart,newLines @@ - CRITICAL: Every @@ marker MUST include line numbers. Do NOT use @@ without line ranges. - Include 3-5 context lines before and after changes. - For deletions: `--- a/filepath` and `+++ /dev/null` - For additions: `--- /dev/null` and `+++ b/filepath` Example unified diff: ```json { "changes": [{ "patch": "diff --git a/file.yaml b/file.yaml\n--- a/file.yaml\n+++ b/file.yaml\n@@ -4,7 +4,7 @@ spec:\n spec:\n type: ClusterIP\n ports:\n- - port: 8080\n+ - port: 9090\n targetPort: http\n" }] } ```
Parameter descriptions missing or minimal. Visible schema files (e.g., ListPipelinesSchema, GetPipelineSchema) are imported but not shown; cannot verify if parameters have descriptions explaining format, constraints, or dependencies. This violates pattern:tool-description which requires every parameter to have a non-empty description.
Output schemas not documented. Tool definitions show inputSchema but no outputSchema or return type documentation. LLMs cannot plan downstream tool calls or extract required fields (e.g., IDs for chaining). Violates pattern:tool and mxe:include-chaining-ids.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
Create a new pull request, including reviewers, linked work items, and optional tags
Create a new wiki in the project
Create a new page in a wiki. If the page already exists at the specified path, it will be updated.
Create a new work item
Download a file from a pipeline run artifact and return its textual content
Displays a hierarchical tree view of files and directories across multiple Azure DevOps repositories within a project, based on their default branches
Get content of a file or directory from a repository
Get details of the authenticated user (id, displayName, email)
Get details of a specific pipeline
Retrieve a specific pipeline log using the timeline log identifier
Get details for a specific pipeline run
Get details of a specific project
Get comprehensive details of a project including process, work item types, and teams
Get a pull request by ID (no repositoryId required; best for Azure DevOps Server where PR IDs are project-scoped)
Get the files changed in a pull request, their unified diffs, source/target branch names, and the status of policy evaluations
Summarize the latest status checks and policy evaluations for a pull request. - Surfaces pipeline and run identifiers so you can jump straight to the blocking validation. - Pair with pipeline tools (e.g., get_pipeline_run, pipeline_timeline) to inspect failures in depth.
Get comments from a specific pull request
Get details of a specific repository
Get detailed information about a repository including statistics and refs
Displays a hierarchical tree view of files and directories within a single repository starting from an optional path
Get the content of a wiki page
Get details of wikis in a project
Get details of a specific work item
List recent commits on a branch including file-level diff content for each commit
List all Azure DevOps organizations accessible to the current authentication
List recent runs for a pipeline
List pipelines in a project
List all projects in an organization
List pull requests in a repository
List repositories in a project
List pages within an Azure DevOps wiki
List work items in a project
Add or remove links between work items
Retrieve the timeline of stages and jobs for a pipeline run, to reduce the amount of data returned, you can filter by state and result
Search for code across repositories in a project
Search for content across wiki pages in a project
Search for work items across projects in Azure DevOps
Trigger a pipeline run
Update an existing pull request with new properties, manage reviewers and work items, and add or remove tags
Update content of a wiki page
Update an existing work item
WRITE operations lack confirmation or dry-run patterns. Tools like trigger_pipeline, create_commit, create_pull_request, and delete operations have no confirmation step or dry-run mode. Agents can make irreversible mistakes without safeguards. Violates pattern:confirmation-request.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tool definitions lack MCP 2026-07-28 annotations to signal risk level. LLMs cannot distinguish safe reads from destructive writes without explicit hints. Violates current spec alignment.
Error handling lacks recovery guidance. No evidence of actionable error messages (e.g., 'User not found. Try search_users() first.') or error classification (retryable vs. user-fixable vs. fatal). Violates pattern:recovery-guide.