Central, fast, cross-project memory store shared across AI tools. Pure Python stdlib (sqlite3 + FTS5). No native compiled dependencies, no background daemon, no third-party install-time complexity.
MemCore demonstrates solid naming conventions (verb_noun pattern: memory_search, memory_write, memory_archive) and comprehensive descriptions (avg ~180 chars, well above 20-char minimum). All 13 tools have clear, actionable descriptions explaining WHAT, WHEN, and consequences. Input schemas are present and typed for all tools. However, several critical gaps reduce the score: (1) No output schemas documented, LLMs cannot predict response structure for chaining; (2) Parameter descriptions lack format/constraint details (e.g., 'scope' accepts any string, no validation guidance); (3) No error handling guidance, tools return success/failure but don't guide recovery; (4) Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels; (5) Destructive tools (memory_write, memory_archive, memory_healthcheck) lack confirmation/dry-run patterns. Strengths: excellent naming clarity, comprehensive descriptions, proper parameter typing, and thoughtful scope/type enums.
Soft-delete an entry: hide it from normal reads while keeping it restorable and audited.
Whether semantic search is active, which model, and how many entries have a current vector embedding (the rest are lexical-only until the next `embed-backfill` run).
Read the append-only audit log: who wrote/updated/archived what, when, and any conflicts or secret redactions. Read-only, available on any connection. Scope-locked connections only see their own scope's events.
Fetch one exact memory entry by its scope and name.
Self-test MemCore end to end (~1s): write, read, search (strict AND and OR-fallback modes), history, delete. Use this instead of assuming a connection is healthy just because it's listed — a connection can look fine while search silently misbehaves. Returns {ok, checks[], db_path}.
Show prior versions of an entry that were overwritten or deleted. Every write/delete is archived automatically before it happens — nothing is ever silently lost, even if another agent overwrites this entry. This is a read operation, available even on a read-only connection.
No output schemas documented. LLMs cannot predict response structure (fields, types, pagination) for downstream tool chaining. memory_search, memory_list, memory_recent, memory_events, memory_history all return lists but lack documented field names and types.
Destructive/write tools lack confirmation or dry-run patterns. memory_write, memory_archive, memory_healthcheck (which writes during self-test) can modify state without agent confirmation. No recovery guidance if operation fails.
Missing tool annotations. No readOnlyHint, destructiveHint, or idempotentHint metadata despite clear risk levels (READ_ONLY vs WRITE vs REVERSIBLE). Agents cannot distinguish safe retry operations from destructive ones.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Browse entries by scope / type / archived state, WITHOUT a search query. Use this to see everything in a project scope (onboarding to a codebase), every entry of one type (e.g. all `feedback`), or what has been archived. `archived=True` returns archived entries instead of active ones.
List the most recently updated memory entries, newest first.
Restore one archived entry to normal reads and search.
List every known project/topic scope and how many entries each has.
Search all remembered facts, across every project scope. Use this before assuming something isn't known — it searches EVERY project scope at once (no need to guess which project a fact was recorded under). Two layers, blended by default: Lexical (FTS5): multi-word queries first require ALL terms in one entry, then fall back to ANY term (ranked by how many match) so one non-verbatim word doesn't zero the result. Semantic (if embeddings are present): vector nearest-neighbours on a multilingual sentence model — finds entries about the same idea even with no shared keywords.
Report total entry count and database location.
Record a new fact, or update an existing one (same scope+name upserts). Secret-shaped values in `content` (API keys, tokens, `password: …` lines) are redacted to `[REDACTED]` before storage; if any were, the result includes `"redacted": [<codes>]`. `description` over 500 chars is truncated, not rejected.
Parameter descriptions lack format/constraint details. 'scope' accepts any string with no validation guidance; 'limit' has defaults but no min/max bounds; 'type' enum values (user/feedback/project/reference) not documented in memory_write description.
No error handling guidance. Tools return success/failure but descriptions don't explain what to do on conflict (expected_updated_at mismatch), validation failure, or database errors. Agents have no recovery path.