MCP Inspector con npx y CLI: cómo probar un servidor MCP
MCP Inspector v2 hace de cliente para que puedas probar un servidor MCP por separado. Este artículo muestra cómo lanzarlo con npx, pasar argumentos y variables de entorno, usar un archivo de configuración, llamar a herramientas desde la CLI con argumentos JSON, leer los códigos de salida, ejecutar comprobaciones en CI con jq y corregir errores de stdout y de transporte.
Un servidor MCP puede arrancar sin un solo error y aun así no servir de nada. El proceso está en marcha, el registro no muestra nada y el cliente al que lo conectas muestra una lista de herramientas vacía o un mensaje vago de "failed to connect". Antes de culpar al cliente, prueba el servidor por separado. MCP Inspector es la herramienta oficial del proyecto Model Context Protocol para ese trabajo: hace de cliente, realiza el handshake y te permite listar y llamar a todo lo que expone tu servidor. Este artículo muestra cómo lanzarlo con npx, cómo manejarlo desde la CLI, cómo leer sus códigos de salida y cómo corregir los errores que más tiempo hacen perder.
💡 Comprobación de versión: La mayoría de tutoriales en línea describen Inspector v1. La última versión en npm en el momento de escribir esto es 2.9.0, y la v2 cambió los puertos, las variables de entorno, los flags y los códigos de salida. Todos los comandos de abajo siguen la documentación de la v2.
Qué hace MCP Inspector
Inspector es un cliente MCP pensado para depurar. Arranca tu servidor (stdio) o se conecta a él (HTTP o SSE), ejecuta el handshake initialize y te muestra exactamente lo que devuelve. No hay ningún modelo de lenguaje en medio, así que cuando algo falla sabes que el problema está en el servidor o en la conexión, no en el comportamiento del prompt.
El handshake que comprueba
La primera llamada, initialize, demuestra que el servidor habla MCP. La respuesta trae cuatro datos que conviene leer línea por línea:
serverInfo: el nombre y la versión que informa tu servidor.
protocolVersion: la revisión del protocolo que ambas partes acordaron.
capabilities: qué funciones existen, como herramientas, recursos y prompts.
instructions: texto opcional que el servidor entrega a los clientes.
Si capabilities no tiene una entrada tools, ningún cliente mostrará una sola herramienta, por muchas que hayas registrado en el código. Esa única comprobación explica una buena parte de los casos de "mis herramientas no aparecen".
Interfaz web, CLI y TUI
Un paquete, tres interfaces. El flag del modo debe ir primero, justo después del nombre del paquete.
Modo
Comando
Ideal para
Interfaz web
npx @modelcontextprotocol/inspector
Probar un servidor a mano
CLI
npx @modelcontextprotocol/inspector --cli
Scripts, comprobaciones rápidas, CI
TUI
npx @modelcontextprotocol/inspector --tui
Quedarte dentro de la terminal
Usa la interfaz web mientras construyes y la CLI cuando necesites una respuesta que puedas repetir.
Lánzalo con npx
No hay nada que instalar. npx descarga el paquete, lo ejecuta y pasa todo lo que va después del nombre del paquete al servidor que quieres probar. Una primera ejecución sensata lleva una línea y un minuto.
Versión de Node y puertos
La v2 necesita Node.js 22.19.0 o posterior. Ejecuta node --version antes que nada, porque un entorno de ejecución antiguo es lo primero que hay que descartar.
Los cambios de puertos y variables afectan a quien sigue publicaciones antiguas, así que aquí tienes la comparativa breve:
Ajuste
Inspector v1
Inspector v2
Node.js
22.7.5 o posterior
22.19.0 o posterior
Puerto de la interfaz web
6274
6274
Puerto del proxy
6277
Eliminado, no hay proxy
Variable del token de autenticación
MCP_PROXY_AUTH_TOKEN
MCP_INSPECTOR_API_TOKEN (el nombre antiguo sigue funcionando como alternativa)
Archivo de configuración
--config, solo lectura
--config (solo lectura) o --catalog (editable)
Argumentos de herramientas
--tool-arg
--tool-arg y --tool-args-json
Llamada a herramienta fallida
La cadena de comandos seguía
El código de salida 5 la detiene
Cambia el puerto de la interfaz web con CLIENT_PORT, un entero fijo entre 1 y 65535. La v2 también reserva el 6275 para el sandbox de MCP Apps y el 6278 para el servidor de origen de la aplicación, así que mantén ambos libres.
Un servidor TypeScript sin paso de compilación funciona igual, por ejemplo npx @modelcontextprotocol/inspector tsx src/index.ts. La mayoría de proyectos envuelven la línea en un script de npm para que todo el equipo ejecute el mismo comando:
💡 El doble guion cambia de significado. En el modo web y TUI, todo lo que va después de -- llega a tu servidor. En el modo CLI, todo lo que va antes de -- es el destino y todo lo que va después es una opción de Inspector. En el modo CLI, el comando del servidor también debe ir primero: --cli --method tools/list node build/index.js descarta el destino en silencio.
El token detrás de la interfaz
La v2 crea un token de API aleatorio en cada arranque y lo exige en todas las rutas /api/*. Una página abierta sin él se rechaza. Define MCP_INSPECTOR_API_TOKEN tú mismo si quieres un valor estable, y reinicia si una pestaña se queja, porque el token antiguo murió con el proceso anterior.
El servidor web escucha por defecto en 127.0.0.1 mediante HOST. Abrirlo a otras interfaces requiere un DANGEROUSLY_BIND_ALL_INTERFACES explícito, y DANGEROUSLY_OMIT_AUTH=true desactiva por completo la comprobación del token. Inspector arranca procesos locales en tu nombre, así que trata el token como una contraseña y no dejes estas dos excepciones en equipos compartidos.
Usar un archivo de configuración
Escribir el comando se vuelve pesado cuando un servidor necesita tres argumentos y dos variables de entorno. Guárdalos en un archivo y elige el servidor por su nombre. Existen dos flags, y son excluyentes:
Flag
Lo escribe Inspector
Si falta el archivo
--config <path>
No, solo lectura
Error
--catalog <path>
Sí, editable en la interfaz web
Se crea con datos iniciales
El catálogo por defecto está en ~/.mcp-inspector/mcp.json. Ninguno de los dos flags puede combinarse con un destino ad hoc en la misma línea de comandos.
Mantén command y cada elemento de args como entradas separadas. Inspector los lanza directamente en lugar de unirlos en una sola cadena, lo que conserva los límites de los argumentos cuando una ruta contiene espacios.
--server solo selecciona un servidor en el modo CLI. El cliente web avisa e ignora la opción al cargar un archivo, y la TUI la rechaza como opción desconocida.
Probar un servidor MCP desde la CLI
El modo CLI prescinde del navegador e imprime la respuesta en stdout, lo que lo convierte en la herramienta adecuada para comprobaciones rápidas y para todo lo que quieras automatizar. Cada comando tiene la misma forma: primero el destino, después --method y luego lo que necesite ese método.
Lista primero las herramientas
Empieza siempre preguntando qué cree el servidor que ofrece:
Cambia el método por resources/list o prompts/list para comprobar las otras dos funciones. Un servidor remoto necesita una dirección y un transporte, y un token bearer si está protegido:
Compara los nombres de la salida con lo que espera tu cliente. Una herramienta registrada como generateImage pero solicitada como generate_image es un caso clásico, y basta un comando para detectarlo.
Llama a una herramienta con argumentos JSON
npx @modelcontextprotocol/inspector --cli node build/index.js \
--method tools/call \
--tool-name generate_image \
--tool-args-json '{"prompt":"a ceramic mug on an oak desk, soft window light","aspect_ratio":"16:9"}'
--tool-args-json recibe un objeto JSON y no aplica ninguna conversión, así que los números siguen siendo números y los booleanos siguen siendo booleanos. Para una prueba rápida, --tool-arg prompt="a red door" es más corto, pero sus valores se interpretan como JSON cuando son válidos, así que una cadena que parece un número se convierte en número. Cuando los tipos importan, usa la forma JSON.
💡 Nota para Windows: PowerShell 5.1 de Windows elimina las comillas dobles internas del JSON que se pasa a programas nativos. Escapa cada una con una barra invertida, o usa --tool-arg para valores cortos.
Lee los códigos de salida
La CLI informa del resultado en su código de salida, de modo que un script nunca tiene que extraer texto para saber qué ocurrió.
Código
Significado
0
Éxito
1
Error de uso o fallo inesperado
2
No se encontró ninguna MCP App (sondeo de --app-info)
3
Se requiere autenticación
4
Servidor inaccesible: DNS, tiempo agotado o conexión rechazada
5
La herramienta devolvió isError: true, o no se encontró la herramienta
6
Error de portabilidad del esquema con --strict
El código 5 es el más importante para las pruebas. Una herramienta que falla de forma limpia ahora hace fallar el comando, así que inspector --cli ... && next-step se detiene donde la v1 habría seguido. Las conexiones agotan su tiempo a los 15 segundos por defecto en las ejecuciones ad hoc, y --connect-timeout <ms> eleva ese límite cuando tu servidor carga una base de datos o un modelo al arrancar.
Ejecutar comprobaciones de Inspector en CI
Una prueba de humo útil verifica cuatro cosas: el servidor se conecta, la herramienta existe, una llamada válida tiene éxito y una llamada no válida falla. Cuatro comandos, sin navegador, y una versión defectuosa nunca llega a los usuarios.
Fija la versión
Fija una versión exacta en CI, nunca un rango como @2.x, porque los flags y los códigos de salida cambiaron entre versiones principales:
Añade --format json y la CLI imprime un único objeto JSON con un campo result, listo para jq. Conviene conocer dos trampas. Nunca mezcles stderr con stdout con 2>&1 al analizar, porque los diagnósticos acaban dentro del JSON. Y captura el estado de salida antes de encadenar con un pipe, porque una tubería informa del estado de su último comando, lo que oculta una CLI fallida tras un jq correcto.
#!/usr/bin/env bash
set -u
INSPECT="npx --yes @modelcontextprotocol/inspector@2.9.0 --cli node build/index.js"
# 1. The handshake works
$INSPECT --method initialize --format json > init.json || exit 1
# 2. The tool exists (status captured before the pipe)
tools=$($INSPECT --method tools/list --format json); code=$?
[ "$code" -eq 0 ] || { echo "tools/list failed with $code"; exit "$code"; }
echo "$tools" | jq -e '.result.tools | map(.name) | index("generate_image")' > /dev/null || exit 1
# 3. A valid call succeeds
$INSPECT --method tools/call --tool-name list_models --tool-args-json '{}' \
--format json > call.json || exit 1
# 4. An invalid call fails
if $INSPECT --method tools/call --tool-name generate_image --tool-args-json '{}' \
> /dev/null 2>&1; then
echo "tool accepted empty input"; exit 1
fi
La cuarta comprobación es la que la gente se salta. Un servidor que acepta un prompt vacío y devuelve una imagen en blanco superará todas las pruebas positivas que escribas.
Corrige los errores que vas a ver
La mayoría de fallos encajan en unos pocos patrones. Identifica primero el síntoma y después lee la sección que lo explica.
Síntoma
Causa probable
Solución
Código de salida 4, tiempo de conexión agotado
El servidor se cayó al arrancar o tarda mucho en iniciarse
Ejecuta el comando del servidor por separado y luego aumenta --connect-timeout
El handshake falla con errores de parseo
Algo se imprimió en stdout
Envía los registros a stderr
Error de transporte en una URL
La ruta no termina en /mcp ni en /sse
Añade --transport http o --transport sse
Código de salida 3
El servidor pide un token o un inicio de sesión
Pasa --header, y usa --stored-auth-only en CI
Código de salida 5
Error de la herramienta, o nombre de herramienta incorrecto
Ejecuta tools/list y copia el nombre exacto
La interfaz rechaza la página
Token de API caducado
Reinicia Inspector para obtener uno nuevo
Contaminación de stdout en stdio
El transporte stdio transporta sus mensajes JSON-RPC por stdout, y el protocolo indica que un servidor no debe escribir allí nada que no sea un mensaje MCP válido. Una sola console.log perdida, un banner de arranque o una dependencia que imprime una advertencia corrompe el flujo. El handshake entonces falla con errores de parseo o simplemente se queda colgado.
Para arreglarlo, envía cada línea de registro a stderr (console.error en Node, sys.stderr en Python). Para localizar al culpable, ejecuta el comando del servidor por sí solo: un servidor stdio sano no imprime nada hasta que un cliente le habla.
Transporte no detectado
La v2 ya no adivina. Solo infiere el transporte cuando la ruta de la URL termina en /mcp o /sse, y en cualquier otro caso hay que indicarlo con el flag explícito:
Cuando un mensaje de error no te dice nada, pega la salida de stderr y el esquema de tu herramienta en Claude Sonnet 5 o en GPT 5.6 Sol y pide las tres causas más probables. Ambos leen bien las trazas de error, aunque la respuesta siempre la verificas con Inspector.
Probar un servidor de generación de imágenes
Los servidores que generan medios se comportan de forma distinta en las pruebas. Las llamadas son lentas, pueden costar dinero y el trabajo suele ejecutarse en segundo plano. La API para desarrolladores de PicassoIA muestra el patrón con claridad. Es al estilo Replicate: creas una predicción con POST /v1/models/{owner}/{name}/predictions en https://api.picassoia.com/v1, te autenticas con un token bearer, consultas GET /v1/predictions/{id} y lees el resultado cuando termina.
En el momento de escribir esto, la API y la conexión MCP exponen los mismos cuatro modelos: PicassoIA Image, PicassoIA Image Editor Pro, PicassoIA Video y Seedance 2.5 Lite. Una cuenta permite 5 predicciones simultáneas, compartidas entre tokens y conexiones MCP, con prompts de hasta 4.000 caracteres.
💡 Prueba en serie. Un bucle de llamadas a herramientas en una sola sesión de Inspector puede ocupar las cinco plazas y dejar sin recursos a tu cliente real. Ejecuta las pruebas de imagen una llamada cada vez.
Las herramientas asíncronas necesitan una herramienta de estado
Una herramienta que inicia un trabajo debería devolver un ID en segundos, y una segunda herramienta debería informar del progreso. Prueba ambas mitades por separado:
La llamada de inicio responde rápido con un ID en lugar de mantener la conexión abierta durante minutos.
La llamada de estado acepta ese ID e informa de un estado de progreso y de un estado final.
Un trabajo fallido vuelve como resultado con isError: true, no como una llamada que se queda colgada.
Un ID incorrecto produce el código de salida 5, no una caída del proceso del servidor.
La URL de salida responde con estado 200 y un tipo de contenido de imagen cuando la consultas.
Esa última comprobación es la más barata, y detecta el fallo que los lectores notan primero: una imagen rota en una página publicada.
Haz tu primera imagen a continuación
Ahora tienes una forma de demostrar que un servidor funciona antes de que alguien dependa de él. El mismo hábito rinde en el terreno creativo: ejecuta una prueba pequeña, lee el resultado y cambia una cosa cada vez.
Abre Picasso IA y prueba el ciclo tú mismo. Escribe un prompt de una frase en PicassoIA Image, afina el resultado con PicassoIA Image Editor Pro y luego da vida a la imagen fija con PicassoIA Video. Cambia la lente, la luz o el sujeto entre ejecuciones y compara los resultados lado a lado. Cinco comandos de este artículo merecen la pena tenerlos junto a la terminal:
--method initialize para confirmar el handshake.
--method tools/list para confirmar los nombres de las herramientas.
--method tools/call --tool-args-json para confirmar el comportamiento.
--format json más jq para verificar la respuesta.
El código de salida, que siempre se lee antes que la salida.