Gives Claude a persistent memory layer that runs entirely on your machine. You get 29 MCP tools for ingesting conversations, searching across four memory tiers (working, episodic, semantic, procedural), and retrieving context with token budgets. The people graph resolves identities across channels, Bayesian beliefs self-correct with evidence, and temporal queries understand "recently" versus "first time." Everything stays local in SQLite with optional encrypted sync to your own cloud storage. Benchmarks show 568µs retrieval versus 300ms for cloud alternatives, and it outscores Mem0 by 6.8% on the LoCoMo academic memory benchmark while costing nothing. Reach for this when you want Claude to remember across sessions without sending your data to a third party API.
Public tool metadata for what this MCP can expose to an agent.
listAllEntitiesList and filter catalog entities with support for pagination, search, and various filters including groups, types, owners, and git repositories. If the client is trying to fetch data for teams, use 'type': 'team' in these APIs.16 paramsList and filter catalog entities with support for pagination, search, and various filters including groups, types, owners, and git repositories. If the client is trying to fetch data for teams, use 'type': 'team' in these APIs.
pageintegerquerystringtypesarraygroupsarrayownersarraycontextstringpageSizeintegerincludeLinksbooleanincludeOwnersbooleanhierarchyDepthstringgitRepositoriesarrayincludeArchivedbooleanincludeMetadatabooleanincludeNestedFieldsarrayincludeSlackChannelsbooleanincludeHierarchyFieldsarraylistEntityDescriptorsCortex Catalog API - Access and manage your service catalog, teams, domains, and resources5 paramsCortex Catalog API - Access and manage your service catalog, teams, domains, and resources
pageintegeryamlbooleantypesarraycontextstringpageSizeintegerlistDependenciesForEntityList all dependencies for an entity including both incoming (who depends on this service) and outgoing (what this service depends on) relationships. Essential for understanding service interactions, planning changes, and assessing blast radius6 paramsList all dependencies for an entity including both incoming (who depends on this service) and outgoing (what this service depends on) relationships. Essential for understanding service interactions, planning changes, and assessing blast radius
pageintegercontextstringpageSizeintegercallerTagstringincludeIncomingbooleanincludeOutgoingbooleangetDependencyGet specific dependency details between two entities including method, path, and metadata. Useful for understanding the nature of the relationship, API contracts, and communication patterns between services5 paramsGet specific dependency details between two entities including method, path, and metadata. Useful for understanding the nature of the relationship, API contracts, and communication patterns between services
pathstringmethodstringcontextstringcalleeTagstringcallerTagstringgetEntityDetailsRetrieve comprehensive details about a specific entity including its metadata, ownership, hierarchies, and relationships. This is the primary method for getting complete information about services, teams, or domains.5 paramsRetrieve comprehensive details about a specific entity including its metadata, ownership, hierarchies, and relationships. This is the primary method for getting complete information about services, teams, or domains.
contextstringtagOrIdstringincludeOwnersbooleanhierarchyDepthstringincludeHierarchyFieldsarraygetCustomDataForEntityList all custom data key-value pairs associated with an entity. Retrieve metadata, configuration settings, and custom attributes stored for services, resources, or domains. Supports pagination for entities with large amounts of custom data4 paramsList all custom data key-value pairs associated with an entity. Retrieve metadata, configuration settings, and custom attributes stored for services, resources, or domains. Supports pagination for entities with large amounts of custom data
pageintegercontextstringtagOrIdstringpageSizeintegergetCustomDataForEntityByKeyRetrieve a specific custom data value by key for an entity. Efficiently access individual metadata attributes, configuration values, or custom properties without fetching all custom data3 paramsRetrieve a specific custom data value by key for an entity. Efficiently access individual metadata attributes, configuration values, or custom properties without fetching all custom data
keystringcontextstringtagOrIdstringlistCustomEventsForEntityList custom events for an entity with optional filtering by type and time range. Supports pagination and filtering by event type, start time, and end time to retrieve historical event data8 paramsList custom events for an entity with optional filtering by type and time range. Supports pagination and filtering by event type, start time, and end time to retrieve historical event data
pageintegertypestringcontextstringendTimestringtagOrIdstringpageSizeintegerstartTimestringtimestampstringgetCustomEventForEntityByUuidRetrieve a specific custom event by its UUID. Returns event details including title, description, timestamp, type, and any custom data associated with the event3 paramsRetrieve a specific custom event by its UUID. Returns event details including title, description, timestamp, type, and any custom data associated with the event
uuidstringcontextstringtagOrIdstringgetDeploysForEntityList all deployments for a specific catalog entity. Returns deployment history including timestamps, environments, SHAs, and deployment types in paginated format4 paramsList all deployments for a specific catalog entity. Returns deployment history including timestamps, environments, SHAs, and deployment types in paginated format
pageintegercontextstringtagOrIdstringpageSizeintegergetCurrentOncallForEntityRetrieve the current on-call personnel for an entity in real-time. Shows who is actively responsible for incident response, including primary and secondary on-call, contact information, and rotation schedules2 paramsRetrieve the current on-call personnel for an entity in real-time. Shows who is actively responsible for incident response, including primary and secondary on-call, contact information, and rotation schedules
contextstringtagOrIdstringgetEntityDescriptorCortex Catalog API - Access and manage your service catalog, teams, domains, and resources3 paramsCortex Catalog API - Access and manage your service catalog, teams, domains, and resources
yamlbooleancontextstringtagOrIdstringlistEntityDestinationsForRelationshipTypeList all destinations for a certain relationship type & entity. Use the listRelationshipTypes tool to find the relevant relationshipTypeTag.5 paramsList all destinations for a certain relationship type & entity. Use the listRelationshipTypes tool to find the relevant relationshipTypeTag.
depthstringcontextstringtagOrIdstringincludeArchivedbooleanrelationshipTypeTagstringlistEntitySourcesForRelationshipTypeList all sources for a certain relationship type & entity. Use the listRelationshipTypes tool to find the relevant relationshipTypeTag.5 paramsList all sources for a certain relationship type & entity. Use the listRelationshipTypes tool to find the relevant relationshipTypeTag.
depthstringcontextstringtagOrIdstringincludeArchivedbooleanrelationshipTypeTagstringgetCustomMetricDataRetrieve custom metric data points for an entity. Returns paginated time-series data for a specific custom metric, with optional filtering by date range to analyze trends and patterns7 paramsRetrieve custom metric data points for an entity. Returns paginated time-series data for a specific custom metric, with optional filtering by date range to analyze trends and patterns
pageintegercontextstringendDatestringtagOrIdstringpageSizeintegerstartDatestringcustomMetricKeystringqueryPointInTimeMetricsExecute point-in-time queries for one or more engineering metrics. Returns current metric values for specified time periods, with support for batch queries and optional period-over-period comparisons. Time range (startTime/endTime) cannot exceed 6 months (180 days). PREREQUISI...14 paramsExecute point-in-time queries for one or more engineering metrics. Returns current metric values for specified time periods, with support for batch queries and optional period-over-period comparisons. Time range (startTime/endTime) cannot exceed 6 months (180 days). PREREQUISI...
limitintegercontextstringendTimestringfiltersarraygroupByarraymetricsarrayorderByarraynextPagestringstartTimestringcomparisonvaluenestedGroupByarraynestedMetricsarraytimeAttributestringnestedTimeAttributestringlistMetricDefinitionsList all available engineering metric definitions. USAGE - Call this endpoint BEFORE querying metrics (queryPointInTimeMetrics): 1. Once at start: Call with view='basic' to discover all available metrics - cache this response 2. Once per metric: Call with view='full' and key=M...3 paramsList all available engineering metric definitions. USAGE - Call this endpoint BEFORE querying metrics (queryPointInTimeMetrics): 1. Once at start: Call with view='basic' to discover all available metrics - cache this response 2. Once per metric: Call with view='full' and key=M...
keyarrayviewstringcontextstringlistInitiativesList all initiatives in the organization with optional filters for draft and expired initiatives. View active improvement programs, strategic projects, and their current status to understand organizational priorities and track progress5 paramsList all initiatives in the organization with optional filters for draft and expired initiatives. View active improvement programs, strategic projects, and their current status to understand organizational priorities and track progress
pageintegercontextstringpageSizeintegerincludeDraftsbooleanincludeExpiredbooleangetInitiativeRetrieve detailed information about a specific initiative including its goals, timeline, affected entities, scorecard targets, and current progress. Essential for understanding initiative scope and tracking achievement of objectives2 paramsRetrieve detailed information about a specific initiative including its goals, timeline, affected entities, scorecard targets, and current progress. Essential for understanding initiative scope and tracking achievement of objectives
cidstringcontextstringgetMyWorkspaceTOOL for retrieving current user's owned resources and work items across the Cortex workspace. FLEXIBLE REQUEST STRUCTURE: The request accepts an object with optional fields for each resource type: - myEntitiesRequest: Fetch entities (services, resources, domains) owned by the...7 paramsTOOL for retrieving current user's owned resources and work items across the Cortex workspace. FLEXIBLE REQUEST STRUCTURE: The request accepts an object with optional fields for each resource type: - myEntitiesRequest: Fetch entities (services, resources, domains) owned by the...
contextstringmyTeamsRequestobjectmyOpenPRsRequestobjectmyEntitiesRequestobjectmyWorkItemsRequestobjectmyScorecardsRequestobjectmyRequestedReviewsRequestobjectlistRelationshipTypesList all available relationship types with pagination. View relationship type configurations to understand what kinds of relationships can be created between entities like services, resources, domains, and teams3 paramsList all available relationship types with pagination. View relationship type configurations to understand what kinds of relationships can be created between entities like services, resources, domains, and teams
pageintegercontextstringpageSizeintegergetRelationshipTypeDetailsGet complete details of a specific relationship type including its configuration, rules, source/destination filters, and inheritance settings. Essential for understanding how entities can be connected and what validation rules apply2 paramsGet complete details of a specific relationship type including its configuration, rules, source/destination filters, and inheritance settings. Essential for understanding how entities can be connected and what validation rules apply
contextstringrelationshipTypeTagstringlistEntityRelationshipsList all entity relationships/full graph for a specific relationship type across the entire organization. Returns paginated results showing all source-destination pairs, useful for understanding the complete relationship graph and finding all connections of a particular type4 paramsList all entity relationships/full graph for a specific relationship type across the entire organization. Returns paginated results showing all source-destination pairs, useful for understanding the complete relationship graph and finding all connections of a particular type
pageintegercontextstringpageSizeintegerrelationshipTypeTagstringlistScorecardsList all scorecards in the organization with optional filtering. View scorecard configurations to understand quality standards, compliance requirements, and maturity models. Supports filtering by groups, entities, and teams to find relevant scorecards7 paramsList all scorecards in the organization with optional filtering. View scorecard configurations to understand quality standards, compliance requirements, and maturity models. Supports filtering by groups, entities, and teams to find relevant scorecards
pageintegerteamsarraygroupsarraycontextstringentitiesarraypageSizeintegershowDraftsbooleangetScorecardGet complete details of a scorecard including its configuration, rules, levels, weights, exemption settings, and evaluation criteria. Essential for understanding how services are evaluated and what standards they must meet2 paramsGet complete details of a scorecard including its configuration, rules, levels, weights, exemption settings, and evaluation criteria. Essential for understanding how services are evaluated and what standards they must meet
tagstringcontextstringgetScorecardNextStepsForEntityGet actionable next steps for an entity to improve its scorecard performance. Shows which rules need to be satisfied to reach the next maturity level, helping teams prioritize improvements and track progress toward compliance goals3 paramsGet actionable next steps for an entity to improve its scorecard performance. Shows which rules need to be satisfied to reach the next maturity level, helping teams prioritize improvements and track progress toward compliance goals
tagstringcontextstringentityTagstringlistScorecardScoresRetrieve scores for all entities evaluated by a specific scorecard. Returns paginated results showing how each service, resource, or domain performs against the scorecard's rules, including individual rule scores and overall scorecard scores5 paramsRetrieve scores for all entities evaluated by a specific scorecard. Returns paginated results showing how each service, resource, or domain performs against the scorecard's rules, including individual rule scores and overall scorecard scores
tagstringpageintegercontextstringpageSizeintegerentityTagstringgetTeamDetailsRetrieve detailed information about a specific team by its tag or ID. Returns complete team data including members, slack channels, metadata, and whether it's backed by an identity provider group2 paramsRetrieve detailed information about a specific team by its tag or ID. Returns complete team data including members, slack channels, metadata, and whether it's backed by an identity provider group
contextstringtagOrIdstringquery_docsQuery the Cortex knowledge base for answers. Args: query: The question to ask Cortex docs Returns: Response from Cortex including answer and metadata2 paramsQuery the Cortex knowledge base for answers. Args: query: The question to ask Cortex docs Returns: Response from Cortex including answer and metadata
querystringcontextstringget_more_toolsCheck for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.1 paramsCheck for additional tools whenever your task might benefit from specialized capabilities - even if existing tools could work as a fallback.
contextvalue🧠 Try Cortex in your browser — zero install, 124KB WASM, runs entirely client-side.
If Cortex helps your AI remember, give it a ⭐ — it takes 1 second and helps others discover the project.
Private. Free. Local. — a memory engine for personal AI agents.
Your AI's memory lives on your device — your data never leaves, never costs, never spies. Pure Rust. 3.8MB binary. No third-party servers in the data path, zero telemetry, zero cost. Syncs through your own cloud storage. (On-device semantic search downloads a ~30MB model once on first use, then runs fully offline — or go 100% offline with CORTEX_NO_EMBEDDINGS=1. See Security & Privacy.)

What you get
See it remember across sessions — ~30 seconds:
brew install gambletan/tap/cortex-mcp-server # or: cargo build --release -p cortex-mcp-server
claude mcp add cortex-memory -- cortex-mcp-server ~/.cortex/memory.db
Tell Claude "remember I deploy on Fly.io and always run tests before pushing." Open a brand-new session and ask "how do I deploy this project?" — it answers from memory, 100% on your machine.
⭐ If that's useful, give it a star — it helps others find a memory engine that respects their privacy.
LLMs start blank every session — they forget your name, your preferences, yesterday's conversation, last week's decision. The usual fixes are flat text files (no ranking, no decay), keyword grep, or cloud APIs that add 200–500ms, charge you, and ship your personal data to someone else's server. Cortex gives your AI structured, self-evolving long-term memory that persists across sessions and channels — all local, all yours. Your memories are not a cloud provider's training data, a startup's monetization asset, or a surveillance target.
| Cortex | Mem0 | OpenAI Memory | |
|---|---|---|---|
| Privacy | 100% local, zero cloud | Cloud API (your data on their servers) | OpenAI servers |
| Latency | 156µs ingest, 568µs search | ~200-500ms | ~300-800ms |
| Cost | Free, forever | $99+/mo (Pro) | ChatGPT Plus ($20/mo) |
| Memory tiers | 4 (Working/Episodic/Semantic/Procedural) | 1 (flat) | 1 (flat) |
| Bayesian beliefs | Self-correcting with evidence | No | No |
| People graph | Cross-channel identity resolution | Paid tier only | No |
| Conversation compression | Automatic session summarization | No | No |
| Relationship inference | Pattern-based (EN + CN) | No | No |
| Temporal retrieval | Intent-aware ("recently" / "first time") | No | No |
| Contradiction detection | Automatic with confidence scores | No | No |
| Consolidation | Episodic → Semantic auto-promotion | No | No |
| Context injection | Token-budgeted LLM-ready output | Manual | Automatic but opaque |
| Import/Export | Full JSON backup & restore | API only | No export |
| Self-hosted | Native binary, Docker, MCP | Cloud only | Cloud only |
| Binary size | 3.8 MB | npm package | N/A |
| Dependencies | 0 runtime services (single binary) | Node.js + cloud | N/A |
| Open source | MIT | Partial | No |
| Encryption | AES-256-GCM encrypted sync (opt-in) | No | No |
| Key rotation | Versioned envelopes, forward secrecy | No | No |
| Privacy levels | Private (default, never syncs) / Shared / Public — per-memory opt-in, demote retracts from other devices | No | No |
| Tool authorization | Deny-by-default capability policy on the MCP surface | No | No |
| Zero telemetry | No analytics, no phone-home, verifiable | Unknown | No |
| Cost | Free forever, unlimited | $99+/mo (Pro) | $20/mo (Plus) |
| Chinese NLP | Native (inference, retrieval, relationships) | No | Limited |
| Namespace isolation | Per-user/context memory separation | No | No |
| Plugin system | Compile-time hooks for ingest/retrieve/consolidation | No | No |
| MCP tools | 30 tools for Claude/LLM integration | 3rd party | N/A |
| Operation | Cortex | Mem0 (cloud) | File-based |
|---|---|---|---|
| Ingest | 156µs | ~200ms | ~1ms |
| Search (top-10) | 568µs | ~300ms | ~10ms |
| Context generation | 621µs | ~500ms | manual |
| Belief update | 66µs | N/A | N/A |
| People graph | 51µs | paid tier | N/A |
| Structured facts | 45µs | N/A | N/A |
| 1K memories search | 1.6ms | ~500ms | ~50ms |
528x faster than Mem0 cloud. With features neither Mem0 nor OpenAI Memory offer.
Note: Benchmarks include proactive inference (auto-extracting facts, preferences, relationships) on every ingest. Raw ingest without inference is ~15µs. Numbers from
cargo benchon M-series Mac.
Academic-grade long-term conversation memory evaluation — 10 conversations, 1540 QA pairs across 4 categories.
| System | Single-hop | Multi-hop | Open-domain | Temporal | Overall |
|---|---|---|---|---|---|
| Backboard | 89.4% | 75.0% | 91.2% | 91.9% | 90.0% |
| MemMachine v0.2 | — | — | — | — | 84.9% |
| Cortex | 72.5% | 59.5% | 88.8% | 74.1% | 73.7% |
| Mem0-Graph | 65.7% | 47.2% | 75.7% | 58.1% | 68.4% |
| Mem0 | 67.1% | 51.2% | 72.9% | 55.5% | 66.9% |
| OpenAI Memory | — | — | — | — | 52.9% |
Key findings:
Cortex outperforms Mem0 on all 4 categories — while running 100% locally, end-to-end encrypted, at $0 cost.
Setup: Claude Sonnet 4 (QA + judge), nomic-embed-text (embeddings via Ollama), top-30 retrieval. Reproducible with that setup:
python3 bench/locomo_bench.py(needsANTHROPIC_API_KEY+ a local Ollama withnomic-embed-text). Numbers measured on the v1.7 engine; the v2.2 retrieval beam fix (paraphrase recall 40%→90% at 5K, seedocs/scale-test-2026-06-13.md) has not yet been re-run on LoCoMo, so these are reported as the last verified figures, not a v2.2 claim.
Cortex implements a 4-tier memory model inspired by human cognition:
+---------------------+
| Working Memory | Current session context
+---------------------+
|
+---------------------+
| Episodic Memory | Raw experiences: conversations, events, observations
+---------------------+
| consolidation (decay, promotion, pattern extraction)
+---------------------+
| Semantic Memory | Distilled facts, preferences, relationships
+---------------------+
|
+---------------------+
| Procedural Memory | Learned routines, user-specific workflows
+---------------------+
Working holds the current session scratch pad. Episodic stores raw experiences with timestamps and source metadata. The Consolidation Engine periodically promotes recurring patterns into Semantic facts and decays stale episodes. Procedural captures learned workflows and routines.
Cross-channel identity resolution. The same person messaging you on Telegram, emailing you, and showing up in calendar events gets unified into a single identity node. Interactions, relationship strength, and communication patterns are tracked per-person.
Self-correcting understanding of the world. Beliefs are formed from evidence, updated with each new observation, and can be contradicted. Confidence scores reflect actual certainty rather than recency bias.
cortex.observe_belief("user_prefers_morning_meetings", true, 0.8)?;
cortex.observe_belief("user_prefers_morning_meetings", false, 0.6)?;
// Confidence adjusts automatically via Bayesian update
Episodic-to-semantic promotion, decay of stale memories, and pattern extraction. Runs as a background cycle that keeps the memory store lean and queryable. Returns a report of what was promoted, decayed, and merged.
Queries combine five signals for relevance ranking:
Generates LLM-ready context strings from memory state. Pass a token budget, optional channel/person filters, and get back a structured text block your LLM can consume directly.
SQLite for persistence, in-memory vector index for fast similarity search. Single-file database, no external services required. Designed for edge deployment -- runs on a laptop, a Raspberry Pi, or a server.
Sync memories across devices through your own cloud storage — no third-party server involved.
Device A (Mac) Your Cloud Storage Device B (iPhone)
┌──────────┐ ┌──────────────────────┐ ┌──────────┐
│ SQLite DB │ ──W──> │ iCloud / GDrive / │ <──R── │ SQLite DB│
│ (local) │ │ OneDrive / Dropbox │ │ (local) │
│ │ <──R── │ │ ──W──> │ │
└──────────┘ └──────────────────────┘ └──────────┘
ENC2 envelopes) without re-encrypting history; old versions stay readable, new writes are unreadable to a leaked old keyshared to sync it; demote it back to private and a retraction deletes it from your other devices (local copy kept)CORTEX_SYNC_PASSPHRASE); the server resumes sync and starts background pull (30s poll + fs watcher) automaticallySupported providers: iCloud Drive, Google Drive, OneDrive, Dropbox (auto-detected).
use cortex_core::sync::SyncConfig;
use cortex_core::types::PrivacyLevel;
// Enable sync with encryption (settings persist; passphrase goes to the OS keychain)
let config = SyncConfig::new(sync_dir, device_id, device_name)
.with_encryption("my-strong-passphrase");
cortex.enable_sync(config)?;
// Opt a memory into sync — everything is Private unless you say otherwise
cortex.set_memory_privacy(mem_id, PrivacyLevel::Shared { scope: "all".into() })?;
// Pull changes from other devices (also happens automatically in the background)
let applied = cortex.sync_pull()?;
println!("Applied {} remote changes", applied);
| Feature | Detail |
|---|---|
| Encryption | AES-256-GCM with Argon2id key derivation (per-line random nonce) |
| Key rotation | Versioned ENC2 envelopes with per-version passphrase-derived keys — forward secrecy against AES-key exfiltration, no full re-encryption needed |
| Integrity | HMAC on the sync manifest and on every sync operation; plaintext lines in an encrypted oplog are rejected outright (injection defense) |
| Privacy levels | Private (default, never syncs), Shared, Public — set at ingest (privacy arg / --privacy) or later (memory_set_privacy); demoting to Private retracts the memory from other devices |
| Capability policy | Deny-by-default tool authorization on the MCP surface: a capabilities.json grants tool groups (read/write/sync/plugins) or exact tools; ungranted tools are invisible and uncallable; malformed policy fails closed |
| Query budget | Every retrieval is bounded (candidate cap + wall-clock cap) — query cost never scales with total store size; DoS guard and timing-side-channel bound in one |
| Secret handling | Sync passphrase is never written to disk by Cortex — macOS login Keychain or env var only; missing passphrase fails safe (sync off, never plaintext) |
| Memory zeroization | Sensitive data cleared from RAM on drop (zeroize crate) |
| Zero telemetry | No analytics, no phone-home, no user data ever leaves the device — enforced in CI (scripts/check-no-network-egress.sh): the build fails if any network/telemetry crate enters cortex-core's default tree, and the check also proves the --no-default-features binary is completely zero-network. |
| Embedding model fetch (one-time) | The default cortex-mcp-server enables on-device semantic search, which downloads a ~30 MB model (all-MiniLM-L6-v2) from the Hugging Face CDN on first ingest, then runs fully offline and sends none of your data. For a 100%-offline setup: run with CORTEX_NO_EMBEDDINGS=1 (keyword/FTS recall, zero network) or build --no-default-features. A one-time stderr notice is printed before any download — nothing is ever fetched silently. |
| No accounts | No API key, no registration, no cloud dependency |
See SECURITY.md for the full threat model.
Install the Rust toolchain (provides cargo):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
After installation, either restart your terminal or run:
source "$HOME/.cargo/env"
Verify:
cargo --version
Imagine your AI assistant across a week of real conversations:
# Day 1 — You chat on Telegram
You: "Sarah works at Stripe. She's interested in our API."
Cortex auto-extracts:
├── episodic memory stored (156µs)
├── fact: Sarah → works_at → Stripe (confidence: 0.70)
└── person resolved: sarah_telegram
# Day 2 — Sarah emails you
From: sarah@stripe.com
"Here's the technical spec we discussed."
Cortex:
├── person resolved: sarah@stripe.com → merged with sarah_telegram
│ (same person, different channel — automatic identity resolution)
└── fact: Sarah → sent → technical spec
# Day 3 — You ask your AI
You: "What's the status with Stripe?"
Cortex retrieves (568µs):
├── Sarah works at Stripe (semantic fact)
├── Meeting went well, interested in API (episodic, Day 1)
├── She sent technical spec (episodic, Day 2)
└── Cross-channel context: Telegram + Email unified under one person
Your AI responds with full context — no "sorry, I don't remember" 🎯
# Day 5 — New information arrives
You: "Sarah now works at Anthropic."
Cortex:
├── contradiction detected: Sarah works_at Stripe vs Sarah works_at Anthropic
├── old fact superseded + decayed: Stripe (salience ×0.3, kept as history)
├── new fact stored: Sarah → works_at → Anthropic
└── current employer now ranks first; self-correcting, no manual cleanup
(Third-party relations are extracted from natural-language verbs —
"works at / works for / joined / now works at", "runs on", "hosted in",
"manages", "part of", … — between two proper-noun entities.)
# Day 7 — Consolidation runs
Cortex auto-consolidation:
├── 3 episodic memories about Sarah → promoted to semantic summary
├── stale memories from other topics → decayed
└── pattern detected: you have recurring Monday meetings
All of this happens locally in <1ms per operation. No cloud. No API calls. No one else sees your data.
brew tap gambletan/tap
brew install cortex-mcp-server
cargo build --release -p cortex-mcp-server
cp target/release/cortex-mcp-server ~/.local/bin/
Cortex is published under the cortex-ai-memory name. Several similarly-named
packages on npm/PyPI are not affiliated with this project — use exactly these:
| Ecosystem | Official package | Use for |
|---|---|---|
| Binary / MCP server | GitHub Releases, or brew install gambletan/tap/cortex-mcp-server | the memory engine (primary) |
| PyPI | cortex-ai-memory | Python bindings |
| npm | @cortex-ai-memory/cortex-memory (scoped) | OpenClaw memory plugin |
⚠️ Not us: npm
cortex-mcp, npmcortex-ai-memory(unscoped), PyPIcortex-memory. The source of truth is always this repo —github.com/gambletan/cortex. When in doubt, the binary from Releases is the canonical install.
use cortex_core::Cortex;
// Open (or create) a memory database
let cortex = Cortex::open("memory.db")?;
// Ingest a memory from a Telegram conversation
let embedding = your_embedding_fn("Met with Alice about the Q3 roadmap");
cortex.ingest(
"Met with Alice about the Q3 roadmap",
"telegram", // source channel
Some("alice_123"), // user ID (triggers identity resolution)
Some(0.8), // salience hint
Some(embedding), // vector embedding
)?;
// Add a semantic fact directly
cortex.add_fact(
"Alice", "works_at", "Acme Corp",
0.95, "telegram", None,
)?;
// Store a preference
cortex.add_preference("timezone", "America/Los_Angeles", 0.9)?;
// Retrieve relevant memories
let results = cortex.retrieve(
"What do I know about Alice?",
5, // top-k
None, // any channel
None, // any person
Some(query_embedding), // vector for similarity search
)?;
// Generate LLM-ready context (token-budgeted)
let context = cortex.get_context(
2000, // max tokens
Some("telegram"), // channel filter
None, // no person filter
)?;
// Pass `context` as system/user message prefix to your LLM
// Run consolidation (call periodically)
let report = cortex.run_consolidation()?;
println!("Promoted: {}, Decayed: {}", report.promoted, report.decayed);
Coming soon via PyO3. The cortex-python crate will expose the full API as a native Python module:
from cortex import Cortex
cx = Cortex.open("memory.db")
cx.ingest("Had lunch with Bob at the Thai place", channel="imessage", user_id="bob")
results = cx.retrieve("Where does Bob like to eat?", limit=5)
Cortex is designed as the memory layer for unified-channel-hub. Messages flow in from any channel adapter, Cortex ingests and indexes them, and the context injection protocol feeds relevant memory back to your LLM before each response.
Telegram ─┐ ┌─ Context
Discord ─┤ unified-channel-hub → │ Cortex → LLM
Email ─┤ (ingest) │ (retrieve + inject)
Calendar ─┘ └─ Response
Add persistent memory to any LangGraph agent via langchain-mcp-adapters — no custom code needed.
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o")
async with MultiServerMCPClient({
"cortex": {
"command": "cortex-mcp-server",
"args": ["~/.cortex/memory.db"]
}
}) as client:
agent = create_react_agent(model, client.get_tools())
# Agent now has all 30 Cortex memory tools
result = await agent.ainvoke({
"messages": [{"role": "user", "content": "What do you remember about Alice?"}]
})
Your LangGraph agent gets instant access to memory_search, memory_ingest, fact_add, belief_observe, person_resolve, and 25 more tools — all running locally.
Cortex works as a persistent memory layer for DeerFlow — ByteDance's open-source multi-agent orchestration platform. Zero code changes needed.
# Add to DeerFlow config.yaml
mcp_servers:
cortex-memory:
command: cortex-mcp-server
args:
- ~/.cortex/deerflow.db
All DeerFlow agents (Telegram, Slack, Feishu) get instant access to 30 memory tools — cross-session memory, fact storage, people graph, and belief tracking across all channels.
Cortex doubles as a standalone CLI tool — no MCP client required.
$ cortex-mcp-server --help
Cortex memory engine — MCP server & CLI tools
Usage: cortex-mcp-server [DB_PATH] [COMMAND]
Commands:
ingest Store a new memory
search Search memories
stats Show memory statistics
sync Show cloud sync status and detected providers
export Export all data as JSON
import Import data from JSON file
info Show version, DB path, and capabilities
help Print this message or the help of the given subcommand(s)
Arguments:
[DB_PATH] Path to the Cortex database file (default: ~/.cortex/memory.db)
Options:
-h, --help Print help
-V, --version Print version
Examples:
# Store a memory
cortex-mcp-server ~/.cortex/memory.db ingest "Met with Alice about Q3 roadmap"
cortex-mcp-server ~/.cortex/memory.db ingest -c telegram "Sarah now works at Anthropic"
# Search
cortex-mcp-server ~/.cortex/memory.db search "Alice"
cortex-mcp-server ~/.cortex/memory.db search -l 10 "Q3 roadmap"
# Stats
cortex-mcp-server ~/.cortex/memory.db stats
# Cloud sync
cortex-mcp-server ~/.cortex/memory.db sync # status
cortex-mcp-server ~/.cortex/memory.db sync enable # auto-detect provider
cortex-mcp-server ~/.cortex/memory.db sync enable -p icloud # specific provider
cortex-mcp-server ~/.cortex/memory.db sync pull # pull remote changes
# Export / Import (backup & restore)
cortex-mcp-server ~/.cortex/memory.db export -o backup.json
cortex-mcp-server ~/.cortex/new.db import backup.json
# Version & capabilities
cortex-mcp-server ~/.cortex/memory.db info
No subcommand = MCP stdio mode (for Claude Code / Claude Desktop integration).
Cortex ships as an MCP server — works with any MCP-compatible client.
1. Build & install the binary:
mkdir -p ~/.local/bin ~/.cortex
cargo build --release -p cortex-mcp-server
cp target/release/cortex-mcp-server ~/.local/bin/
2. Register as MCP server:
Claude Code (CLI):
# Global (all projects)
claude mcp add cortex --scope user -- ~/.local/bin/cortex-mcp-server ~/.cortex/memory.db
# Or per-project
claude mcp add cortex -- ~/.local/bin/cortex-mcp-server ~/.cortex/memory.db
Claude Desktop — add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"cortex": {
"command": "/Users/you/.local/bin/cortex-mcp-server",
"args": ["/Users/you/.cortex/memory.db"]
}
}
}
3. Allow tools in "don't ask" mode:
Add to ~/.claude/settings.json → permissions.allow:
"mcp__cortex__*"
Note: MCP tool permissions do not support parentheses format (e.g.
mcp__cortex__memory_ingest(*)). Use the wildcardmcp__cortex__*instead.
4. Make it automatic — add to your CLAUDE.md (project or global ~/.claude/CLAUDE.md):
# Memory (Cortex)
You have persistent memory via Cortex MCP tools. Use them automatically:
- Start of conversation: call `memory_context` to load what you know about the user
- When the user shares a preference, fact, or personal info: call `memory_ingest` to store it
- When you learn a structured fact: call `fact_add` (e.g. "User works_at Google")
- When you detect a preference: call `preference_set` (e.g. editor=neovim)
- When evidence supports or contradicts a belief: call `belief_observe`
- When talking to someone new: call `person_resolve` to track identity
- Periodically: call `memory_consolidate` to clean up stale memories
5. Auto-inject memory on session start (Claude Code hooks — fully automatic):
Create ~/.claude/hooks/cortex-memory-inject.sh:
#!/bin/bash
CORTEX_BIN="${CORTEX_BIN:-$HOME/.local/bin/cortex-mcp-server}"
CORTEX_DB="${CORTEX_DB:-$HOME/.cortex/memory.db}"
[ -x "$CORTEX_BIN" ] || exit 0
printf '%s\n%s\n%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"hook","version":"1.0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"memory_context","arguments":{"max_tokens":1500}}}' \
| "$CORTEX_BIN" "$CORTEX_DB" 2>/dev/null \
| grep '"id":2' \
| python3 -c "import sys,json; r=json.load(sys.stdin); print(r['result']['content'][0]['text'])" 2>/dev/null
Add to ~/.claude/settings.json:
{
"hooks": {
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/cortex-memory-inject.sh"
}
]
}
]
}
}
Now every new Claude Code session automatically loads your memory context — zero manual effort. Claude learns as you work and remembers across sessions.
Your Claude's memory follows you across all your devices — MacBook, iMac, work laptop — through your own cloud storage.
Enable sync (one command):
You: "Enable cross-device memory sync"
Claude calls sync_enable → auto-detects iCloud Drive →
generates device ID + AES-256-GCM encryption key → done.
Output:
Provider: iCloud Drive
Encryption: AES-256-GCM
Passphrase: a1b2c3... ← save this for your other devices
On your second device — one script does everything (build/install, wait for iCloud, join, restore):
git clone https://github.com/gambletan/cortex && cortex/scripts/setup-device-sync.sh
# Prompts for your passphrase (hidden input; or set CORTEX_SYNC_PASSPHRASE)
# → full restore on join, passphrase saved to that device's login Keychain
Or conversationally:
You: "Enable sync with passphrase a1b2c3..."
Claude calls sync_enable(passphrase: "a1b2c3...") →
connects to the same iCloud sync folder → pulls all memories.
Now both devices share the same memory — and keep sharing it
automatically (background sync: 30s poll + filesystem watcher).
What syncs and what doesn't:
memory_ingest with privacy: "shared", cortex-mcp-server ingest --privacy shared, or memory_set_privacy on an existing memoryprivate and it is retracted (deleted) from your other devices — the local copy staysCLI alternative:
# Device A
cortex-mcp-server sync enable
# Save the passphrase from the output
# Device B
cortex-mcp-server sync enable --passphrase "your-passphrase-from-device-A"
# Manual pull (background sync also pulls automatically)
cortex-mcp-server sync pull
Working across multiple projects? Use separate databases for physical memory isolation — no cross-project leakage, zero code changes needed.
~/.cortex/
├── global.db # User preferences, people graph, cross-project knowledge
├── my-app.db # Project A memories
└── my-api.db # Project B memories
Global config (~/.claude/settings.json) — user-level knowledge:
{
"mcpServers": {
"cortex-global": {
"command": "~/.local/bin/cortex-mcp-server",
"args": ["~/.cortex/global.db"]
}
},
"permissions": { "allow": ["mcp__cortex-global__*", "mcp__cortex-project__*"] }
}
Per-project config (~/.claude/projects/<path>/settings.json) — project-specific:
{
"mcpServers": {
"cortex-project": {
"command": "~/.local/bin/cortex-mcp-server",
"args": ["~/.cortex/my-app.db"]
}
}
}
Then add these memory isolation rules to your project's CLAUDE.md:
## Memory Isolation
Two Cortex MCP servers: `cortex-project` (project DB) and `cortex-global` (global DB).
### Write Policy
- Save to `cortex-project` if the memory is about this repo's architecture, code,
modules, tests, workflows, configs, bugs, decisions, or terminology.
- Save to `cortex-global` only for long-term user preferences, communication style,
cross-project habits, or personal background useful across repos.
- **Default: if uncertain, save to `cortex-project`.**
### Read Policy
1. Query `cortex-project` first.
2. Query `cortex-global` second, only for user-level preferences.
3. Prefer project memory when they conflict.
### Anti-Leak Rules
- Never auto-copy from `cortex-project` into `cortex-global`.
- Never store repo-specific paths, module names, or account names in `cortex-global`.
- Never treat project implementation details as user-global preferences.
### Update Rule
- Cortex is append-only. To update: search old entry → delete → ingest new.
This gives you two independent Cortex instances per project — complete isolation with shared user knowledge.
Tool access is governed by an optional deny-by-default capability policy: drop a
capabilities.jsonnext to your database ({"version":1,"grants":["read","write"]}) and only granted tool groups (read/write/sync/plugins/all) or exact tool names are listed and callable. No policy file = everything enabled (legacy).
| Tool | Purpose |
|---|---|
memory_ingest | Store a memory (text, channel, person context, optional privacy) |
memory_set_privacy | Change a memory's privacy level — promote to shared to sync it, demote to private to retract it from other devices |
memory_search | Semantic search across all memory tiers |
memory_context | Generate LLM-ready context summary (token-budgeted) |
memory_consolidate | Run decay + promotion + sweep cycle |
memory_infer | Preview inference without storing |
memory_compress | Compress old conversation sessions |
memory_stats | Get memory statistics (counts per tier, index size) |
memory_decay | Run temporal decay on episodic memories |
belief_observe | Update a Bayesian belief with evidence |
belief_list | Query beliefs above confidence threshold |
fact_add | Store structured knowledge (subject-predicate-object) |
fact_query | Query facts by entity (SQL-indexed) |
preference_set | Store user preference with confidence |
preference_query | Query preferences by key pattern |
person_resolve | Cross-channel identity resolution |
person_list | List all known people |
contradiction_check | Check for fact contradictions |
relationship_extract | Extract relationships from text |
sync_status | Cloud sync status (provider, devices, pending ops) |
sync_providers | Detect available cloud storage providers |
sync_enable | Enable cross-device cloud sync with optional encryption |
sync_pull | Pull and apply remote changes from other devices |
memory_archive | Archive a memory to cold storage |
memory_restore | Restore an archived memory back to an active tier |
memory_delete | Permanently delete a memory by ID |
memory_ingest_batch | Ingest multiple memories in a single transaction |
tag_list_taxonomy | List all tags in use across memories with counts |
namespace_list | List all namespaces with memory counts |
person_merge | Merge two person identities into one |
Give your OpenClaw agent persistent memory with auto-recall and auto-capture.
Install:
# 1. Install Cortex binary
curl -fsSL https://raw.githubusercontent.com/gambletan/cortex/main/install.sh | bash
# 2. Install the OpenClaw plugin
openclaw plugin add @cortex-ai-memory/cortex-memory
Configure (optional — works with defaults):
{
"plugins": {
"@cortex-ai-memory/cortex-memory": {
"autoCapture": true,
"autoRecall": true,
"topK": 10
}
}
}
What it does:
autoCapture: Automatically stores conversation context after each turnautoRecall: Injects relevant memories before each turn (your agent "remembers")See openclaw-plugin/README.md for full configuration options.
cortex/
├── cortex-core/ # Rust core library (all memory logic)
│ ├── src/
│ │ ├── lib.rs # Cortex entry point
│ │ ├── types.rs # MemObject, MemoryTier, etc.
│ │ ├── inference.rs # Proactive inference (EN + CN)
│ │ ├── episode.rs # Episodic memory store
│ │ ├── semantic.rs # Semantic facts + preferences
│ │ ├── working.rs # Working memory (session scratch pad)
│ │ ├── procedural.rs # Learned routines
│ │ ├── people.rs # People graph + identity resolution
│ │ ├── belief.rs # Bayesian belief system
│ │ ├── consolidation.rs # Episodic→semantic promotion + decay
│ │ ├── retrieval.rs # Multi-signal retrieval engine
│ │ ├── context.rs # LLM context generation
│ │ ├── sync/ # Cloud sync (oplog, HLC, merge, encryption)
│ │ └── storage/ # SQLite + in-memory vector index
│ └── benches/ # Performance benchmarks
├── cortex-http/ # HTTP REST API (axum, local-only)
├── cortex-mcp-server/ # MCP server binary (3.8MB)
├── cortex-python/ # Python bindings (PyO3, WIP)
├── openclaw-plugin/ # OpenClaw memory plugin
├── Dockerfile # Self-hosted Docker image
└── Cargo.toml # Workspace root
Cortex ships a lightweight HTTP server for integration with any language or framework. Binds to 127.0.0.1 by default — your data never leaves your machine.
# Build & run
cargo build --release -p cortex-http
./target/release/cortex-http --port 3315 --db ~/.cortex/memory.db
# Or via Docker (pre-built from GHCR)
docker run -v ~/.cortex:/data -p 3315:3315 ghcr.io/gambletan/cortex/cortex-http:latest
# Or build locally
docker build -t cortex .
docker run -v ~/.cortex:/data -p 3315:3315 cortex
| Method | Path | Description |
|---|---|---|
| GET | /health | Health check |
| POST | /v1/memories | Ingest a memory |
| POST | /v1/memories/search | Semantic search |
| GET | /v1/memories/context | Generate LLM context |
| POST | /v1/memories/consolidate | Run consolidation cycle |
| POST | /v1/memories/infer | Preview inference (no store) |
| POST | /v1/facts | Add a semantic fact |
| POST | /v1/facts/contradictions | Check for contradictions |
| POST | /v1/preferences | Set a preference |
| GET | /v1/beliefs | List beliefs |
| POST | /v1/beliefs/observe | Update belief with evidence |
| POST | /v1/people | Resolve person identity |
| POST | /v1/memories/compress | Compress old conversation sessions |
| POST | /v1/relationships/extract | Extract relationships from text |
| GET | /v1/export | Export all data (JSON backup) |
| POST | /v1/import | Import data from backup |
# Store a memory
curl -X POST http://localhost:3315/v1/memories \
-H 'Content-Type: application/json' \
-d '{"text": "I prefer dark mode", "channel": "cli"}'
# Search
curl -X POST http://localhost:3315/v1/memories/search \
-H 'Content-Type: application/json' \
-d '{"query": "preferences", "limit": 5}'
# Export all data (backup to iCloud, NAS, etc.)
curl http://localhost:3315/v1/export > ~/iCloud/cortex-backup.json
# Import from backup
curl -X POST http://localhost:3315/v1/import \
-H 'Content-Type: application/json' \
-d @~/iCloud/cortex-backup.json
pip install cortex-ai-memory)/v1/memories/recent API, 12 rounds Codex review fixes, 489 testsENC2), bounded query budget, deny-by-default MCP capability policy, per-memory privacy opt-in with cross-device retraction, persistent sync (Keychain) + auto background sync, frecency ranking, one-shot device setup script, 30 MCP tools, 500+ testsIf you find Cortex useful, please consider giving it a star ⭐ — it helps others discover the project and motivates continued development!
MIT
io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage
io.github.mikerawsonnz/llm-orchestration-agent
io.github.mikerawsonnz/authenticated-llm-agent
labforgedev/copilot-memory-mcp
csoai-org/agent-prompt-injection-firewall-mcp
io.github.mikerawsonnz/authenticated-multi-llm-agent