anthropics / anthropics/claude-ai-mcp
MCP Apps: widget receives no tool-result event when the result contains a resource_link content block
- Dominant language
- No language data
- Stars
- 471
- Forks
- 76
- PR merge metrics
- No merged PRs in 30d
Description
## Summary
claude.ai delivers **no tool-result event at all** to an MCP Apps widget (ext-apps / SEP-1865) when the mounting tool result contains a `resource_link` content block. Removing the block — with the response otherwise unchanged — makes the same widget render normally.
## Environment
- Custom connector (Streamable HTTP), MCP protocol 2025-03-26, `@modelcontextprotocol/ext-apps` 1.7.5 server-side
- Observed 2026-08-02 on claude.ai (web), reproducible across fresh conversations and connectors
## Reproduction
1. Register a tool with `_meta.ui.resourceUri` pointing at a registered `ui://` app resource. The tool returns:
```json
{
"content": [
{ "type": "text", "text": "…document text…" },
{ "type": "resource_link", "uri": "https://…", "name": "…", "mimeType": "text/html" }
],
"structuredContent": { "text": "…", "total_length": 12345 }
}
```
2. Invoke the tool in claude.ai. The widget iframe mounts (handshake completes), but receives neither the tool result notification nor usable data on any channel — it sits in its no-data state indefinitely. The model-facing text path is unaffected.
3. Remove the `resource_link` block from `content` (text block and `structuredContent` unchanged): the widget receives the result and renders.
## Discriminators we ruled out
- Same conversation, same connector: a sibling tool **without** a `resource_link` in its results feeds its widget normally (via `structuredContent`), so event delivery as such works.
- The ext-apps reference host (`npx mcp-app-debug`) passes 6/6 checks against the identical server **with** the `resource_link` present — the widget code handles the block fine when the event arrives.
- Also observed on this tool: with no `structuredContent` declared, claude.ai delivered neither the `content[]` blocks nor the `ui/notifications/tool-input` arguments to the widget — `structuredContent` appears to be the only channel claude.ai feeds a widget. That may be intended, but combined with the `resource_link` behavior it means a tool result carrying a `resource_link` cannot drive a widget at all.
## Impact / workaround
We removed the `resource_link` block from the affected tool's responses to unblock our document viewer (server: github.com/Honeyfield-Org/ris-mcp-ts). Happy to provide a minimal repro server if useful.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.