<?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/fr/tags/azure-functions/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>fr</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/fr/tags/azure-functions/index.xml" rel="self" type="application/rss+xml"/><item><title>Workflows Durables dans Microsoft Agent Framework : De In-Memory à Azure Functions</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</guid><description>Le modèle de programmation de workflows de MAF prend désormais en charge l'exécution durable basée sur Durable Task — voici comment créer des workflows d'agents composables qui survivent aux redémarrages de processus et s'adaptent à Azure Functions.</description><content:encoded>&lt;p&gt;L&amp;rsquo;un des points douloureux avec les premiers workflows d&amp;rsquo;agents IA : ils sont fragiles. Un workflow multi-étapes de longue durée lié à un seul processus signifie que le redémarrage du processus = état perdu. Pour des démos simples, c&amp;rsquo;est acceptable. Pour des charges de travail en production, ce ne l&amp;rsquo;est pas.&lt;/p&gt;
&lt;p&gt;Le modèle de programmation de workflows de Microsoft Agent Framework prend désormais en charge l&amp;rsquo;&lt;strong&gt;exécution durable&lt;/strong&gt;, basée sur le framework Durable Task, avec hébergement Azure Functions. Voici comment fonctionne le modèle de programmation et pourquoi l&amp;rsquo;histoire de la durabilité compte.&lt;/p&gt;
&lt;h2 id="les-blocs-de-construction-fondamentaux"&gt;Les Blocs de Construction Fondamentaux&lt;/h2&gt;
&lt;p&gt;Les &lt;strong&gt;Executors&lt;/strong&gt; sont l&amp;rsquo;unité fondamentale de travail. Chacun est typé — il prend une entrée spécifique et produit une sortie spécifique :&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;// rechercher la commande, la retourner&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;Les &lt;strong&gt;Workflows&lt;/strong&gt; relient les executors en graphes dirigés en utilisant un constructeur fluide. Le framework gère l&amp;rsquo;exécution, le flux de données entre les étapes et la propagation des erreurs.&lt;/p&gt;
&lt;p&gt;Vous pouvez modéliser :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Des chaînes séquentielles (étape A → étape B → étape C)&lt;/li&gt;
&lt;li&gt;Fan-out/fan-in parallèle (exécuter les agents A, B, C en parallèle, agréger les résultats)&lt;/li&gt;
&lt;li&gt;Branchement conditionnel&lt;/li&gt;
&lt;li&gt;Approbations humain-dans-la-boucle (suspendre le workflow, attendre un signal externe)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="le-runner-in-memory-pour-le-développement-local"&gt;Le Runner In-Memory pour le Développement Local&lt;/h2&gt;
&lt;p&gt;Démarrer est rapide :&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;Le package principal inclut un runner léger en cours de processus. Pas de dépendances externes, pas de base de données, pas de ressources Azure. Fonctionne très bien pour le développement local et les tests unitaires.&lt;/p&gt;
&lt;h2 id="ajouter-la-durabilité-avec-durable-task"&gt;Ajouter la Durabilité avec Durable Task&lt;/h2&gt;
&lt;p&gt;Quand un workflow doit survivre aux redémarrages de processus — parce qu&amp;rsquo;il est de longue durée, parce qu&amp;rsquo;il a des étapes humain-dans-la-boucle, parce qu&amp;rsquo;il se distribue sur de nombreux appels d&amp;rsquo;agents en parallèle — le runner in-memory n&amp;rsquo;est pas suffisant.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;intégration Durable Task de MAF stocke l&amp;rsquo;état du workflow dans Azure Storage. Si le processus redémarre, le workflow reprend là où il s&amp;rsquo;était arrêté. Le modèle de programmation reste le même ; vous remplacez simplement le 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;Les mêmes executors, le même graphe de workflow — basé sur un état durable.&lt;/p&gt;
&lt;h2 id="hébergement-azure-functions"&gt;Hébergement Azure Functions&lt;/h2&gt;
&lt;p&gt;La troisième couche est l&amp;rsquo;hébergement Azure Functions. Votre workflow devient une application Function : déclenchez le workflow via un endpoint HTTP, et le runtime durable gère la mise à l&amp;rsquo;échelle, l&amp;rsquo;état et la fiabilité.&lt;/p&gt;
&lt;p&gt;Cela signifie qu&amp;rsquo;un workflow multi-agents avec des appels parallèles, des branches conditionnelles et des approbations humaines peut s&amp;rsquo;adapter à un environnement Functions serverless sans gestion d&amp;rsquo;état personnalisée.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-important"&gt;Pourquoi C&amp;rsquo;est Important&lt;/h2&gt;
&lt;p&gt;La combinaison est significative pour les vrais systèmes IA :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Appels d&amp;rsquo;agents en parallèle&lt;/strong&gt; — distribuer vers plusieurs agents spécialisés simultanément sans blocage, agréger les résultats quand tous terminent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processus de longue durée&lt;/strong&gt; — les workflows qui impliquent une approbation humaine ou des événements externes peuvent se suspendre et reprendre sur des heures ou des jours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mise à l&amp;rsquo;échelle&lt;/strong&gt; — Azure Functions fait évoluer l&amp;rsquo;exécution horizontalement ; le framework Durable Task gère la coordination de l&amp;rsquo;état parallèle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si vous construisez des workflows MAF au-delà de simples démos locaux, c&amp;rsquo;est le chemin vers l&amp;rsquo;exécution de qualité production.&lt;/p&gt;
&lt;p&gt;Publication 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>Arrêtez de Pilonner une Dépendance en Difficulté : Patterns de Retry pour Azure Functions + Service Bus</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/azure-functions-service-bus-exponential-backoff-circuit-breaker/</guid><description>L'exponential backoff et les patterns de circuit breaker sont désormais pris en charge nativement pour les Azure Functions déclenchées par Service Bus — voici comment ils fonctionnent et pourquoi vous avez besoin des deux.</description><content:encoded>&lt;p&gt;Voici comment une panne récupérable devient une interruption dans une application Functions : une dépendance commence à générer des timeouts, chaque instance Function effectue des nouvelles tentatives immédiatement et indéfiniment, la dépendance reçoit des centaines de requêtes concurrentes échouées, et ce qui a commencé comme un problème transitoire se transforme en un événement de contre-pression à l&amp;rsquo;échelle du système.&lt;/p&gt;
&lt;p&gt;Vous connaissez probablement cette histoire. Azure Functions scale rapidement — c&amp;rsquo;est tout le principe. Mais &amp;ldquo;scaler rapidement&amp;rdquo; et &amp;ldquo;réessayer immédiatement&amp;rdquo; ensemble peuvent rendre les défaillances dramatiquement pires.&lt;/p&gt;
&lt;p&gt;Deux patterns aident. Exponential backoff et circuit breaker. Les deux sont désormais pris en charge nativement pour les Azure Functions déclenchées par Service Bus.&lt;/p&gt;
&lt;h2 id="deux-patterns-rôles-différents"&gt;Deux Patterns, Rôles Différents&lt;/h2&gt;
&lt;p&gt;Ces patterns sont complémentaires, pas des alternatives :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;rsquo;exponential backoff&lt;/strong&gt; répond à : &lt;em&gt;quand devrais-je réessayer ?&lt;/em&gt;
Il augmente le délai entre les tentatives pour qu&amp;rsquo;une dépendance ait le temps de récupérer. Au niveau du message, rythmant le timing des nouvelles tentatives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le circuit breaker&lt;/strong&gt; répond à : &lt;em&gt;devrais-je appeler cette dépendance en ce moment ?&lt;/em&gt;
Il arrête les appels répétés vers une dépendance non saine après qu&amp;rsquo;un seuil d&amp;rsquo;échec est atteint, puis sonde prudemment après une période de refroidissement. Au niveau du système, prévenant les tempêtes de retry.&lt;/p&gt;
&lt;p&gt;Vous voulez les deux. Le backoff gère le rythme des tentatives par message. Le circuit breaker gère les décisions de santé agrégées.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-particulièrement-important-pour-service-bus"&gt;Pourquoi C&amp;rsquo;est Particulièrement Important pour Service Bus&lt;/h2&gt;
&lt;p&gt;La file absorbe le trafic en rafale, ce qui est bien. Mais sans contrôles, la file peut grossir pendant que les workers continuent de gaspiller des ressources de calcul sur des appels qui vont échouer. Les messages empoisonnés restent actifs plus longtemps qu&amp;rsquo;ils ne le devraient. Les partitions chaudes ou la capacité limitée en aval créent des problèmes en cascade.&lt;/p&gt;
&lt;p&gt;Le design plus sécurisé :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Détecter la panne transitoire&lt;/li&gt;
&lt;li&gt;Retarder la prochaine tentative avec exponential backoff&lt;/li&gt;
&lt;li&gt;Arrêter d&amp;rsquo;appeler la dépendance quand un seuil d&amp;rsquo;échec est atteint (circuit ouvert)&lt;/li&gt;
&lt;li&gt;Reprendre prudemment après une période de refroidissement (sonde de circuit)&lt;/li&gt;
&lt;li&gt;Déplacer le travail irrécupérable vers dead-letter ou une voie de quarantaine&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="à-quoi-ressemble-le-support-natif"&gt;À Quoi Ressemble le Support Natif&lt;/h2&gt;
&lt;p&gt;Le nouveau support s&amp;rsquo;intègre avec le modèle d&amp;rsquo;hôte Azure Functions existant — pas de bibliothèques supplémentaires, pas d&amp;rsquo;implémentations personnalisées. La configuration va dans votre &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 configuration du circuit breaker définit le seuil d&amp;rsquo;échec et l&amp;rsquo;intervalle de réinitialisation pour que les dépendances non saines ne soient pas harcelées pendant la récupération.&lt;/p&gt;
&lt;h2 id="langages-couverts"&gt;Langages Couverts&lt;/h2&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas uniquement pour .NET. La fonctionnalité couvre dotnet, JavaScript, TypeScript et Python — l&amp;rsquo;ensemble complet des langages supportés par le trigger Service Bus dans Azure Functions.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Les patterns de retry ne sont pas passionnants à configurer jusqu&amp;rsquo;à la première fois qu&amp;rsquo;une interruption en aval fait que vos Functions aggravent le problème au lieu de se dégrader gracieusement. Les configurer de manière proactive est peu coûteux. Les implémenter pendant un incident ne l&amp;rsquo;est pas.&lt;/p&gt;
&lt;p&gt;Post original : &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>Connectez vos serveurs MCP sur Azure Functions aux agents Foundry — Voici comment</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Construisez votre serveur MCP une fois, déployez-le sur Azure Functions et connectez-le aux agents Microsoft Foundry avec une authentification appropriée. Vos outils fonctionnent partout — VS Code, Cursor, et maintenant les agents IA d'entreprise.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voici ce que j&amp;rsquo;adore dans l&amp;rsquo;écosystème MCP : vous construisez votre serveur une fois, et il fonctionne partout. VS Code, Visual Studio, Cursor, ChatGPT — chaque client MCP peut découvrir et utiliser vos outils. Maintenant, Microsoft ajoute un autre consommateur à cette liste : les agents Foundry.&lt;/p&gt;
&lt;p&gt;Lily Ma de l&amp;rsquo;équipe Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;a publié un guide pratique&lt;/a&gt; sur la connexion de serveurs MCP déployés sur Azure Functions avec les agents Microsoft Foundry. Si vous avez déjà un serveur MCP, c&amp;rsquo;est de la valeur ajoutée pure — aucune reconstruction nécessaire.&lt;/p&gt;
&lt;h2 id="pourquoi-cette-combinaison-a-du-sens"&gt;Pourquoi cette combinaison a du sens&lt;/h2&gt;
&lt;p&gt;Azure Functions vous offre une infrastructure évolutive, une authentification intégrée et une facturation serverless pour héberger des serveurs MCP. Microsoft Foundry vous offre des agents IA capables de raisonner, planifier et agir. Les connecter signifie que vos outils personnalisés — interroger une base de données, appeler une API métier, exécuter une logique de validation — deviennent des capacités que les agents IA d&amp;rsquo;entreprise peuvent découvrir et utiliser de manière autonome.&lt;/p&gt;
&lt;p&gt;Le point clé : votre serveur MCP reste le même. Vous ajoutez simplement Foundry comme un autre consommateur. Les mêmes outils qui fonctionnent dans votre configuration VS Code alimentent maintenant un agent IA avec lequel votre équipe ou vos clients interagissent.&lt;/p&gt;
&lt;h2 id="options-dauthentification"&gt;Options d&amp;rsquo;authentification&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;est là que l&amp;rsquo;article apporte vraiment de la valeur. Quatre méthodes d&amp;rsquo;authentification selon votre scénario :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Méthode&lt;/th&gt;
&lt;th&gt;Cas d&amp;rsquo;usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basée sur clé&lt;/strong&gt; (par défaut)&lt;/td&gt;
&lt;td&gt;Développement ou serveurs sans auth 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;Production avec identités managées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passthrough d&amp;rsquo;identité OAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production où chaque utilisateur s&amp;rsquo;authentifie individuellement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sans authentification&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/tests ou données publiques uniquement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Pour la production, Microsoft Entra avec identité d&amp;rsquo;agent est le chemin recommandé. Le passthrough d&amp;rsquo;identité OAuth est pour les cas où le contexte utilisateur compte — l&amp;rsquo;agent demande aux utilisateurs de se connecter, et chaque requête porte le propre token de l&amp;rsquo;utilisateur.&lt;/p&gt;
&lt;h2 id="mise-en-place"&gt;Mise en place&lt;/h2&gt;
&lt;p&gt;Le flux général :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Déployez votre serveur MCP sur Azure Functions&lt;/strong&gt; — des exemples sont disponibles pour &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript et Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Activez l&amp;rsquo;authentification MCP intégrée&lt;/strong&gt; sur votre function app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Obtenez votre URL d&amp;rsquo;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;Ajoutez le serveur MCP comme outil dans Foundry&lt;/strong&gt; — naviguez vers votre agent dans le portail, ajoutez un nouvel outil MCP, fournissez l&amp;rsquo;endpoint et les credentials&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Testez ensuite dans le playground de l&amp;rsquo;Agent Builder en envoyant un prompt qui déclenchera l&amp;rsquo;un de vos outils.&lt;/p&gt;
&lt;h2 id="mon-avis"&gt;Mon avis&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;histoire de la composabilité devient vraiment solide ici. Construisez votre serveur MCP une fois en .NET (ou Python, TypeScript, Java), déployez-le sur Azure Functions, et chaque client compatible MCP peut l&amp;rsquo;utiliser — outils de programmation, apps de chat, et maintenant agents IA d&amp;rsquo;entreprise. C&amp;rsquo;est un pattern « écrire une fois, utiliser partout » qui fonctionne réellement.&lt;/p&gt;
&lt;p&gt;Pour les développeurs .NET spécifiquement, l&amp;rsquo;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;extension MCP Azure Functions&lt;/a&gt; rend les choses simples. Vous définissez vos outils comme des Azure Functions, vous déployez, et vous avez un serveur MCP prêt pour la production avec toute la sécurité et la scalabilité qu&amp;rsquo;Azure Functions fournit.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Si vous avez des outils MCP qui tournent sur Azure Functions, les connecter aux agents Foundry est un gain rapide — vos outils personnalisés deviennent des capacités IA d&amp;rsquo;entreprise avec une authentification appropriée et sans modification de code côté serveur.&lt;/p&gt;
&lt;p&gt;Lisez le &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;guide complet&lt;/a&gt; pour des instructions pas à pas sur chaque méthode d&amp;rsquo;authentification, et consultez la &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;documentation détaillée&lt;/a&gt; pour les configurations de production.&lt;/p&gt;</content:encoded></item><item><title>Les MCP Apps ont une API fluide — Créez des interfaces riches pour outils IA en .NET en trois étapes</title><link>https://thedotnetblog.com/fr/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/fr/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>La nouvelle API de configuration fluide pour les MCP Apps sur Azure Functions vous permet de transformer n'importe quel outil MCP .NET en une application complète avec des vues, des permissions et des politiques CSP en quelques lignes de code.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cet article a été traduit automatiquement. Pour la version originale, &lt;a href="https://thedotnetblog.com/fr/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;cliquez ici&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Les outils MCP sont parfaits pour donner des capacités aux agents IA. Mais que faire si votre outil doit montrer quelque chose à l&amp;rsquo;utilisateur — un tableau de bord, un formulaire, une visualisation interactive ? C&amp;rsquo;est là qu&amp;rsquo;interviennent les MCP Apps, et elles sont devenues beaucoup plus faciles à créer.&lt;/p&gt;
&lt;p&gt;Lilian Kasem de l&amp;rsquo;équipe 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;a présenté la nouvelle API de configuration fluide&lt;/a&gt; pour les MCP Apps sur Azure Functions .NET, et c&amp;rsquo;est le genre d&amp;rsquo;amélioration de l&amp;rsquo;expérience développeur qui fait se demander pourquoi ce n&amp;rsquo;était pas déjà aussi simple.&lt;/p&gt;
&lt;h2 id="quest-ce-que-les-mcp-apps-"&gt;Qu&amp;rsquo;est-ce que les MCP Apps ?&lt;/h2&gt;
&lt;p&gt;Les MCP Apps étendent le Model Context Protocol en permettant aux outils d&amp;rsquo;embarquer leurs propres vues UI, assets statiques et contrôles de sécurité. Au lieu de simplement retourner du texte, votre outil MCP peut rendre des expériences HTML complètes — tableaux de bord interactifs, visualisations de données, formulaires de configuration — le tout invocable par des agents IA et présenté aux utilisateurs par les clients MCP.&lt;/p&gt;
&lt;p&gt;Le problème était que tout câbler manuellement nécessitait une connaissance approfondie de la spécification MCP : URIs &lt;code&gt;ui://&lt;/code&gt;, types MIME spéciaux, coordination des métadonnées entre outils et ressources. Pas difficile, mais fastidieux.&lt;/p&gt;
&lt;h2 id="lapi-fluide-en-trois-étapes"&gt;L&amp;rsquo;API fluide en trois étapes&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Étape 1 : Définissez votre fonction.&lt;/strong&gt; Un outil MCP Azure Functions standard :&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;Étape 2 : Promouvez-la en MCP App.&lt;/strong&gt; Dans le démarrage de votre programme :&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;Étape 3 : Ajoutez votre vue HTML.&lt;/strong&gt; Créez &lt;code&gt;assets/hello-app.html&lt;/code&gt; avec l&amp;rsquo;interface dont vous avez besoin.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est tout. L&amp;rsquo;API fluide gère toute la plomberie du protocole MCP — génère la fonction de ressource synthétique, définit le type MIME correct et injecte les métadonnées qui connectent votre outil à sa vue.&lt;/p&gt;
&lt;h2 id="la-surface-de-lapi-est-bien-conçue"&gt;La surface de l&amp;rsquo;API est bien conçue&lt;/h2&gt;
&lt;p&gt;Quelques éléments que j&amp;rsquo;apprécie particulièrement :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les sources de vues sont flexibles.&lt;/strong&gt; Vous pouvez servir du HTML depuis des fichiers sur disque ou intégrer des ressources directement dans votre assembly pour des déploiements autonomes :&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;Le CSP est composable.&lt;/strong&gt; Vous autorisez explicitement les origines dont votre app a besoin, en suivant le principe du moindre privilège. Appelez &lt;code&gt;WithCsp&lt;/code&gt; plusieurs fois et les origines s&amp;rsquo;accumulent :&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;Contrôle de visibilité.&lt;/strong&gt; Vous pouvez rendre un outil visible uniquement pour le LLM, uniquement pour l&amp;rsquo;UI de l&amp;rsquo;hôte, ou les deux. Vous voulez un outil qui ne fait que rendre de l&amp;rsquo;UI et ne devrait pas être appelé par le modèle ? 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="pour-commencer"&gt;Pour commencer&lt;/h2&gt;
&lt;p&gt;Ajoutez le package 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;Si vous construisez déjà des outils MCP avec Azure Functions, c&amp;rsquo;est juste une mise à jour de package. Le &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; est le meilleur point de départ si vous découvrez le concept.&lt;/p&gt;
&lt;h2 id="pour-conclure"&gt;Pour conclure&lt;/h2&gt;
&lt;p&gt;Les MCP Apps sont l&amp;rsquo;un des développements les plus passionnants dans l&amp;rsquo;espace des outils IA — des outils qui ne font pas que &lt;em&gt;faire des choses&lt;/em&gt; mais peuvent aussi &lt;em&gt;montrer des choses&lt;/em&gt; aux utilisateurs. L&amp;rsquo;API fluide supprime la complexité du protocole et vous permet de vous concentrer sur l&amp;rsquo;essentiel : la logique de votre outil et son interface.&lt;/p&gt;
&lt;p&gt;Lisez le &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 complet&lt;/a&gt; pour la référence complète de l&amp;rsquo;API et des exemples.&lt;/p&gt;</content:encoded></item></channel></rss>