Ado Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Ado Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that provides Azure DevOps integration for AI assistants and development tools. Enables your AI assistant to list projects, run pipelines, analyze failures, view logs, and troubleshoot builds directly from your chat interface.
📚 [Full Documentation](https://ado-mcp.readthedocs.io/) | 🚀 [Quick Start](#prerequisites) | 🛠️ [API Reference](https://ado-mcp.readthedocs.io/en/latest/api.html)
You'll need these installed before setting up the MCP server:
# Install UV (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh # Install Azure CLI
# macOS: brew install azure-cli
# Windows: winget install Microsoft.AzureCLI
# Linux: curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Install Azure DevOps extension
az extension add --name azure-devops # Login to Azure DevOps with your PAT
az devops login --organization https://dev.azure.com/YourOrgWhen prompted, enter your Personal Access Token. This stores your credentials securely in the system keyring.
# Test that everything works
uvx ado-mcp --help<details> <summary><b>Install in Claude Desktop</b></summary>
~/Library/Application Support/Claude/claude_desktop_config.json): {
"mcpServers": {
"ado-mcp": {
"command": "uvx",
"args": ["ado-mcp"],
"env": {
"ADO_ORGANIZATION_URL": "https://dev.azure.com/YourOrg"
}
}
}
}%APPDATA%\Claude\claude_desktop_config.json): {
"mcpServers": {
"ado-mcp": {
"command": "uvx",
"args": ["ado-mcp"],
"env": {
"ADO_ORGANIZATION_URL": "https://dev.azure.com/YourOrg"
}
}
}
}Note: uvx automatically downloads and runs the latest version. No manual installation needed!
</details>
<details> <summary><b>Install in Claude Code</b></summary>
# Add to local scope (project-specific)
claude mcp add ado-mcp uvx ado-mcp -e ADO_ORGANIZATION_URL=https://dev.azure.com/YourOrg
# Or add to user scope (available across all projects)
claude mcp add ado-mcp uvx ado-mcp -e ADO_ORGANIZATION_URL=https://dev.azure.com/YourOrg -s user # List configured MCP servers
claude mcp list@ado-mcp:.../mcp__ado-mcp__list_projectsNote: Claude Code automatically handles the uvx execution and authentication via Azure CLI.
</details>
<details> <summary><b>Install in Cursor</b></summary>
Settings → Cursor Settings → MCP → Add new global MCP server {
"name": "ado-mcp",
"command": "uvx",
"args": ["ado-mcp-raboley"],
"env": {
"ADO_ORGANIZATION_URL": "https://dev.azure.com/YourOrg"
}
}</details>
<details> <summary><b>Install in VS Code with Continue</b></summary>
{
"models": [...],
"mcpServers": [
{
"name": "ado-mcp",
"command": "uvx",
"args": ["ado-mcp"],
"env": {
"ADO_ORGANIZATION_URL": "https://dev.azure.com/YourOrg"
}
}
]
}</details>
<details> <summary><b>Install in Zed</b></summary>
Cmd+, on macOS, Ctrl+, on Linux/Windows). {
"language_models": {
"mcp_servers": {
"ado-mcp": {
"command": "uvx",
"args": ["ado-mcp"],
"env": {
"ADO_ORGANIZATION_URL": "https://dev.azure.com/YourOrg"
}
}
}
}
}</details>
<details> <summary><b>Install in any MCP-compatible client</b></summary>
The server can be used with any MCP-compatible client:
Command: uvx ado-mcp
Required environment variable:
ADO_ORGANIZATION_URL: Your Azure DevOps organization URL (e.g., https://dev.azure.com/YourOrg)Connection details:
Authentication: Automatically uses Azure CLI credentials from az devops login
</details>
<details> <summary><b>Alternative: Environment Variable Authentication</b></summary>
If you prefer not to use Azure CLI, you can set environment variables directly:
export AZURE_DEVOPS_EXT_PAT="your-personal-access-token"
export ADO_ORGANIZATION_URL="https://dev.azure.com/YourOrg" {
"mcpServers": {
"ado-mcp": {
"command": "uvx",
"args": ["ado-mcp"]
}
}
}⚠️ Security Note: This method requires storing tokens as environment variables. The Azure CLI method is more secure as it stores credentials in the system keyring.
</details>
task installThe MCP server supports multiple authentication methods (in order of precedence):
Environment Variable Method:
task setup-envThis creates a .env file with your Personal Access Token (PAT) and other necessary variables.
Direct Configuration:
export AZURE_DEVOPS_EXT_PAT="your-personal-access-token"
export ADO_ORGANIZATION_URL="https://dev.azure.com/YourOrg"If you already use Azure CLI, you can authenticate using your existing session:
# Login to Azure (if not already logged in)
az login
# The MCP server will automatically use your Azure CLI credentials
task runBenefits of Azure CLI authentication:
Note: Azure CLI authentication requires the user to be logged in with an account that has access to the Azure DevOps organization.
The ado-mcp project uses a Terraform-based test infrastructure that creates isolated test environments.
cp .env.example .env # Edit with your Azure DevOps details task ado-up # Creates Azure DevOps project and infrastructure task test task ado-down # Destroys the test environment task test task test-single TEST_NAME=tests/test_example.py::test_function_name task coverage📚 [Detailed Testing Setup Guide](docs/TESTING_SETUP.md)
task setup-ado-cliThis will:
Note: This is for az devops commands and does NOT enable the Azure CLI authentication test, which requires full Azure authentication (az login).
task run task inspectOnce installed and configured, you can use the MCP server through your AI assistant. Here are some common tasks:
List all projects:
Show me all Azure DevOps projects in my organization.Find and run a pipeline:
Find the "deploy-production" pipeline in the "MyApp" project and run it.Check recent build failures:
What pipelines have failed recently? Show me the failure details.Analyze a failed build from a URL:
Analyze this failed build: https://dev.azure.com/MyOrg/MyProject/_build/results?buildId=123Get detailed failure logs:
Show me the detailed logs for the failed steps in pipeline run 456.Compare pipeline runs:
Compare the latest run of "ci-pipeline" with the previous successful run.Monitor pipeline execution:
Run the "integration-tests" pipeline and monitor its progress. Alert me when it completes.Create deployment insights:
Generate a summary of all deployment pipeline runs from the last week.Troubleshoot build issues:
Help me troubleshoot why the "build-and-test" pipeline keeps failing on the test step."No authentication method available" error:
# Check if you're logged into Azure DevOps
az devops configure --list
# If not configured, login with your PAT
az devops login --organization https://dev.azure.com/YourOrg"Authentication failed" with sign-in page response:
# Your PAT might be expired, login again
az devops logout
az devops login --organization https://dev.azure.com/YourOrgPermission errors:
"uvx ado-mcp" not working:
# Check UV installation
uvx --version
# Install UV if needed
curl -LsSf https://astral.sh/uv/install.sh | sh
# Test the package
uvx ado-mcp --helpAzure CLI not found:
# Install Azure CLI (Ubuntu/Debian)
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Install Azure CLI (macOS)
brew install azure-cli
# Install Azure CLI (Windows)
# Download and install from: https://aka.ms/installazurecliwindowsIf you want to contribute to this project or run it from source:
task installThe MCP server supports multiple authentication methods (in order of precedence):
Environment Variable Method:
task setup-envThis creates a .env file with your Personal Access Token (PAT) and other necessary variables.
Direct Configuration:
export AZURE_DEVOPS_EXT_PAT="your-personal-access-token"
export ADO_ORGANIZATION_URL="https://dev.azure.com/YourOrg"If you already use Azure CLI, you can authenticate using your existing session:
# Login to Azure (if not already logged in)
az login
# The MCP server will automatically use your Azure CLI credentials
task runBenefits of Azure CLI authentication:
Note: Azure CLI authentication requires the user to be logged in with an account that has access to the Azure DevOps organization.
The ado-mcp project uses a Terraform-based test infrastructure that creates isolated test environments.
cp .env.example .env # Edit with your Azure DevOps details task ado-up # Creates Azure DevOps project and infrastructure task test task ado-down # Destroys the test environment task test task test-single TEST_NAME=tests/test_example.py::test_function_name task coverage📚 [Detailed Testing Setup Guide](docs/TESTING_SETUP.md)
task setup-ado-cliThis will:
Note: This is for az devops commands and does NOT enable the Azure CLI authentication test, which requires full Azure authentication (az login).
task run task inspect task docs-serveThis automatically builds the docs and serves them at http://localhost:8000
The documentation is built with Sphinx and hosted on Read the Docs.
When working with Azure DevOps URLs from the web interface, it's important to understand the difference between build/run IDs and pipeline definition IDs:
Example URL: https://dev.azure.com/RussellBoley/ado-mcp/_build/results?buildId=324&view=results
RussellBoley (from the URL path)ado-mcp (from the URL path)To work with a specific build/run from an Azure DevOps URL:
RussellBoleyado-mcp324 (from buildId parameter) # Get build details to find the pipeline definition
build_details = await client.call_tool("get_build_by_id", {
"project_id": "49e895da-15c6-4211-97df-65c547a59c22", # ado-mcp project ID
"build_id": 324 # The buildId from the URL
})
# Extract pipeline information
pipeline_id = build_details.data["definition"]["id"] # e.g., 84
pipeline_name = build_details.data["definition"]["name"] # e.g., "log-test-complex" # Get detailed run information
run_details = await client.call_tool("get_pipeline_run", {
"project_id": "49e895da-15c6-4211-97df-65c547a59c22",
"pipeline_id": pipeline_id, # 84
"run_id": 324 # Same as buildId
})
# Get failure analysis if needed
failure_summary = await client.call_tool("get_pipeline_failure_summary", {
"project_id": "49e895da-15c6-4211-97df-65c547a59c22",
"pipeline_id": pipeline_id,
"run_id": 324
})❌ Don't do this:
# This will fail - you can't guess the pipeline_id
await client.call_tool("get_pipeline_run", {
"project_id": "49e895da-15c6-4211-97df-65c547a59c22",
"pipeline_id": 15, # Wrong! This is just a guess
"run_id": 324
})✅ Do this instead:
# First, get the build details to find the correct pipeline_id
build_data = await client.call_tool("get_build_by_id", {
"project_id": "49e895da-15c6-4211-97df-65c547a59c22",
"build_id": 324 # buildId from URL
})
pipeline_id = build_data.data["definition"]["id"] # Now you have the correct pipeline_id
# Then use it for pipeline-specific operations
await client.call_tool("get_pipeline_run", {
"project_id": "49e895da-15c6-4211-97df-65c547a59c22",
"pipeline_id": pipeline_id, # Correct pipeline_id
"run_id": 324
})~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.