@mushi-mushi/mcp 0.20.0 → 0.20.2
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 +3 -3
- package/dist/catalog.js +1 -1
- package/dist/{chunk-OZJEY3QR.js → chunk-RVZIKP4X.js} +43 -18
- package/dist/{chunk-VBXXUK5G.js → chunk-ZSVRLSW5.js} +4 -2
- package/dist/clients.d.ts +1 -1
- package/dist/clients.js +2 -2
- package/dist/feature-groups.js +1 -1
- package/dist/index.js +856 -253
- package/dist/server.d.ts +9 -1
- package/dist/server.js +715 -222
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -146,7 +146,7 @@ The Mushi backend now exposes the same tool catalog over the **Streamable HTTP**
|
|
|
146
146
|
|
|
147
147
|
### Feature groups (`?features=` / `MUSHI_FEATURES`)
|
|
148
148
|
|
|
149
|
-
Full catalog is **
|
|
149
|
+
Full catalog is **72 tools** (stdio / `MUSHI_FEATURES=all`). The hosted HTTP
|
|
150
150
|
endpoint exposes a leaner subset filtered by feature groups (see
|
|
151
151
|
`mcp-hosted-tool-manifest.json`). New installs now default to the lean
|
|
152
152
|
`triage,fixes,inventory,setup,docs` set automatically (stdio: when
|
|
@@ -390,7 +390,7 @@ Spawns `dist/index.js` with a dummy unreachable endpoint and confirms it adverti
|
|
|
390
390
|
pnpm --filter @mushi-mushi/mcp build
|
|
391
391
|
pnpm --filter @mushi-mushi/mcp test:smoke
|
|
392
392
|
# OK; prints live tool/resource/prompt counts from the catalog
|
|
393
|
-
# (see packages/mcp/src/catalog.ts — currently
|
|
393
|
+
# (see packages/mcp/src/catalog.ts — currently 72 tools / 8 resources / 4 prompts)
|
|
394
394
|
```
|
|
395
395
|
|
|
396
396
|
### Layer 3; Full localhost E2E (real binary + real backend behaviour)
|
|
@@ -484,4 +484,4 @@ MIT
|
|
|
484
484
|
<!-- mushi-readme-stats-footer -->
|
|
485
485
|
---
|
|
486
486
|
|
|
487
|
-
<sub>Monorepo scale (July 2026): 55 edge functions ·
|
|
487
|
+
<sub>Monorepo scale (July 2026): 55 edge functions · 336 SQL migrations · 13 outbound plugins · 11 inbound adapters · 19 pipeline agents. Canonical counts: <a href="https://github.com/kensaurus/mushi-mushi/blob/master/docs/stats.md">docs/stats.md</a> · <code>pnpm docs-stats</code></sub>
|
package/dist/catalog.js
CHANGED
|
@@ -160,7 +160,7 @@ var TOOL_CATALOG = [
|
|
|
160
160
|
{
|
|
161
161
|
name: "dispatch_fix",
|
|
162
162
|
title: "Dispatch Mushi fix agent",
|
|
163
|
-
description: 'Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns {
|
|
163
|
+
description: 'Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely \u2014 without it each call starts a new attempt. Report must be classified \u2014 run triage_issue if not.',
|
|
164
164
|
scope: "mcp:write",
|
|
165
165
|
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
166
166
|
useCase: "Let the in-repo agent attempt this fix for me (or: dispatch a Cursor Cloud Agent)."
|
|
@@ -295,6 +295,14 @@ var TOOL_CATALOG = [
|
|
|
295
295
|
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
296
296
|
useCase: "Analyze this bug report end-to-end and tell me what to do."
|
|
297
297
|
},
|
|
298
|
+
{
|
|
299
|
+
name: "triage_next_steps",
|
|
300
|
+
title: "What should I work on now?",
|
|
301
|
+
description: 'Prioritised "do this next" list for the project: blocked auto-fixes first (with the unblock action), then in-flight fixes to shepherd to merge, then user-felt classified reports by severity, with robot/cron chores (dependency bumps) last. Returns { steps: [{ priority, action, reason, tool, args }], summary }. Read-only. Call this first when the user asks "what needs my attention / what should I triage or fix".',
|
|
302
|
+
scope: "mcp:read",
|
|
303
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
304
|
+
useCase: "What should I triage or fix right now?"
|
|
305
|
+
},
|
|
298
306
|
// ── Lessons / evolution loop ─────────────────────────────────────────────
|
|
299
307
|
{
|
|
300
308
|
name: "query_lessons",
|
|
@@ -449,7 +457,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
449
457
|
{
|
|
450
458
|
name: "list_byok_keys",
|
|
451
459
|
title: "List your API key pool",
|
|
452
|
-
description: "List the project's BYOK API keys grouped by provider (anthropic | openai | firecrawl | browserbase | cursor). Returns { keys: [{ id,
|
|
460
|
+
description: "List the project's BYOK API keys grouped by provider (anthropic | openai | firecrawl | browserbase | cursor). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at }] } plus read-only { legacyKeys } metadata for credentials saved before the pooled lifecycle \u2014 never the raw secret. Read-only. Use to see which keys are validated, active, pending, legacy, or rate-limited; use add_byok_key to add one.",
|
|
453
461
|
scope: "mcp:read",
|
|
454
462
|
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
455
463
|
useCase: "Which API keys are active and which are rate-limited?"
|
|
@@ -457,11 +465,27 @@ var TDD_TOOL_CATALOG = [
|
|
|
457
465
|
{
|
|
458
466
|
name: "add_byok_key",
|
|
459
467
|
title: "Add an API key",
|
|
460
|
-
description: "Add a BYOK API key
|
|
468
|
+
description: "Add and immediately validate a BYOK API key for anthropic | openai | firecrawl | browserbase | cursor. The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. Write; NOT idempotent.",
|
|
461
469
|
scope: "mcp:write",
|
|
462
470
|
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
463
471
|
useCase: "Add a backup Anthropic key to the pool."
|
|
464
472
|
},
|
|
473
|
+
{
|
|
474
|
+
name: "test_byok_key",
|
|
475
|
+
title: "Test an API key",
|
|
476
|
+
description: "Re-test one pooled BYOK credential by key id. A successful provider probe activates the key; auth, quota, and network failures keep it out of the runtime pool. Returns the sanitized validation result and updated key metadata. Write; idempotent.",
|
|
477
|
+
scope: "mcp:write",
|
|
478
|
+
hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
|
|
479
|
+
useCase: "Re-test a quarantined OpenAI key after fixing its account quota."
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
name: "remove_byok_key",
|
|
483
|
+
title: "Remove an API key",
|
|
484
|
+
description: "Permanently remove one pooled BYOK credential by key id from the authenticated project, including its Vault secret. Write; destructive; idempotent.",
|
|
485
|
+
scope: "mcp:write",
|
|
486
|
+
hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
|
|
487
|
+
useCase: "Remove a rotated or compromised provider key from the runtime pool."
|
|
488
|
+
},
|
|
465
489
|
{
|
|
466
490
|
name: "list_pending_review_stories",
|
|
467
491
|
title: "List QA stories pending review",
|
|
@@ -604,24 +628,29 @@ var TDD_TOOL_CATALOG = [
|
|
|
604
628
|
}
|
|
605
629
|
];
|
|
606
630
|
var USE_MUSHI_INTENTS = {
|
|
631
|
+
// NOTE: every name below MUST be a registered TOOL (scopes.test.ts guards
|
|
632
|
+
// this). 2026-08-16 audit P0-3 found phantom names (get_report,
|
|
633
|
+
// get_dashboard, list_qa_stories) and prompts listed as tools
|
|
634
|
+
// (summarize_report_for_fix, mushi_setup) — agents routed here then
|
|
635
|
+
// failed the call and gave up.
|
|
607
636
|
fix: {
|
|
608
637
|
label: "Fix a bug",
|
|
609
638
|
tools: [
|
|
610
639
|
"get_recent_reports",
|
|
611
|
-
"
|
|
612
|
-
"
|
|
640
|
+
"get_report_detail",
|
|
641
|
+
"triage_issue",
|
|
613
642
|
"dispatch_fix",
|
|
614
643
|
"start_skill_pipeline",
|
|
615
644
|
"checkin_pipeline_step",
|
|
616
645
|
"get_pipeline_run"
|
|
617
646
|
],
|
|
618
|
-
hint: "Call get_recent_reports to find the top unresolved bug, then
|
|
647
|
+
hint: "Call get_recent_reports to find the top unresolved bug, then triage_issue before dispatching."
|
|
619
648
|
},
|
|
620
649
|
status: {
|
|
621
650
|
label: "Check project status",
|
|
622
651
|
tools: [
|
|
623
|
-
"get_dashboard",
|
|
624
652
|
"triage_next_steps",
|
|
653
|
+
"get_account_overview",
|
|
625
654
|
"get_usage",
|
|
626
655
|
"get_backend_health",
|
|
627
656
|
"activation_status"
|
|
@@ -631,18 +660,19 @@ var USE_MUSHI_INTENTS = {
|
|
|
631
660
|
setup: {
|
|
632
661
|
label: "Set up Mushi",
|
|
633
662
|
tools: [
|
|
634
|
-
"
|
|
663
|
+
"diagnose_setup",
|
|
635
664
|
"activation_status",
|
|
636
665
|
"get_backend_health",
|
|
637
666
|
"list_byok_keys",
|
|
638
|
-
"add_byok_key"
|
|
667
|
+
"add_byok_key",
|
|
668
|
+
"test_byok_key",
|
|
669
|
+
"remove_byok_key"
|
|
639
670
|
],
|
|
640
|
-
hint: "Call
|
|
671
|
+
hint: "Call diagnose_setup first \u2014 it diagnoses setup gaps and returns the next action to take."
|
|
641
672
|
},
|
|
642
673
|
qa: {
|
|
643
674
|
label: "Run / review QA tests",
|
|
644
675
|
tools: [
|
|
645
|
-
"list_qa_stories",
|
|
646
676
|
"run_qa_story",
|
|
647
677
|
"list_qa_story_runs",
|
|
648
678
|
"get_qa_story_run",
|
|
@@ -650,7 +680,7 @@ var USE_MUSHI_INTENTS = {
|
|
|
650
680
|
"approve_qa_story",
|
|
651
681
|
"improve_qa_story"
|
|
652
682
|
],
|
|
653
|
-
hint: "Call
|
|
683
|
+
hint: "Call list_qa_story_runs to see recent coverage and outcomes; run_qa_story to trigger a run."
|
|
654
684
|
},
|
|
655
685
|
pipeline: {
|
|
656
686
|
label: "Run an agent pipeline / skill",
|
|
@@ -665,12 +695,7 @@ var USE_MUSHI_INTENTS = {
|
|
|
665
695
|
},
|
|
666
696
|
audit: {
|
|
667
697
|
label: "Audit / health check",
|
|
668
|
-
tools: [
|
|
669
|
-
"run_fullstack_audit",
|
|
670
|
-
"get_backend_health",
|
|
671
|
-
"get_dashboard",
|
|
672
|
-
"get_usage"
|
|
673
|
-
],
|
|
698
|
+
tools: ["run_fullstack_audit", "get_backend_health", "get_account_overview", "get_usage"],
|
|
674
699
|
hint: "Call run_fullstack_audit for a full-stack health scorecard."
|
|
675
700
|
}
|
|
676
701
|
};
|
|
@@ -98,8 +98,10 @@ var TOOL_FEATURE_MAP = {
|
|
|
98
98
|
start_skill_pipeline: "skills",
|
|
99
99
|
get_pipeline_run: "skills",
|
|
100
100
|
checkin_pipeline_step: "skills",
|
|
101
|
-
list_byok_keys: "
|
|
102
|
-
add_byok_key: "
|
|
101
|
+
list_byok_keys: "setup",
|
|
102
|
+
add_byok_key: "setup",
|
|
103
|
+
test_byok_key: "setup",
|
|
104
|
+
remove_byok_key: "setup",
|
|
103
105
|
// audit
|
|
104
106
|
run_fullstack_audit: "audit",
|
|
105
107
|
get_backend_health: "audit",
|
package/dist/clients.d.ts
CHANGED
|
@@ -46,7 +46,7 @@ import { FeatureGroup } from './feature-groups.js';
|
|
|
46
46
|
* editor launch. Synced to package.json by `scripts/sync-mcp-pin.mjs` — never
|
|
47
47
|
* hand-edit the version.
|
|
48
48
|
*/
|
|
49
|
-
declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.
|
|
49
|
+
declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.2";
|
|
50
50
|
interface StdioConfig {
|
|
51
51
|
command: string;
|
|
52
52
|
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-
|
|
8
|
+
} from "./chunk-ZSVRLSW5.js";
|
|
9
9
|
|
|
10
10
|
// src/clients.ts
|
|
11
|
-
var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.
|
|
11
|
+
var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.2";
|
|
12
12
|
function projectServerName(projectId, projectName) {
|
|
13
13
|
const nameSlug = projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 22);
|
|
14
14
|
const idSuffix = projectId.replace(/-/g, "").slice(0, 6);
|