Saltar al contenido

API, CLI y MCP

Tres formas de acceder a la misma cuenta, con los mismos límites de planes y los mismos permisos que tu rol ya te da. Todo lo que sigue es una de estas tres, así que vale la pena saber cuál elegiste.

API

REST, desde un pipeline, un script o tus propias herramientas. Un token que emites y revocas tú mismo, y JSON en ambos sentidos.

La API

CLI

Un archivo Python, nada que instalar. La misma API, para alguien en un terminal en lugar de un programa: lista lo que está down, añade un monitor.

El cliente de línea de comandos

MCP

Una dirección, pegada en Claude o cualquier otra cosa que hable el protocolo. Lee la cuenta y la modifica, como tú, en una conversación.

Para un asistente

Tu token de API

Crea uno en tokens de API en tu cuenta. Se muestra una sola vez, solo guardamos una huella de él y te pertenece a ti en lugar de a la organización: no puede hacer más de lo que tú puedes, y deja de funcionar si te vas o tu rol cambia. Elige read, o read and write.

Envíalo como Authorization: Bearer n404_... en cada llamada. La primera que vale la pena hacer es /api/v1/me, que responde para qué organización actúa el token, qué rol lleva y cuál de los dos alcances tiene: una persona con dos cuentas tiene dos tokens y ninguna otra forma de saber cuál está en una variable de entorno.

Lo que hay en la versión 1

Llamada Qué hace
GET /api/v1/me Qué es este token y para qué organización actúa
GET /api/v1/monitors Todos los monitores, el más antiguo primero
POST /api/v1/monitors Crea uno, siguiendo las mismas reglas que cumple el formulario
GET /api/v1/monitors/{id} Un monitor
PATCH /api/v1/monitors/{id} Cambia su nombre, dirección, intervalo o configuración, o ponlo en pausa
DELETE /api/v1/monitors/{id} Elimínalo, y su historial con él
GET /api/v1/monitors/{id}/status Qué está haciendo ahora y su uptime en una ventana
GET /api/v1/groups Cada grupo, con cuántos monitores hay en él
POST /api/v1/groups Crea uno; un nombre que ya existe devuelve el grupo que lo tiene
GET /api/v1/groups/{id} Un grupo
PATCH /api/v1/groups/{id} Renómbralo o cambia su descripción
DELETE /api/v1/groups/{id} Elimínalo. Sus monitores permanecen sin agrupar
GET /api/v1/incidents Cortes, los más recientes primero, filtrados por estado, monitor o periodo
GET /api/v1/incidents/{id} Un incidente, con las sondas que lo vieron y confirmaron
GET /api/v1/maintenance Ventanas de mantenimiento y lo que cubren
GET /api/v1/maintenance/{id} Una ventana, con los monitores y grupos que cubre
POST /api/v1/maintenance Programa una, en el horario de tu organización, para que un despliegue pueda abrir una ventana antes de comenzar
DELETE /api/v1/maintenance/{id} Elimínala. Lo que ya cubría permanece cubierto
GET /api/v1/status-pages Cada página de estado, y si está activada
GET /api/v1/status-pages/{id} Una página, y lo que se publica en ella
POST /api/v1/status-pages/{id}/monitors Pon un monitor en la página, con el nombre que debería leer su audiencia
DELETE /api/v1/status-pages/{id}/monitors/{id} Quítalo de esta página. Otras páginas lo mantienen
POST /api/v1/status-pages/{id}/groups Pon un grupo en la página; los monitores en él también se incluyen
DELETE /api/v1/status-pages/{id}/groups/{id} Quita el encabezado. Sus monitores permanecen publicados

Cada id en una ruta o un cuerpo es el UUID, nunca un número. Escribir necesita un token de lectura y escritura y un rol que pueda escribir: el alcance es lo que entregaste a un programa, el rol es lo que se te permitió entregar.

openapi.json

El documento es OpenAPI 3.1. Describe cada llamada, la forma de cada cuerpo y el token bearer, para que un cliente pueda generarse a partir de él en lugar de escribirse: openapi-generator, oapi-codegen y el resto lo leen tal cual. Las operaciones están nombradas para una persona, así que los métodos generados son listMonitors y createMonitor.

La versión 1 solo crece: se puede añadir un campo, ninguno se elimina ni se cambia de tipo, y una segunda versión sería una segunda ruta. Así que un cliente generado sigue funcionando, y regenerarlo es cómo obtienes lo nuevo.

Un cliente, si quieres uno

Un archivo, Python 3.9 o más reciente, sin dependencias. Descárgalo, hazlo ejecutable y pon tu token en el entorno. Hace todo lo que la API hace, porque cada comando es una llamada a las rutas mencionadas.

nomore404.py nomore404_mcp.py

curl -O https://nomore404.com/api/nomore404.py
curl -s https://nomore404.com/api/nomore404.py.sha256 | sha256sum -c
chmod +x nomore404.py
export N404_TOKEN=n404_...

./nomore404.py monitors list
./nomore404.py monitors add --type https --target shop.example.com
./nomore404.py incidents --state open

Vale la pena ejecutar la segunda línea. Verifica el archivo contra el digest que publicamos junto a él, que es el digest de exactamente lo que este servidor envía, así que una descarga alterada en el camino no coincide. ./nomore404.py --version indica de qué versión proviene, y cada solicitud que hace dice lo mismo en su User-Agent.

El token proviene de N404_TOKEN o de un archivo nomore404.env junto al script, nunca de un argumento en la línea de comandos: un argumento es visible en ps para cada usuario en la máquina y permanece en el historial de tu shell.

Para un asistente

Un asistente puede leer esta cuenta y cambiarla, a través del Model Context Protocol. Hay dos formas de acceso y no son lo mismo.

Una dirección, nada que instalar

Pega esto donde tu asistente pida un conector personalizado. Te enviará aquí para iniciar sesión y para decir para qué organización es la conexión, y esa es toda la configuración.

Actúa como tú: tu rol se lee en cada llamada, así que un asistente conectado por alguien que solo puede leer solo puede leer. Lee monitores, cortes, tiempo en línea, ventanas de mantenimiento y grupos, y puede añadir y cambiarlos, lo que incluye eliminar un monitor y su historial. Desconéctalo cuando quieras desde Tokens de API, donde está listado junto a ellos.

O ejecútalo tú mismo y mantenlo leyendo

nomore404_mcp.py sirve la misma API que las herramientas desde tu propia máquina. Mantenlo junto a nomore404.py, que usa para el token y para la paginación. Lee y nunca escribe, que es la razón para elegirlo: un asistente es un llamador que puede ser persuadido, y una herramienta que elimina un monitor y su historial está a un paso de ser usada.

Dos archivos, un token junto a ellos y una línea para registrar el servidor. Claude Code:

curl -O https://nomore404.com/api/nomore404.py
curl -O https://nomore404.com/api/nomore404_mcp.py
echo 'N404_TOKEN=n404_...' > nomore404.env

claude mcp add nomore404 -- python3 "$PWD/nomore404_mcp.py"

Cualquier otra cosa que hable el protocolo es el mismo comando escrito como JSON, donde sea que ese cliente guarde sus servidores:

{
  "mcpServers": {
    "nomore404": {
      "command": "python3",
      "args": ["/path/to/nomore404_mcp.py"]
    }
  }
}

Ninguno nombra el token, porque ninguno debería: se lee desde nomore404.env junto a los scripts, o desde N404_TOKEN en el entorno con el que el asistente lo inicia. Luego pregúntale qué está caído, por qué se abrió un incidente o cómo ha estado un monitor este mes.

Ambos son unas pocas cientos de líneas y vale la pena leerlos antes de ejecutarlos. Ninguno está empaquetado ni firmado, y nada te impide generar tu propio cliente a partir del documento.

Fallos y listas largas

Una forma de error

El estado indica la categoría. El cuerpo indica qué fallo fue, con un código para ramificar y una frase para leer. La frase puede ser reformulada en cualquier versión, así que nada debería analizarla.

{
  "error": {
    "code": "monitor_not_found",
    "message": "Nothing here with that id."
  }
}

Cursors, no offsets

Un listado responde con items y next_cursor. Devuelve el cursor para obtener la siguiente página y detente cuando sea null. Los incidentes llegan mientras los estás leyendo, y un offset te mostraría una fila dos veces y nunca la siguiente.

GET /api/v1/incidents?limit=50
GET /api/v1/incidents?limit=50&cursor=...

Cuánto puedes pedir

Un token puede hacer ciento veinte llamadas por minuto. Cada respuesta incluye RateLimit-Remaining y RateLimit-Reset, así que un cliente que se comporte bien puede ajustarse en lugar de encontrar el límite chocando con él. Si superas el límite, obtendrás un 429 con Retry-After.

Crea una cuenta gratis