@artyfacts/mcp-server 1.0.4 → 1.1.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.
package/dist/index.cjs CHANGED
@@ -238,6 +238,23 @@ var ARTYFACTS_TOOLS = [
238
238
  required: ["task_id", "reason"]
239
239
  }
240
240
  },
241
+ {
242
+ name: "create_task",
243
+ description: "Create a new task under a goal. Use this to create actionable tasks \u2014 NOT create_artifact or create_section.",
244
+ inputSchema: {
245
+ type: "object",
246
+ properties: {
247
+ goal_id: { type: "string", description: "The goal UUID this task belongs to (required)" },
248
+ title: { type: "string", description: "Task title" },
249
+ description: { type: "string", description: "Task description / what needs to be done" },
250
+ priority: { type: "string", description: "Priority: low, medium, high, urgent" },
251
+ assigned_to: { type: "string", description: "Agent UUID to assign the task to" },
252
+ depends_on: { type: "array", items: { type: "string" }, description: "List of task UUIDs this task depends on" },
253
+ estimated_minutes: { type: "number", description: "Estimated time in minutes" }
254
+ },
255
+ required: ["goal_id", "title"]
256
+ }
257
+ },
241
258
  // Agent tools
242
259
  {
243
260
  name: "list_agents",
@@ -300,46 +317,50 @@ var ARTYFACTS_TOOLS = [
300
317
  required: ["agent_id"]
301
318
  }
302
319
  },
303
- // Blocker tools
320
+ // Inbox tools (human-in-the-loop)
304
321
  {
305
- name: "list_blockers",
306
- description: "List blockers (decisions, dependencies needing resolution)",
322
+ name: "create_inbox_item",
323
+ 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.",
307
324
  inputSchema: {
308
325
  type: "object",
309
326
  properties: {
310
- artifact_id: { type: "string", description: "Filter by artifact" },
311
- status: { type: "string", description: "Filter by status: open, resolved" }
327
+ task_id: { type: "string", description: "UUID of the task being blocked (required)" },
328
+ type: { type: "string", description: "Type: approval, decision, question" },
329
+ title: { type: "string", description: "Short summary shown to the human in the inbox" },
330
+ content: { type: "string", description: "Full context and details for the human" },
331
+ action: { type: "string", description: "Action to auto-execute if approved (e.g. agent.create)" },
332
+ action_payload: { type: "object", description: "Data for the action (e.g. full agent spec for agent.create)" },
333
+ options: { type: "array", description: "Options for decision type: [{id, label, description}]" }
312
334
  },
313
- required: []
335
+ required: ["task_id", "type", "title"]
314
336
  }
315
337
  },
316
338
  {
317
- name: "create_blocker",
318
- description: "Create a blocker (decision request, dependency, etc.)",
339
+ name: "list_inbox",
340
+ description: "List pending inbox items (approvals, decisions, questions) waiting for human resolution.",
319
341
  inputSchema: {
320
342
  type: "object",
321
343
  properties: {
322
- artifact_id: { type: "string", description: "Artifact ID" },
323
- kind: { type: "string", description: "Kind: decision, dependency, resource, external" },
324
- title: { type: "string", description: "Blocker title" },
325
- description: { type: "string", description: "Details" },
326
- options: { type: "array", description: "Options for decisions" },
327
- blocked_tasks: { type: "array", items: { type: "string" }, description: "Task IDs blocked by this" }
344
+ status: { type: "string", description: "Filter by status: pending (default), resolved" },
345
+ type: { type: "string", description: "Filter by type: approval, decision, question" },
346
+ limit: { type: "number", description: "Max results (default 50)" }
328
347
  },
329
- required: ["artifact_id", "kind", "title"]
348
+ required: []
330
349
  }
331
350
  },
332
351
  {
333
- name: "resolve_blocker",
334
- description: "Resolve a blocker",
352
+ name: "resolve_inbox",
353
+ description: "Resolve an inbox item from the agent side. Humans resolve via the UI \u2014 only use this for automated resolution.",
335
354
  inputSchema: {
336
355
  type: "object",
337
356
  properties: {
338
- blocker_id: { type: "string", description: "Blocker ID" },
339
- resolution: { type: "string", description: "How it was resolved" },
340
- selected_option: { type: "string", description: "Selected option (for decisions)" }
357
+ item_id: { type: "string", description: "Inbox item UUID" },
358
+ approved: { type: "boolean", description: "For approvals: true to approve, false to deny" },
359
+ chosen_option: { type: "string", description: "For decisions: the selected option ID" },
360
+ answer: { type: "string", description: "For questions: the answer text" },
361
+ notes: { type: "string", description: "Optional notes" }
341
362
  },
342
- required: ["blocker_id", "resolution"]
363
+ required: ["item_id"]
343
364
  }
344
365
  },
345
366
  // Search tools
@@ -479,6 +500,10 @@ var toolHandlers = {
479
500
  const { task_id, ...body } = args;
480
501
  return client.post(`/tasks/${task_id}/block`, body);
481
502
  },
503
+ create_task: (client, args) => {
504
+ const { goal_id, title, description, priority, assigned_to, depends_on, estimated_minutes } = args;
505
+ return client.post("/tasks", { goal_id, title, description, priority, assigned_to, depends_on, estimated_minutes });
506
+ },
482
507
  // Agents
483
508
  list_agents: (client, args) => {
484
509
  const params = new URLSearchParams();
@@ -505,20 +530,21 @@ var toolHandlers = {
505
530
  const { agent_id, ...body } = args;
506
531
  return client.patch(`/agents/${agent_id}`, body);
507
532
  },
508
- // Blockers
509
- list_blockers: (client, args) => {
533
+ // Inbox (human-in-the-loop)
534
+ create_inbox_item: (client, args) => {
535
+ const { task_id, type, title, content, action, action_payload, options } = args;
536
+ return client.post("/inbox", { task_id, type, title, content, action, action_payload, options });
537
+ },
538
+ list_inbox: (client, args) => {
510
539
  const params = new URLSearchParams();
511
- if (args.artifact_id) params.set("artifact_id", String(args.artifact_id));
512
540
  if (args.status) params.set("status", String(args.status));
513
- return client.get(`/blockers?${params}`);
514
- },
515
- create_blocker: (client, args) => {
516
- const { artifact_id, ...body } = args;
517
- return client.post(`/artifacts/${artifact_id}/blockers`, body);
541
+ if (args.type) params.set("type", String(args.type));
542
+ if (args.limit) params.set("limit", String(args.limit));
543
+ return client.get(`/inbox?${params}`);
518
544
  },
519
- resolve_blocker: (client, args) => {
520
- const { blocker_id, ...body } = args;
521
- return client.post(`/blockers/${blocker_id}/resolve`, body);
545
+ resolve_inbox: (client, args) => {
546
+ const { item_id, ...body } = args;
547
+ return client.post(`/inbox/${item_id}/resolve`, body);
522
548
  },
523
549
  // Search
524
550
  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-MO7NJ56L.js";
5
+ } from "./chunk-XLUIPOCO.js";
6
6
  export {
7
7
  ArtyfactsMcpServer,
8
8
  createMcpServer,
package/dist/server.cjs CHANGED
@@ -236,6 +236,23 @@ var ARTYFACTS_TOOLS = [
236
236
  required: ["task_id", "reason"]
237
237
  }
238
238
  },
239
+ {
240
+ name: "create_task",
241
+ description: "Create a new task under a goal. Use this to create actionable tasks \u2014 NOT create_artifact or create_section.",
242
+ inputSchema: {
243
+ type: "object",
244
+ properties: {
245
+ goal_id: { type: "string", description: "The goal UUID this task belongs to (required)" },
246
+ title: { type: "string", description: "Task title" },
247
+ description: { type: "string", description: "Task description / what needs to be done" },
248
+ priority: { type: "string", description: "Priority: low, medium, high, urgent" },
249
+ assigned_to: { type: "string", description: "Agent UUID to assign the task to" },
250
+ depends_on: { type: "array", items: { type: "string" }, description: "List of task UUIDs this task depends on" },
251
+ estimated_minutes: { type: "number", description: "Estimated time in minutes" }
252
+ },
253
+ required: ["goal_id", "title"]
254
+ }
255
+ },
239
256
  // Agent tools
240
257
  {
241
258
  name: "list_agents",
@@ -298,46 +315,50 @@ var ARTYFACTS_TOOLS = [
298
315
  required: ["agent_id"]
299
316
  }
300
317
  },
301
- // Blocker tools
318
+ // Inbox tools (human-in-the-loop)
302
319
  {
303
- name: "list_blockers",
304
- description: "List blockers (decisions, dependencies needing resolution)",
320
+ name: "create_inbox_item",
321
+ 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.",
305
322
  inputSchema: {
306
323
  type: "object",
307
324
  properties: {
308
- artifact_id: { type: "string", description: "Filter by artifact" },
309
- status: { type: "string", description: "Filter by status: open, resolved" }
325
+ task_id: { type: "string", description: "UUID of the task being blocked (required)" },
326
+ type: { type: "string", description: "Type: approval, decision, question" },
327
+ title: { type: "string", description: "Short summary shown to the human in the inbox" },
328
+ content: { type: "string", description: "Full context and details for the human" },
329
+ action: { type: "string", description: "Action to auto-execute if approved (e.g. agent.create)" },
330
+ action_payload: { type: "object", description: "Data for the action (e.g. full agent spec for agent.create)" },
331
+ options: { type: "array", description: "Options for decision type: [{id, label, description}]" }
310
332
  },
311
- required: []
333
+ required: ["task_id", "type", "title"]
312
334
  }
313
335
  },
314
336
  {
315
- name: "create_blocker",
316
- description: "Create a blocker (decision request, dependency, etc.)",
337
+ name: "list_inbox",
338
+ description: "List pending inbox items (approvals, decisions, questions) waiting for human resolution.",
317
339
  inputSchema: {
318
340
  type: "object",
319
341
  properties: {
320
- artifact_id: { type: "string", description: "Artifact ID" },
321
- kind: { type: "string", description: "Kind: decision, dependency, resource, external" },
322
- title: { type: "string", description: "Blocker title" },
323
- description: { type: "string", description: "Details" },
324
- options: { type: "array", description: "Options for decisions" },
325
- blocked_tasks: { type: "array", items: { type: "string" }, description: "Task IDs blocked by this" }
342
+ status: { type: "string", description: "Filter by status: pending (default), resolved" },
343
+ type: { type: "string", description: "Filter by type: approval, decision, question" },
344
+ limit: { type: "number", description: "Max results (default 50)" }
326
345
  },
327
- required: ["artifact_id", "kind", "title"]
346
+ required: []
328
347
  }
329
348
  },
330
349
  {
331
- name: "resolve_blocker",
332
- description: "Resolve a blocker",
350
+ name: "resolve_inbox",
351
+ description: "Resolve an inbox item from the agent side. Humans resolve via the UI \u2014 only use this for automated resolution.",
333
352
  inputSchema: {
334
353
  type: "object",
335
354
  properties: {
336
- blocker_id: { type: "string", description: "Blocker ID" },
337
- resolution: { type: "string", description: "How it was resolved" },
338
- selected_option: { type: "string", description: "Selected option (for decisions)" }
355
+ item_id: { type: "string", description: "Inbox item UUID" },
356
+ approved: { type: "boolean", description: "For approvals: true to approve, false to deny" },
357
+ chosen_option: { type: "string", description: "For decisions: the selected option ID" },
358
+ answer: { type: "string", description: "For questions: the answer text" },
359
+ notes: { type: "string", description: "Optional notes" }
339
360
  },
340
- required: ["blocker_id", "resolution"]
361
+ required: ["item_id"]
341
362
  }
342
363
  },
343
364
  // Search tools
@@ -477,6 +498,10 @@ var toolHandlers = {
477
498
  const { task_id, ...body } = args;
478
499
  return client.post(`/tasks/${task_id}/block`, body);
479
500
  },
501
+ create_task: (client, args) => {
502
+ const { goal_id, title, description, priority, assigned_to, depends_on, estimated_minutes } = args;
503
+ return client.post("/tasks", { goal_id, title, description, priority, assigned_to, depends_on, estimated_minutes });
504
+ },
480
505
  // Agents
481
506
  list_agents: (client, args) => {
482
507
  const params = new URLSearchParams();
@@ -503,20 +528,21 @@ var toolHandlers = {
503
528
  const { agent_id, ...body } = args;
504
529
  return client.patch(`/agents/${agent_id}`, body);
505
530
  },
506
- // Blockers
507
- list_blockers: (client, args) => {
531
+ // Inbox (human-in-the-loop)
532
+ create_inbox_item: (client, args) => {
533
+ const { task_id, type, title, content, action, action_payload, options } = args;
534
+ return client.post("/inbox", { task_id, type, title, content, action, action_payload, options });
535
+ },
536
+ list_inbox: (client, args) => {
508
537
  const params = new URLSearchParams();
509
- if (args.artifact_id) params.set("artifact_id", String(args.artifact_id));
510
538
  if (args.status) params.set("status", String(args.status));
511
- return client.get(`/blockers?${params}`);
512
- },
513
- create_blocker: (client, args) => {
514
- const { artifact_id, ...body } = args;
515
- return client.post(`/artifacts/${artifact_id}/blockers`, body);
539
+ if (args.type) params.set("type", String(args.type));
540
+ if (args.limit) params.set("limit", String(args.limit));
541
+ return client.get(`/inbox?${params}`);
516
542
  },
517
- resolve_blocker: (client, args) => {
518
- const { blocker_id, ...body } = args;
519
- return client.post(`/blockers/${blocker_id}/resolve`, body);
543
+ resolve_inbox: (client, args) => {
544
+ const { item_id, ...body } = args;
545
+ return client.post(`/inbox/${item_id}/resolve`, body);
520
546
  },
521
547
  // Search
522
548
  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-MO7NJ56L.js";
5
+ } from "./chunk-XLUIPOCO.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.4",
3
+ "version": "1.1.0",
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
@@ -244,7 +244,24 @@ const ARTYFACTS_TOOLS: Tool[] = [
244
244
  required: ['task_id', 'reason'],
245
245
  },
246
246
  },
247
-
247
+ {
248
+ name: 'create_task',
249
+ description: 'Create a new task under a goal. Use this to create actionable tasks — NOT create_artifact or create_section.',
250
+ inputSchema: {
251
+ type: 'object',
252
+ properties: {
253
+ goal_id: { type: 'string', description: 'The goal UUID this task belongs to (required)' },
254
+ title: { type: 'string', description: 'Task title' },
255
+ description: { type: 'string', description: 'Task description / what needs to be done' },
256
+ priority: { type: 'string', description: 'Priority: low, medium, high, urgent' },
257
+ assigned_to: { type: 'string', description: 'Agent UUID to assign the task to' },
258
+ depends_on: { type: 'array', items: { type: 'string' }, description: 'List of task UUIDs this task depends on' },
259
+ estimated_minutes: { type: 'number', description: 'Estimated time in minutes' },
260
+ },
261
+ required: ['goal_id', 'title'],
262
+ },
263
+ },
264
+
248
265
  // Agent tools
249
266
  {
250
267
  name: 'list_agents',
@@ -308,46 +325,50 @@ const ARTYFACTS_TOOLS: Tool[] = [
308
325
  },
309
326
  },
310
327
 
311
- // Blocker tools
328
+ // Inbox tools (human-in-the-loop)
312
329
  {
313
- name: 'list_blockers',
314
- description: 'List blockers (decisions, dependencies needing resolution)',
330
+ name: 'create_inbox_item',
331
+ 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.',
315
332
  inputSchema: {
316
333
  type: 'object',
317
334
  properties: {
318
- artifact_id: { type: 'string', description: 'Filter by artifact' },
319
- status: { type: 'string', description: 'Filter by status: open, resolved' },
335
+ task_id: { type: 'string', description: 'UUID of the task being blocked (required)' },
336
+ type: { type: 'string', description: 'Type: approval, decision, question' },
337
+ title: { type: 'string', description: 'Short summary shown to the human in the inbox' },
338
+ content: { type: 'string', description: 'Full context and details for the human' },
339
+ action: { type: 'string', description: 'Action to auto-execute if approved (e.g. agent.create)' },
340
+ action_payload: { type: 'object', description: 'Data for the action (e.g. full agent spec for agent.create)' },
341
+ options: { type: 'array', description: 'Options for decision type: [{id, label, description}]' },
320
342
  },
321
- required: [],
343
+ required: ['task_id', 'type', 'title'],
322
344
  },
323
345
  },
324
346
  {
325
- name: 'create_blocker',
326
- description: 'Create a blocker (decision request, dependency, etc.)',
347
+ name: 'list_inbox',
348
+ description: 'List pending inbox items (approvals, decisions, questions) waiting for human resolution.',
327
349
  inputSchema: {
328
350
  type: 'object',
329
351
  properties: {
330
- artifact_id: { type: 'string', description: 'Artifact ID' },
331
- kind: { type: 'string', description: 'Kind: decision, dependency, resource, external' },
332
- title: { type: 'string', description: 'Blocker title' },
333
- description: { type: 'string', description: 'Details' },
334
- options: { type: 'array', description: 'Options for decisions' },
335
- blocked_tasks: { type: 'array', items: { type: 'string' }, description: 'Task IDs blocked by this' },
352
+ status: { type: 'string', description: 'Filter by status: pending (default), resolved' },
353
+ type: { type: 'string', description: 'Filter by type: approval, decision, question' },
354
+ limit: { type: 'number', description: 'Max results (default 50)' },
336
355
  },
337
- required: ['artifact_id', 'kind', 'title'],
356
+ required: [],
338
357
  },
339
358
  },
340
359
  {
341
- name: 'resolve_blocker',
342
- description: 'Resolve a blocker',
360
+ name: 'resolve_inbox',
361
+ description: 'Resolve an inbox item from the agent side. Humans resolve via the UI — only use this for automated resolution.',
343
362
  inputSchema: {
344
363
  type: 'object',
345
364
  properties: {
346
- blocker_id: { type: 'string', description: 'Blocker ID' },
347
- resolution: { type: 'string', description: 'How it was resolved' },
348
- selected_option: { type: 'string', description: 'Selected option (for decisions)' },
365
+ item_id: { type: 'string', description: 'Inbox item UUID' },
366
+ approved: { type: 'boolean', description: 'For approvals: true to approve, false to deny' },
367
+ chosen_option: { type: 'string', description: 'For decisions: the selected option ID' },
368
+ answer: { type: 'string', description: 'For questions: the answer text' },
369
+ notes: { type: 'string', description: 'Optional notes' },
349
370
  },
350
- required: ['blocker_id', 'resolution'],
371
+ required: ['item_id'],
351
372
  },
352
373
  },
353
374
 
@@ -504,7 +525,11 @@ const toolHandlers: Record<string, ToolHandler> = {
504
525
  const { task_id, ...body } = args;
505
526
  return client.post(`/tasks/${task_id}/block`, body);
506
527
  },
507
-
528
+ create_task: (client, args) => {
529
+ const { goal_id, title, description, priority, assigned_to, depends_on, estimated_minutes } = args;
530
+ return client.post('/tasks', { goal_id, title, description, priority, assigned_to, depends_on, estimated_minutes });
531
+ },
532
+
508
533
  // Agents
509
534
  list_agents: (client, args) => {
510
535
  const params = new URLSearchParams();
@@ -533,20 +558,21 @@ const toolHandlers: Record<string, ToolHandler> = {
533
558
  return client.patch(`/agents/${agent_id}`, body);
534
559
  },
535
560
 
536
- // Blockers
537
- list_blockers: (client, args) => {
561
+ // Inbox (human-in-the-loop)
562
+ create_inbox_item: (client, args) => {
563
+ const { task_id, type, title, content, action, action_payload, options } = args;
564
+ return client.post('/inbox', { task_id, type, title, content, action, action_payload, options });
565
+ },
566
+ list_inbox: (client, args) => {
538
567
  const params = new URLSearchParams();
539
- if (args.artifact_id) params.set('artifact_id', String(args.artifact_id));
540
568
  if (args.status) params.set('status', String(args.status));
541
- return client.get(`/blockers?${params}`);
542
- },
543
- create_blocker: (client, args) => {
544
- const { artifact_id, ...body } = args;
545
- return client.post(`/artifacts/${artifact_id}/blockers`, body);
569
+ if (args.type) params.set('type', String(args.type));
570
+ if (args.limit) params.set('limit', String(args.limit));
571
+ return client.get(`/inbox?${params}`);
546
572
  },
547
- resolve_blocker: (client, args) => {
548
- const { blocker_id, ...body } = args;
549
- return client.post(`/blockers/${blocker_id}/resolve`, body);
573
+ resolve_inbox: (client, args) => {
574
+ const { item_id, ...body } = args;
575
+ return client.post(`/inbox/${item_id}/resolve`, body);
550
576
  },
551
577
 
552
578
  // Search