
Neo4j Agent Memory
STDIOOfficialNeo4j MCP server for AI agent memory storage and knowledge graph management
Neo4j MCP server for AI agent memory storage and knowledge graph management
A specialized MCP server that bridges Neo4j graph database with AI agents, providing memory-focused tools for storing, recalling, and connecting information in a knowledge graph.
You can run this MCP server directly using npx:
npx @knowall-ai/mcp-neo4j-agent-memory
Or add it to your Claude Desktop configuration:
{ "mcpServers": { "neo4j-memory": { "command": "npx", "args": ["@knowall-ai/mcp-neo4j-agent-memory"], "env": { "NEO4J_URI": "bolt://localhost:7687", "NEO4J_USERNAME": "neo4j", "NEO4J_PASSWORD": "your-password", "NEO4J_DATABASE": "neo4j" } } } }
Unlike traditional approaches that embed complex logic in tools, this server provides simple, atomic operations and lets the LLM handle all the intelligence:
The search_memories
tool uses word tokenization:
This approach makes the system more powerful and adaptable, as improvements in LLM capabilities directly translate to better memory management.
This server now supports connecting to specific databases in Neo4j Enterprise Edition. By default, it connects to the "neo4j" database, but you can specify a different database using the NEO4J_DATABASE
environment variable.
search_memories
: Search and retrieve memories from the knowledge graph
since_date
parameter (ISO format)create_memory
: Create a new memory in the knowledge graph
create_connection
: Create relationships between memories
update_memory
: Update properties of existing memories
update_connection
: Update relationship properties
delete_memory
: Remove memories and all their connections
delete_connection
: Remove specific relationships
list_memory_labels
: List all unique memory labels in use
get_guidance
: Get help on using the memory tools effectively
Neo4j Database (v4.4+ or v5.x)
docker run -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/password neo4j
Node.js (v18 or higher)
Claude Desktop (for MCP integration)
To install Neo4j Agent Memory MCP Server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @knowall-ai/mcp-neo4j-agent-memory --client claude
git clone https://github.com/KnowAll-AI/mcp-neo4j-agent-memory.git cd mcp-neo4j-agent-memory
npm install
npm run build
The server requires the following environment variables:
NEO4J_URI
: Neo4j database URI (required, e.g., bolt://localhost:7687)NEO4J_USERNAME
: Neo4j username (required)NEO4J_PASSWORD
: Neo4j password (required)NEO4J_DATABASE
: Neo4j database name (optional) - For Neo4j Enterprise with multiple databasesCopy .env.example
to .env
and update with your credentials:
cp .env.example .env # Edit .env with your Neo4j credentials
Add the environment variables to your Claude Desktop configuration (see Quick Start above).
The LLM handles all the complexity of deciding what to store and how to connect memories:
User: "Remember that John works at Google as a software engineer"
Assistant: I'll remember that John works at Google as a software engineer.
[Behind the scenes, the LLM does:
1. search_memories({"query": "John"}) - Check if John exists
2. search_memories({"query": "Google"}) - Check if Google exists
3. create_memory({"label": "Person", "properties": {"name": "John", "occupation": "software engineer"}})
4. create_memory({"label": "Organization", "properties": {"name": "Google"}})
5. create_connection({"fromMemoryId": 123, "toMemoryId": 456, "type": "WORKS_AT"})]
User: "Remember that Sarah is John's manager and she started in 2019"
Assistant: I'll add that information about Sarah.
[The LLM searches for John, creates Sarah, and connects them with a MANAGES relationship including the start date]
User: "Who works at Google?"
Assistant: Let me search for people who work at Google.
[LLM uses: search_memories({"query": "Google", "depth": 2})]
Based on my memory:
- John - Software Engineer at Google
- Sarah - Manager at Google (manages John, started 2019)
User: "What do you remember about John?"
Assistant: Here's what I know about John:
[LLM uses: search_memories({"query": "John", "depth": 2})]
- Works at Google as a Software Engineer
- Sarah is his manager
- [Any other connected memories found in the search]
User: "John and Sarah are working on Project Atlas together"
Assistant: I'll connect John and Sarah to Project Atlas.
[The LLM:
1. Searches for John and Sarah to get their IDs
2. Creates Project Atlas: create_memory({"label": "Project", "properties": {"name": "Project Atlas"}})
3. Connects them: create_connection({"fromMemoryId": johnId, "toMemoryId": projectId, "type": "WORKS_ON"})
4. create_connection({"fromMemoryId": sarahId, "toMemoryId": projectId, "type": "WORKS_ON"})]
For Neo4j Enterprise users with multiple databases, you can specify which database to connect to:
{ "env": { "NEO4J_URI": "bolt://localhost:7687", "NEO4J_USERNAME": "neo4j", "NEO4J_PASSWORD": "your-password", "NEO4J_DATABASE": "myCustomDatabase" } }
This will connect to "myCustomDatabase" instead of the default "neo4j" database.
User: "Show me all employees in the Sales department"
Assistant: Let me search for employees in the Sales department.
[LLM uses: search_memories({"query": "Sales department", "depth": 2})]
I found these employees in the Sales department:
- John Smith (Sales Manager)
- Sarah Johnson (Sales Representative)
- Mike Brown (Account Executive)
User: "Create a product called 'Premium Coffee' with price $24.99"
Assistant: I'll create that product for you.
[LLM uses: create_memory({"label": "Product", "properties": {"name": "Premium Coffee", "price": 24.99}})]
Created Premium Coffee product with ID: 456
User: "The Premium Coffee uses beans from our Colombian Supplier"
Assistant: I'll connect Premium Coffee to the Colombian Supplier.
[LLM:
1. search_memories({"query": "Premium Coffee"})
2. search_memories({"query": "Colombian Supplier"})
3. create_connection({"fromMemoryId": 456, "toMemoryId": 789, "type": "SUPPLIED_BY"})]
Connected Premium Coffee to Colombian Supplier
The LLM can handle complex queries by intelligently using the search tools:
User: "Find Ben Weeks"
Assistant: I'll search for memories containing "Ben" or "Weeks".
[LLM uses: search_memories({"query": "Ben Weeks"})]
I found several people matching your search:
- Ben Weeks - Software Engineer at TechCorp (exact match)
- Sarah Ben - Data Scientist at DataCo (contains "Ben")
- John Weeks - Project Manager (contains "Weeks")
The most likely match appears to be Ben Weeks, the Software Engineer.
Note: The search finds ANY word from your query, allowing the LLM to present all potentially relevant results and identify the best match based on context.
User: "What new people have I met in the last week?"
Assistant: I'll search for people added to your memory in the last 7 days.
[LLM calculates the date 7 days ago and uses:
search_memories({
"query": "",
"label": "person",
"since_date": "2024-01-20T00:00:00Z",
"order_by": "created_at DESC"
})]
Here are the new people you've met in the last week:
- Sarah Chen - Met at tech conference on Monday
- Dr. Michael Roberts - New physician, first appointment Tuesday
- Emma Wilson - Joined your project team on Wednesday
- James Park - Coffee meeting about potential collaboration Thursday
User: "What does John do?"
Assistant: I found multiple people named John. Let me show you what I know:
[LLM uses: search_memories({"query": "John", "type": "Person", "depth": 1})]
1. John Doe - Software Engineer at Google
2. John Smith - Sales Manager in Sales Department
3. John Brown - Project Manager on Project Atlas
Which John were you asking about?
User: "What events did I attend last month?"
Assistant: I'll search for event memories and check their dates.
[LLM uses: search_memories({"query": "", "label": "event", "sort_by": "created_at", "sort_order": "desc"})]
[Filters results to last month based on created_at or date properties]
Here are the events you attended last month:
- Tech Innovation Summit (March 5-6) - Keynote speaker
- Team Building Workshop (March 12) - With engineering team
- Client Dinner Meeting (March 18) - Project kickoff with ABC Corp
- WebDev Conference (March 25-27) - Attended 5 sessions on React
The system doesn't enforce strict types - you can create any type of memory that makes sense:
Common Types (lowercase): person, place, organization, project, event, topic, object, animal, plant, food, activity, media, skill, document, meeting, task, habit, health, vehicle, tool, idea, goal
But you can use any type (lowercase): recipe, dream, memory, quote, book, movie, emotion, relationship, appointment, medication, exercise, symptom, payment, contract, etc.
The LLM will intelligently reuse existing types when appropriate to maintain consistency.
The true value of this memory system lies not just in storing individual memories, but in creating connections between them. A knowledge graph becomes exponentially more useful as you build relationships:
Always look for relationships when storing new information:
Bad: Just store "John is a developer"
Good: Store John AND connect him to his company, projects, skills, and colleagues
Use semantic relationship types that capture meaning:
WORKS_AT, MANAGES, KNOWS, LIVES_IN, CREATED, USES, LEARNED_FROM
Add relationship properties for richer context:
create_connection({
"fromMemoryId": 123,
"toMemoryId": 456,
"type": "WORKS_ON",
"properties": {"role": "Lead", "since": "2023-01", "hours_per_week": 20}
})
Think in graphs: When recalling information, use depth > 1 to explore the network:
search_memories({"query": "John", "depth": 3}) // Explores connections up to 3 hops away
Remember: A memory without connections is like a book in a library with no catalog - it exists, but its utility is limited. The more you connect your memories, the more intelligent and useful your knowledge graph becomes.
Run the test suite:
npm test
For interactive testing and debugging, use the MCP Inspector:
# Quick start with environment variables from .env ./run-inspector.sh # Or manually with specific environment variables NEO4J_URI=bolt://localhost:7687 \ NEO4J_USERNAME=neo4j \ NEO4J_PASSWORD=your-password \ npx @modelcontextprotocol/inspector build/index.js
The inspector provides a web UI to:
MIT