MCP (Model Context Protocol)
Protocolo abierto, presentado por Anthropic en 2024, que estandariza cómo las aplicaciones de AI se conectan a herramientas, datos y servicios externos.
Pronunciación
Qué es
MCP (Model Context Protocol) es un protocolo abierto que define cómo las aplicaciones de AI (asistentes como Claude o ChatGPT, IDEs como Cursor o VS Code, agentes propios) se conectan a herramientas, fuentes de datos y servicios externos.
Anthropic lo presentó en noviembre de 2024 y en diciembre de 2025 lo donó a la Agentic AI Foundation (AAIF), un fondo de la Linux Foundation, para que su evolución tenga gobernanza neutral entre proveedores.
La documentación oficial lo compara con un puerto USB-C para aplicaciones de AI: un conector estándar para que cualquier aplicación compatible use cualquier servidor MCP sin integraciones a medida.
Errores comunes de pronunciación
- ❌ “mcpé” (no es una palabra, son iniciales)
- ❌ “eme-ce-pe” (en contextos técnicos se usa la pronunciación inglesa de las siglas)
Por qué existe MCP
El problema antes de MCP
┌─────────────────────────────────────────────────────────┐
│ SIN ESTÁNDAR (Antes) │
├─────────────────────────────────────────────────────────┤
│ │
│ App AI A ───→ Integración propia A ──→ Tu App │
│ │
│ App AI B ───→ Integración propia B ──→ Tu App │
│ (diferente formato) │
│ │
│ App AI C ───→ Integración propia C ──→ Tu App │
│ (otro formato más) │
│ │
│ = 3 integraciones diferentes para lo mismo │
│ │
└─────────────────────────────────────────────────────────┘
La solución con MCP
┌─────────────────────────────────────────────────────────┐
│ CON MCP (Ahora) │
├─────────────────────────────────────────────────────────┤
│ │
│ App AI A ─┐ │
│ │ │
│ App AI B ─┼────→ MCP Server ────→ Tu App │
│ │ (un formato) │
│ App AI C ─┘ │
│ │
│ = 1 integración sirve para todas las apps compatibles │
│ │
└─────────────────────────────────────────────────────────┘
Arquitectura MCP
MCP define tres participantes:
| Componente | Rol | Ejemplo |
|---|---|---|
| Host | La aplicación de AI con la que interactúa el usuario | Claude Desktop, Cursor, VS Code |
| Client | Componente dentro del host que mantiene una conexión 1:1 con un servidor | Uno por cada servidor conectado |
| Server | Programa que expone herramientas, recursos y prompts | Tu backend, un servidor de GitHub o de archivos |
Flujo de comunicación
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Host │ │ Client │ │ Server │
│ (Claude) │ ←──→ │ (MCP) │ ←──→ │ (Tu API) │
└──────────┘ └──────────┘ └──────────┘
│ │ │
│ "Lista mis │ │
│ tareas" │ │
│ ───────────────→│ │
│ │ tools/list │
│ │ ────────────────→│
│ │ │
│ │ [getTasks, │
│ │ createTask] │
│ │ ←────────────────│
│ │ │
│ │ tools/call │
│ │ getTasks() │
│ │ ────────────────→│
│ │ │
│ │ [{id:1, ...}] │
│ │ ←────────────────│
│ "Tienes 5 │ │
│ tareas..." │ │
│ ←───────────────│ │
Los mensajes viajan como JSON-RPC 2.0, ya sea por stdio (servidores locales) o por HTTP (servidores remotos).
Ejemplo práctico: Servidor MCP básico
Con el SDK oficial de TypeScript (v2, paquete @modelcontextprotocol/server):
// server.ts - Un servidor MCP mínimo
import { McpServer } from "@modelcontextprotocol/server";
import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
import * as z from "zod/v4";
const server = new McpServer({ name: "mi-servidor-tareas", version: "1.0.0" });
// Registrar una herramienta: el SDK la anuncia en tools/list
// y valida los argumentos con el schema antes de llamar al handler
server.registerTool(
"obtener_tareas",
{
description: "Obtiene la lista de tareas",
inputSchema: z.object({
estado: z.enum(["pendiente", "completada", "todas"]),
}),
},
async ({ estado }) => {
const tareas = await fetchTareasFromDB(estado);
return { content: [{ type: "text", text: JSON.stringify(tareas) }] };
}
);
// Iniciar servidor por stdio
const transport = new StdioServerTransport();
await server.connect(transport);
Capacidades de MCP
Un servidor MCP puede exponer tres tipos de capacidades:
1. Tools (Herramientas)
Funciones que la AI puede ejecutar:
{
"name": "enviar_email",
"description": "Envía un email a un destinatario",
"inputSchema": {
"type": "object",
"properties": {
"to": { "type": "string" },
"subject": { "type": "string" },
"body": { "type": "string" }
},
"required": ["to", "subject", "body"]
}
}
2. Resources (Recursos)
Datos que la AI puede leer:
{
"uri": "file:///config/settings.json",
"name": "Configuración del sistema",
"mimeType": "application/json"
}
3. Prompts (Plantillas)
Instrucciones reutilizables:
{
"name": "revisar_codigo",
"description": "Template para code review",
"arguments": [
{ "name": "archivo", "required": true }
]
}
Servidores MCP populares
| Servidor | Función | Mantenedor |
|---|---|---|
| filesystem | Acceso a archivos locales con control de acceso | Proyecto MCP (servidor de referencia) |
| git | Leer, buscar y manipular repositorios Git | Proyecto MCP (servidor de referencia) |
| fetch | Obtener contenido web y convertirlo para el LLM | Proyecto MCP (servidor de referencia) |
| GitHub MCP Server | Issues, PRs y repos de GitHub | GitHub (servidor oficial) |
Varios servidores de referencia antiguos (PostgreSQL, Slack, Google Drive, entre otros) fueron archivados en el repositorio
servers-archived; hoy conviene buscar el servidor oficial de cada proveedor.
Configuración en Claude Desktop
// ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
{
"mcpServers": {
"mi-servidor": {
"command": "node",
"args": ["/path/to/server.js"],
"env": {
"API_KEY": "tu-api-key"
}
}
}
}
Seguridad en MCP
Principios de seguridad
- Menor privilegio: Exponer solo lo necesario
- Validación: Verificar todos los inputs
- Autenticación: Usar tokens para acceso (la especificación define autorización basada en OAuth para servidores HTTP)
- Auditoría: Registrar todas las operaciones
- Desconfiar del contenido externo: lo que devuelve una herramienta puede traer prompt injection
Ejemplo de validación
server.registerTool(
"borrar_tarea",
{
description: "Borra una tarea del usuario actual",
// El schema rechaza argumentos inválidos antes de ejecutar
inputSchema: z.object({ id: z.string().uuid() }),
},
async ({ id }) => {
// Verificar permisos en el servidor, no confiar en el modelo
if (!(await usuarioPuedeBorrar(id))) {
return { isError: true, content: [{ type: "text", text: "Operación no permitida" }] };
}
await borrarTarea(id);
return { content: [{ type: "text", text: `Tarea ${id} borrada` }] };
}
);
Términos relacionados
- Agentic AI - AI que actúa de forma autónoma usando herramientas
- API - Interfaz de programación de aplicaciones
- Webhook - Callback HTTP para eventos
Recursos oficiales: