mem0-mcp
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mem0-mcpsearch memories about machine learning projects"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Semantic search across all memories | Ollama embed + Qdrant |
| Store a new memory | OpenMemory API |
| List all stored memories | Qdrant scroll |
| Delete a memory by ID | API + Qdrant fallback |
| Find entity relationships | Neo4j |
| 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.git2. Configure Claude Code
claude mcp add -s user mem0-mcp -- \
uvx --from git+https://github.com/tensakulabs/mem0-mcp.git mem0-mcpOr 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-serverConfiguration
All via environment variables with sensible defaults:
Variable | Default | Description |
|
| OpenMemory API (for writes) |
|
| Qdrant REST API |
|
| Ollama (for embeddings) |
|
| Embedding model name |
|
| Qdrant collection name |
|
| User ID for memory filtering |
|
| Neo4j Bolt endpoint |
|
| Neo4j username |
|
| 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 toolsadd_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")
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description bears full burden. It explains the tool stores data for recall but omits details on idempotency, overwriting behavior, limits, or side effects. A write operation would benefit from more behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with a clear purpose statement and a separate Args section. Every sentence adds value, no redundancy, and the structure is logical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (1 required param, output schema exists), the description sufficiently covers purpose and parameter. However, it could expand on what the output contains or any storage constraints, though these may be addressed by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'text' lacks schema description (0% coverage), but the description compensates with an illustrative example ('Justin prefers TypeScript...'), adding semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Store a new memory for future recall' and lists specific use cases (facts, preferences, decisions), making the tool's purpose unambiguous and distinct from siblings like delete_memory or list_memories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool ('to remember important facts, user preferences...'), but does not mention when not to use it or suggest alternatives (e.g., search_memories for retrieval).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_memoryA
Delete a specific memory by its ID.
Args:
memory_id: The full UUID of the memory to delete
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must fully inform about behavioral traits. It only states the action without disclosing side effects, authorization needs, or permanence of deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the action. It efficiently conveys the essential information, though it could include more context without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter and an output schema, the description is adequate but lacks details like error cases or requirements (e.g., memory must exist).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the description adds that memory_id is 'the full UUID of the memory to delete,' which clarifies the parameter beyond just its type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Delete a specific memory by its ID,' with a specific verb and resource, and it is distinct from sibling tools like add_memory or list_memories.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for deletion and specifies that memory_id is a full UUID. It does not explicitly mention when not to use or alternatives, but the purpose is clear enough given sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the tool returns both incoming and outgoing connections, which is helpful. However, without annotations, it does not explicitly state that the operation is read-only, nor does it mention any behavioral traits like error handling, authentication needs, or rate limits. The disclosure is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences stating the purpose and return value, plus a short parameter explanation. Every sentence adds value with no redundancy. It is front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one parameter, output schema present), the description covers the essentials. However, it lacks clarity on what 'all relationships' entails—whether it includes indirect relationships or only direct ones—and does not differentiate from search_graph. The presence of an output schema reduces the need to detail return values, but some additional context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no description for the 'name' parameter, but the description adds concrete examples (e.g., 'Justin', 'TypeScript') and clarifies that it is an entity name. This significantly aids the agent in understanding what values to provide, compensating for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves all relationships for a specific entity, including both incoming and outgoing connections. This distinguishes it from sibling tools like list_memories (which deals with memories) and search_graph (which is likely broader). The verb 'get' and resource 'relationships' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like search_graph. The description does not mention prerequisites, limitations, or context where this tool is preferred. An agent would have to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_memoriesA
List all stored memories for the current user.
Returns all memories from both Arc and Atlas in the shared store.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only states what it returns (all memories from Arc and Atlas) but does not mention authorization, rate limits, or side effects. For a read-only operation, the description is minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the main purpose and adding key context about data sources. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an existing output schema (not shown), and a simple list operation, the description adequately covers what the tool does. It lacks details on pagination or ordering but is sufficient for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and schema description coverage is 100% (trivially). The description adds no parameter-level details, but with zero parameters, a baseline of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all stored memories for the current user, specifying the scope (both Arc and Atlas) and the shared store. This is a specific verb+resource combination that distinguishes it from sibling tools like add_memory or delete_memory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies listing all memories without filtering, but it does not provide explicit when-to-use or when-not-to-use guidance. Siblings like search_memories and search_graph exist, but no comparison is made. Usage context is hinted but not elaborated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the burden of disclosing behavior. It states what the tool does (search and find connections) but does not describe limits, error handling, or behavior with no results. Moderate transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief (three sentences plus an Args section) with no fluff. It front-loads the main purpose and is well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one parameter and an existing output schema, the description is mostly complete: it explains input and output (entity relationships). It could add info on result format, but the output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the 'query' parameter is 0%, but the description adds meaning: 'Entity or topic to search for' with examples. This effectively explains the parameter's purpose beyond the schema name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches a knowledge graph for entity relationships, with specific examples like 'Justin' and 'OpenClaw'. It distinguishes itself from the sibling 'search_memories' by focusing on relationships between entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using the tool to understand relationships among people, projects, etc., and provides example queries. However, it does not explicitly contrast with 'search_memories' or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It indicates a read operation ('search') but does not disclose any behavioral traits such as result limits, ordering, or whether it modifies state. The semantic search method is implied but not detailed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise—three sentences plus a parameter docstring—with no wasted words. It front-loads the purpose and usage, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description does not need to explain return values. It covers purpose, usage, and parameter semantics well. However, it lacks information on result limits or scope (e.g., whether it searches all sessions or recent ones).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description thoroughly explains the query parameter with a natural language definition and concrete examples (e.g., 'TypeScript preferences'). This adds significant meaning beyond the schema's type and required fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'semantically search' and the resource 'memories', and distinguishes from siblings by specifying semantic search vs. other types. It also provides a concrete use case: recalling context from previous sessions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this tool at the start of tasks to recall preferences, decisions, patterns, and facts. It gives clear context but does not explicitly state when not to use it or mention alternatives, though sibling tool names imply alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v1.0.0- First observed
add_memory - First observed
delete_memory - First observed
get_entity - First observed
list_memories - First observed
search_graph - First observed
search_memories
TDQS
Scored across 6 tools
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.
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.
With 6 tools, the set is well-scoped for a memory management server. It covers essential operations without being too few or too many.
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
An MCP memory server. One memory your agents share — across models, devices and apps.
Private persistent memory for Claude, ChatGPT & Gemini via MCP - semantic search, zero-code setup.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA fully self-hosted MCP server that integrates the Mem0 framework to provide persistent memory capabilities for AI assistants using local models and vector storage. It enables users to store, search, and manage contextual information across conversations through a Docker-based deployment.4MIT
- AlicenseAqualityDmaintenanceSelf-hosted mem0 MCP server for Claude Code. Run a complete memory server against self-hosted Qdrant + Neo4j + Ollama while using Claude as the main LLM.11107MIT
- AlicenseNot gradedqualityCmaintenanceOpen-source MCP server for mem0 that enables memory storage and retrieval using local LLMs, self-hosted, and Docker-free.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceA fully local, self-hosted memory server for MCP clients (Claude Code, Cursor, etc.) that provides persistent memory storage with semantic search, using local embeddings and a local Qdrant vector store.MIT