@live-context/mcp 0.9.0 → 0.10.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 +214 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -91,7 +91,7 @@ async function callMcpApi(tool, args, method = 'POST') {
|
|
|
91
91
|
// ---------------------------------------------------------------------------
|
|
92
92
|
const server = new McpServer({
|
|
93
93
|
name: 'live-context-mcp',
|
|
94
|
-
version: '0.
|
|
94
|
+
version: '0.10.1', // 0.10.1 adds assign_ticket clear_executor/clear_reviewer + read-modify-write merge. 0.10.0 adds Projects MLP v2 tools: reads (list_projects/workstreams/tickets/milestones/agents, search_*, get_*), ticket management (update_ticket, set_ticket_milestone, dependencies, move/unlink/reorder, update_ticket_comment), scaffold (create/update workstream, create/complete milestone, create/update agent, create_project)
|
|
95
95
|
});
|
|
96
96
|
server.registerTool('get_context', {
|
|
97
97
|
description: 'Retrieve relevant context entries. Returns L0 summaries (title, type, snippet) by default. Pass drawer_id to get full page body.',
|
|
@@ -383,7 +383,7 @@ server.registerTool('claim_review', {
|
|
|
383
383
|
},
|
|
384
384
|
}, (args) => callMcpApi('claim-review', args));
|
|
385
385
|
server.registerTool('assign_ticket', {
|
|
386
|
-
description: 'Set or change a ticket\'s executor and/or reviewer. Each side is an actor (kind + id) — kind is "member" (a user id) or "agent" (an agent id). Pass only the side(s) you want to change. The executor and reviewer must differ; assigning the same actor to both is rejected with executor_equals_reviewer.',
|
|
386
|
+
description: 'Set or change a ticket\'s executor and/or reviewer. Each side is an actor (kind + id) — kind is "member" (a user id) or "agent" (an agent id). Pass only the side(s) you want to change; the other side is preserved. To unassign a side, set clear_executor / clear_reviewer. The executor and reviewer must differ; assigning the same actor to both is rejected with executor_equals_reviewer.',
|
|
387
387
|
inputSchema: {
|
|
388
388
|
ticket_id: z.string().describe('Ticket to (re)assign.'),
|
|
389
389
|
executor_kind: z
|
|
@@ -396,6 +396,14 @@ server.registerTool('assign_ticket', {
|
|
|
396
396
|
.optional()
|
|
397
397
|
.describe('Reviewer actor kind. Provide together with reviewer_id.'),
|
|
398
398
|
reviewer_id: z.string().optional().describe('Reviewer actor id (user id or agent id).'),
|
|
399
|
+
clear_executor: z
|
|
400
|
+
.boolean()
|
|
401
|
+
.optional()
|
|
402
|
+
.describe('Unassign the executor. Do not combine with executor_kind/_id.'),
|
|
403
|
+
clear_reviewer: z
|
|
404
|
+
.boolean()
|
|
405
|
+
.optional()
|
|
406
|
+
.describe('Unassign the reviewer. Do not combine with reviewer_kind/_id.'),
|
|
399
407
|
},
|
|
400
408
|
}, (args) => callMcpApi('assign-ticket', args));
|
|
401
409
|
server.registerTool('link_ticket', {
|
|
@@ -410,6 +418,210 @@ server.registerTool('link_ticket', {
|
|
|
410
418
|
.describe("Relationship label. Defaults to 'relates_to'."),
|
|
411
419
|
},
|
|
412
420
|
}, (args) => callMcpApi('link-ticket', args));
|
|
421
|
+
// ===================================================================
|
|
422
|
+
// Projects MLP v2 — reads + management + scaffold (0.10.0)
|
|
423
|
+
// ===================================================================
|
|
424
|
+
server.registerTool('list_projects', {
|
|
425
|
+
description: "List all projects in your org (notebooks with kind=project). Returns id, name, goal, due_at, status. Use to discover the project to work in.",
|
|
426
|
+
inputSchema: {},
|
|
427
|
+
}, (args) => callMcpApi('list-projects', args));
|
|
428
|
+
server.registerTool('list_workstreams', {
|
|
429
|
+
description: "List the workstreams in a project. Returns each workstream id, name, status, owner, and ticket rollups. Use to get a workstream_id before creating or listing tickets.",
|
|
430
|
+
inputSchema: {
|
|
431
|
+
project_id: z.string().describe('Project id (notebook with kind=project).'),
|
|
432
|
+
},
|
|
433
|
+
}, (args) => callMcpApi('list-workstreams', args));
|
|
434
|
+
server.registerTool('list_workstream_tickets', {
|
|
435
|
+
description: "List all tickets in a workstream (the board). Returns id, key, title, status, priority, assignment, milestone, sort_order.",
|
|
436
|
+
inputSchema: {
|
|
437
|
+
workstream_id: z.string().describe('Workstream id.'),
|
|
438
|
+
},
|
|
439
|
+
}, (args) => callMcpApi('list-workstream-tickets', args));
|
|
440
|
+
server.registerTool('get_workstream', {
|
|
441
|
+
description: "Fetch a single workstream by id with its detail and ticket rollups.",
|
|
442
|
+
inputSchema: {
|
|
443
|
+
workstream_id: z.string().describe('Workstream id.'),
|
|
444
|
+
},
|
|
445
|
+
}, (args) => callMcpApi('get-workstream', args));
|
|
446
|
+
server.registerTool('list_milestones', {
|
|
447
|
+
description: "List the milestones for a project (pass the project id). Returns id, title, due_at, completed_at, and ticket rollups.",
|
|
448
|
+
inputSchema: {
|
|
449
|
+
project_id: z.string().describe('Project id (the milestones live on the project notebook).'),
|
|
450
|
+
},
|
|
451
|
+
}, (args) => callMcpApi('list-milestones', args));
|
|
452
|
+
server.registerTool('get_milestone', {
|
|
453
|
+
description: "Fetch a single milestone by id, including its ticket rollups.",
|
|
454
|
+
inputSchema: {
|
|
455
|
+
milestone_id: z.string().describe('Milestone id.'),
|
|
456
|
+
},
|
|
457
|
+
}, (args) => callMcpApi('get-milestone', args));
|
|
458
|
+
server.registerTool('list_ticket_comments', {
|
|
459
|
+
description: "List the full comment thread for a ticket, with author attribution (member or agent).",
|
|
460
|
+
inputSchema: {
|
|
461
|
+
ticket_id: z.string().describe('Ticket id.'),
|
|
462
|
+
},
|
|
463
|
+
}, (args) => callMcpApi('list-ticket-comments', args));
|
|
464
|
+
server.registerTool('list_ticket_dependencies', {
|
|
465
|
+
description: "List a ticket dependencies: which tickets block it and which it blocks, with blocked-open state.",
|
|
466
|
+
inputSchema: {
|
|
467
|
+
ticket_id: z.string().describe('Ticket id.'),
|
|
468
|
+
},
|
|
469
|
+
}, (args) => callMcpApi('list-ticket-dependencies', args));
|
|
470
|
+
server.registerTool('list_ticket_events', {
|
|
471
|
+
description: "List the activity timeline for a ticket (status changes, assignments, links, and more).",
|
|
472
|
+
inputSchema: {
|
|
473
|
+
ticket_id: z.string().describe('Ticket id.'),
|
|
474
|
+
},
|
|
475
|
+
}, (args) => callMcpApi('list-ticket-events', args));
|
|
476
|
+
server.registerTool('list_team_agents', {
|
|
477
|
+
description: "List the agents registered for your team. Returns id, name, role, is_active. Use to find an agent id to assign as executor or reviewer.",
|
|
478
|
+
inputSchema: {},
|
|
479
|
+
}, (args) => callMcpApi('list-team-agents', args));
|
|
480
|
+
server.registerTool('search_tickets', {
|
|
481
|
+
description: "Search tickets across the org by text and filters (status, priority, project, executor, milestone). Returns matching tickets.",
|
|
482
|
+
inputSchema: {
|
|
483
|
+
query: z.string().optional().describe('Free-text search over title and body.'),
|
|
484
|
+
status: z.enum(['backlog', 'ready', 'in_progress', 'in_review', 'done']).optional().describe('Filter by status.'),
|
|
485
|
+
priority: z.string().optional().describe('Filter by priority.'),
|
|
486
|
+
project_id: z.string().optional().describe('Restrict to one project.'),
|
|
487
|
+
executor_kind: z.enum(['member', 'agent']).optional().describe('Filter by executor actor kind.'),
|
|
488
|
+
executor_id: z.string().optional().describe('Filter by executor actor id.'),
|
|
489
|
+
milestone_id: z.string().optional().describe('Filter by milestone.'),
|
|
490
|
+
limit: z.number().int().positive().max(200).optional().describe('Max results (default 100).'),
|
|
491
|
+
},
|
|
492
|
+
}, (args) => callMcpApi('search-tickets', args));
|
|
493
|
+
server.registerTool('search_linkable', {
|
|
494
|
+
description: "Search for drawers, pages, and tickets you can link to a ticket. Returns id, kind, title for use with link_ticket.",
|
|
495
|
+
inputSchema: {
|
|
496
|
+
query: z.string().optional().describe('Free-text search.'),
|
|
497
|
+
limit: z.number().int().positive().max(50).optional().describe('Max results (default 20).'),
|
|
498
|
+
},
|
|
499
|
+
}, (args) => callMcpApi('search-linkable', args));
|
|
500
|
+
server.registerTool('update_ticket', {
|
|
501
|
+
description: "Update ticket fields: title, body, priority, due_at. Pass clear_due=true to remove the due date. Member-only.",
|
|
502
|
+
inputSchema: {
|
|
503
|
+
ticket_id: z.string().describe('Ticket to update.'),
|
|
504
|
+
title: z.string().optional().describe('New title.'),
|
|
505
|
+
body: z.string().optional().describe('New body / acceptance criteria.'),
|
|
506
|
+
priority: z.string().optional().describe('New priority.'),
|
|
507
|
+
due_at: z.string().optional().describe('ISO 8601 due date.'),
|
|
508
|
+
clear_due: z.boolean().optional().describe('Set true to clear the due date.'),
|
|
509
|
+
},
|
|
510
|
+
}, (args) => callMcpApi('update-ticket', args));
|
|
511
|
+
server.registerTool('set_ticket_milestone', {
|
|
512
|
+
description: "Set or clear a ticket milestone. Pass milestone_id to set it; omit milestone_id to clear it. The milestone must belong to the same project. Member-only.",
|
|
513
|
+
inputSchema: {
|
|
514
|
+
ticket_id: z.string().describe('Ticket id.'),
|
|
515
|
+
milestone_id: z.string().optional().describe('Milestone id to set. Omit to clear the milestone.'),
|
|
516
|
+
},
|
|
517
|
+
}, (args) => callMcpApi('set-ticket-milestone', args));
|
|
518
|
+
server.registerTool('add_ticket_dependency', {
|
|
519
|
+
description: "Add a dependency: blocked_id is blocked by blocker_id. Both tickets must be in the same project. Rejects self-dependency and cycles. Member-only.",
|
|
520
|
+
inputSchema: {
|
|
521
|
+
blocked_id: z.string().describe('The ticket that is blocked.'),
|
|
522
|
+
blocker_id: z.string().describe('The ticket that blocks it.'),
|
|
523
|
+
},
|
|
524
|
+
}, (args) => callMcpApi('add-ticket-dependency', args));
|
|
525
|
+
server.registerTool('remove_ticket_dependency', {
|
|
526
|
+
description: "Remove a ticket dependency by its dependency id (from list_ticket_dependencies). Member-only.",
|
|
527
|
+
inputSchema: {
|
|
528
|
+
dependency_id: z.string().describe('Dependency id to remove.'),
|
|
529
|
+
},
|
|
530
|
+
}, (args) => callMcpApi('remove-ticket-dependency', args));
|
|
531
|
+
server.registerTool('move_ticket_to_workstream', {
|
|
532
|
+
description: "Move a ticket to a different workstream in the same project. Member-only.",
|
|
533
|
+
inputSchema: {
|
|
534
|
+
ticket_id: z.string().describe('Ticket to move.'),
|
|
535
|
+
workstream_id: z.string().describe('Destination workstream id.'),
|
|
536
|
+
},
|
|
537
|
+
}, (args) => callMcpApi('move-ticket-to-workstream', args));
|
|
538
|
+
server.registerTool('unlink_ticket', {
|
|
539
|
+
description: "Remove a link from a ticket. kind is drawer or page; id is the linked drawer or page id. Member-only.",
|
|
540
|
+
inputSchema: {
|
|
541
|
+
ticket_id: z.string().describe('Ticket to unlink from.'),
|
|
542
|
+
kind: z.enum(['drawer', 'page']).describe('Linked target kind.'),
|
|
543
|
+
id: z.string().describe('Linked drawer or page id.'),
|
|
544
|
+
},
|
|
545
|
+
}, (args) => callMcpApi('unlink-ticket', args));
|
|
546
|
+
server.registerTool('reorder_tickets', {
|
|
547
|
+
description: "Reorder tickets within a workstream. ordered_ids is the full list of ticket ids in the new order. Member-only.",
|
|
548
|
+
inputSchema: {
|
|
549
|
+
workstream_id: z.string().describe('Workstream id.'),
|
|
550
|
+
ordered_ids: z.array(z.string()).describe('All ticket ids in the new order.'),
|
|
551
|
+
},
|
|
552
|
+
}, (args) => callMcpApi('reorder-tickets', args));
|
|
553
|
+
server.registerTool('create_workstream', {
|
|
554
|
+
description: "Create a workstream in a project. Optionally set an owner member. Returns the new workstream id. Member-only.",
|
|
555
|
+
inputSchema: {
|
|
556
|
+
project_id: z.string().describe('Project id (notebook with kind=project).'),
|
|
557
|
+
name: z.string().describe('Workstream name.'),
|
|
558
|
+
owner_user_id: z.string().optional().describe('Optional owner member user id.'),
|
|
559
|
+
},
|
|
560
|
+
}, (args) => callMcpApi('create-workstream', args));
|
|
561
|
+
server.registerTool('update_workstream', {
|
|
562
|
+
description: "Update a workstream name, status, description, or owner. Pass clear_owner=true to unset the owner. Member-only.",
|
|
563
|
+
inputSchema: {
|
|
564
|
+
workstream_id: z.string().describe('Workstream to update.'),
|
|
565
|
+
name: z.string().optional().describe('New name.'),
|
|
566
|
+
status: z.string().optional().describe('New status.'),
|
|
567
|
+
owner_user_id: z.string().optional().describe('New owner member user id.'),
|
|
568
|
+
description: z.string().optional().describe('New description.'),
|
|
569
|
+
clear_owner: z.boolean().optional().describe('Set true to unset the owner.'),
|
|
570
|
+
},
|
|
571
|
+
}, (args) => callMcpApi('update-workstream', args));
|
|
572
|
+
server.registerTool('reorder_workstreams', {
|
|
573
|
+
description: "Reorder workstreams within a project. ordered_ids is the full list of workstream ids in the new order. Member-only.",
|
|
574
|
+
inputSchema: {
|
|
575
|
+
project_id: z.string().describe('Project id.'),
|
|
576
|
+
ordered_ids: z.array(z.string()).describe('All workstream ids in the new order.'),
|
|
577
|
+
},
|
|
578
|
+
}, (args) => callMcpApi('reorder-workstreams', args));
|
|
579
|
+
server.registerTool('create_milestone', {
|
|
580
|
+
description: "Create a milestone in a project (pass the project id and a title, optional due_at). Returns the new milestone id. Member-only.",
|
|
581
|
+
inputSchema: {
|
|
582
|
+
project_id: z.string().describe('Project id the milestone belongs to.'),
|
|
583
|
+
title: z.string().describe('Milestone title.'),
|
|
584
|
+
due_at: z.string().optional().describe('ISO 8601 due date (optional).'),
|
|
585
|
+
},
|
|
586
|
+
}, (args) => callMcpApi('create-milestone', args));
|
|
587
|
+
server.registerTool('complete_milestone', {
|
|
588
|
+
description: "Mark a milestone complete or incomplete. completed defaults to true. Member-only.",
|
|
589
|
+
inputSchema: {
|
|
590
|
+
milestone_id: z.string().describe('Milestone id.'),
|
|
591
|
+
completed: z.boolean().optional().describe('True to complete (default), false to reopen.'),
|
|
592
|
+
},
|
|
593
|
+
}, (args) => callMcpApi('complete-milestone', args));
|
|
594
|
+
server.registerTool('create_agent', {
|
|
595
|
+
description: "Register an agent actor for your team (name, optional role). Returns the new agent id. To let the agent act, mint an agent-bound token in the dashboard. Member-only.",
|
|
596
|
+
inputSchema: {
|
|
597
|
+
name: z.string().describe('Agent display name.'),
|
|
598
|
+
role: z.string().optional().describe('Optional role label.'),
|
|
599
|
+
},
|
|
600
|
+
}, (args) => callMcpApi('create-agent', args));
|
|
601
|
+
server.registerTool('update_agent', {
|
|
602
|
+
description: "Update an agent name, role, or is_active flag. Setting is_active=false deactivates the agent (kill-switch). Member-only.",
|
|
603
|
+
inputSchema: {
|
|
604
|
+
agent_id: z.string().describe('Agent to update.'),
|
|
605
|
+
name: z.string().optional().describe('New name.'),
|
|
606
|
+
role: z.string().optional().describe('New role.'),
|
|
607
|
+
is_active: z.boolean().optional().describe('Set false to deactivate (kill-switch), true to reactivate.'),
|
|
608
|
+
},
|
|
609
|
+
}, (args) => callMcpApi('update-agent', args));
|
|
610
|
+
server.registerTool('create_project', {
|
|
611
|
+
description: "Create a new project (a notebook with kind=project) in your org, with a name and optional goal and due_at. Returns the new project id. Member-only.",
|
|
612
|
+
inputSchema: {
|
|
613
|
+
name: z.string().describe('Project name.'),
|
|
614
|
+
goal: z.string().optional().describe('Project objective or outcome.'),
|
|
615
|
+
due_at: z.string().optional().describe('ISO 8601 due date (optional).'),
|
|
616
|
+
},
|
|
617
|
+
}, (args) => callMcpApi('create-project', args));
|
|
618
|
+
server.registerTool('update_ticket_comment', {
|
|
619
|
+
description: "Edit one of your own ticket comments. Only the original author (you, member or agent) may edit it.",
|
|
620
|
+
inputSchema: {
|
|
621
|
+
comment_id: z.string().describe('Comment id to edit.'),
|
|
622
|
+
body: z.string().describe('New comment text.'),
|
|
623
|
+
},
|
|
624
|
+
}, (args) => callMcpApi('update-ticket-comment', args));
|
|
413
625
|
server.registerTool('health_check', {
|
|
414
626
|
description: 'Returns server health status and resolved team identity',
|
|
415
627
|
}, () => callMcpApi('health-check', undefined, 'GET'));
|
package/package.json
CHANGED