API, CLI et MCP
Trois façons d'accéder au même compte, avec les mêmes limites de forfait et les mêmes permissions que ton rôle te donne déjà. Tout ce qui suit est l'une de ces trois, donc ça vaut le coup de savoir laquelle tu utilises.
API
REST, depuis un pipeline, un script ou tes propres outils. Un token que tu crées et révoques toi-même, et du JSON dans les deux sens.
CLI
Un fichier Python, rien à installer. La même API, pour quelqu'un au terminal plutôt qu'un programme : liste ce qui est down, ajoute un monitor.
MCP
Une adresse, collée dans Claude ou tout autre outil qui parle le protocole. Elle lit le compte et le modifie, comme toi, dans une conversation.
Ton token API
Crée-en un dans la section API tokens de ton compte. Il est affiché une seule fois, on ne garde qu'une empreinte, et il t'appartient plutôt qu'à l'organisation : il ne peut pas faire plus que toi, et il cesse de fonctionner si tu pars ou si ton rôle change. Choisis lecture, ou lecture et écriture.
Envoie-le comme Authorization: Bearer n404_... à chaque appel. Le premier appel utile est /api/v1/me, qui répond pour quelle organisation le token agit, quel rôle il porte et lequel des deux scopes il a : une personne avec deux comptes a deux tokens et aucun autre moyen de savoir lequel est dans une variable d'environnement.
Ce qu'il y a dans la version 1
| Appel | Ce qu'il fait |
|---|---|
| GET /api/v1/me | Ce qu'est ce token, et pour quelle organisation il agit |
| GET /api/v1/monitors | Tous les monitors, du plus ancien au plus récent |
| POST /api/v1/monitors | Crée-en un, selon les mêmes règles que le formulaire respecte |
| GET /api/v1/monitors/{id} | Un monitor |
| PATCH /api/v1/monitors/{id} | Change son nom, son adresse, son intervalle ou sa config, ou mets-le en pause |
| DELETE /api/v1/monitors/{id} | Supprime-le, ainsi que son historique |
| GET /api/v1/monitors/{id}/status | Ce qu'il fait maintenant, et son uptime sur une période |
| GET /api/v1/groups | Chaque groupe, avec combien de monitors il contient |
| POST /api/v1/groups | Crée-en un ; un nom existant renvoie le groupe qui l'a |
| GET /api/v1/groups/{id} | Un groupe |
| PATCH /api/v1/groups/{id} | Renomme-le ou change sa description |
| DELETE /api/v1/groups/{id} | Supprime-le. Ses monitors restent, sans groupe |
| GET /api/v1/incidents | Pannes, les plus récentes d'abord, filtrées par état, monitor ou période |
| GET /api/v1/incidents/{id} | Un incident, avec les probes qui l'ont vu et confirmé |
| GET /api/v1/maintenance | Fenêtres de maintenance et ce qu'elles couvrent |
| GET /api/v1/maintenance/{id} | Une fenêtre, avec les monitors et groupes qu'elle couvre |
| POST /api/v1/maintenance | Planifie-en une, selon l'horloge de ton organisation, pour qu'un déploiement puisse ouvrir une fenêtre avant de commencer |
| DELETE /api/v1/maintenance/{id} | Supprime-la. Ce qu'elle couvrait reste couvert |
| GET /api/v1/status-pages | Chaque status page, et si elle est activée |
| GET /api/v1/status-pages/{id} | Une page, et ce qui y est publié |
| POST /api/v1/status-pages/{id}/monitors | Ajoute un monitor à la page, sous le nom que son audience doit lire |
| DELETE /api/v1/status-pages/{id}/monitors/{id} | Retire-le de cette page. Les autres pages le gardent |
| POST /api/v1/status-pages/{id}/groups | Ajoute un groupe à la page ; les monitors qu'il contient viennent aussi |
| DELETE /api/v1/status-pages/{id}/groups/{id} | Retire l'en-tête. Ses monitors restent publiés |
Chaque id dans un chemin ou un corps est l'UUID, jamais un nombre. Écrire nécessite un token de lecture et d'écriture et un rôle qui peut écrire : le scope est ce que tu as donné à un programme, le rôle est ce que tu étais autorisé à transmettre.
Le document est OpenAPI 3.1. Il décrit chaque appel, la structure de chaque corps, et le bearer token, pour qu'un client puisse être généré à partir de lui plutôt qu'écrit : openapi-generator, oapi-codegen et les autres le lisent tel quel. Les opérations portent des noms pour une personne, donc les méthodes générées sont listMonitors et createMonitor.
La version 1 ne fait que grandir : un champ peut être ajouté, aucun n'est supprimé ou retypé, et une deuxième version serait un deuxième chemin. Ainsi, un client généré continue de fonctionner, et le régénérer permet de récupérer les nouveautés.
Un client, si tu en veux un
Un fichier, Python 3.9 ou plus récent, sans dépendances. Télécharge-le, rends-le exécutable, et mets ton token dans l'environnement. Il fait tout ce que l'API fait, car chaque commande est un appel aux routes ci-dessus.
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
La deuxième ligne vaut la peine d'être exécutée. Elle vérifie le fichier par rapport au digest que nous publions à côté, qui est le digest de ce que ce serveur envoie exactement, donc un téléchargement altéré en chemin ne correspond pas. ./nomore404.py --version indique de quelle version il provient, et chaque requête qu'il fait indique la même chose dans son User-Agent.
Le token vient de N404_TOKEN ou d'un fichier nomore404.env à côté du script, jamais d'un argument en ligne de commande : un argument est visible dans ps pour tous les utilisateurs de la machine et reste dans l'historique de ton shell.
Pour un assistant
Un assistant peut lire ce compte et le modifier, via le Model Context Protocol. Il y a deux moyens d'accès et ils ne sont pas identiques.
Une adresse, rien à installer
Colle ceci là où ton assistant demande un connecteur personnalisé. Il t'enverra ici pour te connecter et indiquer pour quelle organisation est la connexion, et c'est toute la configuration.
Il agit en ton nom : ton rôle est lu à chaque appel, donc un assistant connecté par quelqu'un qui ne peut que lire ne pourra que lire. Il lit les monitors, les pannes, l'uptime, les fenêtres de maintenance et les groupes, et il peut les ajouter et les modifier, ce qui inclut la suppression d'un monitor et de son historique. Déconnecte-le quand tu veux depuis Tokens API, où il est listé à côté d'eux.
Ou exécute-le toi-même, et laisse-le lire
nomore404_mcp.py sert la même API que les outils depuis ta propre machine. Garde-le à côté de nomore404.py, qu'il utilise pour le token et pour la pagination. Il lit et n'écrit jamais, ce qui est la raison de le choisir : un assistant est un appelant qu'on peut manipuler, et un outil qui supprime un monitor et son historique est à un prompt d'être utilisé.
Deux fichiers, un token à côté, et une ligne pour enregistrer le serveur. 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"
Tout autre chose qui parle le protocole est la même commande écrite en JSON, où que ce client garde ses serveurs :
{
"mcpServers": {
"nomore404": {
"command": "python3",
"args": ["/path/to/nomore404_mcp.py"]
}
}
}
Aucun ne nomme le token, car aucun ne devrait : il est lu depuis nomore404.env à côté des scripts, ou depuis N404_TOKEN dans l'environnement avec lequel l'assistant le lance. Ensuite, demande-lui ce qui est down, pourquoi un incident s'est ouvert, ou comment un monitor s'est comporté ce mois-ci.
Les deux font quelques centaines de lignes et valent la peine d'être lus avant de les exécuter. Aucun n'est packagé ou signé, et rien ne t'empêche de générer ton propre client à partir du document à la place.
Échecs, et longues listes
Une forme d'erreur
Le status indique la catégorie. Le corps indique quelle erreur c'était, avec un code pour bifurquer et une phrase à lire. La phrase peut être reformulée dans n'importe quelle version, donc rien ne devrait l'analyser.
{
"error": {
"code": "monitor_not_found",
"message": "Nothing here with that id."
}
}
Cursors, pas offsets
Une liste répond avec items et next_cursor. Renvoie le cursor pour obtenir la page suivante, et arrête-toi quand il est null. Les incidents arrivent pendant que tu les lis, et un offset te montrerait discrètement une ligne deux fois et ne montrerait jamais la suivante.
GET /api/v1/incidents?limit=50
GET /api/v1/incidents?limit=50&cursor=...
Combien tu peux demander
Un token peut faire cent vingt appels par minute. Chaque réponse inclut RateLimit-Remaining et RateLimit-Reset, donc un client bien élevé peut s'autoréguler au lieu de découvrir la limite en la dépassant. Au-delà de la limite, c'est un 429 avec Retry-After.