Featured

Deploy OpenClaw in 60 seconds — 20% off logoDeploy OpenClaw in 60 seconds — 20% off

Launch OpenClaw on Hostinger in about 60 seconds and keep your agent live 24/7. Our referral link gives you 20% off, no coupon code needed.

Launch on Hostinger
Run your Hermes agent on Hostinger, fully managed logoRun your Hermes agent on Hostinger, fully managed

Launch Hermes on Hostinger in one click, fully managed, no VPS knowledge needed. Use code ZACAARON10 for 10% off.

Launch on Hostinger
Crawl and scrape any site into clean data, 10% off logoCrawl and scrape any site into clean data, 10% off

Firecrawl crawls and scrapes any site into clean markdown for your agent. Get 1,000 free credits, and new users get 10% off their first purchase.

Try Firecrawl free
Your own AI agent, running 24/7 with QwikClaw logoYour own AI agent, running 24/7 with QwikClaw

QwikClaw sets up and runs an always-on OpenClaw agent for you. One click, no config files, no server setup.

Deploy now
One API to scrape, enrich, and extract the internet. logoOne API to scrape, enrich, and extract the internet.

Context.dev gives your agents a single API to scrape, enrich, and extract live web data — no proxies, no parsers, no maintenance.

Start building free
SetupClaw: done-for-you OpenClaw for founders & exec teams logoSetupClaw: done-for-you OpenClaw for founders & exec teams

White-glove OpenClaw for founders and exec teams (4–50+ employees): we install, harden, integrate your tools, and maintain it — secured from day one.

Get it set up for you
SEO data APIs for your agent, $1 free credit logoSEO data APIs for your agent, $1 free credit

DataForSEO gives your agent live access to SERP results, keyword data, backlinks, and on-page SEO data through one API. New accounts get a $1 credit, good for up to 20,000 keyword or backlink lookups.

Try DataForSEO free
Reach 47,000+ AI builders

A flat monthly placement in front of developers actively installing AI tools. No lock-in, cancel anytime.

Advertise here
Unified Dynamic MCP Server logo

Unified Dynamic MCP Server

sasajib/unified-mcp
0 starsApache-2.0Updated 2025-12-23Community

Works with

Claude CodeClaude DesktopCursorVS CodeClineCodex CLIOpenClaw+ any MCP client

Install to Claude Code

This server doesn't publish a one-line install command. Follow the setup in the source repository.

Summary

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.md

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 --remoteFast - 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): ```bash

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:

  1. Search (search_tools) → Find relevant tools → ~50 tokens
  2. Describe (describe_tools) → Get full schemas → ~200 tokens/tool
  3. 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

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:

  1. Install via Claude Code Plugin Marketplace:
   # In Claude Code terminal
   /plugin marketplace add thedotmack/claude-mem
   /plugin install claude-mem
  1. Restart Claude Code - The plugin auto-starts the HTTP API on http://localhost:37777
  1. Verify Installation:
   # Check the service is running
   curl http://localhost:37777

   # Or visit the web UI
   open http://localhost:37777
  1. 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, core directories)
  • No manual setup required - just install Codanna and start the server
  • 🔄 Optional file watching - enable watch_changes: true in config/catalog.yaml to 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): ``bash claude mcp add --transport stdio \ unified-mcp \ -- uv --directory /absolute/path/to/unified-mcp run server.py ``

With Graphiti + Google Gemini: ``bash 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: ``bash 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: ``bash 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): ``bash 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): ``bash 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 tools
  • describe_tools([names]) - Get full schemas
  • execute_tool(name, args) - Run a tool

Capability Management:

  • list_capabilities() - See all capabilities
  • enable_capability(name) - Enable at runtime
  • disable_capability(name) - Disable at runtime

Code Understanding (Codanna - Phase 2):

  • search_code - Semantic code search
  • get_call_graph - Function relationships
  • find_symbol - Symbol lookup (sub-10ms)
  • find_implementations - Find implementations

Documentation (Context7 - Phase 3):

  • resolve_library_id - Resolve library name
  • get_library_docs - Fetch documentation

Browser Automation (Playwright - Phase 3):

  • playwright_navigate - Navigate to URL
  • playwright_screenshot - Take screenshot
  • playwright_click - Click element
  • playwright_fill - Fill form field
  • playwright_evaluate - Execute JavaScript

Memory (Claude-mem - Phase 4):

  • mem_search - Search observations
  • mem_get_observation - Get by ID
  • mem_recent_context - Recent sessions
  • mem_timeline - Timeline view

Knowledge Graph (Graphiti - Phase 4):

  • store_insight - Store knowledge
  • search_insights - Search insights
  • query_graph - Cypher queries
  • add_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

See related servers & alternatives →

Related MCP servers

Browse all →

Related guides

Hand-picked reading to help you choose and use Vector & Memory servers.