Rohlik MCP Proxy
by Newpaw
README.md
# Rohlik MCP Proxy Server
A Docker-based proxy MCP (Model Context Protocol) server for the Rohlik MCP service that forwards requests to `https://mcp.rohlik.cz/mcp` while automatically injecting authentication headers from a base64url token in the URL path (or optional env fallback).
## Features
- **Transparent Proxying**: Forwards MCP protocol messages between clients and the Rohlik MCP server
- **Authentication Injection**: Automatically injects `rhl-email` and `rhl-pass` headers from a base64url path token (env fallback optional)
- **SSE/Streaming Support**: Streams GET responses for real-time MCP sessions
- **Docker-based**: Easy deployment with Docker and Docker Compose
- **Health Monitoring**: Built-in health check endpoint
- **CORS Enabled**: Allows browser-based and desktop MCP clients to connect
## Prerequisites
- Docker and Docker Compose installed
- Rohlik account credentials (email and password)
## Quick Start
### 1. Generate a base64url token
Create a base64url-encoded token for `email:password`:
```bash
python - <<'PY'
import base64
print(base64.urlsafe_b64encode(b"email@gmail.com:password").decode())
PY
```
### 2. Build and Run with Docker Compose
Note: `docker-compose.yml` expects an external network named `cloudflare`. Create it with
`docker network create cloudflare` or remove the `networks` section if you don't need it.
```bash
# Build and start the proxy server
docker-compose up -d
# View logs
docker-compose logs -f rohlik-mcp-proxy
# Stop the server
docker-compose down
```
The proxy server will be available at:
- **MCP Endpoint**: `http://localhost:8000/mcp/<base64url-token>`
- **Health Check**: `http://localhost:8000/health`
- **Info**: `http://localhost:8000/`
### 3. Alternative: Run with Docker
```bash
# Build the image
docker build -t rohlik-mcp-proxy .
# Run the container
docker run -d \
--name rohlik-mcp-proxy \
-p 8000:8000 \
rohlik-mcp-proxy
# View logs
docker logs -f rohlik-mcp-proxy
# Stop the container
docker stop rohlik-mcp-proxy
docker rm rohlik-mcp-proxy
```
## Configuration
### Environment Variables
| Variable | Required | Default | Description |
|----------|----------|---------|-------------|
| `RHL_EMAIL` | No | - | Optional fallback email (used when no path token is provided) |
| `RHL_PASS` | No | - | Optional fallback password (used when no path token is provided) |
| `ROHLIK_MCP_URL` | No | `https://mcp.rohlik.cz/mcp` | Rohlik MCP backend endpoint |
### Base64url Path Token
The proxy expects a URL path like `/mcp/<base64url(email:password)>`. Padding (`=`) is optional.
If you set `RHL_EMAIL` and `RHL_PASS`, you can also use `/mcp` without a token.
### MCP Client Configuration
Configure your MCP client (e.g., Claude Desktop, ChatGPT) to connect to the proxy.
Use the base64url token in the URL path:
```json
{
"mcpServers": {
"rohlik": {
"url": "http://localhost:8000/mcp/<base64url-token>",
"transport": "streamable-http"
}
}
}
```
Or for `fastmcp` client:
Or using MCP Inspector:
```bash
npx @modelcontextprotocol/inspector http://localhost:8000/mcp/<base64url-token>
```
## Development
### Local Development (Without Docker)
```bash
# Install uv package manager
pip install uv
# Install dependencies
uv pip install -e .
# Run the proxy server
python proxy_server.py
```
### Project Structure
```
rohlik-mcp-proxy/
├── proxy_server.py # Main proxy server implementation
├── pyproject.toml # Python project configuration
├── Dockerfile # Docker image definition
├── docker-compose.yml # Docker Compose configuration
├── .env.example # Environment variables template
├── .gitignore # Git ignore rules
└── README.md # This file
```
## How It Works
1. **Client Connection**: MCP client connects to the proxy at `/mcp/<base64url-token>` (GET for streaming, POST for calls)
2. **Request Forwarding**: Proxy receives MCP requests from the client
3. **Header Injection**: Proxy decodes the path token and adds authentication headers (`rhl-email`, `rhl-pass`)
4. **Backend Communication**: Proxy forwards the authenticated request to Rohlik MCP server
5. **Response Handling**: Proxy streams GET responses and returns POST/other responses
6. **Bidirectional Flow**: Process repeats for all subsequent requests
```
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ │ │ │ │ │
│ MCP Client │ <-----> │ Rohlik Proxy │ <-----> │ Rohlik MCP │
│ │ HTTP │ (adds headers) │ HTTPS │ Backend Server │
│ │ │ │ │ │
└─────────────┘ └──────────────────┘ └─────────────────┘
Port 8000 mcp.rohlik.cz
```
## Health Check
The proxy includes a built-in health check endpoint:
```bash
curl http://localhost:8000/health
# Returns: OK
```
Docker Compose automatically monitors this endpoint and restarts the container if it becomes unhealthy.
## Security Considerations
- **Credentials Storage**: Never commit your `.env` file with real credentials to version control
- **Network Security**: For production use, consider running the proxy behind a reverse proxy with HTTPS
- **Access Control**: No additional authentication is enforced by the proxy; restrict access at the network or reverse proxy level
- **Password Safety**: Credentials are passed via URL path and HTTP headers (ensure HTTPS and avoid logging full URLs in production)
## Troubleshooting
### Container won't start
```bash
# Check logs
docker-compose logs rohlik-mcp-proxy
# Common issues:
# - Port 8000 already in use
# - Invalid or missing base64 token in the URL path
```
### Connection refused
```bash
# Verify the container is running
docker-compose ps
# Check if port is accessible
curl http://localhost:8000/health
```
### Rohlik authentication errors
```bash
# Verify your base64url token decodes to email:password
python - <<'PY'
import base64
print(base64.urlsafe_b64decode(b"<base64url-token>").decode())
PY
```
## License
This project is provided as-is for integration with the Rohlik MCP service.
## Related Documentation
- [Model Context Protocol (MCP)](https://modelcontextprotocol.io/)
- [FastMCP Documentation](https://gofastmcp.com/)
- [Rohlik MCP Service](https://mcp.rohlik.cz/)
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues