@mushi-mushi/mcp 0.24.5 → 0.25.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.25.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.5";
52
+ declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.25.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.5";
11
+ var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.25.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
@@ -1476,7 +1476,7 @@ var MUSHI_DOCS_INDEX = [
1476
1476
  route: "/admin/billing",
1477
1477
  markdown: "admin/billing.md",
1478
1478
  keywords: ["admin", "billing"],
1479
- headings: ["Reading your usage card", "Usage breakdown", "Predictability controls", "Upgrading your plan", "Managing payment and invoices", "CLI parity", "Related docs"],
1479
+ headings: ["Reading your usage card", "Usage breakdown", "Predictability controls", "Upgrading your plan", "Changing plan", "Managing payment and invoices", "CLI parity", "Related docs"],
1480
1480
  excerpt: "The Billing page shows your diagnosis quota, usage alerts at 50% and 80%, your projected bill, and spend caps for your Mushi plan."
1481
1481
  },
1482
1482
  {
@@ -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
  {
@@ -1854,7 +1854,7 @@ var MUSHI_DOCS_INDEX = [
1854
1854
  route: "/admin/research",
1855
1855
  markdown: "admin/research.md",
1856
1856
  keywords: ["admin", "research"],
1857
- headings: ["What it's for", "Running a search", "Saving results", "Prerequisites", "Related pages"],
1857
+ headings: ["What it's for", "Running a search", "Saving results", "Automatic results on error reports", "Prerequisites", "Related pages"],
1858
1858
  excerpt: "The Research page runs a Firecrawl web search scoped to your tech stack and returns summarised answers with links to their sources."
1859
1859
  },
1860
1860
  {
@@ -3141,7 +3141,7 @@ var MUSHI_DOCS_INDEX = [
3141
3141
  route: "/security/byok",
3142
3142
  markdown: "security/byok.md",
3143
3143
  keywords: ["security", "byok", "bring-your-own-key"],
3144
- headings: ["Setup", "What uses the key", "OpenRouter", "Audit trail", "Rotation", "Langfuse trace attribution"],
3144
+ headings: ["Setup", "One key for every app", "What uses the key", "OpenRouter", "Audit trail", "Rotation", "Langfuse trace attribution"],
3145
3145
  excerpt: "Use your own Anthropic, OpenAI or OpenRouter key for a Mushi project, so every diagnosis, fix and grading run bills to your provider account."
3146
3146
  },
3147
3147
  {
@@ -5305,7 +5305,8 @@ function createMushiServer(config) {
5305
5305
  );
5306
5306
  const latest = data.latest ?? data.version;
5307
5307
  const current = args.current;
5308
- const outdated = current && latest ? current !== latest : void 0;
5308
+ const pinned = current?.trim().replace(/^[\^~>=<v\s]+/, "");
5309
+ const outdated = pinned && latest ? pinned !== latest : void 0;
5309
5310
  return jsonResult({
5310
5311
  package: data.package ?? pkg,
5311
5312
  latest,
@@ -7494,6 +7495,11 @@ Be specific. No generic advice.`
7494
7495
  });
7495
7496
  }
7496
7497
  {
7498
+ const ALIAS_DEFAULT_ARGS = {
7499
+ setup_check: { mode: "dispatch" },
7500
+ ingest_setup_check: { mode: "ingest" },
7501
+ diagnose_connection: { mode: "full" }
7502
+ };
7497
7503
  const llAliasServer = server.server;
7498
7504
  const innerHandler = llAliasServer?._requestHandlers?.get("tools/call");
7499
7505
  if (typeof innerHandler === "function") {
@@ -7502,9 +7508,15 @@ Be specific. No generic advice.`
7502
7508
  const originalName = req?.params?.name;
7503
7509
  const canonicalName = originalName ? DEPRECATED_TOOL_ALIASES[originalName] : void 0;
7504
7510
  if (canonicalName) {
7511
+ const defaults = ALIAS_DEFAULT_ARGS[originalName];
7512
+ const callerArgs = req?.params?.arguments && typeof req.params.arguments === "object" ? req.params.arguments : {};
7505
7513
  const rewritten = {
7506
7514
  ...args[0],
7507
- params: { ...req?.params ?? {}, name: canonicalName }
7515
+ params: {
7516
+ ...req?.params ?? {},
7517
+ name: canonicalName,
7518
+ ...defaults ? { arguments: { ...defaults, ...callerArgs } } : {}
7519
+ }
7508
7520
  };
7509
7521
  const result = await innerHandler(rewritten, ...args.slice(1));
7510
7522
  if (result != null && typeof result === "object" && "content" in result && Array.isArray(result.content)) {
@@ -7512,11 +7524,11 @@ Be specific. No generic advice.`
7512
7524
  return {
7513
7525
  ...r,
7514
7526
  content: [
7527
+ ...r.content,
7515
7528
  {
7516
7529
  type: "text",
7517
7530
  text: `\u26A0\uFE0F Deprecated: \`${originalName}\` was renamed to \`${canonicalName}\`. Update your agent config \u2014 this alias will be removed in the next release.`
7518
- },
7519
- ...r.content
7531
+ }
7520
7532
  ]
7521
7533
  };
7522
7534
  }
package/dist/server.js CHANGED
@@ -86,7 +86,7 @@ var MUSHI_DOCS_INDEX = [
86
86
  route: "/admin/billing",
87
87
  markdown: "admin/billing.md",
88
88
  keywords: ["admin", "billing"],
89
- headings: ["Reading your usage card", "Usage breakdown", "Predictability controls", "Upgrading your plan", "Managing payment and invoices", "CLI parity", "Related docs"],
89
+ headings: ["Reading your usage card", "Usage breakdown", "Predictability controls", "Upgrading your plan", "Changing plan", "Managing payment and invoices", "CLI parity", "Related docs"],
90
90
  excerpt: "The Billing page shows your diagnosis quota, usage alerts at 50% and 80%, your projected bill, and spend caps for your Mushi plan."
91
91
  },
92
92
  {
@@ -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
  {
@@ -464,7 +464,7 @@ var MUSHI_DOCS_INDEX = [
464
464
  route: "/admin/research",
465
465
  markdown: "admin/research.md",
466
466
  keywords: ["admin", "research"],
467
- headings: ["What it's for", "Running a search", "Saving results", "Prerequisites", "Related pages"],
467
+ headings: ["What it's for", "Running a search", "Saving results", "Automatic results on error reports", "Prerequisites", "Related pages"],
468
468
  excerpt: "The Research page runs a Firecrawl web search scoped to your tech stack and returns summarised answers with links to their sources."
469
469
  },
470
470
  {
@@ -1751,7 +1751,7 @@ var MUSHI_DOCS_INDEX = [
1751
1751
  route: "/security/byok",
1752
1752
  markdown: "security/byok.md",
1753
1753
  keywords: ["security", "byok", "bring-your-own-key"],
1754
- headings: ["Setup", "What uses the key", "OpenRouter", "Audit trail", "Rotation", "Langfuse trace attribution"],
1754
+ headings: ["Setup", "One key for every app", "What uses the key", "OpenRouter", "Audit trail", "Rotation", "Langfuse trace attribution"],
1755
1755
  excerpt: "Use your own Anthropic, OpenAI or OpenRouter key for a Mushi project, so every diagnosis, fix and grading run bills to your provider account."
1756
1756
  },
1757
1757
  {
@@ -3981,7 +3981,8 @@ function createMushiServer(config) {
3981
3981
  );
3982
3982
  const latest = data.latest ?? data.version;
3983
3983
  const current = args.current;
3984
- const outdated = current && latest ? current !== latest : void 0;
3984
+ const pinned = current?.trim().replace(/^[\^~>=<v\s]+/, "");
3985
+ const outdated = pinned && latest ? pinned !== latest : void 0;
3985
3986
  return jsonResult({
3986
3987
  package: data.package ?? pkg,
3987
3988
  latest,
@@ -6170,6 +6171,11 @@ Be specific. No generic advice.`
6170
6171
  });
6171
6172
  }
6172
6173
  {
6174
+ const ALIAS_DEFAULT_ARGS = {
6175
+ setup_check: { mode: "dispatch" },
6176
+ ingest_setup_check: { mode: "ingest" },
6177
+ diagnose_connection: { mode: "full" }
6178
+ };
6173
6179
  const llAliasServer = server.server;
6174
6180
  const innerHandler = llAliasServer?._requestHandlers?.get("tools/call");
6175
6181
  if (typeof innerHandler === "function") {
@@ -6178,9 +6184,15 @@ Be specific. No generic advice.`
6178
6184
  const originalName = req?.params?.name;
6179
6185
  const canonicalName = originalName ? DEPRECATED_TOOL_ALIASES[originalName] : void 0;
6180
6186
  if (canonicalName) {
6187
+ const defaults = ALIAS_DEFAULT_ARGS[originalName];
6188
+ const callerArgs = req?.params?.arguments && typeof req.params.arguments === "object" ? req.params.arguments : {};
6181
6189
  const rewritten = {
6182
6190
  ...args[0],
6183
- params: { ...req?.params ?? {}, name: canonicalName }
6191
+ params: {
6192
+ ...req?.params ?? {},
6193
+ name: canonicalName,
6194
+ ...defaults ? { arguments: { ...defaults, ...callerArgs } } : {}
6195
+ }
6184
6196
  };
6185
6197
  const result = await innerHandler(rewritten, ...args.slice(1));
6186
6198
  if (result != null && typeof result === "object" && "content" in result && Array.isArray(result.content)) {
@@ -6188,11 +6200,11 @@ Be specific. No generic advice.`
6188
6200
  return {
6189
6201
  ...r,
6190
6202
  content: [
6203
+ ...r.content,
6191
6204
  {
6192
6205
  type: "text",
6193
6206
  text: `\u26A0\uFE0F Deprecated: \`${originalName}\` was renamed to \`${canonicalName}\`. Update your agent config \u2014 this alias will be removed in the next release.`
6194
- },
6195
- ...r.content
6207
+ }
6196
6208
  ]
6197
6209
  };
6198
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.5",
4
+ "version": "0.25.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.0"
48
+ "@mushi-mushi/core": "^1.32.3"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@sentry/node": "^10.57.0"