cliffhall
3153f0305a
fix: key resource list rows by position so duplicate URIs cannot collide
...
The Resources sidebar keyed every row on its `uri` (and templates on
`uriTemplate`), but nothing in MCP makes those unique — a server may return
the same URI twice, and `ManagedListState.applyItems` replaces the list
wholesale, so a repeat is what the server actually sent. React logged
`Encountered two children with the same key` on every render, and a
filtered-out row survived reconciliation instead of unmounting.
This is the resources counterpart of #1957 . The row identity is now the same
`listRowKey(id, sourceIndex)` the Tools sidebar has used since then, extracted
so the two formats cannot drift; `toolRowKey` delegates to it. Applied to all
three Resources lists and to `RootsTable`, whose user-maintained list can
collect a duplicate URI the same way.
Selection stays keyed on the URI, deliberately: unlike a duplicated tool name
(#2001 ), duplicate rows here denote the same resource — a `resources/read`
takes the URI — so highlighting both is correct. Only the React key needs to
tell them apart.
Adds `ServerConfig.duplicateResourceUris` and the
`duplicate-resource-uris-http.json` showcase config, the `resources/list`
mirror of `duplicateToolNames`, so the defect has a fixture to reproduce it —
appended rather than adjacent, for the reason #1957 documented.
Closes #2206
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yVgAJz4wpkS4mkGk7DQnp
Signed-off-by: cliffhall <cliff@futurescale.com>
2026-09-06 19:43:47 -04:00
..
advertised-extensions-http.json
Extensions: advertised-extensions toggle in Server Settings (Phase 2 of #1633 ) ( #1743 )
2026-07-22 16:23:43 -04:00
app-elicitation-http.json
feat(apps): negotiated app-rendered form elicitations
2026-08-22 19:05:33 -04:00
app-elicitation-native-http.json
feat(apps): negotiated app-rendered form elicitations
2026-08-22 19:05:33 -04:00
cancellation-modern-http.json
fix: cancel a Streamable HTTP call by closing its stream ( #2140 )
2026-08-28 00:55:29 -04:00
demo.json
feat(core): port v1.5 InspectorClient + transports + auth subsystem ( #1302 ) ( #1306 )
2026-05-15 15:36:17 -04:00
duplicate-resource-uris-http.json
fix: key resource list rows by position so duplicate URIs cannot collide
2026-09-06 19:43:47 -04:00
duplicate-tool-names-http.json
test: add a duplicate-tool-names test server for the #1957 repro
2026-08-10 20:22:47 -04:00
empty-cursor-http.json
fix: send an empty-string pagination cursor verbatim on every list adapter ( #2220 )
2026-09-06 13:28:44 -04:00
logging-legacy-http.json
Logging: per-request log level on modern servers (era fork) ( #1629 ) ( #1724 )
2026-07-19 17:08:22 -04:00
logging-modern-http.json
Logging: per-request log level on modern servers (era fork) ( #1629 ) ( #1724 )
2026-07-19 17:08:22 -04:00
mcp-app-domain-http.json
test(web): prove the dedicated app origin end to end
2026-08-24 08:45:40 -04:00
mcp-app-http.json
test: add an MCP App showcase config to reproduce and verify #1859
2026-08-05 17:59:09 -04:00
modern-http.json
Add modern-era (2026-07-28) test-server preset ( #1700 ) ( #1703 )
2026-07-17 11:12:40 -04:00
modern-mrtr-http.json
History: MRTR conversation grouping + modern message vocabulary ( #1705 )
2026-07-17 20:02:11 -04:00
modern-network-http.json
Network: modern Mcp-* headers, new error codes, cancellation-as-abort ( #1628 ) ( #1722 )
2026-07-18 17:32:05 -04:00
mrtr-showcase-http.json
fix(web): name an empty tool result instead of "No results yet" ( #1860 )
2026-08-16 18:31:01 -04:00
nullable-fields-http.json
fix: render nullable enum fields as a Select instead of a raw JSON textarea
2026-08-15 16:10:17 -04:00
oauth-custom-resource-metadata-http.json
fix(auth): pass the challenge's resource_metadata URL to SDK auth()
2026-08-24 19:48:40 -04:00
oauth-no-revocation-http.json
feat(auth): revoke OAuth tokens at the authorization server on clear ( #2144 )
2026-08-28 00:48:57 -04:00
oauth-revocation-http.json
feat(auth): revoke OAuth tokens at the authorization server on clear ( #2144 )
2026-08-28 00:48:57 -04:00
oauth-rfc8414-at-oidc-path-http.json
fix(auth): accept RFC 8414 metadata served at the OIDC well-known path
2026-08-28 00:40:11 -04:00
oauth-step-up-demo.json
All of the mid-session and step-up auth work
2026-07-02 16:35:31 -07:00
pagination-http.json
Thread cacheMode through managed list refresh via SDK cache-aware verbs ( #1721 ) ( #1723 )
2026-07-19 01:06:31 -04:00
rfc6570-templates-http.json
fix(core): share URI-template expansion and correct the SDK's multi-name branch
2026-08-16 18:51:12 -04:00
root-union-schemas-http.json
fix: render tool schemas with root-level anyOf/oneOf composition
2026-08-26 00:37:43 -04:00
skills-http.json
fix: address Copilot review round 5 on #2251
2026-09-04 23:11:46 -04:00
structured-output-http.json
fix: render a tool result's structuredContent in the Tools screen ( #1908 )
2026-08-11 09:23:43 -04:00
subscriptions-legacy-http.json
Resources: subscriptions/listen model on modern servers (era fork) ( #1630 ) ( #1730 )
2026-07-20 19:33:40 -04:00
subscriptions-modern-http.json
Resources: subscriptions/listen model on modern servers (era fork) ( #1630 ) ( #1730 )
2026-07-20 19:33:40 -04:00
subscriptions-never-acknowledged-http.json
fix(core): say why a never-acknowledged subscriptions/listen ended
2026-08-27 20:49:55 -04:00
tasks-legacy-http.json
Tasks: io.modelcontextprotocol/tasks extension on modern servers (era fork) ( #1731 )
2026-07-21 19:17:04 -04:00
tasks-modern-http.json
Tasks: io.modelcontextprotocol/tasks extension on modern servers (era fork) ( #1731 )
2026-07-21 19:17:04 -04:00
unportable-schemas-http.json
fix: map the new exit code, keep add runnable, distinguish severity by shape
2026-08-25 02:37:10 -04:00
url-elicitation-form.json
feat(core): port v1.5 InspectorClient + transports + auth subsystem ( #1302 ) ( #1306 )
2026-05-15 15:36:17 -04:00
web-tabs-http.json
chore(web): connected-flow smoke for the Tools, Resources and Prompts tabs
2026-08-26 23:09:44 -04:00
xaa-ema-http.json
Auth hardening CI gaps + SDK consolidation: EMA leg 2 / scopes ( #1527 ) ( #1725 )
2026-07-19 22:36:21 -04:00
xmcpheader-modern-http.json
Tools: x-mcp-header annotation tooling + -32602 unknown-tool rendering ( #1632 ) ( #1735 )
2026-07-22 11:42:54 -04:00