MCP server for on-premises Azure DevOps Server (TFS). Covers Work Items, Git, TFVC (shelvesets, changesets, labels), Pipelines, Wiki, and Test Plans. Bridges Claude, GitHub Copilot, Cursor, Antigravity, and other AI assistants.
The server provides 4 well-named tools with clear, descriptive text and complete input schemas. All tools follow verb_noun naming conventions (list_commits, get_commit_changes, compare_branches, get_work_item_commits) appropriate to their actions. Descriptions are substantive (85-180 chars) and explain purpose, use cases, and return structure. Input schemas use proper JSON Schema with type definitions and per-parameter descriptions. Parameters accept both human-friendly names (branch, author) and system IDs (repositoryId). Error handling is present via sanitizeErrorMessage and errorResponse utilities with path/URL redaction. However, output schemas are not formally documented in the tool definitions, the code uses structuredResponse() but the outputSchema contract is inferred rather than declared. Parameters lack enum constraints where beneficial (e.g., 'top' is unbounded despite defaulting to reasonable limits). Tool descriptions could better explain interdependencies (e.g., when to use compare_branches vs list_commits). No tool-level risk annotations visible in schema (toolAnnotations=true in features, but implementation not shown in source). The security patterns (credential injection, audit logging) are present but not surfaced in tool metadata.
Compare two branches or commits — shows ahead/behind counts and changed files. Useful for reviewing what changed between branches before creating a PR.
Get the list of file changes (adds, edits, deletes) in a specific Git commit
Get all Git commits and pull requests linked to a work item, including file changes (optional). Useful for reviewing what code changes were made for a bug fix or feature.
List commits in a Git repository with optional filters (author, date range, path, branch). Returns commit history with messages, authors, and dates.
Output schemas not formally declared in tool definitions. Code uses structuredResponse() but no outputSchema JSON Schema is visible in tool registration. LLMs cannot predict return structure or plan downstream operations.
Numeric parameters (top, skip) lack bounds. Descriptions mention 'default 25' and 'default 100' but no min/max constraints. LLMs could pass absurd values (e.g., top=999999). Should specify 1 - 100 or 1 - 500 per API limits.
Tool descriptions do not include recovery guidance for common errors. E.g., list_commits filtering by non-existent author or branch should hint at search_commits() or available branches. LLM will dead-end on 'not found' errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | B | 71 | 2025-06-18+ | v2 |
Tool interdependencies are not documented. list_commits and compare_branches both operate on commits but from different angles. Descriptions should explain when to use each one.
Tool annotations (destructiveHint, idempotentHint, readOnlyHint) are flagged as supported but not visible in tool definitions. All 4 tools are read-only operations but lack explicit readOnlyHint metadata for client UIs.