Date: 2026-06-11
MetaCortex is a user memory system — it stores what the user knows, not what the user has access to. Email, calendars, documents, and external data sources are for the agent to dig through on demand and advise the user on. MetaCortex persists the durable knowledge that results from those interactions: preferences, decisions made, context learned, facts established, things deprecated.
This means MetaCortex will never include connectors (GDrive, Gmail, Notion), ingestion pipelines, browser extensions, or document indexing. That's a different product (and it's what supermemory, Mem0, and others are building). MetaCortex's scope is: durable memories that persist across agent sessions, with explicit lifecycle control.
MetaCortex is a well-architected MCP memory server. The core — vector search, idempotent writes, client profile scoping, and multimodal pipeline — is solid. The tool surface has been simplified from 6 tools to 4.
The first hardening release addressed Firestore collection scaling, payload optimization, and model validation. The remaining strategic work is focused on proposed advanced features (context tiering, temporal validity).
- Status: Implemented 2026-06-11
- Problem: Two collections grow without bound:
memory_vectors_write_fingerprints(deduplication fingerprints)memory_events(observability/audit trail)
- Resolution:
- New fingerprint writes store numeric
dedupe_expires_atfor the 15-minute duplicate window and Date-valuedexpires_atfor 30-day Firestore TTL. - New
memory_eventswrites preserve numerictimestampand add Date-valuedexpires_atfor 90-day Firestore TTL. - Added dry-run/write TTL backfill and
gcloudTTL deployment scripts.
- New fingerprint writes store numeric
- Status: Implemented 2026-06-11
- Problem: Each search result includes both
summary(220 chars) andcontent_preview(400 chars) — two truncations of the same content. Wastes tokens and confuses clients. - Resolution:
search_contextnow returnssummaryonly. If the agent wants full content, it callsfetch_context.
- Status: Implemented 2026-06-11
- Problem: Verify the
gemini-3.1-flash-lite-previewmultimodal model default still exists and is the right choice. - Resolution: Google shut down
gemini-3.1-flash-lite-previewon 2026-05-25. The default is now stablegemini-3.1-flash-lite, with a live validation script.
- Status: Proposed
- Goal: Reduce token costs by returning a summary first, fetching full details only when needed.
- Proposal: When storing a memory, use Gemini to generate:
- A
summaryfield (~100 tokens) stored alongside the full content. - The existing
content(full fidelity) remains for fetch. - Search results return the summary. Agents call
fetch_contextonly when they need the full thing.
- A
- Effort: Medium.
-
Status: Implemented 2026-07-11
-
Goal: Enable the agent to distinguish old facts from current ones beyond
branch_state. -
Proposal: Add optional
valid_fromandvalid_untilfields to stored memories. Search results can filter by temporal validity. Update deprecation to setvalid_untilautomatically.Added 2026-06 following a design review: Extend
deprecate_contextwith temporal bounds. This splits supersession into two semantically distinct reasons:- Change — the world changed (e.g., a job switch). The prior fact was TRUE OF ITS ERA. Set
valid_untilon the prior record; it remains true-of-period and should still surface in valid-time slices for that window. May be initiated by agent or user. - Correction — the prior record was NEVER TRUE (e.g., a mistyped date). Mark the prior record retracted on the belief axis — NOT a valid-time close — so it is excluded from valid-time truth while remaining in the audit trail. The corrective record carries the valid interval the prior should have had.
Implementation: Introduce a
supersession_reasonfield ("changed"|"corrected") on the supersession path;valid_untilhandling differs by reason. State projection rule is LATEST BELIEF WINS, since a correction can itself later be corrected. Cross-reference INVEST #4. - Change — the world changed (e.g., a job switch). The prior fact was TRUE OF ITS ERA. Set
-
Effort: Low-medium.
-
Status: Implemented 2026-07-11
-
Goal: Audit memory origin and protect chronology against agent drift (unintended rewrite/reinterpretation of historical priorities).
-
Proposal: Add a
provenanceobject toMemoryMetadata:origin("user_asserted"|"agent_inferred"|"legacy_import")source_session(optional string)derived_from(optional array of memory document IDs that an inference drew upon)confidence(optional number)
The agent self-reports
originon every write. Add anoriginfilter tosearch_context. For action provenance (which principal initiated a lifecycle mutation and the operation's semantics), extend the existingmemory_eventscollection rather than introducing new infrastructure, turning it into an authorization-aware audit log. Backfill existing legacy memories withorigin: "legacy_import". Note that the origin filter onsearch_contextis implemented as a post-filter with no new Firestore indexes needed. -
Effort: Medium.
-
Status: Implemented 2026-07-11
-
Goal: Prevent "agent drift" during error corrections by ensuring only the user can initiate corrections (retracting assertions that were never true).
-
Proposal: Enforce the user-only constraint structurally by exposing corrections as an MCP Prompt (user-controlled), NOT an MCP Tool (model-controlled). This prevents the agent from invoking corrections autonomously.
A correction is implemented as a thin composition over existing tools: a
remember_contextcall (for the corrected memory) + adeprecate_contextcall (for the old superseded memory) carryingsupersession_reason: "corrected"andinitiator: "user". The agent can identify and surface correction candidates in a review queue, but it can never commit them without user action. -
Effort: Low (no new storage primitive; a prompt plus
supersession_reason/initiatorfields, reusing deprecate+remember).
| Capability | Mem0 | Letta | Graphiti | OpenViking | Supermemory | MetaCortex |
|---|---|---|---|---|---|---|
| Vector search | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Multimodal memory | ❌ | ❌ | ❌ | ✅ (different) | ✅ (OCR/video) | ✅ (Gemini) |
| MCP native | ❌ | ❌ | ❌ | ❌ | ✅ (thin) | ✅ (full) |
| Client/tenant scoping | Basic | ❌ | ❌ | ❌ | Basic (Spaces) | ✅ (profiles) |
| Context tiering | ❌ | ❌ | ❌ | ✅ (L0/L1/L2) | ❌ | 🔜 (proposed) |
| Temporal validity | ❌ | ❌ | ✅ (bi-temporal) | ❌ | ❌ | ✅ (bi-temporal-lite) |
| Graph relationships | ✅ (hybrid) | ❌ | ✅ (core) | ❌ | ❌ | ❌ |
| Auto memory evolution | ✅ | ✅ (self-edit) | ✅ | ✅ | ✅ | ❌ |
| Serverless-native | ❌ | ❌ | ❌ | ❌ | ✅ (CF Workers) | ✅ (Firebase) |
| Connectors/ingestion | ❌ | ❌ | ❌ | ❌ | ✅ (GDrive etc.) | ❌ (by design) |
| Idempotent writes | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ (fingerprint) |
| Explicit lifecycle | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ (4-state) |
| Benchmark-validated | ❌ | ❌ | ❌ | ❌ | ✅ (LongMemEval) | ❌ |
MetaCortex's defensible niche: MCP-native, multimodal, serverless user memory server with client-scoped access control and explicit lifecycle management. Intentionally does NOT do connectors or data ingestion — that's the agent's job, not the memory system's.
The closest competitor in philosophy is supermemory (also serverless, also MCP-capable), but supermemory is memory-as-a-product (automated, consumer-friendly, implicit lifecycle) while MetaCortex is memory-as-infrastructure (explicit lifecycle control, deterministic behavior for agentic systems). Supermemory also has a reported fundamental reliability bug (issue #792: writes succeed but recall returns empty).
These should be addressed regardless of strategic direction:
- Fixed:
runtime.test.tsusedMCP_AUTH_TOKENwhile code readMCP_ADMIN_TOKEN. - Fixed:
CLAUDE.mdusedMCP_AUTH_TOKENin the env var table. - Fixed:
CLAUDE.mdreferred toopenBrainMcpinstead ofmetaCortexMcp. - Partially fixed: stale
CLAUDE.mddescriptions were refreshed where touched by the contract cleanup. - Fixed:
WWW-Authenticaterealm no longer uses the old placeholder service name. - Fixed: default
serviceNameno longer uses the old placeholder service name. - Fixed: replaced the shut-down
gemini-3.1-flash-lite-previewmultimodal model default with stablegemini-3.1-flash-liteand added live model validation.
| Tool | Purpose | Annotations |
|---|---|---|
remember_context |
Write memories (defaults: topic="general", branch_state="active") | idempotent |
search_context |
Semantic search with filters | read-only |
fetch_context |
Get full content by ID | read-only |
deprecate_context |
Soft-delete with supersession tracking | destructive |
consolidate_context |
LLM-merge related memories into one canonical record and deprecate the sources | destructive / admin |
- SSE Transport Removal: Streamable HTTP is now the only supported transport; stateful SSE endpoints removed. (Completed: 2026-03-22)
- Response Normalization: All remaining MCP tools normalized to return JSON payloads instead of flat key=value text. (Completed: 2026-03-22)
store_contextElimination: Removed from MCP surface;remember_contextis the unified write tool. (Completed: 2026-03-22)get_consolidation_queueRemoval: Removed from MCP surface; WIP queue is now an internal workflow. (Completed: 2026-03-22)retrieval_textExposure Fix: Removedretrieval_textfrom publicfetch_contextresponse to prevent leaking implementation details. (Completed: 2026-03-22)- Roadmap Hardening Release: Added Firestore TTL-ready fields and scripts, removed
content_previewfrom search payloads, addeddocument_idfetch compatibility, updated Gemini multimodal defaults, deployed production TTL policies, and verified production smoke tests. (Completed: 2026-06-11) - Codebase Bugs Fixed:
- Fixed environment variable naming mismatch (
MCP_ADMIN_TOKENvsMCP_AUTH_TOKEN). - Updated references in
CLAUDE.mdfromopenBrainMcptometaCortexMcp. - Standardized
WWW-Authenticaterealm and defaultserviceNameto use the correct service name.
- Fixed environment variable naming mismatch (