ado-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ado-mcp-serverShow me my open bugs in the current sprint"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Azure DevOps MCP Server (Server & Services)
An MCP server that connects Claude (and other MCP clients) to Azure DevOps Server (on-premises: 2019, 2020, 2022) and Azure DevOps Services (cloud).
Uses your own Personal Access Token: you see exactly what your account can see.
Read-only by default. Write and delete tools are only loaded when you choose a higher access level.
Covers work items, test plans, repos, pull requests and pipelines.
Access levels
Level | What is enabled |
| All search and read tools |
| + create/update work items and bugs, links, comments, test cases, suites, PR comments, run pipelines |
| + deletes ( |
Tools above your level are not registered at all, so the model cannot see or call them.
Related MCP server: Azure DevOps MCP Server
How changes are approved
Every write tool works in two steps:
Called with
preview=True(the default) it changes nothing and returns exactly what would happen, e.g.State: New -> Active,Priority: 2 -> 1.Only after you approve, it is called again with
preview=False.
update_work_item also returns the current revision; passing it back as expected_revision
makes the update fail if someone else changed the item in between.
On top of that, write tools are annotated readOnlyHint: false and delete tools
destructiveHint: true, so your MCP client asks for permission before each call.
Do not choose "Always allow" for write or delete tools.
Tools
Area | Read | Write ( | Delete ( |
Connection |
| ||
Work items |
|
|
|
Test |
|
|
|
Boards |
| ||
Repos |
|
| |
Pipelines |
|
|
Create a Personal Access Token
User settings → Personal access tokens → New token. Suggested scopes:
Scope | read | write / full |
Work Items | Read | Read & Write |
Test Management | Read | Read & Write |
Code | Read | Read & Write (PR comments) |
Build | Read | Read & Execute (run pipelines) |
Project and Team | Read | Read |
Use a short expiry and never share your PAT. Everything you do through this server is recorded in Azure DevOps under your name.
Install
Claude Desktop - one command
No Developer Mode needed. The script downloads the latest release and opens the installer in Claude Desktop; you only fill in the form.
Windows (PowerShell):
irm https://raw.githubusercontent.com/ms31376/ado-mcp-server/main/install.ps1 | iexmacOS (Terminal):
curl -fsSL https://raw.githubusercontent.com/ms31376/ado-mcp-server/main/install.sh | bashClaude Desktop - manual
Download the latest extension: https://github.com/ms31376/ado-mcp-server/releases/latest/download/ado-mcp-server.mcpb
Double-click the downloaded file (or drag it onto the Claude Desktop window; dropping it into the chat box only attaches it to a message).
Click Install and fill in the form.
To change settings later (for example the access level): open Claude Desktop Settings → Customize → Connectors (called Extensions in some versions), select Azure DevOps, change the settings, then turn the extension off and on (or restart Claude Desktop).
Claude Code
Works from any terminal (PowerShell, cmd, bash); you don't need to know where Claude Code is installed. One line:
claude mcp add --scope user azure-devops -e ADO_URL=https://server/Collection -e ADO_PAT=YOUR_PAT -e ADO_ACCESS_LEVEL=read -- uvx --from git+https://github.com/ms31376/ado-mcp-server ado-mcp-serverThen run /mcp inside Claude Code to check the connection.
Other MCP clients (VS Code, Cursor, ...)
{
"mcpServers": {
"azure-devops": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ms31376/ado-mcp-server", "ado-mcp-server"],
"env": {
"ADO_URL": "https://dev.azure.com/YourOrg",
"ADO_PAT": "...",
"ADO_PROJECT": "MyProject",
"ADO_ACCESS_LEVEL": "read"
}
}
}
}This runs the code straight from GitHub; uvx downloads it on first start. A PyPI package
(uvx ado-mcp-server) is planned.
All methods need uv except the Claude Desktop extension, which manages Python by itself.
Configuration
Variable | Default | Description |
| (required) |
|
| (required) | Personal Access Token |
| Default project | |
|
| Default team for iteration tools |
|
|
|
|
|
|
|
| Ignore |
|
| SSL verification |
| Path to a company CA certificate (.pem) |
Troubleshooting
Symptom | Fix |
| The PAT is wrong, expired or missing a scope. Copy it again without spaces. |
Timeouts with an internal server | A proxy/VPN app is in the way: enable Ignore system proxy ( |
"The server returned an HTML page" | Wrong server URL, or a sign-in page in between. Use the collection URL, e.g. |
SSL certificate error | Set your company CA certificate ( |
Tool count did not change after changing the access level | Turn the extension off and on, or restart Claude Desktop. Check with |
Claude says no Azure DevOps tools are connected | Make sure the chat is in the Claude Desktop app (not the browser) and the extension is enabled in the chat's tools menu. |
Development
uv run --group dev pytest -q # tests
uv run mcp dev server/main.py # MCP Inspector
npx @anthropic-ai/mcpb pack . ado-mcp-server.mcpbLicense
MIT
Available Tools
28 toolsbrowse_repositoryBRead-only
List files and folders in a repository folder (one level).
Inputs: repository (required), path, branch, project. Returns: result
get_commentsCRead-only
Comments (Discussion) of a work item.
Inputs: work_item_id (required), top. Returns: result
get_file_contentCRead-only
Content of a text file in a repository (truncated to max_chars).
Inputs: path (required), repository (required), branch, project, +1 more.
get_pipeline_logARead-only
Log of a run. Without log_id, returns the last lines of every failed step. (log_id values come from get_pipeline_run.)
Inputs: build_id (required), log_id, project, tail_lines. Returns: result
get_pipeline_runBRead-only
Details of one run, including failed or warning steps with their error messages.
Inputs: build_id (required), project.
get_pull_requestBRead-only
Details of a pull request: description, reviewers and votes, linked work items.
Inputs: pull_request_id (required), project.
get_suite_test_resultsBRead-only
Test points of a suite: each test case per configuration with tester and last outcome (Passed / Failed / Blocked / NotApplicable / NotRun), plus a summary count.
Inputs: plan_id (required), suite_id (required), project.
get_task_scheduleCRead-only
Scheduling view: start/target dates, estimates, remaining work, overdue flags and remaining work per person.
current_iteration=True uses the team's current sprint. work_item_type: one or several separated by commas, e.g. "Task, Bug".
Inputs: top, team, project, assigned_to, +4 more.
get_test_caseCRead-only
One test case with its parsed steps (action / expected result).
Inputs: test_case_id (required).
get_work_itemBRead-only
Full details of one work item: description, repro steps, acceptance criteria, scheduling fields and links (parent, children, related, tested by, commits, PRs).
Inputs: work_item_id (required).
get_work_item_historyBRead-only
Change history of a work item: who changed which fields, from what to what.
Inputs: work_item_id (required), top. Returns: result
list_branchesCRead-only
Branches of a repository; name_filter matches the start of the branch name.
Inputs: repository (required), project, name_filter. Returns: result
list_commitsBRead-only
Recent commits of a repository, optionally for a branch, author or file/folder path.
Inputs: repository (required), top, path, author, +2 more. Returns: result
list_iterationsCRead-only
Team iterations (sprints) with start/finish dates. timeframe: optional filter "past", "current" or "future".
Inputs: team, project, timeframe. Returns: result
list_pipeline_runsBRead-only
Recent runs (builds), newest first. status: inProgress, completed, notStarted, ... result: succeeded, failed, canceled, partiallySucceeded.
Inputs: top, branch, result, status, +2 more. Returns: result
list_pipelinesBRead-only
Pipelines (build definitions) of a project; name_filter supports * wildcards.
Inputs: project, name_filter. Returns: result
list_projectsBRead-only
Projects the PAT can see.
Inputs: no named parameters. Returns: result
list_pull_requestsBRead-only
Pull requests of a project (or one repository). status: active, completed, abandoned or all. created_by: part of a name.
Inputs: top, status, project, created_by, +2 more. Returns: result
list_repositoriesBRead-only
Git repositories (of one project, or of all visible projects if no project is set).
Inputs: project. Returns: result
list_team_membersDRead-only
Members of a team.
Inputs: team (required), project. Returns: result
list_teamsCRead-only
Teams of a project (team names are used by iteration and schedule tools).
Inputs: project. Returns: result
list_test_plansCRead-only
Test plans of a project.
Inputs: project, active_only. Returns: result
list_test_suitesCRead-only
Suites of a test plan, with parent suite ids to rebuild the tree.
Inputs: plan_id (required), project. Returns: result
list_work_item_typesCRead-only
Work item types of a project (Bug, Task, User Story, Feature, Test Case, ...).
Inputs: project. Returns: result
query_wiqlBRead-only
Run a read-only WIQL query (SELECT ... FROM WorkItems / WorkItemLinks ...) for searches the other tools cannot express. Returns work item summaries.
Inputs: wiql (required), top, project. Returns: result
search_test_casesBRead-only
Search Test Case work items by title text, state, owner ("@me"), tags, area or iteration.
Inputs: top, tags, text, state, +4 more. Returns: result
search_work_itemsARead-only
Search work items of any type.
text: matches the title, or the ID if numeric. work_item_type: one type or several separated by commas, e.g. "Bug, Task". assigned_to / created_by: part of a name, or "@me". tags: one tag or several separated by ";" (all must match). iteration_path / area_path: includes children, e.g. "MyProject\Sprint 12".
Inputs: top, tags, text, state, +8 more. Returns: result
whoamiARead-only
Check the connection: the signed-in user (owner of the PAT), server URL, access level of this extension and which tools are enabled.
Inputs: no named parameters.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 28 tools
Most tools are clearly separated by Azure DevOps subdomain and action: work items, pipelines, repositories, tests, teams. There is minor overlap between search_work_items, search_test_cases, and query_wiql as multiple search entry points, but the descriptions generally make the intended use clear.
The set uses a consistent snake_case verb_noun pattern such as get_work_item, list_pipeline_runs, and search_test_cases. whoami is the only meaningful deviation, but it is a conventional identity command and remains understandable.
At 28 tools, the surface is heavy and exceeds the well-scoped range, even for a broad platform like Azure DevOps. While many tools serve distinct domains, the total volume increases selection burden for an agent.
The surface is almost entirely read-only: there are no create, update, delete, queue-pipeline, or PR mutation operations. Even if read-only inspection is intentional, notable read gaps remain such as PR file/thread details and repository code search.
Maintenance
Related MCP Connectors
The MCP server for Azure DevOps, bringing the power of Azure DevOps directly to your agents.
One OAuth connector for your team's remote MCP servers, with Tool Packs, guardrails and logs.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Toolstile is a managed MCP gateway that connects remote MCP servers behind one endpoint, with per-agent permissions, shared accounts and activity logs. Connect at https://mcp.toolstile.com/mcp over Streamable HTTP with OAuth; sign in at https://toolstile.com, select a workspace and connect your upstream servers. Available tools, resources and prompts depend on that workspace and the agent's granted access.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables integration with Azure DevOps services, allowing interaction with work items, pull requests, pipelines, wikis, boards, and projects through natural language in Cline and other MCP clients.2MIT
- AlicenseBqualityDmaintenanceA read-only MCP server connecting AI assistants to Azure DevOps Server (on-premises) for browsing projects, repos, builds, work items, releases, pipelines, and test results.39689 npm1MIT
- AlicenseBqualityCmaintenanceEnables Claude Code to interact with Azure DevOps Server on-premises (work items, pull requests, repositories) through secure, controlled, safe-by-default access with read-only mode and explicit write confirmations.22MIT
- FlicenseBqualityCmaintenanceEnables users to securely connect Claude Desktop to Azure DevOps for managing work items, metadata, comments, pull requests, and code reviews.15-