@artyfacts/mcp-server 1.0.5 → 1.1.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.cjs CHANGED
@@ -219,8 +219,9 @@ var ARTYFACTS_TOOLS = [
219
219
  type: "object",
220
220
  properties: {
221
221
  task_id: { type: "string", description: "Task ID" },
222
+ output_text: { type: "string", description: "Completion summary / what was done" },
222
223
  output_url: { type: "string", description: "URL to deliverable (PR, doc, etc.)" },
223
- summary: { type: "string", description: "Completion summary" }
224
+ output_artifact_id: { type: "string", description: "UUID of artifact produced by this task" }
224
225
  },
225
226
  required: ["task_id"]
226
227
  }
@@ -317,46 +318,50 @@ var ARTYFACTS_TOOLS = [
317
318
  required: ["agent_id"]
318
319
  }
319
320
  },
320
- // Blocker tools
321
+ // Inbox tools (human-in-the-loop)
321
322
  {
322
- name: "list_blockers",
323
- description: "List blockers (decisions, dependencies needing resolution)",
323
+ name: "create_inbox_item",
324
+ description: "Request human approval, a decision, or an answer before proceeding. Automatically blocks the task. Use for agent creation, risky actions, or anything requiring human sign-off.",
324
325
  inputSchema: {
325
326
  type: "object",
326
327
  properties: {
327
- artifact_id: { type: "string", description: "Filter by artifact" },
328
- status: { type: "string", description: "Filter by status: open, resolved" }
328
+ task_id: { type: "string", description: "UUID of the task being blocked (required)" },
329
+ type: { type: "string", description: "Type: approval, decision, question" },
330
+ title: { type: "string", description: "Short summary shown to the human in the inbox" },
331
+ content: { type: "string", description: "Full context and details for the human" },
332
+ action: { type: "string", description: "Action to auto-execute if approved (e.g. agent.create)" },
333
+ action_payload: { type: "object", description: "Data for the action (e.g. full agent spec for agent.create)" },
334
+ options: { type: "array", description: "Options for decision type: [{id, label, description}]" }
329
335
  },
330
- required: []
336
+ required: ["task_id", "type", "title"]
331
337
  }
332
338
  },
333
339
  {
334
- name: "create_blocker",
335
- description: "Create a blocker (decision request, dependency, etc.)",
340
+ name: "list_inbox",
341
+ description: "List pending inbox items (approvals, decisions, questions) waiting for human resolution.",
336
342
  inputSchema: {
337
343
  type: "object",
338
344
  properties: {
339
- artifact_id: { type: "string", description: "Artifact ID" },
340
- kind: { type: "string", description: "Kind: decision, dependency, resource, external" },
341
- title: { type: "string", description: "Blocker title" },
342
- description: { type: "string", description: "Details" },
343
- options: { type: "array", description: "Options for decisions" },
344
- blocked_tasks: { type: "array", items: { type: "string" }, description: "Task IDs blocked by this" }
345
+ status: { type: "string", description: "Filter by status: pending (default), resolved" },
346
+ type: { type: "string", description: "Filter by type: approval, decision, question" },
347
+ limit: { type: "number", description: "Max results (default 50)" }
345
348
  },
346
- required: ["artifact_id", "kind", "title"]
349
+ required: []
347
350
  }
348
351
  },
349
352
  {
350
- name: "resolve_blocker",
351
- description: "Resolve a blocker",
353
+ name: "resolve_inbox",
354
+ description: "Resolve an inbox item from the agent side. Humans resolve via the UI \u2014 only use this for automated resolution.",
352
355
  inputSchema: {
353
356
  type: "object",
354
357
  properties: {
355
- blocker_id: { type: "string", description: "Blocker ID" },
356
- resolution: { type: "string", description: "How it was resolved" },
357
- selected_option: { type: "string", description: "Selected option (for decisions)" }
358
+ item_id: { type: "string", description: "Inbox item UUID" },
359
+ approved: { type: "boolean", description: "For approvals: true to approve, false to deny" },
360
+ chosen_option: { type: "string", description: "For decisions: the selected option ID" },
361
+ answer: { type: "string", description: "For questions: the answer text" },
362
+ notes: { type: "string", description: "Optional notes" }
358
363
  },
359
- required: ["blocker_id", "resolution"]
364
+ required: ["item_id"]
360
365
  }
361
366
  },
362
367
  // Search tools
@@ -526,20 +531,21 @@ var toolHandlers = {
526
531
  const { agent_id, ...body } = args;
527
532
  return client.patch(`/agents/${agent_id}`, body);
528
533
  },
529
- // Blockers
530
- list_blockers: (client, args) => {
534
+ // Inbox (human-in-the-loop)
535
+ create_inbox_item: (client, args) => {
536
+ const { task_id, type, title, content, action, action_payload, options } = args;
537
+ return client.post("/inbox", { task_id, type, title, content, action, action_payload, options });
538
+ },
539
+ list_inbox: (client, args) => {
531
540
  const params = new URLSearchParams();
532
- if (args.artifact_id) params.set("artifact_id", String(args.artifact_id));
533
541
  if (args.status) params.set("status", String(args.status));
534
- return client.get(`/blockers?${params}`);
535
- },
536
- create_blocker: (client, args) => {
537
- const { artifact_id, ...body } = args;
538
- return client.post(`/artifacts/${artifact_id}/blockers`, body);
542
+ if (args.type) params.set("type", String(args.type));
543
+ if (args.limit) params.set("limit", String(args.limit));
544
+ return client.get(`/inbox?${params}`);
539
545
  },
540
- resolve_blocker: (client, args) => {
541
- const { blocker_id, ...body } = args;
542
- return client.post(`/blockers/${blocker_id}/resolve`, body);
546
+ resolve_inbox: (client, args) => {
547
+ const { item_id, ...body } = args;
548
+ return client.post(`/inbox/${item_id}/resolve`, body);
543
549
  },
544
550
  // Search
545
551
  search_artifacts: (client, args) => {
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  ArtyfactsMcpServer,
3
3
  createMcpServer,
4
4
  startServer
5
- } from "./chunk-NUVCJMET.js";
5
+ } from "./chunk-XJM3QWEZ.js";
6
6
  export {
7
7
  ArtyfactsMcpServer,
8
8
  createMcpServer,
package/dist/server.cjs CHANGED
@@ -217,8 +217,9 @@ var ARTYFACTS_TOOLS = [
217
217
  type: "object",
218
218
  properties: {
219
219
  task_id: { type: "string", description: "Task ID" },
220
+ output_text: { type: "string", description: "Completion summary / what was done" },
220
221
  output_url: { type: "string", description: "URL to deliverable (PR, doc, etc.)" },
221
- summary: { type: "string", description: "Completion summary" }
222
+ output_artifact_id: { type: "string", description: "UUID of artifact produced by this task" }
222
223
  },
223
224
  required: ["task_id"]
224
225
  }
@@ -315,46 +316,50 @@ var ARTYFACTS_TOOLS = [
315
316
  required: ["agent_id"]
316
317
  }
317
318
  },
318
- // Blocker tools
319
+ // Inbox tools (human-in-the-loop)
319
320
  {
320
- name: "list_blockers",
321
- description: "List blockers (decisions, dependencies needing resolution)",
321
+ name: "create_inbox_item",
322
+ description: "Request human approval, a decision, or an answer before proceeding. Automatically blocks the task. Use for agent creation, risky actions, or anything requiring human sign-off.",
322
323
  inputSchema: {
323
324
  type: "object",
324
325
  properties: {
325
- artifact_id: { type: "string", description: "Filter by artifact" },
326
- status: { type: "string", description: "Filter by status: open, resolved" }
326
+ task_id: { type: "string", description: "UUID of the task being blocked (required)" },
327
+ type: { type: "string", description: "Type: approval, decision, question" },
328
+ title: { type: "string", description: "Short summary shown to the human in the inbox" },
329
+ content: { type: "string", description: "Full context and details for the human" },
330
+ action: { type: "string", description: "Action to auto-execute if approved (e.g. agent.create)" },
331
+ action_payload: { type: "object", description: "Data for the action (e.g. full agent spec for agent.create)" },
332
+ options: { type: "array", description: "Options for decision type: [{id, label, description}]" }
327
333
  },
328
- required: []
334
+ required: ["task_id", "type", "title"]
329
335
  }
330
336
  },
331
337
  {
332
- name: "create_blocker",
333
- description: "Create a blocker (decision request, dependency, etc.)",
338
+ name: "list_inbox",
339
+ description: "List pending inbox items (approvals, decisions, questions) waiting for human resolution.",
334
340
  inputSchema: {
335
341
  type: "object",
336
342
  properties: {
337
- artifact_id: { type: "string", description: "Artifact ID" },
338
- kind: { type: "string", description: "Kind: decision, dependency, resource, external" },
339
- title: { type: "string", description: "Blocker title" },
340
- description: { type: "string", description: "Details" },
341
- options: { type: "array", description: "Options for decisions" },
342
- blocked_tasks: { type: "array", items: { type: "string" }, description: "Task IDs blocked by this" }
343
+ status: { type: "string", description: "Filter by status: pending (default), resolved" },
344
+ type: { type: "string", description: "Filter by type: approval, decision, question" },
345
+ limit: { type: "number", description: "Max results (default 50)" }
343
346
  },
344
- required: ["artifact_id", "kind", "title"]
347
+ required: []
345
348
  }
346
349
  },
347
350
  {
348
- name: "resolve_blocker",
349
- description: "Resolve a blocker",
351
+ name: "resolve_inbox",
352
+ description: "Resolve an inbox item from the agent side. Humans resolve via the UI \u2014 only use this for automated resolution.",
350
353
  inputSchema: {
351
354
  type: "object",
352
355
  properties: {
353
- blocker_id: { type: "string", description: "Blocker ID" },
354
- resolution: { type: "string", description: "How it was resolved" },
355
- selected_option: { type: "string", description: "Selected option (for decisions)" }
356
+ item_id: { type: "string", description: "Inbox item UUID" },
357
+ approved: { type: "boolean", description: "For approvals: true to approve, false to deny" },
358
+ chosen_option: { type: "string", description: "For decisions: the selected option ID" },
359
+ answer: { type: "string", description: "For questions: the answer text" },
360
+ notes: { type: "string", description: "Optional notes" }
356
361
  },
357
- required: ["blocker_id", "resolution"]
362
+ required: ["item_id"]
358
363
  }
359
364
  },
360
365
  // Search tools
@@ -524,20 +529,21 @@ var toolHandlers = {
524
529
  const { agent_id, ...body } = args;
525
530
  return client.patch(`/agents/${agent_id}`, body);
526
531
  },
527
- // Blockers
528
- list_blockers: (client, args) => {
532
+ // Inbox (human-in-the-loop)
533
+ create_inbox_item: (client, args) => {
534
+ const { task_id, type, title, content, action, action_payload, options } = args;
535
+ return client.post("/inbox", { task_id, type, title, content, action, action_payload, options });
536
+ },
537
+ list_inbox: (client, args) => {
529
538
  const params = new URLSearchParams();
530
- if (args.artifact_id) params.set("artifact_id", String(args.artifact_id));
531
539
  if (args.status) params.set("status", String(args.status));
532
- return client.get(`/blockers?${params}`);
533
- },
534
- create_blocker: (client, args) => {
535
- const { artifact_id, ...body } = args;
536
- return client.post(`/artifacts/${artifact_id}/blockers`, body);
540
+ if (args.type) params.set("type", String(args.type));
541
+ if (args.limit) params.set("limit", String(args.limit));
542
+ return client.get(`/inbox?${params}`);
537
543
  },
538
- resolve_blocker: (client, args) => {
539
- const { blocker_id, ...body } = args;
540
- return client.post(`/blockers/${blocker_id}/resolve`, body);
544
+ resolve_inbox: (client, args) => {
545
+ const { item_id, ...body } = args;
546
+ return client.post(`/inbox/${item_id}/resolve`, body);
541
547
  },
542
548
  // Search
543
549
  search_artifacts: (client, args) => {
package/dist/server.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  ArtyfactsMcpServer,
3
3
  createMcpServer,
4
4
  startServer
5
- } from "./chunk-NUVCJMET.js";
5
+ } from "./chunk-XJM3QWEZ.js";
6
6
  export {
7
7
  ArtyfactsMcpServer,
8
8
  createMcpServer,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@artyfacts/mcp-server",
3
- "version": "1.0.5",
3
+ "version": "1.1.1",
4
4
  "description": "MCP server exposing Artyfacts tools for Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/server.ts CHANGED
@@ -225,8 +225,9 @@ const ARTYFACTS_TOOLS: Tool[] = [
225
225
  type: 'object',
226
226
  properties: {
227
227
  task_id: { type: 'string', description: 'Task ID' },
228
+ output_text: { type: 'string', description: 'Completion summary / what was done' },
228
229
  output_url: { type: 'string', description: 'URL to deliverable (PR, doc, etc.)' },
229
- summary: { type: 'string', description: 'Completion summary' },
230
+ output_artifact_id: { type: 'string', description: 'UUID of artifact produced by this task' },
230
231
  },
231
232
  required: ['task_id'],
232
233
  },
@@ -325,46 +326,50 @@ const ARTYFACTS_TOOLS: Tool[] = [
325
326
  },
326
327
  },
327
328
 
328
- // Blocker tools
329
+ // Inbox tools (human-in-the-loop)
329
330
  {
330
- name: 'list_blockers',
331
- description: 'List blockers (decisions, dependencies needing resolution)',
331
+ name: 'create_inbox_item',
332
+ description: 'Request human approval, a decision, or an answer before proceeding. Automatically blocks the task. Use for agent creation, risky actions, or anything requiring human sign-off.',
332
333
  inputSchema: {
333
334
  type: 'object',
334
335
  properties: {
335
- artifact_id: { type: 'string', description: 'Filter by artifact' },
336
- status: { type: 'string', description: 'Filter by status: open, resolved' },
336
+ task_id: { type: 'string', description: 'UUID of the task being blocked (required)' },
337
+ type: { type: 'string', description: 'Type: approval, decision, question' },
338
+ title: { type: 'string', description: 'Short summary shown to the human in the inbox' },
339
+ content: { type: 'string', description: 'Full context and details for the human' },
340
+ action: { type: 'string', description: 'Action to auto-execute if approved (e.g. agent.create)' },
341
+ action_payload: { type: 'object', description: 'Data for the action (e.g. full agent spec for agent.create)' },
342
+ options: { type: 'array', description: 'Options for decision type: [{id, label, description}]' },
337
343
  },
338
- required: [],
344
+ required: ['task_id', 'type', 'title'],
339
345
  },
340
346
  },
341
347
  {
342
- name: 'create_blocker',
343
- description: 'Create a blocker (decision request, dependency, etc.)',
348
+ name: 'list_inbox',
349
+ description: 'List pending inbox items (approvals, decisions, questions) waiting for human resolution.',
344
350
  inputSchema: {
345
351
  type: 'object',
346
352
  properties: {
347
- artifact_id: { type: 'string', description: 'Artifact ID' },
348
- kind: { type: 'string', description: 'Kind: decision, dependency, resource, external' },
349
- title: { type: 'string', description: 'Blocker title' },
350
- description: { type: 'string', description: 'Details' },
351
- options: { type: 'array', description: 'Options for decisions' },
352
- blocked_tasks: { type: 'array', items: { type: 'string' }, description: 'Task IDs blocked by this' },
353
+ status: { type: 'string', description: 'Filter by status: pending (default), resolved' },
354
+ type: { type: 'string', description: 'Filter by type: approval, decision, question' },
355
+ limit: { type: 'number', description: 'Max results (default 50)' },
353
356
  },
354
- required: ['artifact_id', 'kind', 'title'],
357
+ required: [],
355
358
  },
356
359
  },
357
360
  {
358
- name: 'resolve_blocker',
359
- description: 'Resolve a blocker',
361
+ name: 'resolve_inbox',
362
+ description: 'Resolve an inbox item from the agent side. Humans resolve via the UI — only use this for automated resolution.',
360
363
  inputSchema: {
361
364
  type: 'object',
362
365
  properties: {
363
- blocker_id: { type: 'string', description: 'Blocker ID' },
364
- resolution: { type: 'string', description: 'How it was resolved' },
365
- selected_option: { type: 'string', description: 'Selected option (for decisions)' },
366
+ item_id: { type: 'string', description: 'Inbox item UUID' },
367
+ approved: { type: 'boolean', description: 'For approvals: true to approve, false to deny' },
368
+ chosen_option: { type: 'string', description: 'For decisions: the selected option ID' },
369
+ answer: { type: 'string', description: 'For questions: the answer text' },
370
+ notes: { type: 'string', description: 'Optional notes' },
366
371
  },
367
- required: ['blocker_id', 'resolution'],
372
+ required: ['item_id'],
368
373
  },
369
374
  },
370
375
 
@@ -554,20 +559,21 @@ const toolHandlers: Record<string, ToolHandler> = {
554
559
  return client.patch(`/agents/${agent_id}`, body);
555
560
  },
556
561
 
557
- // Blockers
558
- list_blockers: (client, args) => {
562
+ // Inbox (human-in-the-loop)
563
+ create_inbox_item: (client, args) => {
564
+ const { task_id, type, title, content, action, action_payload, options } = args;
565
+ return client.post('/inbox', { task_id, type, title, content, action, action_payload, options });
566
+ },
567
+ list_inbox: (client, args) => {
559
568
  const params = new URLSearchParams();
560
- if (args.artifact_id) params.set('artifact_id', String(args.artifact_id));
561
569
  if (args.status) params.set('status', String(args.status));
562
- return client.get(`/blockers?${params}`);
563
- },
564
- create_blocker: (client, args) => {
565
- const { artifact_id, ...body } = args;
566
- return client.post(`/artifacts/${artifact_id}/blockers`, body);
570
+ if (args.type) params.set('type', String(args.type));
571
+ if (args.limit) params.set('limit', String(args.limit));
572
+ return client.get(`/inbox?${params}`);
567
573
  },
568
- resolve_blocker: (client, args) => {
569
- const { blocker_id, ...body } = args;
570
- return client.post(`/blockers/${blocker_id}/resolve`, body);
574
+ resolve_inbox: (client, args) => {
575
+ const { item_id, ...body } = args;
576
+ return client.post(`/inbox/${item_id}/resolve`, body);
571
577
  },
572
578
 
573
579
  // Search