@mushi-mushi/mcp 0.24.6 → 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.6";
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.6";
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
@@ -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
  {
@@ -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
@@ -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
  {
@@ -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.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.2"
48
+ "@mushi-mushi/core": "^1.32.3"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@sentry/node": "^10.57.0"