Protocolo MCP: Bus Universal de Herramientas

Estandarizando la interoperabilidad entre agentes y entornos de ejecución.

El Problema: La Fragmentación NxM

Hasta hace poco, cada framework de agentes (LangChain, AutoGen, CrewAI o agentes propietarios) requería conectores ad-hoc para cada herramienta, base de datos o API externa. Si existían N aplicaciones de IA y M herramientas, el ecosistema requería mantener N × M integraciones personalizadas, plagadas de inconsistencias y brechas de seguridad.

El Model Context Protocol (MCP) surge como una respuesta abierta para convertir esta matriz en un problema N + M, funcionando como el equivalente a un "puerto USB-C" para agentes inteligentes.

Las 3 Primitivas Fundamentales

  1. Resources (Recursos): Entidades de datos pasivas y de solo lectura (archivos, logs, esquemas de bases de datos o memoria contextual) identificadas por URIs estructuradas.
  2. Tools (Herramientas): Acciones ejecutables con efectos colaterales (ejecución de scripts en sandbox, mutaciones en bases de datos o llamadas a APIs externas) que requieren aprobación explícita del host.
  3. Prompts: Plantillas interactivas y flujos de trabajo reutilizables orquestados por el servidor para guiar al modelo en tareas complejas.

Topología Host - Cliente - Servidor

MCP define una arquitectura por capas altamente modular y segura:

  • Host: La aplicación principal (un IDE, entorno de desarrollo o runtime de agente) que administra permisos, controla la interfaz con el usuario y orquesta las conexiones.
  • Client: Instanciado dentro del Host, mantiene una comunicación 1:1 con un servidor específico, gestionando negociación de capacidades y enrutamiento.
  • Server: Proceso ligero y especializado que expone recursos y herramientas a través de un canal de transporte estandarizado (usualmente stdio para procesos locales o HTTP/SSE para microservicios remotos).

Ejemplo de Protocolo: Invocación JSON-RPC 2.0

// 1. Host -> Server (tools/call)
{
  "jsonrpc": "2.0",
  "id": 42,
  "method": "tools/call",
  "params": {
    "name": "query_database",
    "arguments": {
      "sql": "SELECT id, status FROM tasks WHERE agent_id = 'quijotech-01' LIMIT 5;"
    }
  }
}

// 2. Server -> Host (Response)
{
  "jsonrpc": "2.0",
  "id": 42,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "[{\"id\": 101, \"status\": \"completed\"}, {\"id\": 102, \"status\": \"running\"}]"
      }
    ],
    "isError": false
  }
}

Referencias y Fuentes Oficiales