You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -51,7 +51,7 @@ This doc defines that model for McpMux while preserving its product strengths: O
51
51
| 7 | Invoke authorization |**Fail closed** — `invoke_tool` rejects when target server/tool is outside effective permission set | Same composition as today: `(binding_servers ∪ session_enabled) − session_disabled`, then FeatureSet member filter. Empty effective set → invoke denied with actionable error, not silent proxy. |
52
52
| 8 | Session enable/disable |**Keep existing `mcpmux_enable_server` / `mcpmux_disable_server`** — they gate invoke/search eligibility, not `tools/list` size | Mental model unchanged: "turn on github" expands what search/invoke can reach. `tools/list` size stays ~constant. |
53
53
| 9 | Error messages |**Actionable, bounded errors** — no dumping full available-tool lists | e.g. `"github inactive → mcpmux_enable_server('github')"`, `"unknown tool → did you mean github_list_issues?"`. Optional Levenshtein suggestions (Phase D). |
54
-
| 10 | Rollout |**Hard cut — no legacy opt-out**|Backend tools never appear in `tools/list`. Direct `call_tool`on backend qualified names is rejected with an actionable redirect to `mcpmux_invoke_tool`. No `expose_backend_tools_in_list` setting. Ship in one release; document migration in CHANGELOG. |
54
+
| 10 | Rollout |**Hard cut — no legacy opt-out**|Non-surfaced backend tools never appear in `tools/list` and direct `call_tool` is rejected with a redirect to `mcpmux_invoke_tool`. **Exception:** FeatureSet members marked `surfaced: true` are promoted into `tools/list` and callable in one hop. No `expose_backend_tools_in_list` setting. Ship in one release; document migration in CHANGELOG. |
55
55
| 11 |`mcpmux_list_all_tools`|**Keep as operator/diagnostic tool** — not the primary agent discovery path | Still useful for FeatureSet authoring and UI. Doc + descriptions steer agents to `search_tools`. Consider server_id filter arg in Phase A to avoid 855 KB dumps. |
56
56
| 12 | Result shaping scope |**Phase B only on `invoke_tool`** — opt-in via explicit `filter`: `max_rows`, `max_bytes`, `fields`, `format: summary`. Omit filter → backend response as-is. | Agents pass `filter` when they know a tool returns large payloads. No default truncation. |
57
57
| 13 | REST / OpenAPI capabilities |**Out of scope here** — Phase E / separate planning doc |[`web-admin-remote-access.md`](./web-admin-remote-access.md) covers admin REST, not REST→MCP capability YAML. No conflict; different layer. |
|`docs/planning/meta-gateway-invoke.md`| This doc | ✅ Done |
172
172
@@ -181,11 +181,12 @@ Prompts and resources: unchanged — still materialized per grants. Invoke model
181
181
|[`crates/mcpmux-gateway/src/pool/features/facade.rs`](../../crates/mcpmux-gateway/src/pool/features/facade.rs)| Split into `get_advertised_tools_for_grants` vs `get_invokable_tools_for_grants`| ✅ Done |
182
182
|[`crates/mcpmux-gateway/src/pool/features/resolution.rs`](../../crates/mcpmux-gateway/src/pool/features/resolution.rs)|`resolve_surfaced_feature_ids` for surfaced promotion | ✅ Done |
|[`crates/mcpmux-gateway/src/mcp/handler.rs`](../../crates/mcpmux-gateway/src/mcp/handler.rs)|`tools/list` uses advertised set only; direct backend `call_tool` rejected with invoke redirect | ✅ Done |
184
+
|[`crates/mcpmux-gateway/src/mcp/handler.rs`](../../crates/mcpmux-gateway/src/mcp/handler.rs)|`tools/list` uses advertised set only; non-surfaced direct `call_tool` rejected with invoke redirect; surfaced tools allowed one-hop; `ensure_roots_probed` before routing in `call_tool`| ✅ Done |
185
185
|[`crates/mcpmux-core/src/domain/feature_set.rs`](../../crates/mcpmux-core/src/domain/feature_set.rs)|`surfaced: bool` on `FeatureSetMember`| ✅ Done |
186
-
|[`apps/desktop/src/features/featuresets/FeatureSetPanel.tsx`](../../apps/desktop/src/features/featuresets/FeatureSetPanel.tsx)| Per-tool "Surface in client" toggle | ✅ Done |
-[x] Optional `server_id` filter on `mcpmux_list_all_tools`
207
-
-[x] Integration tests: GitHub read path (enable → search → schema → invoke); deny when server inactive; direct `github_*` call rejected
208
+
-[x] Integration tests: GitHub read path (enable → search → schema → invoke); deny when server inactive; non-surfaced direct call rejected
208
209
209
210
**Outcome:** Cursor session shows **10**`mcpmux_*` tools (verified May 25, 2026). Agent completes `github_list_issues` on `mcpmux/mcp-mux` via search → schema → invoke with zero param guessing.
210
211
@@ -241,16 +242,16 @@ Prompts and resources: unchanged — still materialized per grants. Invoke model
241
242
### Phase C — FeatureSet as invoke ACL + surfaced tools
| Rust tests |`pnpm test:rust`| unit + `meta_gateway_invoke.rs` integration |
292
293
| TS tests |`pnpm test:ts`| vitest |
293
-
| Manual smoke | Cursor against live gateway: GitHub read, GWorkspace invoke, permission deny | Agent UX verification |
294
+
| Manual smoke | Cursor against live gateway — full runbook sections 0–11 | Agent UX verification — ✅ complete May 25|
294
295
295
296
---
296
297
@@ -316,7 +317,7 @@ Prompts and resources: unchanged — still materialized per grants. Invoke model
316
317
|[`crates/mcpmux-gateway/src/services/meta_tools/invoke.rs`](../../crates/mcpmux-gateway/src/services/meta_tools/invoke.rs)| Invoke meta tool + result shaping |
|[`docs/planning/tool-level-session-pin.md`](./tool-level-session-pin.md)| Superseded for token budget; Phase F very optional rework |
322
323
@@ -335,17 +336,19 @@ Prompts and resources: unchanged — still materialized per grants. Invoke model
335
336
336
337
## Reconciliation
337
338
338
-
This doc is the source of truth for the meta-gateway invoke model. Phases A–C are implemented on `feat/meta-gateway-invoke`; manual QA tracked in [`meta-gateway-invoke-qa.md`](./meta-gateway-invoke-qa.md). Mark [`tool-level-session-pin.md`](./tool-level-session-pin.md)**Status** as *Superseded*once Phase A ships to main.
339
+
This doc is the source of truth for the meta-gateway invoke model. Phases A–C are implemented on `feat/meta-gateway-invoke` and manually QA complete ([`meta-gateway-invoke-qa.md`](./meta-gateway-invoke-qa.md) — **Ship**). Mark [`tool-level-session-pin.md`](./tool-level-session-pin.md)**Status** as *Superseded*when this branch merges to main.
339
340
340
-
**Decision record (May 25, 2026):** Hard cut to invoke-only — no legacy direct backend exposure. Surfaced tools default zero everywhere (bundles included). FeatureSets redefine as invoke ACL + optional surfaced promotion. Session pin deferred to Phase F (very optional, last). Competitor analysis (MikkoParkkola + abdullah1854) informed Phase A–B scope; REST capabilities in Phase E / separate doc.
341
+
**Decision record (May 25, 2026):** Hard cut to invoke-only for non-surfaced backend tools — no legacy full-catalog `tools/list`. Surfaced tools default zero everywhere (bundles included); opt-in per FeatureSet member for one-hop hot paths. FeatureSets redefine as invoke ACL + optional surfaced promotion. Session pin deferred to Phase F (very optional, last). Competitor analysis (MikkoParkkola + abdullah1854) informed Phase A–B scope; REST capabilities in Phase E / separate doc.
342
+
343
+
**Handler fix (May 25, 2026):**`call_tool` probes workspace roots before routing (matches `list_tools`) and allows direct calls when the tool is in `get_advertised_tools_for_grants` (surfaced). Non-surfaced backend names still get `use_invoke_tool` redirect.
341
344
342
345
**Design revision (May 25, 2026):** Removed default smart truncation — `filter` is opt-in only. Rationale: plain-text MCP backends (GWorkspace) don't map cleanly to JSON row truncation; agents should explicitly bound payloads when needed.
343
346
344
-
**QA ergonomics (May 25, 2026):** Bind FeatureSets in Workspaces UI before agent QA — session enable alone is insufficient without binding ACL. Do **not** call `mcpmux_bind_current_workspace` during routine QA (triggers Space-wide approval modal). Reload MCP tools after UI binding changes.
347
+
**QA ergonomics (May 25, 2026):** Bind FeatureSets in Workspaces UI before agent QA — session enable alone is insufficient without binding ACL. Do **not** call `mcpmux_bind_current_workspace` during routine QA (triggers Space-wide approval modal). Reload MCP tools after UI binding or Surface changes.
345
348
346
-
**Test coverage (May 25, 2026):** Phase B filter shaping — 13 unit tests in `invoke.rs`, 17 integration tests in `meta_gateway_invoke.rs`, manual QA section 6 pass on live `github_list_issues`.
349
+
**Test coverage (May 25, 2026):** Phase B filter shaping — 13 unit tests in `invoke.rs`, 16 integration tests in `meta_gateway_invoke.rs`, manual QA sections 0–11 pass on live gateway.
347
350
348
-
**Manual QA progress (May 25, 2026):**
351
+
**Manual QA progress (May 25, 2026):** Overall **Ship**. Full section results in [`meta-gateway-invoke-qa.md`](./meta-gateway-invoke-qa.md). Highlights:
349
352
350
353
| QA section | Result | Notes |
351
354
| ---------- | ------ | ----- |
@@ -354,7 +357,10 @@ This doc is the source of truth for the meta-gateway invoke model. Phases A–C
0 commit comments