Skip to main content
Glama
rafaelfreba

mcp-azure-devops-server

by rafaelfreba

🔷 mcp-azure-devops-server

Licença: MIT Versão Status Node.js TypeScript MCP Azure DevOps Server Testes Baseado em

Servidor MCP que conecta assistentes de IA (Claude Code, VS Code, Claude Desktop, Cursor) a uma instância on-premise do Azure DevOps Server 2022.

Baseado no Azure DevOps MCP Server, de Micah Rairdon, e adaptado para uso exclusivo com o Azure DevOps Server on-premise. Detalhes na seção Créditos, no final.

🧰 Tools

🚧 Projeto em construção. Por enquanto só a área de Work Items está disponível. As demais áreas serão adicionadas aos poucos.

Área

Tools

Status

Work Items

list_work_items, get_work_item, create_work_item, update_work_item

✅ Disponível

Projetos

🗓️ Planejado

Repositórios

🗓️ Planejado

Pull Requests

🗓️ Planejado

Pipelines

🗓️ Planejado

Wiki

🗓️ Planejado

Busca

🗓️ Planejado

Tool

O que faz

Escreve no Azure DevOps?

list_work_items

Lista work items por filtros, consulta salva ou WIQL

👀 não

get_work_item

Detalhes completos de um work item pelo ID

👀 não

create_work_item

Cria tarefa, bug, história, épico etc., com vínculo ao item pai

✍️ sim

update_work_item

Altera campos, estado, tags e registra comentários

✍️ sim

Os parâmetros de cada tool estão na seção Referência das tools, mais abaixo.

Related MCP server: Azure DevOps MCP Server

💡 Exemplos de uso

Com o servidor registrado, basta conversar com o assistente: ele decide sozinho quando chamar cada tool. Os pedidos abaixo foram escritos para o Claude Code, mas funcionam em qualquer cliente MCP.

📝 Escrever histórias de usuário e registrá-las no Boards

Leia docs/requisitos-exportacao.md, escreva as histórias de usuário com critérios de aceite no formato Dado/Quando/Então e registre cada uma no Boards como filha da Feature 1200, na Sprint 14. Antes de criar, me mostre a lista para eu aprovar.

O Claude redige as histórias, mostra o rascunho e, depois da sua aprovação, chama create_work_item uma vez por história, com parentId, iterationPath e acceptanceCriteria. No fim, devolve o ID e o link de cada card.

🐛 Registrar um bug encontrado durante a implementação

Enquanto mexíamos no PedidoService, vimos que o desconto é aplicado duas vezes quando o cupom é reutilizado. Não corrija agora: abra um Bug com os passos para reproduzir em Repro Steps, o arquivo e a linha envolvidos, prioridade 2 e a tag debito-tecnico.

O bug fica registrado para correção futura e você não perde o foco da tarefa atual. Como o Claude já está com o código aberto, o card sai com arquivo, linha e a causa provável, detalhes que costumam se perder quando o registro fica para depois.

Para tornar isso um hábito, adicione uma regra ao CLAUDE.md do projeto:

Ao encontrar um bug fora do escopo da tarefa atual, não o corrija. Registre-o como Bug
no Azure DevOps, com passos para reproduzir e a tag `encontrado-em-dev`, me informe o
ID e continue a tarefa.

🛠️ Implementar a partir de um card

Leia a US 890 e implemente de acordo com os critérios de aceite.

get_work_item traz a descrição, os critérios de aceite e os itens relacionados. Assim o Claude trabalha com o requisito registrado no card, e não com um resumo que você teria de digitar.

🧩 Quebrar uma história em tarefas

Quebre a US 890 em tarefas técnicas de backend, frontend e testes, atribua todas a mim e vincule-as como filhas da US.

✅ Atualizar o card ao terminar

Terminei a US 890. Mova para Resolved e comente no card um resumo do que mudou, com o hash do commit.

update_work_item muda o estado e grava o comentário na aba Discussion.

🔎 Consultar e triar o backlog

Quais bugs ativos da área Portal\Backend estão sem responsável? Ordene por prioridade.

O que está atribuído a mim na Sprint 14 e ainda está em New?

Rode a consulta salva "Bugs críticos" e me diga o que mudou desde ontem.

🎯 Dicas

  • 👀 Peça revisão antes de criar em lote. "Me mostre antes de criar" evita dezenas de cards criados com base num requisito mal interpretado.

  • 🏷️ Informe o tipo e o item pai. Os nomes dos tipos variam conforme o processo: User Story no Agile, Product Backlog Item no Scrum, Requirement no CMMI e Issue no Basic.

  • 🐞 Em Bugs, peça os passos em Repro Steps. Nos processos Agile, Scrum e CMMI, o formulário de Bug exibe o campo Repro Steps (Microsoft.VSTS.TCM.ReproSteps) e não Description. Sem esse pedido, os passos vão para um campo que o formulário não mostra.

  • 🔔 Tudo o que for gravado leva o seu nome. Cards e comentários aparecem como criados pelo dono do PAT e geram notificações para o time.

✨ Características

  • 🏢 Só on-premise. Fala com a REST API no formato http(s)://<servidor>/<collection>/_apis/..., autenticando com Personal Access Token (PAT) via header Authorization: Basic. Não há nenhum fluxo OAuth/Entra ID — isso é exclusivo do Azure DevOps Services (cloud) e não se aplica aqui.

  • 🎛️ Sem nada hardcoded. URL do servidor, collection, PAT e versão da API vêm todos de variáveis de ambiente.

  • 🔒 Local e sem telemetria. Roda via stdio. A única saída de rede é para o ADO_SERVER_URL que você configurar.

  • 🪶 Sem dependências de HTTP. Usa o fetch nativo do Node, o que mantém ADO_API_VERSION realmente configurável (SDKs oficiais fixam a versão da API por método) e dá controle sobre TLS corporativo.

  • 🧪 174 testes unitários, todos com a API mockada — nenhuma chamada de rede real.

📋 Requisitos

  • Node.js 20.11 ou superior (testado em 24.x)

  • Um PAT do Azure DevOps Server com escopo Work Items (Read, write, & manage)

📦 Instalação

npm install
npm run build

⚙️ Configuração

Copie .env.example para .env e preencha:

cp .env.example .env

Variável

Obrigatória

Padrão

Descrição

ADO_SERVER_URL

sim

URL base da instância, sem a collection e sem /_apis. Ex.: https://devops.empresa.local ou http://tfs.empresa.local:8080/tfs

ADO_COLLECTION

sim

Nome da Project Collection. Ex.: DefaultCollection

ADO_PAT

sim

Personal Access Token

ADO_API_VERSION

não

7.1

Versão da REST API. O Azure DevOps Server 2022 suporta 7.1; o 2022.1 também aceita 7.2-preview

ADO_DEFAULT_PROJECT

não

Projeto usado quando a tool é chamada sem project. Reduz muito os erros do assistente ao adivinhar nomes

ADO_REQUEST_TIMEOUT_MS

não

30000

Timeout por requisição

ADO_MAX_RETRIES

não

2

Tentativas extras em 429/5xx e falhas de rede

LOG_LEVEL

não

info

debug, info, warn, error ou silent. O PAT nunca é gravado em log

ADO_TLS_REJECT_UNAUTHORIZED

não

true

false desliga a verificação de certificado TLS. Inseguro, só para laboratório

NODE_EXTRA_CA_CERTS

não

Caminho para o CA da organização. É o caminho correto para certificado interno

🔑 Como gerar o PAT

  1. Acesse <ADO_SERVER_URL>/<ADO_COLLECTION>/_usersSettings/tokens

  2. New Token, defina a validade

  3. Em Scopes, marque Work Items → Read, write, & manage

  4. Copie o token — ele só aparece uma vez

🩺 Verificando a configuração

Antes de plugar no VS Code, confirme que o servidor alcança o Azure DevOps:

node dist/index.js --check

Saída esperada:

Conexão OK.
  Servidor:   https://devops.empresa.local
  Collection: DefaultCollection
  API:        7.1
  Projeto:    MeuProjeto

Qualquer falha aqui vem com a mensagem já traduzida (PAT inválido, servidor inacessível, certificado não confiável, collection errada).

💻 Registrando no VS Code

Crie ou edite .vscode/mcp.json no seu workspace — ou o mcp.json global, via MCP: Open User Configuration na paleta de comandos:

{
  "servers": {
    "azure-devops": {
      "type": "stdio",
      "command": "node",
      "args": ["C:\\mcp-azure-devops-server\\dist\\index.js"],
      "env": {
        "ADO_SERVER_URL": "https://devops.empresa.local",
        "ADO_COLLECTION": "DefaultCollection",
        "ADO_PAT": "${input:ado-pat}",
        "ADO_API_VERSION": "7.1",
        "ADO_DEFAULT_PROJECT": "MeuProjeto"
      }
    }
  },
  "inputs": [
    {
      "id": "ado-pat",
      "type": "promptString",
      "description": "Personal Access Token do Azure DevOps Server",
      "password": true
    }
  ]
}

O bloco inputs faz o VS Code pedir o PAT na primeira execução e guardá-lo com segurança, em vez de deixá-lo em texto puro num arquivo versionado. Se preferir usar o .env do projeto, basta omitir env do mcp.json — mas isso só funciona quando o workspace aberto é a própria pasta deste repositório, porque o .env é lido a partir do diretório de trabalho do processo.

Depois de salvar, abra a paleta e rode MCP: List Servers para confirmar que azure-devops aparece como iniciado, e verifique as tools no seletor de ferramentas do Chat.

🤖 Registrando no Claude Code

Cada cliente MCP tem seu próprio registro e nenhum lê o do outro: o .vscode/mcp.json da seção anterior é exclusivo do VS Code. Para o Claude Code o registro fica em ~/.claude.json (escopos local e user) ou num .mcp.json na raiz do projeto (escopo project).

Vale repetir o que isso significa na prática: não existe "subir" o servidor. Não há daemon, porta nem npm start rodando em segundo plano. Quem cria o processo é o cliente — o Claude Code executa node dist/index.js ao iniciar, conversa JSON-RPC pelo stdin/stdout e encerra o processo ao fechar. O que você precisa deixar pronto é o build e o registro.

1️⃣ Build

npm install
npm run build

Obrigatório: o que roda é o dist/, não o src/, e o dist/ não é versionado. Repita o npm run build a cada alteração no código.

2️⃣ Registrar

claude mcp add azure-devops --scope user \
  -e ADO_SERVER_URL=https://devops.empresa.local \
  -e ADO_COLLECTION=DefaultCollection \
  -e ADO_PAT=SEU_PAT_AQUI \
  -e ADO_API_VERSION=7.1 \
  -e ADO_DEFAULT_PROJECT=MeuProjeto \
  -- node /caminho/absoluto/para/mcp-azure-devops-server/dist/index.js

No PowerShell, troque a continuação de linha \ por crase (`) ou escreva tudo em uma linha só. O -- separa os flags do claude do comando do servidor; use caminho absoluto, com barras normais.

Escopo

Onde grava

Quando usar

local (padrão)

~/.claude.json, sob o projeto atual

Testar sem afetar outros projetos

user

~/.claude.json, global

Uso normal — as tools ficam disponíveis em qualquer projeto

project

.mcp.json na raiz, versionado

Compartilhar a configuração com o time. Nunca com o PAT inline — use "ADO_PAT": "${ADO_PAT}", que o Claude Code expande a partir do ambiente

3️⃣ Verificar

Reinicie o Claude Code — o registro só é lido no boot. Depois:

claude mcp list

azure-devops deve aparecer como Connected. Dentro da sessão, /mcp mostra o servidor e suas quatro tools.

❓ Por que passar env aqui é obrigatório

O servidor carrega o .env a partir do diretório de trabalho do processo, e quem define esse diretório é o cliente: é o projeto onde você abriu o Claude Code, não a pasta deste repositório. Só quando você abre o Claude Code dentro do próprio mcp-azure-devops-server é que o .env é encontrado sozinho. Em qualquer outro projeto, sem -e o servidor sobe e falha com:

Configuração inválida. Corrija as variáveis de ambiente:
  - ADO_SERVER_URL: Invalid input: expected string, received undefined
  - ADO_PAT: Invalid input: expected string, received undefined

Alternativa ao -e, que evita o PAT em texto puro no ~/.claude.json: defina as variáveis no ambiente do usuário do sistema operacional. O processo filho as herda independentemente do diretório, e o registro fica só claude mcp add azure-devops --scope user -- node /caminho/para/dist/index.js. No Windows, setx ADO_PAT "..." (exige reabrir o terminal ou o VS Code); em Linux/macOS, exporte no ~/.bashrc ou ~/.zshrc.

🔄 Ciclo de desenvolvimento

Alterou o src/npm run buildreinicie o Claude Code. O processo do servidor nasce no boot do cliente, então rebuildar sem reiniciar não muda nada na sessão em andamento.

👥 Instalando na máquina de outra pessoa

O transporte é stdio: o servidor roda como processo local, na mesma máquina do cliente. Não há instância central para apontar. Cada pessoa precisa:

  1. Clonar o repositório (ou receber a pasta) e rodar npm install && npm run build;

  2. Gerar o próprio PAT em <servidor>/<collection>/_usersSettings/tokens — o PAT é pessoal e intransferível, e toda criação, edição ou comentário feito pelas tools aparece no Azure DevOps como autoria de quem gerou o token;

  3. Rodar o claude mcp add com os caminhos e o PAT dela.

Um .mcp.json versionado (escopo project) com "ADO_PAT": "${ADO_PAT}" resolve o passo 3 para o time inteiro: cada pessoa só precisa ter a variável no ambiente.

🔌 Outros clientes MCP

Em qualquer outro cliente que fale stdio (Claude Desktop, Cursor), os ingredientes são os mesmos — comando node, argumento com o caminho absoluto de dist/index.js e as variáveis em env — mas cada um tem seu próprio arquivo de registro, em formato próprio. Consulte a documentação do cliente para saber onde ele procura.

📚 Referência das tools

📋 list_work_items

Lista work items de um projeto. Três formas de filtrar:

  • Filtros diretos: assignedTo (aceita @me), states, workItemTypes, areaPath

  • queryId: executa uma consulta salva pelo GUID

  • wiql: consulta WIQL completa, para critérios que os filtros não cobrem

Retorna no máximo 200 itens por chamada (padrão 50), com skip para paginar e totalMatched com o total encontrado.

🔍 get_work_item

Detalhes completos de um work item pelo ID: descrição, critérios de aceite, responsável, datas, campos customizados e relações. expand: "none" + fields traz só o que interessa quando se quer economizar contexto.

create_work_item

Cria um work item. Exige workItemType e title. Aceita descrição, critérios de aceite, responsável, área, sprint, prioridade, tags, parentId (cria o vínculo hierárquico) e additionalFields para campos customizados — é por ele que vão os passos de reprodução de um Bug (Microsoft.VSTS.TCM.ReproSteps).

✏️ update_work_item

Atualiza campos e/ou registra comentário (vai para System.History, a aba Discussion). Só envia os campos informados. Para tags:

  • tags substitui a lista inteira ([] limpa tudo)

  • tagsToAdd / tagsToRemove alteram incrementalmente, preservando as demais

📌 Observações que valem para todas

  • Campos de texto longo são HTML, não Markdown e nunca CDATA: descrição, critérios de aceite, passos de reprodução, comentários.

  • IDs de work item são únicos na collection inteira, então project é opcional em get_work_item e update_work_item.

  • Campos customizados vão por nome de referência (Custom.Sistema), não pelo rótulo da tela.

🛠️ Desenvolvimento

npm run dev           # execução com recarga automática
npm test              # testes unitários
npm run test:watch    # testes em watch
npm run test:coverage # cobertura
npm run typecheck     # checagem de tipos
npm run build         # compila para dist/

🗂️ Estrutura

src/
  index.ts                       entry point (stdio) e modo --check
  server.ts                      cria o McpServer e registra as features
  config/env.ts                  leitura e validação das env vars com zod
  clients/
    azure-devops-client.ts       HTTP: Basic+PAT, retry, paginação, erros
    url-builder.ts               URLs on-premise e escape de literais WIQL
  features/work-items/
    schemas.ts                   contrato único de entrada/saída
    tool-definitions.ts          descrições em linguagem natural para a LLM
    index.ts                     registra as tools no servidor
    mapper.ts                    API crua -> formato enxuto
    patch-document.ts            construção do JSON Patch
    wiql.ts                      montagem segura de consultas WIQL
    work-item-api.ts             leitura em lote (limite de 200 IDs)
    <tool>/{schema,feature,index}.ts
  shared/errors/                 hierarquia de erros + tradução de mensagens
  shared/logger.ts               log local em stderr, com redação do PAT
  types/azure-devops.ts          tipos da REST API
tests/                           espelha src/, com a API mockada

🧱 Adicionando uma nova área

Cada área entra em src/features/<nome>/, seguindo o mesmo formato de work items (<tool>/{schema,feature,index}.ts e um tool-definitions.ts com as descrições para a LLM), e é ativada com uma linha em server.ts. Ao terminar, atualize a tabela da seção Tools.

🧠 Decisões de design

Log sempre em stderr. No transporte stdio o stdout é o canal JSON-RPC; um único console.log corrompe a sessão e o cliente desconecta.

401 e 403 são erros diferentes. 401 é PAT inválido ou expirado; 403 é PAT válido sem o escopo necessário. As soluções são distintas, então as mensagens também são.

Página de login do IIS é tratada como erro de autenticação. Em on-premise é comum o servidor responder 200/203 com o HTML da tela de login quando o PAT é inválido, em vez de 401. Sem essa detecção, o HTML chegaria ao assistente como se fosse resposta legítima da API.

Erros viram isError: true, não exceção. A tool devolve a mensagem traduzida e acionável, o que permite ao modelo se corrigir sozinho em vez de apenas reportar a falha.

Literais de WIQL são escapados. Um projeto chamado Cliente's App quebraria a consulta; sem escape, argumentos de tool poderiam injetar cláusulas WIQL.

Leitura em lote fatiada em 200 IDs. Acima disso o endpoint wit/workitems?ids= responde 400.

op: replace para substituir tags. O Azure DevOps trata op: add em System.Tags como merge; replace, por sua vez, falha se o campo estiver vazio. O código lê o estado atual e escolhe o operador certo.

🧯 Solução de problemas

Sintoma

Causa provável

Falha de autenticação ... página de login

PAT inválido, expirado, ou gerado em outra instância/collection

Permissão negada

PAT sem o escopo Work Items (Read, write, & manage), ou sem acesso ao projeto

Recurso não encontrado com projeto correto

ADO_COLLECTION errada, ou o projeto está em outra collection

Falha na validação do certificado TLS

Certificado interno. Aponte NODE_EXTRA_CA_CERTS para o CA da organização

ADO_SERVER_URL não deve incluir /_apis

Informe apenas a URL base; o caminho da API é montado pelo servidor

Erro de api-version não suportada

Ajuste ADO_API_VERSION para 7.1 (2022) ou 7.2-preview (2022.1)

O servidor não aparece no VS Code

Use caminho absoluto em args e confirme que npm run build foi executado

Para diagnóstico detalhado, rode com LOG_LEVEL=debug — cada requisição é registrada em stderr, com o PAT redigido.

🙏 Créditos

Este projeto é baseado no Azure DevOps MCP Server, de Micah Rairdon (@Tiberriver256), distribuído sob a licença MIT. Esta versão foi adaptada para uso exclusivo com o Azure DevOps Server 2022 on-premise, com autenticação por PAT.

📄 Licença

Distribuído sob a licença MIT. O arquivo preserva o aviso de copyright do projeto original, como a licença exige.

Available Tools

4 tools
create_work_itemCriar work itemA

Cria um novo work item em um projeto do Azure DevOps Server e devolve o item criado, já com o ID gerado e o link para abri-lo no navegador.

Use quando o pedido for para registrar algo novo: uma tarefa, um bug, uma história. Esta operação ESCREVE no Azure DevOps e é visível para o time — confirme com o usuário o tipo, o título e o projeto antes de chamar, se algum deles estiver ambíguo.

Parâmetros:

  • workItemType (obrigatório): o nome exato do tipo no processo do projeto — "Task", "Bug", "User Story", "Product Backlog Item", "Epic", "Feature". Tipos variam entre processos (Agile, Scrum, CMMI); se der erro de tipo inexistente, confirme com o usuário.

  • title (obrigatório): título do item, até 255 caracteres.

  • project: opcional se ADO_DEFAULT_PROJECT estiver configurado.

  • description e acceptanceCriteria: texto em HTML (, , ), nunca Markdown nem CDATA.

  • assignedTo, areaPath, iterationPath, priority (1 a 4), tags, parentId.

  • additionalFields: qualquer outro campo, inclusive customizados, por nome de referência. Ex.: {"Custom.Sistema": "Portal", "Microsoft.VSTS.Scheduling.StoryPoints": 5}.

Exemplos de pedidos que devem acionar esta tool:

  • "abre um bug no projeto Portal: o login falha com senha correta"

  • "cria uma tarefa para revisar o contrato, atribuída à Ana, prioridade 2"

  • "registra uma user story de exportação em CSV como filha do épico 1200"

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoTags do work item, ex.: ["infra", "urgente"].
titleYesTítulo do work item (campo obrigatório).
projectNoNome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor.
areaPathNoArea path completo, ex.: "MeuProjeto\\Backend". Padrão: a raiz do projeto.
parentIdNoID de um work item pai. Cria o vínculo hierárquico já na criação.
priorityNoPrioridade de 1 (mais alta) a 4 (mais baixa).
assignedToNoResponsável pelo work item: nome de exibição, e-mail ou DOMINIO\usuario, conforme cadastrado no Azure DevOps Server.
descriptionNoDescrição do work item. Campos de texto longo no Azure DevOps são HTML — use <p>, <br>, <ul>. Não use blocos CDATA nem Markdown.
workItemTypeYesTipo do work item, exatamente como definido no processo do projeto (ex.: "Task", "Bug", "User Story", "Product Backlog Item", "Epic").
iterationPathNoIteration path (sprint), ex.: "MeuProjeto\\Sprint 12".
additionalFieldsNoCampos adicionais ou customizados, por nome de referência. Ex.: {"Custom.Sistema": "Portal", "Microsoft.VSTS.Scheduling.StoryPoints": 5}. Campos de texto longo no Azure DevOps são HTML — use <p>, <br>, <ul>. Não use blocos CDATA nem Markdown.
acceptanceCriteriaNoCritérios de aceite. Campos de texto longo no Azure DevOps são HTML — use <p>, <br>, <ul>. Não use blocos CDATA nem Markdown.

Output Schema

ParametersJSON Schema
NameRequiredDescription
workItemYes

TDQS

A4.7/5.0
Behavior5/5

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

The description clearly discloses that this operation writes to Azure DevOps and is visible to the team, which goes beyond the annotations. It also explains the return value (the created item with ID and link), warns that work item types vary by process, and gives a concrete recovery instruction if the type is invalid. This is substantial behavioral context.

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?

The description is long but well structured: purpose first, then usage guidance, then grouped parameter details, then example requests that should trigger the tool. Every section earns its place, and the most decision-relevant information is front-loaded.

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

Completeness5/5

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

Given the high complexity (12 parameters, nested objects, output schema, sibling tools), the description covers the required fields, optional project default, HTML formatting rules, custom fields, error recovery, and user confirmation. It even describes what the tool returns, so an agent can invoke it correctly without guessing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all parameters. The description adds value by listing valid workItemType examples, showing how additionalFields works with reference names, emphasizing that long-text fields must be HTML, and providing trigger examples that map naturally to parameters. This is above the baseline but not essential documentation for every parameter.

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?

The description opens with a specific verb and resource: 'Cria um novo work item em um projeto do Azure DevOps Server e devolve o item criado, já com o ID gerado e o link.' It also states when to use it ('Use quando o pedido for para registrar algo novo') and gives concrete trigger examples, making it easy to distinguish from the sibling tools list_work_items, get_work_item, and update_work_item.

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?

The description explicitly says when to use the tool: when the user wants to register something new such as a task, bug, or story. It also instructs the agent to confirm type, title, and project when ambiguous. It does not explicitly name alternatives or state 'do not use this for existing items', but the 'registrar algo novo' framing implies the boundary.

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

get_work_itemDetalhar work itemA
Read-onlyIdempotent

Retorna todos os detalhes de UM work item do Azure DevOps Server a partir do seu ID: título, descrição, critérios de aceite, estado, responsável, área, sprint, prioridade, tags, datas, autor, campos customizados e links com outros work items.

Use quando o ID já é conhecido — porque o usuário o citou, ou porque veio de uma chamada anterior a list_work_items. Se o ID ainda não é conhecido, chame list_work_items primeiro.

Parâmetros:

  • id (obrigatório): o número do work item, como aparece na interface web.

  • project: opcional; se omitido usa ADO_DEFAULT_PROJECT.

  • expand: "all" (padrão) traz tudo, inclusive relações; "none" traz só os campos básicos e é mais econômico quando só se quer conferir estado ou título.

  • fields: lista de campos específicos por nome de referência (ex.: ["System.Title", "Custom.Sistema"]). Exige expand: "none" — a API não aceita os dois juntos.

Exemplos de pedidos que devem acionar esta tool:

  • "o que é o bug 1234?"

  • "me mostra os detalhes do work item 4521"

  • "qual é o critério de aceite da US 890?"

  • "quem está responsável pela tarefa 77 e em que estado ela está?"

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID numérico do work item, como aparece na interface web
expandNoNível de detalhe: "none" traz só os campos básicos, "relations" inclui os links com outros work items, "all" traz tudo. Padrão: "all".all
fieldsNoCampos específicos a retornar, por nome de referência (ex.: ["System.Title", "Custom.Sistema"]). Exige expand: "none".
projectNoNome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor.

Output Schema

ParametersJSON Schema
NameRequiredDescription
workItemYes

TDQS

A4.4/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral details beyond the schema, such as the API constraint that 'fields' requires expand='none', the default expand value of 'all', and the trade-off that expand='none' is more economical for simple state/title checks.

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?

The description is well-structured and front-loaded with the primary purpose, followed by usage guidance, parameter details, and examples. It is somewhat longer than the minimum viable description, but the parameter section and examples earn their place by making the tool easy to invoke correctly without consulting the schema separately.

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

Completeness5/5

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

Given that an output schema exists and the annotations cover the read-only, idempotent safety profile, the description is complete for both selection and invocation. It covers when to use the tool, what the ID represents, the optional project default, expansion levels, the fields constraint, and concrete trigger phrasings. Nothing essential for correct use 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%, so the schema already documents all four parameters thoroughly. The description largely repeats schema content, though it adds minor context such as 'id as shown in the web interface' and the default project behavior. Baseline 3 is appropriate because the description does not substantially extend the parameter semantics beyond what the schema provides.

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?

The description clearly states the tool's function: retrieving all details of a single Azure DevOps Server work item by ID, and enumerates the types of information returned (title, description, acceptance criteria, state, assignee, area, sprint, priority, tags, dates, author, custom fields, and links). It distinguishes itself from sibling tools by explicitly targeting one known work item, versus list_work_items for discovery.

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

Usage Guidelines5/5

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

The description explicitly states when to use the tool: when the ID is already known, either from the user or from a prior list_work_items call. It also gives the alternative: call list_work_items first if the ID is unknown. Concrete example user requests are provided to help an agent recognize triggering scenarios.

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

list_work_itemsListar work itemsA
Read-onlyIdempotent

Lista work items (tarefas, bugs, user stories, etc.) de um projeto do Azure DevOps Server, devolvendo um resumo de cada um: ID, tipo, título, estado, responsável, área, sprint e tags.

Use quando o pedido for por um CONJUNTO de itens que atendem a um critério. Para um item específico de que já se conhece o ID, use get_work_item (traz mais detalhe).

Três formas de filtrar, da mais simples para a mais poderosa:

  1. Filtros diretos — assignedTo, states, workItemTypes, areaPath. Cobrem a maioria dos casos. Em assignedTo, "@me" resolve para o usuário dono do PAT configurado no servidor.

  2. queryId — executa uma consulta salva (Shared Query) pelo seu GUID.

  3. wiql — uma consulta WIQL completa, para critérios que os filtros diretos não expressam (datas, campos customizados, operadores CONTAINS, etc.). Quando wiql é informado, os filtros diretos são ignorados.

O parâmetro project pode ser omitido se o servidor tiver ADO_DEFAULT_PROJECT configurado. Retorna no máximo 200 itens por chamada (padrão 50); use skip para paginar e leia totalMatched para saber quantos a consulta encontrou no total.

Exemplos de pedidos que devem acionar esta tool:

  • "quais bugs estão abertos no projeto Portal?"

  • "me mostra as tarefas atribuídas a mim"

  • "lista as user stories da sprint atual que ainda estão em New"

  • "quantos itens ativos existem na área Portal\Backend?"

  • "roda a consulta salva 3f2b...c1 e me resume o resultado"

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoQuantidade máxima de work items a retornar. Padrão: 50, máximo: 200.
skipNoQuantos resultados pular, para paginar. Padrão: 0.
wiqlNoConsulta WIQL completa, para filtros que os parâmetros simples não cobrem. Ex.: "SELECT [System.Id] FROM WorkItems WHERE [System.State] = 'Active' AND [System.CreatedDate] > @Today - 7". Quando informada, os filtros assignedTo/states/workItemTypes/areaPath são ignorados.
fieldsNoCampos adicionais a trazer em cada item, por nome de referência (ex.: ["Microsoft.VSTS.Scheduling.StoryPoints"]).
statesNoFiltra por estados, ex.: ["Active", "New"].
projectNoNome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor.
queryIdNoGUID de uma consulta salva (Shared Queries) a ser executada.
areaPathNoFiltra pela área e suas sub-áreas (operador UNDER), ex.: "MeuProjeto\\Backend".
assignedToNoFiltra pelo responsável. Use "@me" para o dono do PAT configurado, ou o nome de exibição / e-mail do usuário (ex.: "Ana Souza" ou "ana@empresa.com").
workItemTypesNoFiltra por tipo, ex.: ["Bug", "Task"].

Output Schema

ParametersJSON Schema
NameRequiredDescription
countYesQuantidade de work items retornados nesta página
queryYesA consulta WIQL efetivamente executada
workItemsYesOs work items encontrados
totalMatchedYesTotal de work items que a consulta encontrou, antes de top/skip

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds valuable behavioral context beyond that: pagination limits (max 200, default 50, use skip, read totalMatched), the precedence of wiql over direct filters, and the @me resolution for assignedTo. These are concrete operational details an agent needs to call the tool correctly.

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?

The description is long but well-structured: it opens with the core purpose, then gives usage guidance, then details filtering methods and pagination, and ends with concrete examples. Each section earns its place; there is no fluff. It is front-loaded with the most important information (what it does and when to use it). It could be slightly more compact, but the density of useful info justifies its length.

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

Completeness5/5

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

For a tool with 10 optional parameters, three filtering modes, and pagination, the description covers all critical aspects: return summary fields, when to use it, the three filtering approaches with precedence, pagination behavior, and example prompts. The presence of an output schema further covers return details. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so each parameter is individually documented. The description goes beyond that by organizing the parameters into three coherent filtering modes (direct filters, queryId, wiql) and explaining when to use each, which helps the agent choose the right parameter combination. This adds strategic value on top of the schema's per-parameter descriptions.

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?

The description states a specific verb ('Lista') and resource ('work items') with a clear summary of what is returned (ID, tipo, título, estado, etc.). It distinguishes from the sibling get_work_item by explicitly noting that tool is for a single item with more detail. This makes the tool's purpose unambiguous and distinct.

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

Usage Guidelines5/5

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

It explicitly says 'Use quando o pedido for por um CONJUNTO de itens que atendem a um critério' and directs to get_work_item for a specific item. It also gives examples of user requests that should trigger this tool and explains the three filtering methods with precedence, leaving no ambiguity about when to use it vs alternatives.

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

update_work_itemAtualizar work itemA

Atualiza campos de um work item existente do Azure DevOps Server e/ou registra um comentário na aba Discussion. Devolve o item já atualizado e a lista de campos alterados.

Use para mudar estado, responsável, título, descrição, prioridade, sprint, tags, campos customizados, ou apenas para deixar um comentário. Só envia os campos informados — os demais permanecem como estão. Esta operação ESCREVE no Azure DevOps e gera notificação para os envolvidos.

Parâmetros:

  • id (obrigatório): o número do work item.

  • Pelo menos um campo além do id precisa ser informado.

  • state: precisa ser um estado válido para o tipo e a transição precisa ser permitida pelo processo (ex.: em muitos processos não se vai de "New" direto para "Closed").

  • comment: vai para o histórico de discussão (System.History), em HTML.

  • tags: SUBSTITUI a lista inteira de tags (passe [] para limpar todas). Para alteração incremental use tagsToAdd e/ou tagsToRemove, que preservam as demais. Não combine "tags" com "tagsToAdd"/"tagsToRemove" na mesma chamada.

  • description e demais campos de texto longo: HTML, nunca Markdown nem CDATA.

  • additionalFields: outros campos por nome de referência.

Exemplos de pedidos que devem acionar esta tool:

  • "fecha o bug 1234"

  • "passa a tarefa 88 para Active e atribui ao Carlos"

  • "comenta no item 4521 que o deploy foi feito em produção"

  • "adiciona a tag regressao no bug 1234 sem mexer nas outras tags"

  • "move a US 890 para a sprint 13"

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesID numérico do work item, como aparece na interface web
tagsNoSubstitui a lista completa de tags. Passe [] para remover todas. Não combine com tagsToAdd/tagsToRemove.
stateNoNovo estado, respeitando o fluxo do tipo (ex.: "Active", "Resolved", "Closed"). Transições inválidas são recusadas pelo Azure DevOps.
titleNoNovo título.
commentNoComentário a registrar na aba Discussion do work item (campo System.History). Campos de texto longo no Azure DevOps são HTML — use <p>, <br>, <ul>. Não use blocos CDATA nem Markdown.
projectNoNome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor.
areaPathNoNovo area path.
priorityNoNova prioridade, de 1 (mais alta) a 4 (mais baixa).
tagsToAddNoTags a acrescentar, preservando as existentes.
assignedToNoNovo responsável: nome de exibição, e-mail ou DOMINIO\usuario.
descriptionNoNova descrição. Campos de texto longo no Azure DevOps são HTML — use <p>, <br>, <ul>. Não use blocos CDATA nem Markdown.
tagsToRemoveNoTags a remover, preservando as demais.
iterationPathNoNovo iteration path (sprint).
additionalFieldsNoOutros campos a atualizar, por nome de referência. Ex.: {"Custom.Sistema": "Portal", "Microsoft.VSTS.Common.Severity": "2 - High"}.

Output Schema

ParametersJSON Schema
NameRequiredDescription
workItemYes
updatedFieldsYesNomes de referência dos campos efetivamente enviados na atualização

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false), the description discloses that the operation writes to Azure DevOps and generates notifications to involved parties. It also clarifies that only provided fields are sent and others remain unchanged, that tag replacement is destructive while tagsToAdd/Remove are incremental, and that long text fields must be HTML – all valuable behavioral context beyond the annotations.

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?

The description is well-structured: it leads with the core function, then lists usage scenarios, then details parameters with specific constraints, and ends with illustrative example prompts. While long, every sentence adds value – there is no fluff or redundancy, and the most important behavioral notes (write + notification, partial update) appear early.

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

Completeness5/5

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

For a tool with 14 parameters and complex behaviors, the description covers everything needed: required fields, the at-least-one-other-field rule, state transition constraints, tag handling, HTML formatting for long text, additionalFields usage, and example prompts. The output schema is present, so return format is defined externally; nothing essential for correct invocation is missing.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds significant meaning: it explains that tags replaces the entire list and [] clears it, warns against combining tags with tagsToAdd/tagsToRemove, specifies that comment goes to System.History in HTML, and describes additionalFields as reference-name key-value pairs. These details are not present in the schema alone and materially help the agent build correct calls.

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?

The description opens with a precise statement: it updates fields of an existing Azure DevOps work item and/or registers a comment in the Discussion tab, and returns the updated item plus a list of changed fields. It then lists concrete update targets (state, assignee, title, description, priority, sprint, tags, custom fields) and gives example user requests, making the tool's purpose unmistakable and clearly distinct from the read/create siblings.

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?

The description gives explicit use cases ('Use para mudar estado, responsável, título...') and provides five realistic user-phrase examples that should trigger this tool. It implies the tool is for existing items by saying 'work item existente', but it does not explicitly direct agents away from create_work_item for new items or mention when not to use it; however, the context is strong enough for correct routing.

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. 4 tool updatesv0.1.0
    • First observedcreate_work_item
    • First observedget_work_item
    • First observedlist_work_items
    • First observedupdate_work_item

TDQS

A4.6/5.0

Scored across 4 tools

Disambiguation5/5

The four tools have clearly distinct purposes: list for querying sets, get for fetching one item by ID, create for new items, and update for modifying existing items. The descriptions explicitly cross-reference each other, so an agent is unlikely to select the wrong tool.

Naming Consistency5/5

All tool names follow the verb_noun pattern with the same domain object: list_work_items, get_work_item, create_work_item, update_work_item. The only variation is the plural on list_work_items, which is conventional and predictable.

Tool Count5/5

Four tools is a well-scoped set for focused Azure DevOps work item management. Each tool covers a distinct core operation, and the small count avoids redundancy and confusion.

Completeness4/5

The set covers the main work item lifecycle: query, read, create, and update, including comments and tag changes. Missing delete and explicit link management are minor gaps that agents can work around, especially since deletion is less common in work item workflows.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers