@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 +1 -1
- package/dist/clients.d.ts +21 -2
- package/dist/clients.js +35 -1
- package/dist/index.js +20 -8
- package/dist/server.js +20 -8
- 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@
|
|
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.
|
|
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.
|
|
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"
|
|
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
|
|
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: {
|
|
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"
|
|
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
|
|
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: {
|
|
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.
|
|
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.
|
|
48
|
+
"@mushi-mushi/core": "^1.32.3"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"@sentry/node": "^10.57.0"
|