Skip to main content
Glama

mem0-mcp

MCP server for self-hosted Mem0 with Qdrant vector search + Neo4j graph memory.

Looking for Mem0 Cloud? The official mem0-mcp-server works with the managed platform at app.mem0.ai. This project is for self-hosted deployments where you run your own Qdrant, Ollama, and Neo4j.

Why this exists

The official MCP server requires a Mem0 Cloud API key. If you self-host Mem0 with your own Qdrant and Ollama, there's no off-the-shelf MCP server that connects to your infrastructure. This one does.

What it connects to:

  • Qdrant for vector memory (semantic search)

  • Neo4j for graph memory (entity relationships)

  • Ollama for embeddings (no OpenAI/Anthropic keys needed)

  • OpenMemory API for writes (keeps SQLite + Qdrant in sync)

Related MCP server: mem0-mcp-selfhosted

Tools

Tool

Description

Backend

search_memories

Semantic search across all memories

Ollama embed + Qdrant

add_memory

Store a new memory

OpenMemory API

list_memories

List all stored memories

Qdrant scroll

delete_memory

Delete a memory by ID

API + Qdrant fallback

search_graph

Find entity relationships

Neo4j

get_entity

Get all connections for an entity

Neo4j

Prerequisites

A self-hosted Mem0 stack running somewhere accessible:

  • Qdrant (vector store)

  • Ollama with an embedding model (e.g., nomic-embed-text)

  • OpenMemory API (mem0ai/mem0)

  • Neo4j 5+ Community or Enterprise (optional, for graph memory)

If these are on a remote server, use SSH tunnels to forward the ports locally.

Setup

1. Install

pip install git+https://github.com/tensakulabs/mem0-mcp.git

2. Configure Claude Code

claude mcp add -s user mem0-mcp -- \
  uvx --from git+https://github.com/tensakulabs/mem0-mcp.git mem0-mcp

Or add to your MCP config manually:

{
  "mcpServers": {
    "mem0": {
      "command": "uvx",
      "args": ["--from", "git+https://github.com/tensakulabs/mem0-mcp.git", "mem0-mcp"],
      "env": {
        "MEM0_QDRANT_URL": "http://127.0.0.1:6333",
        "MEM0_OLLAMA_URL": "http://127.0.0.1:11435",
        "MEM0_API_BASE": "http://127.0.0.1:8765",
        "MEM0_NEO4J_URL": "bolt://127.0.0.1:7687",
        "MEM0_NEO4J_PASSWORD": "your-password",
        "MEM0_USER_ID": "your-user-id"
      }
    }
  }
}

3. SSH tunnels (if remote)

If your Mem0 stack is on a remote server:

ssh -f -N \
  -L 8765:127.0.0.1:8765 \
  -L 6333:127.0.0.1:6333 \
  -L 11435:127.0.0.1:11434 \
  -L 7687:127.0.0.1:7687 \
  user@your-server

Configuration

All via environment variables with sensible defaults:

Variable

Default

Description

MEM0_API_BASE

http://127.0.0.1:8765

OpenMemory API (for writes)

MEM0_QDRANT_URL

http://127.0.0.1:6333

Qdrant REST API

MEM0_OLLAMA_URL

http://127.0.0.1:11435

Ollama (for embeddings)

MEM0_EMBED_MODEL

nomic-embed-text:latest

Embedding model name

MEM0_COLLECTION

openmemory

Qdrant collection name

MEM0_USER_ID

justin

User ID for memory filtering

MEM0_NEO4J_URL

bolt://127.0.0.1:7687

Neo4j Bolt endpoint

MEM0_NEO4J_USER

neo4j

Neo4j username

MEM0_NEO4J_PASSWORD

mem0graph

Neo4j password

Architecture

Claude Code / Claude Desktop
  └── MCP stdio → mem0-mcp
        ├── READS  → Qdrant (vector search, all memories)
        ├── SEARCH → Ollama (embed query) + Qdrant (similarity)
        ├── GRAPH  → Neo4j (entity relationships)
        └── WRITES → OpenMemory API (SQLite + Qdrant sync)

Why hybrid read/write? The OpenMemory API uses SQLite as its source of truth for the memory list. If other agents (like OpenClaw) write directly to Qdrant, the API won't see those memories. Reading from Qdrant directly sees everything. Writing through the API keeps both stores in sync.

License

MIT

Available Tools

6 tools
add_memoryA

Store a new memory for future recall.

Use this to remember important facts, user preferences, architectural
decisions, project context, and lessons learned.

Args:
    text: The fact or information to remember (e.g., "Justin prefers
          TypeScript over Python for new projects")

Inputs: text (required). Returns: result

delete_memoryA

Delete a specific memory by its ID.

Args:
    memory_id: The full UUID of the memory to delete

Inputs: memory_id (required). Returns: result

get_entityA

Get all relationships for a specific entity.

Returns both incoming and outgoing connections.

Args:
    name: The entity name (e.g., "Justin", "TypeScript", "Hetzner")

Inputs: name (required). Returns: result

list_memoriesA

List all stored memories for the current user.

Returns all memories from both Arc and Atlas in the shared store.

Inputs: no named parameters. Returns: result

search_graphA

Search the knowledge graph for entity relationships.

Finds entities matching the query and their connections.
Use this to understand relationships between people, projects,
technologies, and concepts.

Args:
    query: Entity or topic to search for (e.g., "Justin", "OpenClaw",
           "Hetzner server")

Inputs: query (required). Returns: result

search_memoriesA

Semantically search memories for relevant context.

Use this at the start of tasks to recall relevant preferences,
decisions, patterns, and facts from previous sessions.

Args:
    query: Natural language search query (e.g., "TypeScript preferences",
           "server architecture", "coding style")

Inputs: query (required). Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 6 tools

    Disambiguation4/5

    Tools are mostly distinct: add, delete, list, search (semantic and graph) each target different operations. However, search_memories and search_graph could be confused if descriptions aren't carefully read, as both involve searching.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern (e.g., add_memory, delete_memory, list_memories, search_memories, get_entity, search_graph). No mixed conventions.

    Tool Count5/5

    With 6 tools, the set is well-scoped for a memory management server. It covers essential operations without being too few or too many.

    Completeness4/5

    The tool surface includes create, read, delete, and search operations. A notable gap is the lack of an update_memory tool, but the set is otherwise functional for the domain.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers