MCP server for searching past Claude Code conversation history. Local BM25 search over JSONL logs with persistent index, secret redaction, solved-hint, and instant claude --resume.
Four well-named tools with comprehensive descriptions and complete input schemas. All tools follow verb_noun naming (remind_search, remind_message, remind_session, remind_resume). Descriptions are detailed (194 - 392 chars, well above baseline 194 avg) and include WHEN to use guidance. Input schemas are fully typed with enums, ranges, and defaults. However, output schemas are not documented in the source, LLMs cannot see what fields to expect from responses. Error handling and recovery guidance are absent. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite all tools being read-only. Parameter descriptions are strong (72+ chars baseline met), but no explicit output field documentation.
Fetch the full text of a specific past message, plus optional surrounding turns. Returns up to ~10 KB; the matched message is flagged with `isFocus: true` inside the returned window. When to use: only after `remind_search` returns a `messageUuid` whose snippet looks promising but is truncated. Don't call this for every search hit — pick the one or two most relevant first. If you want a structural overview of the whole session (tools, files, errors), call `remind_session` instead. To read the entire session, omit `messageUuid` (capped at 50 messages).
Resolve a (full or 8-char prefix) session id into a ready-to-run `claude --resume <id>` command, plus the session's cwd and git branch. When to use: only when you already have a sessionId in hand and need just the resume command. `remind_search` already returns `resumeCommand` on every hit, so prefer that. This tool exists for cases where the user pastes a bare sessionId or a previous tool flow stored only the id.
Search past Claude Code sessions for solutions to recurring problems. Returns BM25-ranked hits with a snippet, a `solvedHint`, a `messageUuid`, and a ready-to-paste `claude --resume <id>` command. When to use: at the start of a task to check for prior work on the same codebase; or when the user mentions an error, tool, or feature they may have already solved. One call is usually enough — only re-call with a different query if the first returned no useful hits. Query tips: use specific concrete terms — exact error strings (`ExpiredTokenException`, `LoginRefreshRequired`), tool/lib names (`BuildKit`, `Cognito`, `Tailwind`), or real file paths (`tailwind.config`, `shared_auth/jwt.py`). Avoid generic words that flood the corpus (e.g. `AWS`, `auth`, `docker` on their own). Good: `ExpiredTokenException SendSSHPublicKey`. Bad: `AWS auth issue`. Cost: ~1–2 KB per call at default (5 hits, 1000-char snippets). Use `format: "compact"` (400 chars) for cheap scans, `format: "full"` (2000 chars) when you need to read in place. After finding a relevant hit, call `remind_message` with its `messageUuid` to read the full content.
Output schemas not documented. LLMs cannot see what fields remind_search, remind_message, remind_session, and remind_resume return. This forces agents to guess at response structure and risks failed downstream tool calls.
No tool annotations. All four tools are read-only (no side effects), but lack readOnlyHint annotation. This prevents agents from understanding which tools are safe to call speculatively or in parallel.
No error recovery guidance. Tool descriptions lack actionable error messages or recovery hints (e.g., 'If sessionId not found, try remind_search first'). Agents have no guidance on what to do if a call fails.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Get a structured summary of one past session: title, message count, tool names used, files touched, error count, time span, solved hint, and the last user message. Cheap (~1 KB). When to use: when a `remind_search` hit looks relevant and you need the bigger picture (was this session productive? which tools/files were involved?) before drilling into specific messages. Requires a `sessionId` — the 8-char prefix from a search hit is enough. To read message bodies, use `remind_message` instead.
Parameter 'sinceDays' in remind_search lacks a maximum constraint. Unbounded integers can cause performance issues or unexpected behavior. Should specify max (e.g., 365 days).
No pagination guidance for remind_message when messageUuid is omitted. Description states 'capped at 50 messages' but does not explain how to retrieve additional messages or whether a next_cursor is returned.