{"_id":"@agarpac/mcp-core","_rev":"4-e9421d605aa68e356e3ffb8a95d3a3fd","name":"@agarpac/mcp-core","dist-tags":{"latest":"2.1.2"},"versions":{"2.0.0":{"name":"@agarpac/mcp-core","version":"2.0.0","keywords":["mcp","model-context-protocol","gateway","daemon","ai","claude","cursor","opencode"],"license":"MIT","_id":"@agarpac/mcp-core@2.0.0","maintainers":[{"name":"agarpac","email":"albertogp1991@gmail.com"}],"bin":{"mcp-core":"dist/cli/index.js","mcp-core-mcp":"dist/mcp/server.js"},"dist":{"shasum":"9e519981643fc0894decf891c1fc8bc347053eac","tarball":"https://registry.npmjs.org/@agarpac/mcp-core/-/mcp-core-2.0.0.tgz","fileCount":93,"integrity":"sha512-mFNpDTMt5yGVhuD+Bio87MWvPFG4dVOMs9QKbSJi+RNzHngV8BVMTfCETH9fw91r/JFbAxFDOn1RFCT7FrYaUA==","signatures":[{"sig":"MEUCIQD8vNmXbQtHQoa5mWipDyDZoYu9Zqwv8MTQuw1McVDXWAIgX93yQrP1Ej64XTl+Fj4Z71kY6BqwYf61NX6qkB7Yy1k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":581132},"type":"commonjs","engines":{"node":">=18"},"gitHead":"92505f6260beae9a3d3c5a7e8d9f9c402d589b4d","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && npm run build --prefix dashboard","setup":"npm install && npm install --prefix dashboard && npm run build && npm link","prepublishOnly":"npm run build"},"_npmUser":{"name":"agarpac","email":"albertogp1991@gmail.com"},"_npmVersion":"11.16.0","description":"Gateway MCP: una única entrada por cliente que reexpone todos tus backends con prefijo. Un daemon compartido, todas las tools disponibles en todos tus clientes de IA.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"cors":"^2.8.6","execa":"^9.6.1","dotenv":"^17.4.2","express":"^5.2.1","prompts":"^2.4.2","commander":"^14.0.3","@iarna/toml":"^2.2.5","jsonrpc-lite":"^2.2.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jsdom":"^29.0.2","vitest":"^4.1.4","supertest":"^7.2.2","typescript":"^6.0.3","@types/cors":"^2.8.19","@types/node":"^25.6.0","@types/express":"^5.0.6","@types/prompts":"^2.4.9","@types/supertest":"^7.2.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp-core_2.0.0_1784907167845_0.9188848622742498","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@agarpac/mcp-core","version":"2.1.0","keywords":["mcp","model-context-protocol","gateway","daemon","ai","claude","cursor","opencode"],"license":"MIT","_id":"@agarpac/mcp-core@2.1.0","maintainers":[{"name":"agarpac","email":"albertogp1991@gmail.com"}],"bin":{"mcp-core":"dist/cli/index.js","mcp-core-mcp":"dist/mcp/server.js"},"dist":{"shasum":"ab785245b55fb390f4cff14eef84d064c3747b8b","tarball":"https://registry.npmjs.org/@agarpac/mcp-core/-/mcp-core-2.1.0.tgz","fileCount":93,"integrity":"sha512-kVe4PgNc4ywQc+OxNTRRmdFO0sXnq1K7/kBzGSTPUb7ENrVjHrZuUuPdyjU4xJWgqPw1t+e+yFU0xqSl4k2/VQ==","signatures":[{"sig":"MEQCIHSJ0jr7GCK1o0sWoKU13VNnLlWOMijZstijs1nY97KCAiBR89tHNIfk0dZ/awDE6wDApygx/QtoTm8yld4CQApqww==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":591542},"type":"commonjs","engines":{"node":">=18"},"gitHead":"db2d3faa69c73fafdc6649e71036146c3687ca91","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && npm run build --prefix dashboard","setup":"npm install && npm install --prefix dashboard && npm run build && npm link","prepublishOnly":"npm run build"},"_npmUser":{"name":"agarpac","email":"albertogp1991@gmail.com"},"_npmVersion":"11.16.0","description":"Gateway MCP: una única entrada por cliente que reexpone todos tus backends con prefijo. Un daemon compartido, todas las tools disponibles en todos tus clientes de IA.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"cors":"^2.8.6","execa":"^9.6.1","dotenv":"^17.4.2","express":"^5.2.1","prompts":"^2.4.2","commander":"^14.0.3","@iarna/toml":"^2.2.5","jsonrpc-lite":"^2.2.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jsdom":"^29.0.2","vitest":"^4.1.4","supertest":"^7.2.2","typescript":"^6.0.3","@types/cors":"^2.8.19","@types/node":"^25.6.0","@types/express":"^5.0.6","@types/prompts":"^2.4.9","@types/supertest":"^7.2.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp-core_2.1.0_1785106538280_0.7439017992000352","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"@agarpac/mcp-core","version":"2.1.1","keywords":["mcp","model-context-protocol","gateway","daemon","ai","claude","cursor","opencode"],"license":"MIT","_id":"@agarpac/mcp-core@2.1.1","maintainers":[{"name":"agarpac","email":"albertogp1991@gmail.com"}],"bin":{"mcp-core":"dist/cli/index.js","mcp-core-mcp":"dist/mcp/server.js"},"dist":{"shasum":"1d06eb40a8ae990e83ceb8096f98091991b968d5","tarball":"https://registry.npmjs.org/@agarpac/mcp-core/-/mcp-core-2.1.1.tgz","fileCount":97,"integrity":"sha512-8CtYN7N34Ly+8HMsv3buFvtRTnvxMPhyLNCSED5CLaeM3N1zhFsY9k7Gvx7kpQ7PyvFN9isJrLzFPS3595jVVw==","signatures":[{"sig":"MEYCIQC1GbI09qmG3Rv8BLZOBIzvlRDQjFeB/BrHb3mUyNNE6AIhALwWW1roOvLI4ss7xLrw6a7MYXJTr9byr3yjSWLJ8dx+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":592831},"type":"commonjs","engines":{"node":">=18"},"gitHead":"00e830df3f35e4c6fc8af6b82f36537c49a6294e","scripts":{"test":"vitest run","build":"tsc -p tsconfig.build.json && npm run build --prefix dashboard","setup":"npm install && npm install --prefix dashboard && npm run build && npm link","prepublishOnly":"npm run build"},"_npmUser":{"name":"agarpac","email":"albertogp1991@gmail.com"},"_npmVersion":"11.16.0","description":"Gateway MCP: una única entrada por cliente que reexpone todos tus backends con prefijo. Un daemon compartido, todas las tools disponibles en todos tus clientes de IA.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"cors":"^2.8.6","execa":"^9.6.1","dotenv":"^17.4.2","express":"^5.2.1","prompts":"^2.4.2","commander":"^14.0.3","@iarna/toml":"^2.2.5","jsonrpc-lite":"^2.2.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jsdom":"^29.0.2","vitest":"^4.1.4","supertest":"^7.2.2","typescript":"^6.0.3","@types/cors":"^2.8.19","@types/node":"^25.6.0","@types/express":"^5.0.6","@types/prompts":"^2.4.9","@types/supertest":"^7.2.0","@testing-library/jest-dom":"^6.9.1"},"_npmOperationalInternal":{"tmp":"tmp/mcp-core_2.1.1_1785106946234_0.3649413300942841","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"@agarpac/mcp-core","version":"2.1.2","publishConfig":{"access":"public"},"description":"Gateway MCP: una única entrada por cliente que reexpone todos tus backends con prefijo. Un daemon compartido, todas las tools disponibles en todos tus clientes de IA.","license":"MIT","keywords":["mcp","model-context-protocol","gateway","daemon","ai","claude","cursor","opencode"],"bin":{"mcp-core":"dist/cli/index.js","mcp-core-mcp":"dist/mcp/server.js"},"engines":{"node":">=18"},"scripts":{"build":"tsc -p tsconfig.build.json && npm run build --prefix dashboard","setup":"npm install && npm install --prefix dashboard && npm run build && npm link","prepublishOnly":"npm run build","test":"vitest run"},"type":"commonjs","devDependencies":{"@testing-library/jest-dom":"^6.9.1","@types/cors":"^2.8.19","@types/express":"^5.0.6","@types/node":"^25.6.0","@types/prompts":"^2.4.9","@types/supertest":"^7.2.0","jsdom":"^29.0.2","supertest":"^7.2.2","tsx":"^4.21.0","typescript":"^6.0.3","vitest":"^4.1.4"},"dependencies":{"@iarna/toml":"^2.2.5","@modelcontextprotocol/sdk":"^1.29.0","commander":"^14.0.3","cors":"^2.8.6","dotenv":"^17.4.2","execa":"^9.6.1","express":"^5.2.1","jsonrpc-lite":"^2.2.0","prompts":"^2.4.2"},"gitHead":"20f4301fb5376822c636a0074f8518a91b3ca30a","_id":"@agarpac/mcp-core@2.1.2","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-nxmVq6L3/Rocy9l7GGWf2+r3NOuNawmAILpnOVHEudI5S7UKaxVI/UrNBIcjYqLxFaYWrHI8X0gNW+rYlnbKKQ==","shasum":"6535942f2afdfc3f807d5a1bbc6b5a187e475fe5","tarball":"https://registry.npmjs.org/@agarpac/mcp-core/-/mcp-core-2.1.2.tgz","fileCount":97,"unpackedSize":591858,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICZ4Z33pVVR6dd1mx3w9fVlfFxMa3kbELQ5OyEBc9s3UAiA/TN5Sm2QeLptAFEa2xOnq7K1JzqJAdFe8D1v6AZH4zg=="}]},"_npmUser":{"name":"agarpac","email":"albertogp1991@gmail.com"},"directories":{},"maintainers":[{"name":"agarpac","email":"albertogp1991@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-core_2.1.2_1785108603433_0.28934828086187303"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-24T15:32:47.695Z","modified":"2026-07-26T23:30:03.765Z","2.0.0":"2026-07-24T15:32:48.013Z","2.1.0":"2026-07-26T22:55:38.457Z","2.1.1":"2026-07-26T23:02:26.397Z","2.1.2":"2026-07-26T23:30:03.612Z"},"license":"MIT","keywords":["mcp","model-context-protocol","gateway","daemon","ai","claude","cursor","opencode"],"description":"Gateway MCP: una única entrada por cliente que reexpone todos tus backends con prefijo. Un daemon compartido, todas las tools disponibles en todos tus clientes de IA.","maintainers":[{"name":"agarpac","email":"albertogp1991@gmail.com"}],"readme":"# mcp-core ⚡️\n**Gateway MCP — un único punto de entrada para todos tus servidores**\n\n![MCP Core Dashboard](ui-preview2.png)\n\n`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.\n\nEl 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.\n\n---\n\n## ⚡ Quick Start\n\n```bash\n# 1) Instala el paquete\nnpm install -g @agarpac/mcp-core\n\n# 2) Inyecta el gateway en todos los clientes detectados. Pregunta, por cada\n#    servidor MCP que ya tuvieras, si migrarlo al registro central o dejarlo\n#    conectado directo al cliente. Deja un `.backup` de cada config.\nmcp-core init -i\n```\n\nSin `-i` no pregunta: migra todos. Si es una instalación limpia, sin servidores previos, ambos hacen lo mismo.\n\nCon 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`.\n\nOpcionales:\n\n```bash\nmcp-core install @modelcontextprotocol/server-memory  # añadir un servidor MCP\nmcp-core migrate --dry-run                            # mover servidores a ~/.mcp-core/servers/\nmcp-core ui                                           # dashboard web\n```\n\n### Con mise (o asdf / nvm)\n\nCambian dos cosas: el paquete necesita una exención para instalarse, y los clientes deben apuntar al shim en vez de al `PATH`.\n\n**1)** Declara el paquete en `~/.config/mise/config.toml`. Requiere mise **2026.7.14+**:\n\n```toml\n[tools]\n\"npm:@agarpac/mcp-core\" = { version = \"latest\", allow_low_downloads = true }\n```\n\n`allow_low_downloads` es obligatorio: aube rechaza los paquetes por debajo de 1000 descargas semanales. Afecta solo a este paquete.\n\n**2)** Instala y apunta los clientes al shim:\n\n```bash\nmise install\nmcp-core init -i --self-binary ~/.local/share/mise/shims/mcp-core-mcp\n```\n\nEl flag se pasa **una sola vez**: la ruta queda en `init.selfBinary` y los `init` siguientes la reutilizan.\n\nCon 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.\n\n> Si acabas de publicar una versión y `mise install` sigue trayendo la anterior, es la cuarentena `minimum_release_age`. Pide la exacta: `mise install npm:@agarpac/mcp-core@<versión>`.\n\n---\n\n## 🏗️ Arquitectura\n\n```\n Cursor           Claude Desktop       VS Code\n   │ stdio             │ stdio            │ stdio\n   ▼                   ▼                  ▼\nmcp-core-mcp       mcp-core-mcp       mcp-core-mcp   ← gateway shim (1 por cliente)\n   │                   │                  │\n   │         UNIX socket                  │\n   ▼                   ▼                  ▼\n┌────────────────────────────────────────────────┐\n│              mcp-daemon (1 proceso)            │\n│  ┌─────────────┐  ┌────────────────┐           │\n│  │server-memory│  │server-filesyst.│  …        │\n│  └─────────────┘  └────────────────┘           │\n└────────────────────────────────────────────────┘\n```\n\n- **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.\n- **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_changed` reciben las nuevas tools sin reiniciar.\n- **CLI (`mcp-core`)**: instalar, desinstalar, migrar, inicializar y lanzar el dashboard.\n\n### Prefijado de capabilities\n\n| Capability | Prefijo | Ejemplo |\n|---|---|---|\n| Tools | `<backend>__<name>` | `memory__store`, `mcp_core__list_servers` |\n| Resources | URI `mcp-core://<backend>/<uri>` | `mcp-core://filesystem/file:///foo` |\n| Prompts | `<backend>__<name>` | `github__create_issue` |\n\nLas 5 tools de control del gateway viven bajo el prefijo `mcp_core__`: `install_server`, `uninstall_server`, `list_servers`, `toggle_client`, `get_daemon_status`.\n\n---\n\n## 💻 Clientes soportados\n\n`mcp-core init` detecta e inyecta la entrada del gateway automáticamente en:\n\n| Cliente | Path (macOS) | Path (Linux) | Clave raíz |\n|---|---|---|---|\n| **Cursor** | `~/.cursor/mcp.json` | `~/.cursor/mcp.json` | `mcpServers` |\n| **VS Code / Copilot** | `~/Library/Application Support/Code/User/mcp.json` | `~/.config/Code/User/mcp.json` | `servers` |\n| **Claude Desktop** | `~/Library/Application Support/Claude/claude_desktop_config.json` | — | `mcpServers` |\n| **Claude Code** | `~/.claude.json` | `~/.claude.json` | `mcpServers` |\n| **OpenCode (cli)** | `~/.config/opencode/opencode.json` | `~/.config/opencode/opencode.json` | `mcp` |\n| **Codex / ChatGPT Desktop** | `~/.codex/config.toml` | `~/.codex/config.toml` | `mcp_servers` |\n\n> **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.\n\n> **Windows**: fuera del alcance actual.\n\n---\n\n## 🛠️ Comandos (CLI)\n\n```bash\n# Bootstrap del gateway: inyecta mcp-core en todos los clientes y migra entradas legacy\nmcp-core init [--clients cursor,claudeCode] [-i|--interactive] [--self-binary <path>]\n\n# Instalar un servidor MCP\nmcp-core install <npm-pkg | git-url | uvx-pkg> [opciones]\n  --name <alias>              alias del servidor\n  --env KEY=value             variable de entorno (repetible)\n  --method auto|npm|uvx|git   método de instalación (por defecto: auto)\n  --no-validate               saltarse el handshake MCP de verificación\n\n# Desinstalar un servidor\nmcp-core uninstall <server-name>\n\n# Migrar servidores legacy al directorio gestionado por mcp-core\nmcp-core migrate [--dry-run]\n\n# Estado: daemon, servidores registrados y su estado en vivo, runtimes\nmcp-core status\n\n# Comandos del daemon\nmcp-core daemon stop\nmcp-core daemon restart\nmcp-core daemon logs [server-name] [-f] [-n <N>]\n\n# Dashboard web local\nmcp-core ui\n```\n\n### Instalación de paquetes npm\n\nPara 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:\n\n```text\n✅ Installed server-memory\n   Validated: 9 tools (154ms)\n```\n\nEl 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.\n\n### Environment variables\n\n```bash\nmcp-core install @modelcontextprotocol/server-github \\\n  --env GITHUB_TOKEN=ghp_xxx\n```\n\n### Soporte uvx (Python)\n\n`--method uvx` fuerza el runner; `auto` lo detecta para paquetes con prefijo `mcp-server-`:\n\n```bash\nmcp-core install mcp-server-postgres --env DATABASE_URL=postgres://localhost/mydb\n```\n\n### init interactivo (`-i` / `--interactive`)\n\nPor 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).\n\n```bash\nmcp-core init -i\n```\n\nLos 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`.\n\n### `--self-binary`\n\nEscribe 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](#con-mise-o-asdf--nvm).\n\n```bash\nmcp-core init --self-binary /ruta/absoluta/a/mcp-core-mcp\n```\n\n- La ruta debe ser absoluta, existir y ser ejecutable; si no, el comando falla sin tocar ninguna configuración.\n- Se guarda en `init.selfBinary` (`~/.mcp-core/config.json`) y los `init` siguientes la reutilizan. Para cambiarla, vuelve a pasar el flag; para desactivarla, borra esa clave.\n- Solo con `init.selfBinary` definido reescribe `init` una entrada de gateway existente. Sin él respeta la que haya, así que una configuración editada a mano no se pierde.\n\n### init.preserveDirect\n\nPor 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.\n\nConfigúralo en `~/.mcp-core/config.json`:\n\n```json\n{ \"init\": { \"preserveDirect\": [\"codegraph\"] } }\n```\n\nLos 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>`.\n\nEl 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.\n\n### mcp-core migrate\n\nSi 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.\n\n`mcp-core migrate` detecta estos servidores y los reinstala correctamente en `~/.mcp-core/servers/`, haciéndolos independientes de esos clientes:\n\n```bash\n# Ejecutar la migración\nmcp-core migrate\n```\n\nAntes 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:\n\n```bash\nmcp-core migrate --dry-run\n```\n\nEjemplo de salida:\n\n```text\nServers to migrate to ~/.mcp-core/servers/:\n\n  context7            npm install @upstash/context7-mcp\n  playwright          npm install @playwright/mcp\n\nSkipped:\n\n  engram              (not an npm package (system binary or local path))\n\n🎉 Migration complete. 2 migrated, 0 failed.\n```\n\nLos servidores de tipo sistema (Homebrew, binarios del PATH) se omiten automáticamente — `mcp-core` no toca lo que no instaló.\n\n---\n\n## 🎨 Web Dashboard\n\n`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.\n\n### Secciones\n\n- **System Panel** — OS, Node, estado del daemon y grid de runtimes detectados.\n- **Advanced Installer** — instalar con stream SSE de progreso en tiempo real.\n- **Active MCP Servers** — lista de backends registrados con:\n  - **Estado en vivo** (polling cada 5s): `● running` proceso activo, `● cached` proceso parado pero capabilities en memoria (se relanza automáticamente al recibir la primera llamada), `● idle` sin proceso y sin capabilities (solo ocurre antes del primer arranque del daemon en una sesión).\n  - **Running from** — comando exacto que usa el daemon para arrancar el servidor.\n  - **Health** — handshake MCP bajo demanda: muestra número de tools y, al hacer click, la lista de nombres.\n  - **Logs** — últimas 100 líneas del stderr del servidor en un modal.\n  - **Re-validate / Uninstall** — validación manual y desinstalación con confirmación.\n- **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.\n\nLa UI está endurecida contra DNS rebinding: bind a `127.0.0.1`, validación de `Host:`, CORS whitelist, token Bearer obligatorio.\n\n### Endpoints de la API\n\n| Método | Ruta | Descripción |\n|---|---|---|\n| GET | `/api/system` | Estado del sistema, runtimes y ruta del config |\n| GET | `/api/servers` | Servidores registrados |\n| GET | `/api/clients` | Clientes de IA detectados con estado del gateway |\n| GET | `/api/daemon/status` | Ping al daemon + PID + uptime |\n| GET | `/api/daemon/active-servers` | Procesos activos y backends en caché en el daemon |\n| GET | `/api/logs/:name?lines=N` | Últimas N líneas del log de stderr de un servidor |\n| GET | `/api/events` | SSE stream de progreso |\n| POST | `/api/install` | `{ source, name?, env?, method?, validate? }` |\n| POST | `/api/uninstall` | `{ name }` |\n| POST | `/api/validate` | `{ name }` → `{ success, tools, toolNames, latencyMs }` |\n\n---\n\n## 📂 Directorios\n\n```text\n~/.mcp-core/\n├── config.json          # Registro central de servidores MCP\n├── daemon.sock          # UNIX socket gateway ↔ daemon\n├── daemon.pid           # PID lock\n├── logs/                # Stderr de cada backend (un .log por servidor)\n└── servers/             # Paquetes npm instalados localmente\n    ├── package.json     # Dependencias npm compartidas\n    └── node_modules/    # node_modules compartido entre todos los servidores\n```\n\n---\n\n## 🧪 Desarrollo\n\n```bash\ngit clone <repo> && cd mcp-core\nnpm run setup       # install + build + npm link\nnpx vitest run      # Suite completa (258 tests)\n```\n\n`npm run setup` deja los dos binarios (`mcp-core`, `mcp-core-mcp`) disponibles en el PATH.\n\n---\n\n## Licencia\nMIT\n","readmeFilename":"README.md"}