Last9

offiziell

Bringen Sie nahtlos Echtzeit-Produktionskontext—Logs, Metriken und Traces—in Ihre lokale Umgebung, um Code schneller automatisch zu reparieren.

Was kann man mit Last9 MCP machen?

  • Produktionsvorfälle untersuchen — Bitte deinen Assistenten, Logs, Traces, Metriken, Ausnahmen und ausgelöste Alerts für einen Dienst abzurufen, damit er die Ursache des Problems diagnostizieren kann.
  • Änderungen mit Auswirkungen in Zusammenhang bringen — Prüfe Deployments und Konfigurationsänderungen und vergleiche anschließend einen Dienst und seine aufrufenden Dienste vor und nach der Änderung, um festzustellen, ob sie eine Regression verursacht hat.
  • Prometheus-Metriken abfragen — Führe PromQL-Bereichs- oder Sofortabfragen aus und liste Labelwerte auf, um beliebige Metriken in deiner Datenquelle zu untersuchen.
  • Datenbankleistung untersuchen — Ermittle Datenbanken, finde langsame Abfrageausführungen und prüfe Abfragemuster sowie serverseitige Metriken aus OTel-Spans.
  • Traces und Profile analysieren — Rufe anhand einer ID einen Trace-Wasserfall ab, ordne Attributabweichungen zwischen Kohorten oder rufe ein Flamegraph und die häufigsten Funktionen für einen Dienst ab.
  • Alerts und Dashboards verwalten — Prüfe die Alert-Abdeckung und -Qualität, erstelle oder ändere Alert-Regeln und liste benutzerdefinierte Dashboards auf, validiere oder bearbeite sie.

Dokumentation

Last9 MCP Server

last9 mcp demo

Dein KI-Agent weiß nicht, was in der Produktion nicht funktioniert. Das ändert sich jetzt.

Der Last9 MCP Server verbindet Claude, Cursor, Windsurf und jeden anderen MCP-fähigen KI-Assistenten direkt mit deinen Observability-Daten aus der Produktion — Logs, Metriken, Traces, Ausnahmen, Datenbankabfragen, Alerts und Deployments. Der Agent rät nicht mehr, sondern liest die tatsächlichen Signale.


In 30 Sekunden starten (gehostet)

Keine Binärdatei zu installieren. Keine Tokens zu verwalten. Eine URL, OAuth im Browser, fertig.

Finde den Slug deiner Organisation in deiner Last9-URL: app.last9.io/<org_slug>/...

Claude Code

claude mcp add --transport http last9 https://app.last9.io/api/v4/organizations/<org_slug>/mcp

Gib /mcp ein, wähle last9 aus und authentifiziere dich. Das war's.

Cursor

Settings > MCP > Add New MCP Server:

{
  "mcpServers": {
    "last9": {
      "type": "http",
      "url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
    }
  }
}

Klicke auf Connect und schließe OAuth ab.

VS Code

Erfordert v1.99+. Öffne die Befehlspalette → MCP: Add Server, füge die URL ein und authentifiziere dich.

Oder direkt in settings.json:

{
  "mcp": {
    "servers": {
      "last9": {
        "type": "http",
        "url": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
      }
    }
  }
}

Windsurf

Settings > Cascade > Open MCP Marketplace > gear icon (mcp_config.json):

{
  "mcpServers": {
    "last9": {
      "serverUrl": "https://app.last9.io/api/v4/organizations/<org_slug>/mcp"
    }
  }
}

Claude Web/Desktop

Settings > Connectors > Add custom connector. Nenne ihn last9, füge die URL ein und authentifiziere dich.

Erfordert Administratorzugriff auf deine Claude-Organisation.


Selbst gehostet (STDIO)

Verwende diese Option, wenn dein MCP-Client HTTP-Transport nicht unterstützt oder der Server lokal ausgeführt werden muss.

Installieren

Homebrew:

brew install last9/tap/last9-mcp

NPM:

Erfordert Node.js 22.23.4+, 24.22.1+ oder 26.12.1+: Frühere Versionen akzeptieren beim Herunterladen der Binärdatei durch das Installationsprogramm TLS-Zertifikate der kompromittierten eMudhra-Zwischenzertifizierungsstellen.

npm install -g @last9/mcp-server@latest
# or directly:
npx -y @last9/mcp-server@latest

Binärversionen (Windows / manuell):

Lade sie von GitHub Releases herunter:

PlattformArchiv
Windows (x64)last9-mcp-server_Windows_x86_64.zip
Windows (ARM64)last9-mcp-server_Windows_arm64.zip
Linux (x64)last9-mcp-server_Linux_x86_64.tar.gz
Linux (ARM64)last9-mcp-server_Linux_arm64.tar.gz
macOS (x64)last9-mcp-server_Darwin_x86_64.tar.gz
macOS (ARM64)last9-mcp-server_Darwin_arm64.tar.gz

Refresh-Token abrufen

Nur Administratoren können Tokens erstellen.

  1. Gehe zu API Access
  2. Klicke auf Generate Token mit Schreibberechtigungen
  3. Kopiere es

Client-Konfiguration

Homebrew:

{
  "mcpServers": {
    "last9": {
      "command": "/opt/homebrew/bin/last9-mcp",
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

NPM:

{
  "mcpServers": {
    "last9": {
      "command": "npx",
      "args": ["-y", "@last9/mcp-server@latest"],
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

Hier einfügen:

ClientSpeicherort
Claude Web/DesktopSettings > Developer > Edit Config (claude_desktop_config.json)
CursorSettings > Cursor Settings > MCP > Add New Global MCP Server
WindsurfSettings > Cascade > MCP Marketplace > gear icon (mcp_config.json)
VS CodeIn settings.json in { "mcp": { "servers": { ... } } } einfügen — Details
VS Code STDIO-Konfiguration
{
  "mcp": {
    "servers": {
      "last9": {
        "type": "stdio",
        "command": "/opt/homebrew/bin/last9-mcp",
        "env": {
          "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
        }
      }
    }
  }
}

Für NPM: Verwende "command": "npx" und füge "args": ["-y", "@last9/mcp-server@latest"] hinzu.

Windows

Lade die Datei von GitHub Releases herunter, entpacke sie und gib den vollständigen Pfad an:

{
  "mcpServers": {
    "last9": {
      "command": "C:\\Users\\<user>\\AppData\\Local\\Programs\\last9-mcp-server.exe",
      "env": {
        "LAST9_REFRESH_TOKEN": "<your_refresh_token>"
      }
    }
  }
}

Unter Windows ist der NPM-Weg einfacher — keine Pfadverwaltung.

Umgebungsvariablen

VariableStandardwertBeschreibung
LAST9_REFRESH_TOKEN(erforderlich)Refresh-Token von API Access
LAST9_DATASOURCEStandard der OrganisationName der Datenquelle/des Clusters — nützlich, wenn du mehrere Levitate-Cluster hast
LAST9_FAKE_NOW_ISO(nicht gesetzt)Nur für Evals/Replays; niemals in der Produktion setzen. RFC3339-Zeitpunkt (z. B. 2026-01-02T15:04:05Z), der beim Auflösen relativer Zeitfenster wie lookback_minutes die aktuelle Zeit ersetzt, damit Läufe reproduzierbar sind. Ein ungültiger Wert führt zu einem Startfehler. Timeouts, Caches und Token-Ablauf verwenden weiterhin die tatsächliche Zeit
LAST9_API_HOSTapp.last9.ioAPI-Host überschreiben
LAST9_TOOLSETSalle ToolsDurch Kommas getrennte Toolsets, die bereitgestellt werden sollen (logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all). Alias: LAST9_MCP_TOOLSETS
LAST9_MCP_READ_ONLYfalseSetze true, um nur schreibgeschützte Tools bereitzustellen; siehe Schreibgeschützter Modus. Ein Wert, der kein boolescher Wert ist, führt zu einem Startfehler. Alias: LAST9_READ_ONLY
LAST9_MCP_ALLOW_WRITE_TOOLS—Durch Kommas getrennte Schreib-Tools, die im schreibgeschützten Modus weiterhin bereitgestellt werden. Alias: LAST9_ALLOW_WRITE_TOOLS
LAST9_MAX_GET_LOGS_ENTRIES5000Maximale Anzahl von Einträgen für segmentierte get_logs-Anfragen
LAST9_USE_LOG_SEARCH_APIfalseSetze true, damit get_logs und get_service_logs mit einem serverseitigen Suchaufruf statt mit clientseitiger Segmentierung beantwortet werden. Jeder Aufruf erhält 90 Sekunden und gibt anschließend den Hinweis zurück, das Zeitfenster einzugrenzen; ein 502- oder 503-Fehler wird innerhalb dieses Zeitraums einmal wiederholt
LAST9_DEBUG_CHUNKINGfalseSetze true, um Details zur Segmentplanung für get_logs, get_service_logs, get_traces zu protokollieren
LAST9_DISABLE_TELEMETRYtrueSetze false, um internes OTel-Tracing zu aktivieren
OTEL_SDK_DISABLED—Standard-OTel-Umgebungsvariable. Überschreibt LAST9_DISABLE_TELEMETRY
OTEL_EXPORTER_OTLP_ENDPOINT—OTLP-Collector-Endpunkt (nur bei aktivierter Telemetrie)
OTEL_EXPORTER_OTLP_HEADERS—OTLP-Authentifizierungsheader (nur bei aktivierter Telemetrie)

Zeitmessung der Tool-Phasen

Bei aktivierter interner Telemetrie enthalten Tool-Spans last9.phase.<phase>.duration_ms (tatsächlich verstrichene Millisekunden) und last9.phase.<phase>.failed (ob die Phase mit einem Fehler endete). Dieselben Felder werden als tool phase completed-Debug- Logs ausgegeben, zusammen mit tool und phase, wenn der konfigurierte Logger Debug-Einträge akzeptiert. Diese Zeitmessungen fügen keine Eingaben, Abfragetexte, Zugangsdaten oder Fehlerantworten hinzu.

ToolPhasen
get_log_patternssample: Beispiel abrufen und dekodieren; mine: Muster ermitteln; deep_link: optionalen Index auflösen und Link erstellen
get_logsfetch: Ergebnisse abrufen, dekodieren und zusammenführen, einschließlich Wiederholungsversuchen und optionalen Plausibilitätsprüfungen der Anzahl; count_sanity: die verschachtelte optionale Prüfung; post_process: Hinweise, Zusammenfassung und JSON-Formatierung; deep_link: Index auflösen und Link erstellen
get_service_profilerequest: Anfrage über den gemeinsam genutzten API-Client vorbereiten und senden und die vollständige Antwort lesen, bevor sie knapp formatiert wird

Es werden nur ausgeführte Phasen erfasst, auch fehlgeschlagene Abrufe. Optionale Hilfsfunktionen, die Fehler unterdrücken, behalten dieses Verhalten bei; failed: false bestätigt nicht, dass ein optionaler Link oder eine optionale Anzahlprüfung verfügbar war. Die Dauer des verschachtelten count_sanity ist bereits in fetch enthalten; addiere sie nicht doppelt. Die Abrufzeit umfasst die Arbeit des Clients und misst daher nicht ausschließlich die Backend-Ausführung. Vergleiche diese Phasen anhand gleichwertiger Zeitfenster und Suchpfade, bevor du Sampling oder Caching anpasst.

Für eine Latenzuntersuchung kannst du denselben Dienst, dieselbe Datenquelle, denselben Index, dasselbe Zeitfenster und dieselben Limits mit den Basis- und Kandidaten-Builds erneut ausführen. Erfasse die Build-SHA, die Tool-Gesamtdauer, die Phasendauern, last9.logs.search_path, Wiederholungsattribute, sofern vorhanden, und Abdeckungsflags. Vergleiche sowohl langsame als auch typische Aufrufe. Ein langsamer Abruf oder eine langsame Profilanfrage weist auf eine Netzwerk-/API-Phase hin, die untersucht werden sollte; bevor die Verzögerung dem Backend zugeschrieben wird, sind eigene korrelierte Belege für die Backend-Ausführung erforderlich. Diese Diagnosen allein belegen keine Latenzverbesserung.

Schreibgeschützter Modus

--read-only (oder LAST9_MCP_READ_ONLY=true) stellt nur Tools bereit, die mit readOnlyHint: true annotiert sind. Kein Tool kann daher Alert-Regeln, Benachrichtigungskanäle, Dashboards oder Drop-Regeln erstellen, ändern oder löschen, Alerts bestätigen oder neu zuweisen oder Gruppen stummschalten. Ein Tool ohne Annotationen gilt als Schreib-Tool und wird ausgeblendet.

Um einige Schreib-Tools beizubehalten, liste sie mit --allow-write-tools (oder LAST9_MCP_ALLOW_WRITE_TOOLS) auf:

last9-mcp --read-only --allow-write-tools=acknowledge_alert,mute_alert_group
  • Der Server verweigert den Start, wenn ein zulässiger Name kein Schreib-Tool ist (etwa wegen eines Tippfehlers oder weil es sich um den Namen eines Lese-Tools handelt); der Fehler listet die gültigen Schreib-Tools auf.
  • --allow-write-tools ohne --read-only führt zu einem Startfehler, da andernfalls bereits jedes Schreib-Tool bereitgestellt wird.
  • Schreibgeschützter Modus lässt sich mit --toolsets kombinieren: Ein Tool wird nur bereitgestellt, wenn es beide Bedingungen erfüllt. --toolsets=alerts --read-only --allow-write-tools=mute_alert_group stellt die Lese-Tools für Alerts sowie mute_alert_group bereit; ein zulässiges Schreib-Tool außerhalb der ausgewählten Toolsets bleibt ausgeblendet.
  • Der Modus --http und dump-tools berücksichtigen dieselben Flags und Umgebungsvariablen: go run . dump-tools --read-only gibt die schreibgeschützte Oberfläche aus, zusammen mit den Serveranweisungen, die unter instructions bereitgestellt werden.
  • Beschreibungen, Schemas und Ergebnisse von Lese-Tools sowie die Serveranweisungen nennen niemals ein ausgeblendetes Schreib-Tool. Ein zulässiges Schreib-Tool kann jedoch seine ausgeblendeten Gegenstücke nennen (create_alert erstellt eine deaktivierte Regel, die patch_alert aktiviert). Erlaube solche Tool-Paare daher gemeinsam.

Was es kann

Orientierung

  • get_workspace_overview — Empfohlener erster Aufruf, wenn eine Anfrage keinen Dienst oder kein Tool nennt (wird eines genannt, geht es direkt zum entsprechenden Tool): Umgebungen, erkannte Signale (Logs, Traces, Metriken) der letzten Stunde, Anzahl der Dienste und Alert-Gruppen, ausgelöste Alerts und die aktuelle Uhrzeit in einem kostengünstigen Aufruf. Ein Signal, das in dieser Stunde nicht erkannt wurde, kann dennoch ältere Daten haben und bleibt daher abfragbar. Bei einem fehlgeschlagenen Teilaufruf bleibt das Feld null und ein Eintrag errors[] wird hinzugefügt. In jedem Toolset verfügbar
  • get_current_time — Aktuelle Uhrzeit sowie absolute Grenzen für last 2h, yesterday oder since yesterday 9am IST in jeder IANA-Zeitzone oder gängigen Abkürzung. In jedem Toolset verfügbar

Dienstzustand

  • get_service_summary — Nach (service, env) sortierte Flottenzeilen: request_count und throughput_rpm für das Intervall, HTTP-4xx-/5xx-Anzahlen und gRPC-Fehleranzahlen
  • get_service_environments — Verfügbare Umgebungen für deine Dienste. Führe dies zuerst aus — andere APM-Tools benötigen env von hier
  • get_service_performance_details — Vollständige Aufschlüsselung: Durchsatz, Fehlerrate, p50/p90/p95/avg/max, Apdex, Verfügbarkeit (standardmäßig zusammengefasst; vollständige Zeitreihe mit include_series)
  • get_service_operations_summary — Nach HTTP-Endpunkten, DB-Aufrufen, Messaging und HTTP-Clients gruppierte Vorgänge
  • get_service_dependency_graph — Abhängigkeitsübersicht mit Durchsatz, Latenz und Fehlerraten für Upstream, Downstream und Infrastruktur
  • get_apm_service_deviations — Vergleicht ein aktuelles Zeitfenster mit einer gleich langen Basisperiode: Regressionen/Verbesserungen, Apdex-Abgleich und ein abschließendes Ergebnis (Flotte oder einzelner Dienst)
  • get_exceptions — Serverseitige Ausnahmen mit Dienst- und Span-Filtern

Datenbank-Observability

Vier Tools, die direkt die Performance deiner Datenbank untersuchen. Sie basieren auf OpenTelemetry-Trace-Spans und, wenn keine Traces vorhanden sind, auf Infrastrukturmetriken wie CloudWatch. Wenn du bereits OTel verwendest, ist keine zusätzliche Instrumentierung erforderlich.

  • get_databases — Entdecken Sie alle Datenbanken in Ihrer Infrastruktur: DB-Typ, Host, Durchsatz (Abfragen/Min.), p95-Latenz, Fehlerrate und Anzahl abhängiger Dienste. Entdeckt außerdem Datenbanken anhand von Infrastrukturmetriken wie CloudWatch, ohne dass Trace-Instrumentierung erforderlich ist — diese Zeilen enthalten statt Trace-Metriken einen Aktivitätswert
  • get_database_slow_queries — Die tatsächlich langsamsten Abfrageausführungen, nach Dauer sortiert, mit Trace-IDs zum Aufrufen vollständiger Traces
  • get_database_queries — Abfragemuster und Aggregate: wie oft eine Abfrage ausgeführt wird, durchschnittliche/p95-Dauer, Fehlerrate
  • get_database_server_metrics — Serverseitige Metriken direkt vom DB-Host (CPU, Verbindungen, Buffer-Trefferraten — abhängig von Ihrem DB-System)

Unterstützt PostgreSQL, MySQL, MongoDB, Redis, Aerospike und alles andere, was OTel-Traces mit einem db_system-Attribut erzeugt — sowie Datenbanken, die anhand von Infrastrukturmetriken wie CloudWatch entdeckt werden und deren Zeilen statt Trace-Metriken einen Aktivitätswert enthalten.

Prometheus / PromQL

  • prometheus_range_query — PromQL-Bereichsabfragen für beliebige Metriken
  • prometheus_instant_query — Momentabfragen; verwenden Sie Rollup-Funktionen wie avg_over_time, sum_over_time
  • prometheus_label_values — Labelwerte für eine bestimmte Zeitreihe
  • prometheus_labels — Alle für eine Zeitreihe verfügbaren Labels

Richten Sie diese auf eine andere Datenquelle/einen anderen Cluster als den Standard aus, indem Sie LAST9_DATASOURCE festlegen, oder pro Aufruf mit datasource. Ein ausgelassenes datasource verwendet den Standard; ein eindeutiger Beinahetreffer, den der Matcher als sicher einstuft (z. B. eine Variante der Groß-/Kleinschreibung), verwendet den nächstliegenden Treffer. Bei einem fehlenden, zusätzlichen oder vertauschten Buchstaben ist eine automatische Auflösung nicht garantiert: Selbst bei nur einem Kandidaten kann eine Bestätigung erforderlich sein, wenn die Änderung einen Regions- oder Umgebungscode betreffen könnte. Weniger genaue oder mehrdeutige Treffer geben Kandidaten zurück und führen keine Abfrage aus (kein Fehler); unbekannte Namen geben einen Fehler zurück. Ein zusätzlicher Inhaltsblock nennt die verwendete Datenquelle, wenn Sie sie nicht exakt benannt haben. get_metric_status, get_service_profile und get_apm_service_deviations lösen datasource auf dieselbe Weise auf.

Logs

  • get_logs — Vollständige JSON-Pipeline-Logabfragen (Aggregationen, Filter, Felderkennung)
  • get_service_logs — Logzeilen für einen Dienst, nach Schweregrad und Inhalt filterbar; standardmäßig über 20 Zeilen zusammengefasst, sofern response_mode nicht raw ist
  • get_log_patterns — Logzeilen eines Dienstes in einem Zeitfenster, gruppiert nach Nachrichtenvorlagen, mit Anzahl, erstem/letztem Auftreten, Schweregradverteilung und einem Beispiel
  • get_emerging_log_patterns — Logvorlagen, die im Vergleich zu einem Basiszeitfenster neu sind, häufiger oder seltener auftreten oder verschwunden sind, mit den Anzahlen aus beiden Zeitfenstern
  • get_log_attributes — Globaler Katalog der Attribute im Logschema für ein Zeitfenster
  • get_log_attributes_for_pipeline — Tatsächlich vorhandene Logfelder für eine laufende Pipeline (bereichsbezogene Erkennung), jeweils mit ihrem exakten filter_field
  • get_drop_rules — Log-Verwerfungsregeln aus der Last9 Control Plane
  • add_drop_rule — Neue Verwerfungsregel erstellen, um das Logvolumen an der Quelle zu reduzieren
  • get_remapping_rules — Neuzuordnungsregeln (logs_extract, logs_map, traces_map) aus der Last9 Control Plane
  • add_remapping_rule — Neuzuordnungsregel erstellen, die Log- und Trace-Attribute bei der Aufnahme extrahiert oder zuordnet

Traces

  • get_traces — JSON-Pipeline-Traceabfragen für umfassende Suchen und Aggregationen
  • get_service_traces — Traces anhand einer exakten Trace-ID oder eines Dienstnamens. Verwenden Sie dies, wenn Sie eine Trace-ID haben — es ist schneller
  • get_trace_attributes — Globaler Katalog der Attribute im Traceschema
  • get_trace_attributes_for_pipeline — Tatsächlich vorhandene Attribute für eine laufende Pipeline (bereichsbezogene Erkennung), jeweils mit ihrem exakten filter_field
  • get_trace_attribute_values — Eindeutige Werte für ein Trace-Attribut, optional auf eine Pipeline beschränkt
  • get_trace_attribute_deviations — Ermittelt Attributwerte, die sich zwischen zwei begrenzten Span-Kohorten unterscheiden (langsam vs. schnell, Fehler vs. kein Fehler oder zwei Zeitfenster). Korrelation, keine Ursache
  • get_trace_waterfall — Ein exakter Trace als Eltern-/Kind-Wasserfalldiagramm mit Intervallvereinigungs-Eigenzeit, langsamsten Spans und Graphwarnungen

Änderungsereignisse und Alerts

  • get_change_events — Deployments, Konfigurationsänderungen, Rollbacks. Vorfälle mit den vorgenommenen Änderungen korrelieren
  • analyze_change_impact — Hat eine Änderung etwas beschädigt? Vergleicht einen Dienst und seine direkten Aufrufer vor und nach einer Änderung: Golden Signals, APM- und Trace-Attributabweichungen, neu ausgelöste Alerts und ein Urteil (regression likely / no significant change / insufficient data)
  • get_alert_groups — Konfigurierte Compass-Alertgruppen mit Metadatenlabels, Team, Tier und Regelanzahl — einschließlich Gruppen ohne Regeln und Gruppen, die nicht ausgelöst werden
  • get_alert_operations_summary — Bereitschaftszustand über ein Zeitfenster: ausgelöste und bestätigte Alerts, Rückstand, Zustellungen und mit include_rules die lautesten, flappenden und nicht weitergeleiteten Regeln. Jede Anzahl enthält ihren status (available / partial / unavailable)
  • get_alert_coverage — Was nicht überwacht wird: nicht abgedeckte Golden Signals, vollständig deaktivierte oder nicht weitergeleitete Alertgruppen und zu lange stummgeschaltete Regeln, jeweils mit einem vorgeschlagenen Korrekturtool. Nur lesend.
  • get_alert_config — Alert-Regelkonfigurationen — durchsuchbar nach Name, Schweregrad, Typ und Tags
  • get_entity_kpis — Alle KPIs (ID, Name, PromQL, Einheit) einer Alertgruppe, einschließlich KPIs, die noch von keiner Regel verwendet werden — die IDs, die create_alert und validate_alert_expression benötigen
  • create_kpi — KPI (PromQL + Einheit) für eine Alertgruppe erstellen, wenn keine vorhandene KPI passt. Einmal erstellen und die zurückgegebene ID beibehalten
  • get_alerts — Aktuell ausgelöste Alerts innerhalb eines Zeitfensters
  • get_alert_rule_state — Historischer Auslösestatus (1/0) pro Alert-Regel über einen Zeitraum, gruppiert nach rule_id. Filterbar nach Alertgruppe, Regelname, Label-Filtern und Status.
  • get_alert_hygiene — Laute, flappende, veraltete und nicht weitergeleitete Alert-Regeln über 7 oder 30 Tage, nach Rang sortiert, jeweils mit den Zahlen hinter dem Urteil und einem vorgeschlagenen Korrekturvorschlag. Nur lesend.
  • get_notification_channels — Konfigurierte Benachrichtigungskanäle (Slack, PagerDuty, E-Mail usw.). scope=channels listet die Kanäle selbst (IDs zum Verknüpfen); das standardmäßige attached listet die Verknüpfungen pro Alertgruppe
  • recommend_alert_config — Nur lesende Designhinweise (Lebenszyklus, Validierungsschranken, Kontext für Einsatzkräfte) vor dem Erstellen einer Alert-Regel
  • validate_alert_expression — Alert-Ausdruck anhand der KPIs einer Alertgruppe testen, ohne etwas zu speichern
  • describe_alert_chart — Nur lesend: die alertfähigen Signale (Schlüssel, Einheit) eines Discover-Diagramms (discover-service, discover-exceptions)
  • create_alert — Alert-Regel (statisch oder adaptiv über adaptive_std_cmp) in einer vorhandenen Alertgruppe erstellen; wird immer deaktiviert als Entwurf erstellt. Einmal erstellen; mit update_alert / patch_alert verfeinern
  • create_alert_from_chart — Alert-Regel mit statischem Schwellenwert aus einem Discover-Diagramm in einem Aufruf erstellen. Wie bei create_alert wird die Regel deaktiviert als Entwurf erstellt
  • update_alert — Vollständiger Ersatz der Auswertungskonfiguration einer Regel (kann eine Ersatzregel-ID zurückgeben)
  • patch_alert — Teiländerung einer Regel: aktivieren/pausieren, mute_until, Einsatzkräfte-properties, wöchentliches recurring_mute_schedule (oder clear_recurring_mute_schedule)
  • delete_alert — Alert-Regel dauerhaft löschen
  • mute_alert_group — Alle Regeln einer Alertgruppe bis zu einem Stichtag stummschalten (oder die Stummschaltung aufheben)
  • acknowledge_alert — Einen ausgelösten Alert übernehmen oder freigeben
  • reassign_alert — Einen bereits bestätigten Alert an einen anderen Benutzer übergeben
  • create_notification_channel — Slack-, PagerDuty-, Opsgenie-, E-Mail- oder generischen Webhook-Kanal erstellen
  • attach_notification_channel — Einen vorhandenen Kanal für breach, threat oder beides an eine Alertgruppe weiterleiten
  • detach_notification_channel — Eine Verknüpfung zwischen Kanal und Alertgruppe entfernen
  • delete_notification_channel — Einen Kanal ohne Verknüpfungen dauerhaft löschen

Die Alert-Schreibtools (create_kpi, create_alert, update_alert, patch_alert, delete_alert, create_alert_from_chart, mute_alert_group, acknowledge_alert, reassign_alert, create_notification_channel, attach_notification_channel, detach_notification_channel, delete_notification_channel) benötigen ein Token mit Schreibberechtigung; delete_alert, detach_notification_channel und delete_notification_channel benötigen stattdessen Löschberechtigung. Sie sind nur im Toolset alerts verfügbar.

Regeln, Kanäle und Verknüpfungen, die diese Tools erstellen, werden mit created_via: last9-mcp sowie dem Namen und der Version des MCP-Clients gekennzeichnet (bei Regeln mit den Annotationen _l9_created_via_ und _l9_created_via_client_, die patch_alert und update_alert beibehalten und die Aufrufer nicht festlegen können). get_entity_alert_rules und get_notification_channels zeigen die Kennzeichnung an, und delete_alert, detach_notification_channel und delete_notification_channel weisen Agents an, nur gekennzeichnete Ressourcen zu bereinigen, sofern der Benutzer keine bestimmte Ressource nennt.

Benutzerdefinierte Dashboards

  • list_dashboards — Benutzerdefinierte Dashboards, nach Namen gefiltert und auf unter 32 KB paginiert: IDs, Namen, letzte Aktualisierungszeiten, Autoren und Sperrstatus
  • get_dashboard — Vollständige Dashboard-Definition anhand der ID, einschließlich Panels und Abfragen
  • preview_dashboard — Nur lesende Vorschau eines nicht gespeicherten Dashboards oder Patches: aufgelöste Abfragen, begrenzte Ergebnisse pro Panel und Netto-Panel-Diff; wird nie gespeichert
  • validate_dashboard — Nur lesendes Linting, Ausführen und Klassifizieren für eine gespeicherte Dashboard-ID oder ein Inline-dashboard_definition über ein Zeitfenster von ≤24h. Erstellt oder aktualisiert niemals Dashboards
  • create_dashboard — Ein neues benutzerdefiniertes Dashboard einmalig erstellen (Panels, Abfragen, Metadaten). Nach Rückgabe der ID Panels mit patch_dashboard bearbeiten.
  • update_dashboard — Den Großteil eines vorhandenen Dashboards anhand der ID neu strukturieren (vollständiger Ersatz; schreibgeschützte System-Dashboards geben einen Fehler zurück). Für einzelne Panel-Bearbeitungen patch_dashboard verwenden
  • patch_dashboard — Gezielte Änderungen an einem vorhandenen Dashboard anhand der ID (Panel hinzufügen/aktualisieren/entfernen/verschieben, Titel festlegen, Variable festlegen); gibt einen kompakten Diff statt des vollständigen Dashboards zurück
  • delete_dashboard — Ein benutzerdefiniertes Dashboard anhand der ID löschen
  • set_dashboard_lock — Ein benutzerdefiniertes Dashboard anhand der ID sperren oder entsperren (nur Autor oder Org-Admin); ein gesperrtes Dashboard verweigert Aktualisierungen, Patches und Löschungen
  • list_dashboard_snapshots — Eingefrorene Momentaufnahmen eines Dashboards (nur Metadaten)
  • get_dashboard_snapshot — Vollständige eingefrorene Momentaufnahme einschließlich Paneldaten für RCA-/teilbare Ansichten
  • delete_dashboard_snapshot — Eine eingefrorene Momentaufnahme anhand der ID löschen

Das Erstellen von Dashboards ist über MCP prompts/list und prompts/get verfügbar, ohne einen Skill zu installieren. Alle drei Prompts benötigen keine Argumente:

  • create_dashboard_guide — Erkennung, Layout und Panelauswahl; den vollständigen Kandidaten validieren und die Abfrage jedes Panels vor der Freigabe ausführen, einmalig erstellen, gezielte Änderungen patchen und anschließend erneut auslesen.
  • dashboard_examples — Ein vollständiges Beispiel mit Service-RED, Endpunktlatenz, Statusklassen, Host-Zustand, Loganzahlen und Trace-Panels sowie abhängigen Variablen.
  • query_guide — Semantik von Counter/Gauge/Histogramm und abgeleiteten Trace-Metriken, Moment- gegenüber Bereichsabfragen, Rate-Fenster, Prozentgrenzen sowie logjson-/tracejson-Regeln.

Derselbe Inhalt ist unter last9://reference/create_dashboard_guide, last9://reference/dashboard_examples und last9://reference/query_guide lesbar. Prompts und Ressourcen bleiben in jedem Toolset auffindbar; zum Ausführen des Workflows sind die entsprechenden Tools erforderlich (für das Erstellen von Dashboards mit gemischten Signalen --toolsets=dashboards,investigate verwenden, das auch list_datasources bereitstellt). Sitzungen mit Nur-Lesezugriff können vorbereiten und validieren, aber nicht speichern. Prüfen Sie die Verfügbarkeit der Tools, bevor Sie einen Schritt ausführen.

Panelprüfungen verwenden derzeit prometheus_range_query, prometheus_instant_query, get_logs und get_traces zusammen mit validate_dashboard. Die nicht unterstützten Abfragetypen und vereinfachten Standardwerte des Validators belegen keine Rendering-Parität. Der separate Schritt zur Abfrageprüfung wird nach der Bereitstellung von #475 zu query_panel wechseln.

Kontinuierliches Profiling

Erfordert, dass kontinuierliches Profiling für die Organisation aktiviert ist. Entdecken Sie zuerst Dienste mit get_profile_services und rufen Sie anschließend ein Flamegraph oder eine Rangliste der Funktionen ab.

  • get_profile_services — Services mit Profiling-Daten im Zeitfenster (Index vor der Abfrage)
  • get_flamegraph — Verschachtelter Flamegraph-Baum für einen Service (cpu Standard; außerdem alloc, wall)
  • get_top_functions — Rangliste der Self-Samples der heißesten Funktionen für einen Service
  • get_profile_summary — Kurze natürlichsprachliche Triage des Profils für einen Service

Grafana-Dashboards

Schreibgeschützte Tools für die Grafana-Instanz der Organisation (über den Grafana-Proxy von Last9). Anmeldedaten werden dem Modell niemals zurückgegeben. Aktivieren mit LAST9_TOOLSETS=grafana (oder Toolsets nicht festlegen, um alle Tools zu verwenden).

  • grafana_search_dashboards — Dashboards anhand eines Teilstrings im Titel suchen (paginiert; truncated: true, wenn das Limit erreicht ist)
  • grafana_get_dashboard — Dashboard-Zusammenfassung anhand der UID (Panels, Variablen, PromQL-Ziele); full_json=true für rohes Grafana-JSON
  • grafana_list_folders — Ordnerstruktur
  • grafana_list_folder_dashboards — Dashboards in einem Ordner (paginiert)
  • grafana_list_datasources — Datenquelleninventar ohne Anmeldedaten

Unscharfe Namensauflösung

  • did_you_mean — Wenn der Agent bei einem Entitätsnamen unsicher ist, gibt dieses Tool die ähnlichsten Treffer aus Ihrem Katalog zurück (Services, Umgebungen, Hosts, Datenbanken, K8s-Deployments/Namespaces, Jobs). Bis zu 3 Vorschläge mit Ähnlichkeitswerten. Der Server ruft dieses Tool automatisch vor den meisten anderen Tools auf, wenn eine Namenssuche keine Treffer ergibt.

Serviceprofil

  • get_service_profile — Wie die Telemetrie eines Services tatsächlich aussieht, bevor Sie sie abfragen: welche Signale vorhanden sind, Sprache und Laufzeitumgebung, Deployment-Umgebungen, die Struktur der Logs und eine empfohlene Korrektur der Datenerfassung, sofern zutreffend. So kann der Agent Trace-Tools überspringen, wenn ein Service keine Traces hat, und den Schweregrad aus dem Log-Body auslesen, wenn SeverityText leer ist, statt danach zu filtern und nichts zu finden.

Funktionsweise

Direktlinks in jeder Antwort. Jedes Tool gibt ein Feld deep_link zurück — eine direkte URL zum Last9-Dashboard für genau diese Abfrage und diesen Zeitraum. Der Agent kann Ihnen den Link geben; Sie klicken darauf und sind direkt dort.

Toolsets. Standardmäßig stellt der Server alle Tools bereit. Automatisierungs-Hosts, die nur Untersuchungen benötigen (Logs/Traces/Metriken/Profile), können LAST9_TOOLSETS=investigate festlegen (oder --toolsets=investigate übergeben), damit tools/list klein bleibt, ohne dass Tools clientseitig massenhaft deaktiviert werden müssen. Benannte Pakete: logs, traces, metrics, alerts, dashboards, profiles, grafana, investigate, all. Unbekannte Namen führen zu einem sofortigen Fehler. get_current_time und get_workspace_overview werden in jedem Toolset bereitgestellt. Im HTTP-Modus kann eine Anfrage die Auswahl mit dem Header X-Last9-Toolsets weiter einschränken (siehe Toolsets pro Anfrage). Das Paket alerts stellt außerdem die schreibgeschützten Tools prometheus_range_query und get_dashboard bereit, die der Prompt author-alert aufruft. Das Paket metrics allein enthält nicht list_datasources oder did_you_mean — verwenden Sie investigate (oder kombinieren Sie Toolsets), wenn Sie diese Ermittlungshilfen benötigen.

Ressourcen zur Toolreferenz. Umfangreiche Handbücher zu logjson/tracejson/service-logs/metrics sind MCP-Ressourcen (last9://reference/logjson, last9://reference/tracejson, last9://reference/service_logs, last9://reference/metrics, last9://reference/investigation, last9://reference/alerting) und kein ständig verfügbarer Text in Toolbeschreibungen. Das Handbuch zur Alarmierung behandelt die Grammatik für Alarmausdrücke, statische und adaptive Felder, Einheiten, die Prüfungen von validate_alert_expression sowie Vorlagen für Regeln zu Latenz, Fehlerrate und Auslastung. Kritische Abfrageregeln bleiben in der Toolbeschreibung, damit auch Agenten, die resources/read nie aufrufen, korrekte Hinweise zur Erstellung von Abfragen erhalten. Ermitteln Sie organisationsspezifische Felder mit get_log_attributes / get_log_attributes_for_pipeline (und den entsprechenden Trace-Tools) — sie werden nicht in Beschreibungen eingefügt.

Große Ergebnisse in Blöcken. get_logs und get_traces verarbeiten große Ergebnismengen in Blöcken, statt sie abzuschneiden. Das Standardlimit für Logs beträgt 5000 Einträge; konfigurierbar über LAST9_MAX_GET_LOGS_ENTRIES.


Entwicklung

HTTP-Modus, curl-Tests, aus dem Quellcode erstellen

Im HTTP-Modus ausführen

export LAST9_REFRESH_TOKEN="your_refresh_token"
export LAST9_HTTP=true
export LAST9_PORT=8080
./last9-mcp-server

Der Server startet unter http://localhost:8080/mcp.

Mit curl testen

Der Streamable-HTTP-Handler läuft im zustandslosen Modus, sodass jede Anfrage unabhängig verarbeitet wird. Ein initialize-Handshake und ein Mcp-Session-Id-Header sind optional — Clients, die sie senden, funktionieren weiterhin (der Header wird akzeptiert und ignoriert), und Clients können auch direkt zu tools/list / tools/call wechseln. Jedes Tool ist eine unabhängige Anfrage-Antwort-Abfrage; der Server sendet keine Benachrichtigungen an Clients, daher gibt GET /mcp (der SSE-Stream) 405 zurück.

# List tools — a session handshake is optional in stateless mode
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'

# Call a tool
curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{
      "jsonrpc": "2.0",
      "id": 2,
      "method": "tools/call",
      "params": {
        "name": "get_service_logs",
        "arguments": {
          "service_name": "your-service-name",
          "lookback_minutes": 30,
          "limit": 10
        }
      }
    }'

Toolsets pro Anfrage

Im HTTP-Modus kann eine Anfrage die verfügbaren Tools mit dem Header X-Last9-Toolsets oder dem Abfrageparameter toolsets für Clients einschränken, die keine Header setzen können (/mcp?toolsets=logs,traces). Wenn beide gesendet werden, hat ein nicht leerer Header Vorrang. Der Wert verwendet dieselben durch Kommas getrennten Namen wie --toolsets. Für die Anfrage gilt die Schnittmenge mit dem beim Start festgelegten --toolsets: Sie kann die Auswahl einschränken, aber niemals erweitern; all oder ein leerer Wert lässt die beim Start festgelegte Auswahl unverändert. Bei einem unbekannten Namen wird 400 zurückgegeben, das den Namen nennt. tools/list, tools/call und die Anweisungen für initialize richten sich alle nach der effektiven Auswahl; get_current_time und get_workspace_overview sind in jeder Auswahl enthalten.

curl -s -X POST http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -H "X-Last9-Toolsets: logs,alerts" \
    -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}'

Jede unterschiedliche effektive Auswahl wird von einem eigenen Server bereitgestellt, der bei der ersten Anfrage erstellt (Dutzende Millisekunden) und bis zum Herunterfahren beibehalten wird; eine Anfrage, die die beim Start festgelegte Auswahl erneut angibt, verwendet den Startserver wieder. Es gibt keine Bereinigung: Es werden nur benannte Toolsets akzeptiert, daher enthält der Cache höchstens einen Server pro Kombination dieser Toolsets (heute 135, zusammen etwa 75 MB belegter Heap; ein vollständig gefüllter Cache stabilisierte sich in Tests bei knapp 230 MB residentem Speicher).

Aus dem Quellcode erstellen

git clone https://github.com/last9/last9-mcp-server.git
cd last9-mcp-server
go build -o last9-mcp-server
LAST9_HTTP=true ./last9-mcp-server

LAST9_HTTP=true ist für die lokale Entwicklung gedacht. Für die tatsächliche Nutzung ist der gehostete HTTP-Endpunkt einfacher.


Toolreferenz

Alle Parameter, Zeitangaben und Details

Zeiteingabe

  • Absolute Zeitangaben (start_time_iso/end_time_iso oder time_iso) haben Vorrang vor lookback_minutes.
  • Für relative Zeitfenster: lookback_minutes verwenden.
  • Für absolute Zeitfenster: RFC3339/ISO8601 verwenden — 2026-02-09T15:04:05Z.
  • Das veraltete YYYY-MM-DD HH:MM:SS wird nur aus Kompatibilitätsgründen akzeptiert.
  • Formulierungen wie since yesterday 9am IST mit get_current_time in RFC3339-Grenzwerte umwandeln.

get_workspace_overview

Keine Parameter. Prüft parallel die letzten 60 Minuten, wobei jeder Teilaufruf ein kurzes Zeitlimit hat, und gibt current_time, lookback_minutes, environments, telemetry (logs/traces/metrics-Boolesche Werte), service_count (Ränge der unterschiedlichen Services get_service_summary, alle Umgebungen), alert_group_count, firing_alert_count und errors ([{field, error}]) zurück. Ein Feld, dessen Teilaufruf fehlgeschlagen ist, ist null (unbekannt), niemals 0 oder false. Die Prüfungen werden nicht durch --toolsets eingeschränkt: Toolsets bestimmen, welche Tools bereitgestellt werden, und das API-Token legt fest, worauf der Server zugreifen kann.

get_current_time

  • range (String, optional): last 2h, past 30 minutes, last 7d (s, m, h, d = 24 h, w = 7 d; höchstens 366 d); today; yesterday; since <point>; <point> to <point>. Ein Zeitpunkt ist im RFC3339-Format oder today / yesterday / ein Wochentag (monday, mon: das letzte Vorkommen, einschließlich heute) / YYYY-MM-DD mit optionalem 9am, 9:30pm oder 14:30. Eine nachgestellte Zeitzone überschreibt timezone für beide Grenzen; eine Zeitzone an anderer Stelle führt zu einem Fehler. Weglassen, um nur now zu erhalten.
  • timezone (String, optional): IANA-Name oder Abkürzung (IST = Asia/Kolkata, PST/PDT, EST/EDT, UTC, GMT). Standard: UTC. Unbekannte Zeitzonen führen zu einem Fehler, ebenso das mehrdeutige CST (übergeben Sie America/Chicago oder Asia/Shanghai).

Gibt now (und start/end mit range) als {iso, epoch_seconds, local} zurück; local erscheint nur bei einer Nicht-UTC-Zeitzone.

get_exceptions

  • limit (Ganzzahl, optional): Maximale Anzahl von Ausnahmen. Standard: 20.
  • lookback_minutes (Ganzzahl, optional): Standard: 60.
  • start_time_iso / end_time_iso (String, optional): Absoluter Zeitraum.
  • service_name (String, optional): Nach Service filtern.
  • span_name (String, optional): Nach Span-Namen filtern.
  • env (String, optional): Nach Umgebung filtern.

get_service_summary

  • start_time_iso / end_time_iso (String, optional)
  • env (String, optional): PromQL-RegEx. Standardmäßig .*. Für eine exakte Übereinstimmung sind Anker erforderlich (z. B. ^prod$).
  • sort_by (String, optional): request_count (Standard), throughput_rpm, http_4xx_count, http_5xx_count oder grpc_error_count.
  • limit (Ganzzahl, optional): Maximale Anzahl der Ranglisteneinträge. Weglassen oder 0 bedeutet 10; Werte über 100 werden auf 100 begrenzt.

get_service_environments

  • start_time_iso / end_time_iso (String, optional)

Für alle anderen APM-Tools ist ein Wert für env erforderlich. Verwenden Sie "", wenn dieses Tool keine Ergebnisse zurückgibt.

get_service_performance_details

Gibt standardmäßig eine Zusammenfassung pro Zeitreihe zurück: points, missing_points (Verfügbarkeitsintervalle ohne Datenverkehr, die aus der Statistik ausgeschlossen werden), min, p50, p90, p99 (Nearest-Rank), max, mean, last, baseline_mean (Mittelwert der ersten Hälfte der gültigen Punkte, nicht des Zeitfensters), delta_pct (zweite Hälfte der gültigen Punkte im Vergleich zur Basislinie; fehlt, wenn die Basislinie 0 ist) und bis zu 3 change_points (timestamp, before_mean, after_mean), für bis zu 4 Zeitreihen pro Metrik und jedes Quantil der Antwortzeit (höchster Mittelwert zuerst; series_omitted zählt die übrigen). Eine Zeitreihe mit points: 0 enthält keine Statistiken, und baseline_mean/delta_pct erfordern mindestens 6 Punkte (3 pro Hälfte). full_series kennzeichnet, dass Rohdatenpunkte über include_series verfügbar sind.

  • service_name (String, erforderlich)
  • lookback_minutes (Ganzzahl, optional): Standard: 60.
  • start_time_iso / end_time_iso (String, optional)
  • env (String, optional): Standardmäßig prod.
  • top_n (Ganzzahl, optional): Maximale Anzahl von Einträgen pro Liste der häufigsten Operationen/Fehler. Standard: 5 oder 10 mit include_series=true. Höchstens 100.
  • include_series (Boolesch, optional): Gibt jeden Punkt jeder Zeitreihe statt der Zusammenfassung zurück. Standard: false.

get_service_operations_summary

  • service_name (String, erforderlich)
  • lookback_minutes (Ganzzahl, optional): Standard: 60.
  • start_time_iso / end_time_iso (String, optional)
  • env (String, optional): Standardmäßig prod.

get_service_dependency_graph

  • service_name (String, optional)
  • lookback_minutes (Ganzzahl, optional): Standard: 60.
  • start_time_iso / end_time_iso (String, optional)
  • env (String, optional): Standardmäßig prod.

get_apm_service_deviations

  • service_name (string, optional): Für den Fleet-Bereich weglassen; für einen Dienst und dessen Operationskorrelationen angeben.
  • lookback_minutes (integer, optional): Aktuelles Zeitfenster. Standard: 60.
  • start_time_iso / end_time_iso (string, optional): Explizites aktuelles Zeitfenster.
  • baseline_start_time_iso / baseline_end_time_iso (string, optional): Explizite Baseline. Standardmäßig das unmittelbar vorhergehende Zeitfenster gleicher Dauer.
  • datasource (string, optional): Für den Standardwert weglassen; ungefähre Namen werden wie bei den Prometheus-Tools aufgelöst. Die Antwort nennt den verwendeten Standardwert oder die nächstliegende Übereinstimmung; bei mehrdeutigen Namen werden Kandidaten zurückgegeben, ohne eine Abfrage auszuführen.
  • env (string, optional): Standardwert ist prod.
  • max_services / max_operations (integer, optional): Standardwert 10, jeweils maximal 10.

get_databases

  • env (string, optional): Nach Umgebung filtern. Akzeptiert einen regulären Ausdruck. Standard: alle.
  • lookback_minutes (integer, optional): Standard: 60. Das Zeitfenster darf 7 Tage nicht überschreiten.
  • start_time_iso / end_time_iso (string, optional)

get_database_slow_queries

  • db_system (string, optional): z. B. postgresql, mysql, mongodb, redis.
  • host (string, optional): Datenbankhost (net_peer_name).
  • service_name (string, optional): Name des aufrufenden Dienstes.
  • env (string, optional)
  • min_duration_ms (float, optional): Mindestdauer der Abfrage in ms.
  • lookback_minutes (integer, optional): Standard: 60.
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional): Standard: 20.

get_database_queries

  • db_system (string, optional)
  • host (string, optional)
  • service_name (string, optional)
  • env (string, optional)
  • lookback_minutes (integer, optional): Standard: 60.
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional): Standard: 20.

get_database_server_metrics

  • db_system (string, required): z. B. postgresql, mysql, mongodb, redis, aerospike.
  • host (string, optional)
  • lookback_minutes (integer, optional): Standard: 60.
  • start_time_iso / end_time_iso (string, optional)

prometheus_range_query

  • query (string, required): Die PromQL-Abfrage.
  • start_time_iso / end_time_iso (string, optional): Standardmäßig die letzten 60 Minuten.
  • lookback_minutes (float, optional): Standard: 60.

prometheus_instant_query

  • query (string, required)
  • time_iso (string, optional): Standardmäßig jetzt.
  • lookback_minutes (float, optional)

prometheus_label_values

  • match_query (string, optional): PromQL-Filter.
  • label (string, required): Labelname.
  • lookback_minutes (float, optional): Standard: 60.
  • start_time_iso / end_time_iso (string, optional)

Wenn kein Zeitfenster angegeben ist und match_query eine einzelne Metrik bezeichnet (metric{...} oder {__name__="metric"}), wird ein leeres Ergebnis für 60 Minuten einmal über 4 Tage erneut abgefragt; ein zweiter Textblock gibt an, welches Zeitfenster das Ergebnis abdeckt.

prometheus_labels

  • match_query (string, optional): PromQL-Filter.
  • lookback_minutes (float, optional): Standard: 60.
  • start_time_iso / end_time_iso (string, optional)

Eine leere Suche nach einer einzelnen Metrik wird wie bei prometheus_label_values über 4 Tage erneut ausgeführt.

get_logs

  • logjson_query (array, required): JSON-Pipeline-Abfrage.
  • lookback_minutes (integer, optional): Standard: 5.
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional): Serverstandard: 5000.
  • index (string, optional): physical_index:<name> oder rehydration_index:<block_name>.
  • response_mode (string, optional): summary (Standard; auch für null) oder raw. Ein Ergebnis mit Rohzeilen von mehr als 20 Zeilen wird als summary zurückgegeben: lines_summarized, severity_counts (die sechs häufigsten Labels, der Rest in other_severities), first_timestamp/last_timestamp, ein histogram mit 10 Buckets über das Abfragezeitfenster (über die zurückgegebenen Zeilen, mit truncated: true, wenn das Limit das Ergebnis abgeschnitten hat) und die häufigsten patterns (template, count, bis zu zwei samples), wobei der Rest in other aufsummiert wird; maximal 4000 Zeichen. Metadaten der obersten Ebene, die weiterhin nicht hineinpassen, werden verworfen und in dropped_fields aufgeführt. raw gibt die Zeilen zurück. Aggregierte Ergebnisse werden nie zusammengefasst.

Für ein logbasiertes Dienstinventar zuerst physical_index_service_count abfragen:

sum by (name, service_name, env) (physical_index_service_count{destination="logs"})

service_name als ServiceName, env als Umgebung, sofern vorhanden, und name als physischen Indexnamen verwenden. Wenn name="default", index weglassen; für einen vom Benutzer ausgewählten, nicht standardmäßigen physischen Index index: "physical_index:<name>" übergeben. Wenn das Backend die explizite Filterung nach physischem Index ablehnt, ohne index erneut versuchen und melden, dass die explizite Filterung nach physischem Index für dieses Backend nicht verfügbar ist.

get_service_logs

  • service_name (string, required)
  • lookback_minutes (integer, optional): Standard: 60.
  • limit (integer, optional): Standard: 100 oder 20 mit response_mode: "raw".
  • env (string, optional)
  • severity_filters (array, optional): z. B. ["error", "warn"]. ODER-Logik.
  • body_filters (array, optional): z. B. ["timeout", "failed"]. ODER-Logik.
  • start_time_iso / end_time_iso (string, optional)
  • index (string, optional)
  • response_mode (string, optional): summary (Standard; auch für null) oder raw. Bei mehr als 20 Zeilen wird logs durch dieselbe summary wie bei get_logs ersetzt; die übrigen Felder bleiben erhalten. raw gibt die Einträge zurück.

Mehrere Filtertypen werden mit UND verknüpft. Innerhalb jedes Arrays gilt ODER. Für breite aggregierte Zählungen zuerst get_logs verwenden; get_service_logs erst nach dem Eingrenzen auf einen Dienst/eine Umgebung/einen Index und eine kleine Stichprobe verwenden.

get_log_patterns

  • service_name (string, required)
  • env (string, optional)
  • start_time_iso / end_time_iso (string, optional)
  • lookback_minutes (integer, optional): Standard: 60.
  • severity_filters / body_filters (array, optional): ODER-Logik wie bei get_service_logs. severity_filters nur setzen, wenn get_service_profile severity_set all meldet; mit none oder partial werden Zeilen verworfen, deren Schweregrad im Body steht.
  • index (string, optional)
  • sample_size (integer, optional): Aus dem Zeitfenster entnommene Zeilen, neueste zuerst. Standard: 1000, maximal: 5000.
  • top_n (integer, optional): Zurückgegebene Vorlagen nach Anzahl. Standard: 20, maximal: 100. Der Rest wird in other aufsummiert.

Die Clusterbildung erfolgt im MCP-Server anhand der entnommenen Zeilen. Daher beziehen sich Anzahl, first_seen und last_seen auf die Stichprobe. window.sample_limit_reached weist darauf hin, wenn in der Stichprobe passende Zeilen fehlen könnten (sie enthält sample_size Zeilen und die API meldet keine exakte total_matching_lines in dieser Höhe, oder die Suche war logs_truncated); in diesem Fall enthält sie nur die neuesten Zeilen des Zeitfensters. Jedes template und sample wird bei 500 Zeichen abgeschnitten und endet mit …, sodass ein Body, der keine Clusterbildung ermöglicht (etwa JSON ohne ein Feld message), die Antwort nicht füllen kann. Eine Suche mit fehlgeschlagenen Chunks ist ein Toolfehler; eine abgeschnittene oder begrenzte Suche gibt weiterhin Muster zurück, gekennzeichnet durch sample_limit_reached. Eine leere Liste patterns bedeutet nur dann, dass nichts übereinstimmte, wenn sample_limit_reached false ist; ist der Wert true, wurde die Suche vorzeitig beendet und passende Zeilen könnten fehlen.

get_emerging_log_patterns

Übernimmt alle Parameter von get_log_patterns (der Zeitbereich ist das aktuelle Zeitfenster) sowie:

  • baseline_start_time_iso / baseline_end_time_iso (string, optional): Beide oder keinen setzen. Standardmäßig das unmittelbar vorhergehende Zeitfenster gleicher Länge.
  • min_count (integer, optional): Anzahl der Zeilen, die ein geändertes Muster in dem Zeitfenster benötigt, in dem es häufiger ist: aktuell für new/increased, Baseline für decreased/disappeared. Standard: 3 (oder sample_size, falls kleiner), maximal: sample_size.
  • change_factor (number, optional): Häufigkeitsverhältnis größer als 1, das ein Muster, das in beiden Zeitfenstern vorkommt, erreichen (increased) oder auf dessen Kehrwert fallen muss (decreased). Standard: 2.

Beide Schwellenwerte müssen erfüllt sein. Daher wird eine Vorlage mit hohem Volumen, deren Häufigkeit sich nicht um change_factor geändert hat, nie gemeldet. Zurückgegeben werden nur geänderte Vorlagen (new, increased, decreased, disappeared) mit den Zählwerten current und baseline; unchanged_patterns zählt Vorlagen, die in beiden Zeitfenstern vorkommen und sich um weniger als change_factor geändert haben, und below_min_count_patterns zählt Änderungen, die wegen weniger als min_count Zeilen verworfen wurden. Häufigkeiten werden pro Minute verglichen, wenn beide Stichproben alle passenden Zeilen enthalten; pro Minute geschätzt anhand der exakten total_matching_lines einer begrenzten Stichprobe; andernfalls als Anteile der Stichprobe. Dabei beschreiben increased/decreased die Zusammensetzung statt der Rate (comparison_basis). Eine leere Liste patterns bedeutet, dass keine Änderung beide Schwellenwerte überschreitet, nicht, dass die Logs unverändert sind: seltenere Änderungen werden in below_min_count_patterns gezählt, und ein Zeitfenster mit sample_limit_reached vergleicht Stichproben, nicht ganze Zeitfenster.

get_log_attributes

  • lookback_minutes (integer, optional): Standard: 15.
  • start_time_iso / end_time_iso (string, optional)
  • region (string, optional)
  • index (string, optional)

get_log_attributes_for_pipeline

  • pipeline (array, required): Vorherige Filterstufen zur Eingrenzung der Ermittlung, z. B. [{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].
  • lookback_minutes (integer, optional): Standard: 15.
  • start_time_iso / end_time_iso (string, optional)
  • region (string, optional)
  • index (string, optional)

get_drop_rules

Keine Parameter. Listet Drop-Regeln über GET /otel_settings/drop?region=... auf.

add_drop_rule

  • name (string, required)
  • filters (array, required): Jeder Filter: key, value, operator (equals/not_equals), conjunction (and).
  • Filterschlüssel müssen attributes["key_name"] oder resource.attributes["key_name"] verwenden (von der Last9-API verlangt).
  • Erstellt die Regel über POST /otel_settings/drop?region=...&cluster_id=....

get_remapping_rules

  • rule_type (string, required): logs_extract, logs_map oder traces_map.
  • region (string, optional): Standardmäßig die konfigurierte Datasource-Region.
  • Listet Regeln über GET /otel_settings/remapping/{rule_type}?region=... auf.

add_remapping_rule

Erstellt pro Aufruf eine Regel; für Zuordnungsregeln ist ein Aufruf pro target_attribute erforderlich.

  • rule_type (string, erforderlich): logs_extract, logs_map oder traces_map.
  • name (string, erforderlich)
  • remap_keys (array, erforderlich): Quellfelder. logs_extract mit json: Namen der Body-Felder; mit pattern: genau ein Regex mit einer benannten Capture-Gruppe. Zuordnungsregeln: Attributpfade, der erste nicht leere Wert gewinnt.
  • target_attribute (string, erforderlich): logs_extract: log_attributes oder resource_attributes. logs_map: service, severity oder resource_deployment.environment. traces_map: service.
  • extract_type (string, nur logs_extract, dort erforderlich): json oder pattern.
  • action (string, nur logs_extract): upsert (Standard) oder insert.
  • prefix (string, nur logs_extract)
  • preconditions (array, nur logs_extract): Höchstens ein {key, value, operator}; operator ist equals (Standard), not_equals oder like (Regex).
  • region (string, optional): Standard: die konfigurierte Datenquellenregion.
  • Erstellt die Regel über POST /otel_settings/remapping/{rule_type}?region=.... Wird nie erneut versucht; nach einem Timeout mit get_remapping_rules prüfen.

get_traces

Für umfassende Suchen und Aggregationen verwenden. Für die Suche nach einer exakten Trace-ID get_service_traces verwenden.

  • tracejson_query (array, erforderlich)
  • start_time_iso / end_time_iso (string, optional)
  • lookback_minutes (integer, optional): Standard: 60.
  • limit (integer, optional): Standard: 5000.

get_service_traces

Genau eines von trace_id oder service_name ist erforderlich.

  • trace_id (string, optional): Standard-Rückblick: 72 Stunden.
  • service_name (string, optional): Standard-Rückblick: 60 min.
  • lookback_minutes (integer, optional)
  • start_time_iso / end_time_iso (string, optional)
  • limit (integer, optional): Standard: 10.
  • env (string, optional)

get_trace_attributes

  • lookback_minutes (integer, optional): Standard: 15.
  • start_time_iso / end_time_iso (string, optional)
  • region (string, optional)

get_trace_attributes_for_pipeline

  • pipeline (array, erforderlich): Vorherige Filterstufen zur Eingrenzung der Ermittlung, z. B. [{"type":"filter","query":{"$eq":["ServiceName","<service>"]}}].
  • lookback_minutes (integer, optional): Standard: 15.
  • start_time_iso / end_time_iso (string, optional)
  • region (string, optional)

get_trace_attribute_values

  • tag_name (string, erforderlich): Attributname aus get_trace_attributes (z. B. resource_department oder attributes['http.method']).
  • pipeline (array, optional): Vorherige Filterstufen zur Eingrenzung der Werte; für globale Werte weglassen.
  • lookback_minutes (integer, optional): Standard: 15.
  • start_time_iso / end_time_iso (string, optional): Historische RFC3339-Grenzwerte; haben Vorrang vor lookback_minutes.
  • region (string, optional)

get_trace_attribute_deviations

  • comparison_mode (string, erforderlich): latency, errors oder time.
  • service_name (string, erforderlich)
  • environment (string, erforderlich): Exakter Wert von deployment.environment.
  • operation (string, optional)
  • filters (array, optional): Trace-JSON-Filterbedingungen.
  • candidate_attributes (array, optional): Höchstens 8; für eine begrenzte Ermittlung weglassen.
  • latency_threshold_ms (number, optional): Für den Modus latency erforderlich; für andere Modi abgelehnt.
  • start_time_iso / end_time_iso (string, optional)
  • lookback_minutes (integer, optional): Standard: 15. Maximum: 15.
  • baseline_start_time_iso / baseline_end_time_iso (string, optional): Für den Modus time erforderlich; nicht überlappend und von gleicher Dauer wie das Zielfenster.
  • minimum_cohort_size (integer, optional): Standard: 100. Minimum: 20.
  • minimum_value_support (integer, optional): Standard: 20. Minimum: 10.
  • limit (integer, optional): Standard: 10. Maximum: 10.

Erfordert, dass die zugehörige Backend-Funktion aktiviert ist.

get_trace_waterfall

  • trace_id (string, erforderlich)
  • environment (string, optional)
  • start_time_iso / end_time_iso (string, optional)
  • lookback_minutes (integer, optional): Standard: 4320 (72 Stunden).
  • selected_span_id (string, optional): Gibt Attribute, Ereignisse und Links nur für diesen Span zurück.
  • max_spans (integer, optional): Standard: 500. Maximum: 1000; die Schwärzungsrichtlinie der Organisation kann den Wert weiter begrenzen.

Gibt den investigation-evidence/v1-Envelope des Trace-Dienstes unverändert zurück; der Waterfall befindet sich unter data. Der Dienst erstellt den Waterfall und schwärzt Werte gemäß einer organisationsspezifischen Richtlinie (Anmeldedaten, Abfrage-Literale, URLs, E-Mail-Adressen, IPs, Benutzerkennungen), bevor die Daten das Backend verlassen: sanitizer benennt die angewendete Richtlinie und evidence.sanitization zählt die geschwärzten oder abgeschnittenen Werte. Wenn benötigte Daten geschwärzt sind, bitte einen Organisationsadministrator, die Richtlinie anzupassen, statt sie zu umgehen. Das Tool lehnt eine Antwort ohne sanitizer-Block, mit einem anderen sanitizer.version als trace-evidence-sanitizer/v1, mit einem Body, der einen JSON-Schlüssel wiederholt, oder mit einem Body über 512 KiB ab (niedrigeres max_spans). Erfordert, dass die zugehörige Backend-Funktion aktiviert ist.

get_change_events

  • start_time_iso / end_time_iso (string, optional)
  • lookback_minutes (integer, optional): Standard: 60.
  • service_name (string, optional)
  • env (string, optional)
  • event_name (string, optional): Diesen Parameter zunächst weglassen, um available_event_names abzurufen.

analyze_change_impact

Genau eines von change_event oder service + timestamp übergeben.

  • change_event (object, optional): Ein Element aus get_change_events change_events[], unverändert. Verwendet metric.service, metric.deployment_environment und das früheste values[].timestamp.
  • service (string, optional): Erforderlich zusammen mit timestamp, wenn change_event weggelassen wird.
  • timestamp (string, optional): RFC3339 oder Unix-Sekunden, auf die Minute abgerundet.
  • env (string, optional): Exakte Umgebung. Standard: die des Ereignisses, andernfalls alle.
  • baseline_minutes (integer, optional): Standard: 60. Auf 30..120 begrenzt.
  • after_minutes (integer, optional): Standard: baseline_minutes. Auf 30..120 begrenzt und bei jetzt gedeckelt.

regression likely, wenn eine der folgenden Bedingungen zutrifft: Die Fehlerrate steigt um mindestens 1 Prozentpunkt, p95 steigt um mindestens 40 % oder der Durchsatz (rpm) sinkt für den Dienst oder einen seiner 10 wichtigsten Aufrufer um mindestens 50 %, sortiert nach Durchsatz über beide Zeitfenster zusammen (nur bei mindestens 100 Anfragen vor der Änderung und, außer beim Durchsatz, danach; p95 berücksichtigt nur die Anfragen von latency_env); ein Alarm für sie beginnt nach der Änderung auszulösen und löst am Ende des Nachher-Zeitfensters weiterhin aus (ohne Beachtung der Groß-/Kleinschreibung anhand des Alarmgruppennamens oder eines Labels service, service_name oder service.name abgeglichen, andernfalls anhand einer Annotation (niemals anhand von Freitext wie einer Zusammenfassung); mit env werden Alarme mit einer anderen Umgebung als Label ohne Beachtung der Groß-/Kleinschreibung verworfen und Alarme ohne Umgebungslabel als env_match: unlabelled markiert); eine Regression aus get_apm_service_deviations. insufficient data, wenn das Nachher-Zeitfenster kürzer als 5 Minuten ist (einschließlich einer Änderung in der Zukunft), der Dienst zu wenige Anfragen hat oder Golden Signals, die Suche nach direkten Aufrufern, Alarme oder get_apm_service_deviations fehlgeschlagen sind, vollständig oder bei einer der in deviations.apm.unavailable aufgeführten Abfragen: Fehlende Nachweise führen nie zu no significant change, und eine dennoch gefundene Regression benennt den Fehler. no significant change ist eine gültige Antwort, kein Fehler. Abweichungen von Trace-Attributen werden nur ausgeführt, wenn env gesetzt ist, und umfassen höchstens 15 Minuten auf jeder Seite; sie erläutern ein Urteil, bestimmen es aber nie. Werden sie übersprungen oder können sie nicht abgerufen werden, bleibt das Urteil unverändert. Jede Liste enthält 10 Elemente und gibt an, wie viele ausgelassen wurden; bei einem fehlgeschlagenen Upstream-Aufruf wird nur der betreffende Abschnitt mit einem error versehen. Die Latenz der Golden Signals stammt in beiden Zeitfenstern aus derselben Umgebung, die in latency_env genannt wird: ohne env aus der Umgebung mit dem höchsten Durchsatz. Die Fehlerrate der Golden Signals zählt 5xx- und gRPC-Fehler; deviations.apm zählt zusätzlich Spans mit Fehlerstatus und 429er. Die Signale eines Aufrufers stammen aus dessen eigenen Server-Spans, daher zeigen Aufrufer mit ausschließlich Client-Spans 0 rpm.

regressions führt für jeden Auslöser hinter regression likely einen Eintrag in der Reihenfolge von reason auf und ist bei den anderen Urteilen []. Jeder Eintrag enthält service, role (changed oder dependent), env, metric (genau eines von error_rate_pct, latency_p95_ms, throughput_rpm, alert, apm_deviation) und baseline/after in der Einheit der Metrik (%, ms, rpm oder dem eigenen Wert des APM-Signals; null für alert). Ein Element vom Typ alert enthält zusätzlich rule_id und state, den Status der Instanz im neuesten Alerts-Monitor-Zeitabschnitt des Nachher-Zeitfensters, in dem sie aufgeführt ist, immer firing: Ein Alarm, der nach der Änderung begann, aber bis zum Ende des Nachher-Zeitfensters behoben wurde, ist keine Regression und löst daher kein Ticket aus; er bleibt mit seinem state in alerts.started, und reason zählt ihn. env ist die Umgebung, in der die Metrik gemessen wurde: die angeforderte env, andernfalls summieren Fehlerrate und Durchsatz alle Umgebungen (env: ""), während p95 die Umgebung mit dem höchsten Durchsatz verwendet, latency_env; ein Alarm verwendet sein eigenes Umgebungslabel und eine APM-Abweichung ihre eigene Umgebung. Jede Regression gilt für den gesamten Dienst, daher benennt keine einen Endpunkt.

get_alert_groups

Konfiguriertes Inventar der Compass-Alarmgruppen für Changeboard- und Label-Abdeckungsprüfungen. Enthält Gruppen ohne Regeln und Gruppen, die nicht ausgelöst werden. Gibt kein PromQL zurück.

  • alert_group_name / alert_group_type / data_source_name (string, optional): Teilzeichenfolgenabgleich ohne Beachtung der Groß-/Kleinschreibung.
  • team / tier (string, optional): Exakter Abgleich konfigurierter Metadaten ohne Beachtung der Groß-/Kleinschreibung.
  • label_key + label_value (string, optional): Müssen gemeinsam gesetzt werden. Exakter Abgleich eines metadata.labels-Paars ohne Beachtung der Groß-/Kleinschreibung — sowohl Schlüssel als auch Wert.

Gibt kompaktes JSON {"count":N,"groups":[...]} mit id, name, type, entity_class, team, tier, metadata.labels und Regelanzahlen zurück. Leere team / labels bedeutet, dass kein Wert gesetzt ist.

get_alert_operations_summary

  • start_time_iso / end_time_iso (string, erforderlich): RFC3339-Zeitfenster, höchstens 31 Tage.
  • timezone (string, optional): IANA-Name für Tagesgrenzen. Standard: UTC.
  • severities / services (array, optional): Schränkt die Zusammenfassung ein.
  • include_rules (boolean, optional): Gibt zusätzlich die Hygiene pro Regel zurück (Top 20 nach fire_count, flappende und nicht weitergeleitete Regeln, mit truncated, wenn die API die Regelliste begrenzt hat). Standard: false.

Gibt JSON mit alerts_raised, acknowledged, unacknowledged, current_backlog, delivered, notification_outcomes, top_rules, needs_attention und coverage zurück. Jede Metrik ist {status, count?, reason?}; eine partial-Anzahl deckt nur einen Teil des Zeitfensters ab und ist keine Untergrenze.

get_alert_coverage

Beantwortet die Frage „Wofür fehlen mir Alarme?“ für einen Dienst, eine Umgebung, eine Alarmgruppe oder — wenn kein Bereich angegeben ist — die gesamte Organisation. Schreibgeschützt: Es erstellt, ändert oder entstummt nichts. Auch im Toolset investigate verfügbar.

  • service (string, optional): Dienstname.
  • environment (string, optional): Bereitstellungsumgebung (zum Beispiel prod).
  • entity_id (string, optional): UUID der Alarmgruppe (Entität), wie von get_alert_groups zurückgegeben.
  • muted_days (integer, optional): Ganze Tage, 1 bis 3650. Standard: 7; 0 bedeutet den Standardwert. Eine Regel, die länger als diesen Zeitraum stummgeschaltet ist, stellt eine muted_too_long-Lücke dar. Werte werden getrimmt; leere Zeichenfolgen werden ignoriert. Arten von Lücken: uncovered_signal (keine aktivierte Regel für latency, error_rate, throughput oder saturation; nennt eine deaktivierte Regel, die das Signal abdecken würde), all_rules_disabled (eine Alarmgruppe, deren Regeln alle deaktiviert sind), no_notification_channel (eine Regel, deren Schweregrad von keinem Kanal weitergeleitet wird, der der Alarmgruppe zugeordnet ist), muted_too_long (auf unbestimmte Zeit oder länger als muted_days stummgeschaltet; muted_since ist die letzte Aktualisierung der Regel und mute_until wird bei einer Stummschaltung auf unbestimmte Zeit weggelassen).

Gibt kompaktes JSON {scope, generated_at, complete, summary, counts, groups} zurück. groups enthält einen Eintrag {kind, count, gaps, omitted} pro vorhandener Art und listet höchstens 10 Lücken pro Art auf (omitted zählt die übrigen; schränke den Umfang ein, um sie zu sehen); jede Lücke enthält suggested_tool (create_alert, create_alert_from_chart, attach_notification_channel oder patch_alert) und suggested_args, das nur Eingaben enthält, die das Tool akzeptiert (patch_alert: entity_id, id und is_disabled=false oder mute_until=0; attach_notification_channel: alert_group_id und ein breach/threat severity; create_alert: entity_id; create_alert_from_chart: service_name); das eigene entity_id, rule_id und signal der Lücke werden daneben aufgeführt. Rufe das vorgeschlagene Tool nur auf, wenn es in der Sitzung verfügbar ist und der Benutzer zustimmt. complete ist nur dann true, wenn die API keine Lücken auflistet, alle Zählwerte 0 sind und mindestens eine Alarmgruppe dem Umfang entspricht (exakte Bezeichnungen service_name / env, abgeglichen mit der Liste von get_alert_groups); ein Umfang, der keiner Gruppe entspricht, eine fehlgeschlagene Abfrage oder Zählwerte ohne aufgelistete Lücken gelten nicht als vollständig, und summary gibt den Grund an.

get_alert_config

  • search_term (string, optional): Freitextsuche über Name, Gruppe, Datenquelle und Tags.
  • rule_name (string, optional)
  • severity (string, optional)
  • rule_type (string, optional): static oder anomaly.
  • alert_group_name / alert_group_type / data_source_name (string, optional)
  • tags (array, optional): Alle müssen übereinstimmen (UND-Logik).

Jede Regel listet Recent Evaluations auf: 5 Ein-Minuten-Messwerte, neueste zuerst, jeweils mit der UTC-Minute beschriftet, zu deren Ende sie erfasst wurden; der neueste endet 1–2 Minuten vor dem Aufruf, da der Monitor die letzte Minute verzögert auffüllt. firing; ok = der Monitor meldete, dass die Regel nicht ausgelöst wurde (normaler, behobener, ausstehender oder leerer Zustand, wie is_firing=0 in get_alert_rule_state); unknown = keine Monitorzeile für die Regel (noch nicht ausgewertet oder die Abfrage für diese Minute ist fehlgeschlagen; darauf wird am Anfang der Antwort hingewiesen) oder eine Zeile mit einem Zustand, der nicht firing, normal, resolved, pending oder empty ist (z. B. no_data, silenced). Deaktivierte Regeln zeigen none. Wenn mehr als 25 aktivierte Regeln übereinstimmen, wird der Verlauf für alle weggelassen und die Antwort weist darauf hin.

get_entity_kpis

Schreibgeschützt; in den Toolsets alerts und investigate. Listet alle KPIs einer Alarmgruppe auf, einschließlich KPIs, die noch von keiner Alarmregel verwendet werden. Verwende die zurückgegebenen IDs in expression_args / indicators_used; erfinde niemals eine ID.

  • entity_id (string, required): UUID der Alarmgruppe/Entität, aus get_alert_groups oder get_alert_config.

Gibt JSON {"entity_id","count","kpis":[{"id","name","description","query","unit"}]} zurück, sortiert nach Name. unit ist eine Anzeigebezeichnung: Schwellenwerte werden mit dem Rohwert der Abfrage verglichen. Wenn keine KPI passt, erstelle eine mit create_kpi. Das Ergebnis einer leeren Gruppe nennt create_kpi nur, wenn die Sitzung dies bereitstellt; mit --read-only (außer --allow-write-tools=create_kpi) oder dem Toolset investigate wird stattdessen angegeben, dass zum Erstellen einer KPI eine beschreibbare alerts-Sitzung erforderlich ist.

create_kpi

Erstellt eine KPI in einer vorhandenen Alarmgruppe; nur im Toolset alerts. Verwende es nur, wenn get_entity_kpis keine KPI mit der benötigten Abfrage enthält. Prüfe zuerst mit prometheus_range_query, ob die Abfrage Daten zurückgibt: Die API lehnt nur Abfragen ab, die nicht geparst werden können, und speichert eine gültige Abfrage auch dann, wenn die Metrik nicht existiert.

  • entity_id (string, required): UUID der Alarmgruppe/Entität.
  • name (string, required): Innerhalb der Alarmgruppe eindeutig; ein zweiter Erstellungsversuch mit demselben Namen wird als Konflikt abgelehnt.
  • query (string, required): PromQL. Um einen Alarm für ein Dashboard-Panel einzurichten, übernimm die PromQL des Panels aus get_dashboard.
  • unit (string, required): Einheit des Rohwerts der Abfrage, z. B. seconds, ms, percent, ratio, count, req/s. Sie ist nur eine Bezeichnung und führt keine Umrechnung durch; Schwellenwerte werden daher mit dem Rohwert verglichen.
  • description (string, optional)
  • data_source_id (string, optional): Standardmäßig die Datenquelle der Alarmgruppe.

Kein MCP-Tool kann eine KPI löschen oder bearbeiten (verwende die Last9-Benutzeroberfläche). Bestätige daher vor dem Erstellen Name, Abfrage und Einheit. Erstelle sie einmal und bewahre die zurückgegebene ID für expression_args / indicators_used auf; bei einem Namenskonflikt verwende die vorhandene KPI-ID aus get_entity_kpis. Bei einem Timeout oder Verbindungsfehler wurde die Erstellung möglicherweise angewendet oder auch nicht: Prüfe vor einem erneuten Versuch den Namen mit get_entity_kpis. Gibt {"id","name","query","unit"} zurück.

get_alerts

  • time_iso (string, optional): Auswertungszeitpunkt im RFC3339-Format.
  • window (integer, optional): Rückblick in Sekunden. Standard: 900. Bereich: 60–86400.
  • lookback_minutes (integer, optional): Bereich: 1–1440.

get_alert_rule_state

  • start_time (integer or string, required): Beginn des Bereichs (einschließlich): Unix-Epoch-Sekunden (1718000000) oder RFC3339 (2024-06-10T06:13:20Z). Epoch-Millisekunden, -Mikrosekunden und -Nanosekunden werden in Sekunden umgerechnet; Werte vor dem 01.01.2000 werden abgelehnt.
  • end_time (integer or string, required): Ende des Bereichs (einschließlich), in denselben Formaten.
  • step (integer, required): Auflösung in Sekunden zwischen Messwerten. Die Anzahl der Messwerte ((end_time - start_time) / step + 1) ist auf 100 begrenzt. Jeder Messwert entspricht einem Upstream-Aufruf über die min(step, 3600) Sekunden bis zu seinem Zeitstempel; die Messwerte werden in Gruppen zu je 5 abgerufen. Dauert der Abruf länger als 60 s, gibt das Tool einen Fehler mit Hinweisen zum erneuten Versuch zurück.
  • alert_group_id (string, optional): Nach Alarmgruppen-ID filtern.
  • rule_name (string, optional): Regex-Filter für den Regelnamen.
  • alert_group_name (string, optional): Regex-Filter für den Namen der Alarmgruppe.
  • label_filters (string, optional): Durch Kommas getrennte key=value-Label-Filter.
  • state (string, optional): Nach Zustand filtern (z. B. firing).

Gibt eine JSON-Zuordnung von rule_id -> [{timestamp, is_firing}] zurück. Ein Zeitstempel, zu dem eine Regel in der Upstream-Antwort fehlt, wird als is_firing=0 gemeldet — das bedeutet „nicht als ausgelöst beobachtet“, nicht, dass ein normaler Zustand bestätigt wurde.

get_alert_hygiene

Schreibgeschützte Prüfung aktivierter Alarmregeln. Sie ändert nichts: Jede vorgeschlagene Korrektur ist ein Vorschlag und wird erst angewendet, wenn der Benutzer sie ausdrücklich bestätigt, und zwar über update_alert (Anpassung), patch_alert (is_disabled), delete_alert oder attach_notification_channel, sofern diese verfügbar sind.

  • window (string, optional): 7d oder 30d. Standard: 7d.
  • limit (integer, optional): Maximale Anzahl zurückzugebender markierter Regeln, beginnend mit den problematischsten. Standard: 20. Bereich: 1–100.

Das Zeitfenster endet jetzt. Kategorien (eine Regel kann mehreren angehören): noisy (≥ 5 Auslösungen/Tag mit < 20% acked; with an unavailable ack_rate it is judged on fire rate alone and the reason says so; mute time is not reported), flapping (> 4 Flattern/Tag), stale (zuletzt vor dem Zeitfenster ausgelöst, ohne Auslösung darin, oder eine aktivierte konfigurierte Regel ohne Episode im Zeitfenster, während der Lebenszyklus coverage abgeschlossen ist und die API-Liste nicht abgeschnitten wurde), unrouted (keine Auslösung im Zeitfenster erreichte einen Kanal und der Alarmgruppe ist derzeit kein Kanal zugeordnet; wenn Zuordnungen nicht gelesen werden können, wird die Regel stattdessen unter unavailable.routed gezählt). Jede Statistik ist {status, count|value, reason} oder null: Ein nicht verfügbarer Wert wird niemals als null gelesen und überspringt nur die Prüfung, die ihn benötigt; unavailable zählt aktivierte Regeln pro fehlendem Wert (fire_count, flap_count, ack_rate, routed, rule_config für Regeln, die in der Liste der Alarmregeln fehlen und deren Korrekturen daher keinen aktuellen Wert enthalten, sowie activity für konfigurierte Regeln ohne Episode, deren Stille der Verlauf nicht belegen kann und die nicht bewertet werden). coverage gibt an, wie viel des Zeitfensters vom Alarmverlauf abgedeckt wurde; Raten werden anhand des abgedeckten Zeitraums berechnet, mindestens jedoch eines Tages. upstream_truncated ist true, wenn die API nur ihre 200 lautesten Regeln zurückgegeben hat, sodass leisere Regeln nicht ausgewertet wurden. Korrekturen basieren auf der Konfiguration jeder Regel in der Liste der Alarmregeln: bad_minutes erhöhen (das N in count_true(result) >= N) oder eval_window verlängern (höchstens 60 Minuten); bei verrauschten statischen Schwellenwerten den Schwellenwert in condition (expr > 100) verschieben oder den Ausdruck zu adaptive_std_cmp(metric, sensitivity, window) ändern; einen Benachrichtigungskanal zuordnen; veraltete Regeln deaktivieren oder löschen.

Gibt kompaktes JSON {window, from, to, coverage, upstream_truncated, rules_evaluated, flagged_rules, truncated, omitted_for_size, unavailable, rules} zurück, ausgelegt auf ein Ziel von 32 KB: truncated ist true, wenn die Anzahl markierter Regeln limit oder das Ziel überschreitet, und omitted_for_size zählt die Regeln innerhalb von limit, die aus Platzgründen abgeschnitten wurden (die problematischste Regel bleibt immer erhalten; ist eine einzelne Regel größer als 32 KB, wird sie allein zurückgegeben und überschreitet das Ziel); jede Regel enthält findings (category, reason, suggested_fix, optional alternative_fix) und das rohe stats.

get_notification_channels

  • scope (string, optional): attached (Standard) gibt eine Zeile pro Zuordnung zu einer Alarmgruppe zurück; id ist eine Zuordnungs-ID, wie sie von detach_notification_channel verwendet wird. channels gibt die Kanäle der Organisation zurück (id, name, type, send_resolved, created_via); id ist eine Kanal-ID, wie sie von attach_notification_channel verwendet wird. Ziele, Header und Zertifikate werden niemals zurückgegeben.

Gibt konfigurierte Benachrichtigungskanäle (Slack, PagerDuty, E-Mail, Webhooks usw.) als TSV-Tabelle zurück. Zuordnungszeilen (service_fqid gesetzt) zeigen global false und services -; services listet nur veraltete Dienstbindungen auf. Bei Zuordnungszeilen ist send_resolved der gespeicherte Standardwert der Zeile, nicht der für die Zustellung verwendete Wert; Benachrichtigungen zur Auflösung folgen dem eigenen send_resolved des Kanals (scope=channels). Beide Bereiche enthalten created_via (last9-mcp für Zeilen, die ein MCP-Agent erstellt hat, andernfalls -).

recommend_alert_config

Schreibgeschützt. Gibt Hinweise zum Lebenszyklus, Validierungsschranken und Anforderungen an den Kontext für Einsatzkräfte zurück; die Angaben sind für sich genommen kein Beleg, daher sollten Schwellenwerte mit Telemetrie-Tools untermauert werden.

  • signal (string, required): Metrik oder Signal für die Auswirkungen auf Benutzer, einschließlich Einheit und Dimensionen.
  • objective (string, required): Zu erkennendes Symptom oder Auswirkung auf Benutzer.
  • rule_type (string, optional): static (Standard) oder anomaly.
  • severity (string, optional): breach (Standard) oder threat.
  • environment (string, optional): Umgebung und Traffic-Profil.

validate_alert_expression

Testet einen Ausdruck, ohne ihn zu speichern. Vor create_alert / update_alert verwenden.

  • entity_id (string, required): UUID der Alarmgruppe/Entität.
  • expression (string, required): Arithmetischer Ausdruck über Indikatoren, die mit dem exakten Namen ihrer KPI bezeichnet werden, z. B. errors / requests. Höchstens 3 Indikatoren. Namen mit Leerzeichen, Punkten oder Bindestrichen unverändert schreiben (Test Alert / errors), genau so, wie create_alert sie speichert.
  • indicators_used (object, required, non-empty): Zuordnung von Indikatornamen zu KPI-UUIDs, die entity_id gehören; mit get_entity_kpis die IDs und Namen der KPIs der Gruppe auflisten. Verwende den exakten Namen jeder KPI: Dieser Testlauf akzeptiert beliebige Namen, aber create_alert und update_alert lehnen expression_args-Schlüssel ab, die nicht dem Namen der gebundenen KPI entsprechen. Nur der arithmetische Ausdruck wird geprüft (übergeben Sie den inneren Metrikausdruck, nicht einen adaptive_std_cmp(...)-Wrapper); condition / alert_condition werden nicht geprüft. Die Prüfung, ob mindestens eine Zeitreihe vorhanden ist, wird nur ausgeführt, wenn mehr als ein Indikator verwendet wird.

Gibt {"valid":true} oder {"valid":false,"reason":"..."} zurück; ein ungültiger Ausdruck ist ein normales Ergebnis und kein Toolfehler.

describe_alert_chart

Schreibgeschützt. Listet die alarmierbaren Signale (key, unit, eval_query, query_kind) in einem unterstützten Discover-Diagramm auf. Tokens mit Viewer-Rolle werden abgelehnt.

  • surface (string, erforderlich): discover-service oder discover-exceptions; jede andere Oberfläche, einschließlich benutzerdefinierter Dashboards, wird vor dem API-Aufruf abgelehnt (verwenden Sie stattdessen create_alert mit einer KPI).
  • chart_key (string, erforderlich): z. B. apdex, error_rate, response_time, exception_count.
  • service_name (string, erforderlich)
  • env (string, optional)
  • attributes (object, optional): Zusätzliche Identitätsdimensionen unter Verwendung der Schlüsselnamen, die dieses Tool meldet.

create_alert

Erstellt eine Regel in einer vorhandenen Alarmgruppe, die immer deaktiviert ist (ein Entwurf, auch wenn is_disabled=false übergeben wird). Rufen Sie zuerst recommend_alert_config auf und aktivieren Sie die Regel anschließend mit patch_alert is_disabled=false erst, nachdem der Benutzer dies bestätigt hat. Erstellen Sie die Regel nur einmal und bewahren Sie die zurückgegebene Regel-ID auf. Ein rule_name, das die Alarmgruppe bereits verwendet (ohne Beachtung der Groß-/Kleinschreibung), wird abgelehnt, ohne etwas zu erstellen; dabei wird die ID der vorhandenen Regel genannt.

  • entity_id (string, erforderlich): UUID der Alarmgruppe/Entität.
  • alert_rule (object, erforderlich): Vollständiger, typisierter Regelinhalt, einschließlich primary_indicator und expression_args, die an echte KPIs der Entität gebunden sind. Jeder Schlüssel von expression_args muss exakt dem Namen der KPI entsprechen, an die er gebunden ist (kein Platzhalter wie x), und primary_indicator sowie expression verwenden diese Namen. Statische Regeln erfordern condition, alert_condition und eval_window (0–60 Minuten). Adaptive Regeln verwenden expression = adaptive_std_cmp(<primary_indicator>, sensitivity, window); die drei Felder sind dann optional (Standardwerte expr > 0, count_true(result) >= 1, 1). algorithm kann nicht festgelegt werden. Kontext für den Bereitschaftsdienst gehört in properties (Beschreibung, Runbook, Anmerkungen, query_mode).

Die Benachrichtigungsweiterleitung wird für die Alarmgruppe konfiguriert, nicht für die Regel.

create_alert_from_chart

Erstellt eine Regel mit statischem Schwellenwert aus einem Diagramm, das von describe_alert_chart beschrieben wird. Wie bei create_alert wird die Regel deaktiviert als Entwurf erstellt und löst keinen Alarm aus; aktivieren Sie sie mit patch_alert is_disabled=false erst, nachdem der Benutzer dies bestätigt hat. Die Diagramm-API erstellt Regeln aktiviert, daher deaktiviert das Tool die Regel direkt nach ihrer Erstellung; schlägt dies fehl, wird ein Fehler mit der Regel-ID zurückgegeben, die möglicherweise aktiv ist.

  • surface / chart_key / service_name / signal_key / name (string, erforderlich)
  • env (string, optional)
  • attributes (object, optional)
  • threshold (number, optional): In der Einheit des Signals; muss mindestens 0 sein. Für Signale mit Score-Einheit, etwa apdex, ist ein expliziter Wert erforderlich.
  • threshold_operator (string, optional): > (Standard), <, >=, <=, ==, !=.
  • eval_window (integer, optional): Minuten, 1–60. Standard: 5.
  • bad_minutes (integer, optional): 1–eval_window. Standard: 3.
  • severity (string, optional): breach oder threat.
  • description (string, optional)
  • group_id (string, optional): Normalerweise weglassen.

update_alert

Ersetzt die Auswertungskonfiguration einer Regel vollständig. Rufen Sie die Regel zuerst mit get_alert_config oder get_entity_alert_rules ab. Die Änderung wird abgelehnt, ohne etwas zu ändern, wenn die Regel nicht existiert oder zu einer anderen Alarmgruppe gehört. Die Regel kann vorübergehend gelöscht und neu erstellt werden; verwenden Sie anschließend die zurückgegebene Ersatz-ID.

  • entity_id (string, erforderlich)
  • id (string, erforderlich): UUID der Alarmregel.
  • alert_rule (object, erforderlich): Vollständige Konfiguration; gleiche Struktur wie create_alert.

patch_alert

Ändert einen Teil der Regel und behält dabei ihre ID bei. Mindestens eine Änderung ist erforderlich. Die Änderung wird abgelehnt, ohne etwas zu ändern, wenn die Regel nicht existiert oder zu einer anderen Alarmgruppe gehört.

  • entity_id (string, erforderlich)
  • id (string, erforderlich): UUID der Alarmregel.
  • is_disabled (boolean, optional): false aktiviert die Regel, true pausiert sie.
  • mute_until (integer, optional): Unix-Epoch-Frist; 0 hebt die Stummschaltung auf.
  • properties (object, optional): description, runbook, annotations, query_mode. Jedes übermittelte Feld ersetzt den gespeicherten Wert; ausgelassene oder leere Felder behalten ihren gespeicherten Wert bei. annotations ersetzt die gesamte Zuordnung. Senden Sie daher alle Schlüssel, die erhalten bleiben sollen; {} löscht sie.
  • recurring_mute_schedule (object, optional): Ersetzt den Wochenplan: enabled (Standardwert false), timezone (IANA-Name, erforderlich) und windows (1–20 von weekdays als sun..sat, start_time / end_time als HH:MM im 24-Stunden-Format). Eine Endzeit, die der Startzeit entspricht oder davor liegt, gilt für den nächsten Tag. Senden Sie alle Zeitfenster, die erhalten bleiben sollen.
  • clear_recurring_mute_schedule (boolean, optional): Entfernt den Zeitplan vollständig; kann nicht mit recurring_mute_schedule kombiniert werden. Unterscheidet sich von enabled=false, wodurch die Zeitfenster gespeichert bleiben.

Benutzer mit Viewer-Rolle dürfen nur mute_until ändern. Änderungen an der Stummschaltung auf Regelebene werden abgelehnt, solange die Gruppe oder Entität stummgeschaltet ist. Lesen Sie Änderungen mit get_entity_alert_rules zurück; dort werden mute_until, recurring_mute_schedule und properties angezeigt.

delete_alert

Löscht eine Regel dauerhaft. Überprüfen Sie sie mit get_alert_config und holen Sie zuerst die ausdrückliche Bestätigung des Benutzers ein. Das Löschen wird abgelehnt, ohne etwas zu löschen, wenn die Regel nicht existiert oder zu einer anderen Alarmgruppe gehört.

  • entity_id (string, erforderlich)
  • id (string, erforderlich): UUID der Alarmregel.

mute_alert_group

Schaltet alle aktuellen und zukünftigen Regeln einer Gruppe stumm. Um eine einzelne Regel stummzuschalten, verwenden Sie patch_alert mit mute_until. Erfordert Editor-Zugriff.

  • entity_id (string, erforderlich): UUID der Alarmgruppe/Entität.
  • until (integer, erforderlich): Unix-Epoch-Zeitpunkt, zu dem die Stummschaltung endet. 0 hebt die Stummschaltung auf; ein negativer Wert wie -1 schaltet die Gruppe dauerhaft stumm.

acknowledge_alert

Übernimmt einen ausgelösten Alarm oder gibt ihn frei. Löst den Alarm nicht auf und schaltet ihn nicht stumm. Einen Alarm zu bestätigen, den Sie bereits besitzen, ist ein sicherer Vorgang ohne Auswirkungen. ack wird abgelehnt, ohne etwas zu speichern, sofern get_alerts nicht innerhalb der letzten Stunde genau diesen Alarm (alle drei IDs) aufführt.

  • alert_group_id / rule_id / rule_type (string, erforderlich): Aus dem Alarm in get_alerts kopieren.
  • action (string, optional): ack (Standard) oder unack. Nur der Besitzer oder ein Org-Administrator kann die Bestätigung aufheben.
  • mute_until (integer, optional): Nur ack. Zeichnet eine Stummschaltung auf, die Sie bereits mit mute_alert_group oder patch_alert angewendet haben; schaltet nichts stumm.

reassign_alert

Weist einen Alarm, der bereits einen Besitzer hat, einem anderen Benutzer zu. Hat der Alarm noch keinen Besitzer, bestätigen Sie ihn zuerst. Wenn keine Neuzuweisung erfolgt, weil der Alarm keinen Besitzer hat, wird angegeben, ob get_alerts diesen Alarm innerhalb der letzten Stunde überhaupt aufführt. Last9 benachrichtigt den neuen Besitzer nicht.

  • alert_group_id / rule_id / rule_type (string, erforderlich): Aus dem Alarm in get_alerts kopieren.
  • owner_email (string, optional): Bevorzugt; wird ohne Beachtung der Groß-/Kleinschreibung mit aktiven Benutzern der Organisation abgeglichen.
  • owner_user_id (string, optional): Geben Sie genau eines von owner_email oder owner_user_id an.

create_notification_channel

Erstellt einen Kanal; er leitet erst dann Benachrichtigungen weiter, wenn er mit attach_notification_channel verknüpft wurde. Erstellen Sie ihn nur einmal und bewahren Sie die ID auf; es gibt kein Tool zum Aktualisieren. Gibt nur id, name, type und send_resolved zurück.

  • name (string, erforderlich): Muss pro Typ eindeutig sein; darf keinen Doppelpunkt enthalten.
  • type (string, erforderlich): slack, pagerduty, opsgenie, email oder generic_webhook.
  • destination (string, erforderlich): Slack-Incoming-Webhook-URL (oder Kanal-ID mit slack_app_mode), PagerDuty-Routing-Key, Opsgenie-API-Key, durch Kommas getrennte geschäftliche E-Mail-Adressen beliebiger Domains, nicht nur der Organisation (die API lehnt Adressen persönlicher Anbieter wie Gmail ab; bei einer Organisation mit persönlichem Login wird nur die Adresse des Administrators akzeptiert) oder eine HTTPS-Webhook-URL.
  • slack_app_mode (boolean, optional): Nur für Slack. Standard: false.
  • mention_handles (string, optional): Durch Kommas getrennt, z. B. user|U123ABC|name, special|here, special|channel.
  • webhook_headers (object, optional): Nur generic_webhook.
  • webhook_ca_certificate (string, optional): Nur generic_webhook; ein PEM-CA-Zertifikat mit bis zu 64 KiB.
  • send_resolved (boolean, optional): Standard: true.

attach_notification_channel

Leitet Benachrichtigungen eines vorhandenen Kanals an eine Alarmgruppe weiter. Idempotent. Verknüpfungen übernehmen die Zustellungseinstellungen des Kanals (Header, Zertifikat, Erwähnungen) zum Zeitpunkt der Verknüpfung. Ändern sich die Kanaleinstellungen später, verknüpfen Sie den Kanal erneut.

  • channel_id (integer, erforderlich): Eine Kanal-ID (get_notification_channels mit scope=channels), keine Verknüpfungs-ID.
  • alert_group_id (string, erforderlich): Aus get_alert_groups.
  • severity (string, erforderlich): breach, threat oder both. both erstellt zwei Verknüpfungen; schlägt die zweite fehl, bleibt die erste bestehen und der Fehler nennt den Schweregrad, für den ein erneuter Versuch erforderlich ist.

detach_notification_channel

Entfernt eine Verknüpfung. Erfordert ein Token mit Löschberechtigung; ein Token mit Schreibberechtigung kann keine Verknüpfung entfernen.

  • attachment_id (integer, erforderlich): Die id aus get_notification_channels mit scope=attached. Kanal-IDs werden abgelehnt.
  • alert_group_id (string, optional): Wird abgelehnt, wenn die Verknüpfung zu einer anderen Gruppe gehört.

delete_notification_channel

Löscht einen Kanal dauerhaft, sofern er keine Verknüpfungen hat; entfernen Sie zuerst seine Verknüpfungen. Erfordert ein Token mit Löschberechtigung. Bestätigt das Löschen, indem die Kanäle erneut aufgelistet werden.

  • channel_id (integer, erforderlich): Die id aus get_notification_channels mit scope=channels. Verknüpfungs-IDs werden abgelehnt.

did_you_mean

  • query (string, erforderlich): Der zu suchende Name – teilweise, falsch geschrieben oder abgekürzt.
  • type (string, optional): Auf Entitätstyp beschränken: service, environment, host, database, k8s_deployment, k8s_namespace, job.

Gibt bis zu 3 ähnlichste Treffer mit Ähnlichkeitswerten zurück. Verwenden Sie dieses Tool vor jedem Tool-Aufruf, bei dem der Entitätsname unklar ist. Wenn ein vorheriger Aufruf keine Ergebnisse zurückgegeben hat, verwenden Sie dieses Tool vor einem erneuten Versuch.

get_service_profile

  • service_name (string, erforderlich): Dienst, für den ein Telemetrieprofil abgeleitet werden soll.
  • datasource (string, optional): Datenquellenname. Für den Standardwert weglassen; ein ungefährer Name wird wie bei den Prometheus-Tools aufgelöst. Gibt einen kurzen Untersuchungsbericht gefolgt vom vollständigen Profil als unformatiertes JSON zurück: Signalverfügbarkeit (logs/traces/metrics als present, absent oder unknown), Sprache und Laufzeitumgebung, Bereitstellungsumgebungen, Log-signal_shape (log_format, severity_set, level_field, trace_context_in_logs) sowie eine empfohlene Korrektur für die Ingestion, sofern zutreffend. Wenn das Backend freshness meldet, enthält der Bericht eine Zeile zu last seen mit freshness.logs.last_seen und freshness.traces.last_seen (RFC3339 oder none, wenn null) sowie eine Warnung zu traces stale, wenn freshness.traces_stale true ist: Spans wurden nicht mehr erfasst, während Logs weiterhin eingingen. Untersuche daher eine Regression im Bereich freshness.traces.last_seen und nicht eine fehlende Einrichtung. Abgeleitet aus vorgelagerten Daten und zwischengespeichert mit einer TTL von etwa 15 Minuten.

Rufe es vor jeder dienstbezogenen Untersuchung auf, damit die Toolauswahl zur tatsächlichen Telemetrie des Dienstes passt — überspringe Trace-Tools, wenn traces absent ist, und parse bei severity_set mit dem Wert none oder partial den Schweregrad aus level_field im Log-Body, statt severity_filters zu verwenden. metrics ist immer unknown, und dependencies ist in v1 nicht befüllt. Wenn logs und traces beide absent sind, bestätige den Namen mit did_you_mean, bevor du zu dem Schluss kommst, dass der Dienst nicht überwacht wird.

list_dashboards

  • name (string, optional): Groß-/Kleinschreibung ignorierter Teilstring des Dashboardnamens. Schränkt die Liste ein und total.
  • limit (integer, optional): Dashboards pro Seite, 1–200. Standard: 100.
  • cursor (string, optional): next_cursor der vorherigen Seite; übergib dazu dasselbe name.

Gibt {"dashboards": [{"id", "name", "updated_at", "created_by", "locked"}], "total", "next_cursor"} zurück, zuerst die zuletzt aktualisierten. created_by wird weggelassen, wenn es leer ist; locked wird weggelassen, wenn die API readonly nicht meldet. updated_at ist die Unix-Epochenzeit in Sekunden als String. Eine Seite endet vorzeitig, damit die Antwort unter 32 KB bleibt; auf der letzten Seite fehlt next_cursor.

get_dashboard

  • id (string, required): Dashboard-UUID.
  • region (string, optional): Region zum Befüllen der Panelabfragen. Standardmäßig wird die konfigurierte Datasource-Region verwendet.

Das Ergebnis ergänzt die oberste Ebene um locked (false, wenn die API es weglässt) und created_by (die Benutzer-ID des Autors).

Informationen zum Erstellen eines Alerts für ein Panel findest du unter last9://reference/alerting.

validate_dashboard

Schreibgeschützt. Erstellt oder aktualisiert niemals Dashboards. Akzeptiert genau eines von dashboard_id oder dashboard_definition.

  • dashboard_id (string, optional): UUID des gespeicherten Dashboards, das validiert werden soll.
  • dashboard_definition (object, optional): Inline-Body eines nicht gespeicherten Dashboards (echter Dry Run). Ein {dashboard, metadata}-Create-Envelope wird in sein dashboard-Objekt entpackt.
  • start_time_iso / end_time_iso (string, optional): Validierungszeitraum (RFC3339). Muss ≤ 24h sein.
  • region (string, optional): Region für die Ausführung von Panelabfragen.

Gibt dashboard_validation/v1 zurück: Klassifizierung der Lint- und Ausführungsergebnisse pro Panel (data / no_data / invalid / error). Leere Ergebnisse am ersten Tag werden als valid_no_data klassifiziert, ohne Diagnoseprüfungen. Ein Dashboard ohne Panels gibt success: false mit error: "no_panels" zurück. Panel-Felder aus anderen Formaten (Grafana gridPos, title, type sowie targets bei Panels, die Abfragen benötigen) und falsch typisierte Felder werden pro Panel unter shape_problems aufgeführt, in summary.panels_invalid_shape gezählt und bewirken, dass overall fail ist.

preview_dashboard

Schreibgeschützte clientseitige Vorschau. Übergib entweder dashboard (das nicht gespeicherte Dashboard-Objekt aus einer Create-Anfrage) oder id zusammen mit ops (dieselben geordneten Operationen wie bei patch_dashboard). Die erforderlichen Werte start_time_iso und end_time_iso sind RFC3339-Zeitstempel mit einem Abstand von höchstens 24 Stunden. Optional enthält variables skalare Überschreibungen; andernfalls gelten die Dashboard-Werte und integrierten Standardwerte.

{
  "id": "dashboard-id",
  "ops": [{"op": "update_panel", "panel_id": "panel-id", "fields": {"name": "Request latency"}}],
  "start_time_iso": "2026-10-01T08:00:00Z",
  "end_time_iso": "2026-10-01T09:00:00Z"
}

Gibt saved: false, eine Zusammenfassung der Definition/Abfrage mit validation (einschließlich definition_error bei einer Abweichung vom Create-Schema) sowie panels mit dem Status ok / empty / error, aufgelösten Abfragen und Diagnosen der Ziele zurück. PromQL und LogJSON werden ausgeführt; nicht unterstützte Abfragetypen und nicht aufgelöste Variablen führen zu einem Fehler des Panels. Gültige Panels ohne Abfragen sind ok; ungültige Paneldefinitionen sind error. Der Patch diff enthält die Nettoänderungen an panels_added, panels_changed (einschließlich Verschiebungen) und panels_removed sowie Änderungen durch geordnete Operationen. IDs und nullbasierte Indizes identifizieren Panels; entfernte Indizes beziehen sich auf das ursprüngliche Dashboard. Gespeicherte Panels müssen eindeutige, nicht leere IDs haben.

Grenzwerte: 50 Panels, 100 Abfragen, 100 Operationen, jeweils 65536 JSON-Bytes für Eingabe und Kandidaten-Dashboard sowie ein Ausführungszeitlimit von 60 Sekunden. Aufgelöste Abfragen mit mehr als 65536 JSON-Bytes werden vor der Ausführung abgelehnt. Die Evidenz umfasst höchstens drei Stichproben und 1024 JSON-Bytes pro Ziel; truncated: true wird angegeben, wenn Stichproben ausgelassen werden. Ein JSON-Bericht mit mehr als 262144 Bytes schlägt fehl und enthält Hinweise zur Verkleinerung der Eingabe.

Es wird kein Dashboard erstellt oder aktualisiert. Dabei wird der Kandidat anhand des Create-Schemas und der Abfragen mit dem vorhandenen Validator geprüft; dies garantiert weder die Annahme durch das Backend noch die Darstellung. Vom Backend zugewiesene IDs, Standardwerte, verworfene Felder oder gleichzeitige Änderungen können das gespeicherte Ergebnis verändern. Die Vorschau verwendet dieselben lokalen Patch-Operationen und Panel-Versionsstandardwerte wie ein Schreibvorgang.

create_dashboard

Nur für neue Dashboards. Nachdem dieser Aufruf dashboard.id zurückgibt, bearbeite Panels mit patch_dashboard (oder strukturiere das Dashboard mit update_dashboard um) — erstelle es nicht erneut, um Panels hinzuzufügen, zu kürzen oder zu korrigieren.

  • dashboard (object, required): Dashboarddefinition mit name und panels[]. Jedes Panel benötigt name, version, layout (x, y, w, h), visualization.type und queries[].
  • metadata (object, optional): Dashboard-Metadaten — Felder _category und _type (z. B. {"_category":"custom","_type":"metrics"}).

update_dashboard

Nur zum Umstrukturieren eines Großteils eines Dashboards verwenden; zum Hinzufügen, Bearbeiten, Entfernen oder Verschieben einzelner Panels patch_dashboard verwenden. Vollständiger Ersatz anhand der ID (derselbe Body wie beim Erstellen): Jedes Panel muss erneut exakt übermittelt werden.

  • id (string, required): UUID des zu aktualisierenden Dashboards.
  • dashboard (object, required): Vollständiger Ersatz-Body des Dashboards (dieselbe Struktur wie beim Erstellen).
  • metadata (object, optional): Ersatzmetadaten. Schreibgeschützte System-Dashboards geben einen behebbaren Toolfehler zurück.

patch_dashboard

Für kleinere Anpassungen gegenüber update_dashboard bevorzugen: Unveränderte Panels werden nie erneut übermittelt. Liest das Dashboard, wendet ops der Reihe nach an und schreibt es zurück. Änderungen, die zwischen Lesen und Schreiben an anderer Stelle vorgenommen wurden, werden dadurch überschrieben. Gibt {dashboard_id, changes[]} zurück; Operationen, die das Dashboard bereits erfüllt, werden ausgelassen. Wenn keine Operation etwas ändert, wird nichts geschrieben. Der Diff wird nach dem Schreiben mit einem erneuten Lesen abgeglichen: Panel-fields zeigen gespeicherte Werte, not_stored listet Schlüssel auf, die die API verworfen hat, und not_removed listet Schlüssel auf, die sie trotz eines null beibehalten hat. Diff-Werte mit mehr als 200 Zeichen werden direkt gekürzt, wobei ihr JSON-Typ erhalten bleibt.

  • id (string, required): UUID des zu patchenden Dashboards.
  • ops (array, required): Der Reihe nach angewendete Operationen; ist eine davon ungültig, wird nichts geschrieben und der Fehler nennt sie als ops[i].
    • add_panel: panel (vollständiges Panel-Objekt; version ist standardmäßig 1), optional index (nullbasierte Einfügeposition, standardmäßig am Ende).
    • update_panel: panel_id, fields (zu ersetzende Panel-Schlüssel der obersten Ebene; null entfernt einen Schlüssel; id kann nicht geändert werden).
    • remove_panel: panel_id.
    • move_panel: panel_id, index (nullbasierte Position nach dem Verschieben).
    • set_title: title (der Dashboardname).
    • set_variable: variable; ersetzt die Variable mit demselben target, andernfalls wird sie angehängt.

delete_dashboard

  • id (string, required): UUID des zu löschenden Dashboards. Schreibgeschützte System-Dashboards können nicht gelöscht werden.

set_dashboard_lock

  • id (string, required): Dashboard-UUID.
  • locked (boolean, required): true sperrt das Dashboard, false entsperrt es.

Schreib-Tool; nur aufrufen, wenn der Benutzer ausdrücklich darum bittet. Nur der Autor des Dashboards oder ein Org-Admin kann es sperren oder entsperren; integrierte Dashboards sind immer schreibgeschützt. Gibt {"id", "locked"} mit dem resultierenden Status zurück. Solange das Dashboard gesperrt ist, führen update_dashboard, patch_dashboard und delete_dashboard keine Schreibvorgänge aus und geben einen behebbaren Toolfehler zurück, der mit dashboard is locked beginnt, den Autor nennt und zum Entsperren oder Kopieren des Dashboards mit create_dashboard auffordert.

list_dashboard_snapshots

  • dashboard_id (string, required): UUID des Dashboards, dessen Snapshots aufgelistet werden sollen.

Gibt nur Metadaten zurück (id, name, expires_at usw.). Verwende get_dashboard_snapshot für eingefrorene Paneldaten.

get_dashboard_snapshot

  • id (string, required): Snapshot-UUID.

Gibt den vollständigen eingefrorenen Snapshot einschließlich dashboard_definition, panel_data, time_range und variables zurück.

delete_dashboard_snapshot

  • id (string, required): UUID des zu löschenden Snapshots.

get_profile_services

  • lookback_minutes / start_time_iso / end_time_iso (optional): Zeitraum; bevorzuge Lookback oder explizite ISO-Grenzwerte (Standard: 60m).
  • region (string, optional): Regionsüberschreibung.

Gibt Dienste zurück, für die im Zeitraum Profiling-Daten vorliegen. Vor get_flamegraph / get_top_functions / get_profile_summary aufrufen.

get_flamegraph

  • service (string, required): Dienstname aus get_profile_services.
  • profile_type (string, optional): cpu (Standard), alloc oder wall. Beim Vergleichen von Zeiträumen einen Typ festlegen.
  • env / cluster / namespace / runtime (string, optional): Bereichsfilter.
  • limit (number, optional): Maximale Anzahl aggregierter Stack-Zeilen (Standard: 1000, Maximum: 10000).
  • lookback_minutes / start_time_iso / end_time_iso / region (optional).

Gibt einen verschachtelten Flamegraph-Baum zurück (name / value / self / children). truncated: true bedeutet, dass das API-Zeilenlimit erreicht wurde.

get_top_functions

Dieselben Filter wie bei get_flamegraph. Gibt eine Rangliste der heißesten Funktionen nach Self-Samples zurück. Das Ergebnis kann abgeschnitten sein; prüfe truncated.

get_profile_summary

Dieselben Filter wie bei get_flamegraph. Gibt eine kurze natürlichsprachliche Triage des Profils für den Dienst zurück.

grafana_search_dashboards

  • query (string, optional): Teilstring des Titels. Eine leere Angabe listet breit gefächert auf (vorbehaltlich des Limits von 5.000 Zeilen).

Gibt {"dashboards":[…], "truncated":bool} mit uid, title, uri, url, type und tags zurück. Verwende uid mit grafana_get_dashboard.

grafana_get_dashboard

  • uid (string, required): Grafana-Dashboard-UID.
  • full_json (boolean, optional): Bei true wird das rohe Grafana-JSON statt der gefilterten Zusammenfassung zurückgegeben.

Standardzusammenfassung: Version, Tags, Templating-Variablen und für jedes Panel Typ/Datasource/gridPos/PromQL-Ziele. Unbekannte Paneltypen von Plugins erscheinen in unsupportedPanelTypes.

grafana_list_folders

Keine Parameter. Gibt den Ordnerbaum zurück.

grafana_list_folder_dashboards

  • folder_uid (string, erforderlich): Grafana-Ordner-UID.

Gibt {"dashboards":[…], "truncated":bool} für Dashboards in diesem Ordner zurück (paginiert, bis zu 5.000).

grafana_list_datasources

Keine Parameter. Gibt eine sichere Projektion der Datenquellen zurück (keine Anmeldedatenfelder).


Tests

Führe den Goroutine-Analyzer für Tests aus, ohne die Anwendungstests auszuführen:

make lint-test

Dabei wird Go's testinggoroutine-Analyzer auf alle Pakete angewendet, einschließlich ihrer *_test.go-Dateien, und anhand unsicherer und sicherer Fixtures geprüft. Beide CI-Test- Workflows führen go vet -testinggoroutine ./... als separaten Schritt aus, sodass zwischengespeicherte Paketergebnisse die Lint-Prüfung nicht umgehen können.

Das Root-Paket führt den Analyzer außerdem als Test aus. Verwende go test -count=1 ./... für die vollständige Testsuite mit deaktiviertem Cache für diese Prüfung: Go's Test-Cache erfasst keine internen Paketquelldateien, die vom Analyzer-Unterprozess gelesen werden. Ein einfaches go test ./... kann das erfolgreiche Testergebnis des Root-Tests wiederverwenden, nachdem sich diese Dateien geändert haben.

Fatal, Fatalf und FailNow auf testing.T oder testing.B müssen in der übergeordneten Test-Goroutine ausgeführt werden. Worker sollten Fehler zurücksenden, damit der übergeordnete Test sie prüfen kann:

errs := make(chan error, 1)
go func() { errs <- doWork() }()
if err := <-errs; err != nil {
    t.Fatal(err)
}

Der Analyzer erkennt direkte Aufrufe in go func-Closures; er prüft nicht allgemein interprozedural auf Assertions, die hinter beliebigen Hilfsaufrufen verborgen sind. Integrationstests werden nur ausgeführt, wenn TEST_REFRESH_TOKEN gesetzt ist.


MseeP.ai Security Assessment Badge