Zum Inhalt springen

API, CLI und MCP

Drei Wege ins gleiche Konto, mit den gleichen Tarifgrenzen und den gleichen Berechtigungen, die deine Rolle dir bereits gibt. Alles unten gehört zu einem dieser drei, also lohnt es sich zu wissen, welchen du nutzen willst.

API

REST, aus einer Pipeline, einem Skript oder deinen eigenen Tools. Ein Token, das du selbst ausstellst und widerrufst, und JSON in beide Richtungen.

Die API

CLI

Eine Python-Datei, nichts zu installieren. Dieselbe API, für jemanden am Terminal statt für ein Programm: zeige, was offline ist, füge einen Monitor hinzu.

Der Kommandozeilen-Client

MCP

Eine Adresse, eingefügt in Claude oder etwas anderes, das das Protokoll spricht. Sie liest das Konto und ändert es, als du, in einem Gespräch.

Für einen Assistant

Dein API-Token

Erstelle eins unter API-Tokens in deinem Konto. Es wird einmal angezeigt, wir speichern nur einen Fingerabdruck davon, und es gehört dir statt der Organisation: es kann nicht mehr als du, und es funktioniert nicht mehr, wenn du gehst oder sich deine Rolle ändert. Wähle read oder read and write.

Sende es als Authorization: Bearer n404_... bei jedem Aufruf. Der erste, der sich lohnt, ist /api/v1/me, der beantwortet, für welche Organisation das Token gilt, welche Rolle es trägt und welchen der beiden Scopes es hat: eine Person mit zwei Konten hat zwei Tokens und keine andere Möglichkeit, zu erkennen, welches in einer Umgebungsvariable ist.

Was in Version 1 enthalten ist

Aufruf Was es macht
GET /api/v1/me Was dieses Token ist und für welche Organisation es gilt
GET /api/v1/monitors Jeder Monitor, der älteste zuerst
POST /api/v1/monitors Erstelle einen, nach den gleichen Regeln wie das Formular
GET /api/v1/monitors/{id} Ein Monitor
PATCH /api/v1/monitors/{id} Ändere seinen Namen, seine Adresse, sein Intervall oder seine Konfiguration, oder pausiere ihn
DELETE /api/v1/monitors/{id} Lösche ihn und seine Historie mit ihm
GET /api/v1/monitors/{id}/status Was es jetzt tut und seine Uptime über ein Zeitfenster
GET /api/v1/groups Jede Gruppe, mit der Anzahl der Monitore darin
POST /api/v1/groups Erstelle eine; ein existierender Name gibt die Gruppe zurück, die ihn hat
GET /api/v1/groups/{id} Eine Gruppe
PATCH /api/v1/groups/{id} Benenne sie um oder ändere ihre Beschreibung
DELETE /api/v1/groups/{id} Lösche sie. Ihre Monitore bleiben, ohne Gruppe
GET /api/v1/incidents Ausfälle, die neuesten zuerst, gefiltert nach Status, Monitor oder Zeitraum
GET /api/v1/incidents/{id} Ein Vorfall, mit den Probes, die ihn gesehen und bestätigt haben
GET /api/v1/maintenance Wartungsfenster und was sie abdecken
GET /api/v1/maintenance/{id} Ein Fenster, mit den Monitoren und Gruppen, die es abdeckt
POST /api/v1/maintenance Plane eines, nach der Uhr deiner Organisation, damit ein Deploy ein Fenster öffnen kann, bevor es startet
DELETE /api/v1/maintenance/{id} Lösche es. Was es bereits abgedeckt hat, bleibt abgedeckt
GET /api/v1/status-pages Jede Statusseite und ob sie eingeschaltet ist
GET /api/v1/status-pages/{id} Eine Seite und was darauf veröffentlicht ist
POST /api/v1/status-pages/{id}/monitors Setze einen Monitor auf die Seite, unter dem Namen, den das Publikum lesen soll
DELETE /api/v1/status-pages/{id}/monitors/{id} Nimm ihn von dieser Seite. Andere Seiten behalten ihn
POST /api/v1/status-pages/{id}/groups Setze eine Gruppe auf die Seite; die Monitore darin kommen mit
DELETE /api/v1/status-pages/{id}/groups/{id} Nimm die Überschrift weg. Ihre Monitore bleiben veröffentlicht

Jede ID in einem Pfad oder Body ist die UUID, niemals eine Zahl. Schreiben braucht ein Lese- und Schreib-Token und eine Rolle, die schreiben darf: Der Scope ist, was du einem Programm übergeben hast, die Rolle ist, was du übergeben durftest.

openapi.json

Das Dokument ist OpenAPI 3.1. Es beschreibt jeden Call, die Struktur jedes Bodys und das Bearer-Token, damit ein Client daraus generiert werden kann statt geschrieben: openapi-generator, oapi-codegen und die anderen lesen es, wie es ist. Die Operationen sind für eine Person benannt, daher heißen die generierten Methoden listMonitors und createMonitor.

Version 1 wächst nur: Ein Feld kann hinzugefügt werden, keines wird entfernt oder umgetypt, und eine zweite Version wäre ein zweiter Pfad. So funktioniert ein generierter Client weiter, und durch Regenerieren holst du dir die Neuerungen.

Ein Client, falls du einen willst

Eine Datei, Python 3.9 oder neuer, keine Abhängigkeiten. Lade sie herunter, mache sie ausführbar und lege dein Token in die Umgebung. Sie macht alles, was die API macht, denn jeder Befehl ist ein Call zu den oben genannten Routen.

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

Die zweite Zeile lohnt sich. Sie prüft die Datei gegen den Digest, den wir daneben veröffentlichen, der genau das Digest ist, was dieser Server sendet, sodass ein Download, der unterwegs verändert wurde, nicht übereinstimmt. ./nomore404.py --version sagt, aus welcher Version sie stammt, und jede Anfrage, die sie macht, sagt dasselbe in ihrem User-Agent.

Das Token kommt aus N404_TOKEN oder aus einer nomore404.env-Datei neben dem Skript, niemals aus einem Kommandozeilen-Flag: Ein Argument ist in ps für jeden Benutzer auf der Maschine sichtbar und bleibt in deiner Shell-Historie.

Für einen Assistant

Ein Assistant kann dieses Konto lesen und ändern, über das Model Context Protocol. Es gibt zwei Wege hinein, und sie sind nicht dasselbe.

Eine Adresse, nichts zu installieren

Füge dies dort ein, wo dein Assistant nach einem benutzerdefinierten Connector fragt. Er wird dich hierher schicken, um dich anzumelden und zu sagen, für welche Organisation die Verbindung ist, und das ist die gesamte Einrichtung.

Es handelt als du: Deine Rolle wird bei jedem Call gelesen, sodass ein Assistant, der von jemandem verbunden wurde, der nur lesen darf, auch nur lesen kann. Es liest Monitore, Ausfälle, Uptime, Wartungsfenster und Gruppen und kann sie hinzufügen und ändern, einschließlich des Löschens eines Monitors und seiner Historie. Trenne es jederzeit von API-Tokens, wo es neben ihnen aufgelistet ist.

Oder führe es selbst aus und lass es lesen

nomore404_mcp.py bietet dieselbe API wie Tools von deiner eigenen Maschine. Halte es neben nomore404.py, das es für das Token und Paging nutzt. Es liest und schreibt nie, was der Grund ist, es zu wählen: Ein Assistant ist ein Caller, den man zu Dingen überreden kann, und ein Tool, das einen Monitor und seine Historie löscht, ist nur einen Prompt davon entfernt, benutzt zu werden.

Zwei Dateien, ein Token daneben und eine Zeile, um den Server zu registrieren. 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"

Alles andere, das das Protokoll spricht, ist derselbe Befehl als JSON geschrieben, wo auch immer dieser Client seine Server hält:

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

Keiner nennt das Token, weil keiner sollte: Es wird aus nomore404.env neben den Skripten gelesen oder aus N404_TOKEN in der Umgebung, mit der der Assistant es startet. Frage es dann, was down ist, warum ein Vorfall geöffnet wurde oder wie ein Monitor diesen Monat war.

Beide sind ein paar hundert Zeilen und es lohnt sich, sie zu lesen, bevor du sie ausführst. Keiner ist gepackt oder signiert, und nichts hindert dich daran, stattdessen deinen eigenen Client aus dem Dokument zu generieren.

Fehler und lange Listen

Eine Fehlerform

Der Status sagt die Kategorie. Der Body sagt, welcher Fehler es war, mit einem Code zum Verzweigen und einem Satz zum Lesen. Der Satz kann in jeder Version umformuliert werden, daher sollte ihn nichts parsen.

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

Cursors, keine Offsets

Eine Liste antwortet mit items und next_cursor. Gib den Cursor zurück, um die nächste Seite zu bekommen, und höre auf, wenn er null ist. Vorfälle kommen an, während du sie liest, und ein Offset würde dir stillschweigend eine Zeile zweimal zeigen und die nächste nie.

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

Wie viel du anfragen darfst

Ein Token kann hundertzwanzig Anfragen pro Minute machen. Jede Antwort enthält RateLimit-Remaining und RateLimit-Reset, damit sich ein gut programmiertes Client selbst anpassen kann, statt das Limit durch ständiges Anfragen zu erreichen. Über dem Limit gibt es einen 429 mit Retry-After.

Erstelle ein kostenloses Konto