knowledgegraph-mcp
Version:
MCP server for enabling persistent knowledge storage for Claude through a knowledge graph with multiple storage backends
538 lines (429 loc) • 20.2 kB
Markdown
[](https://mseep.ai/app/n-r-w-knowledgegraph-mcp)
# KnowledgeGraph MCP Server
A simple way to give LLMs persistent memory across conversations. This server lets Claude or vscode remember information about you, your projects, and your preferences using a knowledge graph.
Key Features:
- **Multiple Storage Backends**: PostgreSQL (recommended) or SQLite (local file)
- **Project Separation**: Keep different projects isolated (auto-detected using prompts)
- **Better Search**: Find information with fuzzy search and pagination
## Complete Setup Guide
Follow these steps in order to get the knowledge graph working with Claude:
### Step 1: Choose Your Installation Method
**Option A: NPX (Easiest - No download needed)**
```bash
# Test that it works
npx knowledgegraph-mcp --help
```
**Option B: Docker**
```bash
# Clone and build
git clone https://github.com/n-r-w/knowledgegraph-mcp.git
cd knowledgegraph-mcp
docker build -t knowledgegraph-mcp .
```
### Step 2: Choose Your Database
**SQLite (Default - No setup needed):**
- No database installation required
- Database file created automatically in `[you home folder]/.knowledge-graph/`
- Perfect for personal use and most scenarios
- **This is the default backend**
**PostgreSQL (For advanced users):**
- Install PostgreSQL on your system
- Create a database: `CREATE DATABASE knowledgegraph;`
- Better for production use with multiple concurrent users
### Step 3: Configure client
#### Claude Desktop
Edit your Claude Desktop configuration file:
**Find your config file:**
- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`
**If you chose NPX + SQLite (default and easiest):**
```json
{
"mcpServers": {
"Knowledge Graph": {
"command": "npx",
"args": ["-y", "knowledgegraph-mcp"]
}
}
}
```
> **Note**: SQLite will automatically create the database in `[you home folder]/.knowledge-graph/knowledgegraph.db`. To use a custom location, add: `"KNOWLEDGEGRAPH_SQLITE_PATH": "/path/to/your/database.db"`
**If you chose Docker + SQLite (default):**
```json
{
"mcpServers": {
"Knowledge Graph": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-v", "[you home folder]/.knowledge-graph:/app/.knowledge-graph",
"knowledgegraph-mcp"
]
}
}
}
```
> **Note**: The volume mount ensures your data persists between Docker runs. For custom paths, add: `-e KNOWLEDGEGRAPH_SQLITE_PATH=/app/.knowledge-graph/custom.db`
**If you chose PostgreSQL:**
```json
{
"mcpServers": {
"Knowledge Graph": {
"command": "npx",
"args": ["-y", "knowledgegraph-mcp"],
"env": {
"KNOWLEDGEGRAPH_STORAGE_TYPE": "postgresql",
"KNOWLEDGEGRAPH_CONNECTION_STRING": "postgresql://postgres:yourpassword@localhost:5432/knowledgegraph"
}
}
}
}
```
#### VS Code
If you also want to use this with VS Code, add this to your User Settings (JSON) or create `.vscode/mcp.json`:
**Using NPX + SQLite (default):**
```json
{
"mcp": {
"servers": {
"Knowledge Graph": {
"command": "npx",
"args": ["-y", "knowledgegraph-mcp"],
}
}
}
}
```
**Using Docker (default SQLite):**
```json
{
"mcp": {
"servers": {
"Knowledge Graph": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "KNOWLEDGEGRAPH_CONNECTION_STRING=sqlite://./knowledgegraph.db",
"knowledgegraph-mcp"
]
}
}
}
}
```
**Using Docker + PostgreSQL:**
First, ensure your PostgreSQL database is set up:
```bash
# Create the database (run this once)
psql -h 127.0.0.1 -p 5432 -U postgres -c "CREATE DATABASE knowledgegraph;"
```
Then configure VS Code:
```json
{
"mcp": {
"servers": {
"Knowledge Graph": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--network", "host",
"-e", "KNOWLEDGEGRAPH_STORAGE_TYPE=postgresql",
"-e", "KNOWLEDGEGRAPH_CONNECTION_STRING=postgresql://postgres:yourpassword@127.0.0.1:5432/knowledgegraph",
"knowledgegraph-mcp"
]
}
}
}
}
```
**Alternative Docker + PostgreSQL (if `--network host` doesn't work):**
```json
{
"mcp": {
"servers": {
"Knowledge Graph": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--add-host", "host.docker.internal:host-gateway",
"-e", "KNOWLEDGEGRAPH_STORAGE_TYPE=postgresql",
"-e", "KNOWLEDGEGRAPH_CONNECTION_STRING=postgresql://postgres:yourpassword@host.docker.internal:5432/knowledgegraph",
"knowledgegraph-mcp"
]
}
}
}
}
```
> **Important Notes**:
> - Replace `yourpassword` with your actual PostgreSQL password
> - Ensure the `knowledgegraph` database exists before starting
> - If you get connection errors, try the alternative configuration above
> - For troubleshooting Docker + PostgreSQL issues, see the [Common Issues](#common-issues) section
### Step 4: Choose Your LLM System Prompts
**Customization:**
- Modify entity types based on your domain
- Adjust search strategies for your data patterns
- Add domain-specific tags and relation types
**LLM Compatibility:**
- All LLMs behave differently. For some, general instructions are enough, while others need to describe everything in detail
- Use LLM to explain why it didn't use the knowledge graph. Ask `Explain STEP-BY-STEP why you didn't use the knowledge graph? DO NOT DO ANYTHING ELSE` to get a detailed report and identify issues with the instructions.
**Available Prompts:**
- [Knowledge Graph](prompts/knowledge-graph.md)
- [Task Management](prompts/task-management.md)
- [Code Quality](prompts/code-quality.md)
- [All-in-One](prompts/all-in-one.md)
- [Maintenance knowledge graph](prompts/maintenance.md)
### Step 5: Restart Claude Desktop (or VS Code)
Close and reopen Claude Desktop. You should now see "Knowledge Graph" in your available tools.
### Step 6: Test It Works
**Quick Test Commands for LLMs:**
1. "Remember that I prefer morning meetings" → Creates preference entity
2. "John Smith works at Google as a software engineer" → Creates person + company + relation
3. "Find all people who work at Google" → Tests search and relations
4. "Mark the morning meetings preference as urgent" → Tests tagging
> **Note**: The service includes comprehensive input validation to prevent errors. If you encounter any issues, check the [Troubleshooting Guide](docs/TROUBLESHOOTING.md) for common solutions.
## How It Works - LLM Power Features
The knowledge graph enables powerful queries through four interconnected concepts:
### 1. Entities - Your Knowledge Nodes
Store people, projects, companies, technologies as searchable entities.
**Real Example - Project Management:**
```json
{
"name": "Sarah_Chen",
"entityType": "person",
"observations": ["Senior React developer", "Leads frontend team", "Available for urgent tasks"],
"tags": ["developer", "team-lead", "available"]
}
```
**LLM Benefit:** Find "all available team leads" instantly with tag search.
### 2. Relations - Enable Discovery Queries
Connect entities to answer complex questions like "Who works on what?"
**Real Example - Team Structure:**
```json
{
"from": "Sarah_Chen",
"to": "Project_Alpha",
"relationType": "leads"
}
```
**LLM Benefit:** Query "Find all projects Sarah leads" or "Who leads Project Alpha?"
### 3. Observations - Atomic Facts
Store specific, searchable facts about entities.
**Real Examples - Actionable Information:**
- "Available for urgent tasks" → Find available people
- "Uses React 18.2" → Find projects with specific tech
- "Deadline: March 15, 2024" → Find upcoming deadlines
### 4. Tags - Instant Filtering
Enable immediate status and category searches.
**Real Examples - Project Workflow:**
- `["urgent", "in-progress", "frontend"]` → Find urgent frontend tasks
- `["completed", "bug-fix"]` → Track completed bug fixes
- `["available", "senior"]` → Find available senior staff
## Configuration Options
### Environment Variables
The server supports several environment variables for customization:
#### Database Configuration
- `KNOWLEDGEGRAPH_STORAGE_TYPE`: Database type (`sqlite` or `postgresql`, default: `sqlite`)
- `KNOWLEDGEGRAPH_CONNECTION_STRING`: Database connection string
- `KNOWLEDGEGRAPH_SQLITE_PATH`: Custom SQLite database path (optional)
- `KNOWLEDGEGRAPH_PROJECT`: Project identifier for data isolation (default: `knowledgegraph_default_project`)
#### Search Configuration
- `KNOWLEDGEGRAPH_SEARCH_MAX_RESULTS`: Maximum number of results to return from database searches (default: `100`, max: `1000`)
- `KNOWLEDGEGRAPH_SEARCH_BATCH_SIZE`: Batch size for processing large query arrays (default: `10`, max: `50`)
- `KNOWLEDGEGRAPH_SEARCH_MAX_CLIENT_ENTITIES`: Maximum number of entities to load for client-side search (default: `10000`, max: `100000`)
- `KNOWLEDGEGRAPH_SEARCH_CLIENT_CHUNK_SIZE`: Chunk size for processing large datasets in client-side search (default: `1000`, max: `10000`)
> **Note**: Search limits are automatically validated and clamped to safe ranges to prevent performance issues.
#### Performance Optimization
The search system includes several performance optimizations:
**Entity Loading Limits:**
- `KNOWLEDGEGRAPH_SEARCH_MAX_CLIENT_ENTITIES` limits how many entities are loaded for client-side search
- Prevents memory issues with large datasets
- Warning logged when limit is reached
- Applies to both SQLite and PostgreSQL backends
**Chunked Processing:**
- `KNOWLEDGEGRAPH_SEARCH_CLIENT_CHUNK_SIZE` controls chunk size for large entity sets
- Automatically used when entity count exceeds chunk size
- Improves memory usage and search performance
- Maintains result accuracy with deduplication
**Recommended Values by Dataset Size:**
- **Small (< 1,000 entities)**: Default values work well
- **Medium (1,000 - 10,000 entities)**: Consider `KNOWLEDGEGRAPH_SEARCH_MAX_CLIENT_ENTITIES=5000`, `KNOWLEDGEGRAPH_SEARCH_CLIENT_CHUNK_SIZE=500`
- **Large (> 10,000 entities)**: Use database-level search when possible, or `KNOWLEDGEGRAPH_SEARCH_MAX_CLIENT_ENTITIES=2000`, `KNOWLEDGEGRAPH_SEARCH_CLIENT_CHUNK_SIZE=200`
**Performance Monitoring:**
- Warnings logged when limits are applied
- Chunking automatically logged for transparency
- Configuration validation prevents suboptimal settings
## Available Tools
The server provides these tools for managing your knowledge graph:
### Data Creation Tools
#### create_entities
**CREATE** new entities (people, concepts, objects) in knowledge graph.
- **WHEN:** Use for entities that don't exist yet
- **CONSTRAINT:** Each entity MUST have ≥1 non-empty observation
- **BEHAVIOR:** Ignores entities with existing names (use add_observations to update)
**Input:**
- `entities` (Entity[]): Array of entity objects. Each REQUIRES:
- `name` (string): Unique identifier, non-empty
- `entityType` (string): Category (e.g., 'person', 'project'), non-empty
- `observations` (string[]): Facts about entity, MUST contain ≥1 non-empty string
- `tags` (string[], optional): Exact-match labels for filtering
- `project_id` (string, optional): Project name to isolate data
#### create_relations
**CONNECT** entities to enable powerful queries and discovery.
- **IMMEDIATE BENEFITS:** Find all people at a company, all projects using a technology, all dependencies
- **CRITICAL FOR:** Team structures, project dependencies, technology stacks
- **EXAMPLES:** 'John works_at Google', 'React depends_on JavaScript', 'Project_Alpha managed_by Sarah'
**Input:**
- `relations` (Relation[]): Array of relationship objects. Each REQUIRES:
- `from` (string): Source entity name (must exist)
- `to` (string): Target entity name (must exist)
- `relationType` (string): Relationship type in active voice (works_at, manages, depends_on, uses)
- `project_id` (string, optional): Project name to isolate data
#### add_observations
**ADD** factual observations to existing entities.
- **REQUIREMENT:** Target entity must exist, ≥1 non-empty observation per update
- **BEST PRACTICE:** Keep observations atomic and specific
**Input:**
- `observations` (ObservationUpdate[]): Array of observation updates. Each REQUIRES:
- `entityName` (string): Target entity name (must exist)
- `observations` (string[]): New facts to add, MUST contain ≥1 non-empty string
- `project_id` (string, optional): Project name to isolate data
#### add_tags
**ADD** status/category tags for INSTANT filtering.
- **IMMEDIATE BENEFIT:** Find entities by status (urgent, completed, in-progress) or type (technical, personal)
- **REQUIRED:** For efficient project management and quick retrieval
- **EXAMPLES:** ['urgent', 'completed', 'bug', 'feature', 'personal']
**Input:**
- `updates` (TagUpdate[]): Array of tag updates. Each REQUIRES:
- `entityName` (string): Target entity name (must exist)
- `tags` (string[]): Status/category tags to add (exact-match, case-sensitive)
- `project_id` (string, optional): Project name to isolate data
### Data Retrieval Tools
#### read_graph
**RETRIEVE** complete knowledge graph with all entities and relationships.
- **USE CASE:** Full overview, understanding current state, seeing all connections
- **SCOPE:** Returns everything in specified project
**Input:**
- `project_id` (string, optional): Project name to isolate data
#### search_knowledge
**SEARCH** entities by text or tags. **SUPPORTS MULTIPLE QUERIES** for batch searching.
- **MANDATORY STRATEGY:** 1) Try searchMode='exact' first 2) If no results, use searchMode='fuzzy' 3) If still empty, lower fuzzyThreshold to 0.1
- **EXACT MODE:** Perfect substring matches (fast, precise)
- **FUZZY MODE:** Similar/misspelled terms (slower, broader)
- **TAG SEARCH:** Use exactTags for precise category filtering
- **MULTIPLE QUERIES:** Search for multiple objects in one call with automatic deduplication
**Input:**
- `query` (string | string[], optional): Search query for text search. Can be a single string or array of strings for multiple object search. OPTIONAL when exactTags is provided for tag-only searches.
- `searchMode` (string, optional): "exact" or "fuzzy" (default: "exact"). Use fuzzy only if exact returns no results
- `fuzzyThreshold` (number, optional): Fuzzy similarity threshold. 0.3=default, 0.1=very broad, 0.7=very strict. Lower values find more results
- `exactTags` (string[], optional): Tags for exact-match searching (case-sensitive). Use for category filtering
- `tagMatchMode` (string, optional): For exactTags: "any"=entities with ANY tag, "all"=entities with ALL tags (default: "any")
- `page` (number, optional): Page number for pagination (0-based, default: 0)
- `pageSize` (number, optional): Number of results per page (1-1000, default: 50)
- `project_id` (string, optional): Project name to isolate data
**Examples:**
- Basic search: `search_knowledge(query="JavaScript", searchMode="exact")`
- Paginated search: `search_knowledge(query="React", page=0, pageSize=20)`
- Large dataset: `search_knowledge(query="components", page=2, pageSize=100)`
- Multiple queries: `search_knowledge(query=["JavaScript", "React"], page=0, pageSize=30)`
- Tag + pagination: `search_knowledge(query="React", exactTags=["frontend"], page=1, pageSize=25)`
- Tag-only search: `search_knowledge(exactTags=["urgent", "bug"], tagMatchMode="all")` - NO QUERY NEEDED
**Pagination Benefits:**
- **Performance**: Database-level pagination with OFFSET/LIMIT for efficient large dataset handling
- **Memory**: Reduces memory usage by limiting results per request
- **Navigation**: Pagination metadata provides totalPages, currentPage, and navigation hints
- **Scalability**: Handles knowledge graphs with thousands of entities efficiently
#### open_nodes
**RETRIEVE** specific entities by exact names with their interconnections.
- **RETURNS:** Requested entities plus relationships between them
- **USE CASE:** When you know exact entity names and want detailed info
**Input:**
- `names` (string[]): Array of entity names to retrieve
- `project_id` (string, optional): Project name to isolate data
### Data Management Tools
#### delete_entities
**PERMANENTLY DELETE** entities and all their relationships.
- **WARNING:** Cannot be undone, cascades to remove all connections
- **USE CASE:** Entities no longer relevant or created in error
**Input:**
- `entityNames` (string[]): Array of entity names to delete
- `project_id` (string, optional): Project name to isolate data
#### delete_observations
**REMOVE** specific observations from entities while keeping entities intact.
- **USE CASE:** Correct misinformation or remove obsolete details
- **PRESERVATION:** Entity and other observations remain unchanged
**Input:**
- `deletions` (ObservationDeletion[]): Array of deletion requests. Each REQUIRES:
- `entityName` (string): Target entity name
- `observations` (string[]): Specific observations to remove
- `project_id` (string, optional): Project name to isolate data
#### delete_relations
**UPDATE** relationship structure when connections change.
- **CRITICAL FOR:** Job changes (remove old 'works_at'), project completion (remove 'assigned_to'), technology migration (remove old 'uses')
- **MAINTAINS:** Accurate network structure and prevents confusion
- **WORKFLOW:** Always remove outdated relations when creating new ones
**Input:**
- `relations` (Relation[]): Array of relations to delete. Each REQUIRES:
- `from` (string): Source entity name
- `to` (string): Target entity name
- `relationType` (string): Exact relationship type to remove
- `project_id` (string, optional): Project name to isolate data
#### remove_tags
**UPDATE** entity status by removing outdated tags.
- **CRITICAL:** For status tracking - remove 'in-progress' when completed, 'urgent' when resolved
- **MAINTAINS:** Clean search results and accurate status
- **WORKFLOW:** Always remove old status tags when adding new ones
**Input:**
- `updates` (TagUpdate[]): Array of tag removal requests. Each REQUIRES:
- `entityName` (string): Target entity name
- `tags` (string[]): Outdated tags to remove (exact-match, case-sensitive)
- `project_id` (string, optional): Project name to isolate data
## Development and Testing
### Multi-Backend Testing
This project includes comprehensive multi-backend testing to ensure compatibility across both SQLite and PostgreSQL:
**Run tests against both backends:**
```bash
npm run test:multi-backend
```
**Run all tests (original + multi-backend):**
```bash
npm run test:all-backends
```
**Using Taskfile (if installed):**
```bash
task test:multi-backend
task test:comprehensive
```
### Development Setup
**Clone and setup:**
```bash
git clone https://github.com/n-r-w/knowledgegraph-mcp.git
cd knowledgegraph-mcp
npm install
npm run build
```
**Run tests:**
```bash
npm test # All tests including multi-backend
npm run test:unit # Unit tests only
npm run test:performance # Performance benchmarks
```
## Troubleshooting
If you encounter any issues during setup or usage, please refer to our comprehensive [Troubleshooting Guide](docs/TROUBLESHOOTING.md), which covers:
- Input validation errors
- Database connection problems
- Configuration issues
- Docker-related challenges
- Test execution failures
- Performance optimization
The guide includes step-by-step solutions for common problems and diagnostic commands to help identify issues.
## Based on MCP Memory Server
This is an enhanced version of the official [MCP Memory Server](https://github.com/modelcontextprotocol/servers/blob/main/src/memory/README.md) with additional features:
- **Multiple Storage Options**: PostgreSQL (recommended) or SQLite (local file)
- **Project Separation**: Keep different projects isolated
- **Better Search**: Find information with fuzzy search
- **Easy Setup**: Docker support and simple installation
## License
MIT License - Feel free to use, modify, and distribute this software.