Skip to main content
Glama

mcp-proxy

FastMCP Proxy Server

This project provides a simple and flexible proxy server built with FastMCP. It is designed to expose one or more underlying MCP (Model Context Protocol) servers over various transport protocols, making them accessible to a wider range of clients.

The server is containerized using Docker for easy and consistent deployment, optimized for production environments.

Features

  • Multiple Transports: Expose MCP servers over stdio, sse (Server-Sent Events), or http.
  • Flexible Configuration: Easily configure which MCP servers to proxy by editing the servers.json file.
  • Lightweight & Fast: Built on the efficient FastMCP library and runs in a small Alpine Linux container.
  • Production Ready: Optimized Docker configuration for production deployment.
  • MCP Server Support: Supports both Node.js (npx) and Python (uvx) based MCP servers.

Requirements

  • Docker and Docker Compose

How to Run

This project is designed for production deployment using Docker. You can run it using either Docker Compose or direct Docker commands:

Prerequisites

  1. Clone the repository:
    git clone https://github.com/sokunmin/mcp-proxy.git cd mcp-proxy

The easiest way to run the proxy with predefined configuration:

# Run with default settings (SSE transport, port 8000) docker-compose up --build # Run in background docker-compose up -d --build # Stop the service docker-compose down
Override Environment Variables

You can override the default transport without editing files:

# Run with HTTP transport TRANSPORT=http PORT=8001 docker-compose up # Run with custom port PORT=9000 docker-compose up # Run with multiple overrides TRANSPORT=http PORT=8080 docker-compose up

Method 2: Using Docker Run

For more control over the container configuration:

Step 1: Build the Image
docker build -t mcp-proxy .
Step 2: Run the Container

Option A: Using environment variables directly

# SSE Transport (Default) docker run -d --name mcp-proxy \ -p 8000:8000 \ -e TRANSPORT=sse \ -e HOST=0.0.0.0 \ -e PORT=8000 \ -e TZ=Etc/UTC \ mcp-proxy # HTTP Transport docker run -d --name mcp-proxy-http \ -p 8001:8001 \ -e TRANSPORT=http \ -e HOST=0.0.0.0 \ -e PORT=8001 \ -e TZ=Etc/UTC \ mcp-proxy

Option B: Using .env file with consistent PORT variable

# Load environment variables from .env file source .env # Run with loaded variables docker run -d --name mcp-proxy \ -p ${PORT}:${PORT} \ -e TRANSPORT=${TRANSPORT} \ -e HOST=${HOST} \ -e PORT=${PORT} \ -e TZ=${TZ} \ mcp-proxy # For HTTP transport, override specific variables TRANSPORT=http PORT=8001 docker run -d --name mcp-proxy-http \ -p ${PORT}:${PORT} \ -e TRANSPORT=${TRANSPORT} \ -e HOST=${HOST} \ -e PORT=${PORT} \ -e TZ=${TZ} \ mcp-proxy

Option C: Using --env-file

# Use .env file directly docker run -d --name mcp-proxy \ --env-file .env \ -p 8000:8000 \ mcp-proxy # Override specific variables docker run -d --name mcp-proxy-http \ --env-file .env \ -e TRANSPORT=http \ -e PORT=8001 \ -p 8001:8001 \ mcp-proxy
Container Management
# View logs docker logs mcp-proxy # Stop the container docker stop mcp-proxy # Remove the container docker rm mcp-proxy # View running containers docker ps

Environment Variables

The following environment variables can be configured in the .env file or passed directly:

  • TRANSPORT: Transport protocol (sse, http, stdio) - Default: sse
  • HOST: Host to bind to - Default: 0.0.0.0
  • PORT: Port number for the service - Default: 8000
  • TZ: Timezone - Default: Etc/UTC

Quick Start Examples

# Default SSE on port 8000 docker-compose up # HTTP on port 8001 TRANSPORT=http PORT=8001 docker-compose up # Custom port PORT=9000 docker-compose up # Run in background docker-compose up -d

Configuration

To configure the proxy, edit the servers.json file. You can add, remove, or modify the MCP servers that you want to expose.

{ "mcpServers": { "context7": { "transport": "stdio", "command": "npx", "args": ["-y", "@upstash/context7-mcp"] }, "fetch": { "command": "uvx", "args": ["mcp-server-fetch"] }, "time": { "transport": "stdio", "command": "uvx", "args": ["mcp-server-time", "--local-timezone", "Etc/UTC"] } } }

The servers.json file is mounted as a volume, so changes take effect on container restart.


How to Test

You can test the running proxy using any MCP-compliant client or a tool like curl.

Testing SSE Transport (Port 8000)

# Test the SSE endpoint curl http://localhost:8000/sse/ # Check server health curl http://localhost:8000/

Testing HTTP Transport (Port 8001)

# Test the HTTP endpoint curl http://localhost:8001/ # Check server health curl http://localhost:8001/

Testing with Different Services

# Test SSE service docker-compose up mcp-proxy-sse curl http://localhost:8000/sse/ # Test HTTP service docker-compose up mcp-proxy-http curl http://localhost:8001/

Testing MCP Servers

The proxy currently supports these MCP servers:

  • context7: Document search and context retrieval (Node.js via npx)
  • fetch: Web content fetching (Python via uvx)
  • time: Time and timezone operations (Python via uvx)

All servers are automatically started by the proxy when needed.


Production Deployment

Docker Configuration Details

  • Base Image: ghcr.io/astral-sh/uv:python3.12-alpine
  • Optimized: Small size, production-ready
  • Security: Runs as non-root user
  • Environment: Configurable via environment variables

Best Practices

  1. Use environment variables for configuration instead of modifying files
  2. Mount servers.json as a volume for easy configuration updates
  3. Use Docker Compose for consistent deployment
  4. Monitor logs using docker-compose logs -f
  5. Use health checks to ensure service availability

Scaling

For high-availability deployment, consider:

  • Using multiple replicas behind a load balancer
  • Implementing proper logging and monitoring
  • Using container orchestration (Kubernetes, Docker Swarm)

Troubleshooting

Common Issues

  1. Port conflicts: Make sure ports 8000/8001 are not in use by other applications
  2. Container build issues: Use docker-compose down and docker-compose up --build to force a clean rebuild
  3. Configuration errors: Check servers.json syntax and ensure all required fields are present

Monitoring

Check service health:

# View logs docker-compose logs -f mcp-proxy-sse # Check container status docker-compose ps # Access container shell (if needed) docker-compose exec mcp-proxy-sse sh

Contributing

Contributions are welcome! Please feel free to submit a pull request or open an issue to discuss any changes.

For development setup, please use the dev branch which includes development-optimized configurations.

Related MCP Servers

  • -
    security
    A
    license
    -
    quality
    A proxy service that connects MCP clients to remote MCP servers, allowing users to use server keys from MCP.so to access remote resources without running their own server.
    Last updated -
    409
    2
    TypeScript
    MIT License
    • Apple
  • -
    security
    -
    license
    -
    quality
    Proxy that aggregates multiple MCP servers and presents them as a unified interface, allowing clients to access resources from multiple servers transparently.
    Last updated -
    1
    TypeScript
  • -
    security
    A
    license
    -
    quality
    modbus-mcp
    Last updated -
    2
    Python
    MIT License
    • Linux
    • Apple

View all related MCP servers

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/sokunmin/mcp-proxy'

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