Local-first coding agent memory for Claude Code and OpenAI Codex. MCP server providing persistent memory, observation timeline, workstream tracking, and memory governance.
Remem is a sophisticated agent-memory system with 15 tools covering search, state retrieval, memory governance, and session management. Strengths: comprehensive parameter descriptions, well-defined input schemas with types and enums, explicit error handling guidance in descriptions, and thoughtful dependency hints (e.g., 'use current_state when durable key is known; use timeline for chronological context'). Weaknesses: several tools lack documented output schemas (get_observations, lookup_commit, commits_for_session, timeline_report, workstreams, update_workstream, search_raw, list_raw_sessions); some descriptions are overly technical and longer than ideal (search: 348 chars, recall_user_context: 280 chars, context_bundle: 257 chars); tool names could be more uniform in verb-noun consistency; no batch variants despite many tools operating on collections. Definition quality is solid but incomplete in schema documentation, exceeds typical community servers (median ~50-55) but falls short of production A-grade (80+) due to missing output documentation.
List git commits linked to a content session ID or remem memory session ID. Its poisoning gate may quarantine the newest eligible unsafe linked session summary. Returns link evidence plus git metadata; it does not guess commit intent when no link exists.
Experimental Context Bundle v1 compiler. Requires schema_version=1 and a non-blank task. Returns a policy-bounded, source-attributed ContextBundle with a complete selection/drop audit; project is explicit or derived from cwd, and role/risk/token budget have deterministic defaults. Historical as_of_epoch pins and include_superseded=true fail loudly until the canonical loader supports them. This reuses the production SessionStart canonical loader, performs no foreground LLM or network call, and returns canonical load failures as a blocked audited bundle. Its poisoning safety check may quarantine unsafe persisted rows, so callers must not treat it as side-effect-free. The JSON shape is versioned but remains experimental.
Read-only. Resolve one stable state_key to a JSON object with status=current, no_current, not_found, ambiguous, or unresolved_conflict, plus answer, compact history, and why edges. state_key must be non-blank; project/owner/type/as_of filters narrow the resolution. Use this instead of search when the durable key is known; use timeline for chronological observation context. Invalid input or database failures return a tool error.
Fetch detailed source='observation' current extracted observations by id list, recording access telemetry. Ids not found in the current observation index are silently skipped; callers must reconcile expected vs received ids. Returns a compact JSON array with observation details, visibility classification, and provenance. Use search for curated memories, current_state for one stable fact, or timeline for chronological context. Invalid input or database failures return a tool error.
Missing or incomplete output schemas for 8 tools (get_observations, lookup_commit, commits_for_session, timeline_report, workstreams, update_workstream, search_raw, list_raw_sessions). LLMs cannot plan downstream steps or extract typed results without documented return structures.
Several tool descriptions exceed 250 characters (search: 348, recall_user_context: 280, context_bundle: 257), burying key information and wasting tokens.
Tool names lack consistent verb-noun patterns. 'recall_user_context' and 'context_bundle' use noun-first naming, diverging from verb-first conventions (get_, list_, create_). This makes intent less obvious to LLMs during tool selection.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2025-06-18+ | v2 |
Dry-run or execute stale, reject, or delete governance for selected Remem memories. Returns dry_run report or confirmation of executed action, including affected count and reason. Requires action field; ids list, query, and filter fields (project, memory_type, status) allow bulk selection. Explicit reason and actor fields support audit trails. confirm=false performs dry-run; confirm=true executes. Invalid input, missing confirm flag, or database failures return a tool error.
List sessions with raw archive messages inside a time window, grouped by (source_root, host, project, session_id) with a stable session_ref, content_hash, first/last message epoch, message count, and optional role=user message samples. Unresolved or conflicted provenance is skipped and reported in excluded_legacy_identities; latest fills at most that many newest healthy sessions and does not spend slots on skipped rows. Use for recap-style summaries of what happened in a period. Output fields match remem raw sessions --json.
Look up git commit metadata and linked memory sessions by full or short SHA. Its poisoning gate may quarantine the newest eligible unsafe linked session summary. The response separates git metadata from memory-derived summaries so missing links are not inferred.
Assemble task-aware user context from safe claims, profile summary, repo memories, requested current-state keys, workstreams, and recent sessions. Its poisoning gate may quarantine an unsafe legacy or session summary. Requires a non-blank query and an explicit project or cwd scope. Returns a compact source-attributed JSON object with included items, dropped items, reason codes, and budget metadata. Use search for exhaustive memory matches and current_state for one exact stable key; this tool selects a bounded context bundle instead. Invalid or missing scope input and database failures return a tool error.
Explicitly save one durable Remem memory. Returns status, operation type, and next_step guidance. Creates new memory or updates existing if exact state_key match found. Requires text field; title, project, memory_type, topic_key, scope are optional and carry semantic meaning. Duplicate saves for identical content return no-op with status='skipped'. Invalid input or database failures return a tool error.
Read-only. Search or list curated memories: query is optional for standard search, while project/type/branch and visibility flags filter results. Optional task_intent/role/risk/token_budget/include_superseded compiles a GH-934 RetrievalPlan, applies its search/rerank/fallback policy, and returns retrieval_plan audit metadata. Returns a compact JSON object with results, source='memory', pagination, and next_step for get_observations(ids, source); limit defaults to 20 and offset to 0. Use current_state when an exact stable state_key is known, timeline for chronological observation context, and search_raw for literal chat recall. explain and multi_hop each require a non-blank query, and explain cannot be combined with multi_hop=true. Invalid combinations or curated-search database failures return a tool error; an automatic raw-archive fallback failure preserves the curated results and adds raw_hits_error to the successful response.
Search the raw archive (every user/assistant turn captured by the Stop hook). Use this when search returns no curated match or you need to recall a literal phrase from past chats. Returns the untreated conversation content — expect noise. The raw archive is what guarantees 'what was said remains searchable' even when summarize/promote skip a turn.
Read-only. Return a JSON array of observations before and after one center point; provide anchor or query, and anchor takes precedence when both are set. depth_before and depth_after default to 5, and project limits both anchor lookup and results. Use this for local chronological context around an observation; use timeline_report for an aggregated project report, search for curated memories, or current_state for a stable fact. Missing anchors/queries, no query match, or database failures return a tool error.
Generate a structured project timeline report with optional timeline and monthly breakdown. Returns project key, date range, observation count, and optional full chronological timeline plus month-by-month activity summary.
Update a Remem workstream status, next action, or blockers after explicit confirmation. Requires id, project, and confirm fields; status/next_action/blockers specify the update (at least one required). Returns id and updated status.
List Remem workstreams for a project, optionally filtered by status. Returns a JSON array of workstreams with id, title, status, description, next_action, blockers, and timestamps.
No batch variants for tools operating on collections. E.g., 'govern_memory' accepts an 'ids' array but no batch 'get_observations' or 'get_observations_batch'. Agents calling get_observations in a loop waste tokens and latency vs one batch call.
Some parameter descriptions are generic or lack format/range constraints. E.g., 'as_of_epoch: Optional epoch timestamp for historical lookup' does not specify: Is this seconds or milliseconds? Is there a valid range? Must it be in the past? LLMs guess, increasing errors.