如何从Pydantic AI客户端实现Notion远程MCP服务器的OAuth授权连接?
解决Pydantic AI接入Notion MCP服务器的OAuth授权问题
1. 获取Notion OAuth应用凭证
- 登录Notion开发者平台,创建新的内部或公共应用
- 记录生成的Client ID和Client Secret
- 在应用设置中配置重定向URI(需与后续授权流程中的URI一致,例如
http://localhost:8000/callback)
2. 完成OAuth授权流程获取访问令牌
步骤1:引导用户授权
构造授权请求URL,让用户访问该URL并完成授权:
https://api.notion.com/v1/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code&scope=mcp:read,mcp:write
- 替换
YOUR_CLIENT_ID和YOUR_REDIRECT_URI为实际值 scope参数按需调整,至少包含Notion MCP所需权限(如mcp:read用于读取,mcp:write用于写入)
步骤2:用授权码交换访问令牌
用户授权后,重定向URI会收到code参数,用该代码调用Notion令牌接口获取访问令牌:
import httpx token_url = "https://api.notion.com/v1/oauth/token" payload = { "grant_type": "authorization_code", "code": "AUTHORIZATION_CODE_FROM_CALLBACK", "redirect_uri": "YOUR_REDIRECT_URI", "client_id": "YOUR_CLIENT_ID", "client_secret": "YOUR_CLIENT_SECRET" } response = httpx.post(token_url, json=payload) token_data = response.json() access_token = token_data["access_token"] refresh_token = token_data.get("refresh_token") # 用于令牌过期后刷新
3. 在Pydantic AI中配置带授权的MCP客户端
修改原代码,为MCPServerStreamableHTTP添加包含OAuth令牌的请求头:
from pydantic_ai import MCPServerStreamableHTTP, Agent # 初始化带授权头的MCP客户端 notion_mcp = MCPServerStreamableHTTP( "https://mcp.notion.com/mcp", headers={"Authorization": f"Bearer {access_token}"} ) agent = Agent( name="Notion Assistant Chat Agent", model=model, output_type=str, instrument=True, toolsets=[notion_mcp] ) # 运行agent...
4. 处理令牌过期
访问令牌有有效期,需用refresh_token定期刷新:
def refresh_notion_token(refresh_token, client_id, client_secret): token_url = "https://api.notion.com/v1/oauth/token" payload = { "grant_type": "refresh_token", "refresh_token": refresh_token, "client_id": client_id, "client_secret": client_secret } response = httpx.post(token_url, json=payload) return response.json()
在令牌过期前调用该函数更新access_token,并重新配置MCP客户端。
内容的提问来源于stack exchange,提问作者Krešimir Nesek
相关产品推荐
相关产品推荐

