
Local MCP server, zero external infra
Every copilot you run keeps its own memory. mem-port gives them one.
npx @rsl-innovation/mem-port serveThe problem
Copy-pasting context is a snapshot, not a sync.
Every AI copilot (Claude Code, Cursor, Windsurf) keeps its own memory, siloed to that tool. Switch tools mid-project and you're re-explaining yourself from zero.
The usual workaround is copying context, summaries, or exported notes from one agent into another. That only captures what was true the moment you copied it. From there, the copies drift: each agent keeps learning on its own, nothing keeps them in sync, and the longer you go the more your copilots disagree about what's actually true.
Without mem-port
With mem-port
Each copilot starts cold in a new session
Every copilot reads the same graph
You copy-paste a frozen snapshot of context
Nothing to copy: one live source
The copies drift apart as each agent keeps learning alone
Nothing to drift: there's only one
How it works
One daemon. One embedded graph. Every copilot reads and writes the same thing.
mem-port runs as a single local process: no Postgres, no Qdrant, no Neo4j, no external services at all. It's one embedded SurrealDB instance combining graph storage and vector search, with zero-config local semantic search that needs no API key. Any number of MCP clients connect to it over Streamable HTTP with a library-id header; every client using the same library-id shares the same memory, and different library-ids are fully isolated from each other. There's no cross-tenant leakage.
- Storage
- Embedded SurrealDB (surrealkv://): graph + vector search, one process
- Embeddings
- Local ONNX model, Xenova/all-MiniLM-L6-v2, no API key required
- Isolation
- library-id header → its own SurrealDB namespace/database per workspace
- Transport
- Streamable HTTP on 127.0.0.1:8787, bridgeable to stdio via mcp-remote
- Portability
- export_library / import_library → one portable .memport.json bundle

In the box
Quick start
Four commands. No account, no API key, no docker-compose.
- 01
Start the daemon
Starts a daemon on http://127.0.0.1:8787/mcp. Running mem-port often? Install it globally instead: npm install -g @rsl-innovation/mem-port, then mem-port serve is a plain command on your PATH.
Terminalnpx @rsl-innovation/mem-port serve - 02
Connect Claude Code
--scope user makes it available in every project on this machine, not just the one you're in when you run the command.
Terminalclaude mcp add --transport http mem-port http://127.0.0.1:8787/mcp \ --header "library-id: my-personal-workspace" \ --scope user - 03
Confirm the connection
Run inside Claude Code (the CLI or the VS Code extension's chat panel) to confirm mem-port shows as connected.
Claude Code/mcp - 04
Connect anything else the same way
Any MCP client that supports Streamable HTTP with custom headers connects identically. stdio-only clients bridge through mcp-remote.
Terminalnpx -y mcp-remote@latest http://127.0.0.1:8787/mcp --header "library-id:my-personal-workspace"

Free. Open source. Runs on your machine.
MIT licensed, no external services, no account required.
Tools
The MCP tool surface
Every connected copilot gets the same 14 tools, reading and writing the same graph.
save_memory
Save a fact/preference/decision/task/reference, optionally linked to entities
search_memory
Semantic (vector) search over memories
save_episode
Record a raw interaction/event that memories can be derived from
list_episodes
List recorded episodes, filterable by time range/source
save_skill
Save a reusable procedure, optionally linked to entities
search_skills
Semantic (vector) search over skills, by task/situation
list_skills
List saved skills, filterable by tag/source
get_skill
Look up a skill by exact name or id
forget_skill
Soft-archive (default) or permanently delete a skill
get_entity
Look up an entity plus everything that mentions or relates to it
relate_entities
Create a graph relation between two entities
forget_memory
Soft-archive (default) or permanently delete a memory
export_library
Export this library to a portable .memport.json bundle
import_library
Import a .memport.json bundle, merging or overwriting
Configuration
- MEM_PORT_PORT
- 8787
- HTTP port
- MEM_PORT_DATA_DIR
- OS app-data dir
- Where the SurrealDB store and cached embedding model live
- MEM_PORT_EMBEDDING_MODEL
- Xenova/all-MiniLM-L6-v2
- Local embedding model id (reserved for future use)
- MEM_PORT_MODEL_CACHE_DIR
- <data-dir>/models
- Override the embedding model cache location
Fine print
Known limitations (v1)
Stated plainly, not buried: what mem-port doesn't do yet.
Localhost only
The daemon binds to 127.0.0.1. Cloud/web-hosted chat sessions (chatgpt.com, claude.ai in a browser tab) can't reach it. Use a local desktop app or CLI instead.
Brute-force vector search
No HNSW/DISKANN index yet. Fine at personal-memory-store scale; revisit once a library grows very large.
No authentication
The daemon trusts anything running locally on your machine; its only boundary is binding to 127.0.0.1.
Partial export filtering
export_library supports filtering by memory_types and since; filtering by entity_ids isn't implemented yet.