Guia de implementação de autenticação do servidor MCP: utilizando a especificação mais recente
Fornece pontos-chave de implementação para a conformidade da autenticação do servidor MCP com a especificação de 2025-06-18.
Fornece pontos-chave de implementação para a conformidade da autenticação do servidor MCP com a especificação de 2025-06-18.
Há poucos dias (18 de junho de 2025), a equipa do MCP (Model Context Protocol) lançou a versão mais recente da Especificação MCP (2025-06-18). Esta atualização inclui uma alteração fundamental na especificação de autenticação. Os servidores MCP já não irão emitir tokens de acesso como um Servidor de Autorização. Em vez disso, vão consumir tokens de acesso e fornecer recursos como um Servidor de Recursos.
Como um dos mantenedores do MCP Auth (uma biblioteca plug-and-play de autenticação de Servidor MCP), implementei o suporte à especificação de autenticação MCP mais recente neste projeto. Com base na minha experiência prática, vou mostrar como implementar funcionalidades de autenticação para o teu Servidor MCP que cumpram a especificação atual.
Este artigo vai ajudar-te a:
Nota que este artigo:
De acordo com a especificação de autenticação MCP mais recente, o fluxo é ilustrado neste diagrama:
O Cliente MCP pede recursos ao Servidor MCP em https://github-tools.com. Como o utilizador ainda não iniciou sessão, o header de autorização HTTP deste pedido não contém um token de acesso correspondente ao utilizador.
O Servidor MCP não encontra token de acesso no header de autorização do pedido do Cliente MCP. Por isso, devolve um erro HTTP 401 ao Cliente MCP. A resposta inclui um cabeçalho WWW-Authenticate, que contém o URL dos metadados de recursos do Servidor MCP (valor do campo resource_metadata).
O Cliente MCP extrai o valor de resource_metadata do cabeçalho WWW-Authenticate (por exemplo: https://github-tools.com/.well-known/oauth-protected-resource). Depois, o Cliente MCP pede os metadados de recursos fornecidos pelo Servidor MCP como Servidor de Recursos. Estes metadados incluem conteúdos como authorization_servers e scopes_supported, ajudando o Cliente MCP a perceber como obter o token de acesso necessário para aceder ao Servidor MCP, ou seja, de que servidor de autorização irá obter um token com permissões específicas.
4-8. O Cliente MCP pede informações de metadados ao servidor de autorização com base no URL obtido dos metadados de recursos. Em seguida, realiza o fluxo de autorização OAuth 2.1 com o servidor de autorização e obtém um token de acesso.
O Cliente MCP transporta o token de acesso obtido do servidor de autorização e faz novo pedido de recursos ao Servidor MCP.
O Servidor MCP devolve o recurso pedido após verificar que o token é válido. Depois, a comunicação entre Cliente MCP e Servidor MCP continuará com o token válido.
A seguir, vamos explicar como implementar o mecanismo de autenticação do servidor MCP passo a passo com base neste fluxo.
Como mostra o fluxo acima, quando o Cliente MCP envia um pedido sem token de acesso, o Servidor MCP devolve um erro HTTP 401 Não autorizado com o cabeçalho WWW-Authenticate contendo o URL para obter os metadados de recurso do Servidor MCP.
De acordo com os requisitos de gestão de erros da especificação de autenticação MCP, além de pedidos do Cliente MCP que não tragam tokens, quando o Servidor MCP recebe um token inválido também deve devolver erro 401 com um cabeçalho WWW-Authenticate.
Já sabemos quando devolver um erro 401, mas como construir o cabeçalho WWW-Authenticate retornado?
Segundo RFC9728 Secção 5.1, o cabeçalho WWW-Authenticate deve incluir o parâmetro resource_metadata para apontar o URL dos metadados protegidos do recurso.
O seu formato básico é:
Aqui, Bearer é o esquema de autenticação, indicando que é necessário um token bearer para aceder a recursos protegidos pelo OAuth 2.0 (ver: documentação MDN). O valor de resource_metadata é o URL integral do endpoint de metadados fornecido pelo teu Servidor MCP.
A implementação em código é algo como:
Quando o Cliente MCP recebe este erro 401 vai aceder aos metadados do Servidor MCP pelo valor de resource_metadata no cabeçalho. Com base nos dados dos metadados, irá pedir autorização ao servidor indicado para obter um token válido.
Sabemos agora quando devolver erro 401 e que é preciso devolver um URL de resource_metadata. Falta saber como construir este URL e que dados esses metadados devem conter. Vamos abordar isso a seguir.
Segundo o fluxo de autenticação MCP, após o Cliente receber erro 401, pede imediatamente os metadados ao Servidor MCP. Por isso, o Servidor MCP enquanto Servidor de Recursos deve implementar esse mecanismo.
No sistema OAuth, usamos URLs para identificar endereços de recursos. Este endereço denomina-se "indicador de recurso". Segundo as regras RFC9728, os metadados devem estar sob um caminho /.well-known específico.
Se o teu Servidor MCP (tipo https://github-tools.com) apenas fornece um serviço, o endpoint de metadados será:
Se prestas vários serviços MCP distintos num host, cada serviço deve ter endpoint de metadados independente. Por exemplo, a plataforma de empresa https://api.acme-corp.com disponibiliza:
https://api.acme-corp.com/github - Integração GitHubhttps://api.acme-corp.com/slack - Integração Slackhttps://api.acme-corp.com/database - Serviço de consulta à base de dadosOs endpoints de metadados serão:
https://api.acme-corp.com/.well-known/oauth-protected-resource/githubhttps://api.acme-corp.com/.well-known/oauth-protected-resource/slackhttps://api.acme-corp.com/.well-known/oauth-protected-resource/databaseVantagem deste design: cada serviço pode ter diferentes permissões e configurações de servidor de autorização. Por exemplo:
github:read, github:writeslack:channels:read, slack:messages:writedb:queryPodemos resumir assim os endpoints dos metadados:
Obtém-se o endpoint a partir do identificador do recurso:
Após determinado o path do endpoint, é preciso devolver metadados em formato JSON compatíveis com as regras da RFC9728.
Na implementação, deves focar em quatro campos críticos.
Primeiro, resource, que é o identificador do recurso, igual ao endereço do recurso a aceder pelo Cliente MCP.
Depois, authorization_servers, array que especifica de que servidores de autorização o Cliente MCP pode requerer tokens. Segundo o RFC 9728 é opcional, mas na especificação MCP é obrigatório: o cliente tem de saber de que servidor de autorização pedir o token, caso contrário não conclui o fluxo OAuth.
Segue-se o campo scopes_supported, com as permissões aceites por este Servidor de Recursos.
Por fim, bearer_methods_supported indica ao Cliente como deve enviar tokens. Normalmente ["header"], ou seja, o token vai no header Authorization HTTP.
Um exemplo completo para o servidor MCP em https://github-tools.com:
Assim, o Cliente MCP percebe que quer aceder ao recurso https://github-tools.com, precisa de pedir token ao https://auth.github-tools.com, pode requerer escopos github:read, github:write, repo:admin, devendo enviar o token pelo header Authorization.
Na maioria dos casos bastam estes quatro campos para o Cliente MCP funcionar corretamente. Para configurações mais complexas, consulta a lista completa no RFC9728.
Depois de receber o token do servidor de autorização, o Cliente MCP vai trazer esse token num pedido ao Servidor MCP.
Na validação dos tokens, o Servidor MCP deve prestar atenção a:
Quando o Servidor MCP recebe um token, porque este traz informação do servidor de autorização (issuer), alguns devs vão buscar todos os dados de verificação conforme o issuer do token. Isto, sobretudo quando há múltiplos servidores de autorização como nos metadados:
Neste caso, alguns devs extraem o issuer do token não verificado para obter os dados de validação. Mas um atacante pode montar um servidor de autorização falso e emitir um token falso para o Servidor MCP. Se o developer aceitar tokens de servidores desconhecidos (com base apenas no issuer do token), esta verificação passa indevidamente.
Portanto, a forma correta é:
issuer do token não verificado e procurar o servidor correspondente nas configurações do Servidor MCP. Se não existir, recusar o tokenLembra-te de validar rigorosamente o issuer do token.
Usando a biblioteca jose JWT como exemplo:
A secção de Binding e Validação de Audience do Token na especificação indica: quando o cliente pede token ao servidor de autorização, deve especificar para que recurso o token será usado. O Servidor MCP tem também de verificar se o audience do token corresponde a si mesmo.
Este mecanismo segue o padrão Resource Indicators for OAuth 2.0 (RFC 8707). Resumindo:
Pedido do cliente: quando pede token, especifica o parâmetro resource, indicando o servidor de recursos alvo (tipo https://github-tools.com)
Emissão do token: o endereço do recurso indicado fica na audience do token JWT
Validação: o Servidor MCP, ao receber o token, verifica se a audience (campo aud) coincide com o seu identificador
Exemplo para o Servidor MCP em https://github-tools.com:
Esta validação de audience é essencial para evitar abusos de token. Sem ela, tokens obtidos noutros serviços poderiam ser aceites inadvertidamente pelo teu servidor.
Alguns Servidores MCP gerem permissões para recursos internos, pois utilizadores distintos poderão ter diferentes escopos de permissões.
Assim, depois do token passar a validação, verifica-se se possui o scope necessário. Para isso, verifica se o claim scope no token inclui a permissão para aceder ao recurso:
Segundo a especificação de autenticação MCP, se o token não tiver a permissão necessária, deve-se retornar 403 Forbidden.
Depois desta explicação, já deves conseguir implementar autenticação para o teu Servidor MCP conforme as últimas especificações. Recorda estes pontos-chave: valida tokens de forma segura, configura corretamente os metadados e verifica sempre o audience.
Se estás a construir um Servidor MCP, experimenta a biblioteca MCP Auth. Já traz implementadas todas as funcionalidades referidas aqui e pode ajudar-te a integrar autenticação rapidamente.
Participa na discussão no GitHub para contribuir para o avanço do ecossistema MCP.