Skip to main content
Glama
README.md
English | [δΈ­ζ–‡](./README.zh-CN.md)

# MCP-UNI

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

## Features

- πŸ”Œ **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

## Architecture

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
```

## Installation

### Using npx (Recommended)

```bash
npx mcp-uni
```

### From npm (Coming Soon)

```bash
npm install -g mcp-uni
```

### From Source

```bash
git clone https://github.com/yourusername/mcp-uni.git
cd mcp-uni
npm install
npm run build
```

## Quick Start

### Method 1: Using Configuration File (Recommended)

1. **Create a configuration file** (`mcp-uni.config.json`):

   ```json
   {
     "mcpServers": {
       "everything": {
         "type": "stdio",
         "command": "npx",
         "args": ["-y", "@modelcontextprotocol/server-everything"],
         "env": {}
       }
     }
   }
   ```

2. **Start the MCP-UNI server**:

   ```bash
   # 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.

### Method 2: Manual Connection

1. **Start the MCP-UNI server**:

   ```bash
   # 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`.

2. **Connect an MCP server**:

   ```bash
   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"
       }
     }'
   ```

3. **List connected servers**:
   ```bash
   curl -X POST http://localhost:7200/tools/list_mcp \
     -H "Content-Type: application/json" \
     -d '{}'
   ```

## Configuration

### Configuration File

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.

#### Configuration File Format

```json
{
  "mcpServers": {
    "server-name": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-everything"],
      "env": {}
    }
  }
}
```

#### Configuration File Location

- **Default**: `mcp-uni.config.json` in the current working directory
- **Custom**: Use `--config` option to specify a different path

#### Example Configuration Files

**Multiple MCP Servers:**

```json
{
  "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:**

```json
{
  "mcpServers": {
    "remote-server": {
      "type": "sse",
      "url": "http://example.com/sse",
      "query": {
        "param1": "value1"
      },
      "headers": {
        "Authorization": "Bearer token"
      }
    }
  }
}
```

### Transport Configuration

MCP-UNI supports two types of transport configurations:

#### SSE Transport

```json
{
  "type": "sse",
  "url": "http://example.com/sse",
  "query": {
    "param1": "value1"
  },
  "headers": {
    "Authorization": "Bearer token"
  }
}
```

#### Stdio Transport

```json
{
  "type": "stdio",
  "command": "python",
  "args": ["-m", "my_mcp_server"],
  "env": {
    "ENV_VAR": "value"
  },
  "cwd": "/path/to/working/directory"
}
```

## Command Line Options

```bash
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
```

### Examples

```bash
# 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 --version
```

## API Reference

### Built-in Tools

MCP-UNI provides these management tools:

#### `connect_mcp`

Connect a new MCP server to the host.

**Parameters:**

- `name` (string): Unique name for the MCP server
- `transportConfig` (object): Transport configuration (see above)

#### `disconnect_mcp`

Disconnect an MCP server from the host.

**Parameters:**

- `name` (string): Name of the MCP server to disconnect

#### `list_mcp`

List all currently connected MCP servers.

**Parameters:** None

### Dynamic Tools

All tools from connected MCP servers are automatically exposed through MCP-UNI with their original names and schemas.

### HTTP Endpoints

- `POST /tools/{tool_name}` - Execute a tool
- `GET /stream` - SSE endpoint for real-time updates
- `GET /health` - Health check endpoint

## Usage Examples

### Connecting Multiple Servers

```bash
# 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"
    }
  }'
```

### Using Connected Server Tools

Once servers are connected, their tools become available:

```bash
# 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"}'
```

## Development

### Project Structure

```
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
```

### Building

```bash
npm run build
```

The compiled JavaScript will be output to the `build/` directory.

### Key Components

- **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)

## Error Handling

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

## Requirements

- Node.js 16+ (ES modules required)
- TypeScript 5+

## Dependencies

- `@modelcontextprotocol/sdk`: MCP SDK for client/server implementation
- `mcp-proxy`: HTTP proxy server for MCP protocol
- `zod`: Schema validation and type safety

## License

MIT

## Contributing

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests if applicable
5. Submit a pull request

## Support

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.