Enkrypt AI Secure MCP Gateway
Um gateway MCP seguro que atua como proxy, fornecendo autenticação, descoberta de ferramentas, cache e aplicação de barreiras de proteção.
Documentação
Enkrypt AI Secure MCP Gateway

📖 Postagem de Blog em Destaque: Aprenda como o Secure MCP Gateway previne os principais ataques e vulnerabilidades em nosso blog mais recente:
Como o Secure MCP Gateway e o MCP Scanner da Enkrypt Previnem os Principais Ataques
Descubra cenários de ataque do mundo real, práticas recomendadas de segurança e como nosso gateway protege suas aplicações de IA.
Visão Geral
Este Secure MCP Gateway é construído com autenticação, descoberta automática de ferramentas, cache e aplicação de guardrails.
Ele fica entre seu cliente MCP e os servidores MCP. Portanto, por sua natureza, ele também atua como um servidor MCP e como um cliente MCP :)
Quando seu cliente MCP se conecta ao Gateway, ele atua como um servidor MCP. Quando o Gateway se conecta ao servidor MCP real, ele atua como um cliente MCP.
-
Veja também:
- CLI-Commands-Reference.md para a lista de comandos e seus usos
- API-Reference.md para a lista de endpoints de API e seus usos
- MCP Gateway Setup Notebook para um passo a passo completo de todos os comandos essenciais
Sumário
- 1. Recursos 🚀
- 2. Etapas de alto nível de como o MCP Gateway funciona 🪜
- 3. Pré-requisitos 🧩
- 4. Configuração do Gateway 👨💻
- 5. (Opcional) Configuração do OpenTelemetry 📊
- 6. Verifique a instalação e confira os arquivos gerados ✅
- 7. Edite a configuração do Gateway conforme necessário ✏️
- 8. Guia de Início Rápido da CLI 🖥️
- 9. (Opcional) Adicione o GitHub MCP Server ao Gateway 🤖
- 9.1 (Opcional) Conecte-se a Servidores MCP com OAuth 🔐
- 10. (Opcional) Proteja o GitHub MCP Server e Teste o Echo Server 🔒
- 11. Recomendações para usar Guardrails 💡
- 12. Outras ferramentas disponíveis 🔧
- 13. (Opcional) Isolamento em Sandbox 🛡️
- 14. Padrões de Implantação 🪂
- 15. Desinstale o Gateway 🗑️
- 16. Solução de Problemas 🕵
- 17. Problemas Conhecidos em Andamento 🏗️
- 18. Limitações Conhecidas ⚠️
- 19. Contribua 🤝
- 20. Testes 🧪
- 21. Licença
1. Recursos

Abaixo está a lista de recursos que o Enkrypt AI Secure MCP Gateway oferece:
-
Autenticação: Usamos Chave Única para autenticar com o Gateway. Também usamos a Enkrypt API Key se você quiser proteger seus MCPs com os Guardrails da Enkrypt. Além disso, um
admin_apikeyseguro (string aleatória de 256 caracteres) é gerado automaticamente na raiz da configuração para operações administrativas da REST API. (Quandoplugins.auth.provideréenkrypt,admin_apikeyé opcional — oapi_keyda nuvem Enkrypt serve também como credencial de administrador para a maioria dos endpoints REST. O endpoint de limpeza de cache especificamente usa uma política mais rigorosa com restrição por org-id sob autenticação em nuvem — veja Política de Autenticação para Hot-Reload.) -
Facilidade de uso: Você pode configurar todos os seus servidores MCP localmente em
enkrypt_mcp_config.jsonou — melhor ainda para equipes e produção — na nuvem Enkrypt (executesecure-mcp-gateway generate-config --provider enkrypt). A nuvem é dona da lista de servidores, das políticas de guardrails e docommon_overrides, e o gateway os busca no momento da requisição com TTL de 5 minutos. -
Descoberta Dinâmica de Ferramentas: O Gateway descobre ferramentas dos servidores MCP dinamicamente e as disponibiliza para o cliente MCP
-
Restringir Invocação de Ferramentas: Se você não quiser que todas as ferramentas de um servidor MCP sejam acessíveis, você pode restringi-las mencionando explicitamente as ferramentas na configuração do Gateway para que apenas as ferramentas permitidas sejam acessíveis ao cliente MCP
-
Cache: Armazenamos em cache a configuração do usuário do gateway e as ferramentas descobertas de vários servidores MCP localmente ou em um servidor de cache externo como KeyDB, se configurado, para melhorar o desempenho
-
Guardrails: Você pode configurar guardrails para cada servidor MCP na Enkrypt tanto no lado de entrada (antes de enviar a requisição ao servidor MCP) quanto no lado de saída (após receber a resposta do servidor MCP)
-
Registro de Logs: Registramos cada requisição e resposta do Gateway localmente nos logs do seu MCP e também os encaminhamos para a Enkrypt (Em breve) para monitoramento. Isso permite que você veja todas as chamadas feitas na sua conta, servidores usados, ferramentas invocadas, requisições bloqueadas, etc.
-
Isolamento em Sandbox: Servidores MCP podem ser iniciados dentro de ambientes sandbox isolados (Docker, Podman ou microVMs) para que um servidor comprometido ou malicioso não possa acessar o sistema de arquivos do host, a rede ou outros recursos. Cada sandbox é efêmero — criado por sessão e destruído quando termina.
1.1 Guardrails

Proteção de Entrada: Detecção de tópicos, filtragem NSFW, detecção de toxicidade, prevenção de ataques de injeção, detecção de palavras-chave, detecção de violação de políticas, detecção de viés e redação de PII (Mais recursos em breve, como proteção de prompt do sistema, proteção de direitos autorais, etc.)
Proteção de Saída: Todas as proteções de entrada mais verificação de aderência e validação de relevância (Mais recursos em breve, como detecção de alucinações, etc.) Também desfazemos automaticamente a redação da resposta se ela foi redigida na entrada.
1.2 Conceitos
-
MCP Config é um array de servidores MCP como
mcp_server_1,mcp_server_2,mcp_server_3etc.- Cada configuração tem um ID único
-
Usuário é um usuário do gateway com email e ID únicos
-
Um projeto é uma coleção de usuários que compartilham um MCP Config
- O projeto tem um nome e ID únicos
- O MCP Config pode ser atualizado ou apontado para uma configuração diferente pelo Administrador
- Usuários podem ser adicionados a múltiplos projetos
-
Uma API Key é criada para uma combinação de usuário e projeto
- Um usuário pode ter diferentes API Keys para diferentes projetos
- Esta API Key é usada para autenticar o usuário e identificar o projeto e o MCP Config corretos
-
Veja 6.5 Exemplo de arquivo de configuração gerado e 7. Edite a configuração do Gateway conforme necessário para referência de esquema
2. Etapas de alto nível de como o MCP Gateway funciona

🪜 Etapas
-
Seu cliente MCP se conecta ao servidor Secure MCP Gateway com a API Key (gerenciado por
src/secure_mcp_gateway/gateway.py). -
O servidor do Gateway busca a configuração do gateway do arquivo
enkrypt_mcp_config.jsonlocal (plugins.auth.provider = "local_apikey") ou da nuvem remota Enkrypt emhttps://api.enkryptai.com/mcp-gateway/get-gateway-config(plugins.auth.provider = "enkrypt"). Veja §14.5 Esquema de Configuração do Gateway para ambas as formas.- Ele armazena a configuração em cache localmente ou em um servidor de cache externo como KeyDB, se configurado, para melhorar o desempenho.
-
Se os guardrails de entrada estiverem habilitados, a requisição é validada antes da chamada de ferramenta (gerenciado por
src/secure_mcp_gateway/guardrail.py).- A requisição é bloqueada se violar qualquer um dos guardrails configurados e o detector específico estiver configurado para bloquear.
-
As requisições são encaminhadas ao Gateway Client (gerenciado por
src/secure_mcp_gateway/client.py). -
O cliente do Gateway encaminha a requisição ao servidor MCP apropriado (gerenciado por
src/secure_mcp_gateway/client.py). -
O servidor MCP processa a requisição e retorna a resposta ao cliente do Gateway.
-
Se foi uma chamada de descoberta de ferramentas, o cliente do Gateway armazena as ferramentas em cache localmente ou em um servidor de cache externo como KeyDB, se configurado. Ele então encaminha a resposta ao servidor do Gateway.
-
O servidor do Gateway recebe a resposta do cliente do Gateway e, se os guardrails de saída estiverem habilitados, valida a resposta contra os guardrails configurados (gerenciado por
src/secure_mcp_gateway/guardrail.py).- A resposta é bloqueada se violar qualquer um dos guardrails configurados e o detector específico estiver configurado para bloquear.
-
O servidor do Gateway encaminha a resposta de volta ao cliente MCP se tudo estiver correto.
3. Pré-requisitos
🔗 Dependências
-
Git 2.43ou superior -
Python 3.11ou superior instalado no seu sistema e acessível pela linha de comando usando o comandopythonoupython3 -
pip 25.0.1ou superior instalado no seu sistema e acessível pela linha de comando usando o comandopipoupython -m pip -
uv 0.7.9ou superior instalado no seu sistema e acessível pela linha de comando usando o comandouvoupython -m uv
🔍 Verifique as versões
-
Verifique se Python, pip e uv estão instalados
-
Se algum dos comandos abaixo falhar, consulte a documentação respectiva para instalá-los corretamente
# ------------------
# Python
# ------------------
python --version
# Example output
Python 3.13.3
# If not, install python from their website and run the version check again
# ------------------
# pip
# ------------------
pip --version
# Example output
pip 25.0.1 from C:\Users\PC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\pip (python 3.13)
# If not, try the following and run the version check again
python -m ensurepip
# ------------------
# uv
# ------------------
uv --version
# Or run with "python -m" if uv is not found directly
# If this works, use "python -m" before all uv commands from now on
python -m uv --version
# Example output
uv 0.7.9 (13a86a23b 2025-05-30)
# If not, try the following and run the version check again
python -m pip install uv
-
Instale o Claude Desktop como Cliente MCP pelo site deles se você ainda não o fez e faça login
- Se você estiver usando Linux e não puder executar nenhuma versão não oficial do Claude Desktop, você pode usar qualquer Cliente MCP suportado para testar o Gateway. Se ele não suportar o comando mcp cli
mcp install, então percorra o código dos scripts e execute os comandos suportados manualmente.
- Se você estiver usando Linux e não puder executar nenhuma versão não oficial do Claude Desktop, você pode usar qualquer Cliente MCP suportado para testar o Gateway. Se ele não suportar o comando mcp cli
-
Quaisquer outras dependências necessárias para os servidores MCP para os quais queremos fazer proxy de requisições
-
Siga as instruções do respectivo servidor MCP para instalar suas dependências
-
Como
Node.js,npx,docker, etc.
-
-
(Opcional) Um servidor de cache como KeyDB instalado e em execução (se você quiser armazenar em cache externamente e não localmente)
🔒 Proteção Opcional com Guardrails da Enkrypt
Se você quiser proteger seus MCPs com os Guardrails da Enkrypt, você precisa fazer o seguinte:
-
Crie uma nova conta se você não tiver uma. É grátis! 🆓 Sem necessidade de cartão de crédito 💳🚫
-
Um
ENKRYPT_API_KEYque você pode obter nas Configurações do Painel Enkrypt -
Para proteger seus MCPs com Guardrails, você pode usar o Guardrail de amostra padrão
Sample Airline Guardrailpara começar ou criar seu próprio Guardrail personalizado -
Para configurar Guardrails personalizados, você precisa fazer login no aplicativo Enkrypt AI ou usar as APIs/SDK
4. Configuração do Gateway
4.1 Instalação Local com pip
📦 Etapas de Instalação via Pip
4.1.1 Baixe e Instale o Pacote
-
Ative um ambiente virtual
python -m venv .secure-mcp-gateway-venv # Activate the virtual environment # On Windows .secure-mcp-gateway-venv\Scripts\activate # On Linux/macOS source .secure-mcp-gateway-venv/bin/activate # Run the below to exit the virtual environment later if needed deactivate -
Instale o pacote. Para mais informações veja https://pypi.org/project/secure-mcp-gateway/
pip install secure-mcp-gateway
4.1.2 Execute o Comando Generate
-
Isso gera o arquivo de configuração em
~/.enkrypt/enkrypt_mcp_config.jsonno macOS e%USERPROFILE%\.enkrypt\enkrypt_mcp_config.jsonno Windowssecure-mcp-gateway generate-config
⚠️ Reexecutando em uma configuração existente?
generate-configse recusa a sobrescrever um arquivo existente por padrão — ele sai comINFO: Config file already exists at <path>. ... use --overwrite flag.Adicione--overwritepara regenerar (um backup.bkp.<YYYYMMDD_HHMMSS>com timestamp é gravado ao lado do original primeiro). A flag também funciona com--provider enkryptabaixo.secure-mcp-gateway generate-config --overwrite
Escolhendo um provedor de autenticação no momento da geração
O comando padrão emite o esquema completo de local-apikey — um servidor echo de exemplo, um projeto padrão, um usuário e uma chave de API do gateway gerada automaticamente — tudo o que você precisa para iniciar offline. Se você preferir que o gateway busque seus servidores/projetos/usuários da nuvem Enkrypt, gere o config mínimo com suporte à nuvem:
secure-mcp-gateway generate-config --provider enkrypt
Isso grava um arquivo muito mais curto contendo apenas:
enkrypt_config.api_keyebase_url(você preenche a apikey)plugins.auth.provider = "enkrypt"com um placeholdergateway_nameplugins.guardrails.provider = "enkrypt"plugins.telemetry.provider = "opentelemetry"(OTLP gRPC paralocalhost:4317, correspondendo ao padrão local-apikey e à stack empacotada Prometheus/Grafana/Jaeger/Loki — definaconfig.enabled: falsese você não tiver um coletor em execução)- Duas entradas comumente ajustadas em
common_mcp_gateway_config(enkrypt_log_level,enkrypt_gateway_cache_expiration_minutes)
Sem blocos locais de mcp_configs / projects / users / apikeys — a nuvem é dona deles. Após a geração, edite o arquivo e defina:
enkrypt_config.api_key→ sua apikey da nuvem Enkryptplugins.auth.config.gateway_name→ osaved_namedo gateway que você criou no console Enkrypt
gateway_nameé o único valor que também pode chegar por requisição, como o cabeçalhoX-Enkrypt-MCP-Gatewaydo cliente MCP, para que um único processo de gateway possa atender vários gateways na nuvem. Quando definido no config, o config vence. Referência completa de chaves de config e cabeçalhos: §7.1 Provedor de autenticação da nuvem Enkrypt e cabeçalhos de gateway.
O arquivo de referência enviado é src/secure_mcp_gateway/example_enkrypt_cloud_config.json — mesma forma que a CLI gera. Use-o como modelo para configs escritos à mão.
Valores de flag suportados:
--provider | Comportamento |
|---|---|
local_apikey (padrão) | Esquema local completo com servidor echo de exemplo, projeto, usuário, chave de API e um admin_apikey de nível raiz para a API admin REST. Compatível com todas as configurações anteriores à 2.2. |
enkrypt | Esquema mínimo com suporte à nuvem. Sem admin_apikey embutido — o enkrypt_config.api_key da nuvem serve também como credencial admin (veja Autenticação de Chave de API Admin). |
🖨️ Exemplo de saída — --provider local_apikey (padrão)
Initializing Enkrypt Secure MCP Gateway
Initializing Enkrypt Secure MCP Gateway Common Utilities Module
Initializing Enkrypt Secure MCP Gateway Module
--------------------------------
SYSTEM INFO:
Using Python interpreter: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Scripts\python.exe
Python version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
Current working directory: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway
PYTHONPATH: Not set
--------------------------------
Installing dependencies...
All dependencies installed successfully.
Initializing Enkrypt Secure MCP Gateway Client Module
Initializing Enkrypt Secure MCP Gateway Guardrail Module
Error: Gateway key is required. Please update your mcp client config and try again.
Getting Enkrypt Common Configuration
config_path: C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
example_config_path: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\example_enkrypt_mcp_config.json
No enkrypt_mcp_config.json file found. Defaulting to example_enkrypt_mcp_config.json
--------------------------------
ENKRYPT_GATEWAY_KEY: ****NULL
enkrypt_log_level: info
is_debug_log_level: False
enkrypt_base_url: https://api.enkryptai.com
enkrypt_api_key: ****_KEY
enkrypt_tool_cache_expiration: 4
enkrypt_gateway_cache_expiration: 24
enkrypt_mcp_use_external_cache: False
enkrypt_async_input_guardrails_enabled: False
--------------------------------
External Cache is not enabled. Using local cache only.
Initializing Enkrypt Secure MCP Gateway CLI Module
Generated default config at C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
🖨️ Exemplo de saída — --provider enkrypt (nuvem)
INFO: Initializing Enkrypt Secure MCP Gateway CLI Module v2.2.0
INFO: HOME_DIR: C:\Users\PC
INFO: GATEWAY_PY_PATH: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\gateway.py
INFO: ECHO_SERVER_PATH: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\bad_mcps\echo_oauth_mcp.py
INFO: PICKED_CONFIG_PATH: C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
INFO: Generating minimal Enkrypt-cloud configuration (plugins.auth.provider=enkrypt)...
SUCCESS: Generated config at C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
INFO: Before starting the gateway, edit the file and set:
* enkrypt_config.api_key (replace 'YOUR_ENKRYPT_API_KEY' with your Enkrypt cloud apikey)
* plugins.auth.config.gateway_name (replace 'your-gateway-saved-name' with the saved_name of the gateway you created in Enkrypt cloud)
Observe que a variante na nuvem pula o longo banner de inicialização/dependências — é um comando rápido e focado. As duas linhas
INFO: Before starting…são a lista de verificação que o operador deve editar; o gateway falhará com um 401 da nuvem Enkrypt na primeira inicialização se você as pular.
4.1.3 Exemplo do arquivo de config gerado
Nota: Os exemplos abaixo mostram o esquema completo emitido por
secure-mcp-gateway generate-config(padrão--provider local_apikey). Cada campo está incluído para que você possa comparar seu arquivo gerado 1:1. O blocooauth_configé enviado desabilitado ("enabled": false) — suas chaves são placeholders que você só precisa preencher se um servidor usar OAuth. O blocotimeout_settingscontém os timeouts por operação que o gateway usa internamente; os padrões são sensatos e raramente precisam de edição.
🍎 Exemplo de arquivo no macOS
- Este é um exemplo do arquivo de configuração padrão gerado pela CLI no macOS:
{
"admin_apikey": "AUTO_GENERATED_256_CHAR_KEY",
"enkrypt_config": {
"api_key": "YOUR_ENKRYPT_API_KEY",
"base_url": "https://api.enkryptai.com"
},
"common_mcp_gateway_config": {
"enkrypt_log_level": "INFO",
"enkrypt_mcp_use_external_cache": false,
"enkrypt_cache_host": "localhost",
"enkrypt_cache_port": 6379,
"enkrypt_cache_db": 0,
"enkrypt_cache_password": null,
"enkrypt_tool_cache_expiration": 4,
"enkrypt_gateway_cache_expiration": 24,
"enkrypt_gateway_cache_expiration_minutes": 5,
"enkrypt_config_watcher_poll_seconds": 2.0,
"enkrypt_async_input_guardrails_enabled": false,
"enkrypt_async_output_guardrails_enabled": false,
"timeout_settings": {
"default_timeout": 90,
"guardrail_timeout": 390,
"auth_timeout": 30,
"tool_execution_timeout": 360,
"discovery_timeout": 540,
"cache_timeout": 15,
"connectivity_timeout": 6,
"escalation_policies": {
"warn_threshold": 0.8,
"timeout_threshold": 1.0,
"fail_threshold": 1.2
}
}
},
"plugins": {
"auth": { "provider": "local_apikey", "config": {} },
"guardrails": { "provider": "enkrypt", "config": {} },
"telemetry": {
"provider": "opentelemetry",
"config": {
"enabled": true,
"url": "http://localhost:4317",
"insecure": true
}
}
},
"mcp_configs": {
"fcbd4508-1432-4f13-abb9-c495c946f638": {
"mcp_config_name": "default_config",
"common_overrides": {
"server_tools_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
}
},
"mcp_config": [
{
"server_name": "echo_server",
"description": "Simple Echo Server",
"config": {
"command": "python",
"args": [
"/Users/user/enkryptai/secure-mcp-gateway/venv/lib/python3.13/site-packages/secure_mcp_gateway/bad_mcps/echo_mcp.py"
]
},
"oauth_config": {
"enabled": false,
"is_remote": false,
"OAUTH_VERSION": "2.1",
"OAUTH_GRANT_TYPE": "client_credentials",
"OAUTH_CLIENT_ID": "your-client-id",
"OAUTH_CLIENT_SECRET": "your-client-secret",
"OAUTH_TOKEN_URL": "https://auth.example.com/oauth/token",
"OAUTH_AUDIENCE": "https://api.example.com",
"OAUTH_ORGANIZATION": "your-org-id",
"OAUTH_SCOPE": "read write",
"OAUTH_RESOURCE": "https://resource.example.com",
"OAUTH_TOKEN_EXPIRY_BUFFER": 300,
"OAUTH_USE_BASIC_AUTH": true,
"OAUTH_ENFORCE_HTTPS": true,
"OAUTH_TOKEN_IN_HEADER_ONLY": true,
"OAUTH_VALIDATE_SCOPES": true,
"OAUTH_USE_MTLS": false,
"OAUTH_CLIENT_CERT_PATH": null,
"OAUTH_CLIENT_KEY_PATH": null,
"OAUTH_CA_BUNDLE_PATH": null,
"OAUTH_REVOCATION_URL": null,
"OAUTH_ADDITIONAL_PARAMS": {},
"OAUTH_CUSTOM_HEADERS": {}
},
"tools": {},
"denied_tools": [],
"input_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"pii_redaction": false
},
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
},
"output_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"relevancy": false,
"hallucination": false,
"adherence": false
},
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
}
}
]
}
},
"projects": {
"3c09f06c-1f0d-4153-9ac5-366397937641": {
"project_name": "default_project",
"mcp_config_id": "fcbd4508-1432-4f13-abb9-c495c946f638",
"users": [
"6469a670-1d64-4da5-b2b3-790de21ac726"
],
"created_at": "2025-07-16T17:02:00.406877"
}
},
"users": {
"6469a670-1d64-4da5-b2b3-790de21ac726": {
"email": "default@example.com",
"created_at": "2025-07-16T17:02:00.406902"
}
},
"apikeys": {
"2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat": {
"project_id": "3c09f06c-1f0d-4153-9ac5-366397937641",
"user_id": "6469a670-1d64-4da5-b2b3-790de21ac726",
"created_at": "2025-07-16T17:02:00.406905"
}
}
}
🪟 Exemplo de arquivo no Windows
- Este é um exemplo do arquivo de configuração padrão gerado pela CLI no Windows:
{
"admin_apikey": "AUTO_GENERATED_256_CHAR_KEY",
"enkrypt_config": {
"api_key": "YOUR_ENKRYPT_API_KEY",
"base_url": "https://api.enkryptai.com"
},
"common_mcp_gateway_config": {
"enkrypt_log_level": "INFO",
"enkrypt_mcp_use_external_cache": false,
"enkrypt_cache_host": "localhost",
"enkrypt_cache_port": 6379,
"enkrypt_cache_db": 0,
"enkrypt_cache_password": null,
"enkrypt_tool_cache_expiration": 4,
"enkrypt_gateway_cache_expiration": 24,
"enkrypt_gateway_cache_expiration_minutes": 5,
"enkrypt_config_watcher_poll_seconds": 2.0,
"enkrypt_async_input_guardrails_enabled": false,
"enkrypt_async_output_guardrails_enabled": false,
"timeout_settings": {
"default_timeout": 90,
"guardrail_timeout": 390,
"auth_timeout": 30,
"tool_execution_timeout": 360,
"discovery_timeout": 540,
"cache_timeout": 15,
"connectivity_timeout": 6,
"escalation_policies": {
"warn_threshold": 0.8,
"timeout_threshold": 1.0,
"fail_threshold": 1.2
}
}
},
"plugins": {
"auth": { "provider": "local_apikey", "config": {} },
"guardrails": { "provider": "enkrypt", "config": {} },
"telemetry": {
"provider": "opentelemetry",
"config": {
"enabled": true,
"url": "http://localhost:4317",
"insecure": true
}
}
},
"mcp_configs": {
"fcbd4508-1432-4f13-abb9-c495c946f638": {
"mcp_config_name": "default_config",
"common_overrides": {
"server_tools_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
}
},
"mcp_config": [
{
"server_name": "echo_server",
"description": "Simple Echo Server",
"config": {
"command": "python",
"args": [
"C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\.secure-mcp-gateway-venv\\Lib\\site-packages\\secure_mcp_gateway\\bad_mcps\\echo_mcp.py"
]
},
"oauth_config": {
"enabled": false,
"is_remote": false,
"OAUTH_VERSION": "2.1",
"OAUTH_GRANT_TYPE": "client_credentials",
"OAUTH_CLIENT_ID": "your-client-id",
"OAUTH_CLIENT_SECRET": "your-client-secret",
"OAUTH_TOKEN_URL": "https://auth.example.com/oauth/token",
"OAUTH_AUDIENCE": "https://api.example.com",
"OAUTH_ORGANIZATION": "your-org-id",
"OAUTH_SCOPE": "read write",
"OAUTH_RESOURCE": "https://resource.example.com",
"OAUTH_TOKEN_EXPIRY_BUFFER": 300,
"OAUTH_USE_BASIC_AUTH": true,
"OAUTH_ENFORCE_HTTPS": true,
"OAUTH_TOKEN_IN_HEADER_ONLY": true,
"OAUTH_VALIDATE_SCOPES": true,
"OAUTH_USE_MTLS": false,
"OAUTH_CLIENT_CERT_PATH": null,
"OAUTH_CLIENT_KEY_PATH": null,
"OAUTH_CA_BUNDLE_PATH": null,
"OAUTH_REVOCATION_URL": null,
"OAUTH_ADDITIONAL_PARAMS": {},
"OAUTH_CUSTOM_HEADERS": {}
},
"tools": {},
"denied_tools": [],
"input_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"pii_redaction": false
},
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
},
"output_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"relevancy": false,
"hallucination": false,
"adherence": false
},
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
}
}
]
}
},
"projects": {
"3c09f06c-1f0d-4153-9ac5-366397937641": {
"project_name": "default_project",
"mcp_config_id": "fcbd4508-1432-4f13-abb9-c495c946f638",
"users": [
"6469a670-1d64-4da5-b2b3-790de21ac726"
],
"created_at": "2025-07-16T17:02:00.406877"
}
},
"users": {
"6469a670-1d64-4da5-b2b3-790de21ac726": {
"email": "default@example.com",
"created_at": "2025-07-16T17:02:00.406902"
}
},
"apikeys": {
"2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat": {
"project_id": "3c09f06c-1f0d-4153-9ac5-366397937641",
"user_id": "6469a670-1d64-4da5-b2b3-790de21ac726",
"created_at": "2025-07-16T17:02:00.406905"
}
}
}
☁️ Exemplo de arquivo com --provider enkrypt (com suporte à nuvem, todas as plataformas)
- Este é o arquivo completo emitido por
secure-mcp-gateway generate-config --provider enkrypt. Mesma forma no macOS, Linux e Windows — apenas o caminho no disco difere (~/.enkrypt/...vs%USERPROFILE%\.enkrypt\...).
{
"enkrypt_config": {
"api_key": "YOUR_ENKRYPT_API_KEY",
"base_url": "https://api.enkryptai.com",
"org_id": "YOUR_ENKRYPT_ORG_ID"
},
"plugins": {
"auth": {
"provider": "enkrypt",
"config": {
"gateway_name": "your-gateway-saved-name",
"gateway_version": "v1",
"cache_ttl_seconds": 300
}
},
"guardrails": {
"provider": "enkrypt",
"config": {}
},
"telemetry": {
"provider": "opentelemetry",
"config": {
"enabled": true,
"url": "http://localhost:4317",
"insecure": true
}
}
},
"common_mcp_gateway_config": {
"enkrypt_log_level": "INFO",
"enkrypt_gateway_cache_expiration_minutes": 5
}
}
O que intencionalmente NÃO está aqui (a nuvem é dona disso):
- Sem blocos
mcp_configs/projects/users/apikeys— o gateway os resolve da nuvem Enkrypt via/mcp-gateway/get-gateway-configem cada requisição autenticada. - Sem
admin_apikeyde nível raiz — oenkrypt_config.api_keyda nuvem serve também como credencial admin para a maioria dos endpoints REST (veja Autenticação de Chave de API Admin). O endpoint de limpeza de cache especificamente exige queenkrypt_config.org_idesteja definido e valida apikeys recebidas contraGET /consumer-info.org_id— veja Política de autorização de limpeza de cache. Se você quiser um segredo admin separado para endpoints que não sejam de limpeza, adicione"admin_apikey": "<256-char-key>"na raiz. - Sem flags legadas
enkrypt_use_remote_mcp_config/enkrypt_remote_mcp_gateway_*— elas só acionam o fallback de busca remota descontinuadolocal_apikey. O provedorenkrypttem seu próprio fluxo de config na nuvem mais limpo emEnkryptAuthProvider.
Dois valores que o operador deve editar antes da primeira inicialização:
enkrypt_config.api_key→ sua apikey real da nuvem Enkryptplugins.auth.config.gateway_name→ osaved_namedo gateway que você criou no console Enkrypt
O arquivo de referência enviado em src/secure_mcp_gateway/example_enkrypt_cloud_config.json é byte por byte idêntico a este exemplo.
4.1.4 Instale o Gateway para Claude Desktop
-
Execute o seguinte comando para instalar o gateway para Claude:
secure-mcp-gateway install --client claude-desktop -
Isso registrará o Enkrypt Secure MCP Gateway com o Claude Desktop.
-
NOTA: Reinicie o Claude Desktop após a instalação
🖨️ Exemplo de saída
Initializing Enkrypt Secure MCP Gateway
Initializing Enkrypt Secure MCP Gateway Common Utilities Module
Initializing Enkrypt Secure MCP Gateway Module
--------------------------------
SYSTEM INFO:
Using Python interpreter: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Scripts\python.exe
Python version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
Current working directory: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway
PYTHONPATH: Not set
--------------------------------
Installing dependencies...
All dependencies installed successfully.
Initializing Enkrypt Secure MCP Gateway Client Module
Initializing Enkrypt Secure MCP Gateway Guardrail Module
Error: Gateway key is required. Please update your mcp client config and try again.
Getting Enkrypt Common Configuration
config_path: C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
example_config_path: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\example_enkrypt_mcp_config.json
Loading enkrypt_mcp_config.json file...
--------------------------------
ENKRYPT_GATEWAY_KEY: ****NULL
enkrypt_log_level: info
is_debug_log_level: False
enkrypt_base_url: https://api.enkryptai.com
enkrypt_api_key: ****_KEY
enkrypt_tool_cache_expiration: 4
enkrypt_gateway_cache_expiration: 24
enkrypt_mcp_use_external_cache: False
enkrypt_async_input_guardrails_enabled: False
--------------------------------
External Cache is not enabled. Using local cache only.
Initializing Enkrypt Secure MCP Gateway CLI Module
CONFIG_PATH: C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
GATEWAY_PY_PATH: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\gateway.py
client name from args: claude-desktop
Successfully installed gateway for claude-desktop
Path to gateway is incorrect. Modifying the path to gateway in claude_desktop_config.json file...
Path to gateway modified in claude_desktop_config.json file
Please restart Claude Desktop to use the gateway.
4.1.5 Exemplo do Config do Claude Desktop após a instalação
A forma das variáveis de ambiente depende do
plugins.auth.providerdo seu gateway. Mesma dicotomia da seção do Cursor abaixo:
- Provedor
local_apikey(padrão) → três variáveis de ambiente:ENKRYPT_GATEWAY_KEY+ENKRYPT_PROJECT_ID+ENKRYPT_USER_ID- Provedor de nuvem
enkrypt→ variável de ambiente única:ENKRYPT_APIKEY
🍎 Exemplo de arquivo no macOS
-
~/Library/Application Support/Claude/claude_desktop_config.json— provedor local_apikey (padrão){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "/Users/user/enkryptai/secure-mcp-gateway/venv/lib/python3.13/site-packages/secure_mcp_gateway/gateway.py" ], "env": { "ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat", "ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641", "ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726" } } } } -
~/Library/Application Support/Claude/claude_desktop_config.json— provedor de nuvem enkrypt (quando gerado com--provider enkrypt){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "/Users/user/enkryptai/secure-mcp-gateway/venv/lib/python3.13/site-packages/secure_mcp_gateway/gateway.py" ], "env": { "ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey" } } } }
🪟 Exemplo de arquivo no Windows
-
%USERPROFILE%\AppData\Roaming\Claude\claude_desktop_config.json— provedor local_apikey (padrão){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\.secure-mcp-gateway-venv\\Lib\\site-packages\\secure_mcp_gateway\\gateway.py" ], "env": { "ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat", "ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641", "ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726" } } } } -
%USERPROFILE%\AppData\Roaming\Claude\claude_desktop_config.json— provedor de nuvem enkrypt (quando gerado com--provider enkrypt){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\.secure-mcp-gateway-venv\\Lib\\site-packages\\secure_mcp_gateway\\gateway.py" ], "env": { "ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey" } } } }
4.1.6 Instale o Gateway para Cursor
-
Execute o comando de instalação da CLI para Cursor
secure-mcp-gateway install --client cursor -
Isso atualiza automaticamente seu ~/.cursor/mcp.json (no Windows fica em: %USERPROFILE%.cursor\mcp.json) com a entrada correta.
-
Embora normalmente não seja necessário reiniciar, se você vir em estado de carregamento por muito tempo, reinicie o Cursor
A forma das variáveis de ambiente depende do
plugins.auth.providerdo seu gateway. O comando de instalação grava a forma que corresponde:
Provedor Variáveis de ambiente gravadas Usado para local_apikey(padrão)ENKRYPT_GATEWAY_KEY+ENKRYPT_PROJECT_ID+ENKRYPT_USER_IDBuscar a apikey local + projeto + usuário no seu config local enkrypt(nuvem)ENKRYPT_APIKEYApikey única da nuvem; projeto/usuário vêm da nuvem Enkrypt Ambas as formas
mcp.jsonabaixo são válidas — escolha a que corresponde a como você gerou seu config. Veja Seção 4.1.2 para a flag--provider enkrypt.
🍎 Exemplo de arquivo no macOS
-
~/.cursor/mcp.json— provedor local_apikey (padrão){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "/Users/user/enkryptai/secure-mcp-gateway/venv/lib/python3.13/site-packages/secure_mcp_gateway/gateway.py" ], "env": { "ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat", "ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641", "ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726" } } } } -
~/.cursor/mcp.json— provedor de nuvem enkrypt (quando gerado com--provider enkrypt){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "/Users/user/enkryptai/secure-mcp-gateway/venv/lib/python3.13/site-packages/secure_mcp_gateway/gateway.py" ], "env": { "ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey" } } } }
🪟 Exemplo de arquivo no Windows
-
%USERPROFILE%\.cursor\mcp.json— provedor local_apikey (padrão){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\.secure-mcp-gateway-venv\\Lib\\site-packages\\secure_mcp_gateway\\gateway.py" ], "env": { "ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat", "ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641", "ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726" } } } }Se
mcpnão estiver no seu PATH (por exemplo, você não ativou o venv), você pode envolvê-lo comuv:"command": "uv", "args": ["run", "--with", "mcp[cli]", "mcp", "run", "<full path to gateway.py>"]O comando
secure-mcp-gateway install --client cursorsempre emite a forma simples"mcp"acima — mude para o wrapperuvapenas se encontrar um erromcp: command not found. -
%USERPROFILE%\.cursor\mcp.json— provedor de nuvem enkrypt (quando gerado com--provider enkrypt){ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\.secure-mcp-gateway-venv\\Lib\\site-packages\\secure_mcp_gateway\\gateway.py" ], "env": { "ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey" } } } }
4.1.7 Instale o Gateway para Claude Code
Claude Code é o agente de codificação baseado em CLI da Anthropic. Ele usa comandos claude mcp add para configurar servidores MCP. Diferente do Claude Desktop e do Cursor, que usam arquivos JSON de config, o Claude Code gerencia servidores MCP por meio de sua própria CLI.
Pré-requisito: A CLI
claudedeve estar instalada no seu sistema. Veja documentação do Claude Code para instalação.
Passo 1: Instale o gateway
secure-mcp-gateway install --client claude-code
Isso automaticamente:
- Lê as credenciais do gateway do seu config gerado (ciente do provedor):
- Provedor
local_apikey(padrão) → emite três flags--env:ENKRYPT_GATEWAY_KEY,ENKRYPT_PROJECT_ID,ENKRYPT_USER_ID - Provedor de nuvem
enkrypt→ emite uma única flag--env:ENKRYPT_APIKEY(originada deenkrypt_config.api_key, ou--apikey <key>se você passar na CLI)
- Provedor
- Executa
claude mcp addcom--transport stdioe as credenciais corretas e o caminho do gateway - Registra o servidor como
Enkrypt-Secure-MCP-Gatewaycom--scope user(disponível em todos os projetos do Claude Code)
Passo 2: Verifique se o servidor foi adicionado
claude mcp list
Você deve ver Enkrypt-Secure-MCP-Gateway na lista.
Passo 3: Use o gateway no Claude Code
Inicie o Claude Code e tente:
list all servers, get all tools available
Alternativa manual (se você preferir executar claude mcp add diretamente)
Obtenha suas credenciais do enkrypt_mcp_config.json gerado e o caminho do gateway:
python -c "import secure_mcp_gateway.gateway; print(secure_mcp_gateway.gateway.__file__)"
Então adicione o gateway manualmente. O comando exato depende do plugins.auth.provider do seu gateway (veja §4.1.2):
Para o provedor local_apikey (padrão):
claude mcp add --transport stdio --env ENKRYPT_GATEWAY_KEY=YOUR_GATEWAY_KEY --env ENKRYPT_PROJECT_ID=YOUR_PROJECT_ID --env ENKRYPT_USER_ID=YOUR_USER_ID --scope user Enkrypt-Secure-MCP-Gateway -- mcp run /path/to/secure_mcp_gateway/gateway.py
Para o provedor de nuvem enkrypt (quando gerado com --provider enkrypt):
claude mcp add --transport stdio --env ENKRYPT_APIKEY=YOUR_ENKRYPT_CLOUD_APIKEY --scope user Enkrypt-Secure-MCP-Gateway -- mcp run /path/to/secure_mcp_gateway/gateway.py
Nota: O nome do servidor deve usar hífens ou sublinhados — o Claude Code não permite espaços em nomes.
4.2 Instalação Local com git clone
🗂️ Passos de Instalação via Git Clone
4.2.1 Clone o repositório, configure o ambiente virtual e instale as dependências
- Clone o repositório:
git clone https://github.com/enkryptai/secure-mcp-gateway
cd secure-mcp-gateway
⚡ Ative um ambiente virtual
# ------------------
# Create a virtual environment
# ------------------
uv venv
# Example output
Using CPython 3.13.3 interpreter at: C:\Users\PC\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\python.exe
Creating virtual environment at: .venv
Activate with: .venv\Scripts\activate
# ------------------
# Activate the virtual environment
# ------------------
# For 🍎 Linux/macOS, run the following
source ./.venv/Scripts/activate
# For 🪟 Windows, run the following
.\.venv\Scripts\activate
# After activating, you should see (enkrypt-secure-mcp-gateway) before the file path in the terminal
# Example:
# (enkrypt-secure-mcp-gateway) %USERPROFILE%\Documents\GitHub\EnkryptAI\secure-mcp-gateway>
# ------------------
# Install pip in the virtual environment
# ------------------
python -m ensurepip
# ------------------
# Install uv in the virtual environment
# ------------------
python -m pip install uv
- Instale as dependências Python:
uv pip install -r requirements.txt
- Verifique se a CLI mcp foi instalada com sucesso:
mcp version
# Example output
MCP version 1.9.2
4.2.2 Execute o script de configuração
-
Este script cria o arquivo de config em
~/.enkrypt/enkrypt_mcp_config.jsonno macOS e%USERPROFILE%\.enkrypt\enkrypt_mcp_config.jsonno Windows com base no arquivosrc/secure_mcp_gateway/example_enkrypt_mcp_config.json -
Ele substitui
UNIQUE_GATEWAY_KEYe outrosUUIDspor valores gerados automaticamente e também substituiDUMMY_MCP_FILE_PATHpelo caminho real para o arquivo MCP de testebad_mcps/echo_mcp.py -
Ele também instala o cliente MCP no Claude Desktop
-
NOTA: Por favor, reinicie o Claude Desktop após executar o script de configuração para ver o Gateway em execução no Claude Desktop
# On 🍎 Linux/macOS run the below
cd scripts
chmod +x *.sh
./setup.sh
# On 🪟 Windows run the below
cd scripts
setup.bat
# Now restart Claude Desktop to see the Gateway running
🖨️ Exemplo de saída
-------------------------------
Setting up Enkrypt Secure MCP Gateway enkrypt_mcp_config.json config file
-------------------------------
1 file(s) copied.
Generated unique gateway key: WTZOpoU1mXJz8b_ZJQ42DuSXlQCSCtWOn3FX0jG8sO_FKYNJetjYEgSluvhtBN8_
Generated unique uuid: 7920749a-228e-47fe-a6a9-cd2d64a2283b
DUMMY_MCP_FILE_PATH: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\src\secure_mcp_gateway\bad_mcps\echo_mcp.py
-------------------------------
Setup complete. Please check the enkrypt_mcp_config.json file in the ~\.enkrypt directory and update with your MCP server configs as needed.
-------------------------------
-------------------------------
Installing Enkrypt Secure MCP Gateway with gateway key and dependencies
-------------------------------
mcp is installed. Proceeding with installation...
ENKRYPT_GATEWAY_KEY: WTZOpoU1mXJz8b_ZJQ42DuSXlQCSCtWOn3FX0jG8sO_FKYNJetjYEgSluvhtBN8_
The system cannot find the path specified.
Package names only:
Dependencies string for the cli install command:
Running the cli install command: mcp install gateway.py --env-var ENKRYPT_GATEWAY_KEY=WTZOpoU1mXJz8b_ZJQ42DuSXlQCSCtWOn3FX0jG8sO_FKYNJetjYEgSluvhtBN8_
Initializing Enkrypt Secure MCP Gateway
Initializing Enkrypt Secure MCP Gateway Common Utilities Module
Initializing Enkrypt Secure MCP Gateway Module
--------------------------------
SYSTEM INFO:
Using Python interpreter: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Scripts\python.exe
Python version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
Current working directory: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\src\secure_mcp_gateway
PYTHONPATH: Not set
--------------------------------
Installing dependencies...
All dependencies installed successfully.
Initializing Enkrypt Secure MCP Gateway Client Module
Initializing Enkrypt Secure MCP Gateway Guardrail Module
Getting Enkrypt Common Configuration
config_path: C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
example_config_path: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\example_enkrypt_mcp_config.json
Loading enkrypt_mcp_config.json file...
--------------------------------
ENKRYPT_GATEWAY_KEY: ****BN8_
enkrypt_log_level: info
is_debug_log_level: False
enkrypt_base_url: https://api.enkryptai.com
enkrypt_api_key: ****_KEY
enkrypt_tool_cache_expiration: 4
enkrypt_gateway_cache_expiration: 24
enkrypt_mcp_use_external_cache: False
enkrypt_async_input_guardrails_enabled: False
--------------------------------
External Cache is not enabled. Using local cache only.
Initializing Enkrypt Secure MCP Gateway Module
--------------------------------
SYSTEM INFO:
Using Python interpreter: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Scripts\python.exe
Python version: 3.13.3 (tags/v3.13.3:6280bb5, Apr 8 2025, 14:47:33) [MSC v.1943 64 bit (AMD64)]
Current working directory: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\src\secure_mcp_gateway
PYTHONPATH: Not set
--------------------------------
Installing dependencies...
All dependencies installed successfully.
Getting Enkrypt Common Configuration
config_path: C:\Users\PC\.enkrypt\enkrypt_mcp_config.json
example_config_path: C:\Users\PC\Documents\GitHub\EnkryptAI\secure-mcp-gateway\.secure-mcp-gateway-venv\Lib\site-packages\secure_mcp_gateway\example_enkrypt_mcp_config.json
Loading enkrypt_mcp_config.json file...
--------------------------------
ENKRYPT_GATEWAY_KEY: ****BN8_
enkrypt_log_level: info
is_debug_log_level: False
enkrypt_base_url: https://api.enkryptai.com
enkrypt_api_key: ****_KEY
enkrypt_tool_cache_expiration: 4
enkrypt_gateway_cache_expiration: 24
enkrypt_mcp_use_external_cache: False
enkrypt_async_input_guardrails_enabled: False
--------------------------------
External Cache is not enabled. Using local cache only.
[06/15/25 13:14:10] INFO Added server 'Enkrypt Secure MCP Gateway' to Claude config claude.py:137
INFO Successfully installed Enkrypt Secure MCP Gateway in Claude app cli.py:486
-------------------------------
Installation complete. Check the claude_desktop_config.json file as per the readme instructions and restart Claude Desktop.
-------------------------------
4.2.3 Configurar Outros Clientes MCP
⬡ Cursor
-
Você pode navegar até o arquivo MCP Global do cursor em
~/.cursor/mcp.jsonno Linux/macOS ou%USERPROFILE%\.cursor\mcp.jsonno Windows- Se você quiser usar em nível de Projeto, coloque-o dentro do seu projeto. Para detalhes, veja Documentação do Cursor
-
Você também pode navegar até o arquivo pela interface do Cursor clicando no ícone de engrenagem
settingsno canto superior direito
-
Clique em
MCPe depois clique emAdd new global MCP server, o que leva você ao arquivomcp.json
-
Exemplo de arquivo
mcp.jsonaberto no editor
-
Uma vez que o arquivo esteja aberto no nível Global ou de Projeto, você pode copiar e colar a mesma configuração que usamos em
Claude Desktop. Para referência, consulte Instalação - 6.2 Exemplo de arquivo de configuração MCP gerado 📄- Certifique-se de usar seu próprio arquivo gerado pelo script
setupem Instalação - 4.2.2 Executar o script de configuração 📥. Por favor, não copie e cole o arquivo de configuração de exemplo deste repositório.
- Certifique-se de usar seu próprio arquivo gerado pelo script
-
Veja a seção Verificar Cursor para verificar se o servidor MCP está em execução no Cursor
⬡ Claude Code
-
Claude Code usa sua própria CLI para gerenciar servidores MCP em vez de arquivos de configuração JSON
-
Obtenha suas credenciais do
enkrypt_mcp_config.jsongerado (chave do gateway, ID do projeto, ID do usuário) -
Encontre o caminho do gateway.py:
python -c "import secure_mcp_gateway.gateway; print(secure_mcp_gateway.gateway.__file__)" -
Adicione o gateway ao Claude Code. As variáveis de ambiente diferem conforme o provedor de autenticação:
# For local_apikey provider (default) claude mcp add --transport stdio --env ENKRYPT_GATEWAY_KEY=YOUR_GATEWAY_KEY --env ENKRYPT_PROJECT_ID=YOUR_PROJECT_ID --env ENKRYPT_USER_ID=YOUR_USER_ID --scope user Enkrypt-Secure-MCP-Gateway -- mcp run /path/to/secure_mcp_gateway/gateway.py # For enkrypt cloud provider (generated with --provider enkrypt) claude mcp add --transport stdio --env ENKRYPT_APIKEY=YOUR_ENKRYPT_CLOUD_APIKEY --scope user Enkrypt-Secure-MCP-Gateway -- mcp run /path/to/secure_mcp_gateway/gateway.py -
Verificar:
claude mcp list -
Para configuração detalhada, veja 4.1.7 Instalar o Gateway para Claude Code
4.3 Instalação via Docker
🐳 Etapas de Instalação via Docker
4.3.1 Construir a Imagem Docker
docker build -t secure-mcp-gateway .
Marque sua build para que o wrapper
--dockera encontre. A partir da v2.2.0, o wrappersecure-mcp-gateway --docker ...puxaenkryptai/secure-mcp-gateway:<your-host-CLI-version>por padrão (ex.:enkryptai/secure-mcp-gateway:2.2.0). Até que essa tag exata seja publicada no Docker Hub, todo comando--dockerfalha comUnable to find image ... not found. Corrija isso uma vez marcando sua build local para corresponder (encontre sua versão comsecure-mcp-gateway --version):# Substitua 2.2.0 pela saída de `secure-mcp-gateway --version` docker tag secure-mcp-gateway:latest enkryptai/secure-mcp-gateway:2.2.0Após este único comando, todo
secure-mcp-gateway --docker generate-config,--docker install --client X,--docker config list, etc. no restante da §4.3 funciona sem precisar de substituições de--docker-image.
🖨️ Exemplo de saída
Truncado para legibilidade — a saída real inclui um longo despejo de dependências pip na etapa
[18/18] RUN pip3 install --break-system-packages .. Builds iniciais normalmente levam 3–5 minutos dependendo da rede/CPU; rebuilds subsequentes são majoritariamente em cache e concluem em menos de 30s.
[+] Building 72.9s (20/20) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 724B 0.1s
=> [internal] load metadata for docker.io/library/python:3.11-alpine 1.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 456B 0.1s
=> [ 1/15] FROM docker.io/library/python:3.11-alpine@sha256:8068890a42d68ece5b62455ef327253249b5f094dcdee57f492635a40217f6a3 0.0s
=> => resolve docker.io/library/python:3.11-alpine@sha256:8068890a42d68ece5b62455ef327253249b5f094dcdee57f492635a40217f6a3 0.0s
=> [internal] load build context 1.5s
=> => transferring context: 82.25kB 1.4s
=> CACHED [ 2/15] WORKDIR /app 0.0s
=> CACHED [ 3/15] COPY requirements.txt . 0.0s
=> [ 4/15] COPY requirements-dev.txt . 0.0s
=> [ 5/15] RUN pip install --upgrade pip && pip install -r requirements.txt && pip install -r requirements-dev.txt 38.7s
=> [ 6/15] COPY src src 0.2s
=> [ 7/15] COPY setup.py setup.py 0.1s
=> [ 8/15] COPY MANIFEST.in MANIFEST.in 0.1s
=> [ 9/15] COPY pyproject.toml pyproject.toml 0.1s
=> [10/15] COPY CHANGELOG.md CHANGELOG.md 0.1s
=> [11/15] COPY LICENSE.txt LICENSE.txt 0.1s
=> [12/15] COPY README.md README.md 0.1s
=> [13/15] COPY README_PYPI.md README_PYPI.md 0.1s
=> [14/15] RUN python -m build 8.5s
=> [15/15] RUN pip install . 5.5s
=> exporting to image 16.6s
=> => exporting layers 11.8s
=> => exporting manifest sha256:47bd860c903fdefeda59364f577c487f96e1482b0e8eadef8292df86922641dc 0.0s
=> => exporting config sha256:9d211386091dfc08fcfe80f1efb399d4a1ab80484f850476c328614ecaaefbae 0.1s
=> => exporting attestation manifest sha256:bc85b5aaf4035e6f449d9b94567135a28a61c594fa2a507ca7fea889efbf2952 0.0s
=> => exporting manifest list sha256:7cd30cbf456ba3105d4bef7c28ea8402ec5476e4da3cd8c16b752f3214f8b3b1 0.0s
=> => naming to docker.io/library/secure-mcp-gateway:latest 0.0s
=> => unpacking to docker.io/library/secure-mcp-gateway:latest
Verify the image landed:
```bash
docker images secure-mcp-gateway
# REPOSITORY TAG IMAGE ID CREATED SIZE
# secure-mcp-gateway latest 92d8c6b5714d 2 seconds ago 1.81GB
4.3.2 Gerar o arquivo de configuração
- Isso cria um arquivo de configuração no arquivo
~/.enkrypt/docker/enkrypt_mcp_config.jsonno macOS/Linux e no arquivo%USERPROFILE%\.enkrypt\docker\enkrypt_mcp_config.jsonno Windows.
Atalho rápido — Se você tiver a CLI instalada localmente via pip, pode usar a flag
--dockerem qualquer comando e pular a sintaxe verbosa do Docker:secure-mcp-gateway --docker generate-config
Escolhendo um provedor de autenticação no momento da geração
Idêntico à instalação local — veja §4.1.2 → "Escolhendo um provedor de autenticação no momento da geração" para a explicação completa. Em resumo:
- Padrão (omitir
--provider) → esquema completo delocal_apikeycom um servidor echo de exemplo, projeto, usuário, chave de API do gateway eadmin_apikeyde nível raiz. Inicializa offline, sem dependência de nuvem. --provider enkrypt→ esquema mínimo com suporte a nuvem. Após gerar, edite o arquivo e definaenkrypt_config.api_key(sua apikey de nuvem Enkrypt) eplugins.auth.config.gateway_name(o nome salvo do gateway que você criou no console Enkrypt). A nuvem é dona de servidores/projetos/usuários/apikeys, então esses blocos estão ausentes.
Comandos copiar-e-colar (todos os SOs, usando o atalho --docker — funciona em bash, zsh, CMD e PowerShell, pois o wrapper lida com as aspas por SO internamente):
# 1. Default — local_apikey (offline, no cloud dependency)
secure-mcp-gateway --docker generate-config
# 2. Cloud-backed — enkrypt provider (requires container CLI >= v2.2.0; see warning below)
secure-mcp-gateway --docker generate-config --provider enkrypt
# 3. Re-generate over an existing file (adds timestamped .bkp.YYYYMMDD_HHMMSS next to the original)
secure-mcp-gateway --docker generate-config --overwrite
secure-mcp-gateway --docker generate-config --provider enkrypt --overwrite
# 4. If the default image tag isn't on Docker Hub yet, point at a locally-built image:
# docker build -t secure-mcp-gateway . # one-time, from this repo root
secure-mcp-gateway --docker --docker-image secure-mcp-gateway generate-config --provider enkrypt --overwrite
Após o comando ser bem-sucedido, o arquivo é salvo em:
- macOS/Linux:
~/.enkrypt/docker/enkrypt_mcp_config.json - Windows:
%USERPROFILE%\.enkrypt\docker\enkrypt_mcp_config.json
Se você não tiver a CLI instalada localmente via pip, as invocações equivalentes de docker run ... para cada shell de SO estão no bloco de detalhes "Comandos Docker run verbosos" abaixo.
⚠️ Reexecutando sobre uma configuração existente?
generate-configse recusa a sobrescrever um arquivo existente por padrão — ele sai comINFO: Config file already exists at <path>. ... use --overwrite flag.Adicione--overwriteao final do comando para regenerar (um backup.bkp.<YYYYMMDD_HHMMSS>com timestamp é gravado ao lado do original primeiro). A flag funciona da mesma forma para--provider enkrypte o atalho--docker.
⚠️ "unrecognized arguments: --provider enkrypt" ao usar
--docker? Isso significa que a CLI no contêiner é mais antiga que a CLI do seu host (--providerfoi adicionado na v2.2.0). O wrapper--dockeragora usa como padrãoenkryptai/secure-mcp-gateway:<host-version>, mas se essa tag ainda não estiver no Docker Hub, você veráUnable to find image ... not found. Construa a imagem a partir do código-fonte:docker build -t secure-mcp-gateway . && secure-mcp-gateway --docker --docker-image secure-mcp-gateway generate-config --provider enkrypt --overwrite. Veja Padrão de comando Docker → Tag da imagem fixada na versão da CLI do host para a tabela completa de soluções alternativas.
Comandos Docker run verbosos (se a CLI não estiver instalada localmente)
Padrão — provedor local_apikey:
# On 🍎 Linux/macOS run the below
docker run --rm -e HOST_OS=macos -e HOST_ENKRYPT_HOME=$HOME/.enkrypt -v ~/.enkrypt/docker:/app/.enkrypt/docker --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config
# On 🪟 Windows (CMD) run the below
docker run --rm -e HOST_OS=windows -e HOST_ENKRYPT_HOME=%USERPROFILE%\.enkrypt -v %USERPROFILE%\.enkrypt\docker:/app/.enkrypt/docker --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config
# On 🪟 Windows (📟 PowerShell) run the below
docker run --rm -e HOST_OS=windows -e "HOST_ENKRYPT_HOME=$env:USERPROFILE\.enkrypt" -v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config
Com suporte a nuvem — --provider enkrypt:
# On 🍎 Linux/macOS
docker run --rm -e HOST_OS=macos -e HOST_ENKRYPT_HOME=$HOME/.enkrypt -v ~/.enkrypt/docker:/app/.enkrypt/docker --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config --provider enkrypt
# On 🪟 Windows (CMD)
docker run --rm -e HOST_OS=windows -e HOST_ENKRYPT_HOME=%USERPROFILE%\.enkrypt -v %USERPROFILE%\.enkrypt\docker:/app/.enkrypt/docker --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config --provider enkrypt
# On 🪟 Windows (📟 PowerShell)
docker run --rm -e HOST_OS=windows -e "HOST_ENKRYPT_HOME=$env:USERPROFILE\.enkrypt" -v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config --provider enkrypt
Regenerar sobre um arquivo existente — acrescente --overwrite a qualquer um dos comandos acima. Exemplo (PowerShell):
docker run --rm -e HOST_OS=windows -e "HOST_ENKRYPT_HOME=$env:USERPROFILE\.enkrypt" -v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli generate-config --overwrite
🐳 Exemplo de arquivo de configuração Docker (provedor padrão local_apikey)
Esquema idêntico à configuração de instalação local em §4.1.3. As únicas diferenças materiais em relação a um arquivo de instalação local são:
- Caminho de
mcp_configs.<id>.mcp_config[0].config.args[0]aponta para os site-packages do contêiner:/usr/local/lib/python3.12/dist-packages/secure_mcp_gateway/bad_mcps/echo_oauth_mcp.py(vs. o caminho do venv do host localmente).PICKED_CONFIG_PATHque o gateway lê é/app/.enkrypt/docker/enkrypt_mcp_config.json(montado a partir de~/.enkrypt/docker/no host), não/app/.enkrypt/enkrypt_mcp_config.json.Todo o resto (admin_apikey, common_mcp_gateway_config incluindo
timeout_settings, plugins, mcp_configs.common_overrides, oauth_config, denied_tools, listas de bloqueio completas para guardrails de entrada/saída) tem exatamente a mesma forma, byte por byte — o mesmo caminho de códigogenerate_default_config()produz ambos.
{
"admin_apikey": "AUTO_GENERATED_256_CHAR_KEY",
"enkrypt_config": {
"api_key": "YOUR_ENKRYPT_API_KEY",
"base_url": "https://api.enkryptai.com"
},
"common_mcp_gateway_config": {
"enkrypt_log_level": "INFO",
"enkrypt_mcp_use_external_cache": false,
"enkrypt_cache_host": "localhost",
"enkrypt_cache_port": 6379,
"enkrypt_cache_db": 0,
"enkrypt_cache_password": null,
"enkrypt_tool_cache_expiration": 4,
"enkrypt_gateway_cache_expiration": 24,
"enkrypt_gateway_cache_expiration_minutes": 5,
"enkrypt_config_watcher_poll_seconds": 2.0,
"enkrypt_async_input_guardrails_enabled": false,
"enkrypt_async_output_guardrails_enabled": false,
"timeout_settings": {
"default_timeout": 90,
"guardrail_timeout": 390,
"auth_timeout": 30,
"tool_execution_timeout": 360,
"discovery_timeout": 540,
"cache_timeout": 15,
"connectivity_timeout": 6,
"escalation_policies": {
"warn_threshold": 0.8,
"timeout_threshold": 1.0,
"fail_threshold": 1.2
}
}
},
"plugins": {
"auth": { "provider": "local_apikey", "config": {} },
"guardrails": { "provider": "enkrypt", "config": {} },
"telemetry": {
"provider": "opentelemetry",
"config": {
"enabled": true,
"url": "http://localhost:4317",
"insecure": true
}
}
},
"mcp_configs": {
"31491c1c-7258-4617-93aa-0bd81800d318": {
"mcp_config_name": "default_config",
"common_overrides": {
"server_tools_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
}
},
"mcp_config": [
{
"server_name": "echo_server",
"description": "Simple Echo Server",
"config": {
"command": "python",
"args": [
"/usr/local/lib/python3.12/dist-packages/secure_mcp_gateway/bad_mcps/echo_oauth_mcp.py"
]
},
"oauth_config": {
"enabled": false,
"is_remote": false,
"OAUTH_VERSION": "2.1",
"OAUTH_GRANT_TYPE": "client_credentials",
"OAUTH_CLIENT_ID": "your-client-id",
"OAUTH_CLIENT_SECRET": "your-client-secret",
"OAUTH_TOKEN_URL": "https://auth.example.com/oauth/token",
"OAUTH_AUDIENCE": "https://api.example.com",
"OAUTH_ORGANIZATION": "your-org-id",
"OAUTH_SCOPE": "read write",
"OAUTH_RESOURCE": "https://resource.example.com",
"OAUTH_TOKEN_EXPIRY_BUFFER": 300,
"OAUTH_USE_BASIC_AUTH": true,
"OAUTH_ENFORCE_HTTPS": true,
"OAUTH_TOKEN_IN_HEADER_ONLY": true,
"OAUTH_VALIDATE_SCOPES": true,
"OAUTH_USE_MTLS": false,
"OAUTH_CLIENT_CERT_PATH": null,
"OAUTH_CLIENT_KEY_PATH": null,
"OAUTH_CA_BUNDLE_PATH": null,
"OAUTH_REVOCATION_URL": null,
"OAUTH_ADDITIONAL_PARAMS": {},
"OAUTH_CUSTOM_HEADERS": {}
},
"tools": {},
"denied_tools": [],
"input_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"pii_redaction": false
},
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
},
"output_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"relevancy": false,
"hallucination": false,
"adherence": false
},
"block": [
"policy_violation",
"injection_attack",
"topic_detector",
"nsfw",
"toxicity",
"pii",
"keyword_detector",
"bias",
"sponge_attack"
]
}
}
]
}
},
"projects": {
"48a1e676-5b4b-41a9-8c50-ef04be4c9173": {
"project_name": "default_project",
"mcp_config_id": "31491c1c-7258-4617-93aa-0bd81800d318",
"users": [
"dbaf0d74-a312-4469-bb92-ba4f8af7eb18"
],
"created_at": "2026-01-01T00:00:00.000000"
}
},
"users": {
"dbaf0d74-a312-4469-bb92-ba4f8af7eb18": {
"email": "default@example.com",
"created_at": "2026-01-01T00:00:00.000000"
}
},
"apikeys": {
"Xy2RXGMu_2ZmLP9d7heVb5cj4WYeosldWvDd6hi9opW7ekRL": {
"project_id": "48a1e676-5b4b-41a9-8c50-ef04be4c9173",
"user_id": "dbaf0d74-a312-4469-bb92-ba4f8af7eb18",
"created_at": "2026-01-01T00:00:00.000000"
}
}
}
🐳 Exemplo de arquivo de configuração Docker (variante de modo nuvem --provider enkrypt)
Idêntico à configuração de nuvem da instalação local em §4.1.3 (especificamente o bloco "☁️ Exemplo de arquivo com
--provider enkrypt") — o mesmo caminho de códigogenerate_default_enkrypt_cloud_config()é executado em ambos os modos, então o JSON em disco é byte por byte o mesmo. Apenas o caminho do arquivo difere (/app/.enkrypt/docker/...dentro do contêiner, montado a partir de~/.enkrypt/docker/no host).
Execute o comando --provider enkrypt apropriado do bloco "Comandos Docker run verbosos" acima (Linux/macOS, Windows CMD ou Windows PowerShell). O arquivo exato gravado:
{
"enkrypt_config": {
"api_key": "YOUR_ENKRYPT_API_KEY",
"base_url": "https://api.enkryptai.com",
"org_id": "YOUR_ENKRYPT_ORG_ID"
},
"plugins": {
"auth": {
"provider": "enkrypt",
"config": {
"gateway_name": "your-gateway-saved-name",
"gateway_version": "v1",
"cache_ttl_seconds": 300
}
},
"guardrails": {
"provider": "enkrypt",
"config": {}
},
"telemetry": {
"provider": "opentelemetry",
"config": {
"enabled": true,
"url": "http://localhost:4317",
"insecure": true
}
}
},
"common_mcp_gateway_config": {
"enkrypt_log_level": "INFO",
"enkrypt_gateway_cache_expiration_minutes": 5
}
}
O que intencionalmente NÃO está aqui (veja bloco da variante de nuvem §4.1.3 para a justificativa completa):
- Sem
mcp_configs/projects/users/apikeys— a nuvem é dona desses e o gateway os resolve por solicitação via/mcp-gateway/get-gateway-config. - Sem
admin_apikeyde nível raiz —enkrypt_config.api_keyserve como credencial de administrador para a maioria dos endpoints REST. A limpeza de cache exige queenkrypt_config.org_idesteja definido (restrito por organização na nuvem; veja Política de autorização de limpeza de cache). - Sem bloco
common_mcp_gateway_configverboso (hosts/portas de cache, guardrails assíncronos, timeout_settings, etc.) — a variante de nuvem traz um bloco comum deliberadamente mínimo; os dois valores que você vê (enkrypt_log_level,enkrypt_gateway_cache_expiration_minutes) são os únicos que operadores costumam ajustar. Adicione outras chavescommon_mcp_gateway_configmanualmente se precisar.
Dois valores que o operador deve editar antes do primeiro boot:
enkrypt_config.api_key→ sua apikey real de nuvem Enkryptplugins.auth.config.gateway_name→ osaved_namedo gateway que você criou no console Enkrypt
O arquivo de referência enviado em src/secure_mcp_gateway/example_enkrypt_cloud_config.json é byte por byte idêntico a este exemplo.
4.3.3 Instalar o Gateway no Claude Desktop
- Você pode encontrar o local da configuração do Claude nos locais abaixo no seu sistema. Para referência, veja a documentação do Claude.
- macOS:
~/Library/Application Support/Claude - Windows:
%APPDATA%\Claude
- macOS:
Nota: A configuração gerada inclui
MCP_TRANSPORT=stdiopara comunicação em modo stdio com o Claude Desktop. O comando é ciente do provedor — ele lêplugins.auth.providerda configuração do seu gateway e emite a forma correta deenv/-e(ENKRYPT_GATEWAY_KEY/ENKRYPT_PROJECT_ID/ENKRYPT_USER_IDparalocal_apikey, um únicoENKRYPT_APIKEYparaenkrypt).
Comando copiar-e-colar (todos os SOs — o wrapper --docker monta automaticamente seu diretório de configuração do Claude):
secure-mcp-gateway --docker install --client claude-desktop
Encontrou
Unable to find image 'enkryptai/secure-mcp-gateway:<version>' ... not found? Você pulou a etapa única dedocker tagno final da §4.3.1. Execute-a uma vez e tente novamente.
Após a execução, reinicie o Claude Desktop para aplicar a nova configuração.
Comandos Docker run verbosos (se a CLI não estiver instalada localmente)
# On 🍎 Linux/macOS run the below
docker run --rm -i -e HOST_OS=macos -e HOST_ENKRYPT_HOME=$HOME/.enkrypt -v ~/.enkrypt/docker:/app/.enkrypt/docker -v ~/Library/Application\ Support/Claude:/app/.claude --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli install --client claude-desktop
# On 🪟 Windows (CMD) run the below
docker run --rm -i -e HOST_OS=windows -e HOST_ENKRYPT_HOME=%USERPROFILE%\.enkrypt -v %USERPROFILE%\.enkrypt\docker:/app/.enkrypt/docker -v %APPDATA%\Claude:/app/.claude --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli install --client claude-desktop
# On 🪟 Windows (📟 PowerShell) run the below
docker run --rm -i -e HOST_OS=windows -e "HOST_ENKRYPT_HOME=$env:USERPROFILE\.enkrypt" -v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" -v "$env:APPDATA\Claude:/app/.claude" --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli install --client claude-desktop
4.3.4 Exemplo de arquivo de configuração do Claude Desktop
O bloco
envdepende doplugins.auth.providerdo seu gateway (veja §4.1.2). Ambas as formas são mostradas abaixo.
🪟 Exemplo de claude_desktop_config.json no Windows — provedor local_apikey
Por que um
-epor variável de ambiente? Os clientes MCP definem o blocoenvno processodockergerado, mas o Docker só encaminha variáveis de ambiente pela fronteira do contêiner se você as listar com-e VAR_NAMEnos argumentos. Cada chave emenvprecisa de uma flag-ecorrespondente — o comando de instalação (secure-mcp-gateway install --client claude-desktop) gera esse pareamento para você. JSON feito à mão deve espelhar o padrão exatamente, ou o gateway dentro do contêiner veráos.environ[VAR]como não definido.
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MCP_TRANSPORT=stdio",
"-v",
"C:\\Users\\<user>\\.enkrypt\\docker:/app/.enkrypt/docker",
"-e",
"ENKRYPT_GATEWAY_KEY",
"-e",
"ENKRYPT_PROJECT_ID",
"-e",
"ENKRYPT_USER_ID",
"secure-mcp-gateway"
],
"env": {
"ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat",
"ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641",
"ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726"
}
}
}
}
🪟 Exemplo de claude_desktop_config.json no Windows — provedor de nuvem enkrypt
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MCP_TRANSPORT=stdio",
"-v",
"C:\\Users\\<user>\\.enkrypt\\docker:/app/.enkrypt/docker",
"-e",
"ENKRYPT_APIKEY",
"secure-mcp-gateway"
],
"env": {
"ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey"
}
}
}
}
4.3.5 Instalar o Gateway no Cursor
- Você pode encontrar o local do config do Cursor nos locais abaixo. Para referência, veja a documentação do Cursor.
- macOS:
~/.cursor - Windows:
%USERPROFILE%\.cursor
- macOS:
Nota: O config gerado inclui
MCP_TRANSPORT=stdiopara comunicação em modo stdio com o Cursor. O comando é ciente do provedor — ele lêplugins.auth.providerdo seu config do gateway e emite a forma correta deenv/-e(ENKRYPT_GATEWAY_KEY/ENKRYPT_PROJECT_ID/ENKRYPT_USER_IDparalocal_apikey, um únicoENKRYPT_APIKEYparaenkrypt).
Comando copiar-colar (todos os SOs — o wrapper --docker monta automaticamente ~/.cursor para que o install dentro do contêiner possa gravar de volta nele):
secure-mcp-gateway --docker install --client cursor
Encontrou
Unable to find image 'enkryptai/secure-mcp-gateway:<version>' ... not found? Você pulou a etapa única dedocker tagno final de §4.3.1. Execute-a uma vez e tente novamente.
Depois que ele for executado, reinicie o Cursor para carregar o novo servidor. A entrada fica em ~/.cursor/mcp.json no macOS/Linux ou %USERPROFILE%\.cursor\mcp.json no Windows.
Comandos detalhados de execução do Docker (se a CLI não estiver instalada localmente)
# On 🍎 Linux/macOS run the below
docker run --rm -i -e HOST_OS=macos -e HOST_ENKRYPT_HOME=$HOME/.enkrypt -v ~/.enkrypt/docker:/app/.enkrypt/docker -v ~/.cursor:/app/.cursor --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli install --client cursor
# On 🪟 Windows (CMD) run the below
docker run --rm -i -e HOST_OS=windows -e HOST_ENKRYPT_HOME=%USERPROFILE%\.enkrypt -v %USERPROFILE%\.enkrypt\docker:/app/.enkrypt/docker -v %USERPROFILE%\.cursor:/app/.cursor --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli install --client cursor
# On 🪟 Windows (📟 PowerShell) run the below
docker run --rm -i -e HOST_OS=windows -e "HOST_ENKRYPT_HOME=$env:USERPROFILE\.enkrypt" -v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" -v "$env:USERPROFILE\.cursor:/app/.cursor" --entrypoint python secure-mcp-gateway -m secure_mcp_gateway.cli install --client cursor
4.3.6 Instalar o Gateway no Claude Code
O Claude Code usa sua própria CLI (claude mcp add) para gerenciar servidores MCP. Quando o gateway é executado no Docker, o Claude Code se conecta via npx mcp-remote ao endpoint HTTP Streamable do gateway.
Pré-requisitos: Node.js e npm devem estar instalados na sua máquina (
node -venpm -vpara verificar).
Passo 1: Execute o contêiner do gateway
Inicie o gateway como um contêiner Docker em segundo plano com o endpoint HTTP Streamable exposto:
# On 🍎 Linux/macOS
docker run -d --name enkrypt-gateway -p 8000:8000 -v ~/.enkrypt/docker:/app/.enkrypt/docker secure-mcp-gateway
# On 🪟 Windows (PowerShell)
docker run -d --name enkrypt-gateway -p 8000:8000 -v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" secure-mcp-gateway
Passo 2: Adicione o gateway ao Claude Code
Os cabeçalhos HTTP variam de acordo com o provedor de autenticação:
# For local_apikey provider (default)
claude mcp add --transport http --header "apikey:YOUR_GATEWAY_KEY" --header "project_id:YOUR_PROJECT_ID" --header "user_id:YOUR_USER_ID" --scope user Enkrypt-Secure-MCP-Gateway http://localhost:8000/mcp/
# For enkrypt cloud provider (generated with --provider enkrypt)
claude mcp add --transport http --header "apikey:YOUR_ENKRYPT_CLOUD_APIKEY" --scope user Enkrypt-Secure-MCP-Gateway http://localhost:8000/mcp/
Substitua os placeholders pelos valores do seu enkrypt_mcp_config.json (apikeys.<key> e os IDs de projeto/usuário correspondentes para local_apikey, ou enkrypt_config.api_key para enkrypt cloud).
Alternativa: modo stdio via Docker
Se você preferir o modo stdio (sem contêiner persistente), o caminho mais simples é deixar a CLI gerar o JSON stdio do Claude Code para você. O comando é ciente do provedor — ele lê plugins.auth.provider do seu config do gateway e emite a forma correta de env/-e (ENKRYPT_GATEWAY_KEY/ENKRYPT_PROJECT_ID/ENKRYPT_USER_ID para local_apikey, um único ENKRYPT_APIKEY para enkrypt).
Comando copiar-colar (todos os SOs):
secure-mcp-gateway --docker install --client claude-code
Encontrou
Unable to find image 'enkryptai/secure-mcp-gateway:<version>' ... not found? Você pulou a etapa única dedocker tagno final de §4.3.1. Execute-a uma vez e tente novamente.
Isso grava a entrada do servidor em mcpServers em ~/.claude.json com os argumentos corretos de docker run e o bloco correspondente de env (tratando o pareamento de encaminhamento de fronteira do Docker -e VAR_NAME para você). Pule o restante deste bloco de detalhes, a menos que você queira criar o JSON manualmente.
Alternativa manual — crie ou edite ~/.claude.json e adicione o servidor em mcpServers. O bloco env depende do seu provedor de autenticação.
Importante: Cada chave em
envprecisa de um sinalizador correspondente-e VAR_NAMEemargspara que o Docker o encaminhe através da fronteira do contêiner. Sem o sinalizador, o gateway dentro do contêiner veráos.environ[VAR]como não definido. O comando de instalação (secure-mcp-gateway install --client claude-code) gera esse pareamento automaticamente; se você criar o JSON manualmente, espelhe-o exatamente.
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MCP_TRANSPORT=stdio",
"-v",
"/Users/<user>/.enkrypt/docker:/app/.enkrypt/docker",
"-e",
"ENKRYPT_GATEWAY_KEY",
"-e",
"ENKRYPT_PROJECT_ID",
"-e",
"ENKRYPT_USER_ID",
"secure-mcp-gateway"
],
"env": {
"ENKRYPT_GATEWAY_KEY": "YOUR_GATEWAY_KEY",
"ENKRYPT_PROJECT_ID": "YOUR_PROJECT_ID",
"ENKRYPT_USER_ID": "YOUR_USER_ID"
}
}
}
}
Para o provedor de nuvem enkrypt, a lista de argumentos se reduz a um único -e ENKRYPT_APIKEY e o bloco de env corresponde:
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"MCP_TRANSPORT=stdio",
"-v",
"/Users/<user>/.enkrypt/docker:/app/.enkrypt/docker",
"-e",
"ENKRYPT_APIKEY",
"secure-mcp-gateway"
],
"env": {
"ENKRYPT_APIKEY": "YOUR_ENKRYPT_CLOUD_APIKEY"
}
}
}
}
Ou use a CLI do Claude Code:
# For local_apikey provider (default)
claude mcp add-json Enkrypt-Secure-MCP-Gateway '{
"type": "stdio",
"command": "docker",
"args": ["run", "--rm", "-i", "-e", "MCP_TRANSPORT=stdio", "-v", "/Users/<user>/.enkrypt/docker:/app/.enkrypt/docker", "-e", "ENKRYPT_GATEWAY_KEY", "-e", "ENKRYPT_PROJECT_ID", "-e", "ENKRYPT_USER_ID", "secure-mcp-gateway"],
"env": {
"ENKRYPT_GATEWAY_KEY": "YOUR_GATEWAY_KEY",
"ENKRYPT_PROJECT_ID": "YOUR_PROJECT_ID",
"ENKRYPT_USER_ID": "YOUR_USER_ID"
}
}'
# For enkrypt cloud provider (generated with --provider enkrypt)
claude mcp add-json Enkrypt-Secure-MCP-Gateway '{
"type": "stdio",
"command": "docker",
"args": ["run", "--rm", "-i", "-e", "MCP_TRANSPORT=stdio", "-v", "/Users/<user>/.enkrypt/docker:/app/.enkrypt/docker", "-e", "ENKRYPT_APIKEY", "secure-mcp-gateway"],
"env": {
"ENKRYPT_APIKEY": "YOUR_ENKRYPT_CLOUD_APIKEY"
}
}'
Nota sobre Windows (PowerShell): Substitua
/Users/<user>/.enkrypt/dockerpelo seu caminho do Windows (por exemplo,C:\Users\<user>\.enkrypt\docker) e ajuste a sintaxe de montagem de volume de acordo.
Passo 3: Verifique
claude mcp list
Passo 4: Use no Claude Code
Inicie o Claude Code e experimente prompts como list all servers, get all tools available.
4.3.7 Executando o Gateway com Docker Run (Avançado)
Para implantações avançadas do Docker, você pode executar o contêiner do gateway diretamente com configurações personalizadas. As variáveis de ambiente de autenticação dependem do plugins.auth.provider do seu gateway (veja §4.1.2):
# Basic Docker run command — local_apikey provider (default)
docker run -d --name enkrypt-gateway -p 8000:8000 -v ~/.enkrypt/docker:/app/.enkrypt/docker -e ENKRYPT_GATEWAY_KEY="your-gateway-key" -e ENKRYPT_PROJECT_ID="your-project-id" -e ENKRYPT_USER_ID="your-user-id" secure-mcp-gateway:latest
# Basic Docker run command — enkrypt cloud provider (generated with --provider enkrypt)
docker run -d --name enkrypt-gateway -p 8000:8000 -v ~/.enkrypt/docker:/app/.enkrypt/docker -e ENKRYPT_APIKEY="your-enkrypt-cloud-apikey" secure-mcp-gateway:latest
Windows PowerShell:
# local_apikey provider (default)
docker run -d `
--name enkrypt-gateway `
-p 8000:8000 `
-v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" `
-e ENKRYPT_GATEWAY_KEY="your-gateway-key" `
-e ENKRYPT_PROJECT_ID="your-project-id" `
-e ENKRYPT_USER_ID="your-user-id" `
secure-mcp-gateway:latest
# enkrypt cloud provider
docker run -d `
--name enkrypt-gateway `
-p 8000:8000 `
-v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" `
-e ENKRYPT_APIKEY="your-enkrypt-cloud-apikey" `
secure-mcp-gateway:latest
Variáveis de Ambiente
As variáveis de ambiente de autenticação são dependentes do provedor — exatamente uma das duas formas abaixo é necessária:
| Variável | Descrição | Padrão | Obrigatório (provedor) |
|---|---|---|---|
ENKRYPT_GATEWAY_KEY | Chave de API para autenticação | - | Sim (local_apikey) |
ENKRYPT_PROJECT_ID | ID do projeto do config | - | Sim (local_apikey) |
ENKRYPT_USER_ID | ID do usuário do config | - | Sim (local_apikey) |
ENKRYPT_APIKEY | Chave de API da nuvem Enkrypt (projeto/usuário resolvidos pela Enkrypt) | - | Sim (enkrypt) |
MCP_TRANSPORT | Modo de transporte: streamable-http ou stdio | streamable-http | Não |
SKIP_DEPENDENCY_INSTALL | Pular instalação de dependências em tempo de execução | true (Docker), false (outros) | Não |
HOST | Endereço de bind do gateway | 0.0.0.0 | Não |
FASTAPI_HOST | Endereço de bind do servidor FastAPI | 0.0.0.0 | Não |
MCP_TRANSPORT
A variável de ambiente MCP_TRANSPORT controla o modo de transporte do gateway.
Modos de transporte:
streamable-http(padrão): modo de servidor HTTP na porta 8000. Use com-p 8000:8000para mapeamento de portas.stdio: modo de entrada/saída padrão para clientes MCP que se comunicam via stdin/stdout. Use com o sinalizador-i.
Exemplo para modo stdio (Claude Desktop, Cursor):
# local_apikey provider (default) — pass all 3 env vars
docker run --rm -i -e MCP_TRANSPORT=stdio -v ~/.enkrypt/docker:/app/.enkrypt/docker -e ENKRYPT_GATEWAY_KEY="your-gateway-key" -e ENKRYPT_PROJECT_ID="your-project-id" -e ENKRYPT_USER_ID="your-user-id" secure-mcp-gateway
# enkrypt cloud provider — pass a single env var
docker run --rm -i -e MCP_TRANSPORT=stdio -v ~/.enkrypt/docker:/app/.enkrypt/docker -e ENKRYPT_APIKEY="your-enkrypt-cloud-apikey" secure-mcp-gateway
SKIP_DEPENDENCY_INSTALL
A variável de ambiente SKIP_DEPENDENCY_INSTALL controla se o gateway reinstala as dependências do Python em tempo de execução.
Comportamento padrão:
- Ambientes Docker: O padrão é
true(detectado automaticamente). As dependências são pré-instaladas na imagem Docker, então a instalação em tempo de execução é pulada automaticamente. - Ambientes não Docker: O padrão é
false. As dependências são instaladas na inicialização para garantir compatibilidade.
Quando definir explicitamente SKIP_DEPENDENCY_INSTALL=false no Docker:
- Ambientes de desenvolvimento onde você está testando novas dependências
- Ao montar volumes de código-fonte para desenvolvimento ao vivo
- Se você não tiver certeza se todas as dependências estão instaladas corretamente
Quando definir explicitamente SKIP_DEPENDENCY_INSTALL=true fora do Docker:
- Implantações de produção onde as dependências são pré-instaladas
- Para reduzir o tempo de inicialização (inicializações a frio mais rápidas)
- Em ambientes onde você já executou
pip install
Exemplo com integração docker-compose:
# Connect to observability stack network — local_apikey provider (default)
# Note: SKIP_DEPENDENCY_INSTALL defaults to true in Docker, so it's optional
docker run -d --name enkrypt-gateway --network secure-mcp-gateway-observability_default -p 8000:8000 -p 8080:8080 -v ~/.enkrypt/docker:/app/.enkrypt/docker -e ENKRYPT_GATEWAY_KEY="your-gateway-key" -e ENKRYPT_PROJECT_ID="your-project-id" -e ENKRYPT_USER_ID="your-user-id" secure-mcp-gateway:latest
# Same, but for the enkrypt cloud provider
docker run -d --name enkrypt-gateway --network secure-mcp-gateway-observability_default -p 8000:8000 -p 8080:8080 -v ~/.enkrypt/docker:/app/.enkrypt/docker -e ENKRYPT_APIKEY="your-enkrypt-cloud-apikey" secure-mcp-gateway:latest
Windows PowerShell:
# Note: SKIP_DEPENDENCY_INSTALL defaults to true in Docker, so it's optional
# local_apikey provider (default)
docker run -d `
--name enkrypt-gateway `
--network secure-mcp-gateway-observability_default `
-p 8000:8000 `
-p 8080:8080 `
-v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" `
-e ENKRYPT_GATEWAY_KEY="your-gateway-key" `
-e ENKRYPT_PROJECT_ID="your-project-id" `
-e ENKRYPT_USER_ID="your-user-id" `
secure-mcp-gateway:latest
# enkrypt cloud provider
docker run -d `
--name enkrypt-gateway `
--network secure-mcp-gateway-observability_default `
-p 8000:8000 `
-p 8080:8080 `
-v "$env:USERPROFILE\.enkrypt\docker:/app/.enkrypt/docker" `
-e ENKRYPT_APIKEY="your-enkrypt-cloud-apikey" `
secure-mcp-gateway:latest
Nota: O sinalizador --network conecta o gateway à pilha de observabilidade (Grafana, Prometheus, Loki, Jaeger, além das 9 regras de alerta do Slack) se você estiver executando os serviços de monitoramento da seção 5. O nome da rede (secure-mcp-gateway-observability_default) é derivado do nome do projeto compose definido no topo de observability/docker-compose.grafana.yml (o campo name: não é alterado pela renomeação do arquivo, então o nome da rede é estável).
Mapeamento de Portas
8000: servidor MCP do gateway (obrigatório) — vinculado aoENTRYPOINT ["python3", "src/secure_mcp_gateway/gateway.py"]padrão.8080: servidor de callback OAuth (opcional, necessário apenas para o fluxo de Código de Autorização). Também vinculado ao entrypoint do gateway quando o OAuth está configurado.8001: servidor da API administrativa REST. Não iniciado pelo entrypoint padrão. Mapear-p 8001:8001sozinho não faz nada — não há listener na porta 8001 dentro do contêiner, a menos que você também iniciepython -m secure_mcp_gateway.api_server(por exemplo, via um sidecardocker exec, um--entrypointpersonalizado ou sua própria imagem que execute ambos os processos). As rotas integradas de limpeza de cache e último recarregamento também são expostas diretamente no gateway (porta 8000) emPOST /api/v1/cache/flush-gateway-configeGET /api/v1/cache/last-reload, então a maioria dos operadores não precisa expor a porta 8001.
Montagens de Volume
~/.enkrypt/docker:/app/.enkrypt/docker- Local do arquivo de configuração (obrigatório)- Montagens adicionais podem ser necessárias se seus servidores MCP exigirem acesso a arquivos locais
⚠️ Importante: Os clientes MCP (Claude Desktop, Cursor, Claude Code) iniciam o Docker diretamente sem um shell, então
~(til) não será expandido. Sempre use caminhos absolutos nos arquivos JSON de configuração do seu cliente MCP (por exemplo,/Users/yourname/.enkrypt/docker:/app/.enkrypt/dockerno macOS/Linux ouC:\\Users\\yourname\\.enkrypt\\docker:/app/.enkrypt/dockerno Windows).
⚠️ Importante: Configurando Servidores MCP Quando o Gateway é Executado no Docker
Ao executar o Enkrypt Gateway no Docker, NÃO configure seus servidores MCP para também rodarem em modo Docker. Isso causa problemas de Docker-in-Docker, problemas de rede e complicações de montagem de volume.
❌ Evite (servidores MCP baseados em Docker):
{
"server_name": "github_server",
"config": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"GITHUB_PERSONAL_ACCESS_TOKEN",
"ghcr.io/github/github-mcp-server"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your-token"
}
}
}
✅ Use em vez disso (servidores baseados em npx/npm/Python):
{
"server_name": "github_server",
"config": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-github"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your-token"
}
}
}
Por quê?
- Docker-in-Docker requer modo privilegiado e montagem especial de socket
- O isolamento de rede impede que os contêineres se comuniquem corretamente
- As montagens de volume não funcionam como esperado através das fronteiras dos contêineres
- Sobrecarga de desempenho e preocupações de segurança
- Complexidade aumentada e dificuldade de depuração
Formatos recomendados de servidor MCP quando o Gateway está no Docker:
- ✅ Servidores baseados em npx:
npx -y @modelcontextprotocol/server-* - ✅ Servidores baseados em npm:
npm exec -y server-name - ✅ Servidores baseados em Python:
python /path/to/server.pyouuv run server.py - ✅ Servidores baseados em Node.js:
node /path/to/server.js - ✅ Servidores MCP remotos:
npx mcp-remote https://api.example.com/mcp/
Exceção:
Se você absolutamente precisa usar servidores MCP baseados em Docker, considere:
- Executar o gateway fora do Docker (instalação local), OU
- Configurar o networking adequado do Docker com
--network hostou redes bridge personalizadas, OU - Usar Docker-in-Docker com configuração adequada (requer o sinalizador
--privilegede a montagem/var/run/docker.sock- não recomendado para produção)
4.4 Instalação Remota
🌐 Etapas de Instalação Remota
4.4.1 Execute o Gateway em um servidor remoto
python gateway.py
-
Ou execute em k8s usando nossa imagem docker
enkryptai/secure-mcp-gateway:vx.x.x -
Exemplo:
enkryptai/secure-mcp-gateway:v2.1.2 -
Use a versão mais recente do Docker Hub: https://hub.docker.com/r/enkryptai/secure-mcp-gateway/tags
-
Você pode montar o arquivo de configuração localmente ou baixar o arquivo json de um local remoto como
S3usando uminitContainere montar o volume -
Veja
docs/secure-mcp-gateway-manifest-example.yamlpara a referência completa do arquivo de manifesto
4.4.2 Modifique o config do seu Cliente MCP para usar o Gateway
-
Você pode encontrar o local do config do Claude Desktop nos locais abaixo no seu sistema. Para referência, veja a documentação do Claude.
- macOS:
~/Library/Application Support/Claude - Windows:
%APPDATA%\Claude
- macOS:
-
Você pode encontrar o local do config do Cursor nos locais abaixo. Para referência, veja a documentação do Cursor.
- macOS:
~/.cursor - Windows:
%USERPROFILE%\.cursor
- macOS:
-
Substitua as credenciais pelos valores do seu
enkrypt_mcp_config.json. A forma das credenciais depende doplugins.auth.providerdo seu gateway:local_apikey(padrão) — cabeçalhosapikey+project_id+user_id, originados deapikeys.<key>e dos IDs de projeto/usuário correspondentes- nuvem
enkrypt— um único cabeçalhoapikey, originado deenkrypt_config.api_key. Adicione um cabeçalhoX-Enkrypt-MCP-Gatewaysomente se o config do gateway deixarplugins.auth.config.gateway_namenão definido — veja §7.1
-
Substitua o
http://0.0.0.0:8000/mcp/pelohttp(s)://<remote_server_ip>:<port>/mcp/ -
Se você estiver executando isso localmente, pode usar
http://0.0.0.0:8000/mcp/ -
Você pode configurar o ingress para rotear o tráfego para o MCP Gateway via
https -
Exemplo:
https://mcp.enkryptai.com/mcp/ -
NOTA: Certifique-se de que node e npm estão instalados na máquina cliente
- Para verificar, execute
node -venpm -v
- Para verificar, execute
-
NOTA: Certifique-se de usar a barra final
/na URL do MCP, como/mcp/
Para Claude Desktop e Cursor — adicione o seguinte ao seu claude_desktop_config.json ou mcp.json.
local_apikey provedor (padrão) — três cabeçalhos:
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "npx",
"args": [
"mcp-remote",
"http://0.0.0.0:8000/mcp/",
"--allow-http",
"--header",
"apikey:${ENKRYPT_GATEWAY_KEY}",
"--header",
"project_id:${ENKRYPT_PROJECT_ID}",
"--header",
"user_id:${ENKRYPT_USER_ID}"
],
"env": {
"ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat",
"ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641",
"ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726"
}
}
}
}
enkrypt provedor de nuvem (gerado com --provider enkrypt) — cabeçalho único:
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "npx",
"args": [
"mcp-remote",
"http://0.0.0.0:8000/mcp/",
"--allow-http",
"--header",
"apikey:${ENKRYPT_APIKEY}"
],
"env": {
"ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey"
}
}
}
}
Opcional — roteando um processo de gateway para vários gateways de nuvem. Se o gateway estiver rodando sem
plugins.auth.config.gateway_name, cada cliente também deve enviarX-Enkrypt-MCP-Gatewaynomeando osaved_namedo gateway de nuvem; o gateway o encaminha para a nuvem Enkrypt para escolher a configuração. Quandogateway_nameestá definido na configuração do gateway, esse valor vence e este cabeçalho é ignorado — veja §7.1.{ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "npx", "args": [ "mcp-remote", "http://0.0.0.0:8000/mcp/", "--allow-http", "--header", "apikey:${ENKRYPT_APIKEY}", "--header", "X-Enkrypt-MCP-Gateway:${ENKRYPT_MCP_GATEWAY}" ], "env": { "ENKRYPT_APIKEY": "your-enkrypt-cloud-apikey", "ENKRYPT_MCP_GATEWAY": "your-gateway-saved-name" } } } }Os nomes das variáveis de ambiente aqui são arbitrários —
mcp-remoteapenas os substitui nos valores dos cabeçalhos. O gateway em si não lê nenhuma variável de ambiente para o nome do gateway, então esse roteamento funciona apenas no transporte streamable-HTTP.
Para Claude Code — use o comando claude mcp add:
# local_apikey provider (default)
claude mcp add --transport http --header "apikey:YOUR_GATEWAY_KEY" --header "project_id:YOUR_PROJECT_ID" --header "user_id:YOUR_USER_ID" --scope user Enkrypt-Secure-MCP-Gateway https://mcp.your-domain.com/mcp/
# enkrypt cloud provider (generated with --provider enkrypt)
claude mcp add --transport http --header "apikey:YOUR_ENKRYPT_CLOUD_APIKEY" --scope user Enkrypt-Secure-MCP-Gateway https://mcp.your-domain.com/mcp/
# enkrypt cloud provider, gateway chosen per-request (only when the gateway config leaves plugins.auth.config.gateway_name unset)
claude mcp add --transport http --header "apikey:YOUR_ENKRYPT_CLOUD_APIKEY" --header "X-Enkrypt-MCP-Gateway:your-gateway-saved-name" --scope user Enkrypt-Secure-MCP-Gateway https://mcp.your-domain.com/mcp/
Nota: Para testes locais com HTTP (não HTTPS), adicione
--allow-httpse necessário, ou usehttp://0.0.0.0:8000/mcp/como URL.
5. (Opcional) Stack de Observabilidade — Logs, Métricas, Traces e Alertas do Slack
📊 Configuração e Uso da Stack de Observabilidade
Esta seção explica como configurar e usar a stack de observabilidade incluída com o Enkrypt Secure MCP Gateway. Tudo é modelado como código em observability/: clone, copie .env.grafana.example, execute um docker compose -f docker-compose.grafana.yml, obtenha um dashboard funcional com alertas do Slack.
Dois backends, escolha um. O repositório traz duas stacks de observabilidade paralelas: a stack OpenSearch (primária; portas padrão OTel
4317/4318) e esta stack Grafana legada (4327/4328). Cada uma tem seus próprios arquivos compose + env (docker-compose.grafana.yml+.env.grafanavsdocker-compose.opensearch.yml+.env.opensearch) e deve ser invocada com flags explícitas-f/--env-file. Vejaobservability/README.opensearch.mdpara o caminho OpenSearch; o restante desta seção cobre a stack Grafana.Para o mergulho profundo — cada regra de alerta, dashboard e ponto de personalização — veja
observability/README.md. Esta seção é o início rápido.
5.1 Arquitetura
┌─────────────────────┐ logs (OTLP) ┌────────────┐ LogQL ┌─────────┐
│ secure-mcp-gateway │──────────────────────▶│ │────────────▶│ │
│ (host process │ metrics (OTLP) │ OTel │ │ Grafana │
│ on :8000) │──────────────────────▶│ Collector │ PromQL │ (:3001) │
│ │ traces (OTLP) │ (:4317) │────────────▶│ │
└─────────────────────┘ └────────────┘ └─────────┘
│ │ │ ▲
▼ ▼ ▼ │
┌──────┐ ┌────┐ ┌────────┐ │
│ Loki │ │Prom│ │ Jaeger │─────────┘
└──────┘ └────┘ └────────┘ dashboards
(:16686) & alerts
Componentes incluídos em observability/docker-compose.grafana.yml:
| Componente | Endpoint | O que faz |
|---|---|---|
| OTel Collector | :4327 (gRPC), :4328 (HTTP) | Ponto de entrada único para logs / métricas / traces do gateway. Aponte plugins.telemetry.config.url para http://localhost:4327 (o 4317 padrão agora roteia para a stack OpenSearch) |
| Prometheus | http://localhost:9090 | Coleta do OTel Collector em :8889 a cada 15s |
| Loki | http://localhost:3100 | Agregação de logs, recebe logs do OTel Collector |
| Jaeger UI | http://localhost:16686 | Visualização de traces |
| Grafana | http://localhost:3001 (configurável via GRAFANA_HOST_PORT) | Dashboards unificados + 9 regras de alerta provisionadas → Slack |
Nota sobre a porta do Grafana: o arquivo compose publica o Grafana na porta 3001 do host por padrão (o contêiner ainda escuta na 3000) para evitar conflito com um serviço Grafana nativo ou relay Docker WSL que frequentemente ocupa a 3000 no Windows. Defina
GRAFANA_HOST_PORT=3030(ou qualquer porta livre) emobservability/.env.grafanapara substituir.
5.2 Pré-requisitos
-
Docker Desktop (Windows/macOS) ou Docker Engine + plugin compose (Linux)
-
Gateway instalado e em execução (siga a seção 4)
-
(Opcional) Uma URL de webhook de entrada do Slack se você quiser que as regras de alerta incluídas publiquem no Slack
5.3 Passos de Configuração
-
Copie o modelo de env
cd observability cp .env.grafana.example .env.grafana # edit observability/.env.grafana and replace SLACK_WEBHOOK_URL with your # real https://hooks.slack.com/services/... URL (leave the placeholder if # you don't want Slack — Grafana provisioning will still succeed, the # Slack POST will just silently fail). -
Inicie a Stack de Observabilidade
docker compose -f docker-compose.grafana.yml --env-file .env.grafana up -dIsso inicia o OTel Collector, Prometheus, Loki, Jaeger, Promtail e Grafana — com todos os dashboards, regras de alerta e o ponto de contato do Slack pré-provisionados. A autenticação de administrador anônimo está habilitada por padrão (sem tela de login). Veja
observability/README.md→ Personalizando para definir uma senha de administrador real. -
Para parar a Stack de Observabilidade
docker compose down
5.4 Configuração
-
Edite o arquivo
enkrypt_mcp_config.jsonpara habilitar a telemetria. O formato atual usa o bloco de pluginplugins.telemetry(provedoropentelemetry, o padrão emitido porsecure-mcp-gateway generate-config):{ "plugins": { "telemetry": { "provider": "opentelemetry", "config": { "enabled": true, "url": "http://localhost:4317", "insecure": true } } } }
5.5 Passos de Verificação
-
Verifique se os Serviços estão em Execução
# On Windows docker ps | findstr "loki grafana jaeger otel prometheus" # On Linux/macOS docker ps | grep -E "loki|grafana|jaeger|otel|prometheus" -
Acesse as UIs dos Serviços
-
Grafana: http://localhost:3001 (admin anônimo habilitado por padrão — sem tela de login; substitua a porta do host via
GRAFANA_HOST_PORTemobservability/.env.grafana) -
Jaeger: http://localhost:16686
-
Prometheus: http://localhost:9090
-
Loki: Acesse através do Grafana
- Abra o Grafana (http://localhost:3001)
- Vá para Explore (barra lateral esquerda)
- Selecione "Loki" no menu suspenso de fonte de dados
-
-
Verifique a Telemetria do Gateway
-
Faça requisições de teste através do Gateway, como
List all servers and toolseecho test -
Verifique traces no Jaeger:
-
Adicione tags opcionais como
enkrypt_email=default@example.comouenkrypt_project_name=default_projectouenkrypt_mcp_config_id=fcbd4508-1432-4f13-abb9-c495c946f638para ver os traces de um usuário, projeto ou configuração MCP específicos, etc. -
Também podemos combinar tags separando-as com espaços, como
enkrypt_email=default@example.com enkrypt_project_name=default_project -
Procure por spans
enkrypt_discover_all_tools -
Examine spans filhos para cache, descoberta de ferramentas, etc.

-
-
Verifique métricas no Grafana:
-
Navegue para
Drilldown->metrics -
Podemos filtrar por vários rótulos como
email,user_id,mcp_config_id,project_id,project_nameetc.
-
-
Verifique logs no Grafana
-
Navegue para
Drilldown->Logs -
Selecione o rótulo como
service_name=secure-mcp-gatewaye clique emShow logs -
Agora podemos filtrar por vários rótulos como
attributes_project_name,attributes_project_id,attributes_email,attributes_user_id,attributes_mcp_config_id,attributes_tool_nameetc.
-
-
Verifique Dashboards no Grafana navegando para
Dashboards->OpenTelemetry Gateway Metrics- Devido a problemas no Grafana, talvez seja necessário editar cada tile e clicar em
Run queriespara ver os dados
- Devido a problemas no Grafana, talvez seja necessário editar cada tile e clicar em
-
5.6 Telemetria Disponível (Não exaustiva)
-
Traces
- Pipeline de processamento de requisições
- Invocações de ferramentas com rastreamento de duração
- Operações de cache (acertos/erros)
- Verificações de guardrails
- Rastreamento de erros e monitoramento de status
- Atributos detalhados para depuração
-
Métricas
enkrypt_list_all_servers_calls: uso de endpoints da APImcp_cache_misses_total: rastreamento de eficiência do cacheenkrypt_servers_discovered: monitoramento de descoberta de servidoresmcp_tool_calls_total: rastreamento de invocação de ferramentasmcp_tool_call_duration_seconds: monitoramento de desempenho (histograma)
-
Logs
- Formato JSON estruturado para melhor consulta
- Operações do gateway com contexto
- Condições de erro com stack traces
- Eventos de segurança e verificações de guardrails
- Dados de desempenho com informações de tempo
O mapeamento completo de métrica → série Prometheus → regra de alerta está em
docs/metric_reference.md, e as constantes de nomes de métrica/span/atributo estão emsrc/secure_mcp_gateway/plugins/telemetry/conventions.py.
5.7 Regras de Alerta Pré-Provisionadas (Slack)
A stack inclui 9 regras de alerta do Grafana conectadas a um ponto de contato do Slack — coloque sua URL de webhook em observability/.env.grafana (SLACK_WEBHOOK_URL=...) e você começará a receber alertas de guardrail/segurança/saúde imediatamente.
| Regra | Severidade | Gatilho (janela de 5–10 min) |
|---|---|---|
mcpgw-policy-violation-burst | crítico | > 5 policy_violation bloqueios |
mcpgw-injection-attack-burst | crítico | > 3 injection_attack bloqueios de entrada |
mcpgw-pii-found | crítico | qualquer evento de redação de PII |
mcpgw-toxicity-nsfw-surge | aviso | > 5 toxicity ou nsfw bloqueios |
mcpgw-output-quality-failure | aviso | > 3 bloqueios de relevância + aderência + alucinação |
mcpgw-tool-deny-list-burst | aviso | > 5 chamadas de ferramenta bloqueadas por lista de negação |
mcpgw-user-targeting-guardrails | crítico | um único user_id dispara > 10 bloqueios de guardrail |
mcpgw-guardrail-api-latency | aviso | p95 do guardrail HTTP > 2s |
mcpgw-auth-failure-burst | crítico | > 10 falhas de autenticação |
Regras de rajada usam sum by (server_name, tool_name) (ou user_id, failure_reason) para que cada infrator distinto produza uma mensagem separada no Slack em vez de um alerta agregado. Para ajustar limites, edite observability/grafana/provisioning/alerting/rules.yaml e docker compose restart grafana — as regras são recarregadas do disco a cada início. Veja observability/README.md → Personalizando para adicionar novas regras ou trocar o Slack por PagerDuty / Opsgenie / webhook genérico / e-mail.
6. Verifique a Instalação e confira os arquivos gerados
✅ Passos de verificação e arquivos gerados
6.1 Verifique o Claude Desktop
-
Para verificar a instalação do Claude, navegue até o arquivo
claude_desktop_config.jsonseguindo estas instruções-
macOS:
~/Library/Application Support/Claude/claude_desktop_config.json -
Windows:
%APPDATA%\Claude\claude_desktop_config.json
-
6.2 Exemplo de arquivo de configuração MCP gerado
Os exemplos abaixo usam o formato provedor
local_apikey(padrão). Se você gerou com--provider enkrypt, o blocoenvtem uma única entradaENKRYPT_APIKEYem vez disso — veja §4.1.5 para a variante enkrypt cloud.
🍎 Exemplo de arquivo no macOS
-
~/Library/Application Support/Claude/claude_desktop_config.json{ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "/Users/user/enkryptai/secure-mcp-gateway/src/secure_mcp_gateway/gateway.py" ], "env": { "ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat", "ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641", "ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726" } } } }
🪟 Exemplo de arquivo no Windows
-
%USERPROFILE%\AppData\Roaming\Claude\claude_desktop_config.json{ "mcpServers": { "Enkrypt Secure MCP Gateway": { "command": "mcp", "args": [ "run", "C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\src\\secure_mcp_gateway\\gateway.py" ], "env": { "ENKRYPT_GATEWAY_KEY": "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat", "ENKRYPT_PROJECT_ID": "3c09f06c-1f0d-4153-9ac5-366397937641", "ENKRYPT_USER_ID": "6469a670-1d64-4da5-b2b3-790de21ac726" } } } }
6.3 Reinicie o Claude Desktop para executar o Gateway
-
Após reiniciar, navegue até o Claude Desktop
Settings
-
Clique em
Developer->Enkrypt Secure MCP Gateway
🧰 Verifique ferramentas e logs
-
Você também pode clicar no ícone de configurações abaixo da barra de pesquisa para ver o Gateway disponível

-
Clique em
Enkrypt Secure MCP Gatewaypara ver a lista de ferramentas disponíveis
-
Você pode verificar os logs do Claude enquanto pede algo a ele para ver o Gateway em ação
-
Exemplo 🍎 caminho de log Linux/macOS:
~/Library/Application Support/Claude/logs/mcp-server-Enkrypt Secure MCP Gateway.log -
Exemplo 🪟 caminho de log Windows:
%USERPROFILE%\AppData\Roaming\Claude\logs\mcp-server-Enkrypt Secure MCP Gateway.log
-
6.4 Exemplos de prompts
list all servers, get all tools available and echo test- Isso usa um servidor MCP de teste
echo_serverque está embad_mcps/echo_mcp.py
- Isso usa um servidor MCP de teste

💡 Outros exemplos
-
Também podemos combinar vários prompts em um só que dispare várias chamadas de ferramentas ao mesmo tempo
-
Exemplo:
echo test and also echo best

-
Exemplo:
echo "hello; ls -la; whoami" -
Isso poderia ser um prompt malicioso, mas como nenhum guardrail está habilitado, ele não será bloqueado

6.5 Exemplo de arquivo de configuração gerado
-
Exemplo
enkrypt_mcp_config.jsongerado pelo scriptsetupem~/.enkrypt/enkrypt_mcp_config.jsonno macOS e%USERPROFILE%\.enkrypt\enkrypt_mcp_config.jsonno Windows -
Se você executou o comando docker para instalar o Gateway, o arquivo de configuração estará em
~/.enkrypt/docker/enkrypt_mcp_config.jsonno macOS e%USERPROFILE%\.enkrypt\docker\enkrypt_mcp_config.jsonno Windows{ "admin_apikey": "AUTO_GENERATED_256_CHAR_ADMIN_API_KEY_FOR_ADMINISTRATIVE_OPERATIONS", "enkrypt_config": { "api_key": "YOUR_ENKRYPT_API_KEY", "base_url": "https://api.enkryptai.com" }, "common_mcp_gateway_config": { "enkrypt_log_level": "INFO", "enkrypt_mcp_use_external_cache": false, "enkrypt_cache_host": "localhost", "enkrypt_cache_port": 6379, "enkrypt_cache_db": 0, "enkrypt_cache_password": null, "enkrypt_tool_cache_expiration": 4, "enkrypt_gateway_cache_expiration": 24, "enkrypt_gateway_cache_expiration_minutes": 5, "enkrypt_config_watcher_poll_seconds": 2.0, "enkrypt_async_input_guardrails_enabled": false, "enkrypt_async_output_guardrails_enabled": false }, "plugins": { "auth": { "provider": "local_apikey", "config": {} }, "guardrails": { "provider": "enkrypt", "config": {} }, "telemetry": { "provider": "opentelemetry", "config": { "enabled": true, "url": "http://localhost:4317", "insecure": true } } }, "mcp_configs": { "fcbd4508-1432-4f13-abb9-c495c946f638": { "mcp_config_name": "default_config", "common_overrides": { "server_tools_guardrails_config": { "enabled": false } }, "mcp_config": [ { "server_name": "echo_server", "description": "Simple Echo Server", "config": { "command": "python", "args": [ "C:\\Users\\<User>\\Documents\\GitHub\\EnkryptAI\\secure-mcp-gateway\\src\\secure_mcp_gateway\\bad_mcps\\echo_mcp.py" ] }, "tools": {}, "input_guardrails_config": { "enabled": false, "guardrail_name": "Sample Airline Guardrail", "additional_config": { "pii_redaction": false }, "block": [ "policy_violation" ] }, "output_guardrails_config": { "enabled": false, "guardrail_name": "Sample Airline Guardrail", "additional_config": { "relevancy": false, "hallucination": false, "adherence": false }, "block": [ "policy_violation" ] } } ] } }, "projects": { "3c09f06c-1f0d-4153-9ac5-366397937641": { "project_name": "default_project", "mcp_config_id": "fcbd4508-1432-4f13-abb9-c495c946f638", "users": [ "6469a670-1d64-4da5-b2b3-790de21ac726" ], "created_at": "2025-07-16T17:02:00.406877" } }, "users": { "6469a670-1d64-4da5-b2b3-790de21ac726": { "email": "default@example.com", "created_at": "2025-07-16T17:02:00.406902" } }, "apikeys": { "2W8UupCkazk4SsOcSu_1hAbiOgPdv0g-nN9NtfZyg-rvYGat": { "project_id": "3c09f06c-1f0d-4153-9ac5-366397937641", "user_id": "6469a670-1d64-4da5-b2b3-790de21ac726", "created_at": "2025-07-16T17:02:00.406905" } } }
6.6 Verificar Cursor
-
Você pode ver o servidor MCP na lista de servidores MCP no Cursor navegando até
~/.cursor/mcp.jsone também clicando no ícone de configurações no canto superior direito e depois clicando emTools & Integrationsou na abaMCP -
Geralmente não é necessário reiniciar, mas se estiver em estado de carregamento por muito tempo, reinicie o Cursor

-
Agora você pode conversar com o servidor MCP.
-
Exemplos de prompts:
-
(Clique em
Run Toolquando o Cursor solicitar) -
list all servers, get all tools available and echo test- Isso usa um servidor MCP de teste
echo_serverque está embad_mcps/echo_mcp.py
- Isso usa um servidor MCP de teste

-
-
6.7 Verificar Claude Code
-
Execute
claude mcp listpara ver o gateway na lista de servidores MCP configurados -
Inicie o Claude Code e execute
/mcppara verificar o status do servidor -
Tente
list all servers, get all tools available and echo testcomo um prompt para verificar se o gateway está funcionando
7. Edite a configuração do Gateway conforme necessário
7.0 Hot-Reload (Atualizações de Configuração sem Reinicialização)
Edições em enkrypt_mcp_config.json entram em vigor na próxima solicitação sem reiniciar o processo do gateway ou reconectar o cliente MCP.
Como funciona (automático):
-
Um observador em segundo plano verifica o mtime do arquivo de configuração a cada
enkrypt_config_watcher_poll_seconds(padrão2.0). -
Quando uma alteração é detectada, o gateway:
- Limpa o cache de configuração em nível de arquivo para que a próxima leitura veja o novo conteúdo
- Reconstrói os provedores de autenticação / guardrails / telemetria com as novas credenciais
- Redefine o gerenciador de tempo limite e o pool de sessões
- Limpa o cache de configuração por gateway para que a próxima solicitação busque novamente via provedor de autenticação (agora recarregado)
-
Sessões mais antigas que
enkrypt_gateway_cache_expiration_minutes(padrão5) são removidas no próximo acesso para que clientes autenticados anteriormente também vejam a nova configuração.
Como forçar uma limpeza imediatamente (manual):
O endpoint de limpeza está montado em ambos os processos — a API administrativa REST (porta 8001) e o gateway MCP (porta 8000). Eles são processos Python separados com caches em memória separados, então para atualizar ambos você deve chamar ambos:
# 1. Refresh the REST admin API process
curl -X POST http://localhost:8001/api/v1/cache/flush-gateway-config \
-H "apikey: <flush_apikey>" \
-H "Content-Type: application/json" \
-d '{"include_tool_cache": false}'
# 2. Refresh the MCP gateway process (same payload, same auth)
curl -X POST http://localhost:8000/api/v1/cache/flush-gateway-config \
-H "apikey: <flush_apikey>" \
-H "Content-Type: application/json" \
-d '{"include_tool_cache": false}'
# Returns on each:
# {
# "status": "ok",
# "summary": { "auth_reloaded": true, "guardrails_reloaded": true, ... },
# "authorized_via": "org_match" | "static_admin_key",
# "principal": "alice@example.com" | null
# }
O que isso limpa (por processo):
- O cache
get_common_config()em nível de arquivo - O provedor de autenticação — incluindo
EnkryptAuthProvider._cache(o cache TTL de configuração em nuvem), para que a próxima solicitação acione uma nova busca da API de nuvem Enkrypt - O provedor de guardrails (relê as credenciais de guardrails)
- O provedor de telemetria, gerenciador de tempo limite e pool de sessões
- O cache de configuração por gateway (
flush_all_gateway_config_cache)
O endpoint de limpeza também aceita "include_tool_cache": true para descartar adicionalmente os caches de ferramentas por servidor (força a redescoberta na próxima chamada). Use isso quando você adicionou novas ferramentas a um servidor.
Inspecionando a última limpeza:
curl -H "apikey: <flush_apikey>" http://localhost:8000/api/v1/cache/last-reload
curl -H "apikey: <flush_apikey>" http://localhost:8001/api/v1/cache/last-reload
# Returns: {"last_reload_ts": <epoch>, "last_reload_summary": {...}}
Política de autorização de limpeza de cache
O cabeçalho apikey é validado por auth_policy.authorize_apikey_for_cache_flush, que tem dois caminhos completamente diferentes dependendo de qual provedor de autenticação está ativo. A política é intencionalmente estrita sob plugins.auth.provider == "enkrypt": cada limpeza faz uma ida e volta à nuvem Enkrypt /consumer-info para que o principal da solicitação (email) seja registrado e o org_id da nuvem seja verificado contra o org_id configurado no gateway.
| Provedor | apikey aceito | O que é registrado como principal |
|---|---|---|
plugins.auth.provider == "enkrypt" | Qualquer apikey de nuvem cujo /consumer-info.org_id corresponda a uma entrada em enkrypt_config.org_id na configuração do gateway (string única OU lista de strings — veja abaixo). Sem break-glass estático — a raiz admin_apikey NÃO é aceita sob autenticação de nuvem. | O email do usuário da nuvem (ou user_id se o email estiver ausente). |
plugins.auth.provider == "local_apikey" (e outros provedores não-enkrypt) | Raiz admin_apikey, ou o obsoleto enkrypt_config.admin_apikey. Sem ida e volta à nuvem. | null (o caminho de admin estático não carrega identidade). |
O campo de resposta authorized_via informa qual caminho correspondeu: "org_match" (nuvem) ou "static_admin_key" (local).
Configuração necessária sob provider=enkrypt:
{
"enkrypt_config": {
"api_key": "<your operator cloud apikey>",
"base_url": "https://api.enkryptai.com",
// Single-org gateway: one string.
"org_id": "<your Enkrypt org_id — see GET /consumer-info.org_id>"
// Multi-org gateway: a list of allowed org_ids. Cache flushes
// are accepted from any apikey whose /consumer-info.org_id matches
// any entry. Useful when one gateway fronts multiple Enkrypt orgs
// (e.g. operator + customer org both flushing the same shared
// gateway). Blank / placeholder / non-string entries are silently
// dropped during normalization; an empty effective list is treated
// the same as the field being absent (500 no_org_gating_configured).
// "org_id": ["<org-a-uuid>", "<org-b-uuid>"]
},
"plugins": { "auth": { "provider": "enkrypt", "config": {} } }
}
enkrypt_config.org_id é obrigatório para que a limpeza de cache funcione sob autenticação de nuvem — sem ele, cada solicitação de limpeza retorna 500 no_org_gating_configured. O placeholder "YOUR_ENKRYPT_ORG_ID" (que secure-mcp-gateway generate-config --provider enkrypt emite) também é tratado como não configurado.
org_id aceita ou uma string única (o caso comum de uma organização por gateway) ou uma lista JSON de strings (lista de permissões multi-organização — um gateway pode autorizar limpezas de várias organizações distintas sem precisar alternar o provedor de autenticação). Uma lista de entrada única como ["org-uuid-X"] se comporta de forma idêntica à forma de string simples "org-uuid-X" (a mensagem de erro até renderiza sem colchetes nesse caso, então o alerta de organização única permanece inalterado).
Referência de modos de falha:
| HTTP | reason | Quando |
|---|---|---|
| 200 | ok_org_match / ok_static_admin_key | limpeza bem-sucedida; verifique authorized_via para saber qual caminho |
| 401 | missing_apikey | sem cabeçalho apikey |
| 401 | invalid_apikey | apikey do provedor local não correspondeu a admin_apikey / a nuvem /consumer-info rejeitou o apikey |
| 403 | org_mismatch | apikey de nuvem é válido, mas seu org_id não está em enkrypt_config.org_id (valor único ou lista de permissões) |
| 409 | (sem reason) | outro recarregamento já está em andamento |
| 500 | no_admin_configured | provedor local, sem admin_apikey definido |
| 500 | no_org_gating_configured | provedor enkrypt, enkrypt_config.org_id ausente ou ainda o placeholder |
| 502 | cloud_unavailable | a nuvem /consumer-info expirou ou retornou 5xx |
Implicações para o operador:
-
Sob
provider=enkrypt, o próprioenkrypt_config.api_keydo operador ainda funciona porque sobrevive a/consumer-infoe seuorg_idcorresponde por construção — mas a solicitação passa pela nuvem (cache de 5 min após a primeira chamada por apikey). -
A nuvem Enkrypt deve estar acessível para limpar sob
provider=enkrypt. Se você precisar de uma limpeza local de emergência durante uma interrupção da nuvem, alterne temporariamenteplugins.auth.providerparalocal_apikey(o observador de arquivos aplica a alteração em ~2 s; a próxima limpeza então aceitaadmin_apikey). -
Cada limpeza bem-sucedida deixa uma linha de log estruturada:
[gateway_cache_routes] cache flushed via=<org_match|static_admin_key> principal=<email|null> include_tool_cache=<bool>— pesquisável no OpenSearch vialog.attributes.principal/log.attributes.via.
Chaves de configuração relevantes:
| Chave | Padrão | Significado |
|---|---|---|
enkrypt_gateway_cache_expiration_minutes | 5 | TTL para configurações por gateway em cache e sessões autenticadas. Mais curto = edições de configuração entram em vigor mais rápido, mais longo = menos idas e voltas de autenticação. |
enkrypt_gateway_cache_expiration | 24 | TTL legado baseado em horas. Mantido para compatibilidade retroativa; o campo de minutos vence quando ambos estão definidos. |
enkrypt_config_watcher_poll_seconds | 2.0 | Com que frequência o observador verifica novamente o mtime do arquivo. Defina como 0 para desativar o hot-reload automático (a API de limpeza manual ainda funciona). |
Configurações que ainda exigem reinicialização:
| Configuração | Motivo |
|---|---|
Porta de escuta 0.0.0.0:8000 | O bind do socket ocorre uma vez na inicialização do FastMCP |
Alternância enkrypt_mcp_use_external_cache | A troca em memória ↔ Redis perderia operações em andamento |
enkrypt_cache_host / enkrypt_cache_port | A reconstrução do pool de conexões Redis corre o risco de descartar pipelines em andamento |
plugins.telemetry.config.url / enabled | O TracerProvider / MeterProvider global do OpenTelemetry só pode ser definido uma vez por processo (restrição do SDK) |
✂️ Editar Configuração do Gateway
-
Importante:
-
Com o hot-reload (veja a Seção 7.0), reiniciar o cliente MCP não é mais necessário para a maioria das edições de configuração. A reinicialização só é necessária para as três configurações listadas na tabela acima.
-
Para tornar todas as novas ferramentas acessíveis, use o prompt "
list all servers, get all tools available" para o Cliente MCP descobrir todas as novas ferramentas. Depois disso, o Cliente MCP deve ser capaz de usar todas as ferramentas dos servidores configurados no arquivo de configuração do Gateway
-
-
Você pode adicionar muitos servidores MCP dentro do array
mcp_configdesta configuração do gateway-
Você pode ver aqui exemplos de servidores
-
Você também pode experimentar o Enkrypt MCP Server
-
Exemplo:
{ "common_mcp_gateway_config": {...}, "mcp_configs": { "UNIQUE_MCP_CONFIG_ID": { "mcp_config_name": "default_config", "mcp_config": [ { "server_name": "MCP_SERVER_NAME_1", "description": "MCP_SERVER_DESCRIPTION_1", "config": { "command": "python/npx/etc.", "args": [ "arg1", "arg2", ... ], "env": { "key": "value" } }, // Set explicit tools to restrict access to only the allowed tools // Example: "tools": { "tool_name": "tool_description" } // Example: "tools": { "echo": "Echo a message" } // Or leave the tools empty {} to discover all tools dynamically "tools": {}, "server_tools_guardrails_config": {"enabled": false}, "input_guardrails_config": {...}, "output_guardrails_config": {...} }, { "server_name": "MCP_SERVER_NAME_2", "description": "MCP_SERVER_DESCRIPTION_2", "config": {...}, "tools": {}, "server_tools_guardrails_config": {"enabled": false}, "input_guardrails_config": {...}, "output_guardrails_config": {...} } ] }, "UNIQUE_MCP_CONFIG_ID_2": {...} }, "projects": { "UNIQUE_PROJECT_ID": { "project_name": "default_project", "mcp_config_id": "UNIQUE_MCP_CONFIG_ID", "users": [ "UNIQUE_USER_ID" ], "created_at": "2025-01-01T00:00:00.000000" }, "UNIQUE_PROJECT_ID_2": {...} }, "users": { "UNIQUE_USER_ID": { "email": "default@example.com", "created_at": "2025-01-01T00:00:00.000000" }, "UNIQUE_USER_ID_2": {...} }, "apikeys": { "UNIQUE_GATEWAY_KEY": { "project_id": "UNIQUE_PROJECT_ID", "user_id": "UNIQUE_USER_ID", "created_at": "2025-01-01T00:00:00.000000" }, "UNIQUE_GATEWAY_KEY_2": {...} } }
-
⛩️ Esquema de Configuração do Gateway
-
enkrypt_config(nível raiz): Um objeto centralizado que contém as credenciais de nuvem Enkrypt compartilhadas entre os provedores de autenticação e guardrails e (opcionalmente) a API REST administrativa. Use isso em vez de duplicarapi_key/base_urlem cada bloco de plugin:{ "enkrypt_config": { "api_key": "YOUR_ENKRYPT_API_KEY", "base_url": "https://api.enkryptai.com" } }Cadeia de resolução (veja
src/secure_mcp_gateway/plugins/plugin_loader.py:_resolve_enkrypt_credentials):plugins.<auth|guardrails>.config.api_key/apikey— substituição por plugin, se definido.enkrypt_config.api_key— o valor raiz centralizado.- Padrão (vazio para
api_key,https://api.enkryptai.comparabase_url).
Então você pode definir um
enkrypt_config.api_keyna raiz e ambos os plugins o capturam automaticamente. Substitua por plugin apenas quando você realmente precisar de chaves diferentes para autenticação vs guardrails (incomum). -
admin_apikey(nível raiz): Uma string aleatória de 256 caracteres usada para autenticar operações administrativas da API REST (gerenciamento de usuários, gerenciamento de projetos, gerenciamento de configuração, gerenciamento de chaves de API). Gerada automaticamente porsecure-mcp-gateway generate-configquando o provedor de autenticação élocal_apikey.-
Importante: Mantenha esta chave segura! Ela fornece acesso administrativo total ao gateway.
-
Usada com o cabeçalho
Authorization: Bearer <admin_apikey>para chamadas de API REST. -
Diferente das chaves de API regulares usadas pelos clientes MCP para se conectar ao gateway.
-
Com
plugins.auth.provider = "enkrypt"o campoadmin_apikeyé opcional: oenkrypt_config.api_keyda nuvem também é aceito como credencial de administrador, então um segredo de administrador separado não é necessário. Definaadmin_apikeyapenas se você quiser uma credencial de administrador dedicada rotacionada independentemente do apikey da nuvem. -
Legado:
enkrypt_config.admin_apikey(a localização aninhada pré-2.2) ainda é honrado como um fallback obsoleto para que configurações existentes continuem funcionando. Novas configurações usam a colocação no nível raiz. -
Veja Seção 12: API REST para Operações Administrativas para detalhes.
-
-
Se você quiser um conjunto diferente de servidores MCP para um cliente/usuário separado, você pode adicionar uma nova seção
mcp_configao arquivo de configuração. Além disso, você pode executar comandos CLI. Veja CLI-Commands-Reference.md seção2. CONFIGURATION MANAGEMENTpara detalhes -
Defina
enkrypt_log_levelcomoDEBUGpara obter logs mais detalhados dentro da partecommon_mcp_gateway_configdo arquivo de configuração- Isso tem como padrão
INFO
- Isso tem como padrão
-
Agora, dentro do array
mcp_configs, para cada configuração MCP individual, você pode definir o seguinte:-
server_name: Um nome do servidor MCP ao qual nos conectamos -
description(opcional): Uma descrição do servidor MCP -
config: A configuração para o servidor MCP conforme instruído pela documentação do servidor MCP-
Geralmente você tem as seguintes chaves na configuração:
-
command: O comando para executar o servidor MCP -
args: Os argumentos a passar para o comando -
env: As variáveis de ambiente a definir para o comando
-
-
-
tools: As ferramentas expostas pelo servidor MCP-
Defina ferramentas explícitas para restringir o acesso apenas às ferramentas permitidas ou deixe vazio
tools": {}para o Gateway descobrir todas as ferramentas dinamicamente -
As ferramentas precisam receber um nome e uma descrição como
"tools": { "dummy_echo": "Echo a message" }
-
-
🔒 Esquema de Guardrails Opcional
- Obtenha sua chave de API no [Painel Enkrypt](https://app.enkryptai.com/settings) e adicione-a ao campo `enkrypt_config.api_key` no arquivo de configuração-
Configuração de gateway gerenciado na nuvem: defina
plugins.auth.providercomo"enkrypt"(vejaexample_enkrypt_cloud_config.jsonou executesecure-mcp-gateway generate-config --provider enkrypt). O gateway então busca sua lista de servidores, políticas de guardrails ecommon_overridesda nuvem Enkrypt via/mcp-gateway/get-gateway-config. Nenhum bloco local demcp_configs/projects/users/apikeysé necessário.- A flag pré-2.2
enkrypt_use_remote_mcp_config(maisenkrypt_remote_mcp_gateway_name/enkrypt_remote_mcp_gateway_version) está obsoleta. Ela apenas controlava o caminho legado de "provedor local_apikey com fallback para a nuvem Enkrypt". Novas configurações devem usarplugins.auth.provider = "enkrypt"em vez disso. Configurações existentes que ainda definem essas flags continuam funcionando sem alterações.
- A flag pré-2.2
-
Se você tiver algum servidor de cache externo como KeyDB em execução, você pode definir
enkrypt_mcp_use_external_cachecomotrueno seucommon_mcp_gateway_config- Defina outras chaves relevantes relacionadas a cache no seu
common_mcp_gateway_config
- Defina outras chaves relevantes relacionadas a cache no seu
-
enkrypt_tool_cache_expiration(em horas) decide por quanto tempo as ferramentas descobertas dos servidores MCP são armazenadas em cache localmente ou no servidor de cache externo -
enkrypt_gateway_cache_expiration(em horas) é o controle de TTL legado para configurações de gateway em cache (mantido para compatibilidade retroativa). Prefiraenkrypt_gateway_cache_expiration_minutes(padrão5), que controla por quanto tempo tanto o cache de configuração do gateway em memória quanto o cache de busca na nuvem por(gateway_name, version)(usado quandoplugins.auth.provider = "enkrypt") permanecem antes que a próxima solicitação acione uma atualização. Veja §14.6 Hot-Reload sem Reinício. -
enkrypt_async_input_guardrails_enabled-
falsepor padrão -
O modo assíncrono não é recomendado para ferramentas que executam ações que não podem ser desfeitas
-
Como a chamada de ferramenta é feita em paralelo à chamada de guardrails, ela não pode ser bloqueada se violações de guardrails de entrada forem detectadas
-
Útil para servidores que retornam apenas informações sem executar ações, ou seja, apenas operações de leitura
-
-
enkrypt_async_output_guardrails_enabled(Em breve)-
Isso faz com que as chamadas de guardrails do lado de saída sejam assíncronas para economizar tempo
-
Ou seja, detecção de guardrails, verificação de relevância, verificação de aderência, desmascaramento de PII, etc., são feitas em paralelo após obter a resposta do servidor MCP
-
-
Dentro de cada configuração de servidor MCP, você pode definir o seguinte:
-
input_guardrails_config: Use isto se planejamos usar Enkrypt Guardrails no lado de entrada -
guardrail_name: Nome da política de guardrails que você criou no App Enkrypt ou usando a API/SDK -
enabled: Se deve habilitar guardrails no lado de entrada ou não. Isto éfalseno arquivo de configuração de exemplo -
additional_config: Configuração adicional para a política de guardrails-
pii_redaction: Se deve mascarar PII na solicitação enviada ao servidor MCP ou não- Se
true, isto também desmascara automaticamente o PII na resposta do servidor MCP
- Se
-
-
block: Lista de guardrails para bloquear-
Valores possíveis no array são:
-
topic_detector, nsfw, toxicity, pii, injection_attack, keyword_detector, policy_violation, bias, sponge_attack -
system_prompt_protection, copyright_protection(Em breve) -
Isto é semelhante à configuração de implantações do nosso AI Proxy. Consulte nossa documentação
-
-
-
-
output_guardrails_config: Use isto se planejamos usar Enkrypt Guardrails no lado de saída-
guardrail_name: Nome da política de guardrails que você criou no App Enkrypt ou usando a API/SDK -
enabled: Se deve habilitar guardrails no lado de saída ou não. Isto éfalseno arquivo de configuração de exemplo -
additional_config: Configuração adicional para a política de guardrails-
relevancy: Se deve verificar a relevância da resposta do servidor MCP -
adherence: Se deve verificar a aderência da resposta do servidor MCP -
hallucination: Se deve verificar alucinação na resposta do servidor MCP (Em breve)
-
-
block: Lista de guardrails para bloquear-
Valores possíveis no array são:
-
Todos os valores possíveis no array de bloco de entrada mais
adherence, relevancy -
system_prompt_protection, copyright_protection, hallucination(Em breve) -
Isto é semelhante à configuração de implantações do nosso AI Proxy. Consulte nossa documentação
-
-
-
7.1 Provedor de autenticação na nuvem Enkrypt e cabeçalhos do gateway
Definir plugins.auth.provider como "enkrypt" alterna o gateway de buscas locais de apikeys / projects / users / mcp_configs para a nuvem Enkrypt: em cada solicitação autenticada, o gateway chama GET {base_url}/mcp-gateway/get-gateway-config e mapeia a resposta para a forma de configuração interna. Qual configuração de gateway na nuvem retorna é decidida pela chave de API mais os cabeçalhos do gateway descritos abaixo.
🔑 Bloco de configuração, contrato de cabeçalho e roteamento multi-gateway
7.1.1 Chaves plugins.auth.config
{
"plugins": {
"auth": {
"provider": "enkrypt",
"config": {
"apikey": "<boot-time fallback enkrypt apikey>",
"gateway_name": "your-gateway-saved-name",
"gateway_version": "v1",
"project_name": "default",
"base_url": "https://api.enkryptai.com",
"cache_ttl_seconds": 600
}
}
}
}
| Chave | Obrigatória | Padrão | O que faz |
|---|---|---|---|
gateway_name | sim, a menos que os clientes enviem o cabeçalho X-Enkrypt-MCP-Gateway | — | O saved_name do gateway que você criou no console Enkrypt (o campo saved_name retornado por /mcp-gateway/add-gateway). Enviado para a nuvem como X-Enkrypt-MCP-Gateway. |
gateway_version | não | o cabeçalho X-Enkrypt-MCP-Gateway-Version, caso contrário "v1" | Enviado como X-Enkrypt-MCP-Gateway-Version. Definir aqui fixa a versão para cada solicitação neste processo e substitui o cabeçalho do cliente; deixe de fora para permitir que cada cliente escolha a sua. |
project_name | não | inferido pela nuvem a partir da chave de API; "default" quando a chave de API não é uma chave de API de projeto | Enviado como X-Enkrypt-Project, e somente quando definido — deixe de fora para permitir que a nuvem infira. Somente configuração. |
apikey | não | enkrypt_config.api_key | Fallback no momento da inicialização usado apenas quando um cliente MCP se conecta sem seu próprio cabeçalho apikey. Observe a grafia: sob plugins.auth.config a chave é apikey, não api_key. |
base_url | não | enkrypt_config.base_url, caso contrário https://api.enkryptai.com | A barra final é removida. |
cache_ttl_seconds | não | 600 | TTL do cache de resposta na nuvem em processo do provedor (o modelo --provider enkrypt enviado define 300). |
apikey e base_url são preenchidos a partir do bloco centralizado de nível raiz enkrypt_config quando ausentes aqui, então a maioria das configurações define apenas gateway_name (e opcionalmente gateway_version / cache_ttl_seconds) sob plugins.auth.config.
⚠️ Chaves removidas falham na inicialização. O provedor pré-2.2 aceitava
api_key,use_remote_configetimeoutsobplugins.auth.config. Elas agora geram umValueErrorna inicialização em vez de serem silenciosamente ignoradas — useapikey/gateway_name/gateway_version/project_name/base_urlem vez disso, e defina o timeout de autenticação viacommon_mcp_gateway_config.timeout_settings.auth_timeout.
7.1.2 Cabeçalhos que seu cliente MCP envia ao gateway
| Cabeçalho | Obrigatório | Notas |
|---|---|---|
apikey | sim | Sua chave de API da nuvem Enkrypt. Ela é lida por solicitação e encaminhada como o apikey de saída para a nuvem Enkrypt, para que cada cliente conectado possa carregar sua própria chave e obter sua própria configuração. |
X-Enkrypt-MCP-Gateway | somente quando plugins.auth.config.gateway_name não está definido | Seleciona qual configuração de gateway na nuvem buscar, por solicitação. Se gateway_name estiver definido na configuração, o valor da configuração vence e um cabeçalho diferente é ignorado (uma linha de INFO registra a substituição). |
X-Enkrypt-MCP-Gateway-Version | não | A versão registrada do gateway. A busca na nuvem é baseada em (saved_name, version), então um gateway registrado como, por exemplo, 1 em vez de v1 só é acessível quando o cliente envia isto. Mesma precedência acima: um gateway_version fixado em plugins.auth.config vence e o cabeçalho é ignorado (registrado); caso contrário, o cabeçalho é usado; caso contrário, v1. |
Se nem a configuração nem o cabeçalho fornecerem um nome de gateway, a autenticação falha com Missing X-Enkrypt-MCP-Gateway header and no gateway_name in auth.config.
project_name não tem equivalente por solicitação — vem apenas da configuração.
⚠️ Não envie
ENKRYPT_GATEWAY_KEYno modo nuvem. Para compatibilidade retroativa, o gateway prefere um cabeçalhoENKRYPT_GATEWAY_KEYem vez deapikeyquando ambos estão presentes, e então o encaminha para a nuvem. UmENKRYPT_GATEWAY_KEYresidual de uma configuração antiga de clientelocal_apikeyirá, portanto, sobrescrever sua chave de API correta da nuvem e produzir erros 401. Envie apenas os cabeçalhos que seu provedor ativo precisa (veja a tabela de cabeçalhos por provedor em docs/auth-providers.md).
Nota sobre instalações stdio. Cabeçalhos existem apenas no transporte streamable-HTTP. Quando o cliente MCP inicia o gateway via stdio, as credenciais vêm de variáveis de ambiente (
ENKRYPT_APIKEYpara o provedor de nuvem) e não há equivalente de variável de ambiente para o nome ou versão do gateway — portanto, implantações stdio devem definirplugins.auth.config.gateway_name(egateway_version, se o gateway não forv1) no arquivo de configuração.
7.1.3 Cabeçalhos que o gateway envia para a nuvem Enkrypt
GET {base_url}/mcp-gateway/get-gateway-config é chamado com:
| Cabeçalho | Valor |
|---|---|
apikey | A chave de API do cliente chamador, com fallback para plugins.auth.config.apikey / enkrypt_config.api_key |
X-Enkrypt-MCP-Gateway | plugins.auth.config.gateway_name, com fallback para o cabeçalho de entrada X-Enkrypt-MCP-Gateway |
X-Enkrypt-MCP-Gateway-Version | plugins.auth.config.gateway_version se fixado, caso contrário o cabeçalho de entrada X-Enkrypt-MCP-Gateway-Version, caso contrário v1 |
X-Enkrypt-Project | plugins.auth.config.project_name — omitido inteiramente quando não definido |
Cada chamada é registrada com a chave de API mascarada, para que você possa confirmar qual gateway/projeto/chave uma solicitação realmente usou:
[EnkryptAuthProvider] fetching gateway config: gateway=my-dev-gateway/v1 project=test apikey=****05yg
Compare os últimos 4 caracteres com a chave que você espera — uma incompatibilidade significa que o cliente está enviando o cabeçalho errado.
7.1.4 Um processo de gateway, vários gateways na nuvem
Como gateway_name pode chegar por solicitação, uma única implantação de gateway pode atender a mais de uma configuração de gateway na nuvem: deixe plugins.auth.config.gateway_name não definido e faça cada cliente MCP enviar seu próprio cabeçalho X-Enkrypt-MCP-Gateway junto com seu apikey. Clientes cujo gateway está registrado sob uma versão diferente de v1 enviam X-Enkrypt-MCP-Gateway-Version junto. As respostas da nuvem são armazenadas em cache em processo sob um hash SHA-256 de apikey | gateway_name | gateway_version | project_name, então locatários — e duas versões do mesmo gateway — nunca contaminam a configuração uns dos outros. Veja §4.4.2 para o JSON do lado do cliente.
Observe a compensação: project_name permanece em todo o processo, então todos os clientes nesse processo o compartilham. Fixe gateway_name (e gateway_version) na configuração em vez disso sempre que uma implantação atender exatamente um gateway na nuvem — é o padrão mais seguro, pois o gateway efetivo é então fixado no lado do servidor e cabeçalhos fornecidos pelo cliente não podem mais direcioná-lo. (A nuvem Enkrypt ainda autoriza cada chave de API contra o gateway que ela nomeia, então o cabeçalho não é uma bypass de autorização de qualquer forma.)
7.1.5 Tratamento de falhas
Erros de transporte na nuvem, respostas 5xx e corpos não-JSON falham a solicitação de forma definitiva (AuthStatus.ERROR com a mensagem upstream anexada) — não há fallback de arquivo local nem serviço de cache obsoleto. Observe o contador enkrypt.auth.failure (atributos provider / failure_reason) e as linhas de log [EnkryptAuthProvider] fetching gateway config: ... para alertar sobre interrupções upstream.
Referência completa do provedor — mapeamento de resposta da nuvem, precedência de substituição, local_server_overrides e invalidação de cache — está em docs/auth-providers.md.
8. Guia de Início Rápido da CLI
🖥️ Guia de Início Rápido da CLI
Esta seção orienta você no gerenciamento do gateway inteiramente via CLI — desde a configuração inicial até adicionar servidores, gerenciar projetos e operações do dia a dia.
Dica: Todos os comandos abaixo mostram a versão local (pip). Para Docker, basta adicionar
--dockera qualquer comando — consulte o padrão de comando Docker no final desta seção.Para a referência completa da CLI, consulte CLI-Commands-Reference.md.
Etapa 1: Gere sua configuração
Se ainda não fez isso, gere o arquivo de configuração padrão. Isso cria tudo o que você precisa para começar — uma configuração com um servidor echo de exemplo, um projeto padrão, usuário e chave de API.
secure-mcp-gateway generate-config
# To overwrite an existing config and start fresh
secure-mcp-gateway generate-config --overwrite
# Or, for the Enkrypt-cloud-backed variant (no local servers/projects/users;
# the cloud owns those). After running this, edit the file and set
# enkrypt_config.api_key and plugins.auth.config.gateway_name.
secure-mcp-gateway generate-config --provider enkrypt
O que isso cria:
| Item | Detalhes |
|---|---|
| Arquivo de configuração | ~/.enkrypt/enkrypt_mcp_config.json (macOS/Linux) ou %USERPROFILE%\.enkrypt\enkrypt_mcp_config.json (Windows) |
| Configuração padrão | default_config com um echo_server |
| Projeto padrão | default_project vinculado a essa configuração |
| Usuário padrão | default@example.com |
| Chave de API do gateway | Chave gerada automaticamente para autenticação |
Agora que sua configuração está pronta, o próximo passo é informar ao seu cliente MCP (Claude Desktop, Cursor ou Claude Code) sobre o gateway. Esta é uma configuração única — o comando de instalação grava os detalhes de conexão no arquivo de configuração do seu cliente para que ele saiba como se comunicar com o gateway.
Etapa 2: Instale o gateway para o seu cliente MCP
Escolha o cliente que você usa e execute o comando correspondente:
# For Claude Desktop
secure-mcp-gateway install --client claude-desktop
# For Cursor
secure-mcp-gateway install --client cursor
# For Claude Code (requires the `claude` CLI — see https://docs.anthropic.com/en/docs/claude-code)
secure-mcp-gateway install --client claude-code
O que isso faz nos bastidores: o comando de instalação lê as credenciais de autenticação da sua configuração gerada e as grava no arquivo de configuração do seu cliente MCP. As chaves exatas de env dependem do plugins.auth.provider do seu gateway:
local_apikey(padrão) — a instalação lêapikeys.<key>mais os IDs de projeto/usuário correspondentes e gravaENKRYPT_GATEWAY_KEY+ENKRYPT_PROJECT_ID+ENKRYPT_USER_IDenkryptcloud (quando gerado com--provider enkrypt) — a instalação lêenkrypt_config.api_keye grava um únicoENKRYPT_APIKEY
Para Cursor e Claude Desktop, você verá uma saída como:
INFO: Updated 'Enkrypt Secure MCP Gateway' in C:\Users\<user>\.cursor\mcp.json
INFO: Successfully configured Cursor.
E o arquivo de configuração do seu cliente (por exemplo, ~/.cursor/mcp.json ou ~/Library/Application Support/Claude/claude_desktop_config.json) agora conterá uma destas duas formas.
Provedor local_apikey (padrão):
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "mcp",
"args": [
"run",
"<path-to-your-install>/secure_mcp_gateway/gateway.py"
],
"env": {
"ENKRYPT_GATEWAY_KEY": "<your-auto-generated-gateway-key>",
"ENKRYPT_PROJECT_ID": "<your-project-id>",
"ENKRYPT_USER_ID": "<your-user-id>"
}
}
}
}
Provedor cloud enkrypt (gerado com --provider enkrypt):
{
"mcpServers": {
"Enkrypt Secure MCP Gateway": {
"command": "mcp",
"args": [
"run",
"<path-to-your-install>/secure_mcp_gateway/gateway.py"
],
"env": {
"ENKRYPT_APIKEY": "<your-enkrypt-cloud-apikey>"
}
}
}
}
Para Claude Code, o comando de instalação executa claude mcp add nos bastidores e você verá:
INFO: Successfully installed gateway for Claude Code
INFO: Server name: Enkrypt-Secure-MCP-Gateway
INFO: Scope: user (available across all Claude Code projects)
INFO: Verify with: claude mcp list
Quando a instalação terminar, reinicie seu cliente MCP para que ele reconheça a nova configuração. Após a reinicialização, o gateway aparecerá como um servidor MCP conectado e você estará pronto para começar.
Neste ponto, sua configuração se parece com isto:
default_project
└── default_config
└── echo_server (a simple test server that echoes back your input)
default@example.com ← default user
oQrnCFS43o-...rDjX ← auto-generated gateway API key
Você tem um projeto (default_project) que aponta para uma configuração (default_config), e essa configuração tem um servidor (echo_server). Um usuário padrão e uma chave de API do gateway também foram criados para que tudo funcione imediatamente.
Etapa 3: Verifique o que você tem
Você pode verificar esta configuração a qualquer momento:
# List all configs
secure-mcp-gateway config list
# List servers in a config
secure-mcp-gateway config list-servers --config-name "default_config"
# List projects linked to a config
secure-mcp-gateway config list-projects --config-name "default_config"
O que você pode fazer a partir daqui?
Você tem três caminhos, dependendo do que precisa. Escolha o que se encaixa e siga os passos abaixo dele.
Regra prática: Se você apenas adicionar ou remover servidores dentro da sua configuração atual, basta reiniciar seu cliente MCP. Se você mudar para uma configuração diferente ou criar um novo projeto, precisará reinstalar.
Caminho A — Adicione um servidor à sua configuração existente (mais simples, sem necessidade de reinstalação)
Este é o caminho mais comum. Você já tem default_config — basta adicionar mais servidores a ele.
default_project
└── default_config
├── echo_server (already there)
└── github_server ← you are adding this
1. Adicione o servidor:
secure-mcp-gateway config add-server --config-name "default_config" --server-name "github_server" --server-command "npx" --args="-y,@modelcontextprotocol/server-github" --env '{"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_YOUR_TOKEN"}' --description "GitHub MCP Server"
2. Verifique se foi adicionado:
secure-mcp-gateway config list-servers --config-name "default_config"
Você deve ver:
Servers in config "default_config":
1. echo_server - Simple Echo Server
2. github_server - GitHub MCP Server
3. Reinicie seu cliente MCP — sem necessidade de reinstalação, apenas reinicie:
| Cliente | Como Reiniciar |
|---|---|
| Cursor | Ctrl+Shift+P (ou Cmd+Shift+P) e depois "Developer: Reload Window" |
| Claude Desktop | Saia do aplicativo completamente e reabra-o |
| Claude Code | Saia e relance com claude |
4. Atualize ou remova um servidor depois:
# Update a server's description or settings
secure-mcp-gateway config update-server --config-name "default_config" --server-name "github_server" --description "Updated GitHub Server"
# Remove a server you no longer need
secure-mcp-gateway config remove-server --config-name "default_config" --server-name "github_server"
Caminho B — Crie uma nova configuração no projeto existente
Útil quando você quer configurações separadas para diferentes ambientes (por exemplo, desenvolvimento vs. produção) no mesmo projeto.
default_project
├── default_config (original, untouched)
│ └── echo_server
└── production_config ← new config you are creating
└── github_server
1. Crie a nova configuração — escolha uma destas duas opções:
# Option A: Create an empty config and add servers manually (Step 2 below)
secure-mcp-gateway config add --config-name "production_config"
# Option B: Copy an existing config (including all its servers) — skip Step 2
secure-mcp-gateway config copy --source-config "default_config" --target-config "production_config"
Você não pode fazer as duas coisas —
config copycria a configuração de destino para você. Se você já executouconfig add, use a Opção A e adicione servidores na Etapa 2.
2. Adicione servidores a ela (pule esta etapa se você usou a Opção B acima):
secure-mcp-gateway config add-server --config-name "production_config" --server-name "github_server" --server-command "npx" --args="-y,@modelcontextprotocol/server-github" --env '{"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_YOUR_TOKEN"}' --description "GitHub MCP Server"
3. Aponte seu projeto para a nova configuração:
secure-mcp-gateway project assign-config --project-name "default_project" --config-name "production_config"
4. Reinstale o gateway para seu cliente MCP — isso é obrigatório porque o projeto agora aponta para uma configuração diferente:
secure-mcp-gateway install --client cursor
# or: secure-mcp-gateway install --client claude-desktop
# or: secure-mcp-gateway install --client claude-code
5. Reinicie seu cliente MCP para reconhecer as alterações.
Outros comandos de gerenciamento de configuração:
# Rename a config
secure-mcp-gateway config rename --config-name "production_config" --new-name "staging_config"
# Get full details of a config
secure-mcp-gateway config get --config-name "production_config"
# Delete a config you no longer need
secure-mcp-gateway config remove --config-name "production_config"
Caminho C — Crie um projeto totalmente novo com sua própria configuração
Cria um projeto completamente novo. Como um novo projeto recebe sua própria chave de API, seu cliente MCP deve ser atualizado para usá-la.
default_project (original, untouched)
└── default_config
└── echo_server
my_new_project ← new project you are creating
└── my_new_config ← new config
└── github_server
1. Crie a nova configuração:
secure-mcp-gateway config add --config-name "my_new_config"
2. Adicione servidores a ela:
secure-mcp-gateway config add-server --config-name "my_new_config" --server-name "github_server" --server-command "npx" --args="-y,@modelcontextprotocol/server-github" --env '{"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_YOUR_TOKEN"}' --description "GitHub MCP Server"
3. Crie o novo projeto e vincule-o à configuração:
# Create the project
secure-mcp-gateway project create --project-name "my_new_project"
# Link the config to the project
secure-mcp-gateway project assign-config --project-name "my_new_project" --config-name "my_new_config"
4. Adicione um usuário ao projeto (ou use o usuário padrão existente):
# Use existing user
secure-mcp-gateway project add-user --project-name "my_new_project" --email "default@example.com"
# Or create a new user first, then add them
secure-mcp-gateway user create --email "alice@company.com"
secure-mcp-gateway project add-user --project-name "my_new_project" --email "alice@company.com"
5. Gere uma chave de API para o usuário neste projeto:
secure-mcp-gateway user generate-api-key --project-name "my_new_project" --email "alice@company.com"
6. Reinstale o gateway para seu cliente MCP — isso é obrigatório porque o novo projeto tem uma chave de API diferente. Sem reinstalar, seu cliente ainda usará a chave do projeto antigo e não verá os servidores do novo projeto:
secure-mcp-gateway install --client cursor
# or: secure-mcp-gateway install --client claude-desktop
# or: secure-mcp-gateway install --client claude-code
7. Reinicie seu cliente MCP para reconhecer a nova configuração.
Etapa 4: Defina sua chave de API Enkrypt (para guardrails)
Se você quiser usar os guardrails da Enkrypt AI (proteção de entrada/saída, redação de PII, filtragem de toxicidade, etc.), você precisa definir sua chave de API Enkrypt. Você pode obter uma no painel da Enkrypt AI.
# Set the Enkrypt API key
secure-mcp-gateway config set-enkrypt-api-key --api-key "YOUR_ENKRYPT_API_KEY"
# Verify it was set
secure-mcp-gateway config get-enkrypt-api-key
Sem esta chave, os recursos de guardrails não funcionarão — mas o gateway em si ainda roteará as ferramentas normalmente.
Etapa 5: Ative ou desative a telemetria
O gateway vem com suporte a OpenTelemetry para logging, tracing e métricas. Por padrão, está habilitado, mas será ignorado silenciosamente se o endpoint do coletor não estiver acessível. Você pode habilitá-lo ou desabilitá-lo explicitamente:
# Disable telemetry
secure-mcp-gateway config configure-telemetry --enabled false
# Enable telemetry with a custom collector URL
secure-mcp-gateway config configure-telemetry --enabled true --url "http://localhost:4317"
# Allow insecure (non-TLS) connections to the collector
secure-mcp-gateway config configure-telemetry --insecure true
Iniciando a pilha de telemetria: O gateway envia dados de telemetria para um coletor OpenTelemetry — ele não executa um por conta própria. O repositório inclui dois backends prontos em observability/: a pilha OpenSearch (principal, portas OTel padrão 4317/4318 — consulte observability/README.opensearch.md) e a pilha legada Grafana (coletor, Prometheus, Grafana, Jaeger, Loki + 9 regras de alerta do Slack, em 4327/4328). Execute um deles. Para a pilha Grafana:
cd observability
cp .env.grafana.example .env.grafana # (edit SLACK_WEBHOOK_URL if you want Slack alerts)
docker compose -f docker-compose.grafana.yml --env-file .env.grafana up -d
# then point plugins.telemetry.config.url at http://localhost:4327
| Serviço | URL |
|---|---|
| Painéis Grafana | http://localhost:3001 (admin anônimo; substitua via GRAFANA_HOST_PORT) |
| Visualizador de traces Jaeger | http://localhost:16686 |
| Métricas Prometheus | http://localhost:9090 |
| Endpoint OTLP gRPC | http://localhost:4317 |
Quando a pilha estiver em execução, o gateway começará automaticamente a enviar traces, logs e métricas para o coletor. Consulte §5 para detalhes completos e observability/README.md para um mergulho profundo na personalização de alertas.
Etapa 6: Operações do sistema
# Check gateway health
secure-mcp-gateway system health-check
# Backup your entire config
secure-mcp-gateway system backup
# Restore from a backup
secure-mcp-gateway system restore --file <backup_file>
# Reset to defaults (⚠️ destructive)
secure-mcp-gateway system reset
Padrão de comando Docker
Adicione --docker a qualquer comando da CLI para executá-lo automaticamente dentro do contêiner Docker.
A flag detecta automaticamente seu sistema operacional, define HOST_OS e HOST_ENKRYPT_HOME e monta o
volume ~/.enkrypt/docker — sem necessidade de longas invocações de docker run.
# Quick (recommended) — works on macOS, Linux, and Windows (all shells)
secure-mcp-gateway --docker <COMMAND_HERE>
# Use a custom Docker image
secure-mcp-gateway --docker --docker-image my-registry/secure-mcp-gateway:v2.1.2 <COMMAND_HERE>
A tag da imagem é fixada na versão da CLI do seu host
A partir da v2.2.0, o wrapper usa por padrão enkryptai/secure-mcp-gateway:<your-host-CLI-version> (por exemplo, enkryptai/secure-mcp-gateway:2.2.0) em vez de :latest. Isso evita bugs de incompatibilidade de flags, onde uma CLI de host mais nova passa flags que a CLI mais antiga no contêiner não reconhece — por exemplo,
secure-mcp-gateway: error: unrecognized arguments: --provider enkrypt
(generate-config --provider enkrypt foi adicionado na v2.2.0; se sua CLI de host for v2.2.0, mas o contêiner for v2.1.6, essa flag desaparece silenciosamente no trânsito.)
Se --docker-image for substituído e a substituição não contiver a string de versão da CLI do host, o wrapper registrará uma linha de WARN: para que a causa de qualquer erro de "argumentos não reconhecidos" seja óbvia.
Se sua tag padrão ainda não estiver no Docker Hub (típico logo após uma atualização do pip no host, antes que a imagem correspondente seja publicada), o Docker sairá com not found:
Unable to find image 'enkryptai/secure-mcp-gateway:2.2.0' locally
docker: Error response from daemon: failed to resolve reference "docker.io/enkryptai/secure-mcp-gateway:2.2.0": ... not found.
Você tem três soluções alternativas:
| Solução alternativa | Comando | Trade-off |
|---|---|---|
| Crie a imagem localmente a partir deste repositório (recomendado) | docker build -t secure-mcp-gateway . && secure-mcp-gateway --docker --docker-image secure-mcp-gateway <CMD> | Sempre corresponde à sua CLI de host; custo único de docker build. |
| Fixe em uma tag publicada conhecida | secure-mcp-gateway --docker --docker-image enkryptai/secure-mcp-gateway:<X.Y.Z> <CMD> | Estável; você só vê flags suportadas por <X.Y.Z>. |
Use :latest e aceite a incompatibilidade | secure-mcp-gateway --docker --docker-image enkryptai/secure-mcp-gateway:latest <CMD> | O wrapper emite uma linha de WARN:; novas flags podem falhar com unrecognized arguments. |
Exemplos:
# List configs
secure-mcp-gateway --docker config list
# Add a server
secure-mcp-gateway --docker config add-server --config-name "default_config" --server-name "my_server" --server-command "npx" --args="-y,@example/mcp-server" --description "My Server"
# Generate config (local_apikey, default)
secure-mcp-gateway --docker generate-config
# Generate config (enkrypt cloud) — requires container CLI >= v2.2.0
secure-mcp-gateway --docker generate-config --provider enkrypt --overwrite
# Health check
secure-mcp-gateway --docker system health-check
🔧 Solução de problemas — Servidor não aparecendo?
┌──────────────────────────────────────────────────────────────────┐
│ ❓ DIAGNOSTIC FLOWCHART │
├──────────────────────────────────────────────────────────────────┤
│ │
│ Server not showing up after restart? │
│ │ │
│ ▼ │
│ Did you verify with "config list-servers"? │
│ │ │
│ ├── NO → Run it. Is server listed? │
│ │ │ │
│ │ ├── NO → Wrong --config-name. Go to Step 3. │
│ │ │ │
│ │ └── YES → Continue below ▼ │
│ │ │
│ └── YES, server IS in list-servers │
│ │ │
│ ▼ │
│ Did you restart the MCP client? │
│ │ │
│ ├── NO → Restart it (Step 5) │
│ │ │
│ └── YES, I restarted │
│ │ │
│ ▼ │
│ Check: does your ENKRYPT_PROJECT_ID in the │
│ MCP client config match a project that uses │
│ this config name? │
│ │ │
│ ├── NO → Your gateway key points to a │
│ │ different config. Either: │
│ │ a) Add server to the correct config, OR │
│ │ b) Change the project's config assignment │
│ │ │
│ └── YES → Check if the server's command is │
│ available in the gateway environment │
│ (e.g., npx requires Node.js) │
│ │
└──────────────────────────────────────────────────────────────────┘
9. (Opcional) Adicione o GitHub MCP Server ao Gateway
👨🏻💻 Configure o GitHub
⚠️ Nota importante para usuários de Docker:
Se você estiver executando o Enkrypt Gateway no Docker, use a versão npx do GitHub MCP server em vez da versão Docker mostrada abaixo. Consulte o exemplo de configuração baseado em npx no final desta seção.
Para detalhes sobre o porquê, consulte Seção 4.3.7: Configurando MCP Servers Quando o Gateway é Executado no Docker.
-
GitHub MCP Serverpode ser executado comdockerounpx. A versão Docker requer que o Docker esteja instalado e em execução na sua máquina.- Você pode baixar o docker desktop daqui. Instale e execute-o se ainda não o tiver.
-
Crie um personal access token no GitHub
-
Crie um token que tenha acesso apenas a repositórios públicos e defina uma expiração muito baixa inicialmente para testes
-
Adicione o bloco do servidor GitHub abaixo em
enkrypt_mcp_config.jsondentro do array"mcp_config": []. Ele já deve ter a configuração do servidor echo. -
NOTA: Não se esqueça de adicionar a vírgula
,após o bloco do servidor echo -
Substitua
REPLACE_WITH_YOUR_PERSONAL_ACCESS_TOKENpelo personal access token que você criou -
Você também pode adicionar via CLI. Consulte CLI-Commands-Reference.md, seção
2. CONFIGURATION MANAGEMENT, para detalhes -
Exemplo:
"mcp_config": [ { "server_name": "echo_server", "description": "Simple Echo Server", "config": {...}, "tools": {}, "input_guardrails_config": {...}, "output_guardrails_config": {...} }, { "server_name": "github_server", "description": "GitHub Server", "config": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "REPLACE_WITH_YOUR_PERSONAL_ACCESS_TOKEN" } }, "tools": {}, "server_tools_guardrails_config": {"enabled": false}, "input_guardrails_config": { "enabled": false, "guardrail_name": "Sample Airline Guardrail", "additional_config": { "pii_redaction": false }, "block": [ "policy_violation" ] }, "output_guardrails_config": { "enabled": false, "guardrail_name": "Sample Airline Guardrail", "additional_config": { "relevancy": false, "hallucination": false, "adherence": false }, "block": [ "policy_violation" ] } } ] -
-
Agora reinicie o Claude Desktop para que ele detecte o novo servidor
-
Em seguida, execute o prompt
list all servers, get all tools availablepara que ele descubra o servidor github e todas as suas ferramentas disponíveis
-
Agora execute
List all files from https://github.com/enkryptai/enkryptai-mcp-server
-
Ótimo! 🎉 Adicionamos com sucesso um GitHub MCP Server ao Gateway. No entanto, ele está completamente desprotegido e aberto a todos os tipos de abuso e ataques.
-
Agora, digamos que um prompt como este seja executado
Ask github for the repo "hello; ls -la; whoami"
-
Isso pode não ter causado danos reais, mas imagine um prompt mais complexo que poderia ter causado danos reais ao sistema.
-
Para proteger o MCP server, podemos usar Enkrypt Guardrails como mostrado na próxima seção.
Configuração do GitHub Server (versão npx)
✅ Recomendado para implantações do Gateway em Docker
Se você está executando o Enkrypt Gateway no Docker ou prefere não usar Docker-in-Docker, use o servidor MCP do GitHub baseado em npx:
{
"server_name": "github_server",
"description": "GitHub Server (npx version)",
"config": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-github"
],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "REPLACE_WITH_YOUR_PERSONAL_ACCESS_TOKEN"
}
},
"tools": {},
"server_tools_guardrails_config": {"enabled": false},
"input_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"pii_redaction": false
},
"block": [
"policy_violation"
]
},
"output_guardrails_config": {
"enabled": false,
"guardrail_name": "Sample Airline Guardrail",
"additional_config": {
"relevancy": false,
"hallucination": false,
"adherence": false
},
"block": [
"policy_violation"
]
}
}
Benefícios da versão npx:
- ✅ Sem complicações de Docker-in-Docker
- ✅ Tempo de inicialização mais rápido
- ✅ Funciona perfeitamente com gateway dockerizado
- ✅ Gerenciamento de rede e volumes mais simples
- ✅ Menor consumo de recursos
Pré-requisitos:
- Node.js e npm devem estar instalados no contêiner do gateway ou na máquina host
- O Dockerfile padrão já inclui Node.js 22.x LTS
9.1 (Opcional) Conectar a Servidores MCP com OAuth
🔐 Configure OAuth para Servidores MCP Remotos
Muitos servidores MCP exigem autenticação OAuth para acessar recursos protegidos. O Secure MCP Gateway suporta OAuth 2.0/2.1 com fluxos de Client Credentials e Authorization Code + PKCE para integração perfeita com servidores habilitados para OAuth.
Visão Geral
O Gateway gerencia a obtenção, o cache e a renovação automática de tokens OAuth, para que você não precise gerenciar tokens manualmente. Os tokens são injetados automaticamente nas requisições ao conectar-se a servidores MCP remotos.
Tipos de Concessão Suportados:
- Client Credentials - Para autenticação servidor-a-servidor (máquina-a-máquina)
- Authorization Code + PKCE - Para fluxos de autorização de usuário com segurança aprimorada
Principais Recursos:
- Autorização automática do navegador para o fluxo Authorization Code
- Suporte a URLs de callback locais e remotas
- Renovação automática de tokens antes da expiração
- Cache seguro de tokens
- PKCE (S256) para segurança aprimorada
- Parâmetro de estado para proteção contra CSRF
Exemplos de Configuração OAuth
Fluxo Client Credentials (Servidor-a-Servidor)
Para autenticação máquina-a-máquina, use o fluxo Client Credentials:
{
"server_name": "oauth-enabled-server",
"description": "Remote MCP Server with OAuth",
"config": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.example.com/mcp", "--allow-http"]
},
"oauth_config": {
"enabled": true,
"is_remote": true,
"OAUTH_VERSION": "2.1",
"OAUTH_GRANT_TYPE": "client_credentials",
"OAUTH_CLIENT_ID": "your-client-id",
"OAUTH_CLIENT_SECRET": "your-client-secret",
"OAUTH_TOKEN_URL": "https://auth.example.com/oauth/token",
"OAUTH_AUDIENCE": "https://api.example.com"
},
"tools": {},
"server_tools_guardrails_config": {"enabled": false},
"input_guardrails_config": {
"enabled": false
},
"output_guardrails_config": {
"enabled": false
}
}
Principais Campos OAuth
Configuração Principal
| Campo | Obrigatório | Padrão | Descrição |
|---|---|---|---|
enabled | Sim | false | Habilita OAuth para este servidor |
is_remote | Recomendado | Detecção automática | Defina como true para servidores remotos, false para servidores locais |
OAUTH_VERSION | Não | "2.1" | Versão OAuth: "2.0" ou "2.1" |
OAUTH_GRANT_TYPE | Não | "client_credentials" | Tipo de concessão: "client_credentials" ou "authorization_code" |
OAUTH_CLIENT_ID | Sim | - | Seu client ID OAuth |
OAUTH_CLIENT_SECRET | Sim | - | Seu client secret OAuth |
OAUTH_TOKEN_URL | Sim | - | URL do endpoint de token (deve ser HTTPS para OAuth 2.1) |
OAUTH_AUTHORIZATION_URL | Condicional | - | Endpoint de autorização (obrigatório para concessão authorization_code) |
OAUTH_REDIRECT_URI | Condicional | - | URL de callback (obrigatória para concessão authorization_code) |
Parâmetros OAuth Opcionais
| Campo | Obrigatório | Padrão | Descrição |
|---|---|---|---|
OAUTH_AUDIENCE | Não | null | Público-alvo pretendido para o token (claim aud) |
OAUTH_ORGANIZATION | Não | null | ID da organização (para provedores OAuth multi-tenant) |
OAUTH_SCOPE | Não | null | Escopos separados por espaço (ex.: "read write") |
OAUTH_RESOURCE | Não | null | Indicador de recurso (RFC 8707) |
OAUTH_TOKEN_EXPIRY_BUFFER | Não | 300 | Segundos antes da expiração do token para acionar a renovação (padrão: 5 minutos) |
OAUTH_USE_PKCE | Não | false | Habilita PKCE para o fluxo Authorization Code (recomendado) |
OAUTH_CODE_CHALLENGE_METHOD | Não | "S256" | Método de desafio PKCE: "S256" (recomendado) ou "plain" |
OAUTH_ADDITIONAL_PARAMS | Não | {} | Parâmetros adicionais para incluir nas requisições de token (objeto JSON) |
OAUTH_CUSTOM_HEADERS | Não | {} | Cabeçalhos HTTP personalizados para requisições de token (objeto JSON) |
Configurações de Segurança e Autenticação
| Campo | Obrigatório | Padrão | Descrição |
|---|---|---|---|
OAUTH_USE_BASIC_AUTH | Não | true | Usa HTTP Basic Auth para client credentials (RFC 6749 §2.3.1) |
OAUTH_ENFORCE_HTTPS | Não | true | Aplica HTTPS para conformidade com OAuth 2.1 (defina false apenas para testes locais) |
OAUTH_TOKEN_IN_HEADER_ONLY | Não | true | Envia token apenas no cabeçalho Authorization (recomendado) |
OAUTH_VALIDATE_SCOPES | Não | true | Verifica se o token retornado contém os escopos solicitados |
Configuração de Mutual TLS (mTLS)
| Campo | Obrigatório | Padrão | Descrição |
|---|---|---|---|
OAUTH_USE_MTLS | Não | false | Habilita mutual TLS (RFC 8705) para segurança aprimorada |
OAUTH_CLIENT_CERT_PATH | Condicional | null | Caminho para o arquivo de certificado do cliente (obrigatório se mTLS estiver habilitado) |
OAUTH_CLIENT_KEY_PATH | Condicional | null | Caminho para o arquivo de chave privada do cliente (obrigatório se mTLS estiver habilitado) |
OAUTH_CA_BUNDLE_PATH | Não | null | Caminho para o pacote CA para verificação do certificado do servidor |
Revogação de Token
| Campo | Obrigatório | Padrão | Descrição |
|---|---|---|---|
OAUTH_REVOCATION_URL | Não | null | URL do endpoint de revogação de token (RFC 7009) |
Fluxo Authorization Code + PKCE
Para autorização de usuário com segurança aprimorada, use o fluxo Authorization Code com PKCE:
{
"server_name": "user-auth-server",
"description": "MCP Server requiring user authorization",
"config": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://api.example.com/mcp"]
},
"oauth_config": {
"enabled": true,
"is_remote": true,
"OAUTH_VERSION": "2.1",
"OAUTH_GRANT_TYPE": "authorization_code",
"OAUTH_CLIENT_ID": "your-client-id",
"OAUTH_CLIENT_SECRET": "your-client-secret",
"OAUTH_AUTHORIZATION_URL": "https://auth.example.com/authorize",
"OAUTH_TOKEN_URL": "https://auth.example.com/oauth/token",
"OAUTH_REDIRECT_URI": "http://localhost:8080/callback",
"OAUTH_SCOPE": "openid profile email",
"OAUTH_USE_PKCE": true,
"OAUTH_CODE_CHALLENGE_METHOD": "S256"
},
"tools": {},
"server_tools_guardrails_config": {"enabled": true}
}
Autorização Automática do Navegador
Ao usar o fluxo Authorization Code, o gateway automaticamente:
- Abre seu navegador na URL de autorização
- Gerencia o callback (localhost ou remoto)
- Troca o código de autorização por tokens
- Armazena tokens em cache para uso futuro
Opções de Fluxo:
Callback Localhost (Automático):
"OAUTH_REDIRECT_URI": "http://localhost:8080/callback"
- O Gateway inicia um servidor local na porta 8080
- Captura automaticamente o código de autorização
- Nenhuma intervenção manual necessária
Callback Remoto (Entrada Manual de Código):
"OAUTH_REDIRECT_URI": "https://oauth.yourdomain.com/callback"
- O Gateway abre o navegador para autorização
- O usuário conclui a autorização na página remota
- O usuário copia o código da página de callback
- O usuário cola o código no terminal
- O Gateway troca o código pelo token
Configurando Callback Remoto
Se você quiser usar uma URL de callback remota (experiência profissional e personalizada):
-
Hospede a página de callback:
# Quick start with Python python host_oauth_callback.py # Or with Docker docker-compose -f docker-compose.oauth-callback.yml up -d # Or deploy oauth_callback.html to any static hosting # (GitHub Pages, Vercel, Netlify, AWS S3, etc.) -
Atualize sua configuração:
"OAUTH_REDIRECT_URI": "https://your-domain.com/callback" -
Registre-se no provedor OAuth:
- Adicione a URL de callback às configurações do seu aplicativo OAuth
- Auth0: "Allowed Callback URLs"
- Okta: "Sign-in redirect URIs"
- Azure AD: "Redirect URIs"
- Google: "Authorized redirect URIs"
Testando com o Servidor Echo OAuth
O Gateway inclui um servidor echo de teste que demonstra a injeção de cabeçalhos OAuth. Você pode usá-lo para verificar se o OAuth está funcionando corretamente.
Passo 1: Inicie o Servidor Echo OAuth
O servidor echo OAuth precisa ser executado em modo HTTP para aceitar conexões remotas:
macOS/Linux:
# Export the environment variable
export MCP_HTTP_MODE=true
# Start the server
python src/secure_mcp_gateway/bad_mcps/echo_oauth_mcp.py
Windows (PowerShell):
# Set the environment variable
$env:MCP_HTTP_MODE = "true"
# Start the server
python src/secure_mcp_gateway/bad_mcps/echo_oauth_mcp.py
Windows (Prompt de Comando):
# Set the environment variable
set MCP_HTTP_MODE=true
# Start the server
python src/secure_mcp_gateway/bad_mcps/echo_oauth_mcp.py
O servidor iniciará em http://localhost:8001/mcp/ e imprimirá cabeçalhos relacionados ao OAuth sempre que ferramentas forem chamadas.
Passo 2: Adicione o Servidor Echo OAuth à Configuração do Gateway
Adicione esta configuração ao seu enkrypt_mcp_config.json no array mcp_config:
{
"server_name": "echo_oauth_server",
"description": "Echo Server with OAuth Testing",
"config": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:8001/mcp/",
"--allow-http"
]
},
"oauth_config": {
"enabled": true,
"is_remote": true,
"OAUTH_VERSION": "2.0",
"OAUTH_GRANT_TYPE": "client_credentials",
"OAUTH_CLIENT_ID": "test-client-id",
"OAUTH_CLIENT_SECRET": "test-client-secret",
"OAUTH_TOKEN_URL": "https://auth.example.com/oauth/token",
"OAUTH_ENFORCE_HTTPS": false
},
"tools": {},
"server_tools_guardrails_config": {"enabled": false},
"input_guardrails_config": {
"enabled": false
},
"output_guardrails_config": {
"enabled": false
}
}
Nota: OAUTH_ENFORCE_HTTPS: false é definido apenas para testes locais. Sempre use HTTPS em produção!
Passo 3: Teste a Injeção de Token OAuth
-
Reinicie o Claude Desktop (ou seu cliente MCP) para carregar a nova configuração do servidor
-
Use o prompt:
list all servers and discover tools from echo_oauth_server -
Chame a ferramenta echo:
call the echo tool from echo_oauth_server with message "test oauth" -
Verifique a saída do terminal do servidor echo - você deve ver os cabeçalhos OAuth sendo impressos:
================================================================================
🔐 OAuth HTTP Headers Check (Remote Mode)
================================================================================
✅ AUTHORIZATION: Bearer <token>...
❌ X-OAUTH-TOKEN: Not set
❌ X-ACCESS-TOKEN: Not set
📋 All Request Headers:
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
content-type: application/json
user-agent: python-requests/2.31.0
================================================================================
Isso confirma que o token OAuth está sendo adquirido e injetado automaticamente no cabeçalho Authorization.
Fluxos de Token OAuth
Fluxo Client Credentials
- Primeira Requisição: O Gateway adquire o token do provedor OAuth
- Cache: O token é armazenado em cache com rastreamento de expiração
- Injeção de Token:
- Servidores remotos: Token adicionado como cabeçalho
Authorization: Bearer <token> - Servidores locais: Token disponível em variáveis de ambiente
- Servidores remotos: Token adicionado como cabeçalho
- Renovação automática: Token renovado 5 minutos antes da expiração (configurável)
Fluxo Authorization Code + PKCE
- Configuração Inicial: O Gateway gera o verificador e o desafio de código PKCE
- Autorização no Navegador:
- O Gateway abre o navegador na URL de autorização
- O usuário faz login e autoriza o aplicativo
- Tratamento do Callback:
- Localhost: O Gateway captura automaticamente o código do callback
- Remoto: O usuário copia o código e cola no terminal
- Troca de Token: O Gateway troca o código de autorização por tokens
- Cache e Renovação: Tokens armazenados em cache e renovados automaticamente antes da expiração
Recursos Avançados
- Authorization Code + PKCE: Autorização de usuário com segurança aprimorada (S256)
- Fluxo Automático do Navegador: Abre o navegador e gerencia o callback automaticamente
- Suporte a Callback Remoto: Hospede a página de callback no seu domínio
- Mutual TLS (mTLS): Segurança aprimorada com certificados de cliente (RFC 8705)
- Revogação de Token: Revogue tokens programaticamente (RFC 7009)
- Validação de Escopos: Verifica se o token retornado possui os escopos solicitados
- Cabeçalhos Personalizados: Adicione cabeçalhos HTTP personalizados às requisições de token
- Parâmetro de Estado: Proteção contra CSRF para o fluxo Authorization Code
- Métricas: Acompanhe sucesso/falha na aquisição de tokens, taxa de acerto do cache
Solução de Problemas
Falha na requisição de token OAuth:
- Verifique se CLIENT_ID e CLIENT_SECRET estão corretos
- Verifique se TOKEN_URL está acessível
- Garanta que HTTPS seja usado (ou defina
OAUTH_ENFORCE_HTTPS: falsepara testes)
Token não aparecendo nas requisições:
- Confirme
is_remote: truepara servidores remotos - Verifique os logs do servidor para mensagens de aquisição OAuth
- Habilite o log de depuração:
"enkrypt_log_level": "DEBUG"
Problemas no fluxo Authorization Code:
- Verifique se AUTHORIZATION_URL e REDIRECT_URI estão corretos
- Garanta que a URL de callback esteja registrada no provedor OAuth
- Verifique se o navegador abre automaticamente (ou use a URL manual)
- Para callbacks remotos, verifique se a página de callback está acessível
Callback não funcionando:
- Localhost: O Gateway tenta automaticamente a próxima porta disponível se a 8080 estiver em uso (até 10 portas)
- Remoto: Verifique se a URL de callback está acessível e corresponde às configurações do provedor OAuth
- Verifique se o firewall não está bloqueando o callback
Servidor echo não recebendo cabeçalhos:
- Garanta que a variável de ambiente
MCP_HTTP_MODE=trueesteja definida - Verifique se o servidor está rodando em http://localhost:8001/mcp/
10. (Opcional) Proteja o Servidor MCP do GitHub e o Servidor Echo de Teste
🎁 Proteja com Enkrypt Guardrails GRATUITAMENTE
10.1 🌐 Crie um Guardrail no Aplicativo Enkrypt
- Você pode usar um prompt para gerar regras ou gerar um arquivo PDF que pode colar ou enviar ao criar uma política no Aplicativo
10.1.1 🔍 Regras para copiar
1. MCP-Specific Security Policies
Scan all tool descriptions for hidden instructions/malicious patterns.
Authenticate MCP servers with cryptographic verification.
Lock and pin tool versions to prevent rug-pull attacks.
Enforce isolation between MCP servers to avoid interference.
Restrict GitHub MCP access to specific repositories and users.
2. Code Filtering and Prohibited Patterns
Block known malicious code patterns (e.g., buffer overflows, SQL injection).
Detect malware signatures (e.g., keylogger, trojan).
Prevent crypto mining code.
Identify network attack patterns (e.g., DDoS, botnet).
Block privilege escalation code (e.g., root exploits).
3. Repository Access Control
Enforce role-based read access for private repositories.
Enable strict content filtering for all access types.
Mandate audit logging for private repositories.
Quarantine access to sensitive repositories.
4. AI-Specific Guardrails
Detect tool poisoning via hidden tags and file access commands.
Monitor behavior for file access and network activity.
Require explicit UI approval for suspicious tools.
Protect against prompt injection in GitHub issues.
Block PRs that expose private repo data.
Quarantine suspicious GitHub issues.
5. RADE (Retrieval-Agent Deception) Mitigation
Scan retrieved content for embedded commands.
Validate document integrity and modification timestamps.
Sandbox retrieved content to prevent auto-execution.
6. Input Validation
Limit prompt length (max 4096 tokens).
Block forbidden keywords (e.g., "ignore previous instructions").
Detect encoded/injection patterns (base64, hex, unicode).
7. Model Behavior Constraints
Limit code generation by complexity and size.
Restrict certain languages (e.g., shell scripts, assembly).
Monitor API/system calls and network activity.
Enforce strict context boundaries across repositories.
10.1.2 💡 Prompt usado para gerar as regras
-
Give numbered list of security rules in plain text for configuring AI guardrails for a GitHub server on the rules and policies it needs to follow to prevent malicious use of the GitHub services -
Depois diga
Research latest GitHub MCP hacks and abuses people are trying and update the rules to prevent those. Keep research to the most severe topics -
Depois diga
Only keep essential security rules to reduce size. Remove unwanted sections like post incident, compliance, audit, etc which cannot be used while prevention -
Então você pode copiar e colar as regras ao criar a política
-
Vá para Enkrypt App e faça login com conta OTP, Google ou Microsoft
-
Clique em
Policies
-
Clique em
Add new policy
-
Nomeie como
GitHub Safe Policye cole as regras da política e clique emSave
-
Assim é como uma política salva se parece com as regras aplicadas para
Policy violationGuardrails
-
Agora navegue de volta para o início ou passe o mouse sobre a barra lateral esquerda e clique em
Guardrails -
Clique no botão
Add New Guardrailno canto superior direito
-
Nomeie como
GitHub Guardrail, alterneInjection Attackpara DESLIGADO
-
Role para baixo no painel lateral
Configure Guardrailse alternePolicy Violationpara LIGADO, selecione a política recém-criada e marqueNeed Explanationse necessário
-
Agora, clique no botão
Saveno canto inferior direito para salvar o guardrail
-
Podemos ver o guardrail recém-adicionado na lista de guardrails

10.2 🔑 Obter a Chave de API da Enkrypt
-
Agora, precisamos obter nossa Chave de API GRATUITA do aplicativo Enkrypt. Passe o mouse sobre a barra lateral esquerda para expandi-la e clique em
Settings- Você também pode navegar diretamente para https://app.enkryptai.com/settings

-
Agora clique no ícone
Copyao lado da sua Chave de API ofuscada para copiar a chave para a área de transferência, conforme destacado na captura de tela abaixo
10.3 🔑 Adicionar a Chave de API e o Guardrail ao Arquivo de Configuração
-
Agora temos tudo o que precisamos do aplicativo. Vamos adicionar a Chave de API ao arquivo
enkrypt_mcp_config.json -
Abra o arquivo
enkrypt_mcp_config.jsonem~/.enkrypt/enkrypt_mcp_config.jsonno macOS ou%USERPROFILE%\.enkrypt\enkrypt_mcp_config.jsonno Windows- Se você executou o comando docker para instalar o Gateway, o arquivo de configuração estará em
~/.enkrypt/docker/enkrypt_mcp_config.jsonno macOS e%USERPROFILE%\.enkrypt\docker\enkrypt_mcp_config.jsonno Windows
- Se você executou o comando docker para instalar o Gateway, o arquivo de configuração estará em
-
Adicione a Chave de API à seção
common_mcp_gateway_configsubstituindoYOUR_ENKRYPT_API_KEYpela Chave de API que você copiou do aplicativo -
Dentro do bloco do servidor
GitHubque adicionamos na seção anterior,-
Adicione o Guardrail recém-criado
GitHub Guardrailàs seçõesinput_guardrails_configeoutput_guardrails_config -
Substituindo
"guardrail_name": "Sample Airline Guardrail"por"guardrail_name": "GitHub Guardrail" -
Agora altere
enabledparatrueparainput_guardrails_configdo valor anteriorfalse- Deixaremos
output_guardrails_configcomofalsepor enquanto
- Deixaremos
-
Já devemos ter
policy_violationno arrayblockpara ambas as políticas -
Portanto, a configuração final deve ficar mais ou menos assim:
{ "common_mcp_gateway_config": { ... "enkrypt_api_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx", ... }, "mcp_configs": { "fcbd4508-1432-4f13-abb9-c495c946f638": { "mcp_config_name": "default_config", "mcp_config": [ { "server_name": "echo_server", ... }, { "server_name": "github_server", "description": "GitHub Server", "config": { "command": "docker", "args": [ "run", "-i", "--rm", "-e", "GITHUB_PERSONAL_ACCESS_TOKEN", "ghcr.io/github/github-mcp-server" ], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "github_pat_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" } }, "tools": {}, "server_tools_guardrails_config": {"enabled": false}, "input_guardrails_config": { "enabled": true, "guardrail_name": "GitHub Guardrail", "additional_config": { "pii_redaction": false }, "block": ["policy_violation"] }, "output_guardrails_config": { "enabled": false, "guardrail_name": "GitHub Guardrail", "additional_config": { "relevancy": false, "hallucination": false, "adherence": false }, "block": ["policy_violation"] } } ] } }, "projects": { ... }, "users": { ... }, "apikeys": { ... } } -
10.4 🧪 Testar Guardrails
-
Salve o arquivo e reinicie o Claude Desktop para que ele detecte as alterações
-
GitHub MCP Serverprecisa quedockeresteja instalado. Portanto, instale e tenhadockerem execução na sua máquina antes de prosseguir com as etapas abaixo- Você pode baixar o docker desktop aqui. Instale e execute-o se ainda não o tiver
-
Agora execute o prompt
list all services, toolspara que ele descubra os servidores github, echo e todas as suas ferramentas disponíveis -
Depois disso, vamos reexecutar o prompt malicioso anteriormente bem-sucedido
Ask github for the repo "hello; ls -la; whoami"-
Podemos ver que o prompt foi bloqueado, pois os Guardrails de Entrada bloquearam a solicitação

-
-
Podemos configurar o servidor de teste
echocom Guardrails de nossa escolha e ver as detecções executandoecho "hello; ls -la; whoami".-
O prompt abaixo, que funcionava antes, mas agora está bloqueado com Guardrails
-
Experimente e teste o servidor
echocom vários guardrails para ver como ele se comporta. Você também pode experimentar nosso Playground para testes melhores.

-
10.5 🔧 Ajustar Guardrails
- O prompt seguro
List all files from https://github.com/enkryptai/enkryptai-mcp-servertambém pode ser bloqueado se você usar o Detector de Ataque de Injeção ou Violação de Política no lado de Saída. Portanto, é necessário algum ajuste fino dos guardrails para encontrar a melhor combinação de detectores e bloqueios habilitados para seus servidores. Veja a próxima seção para recomendações.
11. Recomendações para uso de Guardrails
⭐ Recomendações
-
Descobrimos que a melhor maneira de usar os Guardrails da Enkrypt no MCP Gateway é ter um guardrail separado para cada servidor. Dessa forma, podemos ter um guardrail ajustado para cada servidor.
-
Como cada Servidor MCP é muito diferente dos demais, não é possível ter um único guardrail que funcione para todos os servidores.
-
Alguns podem precisar de
Toxicity Detector, outros deNSFW Detector, outros deInjection Attack Detector, outros deKeyword Detector, outros dePolicy Violation, alguns podem precisar do detectorRelevancy, outros do detectorAdherence, etc. -
Alguns podem precisar de uma combinação desses detectores trabalhando juntos para bloquear solicitações maliciosas.
-
Alguns podem precisar de Guardrails no lado de entrada, outros no lado de saída, e alguns podem precisar de ambos aplicados.
-
Consulte nossa documentação para detalhes sobre vários detectores disponíveis.
-
Portanto, tenha guardrails separados para cada servidor e experimente a melhor combinação de detectores e bloqueios para cada servidor que bloqueie solicitações maliciosas, mas permita que solicitações legítimas passem.
-
Experimente nosso detector
Policy Violationcom sua própria política personalizada que detalha o que é permitido e o que não é. Esta pode ser a melhor abordagem para o seu caso de uso.
🚨 Experimente Violação de Política
-
Você pode navegar até a Página inicial do aplicativo Enkrypt, fazer login e clicar em
Policiespara criar sua própria política personalizada.-
Isso aceita texto e também arquivos PDF como entrada, então crie um arquivo com todas as regras que você deseja aplicar ao seu servidor MCP e envie-o
-
Depois de criado, você pode usá-lo ao configurar o Guardrail, como vimos com
GitHub Guardrailna seção anterior

-
11.1 Configuração de Guardrail por Servidor
Você pode controlar o comportamento dos guardrails para cada servidor individualmente usando sinalizadores por servidor na sua configuração.
Observação: Este campo tem como padrão false; quando ausente de common_overrides, tanto o registro de ferramentas quanto a validação de informações do servidor são ignorados.
server_tools_guardrails_config (objeto, padrão: {"enabled": false})
Uma configuração unificada originada exclusivamente de common_overrides (em todo o gateway). Ela controla tanto a validação da descrição do servidor quanto a validação do registro de ferramentas por meio de um único sinalizador enabled, guardrail_name e da lista block.
Formato:
{
"enabled": true,
"guardrail_name": "My Guardrail Policy",
"block": ["policy_violation", "injection_attack"],
"additional_config": {}
}
Quando enabled: true, tanto a validação da descrição do servidor quanto as verificações de guardrail do registro de ferramentas são executadas usando esta política. Quando enabled: false ou ausente, ambas são ignoradas.
Quando desabilitar:
- Ambientes de teste/desenvolvimento com servidores conhecidos e seguros
- Servidores internos onde o conteúdo é totalmente confiável
- Quando os metadados do servidor contêm termos técnicos que geram falsos positivos
Níveis de Guardrail:
O gateway possui dois níveis distintos de guardrails:
-
Validação de Registro de Servidor e Ferramentas (
server_tools_guardrails_config)- Quando: Durante a descoberta de servidores e ferramentas
- O quê: Valida descrições de servidores, descrições de ferramentas e esquemas para conteúdo prejudicial
- Bloqueia: Servidores ou ferramentas com metadados maliciosos
-
Guardrails em Tempo de Execução (
input_guardrails_config/output_guardrails_config)- Quando: Durante a execução de ferramentas (entrada antes, saída depois)
- O quê: Valida argumentos e respostas de ferramentas
- Bloqueia: Solicitações/respostas que violam políticas
Observação: Todos os três níveis são independentes e podem ser configurados separadamente por servidor.
12. Outras Ferramentas Disponíveis
🔧 API REST para Operações Administrativas
O Gateway fornece um servidor de API REST para operações administrativas, como gerenciamento de usuários, projetos, configurações e chaves de API.
Iniciando o Servidor de API REST
secure-mcp-gateway system start-api --host 0.0.0.0 --port 8001
- Documentação da API: Disponível em
http://localhost:8001/docs(Interface Swagger) - Verificação de Integridade:
http://localhost:8001/health - Esquema OpenAPI: Carregado de
openapi.jsonna raiz do projeto
Autenticação com Chave de API de Administrador
Importante: Operações administrativas exigem uma admin_apikey especial na raiz da configuração, separada das chaves de API regulares de usuários. Isso fornece segurança aprimorada para operações administrativas.
Comportamento dependente do provedor (a política de resolução está em src/secure_mcp_gateway/auth_policy.py):
| Provedor de autenticação | admin_apikey necessária? | Observações |
|---|---|---|
local_apikey (padrão) | Sim | A enkrypt_config.api_key da nuvem não é aceita como credencial de administrador (isso ampliaria silenciosamente o limite de confiança). |
enkrypt (nuvem) | Opcional | A enkrypt_config.api_key da nuvem também é aceita como credencial de administrador. Defina admin_apikey somente se quiser um segredo de administrador dedicado rotacionado independentemente da chave de API da nuvem. |
O local aninhado pré-2.2 enkrypt_config.admin_apikey ainda é honrado como um fallback obsoleto para que as configurações existentes continuem funcionando sem edições.
Obtendo sua Chave de API de Administrador
A admin_apikey é gerada automaticamente na raiz da configuração quando você executa secure-mcp-gateway generate-config (a variante padrão do provedor local_apikey). Encontre-a no seu arquivo de configuração:
- Windows:
%USERPROFILE%\.enkrypt\enkrypt_mcp_config.json - macOS/Linux:
~/.enkrypt/enkrypt_mcp_config.json
{
"admin_apikey": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6...",
"enkrypt_config": {
"api_key": "YOUR_ENKRYPT_API_KEY",
"base_url": "https://api.enkryptai.com"
},
"apikeys": {
"regular_user_key_1": { ... },
"regular_user_key_2": { ... }
},
...
}
Observação: Se você usou
--provider enkryptpara gerar a configuração, não verá umaadmin_apikey— aenkrypt_config.api_keyda nuvem é usada como credencial de administrador por padrão. Adicioneadmin_apikeyna raiz somente se quiser um segredo de administrador separado.
Principais Diferenças
-
admin_apikey(nível raiz): Usada para todas as operações administrativas (gerenciamento de usuários, gerenciamento de projetos, etc.)- String aleatória de 256 caracteres para máxima segurança
- Gerada durante
secure-mcp-gateway generate-config(somente quando--provider local_apikey, que é o padrão) - Necessária para endpoints da API REST quando o provedor de autenticação é
local_apikey. Opcional com o provedorenkrypt.
-
apikeys(na seçãoapikeys): Usada para acesso ao gateway por usuários- Usada por clientes MCP para se conectar ao gateway
- Associada a usuários e projetos específicos
- Não usada para operações administrativas
Usando a Chave de API de Administrador
Inclua a admin_apikey no cabeçalho de Autorização para todas as chamadas administrativas da API:
curl -X GET "http://localhost:8001/api/v1/users" -H "Authorization: Bearer YOUR_ADMIN_API_KEY_HERE"
Observação de Segurança:
- Mantenha sua chave de API de administrador segura e nunca a envie para o controle de versão
- Compartilhe a chave de API de administrador apenas com administradores autorizados
- Usuários regulares nunca devem ter acesso à chave de API de administrador
Operações Administrativas Disponíveis
A API REST fornece endpoints para:
- Gerenciamento de Usuários: Criar, listar, atualizar e excluir usuários
- Gerenciamento de Projetos: Criar projetos, atribuir configurações, gerenciar usuários
- Gerenciamento de Chaves de API: Gerar, rotacionar, desabilitar/habilitar e excluir chaves de API
- Gerenciamento de Configurações: Criar, atualizar e gerenciar configurações e servidores MCP
Para documentação completa da API e exemplos, consulte:
- API-Reference.md
- Documentação interativa da API em
http://localhost:8001/docs
💾 Gerenciamento de Cache
12.1 📊 Obter Status do Cache
-
O Gateway pode fornecer o resumo do status do seu cache observando o servidor de cache local/externo
-
Isso é útil para depurar problemas se, por exemplo, uma ferramenta foi atualizada remotamente por um servidor, mas o Gateway ainda não está ciente disso

12.2 🧹 Limpar Cache
-
O Gateway pode limpar seu cache do servidor de cache local/externo
-
Isso é útil para limpar o cache se, por exemplo, uma ferramenta foi atualizada remotamente por um servidor, mas o Gateway ainda não está ciente disso
-
Você pode limpar todo o cache ou um cache específico fornecendo o
server_name- Exemplo:
clear cache for echo_server
- Exemplo:
-
Você também pode limpar todo o cache, apenas o cache do gateway ou apenas o cache do servidor
- Exemplo:
clear all cache,clear just gateway cache,clear server cache for echo_server,Clear all server cache

- Exemplo:
13. (Opcional) Isolamento de Sandbox
O isolamento de sandbox permite executar cada servidor MCP dentro de um contêiner ou microVM isolado, reduzindo o raio de explosão se um servidor for comprometido ou malicioso. Quando habilitado, cada inicialização do servidor MCP é transparentemente encapsulada — nenhuma alteração nos seus clientes ou servidores MCP é necessária.
Contra o que o sandbox protege?
| Ameaça | Sem Sandbox | Com Sandbox |
|---|---|---|
| Acesso ao sistema de arquivos | Sistema de arquivos completo do host | Somente montagem somente leitura /app |
| Acesso à rede | Rede completa | Bloqueado (--network=none) |
| Esgotamento de recursos (fork bomb, OOM) | Pode travar o host | Limitado aos limites do contêiner |
| Roubo de variáveis de ambiente | Todas as variáveis de ambiente visíveis | Somente variáveis permitidas passadas |
| Persistência entre chamadas | Processos podem persistir | Efêmero — destruído após cada sessão |
Ativação rápida
# 1. Enable sandbox in global config
secure-mcp-gateway config update-sandbox --enabled --runtime docker
# 2. Build a Docker image with MCP dependencies
docker build -t sandbox-test-mcp -f tests/Dockerfile.sandbox-test .
# 3. Enable for a specific server with a custom image
secure-mcp-gateway config update-server-sandbox \
--config-name default_config \
--server-name echo_server \
--enabled \
--image sandbox-test-mcp
Configuração por servidor
Cada servidor pode substituir as configurações padrão globais do sandbox:
{
"server_name": "untrusted_server",
"config": { "command": "python", "args": ["server.py"] },
"sandbox": {
"enabled": true,
"runtime": "docker",
"image": "my-mcp-image:latest",
"memory_limit": "256m",
"cpu_limit": "0.5",
"network": "none",
"allowed_env": ["GITHUB_TOKEN"]
}
}
Runtimes suportados
| Runtime | Isolamento | Plataforma | Status |
|---|---|---|---|
| Docker | Namespace + cgroup | Linux, macOS, Windows | Pronto para produção |
| Podman | Namespace + cgroup (sem root) | Linux, macOS | Pronto para produção |
| Microsandbox | microVM de hardware (libkrun) | Linux, macOS | SDK pendente |
| NovaVM | microVM de hardware (KVM) | Linux | CLI pendente |
Para o guia completo de configuração, referência de configuração, instruções de teste e solução de problemas, consulte Passo a passo de isolamento de sandbox.
14. Padrões de implantação
🪂 Padrões de Implantação
14.1 Gateway Local, Guardrails Locais e Servidor MCP Local

14.2 Gateway Local, Servidor MCP Local com Guardrails Remotos

14.3 Gateway Local com Servidor MCP Remoto e Guardrails Remotos

14.4 Gateway Remoto, Servidor MCP Remoto e Guardrails Remotos

15. Desinstalar o Gateway
🗑️ Desinstalar o Gateway
-
Para remover o Gateway de qualquer cliente MCP, basta remover o bloco do servidor MCP
"Enkrypt Secure MCP Gateway": {...}do arquivo de configuração do cliente. Para Claude Code, executeclaude mcp remove Enkrypt-Secure-MCP-Gateway.- Reinicie o cliente MCP para aplicar as alterações em alguns clientes, como Claude Desktop. O Cursor não requer reinicialização.
-
Para desinstalar o pacote pip, execute o seguinte comando:
pip uninstall secure-mcp-gateway
16. Solução de problemas
🕵 Solução de problemas
-
Se alguma chamada falhar no cliente, consulte os logs do MCP do respectivo cliente
-
Veja isto para a localização dos logs do Claude
- Exemplo 🍎 Caminho do log Linux/macOS:
~/Library/Logs/Claude/mcp-server-Enkrypt Secure MCP Gateway.log - Exemplo 🪟 Caminho do log Windows:
%USERPROFILE%\AppData\Roaming\Claude\logs\mcp-server-Enkrypt Secure MCP Gateway.log
- Exemplo 🍎 Caminho do log Linux/macOS:
-
-
Se você vir erros como
Exception: unhandled errors in a TaskGroup (1 sub-exception), talvez o servidor MCP que o gateway está tentando usar não esteja em execução.- Portanto, certifique-se de que o arquivo que ele está tentando acessar esteja disponível
- Quaisquer pré-requisitos para o servidor MCP ser executado sejam atendidos, como
dockerem execução, etc.
-
Se precisarmos de logs mais detalhados, defina o
enkrypt_log_levelparadebugno arquivoenkrypt_mcp_config.jsone reinicie o cliente MCP.
16.1 Solução de problemas do OpenTelemetry
-
Erros de handshake SSL
Se você vir erros SSL como:
SSL_ERROR_SSL: error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBERSolução: Adicione
insecure=Trueà configuração do exportador OTLP emtelemetry.py -
Sem logs no Loki
-
Verifique se o coletor OTLP está em execução:
docker logs secure-mcp-gateway-otel-collector-1 -
Verifique a configuração do coletor em
otel_collector/otel-collector-config.yaml -
Verifique se o Loki está recebendo dados:
curl -G -s "http://localhost:3100/loki/api/v1/query" --data-urlencode 'query={job="enkrypt"}'
-
-
Métricas ausentes
-
Verifique o pipeline de métricas do coletor OTLP:
curl http://localhost:8888/metrics -
Verifique as métricas nos logs do coletor:
docker logs secure-mcp-gateway-otel-collector-1 | grep "metrics"
-
-
Problemas com Docker
# Restart the observability stack (use the compose file for whichever # backend you run -- the bare `docker compose` form no longer works # since both stacks use explicit -f/--env-file). cd observability # OpenSearch (primary): docker compose -f docker-compose.opensearch.yml --env-file .env.opensearch down docker compose -f docker-compose.opensearch.yml --env-file .env.opensearch up -d # …or legacy Grafana: docker compose -f docker-compose.grafana.yml --env-file .env.grafana down docker compose -f docker-compose.grafana.yml --env-file .env.grafana up -d # Check individual service logs docker logs <service-name>
17. Problemas conhecidos em andamento
- Os guardrails de saída não estão sendo aplicados a resultados de ferramentas não textuais. O suporte para outros tipos de mídia, como imagens, áudio, etc., está chegando em breve.
18. Limitações conhecidas
- O Gateway não suporta um cenário em que o Gateway é implantado remotamente, mas o servidor MCP é implantado localmente (sem ser exposto à internet). Isso ocorre porque o Gateway precisa saber o endereço do servidor MCP para encaminhar solicitações a ele.
19. Contribua
Aceitamos contribuições. Leia CONTRIBUTING.md para saber como enviar alterações e nosso Contrato de Licença de Contribuidor (CLA), que você concorda ao enviar uma solicitação pull.
-
Consulte o arquivo
TODOpara ver o trabalho em andamento e os recursos ainda a serem implementados -
Instale o gateway localmente para testar suas alterações
- seguindo os passos de clonagem do Git
- ou construa-o usando
python -m build, ative o venv e instale usandopip install .
-
Relate ou corrija quaisquer bugs que encontrar 😊
20. Testes
🧪 Executando Testes
O gateway inclui uma suíte de testes abrangente que valida todas as funcionalidades principais, incluindo descoberta de servidores, execução de ferramentas, guardrails, cache, telemetria e muito mais.
Pré-requisitos
- Gateway instalado localmente (siga a Instalação Local)
- Ambiente virtual ativado
- Servidor MCP Echo OAuth em execução (para testar cenários de servidor remoto)
Executando a Suíte de Testes
Etapa 1: Definir Variável de Ambiente
Windows PowerShell:
$env:MCP_HTTP_MODE="true"
Prompt de Comando do Windows:
set MCP_HTTP_MODE=true
macOS/Linux:
export MCP_HTTP_MODE="true"
Esta variável de ambiente permite que o servidor Echo OAuth seja executado em modo HTTP para testes.
Etapa 2: Iniciar o Servidor Echo OAuth
Navegue até o diretório do servidor echo e inicie-o:
Windows PowerShell:
cd src\secure_mcp_gateway\bad_mcps
python .\echo_oauth_mcp.py
macOS/Linux:
cd src/secure_mcp_gateway/bad_mcps
python echo_oauth_mcp.py
O servidor iniciará em http://localhost:8001/mcp/ e permanecerá em execução. Mantenha este terminal aberto.
Etapa 3: Executar a Suíte de Testes
Abra um novo terminal, ative seu ambiente virtual e execute os testes:
Windows PowerShell:
# Activate virtual environment
.\.venv\Scripts\activate
# Navigate to tests directory
cd tests
# Run tests
python .\test_gateway.py
macOS/Linux:
# Activate virtual environment
source ./.venv/bin/activate
# Navigate to tests directory
cd tests
# Run tests
python test_gateway.py
Cobertura de Testes
A suíte de testes inclui:
- Testes de Descoberta de Servidores: Listar servidores, obter informações do servidor, descobrir ferramentas
- Testes de Execução de Ferramentas: Chamar ferramentas, múltiplas chamadas de ferramentas, tratamento de erros
- Testes de Cache: Status do cache, limpeza do cache, expiração do cache
- Testes de Guardrails: Guardrails de entrada/saída, guardrails assíncronos, redação de PII
- Testes de Telemetria: Integração OpenTelemetry, métricas, rastreamentos, logs
- Testes de Configuração: Configurações de tempo limite, níveis de log, cache externo
- Testes de Integração: Fluxos de trabalho completos, recuperação de erros, desempenho
Saída Esperada
O executor de testes exibirá:
- Progresso para cada teste
- Status de sucesso/falha
- Duração da execução
- Resumo final com contagens de aprovação/reprovação
Exemplo de saída:
=== Gateway Tools Test Runner ===
Setting up test environment...
Setup complete.
Running Tests...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ test_list_all_servers_basic (0.45s)
✅ test_discover_all_tools_all_servers (1.23s)
✅ test_secure_call_tools_basic (0.89s)
...
=== Test Summary ===
Total Tests: 45
Passed: 45
Failed: 0
Success Rate: 100.0%
Total Duration: 45.67s
Solução de Problemas nos Testes
Erros de conexão do servidor Echo:
- Verifique se o servidor Echo OAuth está em execução na porta 8001
- Verifique se a variável de ambiente
MCP_HTTP_MODEestá definida - Certifique-se de que nenhum outro serviço esteja usando a porta 8001
Erros de configuração do Gateway:
- Verifique se
enkrypt_mcp_config.jsonexiste no diretório~/.enkrypt/ - Verifique se o arquivo de configuração possui chaves de gateway válidas e configurações de servidor
- Certifique-se de que o ambiente virtual tenha todas as dependências instaladas
Falhas nos testes:
- Habilite o log de depuração definindo
enkrypt_log_level: "DEBUG"na configuração - Verifique os logs do cliente MCP para mensagens de erro detalhadas
- Verifique se todos os pré-requisitos estão instalados (Python 3.11+, pip, uv)
21. Licença
21.1 Núcleo do Enkrypt AI MCP Gateway
A funcionalidade principal deste projeto é licenciada sob a Licença Apache, Versão 2.0.
Para o texto completo da licença, consulte o arquivo LICENSE neste repositório.
21.2 Guardrails, Logotipo e Marca da Enkrypt AI
© 2025 Enkrypt AI. Todos os direitos reservados.
O software Enkrypt AI é fornecido sob uma licença proprietária. O uso, reprodução ou distribuição não autorizados deste software ou de qualquer parte dele são estritamente proibidos.
Termos de Uso: https://www.enkryptai.com/terms-and-conditions
Política de Privacidade: https://app.enkryptai.com/privacy-policy
Enkrypt AI e o logotipo Enkrypt AI são marcas registradas da Enkrypt AI, Inc.