@slorenzot/mcp-azure 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,836 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
38
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
39
+ const zod_1 = require("zod");
40
+ const azdev = __importStar(require("azure-devops-node-api"));
41
+ const witInterfaces = __importStar(require("azure-devops-node-api/interfaces/WorkItemTrackingInterfaces"));
42
+ const VSSInterfaces = __importStar(require("azure-devops-node-api/interfaces/common/VSSInterfaces"));
43
+ const identity_1 = require("@azure/identity");
44
+ const child_process_1 = require("child_process");
45
+ // Helper para abrir URL en el navegador (cross-platform)
46
+ function openBrowser(url) {
47
+ const platform = process.platform;
48
+ let command;
49
+ switch (platform) {
50
+ case "darwin":
51
+ command = `open "${url}"`;
52
+ break;
53
+ case "win32":
54
+ command = `start "" "${url}"`;
55
+ break;
56
+ default:
57
+ command = `xdg-open "${url}"`;
58
+ }
59
+ (0, child_process_1.exec)(command, (error) => {
60
+ if (error) {
61
+ console.error(`No se pudo abrir el navegador: ${error.message}`);
62
+ }
63
+ });
64
+ }
65
+ // Crear el servidor MCP
66
+ const server = new mcp_js_1.McpServer({
67
+ name: "mcp-azure",
68
+ version: "1.0.0",
69
+ });
70
+ // Configuración de conexión
71
+ let connection = null;
72
+ let workItemTrackingApi = null;
73
+ let coreApiClient = null;
74
+ let currentProject = "";
75
+ // Helper para obtener la conexión
76
+ async function getConnection() {
77
+ if (!connection) {
78
+ throw new Error("No hay conexión configurada. Usa ado_configure primero para establecer la conexión.");
79
+ }
80
+ return connection;
81
+ }
82
+ // Helper para obtener Work Item Tracking API
83
+ async function getWitApi() {
84
+ if (!workItemTrackingApi) {
85
+ const conn = await getConnection();
86
+ workItemTrackingApi = await conn.getWorkItemTrackingApi();
87
+ }
88
+ return workItemTrackingApi;
89
+ }
90
+ // Helper para obtener Core API
91
+ async function getCoreApi() {
92
+ if (!coreApiClient) {
93
+ const conn = await getConnection();
94
+ coreApiClient = await conn.getCoreApi();
95
+ }
96
+ return coreApiClient;
97
+ }
98
+ // Helper para formatear Work Item
99
+ function formatWorkItem(workItem) {
100
+ const fields = workItem.fields || {};
101
+ return JSON.stringify({
102
+ id: workItem.id,
103
+ rev: workItem.rev,
104
+ url: workItem.url,
105
+ fields: {
106
+ title: fields["System.Title"],
107
+ state: fields["System.State"],
108
+ workItemType: fields["System.WorkItemType"],
109
+ assignedTo: fields["System.AssignedTo"]?.displayName,
110
+ areaPath: fields["System.AreaPath"],
111
+ iterationPath: fields["System.IterationPath"],
112
+ description: fields["System.Description"],
113
+ tags: fields["System.Tags"],
114
+ createdDate: fields["System.CreatedDate"],
115
+ changedDate: fields["System.ChangedDate"],
116
+ },
117
+ }, null, 2);
118
+ }
119
+ // Helper para formatear lista de Work Items
120
+ function formatWorkItemList(workItems) {
121
+ return workItems
122
+ .map((wi) => `ID: ${wi.id} - URL: ${wi.url}`)
123
+ .join("\n");
124
+ }
125
+ // ============================================
126
+ // HERRAMIENTAS DE AZURE DEVOPS - AUTENTICACIÓN
127
+ // ============================================
128
+ // Scope de Azure DevOps para Azure AD
129
+ const AZURE_DEVOPS_SCOPE = "499b84ac-1321-427f-aa17-267ca6975798/.default";
130
+ // Login con flujo de navegador (Azure AD)
131
+ server.tool("ado_login", "Inicia sesión en Azure DevOps usando el navegador (Azure AD). No requiere PAT.", {
132
+ organization: zod_1.z
133
+ .string()
134
+ .describe("URL de la organización (ej: https://dev.azure.com/mi-org)"),
135
+ project: zod_1.z.string().describe("Nombre del proyecto"),
136
+ method: zod_1.z
137
+ .enum(["browser", "device_code", "azure_cli"])
138
+ .optional()
139
+ .describe("Método de autenticación: 'browser' (abre navegador), 'device_code' (código de dispositivo), 'azure_cli' (usa sesión de az cli)"),
140
+ tenantId: zod_1.z
141
+ .string()
142
+ .optional()
143
+ .describe("ID del tenant de Azure AD (opcional, usa 'common' por defecto)"),
144
+ }, async ({ organization, project, method = "device_code", tenantId }) => {
145
+ workItemTrackingApi = null;
146
+ coreApiClient = null;
147
+ currentProject = project;
148
+ const tenant = tenantId || "common";
149
+ let credential;
150
+ let authMessage = "";
151
+ try {
152
+ switch (method) {
153
+ case "browser":
154
+ // Abre el navegador automáticamente
155
+ credential = new identity_1.InteractiveBrowserCredential({
156
+ tenantId: tenant,
157
+ redirectUri: "http://localhost:8400",
158
+ });
159
+ authMessage = "Abriendo navegador para autenticación...";
160
+ break;
161
+ case "device_code":
162
+ // Muestra código para ingresar en el navegador
163
+ credential = new identity_1.DeviceCodeCredential({
164
+ tenantId: tenant,
165
+ userPromptCallback: (info) => {
166
+ // Abrir el navegador con la URL de verificación
167
+ openBrowser(info.verificationUri);
168
+ console.error(`\n${info.message}\n`);
169
+ },
170
+ });
171
+ authMessage =
172
+ "Se abrirá el navegador. Ingresa el código que aparece en la consola.";
173
+ break;
174
+ case "azure_cli":
175
+ // Usa la sesión de Azure CLI existente
176
+ credential = new identity_1.AzureCliCredential();
177
+ authMessage = "Usando sesión de Azure CLI...";
178
+ break;
179
+ }
180
+ // Obtener el token de acceso
181
+ const tokenResponse = await credential.getToken(AZURE_DEVOPS_SCOPE);
182
+ if (!tokenResponse?.token) {
183
+ throw new Error("No se pudo obtener el token de acceso");
184
+ }
185
+ // Crear conexión con el token de Bearer
186
+ const authHandler = azdev.getBearerHandler(tokenResponse.token);
187
+ connection = new azdev.WebApi(organization, authHandler);
188
+ // Verificar conexión
189
+ const connData = await connection.connect();
190
+ return {
191
+ content: [
192
+ {
193
+ type: "text",
194
+ text: `✓ Autenticación exitosa con Azure AD\n- Método: ${method}\n- Organización: ${organization}\n- Proyecto: ${project}\n- Usuario: ${connData.authenticatedUser?.providerDisplayName || "N/A"}\n- Token expira: ${tokenResponse.expiresOnTimestamp ? new Date(tokenResponse.expiresOnTimestamp).toLocaleString() : "N/A"}`,
195
+ },
196
+ ],
197
+ };
198
+ }
199
+ catch (error) {
200
+ connection = null;
201
+ throw new Error(`Error de autenticación: ${error.message}`);
202
+ }
203
+ });
204
+ // Configurar Azure DevOps con PAT (método alternativo)
205
+ server.tool("ado_configure", "Configura la conexión a Azure DevOps con token de acceso personal (PAT). Alternativa a ado_login.", {
206
+ organization: zod_1.z
207
+ .string()
208
+ .describe("URL de la organización (ej: https://dev.azure.com/mi-org)"),
209
+ project: zod_1.z.string().describe("Nombre del proyecto"),
210
+ pat: zod_1.z
211
+ .string()
212
+ .describe("Token de acceso personal (PAT) de Azure DevOps"),
213
+ }, async ({ organization, project, pat }) => {
214
+ const authHandler = azdev.getPersonalAccessTokenHandler(pat);
215
+ connection = new azdev.WebApi(organization, authHandler);
216
+ workItemTrackingApi = null;
217
+ coreApiClient = null;
218
+ currentProject = project;
219
+ // Verificar conexión
220
+ try {
221
+ const connData = await connection.connect();
222
+ return {
223
+ content: [
224
+ {
225
+ type: "text",
226
+ text: `Conexión establecida exitosamente.\n- Organización: ${organization}\n- Proyecto: ${project}\n- Usuario autenticado: ${connData.authenticatedUser?.providerDisplayName || "N/A"}`,
227
+ },
228
+ ],
229
+ };
230
+ }
231
+ catch (error) {
232
+ connection = null;
233
+ throw new Error(`Error al conectar: ${error.message}`);
234
+ }
235
+ });
236
+ // ============================================
237
+ // HERRAMIENTAS DE AZURE DEVOPS WORK ITEMS
238
+ // ============================================
239
+ // Obtener un Work Item por ID
240
+ server.tool("ado_get_work_item", "Obtiene un Work Item de Azure DevOps por su ID", {
241
+ id: zod_1.z.number().describe("El ID del Work Item"),
242
+ full: zod_1.z
243
+ .boolean()
244
+ .optional()
245
+ .describe("Si es true, devuelve todos los campos"),
246
+ }, async ({ id, full }) => {
247
+ const api = await getWitApi();
248
+ const expand = full
249
+ ? witInterfaces.WorkItemExpand.All
250
+ : witInterfaces.WorkItemExpand.Fields;
251
+ const workItem = await api.getWorkItem(id, undefined, undefined, expand);
252
+ if (!workItem) {
253
+ throw new Error(`Work Item con ID ${id} no encontrado`);
254
+ }
255
+ const result = full
256
+ ? JSON.stringify(workItem, null, 2)
257
+ : formatWorkItem(workItem);
258
+ return {
259
+ content: [{ type: "text", text: result }],
260
+ };
261
+ });
262
+ // Consultar Work Items por Sprint
263
+ server.tool("ado_query_sprint", "Consulta User Stories de un sprint específico en Azure DevOps", {
264
+ iterationPath: zod_1.z
265
+ .string()
266
+ .describe("Ruta del sprint (ej: 'Proyecto\\Sprint1')"),
267
+ state: zod_1.z
268
+ .string()
269
+ .optional()
270
+ .describe("Filtrar por estado (Active, New, Closed, etc.)"),
271
+ }, async ({ iterationPath, state }) => {
272
+ const api = await getWitApi();
273
+ const stateFilter = state ? ` AND [System.State] = '${state}'` : "";
274
+ const wiql = {
275
+ query: `SELECT [System.Id], [System.Title], [System.State], [System.Tags] FROM WorkItems WHERE [System.WorkItemType] = 'User Story'${stateFilter} AND [System.IterationPath] UNDER '${iterationPath}' ORDER BY [System.Id]`,
276
+ };
277
+ const teamContext = { project: currentProject };
278
+ const queryResult = await api.queryByWiql(wiql, teamContext);
279
+ const workItemRefs = queryResult.workItems || [];
280
+ if (workItemRefs.length === 0) {
281
+ return {
282
+ content: [
283
+ { type: "text", text: "No se encontraron Work Items en este sprint" },
284
+ ],
285
+ };
286
+ }
287
+ // Obtener detalles de los Work Items
288
+ const ids = workItemRefs.map((wi) => wi.id).filter((id) => id !== undefined);
289
+ const workItems = await api.getWorkItems(ids, ["System.Id", "System.Title", "System.State", "System.Tags"], undefined, witInterfaces.WorkItemExpand.Fields);
290
+ const result = workItems
291
+ .map((wi) => {
292
+ const fields = wi.fields || {};
293
+ return `ID: ${wi.id} | ${fields["System.Title"]} | Estado: ${fields["System.State"]} | Tags: ${fields["System.Tags"] || "N/A"}`;
294
+ })
295
+ .join("\n");
296
+ return {
297
+ content: [{ type: "text", text: result || "Sin resultados" }],
298
+ };
299
+ });
300
+ // Consultar Work Items por Área
301
+ server.tool("ado_query_area", "Consulta User Stories de un área específica en Azure DevOps", {
302
+ areaPath: zod_1.z.string().describe("Ruta del área (ej: 'Proyecto\\Equipo')"),
303
+ workItemType: zod_1.z
304
+ .string()
305
+ .optional()
306
+ .describe("Tipo de Work Item (User Story, Bug, Task, etc.)"),
307
+ }, async ({ areaPath, workItemType }) => {
308
+ const api = await getWitApi();
309
+ const type = workItemType || "User Story";
310
+ const wiql = {
311
+ query: `SELECT [System.Id], [System.Title], [System.State], [System.Tags] FROM WorkItems WHERE [System.WorkItemType] = '${type}' AND [System.AreaPath] UNDER '${areaPath}' ORDER BY [System.Id] DESC`,
312
+ };
313
+ const teamContext = { project: currentProject };
314
+ const queryResult = await api.queryByWiql(wiql, teamContext);
315
+ const workItemRefs = queryResult.workItems || [];
316
+ if (workItemRefs.length === 0) {
317
+ return {
318
+ content: [
319
+ { type: "text", text: "No se encontraron Work Items en esta área" },
320
+ ],
321
+ };
322
+ }
323
+ const ids = workItemRefs.map((wi) => wi.id).filter((id) => id !== undefined);
324
+ const workItems = await api.getWorkItems(ids, ["System.Id", "System.Title", "System.State", "System.Tags"], undefined, witInterfaces.WorkItemExpand.Fields);
325
+ const result = workItems
326
+ .map((wi) => {
327
+ const fields = wi.fields || {};
328
+ return `ID: ${wi.id} | ${fields["System.Title"]} | Estado: ${fields["System.State"]} | Tags: ${fields["System.Tags"] || "N/A"}`;
329
+ })
330
+ .join("\n");
331
+ return {
332
+ content: [{ type: "text", text: result || "Sin resultados" }],
333
+ };
334
+ });
335
+ // Ejecutar query WIQL personalizado
336
+ server.tool("ado_query_wiql", "Ejecuta una consulta WIQL personalizada en Azure DevOps", {
337
+ wiql: zod_1.z.string().describe("Query WIQL completa"),
338
+ getDetails: zod_1.z
339
+ .boolean()
340
+ .optional()
341
+ .describe("Si es true, obtiene los detalles completos de cada Work Item"),
342
+ }, async ({ wiql, getDetails }) => {
343
+ const api = await getWitApi();
344
+ const wiqlQuery = { query: wiql };
345
+ const teamContext = { project: currentProject };
346
+ const queryResult = await api.queryByWiql(wiqlQuery, teamContext);
347
+ const workItemRefs = queryResult.workItems || [];
348
+ if (workItemRefs.length === 0) {
349
+ return {
350
+ content: [{ type: "text", text: "No se encontraron resultados" }],
351
+ };
352
+ }
353
+ if (!getDetails) {
354
+ return {
355
+ content: [{ type: "text", text: formatWorkItemList(workItemRefs) }],
356
+ };
357
+ }
358
+ const ids = workItemRefs.map((wi) => wi.id).filter((id) => id !== undefined);
359
+ const workItems = await api.getWorkItems(ids);
360
+ const result = workItems.map((wi) => formatWorkItem(wi)).join("\n---\n");
361
+ return {
362
+ content: [{ type: "text", text: result }],
363
+ };
364
+ });
365
+ // Crear un Work Item
366
+ server.tool("ado_create_work_item", "Crea un nuevo Work Item en Azure DevOps", {
367
+ title: zod_1.z.string().describe("Título del Work Item"),
368
+ type: zod_1.z
369
+ .string()
370
+ .describe("Tipo de Work Item (User Story, Bug, Task, etc.)"),
371
+ description: zod_1.z.string().optional().describe("Descripción del Work Item"),
372
+ areaPath: zod_1.z.string().optional().describe("Ruta del área"),
373
+ iterationPath: zod_1.z.string().optional().describe("Ruta del sprint/iteración"),
374
+ assignedTo: zod_1.z.string().optional().describe("Usuario asignado"),
375
+ }, async ({ title, type, description, areaPath, iterationPath, assignedTo }) => {
376
+ const api = await getWitApi();
377
+ const patchDocument = [
378
+ {
379
+ op: VSSInterfaces.Operation.Add,
380
+ path: "/fields/System.Title",
381
+ value: title,
382
+ },
383
+ ];
384
+ if (description) {
385
+ patchDocument.push({
386
+ op: VSSInterfaces.Operation.Add,
387
+ path: "/fields/System.Description",
388
+ value: description,
389
+ });
390
+ }
391
+ if (areaPath) {
392
+ patchDocument.push({
393
+ op: VSSInterfaces.Operation.Add,
394
+ path: "/fields/System.AreaPath",
395
+ value: areaPath,
396
+ });
397
+ }
398
+ if (iterationPath) {
399
+ patchDocument.push({
400
+ op: VSSInterfaces.Operation.Add,
401
+ path: "/fields/System.IterationPath",
402
+ value: iterationPath,
403
+ });
404
+ }
405
+ if (assignedTo) {
406
+ patchDocument.push({
407
+ op: VSSInterfaces.Operation.Add,
408
+ path: "/fields/System.AssignedTo",
409
+ value: assignedTo,
410
+ });
411
+ }
412
+ const workItem = await api.createWorkItem(null, patchDocument, currentProject, type);
413
+ return {
414
+ content: [
415
+ {
416
+ type: "text",
417
+ text: `Work Item creado exitosamente:\n${formatWorkItem(workItem)}`,
418
+ },
419
+ ],
420
+ };
421
+ });
422
+ // Actualizar un Work Item
423
+ server.tool("ado_update_work_item", "Actualiza un Work Item existente en Azure DevOps", {
424
+ id: zod_1.z.number().describe("ID del Work Item a actualizar"),
425
+ title: zod_1.z.string().optional().describe("Nuevo título"),
426
+ state: zod_1.z
427
+ .string()
428
+ .optional()
429
+ .describe("Nuevo estado (New, Active, Closed, etc.)"),
430
+ assignedTo: zod_1.z.string().optional().describe("Usuario asignado"),
431
+ description: zod_1.z.string().optional().describe("Nueva descripción"),
432
+ fields: zod_1.z
433
+ .record(zod_1.z.string(), zod_1.z.string())
434
+ .optional()
435
+ .describe("Campos adicionales como objeto {campo: valor}"),
436
+ }, async ({ id, title, state, assignedTo, description, fields }) => {
437
+ const api = await getWitApi();
438
+ const patchDocument = [];
439
+ if (title) {
440
+ patchDocument.push({
441
+ op: VSSInterfaces.Operation.Add,
442
+ path: "/fields/System.Title",
443
+ value: title,
444
+ });
445
+ }
446
+ if (state) {
447
+ patchDocument.push({
448
+ op: VSSInterfaces.Operation.Add,
449
+ path: "/fields/System.State",
450
+ value: state,
451
+ });
452
+ }
453
+ if (assignedTo) {
454
+ patchDocument.push({
455
+ op: VSSInterfaces.Operation.Add,
456
+ path: "/fields/System.AssignedTo",
457
+ value: assignedTo,
458
+ });
459
+ }
460
+ if (description) {
461
+ patchDocument.push({
462
+ op: VSSInterfaces.Operation.Add,
463
+ path: "/fields/System.Description",
464
+ value: description,
465
+ });
466
+ }
467
+ if (fields) {
468
+ for (const [field, value] of Object.entries(fields)) {
469
+ patchDocument.push({
470
+ op: VSSInterfaces.Operation.Add,
471
+ path: `/fields/${field}`,
472
+ value: value,
473
+ });
474
+ }
475
+ }
476
+ if (patchDocument.length === 0) {
477
+ throw new Error("Debe proporcionar al menos un campo para actualizar");
478
+ }
479
+ const workItem = await api.updateWorkItem(null, patchDocument, id);
480
+ return {
481
+ content: [
482
+ {
483
+ type: "text",
484
+ text: `Work Item actualizado exitosamente:\n${formatWorkItem(workItem)}`,
485
+ },
486
+ ],
487
+ };
488
+ });
489
+ // Listar iteraciones/sprints
490
+ server.tool("ado_list_iterations", "Lista las iteraciones/sprints disponibles en el proyecto", {}, async () => {
491
+ const api = await getWitApi();
492
+ const iterations = await api.getClassificationNode(currentProject, witInterfaces.TreeStructureGroup.Iterations, undefined, 10);
493
+ function formatIterations(node, indent = "") {
494
+ let result = `${indent}${node.name}`;
495
+ if (node.attributes) {
496
+ const startDate = node.attributes["startDate"];
497
+ const finishDate = node.attributes["finishDate"];
498
+ if (startDate || finishDate) {
499
+ result += ` (${startDate ? new Date(startDate).toLocaleDateString() : "?"} - ${finishDate ? new Date(finishDate).toLocaleDateString() : "?"})`;
500
+ }
501
+ }
502
+ result += "\n";
503
+ if (node.children) {
504
+ for (const child of node.children) {
505
+ result += formatIterations(child, indent + " ");
506
+ }
507
+ }
508
+ return result;
509
+ }
510
+ const result = formatIterations(iterations);
511
+ return {
512
+ content: [{ type: "text", text: result }],
513
+ };
514
+ });
515
+ // Listar áreas del proyecto
516
+ server.tool("ado_list_areas", "Lista las áreas disponibles en el proyecto", {}, async () => {
517
+ const api = await getWitApi();
518
+ const areas = await api.getClassificationNode(currentProject, witInterfaces.TreeStructureGroup.Areas, undefined, 10);
519
+ function formatAreas(node, indent = "") {
520
+ let result = `${indent}${node.name}\n`;
521
+ if (node.children) {
522
+ for (const child of node.children) {
523
+ result += formatAreas(child, indent + " ");
524
+ }
525
+ }
526
+ return result;
527
+ }
528
+ const result = formatAreas(areas);
529
+ return {
530
+ content: [{ type: "text", text: result }],
531
+ };
532
+ });
533
+ // ============================================
534
+ // PROMPTS DE MCP PARA IA
535
+ // ============================================
536
+ // Prompt para iniciar sesión en Azure DevOps
537
+ server.prompt("connect", "Inicia sesión en Azure DevOps usando un Personal Access Token (PAT).", {
538
+ organization: zod_1.z
539
+ .string()
540
+ .describe("URL de la organización (ej: https://dev.azure.com/mi-org)"),
541
+ project: zod_1.z.string().optional().describe("Nombre del proyecto"),
542
+ pat: zod_1.z.string().describe("Personal Access Token (PAT)"),
543
+ }, async ({ organization, project, pat }) => {
544
+ let instructions = `Conectando a Azure DevOps...
545
+
546
+ **Datos de conexión:**
547
+ - Organización: ${organization}
548
+ - Proyecto: ${project || "(no especificado)"}
549
+ - PAT: ****${pat.slice(-4)}
550
+
551
+ `;
552
+ if (!project) {
553
+ instructions += `Por favor proporciona el nombre del proyecto para continuar.
554
+
555
+ Una vez tengas el proyecto, ejecuta:
556
+ \`ado_configure(organization="${organization}", project="TU_PROYECTO", pat="${pat}")\``;
557
+ }
558
+ else {
559
+ instructions += `Ejecuta la herramienta ado_configure para establecer la conexión:
560
+ \`ado_configure(organization="${organization}", project="${project}", pat="${pat}")\``;
561
+ }
562
+ return {
563
+ messages: [
564
+ {
565
+ role: "user",
566
+ content: {
567
+ type: "text",
568
+ text: instructions,
569
+ },
570
+ },
571
+ ],
572
+ };
573
+ });
574
+ // Prompt para analizar un sprint
575
+ server.prompt("analyze_sprint", "Analiza el estado actual de un sprint y proporciona un resumen", {
576
+ iterationPath: zod_1.z.string().describe("Ruta del sprint a analizar"),
577
+ }, async ({ iterationPath }) => {
578
+ return {
579
+ messages: [
580
+ {
581
+ role: "user",
582
+ content: {
583
+ type: "text",
584
+ text: `Por favor analiza el sprint "${iterationPath}" en Azure DevOps:
585
+
586
+ 1. Primero, usa la herramienta ado_query_sprint para obtener todas las User Stories del sprint
587
+ 2. Cuenta cuántas están en cada estado (New, Active, Closed, etc.)
588
+ 3. Identifica si hay User Stories bloqueadas o en riesgo
589
+ 4. Proporciona un resumen ejecutivo del progreso del sprint
590
+ 5. Sugiere acciones si hay problemas
591
+
592
+ Usa las herramientas de Azure DevOps disponibles para obtener la información necesaria.`,
593
+ },
594
+ },
595
+ ],
596
+ };
597
+ });
598
+ // Prompt para crear User Story desde descripción
599
+ server.prompt("create_user_story", "Crea una User Story bien estructurada a partir de una descripción", {
600
+ description: zod_1.z.string().describe("Descripción de la funcionalidad deseada"),
601
+ areaPath: zod_1.z.string().optional().describe("Área del proyecto"),
602
+ iterationPath: zod_1.z.string().optional().describe("Sprint destino"),
603
+ }, async ({ description, areaPath, iterationPath }) => {
604
+ return {
605
+ messages: [
606
+ {
607
+ role: "user",
608
+ content: {
609
+ type: "text",
610
+ text: `Crea una User Story en Azure DevOps basada en esta descripción:
611
+
612
+ "${description}"
613
+
614
+ Requisitos:
615
+ 1. Genera un título conciso y descriptivo
616
+ 2. Escribe la descripción en formato: "Como [rol], quiero [acción] para [beneficio]"
617
+ 3. Incluye criterios de aceptación claros
618
+ ${areaPath ? `4. Asigna al área: ${areaPath}` : ""}
619
+ ${iterationPath ? `5. Asigna al sprint: ${iterationPath}` : ""}
620
+
621
+ Usa la herramienta ado_create_work_item para crear la User Story con el contenido generado.`,
622
+ },
623
+ },
624
+ ],
625
+ };
626
+ });
627
+ // Prompt para reporte diario de trabajo
628
+ server.prompt("daily_standup", "Genera un reporte de standup diario basado en los work items", {
629
+ assignedTo: zod_1.z.string().describe("Usuario para el reporte"),
630
+ }, async ({ assignedTo }) => {
631
+ return {
632
+ messages: [
633
+ {
634
+ role: "user",
635
+ content: {
636
+ type: "text",
637
+ text: `Genera un reporte de standup diario para ${assignedTo}:
638
+
639
+ 1. Usa ado_query_wiql para buscar:
640
+ - Work Items activos asignados a "${assignedTo}"
641
+ - Work Items completados recientemente por "${assignedTo}"
642
+
643
+ 2. Organiza el reporte en formato standup:
644
+ - ¿Qué se completó ayer?
645
+ - ¿En qué se está trabajando hoy?
646
+ - ¿Hay algún impedimento?
647
+
648
+ Consulta WIQL sugerida:
649
+ SELECT [System.Id], [System.Title], [System.State], [System.ChangedDate]
650
+ FROM WorkItems
651
+ WHERE [System.AssignedTo] = '${assignedTo}'
652
+ AND [System.State] IN ('Active', 'Closed', 'Resolved')
653
+ ORDER BY [System.ChangedDate] DESC`,
654
+ },
655
+ },
656
+ ],
657
+ };
658
+ });
659
+ // Prompt para planificación de sprint
660
+ server.prompt("plan_sprint", "Ayuda a planificar un nuevo sprint", {
661
+ iterationPath: zod_1.z.string().describe("Ruta del sprint a planificar"),
662
+ backlogArea: zod_1.z.string().describe("Área del backlog a revisar"),
663
+ }, async ({ iterationPath, backlogArea }) => {
664
+ return {
665
+ messages: [
666
+ {
667
+ role: "user",
668
+ content: {
669
+ type: "text",
670
+ text: `Ayúdame a planificar el sprint "${iterationPath}":
671
+
672
+ 1. Primero, lista las iteraciones disponibles con ado_list_iterations
673
+ 2. Busca User Stories en el backlog (estado New) del área "${backlogArea}" usando ado_query_area
674
+ 3. Para cada User Story candidata, muestra:
675
+ - ID y Título
676
+ - Estado actual
677
+ - Tags relevantes
678
+
679
+ 4. Sugiere cuáles User Stories priorizar basándote en:
680
+ - Dependencias
681
+ - Complejidad aparente
682
+ - Valor de negocio (si hay tags indicativos)
683
+
684
+ 5. Para las User Stories seleccionadas, puedo moverlas al sprint usando ado_update_work_item`,
685
+ },
686
+ },
687
+ ],
688
+ };
689
+ });
690
+ // Prompt para buscar y actualizar work items
691
+ server.prompt("bulk_update", "Actualiza múltiples work items basado en criterios", {
692
+ searchCriteria: zod_1.z.string().describe("Criterios de búsqueda en lenguaje natural"),
693
+ updateAction: zod_1.z.string().describe("Acción a realizar (ej: cambiar estado, asignar, mover a sprint)"),
694
+ }, async ({ searchCriteria, updateAction }) => {
695
+ return {
696
+ messages: [
697
+ {
698
+ role: "user",
699
+ content: {
700
+ type: "text",
701
+ text: `Necesito actualizar work items en Azure DevOps:
702
+
703
+ **Criterios de búsqueda:** ${searchCriteria}
704
+ **Acción a realizar:** ${updateAction}
705
+
706
+ Por favor:
707
+ 1. Genera una consulta WIQL apropiada para encontrar los work items
708
+ 2. Ejecuta ado_query_wiql para obtener los IDs
709
+ 3. Muéstrame la lista de work items que coinciden
710
+ 4. Pide confirmación antes de actualizar
711
+ 5. Si confirmo, usa ado_update_work_item para cada uno
712
+
713
+ IMPORTANTE: Siempre muestra lo que vas a cambiar ANTES de hacerlo y espera mi confirmación.`,
714
+ },
715
+ },
716
+ ],
717
+ };
718
+ });
719
+ // Prompt para generar reporte de proyecto
720
+ server.prompt("project_report", "Genera un reporte del estado del proyecto", {}, async () => {
721
+ return {
722
+ messages: [
723
+ {
724
+ role: "user",
725
+ content: {
726
+ type: "text",
727
+ text: `Genera un reporte completo del estado del proyecto en Azure DevOps:
728
+
729
+ 1. **Estructura del proyecto:**
730
+ - Usa ado_list_areas para mostrar las áreas
731
+ - Usa ado_list_iterations para mostrar los sprints
732
+
733
+ 2. **Estado por Sprint:**
734
+ - Para cada sprint activo, cuenta work items por estado
735
+
736
+ 3. **Métricas generales:**
737
+ - Total de work items abiertos vs cerrados
738
+ - Work items sin asignar
739
+ - Work items antiguos (más de 30 días sin cambios)
740
+
741
+ 4. **Recomendaciones:**
742
+ - Identifica cuellos de botella
743
+ - Sugiere acciones de mejora
744
+
745
+ Usa las herramientas disponibles para recopilar esta información.`,
746
+ },
747
+ },
748
+ ],
749
+ };
750
+ });
751
+ // Prompt para crear bug desde descripción
752
+ server.prompt("report_bug", "Crea un bug report estructurado a partir de una descripción", {
753
+ bugDescription: zod_1.z.string().describe("Descripción del bug encontrado"),
754
+ severity: zod_1.z.enum(["1 - Critical", "2 - High", "3 - Medium", "4 - Low"]).optional().describe("Severidad del bug"),
755
+ }, async ({ bugDescription, severity }) => {
756
+ return {
757
+ messages: [
758
+ {
759
+ role: "user",
760
+ content: {
761
+ type: "text",
762
+ text: `Crea un Bug en Azure DevOps basado en esta descripción:
763
+
764
+ "${bugDescription}"
765
+
766
+ Por favor:
767
+ 1. Genera un título claro y conciso
768
+ 2. Estructura la descripción con:
769
+ - **Pasos para reproducir**
770
+ - **Comportamiento esperado**
771
+ - **Comportamiento actual**
772
+ - **Ambiente/Contexto**
773
+ ${severity ? `3. Severidad: ${severity}` : ""}
774
+
775
+ Usa la herramienta ado_create_work_item con type="Bug" para crear el bug.`,
776
+ },
777
+ },
778
+ ],
779
+ };
780
+ });
781
+ // ============================================
782
+ // RECURSOS DE MCP
783
+ // ============================================
784
+ // Recurso para información de conexión
785
+ server.resource("connection-status", "ado://connection/status", async () => {
786
+ if (!connection) {
787
+ return {
788
+ contents: [
789
+ {
790
+ uri: "ado://connection/status",
791
+ mimeType: "application/json",
792
+ text: JSON.stringify({ connected: false, message: "No conectado. Usa ado_login o ado_configure." }),
793
+ },
794
+ ],
795
+ };
796
+ }
797
+ try {
798
+ const connData = await connection.connect();
799
+ return {
800
+ contents: [
801
+ {
802
+ uri: "ado://connection/status",
803
+ mimeType: "application/json",
804
+ text: JSON.stringify({
805
+ connected: true,
806
+ project: currentProject,
807
+ user: connData.authenticatedUser?.providerDisplayName || "N/A",
808
+ userId: connData.authenticatedUser?.id,
809
+ }),
810
+ },
811
+ ],
812
+ };
813
+ }
814
+ catch {
815
+ return {
816
+ contents: [
817
+ {
818
+ uri: "ado://connection/status",
819
+ mimeType: "application/json",
820
+ text: JSON.stringify({ connected: false, message: "Error al verificar conexión" }),
821
+ },
822
+ ],
823
+ };
824
+ }
825
+ });
826
+ // Función principal para iniciar el servidor
827
+ async function main() {
828
+ const transport = new stdio_js_1.StdioServerTransport();
829
+ await server.connect(transport);
830
+ console.error("Servidor MCP Azure DevOps iniciado (usando SDK)");
831
+ }
832
+ main().catch((error) => {
833
+ console.error("Error al iniciar el servidor:", error);
834
+ process.exit(1);
835
+ });
836
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@slorenzot/mcp-azure",
3
+ "version": "1.0.0",
4
+ "description": "Servidor MCP para Azure DevOps",
5
+ "keywords": [
6
+ "mcp",
7
+ "azure",
8
+ "model-context-protocol"
9
+ ],
10
+ "license": "MIT",
11
+ "author": "Soulberto Lorenzo",
12
+ "type": "commonjs",
13
+ "main": "dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "bin": {
16
+ "mcp-azure": "dist/index.js"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "start": "node dist/index.js",
21
+ "dev": "tsc --watch",
22
+ "prepare": "npm run build"
23
+ },
24
+ "dependencies": {
25
+ "@azure/identity": "^4.5.0",
26
+ "@modelcontextprotocol/sdk": "^1.25.1",
27
+ "azure-devops-node-api": "^14.1.0",
28
+ "zod": "^4.2.1"
29
+ },
30
+ "devDependencies": {
31
+ "@types/node": "^25.0.3",
32
+ "typescript": "^5.9.3"
33
+ }
34
+ }