¿Qué herramientas MCP tienen realmente cargadas tus agentes?
Hoy ningún dev puede responderlo con certeza. Los servidores MCP viven repartidos
en varios archivos de config (Claude Code, Claude Desktop, Cursor, VS Code) y lo
único que ves es el nombre del servidor, nunca las tools que expone.
mcp-inventory descubre esos configs, se conecta a cada servidor declarado, hace
el handshake MCP y pide tools/list. El resultado es un inventario real, medido —
no una suposición.
npx mcp-inventorySin instalación previa. Solo necesitás Node.js ≥ 18.
5 servidores · 41 herramientas
Claude Code (global)
context7 2 tools stdio
playwright 24 tools stdio
sequential-thinking 1 tool stdio
obsidian-vault 14 tools stdio
Claude Code (project: /Users/jose)
github — error: missing required Authorization header
Un servidor que falla (falta credencial, binario inexistente, se cuelga) aparece como error en su fila y no tumba el resto de la corrida.
Un servidor MCP puede cambiar sus tools bajo tus pies entre una corrida y otra:
aparece/desaparece un servidor, se agrega/elimina una tool, o una tool cambia su
description o su inputSchema (vector de prompt injection). mcp-inventory
guarda un baseline que vos aprobás y te avisa cuando algo cambia.
npx mcp-inventory lock # aprueba el estado actual → escribe mcp-inventory.lock
npx mcp-inventory check # compara el estado actual vs el baseline✗ drift detectado · 2 cambios
+ tool nueva: playwright @ ~/.claude.json → browser_teleport
~ tool cambiada: context7 @ ~/.claude.json → query-docs
- Commiteá
mcp-inventory.locka tu repo: es el baseline compartido del equipo. checksale con exit code1si hay drift,0si no,2ante error → úsalo en CI o en un pre-commit hook.- Un servidor que no responde ahora (ej: falta credencial) se reporta como
unreachable, no como "tools eliminadas". El drift real no se confunde con ruido de configuración.
| Flag | Descripción |
|---|---|
--json |
Salida estructurada (inventario y check) |
--timeout=<ms> |
Timeout por servidor (default: 5000) |
--lockfile=<p> |
Ruta del lockfile (default: mcp-inventory.lock) |
-h, --help |
Ayuda |
npx mcp-inventory --jsonBusca configs de MCP en las ubicaciones estándar por SO de cada cliente, más los archivos de proyecto del directorio actual:
| Cliente | Ubicación |
|---|---|
| Claude Code | ~/.claude.json (global + servers por proyecto anidados) |
| Claude Desktop | claude_desktop_config.json (macOS / Linux / Windows) |
| Cursor | ~/.cursor/mcp.json, ./.cursor/mcp.json |
| VS Code | mcp.json de usuario, ./.vscode/mcp.json (clave servers) |
| Proyecto | ./.mcp.json |
Cubre los transportes stdio y Streamable HTTP. El transporte legacy HTTP+SSE (protocolo 2024-11-05) queda fuera de esta fase.
- Solo lectura sobre los configs. Nunca los escribe ni modifica.
- El único archivo que escribe es su propio
mcp-inventory.lock, y solo con el comandolock. - Nunca ejecuta herramientas (
tools/call): soloinitialize+tools/list. - Nada cuelga la corrida: el timeout por servidor lo garantiza.
- Sin telemetría, sin red propia. Todo local.
- Fase 0 — inventario (descubrir →
tools/list→ imprimir). ✅ - Fase 1 — lockfile + detección de cambios (
lock/check). ✅ - Backlog: proxy / interceptación de tráfico, políticas / bloqueo, dashboard.
Cubre los transportes stdio y Streamable HTTP; el legacy HTTP+SSE
(2024-11-05) queda fuera. Un límite deliberado: los archivos de proyecto se
buscan solo en el directorio actual, no en un crawl de todo el disco (los
servidores de Claude Code sí salen completos porque van en ~/.claude.json).
git clone https://github.com/JoseFredes/mcp-inventory
cd mcp-inventory
npm install
npm run build
node dist/cli.jsMIT
{ "summary": { "servers": 5, "tools": 41, "ok": 4, "failed": 1 }, "servers": [ { "name": "context7", "client": "Claude Code (global)", "source": "/Users/jose/.claude.json", "transport": "stdio", "ok": true, "toolCount": 2, "tools": ["resolve-library-id", "query-docs"], "serverInfo": { "name": "context7", "version": "1.0.0" } } // ... ] }