MCP示例
建筑
使用Python客户端进行本地OAuth测试
对于本地验证,使用Python MCP客户端对普通本地主机进行验证。这比Claude Desktop的测试简单得多,因为它不需要HTTPS终止。
这验证了:
- 上的受保护资源元数据
mcp_server - OAuth元数据
app_server - 动态客户端注册
- 授权码流
- 刷新令牌流
- 经过身份验证的MCP工具调用
先决条件
app_server和mcp_server在本地运行- 已配置Google管理员登录
- 管理UI中至少有一个已连接的Google日历凭据
启动服务器
- 在一个终端中:
cd app_server
uv run main.py- 在另一个终端中:
cd mcp_server
uv run main.py本地URL
- 应用服务器:
http://127.0.0.1:8000 - MCP服务器:
http://127.0.0.1:9001/mcp
所需的本地设置
app_server/.env
- MCP_SERVER_URL=http://127.0.0.1:9001/mcp
mcp_server/.env
- APP_SERVER_URL=http://127.0.0.1:8000 - AUTH_SERVER_URL=http://127.0.0.1:8000 - MCP_PUBLIC_URL=http://127.0.0.1:9001 - JWT_SECRET 和 JWT_ISSUER 必须匹配 app_server/.env
Google OAuth重定向本地主机的URI
http://127.0.0.1:8000/auth/google/callbackhttp://127.0.0.1:8000/oauth/google_calendar/callback
推荐的预检查
- 打开
http://127.0.0.1:8000/auth/login并确认谷歌登录有效。 - 打开
http://127.0.0.1:8000/credentials并确认目标谷歌日历凭据为connected. - 打开
http://127.0.0.1:8000/.well-known/oauth-authorization-server并确认返回元数据。 - 打开
http://127.0.0.1:9001/.well-known/oauth-protected-resource/mcp并确认返回了受保护的资源元数据。
Python客户端示例
运行附带的测试客户端:
cd mcp_server
uv run test_oauth_client.py或者使用这个最小的例子:
from fastmcp import Client
import anyio
async def main():
async with Client("http://127.0.0.1:9001/mcp", auth="oauth") as client:
tools = await client.list_tools()
print(tools)
anyio.run(main)预期行为:
- 客户端从以下位置发现受MCP保护的资源元数据
mcp_server. - 客户端从以下位置发现授权服务器元数据
app_server. - 客户端动态注册自己。
- 打开浏览器进行Google管理员登录和授权。
- 客户端接收令牌,并使用承载身份验证重试MCP请求。
tools/list工具调用成功。
为什么此路径更适合本地测试
- 不需要HTTPS设置
- 没有本地CA信任问题
- 无克劳德桌面UI/调试摩擦
- 您可以直接验证完整的OAuth和动态注册流程
这能证明什么,不能证明什么
这个localhost Python流是对服务器端实现的有力验证。它验证:
- 上的受保护资源元数据
mcp_server - 上的授权服务器元数据
app_server - 动态注册
- 授权码流
- 刷新令牌流
- 经过身份验证的MCP请求
它不能完全保证部署后Claude Desktop的兼容性。HTTPS、公共可达性、重定向URI配置和Claude Desktop特定的行为仍需要在真实的远程环境中进行验证。
关于Claude Desktop的说明
Claude Desktop远程MCP测试仍然有用,但它通常需要HTTPS端点。在本地主机Python流工作后使用它。
刀具选择控制
- MCP服务器具有多个工具实际传递给LLM的工具仅限于房间设置被做。
- 因为是用户(或代理)可以选择“只想使用的集成”的设计,所以不进行冗长的全部工具交付。
- 在动态输入提示中单击只从同一MCP内的工具群中选择必要的东西可以。
