Capitulo 12: MCP Servers
Capitulo 12: MCP Servers
< Volver al Indice del Tutorial
Qué es MCP
Model Context Protocol (MCP) es un protocolo estandarizado que permite extender las capacidades de un agente AI con herramientas externas. En lugar de que el agente solo pueda leer archivos y ejecutar comandos del sistema, MCP le permite conectarse a servicios como Sentry, navegadores, bases de datos, APIs de documentación y cualquier otra herramienta que implemente el protocolo.
OpenCode soporta MCP de forma nativa. Puedes configurar múltiples servidores MCP que el agente descubrirá y usará automáticamente cuando lo necesite. El protocolo define un estándar para que las herramientas se registren, describan sus capacidades y reciban invocaciones del modelo.
flowchart LR
A[OpenCode] -->|Descubre herramientas| B[MCP Server 1]
A -->|Descubre herramientas| C[MCP Server 2]
A -->|Descubre herramientas| D[MCP Server 3]
B -->|Sentry: issues, errores| E[Resultado]
C -->|Playwright: navegador| E
D -->|Context7: docs| E
E -->|Respuesta enriquecida| A
La ventaja de MCP sobre ejecutar comandos directamente es que las herramientas MCP se autodocumentan: el modelo sabe exactamente qué puede hacer cada herramienta, qué parámetros acepta y qué tipo de resultado devuelve. Esto hace que el agente use las herramientas de forma más precisa y eficiente.
Configuración en opencode.json
Los MCP servers se definen en el archivo opencode.json bajo la clave "mcp":
{
"mcp": {
"servidor-local": {
"type": "local",
"command": ["npx", "-y", "mi-comando-mcp"],
"environment": { "VAR": "valor" },
"enabled": true
},
"servidor-remoto": {
"type": "remote",
"url": "https://mi-servidor.com",
"headers": { "Authorization": "Bearer TOKEN" }
}
}
}
Existen dos tipos principales de servidores MCP: locales (que ejecutan un proceso en tu máquina) y remotos (que conectan a un servicio HTTP externo).
Servidores Locales (stdio)
Los servidores locales ejecutan un proceso en tu máquina y se comunican via stdio (standard input/output). Son los más comunes y fáciles de configurar. OpenCode inicia el proceso automáticamente cuando necesita alguna de sus herramientas.
{
"mcp": {
"mi-mcp-local": {
"type": "local",
"command": ["npx", "-y", "mi-mcp-command"],
"environment": {
"API_KEY": "tu-api-key",
"DEBUG": "true"
},
"enabled": true
}
}
}
Propiedades disponibles
- type: siempre
"local"para servidores que corren en tu máquina. - command: array con el comando y argumentos para iniciar el servidor. El primer elemento es el ejecutable, los siguientes son los argumentos.
- environment: variables de entorno que recibe el proceso del servidor MCP. Aquí es donde pones API keys y configuraciones específicas del servidor.
- enabled: permite deshabilitar el servidor sin eliminar la configuración. Por defecto es
true. Ponlo enfalsepara desactivar temporalmente un servidor sin borrar su configuración.
El servidor se inicia automáticamente cuando OpenCode arranca la sesión. El proceso se comunica con OpenCode a través de stdio: OpenCode envía peticiones como JSON por stdin y el servidor responde por stdout.
Formato del comando
El array command soporta cualquier ejecutable:
// Paquete npm
"command": ["npx", "-y", "@sentry/mcp-server"]
// Script Python
"command": ["python", "-m", "mi_mcp_server"]
// Binario directo
"command": ["/usr/local/bin/mi-mcp"]
// Con argumentos
"command": ["npx", "-y", "mi-mcp", "--port", "3000", "--verbose"]
El flag -y en npx es importante: acepta automáticamente la instalación del paquete si no está descargado, evitando que el proceso se quede esperando input del usuario.
Servidores Remotos (HTTP)
Los servidores remotos conectan a un servicio MCP que corre en otro lugar, accesible via HTTP. Son útiles cuando el servicio MCP está alojado en la nube, en otro equipo de tu red, o es proporcionado por un tercero.
{
"mcp": {
"mi-remote": {
"type": "remote",
"url": "https://mi-mcp-server.com/mcp",
"headers": {
"Authorization": "Bearer tu-api-key"
}
}
}
}
Propiedades disponibles
- type: siempre
"remote"para servidores HTTP. - url: URL completa del servidor MCP remoto. Debe incluir el protocolo (https://) y la ruta del endpoint MCP.
- headers: encabezados HTTP adicionales que se envían con cada petición. Típicamente usado para autenticación con Bearer tokens o API keys.
Los servidores remotos usan HTTP para la comunicación, lo que los hace ideales para servicios que necesitan alta disponibilidad o que son compartidos por un equipo. La latencia es mayor que con servidores locales, pero la configuración es más simple ya que no necesitas instalar ni ejecutar nada en tu máquina.
Autenticación OAuth
OpenCode soporta OAuth para servidores MCP remotos. Esto es especialmente útil para servicios que requieren autenticación de usuario, como GitHub, Slack o herramientas internas de tu empresa.
Comando de autenticación
opencode mcp auth nombre-servidor
Este comando inicia el flujo OAuth: abre tu navegador, te redirige al proveedor de identidad, y una vez autenticado, almacena los tokens de forma segura.
Registro dinámico de clientes
OpenCode soporta el registro dinámico de clientes OAuth (Dynamic Client Registration). Esto significa que si el servidor MCP implementa el endpoint de registro, OpenCode puede registrarse automáticamente como cliente OAuth sin necesidad de credenciales preconfiguradas.
El flujo es:
sequenceDiagram
participant O as OpenCode
participant S as Servidor MCP
participant P as Proveedor OAuth
O->>S: Petición (sin auth)
S-->>O: 401 + endpoints OAuth
O->>P: Registro dinámico de cliente
P-->>O: client_id + client_secret
O->>P: Solicitar autorización (navegador)
P-->>O: Token de acceso
O->>S: Petición (con token)
S-->>O: Respuesta exitosa
Credenciales preregistradas
Cuando ya tienes credenciales OAuth del servicio (porque te las proporcionó el administrador o las generaste manualmente), puedes configurarlas directamente:
{
"mcp": {
"servicio-preregistrado": {
"type": "remote",
"url": "https://servicio.com/mcp",
"oauth": {
"clientId": "tu-client-id",
"clientSecret": "tu-client-secret"
}
}
}
}
OAuth automático (por defecto)
Si el servidor responde con un 401, OpenCode detecta automáticamente los endpoints OAuth y abre el navegador para autenticación:
{
"mcp": {
"servicio-oauth": {
"type": "remote",
"url": "https://servicio.com/mcp"
}
}
}
No necesitas configurar nada adicional. OpenCode maneja todo el flujo.
Deshabilitar OAuth
Para deshabilitar OAuth y usar solo headers estáticos:
{
"mcp": {
"servicio-sin-oauth": {
"type": "remote",
"url": "https://servicio.com/mcp",
"oauth": false,
"headers": {
"Authorization": "Bearer token-fijo"
}
}
}
}
Comandos MCP desde CLI
OpenCode incluye comandos para gestionar la autenticación y el estado de los servidores MCP:
# Autenticar con un servidor MCP remoto
opencode mcp auth mi-remote
# Listar todos los servidores MCP configurados
opencode mcp list
# Cerrar sesión de un servidor MCP
opencode mcp logout mi-remote
El comando mcp list muestra el estado de cada servidor: si está activo, cuántas herramientas expone y si la autenticación es válida. Es la primera herramienta de diagnóstico cuando un servidor MCP no funciona como esperas.
Controlar Herramientas MCP
Cada servidor MCP expone una o más herramientas. OpenCode te permite controlar cuáles están habilitadas usando patrones glob en la configuración de tools. Este control es fundamental para mantener el consumo de tokens bajo control.
Control global
{
"tools": {
"mi-mcp*": false,
"mi-mcp_herramienta_especifica": true
}
}
En este ejemplo, se deshabilitan todas las herramientas del servidor mi-mcp excepto mi-mcp_herramienta_especifica. Los patrones glob (*) permiten filtrar herramientas por prefijo.
Control por agente
Puedes deshabilitar MCP tools globalmente y habilitarlos solo para agentes específicos. Esto es una herramienta poderosa para crear agentes especializados:
{
"agent": {
"default": {
"tools": {
"playwright*": false,
"sentry*": false
}
},
"tester": {
"tools": {
"playwright*": true
}
},
"debugger": {
"tools": {
"sentry*": true
}
}
}
}
En este ejemplo:
- El agente
defaultno tiene acceso a Playwright ni a Sentry. - El agente
testertiene acceso a Playwright para ejecutar tests E2E. - El agente
debuggertiene acceso a Sentry para investigar errores.
Esta separación mantiene el contexto limpio para cada agente, reduciendo el consumo de tokens y mejorando la calidad de las respuestas.
Ejemplos de Servidores Populares
Sentry — Monitoreo de errores
{
"mcp": {
"sentry": {
"type": "local",
"command": ["npx", "-y", "@sentry/mcp-server"],
"environment": {
"SENTRY_AUTH_TOKEN": "tu-token"
}
}
}
}
Permite al agente interactuar directamente con Sentry: consultar proyectos, listar issues recientes, ver stack traces completos y analizar patrones de errores. Es especialmente útil cuando estás debuggeando un problema reportado en producción — puedes pedirle al agente que busque el error en Sentry, analice el stack trace y proponga una corrección, todo en una sola conversación.
Context7 — Documentación actualizada
{
"mcp": {
"context7": {
"type": "local",
"command": ["npx", "-y", "@context7/mcp"]
}
}
}
Da acceso al agente a documentación actualizada de librerías y frameworks. Esto es crítico porque los modelos de lenguaje tienen un corte de conocimiento y pueden generar código con APIs obsoletas. Con Context7, el agente puede buscar la documentación real y actual antes de generar código.
Grep by Vercel — Búsqueda de código
{
"mcp": {
"grep": {
"type": "local",
"command": ["npx", "-y", "@anthropic-ai/grep-mcp"],
"environment": {
"GITHUB_TOKEN": "ghp_..."
}
}
}
}
Permite buscar código en repositorios de GitHub. Es útil cuando necesitas ver cómo otros proyectos resuelven un problema similar, buscar patrones de uso de una librería o encontrar ejemplos de implementación.
Playwright — Automatización del navegador
{
"mcp": {
"playwright": {
"type": "local",
"command": ["npx", "-y", "@playwright/mcp"]
}
}
}
Permite al agente interactuar con páginas web: navegar, hacer click, llenar formularios, tomar capturas de pantalla y ejecutar tests E2E. Combinado con el agente tester, se convierte en una herramienta potente para testing automatizado.
Filesystem — Acceso a directorios específicos
{
"mcp": {
"filesystem": {
"type": "local",
"command": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/ruta/a/directorio"]
}
}
}
Si necesitas dar acceso al agente a directorios fuera del proyecto actual, este servidor MCP proporciona acceso controlado al sistema de archivos.
Limpieza de Procesos MCP (v1.2.16)
A partir de v1.2.16, OpenCode mata automáticamente procesos MCP huérfanos al cerrar la sesión. Anteriormente, si cerrabas OpenCode abruptamente (Ctrl+C, cierre de terminal), los procesos de servidores MCP locales podían quedar corriendo en segundo plano, consumiendo recursos.
Además, OpenCode expone la variable de entorno OPENCODE_PID durante el shutdown, lo que permite a los servidores MCP detectar cuándo el proceso padre está terminando y realizar su propia limpieza de forma ordenada.
Si sospechas que hay procesos MCP huérfanos de sesiones anteriores, puedes verificarlo con:
# Buscar procesos MCP corriendo
ps aux | grep mcp
# Matar procesos huérfanos si los hay
pkill -f "mcp-server"
Consideraciones de Rendimiento y Tokens
Este es el punto más importante de todo el capítulo: los MCP servers consumen tokens del contexto.
Cada servidor MCP expone herramientas que el modelo necesita entender. Las definiciones de estas herramientas (nombre, descripción, parámetros, tipos) se incluyen en cada petición al modelo. Un servidor MCP con 10 herramientas puede añadir fácilmente 2,000-5,000 tokens al contexto de cada mensaje.
flowchart TD
A[Contexto total del modelo] --> B[Tu prompt]
A --> C[Historial de conversación]
A --> D[Definiciones de herramientas built-in]
A --> E[Definiciones de herramientas MCP]
E --> F[Servidor 1: ~1000 tokens]
E --> G[Servidor 2: ~2000 tokens]
E --> H[Servidor 3: ~3000 tokens]
style E fill:#ffcdd2
Recomendaciones para mantener el consumo bajo control:
- No habilites más servidores de los necesarios: cada uno añade definiciones de herramientas al contexto, incluso si no las usas en esa conversación.
- Usa el control por agente: habilita MCP servers solo en los agentes que los necesitan. El agente default no necesita Playwright si solo el agente tester lo usa.
- Monitorea el uso de tokens: si notas que las conversaciones se vuelven caras o lentas, revisa cuántos servidores MCP tienes habilitados.
- Deshabilita herramientas innecesarias: usa glob patterns para filtrar solo las herramientas que realmente usas de cada servidor.
- Deshabilita servidores temporalmente: usa
"enabled": falsepara desactivar servidores que no necesitas en este momento sin perder la configuración.
La clave es encontrar el balance entre funcionalidad y eficiencia en el uso del contexto. Empieza con pocos servidores MCP y ve añadiendo según los necesites.
Crear tu Propio Servidor MCP
Si tienes una herramienta interna que quieres exponer como MCP, puedes crear un servidor usando el SDK oficial:
npx @modelcontextprotocol/create-server mi-servidor
Esto genera un scaffold con la estructura básica para implementar un servidor MCP en TypeScript. El servidor debe implementar el protocolo de descubrimiento de herramientas y los handlers para cada herramienta que expone.
Los servidores MCP personalizados son útiles para:
- Conectar con bases de datos internas
- Integrar herramientas propietarias de tu empresa
- Exponer APIs internas como herramientas del agente
- Automatizar flujos de trabajo específicos de tu equipo
Resumen de Configuración Rápida
| Necesidad | Servidor | Configuración |
|---|---|---|
| Monitoreo de errores | Sentry | @sentry/mcp-server + SENTRY_AUTH_TOKEN |
| Documentación actualizada | Context7 | @context7/mcp (sin config extra) |
| Búsqueda de código | Grep | @anthropic-ai/grep-mcp + GITHUB_TOKEN |
| Testing E2E | Playwright | @playwright/mcp (sin config extra) |
| Acceso a archivos | Filesystem | @modelcontextprotocol/server-filesystem + ruta |
Siguiente: Capitulo 13: Agent Skills —>