
MCP OAuth/DCR incorrectly adds scope=openid for Calendly MCP
快速结论:该报错通常出现在 n8n 使用 MCP OAuth/DCR 流程连接不支持 OpenID Connect 的 MCP 提供商(如 Calendly)时。排查时优先检查生成的授权 URL 是否包含多余的 scope=openid 参数。
问题场景
用户在 n8n 中创建 MCP OAuth2 API 凭证,并启用 Dynamic Client Registration (DCR),使用 Calendly MCP 服务器 URL(https://mcp.calendly.com)启动 OAuth 连接流程时触发。该问题也影响了 token 过期后的凭证恢复流程。
报错原文
No supported grant type and authentication method found
The requested scope is invalid, unknown, or malformed.
原因分析
可能原因:n8n 的 OAuth 服务在动态客户端注册(DCR)过程中,当 MCP 服务器未明确通告任何 scope 时,默认将 scope 参数设置为 openid。这个行为仅在 OpenID Connect 流程中合理,但对于像 Calendly 这样的非 OIDC MCP 提供商,openid 不被识别为合法 scope,导致 Calendly 拒绝授权请求。
根据 Issue 讨论,Calendly MCP 实际应该使用的 scope 为:mcp:scheduling:read 和 mcp:scheduling:write,但这些 scope 在授权 URL 中被 scope=openid 覆盖。
此外,该问题同样影响凭证过期后的重新授权流程:n8n 在生成新的授权 URL 时仍然会附加 scope=openid,导致 recovery 流程失败。
环境排查
- n8n 版本:2.20.6(Issue 中使用的版本)
- Node.js 版本:24.14.1
- 部署方式:Docker(自托管)
- 数据库:PostgreSQL
- 运行模式:scaling(single-main)
解决步骤
- 临时手动绕过(已确认可行):在浏览器中打开生成的 Calendly 授权 URL 后,手动从 URL 中删除
&scope=openid部分,然后继续授权流程。注意:此方法仅适用于单次操作,不适用于生产环境。 - 等待官方修复:该 Issue 已被标记为
status:in-linear和status:team-assigned,表示 n8n 团队已内部排期。问题根源在于 DCR 回退到scope=openid的行为。 - 社区补丁(可优先尝试):社区贡献者 @harshagarwalnyu 在 PR #30166 中提出了修复方案。该补丁的核心改动是删除 DCR 流程中隐式的
openid回退逻辑,使得授权 URL 不再包含scope=openid。如果你熟悉 n8n 的 self-hosted 部署,可以在等待官方发布前手动应用此补丁。 - 监控 refresh_token 行为:根据 Issue 中的补充观察,建议核实 MCP OAuth/DCR 凭证是否正确请求并存储了
refresh_token,以及在每次成功刷新后是否覆盖旧的 refresh_token,避免重复使用已轮换的 token。
验证方法
修复后,按照以下步骤验证:
- 创建一个新的 MCP OAuth2 API 凭证,启用 DCR,使用 Calendly MCP 服务器 URL
- 启动 OAuth 连接流程,检查生成的授权 URL,确认不包含
scope=openid - 确认 Calendly 授权页面正常加载,不再出现 "The requested scope is invalid, unknown, or malformed" 错误
- 对于凭证恢复场景:待 access token 过期后,检查凭证重新授权流程是否正常工作,不再因
scope=openid失败



