Skip to main content
Glama
README.md
# @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

```bash
npm install -g @slorenzot/mcp-azure
```

O usar directamente con npx:

```bash
npx @slorenzot/mcp-azure
```

## Configuració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:

1. Directorio actual
2. Directorio padre
3. Directorio del script
4. Home del usuario

Ejemplo:

```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 Claude Desktop

Agrega la siguiente configuración en tu archivo `claude_desktop_config.json`:

```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

1. Configura las variables de entorno en tu sistema o en tu configuración de OpenCode:
   ```bash
   export AZURE_DEVOPS_ORG="https://dev.azure.com/tu-organizacion"
   export AZURE_DEVOPS_PAT="tu-pat-aqui"
   export AZURE_DEVOPS_PROJECT="tu-proyecto"
   ```

2. O agrega el servidor MCP en tu configuración de OpenCode:
   ```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"
         }
       }
     }
   }
   ```

#### 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`:

```json
{
  "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)

1. Ve a tu organización de Azure DevOps
2. Haz clic en tu avatar (esquina superior derecha)
3. Selecciona **Personal Access Tokens**
4. 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

```json
{
  "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

```json
{
  "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

```json
{
  "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:

1. **Buscar usuario** con `ado_search_users`:
```json
{
  "searchTerm": "Juan Pérez"
}
```

2. **Obtener ID desde un Work Item** — los campos `System.AssignedTo`, `System.CreatedBy` o `System.ChangedBy` contienen el `id` de identidad.

Luego, agregar el comentario con la mención:

```json
{
  "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 `@DisplayName` o `@{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

```json
{
  "workItemId": 12345,
  "filePath": "/ruta/al/archivo.pdf",
  "comment": "Documento de especificaciones",
  "name": "Especificaciones Funcionales v2.0"
}
```

### Vincular Adjunto Existente

```json
{
  "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

```json
{
  "workItemId": 12345,
  "attachmentUrl": "https://dev.azure.com/org/proj/_apis/wit/attachments/abc123",
  "comment": "Adjunto agregado por error"
}
```

### Eliminar una User Story

```json
{
  "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

```json
{
  "includeHidden": false,
  "top": 50
}
```

### Listar Pull Requests Activos

```json
{
  "status": "Active",
  "top": 20
}
```

### Crear un Pull Request

```json
{
  "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

```json
{
  "pullRequestId": 12345,
  "repositoryId": "mi-repo"
}
```

### Completar (Merge) un Pull Request

```json
{
  "pullRequestId": 12345,
  "repositoryId": "mi-repo",
  "mergeStrategy": "Squash",
  "deleteSourceBranch": true,
  "mergeCommitMessage": "Merge de feature-login"
}
```

### Crear Comentario en Código

```json
{
  "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

```bash
git clone https://github.com/slorenzot/mcp-azure.git
cd mcp-azure
npm install
npm run build
```

### Scripts disponibles

```bash
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 NPM
```

### Flujo de Release

Para futuras funcionalidades, el flujo recomendado quedó documentado en [RELEASE_WORKFLOW.md](/Users/slorenzot/Desktop/Trabajo/Nespon%20Solutions/Proyectos/mcp-azure/RELEASE_WORKFLOW.md).

## Licencia

MIT

## Autor

Soulberto Lorenzo - [@slorenzot](https://github.com/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)

TDQS

B3.4/5.0

Scored across 36 tools

Disambiguation5/5

Each tool targets a distinct action and resource (e.g., create vs update vs delete work items, add vs upload attachments). No two tools have ambiguous purposes, ensuring clear agent selection.

Naming Consistency5/5

All tools follow the consistent pattern 'ado_verb_noun' (e.g., ado_create_work_item, ado_list_repositories). The prefix and verb-noun structure are uniform, making it easy to predict tool names.

Tool Count4/5

36 tools is slightly above the typical range, but the Azure DevOps domain is broad. Each tool covers a necessary operation (work items, PRs, repositories, queries, etc.), so the count feels justified rather than bloated.

Completeness4/5

The tool surface covers the main workflows: CRUD for work items and pull requests, attachments, comments, threads, repositories, and queries. Minor gaps exist (e.g., no create/delete branch or build pipeline tools), but core operations are present.

Maintenance

ActivityInactive
ResponsivenessUnresponsive