@mushi-mushi/mcp 0.11.0 → 0.12.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.
Files changed (2) hide show
  1. package/dist/index.js +142 -0
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -330,6 +330,47 @@ var TDD_TOOL_CATALOG = [
330
330
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
331
331
  useCase: 'Did "Add to Slack" work? Send a test ping to confirm.'
332
332
  },
333
+ // ── Skill Pipeline tools ─────────────────────────────────────────────────────
334
+ {
335
+ name: "list_skills",
336
+ title: "List agent skills",
337
+ description: "List the agent skills available in the catalog, optionally filtered by category. Returns slug, title, description, category, and chain_slugs for each skill. Use before start_skill_pipeline to find the right skill slug for a given type of work.",
338
+ scope: "mcp:read",
339
+ hints: { readOnly: true, idempotent: true, openWorld: true },
340
+ useCase: "What skills are available for debugging production errors?"
341
+ },
342
+ {
343
+ name: "get_skill",
344
+ title: "Get skill detail",
345
+ description: "Fetch the full detail for a single agent skill by slug, including the complete SKILL.md body and resolved chain. Use before executing a step to understand what the skill expects you to do.",
346
+ scope: "mcp:read",
347
+ hints: { readOnly: true, idempotent: true, openWorld: true },
348
+ useCase: "What does workflow-fix-and-ship actually instruct me to do?"
349
+ },
350
+ {
351
+ name: "start_skill_pipeline",
352
+ title: "Start a skill pipeline",
353
+ description: "Start a new skill pipeline run for a report. Pass root_skill_slug and optionally report_id. Returns run_id, context_packet (full instructions + report context), and step list. Read the context_packet \u2014 it contains skill instructions plus full report context (repro steps, root cause, RAG files). After executing each step, call checkin_pipeline_step. The PM watching the console sees progress live.",
354
+ scope: "mcp:write",
355
+ hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
356
+ useCase: "Start the workflow-fix-and-ship pipeline for this bug report."
357
+ },
358
+ {
359
+ name: "get_pipeline_run",
360
+ title: "Get pipeline run detail",
361
+ description: "Fetch the full detail for a skill pipeline run: status, context_packet, and all step statuses. Call to retrieve the context_packet after a pipeline was started from the console or another agent.",
362
+ scope: "mcp:read",
363
+ hints: { readOnly: true, idempotent: true, openWorld: true },
364
+ useCase: "Give me the context packet and step status for this pipeline run."
365
+ },
366
+ {
367
+ name: "checkin_pipeline_step",
368
+ title: "Check in a pipeline step",
369
+ description: "Report the completion status of a pipeline step (passed, failed, running, or skipped). Optionally include notes, a PR URL, or the Cursor agentId. Updates the live React Flow canvas in the Mushi console so PMs see real-time progress.",
370
+ scope: "mcp:write",
371
+ hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
372
+ useCase: "I just opened the PR \u2014 mark step 2 as passed and link the PR."
373
+ },
333
374
  // ── Full-Stack Audit tools (Phase 5) ────────────────────────────────────────
334
375
  {
335
376
  name: "run_fullstack_audit",
@@ -1468,6 +1509,107 @@ Prefer items that are bottlenecks or critical severity. Skip filler.`
1468
1509
  return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
1469
1510
  }
1470
1511
  );
1512
+ server.registerTool(
1513
+ "list_skills",
1514
+ {
1515
+ title: titleOf("list_skills"),
1516
+ description: descOf("list_skills"),
1517
+ annotations: annotationsFor("list_skills"),
1518
+ inputSchema: {
1519
+ category: z.string().optional().describe("Filter by category: workflow, debug, test, audit, enhance, \u2026"),
1520
+ search: z.string().optional().describe("Free-text search across slug, title, description"),
1521
+ page: z.number().optional().describe("Page number (default 1)"),
1522
+ limit: z.number().optional().describe("Max results per page (default 200, max 200)")
1523
+ }
1524
+ },
1525
+ async (args) => {
1526
+ const qs = new URLSearchParams();
1527
+ if (args.category) qs.set("category", args.category);
1528
+ if (args.search) qs.set("q", args.search);
1529
+ if (args.page) qs.set("page", String(args.page));
1530
+ qs.set("limit", String(Math.min(args.limit ?? 200, 200)));
1531
+ const data = await apiCall(`/v1/admin/skills?${qs}`);
1532
+ const skills = Array.isArray(data) ? data : [];
1533
+ return jsonText({ skills, count: skills.length });
1534
+ }
1535
+ );
1536
+ server.registerTool(
1537
+ "get_skill",
1538
+ {
1539
+ title: titleOf("get_skill"),
1540
+ description: descOf("get_skill"),
1541
+ annotations: annotationsFor("get_skill"),
1542
+ inputSchema: {
1543
+ slug: z.string().describe('Skill slug, e.g. "workflow-fix-and-ship"')
1544
+ }
1545
+ },
1546
+ async (args) => {
1547
+ const data = await apiCall(`/v1/admin/skills/${args.slug}`);
1548
+ return jsonText(data);
1549
+ }
1550
+ );
1551
+ server.registerTool(
1552
+ "start_skill_pipeline",
1553
+ {
1554
+ title: titleOf("start_skill_pipeline"),
1555
+ description: descOf("start_skill_pipeline"),
1556
+ annotations: annotationsFor("start_skill_pipeline"),
1557
+ inputSchema: {
1558
+ root_skill_slug: z.string().describe('Root skill slug to run, e.g. "workflow-fix-and-ship"'),
1559
+ report_id: z.string().optional().describe("Report UUID to attach the pipeline to"),
1560
+ mode: z.enum(["handoff", "cloud"]).optional().describe("handoff (default): get context packet for local agent. cloud: auto-dispatch via Cursor Cloud."),
1561
+ project_id: z.string().optional().describe("Project UUID. Falls back to the configured project.")
1562
+ }
1563
+ },
1564
+ async (args) => {
1565
+ const resolvedProjectId = args.project_id ?? projectId;
1566
+ if (!resolvedProjectId) return jsonText({ error: "No project_id provided or configured." });
1567
+ const data = await apiCall(
1568
+ "/v1/admin/skills/pipelines",
1569
+ { method: "POST", body: JSON.stringify({ ...args, project_id: resolvedProjectId }) }
1570
+ );
1571
+ return jsonText(data);
1572
+ }
1573
+ );
1574
+ server.registerTool(
1575
+ "get_pipeline_run",
1576
+ {
1577
+ title: titleOf("get_pipeline_run"),
1578
+ description: descOf("get_pipeline_run"),
1579
+ annotations: annotationsFor("get_pipeline_run"),
1580
+ inputSchema: {
1581
+ run_id: z.string().describe("Pipeline run UUID")
1582
+ }
1583
+ },
1584
+ async (args) => {
1585
+ const data = await apiCall(`/v1/admin/skills/pipelines/${args.run_id}`);
1586
+ return jsonText(data);
1587
+ }
1588
+ );
1589
+ server.registerTool(
1590
+ "checkin_pipeline_step",
1591
+ {
1592
+ title: titleOf("checkin_pipeline_step"),
1593
+ description: descOf("checkin_pipeline_step"),
1594
+ annotations: annotationsFor("checkin_pipeline_step"),
1595
+ inputSchema: {
1596
+ run_id: z.string().describe("Pipeline run UUID"),
1597
+ step_index: z.number().describe("Step index (0-based)"),
1598
+ status: z.enum(["running", "passed", "failed", "skipped"]).describe("Step status"),
1599
+ notes: z.string().optional().describe("Optional notes or output summary"),
1600
+ pr_url: z.string().optional().describe("PR URL opened during this step"),
1601
+ agent_ref: z.string().optional().describe("Cursor agentId or external agent reference")
1602
+ }
1603
+ },
1604
+ async (args) => {
1605
+ const { run_id, step_index, ...body } = args;
1606
+ await apiCall(
1607
+ `/v1/admin/skills/pipelines/${run_id}/steps/${step_index}/checkin`,
1608
+ { method: "POST", body: JSON.stringify(body) }
1609
+ );
1610
+ return jsonText({ ok: true, message: `Step ${step_index} \u2192 ${args.status}` });
1611
+ }
1612
+ );
1471
1613
  const grantedScopes = config.scopes;
1472
1614
  if (grantedScopes !== void 0) {
1473
1615
  const toolRegistry = server._registeredTools;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mushi-mushi/mcp",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "license": "MIT",
5
5
  "description": "MCP server exposing Mushi Mushi reports to coding agents",
6
6
  "type": "module",