MCP Redirect Server

MCP Redirect Server

A Model Context Protocol server built with NestJS that provides OAuth 2.1 authentication with GitHub and exposes MCP tools through Server-Sent Events transport. Enables secure, real-time communication with JWT-based protection and dependency injection.

Category
访问服务器

README

MCP Transparent Proxy Server

Servidor MCP (Model Context Protocol) que atua como um proxy transparente entre sistemas OAuth e servidores MCP com autenticação simples. O proxy é invisível para a IA - tools, resources e prompts do servidor externo aparecem como se fossem nativos.

🎯 Objetivo

Este servidor atua como um bridge duplo de autenticação, resolvendo dois problemas de incompatibilidade:

  1. Cliente → Este Servidor: Autenticação OAuth 2.1 com GitHub
  2. Este Servidor → MCP Externo: Autenticação via API (email/senha → Bearer token)

Fluxo Completo:

┌─────────────┐         ┌──────────────────┐         ┌─────────────────┐
│   Cliente   │         │  MCP Proxy       │         │  Servidor MCP   │
│     MCP     │◄───────►│  (Este projeto)  │◄───────►│  Externo        │
│             │  OAuth  │                  │ Bearer  │  (API Login)    │
│  GitHub     │  2.1    │  OAuth + API     │  Token  │  Email/Pass     │
└─────────────┘         └──────────────────┘         └─────────────────┘

🚀 Características

Autenticação Dupla:

  • 🔐 OAuth 2.1 com GitHub - Cliente autentica via OAuth no frontend
  • 🔑 API Login Automático - Servidor faz login automático na API externa (email/senha)
  • 🎫 Bearer Token Management - Gerencia tokens automaticamente para o servidor MCP externo
  • 🔄 Auto Refresh Token - Renova tokens expirados automaticamente
  • ⏱️ Token Caching - Cache inteligente de tokens com validação de expiração

Proxy Features:

  • 🌉 Bridge Transparente - Conecta diferentes tipos de autenticação
  • 🛠️ Proxy Tools - 6 ferramentas para acessar servidor MCP externo
  • 📡 SSE Transport - Server-Sent Events para comunicação em tempo real
  • 🔄 Auto-Reconnect - Reconexão automática em caso de falha de autenticação
  • 🔒 JWT Security - Proteção de rotas com JWT
  • 💉 Dependency Injection - Sistema DI completo do NestJS
  • 📝 Logs Detalhados - Monitoramento completo de autenticação e proxy
  • 🛡️ Error Recovery - Recuperação automática de erros de token expirado

📦 Instalação

pnpm install

⚙️ Configuração

1. Criar GitHub OAuth App

  1. Acesse: https://github.com/settings/developers
  2. Clique em "New OAuth App"
  3. Preencha:
    • Application name: mcp-redirect-server
    • Homepage URL: http://localhost:3000
    • Authorization callback URL: http://localhost:3000/auth/callback
  4. Copie o Client ID e Client Secret

2. Configurar variáveis de ambiente

Crie um arquivo .env baseado no .env.example:

cp .env.example .env

Edite o .env e adicione suas credenciais:

# OAuth Provider (GitHub) - Para autenticação do cliente
GITHUB_CLIENT_ID=seu_client_id_aqui
GITHUB_CLIENT_SECRET=seu_client_secret_aqui

# JWT Configuration (mínimo 32 caracteres)
JWT_SECRET=my-super-secure-jwt-secret-key-with-at-least-32-characters

# Server Configuration
SERVER_URL=http://localhost:3000
RESOURCE_URL=http://localhost:3000/sse

# Port
PORT=3000

# External API Authentication - Para autenticação no servidor MCP externo
EXTERNAL_API_LOGIN_URL=https://api-externa.com/auth/login
EXTERNAL_API_USER=seu_email@example.com
EXTERNAL_API_PASSWORD=sua_senha_segura

# External MCP Server - URL SSE do servidor MCP externo
EXTERNAL_MCP_URL=https://api-externa.com/sse

3. Descrição das Variáveis

Autenticação do Cliente (OAuth GitHub):

  • GITHUB_CLIENT_ID - Client ID do OAuth App do GitHub
  • GITHUB_CLIENT_SECRET - Client Secret do OAuth App do GitHub
  • JWT_SECRET - Chave secreta para JWT (mínimo 32 caracteres)

Autenticação no Servidor Externo (API Login):

  • EXTERNAL_API_LOGIN_URL - URL da API de login do servidor externo
    • Exemplo: https://meuservidor.com/auth/login
    • O servidor fará POST com { email, password } nesta URL
  • EXTERNAL_API_USER - Email/usuário para autenticação na API externa
  • EXTERNAL_API_PASSWORD - Senha para autenticação na API externa

Configuração do Proxy MCP:

  • EXTERNAL_MCP_URL - URL SSE do servidor MCP externo
    • Exemplo: https://meuservidor.com/sse
    • Deve ser o endpoint SSE que implementa o protocolo MCP

Importante:

  • O servidor faz login automático na EXTERNAL_API_LOGIN_URL usando email/senha
  • A resposta deve conter um campo token ou access_token
  • Opcionalmente, pode conter expires_in (tempo de expiração em segundos)
  • Se expires_in não for fornecido, assume-se 1 hora de validade
  • Este token é usado como Bearer token nas requisições para EXTERNAL_MCP_URL
  • O token é automaticamente renovado quando próximo da expiração (5 minutos antes)

🏃 Executar o projeto

# desenvolvimento
pnpm run start:dev

# produção
pnpm run start:prod

O servidor estará disponível em: http://localhost:3000

🔌 Endpoints

Endpoints OAuth (Cliente):

  • GET /.well-known/oauth-authorization-server - Metadata do servidor OAuth (RFC 8414)
  • GET /.well-known/oauth-protected-resource - Metadata MCP (RFC 9728)
  • POST /auth/register - Registro dinâmico de cliente (RFC 7591)
  • GET /auth/authorize - Endpoint de autorização OAuth
  • GET /auth/callback - Callback OAuth do GitHub
  • POST /auth/token - Endpoint de token OAuth
  • POST /auth/revoke - Revogação de token OAuth

Endpoint MCP:

  • GET /sse - Endpoint SSE para conexão MCP (requer autenticação OAuth)

🧪 Testar com MCP Inspector

  1. Abra o navegador em: http://localhost:3000/mcp
  2. Configure o Inspector:
    • Transport Type: SSE
    • URL: http://localhost:3000/sse
    • Connection Type: Via Proxy
  3. Clique em Authentication para configurar OAuth
  4. Clique em Connect

A Client não sabe que existe um proxy! 🎭

� Como Funciona

Fluxo de Autenticação Dupla:

1. Cliente se autentica no Proxy (OAuth GitHub):

Cliente → GET /auth/authorize
       → Redireciona para GitHub
       → Usuário autoriza
       → GET /auth/callback
       → Recebe JWT token

2. Proxy se autentica no Servidor Externo (API Login):

Proxy → POST EXTERNAL_API_LOGIN_URL
      → Body: { email: USER, password: PASS }
      → Recebe: { token: "Bearer..." }
      → Armazena token

3. Cliente usa o Proxy com proxy tools:

Cliente → callTool('proxy_list_tools') com JWT
Proxy   → Valida JWT do cliente
Proxy   → Conecta ao servidor externo com Bearer token
Proxy   → client.listTools() via SSE
Servidor Externo → Retorna lista de tools
Proxy   → Retorna resposta ao cliente

Fluxo Completo de uma Chamada:

┌─────────┐  1. OAuth JWT    ┌───────────┐  2. Bearer Token  ┌──────────┐
│ Cliente │ ───────────────→ │   Proxy   │ ─────────────────→│ Servidor │
│   MCP   │                  │   Server  │                   │  Externo │
│         │ ←─────────────── │           │ ←──────────────── │   MCP    │
└─────────┘  4. Resposta     └───────────┘  3. Resposta      └──────────┘

Inicialização Automática:

Quando o servidor inicia:

  1. ✅ Configura OAuth com GitHub para clientes
  2. ✅ Faz login automático na API externa
  3. ✅ Armazena o token com informações de expiração
  4. ✅ Conecta ao servidor MCP externo via SSE com Bearer token
  5. ✅ Registra as proxy tools
  6. ✅ Fica pronto para aceitar conexões de clientes

Sistema de Refresh Token:

O servidor implementa um sistema inteligente de gerenciamento de tokens:

Cache de Token:

┌──────────────────────────────────────────────────────┐
│ Token armazenado em memória com timestamp           │
│ Validade: expires_in - 5 minutos (margem segurança) │
│ Reutilizado enquanto válido (evita logins extras)   │
└──────────────────────────────────────────────────────┘

Renovação Automática:

1️⃣ Antes de cada operação MCP
   → Verifica se token está próximo de expirar
   → Se sim, renova automaticamente

2️⃣ Em caso de erro de autenticação (401/403)
   → Detecta erro de autenticação
   → Força refresh do token
   → Reconecta com novo token
   → Retenta operação automaticamente

Fluxo de Refresh:

Operação MCP solicitada
    ↓
Verifica expiração do token
    ↓
Token válido? ─── NÃO ──→ POST /auth/login
    │                         ↓
   SIM                   Novo token + expires_in
    ↓                         ↓
Usa token em cache      Atualiza cache
    ↓                         ↓
    └──────────→ Executa operação MCP
                        ↓
                  Erro 401/403? ─── SIM ──→ Força refresh
                        │                         ↓
                       NÃO                  Reconecta cliente
                        ↓                         ↓
                  Retorna resultado         Retenta operação

Benefícios do Sistema:

  • Zero Downtime: Tokens renovados antes de expirar
  • Recuperação Automática: Erros de autenticação tratados automaticamente
  • Performance: Cache evita logins desnecessários
  • Transparente: Cliente não percebe renovações
  • Resiliente: Reconexão automática em falhas

📚 Documentação

Conceitos principais:

  • Double Authentication Bridge: Ponte entre OAuth (cliente) e API Login (servidor externo)
  • Proxy Tools: ferramentas para acessar servidor MCP externo de forma controlada
  • Token Management: Gerenciamento automático de JWT (cliente) e Bearer tokens (servidor)
  • Auto Refresh Token: Sistema inteligente que renova tokens antes de expirar
  • Token Caching: Cache de tokens com validação de expiração para melhor performance
  • Error Recovery: Recuperação automática de erros de autenticação com retry
  • SSE Transport: Comunicação em tempo real via Server-Sent Events

Links úteis:

🚀 Benefícios

  • Bridge Duplo: Conecta OAuth (cliente) com API Login (servidor externo)
  • Sem Modificação: Usa servidores MCP existentes sem mudanças
  • Segurança em Camadas: OAuth no frontend + Bearer token no backend
  • Gerenciamento Automático: Tokens gerenciados e renovados automaticamente
  • Zero Downtime: Renovação preventiva de tokens antes da expiração
  • Resiliente: Recuperação automática de falhas de autenticação
  • Performance Otimizada: Cache de tokens evita logins desnecessários
  • Isolamento de Credenciais: Servidor externo nunca vê credenciais OAuth
  • Logs Detalhados: Monitoramento completo de autenticação e proxy
  • Produção-Ready: Implementação completa do protocolo MCP
  • Flexível: Fácil configuração via variáveis de ambiente

🔒 Segurança

  • OAuth 2.1: Autenticação segura de clientes via GitHub
  • JWT Tokens: Tokens assinados e validados
  • Credenciais Isoladas: Senhas apenas em variáveis de ambiente
  • Logs Sanitizados: Senhas nunca aparecem nos logs
  • Bearer Tokens: Comunicação segura com servidor externo
  • Token Rotation: Renovação automática de tokens para segurança contínua
  • Margem de Segurança: Tokens renovados 5 minutos antes de expirar
  • HTTPS Ready: Preparado para produção com HTTPS

🎯 Formato de Resposta da API Externa

A API externa (EXTERNAL_API_LOGIN_URL) deve retornar uma resposta JSON no seguinte formato:

Resposta Mínima:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

ou

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Resposta Recomendada (com expiração):

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_in": 3600
}

Campos suportados:

  • token ou access_token (string, obrigatório) - Bearer token para autenticação
  • expires_in (number, opcional) - Tempo de expiração em segundos (padrão: 3600)

Comportamento:

  • Se expires_in for fornecido, o servidor usa esse valor
  • Caso contrário, assume 1 hora (3600 segundos) de validade
  • Token é renovado automaticamente 5 minutos antes de expirar

🛠️ Troubleshooting

Erro: "Authentication configuration is incomplete"

Verifique se todas as variáveis estão no .env:

  • EXTERNAL_API_LOGIN_URL
  • EXTERNAL_API_USER
  • EXTERNAL_API_PASSWORD

Erro: "Failed to authenticate"

  • Confirme que a URL de login está correta
  • Verifique se email/senha são válidos
  • Confirme que a API retorna token ou access_token

Erro: "EXTERNAL_MCP_URL not configured"

Configure EXTERNAL_MCP_URL no .env com a URL SSE do servidor externo.

Cliente não consegue conectar via OAuth

  • Verifique GITHUB_CLIENT_ID e GITHUB_CLIENT_SECRET
  • Confirme que a callback URL no GitHub está correta: http://localhost:3000/auth/callback
  • Verifique se JWT_SECRET tem pelo menos 32 caracteres

Token expira muito rápido

  • Verifique se a API externa retorna expires_in correto
  • O servidor renova tokens 5 minutos antes de expirar
  • Confira os logs para ver quando tokens estão sendo renovados
  • Logs de exemplo:
    [McpProxyService] Refreshing authentication token...
    [McpProxyService] Token refreshed successfully. Expires in 3600s
    [McpProxyService] Using cached token
    

Erro: "MCP client is not connected"

  • O servidor tenta reconectar automaticamente
  • Verifique se EXTERNAL_MCP_URL está acessível
  • Confira logs de erro de conexão
  • Sistema tentará reconectar na próxima operação

Erro 401/403 do servidor externo

  • Sistema detecta automaticamente e força refresh do token
  • Se persistir, verifique credenciais EXTERNAL_API_USER e EXTERNAL_API_PASSWORD
  • Confirme que a API de login está funcionando corretamente

📝 Licença

MIT licensed

<!--Backers on Open Collective Sponsors on Open Collective-->

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选