SafetyCard Request a review

Azure DevOps MCP Server (local)

Microsoft's local stdio MCP server that exposes Azure DevOps boards, repos, pull requests, pipelines, wikis, test plans and search as tools.

github.com/microsoft/azure-devops-mcp · 2026-10-05 · 2ffa682

Defense-in-depth score

5.2 / 10

Microsoft's local Azure DevOps MCP server signs in as you and, by default, loads every tool group, so an AI assistant can commit code, run pipelines, approve pull requests and edit work items and wikis with your full Azure DevOps rights and no confirmation step of its own. The dominant risk is prompt injection through work items, pull request comments, wiki pages or files written by others: the server labels all returned content as untrusted, but that label is only a hint, and there is no read-only mode to switch off the write side. It runs no code, keeps no memory, loads no plugins and keeps the token away from the model, but it records nothing about the actions it takes.

Safest setup

Azure DevOps MCP Server keeps its token away from the model, labels every tool as read-only or mutating, and marks everything it returns as untrusted content. As shipped it signs in with your full Azure DevOps rights, loads every tool group with no approval step of its own and records nothing, so the safest setup narrows the identity and tool set and puts approval and records in your host and in Azure DevOps.

SetupHowWhat it gives you
A narrowly scoped token--authentication pat with PERSONAL_ACCESS_TOKEN holding a token limited to the projects and scopes the task needs, read-only where it allowsAzure DevOps itself refuses anything outside that token's scopes, whatever the model asks for C1
A read-only entry for reviewsAdd a second server entry with a read-only token for sessions that read other people's work items, pull requests or wiki pagesInstructions hidden in that content can't commit, run pipelines or approve pull requests C5
Branch and pipeline policiesRequire reviews on protected branches and approvals on pipeline environments, and give the agent's identity no permission to bypass policiesCommits and pipeline runs the agent starts still pass the checks your team set C3
Only the domains needed-d followed by just the domains the task uses, such as core and work-items, spelled as listedTool groups the task doesn't use, write tools included, never load C3
Per-call approval in your hostSet your MCP host to ask before every tool not marked readOnlyHint: trueA person sees each commit, pipeline run and pull request vote before it happens C2
Records outside the serverKeep the host's transcript and turn on auditing for the Azure DevOps organizationA trail of what the agent called and changed, since the server records nothing itself C9

Approving with confidence

  • Read each prompt and approve calls one at a time; pipeline runs, pull request approvals and auto-complete merges can't be taken back.
  • A write the task didn't ask for, right after reading a work item, comment or wiki page, is worth a closer look.

Handling data

  • A personal access token is long-lived; give it a short expiry and revoke it when the work is done.
  • Azure DevOps error text reaches the model as is, and the server logs to standard error at info level unless LOG_LEVEL says otherwise.

Key gaps (1)

  1. In the default configuration a session that reads other people's work items, pull requests and wiki pages also holds the user's full Azure DevOps access and unattended tools that commit files, run pipelines and approve pull requests, so a prompt injection can leak private data and take irreversible actions with no human step in the server. C5 · Untrusted input blast radius

Criteria

C1 Identity & least privilege

0.05 / 1.00

By default the server signs the user in through Microsoft Entra and asks for a token with the user's full Azure DevOps permissions, then uses that one token for every tool, reads and writes alike. Tokens are short-lived and held in memory, and every request is built against the single organization named on the command line, but nothing narrows what the token itself may do. A personal access token mode lets the operator supply a token with chosen scopes, but the code does not ask for or check any scope, so least privilege depends entirely on manual setup.

C2 Approval gates

0.63 / 1.00

The host application, not the server, decides which calls need a human, so this criterion rates the signals the server gives it. Reads and writes are separate tools, every tool carries read-only or destructive hints from one central table, and registration fails if a tool has no entry, so a new tool cannot ship unlabelled. There is no server-side confirmation step, no read-only mode, and a dry run exists only for previewing a pipeline's YAML. The server offers no delete tools, and most of its writes keep history in Azure DevOps, but pipeline runs, pull request approvals and auto-complete merges cannot be taken back.

C3 Tool & action scoping

0.53 / 1.00

The tools are purpose-built Azure DevOps operations with typed schemas and fixed action lists rather than a generic HTTP passthrough, and every request URL is built from the single organization given at startup; a wiki URL supplied by the model is refused if it points at another organization. Local file saves must be relative paths without traversal, under the server's working directory, and downloads have size caps. Some tools stay broad, though: ad-hoc WIQL queries, pipeline runs with caller-supplied variables and parameters, commits to any existing branch, and pull request auto-complete with an option to bypass branch policies. Many list sizes have no upper bound, and the default loads every tool group, writes included.

C4 Code-execution isolation

N/A · full credit 1.00 / 1.00

The server never runs model-supplied code or commands: it starts no subprocesses and has no eval or template execution. The only process it opens is the system browser for the sign-in page. Pipeline runs it can trigger execute on Azure DevOps agents, not in the server, and are scored as consequential actions under approval gates and untrusted input.

C5 Untrusted input blast radius

0.25 / 1.00

Everything the server returns from Azure DevOps (work items, comments, pull request threads, repository files, wiki pages, build logs, search results) is written by other people, and every tool's text output is wrapped in randomized delimiters labelled as untrusted with the source area. That marking is consistent and cannot be switched off, but it is a hint to the model, not a limit: the same default session holds the user's full access to private code and boards and can commit, run pipelines, approve pull requests and post content with nothing in the server requiring a human. There is no read-only mode that would drop the write side.

C6 Memory, context & configuration integrity

N/A · full credit 1.00 / 1.00

The server keeps no memory between sessions and loads no instruction or configuration files from the workspace: settings come from command-line flags and environment variables set by the operator. The only file it persists is a cache in the home directory mapping the organization name to its Microsoft Entra tenant, filled from an Azure DevOps response header and never shown to the model. Content the agent writes into Azure DevOps (wiki pages, work items) can of course be read back later; that exposure is scored under untrusted input.

C7 Third-party extensions

N/A · full credit 1.00 / 1.00

The server loads no third-party code at runtime: no plugins, no MCP servers of its own, no downloaded tools or models. The one dynamic import is Microsoft's own sign-in broker library, a declared package dependency.

C8 Secrets & sensitive-data protection

0.42 / 1.00

The server never hands its token to the model: no tool returns it, it is not written to logs, and the default sign-in keeps short-lived tokens only in memory. In personal access token mode the server also checks the destination host before sending the token. There is, however, no masking or redaction layer at all: API error bodies are passed back to the model verbatim, and protection rests on the code simply not printing credentials. There is no telemetry, and logs go to standard error at info level by default. A leaked default token is short-lived but carries the user's full Azure DevOps rights.

C9 Audit & traceability

0.00 / 1.00

The server keeps no record of the tools it runs. Its logger writes startup and sign-in events to standard error, but no tool logs its calls, arguments or results, and there is no audit file, trace export or correlation ID. After an incident, what the agent did can only be pieced together from the host's transcript or Azure DevOps's own history, which shows the user as the actor.

C10 Limits & kill switch

0.33 / 1.00

A few operations have hard limits in the server: build artifact downloads are capped (1 GB to disk, 10 MB inline), ad-hoc WIQL queries are limited in length, directory listing depth is clamped, and one retry loop is bounded. Everything else is unbounded: most list sizes are whatever the model asks for, work item attachment downloads have no size cap, no request has a timeout, there is no rate limit on writes, and a cancelled call keeps running. Azure DevOps's own throttling is the main external ceiling.