Saltar al contenido

Cómo crear un servidor MCP, y cuándo no hacerlo

Para CTO y desarrolladoresIA en el equipo de desarrollo

Filip PapranecFundador de Digitaliko

Un servidor MCP permite que su sistema hable con agentes de IA. Ilustración: una ventana de agente, un servidor MCP con tres herramientas, lectura y propuesta permitidas, borrado bloqueado, y detrás la aplicación de la empresa.Un servidor MCP permite que su sistema hable con agentes de IA. Ilustración: una ventana de agente, un servidor MCP con tres herramientas, lectura y propuesta permitidas, borrado bloqueado, y detrás la aplicación de la empresa.

Para crear un servidor MCP se elige un transporte, se registran unas pocas herramientas con nombre, descripción y esquema de entrada, y se conecta a un cliente como Claude Code. Use stdio para una herramienta local y Streamable HTTP para un servidor remoto que usan muchas personas. El código es la parte pequeña. Qué herramientas expone, y con qué permisos, decide si puede dejar que un agente lo use.

Un servidor MCP es la forma en que su sistema habla con agentes de IA. Usamos a diario servidores MCP de otros y hemos construido uno propio: un prototipo para una empresa de transporte y logística cuyo sistema construimos y operamos. Se quedó en prototipo. A continuación: cómo crear uno, qué haríamos de otra manera y cuándo no lo necesita en absoluto.

¿Qué es un servidor MCP?

El Model Context Protocol es un estándar abierto para conectar clientes de IA con herramientas y datos. Un servidor ofrece herramientas (acciones), recursos (datos) y prompts. Un cliente, como Claude Code, Claude Desktop o un agente que usted construya, lista las herramientas y las llama cuando la tarea lo requiere. Los mensajes son JSON-RPC.

El agente nunca ve su base de datos. Ve una lista como esta:

  • find_order: busca un pedido por su número. Solo lectura.
  • draft_reply: redacta un borrador de respuesta para que lo apruebe una persona.

El nombre y la descripción son su interfaz. El modelo elige una herramienta leyéndolos, así que una descripción vaga hace que una herramienta se llame en el momento equivocado.

¿stdio o Streamable HTTP: local o remoto?

La especificación de MCP define dos transportes estándar. La elección decide dónde se ejecuta el servidor y cómo se autentica.

Empiece aquí

stdio (local)

  • El cliente arranca el servidor como subproceso.
  • Los mensajes van por stdin y stdout.
  • Las credenciales vienen del entorno.
  • Un usuario, una máquina. El inicio más sencillo.

Streamable HTTP (remoto)

  • Un proceso independiente para muchos clientes.
  • Un único endpoint HTTP, por ejemplo /mcp.
  • Autorización basada en OAuth 2.1.
  • Debe validar la cabecera Origin.

La autorización depende del transporte. La especificación de autorización dice que las implementaciones con stdio «SHOULD NOT follow this specification, and instead retrieve credentials from the environment», es decir, no deben usar ese procedimiento de autorización y deben tomar las credenciales del entorno. Un servidor remoto actúa como servidor de recursos OAuth 2.1 y debe comprobar que cada token que recibe se emitió para él.

¿Cómo se crea un servidor MCP paso a paso?

  1. Elegir las tareas

    Unas pocas cosas que un agente debe hacer con su sistema. No toda su API.

  2. Escribir las herramientas

    Un nombre claro, una descripción con la que el modelo pueda actuar, un esquema de entrada.

  3. Ejecutarlo con stdio

    Primero en local, con credenciales del entorno.

  4. Conectar un cliente

    Añádalo a Claude Code y pruebe la tarea real, no una demo.

  5. Pasar a remoto al final

    Streamable HTTP solo cuando la autorización y el registro de auditoría estén listos.

Un servidor mínimo con el SDK oficial de TypeScript v2 (paquete @modelcontextprotocol/server, a 10/2026):

import { McpServer } from '@modelcontextprotocol/server'
import { serveStdio } from '@modelcontextprotocol/server/stdio'
import * as z from 'zod/v4'
import { getOrder } from './api.js'

function createServer() {
  const server = new McpServer({ name: 'orders', version: '0.1.0' })

  server.registerTool(
    'find_order',
    {
      title: 'Find an order',
      description: 'Look up one order by its order number. Read-only.',
      inputSchema: z.object({ orderNumber: z.string() }),
    },
    async ({ orderNumber }) => {
      const order = await getOrder(orderNumber) // your API, with the caller's rights
      return { content: [{ type: 'text', text: JSON.stringify(order) }] }
    },
  )

  return server
}

void serveStdio(createServer)

Conéctelo a Claude Code:

claude mcp add orders -- node dist/server.js

Con stdio casi todo el mundo cae en una trampa. La especificación dice que el servidor «MUST NOT write anything to its stdout that is not a valid MCP message»: en stdout no puede ir nada que no sea un mensaje MCP. Un console.log olvidado rompe la conexión. Registre los logs en stderr.

Después pruebe con el cliente real y la tarea real. Cuando un agente elige la herramienta equivocada, revise la descripción antes de tocar el código.

¿Qué aprendimos de nuestro propio prototipo MCP?

Nuestro prototipo era un servidor local con stdio sobre el SDK oficial, a partir de una plantilla inicial de código abierto. Tenía una sola herramienta de lectura y llamaba a la API interna existente del sistema con un inicio de sesión provisional. Suficiente para ver a un agente responder preguntas con datos reales. No suficiente para que alguien lo usara a diario.

Un cliente de IA llama a un servidor MCP. El servidor ofrece herramientas de lectura y de propuesta, pero no de borrado ni de envío. Llama a su propia API, que comprueba el inicio de sesión y los roles y lleva un registro de auditoría delante de la base de datos.Un cliente de IA llama a un servidor MCP. El servidor ofrece herramientas de lectura y de propuesta, pero no de borrado ni de envío. Llama a su propia API, que comprueba el inicio de sesión y los roles y lleva un registro de auditoría delante de la base de datos.

Qué haríamos de otra manera:

  • Primero la API. Un servidor MCP es una capa fina sobre una API. El nuestro se apoyaba en endpoints hechos para las pantallas de la propia aplicación. Primero debería existir una API limpia con sus propias reglas de acceso. Cómo lo vemos lo explicamos en API de Pohoda: conectar su sistema y quién lo mantiene.
  • Un inicio de sesión real desde el primer día. Un inicio de sesión provisional sirve para una tarde. Es lo primero que hay que sustituir, porque decide qué puede ver el agente.
  • La tarea antes que el servidor. Construimos el servidor antes de saber qué tarea haría un agente con él cada día. El orden correcto es la tarea, luego las herramientas que necesita, luego el servidor.

Con franqueza: todavía no hemos tenido un servidor MCP remoto en producción. Todo lo anterior sobre Streamable HTTP y OAuth viene de la especificación, no de nuestros propios incidentes.

¿Qué herramientas debería recibir un agente?

Empiece solo con lectura y añada permisos de uno en uno. Nuestro punto de partida:

Tipo de herramientaEjemploNuestro punto de partida
Leerbuscar un pedido, listar envíos abiertosexponer, limitado a los datos del propio usuario
Proponerredactar una respuesta, sugerir un precioexponer, una persona aprueba
Escribirmodificar un registrosolo con aprobación y registro de auditoría
Borrar o enviarborrar, escribir a un cliente, pagarno exponer

Aquí vale la misma regla que usamos con nuestros propios agentes. Hacer merge, enviar y desplegar se queda en manos de una persona, y se impone por debajo del agente, no con una frase en su prompt. Cómo funciona eso en Claude Code lo explicamos en Hooks de Claude Code que no hacen nada en silencio.

Si viera otra solución más estable, más clara y más predecible, no construiría un agente.

Filip Papranec
Filip Papranec
Fundador de Digitaliko

¿Cuándo no debería crear un servidor MCP?

Un servidor MCP sirve para el caso en que un agente de IA decide qué acción tomar a continuación. Muchas tareas nunca lo necesitan.

No lo haga cuando:

  • Su propio código es el único que llama. Llame a su API directamente.
  • La tarea es una secuencia fija. Ahí una automatización normal gana a un agente.
  • Aún no hay una API limpia. Constrúyala primero.
  • Nadie es responsable del modelo de permisos. ¿En nombre de quién puede actuar el agente y qué puede hacer? Sin respuesta, no exponga escrituras.

Antes de poner en marcha un servidor MCP

¿Quiere que su sistema trabaje con agentes de IA?

Construimos agentes de IA y lo que necesitan por debajo, desde una API limpia hasta el servidor MCP encima, como parte de agentes de IA para empresas. Para un equipo que quiere agentes dentro de su propio proceso de desarrollo, vea AI-native SDLC para equipos de desarrollo. Desde 2023 hemos entregado más de 15 proyectos en producción.

Le respondemos en dos días laborables con unas preguntas sobre su trabajo. Después acordamos qué hacemos primero.

Si prefiere hablar primero, reserve una llamada inicial de 15 minutos.

¿Qué tarea de su sistema le daría primero a un agente?

En resumen

  • Un servidor MCP ofrece a los agentes de IA las herramientas de su sistema: cada una con nombre, descripción y esquema de entrada.
  • Empiece en local con stdio y credenciales del entorno. Pase a remoto solo con autorización basada en OAuth.
  • El código es poco. El trabajo de verdad es qué herramientas expone y con qué permisos.
  • Primero lectura, luego propuestas, escrituras con aprobación, nunca borrar ni enviar.
  • Si los pasos son siempre los mismos, no necesita ni un agente ni un servidor MCP.

Preguntas frecuentes

¿Qué es un servidor MCP?

Un programa que ofrece herramientas, datos y prompts a un cliente de IA mediante el Model Context Protocol. El agente ve cada herramienta por su nombre, descripción y esquema de entrada y decide cuándo llamarla. Su sistema queda detrás de su propio código.

¿Uso stdio o Streamable HTTP?

stdio cuando el servidor se ejecuta en la misma máquina que el cliente, por ejemplo una herramienta local para Claude Code. Streamable HTTP cuando se ejecuta en remoto para varios usuarios. Un servidor remoto necesita una autorización de verdad.

¿Cómo añado un servidor MCP a Claude Code?

Para un servidor local: claude mcp add <nombre> -- <comando>. Para uno remoto: claude mcp add --transport http <nombre> <url>. Los servidores que debe tener todo el equipo van en .mcp.json, en el repositorio.

¿Cómo se protege un servidor MCP?

En local, lea las credenciales del entorno. En remoto, siga la especificación de autorización de MCP, basada en OAuth 2.1, y compruebe que cada token se emitió para su servidor. Ofrezca las menos herramientas posibles, primero solo de lectura.

¿Necesito un servidor MCP para mi producto?

Solo si los agentes de IA deben trabajar con su sistema y elegir qué hacer. Si su propio código es el único que llama, o los pasos son siempre los mismos, una llamada directa a la API o una tarea programada es más sencilla y más fácil de probar.

Pregunte a una IA sobre este artículo

La IA también tiene en cuenta nuestros otros artículos y la experiencia de proyectos reales.

ChatGPTClaudePerplexity
Engineering

Más artículos

IA en el equipo de desarrollo

CLAUDE.md y AGENTS.md: reglas para el código de IA en equipo

Las reglas para el código de IA en un equipo van en el repositorio: un CLAUDE.md o AGENTS.md corto, lint y tests para lo más importante, revisión por alguien distinto del autor. Qué escribir, dónde y qué dejar fuera.

IA en el equipo de desarrollo

Cursor vs Claude Code: por qué apostamos por el terminal

Cursor vs Claude Code para un equipo, no un benchmark: Cursor es un editor con un agente dentro, Claude Code es un agente que funciona igual en un portátil, en CI y en un bucle en segundo plano. Por qué todo nuestro harness funciona sobre Claude Code y cuándo Cursor es mejor opción.

IA en el equipo de desarrollo

Claude Code skills y plugins: un mismo set en cada repo

Las skills de Claude Code son instrucciones en SKILL.md que el agente carga cuando una tarea las necesita. Un plugin entrega skills, agentes y hooks como una unidad. Cómo usamos un plugin en cada repo y qué se rompió por el camino.