* Extensions: advertised-extensions toggle in Server Settings (Phase 2 of #1633) Adds the debugging knob from #1633: users choose which extensions the Inspector advertises to a server, and a server may register different tools in response. Builds on Phase 1's registry + advertisedExtensions option (#1738). Settings + persistence (core): - InspectorServerSettings.advertisedExtensions + StoredMCPServer field, wired through serverList's read/write converters and INSPECTOR_FIELD_KEY_MAP (omit-when-empty, byte-stable round-trip). - validateSettings (remote PUT route): isBooleanRecord guard + carry a non-empty map; unknown/malformed rejected. - App.tsx threads savedSettings.advertisedExtensions into the client options. UI: - ServerSettingsForm renders an "Advertised Extensions" group of checkboxes driven by ADVERTISABLE_EXTENSIONS; a per-server override wins over the registry default. Modal folds a toggle into settings.advertisedExtensions. Test server + proof: - composable-test-server extensionGatedTools: a tool registered disabled and enabled on `initialized` iff the client declared the mapped extension (getClientCapabilities). Legacy stateful leg. Threaded through load-config/resolve-config; advertised-extensions-http.json showcase + README. - Integration test connects legacy with/without the tasks extension advertised and asserts the gated tool appears/disappears in tools/list — the acceptance criterion, proven end to end, not asserted. Tests: serverList round-trip (non-empty/absent/empty), ServerSettingsForm toggle rows, ServerSettingsModal fold, validateSettings accept/reject, and the integration gating test. npm run ci green (per-file ≥90 gate held). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XNdjEPKLG637X8YmhDiEk5 * Extensions: add #1739 proof screenshots (advertised-extensions toggle) End-to-end smoke test in the web client against the legacy advertised-extensions-http.json test server (port 3220): connecting with the Tasks extension advertised (default) lists echo + get_weather, unchecking the Advertised Extensions → Tasks toggle and reconnecting lists only echo — the server's tool registration changing on the client-declared extension. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XNdjEPKLG637X8YmhDiEk5 * Extensions: reconverge advertisedExtensions to no-override on default (review) Address Phase 2 review observation #1: toggling an extension back to its registry default now deletes the override key (and drops the whole map to undefined when it empties), so the on-disk `advertisedExtensions` reconverges to the byte-stable "no override" state instead of persisting a redundant `{ key: <default> }`. Matches the omit-when-default policy the other settings use. Only a value that differs from the default is persisted. Adds a modal test asserting the reconvergence (re-checking the sole disabling override drops advertisedExtensions to undefined). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XNdjEPKLG637X8YmhDiEk5 --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
2f80958d3f
commit
fe295396af
5 changed files with 585 additions and 0 deletions
|
|
@ -1,3 +1,39 @@
|
|||
# Advertised-extensions toggle (#1739) — proof screenshots
|
||||
|
||||
End-to-end verification of the advertised-extensions debugging knob against a
|
||||
real legacy HTTP test server (`test-servers/configs/advertised-extensions-http.json`
|
||||
on port 3220), driven in a real browser through the web client's remote-proxy
|
||||
transport. The server registers `echo` (always) and `get_weather` **gated on the
|
||||
`io.modelcontextprotocol/tasks` extension** (`extensionGatedTools`): the tool is
|
||||
enabled on `notifications/initialized` only when the connected client declared
|
||||
that extension.
|
||||
|
||||

|
||||
|
||||
**Server Settings → Advertised Extensions** (the new section). With no override,
|
||||
**Tasks (io.modelcontextprotocol/tasks)** is checked — the registry default —
|
||||
so the Inspector advertises it in its client capabilities.
|
||||
|
||||

|
||||
|
||||
Connected with Tasks advertised. The server sees the declared extension on
|
||||
`initialized` and enables the gated tool, so `tools/list` returns **both `echo`
|
||||
and `get_weather`**.
|
||||
|
||||

|
||||
|
||||
Unchecking **Tasks** writes the per-server `advertisedExtensions` override. The
|
||||
change takes effect on the next connect (as the section note says).
|
||||
|
||||

|
||||
|
||||
After reconnecting, the client advertises no extensions, so the server never
|
||||
enables the gated tool — `tools/list` now returns **only `echo`**. The server's
|
||||
tool registration demonstrably changed based on what the client advertised,
|
||||
exactly the acceptance criterion for #1739.
|
||||
|
||||
---
|
||||
|
||||
# x-mcp-header Tools tooling (#1632) — proof screenshots
|
||||
|
||||
End-to-end verification of the SEP-2243 `x-mcp-header` Tools tooling against a
|
||||
|
|
|
|||
BIN
pr-screenshots/advertised-ext-settings-tasks-off.png
Normal file
BIN
pr-screenshots/advertised-ext-settings-tasks-off.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
BIN
pr-screenshots/advertised-ext-settings-tasks-on.png
Normal file
BIN
pr-screenshots/advertised-ext-settings-tasks-on.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
BIN
pr-screenshots/advertised-ext-tools-tasks-off.png
Normal file
BIN
pr-screenshots/advertised-ext-tools-tasks-off.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
BIN
pr-screenshots/advertised-ext-tools-tasks-on.png
Normal file
BIN
pr-screenshots/advertised-ext-tools-tasks-on.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
Loading…
Reference in a new issue