modelcontextprotocol / modelcontextprotocol/ext-apps
Reference host renders tool.name in the app header; base spec display precedence is title → annotations.title → name
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 2.9k
- Forks
- 387
- Avg merge
- 3h 21m
- Merged PRs (30d)
- 6
Description
Describe the bug
The reference host renders the header above a rendered app from the raw tool
name, ignoring title and annotations.title. In
examples/basic-host/src/index.tsx
the tool-call header is:
<span className={styles.toolName}>{toolCallInfo.tool.name}</span>
with no fallback to either title field. Claude Desktop renders the same two
spans, server name then tool name, e.g. "Slidely list_design_systems" (also
observed on claude.ai), while the tool-call row in the same conversation shows
the tool's title. Screenshot attached shows both in one frame: "Checking
slides" in the task list, "Slidely get_presentation" on the card header.
The base spec defines the display precedence in
schema/2025-11-25/schema.ts:
- Tool.annotations: "Display name precedence order is: title,
annotations.title, then name." - BaseMetadata.title: "If not provided, the name should be used for display
(except for Tool, whereannotations.titleshould be given precedence over
usingname, if present)." - BaseMetadata.name: "Intended for programmatic or logical use, but used as a
display name in past specs or fallback (if title isn't present)."
The MCP Apps specification does not say how a host labels a rendered app, so
the reference host is the only guidance implementers have.
To Reproduce
- Register a tool with a
title, anannotations.title, and a
_meta.ui.resourceUripointing at atext/html;profile=mcp-appresource. - Call the tool from a host built on examples/basic-host, or from Claude Desktop.
- Read the header rendered above the app.
Observed: the header shows the raw tool name, "Slidely list_design_systems".
Expected behavior
The header shows the tool's display name per the base spec's precedence:
"Listing design systems". The raw name could remain available in a tooltip or a
verbose view for provenance.
Logs
tools/list response (protocol 2025-11-25) for the request that produced the
rendered card, captured from the server log:
{
"name": "list_design_systems",
"title": "Listing design systems",
"annotations": {
"title": "Listing design systems",
"readOnlyHint": false, "destructiveHint": false,
"idempotentHint": true, "openWorldHint": false
},
"_meta": { "ui": { "resourceUri": "ui://slidely/chat-artifact-v4.html",
"visibility": ["model", "app"] } }
}
Rendered header DOM (Claude Desktop):
<span class="[unicode-bidi:plaintext]">Slidely</span>
<span class="text-muted [unicode-bidi:plaintext]"> list_design_systems</span>
Additional context
Related: anthropics/claude-code#37542 requested title in Claude Code's tool
rows and headers; closed as not planned.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in examples/basic-host/src/index.tsx at the tool-call header that renders toolCallInfo.tool.name, and compare the available title and annotations.title fields with the precedence described in schema/2025-11-25/schema.ts. Verify the header with a tool containing all three names; done means it displays the title-precedence value while preserving the existing server and tool header structure.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- frontend
- Issue type
- Bug
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 84/100