@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.
- package/README.md +10 -2
- package/dist/index.js +71 -2
- 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** (
|
|
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
|
|
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
|
|
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.
|
|
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": "
|
|
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
|
+
}
|