Gateway MCP — un único punto de entrada para todos tus servidores
mcp-core pone una sola entrada en cada cliente de IA (Cursor, Claude Desktop, VS Code…) y desde ahí expone todos los servidores MCP que tengas instalados. En lugar de que cada cliente gestione sus propias conexiones, hay un daemon central que mantiene una instancia por servidor — compartida entre todos los clientes.
El cliente ve herramientas prefijadas por servidor: context7__get_library_docs, playwright__browser_navigate, mcp_core__install_server, etc. Al instalar un servidor nuevo, aparece en todos los clientes automáticamente sin tocar ningún archivo de configuración.
# 1) Instala el paquete
npm install -g @agarpac/mcp-core
# 2) Inyecta el gateway en todos los clientes detectados. Pregunta, por cada
# servidor MCP que ya tuvieras, si migrarlo al registro central o dejarlo
# conectado directo al cliente. Deja un `.backup` de cada config.
mcp-core init -iSin -i no pregunta: migra todos. Si es una instalación limpia, sin servidores previos, ambos hacen lo mismo.
Con eso ya funciona. El daemon arranca solo cuando el primer cliente conecta y queda vivo en segundo plano; no hace falta reiniciar el cliente si soporta tools/list_changed.
Opcionales:
mcp-core install @modelcontextprotocol/server-memory # añadir un servidor MCP
mcp-core migrate --dry-run # mover servidores a ~/.mcp-core/servers/
mcp-core ui # dashboard webCambian dos cosas: el paquete necesita una exención para instalarse, y los clientes deben apuntar al shim en vez de al PATH.
1) Declara el paquete en ~/.config/mise/config.toml. Requiere mise 2026.7.14+:
[tools]
"npm:@agarpac/mcp-core" = { version = "latest", allow_low_downloads = true }allow_low_downloads es obligatorio: aube rechaza los paquetes por debajo de 1000 descargas semanales. Afecta solo a este paquete.
2) Instala y apunta los clientes al shim:
mise install
mcp-core init -i --self-binary ~/.local/share/mise/shims/mcp-core-mcpEl flag se pasa una sola vez: la ruta queda en init.selfBinary y los init siguientes la reutilizan.
Con asdf o nvm, sustituye el shim por la ruta absoluta equivalente. No uses la del PATH (.../installs/node/<versión>/bin): cambia al actualizar node y las apps GUI no la ven.
Si acabas de publicar una versión y
mise installsigue trayendo la anterior, es la cuarentenaminimum_release_age. Pide la exacta:mise install npm:@agarpac/mcp-core@<versión>.
Cursor Claude Desktop VS Code
│ stdio │ stdio │ stdio
▼ ▼ ▼
mcp-core-mcp mcp-core-mcp mcp-core-mcp ← gateway shim (1 por cliente)
│ │ │
│ UNIX socket │
▼ ▼ ▼
┌────────────────────────────────────────────────┐
│ mcp-daemon (1 proceso) │
│ ┌─────────────┐ ┌────────────────┐ │
│ │server-memory│ │server-filesyst.│ … │
│ └─────────────┘ └────────────────┘ │
└────────────────────────────────────────────────┘
- Gateway shim (
mcp-core-mcp): binario MCP ligero. Se conecta al daemon, suscribe a cambios de backends y reexpone todas las tools/resources/prompts con prefijo (<backend>__<name>). Si el daemon no está corriendo, lo arranca automáticamente. - Daemon: supervisa y multiplexa backends MCP. Cuando el gateway conecta, arranca todos los backends configurados para descubrir sus capabilities. Si un backend lleva ~5 minutos sin recibir llamadas, el daemon mata su proceso automáticamente para ahorrar RAM (las capabilities quedan en caché para relanzarlo al instante). Notifica a todos los shims cuando se instala o desinstala un servidor — los clientes que soportan
list_changedreciben las nuevas tools sin reiniciar. - CLI (
mcp-core): instalar, desinstalar, migrar, inicializar y lanzar el dashboard.
| Capability | Prefijo | Ejemplo |
|---|---|---|
| Tools | <backend>__<name> |
memory__store, mcp_core__list_servers |
| Resources | URI mcp-core://<backend>/<uri> |
mcp-core://filesystem/file:///foo |
| Prompts | <backend>__<name> |
github__create_issue |
Las 5 tools de control del gateway viven bajo el prefijo mcp_core__: install_server, uninstall_server, list_servers, toggle_client, get_daemon_status.
mcp-core init detecta e inyecta la entrada del gateway automáticamente en:
| Cliente | Path (macOS) | Path (Linux) | Clave raíz |
|---|---|---|---|
| Cursor | ~/.cursor/mcp.json |
~/.cursor/mcp.json |
mcpServers |
| VS Code / Copilot | ~/Library/Application Support/Code/User/mcp.json |
~/.config/Code/User/mcp.json |
servers |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json |
— | mcpServers |
| Claude Code | ~/.claude.json |
~/.claude.json |
mcpServers |
| OpenCode (cli) | ~/.config/opencode/opencode.json |
~/.config/opencode/opencode.json |
mcp |
| Codex / ChatGPT Desktop | ~/.codex/config.toml |
~/.codex/config.toml |
mcp_servers |
Codex: el archivo
~/.codex/config.toml(formato TOML) lo comparten la CLI de Codex y la pestaña Codex de la app ChatGPT Desktop; una sola entrada cubre ambos. El chat normal de ChatGPT queda fuera de alcance: es remoto y no se automatiza mediante un archivo local.
Windows: fuera del alcance actual.
# Bootstrap del gateway: inyecta mcp-core en todos los clientes y migra entradas legacy
mcp-core init [--clients cursor,claudeCode] [-i|--interactive] [--self-binary <path>]
# Instalar un servidor MCP
mcp-core install <npm-pkg | git-url | uvx-pkg> [opciones]
--name <alias> alias del servidor
--env KEY=value variable de entorno (repetible)
--method auto|npm|uvx|git método de instalación (por defecto: auto)
--no-validate saltarse el handshake MCP de verificación
# Desinstalar un servidor
mcp-core uninstall <server-name>
# Migrar servidores legacy al directorio gestionado por mcp-core
mcp-core migrate [--dry-run]
# Estado: daemon, servidores registrados y su estado en vivo, runtimes
mcp-core status
# Comandos del daemon
mcp-core daemon stop
mcp-core daemon restart
mcp-core daemon logs [server-name] [-f] [-n <N>]
# Dashboard web local
mcp-core uiPara paquetes npm, mcp-core install descarga e instala el paquete en ~/.mcp-core/servers/node_modules/ (un node_modules compartido entre todos los servidores). El binario se resuelve automáticamente desde el package.json del paquete:
✅ Installed server-memory
Validated: 9 tools (154ms)
El comando almacenado apunta al path local: node ~/.mcp-core/servers/node_modules/@modelcontextprotocol/server-memory/dist/index.js. No depende de npm ni de red tras la instalación. Al desinstalar, se ejecuta npm uninstall para limpiar el node_modules compartido.
mcp-core install @modelcontextprotocol/server-github \
--env GITHUB_TOKEN=ghp_xxx--method uvx fuerza el runner; auto lo detecta para paquetes con prefijo mcp-server-:
mcp-core install mcp-server-postgres --env DATABASE_URL=postgres://localhost/mydbPor defecto, mcp-core init es autónomo: migra todos los servidores MCP no-gateway de cada cliente al registro central sin preguntar. Con -i (o --interactive) el comando pregunta, una vez por cada MCP encontrado, si quieres Migrar a mcp-core (opción por defecto) o Dejar directo (lo sigue gestionando el cliente, fuera de mcp-core).
mcp-core init -iLos servidores que marques como «Dejar directo» se guardan en init.preserveDirect del config global (~/.mcp-core/config.json); el resto del flujo autónomo se ejecuta igual y los deja intactos en la configuración del cliente. Cada nombre se pregunta una sola vez aunque aparezca en varios clientes, y los nombres que ya estén en init.preserveDirect no se vuelven a preguntar. Si cancelas (Ctrl-C / ESC) no se realiza ningún cambio. El modo interactivo requiere un terminal (TTY); si la salida está redirigida (CI, pipes) el comando falla con error en lugar de migrarlo todo sin preguntar, que sería justo lo contrario de lo que pediste con -i.
Escribe una ruta absoluta en la configuración de los clientes en lugar del nombre mcp-core-mcp resuelto por PATH. Necesario cuando el binario no está en un directorio visible para todo el sistema — ver Con mise.
mcp-core init --self-binary /ruta/absoluta/a/mcp-core-mcp- La ruta debe ser absoluta, existir y ser ejecutable; si no, el comando falla sin tocar ninguna configuración.
- Se guarda en
init.selfBinary(~/.mcp-core/config.json) y losinitsiguientes la reutilizan. Para cambiarla, vuelve a pasar el flag; para desactivarla, borra esa clave. - Solo con
init.selfBinarydefinido reescribeinituna entrada de gateway existente. Sin él respeta la que haya, así que una configuración editada a mano no se pierde.
Por defecto, mcp-core init migra todos los servidores MCP no-gateway de cada cliente al registro central. init.preserveDirect es una lista global de nombres de servidor que deben quedar conectados directamente al cliente en lugar de migrarse. Los servidores cuya clave de configuración coincida con una entrada de esta lista nunca se importan al registro y permanecen intactos en la configuración del cliente, junto a la entrada del gateway mcp-core inyectada.
Configúralo en ~/.mcp-core/config.json:
{ "init": { "preserveDirect": ["codegraph"] } }Los nombres se comparan con la clave del servidor tal como aparece en la configuración del cliente. La semántica es solo-proteger: preserveDirect únicamente evita migraciones futuras. No elimina ni revierte un servidor que ya fue migrado al registro en una ejecución anterior de init; para revertir esos, usa manualmente mcp-core uninstall <server-name>.
El comando mcp-core migrate también obvia los servidores listados en preserveDirect: aunque estuvieran en el registro, no se reinstalan en ~/.mcp-core/servers/, respetando la intención de mantenerlos conectados directamente al cliente.
Si tenías servidores MCP configurados directamente en los clientes (Cursor, VS Code, etc.) antes de instalar mcp-core, el comando init los importa al registro central conservando su comando original, que puede seguir apuntando a un node_modules externo.
mcp-core migrate detecta estos servidores y los reinstala correctamente en ~/.mcp-core/servers/, haciéndolos independientes de esos clientes:
# Ejecutar la migración
mcp-core migrateAntes de migrar, usa --dry-run para ver exactamente qué se haría sin tocar nada. Es útil para revisar qué paquetes se instalarán y qué servidores se omitirán, sin riesgo:
mcp-core migrate --dry-runEjemplo de salida:
Servers to migrate to ~/.mcp-core/servers/:
context7 npm install @upstash/context7-mcp
playwright npm install @playwright/mcp
Skipped:
engram (not an npm package (system binary or local path))
🎉 Migration complete. 2 migrated, 0 failed.
Los servidores de tipo sistema (Homebrew, binarios del PATH) se omiten automáticamente — mcp-core no toca lo que no instaló.
mcp-core ui levanta un Express en loopback con token aleatorio. Ábrelo en el navegador con la URL que imprime en consola y ciérralo con Ctrl+C cuando no lo necesites.
- System Panel — OS, Node, estado del daemon y grid de runtimes detectados.
- Advanced Installer — instalar con stream SSE de progreso en tiempo real.
- Active MCP Servers — lista de backends registrados con:
- Estado en vivo (polling cada 5s):
● runningproceso activo,● cachedproceso parado pero capabilities en memoria (se relanza automáticamente al recibir la primera llamada),● idlesin proceso y sin capabilities (solo ocurre antes del primer arranque del daemon en una sesión). - Running from — comando exacto que usa el daemon para arrancar el servidor.
- Health — handshake MCP bajo demanda: muestra número de tools y, al hacer click, la lista de nombres.
- Logs — últimas 100 líneas del stderr del servidor en un modal.
- Re-validate / Uninstall — validación manual y desinstalación con confirmación.
- Estado en vivo (polling cada 5s):
- AI Clients — detecta automáticamente los clientes de IA instalados (Cursor, VS Code, Claude Code, Codex…) y muestra si el gateway está inyectado en cada uno.
La UI está endurecida contra DNS rebinding: bind a 127.0.0.1, validación de Host:, CORS whitelist, token Bearer obligatorio.
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/system |
Estado del sistema, runtimes y ruta del config |
| GET | /api/servers |
Servidores registrados |
| GET | /api/clients |
Clientes de IA detectados con estado del gateway |
| GET | /api/daemon/status |
Ping al daemon + PID + uptime |
| GET | /api/daemon/active-servers |
Procesos activos y backends en caché en el daemon |
| GET | /api/logs/:name?lines=N |
Últimas N líneas del log de stderr de un servidor |
| GET | /api/events |
SSE stream de progreso |
| POST | /api/install |
{ source, name?, env?, method?, validate? } |
| POST | /api/uninstall |
{ name } |
| POST | /api/validate |
{ name } → { success, tools, toolNames, latencyMs } |
~/.mcp-core/
├── config.json # Registro central de servidores MCP
├── daemon.sock # UNIX socket gateway ↔ daemon
├── daemon.pid # PID lock
├── logs/ # Stderr de cada backend (un .log por servidor)
└── servers/ # Paquetes npm instalados localmente
├── package.json # Dependencias npm compartidas
└── node_modules/ # node_modules compartido entre todos los servidores
git clone <repo> && cd mcp-core
npm run setup # install + build + npm link
npx vitest run # Suite completa (258 tests)npm run setup deja los dos binarios (mcp-core, mcp-core-mcp) disponibles en el PATH.
MIT
