<?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>Azure SDK | The .NET Blog</title><link>https://thedotnetblog.com/tags/azure-sdk/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>en</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Thu, 21 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/tags/azure-sdk/index.xml" rel="self" type="application/rss+xml"/><item><title>Stop Hammering a Struggling Dependency: Retry Patterns for Azure Functions + Service Bus</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</guid><description>Exponential backoff and circuit breaker patterns are now natively supported for Service Bus-triggered Azure Functions — here's how they work and why you want both.</description><content:encoded>&lt;p&gt;Here&amp;rsquo;s how a recoverable fault becomes an outage in a Functions app: a dependency starts timing out, every Function instance retries immediately and indefinitely, the dependency gets hammered with hundreds of concurrent failed requests, and what started as a transient hiccup turns into a system-wide backpressure event.&lt;/p&gt;
&lt;p&gt;You probably know this story. Azure Functions scale out fast — that&amp;rsquo;s the whole point. But &amp;ldquo;scale out fast&amp;rdquo; and &amp;ldquo;retry immediately&amp;rdquo; together can make failures dramatically worse.&lt;/p&gt;
&lt;p&gt;Two patterns help. Exponential backoff and circuit breaker. Both are now natively supported for Service Bus-triggered Azure Functions.&lt;/p&gt;
&lt;h2 id="two-patterns-different-roles"&gt;Two Patterns, Different Roles&lt;/h2&gt;
&lt;p&gt;These patterns are complementary, not alternatives:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exponential backoff&lt;/strong&gt; answers: &lt;em&gt;when should I try again?&lt;/em&gt;
It increases the delay between retries so a dependency has time to recover. Message-level, pacing the retry timing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Circuit breaker&lt;/strong&gt; answers: &lt;em&gt;should I call this dependency at all right now?&lt;/em&gt;
It stops repeated calls to an unhealthy dependency after a failure threshold is hit, then probes carefully after a cooldown period. System-level, preventing retry storms.&lt;/p&gt;
&lt;p&gt;You want both. Backoff handles per-message retry pacing. Circuit breaker handles aggregate health decisions.&lt;/p&gt;
&lt;h2 id="why-this-matters-especially-for-service-bus"&gt;Why This Matters Especially for Service Bus&lt;/h2&gt;
&lt;p&gt;The queue absorbs burst traffic, which is good. But without controls, the queue can grow while workers keep wasting compute on calls that will fail. Poison messages stay active longer than they should. Hot partitions or limited downstream capacity create cascading problems.&lt;/p&gt;
&lt;p&gt;The safer design:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Detect transient failure&lt;/li&gt;
&lt;li&gt;Delay the next attempt with exponential backoff&lt;/li&gt;
&lt;li&gt;Stop calling the dependency when a failure threshold is reached (circuit open)&lt;/li&gt;
&lt;li&gt;Resume carefully after a cooldown period (circuit probe)&lt;/li&gt;
&lt;li&gt;Move irrecoverable work to dead-letter or a quarantine path&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="what-the-native-support-looks-like"&gt;What the Native Support Looks Like&lt;/h2&gt;
&lt;p&gt;The new support integrates with the existing Azure Functions host model — no extra libraries, no custom implementations. Configuration goes in your &lt;code&gt;host.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;extensions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;serviceBus&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;messageHandlerOptions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxRetryCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;retryPolicy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mode&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;exponentialBackoff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;minBackoff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;00:00:02&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxBackoff&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;00:05:00&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;maxRetryCount&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Circuit breaker configuration sets the failure threshold and reset interval so unhealthy dependencies don&amp;rsquo;t get pummeled during recovery.&lt;/p&gt;
&lt;h2 id="languages-covered"&gt;Languages Covered&lt;/h2&gt;
&lt;p&gt;This isn&amp;rsquo;t .NET only. The feature covers dotnet, JavaScript, TypeScript, and Python — the full set of Service Bus trigger supported languages in Azure Functions.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Retry patterns aren&amp;rsquo;t exciting to configure until the first time a downstream outage causes your Functions to compound the problem instead of gracefully degrading. Setting these up proactively is cheap. Retrofitting them during an incident is not.&lt;/p&gt;
&lt;p&gt;Original post: &lt;a href="https://devblogs.microsoft.com/azure-sdk/exponential-backoff-circuit-breaker-azure-functions/"&gt;Exponential backoff and circuit breaker for Service Bus-triggered Azure Functions&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server Is Now a .mcpb — Install It Without Any Runtime</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>The Azure MCP Server is now available as an MCP Bundle (.mcpb) — download it, drag it into Claude Desktop, and you're done. No Node.js, Python, or .NET runtime required.</description><content:encoded>&lt;p&gt;You know what was annoying about setting up MCP servers? You needed a runtime. Node.js for the npm version, Python for pip/uvx, .NET SDK for the dotnet flavor, Docker if you wanted containers. Just to get a tool connected to your AI client.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server just changed that&lt;/a&gt;. It&amp;rsquo;s now available as an &lt;code&gt;.mcpb&lt;/code&gt; — an MCP Bundle — and the setup is drag-and-drop.&lt;/p&gt;
&lt;h2 id="whats-an-mcp-bundle"&gt;What&amp;rsquo;s an MCP Bundle?&lt;/h2&gt;
&lt;p&gt;Think of it like a VS Code extension (&lt;code&gt;.vsix&lt;/code&gt;) or a browser extension (&lt;code&gt;.crx&lt;/code&gt;), but for MCP servers. A &lt;code&gt;.mcpb&lt;/code&gt; file is a self-contained ZIP archive that includes the server binary and all its dependencies. Everything needed to run on your platform, packaged together.&lt;/p&gt;
&lt;p&gt;The end result: you download one file, open it in a supported client, and the server runs. No runtime to install, no &lt;code&gt;package.json&lt;/code&gt; to manage, no version conflicts.&lt;/p&gt;
&lt;h2 id="how-to-install-it"&gt;How to install it&lt;/h2&gt;
&lt;p&gt;Three steps:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Download the bundle for your platform&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;GitHub Releases page&lt;/a&gt; and grab the &lt;code&gt;.mcpb&lt;/code&gt; file for your OS and architecture. Make sure you pick the right one — &lt;code&gt;osx-arm64&lt;/code&gt; for Apple Silicon, &lt;code&gt;osx-x64&lt;/code&gt; for Intel Mac, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Install in Claude Desktop&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The easiest way: drag and drop the &lt;code&gt;.mcpb&lt;/code&gt; file into the Claude Desktop window while you&amp;rsquo;re on the Extensions settings page (&lt;code&gt;☰ → File → Settings → Extensions&lt;/code&gt;). Review the server details, click Install, confirm. Done.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tip: You can also set Claude Desktop as the default app for &lt;code&gt;.mcpb&lt;/code&gt; files and double-click to install.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3. Authenticate to Azure&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it. The Azure MCP Server uses your existing Azure credentials.&lt;/p&gt;
&lt;h2 id="what-you-can-do-with-it"&gt;What you can do with it&lt;/h2&gt;
&lt;p&gt;Once installed, you have access to 100+ Azure service tools directly from your AI client:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Query and manage Cosmos DB, Storage, Key Vault, App Service, Foundry&lt;/li&gt;
&lt;li&gt;Generate &lt;code&gt;az&lt;/code&gt; CLI commands for any task&lt;/li&gt;
&lt;li&gt;Create Bicep and Terraform templates&lt;/li&gt;
&lt;li&gt;Get architecture recommendations and diagnostics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try prompts like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;List all resource groups in my subscription&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Generate a Bicep template for a web app with a SQL database&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;What Cosmos DB databases do I have?&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Show me the secrets in my Key Vault named my-vault&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="which-install-method-should-you-use"&gt;Which install method should you use?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.mcpb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude Desktop users who want zero-config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code Extension&lt;/td&gt;
&lt;td&gt;Developers working in VS Code + GitHub Copilot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm/npx&lt;/td&gt;
&lt;td&gt;Developers who already have Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pip/uvx&lt;/td&gt;
&lt;td&gt;Python developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;CI/CD pipelines and containers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All methods give you the same tools. The &lt;code&gt;.mcpb&lt;/code&gt; is just the most frictionless path for Claude Desktop users.&lt;/p&gt;
&lt;h2 id="why-this-matters"&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;MCP servers are genuinely useful — they let AI clients interact with external systems in a structured way. But the setup friction has been a real barrier, especially for users who aren&amp;rsquo;t developers or who just don&amp;rsquo;t want to manage runtimes for every tool they install.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;.mcpb&lt;/code&gt; format feels like the right direction. It&amp;rsquo;s the same principle as VS Code extensions or browser extensions: one file, platform-native binary, install and go.&lt;/p&gt;
&lt;p&gt;If the MCP ecosystem keeps moving this direction, connecting AI clients to services will get a lot simpler.&lt;/p&gt;
&lt;h2 id="get-started"&gt;Get started&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Download&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docs&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;full post&lt;/a&gt; for troubleshooting tips and a comparison of all install methods.&lt;/p&gt;</content:encoded></item><item><title>Azure SDK April 2026: AI Foundry 2.0 and What .NET Developers Should Know</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-sdk-april-2026-ai-foundry-2-stable/</guid><description>The April 2026 Azure SDK release ships Azure.AI.Projects 2.0.0 stable with significant breaking changes, critical Cosmos DB security fixes, and a wave of new Provisioning libraries for .NET.</description><content:encoded>&lt;p&gt;Monthly SDK releases are often easy to skip. This one has a few things worth paying attention to — especially if you&amp;rsquo;re building with AI Foundry, Cosmos DB in Java, or doing infrastructure provisioning from .NET code.&lt;/p&gt;
&lt;h2 id="azureaiprojects-200--breaking-changes-that-make-sense"&gt;Azure.AI.Projects 2.0.0 — Breaking Changes That Make Sense&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;Azure.AI.Projects&lt;/code&gt; NuGet package reaches stable 2.0.0 with some significant architectural changes. If you&amp;rsquo;re already using the preview, here&amp;rsquo;s what changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespace splits&lt;/strong&gt;: Evaluations moved to &lt;code&gt;Azure.AI.Projects.Evaluation&lt;/code&gt;, memory operations moved to &lt;code&gt;Azure.AI.Projects.Memory&lt;/code&gt;. Your using statements will need updating.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Renamed types&lt;/strong&gt;: &lt;code&gt;Insights&lt;/code&gt; → &lt;code&gt;ProjectInsights&lt;/code&gt;, &lt;code&gt;Schedules&lt;/code&gt; → &lt;code&gt;ProjectSchedules&lt;/code&gt;, &lt;code&gt;Evaluators&lt;/code&gt; → &lt;code&gt;ProjectEvaluators&lt;/code&gt;, &lt;code&gt;Trigger&lt;/code&gt; → &lt;code&gt;ScheduleTrigger&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Naming conventions&lt;/strong&gt;: Boolean properties now follow the &lt;code&gt;Is*&lt;/code&gt; convention consistently&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are the kinds of breaking changes that hurt once and then feel right forever. If you&amp;rsquo;ve been building on the preview, update your imports and let the compiler point you to the rest.&lt;/p&gt;
&lt;p&gt;The good news: it&amp;rsquo;s stable. You can actually rely on this API now.&lt;/p&gt;
&lt;h2 id="cosmos-db-java-critical-security-fix-rce"&gt;Cosmos DB Java: Critical Security Fix (RCE)&lt;/h2&gt;
&lt;p&gt;This one is serious. The Java Cosmos DB library (&lt;code&gt;azure-cosmos&lt;/code&gt;) version 4.79.0 includes a critical security fix for a &lt;strong&gt;Remote Code Execution vulnerability (CWE-502)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The issue was Java deserialization in &lt;code&gt;CosmosClientMetadataCachesSnapshot&lt;/code&gt;, &lt;code&gt;AsyncCache&lt;/code&gt;, and &lt;code&gt;DocumentCollection&lt;/code&gt;. The fix replaces Java deserialization with JSON-based serialization, eliminating the entire class of deserialization attacks.&lt;/p&gt;
&lt;p&gt;If you have any Java services using Azure Cosmos DB, update to 4.79.0 immediately. This isn&amp;rsquo;t optional.&lt;/p&gt;
&lt;h2 id="new-provisioning-libraries-for-net"&gt;New Provisioning Libraries for .NET&lt;/h2&gt;
&lt;p&gt;A wave of stable Provisioning libraries hit 1.0.0 this month — these are the libraries that let you define Azure infrastructure in C# code rather than ARM templates or Bicep:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.Network/1.0.0"&gt;Azure.Provisioning.Network 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nuget.org/packages/Azure.Provisioning.PrivateDns/1.0.0"&gt;Azure.Provisioning.PrivateDns 1.0.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several more are in beta.1, covering API Management, Batch, Compute, Monitor, MySQL, and Security Center. If you&amp;rsquo;re doing infrastructure-as-code from .NET — particularly with Aspire deployments — these libraries are your entry point.&lt;/p&gt;
&lt;h2 id="azure-ai-agents-java-200-ga"&gt;Azure AI Agents Java: 2.0.0 GA&lt;/h2&gt;
&lt;p&gt;The Java Azure AI Agents library also reaches general availability this month. The key breaking changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Several enum types converted to &lt;code&gt;ExpandableStringEnum&lt;/code&gt;-based classes (more flexible for new values)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*Param&lt;/code&gt; model classes renamed to &lt;code&gt;*Parameter&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MCPToolConnectorId&lt;/code&gt; → &lt;code&gt;McpToolConnectorId&lt;/code&gt; (consistent casing)&lt;/li&gt;
&lt;li&gt;New convenience overload for &lt;code&gt;beginUpdateMemories&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;The headline for .NET developers this month is &lt;code&gt;Azure.AI.Projects 2.0.0&lt;/code&gt; hitting stable — if you&amp;rsquo;re building with AI Foundry, now&amp;rsquo;s the time to pin to stable and update your imports. For Java shops using Cosmos DB, the security update is urgent.&lt;/p&gt;
&lt;p&gt;Full release notes at &lt;a href="https://aka.ms/azsdk/releases"&gt;aka.ms/azsdk/releases&lt;/a&gt;. Original post: &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-sdk-release-april-2026/"&gt;Azure SDK Release (April 2026)&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 Just Dropped — Self-Hosted Agentic Cloud Automation Is Here</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 goes stable with self-hosted remote deployments, 276 tools across 57 Azure services, and enterprise-grade security — here's what matters for .NET developers building agentic workflows.</description><content:encoded>&lt;p&gt;If you&amp;rsquo;ve been building anything with MCP and Azure lately, you probably already know the local experience works well. Plug in an MCP server, let your AI agent talk to Azure resources, move on. But the moment you need to share that setup across a team? That&amp;rsquo;s where things got complicated.&lt;/p&gt;
&lt;p&gt;Not anymore. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;just hit 2.0 stable&lt;/a&gt;, and the headline feature is exactly what enterprise teams have been asking for: &lt;strong&gt;self-hosted remote MCP server support&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="whats-azure-mcp-server"&gt;What&amp;rsquo;s Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Quick refresher. Azure MCP Server implements the &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; specification and exposes Azure capabilities as structured, discoverable tools that AI agents can invoke. Think of it as a standardized bridge between your agent and Azure — provisioning, deployment, monitoring, diagnostics, all through one consistent interface.&lt;/p&gt;
&lt;p&gt;The numbers speak for themselves: &lt;strong&gt;276 MCP tools across 57 Azure services&lt;/strong&gt;. That&amp;rsquo;s serious coverage.&lt;/p&gt;
&lt;h2 id="the-big-deal-self-hosted-remote-deployments"&gt;The big deal: self-hosted remote deployments&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. Running MCP locally on your machine is fine for dev and experiments. But in a real team scenario, you need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shared access for developers and internal agent systems&lt;/li&gt;
&lt;li&gt;Centralized configuration (tenant context, subscription defaults, telemetry)&lt;/li&gt;
&lt;li&gt;Enterprise network and policy boundaries&lt;/li&gt;
&lt;li&gt;Integration into CI/CD pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 addresses all of this. You can deploy it as a centrally managed internal service with HTTP-based transport, proper authentication, and consistent governance.&lt;/p&gt;
&lt;p&gt;For auth, you get two solid options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — when running alongside &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Behalf-Of (OBO) flow&lt;/strong&gt; — OpenID Connect delegation that calls Azure APIs using the signed-in user&amp;rsquo;s context&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That OBO flow is particularly interesting for us .NET developers. It means your agentic workflows can operate with the user&amp;rsquo;s actual permissions, not some over-privileged service account. Principle of least privilege, built right in.&lt;/p&gt;
&lt;h2 id="security-hardening"&gt;Security hardening&lt;/h2&gt;
&lt;p&gt;This isn&amp;rsquo;t just a feature release — it&amp;rsquo;s a security one too. The 2.0 release adds:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stronger endpoint validation&lt;/li&gt;
&lt;li&gt;Protections against injection patterns in query-oriented tools&lt;/li&gt;
&lt;li&gt;Tighter isolation controls for dev environments&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re going to expose MCP as a shared service, these safeguards matter. A lot.&lt;/p&gt;
&lt;h2 id="where-can-you-use-it"&gt;Where can you use it?&lt;/h2&gt;
&lt;p&gt;The client compatibility story is broad. Azure MCP Server 2.0 works with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDEs&lt;/strong&gt;: VS Code, Visual Studio, IntelliJ, Eclipse, Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI agents&lt;/strong&gt;: GitHub Copilot CLI, Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standalone&lt;/strong&gt;: local server for simple setups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted remote&lt;/strong&gt;: the new star of 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus there&amp;rsquo;s sovereign cloud support for Azure US Government and Azure operated by 21Vianet, which is critical for regulated deployments.&lt;/p&gt;
&lt;h2 id="why-this-matters-for-net-developers"&gt;Why this matters for .NET developers&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re building agentic applications with .NET — whether that&amp;rsquo;s Semantic Kernel, Microsoft Agent Framework, or your own orchestration — Azure MCP Server 2.0 gives you a production-ready way to let your agents interact with Azure infrastructure. No custom REST wrappers. No service-specific integration patterns. Just MCP.&lt;/p&gt;
&lt;p&gt;Combined with the &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;fluent API for MCP Apps&lt;/a&gt; that dropped a few days ago, the .NET MCP ecosystem is maturing fast.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Pick your path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt; — source code, docs, everything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Docker Image&lt;/a&gt;&lt;/strong&gt; — containerized deployment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;VS Code Extension&lt;/a&gt;&lt;/strong&gt; — IDE integration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Self-hosting guide&lt;/a&gt;&lt;/strong&gt; — the 2.0 flagship feature&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 is exactly the kind of infrastructure upgrade that doesn&amp;rsquo;t look flashy in a demo but changes everything in practice. Self-hosted remote MCP with proper auth, security hardening, and sovereign cloud support means MCP is ready for real teams building real agentic workflows on Azure. If you&amp;rsquo;ve been waiting for the &amp;ldquo;enterprise-ready&amp;rdquo; signal — this is it.&lt;/p&gt;</content:encoded></item><item><title>MCP Apps Get a Fluent API — Build Rich AI Tool UIs in .NET with Three Steps</title><link>https://thedotnetblog.com/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>The new fluent configuration API for MCP Apps on Azure Functions lets you turn any .NET MCP tool into a full app with views, permissions, and CSP policies in just a few lines of code.</description><content:encoded>&lt;p&gt;MCP tools are great for giving AI agents capabilities. But what if your tool needs to show something to the user — a dashboard, a form, an interactive visualization? That&amp;rsquo;s where MCP Apps come in, and they just got a lot easier to build.&lt;/p&gt;
&lt;p&gt;Lilian Kasem from the Azure SDK team &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;introduced the new fluent configuration API&lt;/a&gt; for MCP Apps on .NET Azure Functions, and it&amp;rsquo;s the kind of developer experience improvement that makes you wonder why it wasn&amp;rsquo;t always this simple.&lt;/p&gt;
&lt;h2 id="what-are-mcp-apps"&gt;What are MCP Apps?&lt;/h2&gt;
&lt;p&gt;MCP Apps extend the Model Context Protocol by letting tools carry their own UI views, static assets, and security controls. Instead of just returning text, your MCP tool can render full HTML experiences — interactive dashboards, data visualizations, configuration forms — all invocable by AI agents and presented to users by MCP clients.&lt;/p&gt;
&lt;p&gt;The catch was that wiring all this up manually required knowing the MCP spec intimately: &lt;code&gt;ui://&lt;/code&gt; URIs, special mime types, metadata coordination between tools and resources. Not hard, but fiddly.&lt;/p&gt;
&lt;h2 id="the-fluent-api-in-three-steps"&gt;The fluent API in three steps&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Define your function.&lt;/strong&gt; Just a standard Azure Functions MCP tool:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Function(nameof(HelloApp))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [McpToolTrigger(&amp;#34;HelloApp&amp;#34;, &amp;#34;A simple MCP App that says hello.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ToolInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello from app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 2: Promote it to an MCP App.&lt;/strong&gt; In your program startup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureMcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HelloApp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsMcpApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/hello-app.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardWrite&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardRead&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowBaseUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Step 3: Add your HTML view.&lt;/strong&gt; Create &lt;code&gt;assets/hello-app.html&lt;/code&gt; with whatever UI you need.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it. The fluent API handles all the MCP spec plumbing — generating the synthetic resource function, setting the correct mime type, injecting the metadata that connects your tool to its view.&lt;/p&gt;
&lt;h2 id="the-api-surface-is-well-designed"&gt;The API surface is well-designed&lt;/h2&gt;
&lt;p&gt;A few things I really like:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;View sources are flexible.&lt;/strong&gt; You can serve HTML from files on disk, or embed resources directly in your assembly for self-contained deployments:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/my-view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEmbeddedResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MyApp.Resources.view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CSP is composable.&lt;/strong&gt; You explicitly allowlist origins your app needs, following least-privilege principles. Call &lt;code&gt;WithCsp&lt;/code&gt; multiple times and origins accumulate:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://api.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadResourcesFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://cdn.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://youtube.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Visibility control.&lt;/strong&gt; You can make a tool visible to the LLM only, the host UI only, or both. Want a tool that only renders UI and shouldn&amp;rsquo;t be called by the model? Easy:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpVisibility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// UI-only, hidden from the model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="getting-started"&gt;Getting started&lt;/h2&gt;
&lt;p&gt;Add the preview package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you&amp;rsquo;re already building MCP tools with Azure Functions, this is just a package update. The &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;MCP Apps quickstart&lt;/a&gt; is the best place to start if you&amp;rsquo;re new to the concept.&lt;/p&gt;
&lt;h2 id="wrapping-up"&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;MCP Apps are one of the more exciting developments in the AI tooling space — tools that don&amp;rsquo;t just &lt;em&gt;do things&lt;/em&gt; but can &lt;em&gt;show things&lt;/em&gt; to users. The fluent API removes the protocol complexity and lets you focus on what matters: your tool&amp;rsquo;s logic and its UI.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;full post&lt;/a&gt; for the complete API reference and examples.&lt;/p&gt;</content:encoded></item></channel></rss>