{"id":3907,"date":"2026-06-24T13:20:35","date_gmt":"2026-06-24T20:20:35","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sdk\/?p=3907"},"modified":"2026-06-24T15:39:18","modified_gmt":"2026-06-24T22:39:18","slug":"functions-mcp-updates-build-2026","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sdk\/functions-mcp-updates-build-2026\/","title":{"rendered":"Azure Functions MCP Extension: What&#8217;s New at Build 2026"},"content":{"rendered":"<p>The Azure Functions MCP extension provides simple abstractions to help you build and host MCP servers without having to learn the protocol details yourself. You can use the triggers and bindings model to expose any function as an MCP tool, resource, or prompt. Since its initial preview, the extension has grown from supporting a single trigger type into a full-featured platform for building remote MCP servers: with tool, resource, and prompt triggers across multiple languages, MCP Apps for interactive UIs, built-in MCP authentication, and many feature enhancements. Here&#8217;s what&#8217;s new and what it means for developers building MCP servers on Azure Functions.<\/p>\n<h2>The full MCP primitive set: Tools, resources, and prompts<\/h2>\n<p>When the MCP extension first shipped, it supported tool triggers. Declare a function as an MCP tool, and any MCP client can discover and call it. That was the starting point.<\/p>\n<p>Since then, we&#8217;ve shipped the remaining MCP primitives:<\/p>\n<ul>\n<li><strong>Resource triggers<\/strong>: expose a function as an <a href=\"https:\/\/learn.microsoft.com\/azure\/azure-functions\/functions-bindings-mcp-resource-trigger\">MCP resource<\/a>. Resources serve context to clients: file contents, database schemas, UI components, or any data an agent needs to understand before acting. This is also the foundation for MCP Apps (more on that below).<\/li>\n<li><strong>Prompt triggers<\/strong>: expose a function as an <a href=\"https:\/\/learn.microsoft.com\/azure\/azure-functions\/functions-bindings-mcp-prompt-trigger\">MCP prompt<\/a>, letting clients request structured prompt templates from your server.<\/li>\n<\/ul>\n<p>Like tool triggers, resource and prompt triggers are supported in multiple languages including .NET, Java, Python, TypeScript, and JavaScript.<\/p>\n<h2>MCP Apps: interactive UI from your MCP server<\/h2>\n<p><a href=\"https:\/\/modelcontextprotocol.io\/extensions\/apps\/overview\">MCP Apps<\/a> let your tools return interactive user interfaces instead of plain text. Combine tool triggers with resource triggers, and your MCP server can serve rich, rendered experiences to MCP-aware clients.<\/p>\n<p>The Azure Functions MCP extension supports MCP Apps natively, meaning the same function app that exposes tools and resources can also serve UI components. The launch blog post on the <a href=\"https:\/\/techcommunity.microsoft.com\/blog\/appsonazureblog\/building-mcp-apps-with-azure-functions-mcp-extension\/4496536\">Azure Apps Blog<\/a> walked through the pattern in detail.<\/p>\n<p>For .NET developers, the new <strong>fluent builder API<\/strong> (available in the <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.Azure.Functions.Worker.Extensions.Mcp\">latest NuGet release<\/a>) makes it easier to compose MCP Apps by chaining tool and resource definitions in a declarative style.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-content\/uploads\/sites\/58\/2026\/06\/06-04-functions-mcp-updates-mcp-apps-demo.gif\" alt=\"MCP Apps demo\" width=\"70%\" \/><\/p>\n<h2>MCP authentication<\/h2>\n<p>The extension supports <a href=\"https:\/\/learn.microsoft.com\/azure\/app-service\/configure-authentication-mcp\">built-in MCP authentication<\/a>, implementing the requirements of the MCP auth spec. All samples in the <a href=\"https:\/\/aka.ms\/remote-mcp\">aka.ms\/remote-mcp<\/a> repo enable built-in MCP auth by default with Microsoft Entra ID as the identity provider.<\/p>\n<p>Samples have also been updated to demonstrate how to exchange tokens in the On-Behalf-Of (OBO) flow, so your MCP tools can access downstream APIs using the invoking user&#8217;s identity.<\/p>\n<p><strong>Auth configuration in the Azure portal<\/strong>: Preview at Build is a one-click experience in the Azure portal for configuring built-in MCP auth. No more manual app registration creating, configuration and wiring to the server. Just open your server app on the portal and click to enable MCP auth. <a href=\"https:\/\/aka.ms\/portal-mcp-auth-config\">Try it out<\/a>!<\/p>\n<h2>Feature enhancements<\/h2>\n<p>Beyond the headline primitives and auth, the extension has shipped a steady stream of capabilities the past few months. The following are the notable additions.<\/p>\n<h3>Structured content<\/h3>\n<p>Structured content lets you return machine-readable JSON metadata alongside your tool&#8217;s response via the <code>structuredContent<\/code> field. Clients that support it can programmatically consume the data (e.g. parse fields, render tables, drive downstream logic) rather than just displaying text. Clients that don&#8217;t support it still get the regular content blocks as a fallback.<\/p>\n<h3>Rich content types<\/h3>\n<p>Tools aren&#8217;t limited to returning plain text. The extension supports the full set of MCP content block types, e.g. <code>TextContent<\/code>, <code>ImageContent<\/code>, <code>AudioContent<\/code>, <code>ResourceLink<\/code>, and <code>EmbeddedResource<\/code>, so your tools can return images, audio clips, references to resources, and inline file content alongside text.<\/p>\n<h3>Input and output schemas<\/h3>\n<p><code>WithInputSchema<\/code> and <code>WithOutputSchema<\/code> give you explicit control over the JSON schemas advertised for your tools. This is especially useful when the auto-generated schema from function parameters doesn&#8217;t capture the full contract. For example, when your tool accepts a complex nested object or returns a specific shape that clients depend on. Input and output schemas are currently supported in .NET, with support for other languages coming soon.<\/p>\n<pre><code class=\"language-csharp\">builder.ConfigureMcpTool(\"SearchDocs\")\r\n    .WithOutputSchema(\"\"\"\r\n    {\r\n        \"type\": \"object\",\r\n        \"properties\": {\r\n            \"results\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\r\n            \"query\": { \"type\": \"string\" }\r\n        },\r\n        \"required\": [\"results\", \"query\"]\r\n    }\r\n    \"\"\");<\/code><\/pre>\n<h3>Fluent configuration APIs in .NET<\/h3>\n<p>A set of fluent builder APIs that let you configure MCP primitives declaratively in <code>Program.cs<\/code>:<\/p>\n<ul>\n<li><strong><code>ConfigureMcpTool<\/code><\/strong>: add properties, metadata, input\/output schemas, or promote a tool to an MCP App<\/li>\n<li><strong><code>ConfigureMcpResource<\/code><\/strong>: attach metadata to resources<\/li>\n<li><strong><code>ConfigureMcpPrompt<\/code><\/strong>: define prompt arguments and metadata<\/li>\n<\/ul>\n<pre><code class=\"language-csharp\">builder.ConfigureMcpTool(\"sayhello\")\r\n    .WithProperty(\"name\", McpToolPropertyType.String, \"Name of the user\", required: true)\r\n    .WithMetadata(\"ui\", new { resourceUri = \"ui:\/\/index.html\" });<\/code><\/pre>\n<h2>What&#8217;s next<\/h2>\n<p>Usage of the MCP extension has grown steadily since its preview launch. Tool execution volume has increased 15x over the past six months as more customers move from experimentation to production. As adoption grows, so do the expectations. Developers building production MCP servers are hitting real friction around auth complexity, client configuration, and observability. We&#8217;re continuing to invest in the extension to address these gaps and help customers be more successful building and hosting MCP servers on Azure Functions. Here&#8217;s where we&#8217;re focusing next.<\/p>\n<h3>Continued auth simplification<\/h3>\n<p>Auth remains the biggest barrier to getting an MCP server into production. We&#8217;ll work on:<\/p>\n<ul>\n<li><strong>Smoother client setup<\/strong>: making it easier to connect any MCP client to an authenticated Azure Functions MCP server, not just VS Code.<\/li>\n<li><strong>Simplified OBO flow<\/strong>: streamlining the experience of On-Behalf-Of authentication so developers can delegate user identity to downstream services with less configuration.<\/li>\n<\/ul>\n<p>Our goal: the secure path should be the easy path.<\/p>\n<h3>Deeper integration with Microsoft Foundry<\/h3>\n<p>We&#8217;ll build tighter integration between Azure Functions MCP servers and <a href=\"https:\/\/ai.azure.com\">Microsoft Foundry<\/a>. This includes surfacing MCP servers in <a href=\"https:\/\/learn.microsoft.com\/azure\/foundry\/agents\/how-to\/tools\/toolbox\">Foundry Toolbox<\/a>, a new feature introduced to help Foundry agents discover and consume tools from a single endpoint. Developers will be able to publish an MCP server from Functions and have it available to Foundry agents through Toolbox without manual endpoint configuration.<\/p>\n<h3>Continued feature enhancement<\/h3>\n<p>We prioritize based on feedback from the community raised in our <a href=\"https:\/\/github.com\/Azure\/azure-functions-mcp-extension\/issues\">GitHub repo<\/a>. For example, support for streaming output and pagination are top items in our backlog today based on user demand.<\/p>\n<p>We also track the MCP spec&#8217;s evolution closely and will continue shipping support for strategic features as they land. Examples of proposals we&#8217;re eyeing on:<\/p>\n<ul>\n<li><strong>MCP Tasks<\/strong>: the <a href=\"https:\/\/modelcontextprotocol.io\/seps\/1686-tasks\">Tasks extension (SEP-1686)<\/a> defines a standard pattern for async, long-running tool calls with durable task handles. This replaces hand-rolled polling patterns and aligns well with Functions&#8217; execute-and-return model.<\/li>\n<li><strong>Stateless MCP<\/strong>: <a href=\"https:\/\/modelcontextprotocol.io\/seps\/2575-stateless-mcp\">SEP-2575<\/a> proposes removing the mandatory initialization handshake, which is a natural fit for serverless platforms like Azure Functions where fresh instances can handle any request.<\/li>\n<\/ul>\n<p>Have something you&#8217;d like us to prioritize? Let us know by filing a request on <a href=\"https:\/\/github.com\/Azure\/azure-functions-mcp-extension\/issues\">GitHub<\/a>.<\/p>\n<hr \/>\n<h2>Get started<\/h2>\n<ul>\n<li><strong>Samples<\/strong>: Samples showcasing most up-to-date features: <a href=\"https:\/\/aka.ms\/remote-mcp\">aka.ms\/remote-mcp<\/a><\/li>\n<li><strong>Documentation<\/strong>: <a href=\"https:\/\/learn.microsoft.com\/azure\/azure-functions\/functions-bindings-mcp\">Model Context Protocol for Azure Functions<\/a><\/li>\n<li><strong>MCP Extension GitHub repo<\/strong>: <a href=\"https:\/\/github.com\/Azure\/azure-functions-mcp-extension\">Azure Functions MCP Extension<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>A roundup of what shipped in the Azure Functions MCP extension since preview: resource and prompt triggers, MCP Apps, built-in MCP authentication, structured and rich content, fluent .NET configuration APIs, and what is coming next.<\/p>\n","protected":false},"author":42940,"featured_media":3910,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[967,734,765,161,160,940,959,965,162,960,733],"class_list":["post-3907","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sdk","tag-ai-agents","tag-azure","tag-azure-functions","tag-dotnet","tag-java","tag-mcp","tag-model-context-protocol","tag-node-js","tag-python","tag-serverless","tag-typescript"],"acf":[],"blog_post_summary":"<p>A roundup of what shipped in the Azure Functions MCP extension since preview: resource and prompt triggers, MCP Apps, built-in MCP authentication, structured and rich content, fluent .NET configuration APIs, and what is coming next.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/3907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/users\/42940"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/comments?post=3907"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/3907\/revisions"}],"predecessor-version":[{"id":3908,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/3907\/revisions\/3908"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media\/3910"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media?parent=3907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/categories?post=3907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/tags?post=3907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}