MCP Proxy

Um proxy MCP bidirecional conectando stdio e Server-Sent Events (SSE) com suporte a OAuth.

Documentação

mcp-proxy

Um proxy MCP bidirecional em Rust que suporta transportes SSE e Streamable HTTP com OAuth.

Recursos

  • Múltiplos transportes: SSE e Streamable HTTP
  • Autenticação OAuth: Fluxo OAuth completo com renovação automática de token
  • Proxy bidirecional: Conecte servidores remotos a clientes locais ou exponha servidores locais remotamente
  • Rápido e leve: Construído em Rust para desempenho

Uso

Instalação

# from crates.io
cargo install rmcp-proxy
# from github
cargo install --git https://github.com/stephenlacy/mcp-proxy

Compilação

cargo build --release

Execução

O proxy pode operar em dois modos:

1. Modo Cliente Remoto

Conecte-se a um servidor MCP remoto e exponha-o como um servidor stdio local. Suporta transportes SSE e Streamable HTTP com detecção automática.

Detecção de Transporte:

  • URLs contendo /sse → Usa transporte SSE
  • Todas as outras URLs → Usa transporte Streamable HTTP
  • Substitua com a flag --transport
Exemplos Básicos
# Streamable HTTP
mcp-proxy http://localhost:9090/mcp/instances_abc123

# SSE transport
mcp-proxy http://localhost:8080/sse
mcp-proxy --transport sse http://localhost:8080/events

# Specific
mcp-proxy --transport streamable-http http://localhost:9090/api
Usando com Claude ou Cursor
{
  "mcpServers": {
    "my-remote-server": {
      "command": "mcp-proxy",
      "args": ["http://example.com/mcp/instances_abc123"]
    },
    "sse-server": {
      "command": "mcp-proxy", 
      "args": ["--transport", "sse", "http://example.com/sse"]
    }
  }
}

2. Modo Servidor Local

Conecte-se a um servidor MCP local via stdio e exponha-o como um servidor remoto. Suporta endpoints SSE e Streamable HTTP.

# Expose as SSE server
mcp-proxy --port 8080 -- your-command --arg1 value1 --arg2 value2
mcp-proxy --port 8080 python mcp_server.py
mcp-proxy --port 8080 -- npx -y @modelcontextprotocol/server-everything

# Or http+streamable
mcp-proxy --port 9090 --transport streamable-http -- python mcp_server.py

mcp-proxy --port 8080 -e KEY VALUE -e ANOTHER_KEY ANOTHER_VALUE -- your-command

Gerenciamento de Autenticação

Limpando o Cache de Autenticação

Se você encontrar problemas de autenticação, limpe o cache de autenticação:

# Clear all auth data
mcp-proxy reset

# Or manually delete the directory
rm -rf ~/.mcp-auth

Opções de Linha de Comando

# Transport selection
--transport <TRANSPORT>    # sse, streamable-http, or auto (default: auto)

# Server mode options
--port <PORT>             # Port for local server mode (default: random)
--host <HOST>             # Host to bind to (default: 127.0.0.1)

# Environment variables (server mode)
-e, --env <KEY> <VALUE>   # Set environment variable
--pass-environment        # Pass through all environment variables

# Headers (client mode) 
-H, --headers <KEY> <VALUE>  # Add custom headers

# Reset auth
mcp-proxy reset           # Clear all stored auth data

Registro de Logs

O crate rmcp upstream despeja logs ruidosos, infelizmente

Controle a verbosidade dos logs com a variável de ambiente RUST_LOG:

# Minimal logging
RUST_LOG=error mcp-proxy http://example.com/mcp
RUST_LOG=debug mcp-proxy http://example.com/mcp
RUST_LOG=info mcp-proxy http://example.com/mcp

Uso como Biblioteca

use rmcp_proxy::{
    sse_client::run_sse_client,
    streamable_http_client::run_streamable_http_client,
    StreamableHttpClientConfig, SseClientConfig
};

// Streamable HTTP client
let config = StreamableHttpClientConfig {
    url: "http://example.com/mcp/instances_abc123".to_string(),
    headers: HashMap::new(),
};
run_streamable_http_client(config).await?;

// SSE client  
let config = SseClientConfig {
    url: "http://example.com/sse".to_string(),
    headers: HashMap::new(),
};
run_sse_client(config).await?;

Licença

MIT