@mushi-mushi/mcp 0.10.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.
Files changed (3) hide show
  1. package/README.md +10 -2
  2. package/dist/index.js +71 -2
  3. package/package.json +17 -17
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # mushi-mcp
1
+ # @mushi-mushi/mcp
2
2
 
3
3
  > **Sentry sees what code throws. Mushi sees what users feel — and closes the loop with AI.**
4
4
 
@@ -20,7 +20,7 @@ That command reads `~/.mushirc`, writes `.cursor/mcp.json` with the `mushi` serv
20
20
 
21
21
  > **What this is, and what it isn't**
22
22
  >
23
- > - **This package** (`mushi-mcp`) is the MCP **server** — runs locally next to your editor, talks to the Mushi API, and presents bug reports as MCP tools/resources to your coding agent. The npm package name is `mushi-mcp`; the scoped alias `@mushi-mushi/mcp` still works.
23
+ > - **This package** (`@mushi-mushi/mcp`) is the MCP **server** — runs locally next to your editor, talks to the Mushi API, and presents bug reports as MCP tools/resources to your coding agent. Always install it by its scoped name (`npx -y @mushi-mushi/mcp@latest`) the bare `mushi-mcp` name was never published to npm.
24
24
  > - **`@mushi-mushi/agents`** ships the MCP **client adapter** — used by the autofix orchestrator when your project's `autofix_agent = 'mcp'`. See `packages/agents/src/adapters/mcp.ts`.
25
25
  > - The `generic_mcp` adapter shipped before V5.3 was a misnomer (it spoke plain REST). It is now `RestFixWorkerAgent`; the old export is kept as a deprecated alias for one more minor.
26
26
 
@@ -130,6 +130,8 @@ The endpoint accepts JSON-RPC 2.0 over POST (returns `application/json` or `text
130
130
  | `get_fix_timeline` | Ordered timeline of a fix attempt (dispatched → started → branch → commit → PR → CI → completed/failed) |
131
131
  | `get_blast_radius` | Graph traversal showing other components a bug group touches |
132
132
  | `get_knowledge_graph` | Traverse the knowledge graph from a seed component or page |
133
+ | `setup_check` | The 4 **dispatch-readiness** checks (GitHub repo, codebase indexed, Anthropic key, autofix enabled) — run before `dispatch_fix` |
134
+ | `ingest_setup_check` | The 4 **required ingest** checks (project, active API key, SDK heartbeat, first report) + `last_sdk_seen_at` diagnostics — run after wiring env vars to confirm the SDK is reporting |
133
135
 
134
136
  ### Write / agentic
135
137
 
@@ -366,3 +368,9 @@ In Cursor chat, type `/` — you should see the Mushi Mushi slash-prompts (`/sum
366
368
  ## License
367
369
 
368
370
  MIT
371
+
372
+
373
+ <!-- mushi-readme-stats-footer -->
374
+ ---
375
+
376
+ <sub>Monorepo scale (June 2026): 43 edge functions · 234 SQL migrations · 13 outbound plugins · 11 inbound adapters. Canonical counts: <a href="https://github.com/kensaurus/mushi-mushi/blob/master/docs/stats.md">docs/stats.md</a> · <code>pnpm docs-stats</code></sub>
package/dist/index.js CHANGED
@@ -133,10 +133,18 @@ var TOOL_CATALOG = [
133
133
  {
134
134
  name: "setup_check",
135
135
  title: "Dispatch preflight check",
136
- description: "Run the 4 dispatch-readiness checks for a project and return their pass/fail status (GitHub repo connected, codebase indexed, Anthropic BYOK key present, autofix enabled). Also returns the target repo URL when GitHub is connected. Use this before calling dispatch_fix to understand why a dispatch might fail \u2014 or to validate that the onboarding wizard is complete.",
136
+ description: "Run the 4 **dispatch-readiness** checks for a project and return their pass/fail status (GitHub repo connected, codebase indexed, Anthropic BYOK key present, autofix enabled). Also returns the target repo URL when GitHub is connected. Use this before calling dispatch_fix to understand why a dispatch might fail. For SDK ingest health (API key \u2192 heartbeat \u2192 first report), call ingest_setup_check instead.",
137
137
  scope: "mcp:read",
138
138
  hints: { readOnly: true, idempotent: true, openWorld: true },
139
- useCase: "Is this project ready to auto-fix bugs? What is blocking me?"
139
+ useCase: "Is this project ready to auto-fix bugs? What is blocking dispatch?"
140
+ },
141
+ {
142
+ name: "ingest_setup_check",
143
+ title: "Ingest setup check",
144
+ description: "Run the 4 **required ingest** checks for the project tied to this API key: project exists, active API key, SDK heartbeat (or real report), and at least one ingested report. Returns per-step pass/fail plus last_sdk_seen_at and endpoint host diagnostics. Use after wiring env vars or pasting the SDK snippet to confirm the banner will work.",
145
+ scope: "mcp:read",
146
+ hints: { readOnly: true, idempotent: true, openWorld: true },
147
+ useCase: "Is the SDK installed and ingesting reports? Why is my banner still missing?"
140
148
  },
141
149
  // --- Write / agentic ----------------------------------------------------
142
150
  {
@@ -289,6 +297,14 @@ var TDD_TOOL_CATALOG = [
289
297
  scope: "mcp:write",
290
298
  hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
291
299
  useCase: "Approve this auto-generated test."
300
+ },
301
+ {
302
+ name: "reply_to_reporter",
303
+ title: "Reply to a reporter",
304
+ description: "Send a visible message to the end-user who filed a bug report. The reply appears in the in-app Mushi widget as an admin comment and creates an unread notification badge so the reporter sees it immediately. Use this to answer questions, request reproduction steps, or confirm a fix \u2014 without leaving the Cursor IDE.",
305
+ scope: "mcp:write",
306
+ hints: { readOnly: false, destructive: false, idempotent: false, openWorld: false },
307
+ useCase: "Reply to a reporter asking for more info or confirming a fix."
292
308
  }
293
309
  ];
294
310
 
@@ -696,6 +712,36 @@ function createMushiServer(config) {
696
712
  });
697
713
  }
698
714
  );
715
+ server.registerTool(
716
+ "ingest_setup_check",
717
+ {
718
+ title: titleOf("ingest_setup_check"),
719
+ description: descOf("ingest_setup_check"),
720
+ annotations: annotationsFor("ingest_setup_check"),
721
+ inputSchema: {}
722
+ },
723
+ async () => {
724
+ const data = await apiCall("/v1/sync/ingest-setup");
725
+ const failed = data.steps.filter((s) => s.required && !s.complete);
726
+ const summary = data.ready ? `Ingest setup complete (${data.required_complete}/${data.required_total}) for ${data.project_name}.` : `Ingest incomplete (${data.required_complete}/${data.required_total}) \u2014 still need: ${failed.map((s) => s.label).join(", ")}.`;
727
+ return jsonText({
728
+ ready: data.ready,
729
+ projectId: data.project_id,
730
+ projectName: data.project_name,
731
+ requiredComplete: data.required_complete,
732
+ requiredTotal: data.required_total,
733
+ steps: data.steps.map((s) => ({
734
+ id: s.id,
735
+ label: s.label,
736
+ passed: s.complete,
737
+ required: s.required,
738
+ hint: s.hint
739
+ })),
740
+ diagnostic: data.diagnostic ?? null,
741
+ summary
742
+ });
743
+ }
744
+ );
699
745
  server.registerTool(
700
746
  "submit_fix_result",
701
747
  {
@@ -1249,6 +1295,29 @@ Prefer items that are bottlenecks or critical severity. Skip filler.`
1249
1295
  return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
1250
1296
  }
1251
1297
  );
1298
+ server.registerTool(
1299
+ "reply_to_reporter",
1300
+ {
1301
+ title: titleOf("reply_to_reporter", TDD_TOOL_CATALOG),
1302
+ description: descOf("reply_to_reporter", TDD_TOOL_CATALOG),
1303
+ annotations: annotationsFor("reply_to_reporter", TDD_TOOL_CATALOG),
1304
+ inputSchema: {
1305
+ reportId: z.string().describe("Report id to reply to"),
1306
+ message: z.string().min(1).max(1e4).describe("Message text to send to the reporter"),
1307
+ authorName: z.string().optional().describe('Display name for the admin sender (default: "Mushi Admin")')
1308
+ }
1309
+ },
1310
+ async ({ reportId, message, authorName }) => {
1311
+ const data = await apiCall(
1312
+ `/v1/sync/reports/${reportId}/reply`,
1313
+ {
1314
+ method: "POST",
1315
+ body: JSON.stringify({ message, author_name: authorName })
1316
+ }
1317
+ );
1318
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
1319
+ }
1320
+ );
1252
1321
  const grantedScopes = config.scopes;
1253
1322
  if (grantedScopes !== void 0) {
1254
1323
  const toolRegistry = server._registeredTools;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mushi-mushi/mcp",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "license": "MIT",
5
5
  "description": "MCP server exposing Mushi Mushi reports to coding agents",
6
6
  "type": "module",
@@ -23,30 +23,18 @@
23
23
  "CODE_OF_CONDUCT.md",
24
24
  "SECURITY.md"
25
25
  ],
26
- "scripts": {
27
- "build": "tsup",
28
- "clean:types": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
29
- "dev": "tsup --watch",
30
- "lint": "eslint src/",
31
- "test": "vitest run",
32
- "test:smoke": "node scripts/smoke-stdio.mjs",
33
- "test:localhost": "node scripts/localhost-e2e.mjs",
34
- "demo": "node scripts/demo-terminal-config.mjs",
35
- "inspector": "npx --yes @modelcontextprotocol/inspector@latest node ./dist/index.js",
36
- "typecheck": "tsc --noEmit"
37
- },
38
26
  "dependencies": {
39
27
  "@modelcontextprotocol/sdk": "^1.29.0",
40
- "@mushi-mushi/core": "workspace:^",
28
+ "@mushi-mushi/core": "^1.7.5",
41
29
  "zod": "^4.4.2"
42
30
  },
43
31
  "devDependencies": {
44
- "@mushi-mushi/eslint-config": "workspace:*",
45
32
  "@types/node": "^22.19.17",
46
33
  "eslint": "^10.3.0",
47
34
  "tsup": "^8.5.1",
48
35
  "typescript": "^6.0.3",
49
- "vitest": "^4.1.5"
36
+ "vitest": "^4.1.5",
37
+ "@mushi-mushi/eslint-config": "0.0.0"
50
38
  },
51
39
  "repository": {
52
40
  "type": "git",
@@ -85,5 +73,17 @@
85
73
  ],
86
74
  "engines": {
87
75
  "node": ">=20"
76
+ },
77
+ "scripts": {
78
+ "build": "tsup",
79
+ "clean:types": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
80
+ "dev": "tsup --watch",
81
+ "lint": "eslint src/",
82
+ "test": "vitest run",
83
+ "test:smoke": "node scripts/smoke-stdio.mjs",
84
+ "test:localhost": "node scripts/localhost-e2e.mjs",
85
+ "demo": "node scripts/demo-terminal-config.mjs",
86
+ "inspector": "npx --yes @modelcontextprotocol/inspector@latest node ./dist/index.js",
87
+ "typecheck": "tsc --noEmit"
88
88
  }
89
- }
89
+ }