Clientes MCP¶
O Nodexa expõe tools compatíveis com MCP pela interface admin. Clientes MCP conectam no domínio do admin, não diretamente no backend.
Endpoint¶
Use este endpoint para as tools nativas do Nodexa:
Para testes locais:
Não adicione /api nesse caminho. A interface admin faz proxy de /mcp-gateway/* para o backend e mantém a URL do backend privada.
Autenticação¶
Clientes MCP autenticam com tokens bearer OAuth padrão. O gateway publica OAuth Protected Resource Metadata em:
O client do Keycloak usado por clientes MCP é:
Esse client deve ser um client OAuth público usando Authorization Code + PKCE.
Configuração no Keycloak¶
Crie o client OAuth do MCP no mesmo realm do Keycloak usado pelo backend do Nodexa.
No Nodexa Cloud, o issuer do realm é:
No Keycloak Admin Console:
- Selecione o realm
nodexa-cloud. - Abra Clients.
- Crie ou atualize um client com Client ID
nodexa-mcp. - Use OpenID Connect.
- Defina Client authentication como Off. Este deve ser um client público.
- Ative Standard flow.
- Desative Direct access grants em produção.
- Defina PKCE Code Challenge Method como
S256. - Adicione os redirect URIs válidos:
Para testes locais com Claude Code, o redirect URI usa uma porta localhost aleatória, por exemplo:
O wildcard acima permite essas portas dinâmicas de callback.
Se o Keycloak ainda rejeitar o redirect durante o teste, adicione o callback URI exato exibido no erro do navegador, por exemplo:
Defina Web origins como:
ou explicitamente:
Protocol Mappers¶
O access token emitido para clientes MCP precisa conter os mesmos claims de organização e audiência que o backend valida.
Adicione um mapper Group Membership:
| Configuração | Valor |
|---|---|
| Mapper type | Group Membership |
| Token claim name | groups |
| Add to access token | On |
| Full group path | On |
Isso permite que o backend derive a organização a partir de paths de grupo como:
Adicione um mapper Audience para que tokens emitidos para nodexa-mcp sejam aceitos pelo backend:
| Configuração | Valor |
|---|---|
| Mapper type | Audience |
| Included Client Audience | nodexa-cloud-backend |
| Add to access token | On |
O backend também deve aceitar o client MCP como audiência adicional:
OIDC_CLIENT_ID=nodexa-cloud-backend
OIDC_EXTRA_AUDIENCES=nodexa-mcp
OIDC_VALIDATE_AUDIENCE=true
OIDC_GROUPS_CLAIM=groups
Se o client ID do seu backend for diferente, use esse client ID no mapper de audiência e em OIDC_CLIENT_ID.
Claude Code¶
Remova qualquer configuração MCP antiga do Nodexa e adicione o novo endpoint do gateway:
claude mcp remove nodexa -s local
claude mcp add-json nodexa '{"type":"http","url":"http://localhost:4000/mcp-gateway/nodexa","oauth":{"clientId":"nodexa-mcp"}}' -s local
Em produção, troque a URL pelo domínio do admin:
claude mcp add-json nodexa '{"type":"http","url":"https://your-admin.example.com/mcp-gateway/nodexa","oauth":{"clientId":"nodexa-mcp"}}' -s local
Verifique a URL configurada:
No primeiro uso, o Claude Code deve iniciar o fluxo OAuth e redirecionar você para o Keycloak.
Teste HTTP Rápido¶
Sem token, o endpoint deve retornar 401 Unauthorized e incluir um header WWW-Authenticate apontando para a URL de metadata:
curl -i -X POST http://localhost:4000/mcp-gateway/nodexa \
-H "Content-Type: application/json" \
--data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'
Troubleshooting¶
Keycloak mostra client not found¶
Isso significa que o Keycloak não encontrou um client ativo com:
no realm configurado. Verifique se o client existe no realm nodexa-cloud e se o client ID é exatamente nodexa-mcp.
Keycloak mostra invalid redirect_uri¶
Adicione o callback URI usado pelo cliente MCP. O Claude Code usa uma porta localhost aleatória:
Se você configurou http://localhost:*/callback, substitua por http://localhost:*. O wildcard do Keycloak é mais confiável quando o * fica no final do padrão da URI. Você também pode adicionar temporariamente a URI exata da página de erro, por exemplo http://localhost:56963/callback.
O backend rejeita o token¶
Verifique os claims do access token. Ele precisa incluir:
groups, com o path do grupo da organização do usuário- uma audiência aceita pelo backend, normalmente
nodexa-cloud-backende/ounodexa-mcp
Decodifique o token localmente:
A metadata OAuth aponta para o host errado¶
A resposta de metadata deve usar o domínio do admin, não o domínio do backend:
Se aparecer localhost:3001, a request está chegando diretamente no backend em vez de passar pelo proxy do admin.