Cursor、Claude 和 ChatGPT 的 MCP OAuth 重定向 URI:在 Casdoor 中注册 MCP 客户端
每个 MCP 客户端在登录受 OAuth 保护的 MCP 服务器时都会发送自己的重定向 URI。Cursor 桌面版使用 http://localhost:8787/callback(2026 年中之前的版本使用 cursor://anysphere.cursor-mcp/oauth/callback),Cursor 网页版和 Cursor Cloud Agents 使用 https://www.cursor.com/agents/mcp/oauth/callback,claude.ai、Claude Desktop 连接器、Claude 移动版和 Cowork 使用 https://claude.ai/api/mcp/auth_callback,而 ChatGPT 使用 https://chatgpt.com/connector_platform_oauth_redirect 或每个连接对应的 https://chatgpt.com/connector/oauth/<callback-id>。如果你在 Casdoor 中启用了动态客户端注册,则无需输入这些值:客户端会自行注册或将客户端 ID 元数据文档交给 Casdoor。只有当你手动为客户端创建 Casdoor 应用 时,才需要将它们添加到 Redirect URLs 中。
按客户端划分的重定向 URI
| 客户端 | 重定向 URI | 如何从 Casdoor 获取客户端 ID | 备注 |
|---|---|---|---|
| Cursor 桌面版(当前) | http://localhost:8787/callback | DCR,或 mcp.json 中的 auth.CLIENT_ID | 固定端口 8787 |
| Cursor 网页版和 Cloud Agents | https://www.cursor.com/agents/mcp/oauth/callback | DCR,或 auth.CLIENT_ID | 使用 DCR 时,桌面应用会注册此 URI 和 localhost URI |
| Cursor 桌面版(旧版本) | cursor://anysphere.cursor-mcp/oauth/callback | DCR,或 auth.CLIENT_ID | Cursor 于 2026 年 7 月将环回 URI 设为默认值 |
| claude.ai、Claude Desktop 连接器、Claude 移动版、Cowork | https://claude.ai/api/mcp/auth_callback | CIMD,然后是 DCR,或在自定义连接器对话框中输入客户端 ID | 由 Anthropic 的服务器发起请求 |
| Claude Code | http://localhost:<port>/callback 和 http://127.0.0.1:<port>/callback | CIMD | 端口随会话变化 |
通过 mcp-remote 使用的 Claude Desktop | http://localhost:<port>/oauth/callback | DCR | 端口由服务器 URL 推导得出 |
| ChatGPT | https://chatgpt.com/connector_platform_oauth_redirect,或 https://chatgpt.com/connector/oauth/<callback-id> | CIMD、DCR,或预定义客户端 | 从 ChatGPT 复制确切的值 |
这些值来自截至 2026 年 11 月 2 日的供应商文档(参见 References)。客户端可能会更改它们。当登录失败时,请在浏览器地址栏中读取授权请求的 redirect_uri 参数,并将其与 Casdoor 中的配置进行比较。
该表格适用于两种设置:内置于 Casdoor 的 MCP 服务器(位于 /api/mcp),以及使用 Casdoor 作为其授权服务器 的您自己的 MCP 服务器。在这两种情况下,客户端都通过受保护资源元数据 (RFC 9728) 找到 Casdoor,并从 Casdoor 获取其客户端 ID。
选项 1:允许客户端自行注册
Casdoor 在 /api/oauth/register 支持动态客户端注册 (RFC 7591) 和客户端 ID 元数据文档 (CIMD),其中 client_id 是一个列出客户端重定向 URI 的 JSON 文档的 HTTPS URL。一个开关控制这两项功能:组织上的 Enable dynamic client registration。它默认处于关闭状态,包括 built-in 在内的所有组织都是如此。
为 built-in 开启此开关后,发现文档将显示客户端所需的信息:
curl -s https://your-casdoor.com/.well-known/openid-configuration | jq '{
registration_endpoint,
client_id_metadata_document_supported,
code_challenge_methods_supported,
token_endpoint_auth_methods_supported,
authorization_response_iss_parameter_supported
}'
{
"registration_endpoint": "https://your-casdoor.com/api/oauth/register",
"client_id_metadata_document_supported": true,
"code_challenge_methods_supported": ["S256"],
"token_endpoint_auth_methods_supported": ["client_secret_basic", "client_secret_post", "private_key_jwt", "none"],
"authorization_response_iss_parameter_supported": true
}
然后每个客户端选择其方法:
- Claude 仅在元数据同时包含
client_id_metadata_document_supported: true和token_endpoint_auth_methods_supported中的none时才使用 CIMD。一旦开启开关,Casdoor 就具备这两个条件,因此 Claude 通过文档 URL 标识自身,并且 Casdoor 会创建一个名为cimd_...的应用。否则,Claude 回退到 DCR。 - ChatGPT 优先使用 CIMD,其
client_id为https://chatgpt.com/oauth/client.json(或针对特定回调的变体),当 CIMD 不可用时则使用 DCR。 - Cursor 通过 DCR 注册为公共客户端,无需密钥。Cursor 的文档未提及 CIMD。
mcp-remote通过 DCR 注册。
重定向 URI 来自注册请求或元数据文档,因此无需手动输入。已注册的客户端在受限角色下运行,其令牌无法调用管理 API。有关完整规则以及客户端所属的组织,请参阅动态客户端注册。
选项 2:为客户端创建应用
如果您保持注册功能关闭,请为每个客户端创建一个应用,以便您可以分别撤销它们:
- 在 Casdoor 管理控制台中,前往 Identity > Applications 并添加一个应用,例如
cursor-mcp。 - 将表格中客户端的重定向 URI 添加到 Redirect URLs。对于 Cursor,添加全部三个,因为不同的 Cursor 安装发送的 URI 不同。
- 将 Category 设置为
Agent。有关范围和授权类型,请参阅为您的 MCP 服务器设置 Casdoor。 - 将 Client ID 提供给客户端。
对于这些客户端,客户端密钥是可选的。如果请求使用了 PKCE,Casdoor 接受没有密钥的授权码交换,且 Cursor、Claude 和 ChatGPT 都使用带有 S256 的 PKCE。如果客户端确实发送了密钥,则必须是正确的密钥。
客户端 ID 的位置:
-
Cursor:
~/.cursor/mcp.json或.cursor/mcp.json中的auth对象。如果使用静态CLIENT_ID,Cursor 桌面应用仅发送其 localhost 重定向 URI。{
"mcpServers": {
"casdoor": {
"url": "https://your-casdoor.com/api/mcp",
"auth": {
"CLIENT_ID": "${env:CASDOOR_MCP_CLIENT_ID}",
"scopes": ["application:read", "user:read"]
}
}
}
} -
Claude:自定义连接器对话框中的 OAuth 客户端 ID 字段。注册
https://claude.ai/api/mcp/auth_callback。 -
ChatGPT:ChatGPT 也支持预定义的 OAuth 客户端。从 ChatGPT 中 MCP 服务器的管理页面复制重定向 URI,因为它使用的两种形式之一取决于授权服务器。
分步指南:Cursor、Claude Desktop、ChatGPT。
Casdoor 如何匹配重定向 URI
Casdoor 将请求的 redirect_uri 与 Redirect URLs 中的每个条目进行比较:
- 方案、主机和路径必须匹配。不比较查询字符串。
- 端口必须匹配,除非是环回主机。当两个 URI 都使用相同的环回主机(
localhost、127.0.0.1或::1)时,Casdoor 会忽略端口,正如 RFC 8252 对原生应用的要求那样。localhost和127.0.0.1是不同的主机,因此 Claude Code 需要同时拥有http://localhost/callback和http://127.0.0.1/callback。 - 已注册主机的子域上的重定向 URI 也能匹配,因此
https://example.com/cb接受https://app.example.com/cb。请注册尽可能具体的主机。 - 自定义方案(如
cursor://)遵循相同的匹配规则。javascript:、data:和vbscript:URI 始终被拒绝。
由于忽略了环回端口,当本地端口在会话之间变化时,mcp-remote 或 Claude Code 的注册仍然有效。
claude_desktop_config.json 的位置
MCP 文档给出了这些路径。在 Claude Desktop 中,Settings > Developer > Edit Config 会打开该文件,如果文件不存在则创建它。
| Operating system | Path |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
Claude Desktop 通过两种方式之一访问远程 MCP 服务器,它们使用不同的重定向 URI:
-
作为连接器,在 Claude 的连接器设置中添加。Anthropic 的服务器执行 OAuth 流程,重定向 URI 为
https://claude.ai/api/mcp/auth_callback,并且 Casdoor 必须可从互联网访问。 -
通过
claude_desktop_config.json,使用mcp-remote作为本地桥接。OAuth 流程在您的计算机上运行,重定向 URI 为http://localhost:<port>/oauth/callback:{
"mcpServers": {
"casdoor": {
"command": "npx",
"args": ["mcp-remote", "https://your-casdoor.com/api/mcp"]
}
}
}
编辑文件后,完全退出并重新启动 Claude Desktop。
托管客户端需要公开的 Casdoor
ChatGPT 和 Claude 连接器从其供应商的服务器而非您的计算机调用您的 MCP 服务器和 Casdoor。Casdoor 必须可通过具有有效证书的公共 HTTPS 访问。如果您按 IP 过滤,Anthropic 的请求来自 160.79.104.0/21。Cursor 桌面版、Claude Code 和 mcp-remote 在本地运行流程,因此网络内的 Casdoor 即可满足需求。
托管客户端还会检查另外两点,而 Casdoor 已经做到了这一点:
- 响应中的 Issuer (RFC 9207):ChatGPT 会拒绝缺少正确
iss的授权响应,并且仅对满足其 RFC 9207 要求的授权服务器使用其稳定的重定向 URI。Casdoor 在其元数据中声明支持该功能,并在重定向中添加iss。 - 资源指示器 (RFC 8707):ChatGPT 在授权和令牌请求中发送带有 MCP 服务器 URL 的
resource。Casdoor 将该值放入访问令牌的aud声明中,您的 MCP 服务器应检查此值。有关发现流程,请参阅 MCP 身份验证。
www.casdoor.com 上的相关阅读:面向 AI 代理的 OAuth 和 面向 MCP 的授权服务器。
References
- Cursor: Model Context Protocol (MCP),章节 "Static OAuth for remote servers"
- Cursor 论坛: OAuth redirect URI changed from cursor:// to http://localhost
- Anthropic: Authentication for connectors
- Model Context Protocol: Connect to local MCP servers
- OpenAI: Authenticate users
mcp-remote: README- Casdoor: 动态客户端注册, 为您的 MCP 服务器设置 Casdoor