Para mover a los agentes de IA del prototipo a la producción se calientan, la necesidad de una forma estandarizada para que los agentes llamen a las herramientas en diferentes proveedores es presionando. Esta transición a un enfoque estandarizado para la llamada de la herramienta de agente es similar a lo que vimos con las API REST. Antes de que existieran, los desarrolladores tuvieron que lidiar con un desastre de protocolos patentados solo para extraer datos de diferentes servicios. El descanso trajo el orden al caos, permitiendo que los sistemas se hablen de manera consistente. MCP (Protocolo de contexto del modelo) tiene como objetivo, como parece, proporcionar contexto para los modelos de IA de manera estándar. Sin él, nos dirigimos hacia el caos de callación de herramientas donde múltiples versiones incompatibles de las llamadas de herramientas “estandarizadas” surgen simplemente porque no hay una forma compartida para que los agentes organicen, compartan e invocen herramientas. MCP nos da un lenguaje compartido y la democratización de la llamada de herramientas.
Una cosa que personalmente me entusiasma es cómo los estándares de llamada de herramientas como MCP realmente pueden hacer Sistemas de IA más seguro. Con un acceso más fácil a herramientas bien probadas, más empresas pueden evitar reinventar la rueda, lo que reduce los riesgos de seguridad y minimiza la posibilidad de código malicioso. A medida que los sistemas AI comienzan a escalar en 2025, estas son preocupaciones válidas.
Mientras me sumergí en MCP, me di cuenta de una gran brecha en la documentación. Hay un montón de contenido de “qué hace” de alto nivel, pero cuando realmente quieres entender cómo Funciona, los recursos comienzan a quedarse cortos, especialmente para aquellos que no son desarrolladores nativos. Son explicadores de alto nivel o en el código fuente.
En esta pieza, voy a desglosar MCP para una audiencia más amplia, lo que hace que los conceptos y la funcionalidad sean claros y digeribles. Si puede, siga en la sección de codificación, si no, se explicará bien en un lenguaje natural por encima de los fragmentos de código.
Una analogía para comprender MCP: el restaurante
Imaginemos el concepto de MCP como un restaurante donde tenemos:
El host = el edificio del restaurante (el entorno donde corre el agente)
El servidor = la cocina (donde viven las herramientas)
El cliente = el camarero (quién envía solicitudes de herramienta)
El agente = el cliente (que decide qué herramienta usar)
Las herramientas = las recetas (el código que se ejecuta)
Los componentes de MCP
Anfitrión
Aquí es donde opera el agente. En nuestra analogía, es el edificio de restaurantes; En MCP, es donde se ejecutan realmente sus agentes o LLM. Si estás usando ollama localmente, estás el anfitrión. Si está usando Claude o GPT, entonces Anthrope o OpenAI son los anfitriones.
Cliente
Este es el entorno que envía solicitudes de llamadas de herramienta del agente. Piense en ello como el camarero que toma su pedido y lo entrega a la cocina. En términos prácticos, es la aplicación o interfaz donde se ejecuta su agente. El cliente pasa las solicitudes de llamadas de la herramienta al Servidor Usando MCP.
Servidor
Esta es la cocina donde se encuentran recetas o herramientas. Centraliza las herramientas para que los agentes puedan acceder a ellas fácilmente. Los servidores pueden ser locales (girados por los usuarios) o remotos (alojados por las empresas que ofrecen herramientas). Las herramientas en un servidor generalmente se agrupan por función o integración. Por ejemplo, todas las herramientas relacionadas con la holgura pueden estar en un “servidor flojo” o todas las herramientas de mensajería se pueden agrupar en un “servidor de mensajería”. Esa decisión se basa en las preferencias arquitectónicas y de desarrolladores.
Agente
Los “cerebros” de la operación. Impulsado por un LLM, decide qué herramientas llamar para completar una tarea. Cuando determina que se necesita una herramienta, inicia una solicitud al servidor. El agente no necesita comprender de forma nativa MCP porque aprende cómo usarlo a través de los metadatos asociados con cada una de las herramientas. Estos metadatos asociados con cada herramienta le dicen al agente el protocolo para llamar a la herramienta y el método de ejecución. Pero es importante tener en cuenta que la plataforma o agente necesita admitir MCP para que maneje las llamadas de la herramienta automáticamente. De lo contrario, depende del desarrollador escribir la lógica de traducción compleja de cómo analizar los metadatos del esquema, las solicitudes de llamadas de la herramienta de formulario en formato MCP, asignar las solicitudes a la función correcta, ejecutar el código y devolver el resultado en el formato de queja MCP al agente.
Herramientas
Estas son las funciones, como llamar a API o código personalizado, que “hace el trabajo”. Las herramientas viven en servidores y pueden ser:
- Herramientas personalizadas que crea y aloja en un servidor local.
- Herramientas prefabricadas alojadas por otros en un servidor remoto.
- Código prefabricado creado por otros pero alojado por usted en un servidor local.
Cómo encajan los componentes
- Herramientas de registro del servidor
Cada herramienta se define con un nombre, descripción, esquemas de entrada/salida, un controlador de funciones (el código que se ejecuta) y se registra en el servidor. Esto generalmente implica llamar a un método o API para decirle al servidor “Hola, aquí hay una nueva herramienta y así es como lo usas”. - El servidor expone metadatos
Cuando el servidor comienza o un agente se conecta, expone los metadatos de la herramienta (esquemas, descripciones) a través de MCP. - El agente descubre herramientas
El agente consulta el servidor (usando MCP) para ver qué herramientas están disponibles. Entiende cómo usar cada herramienta de los metadatos de la herramienta. Esto generalmente ocurre en el inicio o cuando se agregan herramientas. - Uso de la herramienta de planes de agentes
Cuando el agente determina que se necesita una herramienta (según la entrada del usuario o el contexto de la tarea), forma una solicitud de llamadas de herramienta en un formato MCP JSON estandarizado que incluye el nombre de la herramienta, los parámetros de entrada que coinciden con el esquema de entrada de la herramienta y cualquier otro metadata. El cliente actúa como la capa de transporte y envía la solicitud formateada de MCP al servidor a través de HTTP. - Se ejecuta la capa de traducción
La capa de traducción toma la llamada de herramienta estandarizada del agente (a través de MCP), asigna la solicitud a la función correspondiente en el servidor, ejecuta la función, formatea el resultado de nuevo a MCP y la envía nuevamente al agente. Un marco que abstrae a MCP para usted deos todo esto sin que el desarrollador necesita escribir la lógica de la capa de traducción (que suena como un dolor de cabeza).
Ejemplo de código de un agente reaccionado utilizando el servidor de búsqueda de Brave MCP
Para comprender cómo se ve MCP cuando se aplica, usemos el marco Beeai de IBM, lo que admite de forma nativa MCP y maneja la lógica de traducción para nosotros.
Si planea ejecutar este código, deberá:
- Clonar el Beeai Framework Repo Para obtener acceso a las clases de ayuda utilizadas en este código
- Crear un Cuenta de desarrollador valiente gratuita y obtén tu clave API. Hay suscripciones gratuitas disponibles (requerida tarjeta de crédito).
- Crear una cuenta de desarrollador de OpenAI y crear una clave API
- Agregue su tecla API valiente y la tecla OpenAI al archivo .env en el nivel de la carpeta Python del repositorio.
- Asegúrese de tener instalado NPM y establecer su ruta correctamente.
Muestra .env archivo
BRAVE_API_KEY= "<Your API Key Here>"
BEEAI_LOG_LEVEL=INFO
OPENAI_API_KEY= "<Your API Key Here>"
Muestra mcp_agent.ipynb
1. Importar las bibliotecas necesarias
import asyncio
import logging
import os
import sys
import traceback
from typing import Any
from beeai_framework.agents.react.runners.default.prompts import SystemPromptTemplate
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
from beeai_framework import Tool
from beeai_framework.agents.react.agent import ReActAgent
from beeai_framework.agents.types import AgentExecutionConfig
from beeai_framework.backend.chat import ChatModel, ChatModelParameters
from beeai_framework.emitter.emitter import Emitter, EventMeta
from beeai_framework.errors import FrameworkError
from beeai_framework.logger import Logger
from beeai_framework.memory.token_memory import TokenMemory
from beeai_framework.tools.mcp_tools import MCPTool
from pathlib import Path
from beeai_framework.adapters.openai.backend.chat import OpenAIChatModel
from beeai_framework.backend.message import SystemMessa
2. Cargue las variables de entorno y establezca la ruta del sistema (si es necesario)
import os
from dotenv import load_dotenv
# Absolute path to your .env file
# sometimes the system can have trouble locating the .env file
env_path = <Your path to your .env file>
# Load it
load_dotenv(dotenv_path=env_path)
# Get current working directory
path = <Your path to your current python directory> #...beeai-framework/python'
# Append to sys.path
sys.path.append(path)
3. Configure el registrador
# Configure logging - using DEBUG instead of trace
logger = Logger("app", level=logging.DEBUG)
4. Cargar funciones auxiliares como process_agent_events, observador y crear una instancia de consolador
- Process_agent_events: maneja eventos de agente y registra mensajes a la consola en función del tipo de evento (por ejemplo, error, reconstancia, actualización). Asegura un resultado significativo para cada evento para ayudar a rastrear la actividad del agente.
- Observador: escucha todos los eventos de un emisor y los enruta a procesar_AGENT_EVENTS para procesar y mostrar.
- Consolerante: gestiona la entrada/salida de la consola, lo que permite la interacción del usuario y la visualización de mensajes formateados con roles codificados por colores.
#load console reader
from examples.helpers.io import ConsoleReader
#this is a helper function that makes the assitant chat easier to read
reader = ConsoleReader()
def process_agent_events(data: dict[str, Any], event: EventMeta) -> None:
"""Process agent events and log appropriately"""
if event.name == "error":
reader.write("Agent 🤖 : ", FrameworkError.ensure(data["error"]).explain())
elif event.name == "retry":
reader.write("Agent 🤖 : ", "retrying the action...")
elif event.name == "update":
reader.write(f"Agent({data['update']['key']}) 🤖 : ", data["update"]["parsedValue"])
elif event.name == "start":
reader.write("Agent 🤖 : ", "starting new iteration")
elif event.name == "success":
reader.write("Agent 🤖 : ", "success")
else:
print(event.path)
def observer(emitter: Emitter) -> None:
emitter.on("*.*", process_agent_events)
5. Establezca la tecla API valiente y los parámetros del servidor.
Anthrope tiene una lista de servidores MCP aquí.
brave_api_key = os.environ["BRAVE_API_KEY"]
brave_server_params = StdioServerParameters(
command="/opt/homebrew/bin/npx", # Full path to be safe
args=[
"-y",
"@modelcontextprotocol/server-brave-search"
],
env={
"BRAVE_API_KEY": brave_api_key,
"x-subscription-token": brave_api_key
},
)
6. Cree la herramienta valiente que inicia la conexión con el servidor MCP, descubre herramientas y devuelve las herramientas descubiertas a los agentes para que pueda decidir qué herramienta es apropiada pedir una tarea determinada.
En este caso, las herramientas se pueden descubrir en el servidor Brave MCP:
- Brave_Web_Search: ejecute búsquedas web con paginación y filtrado
- BRAVE_LOCAL_SEARCH: Busque empresas y servicios locales
async def brave_tool() -> MCPTool:
brave_env = os.environ.copy()
brave_server_params = StdioServerParameters(
command="/opt/homebrew/bin/npx",
args=["-y", "@modelcontextprotocol/server-brave-search"],
env=brave_env
)
print("Starting MCP client...")
try:
async with stdio_client(brave_server_params) as (read, write), ClientSession(read, write) as session:
print("Client connected, initializing...")
await asyncio.wait_for(session.initialize(), timeout=10)
print("Initialized! Discovering tools...")
bravetools = await asyncio.wait_for(
MCPTool.from_client(session, brave_server_params),
timeout=10
)
print("Tools discovered!")
return bravetools
except asyncio.TimeoutError as e:
print("❌ Timeout occurred during session initialization or tool discovery.")
except Exception as e:
print("❌ Exception occurred:", e)
traceback.print_exc()
(Opcional) Verifique la conexión al servidor MCP y asegúrese de que devuelva todas las herramientas disponibles antes de proporcionarla al agente.
tool = await brave_tool()
print("Discovered tools:", tool)
for tool in tool:
print(f"Tool Name: {tool.name}")
print(f"Description: {getattr(tool, 'description', 'No description available')}")
print("-" * 30)
PRODUCCIÓN:
Starting MCP client...
Client connected, initializing...
Initialized! Discovering tools...
Tools discovered!
Discovered tools: [<beeai_framework.tools.mcp_tools.MCPTool object at 0x119aa6c00>, <beeai_framework.tools.mcp_tools.MCPTool object at 0x10fee3e60>]
Tool Name: brave_web_search
Description: Performs a web search using the Brave Search API, ideal for general queries, news, articles, and online content. Use this for broad information gathering, recent events, or when you need diverse web sources. Supports pagination, content filtering, and freshness controls. Maximum 20 results per request, with offset for pagination.
------------------------------
Tool Name: brave_local_search
Description: Searches for local businesses and places using Brave's Local Search API. Best for queries related to physical locations, businesses, restaurants, services, etc. Returns detailed information including:
- Business names and addresses
- Ratings and review counts
- Phone numbers and opening hours
Use this when the query implies 'near me' or mentions specific locations. Automatically falls back to web search if no local results are found.
7. Escriba la función que crea el agente:
- Asignar un LLM
- Cree una instancia de la función Brave_Tool () y asignarla a una variable de herramientas
- Cree un agente de reacción y asigne el LLM, herramientas, memoria elegido (para que pueda tener una conversación constante)
- Agregue una solicitud de sistema al agente React.
Nota: Puede notar que agregué una oración a la solicitud del sistema que dice “Si necesita usar el Brave_Tool, debe usar un recuento de 5”. Este es un BanDaid Work-Around porque un error que encontré en el index.ts archivo del servidor valiente. Contribuiré al repositorio para arreglarlo.
async def create_agent() -> ReActAgent:
"""Create and configure the agent with tools and LLM"""
#using openai api instead
llm = OpenAIChatModel(model_id="gpt-4o")
# Configure tools
tools: list[Tool] = await brave_tool()
#tools: list[Tool] = [await brave_tool()]
# Create agent with memory and tools
agent = ReActAgent(llm=llm, tools=tools, memory=TokenMemory(llm), )
await agent.memory.add(SystemMessage(content="You are a helpful assistant. If you need to use the brave_tool you must use a count of 5."))
return agent
8. Crea la función principal
- Crea el agente
- Ingresa un bucle de conversación con el usuario y ejecuta el agente con la solicitud del usuario y algunas configuraciones de configuración. Termina la conversación si el usuario tipos “Salir” o “dejar de fumar”.
import asyncio
import traceback
import sys
# Your async main function
async def main() -> None:
"""Main application loop"""
# Create agent
agent = await create_agent()
# Main interaction loop with user input
for prompt in reader:
# Exit condition
if prompt.strip().lower() in {"exit", "quit"}:
reader.write("Session ended by user. Goodbye! 👋n")
break
# Run agent with the prompt
try:
response = await agent.run(
prompt=prompt,
execution=AgentExecutionConfig(max_retries_per_step=3, total_max_retries=10, max_iterations=20),
).observe(observer)
reader.write("Agent 🤖 : ", response.result.text)
except Exception as e:
reader.write("An error occurred: ", str(e))
traceback.print_exc()
# Run main() with error handling
try:
await main()
except FrameworkError as e:
traceback.print_exc()
sys.exit(e.explain())
PRODUCCIÓN:
Starting MCP client...
Client connected, initializing...
Initialized! Discovering tools...
Tools discovered!
Interactive session has started. To escape, input 'q' and submit.
Agent 🤖 : starting new iteration
Agent(thought) 🤖 : I will use the brave_local_search function to find the open hours for La Taqueria on Mission St in San Francisco.
Agent(tool_name) 🤖 : brave_local_search
Agent(tool_input) 🤖 : {'query': 'La Taqueria Mission St San Francisco'}
Agent(tool_output) 🤖 : [{"annotations": null, "text": "Error: Brave API error: 422 Unprocessable Entityn{"type":"ErrorResponse","error":{"id":"ddab2628-c96e-478f-80ee-9b5f8b1fda26","status":422,"code":"VALIDATION","detail":"Unable to validate request parameter(s)","meta":{"errors":[{"type":"greater_than_equal","loc":["query","count"],"msg":"Input should be greater than or equal to 1","input":"0","ctx":{"ge":1}}]}},"time":1742589546}", "type": "text"}]
Agent 🤖 : starting new iteration
Agent(thought) 🤖 : The function call resulted in an error. I will try again with a different approach to find the open hours for La Taqueria on Mission St in San Francisco.
Agent(tool_name) 🤖 : brave_local_search
Agent(tool_input) 🤖 : {'query': 'La Taqueria Mission St San Francisco', 'count': 5}
Agent(tool_output) 🤖 : [{"annotations": null, "text": "Title: LA TAQUERIA - Updated May 2024 - 2795 Photos & 4678 Reviews - 2889 Mission St, San Francisco, California - Mexican - Restaurant Reviews - Phone Number - YelpnDescription: LA TAQUERIA, <strong>2889 Mission St, San Francisco, CA 94110</strong>, 2795 Photos, Mon - Closed, Tue - Closed, Wed - 11:00 am - 8:45 pm, Thu - 11:00 am - 8:45 pm, Fri - 11:00 am - 8:45 pm, Sat - 11:00 am - 8:45 pm, Sun - 11:00 am - 7:45 pmnURL: https://www.yelp.com/biz/la-taqueria-san-francisco-2nnTitle: La Taqueria: Authentic Mexican Cuisine for Every TastenDescription: La Taqueria - <strong>Mexican Food Restaurant</strong> welcomes you to enjoy our delicious. La Taqueria provides a full-service experience in a fun casual atmosphere and fresh flavors where the customer always comes first!nURL: https://lataqueria.gotoeat.net/nnTitle: r/sanfrancisco on Reddit: Whats so good about La Taqueria in The Mission?nDescription: 182 votes, 208 comments. Don't get me wrong its good but I failed to see the hype. I waited in a long line and once I got my food it just tastes like…nURL: https://www.reddit.com/r/sanfrancisco/comments/1d0sf5k/whats_so_good_about_la_taqueria_in_the_mission/nnTitle: LA TAQUERIA, San Francisco - Mission District - Menu, Prices & Restaurant Reviews - TripadvisornDescription: La Taqueria still going strong. <strong>Historically the most well known Burrito home in the city and Mission District</strong>. Everything is run like a clock. The fillings are just spiced and prepared just right. Carnitas, chicken, asada, etc have true home made flavors. The Tortillas both are super good ...nURL: https://www.tripadvisor.com/Restaurant_Review-g60713-d360056-Reviews-La_Taqueria-San_Francisco_California.htmlnnTitle: La Taqueria – San Francisco - a MICHELIN Guide RestaurantnDescription: San Francisco Restaurants · La Taqueria · 4 · <strong>2889 Mission St., San Francisco, 94110, USA</strong> · $ · Mexican, Regional Cuisine · Visited · Favorite · Find bookable restaurants near me · <strong>2889 Mission St., San Francisco, 94110, USA</strong> · $ · Mexican, Regional Cuisine ·nURL: https://guide.michelin.com/us/en/california/san-francisco/restaurant/la-taqueria", "type": "text"}]
Agent 🤖 : starting new iteration
Agent(thought) 🤖 : I found the open hours for La Taqueria on Mission St in San Francisco. I will provide this information to the user.
Agent(final_answer) 🤖 : La Taqueria, located at 2889 Mission St, San Francisco, CA 94110, has the following opening hours:
- Monday: Closed
- Tuesday: Closed
- Wednesday to Saturday: 11:00 AM - 8:45 PM
- Sunday: 11:00 AM - 7:45 PM
For more details, you can visit their [Yelp page](https://www.yelp.com/biz/la-taqueria-san-francisco-2).
Agent 🤖 : success
Agent 🤖 : success
run.agent.react.finish
Agent 🤖 : La Taqueria, located at 2889 Mission St, San Francisco, CA 94110, has the following opening hours:
- Monday: Closed
- Tuesday: Closed
- Wednesday to Saturday: 11:00 AM - 8:45 PM
- Sunday: 11:00 AM - 7:45 PM
For more details, you can visit their [Yelp page](https://www.yelp.com/biz/la-taqueria-san-francisco-2).
Conclusión, desafíos y hacia dónde se dirige MCP
En este artículo, ha visto cómo MCP puede proporcionar una forma estandarizada para que los agentes descubran herramientas en un servidor MCP y luego interactúen con ellos sin que el desarrollador necesita especificar los detalles de implementación de la llamada de la herramienta. El nivel de abstracción que ofrece MCP es poderoso. Significa que los desarrolladores pueden centrarse en crear herramientas valiosas, mientras que los agentes pueden descubrirlos y usarlos a través de protocolos estándar.
Nuestro ejemplo de restaurante nos ayudó a visualizar cómo conceptos de MCP como el host, el cliente, el servidor, el agente y las herramientas trabajan juntos, cada uno con su propio papel importante. El ejemplo del código, donde utilizamos un agente de reaccionado en el marco Beeai, que maneja la herramienta MCP llamando de forma nativa, para llamar al servidor Brave MCP con acceso a dos herramientas proporcionadas por una comprensión del mundo real de MCP se puede usar en la práctica.
Sin protocolos como MCP, nos enfrentamos a un paisaje fragmentado donde cada proveedor de IA implementa sus propios mecanismos incompatibles de inscripción de herramientas, creando complejidad, vulnerabilidades de seguridad y esfuerzo de desarrollo desperdiciado.
En los próximos meses, es probable que MCP gane una tracción significativa por varias razones:
- A medida que más proveedores de herramientas adoptan MCP, el efecto de la red acelerará la adopción en toda la industria.
- Los protocolos estandarizados significan mejores pruebas, menos vulnerabilidades y riesgos reducidos a medida que la escala de sistemas de IA.
- La capacidad de escribir una herramienta una vez y hacer que funcione en múltiples marcos de agentes reducirá drásticamente la sobrecarga de desarrollo.
- Los jugadores más pequeños pueden competir enfocándose en crear excelentes herramientas en lugar de reinventar arquitecturas de agentes complejos.
- Las organizaciones pueden integrar a los agentes de IA con más confianza saber que están basados en estándares estables e interoperables.
Dicho esto, MCP enfrenta desafíos importantes que necesitan abordar a medida que crece la adopción:
- Como se demuestra en nuestro ejemplo de código, los agentes solo pueden descubrir herramientas una vez conectadas a un servidor
- La funcionalidad del agente depende del tiempo de actividad y el rendimiento del servidor, introduciendo puntos de falla adicionales.
- A medida que evoluciona el protocolo, mantener la compatibilidad al agregar nuevas características requerirá gobernanza.
- Estandarizar cómo los agentes acceden a las herramientas potencialmente sensibles en diferentes servidores introduce consideraciones de seguridad.
- La arquitectura del cliente-servidor presenta una latencia adicional.
Para los desarrolladores, los investigadores de inteligencia artificial y las organizaciones que construyen sistemas basados en agentes, la comprensión y la adopción de MCP ahora, mientras que son conscientes de estos desafíos, proporcionarán una ventaja significativa a medida que comiencen a escalar más soluciones de IA.
Nota: Las opiniones expresadas tanto en este artículo como en el documento son únicamente las de los autores y no necesariamente reflejan las opiniones o políticas de sus respectivos empleadores.
¿Interesado en conectarse? Déjame un dm en LinkedIn! Siempre estoy ansioso por participar en alimentos para pensar e iterar en mi trabajo.