mcp-azure-devops-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-azure-devops-serverList all active work items assigned to me"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🔷 mcp-azure-devops-server
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 |
| ✅ Disponível |
Projetos | — | 🗓️ Planejado |
Repositórios | — | 🗓️ Planejado |
Pull Requests | — | 🗓️ Planejado |
Pipelines | — | 🗓️ Planejado |
Wiki | — | 🗓️ Planejado |
Busca | — | 🗓️ Planejado |
Tool | O que faz | Escreve no Azure DevOps? |
| Lista work items por filtros, consulta salva ou WIQL | 👀 não |
| Detalhes completos de um work item pelo ID | 👀 não |
| Cria tarefa, bug, história, épico etc., com vínculo ao item pai | ✍️ sim |
| 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 tagdebito-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\Backendestã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 headerAuthorization: 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_URLque você configurar.🪶 Sem dependências de HTTP. Usa o
fetchnativo do Node, o que mantémADO_API_VERSIONrealmente 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 .envVariável | Obrigatória | Padrão | Descrição |
| sim | — | URL base da instância, sem a collection e sem |
| sim | — | Nome da Project Collection. Ex.: |
| sim | — | Personal Access Token |
| não |
| Versão da REST API. O Azure DevOps Server 2022 suporta |
| não | — | Projeto usado quando a tool é chamada sem |
| não |
| Timeout por requisição |
| não |
| Tentativas extras em 429/5xx e falhas de rede |
| não |
|
|
| não |
|
|
| não | — | Caminho para o CA da organização. É o caminho correto para certificado interno |
🔑 Como gerar o PAT
Acesse
<ADO_SERVER_URL>/<ADO_COLLECTION>/_usersSettings/tokensNew Token, defina a validade
Em Scopes, marque Work Items → Read, write, & manage
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 --checkSaída esperada:
Conexão OK.
Servidor: https://devops.empresa.local
Collection: DefaultCollection
API: 7.1
Projeto: MeuProjetoQualquer 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 buildObrigató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.jsNo 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 |
|
| Testar sem afetar outros projetos |
|
| Uso normal — as tools ficam disponíveis em qualquer projeto |
|
| Compartilhar a configuração com o time. Nunca com o PAT inline — use |
3️⃣ Verificar
Reinicie o Claude Code — o registro só é lido no boot. Depois:
claude mcp listazure-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 undefinedAlternativa 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 build → reinicie 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:
Clonar o repositório (ou receber a pasta) e rodar
npm install && npm run build;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;Rodar o
claude mcp addcom 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,areaPathqueryId: executa uma consulta salva pelo GUIDwiql: 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:
tagssubstitui a lista inteira ([]limpa tudo)tagsToAdd/tagsToRemovealteram 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 emget_work_itemeupdate_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 |
| PAT inválido, expirado, ou gerado em outra instância/collection |
| PAT sem o escopo Work Items (Read, write, & manage), ou sem acesso ao projeto |
|
|
| Certificado interno. Aponte |
| Informe apenas a URL base; o caminho da API é montado pelo servidor |
Erro de | Ajuste |
O servidor não aparece no VS Code | Use caminho absoluto em |
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 toolscreate_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"
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tags do work item, ex.: ["infra", "urgente"]. | |
| title | Yes | Título do work item (campo obrigatório). | |
| project | No | Nome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor. | |
| areaPath | No | Area path completo, ex.: "MeuProjeto\\Backend". Padrão: a raiz do projeto. | |
| parentId | No | ID de um work item pai. Cria o vínculo hierárquico já na criação. | |
| priority | No | Prioridade de 1 (mais alta) a 4 (mais baixa). | |
| assignedTo | No | Responsável pelo work item: nome de exibição, e-mail ou DOMINIO\usuario, conforme cadastrado no Azure DevOps Server. | |
| description | No | Descriçã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. | |
| workItemType | Yes | Tipo do work item, exatamente como definido no processo do projeto (ex.: "Task", "Bug", "User Story", "Product Backlog Item", "Epic"). | |
| iterationPath | No | Iteration path (sprint), ex.: "MeuProjeto\\Sprint 12". | |
| additionalFields | No | Campos 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. | |
| acceptanceCriteria | No | Crité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
| Name | Required | Description |
|---|---|---|
| workItem | Yes |
TDQS
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.
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.
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.
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.
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.
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 itemARead-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á?"
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID numérico do work item, como aparece na interface web | |
| expand | No | Ní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 |
| fields | No | Campos específicos a retornar, por nome de referência (ex.: ["System.Title", "Custom.Sistema"]). Exige expand: "none". | |
| project | No | Nome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor. |
Output Schema
| Name | Required | Description |
|---|---|---|
| workItem | Yes |
TDQS
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.
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.
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.
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.
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.
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 itemsARead-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:
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.
queryId — executa uma consulta salva (Shared Query) pelo seu GUID.
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"
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Quantidade máxima de work items a retornar. Padrão: 50, máximo: 200. | |
| skip | No | Quantos resultados pular, para paginar. Padrão: 0. | |
| wiql | No | Consulta 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. | |
| fields | No | Campos adicionais a trazer em cada item, por nome de referência (ex.: ["Microsoft.VSTS.Scheduling.StoryPoints"]). | |
| states | No | Filtra por estados, ex.: ["Active", "New"]. | |
| project | No | Nome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor. | |
| queryId | No | GUID de uma consulta salva (Shared Queries) a ser executada. | |
| areaPath | No | Filtra pela área e suas sub-áreas (operador UNDER), ex.: "MeuProjeto\\Backend". | |
| assignedTo | No | Filtra 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"). | |
| workItemTypes | No | Filtra por tipo, ex.: ["Bug", "Task"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Quantidade de work items retornados nesta página |
| query | Yes | A consulta WIQL efetivamente executada |
| workItems | Yes | Os work items encontrados |
| totalMatched | Yes | Total de work items que a consulta encontrou, antes de top/skip |
TDQS
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.
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.
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.
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.
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.
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"
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID numérico do work item, como aparece na interface web | |
| tags | No | Substitui a lista completa de tags. Passe [] para remover todas. Não combine com tagsToAdd/tagsToRemove. | |
| state | No | Novo estado, respeitando o fluxo do tipo (ex.: "Active", "Resolved", "Closed"). Transições inválidas são recusadas pelo Azure DevOps. | |
| title | No | Novo título. | |
| comment | No | Comentá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. | |
| project | No | Nome ou ID do projeto no Azure DevOps Server. Pode ser omitido se ADO_DEFAULT_PROJECT estiver configurado no servidor. | |
| areaPath | No | Novo area path. | |
| priority | No | Nova prioridade, de 1 (mais alta) a 4 (mais baixa). | |
| tagsToAdd | No | Tags a acrescentar, preservando as existentes. | |
| assignedTo | No | Novo responsável: nome de exibição, e-mail ou DOMINIO\usuario. | |
| description | No | Nova descrição. Campos de texto longo no Azure DevOps são HTML — use <p>, <br>, <ul>. Não use blocos CDATA nem Markdown. | |
| tagsToRemove | No | Tags a remover, preservando as demais. | |
| iterationPath | No | Novo iteration path (sprint). | |
| additionalFields | No | Outros campos a atualizar, por nome de referência. Ex.: {"Custom.Sistema": "Portal", "Microsoft.VSTS.Common.Severity": "2 - High"}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| workItem | Yes | |
| updatedFields | Yes | Nomes de referência dos campos efetivamente enviados na atualização |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v0.1.0- First observed
create_work_item - First observed
get_work_item - First observed
list_work_items - First observed
update_work_item
TDQS
Scored across 4 tools
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.
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.
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.
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
Related MCP Connectors
Crie épicos, features, histórias e tasks no Azure DevOps a partir de uma conversa.
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Plan Salesforce deploys, open pull requests and trigger pipelines from your AI client.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables interaction with Azure DevOps work items through AI assistants like VS Code/GitHub Copilot. Supports fetching work item details and updating work item statuses using natural language commands.-
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Azure DevOps to manage work items, Git repositories, branches, commits, and projects through natural language commands.736 npm5MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to interact with Azure DevOps APIs for managing projects, work items, repositories, pull requests, and pipelines through natural language.11 npmMIT
- AlicenseAqualityBmaintenanceEnables AI assistants to interact with Azure DevOps Server 2022 through natural language, enabling queries and operations on pipelines, pull requests, builds, and repositories.16736 npm1MIT