Primeiros passos
Escolha um provedor compatível com OAuth 2.1 ou OpenID Connect
A especificação MCP possui alguns requisitos específicos para autorização:
- OAuth 2.1 IETF DRAFT
- OAuth 2.0 Authorization Server Metadata (RFC 8414)
- OAuth 2.0 Dynamic Client Registration Protocol (RFC 7591)
Embora os dois últimos não sejam obrigatórios, o primeiro é necessário para garantir uma implementação segura e compatível.
No novo draft do MCP, o RFC 8414 será obrigatório para servidores de autorização (provedores). Atualizaremos a documentação assim que o novo draft for finalizado.
Você pode conferir a lista de provedores compatíveis com MCP para ver se seu provedor é suportado.
Instale o MCP Auth SDK
O MCP Auth está disponível para Python e TypeScript. Nos avise se precisar de suporte para outra linguagem ou framework!
- Python
- Node.js
pip install mcpauth
Ou qualquer outro gerenciador de pacotes de sua preferência, como pipenv ou poetry.
npm install mcp-auth
Ou qualquer outro gerenciador de pacotes de sua preferência, como pnpm ou yarn.
Inicialize o MCP Auth
O primeiro passo é inicializar a instância do MCP Auth com os metadados do servidor de autorização do seu provedor. Se seu provedor estiver em conformidade com um dos seguintes:
Você pode usar a função integrada para buscar os metadados e inicializar a instância do MCP Auth:
- Python
- Node.js
from mcpauth import MCPAuth
from mcpauth.config import AuthServerType
from mcpauth.utils import fetch_server_config
mcp_auth = MCPAuth(
server=fetch_server_config(
'<auth-server-url>',
type=AuthServerType.OIDC # ou AuthServerType.OAUTH
)
)
import { MCPAuth, fetchServerConfig } from 'mcp-auth';
const mcpAuth = new MCPAuth({
server: await fetchServerConfig('<auth-server-issuer>', { type: 'oidc' }), // ou 'oauth'
});
Se você precisar especificar manualmente a URL dos metadados ou endpoints, confira Outras formas de inicializar o MCP Auth.
Monte o endpoint de metadados
Para estar em conformidade com a especificação MCP atual, o MCP Auth monta o endpoint OAuth 2.0 Authorization Server Metadata (/.well-known/oauth-authorization-server
) no seu servidor MCP:
- Python
- Node.js
from starlette.applications import Starlette
app = Starlette(routes=[
mcp_auth.metadata_route(),
])
import express from 'express';
const app = express();
app.use(mcpAuth.delegatedRouter());
As URLs nos metadados são mantidas como estão, então o papel de servidor de autorização é totalmente delegado ao provedor. Você pode testar o endpoint de metadados acessando /.well-known/oauth-authorization-server
no seu servidor MCP.
Por que apenas o endpoint de metadados?
Você pode notar que os SDKs oficiais fornecem um roteador de autenticação que monta endpoints de autorização como /authorize
, /token
, etc. Veja por que não fazemos isso:
- Montar apenas o endpoint de metadados permite que você aproveite todas as capacidades do seu provedor sem "reinventar a roda" e injetar complexidade desnecessária no seu servidor MCP.
- Também há um esforço em andamento para transferir o papel do servidor MCP para um resource server e exigir OAuth 2.0 Protected Resource Metadata (RFC 9728). Isso significa que o servidor MCP não lidará mais com nenhuma lógica de autorização (incluindo o endpoint de metadados), servindo apenas como um resource server que depende do provedor para autenticação e autorização.
Atualizaremos o MCP Auth para suportar a nova especificação MCP quando ela for finalizada. Enquanto isso, você pode usar a versão atual, que é compatível com a especificação vigente.
Use o middleware Bearer auth
Depois de inicializar a instância do MCP Auth, você pode aplicar o middleware Bearer auth para proteger suas rotas MCP:
- Python
- Node.js
from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.routing import Mount
from mcpauth import MCPAuth
from mcp.server.fastmcp import FastMCP
mcp = FastMCP()
mcp_auth = MCPAuth(
# Inicialize com a configuração do seu servidor de autenticação
)
bearer_auth = mcp_auth.bearer_auth_middleware(
"jwt", required_scopes=["read", "write"]
)
app = Starlette(routes=[
mcp_auth.metadata_route(),
Mount(
"/",
app=mcp.sse_app(),
middleware=[Middleware(bearer_auth)],
),
])
import express from 'express';
import { MCPAuth } from 'mcp-auth';
const app = express();
const server = new McpServer(/* ... */);
const mcpAuth = new MCPAuth({
/* ... */
});
app.use(mcpAuth.bearerAuth('jwt', { requiredScopes: ['read', 'write'] }));
No exemplo acima, especificamos o tipo de token jwt
e exigimos os escopos read
e write
. Ele validará automaticamente o JWT (JSON Web Token) e preencherá um objeto com as informações do usuário autenticado.
Nunca ouviu falar de JWT (JSON Web Token)? Não se preocupe, continue lendo a documentação e explicaremos quando necessário. Você também pode conferir o Auth Wiki para uma introdução rápida.
Para mais informações sobre a configuração do Bearer auth, confira Configurar Bearer auth.
Recupere as informações de autenticação na sua implementação MCP
Depois que o middleware Bearer auth for aplicado, você pode acessar as informações do usuário autenticado (ou identidade) na sua implementação MCP:
- Python
- Node.js
O MCP Auth armazenará as informações do usuário autenticado em uma variável de contexto após a autenticação bem-sucedida, uma vez que o middleware Bearer auth for aplicado. Você pode acessá-la em seus handlers de ferramentas MCP assim:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP()
mcp_auth = MCPAuth(
# Inicialize com a configuração do seu servidor de autenticação
)
@mcp.tool()
def add(a: int, b: int):
"""
Uma ferramenta que soma dois números.
As informações do usuário autenticado estarão disponíveis no contexto.
"""
auth_info = mcp_auth.auth_info # Acesse as informações de autenticação no contexto atual
if auth_info:
print(f"Usuário autenticado: {auth_info.claims}")
return a + b
O segundo argumento do handler da ferramenta conterá o objeto authInfo
, que inclui as informações do usuário autenticado:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { z } from 'zod';
const server = new McpServer(/* ... */);
server.tool('add', { a: z.number(), b: z.number() }, async ({ a, b }, { authInfo }) => {
// Agora você pode usar o objeto `authInfo` para acessar as informações autenticadas
});
Próximos passos
Continue lendo para aprender um exemplo de ponta a ponta de como integrar o MCP Auth ao seu servidor MCP e como lidar com o fluxo de autenticação em clientes MCP.