@dudamel/mcp-agents 2026.923.1 → 2026.928.1

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.
package/dist/index.js CHANGED
@@ -137,13 +137,7 @@ function createSurfaceServer(opts) {
137
137
  const ctx = {
138
138
  role: config.role,
139
139
  readOnly: config.readOnly ?? false,
140
- agentName: config.agentName,
141
- callChain: config.callChain,
142
- turnId: config.turnId,
143
- rootTurnId: config.rootTurnId,
144
- conversationId: config.conversationId,
145
- requesterUserId: config.requesterUserId,
146
- responseTarget: config.responseTarget
140
+ agentName: config.agentName
147
141
  };
148
142
  const host = withReadOnlyFilter(server, ctx.readOnly);
149
143
  for (const register of opts.registrars)
@@ -263,104 +257,6 @@ function registerAgentTools(server, client, ctx) {
263
257
  return jsonResult(result);
264
258
  }
265
259
  );
266
- server.registerTool(
267
- "send-message-to-agent",
268
- {
269
- description: "Send a message to a PEER Dudamel agent and get their response. Peers are the agents listed in the Peer Agents section of your system prompt: separate agents with their own tools, memory and history, running in their own process. This is the ONLY way to reach them \u2014 your coding tool's own agent-messaging tool (e.g. SendMessage) sees only subagents spawned inside your session and cannot reach a peer. Use this to delegate tasks to or ask questions of another Dudamel agent.",
270
- inputSchema: {
271
- agentName: z.string().describe("Target agent name (as shown in the peer agents list)"),
272
- message: z.string().describe("Message to send to the target agent")
273
- },
274
- annotations: { readOnlyHint: false, destructiveHint: false }
275
- },
276
- async ({ agentName, message }) => {
277
- const result = await client.post(
278
- `/api/agents/by-name/${encodeURIComponent(agentName)}/message`,
279
- // The chain this turn arrived with, plus ourselves (Plan 43 C1). This used to send a
280
- // hardcoded `depth: 0`, which made the server's depth guard decorative: nothing ever
281
- // reported being deeper than zero, so A→B→C→D was unbounded and A→B→A unnoticed.
282
- {
283
- message,
284
- callChain: [...ctx.callChain ?? [], ...ctx.agentName ? [ctx.agentName] : []],
285
- fromAgent: ctx.agentName,
286
- // Plan 43 C3: the callee's turn records WHICH turn asked, so a multi-agent
287
- // interaction can be reconstructed as a tree instead of guessed from timestamps.
288
- parentTurnId: ctx.turnId,
289
- rootTurnId: ctx.rootTurnId ?? ctx.turnId
290
- }
291
- );
292
- return jsonResult(result);
293
- }
294
- );
295
- server.registerTool(
296
- "notify-agent",
297
- {
298
- description: "Hand control back to the conversation that launched THIS workflow run. Use it to report an outcome or to ask the user something through the agent, from a workflow step. Only works from inside a workflow execution, and only for the conversation that launched it \u2014 pass the ids from `{{ trigger.callback }}`. Nobody is blocked waiting: the message is delivered and the agent answers in its own channel.",
299
- inputSchema: {
300
- conversationId: z.string().describe("From `{{ trigger.callback.conversationId }}` \u2014 the conversation to resume"),
301
- message: z.string().describe("What to tell the agent (it will act on it, not echo it)")
302
- },
303
- annotations: { readOnlyHint: false, destructiveHint: false }
304
- },
305
- async ({ conversationId, message }) => {
306
- const executionWorkflowId = process.env["DUDAMEL_WORKFLOW_ID"];
307
- if (!executionWorkflowId) {
308
- throw new Error(
309
- "notify-agent requires a workflow execution context (DUDAMEL_WORKFLOW_ID) \u2014 it only works from a workflow step, not from an agent conversation."
310
- );
311
- }
312
- const result = await client.post("/api/agents/notify", {
313
- conversationId,
314
- executionWorkflowId,
315
- message,
316
- callChain: ctx.callChain
317
- });
318
- return jsonResult(result);
319
- }
320
- );
321
- server.registerTool(
322
- "ask-agent",
323
- {
324
- description: 'Ask the human a question THROUGH the agent, from a workflow step, and park this run until they answer. Pair it with a `waitForSignal` step on the same `signalName`. Unlike a fixed approval prompt, the agent turns a free-form answer ("s\xED dale, pero solo staging") into the structured payload your signal expects. Only works inside a workflow execution, and only for the conversation that launched it \u2014 pass the id from `{{ trigger.callback.conversationId }}`.',
325
- inputSchema: {
326
- conversationId: z.string().describe("From `{{ trigger.callback.conversationId }}` \u2014 where to ask"),
327
- question: z.string().describe("What to ask the human, in their language"),
328
- signalName: z.string().optional().describe("Signal your waitForSignal step listens on (default: humanApproval)")
329
- },
330
- annotations: { readOnlyHint: false, destructiveHint: false }
331
- },
332
- async ({ conversationId, question, signalName }) => {
333
- const executionWorkflowId = process.env["DUDAMEL_WORKFLOW_ID"];
334
- if (!executionWorkflowId) {
335
- throw new Error(
336
- "ask-agent requires a workflow execution context (DUDAMEL_WORKFLOW_ID) \u2014 it only works from a workflow step, not from an agent conversation."
337
- );
338
- }
339
- const result = await client.post("/api/conversation-waits", {
340
- conversationId,
341
- executionWorkflowId,
342
- question,
343
- signalName: signalName ?? "humanApproval",
344
- callChain: ctx.callChain
345
- });
346
- return jsonResult(result);
347
- }
348
- );
349
- server.registerTool(
350
- "answer-workflow",
351
- {
352
- description: "Unblock a workflow that is waiting on the human, with the answer turned into the payload it expects. Call it once you actually have the answer \u2014 translating what the person said into structured fields is your job here, and the reason a workflow asks through you instead of posting a fixed form.",
353
- inputSchema: {
354
- waitId: z.string().describe("The waitId the workflow gave you when it asked"),
355
- payload: z.record(z.unknown()).optional().describe('Structured answer for the signal, e.g. {"approved": true, "env": "staging"}')
356
- },
357
- annotations: { readOnlyHint: false, destructiveHint: false }
358
- },
359
- async ({ waitId, payload }) => {
360
- const result = await client.post("/api/conversation-waits/answer", { waitId, payload });
361
- return jsonResult(result);
362
- }
363
- );
364
260
  server.registerTool(
365
261
  "update-agent",
366
262
  {
@@ -405,56 +301,56 @@ function registerAgentTools(server, client, ctx) {
405
301
  return jsonResult({ subAgentIds: page.items });
406
302
  }
407
303
  );
408
- if (ctx.role !== "admin") return;
409
304
  server.registerTool(
410
- "create-agent",
305
+ "activate-agent",
411
306
  {
412
- description: "Create a new agent definition.",
307
+ description: "Activate an agent so it starts receiving and answering messages.",
413
308
  inputSchema: {
414
- name: z.string().describe("Agent name (unique, kebab-case)"),
415
- displayName: z.string().optional().describe("Display name shown in the UI"),
416
- description: z.string().optional().describe("Agent description"),
417
- identity: z.string().optional().describe('Agent identity (e.g. "senior backend developer")'),
418
- instructions: z.string().optional().describe("Agent instructions (appended to system prompt)"),
419
- systemPrompt: z.string().optional().describe("System prompt for the agent"),
420
- model: z.string().optional().describe('Model identifier (e.g. "claude-sonnet-4-6")'),
421
- skipPermissions: z.boolean().optional().describe("Skip permission prompts in coding agents"),
422
- driverProvider: z.string().optional().describe("AI provider instance name for the driver"),
423
- driverMode: z.enum(["api", "cli"]).optional().describe("Driver mode: api (conversational) or cli (coding)"),
424
- isSubAgent: z.boolean().optional().describe("Mark as a sub-agent (not shown in top-level lists)")
309
+ id: z.string().describe("Agent ID (UUID)")
425
310
  },
426
311
  annotations: { readOnlyHint: false, destructiveHint: false }
427
312
  },
428
- async ({ name, ...rest }) => {
429
- const result = await client.post("/api/agents", { name, ...rest });
313
+ async ({ id }) => {
314
+ const result = await client.post(`/api/agents/${id}/activate`);
430
315
  return jsonResult(result);
431
316
  }
432
317
  );
433
318
  server.registerTool(
434
- "activate-agent",
319
+ "deactivate-agent",
435
320
  {
436
- description: "Activate an agent so it starts receiving and answering messages.",
321
+ description: "Deactivate an agent \u2014 it stops receiving messages (Slack, dashboard chat) until reactivated. The definition is kept; this is the way to silence an agent without deleting it.",
437
322
  inputSchema: {
438
323
  id: z.string().describe("Agent ID (UUID)")
439
324
  },
440
325
  annotations: { readOnlyHint: false, destructiveHint: false }
441
326
  },
442
327
  async ({ id }) => {
443
- const result = await client.post(`/api/agents/${id}/activate`);
328
+ const result = await client.post(`/api/agents/${id}/deactivate`);
444
329
  return jsonResult(result);
445
330
  }
446
331
  );
332
+ if (ctx.role !== "admin") return;
447
333
  server.registerTool(
448
- "deactivate-agent",
334
+ "create-agent",
449
335
  {
450
- description: "Deactivate an agent \u2014 it stops receiving messages (Slack, dashboard chat) until reactivated. The definition is kept; this is the way to silence an agent without deleting it.",
336
+ description: "Create a new agent definition.",
451
337
  inputSchema: {
452
- id: z.string().describe("Agent ID (UUID)")
338
+ name: z.string().describe("Agent name (unique, kebab-case)"),
339
+ displayName: z.string().optional().describe("Display name shown in the UI"),
340
+ description: z.string().optional().describe("Agent description"),
341
+ identity: z.string().optional().describe('Agent identity (e.g. "senior backend developer")'),
342
+ instructions: z.string().optional().describe("Agent instructions (appended to system prompt)"),
343
+ systemPrompt: z.string().optional().describe("System prompt for the agent"),
344
+ model: z.string().optional().describe('Model identifier (e.g. "claude-sonnet-4-6")'),
345
+ skipPermissions: z.boolean().optional().describe("Skip permission prompts in coding agents"),
346
+ driverProvider: z.string().optional().describe("AI provider instance name for the driver"),
347
+ driverMode: z.enum(["api", "cli"]).optional().describe("Driver mode: api (conversational) or cli (coding)"),
348
+ isSubAgent: z.boolean().optional().describe("Mark as a sub-agent (not shown in top-level lists)")
453
349
  },
454
350
  annotations: { readOnlyHint: false, destructiveHint: false }
455
351
  },
456
- async ({ id }) => {
457
- const result = await client.post(`/api/agents/${id}/deactivate`);
352
+ async ({ name, ...rest }) => {
353
+ const result = await client.post("/api/agents", { name, ...rest });
458
354
  return jsonResult(result);
459
355
  }
460
356
  );
@@ -953,7 +849,7 @@ function registerAgentMcpTools(server, client, ctx) {
953
849
  return jsonResult({ items: page.items, total: page.total });
954
850
  }
955
851
  );
956
- if (ctx.readOnly || ctx.role !== "admin") return;
852
+ if (ctx.readOnly) return;
957
853
  server.registerTool(
958
854
  "set-agent-mcp-servers",
959
855
  {
@@ -168,13 +168,7 @@ function createSurfaceServer(opts) {
168
168
  const ctx2 = {
169
169
  role: config.role,
170
170
  readOnly: config.readOnly ?? false,
171
- agentName: config.agentName,
172
- callChain: config.callChain,
173
- turnId: config.turnId,
174
- rootTurnId: config.rootTurnId,
175
- conversationId: config.conversationId,
176
- requesterUserId: config.requesterUserId,
177
- responseTarget: config.responseTarget
171
+ agentName: config.agentName
178
172
  };
179
173
  const host = withReadOnlyFilter(server2, ctx2.readOnly);
180
174
  for (const register of opts.registrars)
@@ -184,28 +178,13 @@ function createSurfaceServer(opts) {
184
178
 
185
179
  // ../common/dist/stdio.js
186
180
  function resolveStdioContext() {
187
- let responseTarget;
188
- const rawTarget = process.env["DUDAMEL_RESPONSE_TARGET"];
189
- if (rawTarget) {
190
- try {
191
- responseTarget = JSON.parse(rawTarget);
192
- } catch {
193
- process.stderr.write("Warning: DUDAMEL_RESPONSE_TARGET is not valid JSON \u2014 ignoring.\n");
194
- }
195
- }
196
181
  return {
197
182
  apiUrl: process.env["DUDAMEL_API_URL"] ?? "http://localhost:3000",
198
183
  apiKey: process.env["DUDAMEL_API_KEY"],
199
184
  envRole: process.env["DUDAMEL_USER_ROLE"],
200
185
  // read/write access is per agent-assignment (Plan 52); the spawner injects the mode.
201
186
  readOnly: process.env["DUDAMEL_MCP_MODE"] === "readonly",
202
- agentName: process.env["DUDAMEL_AGENT_NAME"],
203
- callChain: (process.env["DUDAMEL_CALL_CHAIN"] ?? "").split(",").map((s) => s.trim()).filter(Boolean),
204
- turnId: process.env["DUDAMEL_TURN_ID"],
205
- rootTurnId: process.env["DUDAMEL_ROOT_TURN_ID"],
206
- conversationId: process.env["DUDAMEL_CONVERSATION_ID"],
207
- requesterUserId: process.env["DUDAMEL_REQUESTER_USER_ID"],
208
- responseTarget
187
+ agentName: process.env["DUDAMEL_AGENT_NAME"]
209
188
  };
210
189
  }
211
190
 
@@ -321,104 +300,6 @@ function registerAgentTools(server2, client, ctx2) {
321
300
  return jsonResult(result);
322
301
  }
323
302
  );
324
- server2.registerTool(
325
- "send-message-to-agent",
326
- {
327
- description: "Send a message to a PEER Dudamel agent and get their response. Peers are the agents listed in the Peer Agents section of your system prompt: separate agents with their own tools, memory and history, running in their own process. This is the ONLY way to reach them \u2014 your coding tool's own agent-messaging tool (e.g. SendMessage) sees only subagents spawned inside your session and cannot reach a peer. Use this to delegate tasks to or ask questions of another Dudamel agent.",
328
- inputSchema: {
329
- agentName: z.string().describe("Target agent name (as shown in the peer agents list)"),
330
- message: z.string().describe("Message to send to the target agent")
331
- },
332
- annotations: { readOnlyHint: false, destructiveHint: false }
333
- },
334
- async ({ agentName, message }) => {
335
- const result = await client.post(
336
- `/api/agents/by-name/${encodeURIComponent(agentName)}/message`,
337
- // The chain this turn arrived with, plus ourselves (Plan 43 C1). This used to send a
338
- // hardcoded `depth: 0`, which made the server's depth guard decorative: nothing ever
339
- // reported being deeper than zero, so A→B→C→D was unbounded and A→B→A unnoticed.
340
- {
341
- message,
342
- callChain: [...ctx2.callChain ?? [], ...ctx2.agentName ? [ctx2.agentName] : []],
343
- fromAgent: ctx2.agentName,
344
- // Plan 43 C3: the callee's turn records WHICH turn asked, so a multi-agent
345
- // interaction can be reconstructed as a tree instead of guessed from timestamps.
346
- parentTurnId: ctx2.turnId,
347
- rootTurnId: ctx2.rootTurnId ?? ctx2.turnId
348
- }
349
- );
350
- return jsonResult(result);
351
- }
352
- );
353
- server2.registerTool(
354
- "notify-agent",
355
- {
356
- description: "Hand control back to the conversation that launched THIS workflow run. Use it to report an outcome or to ask the user something through the agent, from a workflow step. Only works from inside a workflow execution, and only for the conversation that launched it \u2014 pass the ids from `{{ trigger.callback }}`. Nobody is blocked waiting: the message is delivered and the agent answers in its own channel.",
357
- inputSchema: {
358
- conversationId: z.string().describe("From `{{ trigger.callback.conversationId }}` \u2014 the conversation to resume"),
359
- message: z.string().describe("What to tell the agent (it will act on it, not echo it)")
360
- },
361
- annotations: { readOnlyHint: false, destructiveHint: false }
362
- },
363
- async ({ conversationId, message }) => {
364
- const executionWorkflowId = process.env["DUDAMEL_WORKFLOW_ID"];
365
- if (!executionWorkflowId) {
366
- throw new Error(
367
- "notify-agent requires a workflow execution context (DUDAMEL_WORKFLOW_ID) \u2014 it only works from a workflow step, not from an agent conversation."
368
- );
369
- }
370
- const result = await client.post("/api/agents/notify", {
371
- conversationId,
372
- executionWorkflowId,
373
- message,
374
- callChain: ctx2.callChain
375
- });
376
- return jsonResult(result);
377
- }
378
- );
379
- server2.registerTool(
380
- "ask-agent",
381
- {
382
- description: 'Ask the human a question THROUGH the agent, from a workflow step, and park this run until they answer. Pair it with a `waitForSignal` step on the same `signalName`. Unlike a fixed approval prompt, the agent turns a free-form answer ("s\xED dale, pero solo staging") into the structured payload your signal expects. Only works inside a workflow execution, and only for the conversation that launched it \u2014 pass the id from `{{ trigger.callback.conversationId }}`.',
383
- inputSchema: {
384
- conversationId: z.string().describe("From `{{ trigger.callback.conversationId }}` \u2014 where to ask"),
385
- question: z.string().describe("What to ask the human, in their language"),
386
- signalName: z.string().optional().describe("Signal your waitForSignal step listens on (default: humanApproval)")
387
- },
388
- annotations: { readOnlyHint: false, destructiveHint: false }
389
- },
390
- async ({ conversationId, question, signalName }) => {
391
- const executionWorkflowId = process.env["DUDAMEL_WORKFLOW_ID"];
392
- if (!executionWorkflowId) {
393
- throw new Error(
394
- "ask-agent requires a workflow execution context (DUDAMEL_WORKFLOW_ID) \u2014 it only works from a workflow step, not from an agent conversation."
395
- );
396
- }
397
- const result = await client.post("/api/conversation-waits", {
398
- conversationId,
399
- executionWorkflowId,
400
- question,
401
- signalName: signalName ?? "humanApproval",
402
- callChain: ctx2.callChain
403
- });
404
- return jsonResult(result);
405
- }
406
- );
407
- server2.registerTool(
408
- "answer-workflow",
409
- {
410
- description: "Unblock a workflow that is waiting on the human, with the answer turned into the payload it expects. Call it once you actually have the answer \u2014 translating what the person said into structured fields is your job here, and the reason a workflow asks through you instead of posting a fixed form.",
411
- inputSchema: {
412
- waitId: z.string().describe("The waitId the workflow gave you when it asked"),
413
- payload: z.record(z.unknown()).optional().describe('Structured answer for the signal, e.g. {"approved": true, "env": "staging"}')
414
- },
415
- annotations: { readOnlyHint: false, destructiveHint: false }
416
- },
417
- async ({ waitId, payload }) => {
418
- const result = await client.post("/api/conversation-waits/answer", { waitId, payload });
419
- return jsonResult(result);
420
- }
421
- );
422
303
  server2.registerTool(
423
304
  "update-agent",
424
305
  {
@@ -463,56 +344,56 @@ function registerAgentTools(server2, client, ctx2) {
463
344
  return jsonResult({ subAgentIds: page.items });
464
345
  }
465
346
  );
466
- if (ctx2.role !== "admin") return;
467
347
  server2.registerTool(
468
- "create-agent",
348
+ "activate-agent",
469
349
  {
470
- description: "Create a new agent definition.",
350
+ description: "Activate an agent so it starts receiving and answering messages.",
471
351
  inputSchema: {
472
- name: z.string().describe("Agent name (unique, kebab-case)"),
473
- displayName: z.string().optional().describe("Display name shown in the UI"),
474
- description: z.string().optional().describe("Agent description"),
475
- identity: z.string().optional().describe('Agent identity (e.g. "senior backend developer")'),
476
- instructions: z.string().optional().describe("Agent instructions (appended to system prompt)"),
477
- systemPrompt: z.string().optional().describe("System prompt for the agent"),
478
- model: z.string().optional().describe('Model identifier (e.g. "claude-sonnet-4-6")'),
479
- skipPermissions: z.boolean().optional().describe("Skip permission prompts in coding agents"),
480
- driverProvider: z.string().optional().describe("AI provider instance name for the driver"),
481
- driverMode: z.enum(["api", "cli"]).optional().describe("Driver mode: api (conversational) or cli (coding)"),
482
- isSubAgent: z.boolean().optional().describe("Mark as a sub-agent (not shown in top-level lists)")
352
+ id: z.string().describe("Agent ID (UUID)")
483
353
  },
484
354
  annotations: { readOnlyHint: false, destructiveHint: false }
485
355
  },
486
- async ({ name, ...rest }) => {
487
- const result = await client.post("/api/agents", { name, ...rest });
356
+ async ({ id }) => {
357
+ const result = await client.post(`/api/agents/${id}/activate`);
488
358
  return jsonResult(result);
489
359
  }
490
360
  );
491
361
  server2.registerTool(
492
- "activate-agent",
362
+ "deactivate-agent",
493
363
  {
494
- description: "Activate an agent so it starts receiving and answering messages.",
364
+ description: "Deactivate an agent \u2014 it stops receiving messages (Slack, dashboard chat) until reactivated. The definition is kept; this is the way to silence an agent without deleting it.",
495
365
  inputSchema: {
496
366
  id: z.string().describe("Agent ID (UUID)")
497
367
  },
498
368
  annotations: { readOnlyHint: false, destructiveHint: false }
499
369
  },
500
370
  async ({ id }) => {
501
- const result = await client.post(`/api/agents/${id}/activate`);
371
+ const result = await client.post(`/api/agents/${id}/deactivate`);
502
372
  return jsonResult(result);
503
373
  }
504
374
  );
375
+ if (ctx2.role !== "admin") return;
505
376
  server2.registerTool(
506
- "deactivate-agent",
377
+ "create-agent",
507
378
  {
508
- description: "Deactivate an agent \u2014 it stops receiving messages (Slack, dashboard chat) until reactivated. The definition is kept; this is the way to silence an agent without deleting it.",
379
+ description: "Create a new agent definition.",
509
380
  inputSchema: {
510
- id: z.string().describe("Agent ID (UUID)")
381
+ name: z.string().describe("Agent name (unique, kebab-case)"),
382
+ displayName: z.string().optional().describe("Display name shown in the UI"),
383
+ description: z.string().optional().describe("Agent description"),
384
+ identity: z.string().optional().describe('Agent identity (e.g. "senior backend developer")'),
385
+ instructions: z.string().optional().describe("Agent instructions (appended to system prompt)"),
386
+ systemPrompt: z.string().optional().describe("System prompt for the agent"),
387
+ model: z.string().optional().describe('Model identifier (e.g. "claude-sonnet-4-6")'),
388
+ skipPermissions: z.boolean().optional().describe("Skip permission prompts in coding agents"),
389
+ driverProvider: z.string().optional().describe("AI provider instance name for the driver"),
390
+ driverMode: z.enum(["api", "cli"]).optional().describe("Driver mode: api (conversational) or cli (coding)"),
391
+ isSubAgent: z.boolean().optional().describe("Mark as a sub-agent (not shown in top-level lists)")
511
392
  },
512
393
  annotations: { readOnlyHint: false, destructiveHint: false }
513
394
  },
514
- async ({ id }) => {
515
- const result = await client.post(`/api/agents/${id}/deactivate`);
395
+ async ({ name, ...rest }) => {
396
+ const result = await client.post("/api/agents", { name, ...rest });
516
397
  return jsonResult(result);
517
398
  }
518
399
  );
@@ -1011,7 +892,7 @@ function registerAgentMcpTools(server2, client, ctx2) {
1011
892
  return jsonResult({ items: page.items, total: page.total });
1012
893
  }
1013
894
  );
1014
- if (ctx2.readOnly || ctx2.role !== "admin") return;
895
+ if (ctx2.readOnly) return;
1015
896
  server2.registerTool(
1016
897
  "set-agent-mcp-servers",
1017
898
  {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-mcp.d.ts","sourceRoot":"","sources":["../../src/tools/agent-mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,WAAW,GACf,IAAI,CAiDN"}
1
+ {"version":3,"file":"agent-mcp.d.ts","sourceRoot":"","sources":["../../src/tools/agent-mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,WAAW,GACf,IAAI,CAoDN"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/tools/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,WAAW,GACf,IAAI,CA0ZN"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/tools/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,GAAG,EAAE,WAAW,GACf,IAAI,CAmRN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dudamel/mcp-agents",
3
- "version": "2026.923.1",
3
+ "version": "2026.928.1",
4
4
  "description": "Dudamel agents MCP — stdio client for Dudamel's agents management surface over its REST API.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "type": "module",
@@ -33,6 +33,7 @@
33
33
  "devDependencies": {
34
34
  "esbuild": "^0.25.0",
35
35
  "@dudamel/contracts": "0.1.0",
36
+ "@dudamel/mcp-tool-contract": "0.1.0",
36
37
  "@dudamel/mcp-common": "0.1.0"
37
38
  },
38
39
  "scripts": {