English | 中文
MCP-UNI is a Model Context Protocol (MCP) universal server that acts as a unified gateway for connecting and managing multiple MCP servers. It provides a single HTTP endpoint to dynamically connect, disconnect, and interact with various MCP servers without requiring static configuration.
- 🔌 Dynamic MCP Server Management: Connect and disconnect MCP servers at runtime
- 🌐 HTTP Server Interface: RESTful API with Server-Sent Events (SSE) support
- 🔗 Multiple Transport Support: Supports both SSE and stdio transports
- 🛠️ Tool Aggregation: Exposes all connected MCP server tools through a unified interface
- 📚 Resource Management: Access resources and resource templates from connected servers
- 💬 Prompt Management: Manage prompts across multiple MCP servers
- 🔄 Auto-retry: Built-in retry mechanism for connection failures
- 📋 Real-time Updates: Dynamic tool list updates when servers connect/disconnect
MCP-UNI acts as a proxy/gateway between clients and multiple MCP servers:
Client ──HTTP/SSE──> MCP-UNI ──stdio/SSE──> MCP Server 1
│
├─────stdio/SSE──> MCP Server 2
│
└─────stdio/SSE──> MCP Server N
npx mcp-uninpm install -g mcp-unigit clone https://github.com/yourusername/mcp-uni.git
cd mcp-uni
npm install
npm run build-
Create a configuration file (
mcp-uni.config.json):{ "mcpServers": { "everything": { "type": "stdio", "command": "npx", "args": ["-y", "@modelcontextprotocol/server-everything"], "env": {} } } } -
Start the MCP-UNI server:
# Using npx (no installation required) npx mcp-uni # With custom port npx mcp-uni --port 8000 # With custom config file npx mcp-uni --config /path/to/your-config.json # Or if installed globally mcp-uni mcp-uni --port 8000
The server will start on
http://localhost:7200(or your specified port) with SSE endpoint at/stream, and automatically connect the MCP servers defined in your configuration file.
-
Start the MCP-UNI server:
# Using npx (no installation required) npx mcp-uni # With custom port npx mcp-uni --port 8000 # Or if installed globally mcp-uni mcp-uni --port 8000
The server will start on
http://localhost:7200(or your specified port) with SSE endpoint at/stream. -
Connect an MCP server:
curl -X POST http://localhost:7200/tools/connect_mcp \ -H "Content-Type: application/json" \ -d '{ "name": "my-mcp-server", "transportConfig": { "type": "stdio", "command": "node", "args": ["./my-mcp-server/index.js"], "env": {}, "cwd": "/path/to/server" } }'
-
List connected servers:
curl -X POST http://localhost:7200/tools/list_mcp \ -H "Content-Type: application/json" \ -d '{}'
MCP-UNI supports a configuration file (mcp-uni.config.json) to automatically connect MCP servers on startup. This allows you to pre-configure your MCP servers without manually connecting them each time.
{
"mcpServers": {
"server-name": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"],
"env": {}
}
}
}- Default:
mcp-uni.config.jsonin the current working directory - Custom: Use
--configoption to specify a different path
Multiple MCP Servers:
{
"mcpServers": {
"filesystem": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {}
},
"everything": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"],
"env": {}
},
"database": {
"type": "stdio",
"command": "python",
"args": ["-m", "database_mcp_server"],
"env": {
"DB_URL": "sqlite:///app.db"
},
"cwd": "/path/to/db/server"
}
}
}SSE Transport Configuration:
{
"mcpServers": {
"remote-server": {
"type": "sse",
"url": "http://example.com/sse",
"query": {
"param1": "value1"
},
"headers": {
"Authorization": "Bearer token"
}
}
}
}MCP-UNI supports two types of transport configurations:
{
"type": "sse",
"url": "http://example.com/sse",
"query": {
"param1": "value1"
},
"headers": {
"Authorization": "Bearer token"
}
}{
"type": "stdio",
"command": "python",
"args": ["-m", "my_mcp_server"],
"env": {
"ENV_VAR": "value"
},
"cwd": "/path/to/working/directory"
}mcp-uni [options]
Options:
-p, --port <number> Port to listen on (default: 7200)
-s, --stream <path> Stream endpoint path (default: /stream)
-c, --config <path> Config file path (default: mcp-uni.config.json)
-h, --help Display help for command
-V, --version Display version number# Start server on default port (7200) with default config
npx mcp-uni
# Start server on custom port
npx mcp-uni --port 8000
# Start server with custom config file
npx mcp-uni --config /path/to/my-config.json
# Start server with custom port and config
npx mcp-uni --port 8000 --config ./configs/production.json
# Start server with custom stream endpoint
npx mcp-uni --port 8000 --stream /events
# Show help
npx mcp-uni --help
# Show version
npx mcp-uni --versionMCP-UNI provides these management tools:
Connect a new MCP server to the host.
Parameters:
name(string): Unique name for the MCP servertransportConfig(object): Transport configuration (see above)
Disconnect an MCP server from the host.
Parameters:
name(string): Name of the MCP server to disconnect
List all currently connected MCP servers.
Parameters: None
All tools from connected MCP servers are automatically exposed through MCP-UNI with their original names and schemas.
POST /tools/{tool_name}- Execute a toolGET /stream- SSE endpoint for real-time updatesGET /health- Health check endpoint
# Connect a file system MCP server
curl -X POST http://localhost:7200/tools/connect_mcp \
-H "Content-Type: application/json" \
-d '{
"name": "filesystem",
"transportConfig": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
"env": {},
"cwd": "."
}
}'
# Connect a database MCP server
curl -X POST http://localhost:7200/tools/connect_mcp \
-H "Content-Type: application/json" \
-d '{
"name": "database",
"transportConfig": {
"type": "stdio",
"command": "python",
"args": ["-m", "database_mcp_server"],
"env": {"DB_URL": "sqlite:///app.db"},
"cwd": "/path/to/db/server"
}
}'Once servers are connected, their tools become available:
# Use filesystem server tool
curl -X POST http://localhost:7200/tools/read_file \
-H "Content-Type: application/json" \
-d '{"path": "/tmp/example.txt"}'
# Use database server tool
curl -X POST http://localhost:7200/tools/execute_query \
-H "Content-Type: application/json" \
-d '{"query": "SELECT * FROM users LIMIT 10"}'src/
├── index.ts # Entry point and HTTP server setup
├── server.ts # MCP server implementation
├── host.ts # MCP host for managing connections
└── utils/
├── schema-converter.ts # JSON Schema to Zod conversion utilities
└── utils.ts # Utility functions
npm run buildThe compiled JavaScript will be output to the build/ directory.
- McpHost (
host.ts:37): Manages connections to multiple MCP servers - createServer (
server.ts:15): Creates the unified MCP server instance - Schema Conversion (
utils/schema-converter.ts): Converts JSON schemas to Zod schemas - Transport Management (
host.ts:166): Handles different transport types (SSE/stdio)
MCP-UNI includes robust error handling:
- Connection Retries: Automatic retry with backoff for failed connections (3 retries, 2.5s delay)
- Tool Execution: Proper error propagation from connected servers
- Graceful Cleanup: Automatic cleanup of connections on server shutdown
- Node.js 16+ (ES modules required)
- TypeScript 5+
@modelcontextprotocol/sdk: MCP SDK for client/server implementationmcp-proxy: HTTP proxy server for MCP protocolzod: Schema validation and type safety
MIT
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
For issues and questions:
- Create an issue on GitHub
- Check existing documentation
- Review the MCP specification
MCP-UNI simplifies MCP server management by providing a unified, dynamic gateway for all your Model Context Protocol servers.