<?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>AI Agents | The .NET Blog</title><link>https://thedotnetblog.com/es/tags/ai-agents/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>es</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 05 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/es/tags/ai-agents/index.xml" rel="self" type="application/rss+xml"/><item><title>Microsoft Agent Framework Parte 3: De las Herramientas a los Workflows — Las Piezas Encajan</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</guid><description>La tercera parte de la serie de bloques de construcción de .NET AI cubre el Microsoft Agent Framework — desde agentes simples con herramientas hasta workflows multiagente con memoria. Esto es lo que realmente importa.</description><content:encoded>&lt;p&gt;&lt;em&gt;Esta publicación fue traducida automáticamente. Para la versión original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/"&gt;haz clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si has seguido la serie Building Blocks for AI en .NET, sabes que la Parte 1 nos dio &lt;code&gt;IChatClient&lt;/code&gt; (la interfaz universal de modelos) y la Parte 2 nos dio &lt;code&gt;Microsoft.Extensions.VectorData&lt;/code&gt; (búsqueda semántica y RAG). Ambas son fundamentales y útiles por sí solas. Pero aquí es donde todo empieza a conectarse.&lt;/p&gt;
&lt;p&gt;La Parte 3 trata del &lt;a href="https://github.com/microsoft/agent-framework"&gt;Microsoft Agent Framework&lt;/a&gt; — y sinceramente, es la pieza que estaba esperando ver en .NET. La versión 1.0 se publicó en abril. La API es estable. Es hora de construir agentes de verdad.&lt;/p&gt;
&lt;h2 id="qué-es-un-agente-vs-un-chatbot"&gt;Qué es un Agente (vs. un Chatbot)&lt;/h2&gt;
&lt;p&gt;Antes de entrar en el código, dejemos esto claro. Un chatbot recibe input, llama a un modelo, devuelve output. Bucle simple.&lt;/p&gt;
&lt;p&gt;Un agente tiene &lt;em&gt;autonomía&lt;/em&gt;. Puede razonar sobre una tarea, decidir qué herramientas usar, llamarlas, evaluar resultados y decidir qué hacer a continuación — todo sin que tú escribas lógica paso a paso para cada escenario. Le das herramientas e instrucciones, y él se encarga de la orquestación.&lt;/p&gt;
&lt;p&gt;Piénsalo así: &lt;code&gt;IChatClient&lt;/code&gt; es como tener una conversación. Un agente es como delegarle una lista de tareas a alguien.&lt;/p&gt;
&lt;h2 id="tu-primer-agente-en-10-líneas"&gt;Tu Primer Agente en 10 Líneas&lt;/h2&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.Agents.AI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&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="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&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;GetChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deploymentName&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;AsAIAgent&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are good at telling jokes.&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Joker&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&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;El método de extensión &lt;code&gt;.AsAIAgent()&lt;/code&gt; es el puente. Mismo patrón que &lt;code&gt;.AsIChatClient()&lt;/code&gt; de MEAI — envuelve el SDK del proveedor en una abstracción estable. Funciona con Azure OpenAI, OpenAI, GitHub Models, Microsoft Foundry o modelos locales.&lt;/p&gt;
&lt;p&gt;El streaming también funciona:&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;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&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="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&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;h2 id="dando-herramientas-al-agente"&gt;Dando Herramientas al Agente&lt;/h2&gt;
&lt;p&gt;Aquí es donde los agentes dejan de ser chatbots sofisticados. Las herramientas son funciones que el modelo puede decidir llamar según lo que el usuario pida. No necesitas lógica de enrutamiento — el modelo lo descifra solo.&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;[Description(&amp;#34;Get the weather for a given location.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;GetWeather&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; [Description(&amp;#34;The location to get the weather for.&amp;#34;)]&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;location&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;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$&amp;#34;The weather in {location} is cloudy with a high of 15°C.&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&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;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are a helpful assistant&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;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AIFunctionFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetWeather&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;Dos cosas a notar. Primero, &lt;code&gt;AIFunctionFactory&lt;/code&gt; es de MEAI — la misma fábrica de herramientas que usarías con un &lt;code&gt;IChatClient&lt;/code&gt; normal. Si ya tienes herramientas definidas para escenarios de chat, funcionan aquí también.&lt;/p&gt;
&lt;p&gt;Segundo, los atributos &lt;code&gt;Description&lt;/code&gt; importan mucho. Son cómo el modelo entiende qué hace una herramienta y cuándo usarla. Trátalos como documentación para tu IA, no para humanos.&lt;/p&gt;
&lt;h2 id="sesiones-conversaciones-con-memoria-real"&gt;Sesiones: Conversaciones con Memoria Real&lt;/h2&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;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&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="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&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="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&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="s"&gt;&amp;#34;Now add some emojis and tell it in the voice of a pirate&amp;#39;s parrot.&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;session&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;Sin sesión, cada llamada a &lt;code&gt;RunAsync&lt;/code&gt; es sin estado. Con sesión, el agente sabe a qué chiste te refieres. &lt;code&gt;AgentSession&lt;/code&gt; preserva el historial de conversación entre turnos.&lt;/p&gt;
&lt;p&gt;Para servicios sin estado en producción, las sesiones se serializan de forma limpia:&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;JsonElement&lt;/span&gt; &lt;span class="n"&gt;sessionState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SerializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&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="c1"&gt;// ... guárdalo en algún lugar ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;restoredSession&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sessionState&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;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;What were we just talking about?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restoredSession&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;Esto es crítico si tu agente se ejecuta en entornos serverless o con escalado horizontal.&lt;/p&gt;
&lt;h2 id="aicontextprovider-memoria-persistente-entre-sesiones"&gt;AIContextProvider: Memoria Persistente Entre Sesiones&lt;/h2&gt;
&lt;p&gt;Las sesiones preservan el historial &lt;em&gt;dentro&lt;/em&gt; de una sesión. Pero ¿qué hay de conocer cosas sobre un usuario entre sesiones? &lt;code&gt;AIContextProvider&lt;/code&gt; maneja eso.&lt;/p&gt;
&lt;p&gt;Tiene dos ganchos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ProvideAIContextAsync&lt;/code&gt;&lt;/strong&gt; — se ejecuta &lt;em&gt;antes&lt;/em&gt; de cada interacción, inyecta contexto en el agente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StoreAIContextAsync&lt;/code&gt;&lt;/strong&gt; — se ejecuta &lt;em&gt;después&lt;/em&gt; de cada interacción, permite aprender y persistir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El patrón es elegante: puedes apilar múltiples proveedores — uno para preferencias del usuario, uno para interacciones recientes, uno que consulta tu almacén de VectorData para documentos relevantes. Ese último es exactamente el patrón RAG de la Parte 2, ahora ejecutándose automáticamente en cada llamada al agente.&lt;/p&gt;
&lt;h2 id="workflows-multiagente"&gt;Workflows Multiagente&lt;/h2&gt;
&lt;p&gt;Aquí es donde el framework se gana su nombre. Incluye un sistema de workflows basado en grafos donde los ejecutores (agentes, funciones, lo que sea) se conectan mediante aristas.&lt;/p&gt;
&lt;p&gt;Algunos patrones soportados nativamente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Secuencial&lt;/strong&gt;: La salida del Agente A alimenta al Agente B&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrente (fan-out/fan-in)&lt;/strong&gt;: Despacha a múltiples agentes en paralelo, recoge resultados&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enrutamiento condicional&lt;/strong&gt;: Enruta trabajo a diferentes agentes según el output&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bucles escritor-crítico&lt;/strong&gt;: Un agente escribe, otro evalúa, bucle hasta aprobación&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-workflows&lt;/strong&gt;: Compone workflows jerárquicamente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un ejemplo de escritor-crítico:&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;WorkflowBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&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;builder&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;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;criticAgent&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;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&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;WithOutputFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&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="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&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;Limpio, legible, y el enrutamiento basado en condiciones significa que no escribes la lógica del bucle tú mismo.&lt;/p&gt;
&lt;h2 id="human-in-the-loop"&gt;Human-in-the-Loop&lt;/h2&gt;
&lt;p&gt;No todo debería ejecutarse de forma completamente autónoma. Para operaciones sensibles — escrituras en bases de datos, transacciones financieras, envío de comunicaciones — quieres que un humano apruebe antes de que el agente ejecute.&lt;/p&gt;
&lt;p&gt;El framework tiene soporte integrado para esto mediante &lt;code&gt;FunctionApprovalRequestContent&lt;/code&gt; y &lt;code&gt;FunctionApprovalResponseContent&lt;/code&gt;. El agente propone la llamada a la herramienta, tu código la presenta al usuario, y la respuesta determina si la ejecución procede.&lt;/p&gt;
&lt;p&gt;Esta es la forma correcta de pensar en agentes en entornos empresariales: no completamente autónomos, sino &lt;em&gt;autonomía con barandillas&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="el-cuadro-completo"&gt;El Cuadro Completo&lt;/h2&gt;
&lt;p&gt;Si das un paso atrás:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MEAI&lt;/strong&gt; te da una interfaz universal para cualquier modelo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VectorData&lt;/strong&gt; da a tus agentes acceso al conocimiento de tu organización mediante búsqueda semántica&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Framework&lt;/strong&gt; orquesta todo — usa &lt;code&gt;IChatClient&lt;/code&gt; internamente, se compone con proveedores de contexto y coordina mediante workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada pieza fue diseñada para componerse con las otras. Consulta el &lt;a href="https://devblogs.microsoft.com/dotnet/microsoft-agent-framework-building-blocks-for-ai-part-3/"&gt;post original de Jeremy Likness&lt;/a&gt; y el &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet"&gt;repositorio de GitHub del Agent Framework&lt;/a&gt; para los ejemplos completos.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El post de la Parte 3 del Microsoft Agent Framework cierra el bucle de la serie de bloques de construcción. Para los desarrolladores .NET que quieren construir agentes AI — no solo chatbots, sino agentes reales que usan herramientas, recuerdan cosas y coordinan — este es el camino.&lt;/p&gt;
&lt;p&gt;La versión estable 1.0 significa que puedes construir con esto en producción. Si has estado esperando para saltar al desarrollo de agentes en .NET, el momento es ahora.&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server en Azure App Service — Sin Contenedores</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/</guid><description>El SQL MCP Server ahora puede ejecutarse en Azure App Service sin Docker ni Kubernetes. Esto es lo que significa para los desarrolladores .NET que construyen agentes de IA que hablan con bases de datos SQL.</description><content:encoded>&lt;p&gt;&lt;em&gt;Esta publicación fue traducida automáticamente. Para la versión original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/sql-mcp-server-azure-app-service-no-containers/"&gt;haz clic aquí&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Seré honesto contigo: cada vez que veo &amp;ldquo;requiere un contenedor&amp;rdquo; en un tutorial, una pequeña parte de mí suspira. Los contenedores son geniales, hasta que tu equipo no tiene una estrategia de contenedores, y de repente una funcionalidad que parecía simple está bloqueada por una sobrecarga de orquestación que no habías planeado.&lt;/p&gt;
&lt;p&gt;Por eso esto me llamó la atención. El SQL MCP Server ahora puede ejecutarse en Azure App Service — sin Docker, sin Kubernetes, solo la misma configuración de Data API Builder (DAB) que expone tu base de datos SQL a través de MCP, REST y GraphQL.&lt;/p&gt;
&lt;h2 id="qué-es-el-sql-mcp-server"&gt;¿Qué es el SQL MCP Server?&lt;/h2&gt;
&lt;p&gt;Contexto rápido si aún no lo conoces. El SQL MCP Server se sitúa entre tu agente de IA y tu base de datos SQL. En lugar de darle a tu agente acceso directo a la base de datos (lo cual es terrible idea), expone tus tablas y vistas como una capa de abstracción — entidades con permisos definidos.&lt;/p&gt;
&lt;p&gt;Está construido sobre &lt;a href="https://learn.microsoft.com/es-es/azure/data-api-builder/"&gt;Data API builder&lt;/a&gt;, lo que significa que un único archivo de configuración gestiona MCP &lt;em&gt;y&lt;/em&gt; REST &lt;em&gt;y&lt;/em&gt; GraphQL simultáneamente. Tu agente habla con el endpoint MCP. Tu aplicación tradicional habla con REST o GraphQL. Misma config, mismo runtime, superficies diferentes.&lt;/p&gt;
&lt;p&gt;Eso es genuinamente útil. No estás manteniendo dos capas de API separadas.&lt;/p&gt;
&lt;h2 id="el-problema-del-contenedor-y-la-solución"&gt;El Problema del Contenedor (y la Solución)&lt;/h2&gt;
&lt;p&gt;El modelo de despliegue original del SQL MCP Server era con contenedores. Funciona bien en muchos equipos, pero no en todos. Muchos equipos .NET estandarizan en Azure App Service o VMs. Requerir un runtime de contenedor solo para exponer un endpoint SQL agrega fricción que nadie pidió.&lt;/p&gt;
&lt;p&gt;El nuevo tutorial muestra cómo saltarte el contenedor por completo. Todo funciona con un comando &lt;code&gt;dab start&lt;/code&gt;, alojado en App Service como un proceso web .NET 8 estándar.&lt;/p&gt;
&lt;p&gt;Aquí está el flujo de configuración local en pocas palabras:&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;&lt;span class="c1"&gt;# Instalar Data API builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet tool install microsoft.dataapibuilder --prerelease -g
&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="c1"&gt;# Inicializar la configuración&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init --database-type mssql --host-mode Development --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;SQL_CONNECTION_STRING&amp;#39;)&amp;#34;&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="c1"&gt;# Agregar una entidad&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add products --source dbo.products --permissions &lt;span class="s2"&gt;&amp;#34;authenticated:*&amp;#34;&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="c1"&gt;# Configurar el proveedor de auth de App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab configure --runtime.host.authentication.provider AppService
&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="c1"&gt;# Iniciar el servidor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En este punto tienes MCP en &lt;code&gt;/mcp&lt;/code&gt;, REST y GraphQL desde el mismo proceso, y nada corriendo en un contenedor.&lt;/p&gt;
&lt;h2 id="autenticación-sin-claves-de-api-compartidas"&gt;Autenticación Sin Claves de API Compartidas&lt;/h2&gt;
&lt;p&gt;Esta es la parte que más aprecio. Cuando despliegas en App Service, configuras Microsoft Entra ID como proveedor de autenticación. Sin secretos compartidos en archivos de configuración, sin claves de API que rotar.&lt;/p&gt;
&lt;p&gt;La cadena de conexión permanece en una variable de entorno de App Service (no en &lt;code&gt;dab-config.json&lt;/code&gt;), y el endpoint MCP está protegido por autenticación de plataforma. Si ya estás alineado con Entra ID en tus cargas de trabajo de Azure — lo cual probablemente sea el caso si usas agentes de Azure AI Foundry — esto encaja naturalmente.&lt;/p&gt;
&lt;p&gt;Para el desarrollo local, cambias al modo &lt;code&gt;Simulator&lt;/code&gt; y transporte STDIO. Vuelves al modo &lt;code&gt;AppService&lt;/code&gt; cuando despliegas. Limpio y explícito.&lt;/p&gt;
&lt;h2 id="despliegue-en-app-service"&gt;Despliegue en App Service&lt;/h2&gt;
&lt;p&gt;El despliegue real es trabajo estándar con Azure CLI:&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;&lt;span class="c1"&gt;# Crear el plan de App Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az appservice plan create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --sku B1 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --is-linux
&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="c1"&gt;# Crear la aplicación web (runtime .NET 8)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az webapp create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --plan &amp;lt;plan-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --runtime &lt;span class="s2"&gt;&amp;#34;DOTNETCORE:8.0&amp;#34;&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="c1"&gt;# Configurar el comando de inicio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az webapp config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name &amp;lt;app-name&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --resource-group &amp;lt;resource-group&amp;gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --startup-file &lt;span class="s2"&gt;&amp;#34;dab start&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Luego despliega tu proyecto DAB usando el método de despliegue que tu equipo ya usa — VS Code, GitHub Actions, Zip Deploy. El detalle clave: es un despliegue de &lt;strong&gt;código&lt;/strong&gt;, no de contenedor. Sin imagen que construir, publicar ni gestionar.&lt;/p&gt;
&lt;h2 id="por-qué-importa-para-los-desarrolladores-net"&gt;Por qué Importa para los Desarrolladores .NET&lt;/h2&gt;
&lt;p&gt;Si estás construyendo agentes de IA en .NET — ya sea con el Microsoft Agent Framework, Semantic Kernel, o agentes hospedados en Azure AI Foundry — eventualmente tu agente necesita hablar con una base de datos. El SQL MCP Server te da una manera estructurada de hacer eso sin exponer cadenas de conexión en bruto ni escribir una capa de API personalizada.&lt;/p&gt;
&lt;p&gt;Ejecutarlo en App Service cierra la brecha para equipos que no trabajan con contenedores. Es la misma configuración de DAB, la misma auth de Entra, el mismo protocolo MCP — solo en infraestructura que ya conoces.&lt;/p&gt;
&lt;p&gt;Consulta el tutorial completo en el &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-app-service/"&gt;post original del blog&lt;/a&gt; y el &lt;a href="https://github.com/Azure-Samples/SQL-MCP-NoContainer"&gt;repositorio de muestra en GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusión"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El SQL MCP Server en App Service es una opción pragmática sólida para equipos .NET que quieren dar a sus agentes acceso estructurado a datos SQL sin una estrategia de contenedores. La combinación del modelo de entidades de DAB, la auth integrada de Entra en App Service, y el comando de inicio &lt;code&gt;dab start&lt;/code&gt; resulta en un despliegue simple de explicar y fácil de operar.&lt;/p&gt;
&lt;p&gt;Pruébalo. Tus agentes apreciarán la superficie de API limpia. Tu equipo de operaciones apreciará no tener que lidiar con registros de contenedores.&lt;/p&gt;</content:encoded></item><item><title>Actualizacion de abril de Visual Studio: integracion de Cloud Agent para flujos .NET</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/</guid><description>Resumen practico para equipos .NET sobre "Actualizacion de abril de Visual Studio: integracion de Cloud Agent para flujos .NET", con pasos claros para evaluarlo en produccion.</description><content:encoded>&lt;p&gt;&lt;em&gt;Este post fue traducido automaticamente. Para la version original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/visual-studio-april-update-cloud-agent-integration/"&gt;haz clic aqui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/"&gt;Actualizacion de abril de Visual Studio: integracion de Cloud Agent para flujos .NET&lt;/a&gt; vale la pena para equipos que construyen y operan sistemas .NET en produccion.&lt;/p&gt;
&lt;p&gt;Desde mi punto de vista, lo mas importante no es solo la novedad, sino como convertirla rapido en una practica de ingenieria repetible.&lt;/p&gt;
&lt;h2 id="por-que-importa-para-equipos-net"&gt;Por que importa para equipos .NET&lt;/h2&gt;
&lt;p&gt;Este cambio ayuda cuando hay que equilibrar velocidad de entrega, consistencia de plataforma y gobernanza.&lt;/p&gt;
&lt;h2 id="siguientes-pasos-practicos"&gt;Siguientes pasos practicos&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Valida la funcionalidad en un piloto .NET pequeno con datos realistas.&lt;/li&gt;
&lt;li&gt;Define observabilidad y un plan de rollback antes de escalar.&lt;/li&gt;
&lt;li&gt;Documenta el patron para reutilizarlo en otros equipos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="fuente"&gt;Fuente&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Articulo original: &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/"&gt;https://devblogs.microsoft.com/visualstudio/visual-studio-april-update-cloud-agent-integration/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title>Gobernar llamadas de herramientas MCP en .NET con Agent Governance Toolkit</title><link>https://thedotnetblog.com/es/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/es/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/</guid><description>Resumen practico para equipos .NET sobre "Gobernar llamadas de herramientas MCP en .NET con Agent Governance Toolkit", con pasos claros para evaluarlo en produccion.</description><content:encoded>&lt;p&gt;&lt;em&gt;Este post fue traducido automaticamente. Para la version original, &lt;a href="https://thedotnetblog.com/es/news/emiliano-montesdeoca/governing-mcp-tool-calls-dotnet/"&gt;haz clic aqui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/"&gt;Gobernar llamadas de herramientas MCP en .NET con Agent Governance Toolkit&lt;/a&gt; vale la pena para equipos que construyen y operan sistemas .NET en produccion.&lt;/p&gt;
&lt;p&gt;Desde mi punto de vista, lo mas importante no es solo la novedad, sino como convertirla rapido en una practica de ingenieria repetible.&lt;/p&gt;
&lt;h2 id="por-que-importa-para-equipos-net"&gt;Por que importa para equipos .NET&lt;/h2&gt;
&lt;p&gt;Este cambio ayuda cuando hay que equilibrar velocidad de entrega, consistencia de plataforma y gobernanza.&lt;/p&gt;
&lt;h2 id="siguientes-pasos-practicos"&gt;Siguientes pasos practicos&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Valida la funcionalidad en un piloto .NET pequeno con datos realistas.&lt;/li&gt;
&lt;li&gt;Define observabilidad y un plan de rollback antes de escalar.&lt;/li&gt;
&lt;li&gt;Documenta el patron para reutilizarlo en otros equipos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="fuente"&gt;Fuente&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Articulo original: &lt;a href="https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/"&gt;https://devblogs.microsoft.com/dotnet/governing-mcp-tool-calls-in-dotnet-with-the-agent-governance-toolkit/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item></channel></rss>