Rekindle
Rekindle is an MCP continuity engine that gives an AI assistant persistent, local memory and session-orientation before and after every session.
Store memories (
store_memory) — save preferences, lessons, context, relationship notes, or general facts with a category, importance (1–10), and optional project scope.Search memories (
search_memory) — full-text FTS5 search with importance-boosted BM25 ranking, filterable by project and category; tracks retrieval counts.Browse and manage memories — list newest-first (
list_memories), update content/category/importance (update_memory), or permanently delete by ID (delete_memory).Orient at session start (
boot_report) — reads the identity document and latest transcript, scans memory stats, finds the latest checkpoint, surfaces open loops and PreCompact captures, detects gaps, and computes a 0–100 orientation score.Close a session with structured handoff (
end_session) — records a required checkpoint plus optional decisions, open loops, constraints, preferences, warnings, relational delta, next-session focus, and a session row with summary, score, and gap count.Survive mid-session compaction — list (
list_captures) and read (read_capture) PreCompact captures in summary, structured, or raw mode to recover lost context; warns when unreviewed captures exist.Capture on demand (
capture_now) — manually snapshot the current session context before a risky operation or when the user asks.Stay local and private — everything lives in a local SQLite database with no network calls, telemetry, or API keys.
Rekindle
For Claude Code users who lose time re-explaining project context every session.
npx rekindle initYour AI forgets everything between sessions. Rekindle fixes that.

Rekindle is an MCP continuity engine that solves session orientation, not just storage. Orient at session start, capture at session end, survive mid-session compaction. All local, all SQLite, zero API keys.
v0.4.1 — --global hook setup now lands in ~/.claude/settings.json, the file Claude Code applies in every project (fixes #25); init output matches this README. Release notes
Quick Start
Requires Node.js 22 or newer.
npx rekindle initThis creates .rekindle/ in your project with a SQLite database, identity template, continuity policy, project registry, captures directory, and transcript directory. Then add the MCP server config for your client:
One command registers the server:
claude mcp add rekindle -- npx -y rekindleOr add it to ~/.claude.json by hand:
{
"mcpServers": {
"rekindle": {
"command": "npx",
"args": ["-y", "rekindle"]
}
}
}Enable PreCompact protection (captures context before mid-session compaction):
npx rekindle setup-hooksEnable session-start orientation delivery — the budgeted orientation packet arrives automatically at startup, resume, /clear, and /compact, so the model re-orients at every context boundary without being asked:
npx rekindle setup-deliveryBoth hooks are opt-in; plain init never installs either. npx rekindle init --with-hooks --with-delivery does everything in one line.
Without --global, both commands write the project-local .claude/settings.local.json, so the hooks run only for sessions started in that directory. With --global, they write the user-scope ~/.claude/settings.json, which Claude Code applies in every project on the machine; register the server at the same scope so it is present wherever the hooks fire: claude mcp add --scope user rekindle -- npx -y rekindle (plain claude mcp add is local to the current project).
Session-start delivery resolves the hook's real working directory through
.rekindle/projects.json. Exact roots match by default; nested directories
inherit only when an entry sets "include_descendants": true. An unmapped or
ambiguous workspace is reported as UNKNOWN PROJECT and never receives a
checkpoint or context record from another project. REKINDLE_PROJECT remains
an explicit override, and receipts record which resolution rule won.
.rekindle/policy.json controls transcript handling, the startup byte budget,
and mandatory versus optional packet sections. Mandatory sections are atomic:
if they do not fit, Rekindle emits a bounded failure manifest instead of a
partial anchor. Optional sections are omitted whole and recorded in the
receipt. Set "transcript_mode": "excluded" to prevent SessionStart from
reading transcript files or paths and to mark transcript coverage N/A in the
orientation score. Set "background_writes_allowed": false to make the
automatic PreCompact hook exit without creating a capture; manual capture
remains a separate, explicit action.
Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"rekindle": {
"command": "npx",
"args": ["-y", "rekindle"]
}
}
}Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"rekindle": {
"command": "npx",
"args": ["-y", "rekindle"]
}
}
}Then fill in .rekindle/identity.md and paste the boot instructions into your project's CLAUDE.md.
Session 1 stores. Session 2 remembers. Session 10 anticipates.
Related MCP server: claude-session-continuity-mcp
The Problem (43 Sessions of Data)
Over 43 sessions, we measured what an AI assistant failed to load at session start:
Metric | Value |
Sessions analyzed | 43 |
Clean boots (all context loaded) | 33% |
High-signal failures (5+ gaps) | 26% |
Total retrieval failures | 173 |
Existing memory tools (Mem0, Letta, Zep) optimize for retrieval accuracy: can the AI find what it stored? That's necessary but not sufficient. None of them address whether the AI loaded the right context for this session, or whether it can detect what it missed.
Rekindle solves session orientation: loading identity, recent context, memory health, and missing-context warnings before the assistant starts work.
See docs/gap-analysis.md for the full research dataset.
What It Does
Boot: orient at session start
boot_report runs an orientation pipeline before any work begins:
boot_report
+-- Read identity document (who am I working with?)
+-- Scan memory stats (what do I know?)
+-- Find latest checkpoint (where did we leave off?)
+-- Read last transcript (what actually happened?)
+-- Surface open loops (what needs follow-up?)
+-- Surface PreCompact captures (what survived compaction?)
+-- Detect gaps (what am I missing?)
+-- Calculate orientation score (how oriented am I?)
--> "Carrying forward: [context loaded, gaps identified, score: 80/100]"Survive the Long Middle: PreCompact capture (v0.3)
Mid-session compaction destroys reasoning chains, failed approaches, relational texture, and tone. The PreCompact hook fires automatically before compaction and saves what would otherwise be lost:
PreCompact hook fires
+-- Parse JSONL transcript (last N messages)
+-- Write raw Markdown capture (.rekindle/captures/)
+-- Write structured JSON snapshot (decisions, open loops, files)
+-- Update manifest for cheap listing
--> boot_report surfaces captures on next session start
--> end_session warns if captures exist but weren't reviewedThree read modes control token cost:
summary — one paragraph, cheap
structured — decisions/loops/warnings, moderate
raw — full transcript excerpt, expensive (only when needed)
Capture: close the loop at session end
end_session stores structured continuity records — not just a summary:
Field | What it captures |
| Where we left off (required) |
| What was decided and why |
| Unresolved tasks or questions |
| Boundaries that must not be violated |
| What changed in the working relationship |
| Where to resume next session |
| New user preferences learned |
| Things next session should watch for |
All records stored with type, source, and session_id metadata. Next boot_report loads the checkpoint automatically.
Between sessions: search and manage
Tool | Description |
| Store with content, category, importance (1-10), and project scope |
| Full-text search with BM25 ranking, boosted by importance |
| Browse memories, newest first. Filter by category or project |
| Delete by ID |
| Update content, category, or importance |
| List PreCompact captures (optionally filter by session) |
| Read a capture in summary, structured, or raw mode |
| Manually capture current session context on demand |
Categories: preference lesson context relationship general
Why not just CLAUDE.md?
A static file is passive. Your AI reads it, but it can't search it, rank it, track what's been retrieved, or tell you what's missing. Rekindle adds:
Search — full-text with importance-weighted ranking
Structure — category and project scoping across memories
Orientation — proactive context loading at boot, not just on-demand retrieval
Gap detection — flags missing identity, empty categories, stale data
Scoring — transparent checklist so you know how oriented the AI is
Session capture — structured close with checkpoints, decisions, and open loops
Compaction survival — PreCompact captures preserve what summaries flatten
Release Highlights
v0.4.1
--globalhooks fire everywhere —setup-hooks --global,setup-delivery --globalandinit --global --with-*now write~/.claude/settings.json(user scope) instead of~/.claude/settings.local.json, which Claude Code reads only for sessions started in the home directory (#25). Project-local setup is unchanged. Each command prints the file it wroteUnresolved-workspace warning names the fix — when the session-start packet cannot map the workspace to a project it now says that no checkpoint was loaded and points at the two remedies: add the workspace to the registry it read (
.rekindle/projects.jsonfor a project store,~/.rekindle/projects.jsonfor a--globalstore), or setREKINDLE_PROJECT. The warning does not expose the absolute registry pathInit output matches this README —
initleads withclaude mcp add rekindle -- npx -y rekindle(claude mcp add --scope user ...under--global, so the server is registered wherever the global hooks fire), lists both opt-in hooks (with--globalwhen used), and prints~/.rekindle/...paths under--global
v0.4.0
Node.js 22 or newer required — Node 20 reached end of life in April 2026 and is no longer supported; CI runs on Node 22, 24 and 26
Policy-aware session start —
.rekindle/policy.jsoncontrols transcript handling (transcript_mode:captured,tail-read-only, orexcluded), the startup byte budget, mandatory versus optional packet sections, and whether background hooks may write (background_writes_allowed)Project-safe delivery —
.rekindle/projects.jsonmaps workspaces to projects; an unmapped or ambiguous workspace is reported asUNKNOWN PROJECTand never receives another project's checkpoint;REKINDLE_PROJECTis an explicit overrideTranscript filename withheld in tail mode — in
tail-read-onlymode the packet shows the transcript tail but not the file's nameAtomic session writes — a session row and its audit row commit together or not at all
Clean production audit —
npm audit --omit=devfound zero vulnerabilities (production dependencies)Smaller package — the npm tarball drops from about 1.9 MB to about 110 KB; evidence and design documents stay on GitHub
v0.3.3
Version-consistent protocol metadata — the MCP initialize response derives its version from the shipped package metadata, preventing release-version drift
Package-page accuracy — the README shipped to npm identifies the current release before the tag and package are created
Expanded automated tests, plus a packed-artifact check that compares MCP metadata to the installed package version
v0.3.2
One-command delivery install —
npx rekindle setup-delivery(orinit --with-delivery) configures the SessionStart hook opt-in: idempotent, preserves other tools' hooks, refuses corrupted settings files147 automated tests
v0.3.1 — "Five Measured Gates"
Session-start delivery —
rekindle session-startemits a budgeted orientation packet via the SessionStart hook at startup, resume,/clear, and/compactBudgeted packets, truthful receipts — packets cap at 8,000 valid UTF-8 bytes with an in-packet truncation marker; receipts attest emission only and never claim model visibility
Desktop-safe storage — storage root never derives from the spawn point (Claude Desktop spawns MCP servers at
/); explicit resolution order, fail-loudDual-channel guidance — workflow guidance rides both tool descriptions and MCP instructions, drift structurally impossible
Cursor adapter —
session-start --client cursorwith whitelist stdin parsing; email and workspace paths never reach receiptsMeasured, not assumed — every claim above is backed by a published measurement (evidence, spike results)
v0.3.0 — "Survive the Long Middle" added the PreCompact capture system, open loops, and review tracking — v0.3.0 release notes
CLI Commands
Command | Description |
| Set up |
| Set up in home directory; hooks go to |
| Init + configure PreCompact capture hook |
| Init + configure SessionStart delivery hook |
| Configure PreCompact capture hook (standalone) |
| Configure SessionStart delivery hook (standalone) |
| Emit budgeted orientation packet (SessionStart hook) |
| Same, in Cursor's hook response shape |
| Capture context before compaction (hook) |
| Manually capture current session context |
| Start MCP server (used by Claude Code) |
Install from Source
git clone https://github.com/Skitchy/rekindle.git
cd rekindle
npm install
npm run build
node dist/init/cli.js initThe setup-hooks command writes this to .claude/settings.local.json (or ~/.claude/settings.json with --global):
{
"hooks": {
"PreCompact": [
{
"matcher": "auto",
"hooks": [
{
"type": "command",
"command": "npx rekindle precompact-capture",
"timeout": 60
}
]
},
{
"matcher": "manual",
"hooks": [
{
"type": "command",
"command": "npx rekindle precompact-capture",
"timeout": 60
}
]
}
]
}
}The hook receives session context on stdin (session_id, transcript_path, cwd, hook_event_name) and writes captures to .rekindle/captures/.
Variable | Default | Description |
|
| Max messages to capture |
|
| Max characters to capture |
| Resolved (see below) | Base directory for |
Storage root resolution. All Rekindle entry points (server, PreCompact hook) resolve the directory holding .rekindle/ through one rule, in order:
REKINDLE_BASE_DIR, if set — explicit always winsDerived from
REKINDLE_DB_PATH, when it points at a canonical<base>/.rekindle/db/layoutAn existing
.rekindle/in the current working directory (never when cwd is the filesystem root)An existing
.rekindle/in your home directoryOtherwise: your home directory — never the spawn point
Rules 3 and 5 exist because some hosts (e.g. Claude Desktop) spawn MCP servers at cwd=/; a spawn point is not a storage location. If storage cannot be created, the server exits with a message naming the fix instead of a stack trace.
All data is local. Nothing is sent to external servers.
No network calls. The MCP server communicates via stdio. No HTTP, no telemetry, no analytics.
Transcripts contain conversation text. Do not enable transcript capture if your sessions contain secrets or credentials.
Hook installation is opt-in. Both the capture hook (
setup-hooks) and the delivery hook (setup-delivery) must be requested explicitly, by command or by flag. Plaininitnever installs either.SQLite database is a regular file. Not encrypted. Use OS-level disk encryption if needed.
.rekindle/is gitignored. The init command handles this automatically.boot_report reads local files. Paths are not sandboxed. Only use with MCP clients and prompts you trust.
Compatibility
"Full delivery" means the orientation packet arrives automatically at session boundaries and the model demonstrably sees it — measured with canary probes at both the receipt layer and the model layer, not assumed. Details and evidence: compatibility spike results.
Client surface | MCP tools | Session-start delivery |
Claude Code terminal (macOS) | Tested | Full delivery, measured (startup, resume, |
Claude Code terminal (Windows) | Tested | Full delivery, measured |
Claude Code terminal (Linux/WSL2) | Tested | Hook channel identical; delivery measurement pending |
Claude Desktop, Code surface | Tested | Full delivery, measured ( |
Claude Desktop, chat surface | Tested | Tool-mode only: hooks unsupported by the client; guidance reachable via the model's tool-search |
Cursor | Tested | Via |
Any MCP stdio client | Compatible | Depends on the client's hook support |
Claude Code: session-start orientation (opt-in)
npx rekindle setup-deliverywrites this to .claude/settings.local.json (or ~/.claude/settings.json with --global):
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume|clear|compact",
"hooks": [
{ "type": "command", "command": "npx rekindle session-start", "timeout": 60 }
]
}
]
}
}The packet is capped at 8,000 valid UTF-8 bytes — measured: when hook output exceeds the host's limit, the model sees only the leading portion, with no error surfaced. If sections are dropped to fit the budget, an in-packet marker says so, and the receipt in .rekindle/receipts/session-start.jsonl records exactly what was emitted without ever claiming the model saw it.
Cursor: session-start orientation (opt-in)
Cursor's hook system can deliver the budgeted orientation packet at session
start, measured working in the v0.3.1 compatibility spike. Setup is manual
and opt-in — Rekindle never installs hooks without being asked. Add to
.cursor/hooks.json in your project:
{
"version": 1,
"hooks": {
"sessionStart": [ { "command": "rekindle session-start --client cursor" } ]
}
}Privacy: Cursor's hook payload includes your account email and workspace
paths. The adapter treats that payload as personal by default: it extracts
only the session ID and workspace root (used in-process for storage
resolution), and neither the raw payload, the email, nor any path is ever
written to receipts or any other artifact. Background agents are bypassed by
default (truthfully receipted); opt in with REKINDLE_ORIENT_BACKGROUND_AGENTS=1.
rekindle/
src/
index.ts MCP server entry point
server.ts Server setup, tool registration (10 tools)
storage/
sqlite.ts SQLite + FTS5, schema migration, sessions
orientation/
types.ts OrientationResult, Gap, ScoreItem
GapDetector.ts Structural gap detection (8 codes)
Scorer.ts Orientation scoring (6 criteria, 100pts)
OrientationService.ts Orchestrator
OrientationRenderer.ts Markdown + JSON output
captures/
types.ts CaptureEntry, StructuredSnapshot, HookInput
CaptureManager.ts Parse, capture, list, read, review tracking
discover-transcript.ts Auto-discover session transcripts
precompact-capture.ts CLI hook entry point
capture-now.ts Manual capture CLI
tools/
boot-report.ts Orientation + open loops + capture awareness
end-session.ts Structured session close + capture warning
list-captures.ts List PreCompact captures
read-capture.ts Read captures in 3 modes
capture-now.ts Model-triggered manual capture
store.ts search.ts list.ts delete.ts update.ts
delivery/
budget.ts UTF-8 packet construction and atomic mandatory sections
receipts.ts Emission receipts (never claim model visibility)
session-start.ts SessionStart hook adapter
cursor.ts Cursor hook adapter (privacy-whitelisted stdin)
guidance.ts Canonical workflow guidance, both channels
init/
cli.ts scaffold.ts setup-hooks.ts setup-delivery.ts templates/Storage: SQLite + FTS5 via better-sqlite3. BM25 ranking boosted by importance. Typed records with type, source, session_id.
Transport: stdio (standard MCP). Works with Claude Code out of the box.
Tests
npm testThe suite runs in CI on Node 22, 24 and 26 and covers: storage CRUD + FTS5 ranking, orientation domain (gap detection, policy-aware scoring, project resolution, service, rendering), capture manager (parsing, limits, review tracking, formatting), delivery (atomic packet budget, receipts, guidance channels, Cursor privacy sentinels), hook setup for both hooks (schema, idempotency, corruption refusal), and MCP integration (all 10 tools plus package-derived server metadata).
Roadmap
Next: "It thinks in networks" — Spreading activation, semantic search via embeddings, gap analysis tooling, eval harness.
License
MIT
Available Tools
10 toolsboot_reportA
Generate a session orientation report. Read-only — does not modify any stored data. Reads the identity document from disk, scans the memory database for statistics and the latest checkpoint, finds the most recent transcript file, detects structural gaps (missing identity, stale memories, no checkpoint, etc.), and calculates a 0-100 orientation score across 6 criteria. Also surfaces open loops from prior sessions and any PreCompact captures that preserve context from compacted sessions. Workflow: call boot_report first thing every session, before any substantive work. Orientation scores are structural checks, not guarantees that every relevant context item was loaded.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Active project name for scoped orientation. When provided, the orientation score includes a project-specific criterion and memory statistics are filtered to this project. | |
| identity_path | Yes | Absolute or relative path to the identity document (e.g., '.rekindle/identity.md'). This file describes who the user is and how to work with them. If the file does not exist, a critical gap is reported. | |
| transcript_dir | Yes | Absolute or relative path to the transcripts directory (e.g., '.rekindle/transcripts'). The most recent .md file in this directory is read and included in the report. If the directory is empty or missing, an info-level gap is reported. |
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 clearly states it is read-only and does not modify stored data, and it discloses that orientation scores are structural checks, not guarantees of loaded context. This adds valuable context beyond the basic function, though it doesn't detail the output format or potential edge-case errors.
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 efficiently structured: the first sentence states the core purpose, the second sentence explains the data sources and operations, and the third provides workflow and caveats. Every sentence contributes meaningful information without redundancy.
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?
Given the tool's complexity (multiple inputs, calculations, and output), the description covers inputs, actions, and output semantics (orientation score, open loops, captures). No output schema exists, so the description does well to mention what the report includes. It lacks explicit return format details, but the description is strong overall.
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 100%, so all three parameters are already well-documented. The description adds no additional parameter-specific details beyond what the schema provides, but it does reiterate the purpose of identity and transcript paths. This matches the baseline for high coverage.
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 clearly states the tool generates a session orientation report, with a specific verb (generate) and resource (session orientation report). It distinguishes itself from sibling tools by detailing its unique function of reading identity, scanning memory, and calculating an orientation score, which none of the siblings perform.
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?
It explicitly provides a workflow directive: 'call boot_report first thing every session, before any substantive work.' This gives clear contextual guidance on when to use it. However, it does not explicitly mention alternatives or when not to use it, but none are needed given its unique role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
capture_nowA
Manually capture current session context to .rekindle/captures/. Use this when you want to preserve the current conversation state — before a complex operation, when context feels at risk, or when the user requests it. Produces the same artifact as the automatic PreCompact hook but triggered on demand. session_id and transcript_path are optional — if omitted, the most recent transcript is discovered automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Why this capture is being made (stored in the structured snapshot). | |
| session_id | No | Current session ID. If omitted, discovered from the most recent transcript file. | |
| transcript_path | No | Path to the current session's JSONL transcript file. If omitted, the most recent transcript is discovered automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses file creation location, artifact equivalence with PreCompact, and optional parameters with auto-discovery. No annotations provided, so description carries full burden. Could mention idempotency or error handling but still provides solid behavioral context.
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?
Two sentences, no filler. First sentence clearly states action and output. Second provides usage and parameter notes. Perfectly front-loaded and efficient.
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?
Describes artifact and auto-discovery for parameters, but does not explicitly state return value or success indication. With no output schema, the description could mention what the tool returns (e.g., path to capture). Still, very informative overall.
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?
Input schema has 100% description coverage. Description adds value by noting that session_id and transcript_path can be omitted and auto-discovered, going beyond schema. Reason parameter is not elaborated in description but schema covers it. Extra context earns above baseline.
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?
Description states specific verb ('capture') and resource ('current session context') and target location ('.rekindle/captures/'). Clearly distinguishes from siblings like list_captures and read_capture, as this is the creation tool.
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?
Explicitly states when to use: 'before a complex operation, when context feels at risk, or when the user requests it.' Also contrasts with automatic PreCompact hook. Lacks explicit 'when not to use' but positive guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoryA
Permanently delete a single memory from the local SQLite database by its ID. This action is irreversible — the row and its full-text search index entry are removed immediately. Use when a memory is outdated, incorrect, or no longer relevant. Returns {success: true} if the memory was found and deleted, or {success: false, message: 'Memory not found'} if the ID does not exist. Does not affect other memories or session records.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The UUID of the memory to delete. Obtain from store_memory, search_memory, or list_memories results. | |
| provenance | No | Write attribution. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does most of it well: it declares irreversibility, that the FTS index entry is removed immediately, the blast radius (other memories and session records unaffected), and both success/failure return shapes. The one gap is the conditional write-provenance requirement, which is a real behavioral precondition disclosed only in the schema, not here.
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?
Front-loaded with the action and its irreversibility in the first two sentences, then usage, then return contract. Four sentences with essentially no padding; the 'Does not affect other memories or session records' line is the only one bordering on redundant given the singular-object framing.
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 destructive single-record deletion with no output schema, the description covers effect, reversibility, scope, trigger condition, and both return values — enough for an agent to call it safely. The only unaddressed element, provenance gating, is fully documented in the required schema field.
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 100%, including where to obtain the UUID and the full provenance contract, so the schema already does the heavy lifting. The description only adds the framing 'by its ID' and does not mention provenance at all, which is acceptable at the baseline but adds no surplus meaning.
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?
States a specific verb and resource ('Permanently delete a single memory') plus the mechanism ('from the local SQLite database by its ID'), which cleanly distinguishes it from update_memory, store_memory, and search_memory. No ambiguity about what the tool does.
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?
Gives a clear trigger condition ('Use when a memory is outdated, incorrect, or no longer relevant') and a negative scope ('Does not affect other memories or session records'). It does not name an alternative for the common case of a memory being wrong rather than obsolete — e.g., pointing to update_memory when correction is preferable to deletion — so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
end_sessionA
Capture a structured session handoff. Writes multiple records to the local SQLite database: one checkpoint (required), plus optional decisions, open loops, preferences, constraints, warnings, relational delta, and next session focus. Each record is stored with a typed 'type' column (not content prefixes) and linked to a session record via session_id. Also creates a session row in the sessions table with a summary, orientation score, and gap count. The checkpoint is retrievable by boot_report on the next session start. All records are searchable via search_memory and list_memories. Workflow: call end_session at the end of every substantive session so the next session can pick up the thread.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Project name to scope all records to. Passed through to each stored memory's project field. | |
| warnings | No | Hazards or risks the next session should be aware of. Each entry is stored as type='warning' with importance 8. | |
| decisions | No | Key decisions made this session and their rationale. Each entry is stored as a separate memory with type='decision' and importance 7. | |
| checkpoint | Yes | Where we left off — the single most important handoff artifact. Stored as type='checkpoint' with importance 8. This is what boot_report loads as the latest checkpoint on the next session start. | |
| open_loops | No | Unresolved questions, pending tasks, or threads that need follow-up. Each entry is stored as type='open_loop' with importance 7. | |
| provenance | No | Write attribution applied to every record. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization. | |
| session_id | No | Current session ID. Used to check for unreviewed PreCompact captures. If captures exist for this session that were not read via read_capture, a warning is included in the response. | |
| constraints | No | Boundaries that must not be violated — violating these causes trust damage. Each entry is stored as type='constraint' with importance 9 (highest default). | |
| preferences | No | New user preferences or working style observations learned this session. Each entry is stored as type='preference' with importance 6. | |
| transcript_path | No | File path to the session transcript, stored on the session record for reference by boot_report. | |
| relational_delta | No | What changed in the working relationship this session — trust shifts, tension, repair, tone changes. Stored as type='relational_delta' with importance 8. | |
| next_session_focus | No | Where to resume next session, which may differ from where we stopped. Stored as type='next_session_focus' with importance 7. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses that multiple rows are written across two tables, that each entry becomes a typed record with a default importance (constraints=9, warnings/relational_delta=8, decisions/open_loops/next_session_focus=7, preferences=6), and that session_id triggers a warning about unreviewed PreCompact captures. It does not discuss idempotency, duplicate handling on repeat calls, or error behavior on partial writes, which keeps it from a 5.
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?
Front-loaded with the purpose, then behavior, then workflow — a sensible ordering with no filler sentences. It is on the long side for a description, and the type/importance enumeration partly duplicates schema descriptions, but each sentence still carries information an agent needs.
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 12-parameter mutation tool with a nested object, no annotations, and no output schema, the description covers write targets, linkage, retrieval paths, and the one response caveat (unreviewed capture warning). What it omits is the actual response shape and failure/duplicate semantics, which matters somewhat since no output schema exists.
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 coverage is 100%, so the schema already documents all 12 parameters including the nested provenance object. The description mostly restates that shape (checkpoint required, the rest optional) and adds only marginal meaning beyond it, such as the fact that checkpoint is what boot_report loads next session. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb and resource ('Capture a structured session handoff') and then enumerates exactly what gets written: one required checkpoint plus optional typed records and a session row. The typed-column / session_id linkage detail separates it cleanly from store_memory, which writes individual memories.
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?
Gives an explicit workflow directive — 'call end_session at the end of every substantive session' — which is clear positive guidance. It also names the downstream consumers (boot_report, search_memory, list_memories). It never says when NOT to use it or explicitly contrasts with store_memory for single-record writes, so the sibling routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_capturesA
List PreCompact captures for the current or recent sessions. PreCompact captures preserve context that would otherwise be lost during mid-session compaction. Workflow: if boot_report lists PreCompact captures, call list_captures then read_capture to recover pre-compaction context before relying on the checkpoint. Before calling end_session, check for unreviewed captures.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | No | Filter to a specific session. If omitted, returns all captures sorted by recency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It reveals the behavioral context of PreCompact captures and the recovery workflow, but doesn't detail return format or side effects, which are minimal for a list operation. Adds value beyond a simple 'list captures'.
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?
Three sentences, each earning its place: purpose, context, and workflow. Front-loaded with the primary action, concise with no 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 simple listing tool with one optional parameter and no output schema, the description provides sufficient context for selection and invocation. It also integrates with sibling tools (boot_report, read_capture, end_session), making the workflow complete.
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?
The schema covers 100% of the parameters, so baseline is 3. The description does not add any extra semantic detail about session_id; it is fully explained in 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 clearly states it lists PreCompact captures, with a specific verb and resource. It distinguishes from siblings like read_capture by focusing on listing, and adds context about preserving pre-compaction context.
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?
Explicit workflow is given: if boot_report lists PreCompact captures, call list_captures then read_capture to recover context before relying on the checkpoint; also check for unreviewed captures before end_session. This clearly indicates when to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_memoriesA
List stored memories from the local SQLite database, ordered newest first. Unlike search_memory, this does not require a query — it returns all memories matching the optional filters. Read-only; does not modify any data. Use to browse what has been stored, audit memory contents, or check memory counts per category or project. Returns an array of memories with id, content, category, importance, project, and created_at.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of memories to return. Default 50. Newest memories are returned first regardless of limit. | |
| project | No | Filter to a specific project. Omit to list memories across all projects. | |
| category | No | Filter to a single category. Omit to list memories across all categories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses read-only nature ('Read-only; does not modify any data'), ordering (newest first), and return fields. It does not cover potential pagination beyond the limit parameter or error handling, but overall provides solid transparency.
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 four sentences, front-loaded with the main action, and each sentence adds value. No unnecessary words or repetition. Highly efficient.
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?
Given the tool's low complexity (3 optional parameters, no output schema, no annotations), the description covers purpose, usage guidance, behavior, return format, and ordering. It is complete enough for an agent to understand how and when to use the tool.
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 coverage is 100%, so the description need not add much. It reinforces the ordering ('Newest memories are returned first regardless of limit') and lists return fields, which is helpful but not essential. The description does not significantly deepen understanding of the parameters beyond what the schema already provides.
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 clearly states the verb 'list', the resource 'memories', and the key distinction from sibling 'search_memory' by noting it does not require a query. It specifies the ordering (newest first) and return fields, making the purpose unambiguous.
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 explicitly states when to use: 'to browse what has been stored, audit memory contents, or check memory counts per category or project'. It also contrasts with 'search_memory' (requires a query). However, it does not explicitly state when not to use or provide alternative tools beyond the mention of search_memory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_captureA
Read a PreCompact capture by ID. Use this to recover context that was lost during mid-session compaction. Three modes control token cost: 'summary' (one paragraph, cheap), 'structured' (decisions/loops/warnings, moderate), 'raw' (full transcript excerpt, expensive — only when summary or structured is insufficient). Workflow: read recovered captures before relying on the latest checkpoint; start with the lightest mode that answers your question.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Capture ID from list_captures (e.g., 'precompact-abc123-001') | |
| mode | No | Reading mode. 'summary': one-paragraph overview. 'structured': decisions, open loops, warnings, context shifts. 'raw': full transcript excerpt. | structured |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It details three modes with token cost implications ('summary' cheap, 'structured' moderate, 'raw' expensive) and advises using raw only when lighter modes are insufficient. This goes beyond a simple read, giving the agent actionable behavioral guidance without contradicting any structured metadata.
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 about five sentences and front-loaded with the core purpose, then provides mode details and a workflow. It is efficient and avoids redundancy, though it lacks bullet-point formatting that could improve scannability. No wasted words.
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?
The tool has a moderate complexity (2 params, 3 modes) and no output schema. The description gives enough context for the agent to understand what to expect from each mode and how to use the tool effectively, covering purpose, mode selection, cost, and workflow. It does not describe error cases or exact return structures, but these are not critical for basic invocation.
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 100%, so baseline is 3. The description adds meaningful extra semantics, especially for the mode parameter: it expands on the schema by explaining 'summary' as one paragraph, 'structured' as decisions/loops/warnings, and 'raw' as full transcript excerpt, plus cost guidance. This enriches the schema definitions.
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 clearly states the verb 'Read' and the resource 'PreCompact capture by ID', and specifically ties it to recovering context lost during mid-session compaction. This distinguishes it from sibling tools like list_captures or capture_now by focusing on reading a specific capture.
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 says when to use the tool ('recover context lost during mid-session compaction') and provides a workflow: 'read recovered captures before relying on the latest checkpoint; start with the lightest mode that answers your question.' This gives clear context and usage strategy, though it does not explicitly mention alternatives to other sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_memoryA
Search stored memories using SQLite full-text search (FTS5). Returns results ranked by relevance with higher-importance memories boosted. Each search increments the retrieval_count on matched memories, tracking which memories are accessed most. Use at session start to load relevant context, or mid-session to recall specific information. Returns an array of matching memories with id, content, category, importance, project, created_at, and retrieval_count. Returns an empty array if no matches are found.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return. Default 10. Results are ranked by relevance and importance before truncation. | |
| query | Yes | Full-text search query. Supports keywords, phrases, and SQLite FTS5 syntax (e.g., 'database AND migration', '"exact phrase"'). Broader queries return more results. | |
| project | No | Filter results to a specific project. Omit to search across all projects. | |
| category | No | Filter results to a single category. Omit to search across all categories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behaviors: uses FTS5, results ranked by relevance and importance, increments retrieval_count on matched memories, returns specific fields, and returns empty array on no match. This is comprehensive given no annotations.
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?
Concise and well-structured (~90 words), each sentence serves a purpose: purpose, ranking info, side effect, usage, return structure, and empty case. No redundancy.
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?
Covers all essential aspects: search mechanism, ranking criteria, side effect (increment retrieval_count), return fields, and empty result handling. No output schema but description adequately describes return structure.
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 already has descriptions for all parameters (100% coverage). The description adds value by explaining query semantics ('Broader queries return more results') and limit behavior ('Results are ranked by relevance and importance before truncation').
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 clearly states the tool performs a full-text search on stored memories using SQLite FTS5, distinguishing it from sibling tools like list_memories (which likely lists all memories) and other CRUD tools.
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?
Provides explicit usage scenarios: 'Use at session start to load relevant context, or mid-session to recall specific information.' While it does not explicitly exclude alternatives, the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_memoryA
Store a new memory in the local SQLite database. Creates a persistent row with an auto-generated UUID, timestamp, and the provided content. Use for preferences, lessons learned, project context, relationship notes, or general information worth remembering across sessions. Memories persist across sessions and are surfaced by boot_report, search_memory, and list_memories. Returns the generated ID on success. Does not deduplicate — calling twice with the same content creates two separate memories.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The memory content to store. Plain text, no length limit. Should be self-contained — future retrieval may return this memory without surrounding context. | |
| project | No | Project name to scope this memory to. When set, boot_report can filter orientation to this project. Omit for cross-project memories. | |
| category | No | Memory category. Determines how the memory is weighted during orientation: 'preference' and 'relationship' contribute to the orientation score. 'context' is used for checkpoints and session handoffs. 'lesson' is used for constraints and warnings. 'general' is the default catch-all. | general |
| importance | No | Importance score from 1 (low) to 10 (critical). Higher-importance memories are ranked first in search results. Constraints default to 9, checkpoints to 8, general notes to 5. | |
| provenance | No | Write attribution. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden and does well: it discloses persistence across sessions, the auto-generated ID returned on success, and the non-deduplicating write semantics that would otherwise surprise a caller. It stops short of failure behavior or what happens to the memory lifecycle after storage.
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?
Front-loaded with the action and what is created, then use cases, then the return value, then the dedup caveat. Dense and mostly waste-free, though the use-case list and the sibling enumeration add a little length.
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 5-parameter write tool with a nested provenance object, no annotations and no output schema, the description covers the return value (generated ID), persistence, and the non-dedup gotcha. The conditional provenance requirement is left entirely to the schema, which is a minor residual gap.
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 100%, so parameters are already fully documented, including the provenance object and the importance/category semantics. The description only references 'the provided content' and adds no additional guidance on project scoping or category selection beyond what the schema says, which is the correct baseline 3.
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?
States a specific verb+resource ('Store a new memory in the local SQLite database') and enumerates exactly what is created (UUID, timestamp, content). It also situates the tool relative to siblings by naming boot_report, search_memory and list_memories as the surfacing paths, so an agent can place it in the workflow without opening other schemas.
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?
Gives explicit usage contexts ('preferences, lessons learned, project context, relationship notes, or general information worth remembering across sessions'). The dedup caveat implicitly signals that updating an existing memory is a different operation, but it never names update_memory or states when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_memoryA
Update an existing memory in the local SQLite database. Modifies only the fields you provide — omitted fields are left unchanged. The updated_at timestamp is set automatically. If content is changed, the full-text search index is rebuilt for this memory. Returns the full updated memory object on success, or {success: false, message: 'Memory not found'} if the ID does not exist. Use to correct inaccurate memories, adjust importance, or reclassify a memory's category without deleting and re-creating it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The UUID of the memory to update. Obtain from store_memory, search_memory, or list_memories results. | |
| content | No | Replacement content for the memory. Omit to keep the existing content unchanged. | |
| category | No | New category for the memory. Omit to keep the existing category unchanged. | |
| importance | No | New importance score from 1 (low) to 10 (critical). Omit to keep the existing score unchanged. | |
| provenance | No | Write attribution. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral load and largely delivers: partial-update semantics, automatic updated_at, FTS index rebuild on content change, and both success and not-found return shapes. It omits the conditional write-provenance requirement and any authorization/permission expectations, which the schema alone covers.
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 core patch semantics and the use-case sentence are front-loaded, and each sentence carries information (state model, auto-timestamp, index rebuild, return contract). It is on the long side — five sentences for a mutation tool — but nothing is filler.
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?
A mutation tool with no annotations and no output schema, so the description must cover behavior and returns — and it does, including the not-found error object. The one gap is the nested provenance object's conditional requirement, which is pushed entirely to the schema and unmentioned in prose.
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 100%, so the baseline is 3. The description adds only the semantic that omitted fields are preserved and that changing content triggers a reindex; it does not clarify the importance scale, category enum choices, or provenance nesting beyond what the schema already documents.
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?
States a specific verb and resource (update an existing memory) plus the patch semantics that define it, and explicitly contrasts with delete-and-recreate. An agent can distinguish it from store_memory and delete_memory without reading either schema.
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?
Gives concrete use cases — correct inaccurate memories, adjust importance, reclassify category — and frames it as the alternative to deleting and re-creating. It does not explicitly say when to prefer store_memory instead (i.e., for new memories), so the routing guidance is clear but not exhaustive.
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.
4 tool updates
v0.4.1- Changed
delete_memory1 field changed- added
Input schema / properties / provenanceAdded value: +{ + "description": "Write attribution. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization.", + "properties": { + "author_identity": { + "description": "Claimed writer identity; attribution, not authentication.", + "minLength": 1, + "type": "string" + }, + "authorization_reference": { + "description": "Caller-supplied authority reference. Stored as unverified and never treated as authorization.", + "minLength": 1, + "type": "string" + }, + "client": { + "description": "Client performing the write, for attribution only.", + "minLength": 1, + "type": "string" + }, + "request_id": { + "description": "Unique caller request identifier.", + "minLength": 1, + "type": "string" + }, + "thread_id": { + "description": "Calling thread or session identifier.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "client", + "thread_id", + "request_id", + "author_identity", + "authorization_reference" + ], + "type": "object" +}
- Changed
end_session1 field changed- added
Input schema / properties / provenanceAdded value: +{ + "description": "Write attribution applied to every record. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization.", + "properties": { + "author_identity": { + "description": "Claimed writer identity; attribution, not authentication.", + "minLength": 1, + "type": "string" + }, + "authorization_reference": { + "description": "Caller-supplied authority reference. Stored as unverified and never treated as authorization.", + "minLength": 1, + "type": "string" + }, + "client": { + "description": "Client performing the write, for attribution only.", + "minLength": 1, + "type": "string" + }, + "request_id": { + "description": "Unique caller request identifier.", + "minLength": 1, + "type": "string" + }, + "thread_id": { + "description": "Calling thread or session identifier.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "client", + "thread_id", + "request_id", + "author_identity", + "authorization_reference" + ], + "type": "object" +}
- Changed
store_memory1 field changed- added
Input schema / properties / provenanceAdded value: +{ + "description": "Write attribution. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization.", + "properties": { + "author_identity": { + "description": "Claimed writer identity; attribution, not authentication.", + "minLength": 1, + "type": "string" + }, + "authorization_reference": { + "description": "Caller-supplied authority reference. Stored as unverified and never treated as authorization.", + "minLength": 1, + "type": "string" + }, + "client": { + "description": "Client performing the write, for attribution only.", + "minLength": 1, + "type": "string" + }, + "request_id": { + "description": "Unique caller request identifier.", + "minLength": 1, + "type": "string" + }, + "thread_id": { + "description": "Calling thread or session identifier.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "client", + "thread_id", + "request_id", + "author_identity", + "authorization_reference" + ], + "type": "object" +}
- Changed
update_memory1 field changed- added
Input schema / properties / provenanceAdded value: +{ + "description": "Write attribution. Required when REKINDLE_REQUIRE_WRITE_PROVENANCE=1; never proof of authorization.", + "properties": { + "author_identity": { + "description": "Claimed writer identity; attribution, not authentication.", + "minLength": 1, + "type": "string" + }, + "authorization_reference": { + "description": "Caller-supplied authority reference. Stored as unverified and never treated as authorization.", + "minLength": 1, + "type": "string" + }, + "client": { + "description": "Client performing the write, for attribution only.", + "minLength": 1, + "type": "string" + }, + "request_id": { + "description": "Unique caller request identifier.", + "minLength": 1, + "type": "string" + }, + "thread_id": { + "description": "Calling thread or session identifier.", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "client", + "thread_id", + "request_id", + "author_identity", + "authorization_reference" + ], + "type": "object" +}
10 tool updates
v0.3.0- Changed
boot_report3 fields changed- changed
Input schema / properties / identity_path / descriptionPrevious value: -"Path to identity.md (e.g., .rekindle/identity.md)"New value: +"Absolute or relative path to the identity document (e.g., '.rekindle/identity.md'). This file describes who the user is and how to work with them. If the file does not exist, a critical gap is reported." - changed
Input schema / properties / project / descriptionPrevious value: -"Active project name for scoped orientation"New value: +"Active project name for scoped orientation. When provided, the orientation score includes a project-specific criterion and memory statistics are filtered to this project." - changed
Input schema / properties / transcript_dir / descriptionPrevious value: -"Path to transcripts directory (e.g., .rekindle/transcripts)"New value: +"Absolute or relative path to the transcripts directory (e.g., '.rekindle/transcripts'). The most recent .md file in this directory is read and included in the report. If the directory is empty or missing, an info-level gap is reported."
- Added
capture_now - Changed
delete_memory1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"The memory ID to delete"New value: +"The UUID of the memory to delete. Obtain from store_memory, search_memory, or list_memories results."
- Changed
end_session11 fields changed- changed
Input schema / properties / checkpoint / descriptionPrevious value: -"Where we left off — the single most important handoff artifact"New value: +"Where we left off — the single most important handoff artifact. Stored as type='checkpoint' with importance 8. This is what boot_report loads as the latest checkpoint on the next session start." - changed
Input schema / properties / constraints / descriptionPrevious value: -"Boundaries that must not be violated — violating these causes trust damage"New value: +"Boundaries that must not be violated — violating these causes trust damage. Each entry is stored as type='constraint' with importance 9 (highest default)." - changed
Input schema / properties / decisions / descriptionPrevious value: -"What was decided and why"New value: +"Key decisions made this session and their rationale. Each entry is stored as a separate memory with type='decision' and importance 7." - changed
Input schema / properties / next_session_focus / descriptionPrevious value: -"Where to resume next session (vs where we stopped)"New value: +"Where to resume next session, which may differ from where we stopped. Stored as type='next_session_focus' with importance 7." - changed
Input schema / properties / open_loops / descriptionPrevious value: -"Unresolved questions or tasks"New value: +"Unresolved questions, pending tasks, or threads that need follow-up. Each entry is stored as type='open_loop' with importance 7." - changed
Input schema / properties / preferences / descriptionPrevious value: -"New user preferences learned this session"New value: +"New user preferences or working style observations learned this session. Each entry is stored as type='preference' with importance 6." - changed
Input schema / properties / project / descriptionPrevious value: -"Project scope"New value: +"Project name to scope all records to. Passed through to each stored memory's project field." - changed
Input schema / properties / relational_delta / descriptionPrevious value: -"What changed in the working relationship this session — trust changes, tension, repair, tone shifts"New value: +"What changed in the working relationship this session — trust shifts, tension, repair, tone changes. Stored as type='relational_delta' with importance 8." - added
Input schema / properties / session_idAdded value: +{ + "description": "Current session ID. Used to check for unreviewed PreCompact captures. If captures exist for this session that were not read via read_capture, a warning is included in the response.", + "type": "string" +} - changed
Input schema / properties / transcript_path / descriptionPrevious value: -"Path to session transcript file"New value: +"File path to the session transcript, stored on the session record for reference by boot_report." - changed
Input schema / properties / warnings / descriptionPrevious value: -"Things the next session should be careful about"New value: +"Hazards or risks the next session should be aware of. Each entry is stored as type='warning' with importance 8."
- Added
list_captures - Changed
list_memories3 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter by category"New value: +"Filter to a single category. Omit to list memories across all categories." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum results to return"New value: +"Maximum number of memories to return. Default 50. Newest memories are returned first regardless of limit." - changed
Input schema / properties / project / descriptionPrevious value: -"Filter by project"New value: +"Filter to a specific project. Omit to list memories across all projects."
- Added
read_capture - Changed
search_memory4 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter by category"New value: +"Filter results to a single category. Omit to search across all categories." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum results to return"New value: +"Maximum number of results to return. Default 10. Results are ranked by relevance and importance before truncation." - changed
Input schema / properties / project / descriptionPrevious value: -"Filter by project"New value: +"Filter results to a specific project. Omit to search across all projects." - changed
Input schema / properties / query / descriptionPrevious value: -"Search query (keywords or phrases)"New value: +"Full-text search query. Supports keywords, phrases, and SQLite FTS5 syntax (e.g., 'database AND migration', '\"exact phrase\"'). Broader queries return more results."
- Changed
store_memory4 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Memory category"New value: +"Memory category. Determines how the memory is weighted during orientation: 'preference' and 'relationship' contribute to the orientation score. 'context' is used for checkpoints and session handoffs. 'lesson' is used for constraints and warnings. 'general' is the default catch-all." - changed
Input schema / properties / content / descriptionPrevious value: -"The memory content to store"New value: +"The memory content to store. Plain text, no length limit. Should be self-contained — future retrieval may return this memory without surrounding context." - changed
Input schema / properties / importance / descriptionPrevious value: -"Importance score 1-10 (higher = retrieved more often)"New value: +"Importance score from 1 (low) to 10 (critical). Higher-importance memories are ranked first in search results. Constraints default to 9, checkpoints to 8, general notes to 5." - changed
Input schema / properties / project / descriptionPrevious value: -"Project scope for this memory"New value: +"Project name to scope this memory to. When set, boot_report can filter orientation to this project. Omit for cross-project memories."
- Changed
update_memory4 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"New category"New value: +"New category for the memory. Omit to keep the existing category unchanged." - changed
Input schema / properties / content / descriptionPrevious value: -"New content"New value: +"Replacement content for the memory. Omit to keep the existing content unchanged." - changed
Input schema / properties / id / descriptionPrevious value: -"The memory ID to update"New value: +"The UUID of the memory to update. Obtain from store_memory, search_memory, or list_memories results." - changed
Input schema / properties / importance / descriptionPrevious value: -"New importance score"New value: +"New importance score from 1 (low) to 10 (critical). Omit to keep the existing score unchanged."
7 tool updates
v0.2.0- First observed
boot_report - First observed
delete_memory - First observed
end_session - First observed
list_memories - First observed
search_memory - First observed
store_memory - First observed
update_memory
TDQS
Scored across 10 tools
Memory operations (store/update/delete/list/search) are clearly distinct, and capture operations (capture_now/list_captures/read_capture) form a coherent group. There is some functional overlap between end_session, capture_now, and store_memory since all persist context, but the descriptions draw clear lines between structured handoffs, ad-hoc snapshots, and discrete memories.
Most tools follow a verb_noun pattern (store_memory, delete_memory, list_captures, read_capture, end_session), with memory tools consistently suffixed by _memory/_memories. Deviations like boot_report (noun form) and capture_now (verb_adverb) are minor and still readable.
Ten tools is well-scoped for a session-context/memory server, covering memory CRUD, search, session handoff, and capture retrieval without redundancy. Each tool has a defensible role in the workflow.
Memory lifecycle is fully covered (create, update, delete, list, search) and captures are readable/listable. Minor gaps exist: no get-by-ID for a single memory, no deletion of captures or sessions, and session history is only exposed indirectly via boot_report rather than a list_sessions/read_session pair.
Maintenance
Related MCP Connectors
Persistent memory for Claude Code and Cursor. Stop re-explaining your project every session.
Persistent context for Claude. Your AI always knows your projects and next actions across sessions.
Shared memory for AI tools: save once, recall word for word from Claude, ChatGPT, Codex or Gemini.
Portable AI memory you own. Keep memories and notes across Claude, ChatGPT, and other AI tools.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables AI coding assistants like Claude Code, Cursor, and Codex to share chat logs, terminal history, and session context with each other. Eliminates the need to re-explain context when switching between different AI coding tools.2MIT
- AlicenseAqualityAmaintenanceZero-config session continuity for Claude Code. Automatically captures and restores project context across sessions using Claude Hooks.2513 npm7MIT
- AlicenseNot gradedqualityCmaintenance2-5x longer Claude Code sessions before compaction. Saves 30-40% on input token costs. Remembers your rules and corrections so Claude stops repeating mistakes after compaction. Auto-runs in the background, just install once and forget about it.147 PyPI426MIT
- AlicenseNot gradedqualityDmaintenancePersistent memory for Claude Code — a self-evolving knowledge layer that survives across sessions, grows from every conversation, and surfaces relevant context automatically.14MIT