@mushi-mushi/mcp 0.24.6 → 0.26.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@latest"],
32
+ "args": ["-y", "@mushi-mushi/mcp@0.26.0"],
33
33
  "env": {
34
34
  "MUSHI_API_KEY": "mushi_xxxxxxxxxxxxxxxxxxxx",
35
35
  "MUSHI_PROJECT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
package/dist/clients.d.ts CHANGED
@@ -31,6 +31,9 @@ import { FeatureGroup } from './feature-groups.js';
31
31
  * - claude-desktop — copy-config to claude_desktop_config.json
32
32
  * - zed — copy-config to ~/.config/zed/settings.json
33
33
  * - any — hosted Streamable HTTP URL + Bearer key
34
+ * - buildOAuthInstall() — keyless variant of cursor / vscode(-insiders) /
35
+ * claude-code / windsurf / any for public pages
36
+ * (URL only, the client's OAuth sign-in runs)
34
37
  *
35
38
  * NOTES:
36
39
  * - All builders are pure functions — no side-effects, no DOM, no React.
@@ -46,7 +49,7 @@ import { FeatureGroup } from './feature-groups.js';
46
49
  * editor launch. Synced to package.json by `scripts/sync-mcp-pin.mjs` — never
47
50
  * hand-edit the version.
48
51
  */
49
- declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.6";
52
+ declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.26.0";
50
53
  interface StdioConfig {
51
54
  command: string;
52
55
  args: string[];
@@ -123,7 +126,23 @@ declare function projectServerName(projectId: string, projectName: string): stri
123
126
  declare function buildStdioConfigObj(projectId: string | undefined, apiKey: string, apiEndpoint: string, features?: readonly string[], pinSpec?: string): StdioConfig;
124
127
  declare function buildHttpConfigObj(projectId: string | undefined, apiKey: string, mcpHttpUrl: string, features?: readonly string[], readOnly?: boolean): HttpConfig;
125
128
  declare const MCP_CLIENTS: McpClientDef[];
129
+ /** Clients with a URL-only (OAuth) install. */
130
+ type McpOAuthClientId = 'cursor' | 'vscode' | 'vscode-insiders' | 'windsurf' | 'claude-code' | 'any';
131
+ declare const MCP_OAUTH_CLIENT_IDS: readonly McpOAuthClientId[];
132
+ /** Server name written into the client's config by an OAuth install. */
133
+ declare const MCP_OAUTH_SERVER_NAME = "mushi";
134
+ interface McpOAuthInstallInput {
135
+ /** Hosted MCP URL that runs the client's own OAuth sign-in. */
136
+ mcpOAuthUrl: string;
137
+ /** Defaults to MCP_OAUTH_SERVER_NAME. */
138
+ serverName?: string;
139
+ }
140
+ /**
141
+ * Keyless install artifact for one client. Nothing it returns carries a key
142
+ * or a header; the client's OAuth sign-in supplies the credential.
143
+ */
144
+ declare function buildOAuthInstall(id: McpOAuthClientId, input: McpOAuthInstallInput): McpBuildResult;
126
145
  /** Look up a client by id — throws if not found. */
127
146
  declare function getMcpClient(id: McpClientId): McpClientDef;
128
147
 
129
- export { MCP_CLIENTS, MCP_PIN_SPEC, type McpBuildInput, type McpBuildResult, type McpClientDef, type McpClientId, type McpInstallMethod, buildHttpConfigObj as buildRawHttpConfig, buildStdioConfigObj as buildRawStdioConfig, getMcpClient, projectServerName };
148
+ export { MCP_CLIENTS, MCP_OAUTH_CLIENT_IDS, MCP_OAUTH_SERVER_NAME, MCP_PIN_SPEC, type McpBuildInput, type McpBuildResult, type McpClientDef, type McpClientId, type McpInstallMethod, type McpOAuthClientId, type McpOAuthInstallInput, buildOAuthInstall, buildHttpConfigObj as buildRawHttpConfig, buildStdioConfigObj as buildRawStdioConfig, getMcpClient, projectServerName };
package/dist/clients.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-F65T4IGT.js";
9
9
 
10
10
  // src/clients.ts
11
- var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.6";
11
+ var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.26.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;
@@ -262,6 +262,37 @@ var MCP_CLIENTS = [
262
262
  }
263
263
  }
264
264
  ];
265
+ var MCP_OAUTH_CLIENT_IDS = [
266
+ "cursor",
267
+ "vscode",
268
+ "vscode-insiders",
269
+ "claude-code",
270
+ "windsurf",
271
+ "any"
272
+ ];
273
+ var MCP_OAUTH_SERVER_NAME = "mushi";
274
+ function buildOAuthInstall(id, input) {
275
+ const name = input.serverName ?? MCP_OAUTH_SERVER_NAME;
276
+ const url = input.mcpOAuthUrl;
277
+ switch (id) {
278
+ case "cursor":
279
+ return { kind: "deeplink", url: encodeCursorDeeplink(name, { url }) };
280
+ case "vscode":
281
+ case "vscode-insiders":
282
+ return { kind: "deeplink", url: `${id}:mcp/install?${encodeURIComponent(JSON.stringify({ name, type: "http", url }))}` };
283
+ case "claude-code":
284
+ return { kind: "command", text: `claude mcp add --transport http ${name} ${url}` };
285
+ case "windsurf":
286
+ return {
287
+ kind: "config",
288
+ filePath: "~/.codeium/windsurf/mcp_config.json",
289
+ // Windsurf reads `serverUrl`, not `url`.
290
+ json: JSON.stringify({ mcpServers: { [name]: { serverUrl: url } } }, null, 2)
291
+ };
292
+ case "any":
293
+ return { kind: "remote-url", url, headerSnippet: "" };
294
+ }
295
+ }
265
296
  function getMcpClient(id) {
266
297
  const client = MCP_CLIENTS.find((c) => c.id === id);
267
298
  if (!client) throw new Error(`Unknown MCP client id: ${id}`);
@@ -269,7 +300,10 @@ function getMcpClient(id) {
269
300
  }
270
301
  export {
271
302
  MCP_CLIENTS,
303
+ MCP_OAUTH_CLIENT_IDS,
304
+ MCP_OAUTH_SERVER_NAME,
272
305
  MCP_PIN_SPEC,
306
+ buildOAuthInstall,
273
307
  buildHttpConfigObj as buildRawHttpConfig,
274
308
  buildStdioConfigObj as buildRawStdioConfig,
275
309
  getMcpClient,
package/dist/index.js CHANGED
@@ -1539,7 +1539,7 @@ var MUSHI_DOCS_INDEX = [
1539
1539
  route: "/admin/dashboard",
1540
1540
  markdown: "admin/dashboard.md",
1541
1541
  keywords: ["admin", "dashboard"],
1542
- 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)"],
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)"],
1543
1543
  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
1544
  },
1545
1545
  {
@@ -1642,13 +1642,13 @@ var MUSHI_DOCS_INDEX = [
1642
1642
  excerpt: "The Integration health page monitors Mushi's LLM pipelines, cron jobs and provider connections so you catch a degraded integration early."
1643
1643
  },
1644
1644
  {
1645
- title: "Action inbox",
1645
+ title: "To-do",
1646
1646
  url: docUrl("/admin/inbox"),
1647
1647
  route: "/admin/inbox",
1648
1648
  markdown: "admin/inbox.md",
1649
- keywords: ["admin", "inbox", "action"],
1649
+ keywords: ["admin", "inbox", "to-do"],
1650
1650
  headings: ["How it works", "Reading an action card", "Cleared stages strip", "Filtering by PDCA phase", "Common tasks", "Morning triage (the fast path)", "Understanding a stage chip colour", "When the Inbox seems wrong"],
1651
- excerpt: "The Action inbox gathers everything in Mushi that needs a human decision \u2014 reports, queue failures, health and drift alerts \u2014 in one list."
1651
+ excerpt: "The To-do list gathers everything in Mushi that needs a human decision \u2014 reports, queue failures, health and drift alerts \u2014 in one list."
1652
1652
  },
1653
1653
  {
1654
1654
  title: "Integrations",
@@ -1674,7 +1674,7 @@ var MUSHI_DOCS_INDEX = [
1674
1674
  route: "/admin/inventory",
1675
1675
  markdown: "admin/inventory.md",
1676
1676
  keywords: ["admin", "inventory", "user", "stories"],
1677
- headings: ["What you see", "Run gates / Run crawler", "SDK-driven discovery", "Surface mode in the graph", "Five gates", "Synthetic monitor", "Spec traceability \u2014 every fix carries the originating Action", "See also"],
1677
+ headings: ["What you see", "Run gates / Run crawler", "SDK-driven discovery", "Surface mode in the graph", "Five gates", "Watch your live site", "Synthetic monitor", "Spec traceability \u2014 every fix carries the originating Action"],
1678
1678
  excerpt: "The User stories page manages your inventory.yaml \u2014 every page, action and story your app should have \u2014 and shows which of them the gates cover."
1679
1679
  },
1680
1680
  {
@@ -2277,7 +2277,7 @@ var MUSHI_DOCS_INDEX = [
2277
2277
  route: "/concepts/trigger-modes",
2278
2278
  markdown: "concepts/trigger-modes.md",
2279
2279
  keywords: ["concepts", "trigger-modes", "trigger", "modes", "where", "report", "button", "lives"],
2280
- headings: ["Choosing a Mode", "Bring Your Own Button", "Smart Hide", "Native SDKs"],
2280
+ headings: ["Choosing a Mode", "Bring Your Own Button", "Staying out of the way", "Smart Hide", "Native SDKs"],
2281
2281
  excerpt: "Choose where Mushi's bug-report button lives \u2014 corner stamp, edge tab, banner, your own button via attach, or fully manual \u2014 on web and mobile."
2282
2282
  },
2283
2283
  {
@@ -7495,6 +7495,11 @@ Be specific. No generic advice.`
7495
7495
  });
7496
7496
  }
7497
7497
  {
7498
+ const ALIAS_DEFAULT_ARGS = {
7499
+ setup_check: { mode: "dispatch" },
7500
+ ingest_setup_check: { mode: "ingest" },
7501
+ diagnose_connection: { mode: "full" }
7502
+ };
7498
7503
  const llAliasServer = server.server;
7499
7504
  const innerHandler = llAliasServer?._requestHandlers?.get("tools/call");
7500
7505
  if (typeof innerHandler === "function") {
@@ -7503,9 +7508,15 @@ Be specific. No generic advice.`
7503
7508
  const originalName = req?.params?.name;
7504
7509
  const canonicalName = originalName ? DEPRECATED_TOOL_ALIASES[originalName] : void 0;
7505
7510
  if (canonicalName) {
7511
+ const defaults = ALIAS_DEFAULT_ARGS[originalName];
7512
+ const callerArgs = req?.params?.arguments && typeof req.params.arguments === "object" ? req.params.arguments : {};
7506
7513
  const rewritten = {
7507
7514
  ...args[0],
7508
- params: { ...req?.params ?? {}, name: canonicalName }
7515
+ params: {
7516
+ ...req?.params ?? {},
7517
+ name: canonicalName,
7518
+ ...defaults ? { arguments: { ...defaults, ...callerArgs } } : {}
7519
+ }
7509
7520
  };
7510
7521
  const result = await innerHandler(rewritten, ...args.slice(1));
7511
7522
  if (result != null && typeof result === "object" && "content" in result && Array.isArray(result.content)) {
@@ -7513,11 +7524,11 @@ Be specific. No generic advice.`
7513
7524
  return {
7514
7525
  ...r,
7515
7526
  content: [
7527
+ ...r.content,
7516
7528
  {
7517
7529
  type: "text",
7518
7530
  text: `\u26A0\uFE0F Deprecated: \`${originalName}\` was renamed to \`${canonicalName}\`. Update your agent config \u2014 this alias will be removed in the next release.`
7519
- },
7520
- ...r.content
7531
+ }
7521
7532
  ]
7522
7533
  };
7523
7534
  }
package/dist/server.js CHANGED
@@ -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", "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 (Beginner mode)", "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
  {
@@ -252,13 +252,13 @@ var MUSHI_DOCS_INDEX = [
252
252
  excerpt: "The Integration health page monitors Mushi's LLM pipelines, cron jobs and provider connections so you catch a degraded integration early."
253
253
  },
254
254
  {
255
- title: "Action inbox",
255
+ title: "To-do",
256
256
  url: docUrl("/admin/inbox"),
257
257
  route: "/admin/inbox",
258
258
  markdown: "admin/inbox.md",
259
- keywords: ["admin", "inbox", "action"],
259
+ keywords: ["admin", "inbox", "to-do"],
260
260
  headings: ["How it works", "Reading an action card", "Cleared stages strip", "Filtering by PDCA phase", "Common tasks", "Morning triage (the fast path)", "Understanding a stage chip colour", "When the Inbox seems wrong"],
261
- excerpt: "The Action inbox gathers everything in Mushi that needs a human decision \u2014 reports, queue failures, health and drift alerts \u2014 in one list."
261
+ excerpt: "The To-do list gathers everything in Mushi that needs a human decision \u2014 reports, queue failures, health and drift alerts \u2014 in one list."
262
262
  },
263
263
  {
264
264
  title: "Integrations",
@@ -284,7 +284,7 @@ var MUSHI_DOCS_INDEX = [
284
284
  route: "/admin/inventory",
285
285
  markdown: "admin/inventory.md",
286
286
  keywords: ["admin", "inventory", "user", "stories"],
287
- headings: ["What you see", "Run gates / Run crawler", "SDK-driven discovery", "Surface mode in the graph", "Five gates", "Synthetic monitor", "Spec traceability \u2014 every fix carries the originating Action", "See also"],
287
+ headings: ["What you see", "Run gates / Run crawler", "SDK-driven discovery", "Surface mode in the graph", "Five gates", "Watch your live site", "Synthetic monitor", "Spec traceability \u2014 every fix carries the originating Action"],
288
288
  excerpt: "The User stories page manages your inventory.yaml \u2014 every page, action and story your app should have \u2014 and shows which of them the gates cover."
289
289
  },
290
290
  {
@@ -887,7 +887,7 @@ var MUSHI_DOCS_INDEX = [
887
887
  route: "/concepts/trigger-modes",
888
888
  markdown: "concepts/trigger-modes.md",
889
889
  keywords: ["concepts", "trigger-modes", "trigger", "modes", "where", "report", "button", "lives"],
890
- headings: ["Choosing a Mode", "Bring Your Own Button", "Smart Hide", "Native SDKs"],
890
+ headings: ["Choosing a Mode", "Bring Your Own Button", "Staying out of the way", "Smart Hide", "Native SDKs"],
891
891
  excerpt: "Choose where Mushi's bug-report button lives \u2014 corner stamp, edge tab, banner, your own button via attach, or fully manual \u2014 on web and mobile."
892
892
  },
893
893
  {
@@ -6171,6 +6171,11 @@ Be specific. No generic advice.`
6171
6171
  });
6172
6172
  }
6173
6173
  {
6174
+ const ALIAS_DEFAULT_ARGS = {
6175
+ setup_check: { mode: "dispatch" },
6176
+ ingest_setup_check: { mode: "ingest" },
6177
+ diagnose_connection: { mode: "full" }
6178
+ };
6174
6179
  const llAliasServer = server.server;
6175
6180
  const innerHandler = llAliasServer?._requestHandlers?.get("tools/call");
6176
6181
  if (typeof innerHandler === "function") {
@@ -6179,9 +6184,15 @@ Be specific. No generic advice.`
6179
6184
  const originalName = req?.params?.name;
6180
6185
  const canonicalName = originalName ? DEPRECATED_TOOL_ALIASES[originalName] : void 0;
6181
6186
  if (canonicalName) {
6187
+ const defaults = ALIAS_DEFAULT_ARGS[originalName];
6188
+ const callerArgs = req?.params?.arguments && typeof req.params.arguments === "object" ? req.params.arguments : {};
6182
6189
  const rewritten = {
6183
6190
  ...args[0],
6184
- params: { ...req?.params ?? {}, name: canonicalName }
6191
+ params: {
6192
+ ...req?.params ?? {},
6193
+ name: canonicalName,
6194
+ ...defaults ? { arguments: { ...defaults, ...callerArgs } } : {}
6195
+ }
6185
6196
  };
6186
6197
  const result = await innerHandler(rewritten, ...args.slice(1));
6187
6198
  if (result != null && typeof result === "object" && "content" in result && Array.isArray(result.content)) {
@@ -6189,11 +6200,11 @@ Be specific. No generic advice.`
6189
6200
  return {
6190
6201
  ...r,
6191
6202
  content: [
6203
+ ...r.content,
6192
6204
  {
6193
6205
  type: "text",
6194
6206
  text: `\u26A0\uFE0F Deprecated: \`${originalName}\` was renamed to \`${canonicalName}\`. Update your agent config \u2014 this alias will be removed in the next release.`
6195
- },
6196
- ...r.content
6207
+ }
6197
6208
  ]
6198
6209
  };
6199
6210
  }
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.24.6",
4
+ "version": "0.26.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.32.2"
48
+ "@mushi-mushi/core": "^1.33.0"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@sentry/node": "^10.57.0"
@@ -108,7 +108,7 @@
108
108
  "node": ">=20.19.0"
109
109
  },
110
110
  "scripts": {
111
- "build": "tsup",
111
+ "build": "pnpm run clean:types && tsup",
112
112
  "clean:types": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
113
113
  "dev": "tsup --watch",
114
114
  "lint": "eslint src/",