@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 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.26.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 117 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).
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
@@ -8,7 +8,7 @@ import {
8
8
  TOOL_CATALOG,
9
9
  USE_MUSHI_INTENTS,
10
10
  routeUseMushiIntent
11
- } from "./chunk-V3M4GZBV.js";
11
+ } from "./chunk-VU2YQ6QF.js";
12
12
  export {
13
13
  ALL_SCOPES,
14
14
  CODEBASE_TOOL_CATALOG,
@@ -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.26.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-F65T4IGT.js";
8
+ } from "./chunk-DJCVJ3YZ.js";
9
9
 
10
10
  // src/clients.ts
11
- var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.26.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;
@@ -9,7 +9,7 @@ import {
9
9
  parseFeaturesCsv,
10
10
  parseFeaturesParam,
11
11
  toolMatchesFeatures
12
- } from "./chunk-F65T4IGT.js";
12
+ } from "./chunk-DJCVJ3YZ.js";
13
13
  export {
14
14
  ALL_FEATURE_GROUPS,
15
15
  DEFAULT_FEATURE_GROUPS,
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 (Beginner mode)", "KPI tiles (14-day window)", "Charts row (14 days)", "Triage queue", "Insights row", "Common tasks", "Morning check (2 minutes)"],
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-V3M4GZBV.js";
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-F65T4IGT.js";
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 (Beginner mode)", "KPI tiles (14-day window)", "Charts row (14 days)", "Triage queue", "Insights row", "Common tasks", "Morning check (2 minutes)"],
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.26.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.0"
48
+ "@mushi-mushi/core": "^1.33.1"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@sentry/node": "^10.57.0"