<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Apps on Model Context Protocol Blog</title><link>https://blog.modelcontextprotocol.io/tags/apps/</link><description>Recent content in Apps on Model Context Protocol Blog</description><image><title>Model Context Protocol Blog</title><url>https://blog.modelcontextprotocol.io/og-image.png</url><link>https://blog.modelcontextprotocol.io/og-image.png</link></image><generator>Hugo -- 0.148.0</generator><language>en-us</language><copyright>Copyright © Model Context Protocol a Series of LF Projects, LLC.
For web site terms of use, trademark policy and other project policies please see https://lfprojects.org.</copyright><lastBuildDate>Thu, 09 Jul 2026 17:50:29 -0700</lastBuildDate><atom:link href="https://blog.modelcontextprotocol.io/tags/apps/index.xml" rel="self" type="application/rss+xml"/><item><title>MCP Apps - Bringing UI Capabilities To MCP Clients</title><link>https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/</guid><description>MCP Apps is now live as the first official MCP extension — tools can return interactive UI components that render directly in the conversation.</description><content:encoded><![CDATA[<p>Today, we&rsquo;re announcing that <strong>MCP Apps are now live as an official MCP extension</strong>.
Tools can now return interactive UI components that render directly in the
conversation: dashboards, forms, visualizations, multi-step workflows, and more.
This is the first official MCP extension, and it&rsquo;s ready for production.</p>
<div class="youtube-container">
  <iframe
    src="https://www.youtube.com/embed/bluAmTHoEow"
    title="YouTube video"
    frameborder="0"
    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
    allowfullscreen>
  </iframe>
</div>

<style>
.youtube-container {
  position: relative;
  width: 100%;
  padding-bottom: 56.25%;  
  margin: 24px 0;
}

.youtube-container iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border-radius: 8px;
}
</style>

<p>We proposed MCP Apps
<a href="https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/">last November</a>, building on
the amazing work of <a href="https://mcpui.dev">MCP-UI</a> and the
<a href="https://developers.openai.com/apps-sdk/">OpenAI Apps SDK</a>. We were excited to partner with
both OpenAI and MCP-UI to create a shared open standard for providing affordances for
developers to include UI components in their MCP clients.</p>
<p>Since then, the spec has been refined, the SDK has matured, and clients like ChatGPT, Claude,
Goose and Visual Studio Code have shipped support for this capability, with more clients
coming soon.</p>
<a href="https://apps.extensions.modelcontextprotocol.io/api/documents/Quickstart.html" target="_blank" rel="noopener noreferrer" class="mcp-button">
  Get Started with MCP Apps <span class="mcp-button-arrow">→</span>
</a>

<style>
.mcp-button {
  display: inline-block;
  padding: 8px 16px;
  font-size: 14px;
  font-weight: 500;
  text-decoration: none;
  border-radius: 4px;
  transition: all 0.2s ease;
  margin: 12px 0;
  background-color: #1a1a1a;
  color: #ffffff;
  border: 1px solid #333;
}

.mcp-button:hover {
  background-color: #333;
  color: #ffffff;
}

.mcp-button-arrow {
  margin-left: 6px;
  transition: transform 0.2s ease;
  display: inline-block;
}

.mcp-button:hover .mcp-button-arrow {
  transform: translateX(3px);
}

.dark .mcp-button {
  background-color: #ffffff;
  color: #1a1a1a;
  border: 1px solid #e5e5e5;
}

.dark .mcp-button:hover {
  background-color: #f0f0f0;
  color: #1a1a1a;
}
</style>

<h2 id="what-are-mcp-apps"><strong>What Are MCP Apps?</strong></h2>
<p>MCP Apps let tools return rich, interactive interfaces instead of plain text. When a tool
declares a UI resource, the host renders it in a sandboxed iframe, and users interact with
it directly in the conversation.</p>
<p><img alt="Color picker MCP App working in Claude.ai" loading="lazy" src="/posts/images/mcp-apps/claude-colorpicker-apps.gif"></p>
<p>Here are a few scenarios where MCP Apps shine:</p>
<ul>
<li><strong>Data exploration</strong>: A sales analytics tool returns an interactive dashboard. Users filter
by region, drill down into specific accounts, and export reports without leaving the
conversation.</li>
<li><strong>Configuration wizards</strong>: A deployment tool presents a form with dependent fields.
Selecting &ldquo;production&rdquo; reveals additional security options; selecting &ldquo;staging&rdquo; shows
different defaults.</li>
<li><strong>Document review</strong>: A contract analysis tool displays the PDF inline with highlighted
clauses. Users click to approve or flag sections, and the model sees their decisions in
real time.</li>
<li><strong>Real-time monitoring</strong>: A server health tool shows live metrics that update as systems
change. No need to re-run the tool to see current status.</li>
</ul>
<p>These interactions would be less smooth as text exchanges, whereas MCP Apps make them
natural - it&rsquo;s like using any other UI-based web app.</p>
<h2 id="how-it-works"><strong>How It Works</strong></h2>
<p>The architecture of MCP Apps relies on two key MCP primitives:</p>
<ol>
<li><strong>Tools with UI metadata</strong>: Tools include a <code>_meta.ui.resourceUri</code> field pointing to a UI
resource</li>
<li><strong>UI Resources</strong>: Server-side resources served via the <code>ui://</code> scheme containing bundled
HTML/JavaScript</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#75715e">// Tool with UI metadata
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>{
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;visualize_data&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Visualize data as an interactive chart&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">inputSchema</span><span style="color:#f92672">:</span> { <span style="color:#75715e">/* ... */</span> },
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">_meta</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">ui</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">resourceUri</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;ui://charts/interactive&#34;</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>The host fetches the resource, renders it in a sandboxed iframe, and enables bidirectional
communication via JSON-RPC over <code>postMessage</code>.</p>
<h2 id="why-mcp-apps"><strong>Why MCP Apps?</strong></h2>
<p>MCP is great for connecting models to data and giving them the ability to take actions. But
there&rsquo;s still a context gap between what tools can do and what users can see.</p>
<p>Consider a tool that queries your database. It returns rows of data, maybe hundreds of them.
The model can summarize this data, but users often want to explore: sort by a column, filter
to a date range, or click into a specific record. With text responses, every interaction
requires another prompt. &ldquo;Show me just the ones from last week.&rdquo; &ldquo;Sort by revenue.&rdquo; &ldquo;What&rsquo;s
the detail on row 47?&rdquo; It works, but it&rsquo;s slow.</p>
<p>MCP Apps closes this gap. The model stays in the loop, seeing what users do and responding
accordingly, but the UI handles what text can&rsquo;t: live updates, native media viewers,
persistent states, and direct manipulation. Combined, they provide the model and user with
all the context they need in one familiar interface.</p>
<h2 id="the-app-api"><strong>The App API</strong></h2>
<p>To build new MCP Apps, developers can use the
<a href="https://www.npmjs.com/package/@modelcontextprotocol/ext-apps"><code>@modelcontextprotocol/ext-apps</code></a>
package, which provides an <code>App</code> class for UI-to-host communication:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">import</span> { <span style="color:#a6e22e">App</span> } <span style="color:#a6e22e">from</span> <span style="color:#e6db74">&#34;@modelcontextprotocol/ext-apps&#34;</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">app</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">App</span>();
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">await</span> <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">connect</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Receive tool results from the host
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">ontoolresult</span> <span style="color:#f92672">=</span> (<span style="color:#a6e22e">result</span>) =&gt; {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">renderChart</span>(<span style="color:#a6e22e">result</span>.<span style="color:#a6e22e">data</span>);
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Call server tools from the UI
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">response</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">callServerTool</span>({
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;fetch_details&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">arguments</span><span style="color:#f92672">:</span> { <span style="color:#a6e22e">id</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;123&#34;</span> },
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Update model context
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">await</span> <span style="color:#a6e22e">app</span>.<span style="color:#a6e22e">updateModelContext</span>({
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">content</span><span style="color:#f92672">:</span> [{ <span style="color:#a6e22e">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;text&#34;</span>, <span style="color:#a6e22e">text</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;User selected option B&#34;</span> }],
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><p>Because apps run inside the client, they can do things a plain iframe can&rsquo;t. They can log
events for debugging, open links in the user&rsquo;s browser, send follow-up messages to drive the
conversation forward, or quietly update the model&rsquo;s context for later. All of this happens
over standard <code>postMessage</code>, so you&rsquo;re not locked into any framework.</p>
<h2 id="security-model"><strong>Security Model</strong></h2>
<p>Running UI from MCP servers means running code you didn&rsquo;t write within your MCP host. MCP
Apps handles this through multiple layers:</p>
<ul>
<li><strong>Iframe sandboxing</strong>: All UI content runs in sandboxed iframes with restricted permissions</li>
<li><strong>Pre-declared templates</strong>: Hosts can review HTML content before rendering</li>
<li><strong>Auditable messages</strong>: All UI-to-host communication goes through loggable JSON-RPC</li>
<li><strong>User consent</strong>: Hosts can require explicit approval for UI-initiated tool calls</li>
</ul>
<p>If something looks suspicious, hosts can block it before it ever renders. Of course, users
should continue to proactively and thoroughly vet MCP servers before connecting them.</p>
<h2 id="the-future-of-agentic-ui-frameworks"><strong>The Future of Agentic UI Frameworks</strong></h2>
<p><a href="https://mcpui.dev/">MCP-UI</a> and <a href="https://developers.openai.com/apps-sdk/">OpenAI Apps SDK</a>
pioneered the patterns that MCP Apps now standardizes. The projects proved that UI resources
can and do fit naturally within the MCP ecosystem, with enterprises of all sizes adopting
both the OpenAI and MCP-UI SDKs for production applications.</p>
<p>MCP-UI isn&rsquo;t going anywhere. The SDKs support MCP Apps patterns, with the Client SDK as the
recommended framework for Hosts looking to adopt MCP Apps. The community continues to
contribute extensively to the specification. If you&rsquo;re already using MCP-UI, keep using it.
Migration to the official extension is straightforward when you&rsquo;re ready.</p>
<h2 id="client-support"><strong>Client Support</strong></h2>
<p>MCP Apps are supported in:</p>
<ul>
<li><strong>Claude</strong> - available today both on web and desktop experiences</li>
<li><strong>Goose</strong> - <a href="https://goose-docs.ai/docs/tutorials/building-mcp-apps/">available today</a></li>
<li><strong>Visual Studio Code</strong> - available in
<a href="https://code.visualstudio.com/insiders">Visual Studio Code Insiders</a></li>
<li><strong>ChatGPT</strong> - starting this week</li>
</ul>
<p>For the first time, an MCP tool developer can ship an interactive experience that works
across a broad range of widely-adopted clients without writing a single line of
client-specific code.</p>
<blockquote>
<p>&ldquo;<em>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.</em>&rdquo;</p>
<ul>
<li><strong>David Soria Parra</strong>, Co-Creator of MCP and Member of Technical Staff, <a href="https://www.anthropic.com/">Anthropic</a></li>
</ul></blockquote>
<blockquote>
<p>“<em>MCP Apps builds upon the foundations of MCP-UI and the ChatGPT Apps SDK to give people a rich visually interactive experience. We&rsquo;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.</em>”</p>
<ul>
<li><strong>Nick Cooper</strong>, Member of Technical Staff, <a href="https://openai.com/">OpenAI</a></li>
</ul></blockquote>
<blockquote>
<p>“<em>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.</em></p>
<p><em>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&rsquo;re excited to support this standard and see where developers take it.</em>”</p>
<ul>
<li><strong>Andrew Harvard</strong>, Design Engineer, Agentic UX, <a href="https://block.xyz/">Block</a></li>
</ul></blockquote>
<blockquote>
<p><em>“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.”</em></p>
<ul>
<li><strong>Harald Kirschner</strong>, Principal Product Manager, VS Code, <a href="https://www.microsoft.com/en-us">Microsoft</a></li>
</ul></blockquote>
<blockquote>
<p>“<em>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.</em>”</p>
<ul>
<li><strong>Denis Shiryaev</strong>, Head of AI DevTools Ecosystem, <a href="https://www.jetbrains.com/">JetBrains</a></li>
</ul></blockquote>
<blockquote>
<p><em>“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&rsquo;re excited to see this extension deliver richer interactions for users while enabling MCP server developers to craft experiences tailored to what they&rsquo;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.“</em></p>
<ul>
<li><strong>Clare Liguori</strong>, Senior Principal Engineer, <a href="https://aws.amazon.com/">AWS</a></li>
</ul></blockquote>
<blockquote>
<p>&ldquo;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.&rdquo;</p>
<ul>
<li><strong>Anshul Ramachandran</strong>, Product Lead, Antigravity, <a href="https://deepmind.google/">Google DeepMind</a></li>
</ul></blockquote>
<p>This is just the starting lineup, and adding support to a new client is as easy as following
the <a href="https://modelcontextprotocol.io/docs/extensions/apps">implementation guide</a>.</p>
<h2 id="get-started"><strong>Get Started</strong></h2>
<p>The <a href="https://github.com/modelcontextprotocol/ext-apps">ext-apps repository</a> includes the SDK
and working examples:
<a href="https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/threejs-server"><code>threejs-server</code></a>
for 3D visualization,
<a href="https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/map-server"><code>map-server</code></a>
for interactive maps,
<a href="https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/pdf-server"><code>pdf-server</code></a>
for document viewing,
<a href="https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/system-monitor-server"><code>system-monitor-server</code></a>
for real-time dashboards,
<a href="https://github.com/modelcontextprotocol/ext-apps/tree/main/examples/sheet-music-server"><code>sheet-music-server</code></a>
for music notation, and
<a href="https://github.com/modelcontextprotocol/ext-apps/tree/main/examples">many more</a>.</p>
<p>Pick one close to what you&rsquo;re building and start from there!</p>
<p><img alt="Color picker MCP App working in Visual Studio Code" loading="lazy" src="/posts/images/mcp-apps/vscode-colorpicker-apps.gif"></p>
<h3 id="resources"><strong>Resources</strong></h3>
<ul>
<li><strong>Documentation</strong>: <a href="https://modelcontextprotocol.io/docs/extensions/apps">MCP Apps Guide</a></li>
<li><strong>Quickstart</strong>: <a href="https://apps.extensions.modelcontextprotocol.io/api/documents/Quickstart.html">Getting Started with MCP Apps</a></li>
<li><strong>SDK</strong>: <a href="https://www.npmjs.com/package/@modelcontextprotocol/ext-apps"><code>@modelcontextprotocol/ext-apps</code></a></li>
<li><strong>Examples</strong>: <a href="https://github.com/modelcontextprotocol/ext-apps">ext-apps repository</a></li>
</ul>
<h3 id="claudeai-feedback"><a href="http://Claude.ai"><strong>Claude.ai</strong></a> <strong>Feedback</strong></h3>
<p>If you&rsquo;re building MCP Apps for <a href="http://Claude.ai">Claude.ai</a> and encounter issues with our
implementation, please report them at
<a href="https://github.com/anthropics/claude-ai-mcp">github.com/anthropics/claude-ai-mcp</a>. This
helps us improve the experience for everyone.</p>
<h3 id="chatgpt-apps-sdk-feedback"><strong>ChatGPT Apps SDK Feedback</strong></h3>
<p>If you&rsquo;re building apps with the ChatGPT Apps SDK and run into issues or have questions,
please post in the
<a href="https://community.openai.com/c/chatgpt-apps-sdk/42">ChatGPT Apps category</a> on the OpenAI
Community forum. This is where app developers, community moderators, and the OpenAI team
actively engage to discuss builds, troubleshoot problems, and improve the overall developer
experience.</p>
<h2 id="acknowledgements"><strong>Acknowledgements</strong></h2>
<p>MCP Apps is the result of collaboration across multiple teams and communities.</p>
<p><strong>Ido Salomon</strong> and <strong>Liad Yosef</strong> created MCP-UI and moderated the <code>#ui-wg</code> channel,
incubating many of the patterns that MCP Apps now standardizes. Their work proved that
interactive UIs belong in MCP.</p>
<p><strong>Nick Cooper</strong> at OpenAI helped deliver the OpenAI Apps SDK, enabling everyone to go beyond
text in their interactions with Large Language Models.</p>
<p><strong>Sean Strong</strong>, <strong>Olivier Chafik</strong>, <strong>Anton Pidkuiko</strong>, and <strong>Jerome Swannack</strong> from
Anthropic helped steer the initiative from proposal to production.</p>
<p>The <strong>UI Community Working Group</strong> provided feedback through countless discussions, reviewed
drafts, tested early implementations, and pushed for the right trade-offs between flexibility
and security.</p>
<p>Thank you to everyone who contributed. Now go build something.</p>
]]></content:encoded></item><item><title>MCP Apps: Extending servers with interactive user interfaces</title><link>https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/</link><pubDate>Fri, 21 Nov 2025 22:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/</guid><description>Introducing the MCP Apps Extension proposal (SEP-1865) to standardize interactive user interfaces in MCP, developed with the MCP-UI creators and maintainers from OpenAI and Anthropic.</description><content:encoded><![CDATA[<p>Today we&rsquo;re introducing the proposal for the <a href="https://github.com/modelcontextprotocol/ext-apps">MCP Apps Extension</a> (<a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1865">SEP-1865</a>) to standardize support for interactive user interfaces in the Model Context Protocol.</p>
<p>This extension addresses one of the most requested features from the MCP community and builds on proven work from <a href="https://github.com/idosal/mcp-ui">MCP-UI</a> and <a href="https://developers.openai.com/apps-sdk/">OpenAI Apps SDK</a> - the <strong>ability for MCP servers to deliver interactive user interfaces to hosts</strong>.</p>
<p>MCP Apps Extension introduces a standardized pattern for declaring UI resources, linking them to tools, and enabling bidirectional communication between embedded interfaces and the host application.</p>
<p><img alt="Example of an inline chat app with interactive UI for permission management" loading="lazy" src="/posts/images/inline-chat-app.png"></p>
<p>The SEP was authored by MCP Core Maintainers at OpenAI and Anthropic, together with the MCP-UI creators and lead maintainers of the MCP UI Community Working Group.</p>
<h2 id="standardization-for-interactive-interfaces">Standardization for interactive interfaces</h2>
<p>Currently, MCP servers are limited to exchanging text and structured data with hosts. While this works well for many use cases, it creates friction when tools need to present visual information or gather complex user input.</p>
<p>For example, consider a data visualization MCP server that returns chart data as JSON. The host application must interpret that data and render it. Handling all kinds of specialized data in this scenario translates to a significant burden for client developers, who would need to build their own logic to render the UI. As more UI requirements come up, like the need to collect multiple related settings from users, the complexity balloons. Alternatively, without UI support, these interactions become awkward exchanges of text prompts and responses.</p>
<p>The MCP community has been creative in working around these limitations, but different implementations using varying conventions and architectures make it harder for servers to work consistently across clients. This lack of standardization creates a real risk of ecosystem fragmentation - something we&rsquo;re working to proactively prevent.</p>
<h2 id="building-together">Building together</h2>
<p>The <a href="https://github.com/MCP-UI-Org/mcp-ui">MCP-UI project</a>, created by <a href="https://github.com/idosal">Ido Salomon</a> and <a href="https://github.com/liady">Liad Yosef</a> and maintained by a dedicated community, spearheaded the vision of agentic apps with interactive interfaces. The project developed patterns for delivering rich user interfaces as first-class MCP resources, proving that agentic apps fit naturally within the MCP architecture. The project is backed by a large community and provides <a href="https://mcpui.dev/guide/client/overview">rich SDKs</a>, adopted at leading companies and projects such as Postman, Shopify, Hugging Face, Goose, and ElevenLabs.</p>
<p>The <a href="https://developers.openai.com/apps-sdk/">OpenAI Apps SDK</a> further validated the demand for rich UI experiences within conversational AI interfaces. The SDK enables developers to build rich, interactive applications inside ChatGPT using MCP as its backbone. To ensure interoperability and establish consistent security and usage patterns across the ecosystem, Anthropic, OpenAI, and MCP-UI are collaborating to create an official MCP extension for interactive interfaces.</p>
<p><img alt="Example of a fullscreen app with a rich data table interface" loading="lazy" src="/posts/images/fullscreen-chat-app.png"></p>
<h2 id="mcp-apps-extension-specification">MCP Apps Extension specification</h2>
<p>We&rsquo;re proposing a specification for UI resources in MCP, but the implications go further than just a set of schema changes. The MCP Apps Extension is starting to look like an agentic app runtime: a foundation for novel interactions between AI models, users, and applications. The proposal is intentionally lean, starting with core patterns that we plan on expanding over time.</p>
<h3 id="key-design-decisions">Key design decisions</h3>
<h4 id="pre-declared-resources">Pre-declared resources</h4>
<p>UI templates are resources with the <code>ui://</code> URI scheme, referenced in tool metadata.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ts" data-lang="ts"><span style="display:flex;"><span><span style="color:#75715e">// Server registers UI resource
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>{
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">uri</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;ui://charts/bar-chart&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Bar Chart Viewer&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">mimeType</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;text/html+mcp&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Tool references it in metadata
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>{
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;visualize_data_as_bar_chart&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Plots some data as a bar chart&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">inputSchema</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;object&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">properties</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">series</span><span style="color:#f92672">:</span> { <span style="color:#66d9ef">type</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;array&#34;</span>, <span style="color:#a6e22e">items</span>: <span style="color:#66d9ef">....</span> }
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">_meta</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;ui/resourceUri&#34;</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;ui://charts/bar-chart&#34;</span>,
</span></span><span style="display:flex;"><span>  }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>This approach enables hosts to prefetch and review templates before tool execution, improving both performance and security. It also separates static presentation (the template) from dynamic data (tool results), enabling better caching.</p>
<h4 id="mcp-transport-for-communication">MCP transport for communication</h4>
<p>Instead of inventing a custom message protocol, UI components communicate with hosts using existing MCP JSON-RPC base protocol over <code>postMessage</code>. This means that:</p>
<ul>
<li>UI developers can use the standard <code>@modelcontextprotocol/sdk</code> to build their applications</li>
<li>All communication is structured and auditable</li>
<li>Future MCP features automatically work with the UI extension</li>
</ul>
<h4 id="starting-with-html">Starting with HTML</h4>
<p>The initial extension specification supports only <code>text/html</code> content, rendered in sandboxed <a href="https://developer.mozilla.org/docs/Web/HTML/Reference/Elements/iframe">iframes</a>. This provides:</p>
<ul>
<li>Universal browser support</li>
<li>Well-understood security model</li>
<li>Screenshot and preview generation capabilities</li>
<li>A clear baseline for future extensions</li>
</ul>
<p>Other content types such as external URLs, remote DOM, and native widgets are explicitly deferred to future iterations.</p>
<h4 id="security-first">Security-first</h4>
<p>Hosting interactive content from MCP servers requires careful security consideration. The proposal addresses this through multiple layers:</p>
<ol>
<li><strong>Iframe sandboxing</strong>: All UI content runs in sandboxed iframes with restricted permissions</li>
<li><strong>Predeclared templates</strong>: Hosts can review HTML content before rendering</li>
<li><strong>Auditable messages</strong>: All UI-to-host communication goes through loggable JSON-RPC</li>
<li><strong>User consent</strong>: Hosts can require explicit approval for UI-initiated tool calls</li>
</ol>
<p>These mitigations create defense in depth against malicious servers while preserving the flexibility developers need.</p>
<h4 id="backward-compatibility">Backward compatibility</h4>
<p>MCP Apps is an optional extension. Existing implementations continue working without changes, and hosts can gradually adopt UI support at their own pace. Servers should provide text-only fallback for all UI-enabled tools and return meaningful content even when UI is unavailable, so they can serve both UI-capable and text-only hosts.</p>
<h2 id="whats-next">What&rsquo;s next</h2>
<p>The <a href="https://github.com/modelcontextprotocol-community/working-groups/issues/35">UI Community Working Group</a> has been instrumental in shaping this proposal through extensive feedback and discussion. We have built an <a href="https://github.com/modelcontextprotocol/ext-apps">early access SDK</a> to demonstrate the patterns and types described in the specification proposal. The <a href="https://mcpui.dev/">MCP-UI</a> client and server SDKs support these patterns.</p>
<p>If you are interested in contributing to this effort, we invite you to:</p>
<ul>
<li>Review the full specification in <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1865">SEP-1865</a></li>
<li>Share feedback and concerns in <a href="https://github.com/MCP-UI-Org/mcp-ui/issues">GitHub Issues</a></li>
<li>Join the discussion in the <code>#ui-wg</code> channel in the <a href="https://modelcontextprotocol.io/community/communication#discord">MCP Contributors Discord</a></li>
<li>Test prototype implementations and share your experience</li>
</ul>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>This proposal wouldn&rsquo;t exist without the work of the maintainers at MCP-UI, OpenAI, and Anthropic.</p>
<p><strong>Ido Salomon</strong> and <strong>Liad Yosef</strong>, through MCP-UI and moderation of <code>#ui-wg</code>, incubated and championed many of the patterns that MCP Apps now standardizes, and together with contributors demonstrated that UI resources can be a natural part of MCP.</p>
<p><strong>Sean Strong</strong>, <strong>Olivier Chafik</strong>, <strong>Anton Pidkuiko</strong>, and <strong>Jerome Swannack</strong> from Anthropic helped steer the initiative and drive the collaboration.</p>
<p><strong>Nick Cooper</strong>, <strong>Alexei Christakis</strong>, and <strong>Bryan Ashley</strong> from OpenAI have provided valuable direction from their experience building the Apps SDK.</p>
<p>Special thanks to the <strong>UI Community Working Group</strong> members and everyone who contributed to the discussions that shaped this proposal.</p>
]]></content:encoded></item></channel></rss>