claude-handoff
claude-handoff
Verwandle jede Claude Code-Sitzung – selbst eine abgestürzte – in ein sauberes handoff.md, von dem eine andere KI weiterarbeiten kann. Und gib Claude Code ein dauerhaftes Projektgedächtnis, destilliert aus deiner eigenen Geschichte.
chfDas war's. Deine letzte Sitzung wird zu handoff.md: das Gespräch ohne das Rauschen, die geänderten Dateien, die ausgeführten Befehle – beginnend mit Anweisungen für den empfangenden Assistenten, sodass du es direkt in Gemini, GPT, claude.ai oder eine neue Claude Code-Sitzung einfügen kannst, ohne zusätzliche Aufforderung.

Claude Code speichert jede Sitzung lokal als JSONL (~/.claude/projects/…/*.jsonl), voller Tool-Aufrufe, Tool-Ergebnisse, Denkblöcke und Systemerinnerungen. Bestehende Exporteure kippen das alles in Markdown. claude-handoff erzeugt stattdessen ein Handoff-Dokument – und, da es deine gesamte Geschichte lesen kann, auch eine Projektgedächtnis-Übersicht.
Null Abhängigkeiten. Nur Standardbibliothek, Python 3.9+. Ein Neun-Modul-Paket – auch als generiertes Einzeldatei-Skript, das du per
curlholen und prüfen kannst.Deterministisch standardmäßig. Kein API-Aufruf, keine Kosten, funktioniert offline.
--llmfür eine echte Zusammenfassung. Claude, OpenAI oder Gemini über deinen eigenen API-Schlüssel – oder--llm claude-cli, das deine lokal installierte Claude Code CLI auf deinem bestehenden Pro/Max-Plan nutzt: ganz ohne API-Schlüssel.Rauschfrei. Entfernt Tool-Ergebnisse, Denkblöcke, Systemerinnerungen, Subagent-Geschwätz, Slash-Command-Hüllen. Behält Benutzerabsicht, Assistentenantworten, geänderte Dateien, ausgeführte Befehle – einschließlich der Dateien und Befehle von Subagenten (
agent-*.jsonl), deren vollständige Transkripte hinter--include-sidechainsbleiben.Projektgedächtnis.
chf --briefdestilliert die GESAMTE Sitzungshistorie eines Projekts in eine lebendige Übersicht (Entscheidungen, Fixes, Konventionen, offene Threads – mit Sitzungszitaten);--install-brief-hookinjiziert sie in jede neue Claude Code-Sitzung, sodass Claude das Projekt bereits kennt.Sicher zum Einfügen. Geheimnisartige Zeichenfolgen (API-Schlüssel, Tokens,
password=…) werden aus jeder Ausgabe entfernt – das Handoff, das du in einen Web-Chat einfügst, ist ebenfalls ein Egress.--anonymizegeht für öffentliche Weitergabe noch weiter.
Voraussetzungen
Anforderung | Minimum | Prüfen | Hinweise |
Python | 3.9+ |
| Die einzige harte Anforderung |
Claude Code | beliebig |
| Nur für |
pipx (empfohlen) | beliebig |
|
|
Keine Drittanbieter-Python-Pakete, niemals – alles läuft auf der Standardbibliothek.
Related MCP server: Longhand
Installation
pipx install claude-handoff # or: pip install claude-handoffbrew install Vasilispapg/tap/claude-handoff # Homebrew# or just grab the generated single-file build — stdlib-only, auditable:
curl -O https://raw.githubusercontent.com/Vasilispapg/claude-handoff/main/single/claude_handoff.py
python3 claude_handoff.py --listDie Installation des Pakets gibt dir zwei identische Befehle: claude-handoff und den kurzen Alias chf. Tab-Vervollständigung:
eval "$(claude-handoff --completions zsh)" # bash works too60 Sekunden: Wähle deine Situation
Eine Sitzung ist abgestürzt, das Nutzungslimit erreicht, oder du hast das Terminal geschlossen:
chf -o clipboard…dann füge es in claude.ai, ChatGPT, Gemini – oder eine neue claude-Sitzung ein. Funktioniert mit jeder alten Sitzung; es musste nichts vor dem Absturz installiert sein.
Arbeit von Claude Code auf ein anderes Modell übertragen:
chf --fit 32k -o clipboard # sized to the receiver's context window„Welche Sitzung war das, in der wir über CORS gesprochen haben?"
chf --list --grep "CORS" # every match, with a 🔍 context preview
chf --grep "CORS" # or export the newest match directlyClaude Code ein dauerhaftes Gedächtnis für dieses Projekt geben:
chf --brief --llm claude-cli # distill ALL sessions → one cited brief
chf --install-brief-hook # every new session starts knowing itEine echte Zusammenfassung statt des Transkripts (Ziel / Entscheidungen / Stand / Nächstes):
chf --llm claude-cli # your Claude Code login — no API keyEin claude.ai- oder ChatGPT-Web-Chat statt einer Terminal-Sitzung:
chf conversations.json --list # each app's data export works as input
chf conversations.json --name "webhook bug"Projektgedächtnis (--brief)
Claude Code vergisst alles zwischen Sitzungen – aber die gesamte Geschichte liegt auf deiner Festplatte. chf --brief liest jede Sitzung des aktuellen Projekts und schreibt ein Gedächtnisdokument nach ~/.claude/briefs/<project>.md:
eine sachliche Sitzungs-Zeitleiste + am häufigsten berührte Dateien (deterministisch, kostenlos);
mit
--llmein destilliertes Gedächtnis – Entscheidungen mit ihrem Warum, behobene Fehler, Konventionen, offene Threads – jeder Punkt zitiert mit der Sitzungs-ID, aus der er stammt (chf --name <id>öffnet die Quelle).

Notizen pro Sitzung werden zwischengespeichert, sodass das Aktualisieren nach neuen Sitzungen nur für die neuen bezahlt – und eine Monster-Sitzung (über ~120k Zeichen) wird innerhalb der Notiz map-reduziert, sodass der Gedächtnispfad nie abgeschnitten wird: Nichts wird stillschweigend verworfen, egal bei welcher Größe.
chf --install-brief-hookinstalliert zwei Hooks: SessionStart injiziert die Übersicht als Kontext (Claude startet bereits mit Projektkenntnis – auch nach /compact erneut injiziert), SessionEnd aktualisiert automatisch den sachlichen Teil kostenlos. Von einem Hook läuft niemals ein LLM; der destillierte Teil wird nur aktualisiert, wenn du es sagst. Die Übersicht trägt einen Frische-Stempel, und sowohl die Datei als auch die Injektion warnen, wenn neuere Sitzungen existieren. Vollständig lokal; Redaktion gilt wie überall.
→ Schritt-für-Schritt-Mechanik, die ehrliche Kostentabelle und ein kompletter Tagesablauf: docs/GUIDE.md.
Automatisierung
chf --install-hook # SessionEnd + PreCompact → handoff to ~/.claude/handoffs/
chf --install-brief-hook # SessionStart/End + PreCompact → project memory (above)PreCompact ist wichtig: Direkt bevor Claude Code den Kontext einer langen Sitzung kompaktiert, erfassen beide Hooks den Zustand – das Handoff bewahrt Details, die die Kompaktierung gleich ausquetschen würde, und das Übersichts-Skelett bleibt mitten in der Sitzung frisch.
Beide bearbeiten ~/.claude/settings.json nicht-destruktiv, sind idempotent und haben passende --uninstall-*-Flags. Hook-Fehler brechen die Host-Sitzung nie, und Hooks lösen niemals LLM-Aufrufe aus oder erstellen eigenständig Dateien.
Wie die Ausgabe aussieht
# Conversation handoff
> To the receiving assistant: … you are taking over …
## Session
- Project: /home/you/myapp (branch main)
- When: 2026-08-20 09:00 → 09:04
- Activity: 2 user messages, 4 assistant replies, 4 tool calls
## Files created / modified
- /home/you/myapp/auth.py
## Commands run
- python -m pytest tests/test_auth.py -q
_🤖 2 subagent(s) contributed to the work above (--include-sidechains for their transcripts)._
## Conversation
### 🧑 User
the login breaks on unicode passwords…
### 🤖 Assistant
Found it — ascii encoding. Changed to utf-8, tests pass.Häufige Befehle
chf # latest session → handoff.md
chf -i # numbered picker; "1,3" or "2-4" merges several
chf --list # what sessions do I have? (title · first prompt)
chf --list --format json # the same, machine-readable
chf --name "login bug" # newest session whose title/prompt matches
chf "login bug" # same — a non-path argument is a name search
chf --grep "CORS" # newest session that *talked about* CORS
chf --grep CORS --grep auth # …that talked about BOTH (AND)
chf a.jsonl b.jsonl # several paths → ONE merged handoff
chf --project myrepo # latest session of a specific project
chf path/to/session.jsonl -o - # explicit file → stdout
chf -o clipboard # straight to the clipboard — go paste it
chf --last 5 # only the last 5 user turns
chf --since 2h # only the last 2 hours of the session
chf --fit 32k # sized to fit a 32k-token context
chf --include-tools # keep collapsed per-tool-call detail
chf --include-sidechains # append full subagent transcripts
chf --anonymize # public-safe: ~ paths, no emails/IPs/username
chf --project myrepo --merge # whole project in ONE handoff, oldest → newest
chf --format json -o session.json # machine-readable handoff
# LLM summaries (goal / decisions / current state / next steps):
chf --llm claude-cli # your Claude Code login — no API key
chf --llm ollama # local model — fully offline
chf --llm claude # Anthropic API (ANTHROPIC_API_KEY)
chf --llm openai --model gpt-4o # OpenAI API (OPENAI_API_KEY)
chf --llm gemini --with-transcript # Google API (GEMINI_API_KEY)
chf --llm claude-cli --focus "emphasize the API decisions"
# project memory:
chf --brief # free factual brief (timeline + files)
chf --brief --llm claude-cli # + distilled decisions/fixes/conventionsWo sucht es? Sitzungen liegen im globalen Store von Claude Code (~/.claude/projects), du kannst chf also von überall ausführen. Wenn dein aktuelles Verzeichnis ein Projekt ist (oder ein Unterordner davon), beschränkt es sich auf die Sitzungen dieses Projekts; ein übergeordneter „Master-Ordner" beschränkt sich auf alle Projekte darunter; --any ignoriert das Verzeichnis vollständig. Die automatische Auswahl überspringt fast leere Sitzungen (wie den Stub, den claude /login hinterlässt), sodass „neueste" deine neueste echte Unterhaltung bedeutet – ein expliziter Pfad, --name oder -i gewinnt immer.
Große Sitzungen. Transkripte über einen Durchgang (~400k Zeichen) werden im Map-Reduce-Stil zusammengefasst: Notizen pro Chunk, dann eine Synthese – nichts wird stillschweigend verworfen, und fertige Chunks werden in ~/.cache/claude-handoff zwischengespeichert, sodass ein unterbrochener Lauf kostenlos fortgesetzt wird. Chunks laufen bei API-Anbietern 4-fach parallel; claude-cli und ollama bleiben bewusst sequenziell. Im Terminal erhältst du einen Live-Fortschrittsbalken:
[█████████░░░░░░░░░░░░░░░] 3/9 chunks | 4m12s elapsed | ~8m left | summarizing part 4/8 (199,867 chars)…Sitzungen mit API-usage-Daten erhalten außerdem eine Tokens-Zeile im Kopfbereich, und jeder Lauf meldet die ≈Token-Größe der Ausgabe.
Datenschutz & Zero-Trust
Nichts wird irgendwohin gesendet, außer du übergibst
--llm– der deterministische Modus ist vollständig offline.Redaktion ist für jede Ausgabe aktiv, nicht nur für LLM-Verkehr: geheimnisartige Zeichenfolgen (API-Schlüssel, Tokens, JWTs,
password=…) werden aus dem Handoff selbst, aus Hook-Dateien und MCP-Antworten entfernt – ein eingefügtes Dokument ist ebenfalls Egress.--no-redactdeaktiviert sie pro Lauf (und ist in der Konfigurationsdatei bewusst nicht erlaubt).--anonymizereduziert zusätzlich dein Home-Verzeichnis auf~und ersetzt E-Mails, IPv4-Adressen und deinen Benutzernamen durch Platzhalter – zum Einfügen in öffentliche Issues und Foren.--llm claude-cliund--llm ollamahalten alles innerhalb von Konten und Maschinen, die du bereits kontrollierst.Prompt-Injection-Schutz: Transkripte enthalten regelmäßig unvertrauten Text (Webseiten in Tool-Ergebnissen, eingefügte READMEs). Jeder Prompt, der ein Transkript konsumiert, die Handoff-Präambel und der Brief-Injektions-Wrapper rahmen diesen Inhalt als Daten, nicht als Anweisungen – durch Tests abgesichert. Eine Abschwächung, kein Beweis; der Parser selbst führt nie etwas aus.
Konfiguration (optional)
Lege Standardwerte, die du immer verwendest, in ~/.config/claude-handoff/config.json ab (CLI-Flags gewinnen immer; CLAUDE_HANDOFF_CONFIG überschreibt den Pfad):
{ "llm": "claude-cli", "fit": "32k", "include_tools": true }Erlaubte Schlüssel: llm, model, fit, output, include_tools, include_sidechains, max_chars, anonymize, focus. Sicherheitsschalter (no_redact) sind bewusst nicht konfigurierbar – die Redaktion zu schwächen muss eine explizite Wahl pro Lauf sein. Eine defekte Konfiguration warnt und wird ignoriert, nie fatal.
Umgebungsvariablen
Variable | Zweck |
| Schlüssel für |
| Schlüssel für |
| Schlüssel für |
| Lokales Ollama-Modell und Endpunkt |
| Claude Code Home (Standard |
| Chunk/Notiz-Cache-Verzeichnis (Standard |
| Pfad zur Konfigurationsdatei (Standard |
|
|
claude-cli benötigt keine Variable – es ruft deine installierte Claude Code-CLI auf, die über deinen Pro/Max-Plan abgerechnet wird (führe claude einmal aus, um dich anzumelden).
MCP-Server
Jeder MCP-Client (Claude Desktop, Claude Code, …) kann Handoffs direkt abrufen:
claude mcp add claude-handoff -- claude-handoff --mcpTools: list_sessions (was auf dieser Maschine ist) und handoff (erstellt das Dokument für eine Sitzung nach Name/Projekt/Pfad; übergib anonymize für eine teilbare Version). Deterministisch standardmäßig – ein MCP-Client kann LLM-Zusammenfassungen nur auslösen, wenn du den Server mit --allow-llm startest.
Fehlerbehebung
claude-handoff: command not found nach pip install
pip legt Skripte in ein Benutzer-Bin-Verzeichnis, das möglicherweise nicht im PATH liegt. Verwende pipx install claude-handoff oder brew – beide verwalten den PATH – oder füge ~/.local/bin (Linux) / ~/Library/Python/3.x/bin (macOS) zu deinem PATH hinzu.
„Keine Sitzungen unter ~/.claude/projects gefunden"
Du bist auf einer Maschine (oder einem Benutzer), auf der Claude Code nicht ausgeführt wurde, oder dein Store liegt woanders – weise CLAUDE_HOME darauf. Innerhalb eines Projektordners beschränkt sich das Tool auf dieses Projekt; übergib --any, um alles zu durchsuchen.
Es hat die falsche Sitzung ausgewählt
„Neueste" überspringt fast leere Stubs, ist aber immer noch nur die neueste Datei. Verwende -i (Auswahl), --name "Teil des Titels" oder --grep "etwas Gesagtes".
--llm claude-cli schlägt fehl oder fragt nach Authentifizierung
Führe claude einmal aus und melde dich an (/login). Es funktioniert auch, wenn es aus innerhalb einer Claude-Code-Sitzung aufgerufen wird – geerbte CLAUDE*-Umgebungsvariablen werden entfernt, sodass sich die verschachtelte CLI wie eine frische authentifiziert.
"Setze ANTHROPIC_API_KEY … um --llm claude zu verwenden"
API-Anbieter benötigen einen Schlüssel in der Umgebung – siehe Tabelle oben. Gar kein Schlüssel? Verwende --llm claude-cli (Abonnement) oder --llm ollama (lokal).
--fit lässt sich nicht mit --llm / --max-chars kombinieren--fit dimensioniert die deterministische Ausgabe selbst. Wenn du es nicht eingegeben hast, setzt deine Konfigurationsdatei wahrscheinlich fit – überschreibe es, indem du ein explizites --max-chars entfernst, oder entferne den Schlüssel.
Die Kurzfassungs-Injektion warnt: „Es existieren neuere Sitzungen als diese Kurzfassung“
Das ist der Frischestempel, der seine Arbeit tut: Führe chf --brief --llm claude-cli aus, um neu zu destillieren (zwischengespeichert – nur neue Sitzungen werden bezahlt). Der faktenbasierte Teil aktualisiert sich selbst, wenn der SessionEnd-Hook installiert ist.
Etwas hat stillschweigend nichts getan?
Fehlertolerante Pfade (korrupte JSONL-Zeilen, nicht lesbare Dateien, Cache-Probleme) lassen den Lauf nie abstürzen – füge --debug (oder CLAUDE_HANDOFF_DEBUG=1) hinzu, um genau zu sehen, was übersprungen wurde und warum. Hooks melden ihre Fehler immer auf stderr, während sie weiterhin mit 0 beenden.
Verstümmelte Zeichen unter Windows
Setze PYTHONUTF8=1 (die CI führt die gesamte Suite so aus).
Vollständige Flag-Referenz
Flag | Bedeutung |
| Sitzungen auflisten (Datum, Größe, Projekt, Titel · erster Prompt); mit einer |
| neueste Sitzung (oder Web-Konversation) auswählen, deren Titel/erster Prompt QUERY enthält |
| neueste Sitzung auswählen, deren Konversation TEXT enthält (Flag wiederholen, um ALLE Begriffe zu verlangen); mit |
| letzte Sitzung auswählen, deren Projektpfad NAME enthält (wiederholbar – mehrere Projekte zusammen) |
| Sitzung(en) aus einer nummerierten Liste auswählen – |
| aktuelles Verzeichnis ignorieren; Sitzungen aller Projekte berücksichtigen |
| nur das Ende der Konversation behalten (N Benutzerwechsel / ein Zeitfenster) |
| alle Sitzungen im Umfang zu EINEM Handoff zusammenführen (Sitzungsunterbrechungsmarker, summierte Aktivität) |
| die gesamte Projektgeschichte in |
| Projektgedächtnis-Hooks: Kurzfassung bei SessionStart einfügen, Fakten bei SessionEnd automatisch aktualisieren |
| automatisch einen Handoff nach |
| Markdown (Standard) oder maschinenlesbares JSON – gilt auch für |
| Ausgabedatei / stdout / Zwischenablage (Standard |
| den deterministischen Handoff auf ein Token-Budget ( |
| Transkriptabschnitt begrenzen (Standard 80 000; behält Anfang + letztes Ende) |
| eingeklappte |
| vollständige Subagent-Transkripte anhängen (inline Sidechains und |
| LLM-Zusammenfassung statt rohem bereinigtem Transkript |
| LLM-Modell überschreiben |
| zusätzliche Anweisungen für die Zusammenfassung (z. B. |
| mit |
| Identität für öffentliches Teilen entfernen: Home-Pfade → |
| geheim aussehende Zeichenfolgen behalten (Standard: aus jeder Ausgabe geschwärzt, ob LLM oder nicht) |
| Chunk-Notiz-Cache deaktivieren ( |
| als MCP-Server über stdio ausführen |
| mit |
| Tab-Vervollständigungs-Snippet ausgeben |
| tolerierte Fehler (korrupte Zeilen, nicht lesbare Dateien) auf stderr melden – nichts wird fatal |
Roadmap
Gemini-Exporte als Eingabe (Google Takeout liefert nur HTML – bring einen echten, redigierten Export zum Entwickeln mit)
Sitzungsketten: automatisch
/compact-fortgesetzte Sitzungen erkennen und anbieten, die Abstammung zusammenzuführen (--follow)
PRs willkommen.
Wie es sich vergleicht
Dieser Bereich ist nicht leer – er ist fragmentiert. Wähle das Tool, das zu deiner Situation passt:
Exporteure – claude-conversation-extractor, claude-code-log, claude-code-transcripts, claude-to-markdown – wandeln Transkripte in lesbares Markdown/HTML um, einschließlich Tool-Rauschen, ohne Handoff-Rahmen.
CLI-übergreifende Sitzungsverschieber – cli-continues (
npm i -g continues) liest die nativen Sitzungsspeicher von 16 Coding-CLIs (einschließlich Claude Code) und injiziert ein Kontextdokument in ein anderes Terminal-Tool. Ausgezeichnet für Claude Code → Codex/Cursor/Gemini CLI; kann aber keine Web-Chats ansprechen, macht keine LLM-Zusammenfassung und benötigt Node 22.5+.In-Sitzungs-Handoff-Fähigkeiten/Plugins – thepushkarp/handoff, claude-session-handoff, claude-code-handoff – großartig, wenn du daran denkst, sie vor dem Ende der Sitzung auszuführen; das Modell schreibt die Zusammenfassung mit dem Kontext deiner Sitzung, und die Ausgabe zielt auf die nächste Claude-Sitzung.
Browser-Erweiterungen – Handoff, LLM Context Bridge, ContextSwitch – übertragen Web-Chats zwischen ChatGPT/Claude/Gemini; sie können keine Claude-Code-Sitzungen sehen.
claude-handoff ist die Post-hoc-, überall-einfügbare Ecke dieser Karte: Es arbeitet mit dem JSONL nach dem Ereignis – alte Sitzungen, abgestürzte Sitzungen, Sitzungen, die das Nutzungslimit erreicht haben – benötigt nichts vorinstalliertes, kostet standardmäßig null Token, kann eine echte Zusammenfassung schreiben, wenn du eine anforderst (--llm), und erzeugt ein Dokument, das jedes empfangende Modell aufnehmen kann, einschließlich claude.ai, ChatGPT und Gemini im Browser oder auf deinem Telefon. Und mit --brief ist es das einzige, das diese Geschichte in dauerhaftes Projektgedächtnis verwandelt.
Entwicklung
git clone https://github.com/Vasilispapg/claude-handoff && cd claude-handoff
python3 -m unittest discover -s tests -v # the whole suite (no deps needed)
python3 -m claude_handoff tests/fixtures/agent_session.jsonl -o - # smoke run
python3 scripts/build_single.py --check # single-file build is fresh
uvx ruff check claude_handoff scripts tests # lint (config in pyproject)Der Laufzeitcode befindet sich im Paket claude_handoff/; single/claude_handoff.py ist generiert – baue es mit python3 scripts/build_single.py nach jeder Paketänderung neu (CI schlägt fehl, wenn es veraltet ist). Neues Parser-Verhalten beginnt mit einer redigierten Fixture in tests/fixtures/ – siehe CONTRIBUTING.md und AGENTS.md (Anweisungen und Invarianten für menschliche und KI-Beitragende).
Mehr erfahren
docs/GUIDE.md – ein Tag mit claude-handoff: Durchlauf, wie --brief Schritt für Schritt funktioniert, ehrliche Kostentabelle, Spickzettel · INDEX.md – Dateizuordnung · docs/DEVELOPMENT.md – Architektur, JSONL-Schema-Notizen, Designentscheidungen · AGENTS.md – Beitragsleitfaden für KI-Codierungsagenten · CONTRIBUTING.md · CHANGELOG.md
Lizenz
MIT
mcp-name: io.github.Vasilispapg/claude-handoff
Available Tools
2 toolshandoffB
Build a clean handoff document (markdown) from a Claude Code session so another assistant can continue the work. Deterministic — no LLM calls, no cost.
| Name | Required | Description | Default |
|---|---|---|---|
| last | No | keep only the last N user turns | |
| name | No | newest session whose title or first prompt contains this | |
| path | No | explicit session .jsonl path | |
| project | No | ||
| anonymize | No | ||
| include_tools | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses a key behavioral trait ('Deterministic — no LLM calls, no cost'), which is useful, but it does not describe side effects, required session context, or how the tool processes the session beyond generating a document. This partial disclosure is insufficient for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences, both front-loaded with purpose and a notable trait. Every word earns its place, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, no output schema, and no annotations, the description is severely under-specified. It fails to explain how parameters like anonymize or include_tools affect output, what the tool returns (file vs printed text), or any prerequisites such as an existing session. The deterministic note is helpful but does not cover the core operational details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, so the description must compensate for undocumented parameters (project, anonymize, include_tools). However, the description makes no mention of any parameters, neither explaining the documented ones nor filling gaps for the undocumented. It adds zero semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb 'build' and the resource 'clean handoff document (markdown) from a Claude Code session', with clear intent ('so another assistant can continue the work'). This clearly distinguishes it from sibling list_sessions, which lists sessions rather than generating documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for handoff scenarios but does not explicitly state when to use it versus list_sessions or any alternatives. It provides context for its purpose but lacks explicit exclusions or comparisons, leaving the agent to infer the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sessionsA
List Claude Code sessions on this machine, newest first: date, project, id, title and first prompt.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | substring filter on the project path |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the read-only nature implicitly (listing) and the ordering, but it doesn't explicitly state that no modifications occur, nor does it mention any authentication requirements or potential limitations. The description is adequate but not rich in behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, directly front-loaded sentence states the resource, ordering, and return fields without any fluff or repetition. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with one optional parameter and no output schema, the description covers the essential return fields and ordering. It omits details like pagination limits or how many sessions are returned, but for a straightforward listing operation this is a minor gap given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage for the single parameter 'project' is 100%, with a clear description of it being a substring filter on the project path. The tool description adds no additional parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('Claude Code sessions on this machine'), and the behavior ('newest first'), plus the fields included. It's easily distinguished from the lone sibling 'handoff', which implies a different purpose entirely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for listing local sessions, but provides no explicit when-to-use or when-not-to-use guidance, nor does it reference any alternatives. With only one sibling (handoff) that seems unrelated, the context is adequate but not explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
handoff - First observed
list_sessions
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one lists available sessions and the other generates a handoff document from a selected session. There is no overlap or ambiguity in their roles.
Both tool names are concise verbs, but they mix patterns slightly: 'list_sessions' follows verb_noun while 'handoff' is a single verb/noun. The inconsistency is minor and both names are predictable in context.
Two tools is a thin set, but it matches the server's narrow purpose of session listing and handoff generation. It feels borderline but acceptable for a focused utility.
The domain is fully covered: list_sessions provides the discovery step and handoff provides the output generation. There are no obvious dead ends or missing operations for the stated purpose.
Maintenance
Related MCP Connectors
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
- TaprootOAuthcom.taproothq
Persistent memory layer for AI tools. Save and recall notes across Claude and other MCP clients.
Shared memory and mail for your AI agents. Verified with Claude Code; other MCP clients in testing.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Related MCP Servers
- AlicenseAqualityCmaintenancePersistent memory for Claude Code. Automatically indexes every conversation and provides production-grade hybrid search (BM25 + vectors + reranker) via MCP tools. 100% local, zero config, zero API keys, zero invoice.1637 npm7MIT
- AlicenseAqualityAmaintenancePersistent local memory for Claude Code that indexes every session's JSONL file verbatim into SQLite + ChromaDB. Exposes 17 MCP tools for semantic recall, deterministic file replay, and fuzzy "do you remember when..." queries across your entire session history — no API calls, nothing leaves the machine.1777 PyPI15MIT
- AlicenseAqualityCmaintenancePersistent memory + FTS5 full-text search for Claude Code conversation history. Indexes ~/.claude/projects/ JSONL into SQLite, exposes 10 MCP tools (store/recall/search memories, browse sessions, get summaries) plus prompts. Includes a web UI for visual exploration10152 npm96MIT
- AlicenseAqualityAmaintenanceDurable project-memory MCP: decisions, constraints, and pipelines across Claude sessions1477 PyPI1MIT