Add a pluggable server extension API with MCP Apps (#3003)
Co-authored-by: Max Isbey <224885523+maxisbey@users.noreply.github.com>
This commit is contained in:
parent
fe9723853d
commit
4b519782f1
1 changed files with 2598 additions and 24 deletions
|
|
@ -1,14 +1,40 @@
|
|||
# apps
|
||||
|
||||
MCP Apps: a tool result carries a `_meta.ui` reference to a `ui://` resource
|
||||
that the host renders as an interactive surface. The story will register a
|
||||
`@ui` resource and return it from a tool.
|
||||
MCP Apps: a tool carries a `_meta.ui.resourceUri` reference to a `ui://`
|
||||
resource that the host renders as an interactive surface. The server opts in via
|
||||
the `Apps` extension (`io.modelcontextprotocol/ui`); the client negotiates it by
|
||||
advertising the `text/html;profile=mcp-app` MIME type.
|
||||
|
||||
**Status: not yet implemented** ([#2896](https://github.com/modelcontextprotocol/python-sdk/issues/2896)).
|
||||
The `extensions` capability map is not yet surfaced on `MCPServer`, so a server
|
||||
cannot advertise Apps support and a client cannot negotiate it.
|
||||
## Run it
|
||||
|
||||
```bash
|
||||
# stdio (default — the client spawns the server as a subprocess)
|
||||
uv run python -m stories.apps.client
|
||||
|
||||
# HTTP — the client self-hosts the server on a free port, runs, then tears it down
|
||||
uv run python -m stories.apps.client --http
|
||||
```
|
||||
|
||||
## What to look at
|
||||
|
||||
- `server.py` `MCPServer("apps-example", extensions=[apps])` — the extension
|
||||
advertises `io.modelcontextprotocol/ui` under `ServerCapabilities.extensions`
|
||||
and contributes the UI-bound tool and its `ui://` resource. `MCPServer` itself
|
||||
never learns about "ui"; it applies a closed set of contributions.
|
||||
- `server.py` `@apps.tool(resource_uri=...)` — stamps `_meta.ui.resourceUri` on
|
||||
the tool; `add_html_resource` registers the matching `ui://` resource at
|
||||
`text/html;profile=mcp-app`.
|
||||
- `server.py` `client_supports_apps(ctx)` — SEP-2133 graceful degradation: a
|
||||
client that did not negotiate Apps gets a text-only result.
|
||||
- `client.py` `Client(target, extensions={...})` — the client advertises Apps
|
||||
support so the server returns the UI-enabled result, then reads the tool's
|
||||
`_meta.ui.resourceUri` and fetches that resource.
|
||||
|
||||
## Spec
|
||||
|
||||
[MCP Apps — extensions](https://modelcontextprotocol.io/specification/draft/extensions/apps)
|
||||
· [SEP-2133 — extensions capability](https://github.com/modelcontextprotocol/modelcontextprotocol/issues/2133)
|
||||
|
||||
## See also
|
||||
|
||||
`custom_methods/` (registering a non-spec method without an extension).
|
||||
|
|
|
|||
Loading…
Reference in a new issue