@mushi-mushi/mcp 0.18.1 → 0.18.3
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 +4 -4
- package/dist/catalog.js +1 -1
- package/dist/{chunk-TJSPX5CD.js → chunk-DSOPGMDX.js} +5 -5
- package/dist/index.js +20 -6
- package/dist/server.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -87,9 +87,9 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
|
87
87
|
Restart Claude Desktop. You should see a hammer icon in the chat input — click it to see the Mushi Mushi tools.
|
|
88
88
|
|
|
89
89
|
> **Where do I find these values?**
|
|
90
|
-
> - **`MUSHI_API_KEY`**: [Admin
|
|
90
|
+
> - **`MUSHI_API_KEY`**: [Admin → Connect](https://kensaur.us/mushi-mushi/admin/connect) or **MCP** setup — mint an `mcp:read` / `mcp:write` key. This is **not** the SDK ingest key from **Setup → Verify** (`report:write`) and **not** a BYOK key from **Settings → API Keys**.
|
|
91
91
|
> - **`MUSHI_PROJECT_ID`**: [Admin console](https://kensaur.us/mushi-mushi/projects) → click your project → copy the UUID below the project name (e.g. `542b34e0-019e-41fe-b900-7b637717bb86`)
|
|
92
|
-
> - **`MUSHI_API_ENDPOINT`**:
|
|
92
|
+
> - **`MUSHI_API_ENDPOINT`**: Shown when you mint the MCP key, or use your project's API base (`https://<ref>.supabase.co/functions/v1/api`)
|
|
93
93
|
>
|
|
94
94
|
> Or visit **Admin → MCP** in the console for a one-click pre-filled config snippet.
|
|
95
95
|
|
|
@@ -105,9 +105,9 @@ Then set the same three environment variables:
|
|
|
105
105
|
|
|
106
106
|
| Variable | Where to find it |
|
|
107
107
|
|---|---|
|
|
108
|
-
| `MUSHI_API_KEY` |
|
|
108
|
+
| `MUSHI_API_KEY` | **Connect** or **MCP** tab — mint `mcp:read` / `mcp:write` (not Setup → Verify ingest key; not Settings → BYOK) |
|
|
109
109
|
| `MUSHI_PROJECT_ID` | Admin console → Projects → click project → UUID below the name |
|
|
110
|
-
| `MUSHI_API_ENDPOINT` |
|
|
110
|
+
| `MUSHI_API_ENDPOINT` | Shown at key mint, or your Supabase `.../functions/v1/api` base |
|
|
111
111
|
|
|
112
112
|
Without `MUSHI_PROJECT_ID` the server starts but scoped tools return an empty result with a message pointing you here.
|
|
113
113
|
|
package/dist/catalog.js
CHANGED
|
@@ -192,7 +192,7 @@ var TOOL_CATALOG = [
|
|
|
192
192
|
{
|
|
193
193
|
name: "merge_fix",
|
|
194
194
|
title: "Merge fix PR",
|
|
195
|
-
description: "Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive
|
|
195
|
+
description: "Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive and irreversible from Mushi's side \u2014 once GitHub merges into the target repo's default branch there is no unmerge endpoint, only a manual revert PR outside this tool. Idempotent \u2014 re-running an already-merged attempt is a safe no-op. Prerequisite: CI green (check with refresh_ci); confirm the diff and CI status with the user before calling on a PR you have not reviewed. Use to ship a fix opened by dispatch_fix; use transition_status to change state without merging.",
|
|
196
196
|
scope: "mcp:write",
|
|
197
197
|
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
198
198
|
useCase: "Merge the draft PR and notify the reporter."
|
|
@@ -225,17 +225,17 @@ var TOOL_CATALOG = [
|
|
|
225
225
|
{
|
|
226
226
|
name: "award_bonus_points",
|
|
227
227
|
title: "Award bonus points",
|
|
228
|
-
description: "Award ad-hoc bonus points to a contributor by their external user id (as passed to Mushi.identify()). Points
|
|
228
|
+
description: "Award ad-hoc bonus points (1-50000, positive only \u2014 there is no way to subtract via this tool) to a contributor by their external user id (as passed to Mushi.identify()). Points post immediately to their total and are audit-logged as bonus_manual. Destructive and effectively irreversible: there is no reversal endpoint, so confirm the amount and recipient with the user before calling. Tier re-evaluation (and any host-side reward_webhooks grant tied to crossing a threshold) is NOT immediate \u2014 it only runs on the contributor's next tracked activity, not on this call. Requires mcp:write scope. Use this to thank a contributor who found a critical bug or to run a one-off promotional campaign.",
|
|
229
229
|
scope: "mcp:write",
|
|
230
|
-
hints: { readOnly: false, destructive:
|
|
230
|
+
hints: { readOnly: false, destructive: true, idempotent: false, openWorld: true },
|
|
231
231
|
useCase: "Give this contributor 500 bonus points for the critical bug they found."
|
|
232
232
|
},
|
|
233
233
|
{
|
|
234
234
|
name: "set_tier",
|
|
235
235
|
title: "Override contributor tier",
|
|
236
|
-
description: `Override a contributor's tier by tier slug (e.g. "champion"). This is an admin escape hatch for manual promotions \u2014 normal tier transitions happen automatically via point thresholds. The override
|
|
236
|
+
description: `Override a contributor's tier by tier slug (e.g. "champion"), bypassing the normal points-threshold logic entirely. This is an admin escape hatch for manual promotions \u2014 normal tier transitions happen automatically via point thresholds instead. Destructive: it is a label-only override that does NOT replay the automatic tier-evaluation path, so any host_credit_payload grant (Stripe perk, badge, etc.) normally tied to reaching that tier via points will NOT fire \u2014 confirm with the user whether they also need the perk granted another way. The override persists until another set_tier call changes it; the prior override stays in the end_user_activity audit trail either way, logged as tier_override_manual. Requires mcp:write scope.`,
|
|
237
237
|
scope: "mcp:write",
|
|
238
|
-
hints: { readOnly: false, destructive:
|
|
238
|
+
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
239
239
|
useCase: "Manually promote this user to Champion tier as a thank-you."
|
|
240
240
|
},
|
|
241
241
|
{
|
package/dist/index.js
CHANGED
|
@@ -199,7 +199,7 @@ var TOOL_CATALOG = [
|
|
|
199
199
|
{
|
|
200
200
|
name: "merge_fix",
|
|
201
201
|
title: "Merge fix PR",
|
|
202
|
-
description: "Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive
|
|
202
|
+
description: "Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive and irreversible from Mushi's side \u2014 once GitHub merges into the target repo's default branch there is no unmerge endpoint, only a manual revert PR outside this tool. Idempotent \u2014 re-running an already-merged attempt is a safe no-op. Prerequisite: CI green (check with refresh_ci); confirm the diff and CI status with the user before calling on a PR you have not reviewed. Use to ship a fix opened by dispatch_fix; use transition_status to change state without merging.",
|
|
203
203
|
scope: "mcp:write",
|
|
204
204
|
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
205
205
|
useCase: "Merge the draft PR and notify the reporter."
|
|
@@ -232,17 +232,17 @@ var TOOL_CATALOG = [
|
|
|
232
232
|
{
|
|
233
233
|
name: "award_bonus_points",
|
|
234
234
|
title: "Award bonus points",
|
|
235
|
-
description: "Award ad-hoc bonus points to a contributor by their external user id (as passed to Mushi.identify()). Points
|
|
235
|
+
description: "Award ad-hoc bonus points (1-50000, positive only \u2014 there is no way to subtract via this tool) to a contributor by their external user id (as passed to Mushi.identify()). Points post immediately to their total and are audit-logged as bonus_manual. Destructive and effectively irreversible: there is no reversal endpoint, so confirm the amount and recipient with the user before calling. Tier re-evaluation (and any host-side reward_webhooks grant tied to crossing a threshold) is NOT immediate \u2014 it only runs on the contributor's next tracked activity, not on this call. Requires mcp:write scope. Use this to thank a contributor who found a critical bug or to run a one-off promotional campaign.",
|
|
236
236
|
scope: "mcp:write",
|
|
237
|
-
hints: { readOnly: false, destructive:
|
|
237
|
+
hints: { readOnly: false, destructive: true, idempotent: false, openWorld: true },
|
|
238
238
|
useCase: "Give this contributor 500 bonus points for the critical bug they found."
|
|
239
239
|
},
|
|
240
240
|
{
|
|
241
241
|
name: "set_tier",
|
|
242
242
|
title: "Override contributor tier",
|
|
243
|
-
description: `Override a contributor's tier by tier slug (e.g. "champion"). This is an admin escape hatch for manual promotions \u2014 normal tier transitions happen automatically via point thresholds. The override
|
|
243
|
+
description: `Override a contributor's tier by tier slug (e.g. "champion"), bypassing the normal points-threshold logic entirely. This is an admin escape hatch for manual promotions \u2014 normal tier transitions happen automatically via point thresholds instead. Destructive: it is a label-only override that does NOT replay the automatic tier-evaluation path, so any host_credit_payload grant (Stripe perk, badge, etc.) normally tied to reaching that tier via points will NOT fire \u2014 confirm with the user whether they also need the perk granted another way. The override persists until another set_tier call changes it; the prior override stays in the end_user_activity audit trail either way, logged as tier_override_manual. Requires mcp:write scope.`,
|
|
244
244
|
scope: "mcp:write",
|
|
245
|
-
hints: { readOnly: false, destructive:
|
|
245
|
+
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
246
246
|
useCase: "Manually promote this user to Champion tier as a thank-you."
|
|
247
247
|
},
|
|
248
248
|
{
|
|
@@ -3153,10 +3153,23 @@ async function main() {
|
|
|
3153
3153
|
});
|
|
3154
3154
|
const transport = new StdioServerTransport();
|
|
3155
3155
|
await server.connect(transport);
|
|
3156
|
+
let shuttingDown = false;
|
|
3157
|
+
let pollTimer;
|
|
3158
|
+
const shutdown = (exitCode) => {
|
|
3159
|
+
if (shuttingDown) return;
|
|
3160
|
+
shuttingDown = true;
|
|
3161
|
+
if (pollTimer) clearInterval(pollTimer);
|
|
3162
|
+
void transport.close().finally(() => process.exit(exitCode));
|
|
3163
|
+
};
|
|
3164
|
+
process.stdin.on("end", () => shutdown(0));
|
|
3165
|
+
process.stdin.on("close", () => shutdown(0));
|
|
3166
|
+
process.on("SIGINT", () => shutdown(0));
|
|
3167
|
+
process.on("SIGTERM", () => shutdown(0));
|
|
3156
3168
|
if (PROJECT_ID && API_ENDPOINT) {
|
|
3157
3169
|
let lastInventoryAt = null;
|
|
3158
3170
|
const POLL_INTERVAL_MS = 6e4;
|
|
3159
3171
|
const pollInventory = async () => {
|
|
3172
|
+
if (shuttingDown) return;
|
|
3160
3173
|
try {
|
|
3161
3174
|
const res = await fetch(`${API_ENDPOINT}/v1/admin/inventory/${PROJECT_ID}`, {
|
|
3162
3175
|
headers: {
|
|
@@ -3180,9 +3193,10 @@ async function main() {
|
|
|
3180
3193
|
}
|
|
3181
3194
|
};
|
|
3182
3195
|
void pollInventory();
|
|
3183
|
-
setInterval(() => {
|
|
3196
|
+
pollTimer = setInterval(() => {
|
|
3184
3197
|
void pollInventory();
|
|
3185
3198
|
}, POLL_INTERVAL_MS);
|
|
3199
|
+
pollTimer.unref();
|
|
3186
3200
|
}
|
|
3187
3201
|
}
|
|
3188
3202
|
main().catch((err) => {
|
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mushi-mushi/mcp",
|
|
3
3
|
"mcpName": "io.github.kensaurus/mushi-mushi",
|
|
4
|
-
"version": "0.18.
|
|
4
|
+
"version": "0.18.3",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "MCP server for Mushi Mushi — triage user-felt bugs, pull evidence (screenshots, console logs, network requests), check blast radius, and dispatch fix PRs, all from your AI coding agent",
|
|
7
7
|
"type": "module",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
49
49
|
"@sentry/node": "^10.57.0",
|
|
50
50
|
"zod": "^4.4.3",
|
|
51
|
-
"@mushi-mushi/core": "^1.22.
|
|
51
|
+
"@mushi-mushi/core": "^1.22.5"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/node": "^22.19.21",
|