Azure DevOps MCP Server

Community server for Azure DevOps work items, repos, pull requests, pipelines and wikis

By Micah Rairdon (individual) TypeScript Local · stdio Git and code hostingDevOps and monitoringProductivity

69 popularity score ★ 399 ↓ 16k/wk

Connect your client

Local (npm)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs AZURE_DEVOPS_ORG_URL. Replace each <NAME> with your value.

Claude CodeTerminal
claude mcp add azure-devops -e AZURE_DEVOPS_ORG_URL=<AZURE_DEVOPS_ORG_URL> -- npx -y @tiberriver256/mcp-server-azure-devops
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "azure-devops": {
      "command": "npx",
      "args": [
        "-y",
        "@tiberriver256/mcp-server-azure-devops"
      ],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "<AZURE_DEVOPS_ORG_URL>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "azure-devops": {
      "command": "npx",
      "args": [
        "-y",
        "@tiberriver256/mcp-server-azure-devops"
      ],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "<AZURE_DEVOPS_ORG_URL>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "azure-devops": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@tiberriver256/mcp-server-azure-devops"
      ],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "<AZURE_DEVOPS_ORG_URL>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.azure-devops]
command = "npx"
args = ["-y", "@tiberriver256/mcp-server-azure-devops"]

[mcp_servers.azure-devops.env]
AZURE_DEVOPS_ORG_URL = "<AZURE_DEVOPS_ORG_URL>"
Gemini CLITerminal
gemini mcp add --scope user -e AZURE_DEVOPS_ORG_URL=<AZURE_DEVOPS_ORG_URL> azure-devops npx -- -y @tiberriver256/mcp-server-azure-devops
Local (from source)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

It needs AZURE_DEVOPS_ORG_URL. Replace each <NAME> with your value.

FirstTerminal
git clone https://github.com/tiberriver256/mcp-server-azure-devops.git
cd mcp-server-azure-devops
npm ci
npm run build
Claude CodeTerminal
claude mcp add azure-devops -e AZURE_DEVOPS_ORG_URL=<AZURE_DEVOPS_ORG_URL> -- node '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "azure-devops": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
      ],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "<AZURE_DEVOPS_ORG_URL>"
      }
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "azure-devops": {
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
      ],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "<AZURE_DEVOPS_ORG_URL>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "azure-devops": {
      "type": "stdio",
      "command": "node",
      "args": [
        "<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"
      ],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "<AZURE_DEVOPS_ORG_URL>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.azure-devops]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/dist/index.js"]

[mcp_servers.azure-devops.env]
AZURE_DEVOPS_ORG_URL = "<AZURE_DEVOPS_ORG_URL>"
Gemini CLITerminal
gemini mcp add --scope user -e AZURE_DEVOPS_ORG_URL=<AZURE_DEVOPS_ORG_URL> azure-devops node -- '<ABSOLUTE_PATH_TO_CLONE>/dist/index.js'

Settings 9

AZURE_DEVOPS_ORG_URL Required: Organisation URL (https://dev.azure.com/<org>) or Server collection URL; the server exits without it.
AZURE_DEVOPS_AUTH_METHOD Optional: pat, azure-identity or azure-cli; defaults to azure-identity. On-premises needs pat.
AZURE_DEVOPS_PAT Optional: Personal Access Token; needed when the auth method is pat.
AZURE_DEVOPS_DEFAULT_PROJECT Optional: Project used when a tool call names none.
AZURE_DEVOPS_API_VERSION Optional: REST api-version for tools that call the API directly; default 7.1.
AZURE_TENANT_ID Optional: Tenant id, for service principal sign-in via Azure Identity.
AZURE_CLIENT_ID Optional: Application id, for service principal sign-in.
AZURE_CLIENT_SECRET Optional: Client secret, for service principal sign-in.
LOG_LEVEL Optional: debug, info, warn or error; AZURE_DEVOPS_LOG_LEVEL takes precedence.

What it does

A community-built stdio server that talks to the Azure DevOps REST API on your behalf. It covers the everyday parts of the product: listing projects and repositories, reading files and trees, browsing commits, creating branches and commits, opening and updating pull requests, querying and editing work items with their links, comments and attachments, searching code, wikis and work items, inspecting and triggering pipeline runs, and reading or writing wiki pages. Repository content is also exposed as MCP resources by URI.

The author points readers using Azure DevOps Services (cloud) to Microsoft's own server first, and positions this one for Azure DevOps Server (on-premises), including older releases, and for features the official server lacks. It connects to cloud organisations with a PAT, the Azure Identity SDK or an Azure CLI login, and to on-premises collections with a PAT only.

The README lists 42 tools, but version 0.1.49 registers 50: the tool definition files add list_commits, get_all_repositories_tree, get_work_item_comments, update_pull_request_thread_status, create_wiki, create_wiki_page, update_wiki_page and list_wiki_pages. The server also reads AZURE_DEVOPS_LOG_LEVEL, checked ahead of LOG_LEVEL, a name the README's table leaves out (src/index.ts).

What it needs

RuntimeNode.js 16+

Node.js 16 or later, for npx. An Azure DevOps Services organisation or an Azure DevOps Server collection, and an account with access to the projects you want to use. Credentials: a Personal Access Token, or, for cloud only, an Azure CLI session (az login) or Azure Identity credentials such as a service principal (AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET).

Limits

Azure DevOps Server (on-premises) works with PAT authentication only; get_me and list_organizations work only against Azure DevOps Services. With no AZURE_DEVOPS_AUTH_METHOD set it uses azure-identity, so a PAT on its own is ignored unless the method is set to pat. The server exits at start if AZURE_DEVOPS_ORG_URL is empty, or if the method is pat and no token is given (src/server.ts). Tools that call the REST API directly use api-version 7.1 unless AZURE_DEVOPS_API_VERSION is set, and older on-premises releases may need a lower value. create_wiki_page overwrites a page that already exists at the given path.

Who it suits

Teams on Azure DevOps Server (on-premises), where the author says Microsoft's server may not work, or anyone who wants an assistant to work across boards, repos, pull requests, pipelines and wikis from one local process. On Azure DevOps Services the author recommends Microsoft's own server (microsoft/azure-devops-mcp, which we also list), which is product-supported and also offers a hosted endpoint. Because many tools write (commits, branches, pull requests, work items, wiki pages, pipeline runs), use a token with only the scopes you want it to have.

Tools 49 of 50

get_me
Show the signed-in user's id, name and email (cloud only)
list_organizations
List the organisations the account can reach (cloud only)
list_projects
List projects in the organisation
get_project
Fetch one project
get_project_details
Fetch a project with its process, work item types and teams
list_repositories
List Git repositories in a project
get_repository
Fetch one repository
get_repository_details
Fetch a repository with statistics and refs
get_file_content
Read a file or directory listing from a repository
get_repository_tree
Show a repository's file tree from a path to a chosen depth
get_all_repositories_tree
Show file trees of several repositories' default branches at once
list_commits
List recent commits on a branch with file diffs
create_branch
Create a branch from an existing one
create_commit
Commit several file changes to a branch via diffs or search-and-replace
list_work_items
List work items in a project
get_work_item
Fetch a work item by id
create_work_item
Create a work item
update_work_item
Change fields of a work item
manage_work_item_link
Add, remove or change links between work items
get_work_item_comments
Read the comment history of a work item
create_work_item_attachment
Upload a local file and attach it to a work item
get_work_item_attachment
Download a work item attachment to a local file
delete_work_item_attachment
Remove an attachment from a work item
search_code
Search code across a project's repositories
search_wiki
Search wiki pages in a project
search_work_items
Search work items across projects
list_pipelines
List pipelines in a project
get_pipeline
Fetch one pipeline
list_pipeline_runs
List recent runs of a pipeline, with filters
get_pipeline_run
Fetch a run with its artifact summary
download_pipeline_artifact
Return one artifact file as text
pipeline_timeline
Show the stages and jobs of a run
get_pipeline_log
Read a run's log, raw or as JSON
trigger_pipeline
Start a pipeline run with parameters
get_wikis
List wikis in a project
get_wiki_page
Read a wiki page as plain text
list_wiki_pages
List the pages of a wiki
create_wiki
Create a wiki in a project
create_wiki_page
Add a wiki page, replacing one already at that path
update_wiki_page
Change the content of a wiki page
create_pull_request
Open a pull request
get_pull_request
Fetch a pull request by id
list_pull_requests
List pull requests in a repository
add_pull_request_comment
Comment on a pull request
get_pull_request_comments
Read a pull request's comment threads
update_pull_request_thread_status
Set the status of a pull request comment thread
update_pull_request
Change title, description, status, draft state, reviewers or linked work items
get_pull_request_changes
List a pull request's changed files and policy results
get_pull_request_checks
Summarise status checks, policies and related pipelines

Similar servers