Docs
PlataformaIntegração do desenvolvedor

Validar o token Xokepoint

Como um MCP server do cliente confere o token que o Xokepoint envia e lê a pessoa e o agente.

Depois de permitir uma chamada, o Xokepoint chama o MCP server do cliente com um token só para aquele server (Autenticação upstream). O server confere o token e, se quiser, usa a pessoa e o agente para decidir sobre os próprios dados.

O server precisa de três valores, que aparecem no diálogo e nos detalhes do server (Servers do cliente): Issuer, JWKS e Audience.

O que conferir

  1. A assinatura, com as chaves da URL do JWKS. Leia a URL e guarde em cache; não copie as chaves, porque elas giram.
  2. iss igual ao Issuer.
  3. aud igual à Audience, que é o endpoint do próprio server na forma canônica: esquema e host em minúsculas, sem porta padrão, sem query nem fragmento. Um token para outro server é recusado.
  4. exp no futuro. O token vale 60 segundos.

A assinatura é ES256 e o header do token tem typ at+jwt.

Com o token válido, sub é a pessoa ou o serviço e act.sub é o agente. Num tools/call, chokepoint_tool também nomeia a tool (server_id e name).

Um tipo de token não tem agente. Quando o administrador conecta ou redescobre o server, o Xokepoint lista as tools com um token cujo sub é chokepoint:registry e que não tem act. Aceite-o para tools/list e para as mensagens de protocolo, e recuse um tools/call sem act. Configure os três valores antes da primeira descoberta: ela já envia um token, e um server que o rejeita não consegue ser registrado.

Exemplo com FastMCP

Os detalhes do server no Admin trazem este exemplo, com os valores preenchidos:

from fastmcp import FastMCP
from fastmcp.server.auth.providers.jwt import JWTVerifier
from fastmcp.server.dependencies import get_access_token

auth = JWTVerifier(jwks_uri="<JWKS>", issuer="<Issuer>", audience="<Audience>", algorithm="ES256")
mcp = FastMCP("issues", auth=auth)

@mcp.tool
def move_issue(repository: str, issue_number: int, column: str) -> str:
    claims = get_access_token().claims
    person, agent = claims["sub"], claims["act"]["sub"]
    ...

O JWTVerifier confere assinatura, issuer, audience e validade antes de a tool rodar. Dentro da tool, person e agent servem para filtros próprios, como mostrar só os documentos da pessoa, e para logs.

O server não precisa repetir as regras do Xokepoint. A chamada só chega a ele depois do ALLOW.