Skip to main content
Glama
bugzy-ai

Azure DevOps MCP Server

by bugzy-ai

Azure DevOps MCP Server

MCP (Model Context Protocol) server for Azure DevOps Work Item Tracking integration. Enables AI assistants like Claude to search, create, update, and manage work items in Azure DevOps.

Features

  • Search Work Items: Query using WIQL (Work Item Query Language)

  • Get Work Item: Retrieve detailed work item information by ID

  • Create Work Item: Create Bugs, Tasks, User Stories, Features, etc.

  • Update Work Item: Modify fields, change state, update assignments

  • Add Comments: Add discussion comments to work items

Related MCP server: Azure DevOps MCP Server

Installation

npm install @bugzy-ai/azure-devops-mcp-server

Or run directly with npx:

npx @bugzy-ai/azure-devops-mcp-server

Configuration

Environment Variables

Variable

Required

Description

AZURE_DEVOPS_ORG_URL

Yes

Organization URL (e.g., https://dev.azure.com/myorg)

AZURE_DEVOPS_PAT

Yes

Personal Access Token

AZURE_DEVOPS_MCP_DEBUG

No

Enable debug logging to .azure-devops-mcp/mcp.log

Note: Project name is specified per-request, not via environment variable. The AI agent discovers the project from context (e.g., .bugzy/runtime/project-context.md) or uses azuredevops_list_projects to find available projects.

Creating a Personal Access Token (PAT)

  1. Go to Azure DevOps → User Settings → Personal Access Tokens

  2. Click "New Token"

  3. Set the required scopes:

    • vso.work - Read work items

    • vso.work_write - Create and update work items

  4. Copy the token and set it as AZURE_DEVOPS_PAT

MCP Configuration

Add to your MCP configuration file (e.g., claude_desktop_config.json):

{
  "mcpServers": {
    "azure-devops": {
      "command": "npx",
      "args": ["@bugzy-ai/azure-devops-mcp-server"],
      "env": {
        "AZURE_DEVOPS_ORG_URL": "https://dev.azure.com/your-org",
        "AZURE_DEVOPS_PAT": "your-pat-token"
      }
    }
  }
}

Tools

azuredevops_list_projects

List all projects in the Azure DevOps organization. Use this to discover available projects.

{
  top?: number,   // Max projects to return (default: 100, max: 100)
  skip?: number   // Number to skip for pagination (default: 0)
}

azuredevops_search_work_items

Search for work items using WIQL queries.

{
  project: string,     // Azure DevOps project name (required)
  wiql: string,        // WIQL query
  maxResults?: number  // Max results (default: 50, max: 200)
}

Example WIQL queries:

-- Find open bugs
SELECT [System.Id], [System.Title], [System.State]
FROM WorkItems
WHERE [System.WorkItemType] = 'Bug'
  AND [System.State] <> 'Closed'
ORDER BY [System.CreatedDate] DESC

-- Find work items assigned to me
SELECT [System.Id], [System.Title]
FROM WorkItems
WHERE [System.AssignedTo] = @Me
  AND [System.State] = 'Active'

-- Find recent items in a specific area
SELECT [System.Id], [System.Title], [System.WorkItemType]
FROM WorkItems
WHERE [System.AreaPath] UNDER 'Project\Team'
  AND [System.CreatedDate] >= @Today - 7

azuredevops_get_work_item

Get detailed information about a work item.

{
  project: string,      // Azure DevOps project name (required)
  id: number,           // Work item ID
  fields?: string[],    // Specific fields to retrieve
  expand?: "None" | "Relations" | "Fields" | "Links" | "All"
}

azuredevops_create_work_item

Create a new work item.

{
  project: string,       // Azure DevOps project name (required)
  type: string,          // "Bug", "Task", "User Story", etc.
  title: string,         // Work item title
  description?: string,  // Description (HTML supported)
  areaPath?: string,     // Area path
  iterationPath?: string,// Iteration/sprint path
  assignedTo?: string,   // User email or display name
  priority?: number,     // 1-4 (1=Critical, 4=Low)
  severity?: string,     // For bugs: "1 - Critical", "2 - High", etc.
  tags?: string,         // Semicolon-separated tags
  parentId?: number      // Parent work item ID
}

azuredevops_update_work_item

Update an existing work item using JSON Patch operations.

{
  project: string,  // Azure DevOps project name (required)
  id: number,
  operations: Array<{
    op: "add" | "remove" | "replace",
    path: string,   // e.g., "/fields/System.State"
    value?: any
  }>
}

Example - Change state to Active:

{
  "id": 123,
  "operations": [
    { "op": "replace", "path": "/fields/System.State", "value": "Active" }
  ]
}

azuredevops_add_comment

Add a comment to a work item.

{
  project: string,  // Azure DevOps project name (required)
  id: number,       // Work item ID
  text: string      // Comment text (HTML supported)
}

Development

# Install dependencies
npm install

# Build
npm run build

# Run with MCP Inspector (for testing)
npm run dev

# Watch mode
npm run build:watch

Debugging

Enable debug logging by setting AZURE_DEVOPS_MCP_DEBUG=true. Logs are written to .azure-devops-mcp/mcp.log.

License

MIT

Available Tools

6 tools
azuredevops_add_commentA

Add a comment to an existing Azure DevOps work item. Supports HTML formatting. Project is required - discover it from project context.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWork item ID to add comment to
textYesComment text (supports HTML formatting)
projectYesAzure DevOps project name (required - discover from project context)

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses HTML-formatting support for the comment body, but says nothing about permissions, whether the comment triggers notifications, whether it is reversible/editable, or what the call returns. For a mutation tool with zero annotation coverage this is a meaningful gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero waste, with the core action front-loaded and the two non-obvious constraints (HTML support, required project) following. Nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-param mutation tool with no annotations and no output schema, the description covers the essential action and the HTML/project requirements but omits the return payload and any auth or side-effect context an agent might need before writing a comment.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three params are already documented in the schema. The description only restates HTML formatting (also in the schema) and reiterates that project is required and must be discovered from context. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Add a comment to an existing Azure DevOps work item.' An agent can distinguish this from create_work_item or update_work_item. It does not, however, explicitly contrast itself with those siblings, so it stops just short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource (commenting on an existing item), but there is no explicit when-to-use guidance or exclusion relative to update_work_item, which also mutates a work item. The only routing-level advice is about obtaining the project, which is parameter guidance rather than tool-selection guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

azuredevops_create_work_itemC

Create a new Azure DevOps work item (Bug, Task, User Story, Feature, etc.). Project is required - discover it from project context.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags separated by semicolons (e.g., "tag1; tag2")
typeYesWork item type (e.g., "Bug", "Task", "User Story", "Feature")
titleYesWork item title
projectYesAzure DevOps project name (required - discover from project context)
areaPathNoArea path (e.g., "Project\\Team")
parentIdNoParent work item ID to link to
priorityNoPriority (1=Critical, 2=High, 3=Medium, 4=Low)
severityNoSeverity for bugs (e.g., "1 - Critical", "2 - High", "3 - Medium", "4 - Low")
assignedToNoUser to assign (email or display name)
descriptionNoWork item description (HTML supported)
iterationPathNoIteration path (e.g., "Project\\Sprint 1")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Create' implies a mutation, but it discloses nothing about required permissions, validation of the type field, whether creation is idempotent, or what happens on failure. Only the project-required prerequisite is noted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the core action, with no filler. The second sentence largely duplicates the schema's project description, which is mild redundancy but not bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with no output schema, the description never states what is returned (e.g., the new work item ID), which agents typically need for follow-up calls like add_comment or parent linking. With no annotations and 11 parameters, more behavioral context was warranted, though full schema coverage limits the damage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema, including the type enumerations and tag/areaPath formats. The description only restates the work item types and the project requirement, adding no syntax or constraint detail beyond the schema. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new Azure DevOps work item') and enumerates the work item types it handles. The create-vs-read-vs-update distinction from siblings like get_work_item and update_work_item is easy to infer, but no sibling is named explicitly, so it stops short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The only guidance is 'Project is required - discover it from project context,' which is a prerequisite hint rather than when-to-use guidance. It never says when to choose this over update_work_item, add_comment, or how it relates to search_work_items, and offers no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

azuredevops_get_work_itemA

Get detailed information about a specific Azure DevOps work item by its numeric ID. Project is required - discover it from project context.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWork item ID (numeric)
expandNoExpand options for additional data
fieldsNoSpecific fields to retrieve (e.g., ["System.Title", "System.State"])
projectYesAzure DevOps project name (required - discover from project context)

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries full disclosure burden. 'Get' implies a read-only operation and the project-discovery note addresses a prerequisite, but it says nothing about permissions/scopes, rate limits, or behavior of the expand/fields options. It adds modest value beyond a bare verb.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action front-loaded and the prerequisite stated second. Nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-item read tool with no output schema, the description tells the agent what is returned at a high level ('detailed information') and which keys identify the item. The enum semantics of expand are left to the schema, which is acceptable, but the description could say more about what 'detail' includes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are documented by the schema itself. The description only restates that ID is numeric and project is required/discoverable, adding no syntax or semantic detail beyond the schema — the baseline 3 for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Get), resource (Azure DevOps work item), and lookup key (numeric ID), which readily separates it from search_work_items, create_work_item, and update_work_item. It doesn't explicitly name a sibling alternative, keeping it just short of the top band.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: fetch details for a work item whose ID is already known, in contrast to search_work_items. The line 'Project is required - discover it from project context' offers procedural guidance, but there is no explicit when-to-use/when-not framing or named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

azuredevops_list_projectsA

List all projects in the Azure DevOps organization. Use this to discover available projects when the project name is not known or to verify a project exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of projects to return (default: 100, max: 100)
skipNoNumber of projects to skip for pagination (default: 0)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden but only asserts read-oriented discovery intent. It doesn't disclose return shape (names vs. ids), auth/permission requirements, or pagination behavior — the latter is only implied by the schema's top/skip. Also, 'List all projects' sits awkwardly against a hard 100-item cap, though the schema itself makes that limit explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, zero filler, with the core operation front-loaded before the routing guidance. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple no-argument read tool with fully documented params and no output schema, the description covers purpose and usage motivation adequately. It could mention auth expectations or the 100-result cap, but nothing essential to invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both 'top' and 'skip' are documented with defaults, bounds, and pagination purpose. The description adds no syntax or format detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and resource ('all projects in the Azure DevOps organization'), which is unambiguous. The sibling tools all operate on work items, so this project-discovery tool is trivially distinguishable without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it: 'when the project name is not known or to verify a project exists.' No alternatives are named, but no sibling competes for this job, so the guidance is effectively complete rather than needing exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

azuredevops_search_work_itemsA

Search for Azure DevOps work items using WIQL (Work Item Query Language). Returns a list of work items matching the query. Project is required - discover it from project context or use azuredevops_list_projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
wiqlYesWIQL query string (e.g., "SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.WorkItemType] = 'Bug'")
projectYesAzure DevOps project name (required - discover from project context)
maxResultsNoMaximum results to return (default: 50, max: 200)

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the return shape ('Returns a list of work items matching the query') and the hard project requirement, which is useful. It says nothing about read-only safety, permissions/scopes needed, or behavior on malformed WIQL, leaving meaningful gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the core action front-loaded and no filler. The project prerequisite is placed after the core statement rather than first, but the ordering is still logical and readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter search tool with no output schema, the description covers the action, the return type, and the mandatory prerequisite, so an agent can call it correctly. Missing operational detail (auth scopes, WIQL error behavior) is the only shortfall.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters are already documented with examples and bounds (maxResults min/max/default). The description only restates the project requirement, adding no syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search for Azure DevOps work items') plus the mechanism (WIQL), which clearly separates it from create_work_item or add_comment. It does not explicitly differentiate from get_work_item, but the query-language framing makes the distinction inferable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete prerequisite ('Project is required') and names an alternative route to satisfy it ('use azuredevops_list_projects'), which is exactly the kind of routing guidance an agent needs. No when-not-to-use condition is stated, so it falls short of 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

azuredevops_update_work_itemA

Update an existing Azure DevOps work item using JSON Patch operations. Can modify any field including state transitions. Project is required - discover it from project context.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesWork item ID to update
projectYesAzure DevOps project name (required - discover from project context)
operationsYesArray of JSON Patch operations to apply

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It usefully discloses that it operates via JSON Patch and can touch any field, including state transitions, but says nothing about permission requirements, whether removals are destructive/irreversible, revision/concurrency expectations, or the response shape. Partial behavioral disclosure only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, no filler, and the highest-value constraint (project required, discover from context) is front-loaded after the core purpose. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with zero annotations and no output schema, the description is adequate but thin: it omits error/failure behavior, revision or concurrency semantics, and permission needs. The fully-documented input schema covers the mechanics, which keeps this at a viable minimum rather than a gap-free definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds nothing about the operations array or path syntax beyond what the schema already documents, and its note about the project parameter duplicates the schema's own text verbatim.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Update') plus resource ('Azure DevOps work item') and names the mechanism ('JSON Patch operations'), immediately separating it from the create/get/search/list/comment siblings. It also scopes capability ('any field including state transitions'), so an agent knows the blast radius without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It surfaces one real prerequisite ('Project is required - discover it from project context'), which is the most common selection/call failure mode. However it never states when to reach for this over siblings (e.g., when the item exists vs create_work_item) nor any exclusions, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv0.1.0
    • First observedazuredevops_add_comment
    • First observedazuredevops_create_work_item
    • First observedazuredevops_get_work_item
    • First observedazuredevops_list_projects
    • First observedazuredevops_search_work_items
    • First observedazuredevops_update_work_item

TDQS

A3.7/5.0

Scored across 6 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: listing projects, searching work items, getting a work item, creating, updating, and commenting. The actions and resources are unambiguous, leaving no room for confusion.

Naming Consistency5/5

All tool names follow a consistent snake_case pattern with the 'azuredevops_' prefix followed by a verb and object (list_projects, search_work_items, etc.). This is highly predictable and readable.

Tool Count4/5

Six tools is a reasonable, well-scoped set for managing work items and projects in Azure DevOps. It might be slightly under-provisioned for broader DevOps tasks, but it covers the core work item lifecycle.

Completeness4/5

The toolset covers the essential CRUD operations for work items (create, read, update, search, comment) and project listing. However, it lacks deletion of work items and any tools for other Azure DevOps resources like repositories, pipelines, or boards, which are common in the domain.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers