Saltar al contenido principal

18 · Agentes y AI Engineering

MCP, el Model Context Protocol

Qué estandariza MCP, qué no, y cómo exponer o consumir herramientas sin ceder el control.

10 minCaso de estudio: docket (se abre en una ventana nueva) · Tack (se abre en una ventana nueva)

Sin un protocolo común, cada aplicación con integra cada sistema externo a mano. Cinco aplicaciones (un IDE, un chat, un , un bot interno, un asistente de soporte) y diez sistemas (GitHub, Slack, Postgres, Jira...) suman hasta cincuenta integraciones, cada una con su formato de herramientas, su autenticación y sus bugs.

El Model Context Protocol () ataca ese problema de integración. Veamos qué estandariza, qué deja deliberadamente fuera y cómo exponer o consumir herramientas por MCP sin ceder el control que construimos en Tool calling y harness.

Qué estandariza MCP

+------------- Host (IDE, agent, chat) --------------+
|  LLM <-> host logic <-> client   client   client   |
+---------------------------|--------|--------|------+
              JSON-RPC 2.0  |        |        |
                            v        v        v
                        server    server   server
                        (GitHub)  (files)  (Postgres)
  • Host: la aplicación que contiene al modelo y decide.
  • Client: el componente del host que mantiene la conexión con un servidor.
  • Server: el programa que expone capacidades.

Un servidor ofrece tres primitivas principales:

Primitiva Qué es Quién decide usarla
Tools funciones invocables el modelo
Resources datos legibles (un archivo, un esquema) la aplicación
Prompts plantillas de mensajes reutilizables el usuario

El cliente descubre las herramientas con tools/list, que devuelve nombre, descripción y JSON Schema: exactamente la "publicidad" de una herramienta. Los mensajes viajan como JSON-RPC 2.0 sobre dos tipos de transporte: stdio (el host lanza el servidor como proceso hijo) o HTTP (servidor remoto).

Qué no estandariza

MCP resuelve integración, no confianza. Para servidores remotos, la especificación define cómo un cliente se autentica y obtiene autorización (basada en OAuth). Eso responde "¿puede este cliente hablar con este servidor?". No responde "¿debería este agente ejecutar esta llamada, con estos argumentos, ahora?". Esa decisión sigue siendo del host.

Conectar un servidor significa aceptar código y texto de un tercero en tres niveles:

  • Código: un servidor stdio es un proceso que corre en tu máquina, con tus permisos.
  • Texto que el modelo lee: las descripciones de las herramientas y sus resultados entran al contexto; ambos pueden traer instrucciones hostiles (ver Sandboxing y seguridad de agentes).
  • Acciones: las herramientas actúan sobre sistemas externos, a menudo con tus credenciales.
Pregunta Mala respuesta Mejor respuesta
¿Quién clasifica la herramienta? "el servidor dice que es read-only" el host, y lo desconocido se trata como riesgoso
¿Quién decide el permiso? el servidor el host, con su política, en cada llamada
¿Quién registra la acción? el servidor, si quiere el host, antes de ejecutar
¿Quién ve las credenciales? el modelo o el prompt el servidor o un proxy, con alcance mínimo

Consumir MCP sin ceder el control

Así responde docket a las cuatro preguntas:

  • Nombres: toda herramienta adaptada se llama mcp____, y ninguna integrada empieza con mcp__. El nombre del servidor lo elige el operador, no el servidor remoto. Si un nombre ya existe, la herramienta nueva se omite en lugar de sobrescribir.
  • Validación: nombre y descripción pasan por la política pre_input con trusted=False; si una política los bloquea, la herramienta no se registra.
  • Permiso: como nada prueba que una herramienta remota sea de solo lectura, todas se registran con kind="write". Un rol sin escritura recibe cero herramientas MCP.
  • Aislamiento: src/docket/edges/adapters/mcp_client.py lanza un subproceso stdio nuevo por cada intercambio, con timeout; un servidor caído se omite y se registra sin tumbar el turno.

Los límites, dichos con claridad: un rol de solo lectura no puede usar ni siquiera un servidor MCP de documentación inofensivo; no hay caché de listados, así que cada servidor configurado se relanza en cada turno (la spec, specs/functional/mcp-client.spec.md, registra una medición de unos 0,6 s por servidor); y el filtro pre_input se aplica a las descripciones, no a los resultados. Lo que devuelve un servidor entra al contexto sin filtrar; la defensa es estructural: lo que el agente puede hacer después.

Exponer MCP: el protocolo como canal

MCP también sirve para que otro host conduzca tu sistema. La regla es la misma: el protocolo es una puerta más hacia los mismos controles, no un atajo.

// From crates/tack-cli/src/mcp.rs
"move_item" => {
    let id = require_str(args, "id")?;
    let status = require_str(args, "status")?;
    write_item(client, &id, &json!({ "status": status }))
}

write_item lee el item con su ETag y escribe con If-Match, de modo que un agente no puede pisar un cambio que una persona hizo en la interfaz entre la lectura y la escritura. Los errores vuelven como resultado con isError: true, no como falla del protocolo. Tack excluye a propósito del MCP el enrolamiento de (devuelve un secreto de un solo uso), la creación de flotas y perfiles, y la reconciliación de ejecuciones ambiguas. Su límite declarado: el servidor hereda el de la CLI y no hay alcance por herramienta. Las herramientas de ejecución pertenecen a la flota de agentes, que según el README es posterior a los binarios publicados y por ahora se instala desde la rama develop.

Para CTOs

Antes de conectar un servidor MCP, decide quién aplica la política. Si tu host no tiene un punto de enforcement propio en cada llamada, estás delegando tu seguridad en el autor de cada servidor. Y antes de exponer uno, decide qué acciones quedan fuera del protocolo: lo que devuelve secretos o toma decisiones de operador no debería estar al alcance de un agente.

Para llevar

  • MCP estandariza descubrimiento e invocación de tools, resources y sobre JSON-RPC (stdio o HTTP).
  • MCP no decide si una acción concreta está permitida: esa decisión sigue en el host.
  • Descripciones y resultados de un servidor MCP son entrada no confiable.
  • Al consumir MCP, las herramientas remotas deben pasar por el mismo que las propias.
  • Al exponer MCP, el servidor debe llamar a los mismos caminos validados que tu CLI o API, y dejar fuera las acciones de administrador.

Comprueba lo aprendido

¿Por qué docket registra toda herramienta MCP como `kind="write"`?

Porque nada prueba que una herramienta remota sea de solo lectura. Tratarla como escritura es la opción : un rol sin permiso de escritura no recibe ninguna.

¿Qué impide que un agente que usa `tack mcp` mueva un item a un estado no permitido?

El servidor MCP no escribe en la base: llama a la API REST, que valida transiciones y límites WIP igual que para cualquier cliente.

La autorización OAuth de MCP está bien configurada. ¿Alcanza para gobernar al agente?

No. Autoriza al cliente a hablar con el servidor, pero no decide si cada llamada concreta, con sus argumentos, debe ejecutarse. Esa política la aplica el host.