<?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 Functions | The .NET Blog</title><link>https://thedotnetblog.com/it/tags/azure-functions/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>it</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Sun, 31 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/it/tags/azure-functions/index.xml" rel="self" type="application/rss+xml"/><item><title>Workflow Durevoli in Microsoft Agent Framework: Da In-Memory ad Azure Functions</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</guid><description>Il modello di programmazione del workflow di MAF ora supporta l'esecuzione durevole basata su Durable Task — ecco come costruire workflow di agenti componibili che sopravvivono ai riavvii del processo e scalano su Azure Functions.</description><content:encoded>&lt;p&gt;Uno dei punti dolenti dei primi workflow di agenti IA: sono fragili. Un workflow multi-step a lunga esecuzione legato a un singolo processo significa che il riavvio del processo = stato perso. Per demo semplici va bene. Per carichi di lavoro in produzione non lo è.&lt;/p&gt;
&lt;p&gt;Il modello di programmazione del workflow di Microsoft Agent Framework ora supporta l&amp;rsquo;&lt;strong&gt;esecuzione durevole&lt;/strong&gt;, basata sul framework Durable Task, con hosting Azure Functions. Ecco come funziona il modello di programmazione e perché la storia della durabilità conta.&lt;/p&gt;
&lt;h2 id="i-blocchi-fondamentali"&gt;I Blocchi Fondamentali&lt;/h2&gt;
&lt;p&gt;Gli &lt;strong&gt;Executor&lt;/strong&gt; sono l&amp;rsquo;unità fondamentale di lavoro. Ognuno è tipizzato — prende un input specifico e produce un output specifico:&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="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Workflows&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;internal&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderLookup&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;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderCancelRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;OrderLookup&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;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HandleAsync&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;OrderCancelRequest&lt;/span&gt; &lt;span class="n"&gt;message&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;IWorkflowContext&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="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&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="c1"&gt;// cercare l&amp;#39;ordine, restituirlo&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderId&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="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;I &lt;strong&gt;Workflow&lt;/strong&gt; collegano gli executor in grafi diretti usando un builder fluente. Il framework gestisce l&amp;rsquo;esecuzione, il flusso di dati tra i passi e la propagazione degli errori.&lt;/p&gt;
&lt;p&gt;Puoi modellare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Catene sequenziali (passo A → passo B → passo C)&lt;/li&gt;
&lt;li&gt;Fan-out/fan-in parallelo (eseguire gli agenti A, B, C in parallelo, aggregare i risultati)&lt;/li&gt;
&lt;li&gt;Ramificazione condizionale&lt;/li&gt;
&lt;li&gt;Approvazioni umano-nel-ciclo (mettere in pausa il workflow, attendere un segnale esterno)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="il-runner-in-memory-per-lo-sviluppo-locale"&gt;Il Runner In-Memory per lo Sviluppo Locale&lt;/h2&gt;
&lt;p&gt;Iniziare è veloce:&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;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workflows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Il pacchetto principale include un runner leggero in-process. Nessuna dipendenza esterna, nessun database, nessuna risorsa Azure. Funziona benissimo per lo sviluppo locale e i test unitari.&lt;/p&gt;
&lt;h2 id="aggiungere-durabilità-con-durable-task"&gt;Aggiungere Durabilità con Durable Task&lt;/h2&gt;
&lt;p&gt;Quando un workflow deve sopravvivere ai riavvii del processo — perché è a lunga esecuzione, perché ha passi umano-nel-ciclo, perché si distribuisce su molte chiamate di agenti in parallelo — il runner in-memory non è sufficiente.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;integrazione Durable Task di MAF memorizza lo stato del workflow in Azure Storage. Se il processo si riavvia, il workflow riprende da dove si era fermato. Il modello di programmazione rimane lo stesso; basta sostituire il runner.&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;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workflows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DurableTask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gli stessi executor, lo stesso grafo del workflow — basato su stato durevole.&lt;/p&gt;
&lt;h2 id="hosting-azure-functions"&gt;Hosting Azure Functions&lt;/h2&gt;
&lt;p&gt;Il terzo livello è l&amp;rsquo;hosting Azure Functions. Il tuo workflow diventa un&amp;rsquo;app Function: attiva il workflow tramite un endpoint HTTP, e il runtime durevole gestisce scalabilità, stato e affidabilità.&lt;/p&gt;
&lt;p&gt;Ciò significa che un workflow multi-agente con chiamate parallele, rami condizionali e approvazioni umane può scalare in un ambiente Functions serverless senza gestione dello stato personalizzata.&lt;/p&gt;
&lt;h2 id="perché-questo-è-importante"&gt;Perché Questo È Importante&lt;/h2&gt;
&lt;p&gt;La combinazione è significativa per i veri sistemi IA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chiamate di agenti in parallelo&lt;/strong&gt; — distribuire a più agenti specializzati simultaneamente senza blocchi, aggregare i risultati quando tutti completano&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processi a lunga esecuzione&lt;/strong&gt; — i workflow che coinvolgono approvazione umana o eventi esterni possono mettere in pausa e riprendere per ore o giorni&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalabilità&lt;/strong&gt; — Azure Functions scala l&amp;rsquo;esecuzione orizzontalmente; il framework Durable Task gestisce il coordinamento dello stato parallelo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai costruendo workflow MAF oltre semplici demo locali, questo è il percorso verso l&amp;rsquo;esecuzione di qualità produzione.&lt;/p&gt;
&lt;p&gt;Post originale: &lt;a href="https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/"&gt;Durable Workflows in the Microsoft Agent Framework&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Smetti di Martellare una Dipendenza in Difficoltà: Pattern di Retry per Azure Functions + Service Bus</title><link>https://thedotnetblog.com/it/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/it/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</guid><description>I pattern di exponential backoff e circuit breaker sono ora supportati nativamente per le Azure Functions attivate da Service Bus — ecco come funzionano e perché li vuoi entrambi.</description><content:encoded>&lt;p&gt;Ecco come un guasto recuperabile diventa un&amp;rsquo;interruzione in un&amp;rsquo;applicazione Functions: una dipendenza inizia a generare timeout, ogni istanza Function riprova immediatamente e indefinitamente, la dipendenza viene martellata con centinaia di richieste fallite concorrenti, e quello che è iniziato come un piccolo problema transitorio diventa un evento di contropressione a livello di sistema.&lt;/p&gt;
&lt;p&gt;Probabilmente conosci questa storia. Azure Functions scala velocemente — questo è tutto il punto. Ma &amp;ldquo;scalare velocemente&amp;rdquo; e &amp;ldquo;riprovare immediatamente&amp;rdquo; insieme possono peggiorare drammaticamente i guasti.&lt;/p&gt;
&lt;p&gt;Due pattern aiutano. Exponential backoff e circuit breaker. Entrambi sono ora supportati nativamente per le Azure Functions attivate da Service Bus.&lt;/p&gt;
&lt;h2 id="due-pattern-ruoli-diversi"&gt;Due Pattern, Ruoli Diversi&lt;/h2&gt;
&lt;p&gt;Questi pattern sono complementari, non alternative:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;rsquo;exponential backoff&lt;/strong&gt; risponde a: &lt;em&gt;quando dovrei riprovare?&lt;/em&gt;
Aumenta il ritardo tra i tentativi in modo che una dipendenza abbia il tempo di recuperare. A livello di messaggio, regolando il ritmo dei retry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Il circuit breaker&lt;/strong&gt; risponde a: &lt;em&gt;dovrei chiamare questa dipendenza adesso?&lt;/em&gt;
Interrompe le chiamate ripetute a una dipendenza non sana dopo che viene raggiunta una soglia di errore, poi sonda con cautela dopo un periodo di raffreddamento. A livello di sistema, prevenendo le tempeste di retry.&lt;/p&gt;
&lt;p&gt;Li vuoi entrambi. Il backoff gestisce il ritmo dei retry per messaggio. Il circuit breaker gestisce le decisioni di salute aggregate.&lt;/p&gt;
&lt;h2 id="perché-è-importante-specialmente-per-service-bus"&gt;Perché è Importante Specialmente per Service Bus&lt;/h2&gt;
&lt;p&gt;La coda assorbe il traffico a burst, il che è positivo. Ma senza controlli, la coda può crescere mentre i worker continuano a sprecare risorse di calcolo su chiamate che falliranno. I messaggi avvelenati rimangono attivi più a lungo di quanto dovrebbero. Le partizioni calde o la capacità downstream limitata creano problemi a cascata.&lt;/p&gt;
&lt;p&gt;Il design più sicuro:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rilevare il guasto transitorio&lt;/li&gt;
&lt;li&gt;Ritardare il prossimo tentativo con exponential backoff&lt;/li&gt;
&lt;li&gt;Interrompere le chiamate alla dipendenza quando viene raggiunta una soglia di guasto (circuito aperto)&lt;/li&gt;
&lt;li&gt;Riprendere con cautela dopo un periodo di raffreddamento (sonda del circuito)&lt;/li&gt;
&lt;li&gt;Spostare il lavoro irrecuperabile in dead-letter o in un percorso di quarantena&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="come-appare-il-supporto-nativo"&gt;Come Appare il Supporto Nativo&lt;/h2&gt;
&lt;p&gt;Il nuovo supporto si integra con il modello di host Azure Functions esistente — nessuna libreria aggiuntiva, nessuna implementazione personalizzata. La configurazione va nel tuo &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;La configurazione del circuit breaker imposta la soglia di errore e l&amp;rsquo;intervallo di reset in modo che le dipendenze non sane non vengano bombardate durante il recupero.&lt;/p&gt;
&lt;h2 id="linguaggi-coperti"&gt;Linguaggi Coperti&lt;/h2&gt;
&lt;p&gt;Questo non è solo per .NET. La funzionalità copre dotnet, JavaScript, TypeScript e Python — il set completo di linguaggi supportati dal trigger Service Bus in Azure Functions.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;I pattern di retry non sono emozionanti da configurare fino alla prima volta che un&amp;rsquo;interruzione downstream fa sì che le tue Functions peggiorino il problema invece di degradarsi gradualmente. Configurarli in modo proattivo è economico. Adattarli durante un incidente non lo è.&lt;/p&gt;
&lt;p&gt;Post originale: &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>Collega i tuoi server MCP su Azure Functions ai Foundry Agents — Ecco come</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Costruisci il tuo server MCP una volta, distribiscilo su Azure Functions e collegalo agli agenti Microsoft Foundry con autenticazione adeguata. I tuoi strumenti funzionano ovunque — VS Code, Cursor, e ora agenti AI aziendali.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ecco cosa adoro dell&amp;rsquo;ecosistema MCP: costruisci il tuo server una volta e funziona ovunque. VS Code, Visual Studio, Cursor, ChatGPT — ogni client MCP può scoprire e utilizzare i tuoi strumenti. Ora, Microsoft sta aggiungendo un altro consumatore a quella lista: gli agenti Foundry.&lt;/p&gt;
&lt;p&gt;Lily Ma del team Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;ha pubblicato una guida pratica&lt;/a&gt; su come collegare server MCP distribuiti su Azure Functions con gli agenti Microsoft Foundry. Se hai già un server MCP, questo è puro valore aggiunto — nessuna ricostruzione necessaria.&lt;/p&gt;
&lt;h2 id="perché-questa-combinazione-ha-senso"&gt;Perché questa combinazione ha senso&lt;/h2&gt;
&lt;p&gt;Azure Functions ti offre infrastruttura scalabile, autenticazione integrata e fatturazione serverless per ospitare server MCP. Microsoft Foundry ti dà agenti AI che possono ragionare, pianificare e agire. Collegare i due significa che i tuoi strumenti personalizzati — interrogare un database, chiamare un&amp;rsquo;API aziendale, eseguire logica di validazione — diventano capacità che gli agenti AI aziendali possono scoprire e utilizzare autonomamente.&lt;/p&gt;
&lt;p&gt;Il punto chiave: il tuo server MCP resta lo stesso. Stai semplicemente aggiungendo Foundry come un altro consumatore. Gli stessi strumenti che funzionano nel tuo setup VS Code ora alimentano un agente AI con cui il tuo team o i clienti interagiscono.&lt;/p&gt;
&lt;h2 id="opzioni-di-autenticazione"&gt;Opzioni di autenticazione&lt;/h2&gt;
&lt;p&gt;È qui che il post offre davvero valore. Quattro metodi di autenticazione a seconda del tuo scenario:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metodo&lt;/th&gt;
&lt;th&gt;Caso d&amp;rsquo;uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basato su chiave&lt;/strong&gt; (predefinito)&lt;/td&gt;
&lt;td&gt;Sviluppo o server senza autenticazione Entra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produzione con identità gestite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passthrough identità OAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produzione dove ogni utente si autentica individualmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Senza autenticazione&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/test o solo dati pubblici&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Per la produzione, Microsoft Entra con identità dell&amp;rsquo;agente è il percorso consigliato. Il passthrough identità OAuth è per quando il contesto utente conta — l&amp;rsquo;agente chiede agli utenti di accedere, e ogni richiesta porta il token personale dell&amp;rsquo;utente.&lt;/p&gt;
&lt;h2 id="configurazione"&gt;Configurazione&lt;/h2&gt;
&lt;p&gt;Il flusso generale:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Distribuisci il tuo server MCP su Azure Functions&lt;/strong&gt; — esempi disponibili per &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript e Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abilita l&amp;rsquo;autenticazione MCP integrata&lt;/strong&gt; sulla tua function app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ottieni l&amp;rsquo;URL del tuo endpoint&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggiungi il server MCP come strumento in Foundry&lt;/strong&gt; — naviga al tuo agente nel portale, aggiungi un nuovo strumento MCP, fornisci endpoint e credenziali&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Poi testalo nel playground dell&amp;rsquo;Agent Builder inviando un prompt che attiverebbe uno dei tuoi strumenti.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;La storia della composabilità qui sta diventando davvero forte. Costruisci il tuo server MCP una volta in .NET (o Python, TypeScript, Java), distribuiscilo su Azure Functions, e ogni client compatibile con MCP può usarlo — strumenti di codifica, app di chat, e ora agenti AI aziendali. È un pattern &amp;ldquo;scrivi una volta, usa ovunque&amp;rdquo; che funziona davvero.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET nello specifico, l&amp;rsquo;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;estensione MCP di Azure Functions&lt;/a&gt; rende tutto semplice. Definisci i tuoi strumenti come Azure Functions, fai il deploy, e hai un server MCP di livello produzione con tutta la sicurezza e la scalabilità che Azure Functions offre.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Se hai strumenti MCP in esecuzione su Azure Functions, collegarli agli agenti Foundry è una vittoria rapida — i tuoi strumenti personalizzati diventano capacità AI aziendali con autenticazione adeguata e senza modifiche al codice del server.&lt;/p&gt;
&lt;p&gt;Leggi la &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;guida completa&lt;/a&gt; per istruzioni passo passo su ogni metodo di autenticazione, e consulta la &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;documentazione dettagliata&lt;/a&gt; per configurazioni di produzione.&lt;/p&gt;</content:encoded></item><item><title>Le MCP Apps hanno una Fluent API — Crea interfacce ricche per strumenti AI in .NET in tre passaggi</title><link>https://thedotnetblog.com/it/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/it/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>La nuova API di configurazione fluent per le MCP Apps su Azure Functions ti permette di trasformare qualsiasi strumento MCP .NET in un'app completa con viste, permessi e policy CSP in poche righe di codice.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gli strumenti MCP sono fantastici per dare capacità agli agenti AI. Ma cosa succede se il tuo strumento deve mostrare qualcosa all&amp;rsquo;utente — una dashboard, un form, una visualizzazione interattiva? È qui che entrano in gioco le MCP Apps, e ora sono diventate molto più facili da costruire.&lt;/p&gt;
&lt;p&gt;Lilian Kasem del team Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;ha presentato la nuova API di configurazione fluent&lt;/a&gt; per le MCP Apps su Azure Functions .NET, ed è il tipo di miglioramento dell&amp;rsquo;esperienza sviluppatore che ti fa chiedere perché non fosse sempre così semplice.&lt;/p&gt;
&lt;h2 id="cosa-sono-le-mcp-apps"&gt;Cosa sono le MCP Apps?&lt;/h2&gt;
&lt;p&gt;Le MCP Apps estendono il Model Context Protocol permettendo agli strumenti di portare le proprie viste UI, asset statici e controlli di sicurezza. Invece di restituire solo testo, il tuo strumento MCP può renderizzare esperienze HTML complete — dashboard interattive, visualizzazioni di dati, form di configurazione — tutto invocabile dagli agenti AI e presentato agli utenti dai client MCP.&lt;/p&gt;
&lt;p&gt;Il problema era che collegare tutto manualmente richiedeva di conoscere la specifica MCP in profondità: URI &lt;code&gt;ui://&lt;/code&gt;, tipi MIME speciali, coordinamento dei metadati tra strumenti e risorse. Non difficile, ma noioso.&lt;/p&gt;
&lt;h2 id="la-fluent-api-in-tre-passaggi"&gt;La Fluent API in tre passaggi&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Passaggio 1: Definisci la tua funzione.&lt;/strong&gt; Uno strumento MCP standard di Azure Functions:&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;Passaggio 2: Promuovila a MCP App.&lt;/strong&gt; Nello startup del tuo programma:&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;Passaggio 3: Aggiungi la tua vista HTML.&lt;/strong&gt; Crea &lt;code&gt;assets/hello-app.html&lt;/code&gt; con l&amp;rsquo;interfaccia di cui hai bisogno.&lt;/p&gt;
&lt;p&gt;Tutto qui. La Fluent API gestisce tutta l&amp;rsquo;infrastruttura del protocollo MCP — genera la funzione risorsa sintetica, imposta il tipo MIME corretto e inietta i metadati che collegano il tuo strumento alla sua vista.&lt;/p&gt;
&lt;h2 id="la-superficie-dellapi-è-ben-progettata"&gt;La superficie dell&amp;rsquo;API è ben progettata&lt;/h2&gt;
&lt;p&gt;Alcune cose che mi piacciono molto:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le fonti delle viste sono flessibili.&lt;/strong&gt; Puoi servire HTML da file su disco, o incorporare risorse direttamente nel tuo assembly per deployment autonomi:&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;Il CSP è componibile.&lt;/strong&gt; Autorizzi esplicitamente le origini di cui la tua app ha bisogno, seguendo i principi del minimo privilegio. Chiama &lt;code&gt;WithCsp&lt;/code&gt; più volte e le origini si accumulano:&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;Controllo della visibilità.&lt;/strong&gt; Puoi rendere uno strumento visibile solo al LLM, solo all&amp;rsquo;UI dell&amp;rsquo;host, o entrambi. Vuoi uno strumento che renderizza solo UI e non dovrebbe essere chiamato dal modello? Facile:&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="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Aggiungi il pacchetto preview:&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;Se stai già costruendo strumenti MCP con Azure Functions, è solo un aggiornamento del pacchetto. Il &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;quickstart MCP Apps&lt;/a&gt; è il miglior punto di partenza se sei nuovo al concetto.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Le MCP Apps sono uno degli sviluppi più entusiasmanti nello spazio degli strumenti AI — strumenti che non solo &lt;em&gt;fanno cose&lt;/em&gt; ma possono &lt;em&gt;mostrare cose&lt;/em&gt; agli utenti. La Fluent API rimuove la complessità del protocollo e ti permette di concentrarti su ciò che conta: la logica del tuo strumento e la sua interfaccia.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;post completo&lt;/a&gt; per il riferimento completo dell&amp;rsquo;API e gli esempi.&lt;/p&gt;</content:encoded></item></channel></rss>