Skip to content

Commit e22dc0d

Browse files
authored
Merge branch 'main' into groups
2 parents f2aab2b + f88a634 commit e22dc0d

60 files changed

Lines changed: 7008 additions & 41 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/render-seps.yml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,18 @@ jobs:
3333

3434
- run: npm ci
3535

36+
# On PR, verify rendered docs are up to date (must run BEFORE generate)
37+
- name: Verify SEPs are up to date
38+
if: github.event_name == 'pull_request'
39+
run: npm run check:seps
40+
41+
# On push to main, generate and commit any changes
3642
- name: Render SEPs
43+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
3744
run: npm run generate:seps
3845

3946
- name: Check for changes
47+
if: github.event_name == 'push' || github.event_name == 'workflow_dispatch'
4048
id: changes
4149
run: |
4250
if [[ -n "$(git status --porcelain docs/community/seps/ docs/snippets/badge.mdx docs/docs.json)" ]]; then
@@ -45,7 +53,6 @@ jobs:
4553
echo "has_changes=false" >> $GITHUB_OUTPUT
4654
fi
4755
48-
# On push to main, commit any changes
4956
- name: Commit changes
5057
if: github.event_name == 'push' && github.ref == 'refs/heads/main' && steps.changes.outputs.has_changes == 'true'
5158
run: |
@@ -54,8 +61,3 @@ jobs:
5461
git add docs/community/seps/ docs/snippets/badge.mdx docs/docs.json
5562
git commit -m "docs: auto-render SEPs documentation"
5663
git push
57-
58-
# On PR, verify docs are up to date
59-
- name: Verify SEPs are up to date
60-
if: github.event_name == 'pull_request'
61-
run: npm run check:seps

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
docs/specification/*/schema.md
22
docs/specification/*/schema.mdx
3+
docs/registry/
Lines changed: 264 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,264 @@
1+
---
2+
date: "2026-01-26T00:00:00+00:00"
3+
publishDate: "2026-01-26T00:00:00+00:00"
4+
title: "MCP Apps - Bringing UI Capabilities To MCP Clients"
5+
author: "MCP Core Maintainers"
6+
tags: ["mcp", "extensions", "apps"]
7+
ShowToc: true
8+
---
9+
10+
Today, we're announcing that **MCP Apps are now live as an official MCP extension**.
11+
Tools can now return interactive UI components that render directly in the
12+
conversation: dashboards, forms, visualizations, multi-step workflows, and more.
13+
This is the first official MCP extension, and it's ready for production.
14+
15+
{{< youtube bluAmTHoEow >}}
16+
17+
We proposed MCP Apps
18+
[last November](https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/), building on
19+
the amazing work of [MCP-UI](https://mcpui.dev) and the
20+
[OpenAI Apps SDK](https://developers.openai.com/apps-sdk/). We were excited to partner with
21+
both OpenAI and MCP-UI to create a shared open standard for providing affordances for
22+
developers to include UI components in their MCP clients.
23+
24+
Since then, the spec has been refined, the SDK has matured, and clients like ChatGPT, Claude,
25+
Goose and Visual Studio Code have shipped support for this capability, with more clients
26+
coming soon.
27+
28+
{{< button text="Get Started with MCP Apps" url="https://modelcontextprotocol.github.io/ext-apps/api/documents/Quickstart.html" >}}
29+
30+
## **What Are MCP Apps?**
31+
32+
MCP Apps let tools return rich, interactive interfaces instead of plain text. When a tool
33+
declares a UI resource, the host renders it in a sandboxed iframe, and users interact with
34+
it directly in the conversation.
35+
36+
![Color picker MCP App working in Claude.ai](/posts/images/mcp-apps/claude-colorpicker-apps.gif)
37+
38+
Here are a few scenarios where MCP Apps shine:
39+
40+
- **Data exploration**: A sales analytics tool returns an interactive dashboard. Users filter
41+
by region, drill down into specific accounts, and export reports without leaving the
42+
conversation.
43+
- **Configuration wizards**: A deployment tool presents a form with dependent fields.
44+
Selecting "production" reveals additional security options; selecting "staging" shows
45+
different defaults.
46+
- **Document review**: A contract analysis tool displays the PDF inline with highlighted
47+
clauses. Users click to approve or flag sections, and the model sees their decisions in
48+
real time.
49+
- **Real-time monitoring**: A server health tool shows live metrics that update as systems
50+
change. No need to re-run the tool to see current status.
51+
52+
These interactions would be less smooth as text exchanges, whereas MCP Apps make them
53+
natural - it's like using any other UI-based web app.
54+
55+
## **How It Works**
56+
57+
The architecture of MCP Apps relies on two key MCP primitives:
58+
59+
1. **Tools with UI metadata**: Tools include a `_meta.ui.resourceUri` field pointing to a UI
60+
resource
61+
2. **UI Resources**: Server-side resources served via the `ui://` scheme containing bundled
62+
HTML/JavaScript
63+
64+
```javascript
65+
// Tool with UI metadata
66+
{
67+
name: "visualize_data",
68+
description: "Visualize data as an interactive chart",
69+
inputSchema: { /* ... */ },
70+
_meta: {
71+
ui: {
72+
resourceUri: "ui://charts/interactive"
73+
}
74+
}
75+
}
76+
```
77+
78+
The host fetches the resource, renders it in a sandboxed iframe, and enables bidirectional
79+
communication via JSON-RPC over `postMessage`.
80+
81+
## **Why MCP Apps?**
82+
83+
MCP is great for connecting models to data and giving them the ability to take actions. But
84+
there's still a context gap between what tools can do and what users can see.
85+
86+
Consider a tool that queries your database. It returns rows of data, maybe hundreds of them.
87+
The model can summarize this data, but users often want to explore: sort by a column, filter
88+
to a date range, or click into a specific record. With text responses, every interaction
89+
requires another prompt. "Show me just the ones from last week." "Sort by revenue." "What's
90+
the detail on row 47?" It works, but it's slow.
91+
92+
MCP Apps closes this gap. The model stays in the loop, seeing what users do and responding
93+
accordingly, but the UI handles what text can't: live updates, native media viewers,
94+
persistent states, and direct manipulation. Combined, they provide the model and user with
95+
all the context they need in one familiar interface.
96+
97+
## **The App API**
98+
99+
To build new MCP Apps, developers can use the
100+
[`@modelcontextprotocol/ext-apps`](https://www.npmjs.com/package/@modelcontextprotocol/ext-apps)
101+
package, which provides an `App` class for UI-to-host communication:
102+
103+
```javascript
104+
import { App } from "@modelcontextprotocol/ext-apps";
105+
106+
const app = new App();
107+
await app.connect();
108+
109+
// Receive tool results from the host
110+
app.ontoolresult = (result) => {
111+
renderChart(result.data);
112+
};
113+
114+
// Call server tools from the UI
115+
const response = await app.callServerTool({
116+
name: "fetch_details",
117+
arguments: { id: "123" },
118+
});
119+
120+
// Update model context
121+
await app.updateModelContext({
122+
content: [{ type: "text", text: "User selected option B" }],
123+
});
124+
```
125+
126+
Because apps run inside the client, they can do things a plain iframe can't. They can log
127+
events for debugging, open links in the user's browser, send follow-up messages to drive the
128+
conversation forward, or quietly update the model's context for later. All of this happens
129+
over standard `postMessage`, so you're not locked into any framework.
130+
131+
## **Security Model**
132+
133+
Running UI from MCP servers means running code you didn't write within your MCP host. MCP
134+
Apps handles this through multiple layers:
135+
136+
- **Iframe sandboxing**: All UI content runs in sandboxed iframes with restricted permissions
137+
- **Pre-declared templates**: Hosts can review HTML content before rendering
138+
- **Auditable messages**: All UI-to-host communication goes through loggable JSON-RPC
139+
- **User consent**: Hosts can require explicit approval for UI-initiated tool calls
140+
141+
If something looks suspicious, hosts can block it before it ever renders. Of course, users
142+
should continue to proactively and thoroughly vet MCP servers before connecting them.
143+
144+
## **The Future of Agentic UI Frameworks**
145+
146+
[MCP-UI](https://mcpui.dev/) and [OpenAI Apps SDK](https://developers.openai.com/apps-sdk/)
147+
pioneered the patterns that MCP Apps now standardizes. The projects proved that UI resources
148+
can and do fit naturally within the MCP ecosystem, with enterprises of all sizes adopting
149+
both the OpenAI and MCP-UI SDKs for production applications.
150+
151+
MCP-UI isn't going anywhere. The SDKs support MCP Apps patterns, with the Client SDK as the
152+
recommended framework for Hosts looking to adopt MCP Apps. The community continues to
153+
contribute extensively to the specification. If you're already using MCP-UI, keep using it.
154+
Migration to the official extension is straightforward when you're ready.
155+
156+
## **Client Support**
157+
158+
MCP Apps are supported in:
159+
160+
- **Claude** - available today both on web and desktop experiences
161+
- **Goose** - [available today](https://block.github.io/goose/docs/tutorials/building-mcp-apps/)
162+
- **Visual Studio Code** - available in
163+
[Visual Studio Code Insiders](https://code.visualstudio.com/insiders)
164+
- **ChatGPT** - starting this week
165+
166+
For the first time, an MCP tool developer can ship an interactive experience that works
167+
across a broad range of widely-adopted clients without writing a single line of
168+
client-specific code.
169+
170+
> "_I am excited about the possibilities that MCP Apps opens up. Having seen a glimpse of what is possible, I cannot wait to see what the community will build._"
171+
>
172+
> - **David Soria Parra**, Co-Creator of MCP and Member of Technical Staff, [Anthropic](https://www.anthropic.com/)
173+
174+
> _MCP Apps builds upon the foundations of MCP-UI and the ChatGPT Apps SDK to give people a rich visually interactive experience. We're proud to support this new open standard and look forward to seeing what developers build with it as we grow the selection of apps available in ChatGPT._
175+
>
176+
> - **Nick Cooper**, Member of Technical Staff, [OpenAI](https://openai.com/)
177+
178+
> _MCP Apps extends the Model Context Protocol in a way that puts humans at the center. The industry has embedded assistants into individual apps, creating fragmented, siloed experiences. MCP inverts this by making apps pluggable components within agents. MCP Apps extends this further by bringing user interfaces into the agent experience itself._
179+
>
180+
> _goose, the reference implementation for MCP, supports MCP Apps. Developers can now build interactive experiences that render directly in conversation: games, calendars, maps, checkout flows. At Block, we believe the future centers on users navigating through one trusted agent rather than context-switching between fragmented experiences, and MCP Apps supports that vision. We're excited to support this standard and see where developers take it._
181+
>
182+
> - **Andrew Harvard**, Design Engineer, Agentic UX, [Block](https://block.xyz/)
183+
184+
> _“As MCP evolves from ‘tools’ into a real platform for agentic work, VS Code has been treating the protocol like a contract: implement the full spec, track the latest transports and capabilities, and make sure server authors can rely on what they build actually behaving the same way for real developers. With MCP Apps, that contract finally includes the missing human step: when the workflow needs a decision, a selection, or exploration, the client can give you the right interaction without turning the conversation into a choose-your-own-adventure prompt.”_
185+
>
186+
> - **Harald Kirschner**, Principal Product Manager, VS Code, [Microsoft](https://www.microsoft.com/en-us)
187+
188+
> _The MCP Apps extension addresses a gap we have experienced first-hand: text and structured data only gets you so far when developers want rich, interactive tooling. The ability to render dynamic UIs directly from MCP servers, with security built in from day one, is exactly what we need to build better agentic experiences. JetBrains is excited to explore bringing this extension to our IDEs and continue working with the MCP Community._
189+
>
190+
> - **Denis Shiryaev**, Head of AI DevTools Ecosystem, [JetBrains](https://www.jetbrains.com/)
191+
192+
> _“MCP Apps address a real gap between what agentic tools can provide and how users naturally want to interact with them. The ability to render dynamic interfaces directly in conversation makes it easier to leverage MCP server capabilities in practical ways. We're excited to see this extension deliver richer interactions for users while enabling MCP server developers to craft experiences tailored to what they're building. We’re excited to see how we can bring these capabilities to Kiro and the use cases it’ll unlock for our users.“_
193+
>
194+
> - **Clare Liguori**, Senior Principal Engineer, [AWS](https://aws.amazon.com/)
195+
196+
> "The Antigravity team is excited to see the continued expansion of the MCP ecosystem, and will explore how MCP apps could enable new, magical experiences within Antigravity."
197+
>
198+
> - **Anshul Ramachandran**, Product Lead, Antigravity, [Google DeepMind](https://deepmind.google/)
199+
200+
This is just the starting lineup, and adding support to a new client is as easy as following
201+
the [implementation guide](https://modelcontextprotocol.io/docs/extensions/apps).
202+
203+
## **Get Started**
204+
205+
The [ext-apps repository](https://github.com/modelcontextprotocol/ext-apps) includes the SDK
206+
and working examples:
207+
[`threejs-server`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/threejs-server)
208+
for 3D visualization,
209+
[`map-server`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/map-server)
210+
for interactive maps,
211+
[`pdf-server`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/pdf-server)
212+
for document viewing,
213+
[`system-monitor-server`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/system-monitor-server)
214+
for real-time dashboards,
215+
[`sheet-music-server`](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/sheet-music-server)
216+
for music notation, and
217+
[many more](https://github.com/modelcontextprotocol/ext-apps/tree/main/examples).
218+
219+
Pick one close to what you're building and start from there!
220+
221+
![Color picker MCP App working in Visual Studio Code](/posts/images/mcp-apps/vscode-colorpicker-apps.gif)
222+
223+
### **Resources**
224+
225+
- **Documentation**: [MCP Apps Guide](https://modelcontextprotocol.io/docs/extensions/apps)
226+
- **Quickstart**: [Getting Started with MCP Apps](https://modelcontextprotocol.github.io/ext-apps/api/documents/Quickstart.html)
227+
- **SDK**: [`@modelcontextprotocol/ext-apps`](https://www.npmjs.com/package/@modelcontextprotocol/ext-apps)
228+
- **Examples**: [ext-apps repository](https://github.com/modelcontextprotocol/ext-apps)
229+
230+
### [**Claude.ai**](http://Claude.ai) **Feedback**
231+
232+
If you're building MCP Apps for [Claude.ai](http://Claude.ai) and encounter issues with our
233+
implementation, please report them at
234+
[github.com/anthropics/claude-ai-mcp](https://github.com/anthropics/claude-ai-mcp). This
235+
helps us improve the experience for everyone.
236+
237+
### **ChatGPT Apps SDK Feedback**
238+
239+
If you're building apps with the ChatGPT Apps SDK and run into issues or have questions,
240+
please post in the
241+
[ChatGPT Apps category](https://community.openai.com/c/chatgpt-apps-sdk/42) on the OpenAI
242+
Community forum. This is where app developers, community moderators, and the OpenAI team
243+
actively engage to discuss builds, troubleshoot problems, and improve the overall developer
244+
experience.
245+
246+
## **Acknowledgements**
247+
248+
MCP Apps is the result of collaboration across multiple teams and communities.
249+
250+
**Ido Salomon** and **Liad Yosef** created MCP-UI and moderated the `#ui-wg` channel,
251+
incubating many of the patterns that MCP Apps now standardizes. Their work proved that
252+
interactive UIs belong in MCP.
253+
254+
**Nick Cooper** at OpenAI helped deliver the OpenAI Apps SDK, enabling everyone to go beyond
255+
text in their interactions with Large Language Models.
256+
257+
**Sean Strong**, **Olivier Chafik**, **Anton Pidkuiko**, and **Jerome Swannack** from
258+
Anthropic helped steer the initiative from proposal to production.
259+
260+
The **UI Community Working Group** provided feedback through countless discussions, reviewed
261+
drafts, tested early implementations, and pushed for the right trade-offs between flexibility
262+
and security.
263+
264+
Thank you to everyone who contributed. Now go build something.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{{- $text := .Get "text" | default "Learn More" -}}
2+
{{- $url := .Get "url" | default "#" -}}
3+
{{- $target := .Get "target" | default "_blank" -}}
4+
5+
<a href="{{ $url }}" target="{{ $target }}" rel="noopener noreferrer" class="mcp-button">
6+
{{ $text }} <span class="mcp-button-arrow"></span>
7+
</a>
8+
9+
<style>
10+
.mcp-button {
11+
display: inline-block;
12+
padding: 8px 16px;
13+
font-size: 14px;
14+
font-weight: 500;
15+
text-decoration: none;
16+
border-radius: 4px;
17+
transition: all 0.2s ease;
18+
margin: 12px 0;
19+
background-color: #1a1a1a;
20+
color: #ffffff;
21+
border: 1px solid #333;
22+
}
23+
24+
.mcp-button:hover {
25+
background-color: #333;
26+
color: #ffffff;
27+
}
28+
29+
.mcp-button-arrow {
30+
margin-left: 6px;
31+
transition: transform 0.2s ease;
32+
display: inline-block;
33+
}
34+
35+
.mcp-button:hover .mcp-button-arrow {
36+
transform: translateX(3px);
37+
}
38+
39+
.dark .mcp-button {
40+
background-color: #ffffff;
41+
color: #1a1a1a;
42+
border: 1px solid #e5e5e5;
43+
}
44+
45+
.dark .mcp-button:hover {
46+
background-color: #f0f0f0;
47+
color: #1a1a1a;
48+
}
49+
</style>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
{{- $id := .Get "id" | default (.Get 0) -}}
2+
{{- $title := .Get "title" | default "YouTube video" -}}
3+
4+
<div class="youtube-container">
5+
<iframe
6+
src="https://www.youtube.com/embed/{{ $id }}"
7+
title="{{ $title }}"
8+
frameborder="0"
9+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
10+
allowfullscreen>
11+
</iframe>
12+
</div>
13+
14+
<style>
15+
.youtube-container {
16+
position: relative;
17+
width: 100%;
18+
padding-bottom: 56.25%; /* 16:9 aspect ratio */
19+
margin: 24px 0;
20+
}
21+
22+
.youtube-container iframe {
23+
position: absolute;
24+
top: 0;
25+
left: 0;
26+
width: 100%;
27+
height: 100%;
28+
border-radius: 8px;
29+
}
30+
</style>
1.16 MB
Loading
597 KB
Loading

0 commit comments

Comments
 (0)