11 KiB
Complete Setup Guide: Graphiti MCP + LibreChat + Neo4j on Unraid
Prerequisites
- LibreChat running in Docker on Unraid
- Neo4j Docker container running on Unraid
- OpenAI API key (or other LLM provider)
- Access to your Unraid Docker network
Step 1: Prepare Graphiti MCP Configuration
1.1 Create a directory on Unraid for Graphiti MCP
mkdir -p /mnt/user/appdata/graphiti-mcp/config
1.2 Create .env file
Create /mnt/user/appdata/graphiti-mcp/.env with your settings:
Neo4j Connection - IMPORTANT: Use your existing Neo4j container details
If your Neo4j container is named "neo4j", use: bolt://neo4j:7687
Replace with your actual container name if different
NEO4J_URI=bolt://YOUR_NEO4J_CONTAINER_NAME:7687 NEO4J_USER=neo4j NEO4J_PASSWORD=YOUR_NEO4J_PASSWORD NEO4J_DATABASE=neo4j
OpenAI Configuration (Required)
OPENAI_API_KEY=sk-your-openai-api-key-here
LLM Model (default: gpt-5-mini)
MODEL_NAME=gpt-5-mini
Concurrency Control - adjust based on your OpenAI tier
Tier 1 (free): 1-2, Tier 2: 5-8, Tier 3: 10-15
SEMAPHORE_LIMIT=10
Group ID for namespacing (optional)
GRAPHITI_GROUP_ID=main
Disable telemetry (optional)
GRAPHITI_TELEMETRY_ENABLED=false
1.3 Create config file
Create /mnt/user/appdata/graphiti-mcp/config/config.yaml:
server: transport: "http" host: "0.0.0.0" port: 8000
llm: provider: "openai" model: "gpt-5-mini" max_tokens: 4096
providers:
openai:
api_key: ${OPENAI_API_KEY}
api_url: ${OPENAI_API_URL:https://api.openai.com/v1}
embedder: provider: "openai" model: "text-embedding-3-small" dimensions: 1536
providers:
openai:
api_key: ${OPENAI_API_KEY}
database: provider: "neo4j"
providers:
neo4j:
uri: ${NEO4J_URI}
username: ${NEO4J_USER}
password: ${NEO4J_PASSWORD}
database: ${NEO4J_DATABASE:neo4j}
use_parallel_runtime: false
graphiti: group_id: ${GRAPHITI_GROUP_ID:main} user_id: ${USER_ID:mcp_user} entity_types: - name: "Preference" description: "User preferences, choices, opinions, or selections" - name: "Requirement" description: "Specific needs, features, or functionality that must be fulfilled" - name: "Procedure" description: "Standard operating procedures and sequential instructions" - name: "Location" description: "Physical or virtual places where activities occur" - name: "Event" description: "Time-bound activities, occurrences, or experiences" - name: "Organization" description: "Companies, institutions, groups, or formal entities" - name: "Document" description: "Information content in various forms" - name: "Topic" description: "Subject of conversation, interest, or knowledge domain" - name: "Object" description: "Physical items, tools, devices, or possessions"
Step 2: Deploy Graphiti MCP on Unraid
You have two options for deploying on Unraid:
Option A: Using Unraid Docker Template (Recommended)
- Go to Docker tab in Unraid
- Click Add Container
- Fill in the following settings:
Basic Settings:
- Name: graphiti-mcp
- Repository: lvarming/graphiti-mcp:latest # Custom build with your changes
- Network Type: bridge (or custom: br0 if you have a custom network)
Port Mappings:
- Container Port: 8000 → Host Port: 8000
Path Mappings:
- Config Path:
- Container Path: /app/mcp/config/config.yaml
- Host Path: /mnt/user/appdata/graphiti-mcp/config/config.yaml
- Access Mode: Read Only
Environment Variables: Add each variable from your .env file: NEO4J_URI=bolt://YOUR_NEO4J_CONTAINER_NAME:7687 NEO4J_USER=neo4j NEO4J_PASSWORD=your_password NEO4J_DATABASE=neo4j OPENAI_API_KEY=sk-your-key-here GRAPHITI_GROUP_ID=main SEMAPHORE_LIMIT=10 CONFIG_PATH=/app/mcp/config/config.yaml PATH=/root/.local/bin:${PATH}
Extra Parameters: --env-file=/mnt/user/appdata/graphiti-mcp/.env
Network: Ensure this container is on the same Docker network as your Neo4j and LibreChat containers.
Option B: Using Docker Compose
Create /mnt/user/appdata/graphiti-mcp/docker-compose.yml:
version: '3.8'
services: graphiti-mcp: image: lvarming/graphiti-mcp:latest # Custom build with your changes container_name: graphiti-mcp restart: unless-stopped env_file: - .env environment: - NEO4J_URI=${NEO4J_URI} - NEO4J_USER=${NEO4J_USER} - NEO4J_PASSWORD=${NEO4J_PASSWORD} - NEO4J_DATABASE=${NEO4J_DATABASE:-neo4j} - GRAPHITI_GROUP_ID=${GRAPHITI_GROUP_ID:-main} - SEMAPHORE_LIMIT=${SEMAPHORE_LIMIT:-10} - CONFIG_PATH=/app/mcp/config/config.yaml - PATH=/root/.local/bin:${PATH} volumes: - ./config/config.yaml:/app/mcp/config/config.yaml:ro ports: - "8000:8000" networks: - unraid_network # Replace with your network name
networks: unraid_network: external: true # Use existing Unraid network
Then run: cd /mnt/user/appdata/graphiti-mcp docker-compose up -d
Step 3: Configure Docker Networking
Find Your Neo4j Container Name
docker ps | grep neo4j
The container name will be something like neo4j or neo4j-community. Use this exact name in your NEO4J_URI.
Ensure Same Network
All three containers (Neo4j, Graphiti MCP, LibreChat) should be on the same Docker network.
Check which network your Neo4j is on: docker inspect YOUR_NEO4J_CONTAINER_NAME | grep NetworkMode
Connect Graphiti MCP to the same network: docker network connect NETWORK_NAME graphiti-mcp
Step 4: Configure LibreChat
4.1 Add Graphiti MCP to LibreChat's librechat.yaml
Edit your LibreChat configuration file (usually /mnt/user/appdata/librechat/librechat.yaml):
... existing LibreChat config ...
Add MCP server configuration
mcpServers: graphiti-memory: url: "http://graphiti-mcp:8000/mcp/" # For multi-user support with user-specific graphs server_instructions: | You have access to a knowledge graph memory system through Graphiti.
IMPORTANT USAGE GUIDELINES:
1. Always search existing knowledge before adding new information
2. Use entity type filters: Preference, Procedure, Requirement
3. Store new information immediately using add_memory
4. Follow discovered procedures and respect preferences
Available tools:
- add_episode: Store new conversations/information
- search_nodes: Find entities and summaries
- search_facts: Find relationships between entities
- get_episodes: Retrieve recent conversations
# Optional: Hide from chat menu (agent-only access)
# chatMenu: false
# Optional: User-specific group IDs for isolation
# This requires configuring Graphiti to accept dynamic group_id
# user_headers:
# X-User-ID: "{{LIBRECHAT_USER_ID}}"
# X-User-Email: "{{LIBRECHAT_USER_EMAIL}}"
4.2 For Production: Use Streamable HTTP
According to LibreChat docs, for multi-user deployments, ensure the transport is HTTP (which is already default for Graphiti MCP).
4.3 Restart LibreChat
docker restart YOUR_LIBRECHAT_CONTAINER_NAME
Step 5: Test the Setup
5.1 Verify Graphiti MCP is Running
curl http://YOUR_UNRAID_IP:8000/health
You should see a health status response.
5.2 Test Neo4j Connection
Check Graphiti MCP logs: docker logs graphiti-mcp
Look for successful Neo4j connection messages.
5.3 Test in LibreChat
- Open LibreChat in your browser
- Start a new chat
- In an agent configuration, you should see graphiti-memory available
- Try asking the agent to remember something: Please remember that I prefer dark mode for all interfaces
- Then later ask: What do you know about my preferences?
Step 6: Advanced Configuration (Optional)
Per-User Graph Isolation
To give each LibreChat user their own knowledge graph, you need to:
- Modify Graphiti MCP to accept dynamic group_id from headers
- Update LibreChat config to send user info:
mcpServers: graphiti-memory: url: "http://graphiti-mcp:8000/mcp/" user_headers: X-User-ID: "{{LIBRECHAT_USER_ID}}" X-User-Email: "{{LIBRECHAT_USER_EMAIL}}"
This requires custom modification of Graphiti MCP to read the X-User-ID header and use it as the group_id.
Using Different LLM Providers
If you want to use Claude or other providers instead of OpenAI, update config.yaml:
llm: provider: "anthropic" model: "claude-sonnet-4-5-latest"
providers:
anthropic:
api_key: ${ANTHROPIC_API_KEY}
And add ANTHROPIC_API_KEY to your .env file.
Troubleshooting
Graphiti MCP Can't Connect to Neo4j
- Issue: Connection refused or timeout
- Solution:
- Verify Neo4j container name: docker ps | grep neo4j
- Use exact container name in NEO4J_URI: bolt://container_name:7687
- Ensure both containers are on same Docker network
- Check Neo4j is listening on port 7687: docker exec NEO4J_CONTAINER netstat -tlnp | grep 7687
LibreChat Can't See Graphiti Tools
- Issue: Tools not appearing in agent builder
- Solution:
- Check Graphiti MCP is running: curl http://localhost:8000/health
- Verify librechat.yaml syntax is correct
- Restart LibreChat: docker restart librechat
- Check LibreChat logs: docker logs librechat
Rate Limit Errors
- Issue: 429 errors from OpenAI
- Solution: Lower SEMAPHORE_LIMIT in .env (try 5 or lower)
Memory/Performance Issues
- Issue: Slow responses or high memory usage
- Solution:
- Adjust Neo4j memory in your Neo4j container settings
- Reduce SEMAPHORE_LIMIT to lower concurrent processing
⏺ Quick Start Summary
Building Your Custom Docker Image:
This setup uses a custom Docker image built from YOUR fork with YOUR changes. The image is automatically built by GitHub Actions and pushed to Docker Hub.
Setup Steps:
- Fork the graphiti repository to your GitHub account
- Add Docker Hub credentials to your repository secrets:
- Go to Settings → Secrets and variables → Actions
- Add secret: DOCKERHUB_TOKEN (your Docker Hub access token)
- Push changes to trigger automatic build, or manually trigger from Actions tab
- Image will be available at: lvarming/graphiti-mcp:latest
Key Points:
- Docker Image: Use lvarming/graphiti-mcp:latest (your custom build)
- Port: Expose 8000 for HTTP transport
- Neo4j Connection: Use bolt://YOUR_NEO4J_CONTAINER_NAME:7687 (container name, not localhost)
- Network: All 3 containers (Neo4j, Graphiti MCP, LibreChat) must be on same Docker network
- LibreChat Config: Add to librechat.yaml under mcpServers with URL: http://graphiti-mcp:8000/mcp/
- Required Env Vars: OPENAI_API_KEY, NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD
The setup gives LibreChat powerful knowledge graph memory capabilities, allowing it to remember user preferences, procedures, and facts across conversations!
Let me know if you need help with any specific step or run into issues during setup.