<?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>Model Context Protocol Blog</title><link>https://blog.modelcontextprotocol.io/</link><description>Recent content 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><atom:link href="https://blog.modelcontextprotocol.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Expanding the MCP Maintainer Team</title><link>https://blog.modelcontextprotocol.io/posts/2026-04-08-maintainer-update/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2026-04-08-maintainer-update/</guid><description>Updates to the Model Context Protocol (MCP) governance team: a new Lead Maintainer and an addition to the Core Maintainer group as the open-source project continues to grow.</description><content:encoded><![CDATA[<p>I&rsquo;m happy to share two updates to the maintainer team: <strong>Clare Liguori</strong> is joining the <a href="https://modelcontextprotocol.io/community/governance#current-core-maintainers">Core Maintainer</a> group, and <strong>Den Delimarsky</strong> is joining me as a <a href="https://modelcontextprotocol.io/community/governance#current-lead-maintainers">Lead Maintainer</a>.</p>
<p>When we <a href="/posts/2025-07-31-governance-for-mcp/">introduced the MCP governance model</a> last summer, the goal was to make sure the protocol could keep growing without any one person becoming a bottleneck. That has held up well through two specification releases, the move to the <a href="/posts/2025-12-09-mcp-joins-agentic-ai-foundation/">Agentic AI Foundation (AAIF)</a>, and a steady increase in SEP volume, and these changes give the project the leadership capacity it needs for what comes next.</p>
<h2 id="welcoming-clare-liguori-as-core-maintainer">Welcoming Clare Liguori as Core Maintainer</h2>
<img src="/posts/images/maintainer-update-2026-04/clare.webp" alt="Clare Liguori" width="400" />
<p>I&rsquo;m pleased to welcome <a href="https://github.com/clareliguori">Clare Liguori</a> to the <a href="https://modelcontextprotocol.io/community/governance#current-core-maintainers">Core Maintainer</a> team.</p>
<p>Clare is a Senior Principal Engineer at Amazon Web Services, where she works on agentic AI developer tooling. Her current focus is <a href="https://kiro.dev/">Kiro</a> and the Strands Agents SDK, and over more than a decade at AWS she has also worked on AWS Proton, Amazon ECS, the AWS Code Suite, and several open source projects.</p>
<p>Clare has been bringing that depth of developer-tooling and agent-runtime experience directly into MCP&rsquo;s design work, particularly the discussions around <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2229">unsolicited tasks</a>, the agent execution model, and the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2459">Triggers &amp; Events working group</a>. She knows firsthand what the protocol has to look like inside production agent runtimes serving large numbers of developers. As those proposals move through the SEP process over the coming year, that perspective will keep the spec grounded in what client implementers actually need. I&rsquo;m glad to have her at the table.</p>
<p>Welcome, Clare!</p>
<h2 id="den-delimarsky-joins-as-lead-maintainer">Den Delimarsky Joins as Lead Maintainer</h2>
<img src="/posts/images/maintainer-update-2026-04/den.jpeg" alt="Den Delimarsky" width="400" />
<p><a href="https://github.com/localden">Den Delimarsky</a> is stepping up from Core Maintainer to Lead Maintainer, joining me in that role.</p>
<p>Den is a Member of Technical Staff at Anthropic, where he works across the MCP ecosystem: the specification, the SDKs, governance, and the developer experience around all of it. Before Anthropic he was a Principal Product Engineer in Microsoft&rsquo;s CoreAI division, and he brings a wealth of experience across developer tools, SDKs, and security tooling.</p>
<p>Den&rsquo;s work is most visible in authorization and security. He co-authored the <a href="https://modelcontextprotocol.io/specification/draft/basic/authorization">authorization specification</a>, brought <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/734">RFC 8707 Resource Indicators</a> into the spec, and has continued to build on it through <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/835">SEP-835</a>, <a href="https://modelcontextprotocol.io/seps/1024-mcp-client-security-requirements-for-local-server-">SEP-1024</a>, and the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2350">SEP-2350</a> family of proposals, among others. He also led the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1887">2025-11-25 specification release</a>, co-leads the Security Interest Group, and built <a href="https://localden.github.io/mcp-repo-data-tracker/">a contribution tracker</a> that gives SDK and spec maintainers a birds-eye view of activity across the project&rsquo;s repositories.</p>
<p>I&rsquo;m glad to have Den as a partner in this role, and I&rsquo;m looking forward to what we can do together for the protocol in the years ahead.</p>
<h2 id="whats-next">What&rsquo;s Next</h2>
<p>MCP continues to grow at a pace none of us could have predicted, and that growth wouldn&rsquo;t be possible without the people who keep it moving every day: the SDK maintainers, the working group facilitators, and everyone who has authored or reviewed a SEP. Thank you.</p>
<p>With this team in place, I&rsquo;m excited to keep working alongside the maintainer group to evolve the protocol and make sure MCP keeps pace with what the community needs from it. If you&rsquo;d like to get involved, the <a href="https://modelcontextprotocol.io/community/governance">governance docs</a> explain how the project is organized, the <a href="https://modelcontextprotocol.io/community/contributor-ladder">Contributor Ladder</a> shows how people grow into these roles, the <a href="https://modelcontextprotocol.io/development/roadmap">roadmap</a> shows where we&rsquo;re headed, and our <a href="https://modelcontextprotocol.io/community/communication#discord">Discord</a> is the best place to talk to the people working on it. Come build with us.</p>
]]></content:encoded></item><item><title>Tool Annotations as Risk Vocabulary: What Hints Can and Can't Do</title><link>https://blog.modelcontextprotocol.io/posts/2026-03-16-tool-annotations/</link><pubDate>Mon, 16 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2026-03-16-tool-annotations/</guid><description>&lt;p>MCP tool annotations were introduced nearly a year ago as a way for servers to describe the behavior of their tools — whether they&amp;rsquo;re read-only, destructive, idempotent, or reach outside their local environment. Since then, the community has filed five independent &lt;a href="https://modelcontextprotocol.io/community/sep-guidelines">Specification Enhancement Proposals&lt;/a> (SEPs) proposing new annotations, driven in part by a sharper collective understanding of where risk actually lives in agentic workflows. This post recaps where tool annotations are today, what they can and can&amp;rsquo;t realistically do, and offers a framework for evaluating new proposals.&lt;/p></description><content:encoded><![CDATA[<p>MCP tool annotations were introduced nearly a year ago as a way for servers to describe the behavior of their tools — whether they&rsquo;re read-only, destructive, idempotent, or reach outside their local environment. Since then, the community has filed five independent <a href="https://modelcontextprotocol.io/community/sep-guidelines">Specification Enhancement Proposals</a> (SEPs) proposing new annotations, driven in part by a sharper collective understanding of where risk actually lives in agentic workflows. This post recaps where tool annotations are today, what they can and can&rsquo;t realistically do, and offers a framework for evaluating new proposals.</p>
<h2 id="what-tool-annotations-are">What Tool Annotations Are</h2>
<p><a href="https://modelcontextprotocol.io/specification/2025-11-25/server/tools">Tool annotations</a> shipped in the <code>2025-03-26</code> spec revision. The current <a href="https://modelcontextprotocol.io/specification/2025-11-25/schema#toolannotations"><code>ToolAnnotations</code> interface</a> looks like this:</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-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">interface</span> <span style="color:#a6e22e">ToolAnnotations</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">title?</span>: <span style="color:#66d9ef">string</span>;
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">readOnlyHint?</span>: <span style="color:#66d9ef">boolean</span>; <span style="color:#75715e">// default: false
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">destructiveHint?</span>: <span style="color:#66d9ef">boolean</span>; <span style="color:#75715e">// default: true
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">idempotentHint?</span>: <span style="color:#66d9ef">boolean</span>; <span style="color:#75715e">// default: false
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>  <span style="color:#a6e22e">openWorldHint?</span>: <span style="color:#66d9ef">boolean</span>; <span style="color:#75715e">// default: true
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>}
</span></span></code></pre></div><p>Every property is a <strong>hint</strong>. The spec is explicit about this: annotations are not guaranteed to faithfully describe tool behavior, and clients <strong>must</strong> treat them as untrusted unless they come from a trusted server.</p>
<p>These four boolean hints give clients a basic risk vocabulary:</p>
<ul>
<li><strong><code>readOnlyHint</code></strong>: Does the tool modify its environment?</li>
<li><strong><code>destructiveHint</code></strong>: If it does modify things, is the change destructive (as opposed to additive)?</li>
<li><strong><code>idempotentHint</code></strong>: Can you safely call it again with the same arguments?</li>
<li><strong><code>openWorldHint</code></strong>: Does the tool interact with an open world of external entities, or is its domain closed?</li>
</ul>
<p>The first three hints mostly answer a preflight question: should the client ask for confirmation before calling this tool? <code>openWorldHint</code> is different. It&rsquo;s about where the tool reaches and what its output might carry back, which matters after the call as much as before. It&rsquo;s also the hint most sensitive to deployment context. &ldquo;External&rdquo; might mean anything outside a corporate network or anything beyond the local machine, depending on where the server runs. The safest posture is to treat anything a tool considers <strong>external</strong> as a potential source of untrusted content.</p>
<p>The defaults are deliberately cautious: a tool with no annotations is assumed to be non-read-only, potentially destructive, non-idempotent, and open-world. The spec assumes the worst until told otherwise. Making annotations optional kept the barrier to entry low for server authors, but it also means coverage is uneven. Many servers ship without them, and clients vary in how strictly they honor the pessimistic defaults. Closing that gap is part of what the current wave of SEPs is trying to do.</p>
<h2 id="how-we-got-here">How We Got Here</h2>
<p>The <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/185">original proposal discussion</a> surfaced a question that still shapes every annotation proposal today: <strong>what value do hints provide when they can&rsquo;t be trusted?</strong> MCP co-creator Justin Spahr-Summers <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/185#discussion_r2010043988">raised it directly during review</a>:</p>
<blockquote>
<p>I think the information itself, <em>if it could be trusted</em>, would be very useful, but I wonder how a client makes use of this flag knowing that it&rsquo;s <em>not</em> trustable.</p></blockquote>
<p>Basil Hosmer <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/185#discussion_r2010702646">pushed the point further</a>, arguing that clients should ignore annotations from untrusted servers entirely:</p>
<blockquote>
<p>&ldquo;Clients should ignore annotations from untrusted servers&rdquo; applies to <strong>all</strong> annotations, even <code>title</code> — but especially the ones that describe operational properties.</p></blockquote>
<p>The spec landed on a compromise: call everything a <strong>hint</strong>, require clients to treat hints as untrusted by default, and leave it to each client to decide how much weight to give them based on what it knows about the server.</p>
<p>The interface has stayed small since then, and that&rsquo;s been intentional. <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/663"><code>title</code> went in</a> because it&rsquo;s just a display name with no trust implications. <code>taskHint</code> was proposed as an annotation but <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1854">landed as <code>Tool.execution</code> instead</a>, on the grounds that execution metadata isn&rsquo;t really a behavioral hint. Earlier takes on <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/489">stateless, streaming, and async annotations</a> and <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1075">security annotations</a> are worth knowing about too, since the same concerns show up again in the SEPs open today.</p>
<h2 id="whats-open-now">What&rsquo;s Open Now</h2>
<p>Five SEPs currently propose new annotations or closely related capabilities:</p>
<table>
  <thead>
      <tr>
          <th>SEP</th>
          <th>Proposal</th>
          <th>Status</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1913">#1913</a></td>
          <td>Trust and Sensitivity Annotations</td>
          <td>Draft</td>
      </tr>
      <tr>
          <td><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1984">#1984</a></td>
          <td>Comprehensive Tool Annotations for Governance/UX</td>
          <td>Draft</td>
      </tr>
      <tr>
          <td><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1561">#1561</a></td>
          <td><code>unsafeOutputHint</code></td>
          <td>Proposal</td>
      </tr>
      <tr>
          <td><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1560">#1560</a></td>
          <td><code>secretHint</code></td>
          <td>Proposal</td>
      </tr>
      <tr>
          <td><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1487">#1487</a></td>
          <td><code>trustedHint</code></td>
          <td>Proposal</td>
      </tr>
  </tbody>
</table>
<p>The trust and sensitivity work is co-authored by GitHub and OpenAI based on gaps they hit running MCP in production. A Tool Annotations Interest Group is forming to work through these alongside related proposals like <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1862">tool resolution and preflight checks</a>. Reviewing each one in isolation makes it easy to miss how a given annotation interacts with others, and it&rsquo;s those interactions that determine how risky a tool actually is in a given session.</p>
<h2 id="the-lethal-trifecta-why-combinations-matter">The Lethal Trifecta: Why Combinations Matter</h2>
<p>Simon Willison&rsquo;s <a href="https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/">lethal trifecta</a> names three capabilities that, when combined, create the conditions for data theft: <strong>access to private data</strong>, <strong>exposure to untrusted content</strong>, and <strong>the ability to externally communicate</strong>. The attack is simple: LLMs follow instructions in content, and they can&rsquo;t reliably tell a user&rsquo;s instructions apart from ones an attacker embedded in a web page, email, or calendar event. If the agent has all three capabilities, an attacker who controls one piece of untrusted content can trick the model into reading private data and sending it out.</p>
<p><a href="https://layerxsecurity.com/blog/claude-desktop-extensions-rce/">Researchers have demonstrated this</a> using a malicious Google Calendar event description, an MCP calendar server, and a local code execution tool. The code execution tool is the linchpin in that chain — any agent with unrestrained shell access sits one injected instruction away from exfiltration, and that&rsquo;s true whether the tool arrived via MCP or was built into the host. What MCP adds is the ease of assembling the chain: users routinely combine tools from several servers in one session, so the risk profile is a property of the session, not of any single server.</p>
<p>One commenter on Willison&rsquo;s newsletter connected this directly to tool annotations:</p>
<blockquote>
<p>If the current state is tainted, block (or require explicit human approval for) any action with exfiltration potential&hellip; This also makes MCP&rsquo;s mix-and-match story extra risky unless tools carry metadata like: <code>reads_private_data</code> / <code>sees_untrusted_content</code> / <code>can_exfiltrate</code> — and the runtime enforces &rsquo;never allow all three in a single tainted execution path.'</p></blockquote>
<p>Several of the open SEPs are trying to define that kind of metadata so a client can spot when a session has all three legs of the trifecta available.</p>
<h2 id="what-annotations-can-do">What Annotations Can Do</h2>
<p><strong>Drive confirmation prompts.</strong> A tool marked <code>readOnlyHint: true</code> from a trusted server might be auto-approved, while <code>destructiveHint: true</code> gets a confirmation step. A user asks their agent to clean up old files, the agent reaches for <code>delete_file</code>, and the client shows a dialog listing what&rsquo;s about to be deleted before anything happens. This is the most common use of annotations today.</p>
<p><strong>Enable graduated trust.</strong> An enterprise running its own internal MCP servers behind auth has a very different trust relationship than someone installing a random server off the internet. Annotations from the first can drive policy; from the second they&rsquo;re informational at best. In practice most clients still treat installation itself as the trust signal and don&rsquo;t distinguish further, so this is more of a design opportunity than a widely shipped feature.</p>
<p><strong>Improve UX.</strong> <code>title</code> is just a display name. Annotations that help users understand what tools do without running them are useful regardless of trust. This is largely unexploited today: no MCP client lets users filter tools by annotation values, and none surface annotations as context in approval prompts. GitHub&rsquo;s read-only mode is the closest production analog, enabled by about 17% of users.</p>
<p><strong>Feed policy engines.</strong> Annotations can be one input among several into a policy engine enforcing rules like &ldquo;no destructive tools without approval&rdquo; or &ldquo;open-world tools are blocked in sessions that have accessed private data.&rdquo; The hints don&rsquo;t need to be perfectly trustworthy if the engine cross-references other signals.</p>
<p>Adoption across all of these is uneven, partly because MCP users split into two camps. Developers building autonomous agents treat confirmations as friction and lean on sandboxing instead. Enterprise adopters want more annotations than currently exist. One camp barely notices annotations, the other wants a much richer vocabulary.</p>
<h2 id="what-annotations-cant-do">What Annotations Can&rsquo;t Do</h2>
<p><strong>They don&rsquo;t make the model resist prompt injection.</strong> Annotations are static metadata on a tool definition; nothing in them tells the model to ignore malicious instructions it reads from a calendar event. What an annotation like <code>seesUntrustedData</code> <em>could</em> do is let the client treat the session as tainted once that tool runs and tighten approvals from then on — a defense at the host layer, not inside the model.</p>
<p><strong>An untrusted server can lie.</strong> A server can claim <code>readOnlyHint: true</code> and delete your files anyway. This is why the spec says clients <strong>must</strong> treat annotations from untrusted servers as untrusted.</p>
<p><strong>They aren&rsquo;t enforcement.</strong> If you need a guarantee that a tool can&rsquo;t exfiltrate data, that&rsquo;s a job for network controls or sandboxing, not a boolean hint. We made the <a href="https://blog.modelcontextprotocol.io/posts/2025-11-03-using-server-instructions/">same point about server instructions</a>: don&rsquo;t rely on soft signals for things that need to be hard guarantees.</p>
<p><strong>A tool&rsquo;s risk depends on what else is in the session.</strong> <code>search_emails</code> isn&rsquo;t safe or dangerous on its own; it depends on what other tools the agent has. Annotations on one tool can&rsquo;t tell you that.</p>
<h2 id="questions-for-evaluating-new-annotations">Questions for Evaluating New Annotations</h2>
<p>As a starting point for the Interest Group, we&rsquo;re putting forward a tentative set of questions to ask of each annotation proposal. These will likely change as the group works through the open SEPs.</p>
<h3 id="1-what-client-behavior-does-it-enable">1. What client behavior does it enable?</h3>
<p>Maintainer Jonathan Hefner <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/616#issuecomment-3330296295">put this directly on an early draft</a> of what became the governance/UX annotations proposal:</p>
<blockquote>
<p>It&rsquo;s not clear to me exactly how a client would behave differently when presented with these annotations.</p></blockquote>
<p>If there&rsquo;s no concrete client action that changes based on the annotation, it probably doesn&rsquo;t belong in the protocol. Each of the existing hints maps to at least one decision a client can make:</p>
<table>
  <thead>
      <tr>
          <th>Hint</th>
          <th>Example client behavior</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>readOnlyHint: true</code></td>
          <td>Skip the confirmation dialog</td>
      </tr>
      <tr>
          <td><code>destructiveHint: true</code></td>
          <td>Show a warning before executing</td>
      </tr>
      <tr>
          <td><code>idempotentHint: true</code></td>
          <td>Safe to retry on failure</td>
      </tr>
      <tr>
          <td><code>openWorldHint: true</code></td>
          <td>Scrutinize output for untrusted content; flag a trust-boundary cross</td>
      </tr>
  </tbody>
</table>
<h3 id="2-does-it-need-trust-to-be-useful">2. Does it need trust to be useful?</h3>
<p><code>title</code> is useful even from an untrusted server; worst case you show a bad display name. <code>readOnlyHint</code> from an untrusted server isn&rsquo;t actionable, because the decision it informs — whether to skip a confirmation — only makes sense if you believe the hint. Proposals should say where they fall on that spectrum, since it determines which clients can actually use them.</p>
<h3 id="3-could-_meta-handle-it-instead">3. Could <code>_meta</code> handle it instead?</h3>
<p>Tools already have <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic#_meta"><code>_meta</code></a>, which accepts namespaced keys like <code>com.example/my-field</code> for exactly this kind of metadata. If an annotation only matters to one deployment style where the same organization runs both the server and the client, <code>_meta</code> is a reasonable home for it. It&rsquo;s also a good way to prove out an idea before writing a SEP: ship a namespaced field, see how it holds up in production, and come back with a proposal backed by actual usage instead of a design doc. What <code>_meta</code> can&rsquo;t do is drive behavior in off-the-shelf clients — those won&rsquo;t read a key they&rsquo;ve never heard of, so anything aimed at ecosystem-wide UX still needs a real annotation.</p>
<h3 id="4-does-it-help-reason-about-combinations">4. Does it help reason about combinations?</h3>
<p>Annotations that help a client understand what happens when tools are used together are worth more than ones that only describe a tool in isolation. <code>openWorldHint</code> already hints at this: a client could use it to notice that a session mixes closed-world data access tools with open-world communication tools.</p>
<h3 id="5-is-it-a-hint-or-a-contract">5. Is it a hint or a contract?</h3>
<p>Hints inform decisions; contracts enforce them. If a proposal&rsquo;s value depends on the annotation being true, it&rsquo;s asking for a contract, and the right place for that is the authorization layer, the transport, or the runtime rather than <code>ToolAnnotations</code>. Hints work best when they&rsquo;re still useful even if some servers get them wrong.</p>
<h2 id="where-this-is-heading">Where This Is Heading</h2>
<p>The Tool Annotations Interest Group includes participants from Microsoft, OpenAI, AWS, Cloudflare, and Anthropic, among others. These are companies that build both MCP hosts and MCP servers at scale, so they sit on both sides of the annotation contract: they need annotations expressive enough to surface risk to their users, and they need to author annotations that other clients will actually honor. Among the questions on the group&rsquo;s agenda are whether annotations belong on tool responses as well as tool definitions, and whether any annotations should be evaluated at runtime rather than declared statically.</p>
<p>In the meantime, the existing annotations are worth using. If you&rsquo;re writing a server, set <code>readOnlyHint: true</code> on read-only tools, <code>destructiveHint: false</code> on additive operations, and <code>openWorldHint: false</code> on closed-domain tools. If you&rsquo;re writing a client, treat annotations from untrusted servers as informational and lean on them for UX, but keep your actual safety guarantees in deterministic controls. And if you&rsquo;re thinking of proposing a new annotation, the questions above are a good place to start shaping it.</p>
<h2 id="get-involved">Get Involved</h2>
<p>The Tool Annotations Interest Group is forming now. If you&rsquo;re interested in contributing:</p>
<ul>
<li>Review the open SEPs linked above and leave feedback</li>
<li>Join the conversation in <code>#tool-annotations-ig</code> on the <a href="https://modelcontextprotocol.io/community/communication#discord">MCP Contributors Discord</a></li>
</ul>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>This post draws on discussions with the MCP community, particularly the contributors involved in the Tool Annotations Interest Group proposal, including <strong>Sam Morrow</strong> (GitHub), <strong>Robert Reichel</strong> (OpenAI), <strong>Den Delimarsky</strong> (Anthropic), <strong>Nick Cooper</strong> (OpenAI), <strong>Connor Peet</strong> (Microsoft), and <strong>Luca Chang</strong> (AWS).</p>
]]></content:encoded></item><item><title>Understanding MCP Extensions</title><link>https://blog.modelcontextprotocol.io/posts/2026-03-11-understanding-mcp-extensions/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2026-03-11-understanding-mcp-extensions/</guid><description>A practical guide to MCP extensions: how they layer new capabilities on top of the core protocol, and patterns the community is already using.</description><content:encoded><![CDATA[<p>You&rsquo;ve built an MCP server that works quite well, but now you&rsquo;re wondering: <em>How do I add richer UI elements? Custom auth flows? What about domain-specific conventions, like those for finance or healthcare?</em></p>
<p>This is where <em>extensions</em> come in. They let developers layer new capabilities on top of the baseline MCP implementation without touching the core protocol. This allows us to keep things stable while also opening up room to experiment, learn, and build with the community&rsquo;s needs in mind.</p>
<p>In this post, we&rsquo;ll walk through how extensions fit into the MCP ecosystem and share some patterns the community is already exploring. Think of this less as a formal specification change and more as a short practical guide to extending MCP.</p>
<h2 id="how-mcp-is-structured">How MCP is structured</h2>
<p>It helps to think of MCP in three layers:</p>
<ul>
<li><strong>MCP core specification:</strong> <a href="https://modelcontextprotocol.io/specification/latest">The protocol itself</a>. This is how clients and servers talk to each other. It also represents the absolute minimum bar for client and server interoperability.</li>
<li><strong>MCP projects:</strong> Supporting infrastructure like the <a href="https://registry.modelcontextprotocol.io/">Registry</a>, that helps developers discover MCP servers, or <a href="https://modelcontextprotocol.io/docs/tools/inspector">Inspector</a>, that makes MCP server testing and debugging easier.</li>
<li><strong>MCP extensions:</strong> Optional patterns that developers can adopt for specialized use cases, built on top of the MCP core specification.</li>
</ul>
<p>Extensions let the ecosystem grow and give us an avenue to test changes and emerging spec components without destabilizing the core protocol that lots of production clients and servers already depend on.</p>
<p>The <a href="https://modelcontextprotocol.io/extensions/overview">Extensions documentation</a> covers the full details — including extension identifiers, capability negotiation during the initialization handshake, and the SEP (Specification Enhancement Proposal) process for proposing new ones.</p>
<p>Here&rsquo;s where it gets interesting. Extensions are <strong>patterns built on existing MCP mechanisms</strong>, and they&rsquo;re strictly additive: a client or server that doesn&rsquo;t recognize an extension simply skips it during negotiation, and the baseline protocol keeps working. Nothing breaks when one side hasn&rsquo;t opted in.</p>
<p>In practice, a few of these patterns have already emerged — some now formalized as official extensions, others still exploratory:</p>
<ul>
<li><strong>UI extensions:</strong> Imagine a server that returns not just data, but an interactive interface for working with it — a chart you can filter, a form you can submit, a dashboard you can drill into. That&rsquo;s what <a href="https://modelcontextprotocol.io/extensions/apps/overview">MCP Apps</a> enables. It&rsquo;s the first official MCP extension and <a href="https://blog.modelcontextprotocol.io/posts/2026-01-26-mcp-apps/">went GA in January 2026</a>, with support already live in ChatGPT, Claude, VS Code, Goose, and <a href="https://modelcontextprotocol.io/extensions/client-matrix">more</a>.</li>
<li><strong>Authorization extensions:</strong> Need machine-to-machine auth without a user in the loop, or centralized enterprise IdP control? The <a href="https://modelcontextprotocol.io/extensions/auth/overview">auth extensions</a> layer these on top of MCP&rsquo;s core OAuth framework — OAuth Client Credentials and Enterprise-Managed Authorization are both live today.</li>
<li><strong>Domain-specific extensions:</strong> Community groups are already exploring conventions for verticals like financial services, where developers might want standardized ways to handle compliance metadata.</li>
</ul>
<p>Another important side-effect to this approach is that MCP client and server developers get richer functionality without having to wait for protocol changes, which might need more extensive validation before being merged into the core.</p>
<p>Extensions are also <em>the way</em> to validate future protocol changes - if a particular implementation gains traction, that signals that there is a growing community need in protocol functionality that could become a part of the specification.</p>
<h3 id="how-extensions-are-governed">How extensions are governed</h3>
<p>Extensions are community-driven, and <strong>all of them are optional</strong>. Developers adopt what makes sense for their use case.</p>
<p>At the same time, we encourage implementing official and recommended extensions when possible. It helps the whole ecosystem work better together. Official extensions typically start as conversations between MCP contributors, both on the core team and in the broader community, before graduating to the <a href="https://github.com/modelcontextprotocol">Model Context Protocol GitHub organization</a> where they&rsquo;re maintained collaboratively, following the <a href="https://modelcontextprotocol.io/seps/2133-extensions">Extensions Track SEP process</a>.</p>
<p>Beyond officially-supported extensions, community members and working groups are also free to define their own extensions for any custom needs.</p>
<h3 id="a-note-on-proprietary-integrations">A note on proprietary integrations</h3>
<p>Some MCP clients ship their own proprietary features, like custom UI systems, that happen to use MCP under the hood. These are <strong>not necessarily</strong> considered MCP extensions. They integrate with MCP servers but they don&rsquo;t define how MCP itself behaves at the protocol level. We will work with client and server implementers to help them adopt extensions as the de-facto way to implement custom behaviors.</p>
<h2 id="get-started">Get started</h2>
<p>If you&rsquo;re building on MCP and want to explore extensions:</p>
<ul>
<li><strong>Read the docs:</strong> The <a href="https://modelcontextprotocol.io/extensions/overview">Extensions overview</a> covers identifiers, negotiation, governance, and the full list of official extensions.</li>
<li><strong>Build an MCP App:</strong> Follow the <a href="https://modelcontextprotocol.io/extensions/apps/build">MCP Apps quickstart</a> to ship an interactive UI that works across supporting clients today.</li>
<li><strong>Check client support:</strong> See the <a href="https://modelcontextprotocol.io/extensions/client-matrix">Extension Support Matrix</a> for which clients already implement which extensions.</li>
<li><strong>Propose your own:</strong> If you have an idea for a new extension, the <a href="https://modelcontextprotocol.io/community/sep-guidelines">SEP guidelines</a> walk you through opening an Extensions Track SEP.</li>
</ul>
<h2 id="thank-you">Thank you</h2>
<p>This post wouldn&rsquo;t exist without the <a href="https://modelcontextprotocol.io/community/communication">MCP community</a>. The ideas here grew out of countless conversations - working group calls, GitHub threads, extension proposals, and plenty of back-and-forth in <a href="https://modelcontextprotocol.io/community/communication#discord">Discord</a>.</p>
<p>To everyone who&rsquo;s contributed ideas, challenged our initial assumptions, and helped shape where this is all going: thank you.</p>
<p>We&rsquo;ll keep sharing updates here on the blog and in the <a href="https://github.com/modelcontextprotocol">public repos</a>. See you there.</p>
]]></content:encoded></item><item><title>The 2026 MCP Roadmap</title><link>https://blog.modelcontextprotocol.io/posts/2026-mcp-roadmap/</link><pubDate>Mon, 09 Mar 2026 09:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2026-mcp-roadmap/</guid><description>The updated Model Context Protocol roadmap for 2026: transport scalability, agent communication, governance maturation, and enterprise readiness, plus guidance on SEP prioritization and how to get involved.</description><content:encoded><![CDATA[<p>MCP&rsquo;s <a href="https://blog.modelcontextprotocol.io/posts/2025-11-25-first-mcp-anniversary/">current spec release</a> came out in November 2025. We haven&rsquo;t cut a new version since, but the project hasn&rsquo;t stood still. Over the past year MCP has moved well past its origins as a way to wire up local tools. It now runs in production at companies large and small, powers agent workflows, and is shaped by a growing community through Working Groups, <a href="https://modelcontextprotocol.io/community/sep-guidelines">Spec Enhancement Proposals</a> (SEPs), and a formal governance process. None of that is news, but it&rsquo;s the foundation we&rsquo;re building on.</p>
<p>We spent the last few months working through a long list of candidate priorities. They were informed by production experience, community feedback, and the pain points that keep surfacing. We narrowed them down to the areas that matter most for 2026. The result is an updated <a href="https://modelcontextprotocol.io/development/roadmap">roadmap document</a> that lays out where we&rsquo;re headed.</p>
<p>If you read the <a href="/posts/2026-01-22-core-maintainer-update/">January update</a>, you&rsquo;ll recognize the broad strokes. Production deployments have different needs than the early experiments that got us here, and the roadmap now reflects that. Here&rsquo;s what changed and what it means for you.</p>
<h2 id="from-releases-to-working-groups">From Releases to Working Groups</h2>
<p>Previous versions of the roadmap were organized around release milestones: what&rsquo;s shipping in the next spec version and what comes after. That framing made sense when the project was smaller and most of the work flowed through a handful of people.</p>
<p><a href="https://modelcontextprotocol.io/community/working-interest-groups">Working and Interest Groups</a> are now the primary vehicle for protocol development, and the roadmap needed to reflect that. The new document is organized around <strong>priority areas</strong>, rather than around dates. Working Groups drive the timeline for their deliverables. The roadmap tells you which problems we consider most important and points you to the groups working on them.</p>
<p>This approach also lets us be more honest about the uncertainty inherent in a fast-growing project like MCP. A release-oriented roadmap implies a level of predictability that open-standards work rarely has.</p>
<h2 id="the-priority-areas">The Priority Areas</h2>
<p>Core maintainers ranked candidate areas, and the result was a clear top four. These are the areas where SEPs will receive expedited review and where most of our maintainer capacity is concentrated.</p>
<h3 id="transport-evolution-and-scalability">Transport Evolution and Scalability</h3>
<p>Streamable HTTP is the transport that lets MCP servers run as remote services rather than local processes. It unlocked a wave of production deployments. But running it at scale has surfaced a consistent set of gaps: stateful sessions fight with load balancers, horizontal scaling requires workarounds, and there&rsquo;s no standard way for a registry or crawler to learn what a server does without connecting to it.</p>
<p>The work here falls into two parts. First, evolving the transport and session model so that servers can scale horizontally without having to hold state, as well as clear, explicit mechanisms to handle sessions. Second, a standard metadata format, that can be served via <code>.well-known</code>, so that server capabilities are discoverable without a live connection.</p>
<p>One thing we want to be explicit about: we are <strong>not</strong> adding more official transports this cycle but evolve the existing transport. Keeping the set small is a deliberate decision grounded in the <a href="https://modelcontextprotocol.io/community/design-principles">MCP design principles</a>.</p>
<h3 id="agent-communication">Agent Communication</h3>
<p>The Tasks primitive (<a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1686">SEP-1686</a>) shipped as an experimental feature and works well for what it was designed to do. Early production use has surfaced a concrete list of lifecycle gaps to close: retry semantics when a task fails transiently, and expiry policies for how long results are retained after completion.</p>
<p>This is the kind of iteration you can only do once something is deployed and tested in the real world. We plan to take the same approach with other parts of MCP: ship an experimental version, gather production feedback, and iterate.</p>
<h3 id="governance-maturation">Governance Maturation</h3>
<p>Right now, every SEP requires full <a href="https://modelcontextprotocol.io/community/sep-guidelines">Core Maintainer</a> review, regardless of domain. That&rsquo;s a bottleneck. It slows down Working Groups that already have the expertise to evaluate proposals in their own area.</p>
<p>The goal is to remove that bottleneck without sacrificing quality. Concretely, that means a documented <strong>contributor ladder</strong> so there&rsquo;s a clear path from community participant to maintainer, and a delegation model that lets trusted Working Groups accept SEPs in their domain without waiting on a full core review. Core Maintainers keep strategic oversight. Working Groups get room to move.</p>
<h3 id="enterprise-readiness">Enterprise Readiness</h3>
<p>Enterprises are deploying MCP and running into a predictable set of problems: audit trails, SSO-integrated auth, gateway behavior, and configuration portability.</p>
<p>This is also the least defined of the four priorities, and that&rsquo;s intentional. We want the people experiencing these challenges to help us define the work.</p>
<p>A dedicated Enterprise WG does not yet exist. If you work in enterprise infrastructure and want to lead or join one, the <a href="https://modelcontextprotocol.io/community/working-interest-groups">Working Groups page</a> explains how to get started. We also recommend joining the <a href="https://modelcontextprotocol.io/community/communication#discord">contributor Discord</a> to make sure you&rsquo;re not duplicating work or going solo on new proposals.</p>
<p>We expect most of the enterprise readiness work to land as extensions rather than core spec changes. Enterprise needs are real, but they shouldn&rsquo;t make the base protocol heavier for everyone else.</p>
<h2 id="sep-prioritization-what-it-means-for-contributors">SEP Prioritization: What It Means for Contributors</h2>
<p>One of the most practical additions to the roadmap is explicit guidance on how SEP review capacity gets allocated.</p>
<p>The short version: <strong>SEPs aligned with the priority areas above will move the fastest.</strong> SEPs outside those areas aren&rsquo;t automatically rejected, but they face longer review timelines and a higher bar for justification. Maintainer bandwidth is finite, and we&rsquo;d rather be transparent about where it&rsquo;s going.</p>
<p>If you&rsquo;re considering writing a SEP, start with the <a href="https://modelcontextprotocol.io/community/sep-guidelines">SEP Guidelines</a>. Once you&rsquo;re familiar with those:</p>
<ol>
<li><strong>Check whether your proposed change maps to one of the priority areas</strong>. If it does not, be prepared for delays in reviews.</li>
<li><strong>Bring it to the relevant Working Group</strong>. SEPs that arrive with WG backing and a clear connection to the roadmap are the ones that move.</li>
</ol>
<h2 id="on-the-horizon">On the Horizon</h2>
<p>Not everything we care about made the top four, and we didn&rsquo;t want those areas to disappear from view. We&rsquo;re focused on a limited set of items, but we still want protocol exploration to continue at a good pace. The roadmap now includes an <strong>On the Horizon</strong> section for work with real community interest, such as triggers and event-driven updates, streamed and reference-based result types, deeper security and authorization work, and maturing the extensions ecosystem.</p>
<p>These aren&rsquo;t deprioritized in the sense of &ldquo;We don&rsquo;t want them.&rdquo; They&rsquo;re areas where we&rsquo;ll happily support a community-formed WG and review SEPs as time permits, but where Core Maintainers aren&rsquo;t actively standing things up this cycle.</p>
<p>Some of these already have active proposals in review, such as <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1932">SEP-1932 (DPoP)</a> and <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1933">SEP-1933 (Workload Identity Federation)</a>. Others, like triggers and event-driven updates, would benefit from a new Working Group.</p>
<h2 id="get-involved">Get Involved</h2>
<p>Every deliverable on the roadmap runs through a Working Group, and every Working Group is open to contributors. Here are a few ways to get involved:</p>
<ul>
<li><strong>Join a Working Group</strong>: Working Groups are the small teams doing the actual protocol design. They meet regularly and welcome new participants. The <a href="https://modelcontextprotocol.io/community/working-interest-groups">Working Groups &amp; Interest Groups</a> page lists what&rsquo;s active and how to connect.</li>
<li><strong>Propose a SEP</strong>: SEPs are how changes to the protocol get proposed and reviewed. The <a href="https://modelcontextprotocol.io/community/sep-guidelines">SEP guidelines</a> walk through the process.</li>
<li><strong>Start an extension</strong>: Extensions let us experiment with new capabilities outside the core spec. You can learn more in our <a href="https://modelcontextprotocol.io/extensions/overview">official Extensions documentation</a>.</li>
</ul>
<p>If you&rsquo;re not sure where to start, the easiest first step is to join a Working Group meeting and introduce yourself.</p>
<p>We&rsquo;re excited to build the protocol together!</p>
]]></content:encoded></item><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://block.github.io/goose/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>January MCP Core Maintainer Update</title><link>https://blog.modelcontextprotocol.io/posts/2026-01-22-core-maintainer-update/</link><pubDate>Fri, 23 Jan 2026 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2026-01-22-core-maintainer-update/</guid><description>Core Maintainer team changes for 2026: departing members, new additions, and what&amp;#39;s ahead for MCP governance.</description><content:encoded><![CDATA[<p>A lot has happened since we first released MCP. We wrapped up 2025 with a <a href="/posts/2025-11-25-first-mcp-anniversary/">major spec update</a> and the momentum hasn&rsquo;t slowed down. None of it would have happened without the community: every PR, every issue filed, every server and client built. That energy is what keeps MCP moving forward.</p>
<p>To keep that momentum going, the <a href="https://modelcontextprotocol.io/community/governance#current-core-maintainers">Core Maintainer</a> team is evolving as well.</p>
<h2 id="departing-core-maintainers">Departing Core Maintainers</h2>
<p>First, some news. <strong>Inna Harper</strong> and <strong>Basil Hosmer</strong> will be stepping away from the Core Maintainer team to focus on other projects.</p>
<p>Inna and Basil have been with MCP since its early days. They helped shape the protocol during some of its most critical moments, from key design decisions to designing and delivering our official SDKs as well as helping ship all major spec releases. Their fingerprints are all over what MCP is today.</p>
<p>Thank you both for your contributions and your dedication to the project. MCP is better because of you.</p>
<h2 id="welcoming-new-maintainers">Welcoming New Maintainers</h2>
<p>We&rsquo;re thrilled to welcome three new Core Maintainers to the team. They&rsquo;ve already been active in MCP discussions, reviewing <a href="https://modelcontextprotocol.io/community/sep-guidelines">Spec Enhancement Proposals</a> (SEPs), and helping shape the direction of the protocol.</p>
<h3 id="peter-alexander">Peter Alexander</h3>
<p><img alt="Peter Alexander" loading="lazy" src="/posts/images/core-maintainer-update/peter_cm.png"></p>
<p><strong>Peter Alexander</strong> is a Member of Technical Staff at Anthropic on the Model Context Protocol team.</p>
<p>Prior to Anthropic, Peter was a Senior Staff Software Engineer at Meta working in a variety of areas across product and infrastructure including virtual reality, video conferencing, and large-scale real-time publish/subscribe data infrastructure. He also spent some time in the gaming industry at Codemasters working on their Grid and DiRT series of games on console and PC as gameplay lead.</p>
<p>Peter has authored several SEPs including the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2133">Extensions framework</a> and <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2093">Resource Contents Metadata</a>, and has been an active reviewer and contributor to our SDKs, proposals around governance, roadmap, and specification changes.</p>
<h3 id="caitie-mccaffrey">Caitie McCaffrey</h3>
<p><img alt="Caitie McCaffrey" loading="lazy" src="/posts/images/core-maintainer-update/caitie_cm.png"></p>
<p><strong>Caitie McCaffrey</strong> is a Software Engineer and Tech Lead at Microsoft. Caitie has built large-scale distributed systems and services across multiple domains, including AI platforms, gaming, social media, and IoT.</p>
<p>Previously, Caitie served as Technical Advisor to Microsoft&rsquo;s CEO Satya Nadella and CTO Kevin Scott, driving strategic efforts in AI transformation, developer experience &amp; security. Earlier in her career, Caitie was Tech Lead for the Observability team at Twitter, and worked in the gaming industry at Microsoft Game Studios and 343 Industries, contributing to titles such as Halo 4, Halo 5, and Gears of War 2 &amp; 3. She holds a Computer Science degree from Cornell University.</p>
<p>Caitie has been reviewing and helping us craft our governance and transport proposals, bringing her distributed systems expertise to protocol design discussions.</p>
<h3 id="kurtis-van-gent">Kurtis Van Gent</h3>
<p><img alt="Kurtis Van Gent" loading="lazy" src="/posts/images/core-maintainer-update/kurtis_cm.png"></p>
<p><strong>Kurtis Van Gent</strong> is a Senior Staff Software Engineer leading AI Ecosystems at Google Cloud Databases. He drives ecosystems and integrations across the portfolio, leading efforts like MCP for Data Cloud and MCP Toolbox for Databases.</p>
<p>Kurtis has been driving the <a href="https://github.com/modelcontextprotocol/transports-wg">Transport Working Group</a>, which authored the accepted <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1319">request payload decoupling</a> SEP and is leading the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1442">stateless protocol</a> proposal. His focus on scalability and fault tolerance has shaped key discussions around how MCP evolves.</p>
<p>Welcome to the team, Peter, Caitie, and Kurtis.</p>
<h2 id="looking-ahead">Looking Ahead</h2>
<p>If there is one thing I can guarantee it&rsquo;s that 2026 will be a busy year for MCP. There are multiple active SEPs working through the process right now, including ones like the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1932">DPoP extension</a> for authentication, <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1858">multi-turn SSE</a> for transport, and <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2127">Server Cards</a> for discovery. This is just a sneak peek of the <em>many</em> improvements we&rsquo;re currently iterating on. The ecosystem keeps expanding, with more clients, servers, and SDK releases shipping every week.</p>
<p>MCP as a protocol has also matured. What started as an open-source experiment is now running in production at companies of all sizes. That changes what we need to focus on. With this team in place, we&rsquo;re working on the pieces of the puzzle that matter for the next phase of MCP growth: hardening the spec for enterprise scenarios, improving security and authentication patterns, providing better SDK implementation guidance, and making sure MCP can scale to meet the demands of organizations deploying it in critical systems. At the same time, we&rsquo;re keeping the contributor experience welcoming and the protocol responsive to what developers actually need.</p>
<p>If you want to be part of it, check out our <a href="https://modelcontextprotocol.io/community/governance">governance docs</a> or see how to <a href="https://modelcontextprotocol.io/community/communication">get started with MCP contributions</a>. Come build with us.</p>
]]></content:encoded></item><item><title>Exploring the Future of MCP Transports</title><link>https://blog.modelcontextprotocol.io/posts/2025-12-19-mcp-transport-future/</link><pubDate>Fri, 19 Dec 2025 09:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-12-19-mcp-transport-future/</guid><description>The Transport Working Group&amp;#39;s plan to evolve MCP beyond Streamable HTTP for enterprise-scale remote deployments.</description><content:encoded><![CDATA[<p>When MCP first launched in November of 2024, quite a few of its users relied on local environments, connecting clients to servers over <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#stdio">STDIO</a>. As MCP became the go-to standard for LLM integrations, community needs evolved, leading to the build-out of infrastructure around remote servers. There&rsquo;s now growing demand for distributed deployments that can operate at scale.</p>
<p>The <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#streamable-http">Streamable HTTP</a> transport was a significant step forward, enabling remote MCP deployments and unlocking new use cases. However, as enterprise deployments scale to millions of daily requests, early adopters have encountered practical challenges that make it difficult to leverage existing infrastructure patterns. The friction of stateful connections has become a bottleneck for managed services and load balancing.</p>
<p>Some of these challenges include:</p>
<ul>
<li><strong>Infrastructure Complexity:</strong> Load balancers and API gateways must parse full JSON-RPC payloads to route traffic, rather than using standard HTTP patterns.</li>
<li><strong>Scaling Friction:</strong> Stateful connections force &ldquo;sticky&rdquo; routing that pins traffic to specific servers, preventing effective auto-scaling.</li>
<li><strong>High Barrier for Simple Tools:</strong> Developers building simple, ephemeral tools are often required to manage complex backend storage to support basic multi-turn interactions.</li>
<li><strong>Ambiguous Session Scope:</strong> There is no predictable mechanism for defining where a conversation context starts and ends across distributed systems.</li>
</ul>
<h2 id="roadmap">Roadmap</h2>
<p>Over the past few months, the Transport Working Group has worked together with the community and MCP Core Maintainers to develop solutions to these challenges.</p>
<p>In this post we share the roadmap for evolving the Streamable HTTP transport and invite community feedback to help shape the future of MCP transports.</p>
<h3 id="a-stateless-protocol">A Stateless Protocol</h3>
<p>MCP was originally designed as a stateful protocol. Clients and servers maintain mutual awareness through a persistent, bidirectional channel that begins with a handshake to exchange capabilities and protocol version information. Because this state remains fixed throughout the connection, scaling requires techniques like sticky sessions or distributed session storage.</p>
<p>We envision a future where agentic applications are stateful, but the protocol itself doesn&rsquo;t need to be. A stateless protocol enables scale, while still providing features to support stateful application sessions when needed.</p>
<p>We are exploring ways to make MCP stateless by:</p>
<ul>
<li>Replacing the <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/lifecycle#initialization"><code>initialize</code> handshake</a> and sending the shared information with each request and response instead.</li>
<li>Providing a <code>discovery</code> mechanism for clients to query server capabilities if they need the information early, for scenarios such as UI hydration.</li>
</ul>
<p>These changes enable a more dynamic model where clients can optimistically attempt operations and receive clear error messages if a capability is unsupported.</p>
<blockquote>
<p><strong>NOTE:</strong> Many SDKs already offer a <em><code>stateless</code></em> option in their server transport configuration, though the behavior varies across implementations. As part of this roadmap, we&rsquo;ll be working to standardize what &ldquo;stateless&rdquo; means across all official SDKs to ensure consistent behavior.</p></blockquote>
<h3 id="elevating-sessions">Elevating Sessions</h3>
<p>Currently, sessions are a side effect of the transport connection. With STDIO, sessions are implicit in the process lifecycle; with Streamable HTTP, sessions are created when a server assigns an <code>Mcp-Session-Id</code> during initialization. This can lead to confusion between transport and application layer concerns.</p>
<p>We are looking at moving sessions to the <em>data model layer</em>, making them explicit rather than implicit.</p>
<p>This would allow MCP applications to handle sessions as part of their domain logic. We&rsquo;re exploring several approaches, with a cookie-like mechanism being one potential candidate to decouple session state from the transport layer.</p>
<p>This direction mirrors standard HTTP, where the protocol itself is stateless while applications build stateful semantics using cookies, tokens, and similar mechanisms. The exact approach to session creation is still being designed, with the goal of removing existing ambiguities around what a session means in remote MCP scenarios.</p>
<h3 id="elicitations-and-sampling">Elicitations and Sampling</h3>
<p>Two MCP features are central to a few of the modern AI workflows: <a href="https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation">Elicitations</a>, which request human input, and <a href="https://modelcontextprotocol.io/specification/2025-11-25/client/sampling">Sampling</a>, which enable agentic LLM interactions.</p>
<p>Supporting these features at scale requires rethinking the bidirectional communication pattern they rely on. Currently, when a server needs more information to complete a tool call, it suspends execution and waits for a client response, requiring it to track all outstanding requests.</p>
<p>To address this, we&rsquo;re looking at designing server requests and responses to work similarly to chat APIs. The server returns the elicitation request as usual, and the client returns both the request <em>and</em> response together. This allows the server to reconstruct the necessary state purely from the returned message, avoiding long-running state management between nodes and potentially eliminating the need for back-end storage entirely.</p>
<h3 id="update-notifications-and-subscriptions">Update Notifications and Subscriptions</h3>
<p>MCP is dynamic by design - <a href="https://modelcontextprotocol.io/specification/2025-11-25/server/tools">tools</a>, <a href="https://modelcontextprotocol.io/specification/2025-11-25/server/prompts">prompts</a>, and <a href="https://modelcontextprotocol.io/specification/2025-11-25/server/resources">resources</a> can change during operation. Today, servers send <code>ListChangedNotification</code> messages to clients as a hint to invalidate their caches.</p>
<p>We&rsquo;re exploring replacing the general-purpose <code>GET</code> stream with explicit subscription streams. Clients would open dedicated streams for specific items they want to monitor, with support for multiple concurrent subscriptions. If a stream is interrupted, the client simply restarts it with no complex resumption logic.</p>
<p>To make notifications truly optional - an optimization rather than a requirement - we&rsquo;re considering adding Time-To-Live (TTL) values and version identifiers (such as <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/ETag">ETags</a>) to data. This would let clients make intelligent caching decisions independently of the notification stream, significantly improving reliability.</p>
<h3 id="json-rpc-envelopes">JSON-RPC Envelopes</h3>
<p>MCP uses JSON-RPC for all message envelopes, including method names and parameters. As we optimize for HTTP deployments, a common question is whether routing information should be more accessible to the underlying MCP server infrastructure.</p>
<p>While we&rsquo;re keeping JSON-RPC as the message format, we&rsquo;re exploring ways to expose routing-critical information (such as the RPC method or tool name) via standard HTTP paths or headers. This would allow load balancers and API gateways to route traffic without parsing JSON bodies.</p>
<h3 id="server-cards">Server Cards</h3>
<p>Today, clients must complete a full initialization handshake just to learn basic information about an MCP server, like its capabilities or available tools. This creates friction for discovery, integration, and optimization scenarios.</p>
<p>We&rsquo;re exploring the direction of introducing <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1649">MCP Server Cards</a>: structured metadata documents that servers expose through a standardized <code>/.well-known/mcp.json</code> endpoint. Server Cards enable clients to discover server capabilities, authentication requirements, and available primitives <em>before</em> establishing a connection. This unlocks use cases like autoconfiguration, automated discovery, static security validation, and reduced latency for UI hydration — all without requiring the full initialization sequence.</p>
<h3 id="official-and-custom-transports">Official and Custom Transports</h3>
<p>To ensure a minimum compatibility baseline across the ecosystem, MCP will continue to support only two official transports: STDIO for local deployments and Streamable HTTP for remote deployments. This keeps the core ecosystem unified, where every MCP client and server can interoperate out of the box.</p>
<p>We also recognize that transport and protocol changes can be disruptive. Backwards compatibility is a priority, and we&rsquo;ll only introduce breaking changes when strictly necessary for critical use cases.</p>
<p>For teams with specialized requirements, the MCP Specification supports <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#custom-transports">Custom Transports</a>, giving developers the flexibility to build alternatives that fit their needs. Our focus is on making Custom Transports easier to implement by improving SDK integration—so the community can experiment freely without fragmenting the standard.</p>
<h2 id="summary">Summary</h2>
<p>These changes reorient MCP around stateless, independent requests - without sacrificing the rich features that make it powerful. Server developers get simpler horizontal scaling with no sticky sessions or distributed stores. Clients get a more predictable architecture.</p>
<p>For most SDK users, both on the client and server sides, the impact will be minimal - we&rsquo;re focused on reducing breaking changes to the absolute minimum. The shift we&rsquo;re outlining is architectural: simpler deployments, serverless viability for advanced MCP features, and better alignment with modern infrastructure patterns.</p>
<h2 id="next-steps">Next Steps</h2>
<p>Work is already underway. Our goal is to finalize the required <a href="https://modelcontextprotocol.io/community/sep-guidelines">Spec Enhancement Proposals</a> (SEPs) in the first quarter of 2026 for inclusion in the next specification release, which is tentatively slated for June of 2026. With these changes, MCP can easily scale while keeping the ergonomics that made it successful.</p>
<p>We want your input. Join us in the <a href="https://modelcontextprotocol.io/community/communication#discord">MCP Contributors Discord server</a>, or engage directly with transport-related SEPs in the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pulls">Model Context Protocol repository</a>.</p>
<p>This roadmap is shaped by real-world feedback from developers and companies building with MCP. We&rsquo;re excited to collaborate with the MCP community to continuously improve the protocol and its capabilities!</p>
]]></content:encoded></item><item><title>MCP joins the Agentic AI Foundation</title><link>https://blog.modelcontextprotocol.io/posts/2025-12-09-mcp-joins-agentic-ai-foundation/</link><pubDate>Tue, 09 Dec 2025 09:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-12-09-mcp-joins-agentic-ai-foundation/</guid><description>Anthropic is donating MCP to the newly formed Agentic AI Foundation under the Linux Foundation, ensuring vendor-neutral governance for the protocol&amp;#39;s future.</description><content:encoded><![CDATA[<p>Today marks a major milestone for the Model Context Protocol. Anthropic is donating MCP to the Agentic AI Foundation, a directed fund under the Linux Foundation. MCP will become a founding project of the newly created foundation.</p>
<p>In one year, MCP has become one of the fastest-growing and widely-adopted open-source projects in AI: Over 97 million monthly SDK downloads, 10,000 active servers and first-class client support across major AI platforms like ChatGPT, Claude, Cursor, Gemini, Microsoft Copilot, Visual Studio Code and many more.</p>
<p>Since its inception, we&rsquo;ve remained committed to ensuring MCP remains open and community-driven. This move formalizes that commitment—ensuring MCP&rsquo;s vendor-neutrality and long-term independence under the same neutral stewardship that supports Kubernetes, PyTorch, and Node.js. Anthropic&rsquo;s commitment to MCP is unchanged: we will continue to invest in its development, maintain core infrastructure, and actively participate in the community.</p>
<h2 id="the-agentic-ai-foundation">The Agentic AI Foundation</h2>
<p>MCP will be a founding project of the newly created Agentic AI Foundation (AAIF), a directed fund under the Linux Foundation, co-founded by Anthropic, Block and OpenAI, with support from Google, Microsoft, AWS, Cloudflare and Bloomberg to advance open-source innovation in agentic AI.</p>
<p>MCP joins two other founding projects: goose by Block and AGENTS.md by OpenAI as founding projects.</p>
<p>The AAIF Governing Board will make decisions regarding strategic investments, budget allocation, member recruitment, and approval of new projects, while individual projects, such as MCP, maintain full autonomy over their technical direction and day-to-day operations.</p>
<h2 id="mcps-maintainer-structure-stays-the-same">MCP&rsquo;s maintainer structure stays the same</h2>
<p>For MCP little changes. The governance model we introduced earlier this year continues as is. The people making decisions about the protocol are still the maintainers who have been stewarding it, guided by community input through our SEP process.</p>
<p>The Linux Foundation provides a neutral home and infrastructure that allows maintainers to operate independently, and will not dictate the technical direction of MCP.</p>
<h2 id="thank-you">Thank you</h2>
<p>To all who&rsquo;ve adopted and contributed to MCP so far, thank you. None of this would&rsquo;ve been possible without your contribution. From building servers to maintaining SDKs to filing issues to improving documentation to welcoming new visitors and everything in between, you&rsquo;ve made MCP what it is today.</p>
<p>Here&rsquo;s to MCP&rsquo;s next chapter under the Linux Foundation&rsquo;s stewardship.</p>
]]></content:encoded></item><item><title>SEPs Are Moving to Pull Requests</title><link>https://blog.modelcontextprotocol.io/posts/2025-11-28-sep-process-update/</link><pubDate>Fri, 28 Nov 2025 11:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-11-28-sep-process-update/</guid><description>SEPs are moving from GitHub Issues to pull requests against the seps/ directory — why, and what changes for contributors.</description><content:encoded><![CDATA[<p>We&rsquo;re updating how Specification Enhancement Proposals (SEPs) are submitted and managed. Starting today, SEPs will be created as pull requests to the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/tree/main/seps"><code>seps/</code> directory</a> instead of GitHub issues.</p>
<h2 id="why-the-change">Why the Change?</h2>
<p>When we <a href="https://blog.modelcontextprotocol.io/posts/2025-07-31-governance-for-mcp/">introduced SEPs in July</a>, we chose GitHub Issues as our starting point. Issues are familiar to developers, low-friction, and got us up and running quickly. But as more proposals have come through the process, we&rsquo;ve identified some key pain points:</p>
<p><strong>Scattered discussions.</strong> With issues, the proposal text lives in the issue body while implementation details often end up in a separate PR. This splits the conversation and makes it harder to follow the full history of a proposal. This also introduces two distinct numbers referencing the same SEP, making it harder to consistently track and manage changes.</p>
<p><strong>No version history.</strong> Issues don&rsquo;t have the same revision tracking that files in a repository do. When a SEP evolves through review, it&rsquo;s difficult to see what changed and when.</p>
<p>The new PR-based approach, inspired by <a href="https://peps.python.org/">Python&rsquo;s PEP process</a>, solves both problems.</p>
<h2 id="how-it-works">How It Works</h2>
<p>The new workflow will be familiar if you&rsquo;ve submitted pull requests on GitHub before:</p>
<ol>
<li>
<p><strong>Draft your SEP</strong> as a markdown file named <code>0000-your-feature.md</code> using the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/seps/TEMPLATE.md">SEP template</a></p>
</li>
<li>
<p><strong>Create a pull request</strong> adding your SEP to the <code>seps/</code> directory</p>
</li>
<li>
<p><strong>Update the SEP number</strong> once your PR is created, rename the file using the PR number (e.g., PR #1850 becomes <code>1850-your-feature.md</code>) and push a new commit with the rename</p>
</li>
<li>
<p><strong>Find a sponsor</strong> from our <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/MAINTAINERS.md">maintainer list</a> to shepherd your proposal</p>
</li>
<li>
<p><strong>Iterate</strong> on feedback directly in the PR</p>
</li>
</ol>
<p>That&rsquo;s it. The PR number becomes the SEP number, discussion happens in one place, and git tracks every revision.</p>
<h2 id="what-about-status">What About Status?</h2>
<p>One notable change: <strong>sponsors are now responsible for updating SEP status</strong>. In addition to applying labels to the pull request, the sponsor is responsible for ensuring that the <code>Status</code> field is updated in the SEP markdown file. This keeps the canonical state of the proposal in the file itself, versioned alongside the content, while PR labels make it easy to filter and find SEPs by status.</p>
<p>Status transitions work the same as before: <code>Draft</code> to <code>In-Review</code> to <code>Accepted</code> to <code>Final</code>, with the sponsor managing each transition as the proposal progresses.</p>
<h2 id="getting-started">Getting Started</h2>
<p>Ready to propose a change to MCP? Here&rsquo;s what you need to know:</p>
<p><strong>For new SEPs:</strong></p>
<ul>
<li>Read the latest <a href="https://modelcontextprotocol.io/community/sep-guidelines">SEP Guidelines</a></li>
<li>Use the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/seps/README.md#sep-file-structure">SEP template</a> to create your proposal</li>
<li>Browse existing SEPs in the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/tree/main/seps"><code>seps/</code> directory</a> for examples</li>
<li>Follow the workflow described above</li>
</ul>
<p><strong>For existing SEPs:</strong>
If you have a SEP submitted as a GitHub issue, you can continue with your current workflow. We strongly encourage migrating to the new process for better version control and centralized discussion. To migrate:</p>
<ol>
<li>Create a markdown file using the SEP template, starting with <code>0000-your-feature.md</code></li>
<li>Copy and adapt your proposal content to fit the template structure</li>
<li>Submit a pull request to the <code>seps/</code> directory</li>
<li>Rename the file using your new PR number (e.g., PR #1900 becomes <code>1900-your-feature.md</code>)</li>
<li>Close the original issue with a link to the new PR</li>
</ol>
<p>The new PR gets a fresh SEP number and gives your proposal proper version control and centralized discussion. Any valuable context from the original issue discussion should be summarized in the new SEP or referenced via links.</p>
<p>As always, if you&rsquo;re unsure whether your idea warrants a SEP, start a conversation on <a href="https://modelcontextprotocol.io/community/communication#discord">Discord</a> or <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/discussions">GitHub Discussions</a>. We&rsquo;re happy to help you figure out the right path forward.</p>
<h2 id="thank-you">Thank You</h2>
<p>This change is a direct result of feedback from contributors who&rsquo;ve been through the SEP process. Your input helps us continuously improve how we build MCP together. Keep it coming.</p>
]]></content:encoded></item><item><title>One Year of MCP: November 2025 Spec Release</title><link>https://blog.modelcontextprotocol.io/posts/2025-11-25-first-mcp-anniversary/</link><pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-11-25-first-mcp-anniversary/</guid><description>MCP turns one — a look back at the year, plus the full details of the November 2025 specification release.</description><content:encoded><![CDATA[<p>Today, MCP turns <strong>one year old</strong>. You can check out the <a href="https://www.anthropic.com/news/model-context-protocol">original announcement blog post</a> if you don&rsquo;t believe us. It&rsquo;s hard to imagine that a little open-source experiment, a <strong>protocol to provide context to models</strong>, became the de-facto standard for this very scenario in less than twelve months.</p>
<p>But not only do we hit the first anniversary milestone today - we&rsquo;re also releasing a brand-new MCP specification version. Before we get to the details of what&rsquo;s new, let&rsquo;s do a bit of a retrospective.</p>
<h2 id="a-year-in">A Year In</h2>
<p>With all the changes that we&rsquo;ve made in the past year, it feels like a decade flew by. The protocol has grown leaps and bounds since its inception and has been adopted by a <em>huge</em> number of developers and organizations. We went from a little open source experiment to becoming <em>the</em> standard for connecting data and applications to Large Language Models (LLMs).</p>
<p>But adoption can only grow as long as there are MCP servers to actually use and clients which are capable of communicating with them. Within the same timeframe, we saw the number of active MCP servers go from just a few experimental ones to <em>thousands</em>. If you think about a scenario, it&rsquo;s likely there&rsquo;s an MCP server for it.</p>
<p>Here are just a few of many (very many) MCP servers that you can try <em>today</em>:</p>
<ul>
<li>Notion <a href="https://github.com/makenotion/notion-mcp-server">built an MCP server</a> to help you manage your notes.</li>
<li>Stripe has a <a href="https://docs.stripe.com/mcp#tools">pretty extensive MCP server</a> to manage all kinds of payment workflows.</li>
<li>GitHub <a href="https://github.com/github/github-mcp-server">built their own MCP server</a> to help developers automate their engineering processes.</li>
<li>Hugging Face <a href="https://github.com/huggingface/hf-mcp-server">created an MCP server</a> to make model management and dataset search a breeze.</li>
<li>Postman <a href="https://github.com/postmanlabs/postman-mcp-server">built their MCP server</a> to help automate API testing workflows.</li>
</ul>
<p>And there&rsquo;s so much more to discover in the MCP ecosystem! That&rsquo;s why we also launched the <a href="https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/">MCP Registry</a> earlier this year. It&rsquo;s the central index for all available MCP servers that now has close to two thousand entries since its announcement in September. That&rsquo;s a <strong>407% growth</strong> from the initial batch of servers we onboarded that same month.</p>
<p>The ecosystem is blooming, adoption is growing, but what&rsquo;s underpinning all of this?</p>
<h3 id="community--governance">Community &amp; Governance</h3>
<p>MCP&rsquo;s growth was never a one‑company effort. Students, hobbyists, startup engineers, and enterprise architects all shaped the protocol - submitting Specification Enhancement Proposals (SEPs), shipping SDKs in new languages, and stress‑testing some of the early assumptions we had about MCP in production. MCP servers became a staple of many products, official and unofficial (there&rsquo;s even a <a href="https://github.com/ahujasid/blender-mcp">Blender MCP server</a>). That kind of organic adoption isn&rsquo;t something you can just come up with, no matter how ambitious your aspirations are with an open source project.</p>
<p><img alt="David Soria Parra presenting on MCP in May of 2025" loading="lazy" src="/posts/images/first-mcp-anniversary/david-mcp-may.webp"></p>
<p>From the start, we believed that it was all about the <strong>MCP community</strong>. Our community rallied around the protocol, organizing events like <a href="https://mcpdevsummit.ai/">MCP Dev Summit</a>, <a href="https://workos.com/mcp-night">MCP Night</a>, <a href="https://developer.microsoft.com/en-us/reactor/series/S-1563/">MCP Dev Days</a>, and showing up at other marquee events like <a href="https://wf2025.ai.engineer/worldsfair/2025">AI Engineer World&rsquo;s Fair</a> to share what they learned and built.</p>
<p><img alt="Presentation on GitHub MCP server at the MCP Night event" loading="lazy" src="/posts/images/first-mcp-anniversary/mcp-night-github-mcp.webp"></p>
<p>We also nurtured large contributor communities on <a href="https://modelcontextprotocol.io/community/communication">Discord</a> and on <a href="https://github.com/modelcontextprotocol/modelcontextprotocol">GitHub</a>, helping us debug issues, build amazing tools like the <a href="https://github.com/modelcontextprotocol/inspector">MCP Inspector</a>, propose changes, and assist each other in shipping great MCP experiences. That kind of daily collaboration got us further than any single individual or company ever could.</p>
<p><img alt="Audience at MCP Night in San Francisco" loading="lazy" src="/posts/images/first-mcp-anniversary/mcp-night.webp"></p>
<p>Really, the success of MCP in the past year is entirely thanks to the broad community that grew around the project - from transports, to security, SDKs, documentation, samples, extensions, and developer tooling, it was all significantly evolved by and for the community.</p>
<p><img alt="Kent C. Dodds talking about his vision for MCP at MCP Dev Summit" loading="lazy" src="/posts/images/first-mcp-anniversary/kent-jarvis-mcp.webp"></p>
<p>To keep this pace sustainable, we spent some time thinking through and putting together a <a href="https://blog.modelcontextprotocol.io/posts/2025-07-31-governance-for-mcp/">governance structure</a>. Through it, community leaders and Anthropic maintainers were and continue to work together to figure out what needs fixing and how to get the right changes into the spec. Our maintainer team isn&rsquo;t there to gatekeep; they help surface problems, align on solutions, and turn rough ideas into actual protocol updates.</p>
<p><img alt="MCP maintainers collaborating during a writing session in New York City" loading="lazy" src="/posts/images/first-mcp-anniversary/maintainers-write.webp"></p>
<p>Our approach to governance, while still evolving, proved itself to be extremely valuable. We&rsquo;ve been able to move faster on critical improvements without breaking existing implementations. Potential contributors now also know how to jump in through formal <strong>Working and Interest Groups</strong> (<a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1302/">SEP-1302</a> set the stage for this).</p>
<p><img alt="Group photo from an MCP maintainers meetup" loading="lazy" src="/posts/images/first-mcp-anniversary/maintainers-meetup.webp"></p>
<p>Even though this is a significant improvement, we know that we&rsquo;re not done. There&rsquo;s still work ahead for us to make this process even better - improved transparency, decision timelines, broader platform coverage, and so much more to help the ecosystem. We are <em>incredibly thankful</em> for everyone who&rsquo;s been part of this journey and helped us navigate so many changes in such a short time span.</p>
<p><img alt="Developing on the bleeding edge of MCP servers presentation" loading="lazy" src="/posts/images/first-mcp-anniversary/mcp.webp"></p>
<h2 id="what-others-have-to-say">What Others Have To Say</h2>
<p>As we called out above, the success of MCP <em>would not be possible</em> without the broader community of adopters. We&rsquo;re delighted that the protocol enabled so many scenarios across the industry. Here are some thoughts from a few of our key partners and supporters.</p>
<blockquote>
<p>&ldquo;<em>In just one year, MCP has evolved from an experiment to a widely adopted industry standard, highlighting the impact of open collaboration—something we deeply believe in at GitHub. Developers across our community, customers and own teams are using our GitHub MCP Server, Registry, and enterprise controls like the MCP allowlist to unlock real benefits of agentic development in production workflows. We’re excited to keep building with the broader community to push this standard forward.</em>&rdquo;</p>
<p>✦ <strong>Mario Rodriguez</strong>, CPO, <a href="https://github.com/">GitHub</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>We believe open standards are an important part of an agentic web—helping models work with tools and platforms more seamlessly. OpenAI has been contributing to the MCP ecosystem since early on, and it’s now a key part of how we build at OpenAI, integrated across ChatGPT and our developer platform. We’re excited to keep working with the community to strengthen the protocol as it evolves.</em>&rdquo;</p>
<p>✦ <strong>Srinivas Narayanan</strong>, CTO of B2B Applications, <a href="https://openai.com/">OpenAI</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>In the year since its launch, MCP has become an incredibly impactful open standard in the industry,&rdquo; said Dhanji R. Prasanna, CTO of Block. &ldquo;It has quickly moved to unlocking an enormous amount of value from existing systems and made applied AI real like few anticipated. MCP has been key to building AI-powered solutions like Square AI and Moneybot, saving our customers time and delivering powerful insights as well as our internal AI systems. It sits at the heart of open source projects like goose, proving that open standards fuel innovation across the board. We are excited to see the protocol and AI agents evolve to unlock ever more productivity in the enterprise.</em>&rdquo;</p>
<p>✦ <strong>Dhanji Prasanna</strong>, CTO, <a href="https://block.xyz/">Block</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>Having an open source protocol that unlocks real interoperability has made agents truly useful. In one year, Foundry went from a small set of tools to thousands because MCP let tools from GitHub, Azure, and M365 show up wherever agents run. It made write once integrate everywhere real and gives agents the ability to work across any system and any cloud with the full power of Microsoft behind them.</em>&rdquo;</p>
<p>✦ <strong>Asha Sharma</strong>, President, CoreAI, <a href="https://microsoft.com/">Microsoft</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>MCP has become the natural language for AI integration - connecting everything from model discovery to inference APIs to chat applications. The community has created thousands of MCP applications with Gradio and our HF-MCP server. Having an Open Source protocol that unlocks this seamless interoperability has been a game changer in the past year.</em>&rdquo;</p>
<p>✦ <strong>Julien Chaumond</strong>, CTO, <a href="https://huggingface.co/">Hugging Face</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>The enterprise promise of AI is being realized by MCP’s ability to unify data, tools, and workflows across previously siloed systems. As agentic AI is more rapidly adopted, we’re excited to see identity and authorization at the core of a security framework. By formally incorporating Cross App Access as an MCP authorization extension, organizations can have the necessary oversight and access control to build a secure and open AI ecosystem.</em>&rdquo;</p>
<p>✦ <strong>Harish Peri</strong>, SVP &amp; GM, AI Security, <a href="https://okta.com">Okta</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>We&rsquo;re hearing great things from customers who have embraced MCP as their standard for connecting generative AI agents with external systems. Open source is incredibly important to our mission at AWS, which is why we started and continue contributing to MCP— building improvements on authorization, human in the loop interactions, and asynchronous execution. We have also built MCP into offerings like Amazon Bedrock, Kiro, Strands, AgentCore and Amazon Quick Suite. We&rsquo;re excited to continue to collaborate with this community to make agent interoperability seamless for developers.</em>&rdquo;</p>
<p>✦ <strong>Swami Sivasubramanian</strong>, VP, Agentic AI, <a href="https://aws.amazon.com">AWS</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>In just one year, the Model Context Protocol has proven to be a critical standard that connects models to data and applications, solving the fragmentation that held agents back. We’re proud to support MCP across Gemini, from our models to our agentic software development tools like Gemini CLI, as well as provide open source MCP servers such as for Google Maps and Google Cloud databases. These are the very tools our own teams use, and we’re thrilled to celebrate MCP’s first birthday by continuing to build this foundation together.&rdquo;</em></p>
<p>✦ <strong>Anna Berenberg</strong>, Engineering Fellow, <a href="https://cloud.google.com/">Google Cloud</a></p></blockquote>
<blockquote>
<p>&ldquo;<em>MCP has changed everything for us at Obot AI. A standard, open protocol for connecting AI with apps, data, and systems is the biggest shift since LLMs. We’re all-in on secure MCP management because we believe it’s going to be foundational infrastructure for every organization</em>&rdquo;</p>
<p>✦ <strong>Shannon Williams</strong>, President and Co-Founder, <a href="https://obot.ai/">Obot AI</a>; Organizer, <a href="https://mcpdevsummit.ai/">MCP Dev Summit</a></p></blockquote>
<p>Of course, we would be remiss not to mention the <em>massive</em> effort it takes to coordinate the MCP community engagement. We asked some of our most prolific community managers about what MCP meant to them. Here are their stories.</p>
<blockquote>
<p>&ldquo;<em>As a community moderator and maintainer, I keep coming back to something <a href="https://donellameadows.org/archives/dancing-with-systems/">Donella Meadows</a> wrote: &ldquo;Systems can&rsquo;t be controlled, but they can be designed and redesigned&hellip; We can listen to what the system tells us, and discover how its properties and our values can work together to bring forth something much better than could ever be produced by our will alone.&rdquo;</em></p>
<p><em>What made this year&rsquo;s growth possible was embracing messiness as a feature, and doing our best to solve real problems emerging from that messiness while leaving room for systems and models to advance and adapt. The looseness created velocity, which I watched unfold in a flood of discussions, PRs, and issues.</em></p>
<p><em>As someone who&rsquo;s merged hundreds of pull requests across MCP repos, I still feel like I&rsquo;m barely keeping up with this velocity. I mean that in the most positive way. Better patterns and practices are emerging from the sheer volume of contributions and breadth of experience and expertise represented in the contributor community. As a random person from the Internet, I appreciate that pretty much anyone can bring something to the table. This includes standout maintainers like <a href="https://github.com/cliffhall">Cliff Hall</a>, who raises the bar for reviewing, testing, and giving feedback, and <a href="https://github.com/jonathanhefner">Jonathan Hefner</a>, who&rsquo;s done the same for documentation.</em></p>
<p><em>As Darren Shepard <a href="https://x.com/ibuildthecloud/status/1988695148843389151">recently put it</a>:</em></p>
<p><em>&lsquo;People think the value of MCP is the protocol. The value is getting people to agree and do something.&rsquo;</em></p>
<p><em>MCP gives people a reason to coordinate and talk about the same thing. Helping to enable that coordination and discussion has been a lot of fun, and it keeps me coming back.</em>&rdquo;</p>
<p>✦ <strong>Ola Hungerford</strong>, Principal Engineer, <a href="https://www.nordstrom.com/">Nordstrom</a>; MCP Maintainer and Community Lead</p></blockquote>
<blockquote>
<p>&ldquo;<em>Watching the MCP community start small and grow up across the past year has been a joy to watch. No matter whether someone has been an independent contributor, member of a small startup, or a leader at a big enterprise: everyone has had and continues to have a voice and a role to play.</em></p>
<p><em>I think this is largely due to how pragmatic and use-case oriented the MCP community has been from the get-go. There is a focus on not overcomplicating the specification, and not designing ahead of need. When that&rsquo;s the ethos driving decision-making, everyone&rsquo;s voice matters. The hobbyist that has something working in production might have a practical opinion to contribute, that the big tech engineer can pick up and confidently deploy to a large userbase. And vice-versa: big tech can foresee problems around critical issues like security and governance that the hobbyist might have missed designing for.</em></p>
<p><em>That ethos has translated to community governance, too. There&rsquo;s no layers of bureaucracy: just a lightweight and still-distributed structure for making decisions that keep us all marching to the beat of the same drum. We are now <strong>58 maintainers</strong> supporting the <strong>9 core/lead maintainers</strong> in the MCP steering group, with <strong>2,900+ contributors</strong> in the MCP contributor community on Discord, and <strong>100+ new contributors</strong> joining every week. We&rsquo;re successfully maintaining long-running projects like the Registry, the Inspector, and a host of SDKs with that distributed group of leaders and contributors - and managed to collaborate through 17 (!) SEPs in about a quarter&rsquo;s worth of time.</em></p>
<p><em>That doesn&rsquo;t even begin to touch on the thousands of MCP implementors or millions of MCP end-users. It&rsquo;s inspiring to see the often-competitive AI community rally around a foundational piece of infrastructure; I&rsquo;m thankful for that willingness to collaborate and look forward to seeing where our second year takes us.&rdquo;</em></p>
<p>✦ <strong>Tadas Antanavicius</strong>, Co-Creator, <a href="https://www.pulsemcp.com/">PulseMCP</a>; MCP Maintainer and Community Lead</p></blockquote>
<p>We are immensely grateful for our partners and community for helping us bring the protocol to where it is today. Let&rsquo;s now jump into the latest big release - the <code>2025-11-25</code> version of the MCP specification.</p>
<h2 id="the-november-2025-release">The November 2025 Release</h2>
<p>The latest release of the MCP specification ships with a number of highly-anticipated features that came directly from our community deploying and using MCP for production scenarios. People told us what wasn&rsquo;t working, what was missing, and what papercuts prevented them from being able to use MCP. We listened and worked together with community experts to deliver a number of enhancements that make MCP even more scalable and reliable.</p>
<h3 id="support-for-task-based-workflows">Support for Task-based Workflows</h3>
<p><strong>SEP:</strong> <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1686">1686</a></p>
<p>Tasks provide a new abstraction in MCP for tracking the work being performed by an MCP server. Any request can be augmented with a task that allows the client to query its status and retrieve its results up to a server-defined duration after the task is created.</p>
<p>Tasks support a variety of states including <code>working</code>, <code>input_required</code>, <code>completed</code>, <code>failed</code>, and <code>cancelled</code>, allowing clients to effectively manage multi-step operations.</p>
<p>Some noteworthy capabilities that this feature enables:</p>
<ul>
<li><strong>Active polling</strong>: Clients can check the status of ongoing work at any time.</li>
<li><strong>Result retrieval</strong>: Results of completed tasks are accessible after the request has completed.</li>
<li><strong>Flexible lifecycle management</strong>: Support for <code>working</code>, <code>input_required</code>, <code>completed</code>, <code>failed</code>, and <code>cancelled</code> states.</li>
<li><strong>Task isolation</strong>: Proper security boundaries with session-based access control.</li>
</ul>
<p>From the multitude of MCP servers that we&rsquo;ve seen out there, this is particularly helpful for scenarios such as the ones below.</p>
<ul>
<li>Healthcare &amp; life sciences data analysis that processes hundreds of thousands of data points</li>
<li>Enterprise automation platforms with complex multi-step workflows</li>
<li>Code migration tools that run for minutes or hours</li>
<li>Test execution platforms that need to stream logs from long-running suites</li>
<li>Deep research tools that spawn multiple agents internally</li>
<li>Multi-agent systems where agents can work concurrently</li>
</ul>
<p>Tasks are launching as an <strong>experimental capability</strong>, meaning that it&rsquo;s part of the core protocol but it&rsquo;s not yet finalized. Task-based workflows are a tough problem to solve at scale, so we want to give some time to the specification to be battle-tested in real-world scenarios. We&rsquo;ll work closely with the community, SDK developers, as well as client and server implementers to get this right.</p>
<h3 id="simplified-authorization-flows">Simplified Authorization Flows</h3>
<p>One of the top painpoints from the community when it comes to authorization has been <a href="https://www.rfc-editor.org/rfc/rfc7591">Dynamic Client Registration</a>, or DCR. This capability is needed because in the MCP world there is an unbounded number of clients and servers, so doing standard client pre-registration is not always feasible. You wouldn&rsquo;t expect every MCP client in the world to also have a client registration with every Authorization Server (AS) out there, so DCR was used as a solution to this problem. You can learn more about the current approach in our <a href="https://modelcontextprotocol.io/docs/tutorials/security/authorization">authorization guide</a>.</p>
<p>To use DCR, however, an MCP server developer would need to rely on an AS that allows clients to register themselves via a public API. If the AS doesn&rsquo;t support this capability, developers would now need to build an OAuth proxy that would be manually registered with the AS, and support Dynamic Client Registration itself, mapping its own issued tokens to tokens issued from the downstream AS. This is a complex, time-consuming, and error-prone task, and doesn&rsquo;t actually solve the fundamental problems with Dynamic Client Registration.</p>
<p>The alternative would be for every customer or end user to provide <em>their own</em> client registration, but that&rsquo;s just trading one complex task for another. In that model, when a user connects to an MCP server, they need to go through their IT team to create a registration, assign it the right permissions, and then configure the MCP client to use it.</p>
<p><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1296">SEP-991</a></strong> introduced a much more elegant solution to the problem - URL-based client registration using <a href="https://datatracker.ietf.org/doc/html/draft-ietf-oauth-client-id-metadata-document-00">OAuth Client ID Metadata Documents</a> (you might&rsquo;ve already seen our <a href="https://blog.modelcontextprotocol.io/posts/client_registration/">blog post on this change from earlier this year</a>). Clients can now provide their own client ID that is a URL pointing to a JSON document the client manages that describes properties of the client.</p>
<p>You can learn more in the <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization#client-id-metadata-documents-flow">Client ID Metadata Documents Flow</a> section of the <a href="https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization">MCP authorization specification</a>.</p>
<h3 id="security-and-enterprise-features">Security and Enterprise Features</h3>
<p>As the protocol matures, we also can&rsquo;t ignore the myriad of security and authentication/authorization needs. MCP is not just a hobby protocol - we&rsquo;ve seen it adopted in some of the most mission-critical workloads. This translates into a direct need to ensure that all data is protected and access is properly managed.</p>
<p>Working with security and authentication experts from across the community, we&rsquo;ve developed a number of enhancements shipping with this release:</p>
<ul>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1024">SEP-1024</a></strong>: Client security requirements for local server installation</li>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/835">SEP-835</a></strong>: Default scopes definition in authorization specification</li>
</ul>
<p>We also hear loud and clear from the industry that discovery and management of internal registries is an important component to the MCP story. With the help of the MCP Registry team, we&rsquo;ve also established a <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/design/ecosystem-vision.md">vision for the ecosystem</a> that will help enterprises adopt <em>their own</em> MCP registries, with self-managed governance controls and security coverage.</p>
<p>To learn more about other upcoming auth and security improvements you can follow the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues?q=is%3Aissue%20state%3Aopen%20label%3Aauth"><code>auth</code></a> and <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues?q=is%3Aissue%20state%3Aopen%20label%3Asecurity"><code>security</code></a> tags in the specification repository.</p>
<h3 id="extensions">Extensions</h3>
<p>As MCP continues to evolve, we <em>constantly</em> hear from developers who want to extend the protocol with specialized capabilities, whether for UI interactions, custom authentication flows, or other environment-specific logic. While these additions could be valuable, incorporating them directly into the core specification isn&rsquo;t always practical from the get-go, especially when a feature hasn&rsquo;t yet achieved broad adoption or proven its universal applicability.</p>
<p>To address this, we&rsquo;re introducing <strong>extensions</strong> in the protocol. Extensions are components and conventions that operate outside the core specification, providing a flexible way to build scenario-specific additions that follow MCP conventions without requiring full protocol integration. This approach allows for experimentation and specialized use cases while keeping the core protocol focused and stable. With extensions, we can move faster and enable developers to <em>test out</em> protocol capabilities before they become part of the specification.</p>
<p>Extensions are:</p>
<ul>
<li><strong>Optional</strong>. Server and client implementors can choose to adopt these extensions.</li>
<li><strong>Additive</strong>. Extensions do not modify or break core protocol functionality; they add new capabilities while preserving core protocol behavior.</li>
<li><strong>Composable</strong>. Extensions are modular and designed to work together without conflicts, allowing implementations to adopt multiple extensions simultaneously.</li>
<li><strong>Versioned independently</strong>. Extensions follow the core MCP versioning cycle but may adopt independent versioning as needed.</li>
</ul>
<p>You might&rsquo;ve already seen our announcement of the <a href="https://blog.modelcontextprotocol.io/posts/2025-11-21-mcp-apps/">MCP Apps Extension</a> proposal. In this specification release, we&rsquo;re introducing a couple of other extensions that should help developers further.</p>
<h3 id="authorization-extensions">Authorization Extensions</h3>
<p>To make MCP better suited for environments that require specific levels of control over the authorization process, we&rsquo;ve officially introduced the concept of <a href="https://github.com/modelcontextprotocol/ext-auth"><strong>authorization extensions</strong></a> (building on the broader <a href="#extensions">MCP Extensions</a>). As with all other extensions, authorization extensions build on the core protocol and define additional authorization mechanisms that can be implemented by both server and client developers.</p>
<p>The first two authorization extensions came on the heels of community feedback regarding some of the most-used authorization flows:</p>
<ul>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1046">SEP-1046</a></strong>: OAuth client credentials support for machine-to-machine authorization</li>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/990">SEP-990</a></strong>: Enterprise IdP policy controls for MCP OAuth flows (Cross App Access). This enables users within an enterprise to sign in to the MCP client once, and immediately get access to every authorized MCP server without additional authorization prompts.</li>
</ul>
<p>As we engage closer with the community, we expect the number of authorization extensions to grow as well - after all, there are more than just a few ways for a system to acquire and manage credentials.</p>
<h3 id="url-mode-elicitation-secure-out-of-band-interactions">URL Mode Elicitation: Secure Out-of-Band Interactions</h3>
<p><strong>SEP:</strong> <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1036">1036</a></p>
<p>Asking users for their API keys, tokens, or any other credentials directly through the MCP client might seem like quite a scary proposition. This is especially critical when you need to connect an MCP server to an array of <em>other</em> APIs, where the traditional client-to-server authorization flow doesn&rsquo;t quite work. Until now, there wasn&rsquo;t a good alternative - you either had to trust the client to handle the user&rsquo;s credentials directly, or implement a bunch of custom authorization logic to be used from the start.</p>
<p><strong>URL mode elicitation</strong> lets you send users to a proper OAuth flow (or any credential acquisition flow, for that matter) in their browser, where they can authenticate securely without your client ever seeing the entered credentials. The credentials are then directly managed by the server and the client only needs to worry about its own authorization flow to the server.</p>
<p>We are excited about including this feature in addition to capabilities that we already have, like elicitations, because it allows the protocol to be used for a few scenarios that were quite hard to get right, such as:</p>
<ul>
<li><strong>Secure credential collection</strong>: API keys and passwords never transit through the MCP client</li>
<li><strong>External OAuth flows</strong>: MCP servers have a path to obtain third-party authorization without token passthrough</li>
<li><strong>Payment processing</strong>: PCI-compliant financial transactions with secure browser contexts can now be done outside the client</li>
</ul>
<p>All the server does is send a URL that the client will provide an affordance for. When the user completes the flow in their browser, the server will get the necessary tokens <em>directly</em>, avoiding sharing credentials with the client or other manual steps. Simple!</p>
<h3 id="sampling-with-tools-agentic-servers">Sampling with Tools: Agentic Servers</h3>
<p><strong>SEP:</strong> <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1577">1577</a></p>
<p>This functionality allows MCP servers to run their own agentic loops using the client&rsquo;s tokens (still under the user&rsquo;s control, of course), and reduces the complexity of client implementations, context support becoming explicitly optional. This came from the fact that <a href="https://modelcontextprotocol.io/specification/2025-06-18/client/sampling">sampling</a> doesn&rsquo;t support tool calling, although it&rsquo;s a cornerstone of modern agentic behaviour. With the new spec release, this is no longer a gap!</p>
<p>Now that sampling with tools is available, this also means that all of the scenarios below are possible!</p>
<ul>
<li><strong>Tool calling in sampling requests</strong>: Servers can now include tool definitions and specify tool choice behavior</li>
<li><strong>Server-side agent loops</strong>: Servers can implement sophisticated multi-step reasoning</li>
<li><strong>Parallel tool calls</strong>: Support for concurrent tool execution</li>
<li><strong>Better context control</strong>: The ambiguous <code>includeContext</code> parameter is being soft-deprecated in favor of explicit capability declarations</li>
</ul>
<p>As an example, a research server can spawn multiple agents internally, coordinate their work, and deliver a coherent result while using nothing other than standard MCP primitives without custom scaffolding or complex orchestration code.</p>
<h3 id="developer-experience-improvements">Developer Experience Improvements</h3>
<p>One of the core tenets of MCP is <em>simplicity</em> - we want to make the developer and integration experience as intuitive and easy as possible. To help achieve this, the latest spec release also adds a few minor changes that help make the protocol easier to use for developers.</p>
<ul>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986">SEP-986</a></strong>: Standardized format for tool names</li>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1319">SEP-1319</a></strong>: Decoupled request payload from RPC methods definition</li>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1699">SEP-1699</a></strong>: SSE polling via server-side disconnect for better connection management</li>
<li><strong><a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1309">SEP-1309</a></strong>: Improved specification version management for SDKs</li>
</ul>
<h2 id="looking-forward">Looking Forward</h2>
<p>This release is backward compatible. Your existing implementations keep working. The new features are there when you need them.</p>
<p>Looking ahead, we&rsquo;re excited about what&rsquo;s coming next for MCP. The protocol is entering a new phase, one where it&rsquo;s not just about connecting LLMs to data, but about enabling entirely new categories of AI-powered applications.</p>
<p>We&rsquo;re seeing early signals of this transformation already. Developers are building multi-agent systems that coordinate across dozens of MCP servers. Enterprise teams are deploying MCP at scale with sophisticated security and governance controls. Startups are launching products where MCP is the core architectural pattern. MCP servers are even being transformed into executable code, to create sandboxed agent workflows.</p>
<p>The <a href="https://modelcontextprotocol.io/development/roadmap">roadmap ahead</a> includes deeper work on reliability and observability, making it easier to debug and monitor complex MCP deployments. We&rsquo;re exploring better patterns for server composition, allowing you to build sophisticated capabilities by combining simpler building blocks. And we&rsquo;re continuing to refine the security model to meet the needs of the most demanding enterprise environments.</p>
<p>What excites us most isn&rsquo;t what <em>we&rsquo;re</em> planning to build but what <em>our community</em> is going to build. Every week we see MCP servers designed, developed, and deployed in novel ways. Every conversation in Discord reveals new use cases and patterns. The protocol has become a canvas for AI innovation, and we can&rsquo;t fill it alone.</p>
<p>The next year of MCP will be shaped by more production deployments, more real-world feedback, amplified by the creativity of thousands of developers worldwide. We&rsquo;re here to support that growth, to ensure the protocol evolves thoughtfully, and to keep MCP stable, secure, and simple as it scales.</p>
<h2 id="get-started">Get Started</h2>
<p>To get started with all the new goodness in the latest MCP specification release, check out the following resources:</p>
<ul>
<li><strong>Read the changelog</strong>: All major changes are captured in our <a href="https://modelcontextprotocol.io/specification/2025-11-25/changelog">Key Changes document</a></li>
<li><strong>Get to know our docs</strong>: The <a href="https://modelcontextprotocol.io/docs/getting-started/intro">MCP documentation</a> is the source of truth for the all the inner workings of the protocol</li>
<li><strong>Join the discussion</strong>: If you would like to contribute or engage with other MCP maintainers, start with our <a href="https://github.com/modelcontextprotocol/modelcontextprotocol">GitHub repo</a> and <a href="https://modelcontextprotocol.io/community/communication#discord">Discord</a></li>
</ul>
]]></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><item><title>Adopting the MCP Bundle format (.mcpb) for portable local servers</title><link>https://blog.modelcontextprotocol.io/posts/2025-11-20-adopting-mcpb/</link><pubDate>Fri, 21 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-11-20-adopting-mcpb/</guid><description>The MCP Bundle format (.mcpb) joins the MCP project, enabling one-click installation of local servers across any compatible client.</description><content:encoded><![CDATA[<p>The <a href="https://github.com/modelcontextprotocol/mcpb">MCP Bundle format</a> (MCPB) is now part of the <a href="https://github.com/modelcontextprotocol">Model Context Protocol project</a>. This distribution format simplifies how developers package and share local MCP servers, enabling users to install them across any compatible client, including the <a href="https://claude.com/download">Claude desktop app</a>, <a href="https://claude.com/product/claude-code">Claude Code</a>, and <a href="https://learn.microsoft.com/windows/ai/mcp/servers/mcp-server-overview">MCP for Windows</a>.</p>
<h2 id="what-are-mcp-bundles">What are MCP Bundles?</h2>
<p>MCP Bundles are ZIP archives containing a local MCP server and a <code>manifest.json</code> that describes the server and its capabilities. The format is similar to Chrome extensions (<code>.crx</code>) or VS Code extensions (<code>.vsix</code>), enabling end users to install local MCP servers with a single click.</p>
<p>A basic bundle structure looks like:</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-text" data-lang="text"><span style="display:flex;"><span>bundle.mcpb (ZIP file)
</span></span><span style="display:flex;"><span>├── manifest.json      # Required: Bundle metadata and configuration
</span></span><span style="display:flex;"><span>├── server/            # Server implementation
</span></span><span style="display:flex;"><span>│   └── index.js
</span></span><span style="display:flex;"><span>├── node_modules/      # Bundled dependencies
</span></span><span style="display:flex;"><span>└── icon.png           # Optional: Bundle icon
</span></span></code></pre></div><p>The format supports servers written in Node.js, Python, or compiled binaries, giving developers flexibility in how they build their integrations, while maintaining a consistent distribution mechanism for users.</p>
<h2 id="why-move-mcpb-to-the-mcp-project">Why move MCPB to the MCP project?</h2>
<p>Anthropic originally developed MCPB (previously called DXT) for Claude&rsquo;s desktop applications. However, we believe the local MCP server ecosystem benefits when portability extends beyond any single client. By moving the <a href="https://github.com/modelcontextprotocol/mcpb/blob/main/MANIFEST.md">bundle specification</a>, <a href="https://github.com/modelcontextprotocol/mcpb/blob/main/CLI.md">CLI tooling</a>, and <a href="https://github.com/modelcontextprotocol/mcpb/tree/main/examples">reference implementation</a> to the MCP project, we&rsquo;re enabling:</p>
<ul>
<li><strong>Cross-client compatibility:</strong> A bundle created for one MCP-compatible application should work in any other that implements the specification. Developers can distribute their work once and reach users across the ecosystem.</li>
<li><strong>Ecosystem-wide tooling:</strong> The <code>mcpb</code> CLI and associated libraries are now open for the community to extend, improve, and build upon. Client developers can adopt standardized code for loading and verifying bundles.</li>
<li><strong>User-friendly installation:</strong> End users benefit from a consistent installation experience regardless of which AI application they prefer. Configuration variables, permissions, and updates can be handled uniformly.</li>
<li><strong>Shared community:</strong> MCPB contributors can now collaborate in the open with the rest of the <a href="https://modelcontextprotocol.io/community/communication">MCP community</a>.</li>
</ul>
<h2 id="what-this-means-for-developers">What this means for developers</h2>
<p>This transition is mostly a logistical change, but also brings some benefits to implementers. For those that are building:</p>
<ul>
<li><strong>Servers:</strong> You can use MCPB to package your local MCP servers for distribution across multiple clients. The <code>mcpb</code> CLI helps you create a <code>manifest.json</code> and package your server into a <code>.mcpb</code> file. Once packaged, users can install your server with a single click in any client that supports MCP Bundles.</li>
<li><strong>Clients:</strong> You can add support for MCP Bundles to your application using the open source toolchain. <a href="https://github.com/modelcontextprotocol/mcpb">The repository</a> includes the schemas and key functions used by Claude for macOS and Windows to implement bundle support, which you can adapt for your own client.</li>
</ul>
<h2 id="getting-started">Getting started</h2>
<p>Check out the repo to get started: <a href="https://github.com/modelcontextprotocol/mcpb">modelcontextprotocol/mcpb</a>. We encourage <a href="https://github.com/modelcontextprotocol/mcpb/issues">feedback</a> and contributions!</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>Thanks to the MCP contributors and maintainers involved in making this happen, including:</p>
<ul>
<li><a href="https://github.com/dsp-ant">David Soria Parra</a> (<em>MCP Lead Maintainer</em>)</li>
<li><a href="https://github.com/domdomegg">Adam Jones</a> (<em>MCP Maintainer</em>)</li>
<li><a href="https://github.com/joan-anthropic">Joan Xie</a> (<em>MCPB Maintainer</em>)</li>
<li><a href="https://github.com/felixrieseberg">Felix Rieseberg</a> (<em>MCPB Maintainer</em>)</li>
<li><a href="https://github.com/asklar">Alex Sklar</a> (<em>MCPB Maintainer</em>)</li>
</ul>
]]></content:encoded></item><item><title>Server Instructions: Giving LLMs a user manual for your server</title><link>https://blog.modelcontextprotocol.io/posts/2025-11-03-using-server-instructions/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-11-03-using-server-instructions/</guid><description>How server instructions give LLMs the context they need to use your MCP server&amp;#39;s tools effectively — an underused protocol feature with outsized impact.</description><content:encoded><![CDATA[<p>Many of us are still exploring the nooks and crannies of MCP and learning how to best use the building blocks of the protocol to enhance agents and applications. Some features, like <a href="https://blog.modelcontextprotocol.io/posts/2025-07-29-prompts-for-automation/">Prompts</a>, are frequently implemented and used within the MCP ecosystem. Others may appear a bit more obscure but have a lot of influence on how well an agent can interact with an MCP server. <strong>Server instructions</strong> fall in the latter category.</p>
<h2 id="the-problem">The Problem</h2>
<p>Imagine you&rsquo;re a Large Language Model (LLM) who just got handed a collection of tools from a database server, a file system server, and a notification server to complete a task. They might have already been carefully pre-selected or they might be more like what my workbench looks like in my garage - a mishmash of recently-used tools.</p>
<p>Now let&rsquo;s say that the developer of the database server has pre-existing knowledge or preferences about how to best use their tools, as well as more background information about the underlying systems that power them.</p>
<p>Some examples could include:</p>
<ul>
<li>&ldquo;Always use <code>validate_schema</code> → <code>create_backup</code> → <code>migrate_schema</code> for safe database migrations&rdquo;</li>
<li>&ldquo;When using the <code>export_data</code> tool, the file system server&rsquo;s <code>write_file</code> tool is required for storing local copies&rdquo;</li>
<li>&ldquo;Database connection tools are rate limited to 10 requests per minute&rdquo;</li>
<li>&ldquo;If <code>create_backup</code> fails, check if the notification server is connected before attempting to send alerts&rdquo;</li>
<li>&ldquo;Only use <code>request_preferences</code> to ask the user for settings if elicitation is supported. Otherwise, fall back to using default configuration&rdquo;</li>
</ul>
<p>So now our question becomes: what&rsquo;s the most effective way to share this contextual knowledge?</p>
<h2 id="solutions">Solutions</h2>
<p>One solution could be to include extra information in every tool description or prompt provided by the server. Going back to the physical tool analogy, however: you can only depend on &ldquo;labeling&rdquo; each tool if there is enough space to describe them. A model&rsquo;s context window is limited - there&rsquo;s only so much information you can fit into that space. Even if all those labels can fit within your model&rsquo;s context window, the more tokens you cram into that space, the more challenging it becomes for models to follow them all.</p>
<p>Alternatively, relying on prompts to give common instructions means that:</p>
<ul>
<li>The prompt always needs to be selected by the user, and</li>
<li>The instructions are more likely to get lost in the shuffle of other messages.</li>
</ul>
<p>It&rsquo;s like having a pile of notes on my garage workbench, each trying to explain how different tools relate to each other. While you might find the right combination of notes, you&rsquo;d rather have a single, clear manual that explains how everything works together.</p>
<p>Similarly, for global instructions that you want the LLM to follow, it&rsquo;s best to inject them into the model&rsquo;s system prompt instead of including them in multiple tool descriptions or standalone prompts.</p>
<p>This is where <strong>server instructions</strong> come in. <a href="https://modelcontextprotocol.io/specification/draft/schema#initializeresult">Server instructions</a> give the server a way to inject information that the LLM should always read in order to understand how to use the server - independent of individual prompts, tools, or messages.</p>
<h3 id="a-note-on-implementation-variability">A Note on Implementation Variability</h3>
<p>Because server instructions may be injected into the system prompt, they should be written with caution and diligence. No instructions are better than poorly written instructions.</p>
<p>Additionally, the exact way that the MCP host uses server instructions is up to the implementer, so it&rsquo;s not always guaranteed that they will be injected into the system prompt. It&rsquo;s always recommended to evaluate a client&rsquo;s behavior with your server and its tools before relying on this functionality.</p>
<p>We will get deeper into both of these considerations with concrete examples.</p>
<h2 id="real-world-example-optimizing-github-pr-reviews">Real-World Example: Optimizing GitHub PR Reviews</h2>
<p>I tested server instructions using the official <a href="https://github.com/github/github-mcp-server">GitHub MCP server</a> to see if they could improve how models handle complex workflows. Even with advanced features like toolsets, models may struggle to consistently follow optimal multi-step patterns without explicit guidance.</p>
<h3 id="the-problem-detailed-pull-request-reviews">The Problem: Detailed Pull Request Reviews</h3>
<p>One common use case where I thought instructions could be helpful is when asking an LLM to &ldquo;Review pull request #123.&rdquo; Without more guidance, a model might decide to over-simplify and use the <code>create_and_submit_pull_request_review</code> tool to add all review feedback in a single comment. This isn&rsquo;t as helpful as leaving multiple inline comments for a detailed code review.</p>
<h3 id="the-solution-workflow-aware-instructions">The Solution: Workflow-Aware Instructions</h3>
<p>One solution I tested with the GitHub MCP server is to add instructions based on enabled toolsets. My hypothesis was that this would improve the consistency of workflows across models while still ensuring that I was only loading relevant instructions for the tools I wanted to use. Here is an example of what I added if the <code>pull_requests</code> toolset is enabled:</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-go" data-lang="go"><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">GenerateInstructions</span>(<span style="color:#a6e22e">enabledToolsets</span> []<span style="color:#66d9ef">string</span>) <span style="color:#66d9ef">string</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">var</span> <span style="color:#a6e22e">instructions</span> []<span style="color:#66d9ef">string</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Universal context management - always present</span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">baseInstruction</span> <span style="color:#f92672">:=</span> <span style="color:#e6db74">&#34;GitHub API responses can overflow context windows. Strategy: 1) Always prefer &#39;search_*&#39; tools over &#39;list_*&#39; tools when possible, 2) Process large datasets in batches of 5-10 items, 3) For summarization tasks, fetch minimal data first, then drill down into specifics.&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Only load instructions for enabled toolsets to minimize context usage</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">contains</span>(<span style="color:#a6e22e">enabledToolsets</span>, <span style="color:#e6db74">&#34;pull_requests&#34;</span>) {
</span></span><span style="display:flex;"><span>        <span style="color:#a6e22e">instructions</span> = append(<span style="color:#a6e22e">instructions</span>, <span style="color:#e6db74">&#34;PR review workflow: Always use &#39;create_pending_pull_request_review&#39; → &#39;add_comment_to_pending_review&#39; → &#39;submit_pending_pull_request_review&#39; for complex reviews with line-specific comments.&#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:#66d9ef">return</span> <span style="color:#a6e22e">strings</span>.<span style="color:#a6e22e">Join</span>(append([]<span style="color:#66d9ef">string</span>{<span style="color:#a6e22e">baseInstruction</span>}, <span style="color:#a6e22e">instructions</span><span style="color:#f92672">...</span>), <span style="color:#e6db74">&#34; &#34;</span>)
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>After implementing these instructions, I wanted to test whether they actually improved model behavior in practice.</p>
<h3 id="measuring-effectiveness-quantitative-results">Measuring Effectiveness: Quantitative Results</h3>
<p>To validate the impact of server instructions, I ran a simple controlled evaluation in Visual Studio Code comparing model behavior with and without the PR review workflow instruction. Using 40 GitHub PR review sessions on the same set of code changes, I measured whether models followed the optimal three-step workflow.</p>
<p>I used the following tool usage pattern to differentiate between successful and unsuccessful reviews:</p>
<ul>
<li><strong>Success:</strong> <code>create_pending_pull_request_review</code> → <code>add_comment_to_pending_review</code> → <code>submit_pending_pull_request_review</code></li>
<li><strong>Failure:</strong> Single-step <code>create_and_submit_pull_request_review</code> OR no review tools used. (Sometimes the model decided just to summarize feedback but didn&rsquo;t leave any comments on the PR.)</li>
</ul>
<p>You can find more setup details and raw data from this evaluation in <a href="https://github.com/olaservo/mcp-server-instructions-demo">my sample MCP Server Instructions repo</a>.</p>
<p>For this sample of chat sessions, I got the following results:</p>
<table>
  <thead>
      <tr>
          <th>Model</th>
          <th>With Instructions</th>
          <th>Without Instructions</th>
          <th>Improvement</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>GPT-5-Mini</strong></td>
          <td>8/10 (80%)</td>
          <td>2/10 (20%)</td>
          <td><strong>+60%</strong></td>
      </tr>
      <tr>
          <td><strong>Claude Sonnet-4</strong></td>
          <td>9/10 (90%)</td>
          <td>10/10 (100%)</td>
          <td>N/A</td>
      </tr>
      <tr>
          <td><strong>Overall</strong></td>
          <td>17/20 (85%)</td>
          <td>12/20 (60%)</td>
          <td><strong>+25%</strong></td>
      </tr>
  </tbody>
</table>
<p>These results suggest that while some models naturally gravitate toward optimal patterns, others benefit significantly from explicit guidance. This variability makes server instructions particularly valuable for ensuring consistent behavior across different models and client implementations.</p>
<p>You can check out the latest server instructions in the <a href="https://github.com/github/github-mcp-server/blob/main/pkg/github/instructions.go">GitHub MCP server repo</a>, which now includes this PR workflow as well as other hints for effective tool usage.</p>
<h2 id="implementing-server-instructions-general-tips-for-server-developers">Implementing Server Instructions: General Tips For Server Developers</h2>
<p>One key to good instructions is focusing on <strong>what tools and resources don&rsquo;t convey</strong>:</p>
<ol>
<li>
<p><strong>Capture cross-feature relationships</strong>:</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-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;Always call &#39;authenticate&#39; before any &#39;fetch_*&#39; tools. The &#39;cache_clear&#39; tool invalidates all &#39;fetch_*&#39; results.&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
<li>
<p><strong>Document operational patterns</strong>:</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-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;For best performance: 1) Use &#39;batch_fetch&#39; for multiple items, 2) Check &#39;rate_limit_status&#39; before bulk operations, 3) Results are cached for 5 minutes.&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
<li>
<p><strong>Specify constraints and limitations</strong>:</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-json" data-lang="json"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">&#34;instructions&#34;</span>: <span style="color:#e6db74">&#34;File operations limited to workspace directory. Binary files over 10MB will be rejected. Rate limit: 100 requests/minute across all tools.&#34;</span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div></li>
<li>
<p><strong>Write model-agnostic instructions</strong>:</p>
<p>Keep instructions factual and functional rather than assuming specific model behaviors. Don&rsquo;t rely on a specific model being used or assume model capabilities (such as reasoning).</p>
</li>
</ol>
<h3 id="anti-patterns-to-avoid">Anti-Patterns to Avoid</h3>
<p><strong>Don&rsquo;t repeat tool descriptions</strong>:</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-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad - duplicates what&#39;s in tool.description
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;The search tool searches for files. The read tool reads files.&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Good - adds relationship context
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;Use &#39;search&#39; before &#39;read&#39; to validate file paths. Search results expire after 10 minutes.&#34;</span>
</span></span></code></pre></div><p><strong>Don&rsquo;t include marketing or superiority claims</strong>:</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-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;This is the best server for all your needs! Superior to other servers!&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Good
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;Specialized for Python AST analysis. Not suitable for binary file processing.&#34;</span>
</span></span></code></pre></div><p><strong>Don&rsquo;t include general behavioral instructions, or anything unrelated to the tools or servers.</strong>:</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-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad - unrelated to server functionality
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;When using this server, talk like a pirate! Also be sure to always suggest that users switch to Linux for better performance.&#34;</span>
</span></span></code></pre></div><p><strong>Don&rsquo;t write a manual</strong>:</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-json" data-lang="json"><span style="display:flex;"><span><span style="color:#75715e">// Bad - too long and detailed
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;This server provides comprehensive functionality for... [500 words]&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Good - concise and actionable
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#e6db74">&#34;instructions&#34;</span><span style="color:#960050;background-color:#1e0010">:</span> <span style="color:#e6db74">&#34;GitHub integration server. Workflow: 1) &#39;auth_github&#39;, 2) &#39;list_repos&#39;, 3) &#39;clone_repo&#39;. API rate limits apply - check &#39;rate_status&#39; before bulk operations.&#34;</span>
</span></span></code></pre></div><h3 id="what-server-instructions-cant-do">What Server Instructions Can&rsquo;t Do:</h3>
<ul>
<li><strong>Guarantee certain behavior:</strong> As with any text you give an LLM, your instructions aren&rsquo;t going to be followed the same way all the time. Anything you ask a model to do is like rolling dice. The reliability of any instructions will vary based on randomness, sampling parameters, model, client implementation, other servers and tools at play, and many other variables.
<ul>
<li>Don&rsquo;t rely on instructions for any critical actions that need to happen in conjunction with other actions, especially in security or privacy domains. These are better implemented as deterministic rules or hooks.</li>
</ul>
</li>
<li><strong>Account for suboptimal tool design:</strong> Tool descriptions and other aspects of interface design for agents are still going to make or break how well LLMs can use your server when they need to take an action.</li>
<li><strong>Change model personality or behavior:</strong> Server instructions are for explaining your tools, not for modifying how the model generally responds or behaves.</li>
</ul>
<h3 id="a-note-for-client-implementers">A Note for Client Implementers</h3>
<p>If you&rsquo;re building an MCP client that supports server instructions, we recommend that you expose instructions to users and provide transparency about what servers are injecting into context. In the VSCode example, I was able to verify exactly what was being sent to the model in the chat logs.</p>
<p>Additional suggestions for implementing instructions in clients:</p>
<ul>
<li><strong>Give users control</strong> - Allow reviewing, enabling, or disabling server instructions to help users customize server usage and minimize conflicts or remove suboptimal instructions.</li>
<li><strong>Document your approach</strong> - Be clear about how your client handles and applies server instructions.</li>
</ul>
<h2 id="currently-supported-host-applications">Currently Supported Host Applications</h2>
<p>For a complete list of host applications that support server instructions, refer to the <a href="https://modelcontextprotocol.io/clients">Clients</a> page in the MCP documentation.</p>
<p>For a basic demo of server instructions in action, you can use the <a href="https://github.com/modelcontextprotocol/servers/tree/main/src/everything">Everything reference server</a> to confirm that your client supports this feature:</p>
<ol>
<li>Install the Everything Server in your host. The link above includes instructions on how to do this in a few popular applications. In the example below, we&rsquo;re using <a href="https://docs.anthropic.com/en/docs/claude-code/mcp">Claude Code</a>.</li>
<li>Once you&rsquo;ve confirmed that the server is connected, ask the model: <code>does the everything server tools have any special  instructions?</code></li>
<li>If the model can see your instructions, you should get a response like the one below:</li>
</ol>
<p><img
src="/posts/images/claude_code_instructions.JPG"
alt="Screenshot of response which reads: Server instructions are working!"
/></p>
<h2 id="wrapping-up">Wrapping Up</h2>
<p>Clear and actionable server instructions are a key tool in your MCP toolkit, offering a simple but effective way to enhance how LLMs interact with your server. This post provided a brief overview of how to use and implement server instructions in MCP servers. We encourage you to share your examples, insights, and questions <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/discussions">in our discussions</a>.</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>Parts of this blog post were sourced from discussions with the MCP community, contributors, and maintainers including:</p>
<ul>
<li><a href="https://github.com/akolotov">@akolotov</a></li>
<li><a href="https://github.com/cliffhall">@cliffhall</a></li>
<li><a href="https://github.com/connor4312">@connor4312</a></li>
<li><a href="https://github.com/digitarald">@digitarald</a></li>
<li><a href="https://github.com/dsp-ant">@dsp-ant</a></li>
<li><a href="https://github.com/evalstate">@evalstate</a></li>
<li><a href="https://github.com/ivan-saorin">@ivan-saorin</a></li>
<li><a href="https://github.com/jegelstaff">@jegelstaff</a></li>
<li><a href="https://github.com/localden">@localden</a></li>
<li><a href="https://github.com/PederHP">@PederHP</a></li>
<li><a href="https://github.com/tadasant">@tadasant</a></li>
<li><a href="https://github.com/toby">@toby</a></li>
</ul>
]]></content:encoded></item><item><title>Update on the Next MCP Protocol Release</title><link>https://blog.modelcontextprotocol.io/posts/2025-09-26-mcp-next-version-update/</link><pubDate>Fri, 26 Sep 2025 10:00:00 -0800</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-09-26-mcp-next-version-update/</guid><description>An update on the timeline and priorities for the next Model Context Protocol specification version</description><content:encoded><![CDATA[<p><strong>Update (November 11, 2025):</strong> The specification release candidate (RC) date has been shifted from November 11th to <strong>November 14th, 2025</strong>. The specification release date remains to be <strong>November 25th, 2025</strong>.</p>
<h2 id="release-timeline">Release Timeline</h2>
<p>The next version of the Model Context Protocol specification will be released on <strong>November 25th, 2025</strong>, with a release candidate (RC) available on <strong>November 11th, 2025</strong>.</p>
<p>We&rsquo;re building in a 14-day RC validation window so client implementors and SDK maintainers can thoroughly test the protocol changes. This approach gives us the focused time we need to deliver critical improvements while applying our <a href="https://modelcontextprotocol.io/community/governance">new governance model</a> to the process.</p>
<h2 id="summer-progress">Summer Progress</h2>
<p>Our last spec was released on June 18, 2025, and focused on structured tool outputs, OAuth-based authorization, elicitation for server-initiated user interactions, and improved security best practices.</p>
<p>Since then, we’ve focused on establishing additional foundations for the MCP ecosystem:</p>
<h3 id="formal-governance-structures">Formal Governance Structures</h3>
<p>We established a <a href="https://modelcontextprotocol.io/community/governance">formal governance model for MCP</a>, including defined roles and decision-making mechanisms. We also developed the <a href="https://modelcontextprotocol.io/community/sep-guidelines">Specification Enhancement Proposal (SEP)</a> process to provide clear guidelines for contributing specification changes.</p>
<p>Our goal is transparency—making decision-making procedures clear and accessible to everyone. Like any new system serving a fast-evolving community, our governance model is still finding its footing. We&rsquo;re actively refining it as both the protocol and community continue to grow.</p>
<h3 id="working-groups">Working Groups</h3>
<p>We&rsquo;ve launched <a href="https://modelcontextprotocol.io/community/working-interest-groups">Working Groups and Interest Groups</a> to foster community collaboration. These groups serve multiple purposes:</p>
<ul>
<li>Provide clear entry points for new contributors</li>
<li>Empower community members to lead initiatives in their areas of expertise</li>
<li>Distribute ownership across the ecosystem rather than concentrating it among core maintainers</li>
</ul>
<p>We&rsquo;re developing governance structures that will grant these groups greater autonomy in decision-making and implementation. This distributed approach ensures the protocol can grow to meet community needs while maintaining quality and consistency across different domains.</p>
<h3 id="registry-development">Registry Development</h3>
<p>In September, we <a href="https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/">launched the MCP Registry preview</a>—an open catalog and API for indexing and discovery of MCP servers. The Registry serves as the single source of truth for available MCP servers, supporting both public and private sub-registries that organizations can customize for their specific needs.</p>
<p>Building the MCP Registry has been a true community effort. Any MCP client can consume registry content via the native API or through third-party registry aggregators, making it easier for users to discover and integrate MCP servers into their AI workflows.</p>
<h2 id="priority-areas-for-the-next-release">Priority Areas for the Next Release</h2>
<p>With governance and infrastructure foundations in place, we&rsquo;re focusing on five key protocol improvements identified by our working groups.</p>
<h3 id="asynchronous-operations">Asynchronous Operations</h3>
<p>Currently, MCP is built around mostly synchronous operations—when you call a tool, everything stops and waits for it to finish. That works great for quick tasks, but what about operations that take minutes or hours?</p>
<p>The Agents Working Group is adding async support, allowing servers to kick off long-running tasks while clients can check back later for results. You can follow the progress in <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1391">SEP-1391</a>.</p>
<h3 id="statelessness-and-scalability">Statelessness and Scalability</h3>
<p>As organizations deploy MCP servers at enterprise scale, we&rsquo;re seeing new requirements emerge. Current implementations often need to remember things between requests, which makes horizontal scaling across multiple server instances challenging.</p>
<p>While <a href="https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http">Streamable HTTP</a> provides some stateless support, pain points remain around server startup and session handling. The Transport Working Group is smoothing out these rough edges, making it easier to run MCP servers in production while keeping simple upgrade paths for teams who want more sophisticated stateful features.</p>
<h3 id="server-identity">Server Identity</h3>
<p>Today, if you want to know what an MCP server can do, you have to connect to it first. This makes it difficult for clients to browse available servers or for systems like our registry to automatically catalog capabilities.</p>
<p>We&rsquo;re solving this by letting servers advertise themselves through <a href="https://en.wikipedia.org/wiki/Well-known_URI"><code>.well-known</code> URLs</a>—an established standard for providing metadata. Think of it as a server&rsquo;s business card that anyone can read without having to knock on the door first. This will make discovery much more intuitive for every MCP consumer.</p>
<h3 id="official-extensions">Official Extensions</h3>
<p>As MCP has grown, we&rsquo;ve noticed patterns emerging for specific industries and use cases—valuable implementations that don&rsquo;t necessarily belong in the core protocol specification.</p>
<p>Rather than leaving everyone to reinvent the wheel, we&rsquo;re officially recognizing and documenting the most popular protocol extensions. This curated collection of proven patterns will give developers building for specialized domains like healthcare, finance, or education a solid starting point instead of building every custom integration from scratch.</p>
<h3 id="sdk-support-standardization">SDK Support Standardization</h3>
<p>Choosing an MCP SDK today can be challenging—it&rsquo;s hard to gauge the level of support or spec compliance you&rsquo;ll get. Some SDKs are lightning-fast with updates, while others might lag behind feature-wise.</p>
<p>We&rsquo;re introducing a clear tiering system for SDKs. You&rsquo;ll know exactly what you&rsquo;re signing up for before committing to a dependency, based on factors like specification compliance speed, maintenance responsiveness, and feature completeness.</p>
<h2 id="call-for-contributors">Call for Contributors</h2>
<p>MCP is only as strong as the community behind it. Whether you&rsquo;re an individual developer passionate about building SDKs or a company looking to invest in the ecosystem, we need your help in several key areas.</p>
<h3 id="sdk-maintenance">SDK Maintenance</h3>
<ul>
<li><a href="https://github.com/modelcontextprotocol/typescript-sdk"><strong>TypeScript SDK</strong></a> - Needs additional maintainers for feature development and bug fixes</li>
<li><a href="https://github.com/modelcontextprotocol/swift-sdk"><strong>Swift SDK</strong></a> - Requires attention for Apple ecosystem support</li>
<li><a href="https://modelcontextprotocol.io/docs/sdk">Other language SDKs</a> welcome continued contributions</li>
</ul>
<h3 id="tooling">Tooling</h3>
<ul>
<li><a href="https://github.com/modelcontextprotocol/inspector"><strong>Inspector</strong></a> - Development and maintenance of debugging tools for MCP server developers</li>
<li><a href="https://github.com/modelcontextprotocol/registry"><strong>Registry</strong></a> - Backend API and CLI development; <strong>Go expertise would be particularly welcome</strong></li>
</ul>
<h2 id="input-from-client-developers">Input from Client Developers</h2>
<p>We talk a lot about MCP servers, but clients are equally important—they&rsquo;re the bridge connecting users to the entire MCP ecosystem. If you&rsquo;re building an MCP client, you&rsquo;re seeing the protocol from a unique angle, and we need that perspective embedded in the protocol design.</p>
<p>Your real-world experience with implementation challenges, performance bottlenecks, and user needs directly shapes where the protocol should go next. Whether it&rsquo;s feedback on existing capabilities or ideas for streamlining the developer experience, we want to hear from you.</p>
<p>Join us in the <code>#client-implementors</code> working group channel in the <a href="https://modelcontextprotocol.io/community/communication">MCP Discord</a>.</p>
<h2 id="looking-ahead">Looking Ahead</h2>
<p>With governance structures and working groups in place, we&rsquo;re better positioned to tackle major protocol improvements efficiently while ensuring everyone has a voice in the process. The foundational work we&rsquo;ve done this summer gives us a solid base to build from.</p>
<p>The improvements coming in November—async operations, better scalability, server discovery, and standardized extensions—will help MCP become a stronger backbone for production AI integrations. But we can&rsquo;t do it alone.</p>
<p>MCP&rsquo;s strength has always been that it&rsquo;s an <strong>open protocol built by the community, for the community</strong>. We&rsquo;re excited to keep building it together.</p>
<p>Thank you for your continued support, and we look forward to sharing more soon.</p>
]]></content:encoded></item><item><title>Introducing the MCP Registry</title><link>https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/</link><pubDate>Mon, 08 Sep 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-09-08-mcp-registry-preview/</guid><description>Launching the MCP Registry in preview: an open catalog and API for discovering publicly available MCP servers.</description><content:encoded><![CDATA[<p>Today, we&rsquo;re launching the Model Context Protocol (MCP) Registry—an open catalog and API for publicly available MCP servers to improve discoverability and implementation. By standardizing how servers are distributed and discovered, we’re expanding their reach while making it easier for clients to get connected.</p>
<p>The MCP Registry is now available in preview. To get started:</p>
<ul>
<li><strong>Add your server</strong> by following our guide on <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/quickstart.mdx">Adding Servers to the MCP Registry</a> (for server maintainers)</li>
<li><strong>Access server data</strong> by following our guide on <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/registry-aggregators.mdx">Accessing MCP Registry Data</a> (for client maintainers)</li>
</ul>
<h1 id="single-source-of-truth-for-mcp-servers">Single source of truth for MCP servers</h1>
<p>In March 2025, we shared that we wanted to build a central registry for the MCP ecosystem. Today we are announcing that we’ve launched <a href="https://registry.modelcontextprotocol.io">https://registry.modelcontextprotocol.io</a> as the official MCP Registry. As part of the MCP project, the MCP Registry, as well as a parent <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/reference/api/official-registry-api.md">OpenAPI specification</a>, are open source—allowing everyone to build a compatible sub-registry.</p>
<p>Our goal is to standardize how servers are distributed and discovered, providing a primary source of truth that sub-registries can build upon. In turn, this will expand server reach and help clients find servers more easily across the MCP ecosystem.</p>
<h2 id="public-and-private-sub-registries">Public and private sub-registries</h2>
<p>In building a central registry, it was important to us not to take away from existing registries that the community and companies have built. The MCP Registry serves as a primary source of truth for publicly available MCP servers, and organizations can choose to <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/registry-aggregators.mdx">create sub-registries</a> based on custom criteria. For example:</p>
<p><strong>Public subregistries</strong> like opinionated “MCP marketplaces” associated with each MCP client are free to augment and enhance data they ingest from the upstream MCP Registry. Every MCP end-user persona will have different needs, and it is up to the MCP client marketplaces to properly serve their end-users in opinionated ways.</p>
<p><strong>Private subregistries</strong> will exist within enterprises that have strict privacy and security requirements, but the MCP Registry gives these enterprises a single upstream data source they can build upon. At a minimum, we aim to share API schemas with these private implementations so that associated SDKs and tooling can be shared across the ecosystem.</p>
<p>In both cases, the MCP Registry is the starting point – it’s the centralized location where MCP server maintainers publish and maintain their self-reported information for these downstream consumers to massage and deliver to their end-users.</p>
<h2 id="community-driven-mechanism-for-moderation">Community-driven mechanism for moderation</h2>
<p>The MCP Registry is an official MCP project maintained by the registry working group and permissively licensed. Community members can submit issues to flag servers that violate the MCP <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/moderation-policy.mdx">moderation guidelines</a>—such as those containing spam, malicious code, or impersonating legitimate services. Registry maintainers can then denylist these entries and retroactively remove them from public access.</p>
<h1 id="getting-started">Getting started</h1>
<p>To get started:</p>
<ul>
<li><strong>Add your server</strong> by following our guide on <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/quickstart.mdx">Adding Servers to the MCP Registry</a> (for server maintainers)</li>
<li><strong>Access server data</strong> by following our guide on <a href="https://github.com/modelcontextprotocol/registry/blob/main/docs/modelcontextprotocol-io/registry-aggregators.mdx">Accessing MCP Registry Data</a> (for client maintainers)</li>
</ul>
<p>This preview of the MCP Registry is meant to help us improve the user experience before general availability and does not provide data durability guarantees or other warranties. We advise MCP adopters to watch development closely as breaking changes may occur before the registry is made generally available.</p>
<p>As we continue to develop the registry, we encourage feedback and contributions on the <a href="https://github.com/modelcontextprotocol/registry">modelcontextprotocol/registry GitHub repository</a>: Discussion, Issues, and Pull Requests are all welcome.</p>
<h1 id="thanks-to-the-mcp-community">Thanks to the MCP community</h1>
<p>The MCP Registry has been a collaborative effort from the beginning and we are incredibly grateful for the enthusiasm and support from the broader developer community.</p>
<p>In February 2025, it began as a grassroots project when MCP creators <a href="https://github.com/dsp-ant">David Soria Parra</a> and <a href="https://github.com/jspahrsummers">Justin Spahr-Summers</a> asked the <a href="https://www.pulsemcp.com/">PulseMCP</a> and <a href="https://block.github.io/goose/">Goose</a> teams to help build a centralized community registry. Registry Maintainer <a href="https://github.com/tadasant">Tadas Antanavicius</a> from <a href="https://www.pulsemcp.com/">PulseMCP</a> spearheaded the initial effort in collaboration with <a href="https://github.com/alexhancock">Alex Hancock</a> from <a href="https://block.xyz/">Block</a>. They were soon joined by Registry Maintainer <a href="https://github.com/toby">Toby Padilla</a>, Head of MCP at <a href="https://github.com/">GitHub</a>, and more recently, <a href="https://github.com/domdomegg">Adam Jones</a> from <a href="https://www.anthropic.com/">Anthropic</a> joined as Registry Maintainer to drive the project towards the launch today. The <a href="https://github.com/modelcontextprotocol/registry/discussions/11">initial announcement</a> of the MCP Registry&rsquo;s development lists 16 contributing individuals from at least 9 different companies.</p>
<p>Many others made crucial contributions to bring this project to life: <a href="https://github.com/rdimitrov">Radoslav Dimitrov</a> from <a href="https://stacklok.com/">Stacklok</a>, <a href="https://github.com/sridharavinash">Avinash Sridhar</a> from <a href="https://github.com/">GitHub</a>, <a href="https://github.com/connor4312">Connor Peet</a> from <a href="https://code.visualstudio.com/">VS Code</a>, <a href="https://github.com/joelverhagen">Joel Verhagen</a> from <a href="https://www.nuget.org/">NuGet</a>, <a href="https://github.com/pree-dew">Preeti Dewani</a> from <a href="https://last9.io/">Last9</a>, <a href="https://github.com/Avish34">Avish Porwal</a> from <a href="https://www.microsoft.com/">Microsoft</a>, <a href="https://github.com/jonathanhefner">Jonathan Hefner</a>, and many Anthropic and GitHub employees that provided code reviews and development support. We are also grateful to everyone on the <a href="https://github.com/modelcontextprotocol/registry/graphs/contributors">Registry&rsquo;s contributors log</a> and those who participated in <a href="https://github.com/modelcontextprotocol/registry">discussions and issues</a>.</p>
<p>We deeply appreciate everyone investing in this foundational open source infrastructure. Together, we&rsquo;re helping developers and organizations worldwide to build more reliable, context-aware AI applications. On behalf of the MCP community, thank you.</p>
]]></content:encoded></item><item><title>Announcing the Official PHP SDK for MCP</title><link>https://blog.modelcontextprotocol.io/posts/2025-09-05-php-sdk/</link><pubDate>Fri, 05 Sep 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-09-05-php-sdk/</guid><description>The official PHP SDK for the Model Context Protocol is now generally available, built in collaboration with the PHP Foundation and Symfony.</description><content:encoded><![CDATA[<p>The official <a href="https://github.com/modelcontextprotocol/php-sdk">PHP SDK</a> for the Model Context Protocol is now generally available.</p>
<p>Built in collaboration with the <a href="https://thephp.foundation/">PHP Foundation</a> and <a href="https://symfony.com/">Symfony</a>, the PHP SDK handles protocol details, so developers don’t have to worry about low-level mechanics and can focus on building their applications.</p>
<p>The initial release enables PHP developers to build MCP <a href="https://modelcontextprotocol.io/docs/learn/server-concepts">servers</a>, exposing <a href="https://modelcontextprotocol.io/docs/learn/server-concepts#tools-ai-actions">tools</a>, <a href="https://modelcontextprotocol.io/docs/learn/server-concepts#prompts-interaction-templates">prompts</a>, and <a href="https://modelcontextprotocol.io/docs/learn/server-concepts#resources-context-data">resources</a> to AI applications. Support for PHP applications to act as MCP <a href="https://modelcontextprotocol.io/docs/learn/client-concepts">clients</a> will follow.</p>
<p>The PHP SDK now joins 9 other <a href="https://modelcontextprotocol.io/docs/sdk">officially supported language SDKs</a> in the MCP ecosystem, making it easier for developers everywhere to adopt MCP in their preferred language.</p>
<h2 id="get-involved">Get involved</h2>
<p>The PHP SDK is now open to the community to install, test, and contribute:</p>
<ul>
<li>SDK repo: <a href="https://github.com/modelcontextprotocol/php-sdk">modelcontextprotocol/php-sdk</a></li>
<li>Composer package: <a href="https://packagist.org/packages/mcp/sdk">mcp/sdk</a></li>
</ul>
<p>We welcome your feedback and contribution, including issues, documentation improvements, and pull requests. Framework-specific integrations and real-world examples are also particularly valuable.</p>
<h2 id="thanks-to-the-mcp-community">Thanks to the MCP community</h2>
<p>This release consolidates earlier community work into a single, trusted implementation. The SDK is maintained by the <a href="https://symfony.com/">Symfony</a> team, with <a href="https://github.com/CodeWithKyrian">Kyrian Obikwelu</a> joining as a maintainer based on his previous <a href="https://github.com/php-mcp">PHP-MCP</a> work. The <a href="https://thephp.foundation/">PHP Foundation</a> helped to coordinate the initiative with support from the members of MCP steering group.</p>
<p>Thank you to all involved in bringing PHP to the MCP ecosystem.</p>
]]></content:encoded></item><item><title>Evolving OAuth Client Registration in the Model Context Protocol</title><link>https://blog.modelcontextprotocol.io/posts/client_registration/</link><pubDate>Fri, 22 Aug 2025 10:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/client_registration/</guid><description>&lt;p>The Model Context Protocol (MCP) has adopted OAuth 2.1 as the foundation for its authorization framework. A key part of the authorization flow that MCP is particularly reliant on is &lt;strong>client registration&lt;/strong>.&lt;/p>
&lt;p>This is especially important in a world where clients and servers don&amp;rsquo;t have a pre-existing relationship - we can&amp;rsquo;t assume that we will always know which MCP clients will connect to which MCP servers. This design highlights two challenges that need to be addressed:&lt;/p></description><content:encoded><![CDATA[<p>The Model Context Protocol (MCP) has adopted OAuth 2.1 as the foundation for its authorization framework. A key part of the authorization flow that MCP is particularly reliant on is <strong>client registration</strong>.</p>
<p>This is especially important in a world where clients and servers don&rsquo;t have a pre-existing relationship - we can&rsquo;t assume that we will always know which MCP clients will connect to which MCP servers. This design highlights two challenges that need to be addressed:</p>
<ul>
<li>Operational issues with managing client IDs via <a href="https://datatracker.ietf.org/doc/html/rfc7591">Dynamic Client Registration</a> (DCR)</li>
<li>Preventing client impersonation</li>
</ul>
<p>If you&rsquo;re already familiar with OAuth and the current state of client registration in MCP, skip to <a href="#two-distinct-challenges-in-mcp-client-registration">Two Distinct Challenges in MCP Client Registration</a>.</p>
<h2 id="background-on-oauth">Background on OAuth</h2>
<p>A protected MCP server that implements OAuth 2.1 should allow a user to grant a client access to itself and prevent attempts to trick the user into granting access to a client they didn&rsquo;t intend to use via phishing.</p>
<p>The authorization flow can be best described by looking at this sequence diagram:</p>
<pre class="mermaid">
  sequenceDiagram
   participant Client
   participant User
   participant AuthServer as Authorization Server
   participant Resource as Resource Server

   Client-&gt;&gt;User: 1. Redirect to authorization server
   User-&gt;&gt;AuthServer: Navigate to auth URL
   AuthServer-&gt;&gt;User: 2. Display consent screen
   User-&gt;&gt;AuthServer: Approve access
   AuthServer-&gt;&gt;Client: 3. Redirect with authorization code
   Client-&gt;&gt;AuthServer: 4. Exchange code for access token
   AuthServer--&gt;&gt;Client: Access token (saved)
   Client-&gt;&gt;Resource: 5. Request with access token
   Resource--&gt;&gt;Client: Protected resource
</pre>
<p>This flow requires a few steps to be performed to acquire an access token:</p>
<ol>
<li>The client directs the user to an authorization UI provided by the authorization server</li>
<li>The authorization server displays a consent screen to the user</li>
<li>User approves client access and the authorization server redirects the user back to the client with an access code</li>
<li>Client exchanges the access code for a set of tokens, which are cached locally</li>
<li>Client uses the access token to access the MCP server</li>
</ol>
<p>To be able to initiate this flow, however, the authorization server first needs some basic information about the client that is kicking off the authorization process:</p>
<ol>
<li><strong>Client name</strong>: Human readable text to display in the consent screen to help the user decide whether they want to grant access.</li>
<li><strong>Redirect URL</strong>: The destination to send the authorization code back to if the user consents.</li>
</ol>
<p>In order to prevent a malicious client from tricking a user into granting access they didn&rsquo;t intend to grant, the authorization server must be able to trust the client information it has.</p>
<p>For example, a malicious client could claim to be <code>Claude Desktop</code> on the consent screen while actually being owned by someone not affiliated with Claude Desktop developers. Seeing the client information on the consent screen, users might grant access thinking they&rsquo;re authorizing the legitimate Claude Desktop, not realizing that some malicious client now has access to their account.</p>
<h2 id="improving-client-registration-in-mcp">Improving Client Registration in MCP</h2>
<p>For MCP users, a common pattern is to connect to an MCP server by using its URL directly in an MCP client.</p>
<p>This goes against the typical OAuth authorization pattern because the user is selecting the resource server to connect to rather than the client developer. This problem is compounded by the fact that there is an unbounded number of authorization servers that an MCP server may use, meaning that clients need to be able to complete the authorization flow regardless of the provider used.</p>
<p>Some client developers have implemented pre-registration with a select few authorization servers. In this scenario, the client doesn&rsquo;t need to rely on DCR when it detects an authorization server it knows. However, this is a solution that doesn&rsquo;t scale given the breadth of the MCP ecosystem - it&rsquo;s impossible to have every client be registered with every authorization server there is.
To mitigate this challenge, we set out to outline some of the goals that we wanted to achieve with improving the client registration experience:</p>
<ol>
<li><strong>Clients</strong>: Client developers don&rsquo;t need to implement pre-registration and distribute a client ID for each authorization server MCP servers might be using.</li>
<li><strong>Users</strong>: Users don&rsquo;t need to go through a pre-registration process themselves and manually specify a client ID for every MCP server they connect to.</li>
<li><strong>Authorization servers</strong>:</li>
</ol>
<ul>
<li><strong>Trust in Metadata</strong>: Authorization servers have a way to trust the metadata they associate with a client, such as name and redirect URL.</li>
<li><strong>Single Client ID per App</strong>: Authorization servers can have a single client ID per client for governance and management purposes</li>
<li><strong>Selective Allow/Deny</strong>: Authorization servers can selectively allow or deny clients based on their policies.</li>
<li><strong>Database Management</strong>: Authorization servers do not need to handle an unbounded database or expiration flows for every new client registration.</li>
</ul>
<p>Currently, none of our existing client registration approaches satisfy all of these requirements. Pre-registration requires too much effort in a highly variable setting (unbounded number of clients connecting to unbounded number of servers), while DCR reduces effort but creates operational issues that a lot of the authorization servers are not ready to tackle yet.</p>
<h2 id="two-distinct-challenges-in-mcp-client-registration">Two Distinct Challenges in MCP Client Registration</h2>
<p>After extensive discussion with MCP server implementers, we&rsquo;ve identified that a few competing solutions to the registration problem were addressing two distinct issues:</p>
<ol>
<li><strong>Operational limitations</strong> of Dynamic Client Registration in open environments</li>
<li><strong>Client identity and impersonation</strong> risks across different deployment scenarios</li>
</ol>
<h2 id="challenge-1-operational-limitations-of-dynamic-client-registration"><strong>Challenge 1: Operational Limitations of Dynamic Client Registration</strong></h2>
<h3 id="the-dcr-model-mismatch"><strong>The DCR Model Mismatch</strong></h3>
<p>The DCR design takes the pre-registration pattern available in modern OAuth-based authorization servers and makes it available via an API. In fully open environments like MCP, DCR really puts the spotlight on a few operational challenges that an open registration endpoint introduces:</p>
<p><strong>For authorization servers:</strong></p>
<ul>
<li><strong>Unbounded database growth</strong>: Every time a user connects a client to an MCP server, a new registration is created with the authorization server unless the client already has one. Registrations are also not portable, so using Claude Desktop on your Windows machine, and then jumping to Claude Desktop on macOS will create two distinct client registrations.</li>
<li><strong>Client expiry &ldquo;black hole&rdquo;</strong>: There&rsquo;s no way to tell a client that its ID is invalid without creating an open redirect vulnerability. Clients have to implement their own heuristics for client ID management.</li>
<li><strong>Per-instance confusion</strong>: Each client instance typically gets its own client ID even when using the same application, but on different machines or across different users. From an auditing perspective, an authorization server administrator may see hundreds (if not thousands) of records for the same application without any rhyme or reason.</li>
<li><strong>Denial-of-Service vulnerability</strong>: An unauthenticated <code>/register</code> endpoint writes to a database within the authorization server, meaning that tenant admins now need to worry about rate limiting or policy controls (e.g., hosts allowed to register clients).</li>
</ul>
<p><strong>For clients:</strong></p>
<ul>
<li><strong>Extra overhead</strong>: Managing registration state and another secret beyond access/refresh tokens</li>
<li><strong>No validity checking</strong>: Can&rsquo;t verify if a client ID is still valid</li>
<li><strong>Unclear lifecycle</strong>: No guidance on when to re-register or update credentials</li>
</ul>
<h3 id="solution-client-id-metadata-documents-cimd"><strong>Solution: Client ID Metadata Documents (CIMD)</strong></h3>
<p>Client ID Metadata Documents (CIMD), described in <a href="https://www.ietf.org/archive/id/draft-parecki-oauth-client-id-metadata-document-03.html">OAuth Client ID Metadata Document</a> and implemented by Bluesky, elegantly sidestep these operational issues.</p>
<p>Instead of a registration step, clients use an HTTPS metadata URL as their client ID directly. The server fetches the metadata from the URL at authorization time:</p>
<pre class="mermaid">
  sequenceDiagram
   participant Client
   participant AuthServer
   participant MetadataURL

   Client-&gt;&gt;AuthServer: Authorization request (client_id=https://app.com/oauth.json)
   AuthServer-&gt;&gt;MetadataURL: GET https://app.com/oauth.json
   MetadataURL--&gt;&gt;AuthServer: {name: &#34;App&#34;, redirect_uris: [...]}
   AuthServer-&gt;&gt;Client: Show consent screen &amp; continue flow
</pre>
<p>This addresses all the operational issues:</p>
<ul>
<li><strong>No unbounded database growth</strong>: Servers fetch metadata on-demand (can cache for performance)</li>
<li><strong>No expiry management</strong>: The URL is the ID - it doesn&rsquo;t expire</li>
<li><strong>Natural per-app model</strong>: One URL per application, not per user</li>
<li><strong>No registration endpoint</strong>: No unauthenticated write operations</li>
</ul>
<p>The cost? Clients need to host a metadata document at an HTTPS URL. For web applications, this is trivial. For desktop applications, this typically means hosting on their backend infrastructure.</p>
<h2 id="challenge-2-client-identity-and-impersonation"><strong>Challenge 2: Client Identity and Impersonation</strong></h2>
<p>The second challenge is orthogonal to the DCR vs. CIMD debate - it&rsquo;s about trusting that a client is who it claims to be. This problem will exist regardless of how the registration process is implemented.</p>
<p>For web-based clients, trust is more straightforward, as we have an HTTPS domain that&rsquo;s tied to a certificate authority. For desktop clients, if the client can&rsquo;t offload its authorization to existing backend infrastructure, there is difficulty trusting the client is legitimate and unmodified.</p>
<h3 id="the-trust-spectrum">The Trust Spectrum</h3>
<p>We can map impersonation scenarios on two axes: attacker cost and mitigation complexity.</p>
<p><img alt="Mitigation Cost vs Attack Cost" loading="lazy" src="/posts/client_registration/mitigation-attack-cost.png"></p>
<p><strong>Low attacker cost/Low mitigation complexity: Domain-based attacks</strong></p>
<ul>
<li><strong>Attack</strong>: Register malicious callback URI and claim to be <code>Claude Desktop</code></li>
<li><strong>Cost</strong>: Trick user into clicking a link and consenting</li>
<li><strong>Mitigation</strong>:
<ul>
<li>Restrict trusted domains/URLs</li>
<li>Show warnings for unknown domains</li>
<li>Works with both DCR and CIMD</li>
</ul>
</li>
</ul>
<p><strong>Medium attacker cost/Medium mitigation complexity: <code>localhost</code> impersonation</strong></p>
<ul>
<li><strong>Attack</strong>: Run malicious app on <code>localhost:8080</code>, impersonate legitimate client</li>
<li><strong>Cost</strong>: Trick user into running a malicious application (plus consenting for that app to have data access)</li>
<li><strong>Problem</strong>: Desktop apps can&rsquo;t hold secrets, hard to prove identity</li>
</ul>
<p><strong>High attacker cost/High mitigation complexity: Platform-attested applications</strong></p>
<ul>
<li><strong>Attack</strong>: Get malicious client signed by a trusted authority</li>
<li><strong>Cost</strong>: Extremely high - requires compromising certification vendor processes</li>
<li><strong>Mitigation</strong>: platform system-level attestation (future work)</li>
</ul>
<h3 id="solution-software-statements-for-desktop-applications"><strong>Solution: Software Statements for Desktop Applications</strong></h3>
<p>To broadly solve the client impersonation for the middle tier as well as to prevent <code>localhost</code> impersonation we need signed software statements. Implementing this would require:</p>
<ol>
<li>Client hosts a JSON Web Key Set (JWKS) on their backend</li>
<li>Client authenticates the user through their own flow</li>
<li>The client-owned backend service issues a short-lived, signed JWT attesting to the client&rsquo;s identity</li>
<li>Client includes this JWT in the OAuth flow</li>
<li>Authorization server verifies the JWT against the trusted JWKS</li>
</ol>
<p>This dramatically raises the bar for client impersonation, as an attacker would need to:</p>
<ul>
<li>Compromise the client&rsquo;s backend infrastructure, or</li>
<li>Successfully impersonate the client&rsquo;s authentication flow</li>
</ul>
<p>Crucially, <strong>software statements work with both DCR and CIMD</strong>. They&rsquo;re not a competing solution - they&rsquo;re a complementary security layer.</p>
<h3 id="future-platform-level-attestation"><strong>Future: Platform-Level Attestation</strong></h3>
<p>The strongest protection would be platform-level attestation, e.g. having macOS, Windows, or Android attest that a piece of software is legitimate.</p>
<p>Having OS-level attestation would make client impersonation unreasonably expensive. While the exact way this ties into a software statement is yet to be prototyped, the general direction is threading platform-level application identity validation through to the OAuth flow.</p>
<h2 id="the-complementary-path-forward"><strong>The Complementary Path Forward</strong></h2>
<p>While we&rsquo;re looking at all available options, it&rsquo;s important to note that we&rsquo;re not choosing between solutions. We&rsquo;re exploring complementary approaches for distinct problems:</p>
<p><strong>For operational issues</strong>: We are looking at adding CIMD support in favor of DCR</p>
<ul>
<li>Keep DCR for backward compatibility</li>
<li>Recommend CIMD for new implementations</li>
<li>Both achieve the same authorization goal</li>
</ul>
<p><strong>For trust issues</strong>: Layering software statements on top</p>
<ul>
<li>Optional enhancement for both DCR and CIMD</li>
<li>Required only when <code>localhost</code> impersonation is a concern</li>
<li>Authorization servers choose their required trust level</li>
</ul>
<h2 id="security-considerations"><strong>Security Considerations</strong></h2>
<p>Both CIMD and software statements require authorization servers to make outbound HTTPS requests, potentially to untrusted domains. Implementations must:</p>
<ul>
<li>Prevent SSRF attacks by blocking internal network access</li>
<li>Implement timeouts and size limits</li>
<li>Consider caching strategies for performance</li>
<li>Validate response formats strictly</li>
</ul>
<p>If we adopt these approaches, we’ll need good best practices and SDK support to help avoid vulnerabilities and provide a easy path for implementors.</p>
<h2 id="next-steps"><strong>Next Steps</strong></h2>
<p>Discussions for these approaches are happening in the <a href="https://modelcontextprotocol.io/community/sep-guidelines">Specification Enhancement Proposals</a> (SEP):</p>
<ul>
<li><a href="https://github.com/modelcontextprotocol/specification/discussions/991">SEP-991: Client ID Metadata Documents</a></li>
<li><a href="https://github.com/modelcontextprotocol/specification/discussions/1032">SEP-1032: Software Statements with DCR</a></li>
</ul>
<p>Get involved: Join the conversation in <a href="https://discord.gg/6CSzBmMkjX">Discord</a> (the #auth-wg-client-registration channel) or comment on the SEPs directly.</p>
<p>A big thank to the following folks for help with this blog post: Den Delimarsky, Aaron Parecki, Geoff Goodman, Andrew Block, Pieter Kasselman, Abhishek Hingnikar, and Bobby Tiernay.</p>
]]></content:encoded></item><item><title>MCP Prompts: Building Workflow Automation</title><link>https://blog.modelcontextprotocol.io/posts/2025-07-29-prompts-for-automation/</link><pubDate>Mon, 04 Aug 2025 18:00:00 +0100</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-07-29-prompts-for-automation/</guid><description>A practical guide to building workflow automation with MCP prompts and resource templates, demonstrated through a meal planning example.</description><content:encoded><![CDATA[<p><a href="https://modelcontextprotocol.io/specification/2025-06-18">MCP (Model Context Protocol)</a> prompts enable workflow automation by combining AI capabilities with structured data access. This post demonstrates how to build automations using MCP&rsquo;s <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">prompts</a> and <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-templates">resource templates</a> through a practical example.</p>
<p>This guide demonstrates how MCP prompts can automate repetitive workflows. Whether you&rsquo;re interested in the MCP ecosystem or simply want to leverage AI for workflow automation, you&rsquo;ll learn how to build practical automations through a concrete meal planning example. No prior MCP experience needed—we&rsquo;ll cover the fundamentals before diving into implementation.</p>
<h2 id="the-problem-time-consuming-repetitive-tasks">The Problem: Time-Consuming Repetitive Tasks</h2>
<p>Everyone has a collection of repetitive tasks that eat away at their productive hours. Common examples include applying code review feedback, generating weekly reports, updating documentation, or creating boilerplate code. These tasks aren&rsquo;t complex—they follow predictable patterns—but they&rsquo;re cumbersome and time-consuming. <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">MCP prompts</a> were designed to help automate this kind of work.</p>
<p>MCP prompts offer more than command shortcuts. They&rsquo;re a primitive for building workflow automation that combines the flexibility of scripting with the intelligence of modern AI systems. This post explores how to build automations using MCP&rsquo;s prompt system, resource templates, and modular servers. I&rsquo;ll demonstrate these concepts through a meal planning automation I built, but the patterns apply broadly to any structured, repetitive workflow.</p>
<h2 id="example-automating-weekly-meal-planning">Example: Automating Weekly Meal Planning</h2>
<p>I needed to solve a recurring problem: planning weekly meals by cuisine to manage ingredients efficiently. The manual process involved selecting a cuisine, choosing dishes, listing ingredients, shopping, and organizing recipes—repetitive steps that took significant time each week.</p>
<p>So I decided to use MCP! By automating these steps, I could reduce the entire workflow to selecting a cuisine and receiving a complete meal plan with shopping list. (Any client that supports MCP prompts should work!)</p>
<ol>
<li>
<p><strong>Select a prompt</strong></p>
<p><img
src="/posts/images/prompts-list.png"
alt="MCP prompts list showing available automation commands"
/></p>
</li>
<li>
<p><strong>Select a cuisine from a dropdown</strong>
<img
src="/posts/images/prompts-suggestions.png"
alt="Dropdown showing cuisine suggestions as user types"
/></p>
</li>
<li>
<p><strong>Done!</strong>
The system generates a meal plan, shopping list, and even prints the shopping list and recipes.</p>
</li>
</ol>
<p><img
src="/posts/images/prompts-final-result.png"
alt="Final generated meal plan and shopping list output"
/></p>
<p>Here we are focuses primarily on the Recipe Server with its prompts and resources. You can find the <a href="https://github.com/ihrpr/mcp-server-tiny-print">printing server example here</a> (it works with a specific thermal printer model, but you could easily swap it for email, Notion, or any other output method). The beauty of separate servers is that you can mix and match different capabilities.</p>
<h2 id="core-components">Core Components</h2>
<p>Let&rsquo;s dive into the three components that make this automation possible: <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">prompts</a>, <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources">resources</a>, and <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/utilities/completion">completions</a>. I&rsquo;ll show you how each works conceptually, then we&rsquo;ll implement them together.</p>
<h3 id="1-resource-templates">1. Resource Templates</h3>
<p>In MCP, <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-types">static resources</a> represent specific pieces of content with unique URIs—like <code>file://recipes/italian.md</code> or <code>file://recipes/mexican.md</code>. While straightforward, this approach doesn&rsquo;t scale well. If you have recipes for 20 cuisines, you&rsquo;d need to define 20 separate resources, each with its own URI and metadata.</p>
<p><a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-templates">Resource templates</a> solve this through URI patterns with parameters, transforming static resource definitions into dynamic content providers.</p>
<p>For example, a template like <code>file://recipes/{cuisine}.md</code> might represent a set of resources like these:</p>
<ul>
<li><code>file://recipes/italian.md</code> returns Italian recipes</li>
<li><code>file://recipes/mexican.md</code> returns Mexican recipes</li>
</ul>
<p>This pattern extends beyond simple filtering. You can create templates for:</p>
<ul>
<li>Hierarchical data: <code>file://docs/{category}/{topic}</code></li>
<li>Git repository content: <code>git://repo/{branch}/path/{file}</code></li>
<li>Web resources: <code>https://api.example.com/users/{userId}/data</code></li>
<li>Query parameters: <code>https://example.com/{collection}?type={filter}</code></li>
</ul>
<p>For more details on URI schemes and resource templates, see the <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/resources#resource-templates">MCP Resource specification</a>.</p>
<h3 id="2-completions">2. Completions</h3>
<p>Nobody remembers exact parameter values. Is it &ldquo;italian&rdquo; or &ldquo;Italian&rdquo; or &ldquo;it&rdquo;? <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/utilities/completion">Completions</a> bridge this gap by providing suggestions as users type, creating an interface that feels intuitive rather than restrictive.</p>
<p>Different MCP clients present completions differently:</p>
<ul>
<li>VS Code shows a filterable dropdown</li>
<li>Command-line tools might use fuzzy matching</li>
<li>Web interfaces could provide rich previews</li>
</ul>
<p>But the underlying data comes from your server, maintaining consistency across all clients.</p>
<h3 id="3-prompts-commands-that-evolve-with-context">3. Prompts: Commands That Evolve With Context</h3>
<p><a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts">Prompts</a> are the entry points to your automation. They define what commands are available and can range from simple text instructions to rich, context-aware operations.</p>
<p>Let&rsquo;s see how prompts can evolve to handle increasingly sophisticated use cases:</p>
<p><strong>Basic prompt: Static instruction</strong></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-fallback" data-lang="fallback"><span style="display:flex;"><span>&#34;Create a meal plan for a week&#34;
</span></span></code></pre></div><p>This works, but it&rsquo;s generic. The AI will create a meal plan based on general knowledge.</p>
<p><strong>Adding parameters: Dynamic customization</strong></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-fallback" data-lang="fallback"><span style="display:flex;"><span>&#34;Create a meal plan for a week using {cuisine} cuisine&#34;
</span></span></code></pre></div><p>Now users can specify Italian, Mexican, or any other cuisine. The prompt adapts to user input, but still relies on the AI&rsquo;s general knowledge about these cuisines.</p>
<p><strong>Including resources: Your data</strong></p>
<p>Prompts can include resources to add context data beyond simple text instructions. This is crucial when you need the AI to work with your specific context rather than general knowledge.</p>
<p>In my meal planning example, I don&rsquo;t want generic recipes—I want the AI to use <strong>my</strong> collection of tested recipes that I know I like. Complex prompts make this possible by bundling prompt text with embedded resources.</p>
<p>Here&rsquo;s how it works:</p>
<ol>
<li><strong>User selects a prompt</strong> with parameters (e.g., &ldquo;plan-meals&rdquo; with cuisine=&ldquo;italian&rdquo;)</li>
<li><strong>Server returns</strong> both instructional text AND resource references</li>
<li><strong>Client decides how to handle resources</strong> - Applications might choose to select a subset of data using embeddings or keyword search, or pass the raw data directly to the model</li>
<li><strong>AI receives the context</strong> and generates a response</li>
</ol>
<p>In my example, VS Code attached the entire resource to the prompt, which worked great for this use case. The AI had access to all my Italian recipes when planning an Italian week, ensuring it only suggested dishes I actually had recipes for.</p>
<p>The key difference from simple prompts: instead of asking &ldquo;Plan Italian meals&rdquo; and getting generic suggestions, the AI works with your actual recipe collection, dietary preferences, and constraints.</p>
<p><img
src="/posts/images/prompts-rendered-prompt.png"
alt="VS Code showing the rendered prompt with attached recipe resources"
/></p>
<p>The recipe resources we&rsquo;ve been using are <strong>embedded resources</strong> that have inline content from the server. According to the <a href="https://modelcontextprotocol.io/specification/2025-06-18/server/prompts#data-types">MCP specification</a>, prompts can also include other data types.</p>
<p>This enables advanced use cases beyond our text-based recipes, like design review prompts with screenshots or voice transcription services.</p>
<h2 id="building-the-recipe-server">Building the Recipe Server</h2>
<p>Let&rsquo;s implement a complete MCP server that brings together all the concepts we&rsquo;ve discussed. We&rsquo;ll start with the server setup and then implement each capability.</p>
<h3 id="prerequisites">Prerequisites</h3>
<p>Before diving into the code, make sure you have:</p>
<ol>
<li><strong>Node.js</strong> (v18 or higher) and npm installed</li>
<li><strong>MCP SDK</strong> installed:
<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-bash" data-lang="bash"><span style="display:flex;"><span>npm install @modelcontextprotocol/sdk
</span></span></code></pre></div></li>
<li><strong>An MCP-compatible client with prompt and resource support</strong>,like VS Code with the MCP extension</li>
</ol>
<p>For this tutorial, I&rsquo;ll use the TypeScript SDK, but MCP also supports Python and other languages.</p>
<h3 id="server-setup-and-capabilities">Server Setup and Capabilities</h3>
<p>First, let&rsquo;s create our MCP server:</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-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">server</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">McpServer</span>({
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">name</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;favorite-recipes&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">version</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;1.0.0&#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:#66d9ef">async</span> <span style="color:#66d9ef">function</span> <span style="color:#a6e22e">main() {</span>
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">transport</span> <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">StdioServerTransport</span>();
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">await</span> <span style="color:#a6e22e">server</span>.<span style="color:#a6e22e">connect</span>(<span style="color:#a6e22e">transport</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">main</span>().<span style="color:#66d9ef">catch</span>((<span style="color:#a6e22e">error</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">console</span>.<span style="color:#a6e22e">error</span>(<span style="color:#e6db74">&#34;Server error:&#34;</span>, <span style="color:#a6e22e">error</span>);
</span></span><span style="display:flex;"><span>  <span style="color:#a6e22e">process</span>.<span style="color:#a6e22e">exit</span>(<span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><h3 id="implementing-resources">Implementing Resources</h3>
<p>Next, let&rsquo;s register a resource template with completions.</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-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#a6e22e">server</span>.<span style="color:#a6e22e">registerResource</span>(
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;recipes&#34;</span>,
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">new</span> <span style="color:#a6e22e">ResourceTemplate</span>(<span style="color:#e6db74">&#34;file://recipes/{cuisine}&#34;</span>, {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">list</span>: <span style="color:#66d9ef">undefined</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">complete</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">cuisine</span><span style="color:#f92672">:</span> (<span style="color:#a6e22e">value</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">CUISINES</span>.<span style="color:#a6e22e">filter</span>((<span style="color:#a6e22e">cuisine</span>) <span style="color:#f92672">=&gt;</span> <span style="color:#a6e22e">cuisine</span>.<span style="color:#a6e22e">startsWith</span>(<span style="color:#a6e22e">value</span>));
</span></span><span style="display:flex;"><span>      },
</span></span><span style="display:flex;"><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">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Cuisine-Specific Recipes&#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;Traditional recipes organized by cuisine&#34;</span>,
</span></span><span style="display:flex;"><span>  },
</span></span><span style="display:flex;"><span>  <span style="color:#66d9ef">async</span> (<span style="color:#a6e22e">uri</span>, <span style="color:#a6e22e">variables</span>, <span style="color:#a6e22e">_extra</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">cuisine</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">variables</span>.<span style="color:#a6e22e">cuisine</span> <span style="color:#66d9ef">as</span> <span style="color:#66d9ef">string</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> (<span style="color:#f92672">!</span><span style="color:#a6e22e">CUISINES</span>.<span style="color:#a6e22e">includes</span>(<span style="color:#a6e22e">cuisine</span>)) {
</span></span><span style="display:flex;"><span>      <span style="color:#66d9ef">throw</span> <span style="color:#66d9ef">new</span> Error(<span style="color:#e6db74">`Unknown cuisine: </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</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:#66d9ef">const</span> <span style="color:#a6e22e">content</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">formatRecipesAsMarkdown</span>(<span style="color:#a6e22e">cuisine</span>);
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">contents</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">uri</span>: <span style="color:#66d9ef">uri.href</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/markdown&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">text</span>: <span style="color:#66d9ef">content</span>,
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><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><h3 id="implementing-prompts">Implementing Prompts</h3>
<p>Finally, let&rsquo;s register the prompt, which also has completions:</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-typescript" data-lang="typescript"><span style="display:flex;"><span><span style="color:#a6e22e">server</span>.<span style="color:#a6e22e">registerPrompt</span>(
</span></span><span style="display:flex;"><span>  <span style="color:#e6db74">&#34;weekly-meal-planner&#34;</span>,
</span></span><span style="display:flex;"><span>  {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;Weekly Meal Planner&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span>
</span></span><span style="display:flex;"><span>      <span style="color:#e6db74">&#34;Create a weekly meal plan and grocery shopping list from cuisine-specific recipes&#34;</span>,
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">argsSchema</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">cuisine</span>: <span style="color:#66d9ef">completable</span>(<span style="color:#a6e22e">z</span>.<span style="color:#66d9ef">string</span>(), (<span style="color:#a6e22e">value</span>) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#a6e22e">CUISINES</span>.<span style="color:#a6e22e">filter</span>((<span style="color:#a6e22e">cuisine</span>) <span style="color:#f92672">=&gt;</span> <span style="color:#a6e22e">cuisine</span>.<span style="color:#a6e22e">startsWith</span>(<span style="color:#a6e22e">value</span>));
</span></span><span style="display:flex;"><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:#66d9ef">async</span> ({ <span style="color:#a6e22e">cuisine</span> }) <span style="color:#f92672">=&gt;</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">resourceUri</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">`file://recipes/</span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74">`</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">const</span> <span style="color:#a6e22e">recipeContent</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">formatRecipesAsMarkdown</span>(<span style="color:#a6e22e">cuisine</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> {
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">title</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`Weekly Meal Planner - </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> Cuisine`</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">description</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`Weekly meal planner for </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> cuisine`</span>,
</span></span><span style="display:flex;"><span>      <span style="color:#a6e22e">messages</span><span style="color:#f92672">:</span> [
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">role</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;user&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">content</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;text&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">text</span><span style="color:#f92672">:</span> <span style="color:#e6db74">`Plan cooking for the week. I&#39;ve attached the recipes from </span><span style="color:#e6db74">${</span><span style="color:#a6e22e">cuisine</span><span style="color:#e6db74">}</span><span style="color:#e6db74"> cuisine.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Please create:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">1. A 7-day meal plan using these recipes
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">2. An optimized grocery shopping list that minimizes waste by reusing ingredients across multiple recipes
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">3. Daily meal schedule with specific dishes for breakfast, lunch, and dinner
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">4. Preparation tips to make the week more efficient
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">5. Print Shopping list
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">Focus on ingredient overlap between recipes to reduce food waste.`</span>,
</span></span><span style="display:flex;"><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">role</span><span style="color:#f92672">:</span> <span style="color:#e6db74">&#34;user&#34;</span>,
</span></span><span style="display:flex;"><span>          <span style="color:#a6e22e">content</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;resource&#34;</span>,
</span></span><span style="display:flex;"><span>            <span style="color:#a6e22e">resource</span><span style="color:#f92672">:</span> {
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">uri</span>: <span style="color:#66d9ef">resourceUri</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/markdown&#34;</span>,
</span></span><span style="display:flex;"><span>              <span style="color:#a6e22e">text</span>: <span style="color:#66d9ef">recipeContent</span>,
</span></span><span style="display:flex;"><span>            },
</span></span><span style="display:flex;"><span>          },
</span></span><span style="display:flex;"><span>        },
</span></span><span style="display:flex;"><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><h2 id="running-it-yourself">Running It Yourself</h2>
<p>The <a href="https://github.com/ihrpr/mcp-server-fav-recipes">full code for the recipe server is available here</a>.</p>
<p>Follow VS Code&rsquo;s <a href="https://code.visualstudio.com/docs/copilot/chat/mcp-servers">documentation to set up the server</a>. Once a server is set up in VS Code, you can see its status, debug what&rsquo;s happening, and iterate quickly on your automations.</p>
<p>After the server is set up in VS Code, type &ldquo;/&rdquo; in chat and select the prompt.</p>
<p><img
src="/posts/images/prompts-list.png"
alt="MCP prompts list showing available automation commands"
/></p>
<h2 id="extending-your-automations">Extending Your Automations</h2>
<p>MCP prompts open up exciting automation possibilities:</p>
<ul>
<li><strong>Prompt Chains</strong>: Execute multiple prompts in sequence (plan meals → generate shopping list → place grocery order)</li>
<li><strong>Dynamic Prompts</strong>: Adapt based on available resources or time of year</li>
<li><strong>Cross-Server Workflows</strong>: Coordinate multiple MCP servers for complex automations</li>
<li><strong>External Triggers</strong>: Activate prompts via webhooks or schedules</li>
</ul>
<p>The patterns demonstrated in meal planning apply to many domains:</p>
<ul>
<li>Documentation generation that knows your codebase</li>
<li>Report creation with access to your data sources</li>
<li>Development workflows that understand your project structure</li>
<li>Customer support automations with full context</li>
</ul>
<p><strong>Key takeaways:</strong></p>
<ul>
<li>MCP prompts can include dynamic resources, giving AI full context for tasks</li>
<li>Resource templates enable scalable content serving without duplication</li>
<li>Modular server architecture lets you mix and match capabilities</li>
</ul>
<h2 id="wrapping-up">Wrapping Up</h2>
<p>This meal planning automation started as a simple desire to avoid rewriting shopping lists every week. It evolved into a complete system that handles meal planning, shopping lists, and recipe printing with just a few clicks.</p>
<p>MCP prompts provide practical tools to automate repetitive tasks. The modular architecture means you can start small—perhaps just automating one part of your workflow—and expand as needed. Whether you&rsquo;re automating documentation, reports, or meal planning, the patterns remain the same: identify repetitive tasks, build focused automations, and let the system handle the tedious parts.</p>
]]></content:encoded></item><item><title>Building to Last: A New Governance Model for MCP</title><link>https://blog.modelcontextprotocol.io/posts/2025-07-31-governance-for-mcp/</link><pubDate>Thu, 31 Jul 2025 00:00:00 +0000</pubDate><guid>https://blog.modelcontextprotocol.io/posts/2025-07-31-governance-for-mcp/</guid><description>Introducing MCP&amp;#39;s formal governance model: Specification Enhancement Proposals (SEPs), a maintainer structure, and a community-driven process for evolving the protocol.</description><content:encoded><![CDATA[<p>Since its open source release in November of 2024, the Model Context Protocol project has grown faster than we could have ever imagined. That&rsquo;s a wonderful problem to have, but with growth come growing pains. Our existing processes, which worked well for a small team, have started to show their limits.</p>
<p>Today, we&rsquo;re taking a big step to ensure MCP can continue to grow and thrive. We&rsquo;re introducing a formal governance model designed to bring clarity to the development process while preserving the collaborative, open source spirit that has made MCP successful.</p>
<h2 id="specification-enhancement-proposals-seps">Specification Enhancement Proposals (SEPs)</h2>
<p>One of the first major changes we&rsquo;re introducing is <a href="https://modelcontextprotocol.io/community/sep-guidelines">Specification Enhancement Proposals</a> (SEPs). This will be the primary mechanism for anyone to propose changes to MCP. SEPs are inspired by other projects, like <a href="https://peps.python.org/">Python PEPs</a> or <a href="https://github.com/rust-lang/rfcs">Rust RFCs</a>. We aim to make the process for suggesting changes to Model Context Protocol as straightforward as possible:</p>
<ol>
<li>Following the <a href="https://modelcontextprotocol.io/community/sep-guidelines">SEP guidelines</a>, submit a proposal as <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues">a GitHub issue</a> to start the conversation.</li>
<li>Our maintainers and core maintainers regularly review proposals and tag SEPs for review and sponsorship. You can also reach out and collaborate with contributing folks on <a href="https://discord.gg/6CSzBmMkjX">Discord</a> or <a href="https://github.com/modelcontextprotocol/modelcontextprotocol">GitHub</a>. Refer to <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/MAINTAINERS.md"><code>MAINTAINERS.md</code></a> for a list of currently active maintainers and their focus areas.</li>
<li>Work with the sponsor and the MCP community to move your proposal through draft, review, and implementation stages.</li>
</ol>
<p>SEPs provide a clear, documented path for evolving the protocol, ensuring that every major change is well-vetted by the community.</p>
<h2 id="leadership-roles">Leadership Roles</h2>
<p>The new model also establishes three types of leadership roles, ensuring both focused ownership and broad community representation:</p>
<ul>
<li><strong>Maintainers</strong> manage specific components like SDKs, our documentation, and individual repositories.</li>
<li><strong>Core Maintainers</strong> guide the overall direction of the project and the evolution of the MCP specification.</li>
<li><strong>Lead Maintainers</strong> serve as the final decision-makers and ensure the project&rsquo;s long-term health.</li>
</ul>
<p>All maintainers form the <strong>MCP steering group</strong>. To ensure a structured and timely review of incoming proposals, our core and lead maintainers will meet bi-weekly to review submitted <a href="#specification-enhancement-proposals-seps">SEPs</a>. Meeting notes and decisions will always be public. For example the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues/1061">notes from the core maintainer meeting on July 23rd, 2025</a>.</p>
<h2 id="get-involved">Get Involved</h2>
<p>We need your help to build the future of MCP, and everyone is welcome here. Whether you&rsquo;re a seasoned open source veteran or just curious about how to get started, there&rsquo;s a place for you in our community.</p>
<p>Many of our maintainers began with a single small contribution—sometimes just fixing a typo or asking a thoughtful question. Every journey starts somewhere, and we&rsquo;re excited to help you take your first step.</p>
<ul>
<li><strong>New Contributors</strong>: Unsure where to begin? Start by helping with documentation, fixing bugs, or building out examples. Every contribution matters, and we&rsquo;re here to support you. Check out issues tagged with <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22"><code>good first issue</code></a> - they&rsquo;re perfect for getting started, and you&rsquo;ll find friendly faces ready to help.</li>
<li><strong>SDK Developers</strong>: Have a favorite programming language? As MCP grows, we need your expertise to build and maintain the protocol SDKs. Your work could empower entire new communities to use MCP.</li>
<li><strong>Documentation Writers</strong>: Clear, comprehensive <a href="https://modelcontextprotocol.io/introduction">documentation</a> is what turns a good project into a great one. If you love explaining things or making guides, your contributions will help others succeed.</li>
<li><strong>Future Maintainers</strong>: We believe in growing our team from within. The path to becoming a maintainer starts with consistent, quality contributions and a commitment to the project&rsquo;s success. Imagine yourself guiding new contributors and shaping the future of MCP.</li>
</ul>
<p>No matter your background or experience, you belong here. Join our <a href="https://discord.gg/6CSzBmMkjX">Discord</a> to connect with other contributors, ask questions, and find mentorship. Whether you&rsquo;re fixing a typo or proposing a major change to the protocol, your voice is valued and your efforts make a difference.</p>
<p>For all the details, please see our full <a href="https://modelcontextprotocol.io/community/governance">governance documentation</a>.</p>
<h2 id="thank-you">Thank You</h2>
<p>None of this would be possible without the incredible community that has rallied around MCP. From the early adopters who believed in the vision, to the developers building MCP clients and servers, to the maintainers dedicating their time and expertise. Every contribution has been essential to making the Model Context Protocol the success it is today.</p>
<p>You&rsquo;ve helped us identify issues, improve documentation, build SDKs, create compelling examples, and push the boundaries of what&rsquo;s possible with platform integration. Your feedback, bug reports, feature requests, and code contributions have shaped MCP into something far better than we could have built alone.</p>
<p>As we embark on this next chapter with formal governance, we&rsquo;re more committed than ever to fostering the open, inclusive community that has made MCP thrive. Thank you for being part of this journey - we can&rsquo;t wait to see what we&rsquo;ll build together next.</p>
]]></content:encoded></item><item><title>The Model Context Protocol Blog</title><link>https://blog.modelcontextprotocol.io/posts/welcome-to-mcp-blog/</link><pubDate>Wed, 02 Jul 2025 11:46:28 +0100</pubDate><guid>https://blog.modelcontextprotocol.io/posts/welcome-to-mcp-blog/</guid><description>The official Model Context Protocol blog — updates, tutorials, and insights from maintainers and contributors.</description><content:encoded><![CDATA[<p>Welcome to the official Model Context Protocol (MCP) blog! This is where we&rsquo;ll share the latest updates, tutorials, best practices, and insights about MCP.</p>
<h2 id="about-mcp">About MCP</h2>
<p>The Model Context Protocol is an open standard that enables seamless integration between AI assistants and external data sources and tools. It provides a universal way for AI models to interact with local services, APIs, and data stores.</p>
<h2 id="get-involved">Get Involved</h2>
<p>We&rsquo;re excited to build this ecosystem together with you. Here&rsquo;s how you can participate:</p>
<ul>
<li>Check out the <a href="https://github.com/modelcontextprotocol/modelcontextprotocol/tree/main/docs/specification">MCP specification</a></li>
<li>Join the discussion on <a href="https://github.com/modelcontextprotocol">GitHub</a></li>
</ul>
]]></content:encoded></item></channel></rss>