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.
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.
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.
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.
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.
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.