Skip to main content
Glama

MCP Aggregator Server

README.md8.97 kB
# MCP Aggregator Server Unified MCP interface that proxies requests to multiple backend MCP servers. ## Architecture ``` ┌─────────────────────────────────────────────────────────────┐ │ MCP Client │ │ (Claude, IDE, etc.) │ └────────────────────┬────────────────────────────────────────┘ │ │ Connect to single endpoint ▼ ┌─────────────────────────────────────────────────────────────┐ │ Aggregator MCP Server (Port 8003) │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Unified MCP Interface │ │ │ │ - 19 tools total (2 health + 10 memory + 7 vector) │ │ │ │ - Handles routing internally │ │ │ │ - Single /mcp/sse & /mcp/messages endpoint │ │ │ └──────────────────────────────────────────────────────┘ │ └────────┬──────────────────────────────────────────────────┬──┘ │ │ │ HTTP Proxy │ HTTP Proxy ▼ ▼ ┌──────────────────────┐ ┌──────────────────────┐ │ ZepAI Memory Server │ │ LTM Vector Server │ │ (Port 8002) │ │ (Port 8000) │ │ │ │ │ │ - Knowledge Graph │ │ - Vector Database │ │ - Conversation Memory│ │ - Code Indexing │ │ - 10 tools │ │ - 7 tools │ └──────────────────────┘ └──────────────────────┘ ``` ## Features - **Unified Interface**: Single MCP endpoint for all connected servers - **Transparent Proxying**: Automatically routes requests to appropriate backend servers - **Health Monitoring**: Built-in health checks for all connected servers - **Retry Logic**: Automatic retry with exponential backoff for failed requests - **Error Handling**: Comprehensive error handling and logging - **Extensible**: Easy to add new backend servers ## Installation 1. **Install dependencies**: ```bash pip install -r requirements.txt ``` 2. **Configure environment** (edit `.env`): ```env # Aggregator Server AGGREGATOR_HOST=0.0.0.0 AGGREGATOR_PORT=8003 # Memory Server (FastMCP Server) MEMORY_SERVER_URL=http://localhost:8002 MEMORY_SERVER_TIMEOUT=30 # Graph Server (for future use) GRAPH_SERVER_URL=http://localhost:8000 GRAPH_SERVER_TIMEOUT=30 ``` ## Running ### Start all servers in order: **Terminal 1 - LTM Vector Server (Port 8000)**: ```bash cd LTM python mcp_server/server_streamable_http.py ``` **Terminal 2 - ZepAI FastMCP Server (Port 8002)**: ```bash cd ZepAI/fastmcp_server python server_http.py ``` *Note: This automatically loads the Memory Layer and exposes both FastAPI + MCP on port 8002* **Terminal 3 - MCP Aggregator (Port 8003)**: ```bash cd mcp-aggregator python aggregator_server.py ``` **See [START_SERVERS.md](START_SERVERS.md) for detailed startup guide.** ## Available Tools ### Health & Status - `health_check()` - Check health of all connected servers - `get_server_info()` - Get information about connected servers ### Memory Server Tools (Port 8002) #### Search - `memory_search(query, project_id, limit, use_llm_classification)` - Search knowledge graph - `memory_search_code(query, project_id, limit)` - Search code memories #### Ingest - `memory_ingest_text(text, project_id, metadata)` - Ingest plain text - `memory_ingest_code(code, language, project_id, metadata)` - Ingest code - `memory_ingest_json(data, project_id, metadata)` - Ingest JSON data - `memory_ingest_conversation(conversation, project_id)` - Ingest conversation #### Admin - `memory_get_stats(project_id)` - Get project statistics - `memory_get_cache_stats()` - Get cache statistics ### LTM Vector Server Tools (Port 8000) #### Repository Processing - `ltm_process_repo(repo_path)` - Process repository for vector indexing #### Vector Search - `ltm_query_vector(query, top_k)` - Query vector database for semantic code search - `ltm_search_file(filepath)` - Search for specific file in vector database #### File Management - `ltm_add_file(filepath)` - Add file to vector database - `ltm_delete_by_filepath(filepath)` - Delete file from vector database - `ltm_delete_by_uuids(uuids)` - Delete vectors by UUIDs #### Code Analysis - `ltm_chunk_file(file_path)` - Chunk file using AST-based chunking ## Testing ### 1. Check Server Health ```bash curl http://localhost:8003/mcp/sse ``` ### 2. Access OpenAPI Docs ``` http://localhost:8003/docs ``` ### 3. Test a Tool via MCP ```bash # Using MCP client mcp-client http://localhost:8003/mcp health_check ``` ## Configuration ### Environment Variables | Variable | Default | Description | |----------|---------|-------------| | `AGGREGATOR_HOST` | `0.0.0.0` | Aggregator server host | | `AGGREGATOR_PORT` | `8003` | Aggregator server port | | `MEMORY_SERVER_URL` | `http://localhost:8002` | Memory server URL | | `MEMORY_SERVER_TIMEOUT` | `30` | Memory server timeout (seconds) | | `GRAPH_SERVER_URL` | `http://localhost:8000` | Graph server URL | | `GRAPH_SERVER_TIMEOUT` | `30` | Graph server timeout (seconds) | | `LOG_LEVEL` | `INFO` | Logging level | | `MAX_RETRIES` | `3` | Max retries for failed requests | | `RETRY_DELAY` | `1` | Delay between retries (seconds) | | `HEALTH_CHECK_INTERVAL` | `30` | Health check interval (seconds) | ## Adding New Backend Servers To add a new backend server (e.g., Graph Server): 1. **Update `config.py`**: ```python GRAPH_SERVER_URL = os.getenv("GRAPH_SERVER_URL", "http://localhost:8000") GRAPH_SERVER_TIMEOUT = int(os.getenv("GRAPH_SERVER_TIMEOUT", "30")) ``` 2. **Update `mcp_client.py`**: ```python class AggregatorClients: def __init__(self): # ... existing clients ... self.graph_client = MCPServerClient( "Graph Server", config.GRAPH_SERVER_URL, config.GRAPH_SERVER_TIMEOUT ) ``` 3. **Add tools in `aggregator_server.py`**: ```python @mcp.tool() async def graph_query(cypher: str) -> Dict[str, Any]: """Query Neo4j graph database""" clients = await get_clients() return await clients.graph_client.proxy_request( "POST", "/query", json_data={"cypher": cypher}, retries=config.MAX_RETRIES ) ``` ## Troubleshooting ### Connection Refused - Ensure all backend servers are running - Check URLs in `.env` file - Verify ports are not blocked by firewall ### Timeout Errors - Increase `MEMORY_SERVER_TIMEOUT` or `GRAPH_SERVER_TIMEOUT` in `.env` - Check backend server performance - Verify network connectivity ### Health Check Failing - Run `health_check()` tool to diagnose - Check backend server logs - Verify backend servers are responding ## Development ### Project Structure ``` mcp_aggregator/ ├── aggregator_server.py # Main MCP server ├── config.py # Configuration management ├── mcp_client.py # HTTP clients for backend servers ├── requirements.txt # Python dependencies ├── .env # Environment variables ├── __init__.py # Package initialization └── README.md # This file ``` ### Adding Logging ```python import logging logger = logging.getLogger(__name__) logger.info("Message") logger.error("Error") ``` ## Future Enhancements - [ ] Add Graph/Vector DB server integration - [ ] Implement caching layer - [ ] Add request rate limiting - [ ] Implement server load balancing - [ ] Add metrics/monitoring - [ ] Support for server discovery - [ ] WebSocket support for real-time updates ## License Same as parent project (Innocody)

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/NguyenTrinh3008/mcp_agg'

If you have feedback or need assistance with the MCP directory API, please join our Discord server