@mushi-mushi/mcp 0.26.0 → 0.27.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.
- package/README.md +2 -2
- package/dist/catalog.js +1 -1
- package/dist/{chunk-F65T4IGT.js → chunk-DJCVJ3YZ.js} +2 -0
- package/dist/{chunk-V3M4GZBV.js → chunk-VU2YQ6QF.js} +16 -0
- package/dist/clients.d.ts +1 -1
- package/dist/clients.js +2 -2
- package/dist/feature-groups.js +1 -1
- package/dist/index.js +58 -1
- package/dist/server.js +42 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ Restart the editor and ask *"what's broken in prod?"*. For Cursor and Claude, `s
|
|
|
29
29
|
"mcpServers": {
|
|
30
30
|
"mushi-mushi": {
|
|
31
31
|
"command": "npx",
|
|
32
|
-
"args": ["-y", "@mushi-mushi/mcp@0.
|
|
32
|
+
"args": ["-y", "@mushi-mushi/mcp@0.27.0"],
|
|
33
33
|
"env": {
|
|
34
34
|
"MUSHI_API_KEY": "mushi_xxxxxxxxxxxxxxxxxxxx",
|
|
35
35
|
"MUSHI_PROJECT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
@@ -59,7 +59,7 @@ Claude Desktop does not expand `${VAR}` references in this file; Cursor and VS C
|
|
|
59
59
|
| `diagnose_setup` | Explains a broken install and the one next step |
|
|
60
60
|
| `search_mushi_docs` | Answers setup and API questions from the docs |
|
|
61
61
|
|
|
62
|
-
The full catalog has
|
|
62
|
+
The full catalog has 119 tools, plus 8 resources (`project://dashboard`, `project://stats`, …) and 4 prompts (`summarize_report_for_fix`, `triage_next_steps`, …). Every tool carries read-only and destructive hints, so your editor can ask before it changes anything. Full list: [MCP tool reference](https://kensaur.us/mushi-mushi/docs/sdks/mcp-tools).
|
|
63
63
|
|
|
64
64
|
**Tool groups.** New installs get a lean default: `triage`, `fixes`, `inventory`, `setup`, `docs`. Turn on more with `MUSHI_FEATURES=triage,qa,codebase` (stdio) or `?features=…` on the hosted URL, or everything with `all`. Groups: `qa`, `skills`, `codebase`, `rewards`, `admin`, `audit`, `usage`. Add `?read_only=1` to the hosted URL to hide every write tool.
|
|
65
65
|
|
package/dist/catalog.js
CHANGED
|
@@ -142,6 +142,8 @@ var TOOL_FEATURE_MAP = {
|
|
|
142
142
|
add_byok_key: "setup",
|
|
143
143
|
test_byok_key: "setup",
|
|
144
144
|
remove_byok_key: "setup",
|
|
145
|
+
get_spend_down_status: "setup",
|
|
146
|
+
set_byok_spend_down: "setup",
|
|
145
147
|
// audit
|
|
146
148
|
run_fullstack_audit: "audit",
|
|
147
149
|
get_backend_health: "audit",
|
|
@@ -849,6 +849,22 @@ var TDD_TOOL_CATALOG = [
|
|
|
849
849
|
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
850
850
|
useCase: "Remove a rotated or compromised provider key from the runtime pool."
|
|
851
851
|
},
|
|
852
|
+
{
|
|
853
|
+
name: "get_spend_down_status",
|
|
854
|
+
title: "Spend-down status of Cursor keys",
|
|
855
|
+
description: "For each Cursor key this project can use, show spend-down mode (ADR 0028): whether it is on, when the credits expire, the window state (off | not_started | active | expired | key_unusable), fixes started today out of the daily limit, the apps the key pays for, and what the last worker tick did. Returns { keys: [{ id, label, keyHint, scope, enabled, creditsExpireAt, model, dailyLimit, windowDays, state, startsAt, dispatchedToday, remainingToday, projects, lastRunAt, lastSummary }] }. Read-only. Use to see whether expiring Cursor credits are being used; use set_byok_spend_down to change it.",
|
|
856
|
+
scope: "mcp:read",
|
|
857
|
+
hints: { readOnly: true, idempotent: true, openWorld: false },
|
|
858
|
+
useCase: "Are my expiring Cursor credits being spent on fixes?"
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
name: "set_byok_spend_down",
|
|
862
|
+
title: "Set spend-down for a Cursor key",
|
|
863
|
+
description: "Turn spend-down mode on or off for one of this project's own Cursor keys and set when its credits expire (YYYY-MM-DD), the Cursor model (id?param=value), fixes per day (1-200) and how many days before expiry to start (1-90). While on, Mushi dispatches the project's best open reports to Cursor on its own, inside the auto-fix caps; each fix opens a draft PR. A key shared by the organization can only be changed by an org owner or admin in the console. Write; spends Cursor credits once on; idempotent. Confirm with the user before turning it on.",
|
|
864
|
+
scope: "mcp:write",
|
|
865
|
+
hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
|
|
866
|
+
useCase: "Spend my Cursor credits on open bugs before they expire on the 31st."
|
|
867
|
+
},
|
|
852
868
|
{
|
|
853
869
|
name: "list_pending_review_stories",
|
|
854
870
|
title: "List QA stories pending review",
|
package/dist/clients.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ import { FeatureGroup } from './feature-groups.js';
|
|
|
49
49
|
* editor launch. Synced to package.json by `scripts/sync-mcp-pin.mjs` — never
|
|
50
50
|
* hand-edit the version.
|
|
51
51
|
*/
|
|
52
|
-
declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.
|
|
52
|
+
declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.27.0";
|
|
53
53
|
interface StdioConfig {
|
|
54
54
|
command: string;
|
|
55
55
|
args: string[];
|
package/dist/clients.js
CHANGED
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
DEFAULT_FEATURE_GROUPS,
|
|
6
6
|
appendFeaturesToUrl,
|
|
7
7
|
featuresQueryString
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-DJCVJ3YZ.js";
|
|
9
9
|
|
|
10
10
|
// src/clients.ts
|
|
11
|
-
var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.
|
|
11
|
+
var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.27.0";
|
|
12
12
|
var PIN_SPEC_RE = /^@mushi-mushi\/mcp@\d+\.\d+\.\d+$/;
|
|
13
13
|
function pinOf(pinSpec) {
|
|
14
14
|
return pinSpec && PIN_SPEC_RE.test(pinSpec) ? pinSpec : MCP_PIN_SPEC;
|
package/dist/feature-groups.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -841,6 +841,22 @@ var TDD_TOOL_CATALOG = [
|
|
|
841
841
|
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
842
842
|
useCase: "Remove a rotated or compromised provider key from the runtime pool."
|
|
843
843
|
},
|
|
844
|
+
{
|
|
845
|
+
name: "get_spend_down_status",
|
|
846
|
+
title: "Spend-down status of Cursor keys",
|
|
847
|
+
description: "For each Cursor key this project can use, show spend-down mode (ADR 0028): whether it is on, when the credits expire, the window state (off | not_started | active | expired | key_unusable), fixes started today out of the daily limit, the apps the key pays for, and what the last worker tick did. Returns { keys: [{ id, label, keyHint, scope, enabled, creditsExpireAt, model, dailyLimit, windowDays, state, startsAt, dispatchedToday, remainingToday, projects, lastRunAt, lastSummary }] }. Read-only. Use to see whether expiring Cursor credits are being used; use set_byok_spend_down to change it.",
|
|
848
|
+
scope: "mcp:read",
|
|
849
|
+
hints: { readOnly: true, idempotent: true, openWorld: false },
|
|
850
|
+
useCase: "Are my expiring Cursor credits being spent on fixes?"
|
|
851
|
+
},
|
|
852
|
+
{
|
|
853
|
+
name: "set_byok_spend_down",
|
|
854
|
+
title: "Set spend-down for a Cursor key",
|
|
855
|
+
description: "Turn spend-down mode on or off for one of this project's own Cursor keys and set when its credits expire (YYYY-MM-DD), the Cursor model (id?param=value), fixes per day (1-200) and how many days before expiry to start (1-90). While on, Mushi dispatches the project's best open reports to Cursor on its own, inside the auto-fix caps; each fix opens a draft PR. A key shared by the organization can only be changed by an org owner or admin in the console. Write; spends Cursor credits once on; idempotent. Confirm with the user before turning it on.",
|
|
856
|
+
scope: "mcp:write",
|
|
857
|
+
hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
|
|
858
|
+
useCase: "Spend my Cursor credits on open bugs before they expire on the 31st."
|
|
859
|
+
},
|
|
844
860
|
{
|
|
845
861
|
name: "list_pending_review_stories",
|
|
846
862
|
title: "List QA stories pending review",
|
|
@@ -1325,6 +1341,8 @@ var TOOL_FEATURE_MAP = {
|
|
|
1325
1341
|
add_byok_key: "setup",
|
|
1326
1342
|
test_byok_key: "setup",
|
|
1327
1343
|
remove_byok_key: "setup",
|
|
1344
|
+
get_spend_down_status: "setup",
|
|
1345
|
+
set_byok_spend_down: "setup",
|
|
1328
1346
|
// audit
|
|
1329
1347
|
run_fullstack_audit: "audit",
|
|
1330
1348
|
get_backend_health: "audit",
|
|
@@ -1539,7 +1557,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1539
1557
|
route: "/admin/dashboard",
|
|
1540
1558
|
markdown: "admin/dashboard.md",
|
|
1541
1559
|
keywords: ["admin", "dashboard"],
|
|
1542
|
-
headings: ["What to look for first", "Flow canvas
|
|
1560
|
+
headings: ["What to look for first", "Flow canvas", "KPI tiles (14-day window)", "Charts row (14 days)", "Triage queue", "Insights row", "Common tasks", "Morning check (2 minutes)"],
|
|
1543
1561
|
excerpt: "The Mushi dashboard answers whether anything broke since your last release \u2014 new reports, overnight fix runs and pipeline health on one screen."
|
|
1544
1562
|
},
|
|
1545
1563
|
{
|
|
@@ -6770,6 +6788,45 @@ Be specific. No generic advice.`
|
|
|
6770
6788
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
6771
6789
|
}
|
|
6772
6790
|
);
|
|
6791
|
+
server.registerTool(
|
|
6792
|
+
"get_spend_down_status",
|
|
6793
|
+
{
|
|
6794
|
+
title: titleOf("get_spend_down_status", TDD_TOOL_CATALOG),
|
|
6795
|
+
description: descOf("get_spend_down_status", TDD_TOOL_CATALOG),
|
|
6796
|
+
annotations: annotationsFor("get_spend_down_status", TDD_TOOL_CATALOG),
|
|
6797
|
+
inputSchema: z.object({
|
|
6798
|
+
projectId: z.string().describe("Project id")
|
|
6799
|
+
})
|
|
6800
|
+
},
|
|
6801
|
+
async ({ projectId: projectId2 }) => {
|
|
6802
|
+
const data = await apiCall(`/v1/admin/byok/spend-down?project_id=${encodeURIComponent(projectId2)}`);
|
|
6803
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
6804
|
+
}
|
|
6805
|
+
);
|
|
6806
|
+
server.registerTool(
|
|
6807
|
+
"set_byok_spend_down",
|
|
6808
|
+
{
|
|
6809
|
+
title: titleOf("set_byok_spend_down", TDD_TOOL_CATALOG),
|
|
6810
|
+
description: descOf("set_byok_spend_down", TDD_TOOL_CATALOG),
|
|
6811
|
+
annotations: annotationsFor("set_byok_spend_down", TDD_TOOL_CATALOG),
|
|
6812
|
+
inputSchema: z.object({
|
|
6813
|
+
projectId: z.string().describe("Project id"),
|
|
6814
|
+
keyId: z.string().uuid().describe("Cursor key id from get_spend_down_status"),
|
|
6815
|
+
enabled: z.boolean().optional().describe("Turn spend-down on or off"),
|
|
6816
|
+
creditsExpireAt: z.string().optional().describe("When the credits expire, YYYY-MM-DD"),
|
|
6817
|
+
model: z.string().max(300).optional().describe("Cursor model spec, e.g. grok-4.7?reasoning_effort=xhigh&context=500k"),
|
|
6818
|
+
dailyLimit: z.number().int().min(1).max(200).optional().describe("Fixes per day across the apps this key pays for"),
|
|
6819
|
+
windowDays: z.number().int().min(1).max(90).optional().describe("Start this many days before the credits expire")
|
|
6820
|
+
})
|
|
6821
|
+
},
|
|
6822
|
+
async ({ keyId, enabled, creditsExpireAt, model, dailyLimit, windowDays }) => {
|
|
6823
|
+
const data = await apiCall(`/v1/admin/byok/keys/${encodeURIComponent(keyId)}/spend-down`, {
|
|
6824
|
+
method: "PATCH",
|
|
6825
|
+
body: JSON.stringify({ enabled, creditsExpireAt, model, dailyLimit, windowDays })
|
|
6826
|
+
});
|
|
6827
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
6828
|
+
}
|
|
6829
|
+
);
|
|
6773
6830
|
server.registerTool(
|
|
6774
6831
|
"list_pending_review_stories",
|
|
6775
6832
|
{
|
package/dist/server.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
TDD_TOOL_CATALOG,
|
|
5
5
|
TOOL_CATALOG,
|
|
6
6
|
routeUseMushiIntent
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-VU2YQ6QF.js";
|
|
8
8
|
import {
|
|
9
9
|
MUSHI_SERVER_METADATA
|
|
10
10
|
} from "./chunk-FJRPC4VR.js";
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
DEPRECATED_TOOL_ALIASES,
|
|
13
13
|
TOOL_FEATURE_MAP,
|
|
14
14
|
toolMatchesFeatures
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-DJCVJ3YZ.js";
|
|
16
16
|
|
|
17
17
|
// src/server.ts
|
|
18
18
|
import { AsyncLocalStorage } from "async_hooks";
|
|
@@ -149,7 +149,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
149
149
|
route: "/admin/dashboard",
|
|
150
150
|
markdown: "admin/dashboard.md",
|
|
151
151
|
keywords: ["admin", "dashboard"],
|
|
152
|
-
headings: ["What to look for first", "Flow canvas
|
|
152
|
+
headings: ["What to look for first", "Flow canvas", "KPI tiles (14-day window)", "Charts row (14 days)", "Triage queue", "Insights row", "Common tasks", "Morning check (2 minutes)"],
|
|
153
153
|
excerpt: "The Mushi dashboard answers whether anything broke since your last release \u2014 new reports, overnight fix runs and pipeline health on one screen."
|
|
154
154
|
},
|
|
155
155
|
{
|
|
@@ -5446,6 +5446,45 @@ Be specific. No generic advice.`
|
|
|
5446
5446
|
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
5447
5447
|
}
|
|
5448
5448
|
);
|
|
5449
|
+
server.registerTool(
|
|
5450
|
+
"get_spend_down_status",
|
|
5451
|
+
{
|
|
5452
|
+
title: titleOf("get_spend_down_status", TDD_TOOL_CATALOG),
|
|
5453
|
+
description: descOf("get_spend_down_status", TDD_TOOL_CATALOG),
|
|
5454
|
+
annotations: annotationsFor("get_spend_down_status", TDD_TOOL_CATALOG),
|
|
5455
|
+
inputSchema: z.object({
|
|
5456
|
+
projectId: z.string().describe("Project id")
|
|
5457
|
+
})
|
|
5458
|
+
},
|
|
5459
|
+
async ({ projectId: projectId2 }) => {
|
|
5460
|
+
const data = await apiCall(`/v1/admin/byok/spend-down?project_id=${encodeURIComponent(projectId2)}`);
|
|
5461
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
5462
|
+
}
|
|
5463
|
+
);
|
|
5464
|
+
server.registerTool(
|
|
5465
|
+
"set_byok_spend_down",
|
|
5466
|
+
{
|
|
5467
|
+
title: titleOf("set_byok_spend_down", TDD_TOOL_CATALOG),
|
|
5468
|
+
description: descOf("set_byok_spend_down", TDD_TOOL_CATALOG),
|
|
5469
|
+
annotations: annotationsFor("set_byok_spend_down", TDD_TOOL_CATALOG),
|
|
5470
|
+
inputSchema: z.object({
|
|
5471
|
+
projectId: z.string().describe("Project id"),
|
|
5472
|
+
keyId: z.string().uuid().describe("Cursor key id from get_spend_down_status"),
|
|
5473
|
+
enabled: z.boolean().optional().describe("Turn spend-down on or off"),
|
|
5474
|
+
creditsExpireAt: z.string().optional().describe("When the credits expire, YYYY-MM-DD"),
|
|
5475
|
+
model: z.string().max(300).optional().describe("Cursor model spec, e.g. grok-4.7?reasoning_effort=xhigh&context=500k"),
|
|
5476
|
+
dailyLimit: z.number().int().min(1).max(200).optional().describe("Fixes per day across the apps this key pays for"),
|
|
5477
|
+
windowDays: z.number().int().min(1).max(90).optional().describe("Start this many days before the credits expire")
|
|
5478
|
+
})
|
|
5479
|
+
},
|
|
5480
|
+
async ({ keyId, enabled, creditsExpireAt, model, dailyLimit, windowDays }) => {
|
|
5481
|
+
const data = await apiCall(`/v1/admin/byok/keys/${encodeURIComponent(keyId)}/spend-down`, {
|
|
5482
|
+
method: "PATCH",
|
|
5483
|
+
body: JSON.stringify({ enabled, creditsExpireAt, model, dailyLimit, windowDays })
|
|
5484
|
+
});
|
|
5485
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
5486
|
+
}
|
|
5487
|
+
);
|
|
5449
5488
|
server.registerTool(
|
|
5450
5489
|
"list_pending_review_stories",
|
|
5451
5490
|
{
|
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.
|
|
4
|
+
"version": "0.27.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "MCP server for Cursor, Claude Code and Copilot. The bug mediator for AI-built apps: plain-English diagnosis + a ready fix, in your editor.",
|
|
7
7
|
"type": "module",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@modelcontextprotocol/core": "^2.0.0",
|
|
46
46
|
"@modelcontextprotocol/server": "^2.0.0",
|
|
47
47
|
"zod": "^4.4.3",
|
|
48
|
-
"@mushi-mushi/core": "^1.33.
|
|
48
|
+
"@mushi-mushi/core": "^1.33.1"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"@sentry/node": "^10.57.0"
|