Unified Dynamic MCP Server
Consolidates code understanding, documentation, browser automation, memory, and knowledge graph into a single MCP server with progressive discovery for up to 98% token reduction.
README
Unified Dynamic MCP Server
Single MCP server with progressive discovery for 96-160x token reduction
Consolidates code understanding (Codanna), documentation (Context7), browser automation (Playwright), memory (Claude-mem), and knowledge graph (Graphiti+LadybugDB) into one unified server.
✨ NEW: Graphiti knowledge graph now supports Google Gemini! Use free Gemini API with embedded LadybugDB (no Docker required).
Features
✨ Progressive Discovery - 3-step pattern reduces tokens from 10,000+ to 50-200
🔧 Dynamic Tool Loading - Lazy load capabilities only when needed
🎯 5 Integrated Capabilities - Code, docs, browser, memory, knowledge graph
🚀 Git Submodules - Auto-update with git submodule update --remote
⚡ Fast - Sub-10ms symbol lookup (Codanna), embedded LadybugDB (no Docker)
Quick Start
# 1. Clone with submodules
git clone --recursive https://github.com/yourusername/unified-mcp.git
cd unified-mcp
# 2. Install dependencies (using uv - recommended)
uv pip install -r requirements.txt
# 3. Install Claude-mem plugin (required for memory capability)
# In Claude Code terminal:
/plugin marketplace add thedotmack/claude-mem
/plugin install claude-mem
# Then restart Claude Code
# 4. Add to Claude Code (replace /path/to/unified-mcp with actual path)
claude mcp add --transport stdio \
unified-mcp \
-- uv --directory /absolute/path/to/unified-mcp run server.py
# 5. For Graphiti + Google Gemini support (optional)
claude mcp add --transport stdio unified-mcp \
-e GRAPHITI_ENABLED=true \
-e GRAPHITI_LLM_PROVIDER=google_ai \
-e GRAPHITI_EMBEDDER_PROVIDER=google_ai \
-e GOOGLE_API_KEY=your-gemini-api-key-here \
-e GRAPHITI_LLM_MODEL=gemini-1.5-pro \
-e GRAPHITI_EMBEDDER_MODEL=text-embedding-004 \
-- uv --directory /absolute/path/to/unified-mcp run server.py
# 6. Restart Claude Code and verify
# Ask Claude: "What tools do you have available?"
Manual Testing (optional):
# Run tests
pytest tests/ -v
# Start server directly
uv run server.py
Progressive Discovery Pattern
Traditional approach: Load all 20 tools upfront = 10,000 tokens
Our approach:
- Search (
search_tools) → Find relevant tools → ~50 tokens - Describe (
describe_tools) → Get full schemas → ~200 tokens/tool - Execute (
execute_tool) → Run the tool → Variable
Result: 98% token reduction 🎉
Architecture
Unified MCP Server
├── Progressive Discovery Engine
├── Dynamic Tool Registry
├── 5 Capability Modules
│ ├── Codanna (code understanding)
│ ├── Context7 (documentation)
│ ├── Playwright (browser automation)
│ ├── Claude-mem (memory)
│ └── Graphiti+LadybugDB (knowledge graph)
Installation
Requirements
- Python 3.12+ (for LadybugDB)
- Rust/Cargo (for Codanna) - Install Rust
- Node.js 18+ (for Context7/Playwright) - Install Node
- Claude Code (for Claude-mem plugin) - Install Claude Code
Claude-Mem Setup (Memory Capability)
Important: Claude-mem is a separate MCP server that runs as a Claude Code plugin. It must be installed before the unified-mcp memory capability will work.
Installation Steps:
-
Install via Claude Code Plugin Marketplace:
# In Claude Code terminal /plugin marketplace add thedotmack/claude-mem /plugin install claude-mem -
Restart Claude Code - The plugin auto-starts the HTTP API on
http://localhost:37777 -
Verify Installation:
# Check the service is running curl http://localhost:37777 # Or visit the web UI open http://localhost:37777 -
Troubleshooting:
# Use the built-in troubleshooting skill /claude-mem:troubleshoot
What Gets Installed:
- HTTP API service on port 37777 (auto-managed by Bun)
- SQLite database at
~/.claude-mem/claude-mem.db - Web UI for browsing stored memories
- 5 lifecycle hooks for automatic memory capture
- Vector search via Chroma for semantic queries
Architecture:
- The unified-mcp server connects to claude-mem's HTTP API
- No direct npm installation needed - plugin handles all dependencies
- Auto-starts when Claude Code is running
- Stores observations across sessions with semantic search
For more details, see the claude-mem documentation.
Install Dependencies
# Python dependencies
pip install -r requirements.txt
# Codanna (code understanding)
cargo install codanna --all-features
# Git submodules (for Context7 and Playwright only - claude-mem is a plugin)
git submodule update --init --recursive
cd capabilities/context7 && npm install
cd ../playwright-mcp && npm install
# Note: claude-mem is installed as a Claude Code plugin (see above), not via npm
Codanna Auto-Indexing:
The server automatically creates and manages Codanna indexes:
- ✅ Automatic indexing on first run (indexes
src,lib,handlers,coredirectories) - ✅ No manual setup required - just install Codanna and start the server
- 🔄 Optional file watching - enable
watch_changes: trueinconfig/catalog.yamlto auto-reindex on file changes
To customize auto-indexing, edit config/catalog.yaml:
code_understanding:
auto_index: true # Auto-create index if missing
watch_changes: false # Watch files and re-index (requires watchdog)
index_dirs: # Directories to index
- src
- lib
- your-custom-dir
Usage
Start Server
python server.py
Server runs on stdio (MCP protocol).
Configure with Claude Code
Option 1: Using claude mcp add (Recommended)
Replace /absolute/path/to/unified-mcp with your actual installation path.
Basic Configuration (No Graphiti):
claude mcp add --transport stdio \
unified-mcp \
-- uv --directory /absolute/path/to/unified-mcp run server.py
With Graphiti + Google Gemini:
claude mcp add --transport stdio unified-mcp \
-e GRAPHITI_ENABLED=true \
-e GRAPHITI_LLM_PROVIDER=google_ai \
-e GRAPHITI_EMBEDDER_PROVIDER=google_ai \
-e GOOGLE_API_KEY=your-gemini-api-key-here \
-e GRAPHITI_LLM_MODEL=gemini-1.5-pro \
-e GRAPHITI_EMBEDDER_MODEL=text-embedding-004 \
-- uv --directory /absolute/path/to/unified-mcp run server.py
With Graphiti + OpenAI:
claude mcp add --transport stdio unified-mcp \
-e GRAPHITI_ENABLED=true \
-e GRAPHITI_LLM_PROVIDER=openai \
-e GRAPHITI_EMBEDDER_PROVIDER=openai \
-e OPENAI_API_KEY=sk-your-openai-key-here \
-e GRAPHITI_LLM_MODEL=gpt-4o \
-e GRAPHITI_EMBEDDER_MODEL=text-embedding-3-small \
-- uv --directory /absolute/path/to/unified-mcp run server.py
With Graphiti + Anthropic Claude + Voyage Embeddings:
claude mcp add --transport stdio unified-mcp \
-e GRAPHITI_ENABLED=true \
-e GRAPHITI_LLM_PROVIDER=anthropic \
-e GRAPHITI_EMBEDDER_PROVIDER=voyage_ai \
-e ANTHROPIC_API_KEY=sk-ant-your-key-here \
-e VOYAGE_API_KEY=pa-your-voyage-key-here \
-e GRAPHITI_LLM_MODEL=claude-3-5-sonnet-20241022 \
-e GRAPHITI_EMBEDDER_MODEL=voyage-3 \
-- uv --directory /absolute/path/to/unified-mcp run server.py
With Graphiti + Local Ollama (Free):
claude mcp add --transport stdio unified-mcp \
-e GRAPHITI_ENABLED=true \
-e GRAPHITI_LLM_PROVIDER=ollama \
-e GRAPHITI_EMBEDDER_PROVIDER=ollama \
-e OLLAMA_BASE_URL=http://localhost:11434 \
-e GRAPHITI_LLM_MODEL=llama3.1 \
-e GRAPHITI_EMBEDDER_MODEL=nomic-embed-text \
-- uv --directory /absolute/path/to/unified-mcp run server.py
Full Configuration Example (All Options):
claude mcp add --transport stdio unified-mcp \
-e CODANNA_INDEX_DIR=.codanna \
-e CLAUDE_MEM_API_URL=http://localhost:37777 \
-e GRAPHITI_ENABLED=true \
-e GRAPHITI_LLM_PROVIDER=google_ai \
-e GRAPHITI_EMBEDDER_PROVIDER=google_ai \
-e GOOGLE_API_KEY=your-gemini-api-key-here \
-e GRAPHITI_LLM_MODEL=gemini-1.5-pro \
-e GRAPHITI_EMBEDDER_MODEL=text-embedding-004 \
-e GRAPHITI_DB_PATH=.graphiti/ladybug.db \
-- uv --directory /absolute/path/to/unified-mcp run server.py
Option 2: Manual Configuration
Add to your MCP settings file (~/.config/claude/mcp_settings.json):
{
"mcpServers": {
"unified-mcp": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/unified-mcp",
"run",
"server.py"
],
"env": {
"CODANNA_INDEX_DIR": "${workspaceFolder}/.codanna",
"CLAUDE_MEM_API_URL": "http://localhost:37777",
"GRAPHITI_ENABLED": "true",
"GOOGLE_API_KEY": "your-gemini-api-key-here"
}
}
}
}
With Graphiti + Google Gemini (Full Configuration):
{
"mcpServers": {
"unified-mcp": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/unified-mcp",
"run",
"server.py"
],
"env": {
"CODANNA_INDEX_DIR": "${workspaceFolder}/.codanna",
"CLAUDE_MEM_API_URL": "http://localhost:37777",
"GRAPHITI_ENABLED": "true",
"GRAPHITI_LLM_PROVIDER": "google_ai",
"GRAPHITI_EMBEDDER_PROVIDER": "google_ai",
"GOOGLE_API_KEY": "your-gemini-api-key-here",
"GRAPHITI_LLM_MODEL": "gemini-1.5-pro",
"GRAPHITI_EMBEDDER_MODEL": "text-embedding-004"
}
}
}
}
Environment Variables:
| Variable | Required | Default | Description |
|---|---|---|---|
CODANNA_INDEX_DIR |
No | .codanna |
Codanna index directory |
CLAUDE_MEM_API_URL |
No | http://localhost:37777 |
Claude-mem API endpoint |
GRAPHITI_ENABLED |
No | false |
Enable Graphiti knowledge graph |
GRAPHITI_LLM_PROVIDER |
No | openai |
LLM provider: openai, anthropic, azure_openai, ollama, google_ai |
GRAPHITI_EMBEDDER_PROVIDER |
No | openai |
Embedder: openai, voyage_ai, azure_openai, ollama, google_ai |
GRAPHITI_LLM_MODEL |
No | (varies) | Model name (e.g., gemini-2.5-flash, gpt-4o, claude-3-5-sonnet-20241022) |
GRAPHITI_EMBEDDER_MODEL |
No | (varies) | Embedder model (e.g., text-embedding-004, text-embedding-3-small) |
GRAPHITI_RERANKER_MODEL |
No | gemini-2.5-flash-lite |
Reranker model (Gemini only) |
GOOGLE_API_KEY |
If using Gemini | - | Google AI API key for Gemini |
OPENAI_API_KEY |
If using OpenAI | - | OpenAI API key |
ANTHROPIC_API_KEY |
If using Claude | - | Anthropic API key |
Playwright Browser Configuration:
Browser automation runs with headless=false by default (shows browser window). Configure in config/catalog.yaml:
browser_automation:
headless: false # Set to true to run browser in background
Restart Claude Code to load the server.
Verify it's working:
- Ask Claude: "What tools do you have available?"
- You should see tools like
search_tools,describe_tools,execute_tool, etc.
Configuration
Edit config/catalog.yaml:
capabilities:
code_understanding:
enabled: true # Toggle capabilities
tools: [search_code, get_call_graph, ...]
Tools Available
Progressive Discovery (Meta-tools):
search_tools(query)- Find relevant toolsdescribe_tools([names])- Get full schemasexecute_tool(name, args)- Run a tool
Capability Management:
list_capabilities()- See all capabilitiesenable_capability(name)- Enable at runtimedisable_capability(name)- Disable at runtime
Code Understanding (Codanna - Phase 2):
search_code- Semantic code searchget_call_graph- Function relationshipsfind_symbol- Symbol lookup (sub-10ms)find_implementations- Find implementations
Documentation (Context7 - Phase 3):
resolve_library_id- Resolve library nameget_library_docs- Fetch documentation
Browser Automation (Playwright - Phase 3):
playwright_navigate- Navigate to URLplaywright_screenshot- Take screenshotplaywright_click- Click elementplaywright_fill- Fill form fieldplaywright_evaluate- Execute JavaScript
Memory (Claude-mem - Phase 4):
mem_search- Search observationsmem_get_observation- Get by IDmem_recent_context- Recent sessionsmem_timeline- Timeline view
Knowledge Graph (Graphiti - Phase 4):
store_insight- Store knowledgesearch_insights- Search insightsquery_graph- Cypher queriesadd_episode- Add episode
Development
Run Tests
# All tests
pytest tests/ -v
# Unit tests only
pytest tests/unit/ -v
# With coverage
pytest tests/ --cov=. --cov-report=term-missing
# Skip slow tests
pytest tests/ -m "not slow"
Project Structure
unified-mcp/
├── server.py # Main MCP server
├── config/
│ └── catalog.yaml # Capability configuration
├── core/
│ ├── dynamic_registry.py
│ ├── progressive_discovery.py
│ └── capability_loader.py
├── handlers/ # Capability handlers
├── capabilities/ # Git submodules
├── tests/ # Comprehensive test suite
└── docs/ # Documentation
Implementation Status
- ✅ Phase 1: Foundation (Dynamic registry, progressive discovery)
- ✅ Phase 2: Codanna integration (4 code understanding tools)
- ✅ Phase 3: Context7 + Playwright (7 tools: docs + browser automation)
- ✅ Phase 4: Claude-mem + Graphiti (8 tools: memory + knowledge graph)
- ✅ Phase 5: Comprehensive testing (Unit + Integration + E2E, 80%+ coverage, CI/CD)
- ✅ Phase 6: Documentation (Complete)
License
Apache 2.0
References
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。