@slorenzot/mcp-azure
v2.8.0
Published
Servidor MCP para Azure DevOps con manejo robusto de errores, soporte .mcp.json y manejo de concurrencia en adjuntos
Maintainers
Readme
@slorenzot/mcp-azure
Servidor MCP (Model Context Protocol) para Azure DevOps. Permite interactuar con Work Items, repositorios Git, Pull Requests, sprints, áreas, comentarios y adjuntos desde cualquier cliente MCP compatible.
Instalación
npm install -g @slorenzot/mcp-azureO usar directamente con npx:
npx @slorenzot/mcp-azureConfiguración
Variables de Entorno
El servidor se configura automáticamente usando las siguientes variables de entorno:
| Variable | Alternativa | Descripción | Requerido |
|----------|-------------|-------------|-----------|
| AZURE_DEVOPS_ORG | ADO_ORG | URL de la organización (ej: https://dev.azure.com/mi-org) | Sí |
| AZURE_DEVOPS_PAT | ADO_PAT | Personal Access Token | Sí |
| AZURE_DEVOPS_PROJECT | ADO_PROJECT | Nombre del proyecto | No |
Configuración con .mcp.json
El servidor también puede leer credenciales desde un archivo .mcp.json, buscándolo en este orden:
- Directorio actual
- Directorio padre
- Directorio del script
- Home del usuario
Ejemplo:
{
"mcpServers": {
"azure-devops": {
"command": "npx",
"args": ["-y", "@slorenzot/mcp-azure"],
"env": {
"AZURE_DEVOPS_ORG": "https://dev.azure.com/tu-organizacion",
"AZURE_DEVOPS_PAT": "tu-pat-aqui",
"AZURE_DEVOPS_PROJECT": "tu-proyecto"
}
}
}
}Configuración en Claude Desktop
Agrega la siguiente configuración en tu archivo claude_desktop_config.json:
{
"mcpServers": {
"azure-devops": {
"command": "npx",
"args": ["-y", "@slorenzot/mcp-azure"],
"env": {
"AZURE_DEVOPS_ORG": "https://dev.azure.com/tu-organizacion",
"AZURE_DEVOPS_PAT": "tu-pat-aqui",
"AZURE_DEVOPS_PROJECT": "tu-proyecto"
}
}
}
}Configuración en OpenCode
OpenCode utiliza el mismo MCP, pero la configuración se puede hacer de dos formas:
Opción 1: Configuración inicial con variables de entorno
Configura las variables de entorno en tu sistema o en tu configuración de OpenCode:
export AZURE_DEVOPS_ORG="https://dev.azure.com/tu-organizacion" export AZURE_DEVOPS_PAT="tu-pat-aqui" export AZURE_DEVOPS_PROJECT="tu-proyecto"O agrega el servidor MCP en tu configuración de OpenCode:
{ "mcpServers": { "azure-devops": { "command": "npx", "args": ["-y", "@slorenzot/mcp-azure"], "env": { "AZURE_DEVOPS_ORG": "https://dev.azure.com/tu-organizacion", "AZURE_DEVOPS_PAT": "tu-pat-aqui", "AZURE_DEVOPS_PROJECT": "tu-proyecto" } } } }
Opción 2: Configuración dinámica con ado_configure
OpenCode permite configurar la conexión directamente durante la sesión usando el comando ado_configure:
{
"organization": "https://dev.azure.com/tu-organizacion",
"project": "tu-proyecto",
"pat": "tu-pat-aqui"
}Esta opción es útil para cambiar entre diferentes organizaciones o proyectos sin modificar el archivo de configuración.
Nota: Cuando usas ado_configure, la conexión persiste durante la sesión actual de OpenCode.
Obtener un Personal Access Token (PAT)
- Ve a tu organización de Azure DevOps
- Haz clic en tu avatar (esquina superior derecha)
- Selecciona Personal Access Tokens
- Crea un nuevo token con los siguientes permisos:
- Work Items: Read & Write
- Code: Read & Write (para operaciones de repositorios y Pull Requests)
- Project and Team: Read (opcional)
Herramientas Disponibles
Autenticación
| Herramienta | Descripción |
|-------------|-------------|
| ado_configure | Configura la conexión con organización, proyecto y PAT |
Work Items
| Herramienta | Descripción |
|-------------|-------------|
| ado_get_work_item | Obtiene un Work Item por su ID |
| ado_create_work_item | Crea un nuevo Work Item (User Story, Bug, Task, etc.) |
| ado_update_work_item | Actualiza un Work Item existente |
| ado_delete_work_item | Elimina un Work Item en Azure DevOps (soft delete por defecto) |
| ado_get_work_item_type_fields | Obtiene los campos disponibles/requeridos de un tipo |
| ado_add_work_item_link | Crea una relación (Parent/Child/Related/Duplicate/Successor/Predecessor) entre dos Work Items |
| ado_remove_work_item_link | Elimina una relación existente entre dos Work Items |
Consultas
| Herramienta | Descripción |
|-------------|-------------|
| ado_query_sprint | Consulta Work Items de un sprint específico |
| ado_query_area | Consulta Work Items de un área específica |
| ado_query_wiql | Ejecuta una consulta WIQL personalizada |
Estructura del Proyecto
| Herramienta | Descripción |
|-------------|-------------|
| ado_list_iterations | Lista las iteraciones/sprints del proyecto |
| ado_list_areas | Lista las áreas del proyecto |
Repositorios Git
| Herramienta | Descripción |
|-------------|-------------|
| ado_list_repositories | Lista todos los repositorios Git del proyecto |
| ado_get_repository | Obtiene detalles de un repositorio específico por nombre o ID |
| ado_list_branches | Lista las ramas (branches) de un repositorio |
Pull Requests
| Herramienta | Descripción |
|-------------|-------------|
| ado_list_pull_requests | Lista Pull Requests con filtros opcionales (status, branches, creador, revisor) |
| ado_get_pull_request | Obtiene detalles completos de un Pull Request |
| ado_create_pull_request | Crea un nuevo Pull Request |
| ado_update_pull_request | Actualiza propiedades de un Pull Request (título, descripción, draft) |
| ado_complete_pull_request | Completa (merge) un Pull Request con estrategia configurable |
| ado_abandon_pull_request | Abandona un Pull Request |
Pull Request Reviews
| Herramienta | Descripción |
|-------------|-------------|
| ado_approve_pull_request | Aprueba un Pull Request (voto: 10) |
| ado_reject_pull_request | Rechaza un Pull Request (voto: -10) |
| ado_get_pull_request_reviewers | Obtiene todos los revisores y sus votos de un Pull Request |
| ado_add_pull_request_reviewer | Agrega un revisor a un Pull Request |
Pull Request Comments
| Herramienta | Descripción |
|-------------|-------------|
| ado_get_pull_request_threads | Obtiene todos los hilos de comentarios de un Pull Request |
| ado_create_pull_request_thread | Crea un nuevo hilo de comentarios (general o de código) |
| ado_reply_to_pull_request_thread | Responde a un hilo de comentarios existente |
| ado_update_pull_request_thread_status | Actualiza el estado de un hilo de comentarios (Fixed, WontFix, etc.) |
Pull Request Info
| Herramienta | Descripción |
|-------------|-------------|
| ado_get_pull_request_commits | Obtiene todos los commits de un Pull Request |
| ado_get_pull_request_work_items | Obtiene los Work Items vinculados a un Pull Request |
Búsqueda de Identidades
| Herramienta | Descripción |
|-------------|-------------|
| ado_search_users | Busca usuarios por nombre o email. Devuelve el ID de identidad (UUID) necesario para menciones en comentarios |
Comentarios y Discusiones
| Herramienta | Descripción |
|-------------|-------------|
| ado_add_comment | Agrega un comentario a un Work Item (soporta Markdown y menciones con mentions) |
| ado_get_comments | Obtiene los comentarios de un Work Item, incluyendo menciones resueltas |
Adjuntos
| Herramienta | Descripción |
|-------------|-------------|
| ado_upload_attachment | Sube un archivo y devuelve la URL del adjunto |
| ado_add_attachment | Agrega un adjunto a un Work Item |
| ado_delete_attachment | Elimina un adjunto de un Work Item removiendo su relación |
| ado_get_attachments | Lista los adjuntos de un Work Item |
Ejemplos de Uso
Crear una User Story
{
"title": "Implementar login con OAuth",
"type": "User Story",
"description": "Como usuario quiero poder iniciar sesión con mi cuenta de Google",
"areaPath": "MiProyecto\\Backend",
"iterationPath": "MiProyecto\\Sprint 5",
"fields": {
"Custom.OKR": "Seguridad",
"Custom.Prioridad": "Alta"
}
}Consulta WIQL Personalizada
{
"wiql": "SELECT [System.Id], [System.Title] FROM WorkItems WHERE [System.State] = 'Active' AND [System.AssignedTo] = @Me ORDER BY [System.CreatedDate] DESC",
"getDetails": true
}Agregar Comentario con Markdown
{
"id": 12345,
"comment": "## Análisis completado\n\n- Revisado el código\n- Identificados 3 issues\n\n**Próximo paso:** Corregir validaciones"
}Agregar Comentario con Mención
Las menciones requieren el ID de identidad (UUID) del usuario. Hay dos formas de obtenerlo:
- Buscar usuario con
ado_search_users:
{
"searchTerm": "Juan Pérez"
}- Obtener ID desde un Work Item — los campos
System.AssignedTo,System.CreatedByoSystem.ChangedBycontienen elidde identidad.
Luego, agregar el comentario con la mención:
{
"id": 12345,
"comment": "@Juan Pérez ¿podrías revisar este cambio?",
"mentions": [
{
"name": "Juan Pérez",
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
]
}Nota: El texto del comentario debe incluir
@DisplayNameo@{DisplayName}en la posición donde quieras la mención. El MCP reemplaza automáticamente con el HTML de mención de Azure DevOps.
Subir y Adjuntar Archivo
{
"workItemId": 12345,
"filePath": "/ruta/al/archivo.pdf",
"comment": "Documento de especificaciones",
"name": "Especificaciones Funcionales v2.0"
}Vincular Adjunto Existente
{
"workItemId": 12345,
"attachmentUrl": "https://dev.azure.com/org/proj/_apis/wit/attachments/abc123",
"comment": "Diseño de arquitectura",
"name": "Arquitectura del Sistema"
}Eliminar Adjunto de un Work Item
{
"workItemId": 12345,
"attachmentUrl": "https://dev.azure.com/org/proj/_apis/wit/attachments/abc123",
"comment": "Adjunto agregado por error"
}Eliminar una User Story
{
"id": 12345,
"confirm": true,
"destroy": false,
"expectedType": "User Story"
}ado_delete_work_item exige confirm: true. Si envías destroy: true, la eliminación es permanente.
Listar Repositorios
{
"includeHidden": false,
"top": 50
}Listar Pull Requests Activos
{
"status": "Active",
"top": 20
}Crear un Pull Request
{
"repositoryId": "mi-repo",
"sourceRefName": "refs/heads/feature-login",
"targetRefName": "refs/heads/main",
"title": "Implementar login con OAuth",
"description": "Esta PR agrega soporte para login con Google OAuth",
"reviewerIds": ["12345678-1234-1234-1234-1234567890ab"],
"isDraft": false
}Aprobar un Pull Request
{
"pullRequestId": 12345,
"repositoryId": "mi-repo"
}Completar (Merge) un Pull Request
{
"pullRequestId": 12345,
"repositoryId": "mi-repo",
"mergeStrategy": "Squash",
"deleteSourceBranch": true,
"mergeCommitMessage": "Merge de feature-login"
}Crear Comentario en Código
{
"pullRequestId": 12345,
"repositoryId": "mi-repo",
"content": "Por favor extraer esto en una función separada",
"filePath": "/src/components/Login.tsx",
"startLine": 45,
"endLine": 52
}Prompts Disponibles
El servidor incluye prompts predefinidos para facilitar tareas comunes:
| Prompt | Descripción |
|--------|-------------|
| connect | Guía para conectarse a Azure DevOps |
| analyze_sprint | Analiza el estado de un sprint |
| create_user_story | Crea una User Story estructurada |
| daily_standup | Genera un reporte de standup diario |
| plan_sprint | Ayuda a planificar un sprint |
| bulk_update | Actualiza múltiples Work Items |
| project_report | Genera un reporte del proyecto |
| report_bug | Crea un Bug report estructurado |
Recursos
| Recurso | URI | Descripción |
|---------|-----|-------------|
| Estado de conexión | ado://connection/status | Información del estado de conexión actual |
Desarrollo
Requisitos
- Node.js 18+
- npm o yarn
Instalación local
git clone https://github.com/slorenzot/mcp-azure.git
cd mcp-azure
npm install
npm run buildScripts disponibles
npm run build # Compila TypeScript
npm run start # Inicia el servidor
npm run dev # Modo desarrollo con watch
npm run release:check # Valida build y paquete NPM
npm run release:version:patch # Sube versión patch y sincroniza lockfile
npm run release:version:minor # Sube versión minor y sincroniza lockfile
npm run release:version:major # Sube versión major y sincroniza lockfile
npm run release:publish # Publica en NPMFlujo de Release
Para futuras funcionalidades, el flujo recomendado quedó documentado en RELEASE_WORKFLOW.md.
Licencia
MIT
Autor
Soulberto Lorenzo - @slorenzot
Versión
2.7.3 - 39 herramientas disponibles para Azure DevOps (Work Items, Repositorios Git, Pull Requests, sprints, áreas, comentarios con menciones, adjuntos, vínculos entre Work Items y búsqueda de identidades)
