mem-port

Local MCP server, zero external infra

Every copilot you run keeps its own memory. mem-port gives them one.

npx @rsl-innovation/mem-port serve
No PostgresNo QdrantNo Neo4jMIT licensed

The 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
Claude CodeCLI + VS Code extensionCursorMCP clientWindsurfMCP clientClaude Desktopvia mcp-remote bridgeAny MCP clientStreamable HTTP + headersmem-port127.0.0.1:8787

In the box

Quick start

Four commands. No account, no API key, no docker-compose.

  1. 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.

    Terminal
    npx @rsl-innovation/mem-port serve
  2. 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.

    Terminal
    claude mcp add --transport http mem-port http://127.0.0.1:8787/mcp \
      --header "library-id: my-personal-workspace" \
      --scope user
  3. 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
  4. 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.

    Terminal
    npx -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.