GitHub
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Beschreibung vom Entwickler (englisches Original)
Heap histograms, Go profiles, crash logs and core dumps from Kubernetes pods before they died.
Diese drei werden nie zu einer Punktzahl zusammengefasst: Meinungen, Messungen und Beliebtheit sind verschiedene Dinge.
Für diesen Server haben wir noch keine Zusammenfassung in einfacher Sprache geschrieben. Unten stehen die Fakten, die wir aus der Registry gelesen haben.
Wähle die KI-App, die du nutzt, und kopiere die Einstellungen.
Du brauchst
Welche App nutzt du?
Wähle oben deine App. Wir merken sie uns, damit der Button beim nächsten Mal „In … installieren“ anzeigt.
Öffne Claude Desktop → Settings → Developer → Edit Config und füge dies in claude_desktop_config.json ein
{
"mcpServers": {
"lastwords": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arvo-ai/lastwords:v0.1.5",
"mcp"
]
}
}
}Führe das in deinem Terminal aus
claude mcp add lastwords -- docker run -i --rm ghcr.io/arvo-ai/lastwords:v0.1.5 mcpIn .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen
{
"mcpServers": {
"lastwords": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arvo-ai/lastwords:v0.1.5",
"mcp"
]
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
In .vscode/mcp.json in deinem Projekt einfügen
{
"servers": {
"lastwords": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/arvo-ai/lastwords:v0.1.5",
"mcp"
]
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
Dieser Server läuft auf deinem Computer, und ChatGPT kann sich nur mit Servern im Internet verbinden. Wähle eine andere App.
Deine Auswahl bleibt in einem Cookie auf diesem Gerät; kein Konto nötig.
Diese Einstellungen werden aus dem Registry-Eintrag des Entwicklers erzeugt. Wenn in der README etwas anderes steht, folge der README.
Läuft auf deinem Computer; die Tool-Liste erscheint nach der Installation in deiner KI-App.
Wir prüfen Informationen, die jeder sehen kann; den Code haben wir nicht gelesen. Checks, die nicht zutreffen, werden nicht mitgezählt. · Geprüft am 7. Nov. 2026
Der Registry-Name wurde mit dem GitHub-Konto Arvo-AI bestätigt, dem das Repo gehört
Dieses Repo haben wir noch nicht von GitHub gelesen
Dieses Repo haben wir noch nicht von GitHub gelesen
Dieser Server läuft auf deinem Computer; es gibt keinen Endpunkt im Internet
Läuft auf deinem Computer und nutzt stattdessen lokale Einstellungen
Läuft auf deinem Computer; Tool-Listen können wir nur von Endpunkten im Internet lesen
Verglichen mit allen aktiven Servern dieser Kategorie in der Registry. Sterne zählen nur, wenn dem Herausgeber das Repo gehört.
Er hat 1 von 1 zutreffenden Basischecks bestanden. Den Code haben wir nicht gelesen. Bevor du einen Schlüssel oder Token hinzufügst, sieh nach, welche Zugriffe der Server verlangt, und nutze einen Schlüssel, der nur die Berechtigungen hat, die du brauchst.
Die Registry nennt keinen erforderlichen Schlüssel, manche Server bitten dich aber bei der ersten Nutzung, dich anzumelden.
Er läuft auf deinem Computer. Deine KI-App startet ihn bei Bedarf, und die Daten laufen nicht über die Server des Entwicklers (außer der Server ruft selbst einen Onlinedienst auf).
Das GitHub-Repo wurde zuletzt – geändert, und die neueste Version (0.1.5) kam vorgestern in die Registry.
Apps, die MCP unterstützen, etwa Claude Desktop, Claude Code, Cursor und VS Code. Außerdem brauchst du Docker auf deinem Computer.
In derselben Kategorie: GitHub, Desktop Commander, Cloudflare MCP
Server derselben Kategorie von anderen Entwicklern, sortiert nach Sternen.
So liest du eine Karte:★ GitHub-SterneiDrei Säulen: Bewertungen · Checks · NutzungiAktualisiert = neueste Version in der Registry veröffentlichti
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
MCP server for terminal commands, file operations, and process management
Cloudflare MCP servers
Unverändert aus dem Repo des Entwicklers übernommen. PopNx MCP hat den Inhalt weder geprüft noch empfiehlt es ihn. HTML, Bilder und Skripte wurden entfernt. Links führen von dieser Website weg.
Memory snapshots before OOM kills, and logs and core dumps from crashes, for Kubernetes.
lastwords runs on every node. When a container gets close to its memory limit, it records what is using the memory. When a container dies, it saves the logs of that instance, the pod's events and any core dump. Everything stays on the node (or in S3), and you can read it with kubectl lastwords or from an AI agent over MCP.
helm install lastwords oci://ghcr.io/arvo-ai/charts/lastwords -n lastwords --create-namespace
When you look at a pod that died hours ago, most of the evidence is gone:
-XX:+HeapDumpOnOutOfMemoryError never fires, and Go, Node and Python get no warning either.--event-ttl, default 1h).core_pattern is set per node, so crashing containers either dump nothing or dump to a path inside a container that is about to be deleted.None of it can be recovered later. It has to be collected while the container is alive or right after it dies, which is what lastwords does.
| When | What lastwords saves |
|---|---|
| A container nears its memory limit (90%, again at 97%, or earlier if it is climbing fast) | Memory breakdown (heap vs page cache vs kernel), a memory timeline, processes. Java: class histogram, heap info, native memory, thread dump. Go: heap profile with the top allocation sites. Optional full heap dump. |
| A container is OOMKilled | The memory curve up to the kill, logs of the instance that died, pod events, and links to the snapshots taken before the kill |
| A process inside a container is OOM-killed but the container survives | What Kubernetes never reports: which process died and the memory state |
| A container crashes (non-zero exit, signal) | Log tail of the dead instance, the crash site parsed from Go/Java/Python stack traces, events, exit code meaning |
| A process dumps core (SIGSEGV, SIGABRT, ...) | The gzipped core, memory maps, binary and image, matched to the pod |
| A pod is evicted | Eviction reason, every container's logs, events |
Every capture comes with a summary.md that says what happened in plain words:
# checkout-5498f94695-526hm/checkout was OOMKilled at 16:51:38 UTC (limit 384.0 MiB); 1 snapshot taken before the kill
kubectl lastwords list # everything from the last 7 days
kubectl lastwords list -n shop --kind oomkill kubectl lastwords show 20261102T030712Z-af14b5 kubectl lastwords get 20261102T030712Z-af14b5 jvm-class-histogram.txt kubectl lastwords top # containers closest to their memory limit right now
Install the CLI (it is also a kubectl plugin):
# macOS / Linux
curl -sSL https://github.com/Arvo-AI/lastwords/releases/latest/download/lastwords_$(uname -s)_$(uname -m | sed s/aarch64/arm64/).tar.gz | tar xz sudo mv lastwords /usr/local/bin/ && sudo ln -sf /usr/local/bin/lastwords /usr/local/bin/kubectl-lastwords
The CLI talks to the agents through the Kubernetes API server, so it needs nothing but your kubeconfig.
Measured on EKS with the failures in this repo; every command and output is from a real run.
Agent eval: setup, grader and every transcript from 24 runs with and without lastwords.
lastwords ships an MCP server. Claude Code, Codex, Cursor and any MCP client can list and read captures:
claude mcp add lastwords -- kubectl-lastwords mcp
codex mcp add lastwords -- kubectl-lastwords mcp
Then ask: *"the checkout pods restarted overnight, why?"* Tools: lastwords_list_captures, lastwords_get_capture, lastwords_read_file, lastwords_watchlist. All read-only.
helm upgrade lastwords oci://ghcr.io/arvo-ai/charts/lastwords -n lastwords --reuse-values \
--set notifications.slackWebhookUrl=https://hooks.slack.com/services/... \ --set notifications.webhookUrl=https://your-service/lastwords \ --set notifications.webhookSecret=$(openssl rand -hex 32)
With a secret set, every webhook delivery is signed: X-Lastwords-Signature: sha256= . ">. Verify it before acting on the event, and reject old timestamps:
import hmac, hashlib, time
def verify(secret: bytes, headers, body: bytes, tolerance=300) -> bool: ts = headers["X-Lastwords-Timestamp"] if abs(time.time() - int(ts)) > tolerance: return False want = "sha256=" + hmac.new(secret, ts.encode() + b"." + body, hashlib.sha256).hexdigest() return hmac.compare_digest(want, headers["X-Lastwords-Signature"])
Go receivers can use github.com/Arvo-AI/lastwords/webhook.Verify.
Every capture also becomes a Kubernetes Event on the pod (LastWordsOOMKill, LastWordsMemoryPressure, LastWordsCrash, ...), so it shows up in kubectl describe pod and anything that watches events. Prometheus metrics are on :9095/metrics.
Common settings (see values.yaml for all):
| Value | Default | |
|---|---|---|
capture.threshold | 0.90 | Capture at this share of the memory limit (working set, like the kubelet) |
capture.lastGasp | 0.97 | Second capture right before the kill |
capture.predictive | true | Capture early if the limit will be hit within predictSeconds |
capture.jvmGCHeadroom | 0.25 | A JVM with -Xmx above the limit can be killed by a GC before memory reaches 100% (80% with SerialGC in our EKS test), so its tiers aim below that |
capture.heapDumps | false | Full Java heap dumps for every JVM. Pods can opt in with the lastwords.dev/heap-dump: "true" annotation |
capture.goPprofPort | 6060 | Where Go programs serve net/http/pprof |
coreDumps.enabled | false | Capture core dumps (sets the node's kernel.core_pattern, needs a privileged agent) |
storage.maxBytes | 5 GiB | Disk budget per node |
s3.bucket | Upload captures to S3, GCS (interoperability) or MinIO | |
ignoreNamespaces | [kube-system] | Never watch these |
api.createSecret | true | Create the API token secret. Set false with Argo CD or Flux and create lastwords-api yourself (why) |
Pod annotations:
| Annotation | |
|---|---|
lastwords.dev/ignore: "true" | Don't watch this pod |
lastwords.dev/threshold: "0.8" | Per-pod capture threshold |
lastwords.dev/heap-dump: "true" | Allow a full heap dump for this pod |
lastwords.dev/pprof-port: "8080" | Go pprof port |
helm uninstall lastwords -n lastwords
On shutdown the agent puts the node's original core_pattern back (checked on EKS: systemd-coredump again after uninstall). Captures and the core helper binary stay in /var/lib/lastwords on each node, so a reinstall keeps your history, and a node whose agent was killed before it could restore core_pattern still has a working helper to hand cores to. Delete that directory on the nodes to remove everything.
A DaemonSet runs one small agent per node (a static Go binary; requests 20m CPU and 48 MiB). Measured on EKS (t3.large, Amazon Linux 2023): 8m CPU and 12 MiB on a quiet node, 20m CPU and 15 MiB with 35 containers, about 0.5m CPU per container watched.
memory.current, memory.stat, memory.events, PSI), computes the working set the way the kubelet does, and keeps a 10-minute timeline.jcmd uses) from outside the container; nothing is installed in your images. For Go it pulls /debug/pprof/heap.kernel.core_pattern at a small helper that writes the gzipped core next to the captures, and the agent matches it to the pod.More in docs/how-it-works.md.
lastwords reads other processes' memory accounting, so it needs node-level access. Read docs/security.md before installing it in production. In short:
hostPID and the capabilities SYS_PTRACE, DAC_READ_SEARCH, DAC_OVERRIDE, CHOWN, FOWNER, KILL, plus a read-only root filesystem.privileged to set kernel.core_pattern. They are off by default.pods/proxy in the lastwords namespace plus the API token secret. The chart creates a lastwords-reader Role.My pod was OOMKilled. How do I find out what used the memory? If lastwords was running, kubectl lastwords list --kind oomkill shows the kill, and the linked pressure capture shows what was using memory before it. If it wasn't running, nothing can recover that information. Install it so the next kill is captured.
Why didn't `HeapDumpOnOutOfMemoryError` produce a heap dump? That flag fires when the JVM itself runs out of heap. A container OOM kill is the kernel sending SIGKILL when the whole process (heap plus metaspace, threads, direct buffers, native memory) hits the
Nur der Anfang wird gezeigt; den Rest findest du im Repo