MCP Gateway
Um gateway e proxy rico em recursos que federam serviços MCP e REST, unificando descoberta, autenticação, limitação de taxa e observabilidade em um único endpoint para clientes de IA.
Documentação
ContextForge
Um registro e proxy de código aberto que federa MCP, A2A e APIs REST/gRPC com governança centralizada, descoberta e observabilidade. Otimiza chamadas de Agentes e Ferramentas, e suporta plugins.

ContextForge é um registro e proxy de código aberto que federa ferramentas, agentes e APIs em um único endpoint limpo para seus clientes de IA. Ele fornece governança centralizada, descoberta e observabilidade em toda a sua infraestrutura de IA:
- Gateway de Ferramentas — MCP, REST, tradução gRPC-para-MCP e compressão TOON
- Gateway de Agentes — protocolo A2A, roteamento de agentes compatível com OpenAI e Anthropic
- Gateway de API — Limitação de taxa, autenticação, tentativas e proxy reverso para serviços REST
- Extensibilidade por Plugins — Mais de 40 plugins para transportes, protocolos e integrações adicionais
- Observabilidade — Rastreamento OpenTelemetry com Phoenix, Jaeger, Zipkin e outros backends OTLP
Ele é executado como um servidor MCP totalmente compatível, implantável via PyPI ou Docker, e escala para ambientes multi-cluster em Kubernetes com federação e cache apoiados por Redis.
Sumário
- Visão Geral e Objetivos
- Início Rápido - PyPI
- Início Rápido - Contêineres
- Contêiner de Desenvolvimento VS Code
- Instalação
- Atualização
- Configuração
- Execução
- Implantação em Nuvem
- Referência da API
- Testes
- Estrutura do Projeto
- Desenvolvimento
- Solução de Problemas
- Contribuição
📌 Links Rápidos
| Recurso | Descrição |
|---|---|
| Configuração em 5 Minutos | Comece rápido — uvx, Docker, Compose ou desenvolvimento local |
| Obtendo Ajuda | Opções de suporte, FAQ, canais da comunidade |
| Guia de Problemas | Como relatar bugs, solicitar recursos, contribuir |
| Documentação Completa | Guias completos, tutoriais, referência da API |
| Descontinuações | Caminhos de execução descontinuados e orientação de migração |
Visão Geral e Objetivos
ContextForge é um registro e proxy de código aberto que federa qualquer servidor Model Context Protocol (MCP), servidor A2A ou API REST/gRPC, fornecendo governança centralizada, descoberta e observabilidade. Ele otimiza chamadas de agentes e ferramentas, e suporta plugins. Consulte o roteiro do projeto para mais detalhes.
Atualmente suporta:
- Federação entre múltiplos serviços MCP e REST
- Integração A2A (Agente-para-Agente) para agentes de IA externos (OpenAI, Anthropic, personalizados)
- Tradução gRPC-para-MCP via descoberta automática de serviços baseada em reflexão
- Virtualização de APIs legadas como ferramentas e servidores compatíveis com MCP
- Transporte via HTTP, JSON-RPC, WebSocket, SSE (com keepalive configurável) e HTTP Streamable; transporte stdio disponível para uso no lado do servidor
- Uma Interface de Administração para gerenciamento em tempo real, configuração e monitoramento de logs (com suporte a implantação isolada)
- Autenticação integrada, tentativas e limitação de taxa com tokens OAuth por usuário e suporte incondicional ao cabeçalho X-Upstream-Authorization
- Observabilidade OpenTelemetry com Phoenix, Jaeger, Zipkin e outros backends OTLP
- Implantações escaláveis via Docker ou PyPI, cache apoiado por Redis e federação multi-cluster
Para uma lista de recursos futuros, confira o Roteiro do ContextForge
🔌 Camada de Gateway com Flexibilidade de Protocolo
- Federa qualquer servidor MCP ou API REST
- Permite escolher sua versão do protocolo MCP (ex.:
2025-11-25) - Expõe uma interface única e unificada para backends diversos
🧩 Virtualização de Serviços REST/gRPC
- Encapsula serviços não-MCP como servidores MCP virtuais
- Registra ferramentas, prompts e recursos com configuração mínima
- Tradução gRPC-para-MCP via protocolo de reflexão de servidor
- Descoberta automática de serviços e introspecção de métodos
🔁 Adaptador de Ferramentas REST-para-MCP
-
Adapta APIs REST em ferramentas com:
- Extração automática de JSON Schema
- Suporte para cabeçalhos, tokens e autenticação personalizada
- Políticas de tentativas, tempo limite e limitação de taxa
🧠 Registros Unificados
- Prompts: modelos Jinja2, suporte multimodal, reversão/versionamento
- Recursos: acesso baseado em URI, detecção de MIME, cache, atualizações SSE
- Ferramentas: nativas ou adaptadas, com validação de entrada e controles de concorrência
📈 Interface de Administração, Observabilidade e Experiência de Desenvolvimento
- Interface de Administração construída com HTMX 2.0.3 (incluído) + Alpine.js
- Visualizador de logs em tempo real com filtragem, pesquisa e capacidades de exportação
- Autenticação: Básica, JWT ou esquemas personalizados
- Logs estruturados, endpoints de saúde, métricas
- Mais de 7.000 testes, alvos Makefile, recarga automática, hooks de pré-commit
🔍 Observabilidade OpenTelemetry
- Rastreamento independente de fornecedor com suporte ao protocolo OpenTelemetry (OTLP)
- Suporte a múltiplos backends: Phoenix (focado em LLM), Jaeger, Zipkin, Tempo, DataDog, New Relic
- Rastreamento distribuído entre gateways e serviços federados
- Instrumentação automática de ferramentas, prompts, recursos e operações do gateway
- Métricas específicas de LLM: Uso de tokens, custos, desempenho do modelo
- Zero sobrecarga quando desativado com degradação graciosa
Consulte Documentação de Observabilidade para guias de configuração com Phoenix, Jaeger e outros backends.
Início Rápido - PyPI
ContextForge é publicado no PyPI como mcp-contextforge-gateway.
⚠️
JWT_SECRET_KEYeAUTH_ENCRYPTION_SECRETsão obrigatórios em todos os ambientes — incluindo desenvolvimento local. O gateway não iniciará sem eles. Gere segredos reais compython3 -m mcpgateway.scripts.init_secretsantes da primeira execução.
Resumo — comando único usando uv:
# 1️⃣ Generate secure secrets (creates .env.secrets)
python3 -m mcpgateway.scripts.init_secrets
# 2️⃣ Export the generated values
export JWT_SECRET_KEY="$(grep '^JWT_SECRET_KEY=' .env.secrets | cut -d= -f2)"
export AUTH_ENCRYPTION_SECRET="$(grep '^AUTH_ENCRYPTION_SECRET=' .env.secrets | cut -d= -f2)"
# 3️⃣ Start the gateway
JWT_SECRET_KEY="$JWT_SECRET_KEY" \
AUTH_ENCRYPTION_SECRET="$AUTH_ENCRYPTION_SECRET" \
MCPGATEWAY_UI_ENABLED=true \
MCPGATEWAY_ADMIN_API_ENABLED=true \
PLATFORM_ADMIN_EMAIL=admin@example.com \
uvx --from mcp-contextforge-gateway mcpgateway --host 0.0.0.0 --port 4444
📋 Pré-requisitos
- Python ≥ 3.11
- curl + jq - apenas para a última etapa de teste rápido
1 - Instalar e executar (pronto para copiar e colar)
# 1️⃣ Create an isolated env and install from PyPI
mkdir mcpgateway && cd mcpgateway
python3 -m venv .venv && source .venv/bin/activate
pip install --upgrade pip
pip install mcp-contextforge-gateway
# 2️⃣ Download .env.example and generate real secrets
curl -O https://raw.githubusercontent.com/IBM/mcp-context-forge/main/.env.example
cp .env.example .env
# Generate cryptographically secure secrets into .env.secrets
python3 -m mcpgateway.scripts.init_secrets
# Patch the generated secrets into .env (replaces __REPLACE_ME__ placeholders)
python3 -m mcpgateway.scripts.init_secrets --patch-env .env
# 3️⃣ Start the gateway
mcpgateway --host 0.0.0.0 --port 4444 &
# 4️⃣ Generate a bearer token and smoke-test
export JWT_SECRET_KEY=$(grep '^JWT_SECRET_KEY=' .env | cut -d= -f2)
export MCPGATEWAY_BEARER_TOKEN=$(python3 -m mcpgateway.utils.create_jwt_token \
--username admin@example.com --exp 10080 --secret "$JWT_SECRET_KEY")
curl -s -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
http://127.0.0.1:4444/version | jq
Windows (PowerShell) início rápido
# 1️⃣ Isolated env + install from PyPI
mkdir mcpgateway ; cd mcpgateway
python3 -m venv .venv ; .\.venv\Scripts\Activate.ps1
pip install --upgrade pip
pip install mcp-contextforge-gateway
# 2️⃣ Download .env.example and generate real secrets
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/IBM/mcp-context-forge/main/.env.example" -OutFile ".env.example"
Copy-Item .env.example .env
# Generate cryptographically secure secrets into .env.secrets
python3 -m mcpgateway.scripts.init_secrets
# Patch the generated secrets into .env (replaces __REPLACE_ME__ placeholders)
python3 -m mcpgateway.scripts.init_secrets --patch-env .env
# 3️⃣ Launch the gateway
mcpgateway.exe --host 0.0.0.0 --port 4444
# 4️⃣ Bearer token and smoke-test
$Env:JWT_SECRET_KEY = (Get-Content .env | Select-String '^JWT_SECRET_KEY=').ToString().Split('=')[1]
$Env:MCPGATEWAY_BEARER_TOKEN = python3 -m mcpgateway.utils.create_jwt_token `
--username admin@example.com --exp 10080 --secret $Env:JWT_SECRET_KEY
curl -s -H "Authorization: Bearer $Env:MCPGATEWAY_BEARER_TOKEN" `
http://127.0.0.1:4444/version | jq
⚡ Alternativa: uv (mais rápido)
# 1️⃣ Isolated env + install from PyPI using uv
mkdir mcpgateway ; cd mcpgateway
uv venv
.\.venv\Scripts\activate
uv pip install mcp-contextforge-gateway
# Continue with steps 2️⃣-4️⃣ above...
Mais configuração
Copie .env.example para .env e ajuste qualquer uma das configurações (ou use-as como variáveis de ambiente).
🚀 Demonstração ponta a ponta (registrar um servidor MCP local)
# 1️⃣ Spin up the sample MCP time server using mcpgateway.translate & docker (replace docker with podman if needed)
python3 -m mcpgateway.translate \
--stdio "docker run --rm -i ghcr.io/ibm/fast-time-server:latest -transport=stdio" \
--expose-sse \
--port 8003
# Or using the official mcp-server-git using uvx:
pip install uv # to install uvx, if not already installed
python3 -m mcpgateway.translate --stdio "uvx mcp-server-git" --expose-sse --port 9000
# NEW: Expose via multiple protocols simultaneously!
python3 -m mcpgateway.translate \
--stdio "uvx mcp-server-git" \
--expose-sse \
--expose-streamable-http \
--port 9000
# Now accessible via both /sse (SSE) and /mcp (streamable HTTP) endpoints
# 2️⃣ Register it with the gateway
curl -s -X POST -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"fast_time","url":"http://localhost:8003/sse"}' \
http://localhost:4444/gateways
# 3️⃣ Verify tool catalog
curl -s -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" http://localhost:4444/tools | jq
# 4️⃣ Create a *virtual server* bundling those tools. Use the ID of tools from the tool catalog (Step #3) and pass them in the associatedTools list.
curl -s -X POST -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"server":{"name":"time_server","description":"Fast time tools","associated_tools":[<ID_OF_TOOLS>]}}' \
http://localhost:4444/servers | jq
# Example curl
curl -s -X POST -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"server":{"name":"time_server","description":"Fast time tools","associated_tools":["6018ca46d32a4ac6b4c054c13a1726a2"]}}' \
http://localhost:4444/servers | jq
# 5️⃣ List servers (should now include the UUID of the newly created virtual server)
curl -s -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" http://localhost:4444/servers | jq
# 6️⃣ Client HTTP endpoint. Inspect it interactively with the MCP Inspector CLI (or use any MCP client)
npx -y @modelcontextprotocol/inspector
# Transport Type: Streamable HTTP, URL: http://localhost:4444/servers/UUID_OF_SERVER_1/mcp, Header Name: "Authorization", Bearer Token
Início Rápido - Contêineres
Use a imagem OCI oficial do GHCR com Docker ou Podman. Observe: Atualmente, arm64 não é suportado em produção. Se você estiver, por exemplo, executando no MacOS com chips Apple Silicon (M1, M2, etc.), você pode executar os contêineres usando Rosetta ou instalar via PyPI.
🚀 Início Rápido - Docker Compose
Importante:
docker compose up -dnão constrói a imagem do gateway localmente por padrão — ele usa a imagem pré-construída do GHCR. O arquivo compose inclui um blocobuild:como fallback, mas construções locais exigem um fechamento hermético de wheel que só é produzido pelo pipeline de CI. Se você vir um erro decryptographyou de resolução de dependências durante a construção, você está enfrentando isso — basta puxar a imagem (o passo 2 abaixo lida com isso automaticamente).Você também deve ter um arquivo
.envcom segredos reais antes de executardocker compose up -d. O gateway não iniciará com valores de espaço reservado.
Obtenha uma pilha completa em execução com PostgreSQL e Redis:
# 1️⃣ Clone the repository
git clone https://github.com/IBM/mcp-context-forge.git
cd mcp-context-forge
# 2️⃣ Set up .env with real secrets AND pull the pre-built images
cp .env.example .env
python3 -m mcpgateway.scripts.init_secrets --patch-env .env
# .env now has strong JWT_SECRET_KEY and AUTH_ENCRYPTION_SECRET
# Pull pre-built images from GHCR (avoids local build entirely)
docker pull ghcr.io/ibm/mcp-context-forge:latest
echo 'IMAGE_LOCAL=ghcr.io/ibm/mcp-context-forge:latest' >> .env
# Build only the nginx image (small, local-only, builds in seconds)
docker compose build nginx
# 3️⃣ Start the full stack
docker compose up -d
# 4️⃣ Check status
docker compose ps
# 5️⃣ View logs
docker compose logs -f gateway
# 6️⃣ Access Admin UI: http://localhost:8080/admin
# Login: PLATFORM_ADMIN_EMAIL / PLATFORM_ADMIN_PASSWORD (from .env)
# 7️⃣ Generate an API token
export JWT_SECRET_KEY=$(grep '^JWT_SECRET_KEY=' .env | cut -d= -f2)
docker compose exec gateway python3 -m mcpgateway.utils.create_jwt_token \
--username admin@example.com --exp 10080 --secret "$JWT_SECRET_KEY"
O que você obtém:
- 🗄️ PostgreSQL - Banco de dados pronto para produção com mais de 55 tabelas
- 🚀 ContextForge - Gateway completo com Interface de Administração
- 📊 Redis - Cache de alto desempenho e armazenamento de sessão
- 🔧 Ferramentas de Administração - pgAdmin, Redis Insight para gerenciamento de banco de dados
- 🌐 Proxy Nginx - Proxy reverso com cache na porta 8080
Habilitar HTTPS (opcional):
# Start with TLS enabled (auto-generates self-signed certs)
make compose-tls
# Access via HTTPS: https://localhost:8443/admin
# Or bring your own certificates:
# Unencrypted key:
mkdir -p certs
cp your-cert.pem certs/cert.pem && cp your-key.pem certs/key.pem
make compose-tls
# Passphrase-protected key:
mkdir -p certs
cp your-cert.pem certs/cert.pem && cp your-encrypted-key.pem certs/key-encrypted.pem
echo "KEY_FILE_PASSWORD=your-passphrase" >> .env
make compose-tls
☸️ Início Rápido - Helm (Kubernetes)
Implante no Kubernetes com recursos de nível empresarial:
# Add Helm repository (when available)
# helm repo add mcp-context-forge https://ibm.github.io/mcp-context-forge
# helm repo update
# For now, use local chart
git clone https://github.com/IBM/mcp-context-forge.git
cd mcp-context-forge/charts/mcp-stack
# Generate secrets first
python3 -m mcpgateway.scripts.init_secrets
JWT_SECRET=$(grep '^JWT_SECRET_KEY=' .env.secrets | cut -d= -f2)
ENC_SECRET=$(grep '^AUTH_ENCRYPTION_SECRET=' .env.secrets | cut -d= -f2)
# Install with PostgreSQL (default)
# IMPORTANT: replace <strong-password> with a real password — do not use 'changeme' in production
helm install mcp-gateway . \
--set mcpContextForge.secret.PLATFORM_ADMIN_EMAIL=admin@yourcompany.com \
--set mcpContextForge.secret.PLATFORM_ADMIN_PASSWORD=<strong-password> \
--set mcpContextForge.secret.BASIC_AUTH_PASSWORD=<strong-password> \
--set "mcpContextForge.secret.JWT_SECRET_KEY=${JWT_SECRET}" \
--set "mcpContextForge.secret.AUTH_ENCRYPTION_SECRET=${ENC_SECRET}"
# Check deployment status
kubectl get pods -l app.kubernetes.io/name=mcp-context-forge
# Port forward to access Admin UI
kubectl port-forward svc/mcp-gateway-mcp-context-forge 4444:80
# Access: http://localhost:4444/admin
# Generate API token (reads JWT_SECRET_KEY from the pod's environment)
kubectl exec deployment/mcp-gateway-mcp-context-forge -- \
python3 -m mcpgateway.utils.create_jwt_token \
--username admin@yourcompany.com --exp 10080 --secret "${JWT_SECRET}"
Nota sobre SSRF: O Helm usa configurações SSRF estritas por padrão (
SSRF_ALLOW_PRIVATE_NETWORKS=false). Se você registrar URLs de ferramentas dentro do cluster, permita apenas os CIDRs do seu cluster viamcpContextForge.config.SSRF_ALLOWED_NETWORKSou, para configurações de benchmark apenas locais, defina temporariamenteSSRF_ALLOW_PRIVATE_NETWORKS=true. Consultedocs/docs/manage/configuration.md#ssrf-protectionedocs/docs/deployment/helm.md.
Recursos Empresariais:
- 🔄 Auto-escala - HPA com alvos de CPU/memória
- 🗄️ Escolha de Banco de Dados - PostgreSQL (produção), SQLite (desenvolvimento)
- 📊 Observabilidade - Métricas Prometheus, rastreamento OpenTelemetry
- 🔒 Segurança - RBAC, políticas de rede, gerenciamento de segredos
- 🚀 Alta Disponibilidade - Implantações multi-réplica com clustering Redis
- 📈 Monitoramento - Painéis Grafana integrados e alertas
🐳 Docker (Contêiner Único)
# Generate secrets first (creates .env.secrets)
python3 -m mcpgateway.scripts.init_secrets
export JWT_SECRET_KEY="$(grep '^JWT_SECRET_KEY=' .env.secrets | cut -d= -f2)"
export AUTH_ENCRYPTION_SECRET="$(grep '^AUTH_ENCRYPTION_SECRET=' .env.secrets | cut -d= -f2)"
docker run -d --name mcpgateway \
-p 4444:4444 \
-e MCPGATEWAY_UI_ENABLED=true \
-e MCPGATEWAY_ADMIN_API_ENABLED=true \
-e HOST=0.0.0.0 \
-e JWT_SECRET_KEY="${JWT_SECRET_KEY}" \
-e AUTH_ENCRYPTION_SECRET="${AUTH_ENCRYPTION_SECRET}" \
-e AUTH_REQUIRED=true \
-e PLATFORM_ADMIN_EMAIL=admin@example.com \
-e PLATFORM_ADMIN_PASSWORD=<strong-password> \
-e PLATFORM_ADMIN_FULL_NAME="Platform Administrator" \
-e DATABASE_URL=sqlite:///./mcp.db \
-e SECURE_COOKIES=false \
ghcr.io/ibm/mcp-context-forge:latest
# Tail logs
docker logs -f mcpgateway
# Generate API token (using the same secret)
docker run --rm -it \
-e JWT_SECRET_KEY="${JWT_SECRET_KEY}" \
ghcr.io/ibm/mcp-context-forge:latest \
python3 -m mcpgateway.utils.create_jwt_token \
--username admin@example.com --exp 10080 --secret "${JWT_SECRET_KEY}"
Navegue para http://localhost:4444/admin e faça login com PLATFORM_ADMIN_EMAIL / PLATFORM_ADMIN_PASSWORD.
Avançado: Armazenamento persistente, rede do host, isolado
Persistir banco de dados SQLite:
mkdir -p $(pwd)/data && touch $(pwd)/data/mcp.db && chmod 777 $(pwd)/data
docker run -d --name mcpgateway --restart unless-stopped \
-p 4444:4444 -v $(pwd)/data:/data \
-e DATABASE_URL=sqlite:////data/mcp.db \
-e MCPGATEWAY_UI_ENABLED=true -e MCPGATEWAY_ADMIN_API_ENABLED=true \
-e HOST=0.0.0.0 -e JWT_SECRET_KEY="${JWT_SECRET_KEY}" \
-e AUTH_ENCRYPTION_SECRET="${AUTH_ENCRYPTION_SECRET}" \
-e PLATFORM_ADMIN_EMAIL=admin@example.com -e PLATFORM_ADMIN_PASSWORD=<strong-password> \
ghcr.io/ibm/mcp-context-forge:latest
Rede do host (acessar servidores MCP locais):
docker run -d --name mcpgateway --network=host \
-v $(pwd)/data:/data -e DATABASE_URL=sqlite:////data/mcp.db \
-e MCPGATEWAY_UI_ENABLED=true -e HOST=0.0.0.0 -e PORT=4444 \
-e JWT_SECRET_KEY="${JWT_SECRET_KEY}" -e AUTH_ENCRYPTION_SECRET="${AUTH_ENCRYPTION_SECRET}" \
ghcr.io/ibm/mcp-context-forge:latest
Implantação isolada (sem internet):
docker build -f Containerfile -t mcpgateway:airgapped .
docker run -d --name mcpgateway -p 4444:4444 \
-e MCPGATEWAY_UI_AIRGAPPED=true -e MCPGATEWAY_UI_ENABLED=true \
-e HOST=0.0.0.0 -e JWT_SECRET_KEY="${JWT_SECRET_KEY}" \
-e AUTH_ENCRYPTION_SECRET="${AUTH_ENCRYPTION_SECRET}" \
mcpgateway:airgapped
🦭 Podman (compatível com rootless)
podman run -d --name mcpgateway \
-p 4444:4444 -e HOST=0.0.0.0 -e DATABASE_URL=sqlite:///./mcp.db \
ghcr.io/ibm/mcp-context-forge:1.0.0-RC-3
Avançado: Armazenamento persistente, rede do host
Persistir SQLite:
mkdir -p $(pwd)/data && chmod 777 $(pwd)/data
podman run -d --name mcpgateway --restart=on-failure \
-p 4444:4444 -v $(pwd)/data:/data \
-e DATABASE_URL=sqlite:////data/mcp.db \
ghcr.io/ibm/mcp-context-forge:1.0.0-RC-3
Rede do host:
podman run -d --name mcpgateway --network=host \
-v $(pwd)/data:/data -e DATABASE_URL=sqlite:////data/mcp.db \
ghcr.io/ibm/mcp-context-forge:1.0.0-RC-3
✏️ Dicas para Docker/Podman
-
Arquivos .env - Coloque todas as linhas
-e FOO=em um arquivo e substitua-as por--env-file .env. Consulte o .env.example fornecido como referência. -
Tags fixadas - Use uma versão explícita (ex.:
1.0.0-RC-3) em vez delatestpara construções reproduzíveis. -
Tokens JWT - Gere um no contêiner em execução (lê o segredo do ambiente do contêiner):
docker exec mcpgateway python3 -m mcpgateway.utils.create_jwt_token \ --username admin@example.com --exp 10080 --secret "${JWT_SECRET_KEY}" -
Atualizações - Pare, remova e execute novamente com o mesmo mount
-v $(pwd)/data:/data; seu banco de dados e configuração permanecem intactos.
🚑 Teste rápido do contêiner em execução
curl -s -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
http://localhost:4444/health | jq
curl -s -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
http://localhost:4444/tools | jq
curl -s -H "Authorization: Bearer $MCPGATEWAY_BEARER_TOKEN" \
http://localhost:4444/version | jq
Início Rápido: Contêiner de Desenvolvimento VS Code
Clone o repositório e abra no VS Code—ele detectará .devcontainer e solicitará "Reabrir no Contêiner". O contêiner inclui Python 3.11, Docker CLI e todas as dependências do projeto.
Para configuração detalhada, fluxos de trabalho e instruções do GitHub Codespaces, consulte Developer Onboarding.
Instalação
make venv install-dev # create .venv + install deps + build Admin UI
make serve # gunicorn on :4444
Nota sobre o workspace Rust:
- As crates Rust pertencentes ao workspace ficam em
crates/e são detectadas pela raizCargo.tomlviacrates/*. - Execute
cargo build,cargo testecargo checka partir da raiz do repositório para cobrir o workspace compartilhado. make venv install-devcria a raiz.venv, que também é reutilizada pelos builds PyO3/maturin do workspace.
Alternativa: UV ou pip
# UV (faster)
uv venv && source .venv/bin/activate
uv pip install -e '.[dev]'
# pip
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
Configuração do adaptador PostgreSQL
Instale o driver psycopg para PostgreSQL:
# Install system dependencies first
# Debian/Ubuntu: sudo apt-get install libpq-dev
# macOS: brew install libpq
uv pip install 'psycopg[binary]' # dev (pre-built wheels)
# or: uv pip install 'psycopg[c]' # production (requires compiler)
Formato da URL de conexão:
DATABASE_URL=postgresql+psycopg://user:password@localhost:5432/mcp
Container PostgreSQL rápido:
docker run --name mcp-postgres \
-e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=mysecretpassword \
-e POSTGRES_DB=mcp -p 5432:5432 -d postgres
Atualização
Para instruções de atualização, guias de migração e procedimentos de rollback, consulte:
- Guia de Atualização — Procedimentos gerais de atualização
- MIGRATION.md — Mudanças que quebram compatibilidade e instruções passo a passo de atualização
- CHANGELOG.md — Histórico de versões e mudanças que quebram compatibilidade
Configuração
⚠️ Se qualquer variável
.envobrigatória estiver ausente ou inválida, o gateway falhará rapidamente na inicialização com um erro de validação via Pydantic.
Copie o .env.example fornecido para .env e atualize os valores sensíveis de segurança abaixo.
🔐 Obrigatório: Definir Antes de Iniciar
Estas variáveis devem ser definidas antes que o gateway inicie. Não há padrões utilizáveis — a aplicação falha na inicialização se estiverem ausentes ou com valores de espaço reservado:
| Variável | Descrição | Como gerar |
|---|---|---|
JWT_SECRET_KEY | Segredo HMAC para assinar JWTs (32+ caracteres) | python3 -m mcpgateway.scripts.init_secrets |
AUTH_ENCRYPTION_SECRET | Frase secreta para criptografar credenciais armazenadas | python3 -m mcpgateway.scripts.init_secrets |
Estas variáveis têm padrões inseguros e devem ser alteradas antes do uso em produção:
| Variável | Descrição | Padrão |
|---|---|---|
BASIC_AUTH_USER | Nome de usuário para autenticação HTTP Basic | admin |
BASIC_AUTH_PASSWORD | Senha para autenticação HTTP Basic | obrigatória — sem padrão; defina via make init-secrets-patch-env |
PLATFORM_ADMIN_EMAIL | E-mail para o usuário administrador de bootstrap | admin@example.com |
PLATFORM_ADMIN_PASSWORD | Senha para o usuário administrador de bootstrap | obrigatória — defina um valor forte antes da primeira execução |
PLATFORM_ADMIN_FULL_NAME | Nome de exibição para o administrador de bootstrap | Admin User |
🔒 Padrões de Segurança (Seguro por Padrão)
Estas configurações estão habilitadas por padrão por segurança — desative apenas para compatibilidade com versões anteriores:
| Variável | Descrição | Padrão |
|---|---|---|
REQUIRE_JTI | Exigir claim JTI em tokens para suporte a revogação | true |
REQUIRE_TOKEN_EXPIRATION | Exigir claim exp em tokens | true |
PUBLIC_REGISTRATION_ENABLED | Permitir auto-registro público de usuários | false |
🛡️ Segurança de Conteúdo
Os limites de tamanho de conteúdo previnem ataques DoS e garantem a estabilidade do sistema:
| Variável | Descrição | Padrão |
|---|---|---|
CONTENT_MAX_RESOURCE_SIZE | Tamanho máximo do conteúdo do recurso (bytes) | 102400 (100KB) |
CONTENT_MAX_PROMPT_SIZE | Tamanho máximo do template de prompt (bytes) | 10240 (10KB) |
Nota: Os limites de tamanho se aplicam apenas a novas operações de criação/atualização. O conteúdo existente não é validado retroativamente.
🌐 Segurança de Roteamento Entre Gateways UAID
Configuração de Segurança UAID
Requisitos de Produção:
O roteamento UAID entre gateways exige configuração de segurança explícita:
-
Configure a Lista de Domínios Permitidos:
UAID_ALLOWED_DOMAINS=["gateway1.example.com", "gateway2.example.com"] -
Garanta a Confiança do JWT:
- Ambos os gateways devem confiar no mesmo emissor de JWT
- Opção A: Segredo compartilhado (mesmo
JWT_SECRET_KEYem todos os gateways) - Opção B: SSO federado (Google, GitHub, Entra ID)
-
Habilite a Autenticação:
AUTH_REQUIRED=true UAID_FORWARD_AUTH=true
Fluxo de Autenticação:
Chamadas entre gateways encaminham o token de portador do usuário via cabeçalho Authorization.
Os gateways remotos validam os tokens por meio do middleware de autenticação existente, preservando o contexto RBAC.
Recursos de Segurança:
- ✅ Padrão de falha fechada: Lista de domínios vazia bloqueia todo o roteamento entre gateways
- ✅ Encaminhamento de token de portador: Autenticação do usuário preservada entre saltos
- ✅ Trilha de auditoria: Gateway de origem e usuário rastreados em cabeçalhos
- ✅ Mensagens de erro claras: Configurações incorretas detectadas na inicialização e em tempo de execução
Solução de Problemas:
- Erro "UAID_ALLOWED_DOMAINS não configurado": Adicione domínios confiáveis à lista de permitidos no .env
- 401/403 do gateway remoto: Verifique se ambos os gateways confiam no mesmo emissor de JWT
- Aviso "prosseguindo sem token de autenticação": Verifique se o middleware de autenticação extrai o token para
request.state.bearer_token
Para arquitetura de segurança detalhada, consulte docs/security/uaid-cross-gateway-auth.md.
⚙️ Padrões do Projeto (Configuração de Desenvolvimento)
Estes valores diferem dos padrões do código para fornecer uma configuração local/de desenvolvimento funcional:
| Variável | Descrição | Padrão |
|---|---|---|
HOST | Endereço de bind | 0.0.0.0 |
MCPGATEWAY_UI_ENABLED | Habilitar painel da UI de Administração | true |
MCPGATEWAY_ADMIN_API_ENABLED | Habilitar endpoints da API de Administração | true |
DATABASE_URL | URL de conexão SQLAlchemy | sqlite:///./mcp.db |
SECURE_COOKIES | Defina false para HTTP (não-HTTPS) em desenvolvimento | false |
📚 Referência Completa de Configuração
Para a lista completa de mais de 300 variáveis de ambiente organizadas por categoria (autenticação, cache, SSO, observabilidade, etc.), consulte a Referência de Configuração.
Execução
Referência Rápida
| Comando | Servidor | Porta | Banco de Dados | Caso de Uso |
|---|---|---|---|---|
make dev | Uvicorn | 8000 | SQLite | Desenvolvimento (instância única, recarga automática) |
make serve | Gunicorn | 4444 | SQLite | Produção de nó único (multi-worker) |
make serve-ssl | Gunicorn | 4444 | SQLite | Produção de nó único com HTTPS |
make compose-up | Docker Compose + Nginx | 8080 | PostgreSQL + Redis | Stack completo (3 réplicas, balanceamento de carga) |
make compose-sso | Docker Compose + Keycloak | 8080 / 8180 | PostgreSQL + Redis | Teste local de SSO (perfil Keycloak) |
make testing-up | Docker Compose + Nginx | 8080 | PostgreSQL + Redis | Ambiente de teste |
Servidor de Desenvolvimento (Uvicorn)
make dev # Uvicorn on :8000 with auto-reload and SQLite
# or
./run.sh --reload --log debug --workers 2
run.shé um wrapper em torno deuvicornque carrega.env, suporta recarga e passa argumentos para o servidor.
Flags principais:
| Flag | Finalidade | Exemplo |
|---|---|---|
-e, --env FILE | carregar arquivo de ambiente | --env prod.env |
-H, --host | endereço de bind | --host 127.0.0.1 |
-p, --port | porta de escuta | --port 8080 |
-w, --workers | workers do gunicorn | --workers 4 |
-r, --reload | recarga automática | --reload |
Servidor de Produção (Gunicorn)
make serve # Gunicorn on :4444 with multiple workers
make serve-ssl # Gunicorn behind HTTPS on :4444 (uses ./certs)
Docker Compose (Stack Completo)
make compose-up # Start full stack: PostgreSQL, Redis, 3 gateway replicas, Nginx on :8080
make compose-sso # Start SSO stack with Keycloak on :8180
make sso-test-login # Run SSO smoke checks (providers + login URL + test users)
make compose-logs # Tail logs from all services
make compose-down # Stop the stack
Manual (Uvicorn)
uvicorn mcpgateway.main:app --host 0.0.0.0 --port 4444 --workers 4
Implantação em Nuvem
O ContextForge pode ser implantado em qualquer plataforma de nuvem importante:
| Plataforma | Guia |
|---|---|
| AWS | Implantação ECS/EKS |
| Azure | Implantação AKS |
| Google Cloud | Cloud Run |
| IBM Cloud | Code Engine |
| Kubernetes | Helm Charts |
| OpenShift | Implantação OpenShift |
Para guias de implantação abrangentes, consulte Documentação de Implantação.
Referência da API
A documentação interativa da API está disponível quando o servidor está em execução:
- Swagger UI — Experimente chamadas de API diretamente no seu navegador
- ReDoc — Navegue pela referência completa de endpoints
Autenticação Rápida:
# Read JWT_SECRET_KEY from your .env (it must already contain a real secret)
export JWT_SECRET_KEY=$(grep '^JWT_SECRET_KEY=' .env | cut -d= -f2)
# Generate a JWT token
export TOKEN=$(python3 -m mcpgateway.utils.create_jwt_token \
--username admin@example.com --exp 10080 --secret "$JWT_SECRET_KEY")
# Test API access
curl -H "Authorization: Bearer $TOKEN" http://localhost:4444/health
Para exemplos abrangentes de curl cobrindo todos os endpoints, consulte o Guia de Uso da API.
Testes
make test # Run unit tests
make lint # Run all linters
make doctest # Run doctests
make coverage # Generate coverage report
Consulte o Guia de Cobertura de Testes de Documentação para detalhes sobre testes de documentação.
Estrutura do Projeto
mcpgateway/ # Core FastAPI application
├── main.py # Entry point
├── config.py # Pydantic Settings configuration
├── db.py # SQLAlchemy ORM models
├── schemas.py # Pydantic validation schemas
├── services/ # Business logic layer (50+ services)
├── routers/ # HTTP endpoint definitions
├── middleware/ # Cross-cutting concerns
└── transports/ # SSE, WebSocket, stdio, streamable HTTP
tests/ # Test suite (7,000+ tests)
docs/docs/ # Full documentation (MkDocs)
charts/ # Kubernetes/Helm charts
plugins/ # Plugin framework and implementations
mcp-servers/ # Sample/test MCP servers (see note below)
Nota: O diretório
mcp-servers/contém servidores de exemplo e teste não suportados, a maioria originada de contribuições da comunidade, fornecidos apenas para fins de demonstração e testes de integração. Eles geralmente não possuem gerenciamento de sessão, estado persistente, multi-tenancy, autenticação e outras preocupações de produção. Eles não passam pelo mesmo rigor de revisão, teste e segurança que o código-fonte principal do ContextForge e não devem ser executados em produção.Segurança: Nunca execute servidores MCP não confiáveis diretamente no seu sistema de arquivos local. Sempre use um sandbox, container ou microVM (por exemplo, gVisor, Firecracker) com capacidades restritas. Tenha cautela ao registrar qualquer servidor MCP remoto, incluindo servidores de catálogos públicos — faça sua própria avaliação de segurança antes de conceder acesso ao seu gateway.
Para a estrutura completa, consulte CONTRIBUTING.md ou execute tree -L 2.
Desenvolvimento
make dev # Dev server with auto-reload (:8000)
make test # Run test suite
make lint # Run all linters
make coverage # Generate coverage report
Execute make para ver todos os alvos disponíveis.
Para fluxos de trabalho de desenvolvimento, consulte:
Solução de Problemas
Problemas comuns e soluções:
| Problema | Correção Rápida |
|---|---|
docker compose up falha com cryptography ou erro de resolução de dependências | A compilação local requer um fechamento de wheel produzido por CI. Execute docker pull ghcr.io/ibm/mcp-context-forge:latest && echo 'IMAGE_LOCAL=ghcr.io/ibm/mcp-context-forge:latest' >> .env e tente novamente |
docker compose up falha com SecurityConfigurationError: jwt_secret_key | .env está ausente ou tem espaços reservados __REPLACE_ME__. Execute cp .env.example .env && python3 -m mcpgateway.scripts.init_secrets --patch-env .env |
docker compose up falha — mcpgateway/nginx-cache acesso negado ao pull | A imagem nginx deve ser compilada localmente: docker compose build nginx |
make dev — nada na porta 8000 | Verifique o terminal para SecurityConfigurationError — execute make ensure-secrets e tente novamente. No WSL2 use http://127.0.0.1:8000 não localhost |
| "disk I/O error" do SQLite no macOS | Evite diretórios sincronizados com iCloud; use ~/mcp-context-forge/data |
| Porta 4444 inacessível no WSL2 | Configure a integração WSL no Docker Desktop |
| Gateway sai imediatamente | Execute cp .env.example .env && python3 -m mcpgateway.scripts.init_secrets --patch-env .env |
ModuleNotFoundError | Execute make install-dev |
Para guias detalhados de solução de problemas, consulte Documentação de Solução de Problemas.
Contribuindo
- Faça um fork do repositório e crie um branch de funcionalidade.
- Execute
make linte corrija quaisquer problemas. - Mantenha
make testverde. - Abra um PR com commits assinados (
git commit -s).
Consulte CONTRIBUTING.md para diretrizes completas e Guia de Problemas #2502 para saber como relatar bugs, solicitar recursos e encontrar problemas para trabalhar.
Changelog
Um changelog completo pode ser encontrado aqui: CHANGELOG.md
Licença
Licenciado sob a Apache License 2.0 — consulte LICENSE
Autores Principais e Mantenedores
- Mihai Criveti — Engenheiro Distinto, IA Agêntica
Agradecimentos especiais aos nossos contribuidores por nos ajudar a melhorar o ContextForge:
