Todo producto de IA choca tarde o temprano con la misma pared: el modelo es tan útil como lo que puede alcanzar. Puede razonar brillantemente sobre tu base de datos, tu sistema de tickets o tu código, y aun así no poder tocar ninguno de ellos, porque razonar y acceder son problemas distintos. Durante un tiempo, cada equipo resolvió el acceso a su manera — un plugin a medida acá, un esquema de function-calling hecho a mano allá, nada de eso reutilizable más allá de la integración puntual para la que se construyó.

El Model Context Protocol, o MCP, es la respuesta de Anthropic a eso: un estándar abierto para conectar aplicaciones de IA con las herramientas y los datos que necesitan, de modo que esa conexión se construya una sola vez por sistema, no una vez por cada combinación.

Este artículo cubre qué es MCP realmente, el problema puntual que resuelve, y después se pone práctico: construir un servidor, desplegarlo y conectarlo a Claude Desktop, Claude Code y claude.ai.

01

Qué es MCP Realmente

MCP sigue una arquitectura cliente-servidor. Un host MCP — una aplicación de IA como Claude Code o Claude Desktop — crea un cliente MCP dedicado para cada servidor MCP con el que habla. Un servidor que corre en tu máquina y lee archivos locales suele servir a un solo cliente por stdio, entrada y salida estándar conectadas directamente entre dos procesos. Un servidor que corre en la nube y atiende a muchos usuarios a la vez habla Streamable HTTP en cambio, así puede alcanzarse por red desde cualquier cantidad de clientes.

Host MCP (ej. Claude Code)

Cliente A
Cliente B
Cliente C
Cliente D

Filesystem

Local — stdio

Postgres

Local — stdio

Linear

Remoto — Streamable HTTP

Sentry

Remoto — Streamable HTTP

El host mantiene un cliente dedicado por servidor — servidores locales por stdio, servidores remotos por Streamable HTTP.

Debajo de ambos transportes está la misma capa de datos: mensajes JSON-RPC 2.0 que transportan un pequeño conjunto de primitivas. Un servidor puede exponer tools que el modelo puede invocar, resources que puede leer, y prompts que puede reutilizar. El protocolo en sí es stateless — cada request lleva su propia versión de protocolo y sus capacidades, así que un servidor puede vivir detrás de un balanceador de carga común en lugar de atar a un cliente a una instancia durante toda una sesión.

Nada de esto requiere el SDK de un proveedor de modelos adentro del servidor. Un servidor MCP es simplemente un programa que habla el protocolo — no sabe ni le importa qué aplicación de IA termina llamándolo.

02

El Problema Que Resuelve

Sin un protocolo compartido, cada combinación herramienta-asistente es su propia integración: su propio flujo de autenticación, su propia forma de request, su propia documentación que queda vieja apenas alguno de los dos lados cambia algo. Construís para un asistente y el segundo necesita el mismo trabajo de nuevo — el esfuerzo escala con la cantidad de combinaciones, no con la cantidad de herramientas.

Sin un protocolo

Autenticación a medida por combinación
Una forma de request distinta para cada asistente
Documentación que queda vieja apenas alguno cambia

Con MCP

Un servidor implementa MCP una vez

Cualquier cliente MCP puede llamarlo

Autenticación, formas y docs están estandarizadas

N herramientas cableadas a mano a M asistentes, contra un solo protocolo que ambos lados implementan una vez.

MCP reduce eso a una sola relación de cada lado. Un equipo que construye un producto publica un servidor MCP para él. Un equipo que construye una aplicación de IA publica un cliente MCP. Cualquier servidor construido según la spec funciona con cualquier cliente construido según la spec, así que quien construye la herramienta y quien construye la aplicación de IA nunca tienen que coordinar directamente.

Esa es toda la propuesta: no un modelo más inteligente, sino un estándar lo suficientemente aburrido como para que nadie tenga que seguir reinventando el cableado entre los modelos y los sistemas que necesitan tocar.

03

Qué Expone un Servidor

Un servidor MCP puede ofrecerle a un cliente cuatro tipos de cosas. Tres viven en el servidor; la cuarta deja que el servidor le pida algo al cliente en medio de una llamada:

Tools

Funciones ejecutables que el modelo puede invocar para tomar una acción — consultar una base de datos, llamar a una API, escribir un archivo. Cada tool declara un input schema tipado, así el cliente puede validar una llamada antes de que llegue a tu código.

Resources

Datos tipo archivo que el cliente puede leer como contexto — un archivo de configuración, un conjunto de resultados de una API, un registro de base de datos. Los resources se traen deliberadamente, no se inyectan solos en cada conversación.

Prompts

Templates reutilizables para estructurar una tarea, así quien construye el servidor puede enviar los ejemplos few-shot o el system prompt que una tool necesita junto con la tool misma.

Elicitation

La única primitiva que un cliente le ofrece de vuelta a los servidores: una forma de pedirle al usuario más información o confirmación en medio de una llamada, en lugar de adivinar o fallar directamente.

Dos capacidades que antes vivían en esta lista, sampling y logging, están deprecadas en la spec actual. Los servidores nuevos se integran directamente con la API de un proveedor de modelos cuando necesitan una completion, y loguean a stderr o a OpenTelemetry en lugar de enrutar los logs por el protocolo.

04

Cómo Construir Uno

El SDK de TypeScript es el camino más rápido a un servidor funcionando. Instalalo junto con Zod, que el SDK usa para los schemas tipados de las tools:

bash
1
2
3
npm init -y
npm install @modelcontextprotocol/server zod
npm install -D @types/node typescript

Creá el servidor y registrá una tool. registerTool recibe un nombre, una descripción y un input schema, y un handler — lo que devuelve el handler se convierte en el resultado de la tool para el modelo:

typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { McpServer } from '@modelcontextprotocol/server';
import * as z from 'zod/v4';
const server = new McpServer({ name: 'weather', version: '1.0.0' });
server.registerTool(
'get_forecast',
{
description: 'Get the weather forecast for a city',
inputSchema: z.object({
city: z.string().describe('City name, e.g. "Buenos Aires"'),
}),
},
async ({ city }) => {
const forecast = await fetchForecast(city);
return { content: [{ type: 'text', text: forecast }] };
},
);

Por último, conectá el servidor a un transporte y corrélo. Para un servidor local que un proceso host lanza y con el que habla por stdio, es así:

typescript
1
2
3
4
5
6
7
8
import { StdioServerTransport } from '@modelcontextprotocol/server/stdio';
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main();

Eso ya es un servidor completo y funcionando. Todo lo que sigue desde acá — más tools, resources, prompts, manejo de errores real — se construye sobre las mismas tres piezas: una instancia de servidor, capacidades registradas, y un transporte.

05

Cómo Desplegarlo

Un servidor local por stdio está bien para herramientas que solo van a correr en la misma máquina que el cliente — un servidor de filesystem, un helper local de git. En el momento en que una herramienta necesita compartirse entre un equipo o alcanzarse desde la web, necesita un transporte remoto en cambio: Streamable HTTP.

La forma casi no cambia. Cambiá el transporte por uno que hable HTTP, y montalo en una ruta del framework web que ya estés usando:

typescript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { createMcpExpressApp } from '@modelcontextprotocol/express';
import { NodeStreamableHTTPServerTransport } from '@modelcontextprotocol/node';
const app = createMcpExpressApp();
app.post('/mcp', async (req, res) => {
// Stateless: a fresh transport per request. No session to pin to an
// instance, so this handler works behind an ordinary load balancer.
const transport = new NodeStreamableHTTPServerTransport({
sessionIdGenerator: undefined,
});
await server.connect(transport);
await transport.handleRequest(req, res, req.body);
});

Como el protocolo es stateless, ese handler puede correr detrás de un balanceador de carga round-robin común — sin sticky sessions, sin un store de sesiones compartido, sin coordinación entre instancias. Desplegalo de la misma forma que desplegarías cualquier otro servicio HTTP: un contenedor detrás de un reverse proxy, una función serverless, lo que sea que tu stack ya haga para APIs.

Si querés que el servidor sea descubrible más allá de tu propio equipo, el MCP Registry aloja metadata de servidores públicos. Publicá el paquete a npm primero, y después usá la CLI oficial para registrarlo:

bash
1
2
3
4
5
npm publish --access public
mcp-publisher init
mcp-publisher login github
mcp-publisher publish
06

Cómo Conectarlo a Claude

Cómo se conecta un servidor depende de dónde va a correr. Los servidores locales por stdio se cablean en un archivo de configuración; los servidores remotos por HTTP se agregan como conectores con una URL.

En Claude Desktop, los servidores locales van en claude_desktop_config.json — en macOS, ~/Library/Application Support/Claude/claude_desktop_config.json:

json
1
2
3
4
5
6
7
8
{
"mcpServers": {
"weather": {
"command": "node",
"args": ["/absolute/path/to/weather-server/build/index.js"]
}
}
}

En Claude Code, la CLI hace el mismo trabajo sin editar JSON a mano. Agregá un servidor local con un comando, o uno remoto con una URL:

bash
1
2
3
4
5
# Local server, run over stdio
claude mcp add weather -- node /absolute/path/to/weather-server/build/index.js
# Remote server, over Streamable HTTP
claude mcp add --transport http weather https://weather.example.com/mcp
bash
1
2
3
4
5
claude mcp add --transport http weather --scope project https://weather.example.com/mcp
# Writes the entry to .mcp.json at the repo root — commit it so the
# whole team gets the same server. Each teammate approves it once,
# the first time they open the project.

Agregar --scope project escribe la entrada en .mcp.json en la raíz del repositorio en lugar de tu configuración personal, así que subir ese archivo le da al equipo entero el mismo servidor — Claude Code le pide a cada persona que lo apruebe la primera vez que abre el proyecto. claude mcp list muestra el estado de conexión de todo lo que está configurado.

Para un servidor remoto, tanto claude.ai como la app de chat de Claude Desktop lo soportan como Custom Connector: Settings → Connectors → Add custom connector, y después la URL HTTPS del servidor. Si el servidor requiere autenticación, Claude te guía por un flujo OAuth antes de activar la conexión, y te deja definir exactamente cuáles de sus tools tienen permiso de correr.

07

Hacia Dónde Va Esto

MCP sigue siendo un estándar joven, en evolución activa — las revisiones recientes reescribieron el núcleo del protocolo más de una vez, la más importante al eliminar el estado de sesión por completo en favor de requests autocontenidos. Las capacidades nuevas ahora se lanzan primero como extensiones opcionales en lugar de aterrizar directo en la spec central, y cada feature lleva una ventana mínima de doce meses de deprecación antes de poder eliminarse.

Vale la pena construir teniendo eso en cuenta: fijá la versión de protocolo que apunta tu servidor, leé los avisos de deprecación cuando actualizás un SDK, y tratá la spec como algo que va a seguir moviéndose debajo tuyo. Las primitivas — tools, resources, prompts — se mantuvieron estables desde el principio; lo que sigue puliéndose es el cableado alrededor de ellas.