Skip to content
FunCoding

Search

Search docs, agents, posts, Skills and MCP servers

MCP 认证

远程 MCP 服务器的 OAuth 2.0、命令行登录、固定回调端口、预配置凭证、元数据发现覆盖、限制 scope、headersHelper 动态请求头,以及 claude.ai 连接器、企业控制和把 Claude Code 作为 MCP 服务器。

版本要求与措辞以官方为准。

OAuth 认证

许多云端 MCP 服务器需要认证,Claude Code 支持 OAuth 2.0。服务器以 401 Unauthorized 或 403 Forbidden 响应时,Claude Code 把远程服务器标为需要认证,具体表现取决于服务器:对你还没登录的服务器,两个状态码都会在 /mcp 里标出让你走 OAuth 流程;对 claude.ai 连接器,由 claude.ai 拒绝你会话令牌引起的 401 不会标记连接器(重新授权连接器修不了你的登录),而是显示会话令牌被拒绝的状态;对你自己配置了 Authorization 头(在 headers 里或经 headersHelper)的服务器,连接时的 401/403 不标记服务器而是报告连接失败(因为要修的是你配置的凭证);对投递到云会话的连接器,Claude Code 不运行登录流程(会话代理用你在 claude.ai 里授予的授权认证),需要重新授权时到 claude.ai/customize/connectors 重新连接。对你已登录的 OAuth 服务器,请求返回 401 时 Claude Code 刷新存储的令牌、重连并重试请求一次,只有重试也失败才在 /mcp 里标记;服务器拒绝存储的刷新令牌时,Claude Code 立即显示指向 /mcp 的提示,在下次工具调用失败之前选 Re-authenticate 重新登录。返回指向授权服务器的 WWW-Authenticate 头的自定义服务器同样得到自动发现。有服务器需要认证时启动会有一条通知(v2.1.193+,只计入你能从 Claude Code 登录的服务器;每个服务器只通知一次)。非交互模式没有 /mcp 面板,无法替你跑 OAuth 流程;自 v2.1.196 起,启用工具搜索(默认)的 claude -p 或 SDK 运行里,配置的服务器需要认证时 Claude Code 会告诉 Claude 该服务器的工具不可用。你配置的 headers.Authorization 被服务器拒绝时,Claude Code 报告连接失败而不是回退到 OAuth——检查令牌对该 MCP 端点是否有效,或去掉该头改用 OAuth。

用法:先 claude mcp add --transport http sentry https://mcp.sentry.dev/mcp(已用同名同范围添加过会报 MCP server sentry already exists in local config),然后在 Claude Code 里用 /mcp 并按浏览器步骤登录。提示:令牌被安全存储并自动刷新;用 /mcp 菜单里的 Clear authentication 撤销访问;浏览器没自动打开就复制提供的 URL 手动打开;认证后浏览器重定向因连接错误失败时,把浏览器地址栏里的完整回调 URL 粘贴到 Claude Code 弹出的 URL 提示里;OAuth 适用于 HTTP 服务器。

命令行认证:claude mcp login <名称> 直接在 shell 里运行服务器的 OAuth 流程,无需在会话里打开 /mcp;claude mcp logout <名称> 清除存储的凭证。检测到没有本地浏览器(SSH 会话、没有显示服务器的 Linux)时,它打印授权 URL 而不是尝试打开浏览器,你在本机打开 URL 后把完整的重定向 URL 粘贴回来。

固定 OAuth 回调端口:有些服务器要求预先注册特定的重定向 URI。默认 Claude Code 随机选一个可用端口作回调;用 --callback-port 固定端口以匹配预先注册的 http://localhost:PORT/callback 形式的重定向 URI(可单独使用配合动态客户端注册,也可与 --client-id 一起配合预配置凭证)。预配置 OAuth 凭证:有些服务器不支持动态客户端注册,出现「Incompatible auth server: does not support dynamic client registration」之类错误时,服务器需要预配置凭证(Claude Code 也支持使用 Client ID Metadata Document 的服务器)。步骤:在服务器的开发者门户创建应用,记下客户端 ID 与密钥;注册表单要求重定向 URI 时选一个可用端口并填 http://localhost:PORT/callback(v2.1.229 曾误发 127.0.0.1 形式,导致精确匹配注册 URI 的服务器以重定向 URI 不匹配拒绝登录,v2.1.231 恢复为 localhost);然后添加服务器——claude mcp add 用标志(--client-id 传客户端 ID,--client-secret 以掩码输入提示密钥,--callback-port),claude mcp add-json 则在 JSON 里放 oauth 对象并把 --client-secret 作为单独标志(只想固定端口让 Claude Code 自动注册客户端,就单独设 callbackPort;也可用环境变量 MCP_CLIENT_SECRET 跳过交互提示);最后在 Claude Code 里 /mcp 并按浏览器登录。提示:客户端密钥安全存储在系统钥匙串(macOS)或凭证文件里,不在配置里;密钥只能在添加服务器时设置,之后 claude mcp login 或 /mcp 认证时使用已存的密钥,不再提示也不读 MCP_CLIENT_SECRET;之后要加或改密钥,先 claude mcp remove <名称> 再用 --client-secret 和同样的 --scope 重新添加;公共 OAuth 客户端没有密钥就只用 --client-id;这些标志只适用于 HTTP 和 SSE 传输;用 claude mcp get <名称> 验证 OAuth 凭证已配置。

覆盖 OAuth 元数据发现:在服务器标准端点出错、或想让发现经过内部代理时,在 .mcp.json 服务器配置的 oauth 对象里设置 authServerMetadataUrl 指向特定授权服务器元数据 URL,绕过默认发现链(默认先检查 RFC 9728 受保护资源元数据等);URL 必须用 https://,其 scopes_supported 覆盖上游服务器通告的 scope。限制 OAuth scope:用 oauth.scopes(单个空格分隔的字符串)固定登录流程请求的 scope——当上游授权服务器通告的 scope 超过你愿意授予的,这是把 MCP 服务器限制在安全团队批准子集的受支持办法;它优先于 authServerMetadataUrl 和服务器在 /.well-known 发现的 scope;不设则由 MCP 服务器决定请求的 scope(自 v2.1.196 起,未设置 oauth.scopes 时 Claude Code 请求服务器 WWW-Authenticate 头或受保护资源元数据提供的 scope,两者都没有就不发送 scope 参数,不再请求自动发现的完整 scopes_supported 目录);授权服务器在 scopes_supported 里通告 offline_access 时,Claude Code 把它附加到固定的 scope 上让访问令牌无需新的浏览器登录即可刷新;服务器之后对某次工具调用返回 403 insufficient_scope 时,调用以点名所需 scope 的 needs additional permissions 消息失败,服务器在 /mcp 里显示为需要认证——该 scope 不在你固定的 oauth.scopes 里就加上,再 /mcp 重新认证(Claude Code 请求的是固定的 scope 而不是服务器点名的那个,不加就重新认证拿到的令牌仍缺它)。

用 headersHelper 做自定义认证

服务器使用 OAuth 之外的认证方案(Kerberos、短期令牌、内部 SSO)时,用 headersHelper 在连接时生成请求头:Claude Code 运行该命令并把输出合并进连接头;命令可以是脚本路径或内联。要求:命令必须向 stdout 写一个字符串键值的 JSON 对象;Claude Code 在 shell 里运行它并在 10 秒后放弃;工作目录取决于你在哪里配置了服务器,所以脚本要给绝对路径或放在 PATH 上;动态头覆盖同名的静态 headers。每次连接(会话开始和重连)都重新运行 helper(受项目与本地范围服务器的信任规则约束),不缓存结果,令牌复用由你的脚本负责。工具调用返回 401/403 时 Claude Code 在同一规则下重新运行 helper、用新头重连并重试一次,重试也失败才在 /mcp 标为需要认证;helper 输出含 Authorization 头时,Claude Code 用它作为服务器的认证而不回退到 OAuth;服务器在连接时拒绝 helper 的凭证则报告连接失败而不是需要认证,修好 helper 返回的凭证后从 /mcp 重连会再次运行 helper。运行 helper 时 Claude Code 设置环境变量 CLAUDE_CODE_MCP_SERVER_NAME、CLAUDE_CODE_MCP_SERVER_URL,以及仅由插件提供服务器时的 CLAUDE_PLUGIN_ROOT,方便写一个服务多个 MCP 服务器的 helper;插件提供的 headersHelper 不能引用插件的 ${user_config.*} 值(命令经 shell 运行,Claude Code 会报告服务器配置错误而不替换),把 ${user_config.KEY} 放在服务器的 headers 字段里。

helper 在哪里运行(工作目录):插件里配置的——插件根目录;项目 .mcp.json 或 local 范围服务器——声明它的项目目录;项目里的智能体文件、SDK 的 mcpServers 选项或 setMcpServers()、--mcp-config——会话的主工作目录;用户范围、托管 MCP、claude.ai 连接器、项目之外的智能体文件(含 --add-dir 目录里的)——你的配置目录(~/.claude,除非设了 CLAUDE_CONFIG_DIR)。helper 能读哪些环境变量:由仓库或插件提供的 headersHelper 是你没写过的命令,所以 Claude Code 运行它时去掉你环境里的凭证变量(如 ANTHROPIC_API_KEY)——适用于项目 .mcp.json 或插件里的服务器,以及来自你项目或 --add-dir 目录的智能体文件里的内联服务器;不适用于用户或 local 范围、托管 MCP、claude.ai 连接器、SDK 或 --mcp-config 提供的,以及来自 ~/.claude/agents/、托管设置或 --agents 的智能体文件里的内联服务器。除 Git 的 GIT_CONFIG_KEY_ 变量外,名字看起来像凭证的变量(含 TOKEN、SECRET、PASSWORD、KEY、AUTH,不分大小写)都会被去掉;此时让脚本从文件或凭证存储读取凭证,若服务器 url 带着这类变量的真实值,helper 收到的 CLAUDE_CODE_MCP_SERVER_URL 里那部分会被替换成 REDACTED 之类的占位。运行 helper 之前先信任文件夹:helper 是任意 shell 命令,对项目 .mcp.json 或 local 范围的服务器,只有你接受了声明该服务器的项目目录的信任对话框之后才运行;不算数的信任:父文件夹的信任,以及 claude -p 或 SDK 会话对设置文件里 Hook 获得的自动信任;信任之前 Claude Code 只用静态 headers 连接服务器,在 claude -p/SDK 会话里还会为每个服务器向 stderr 打印一行 headersHelper not run,告诉你怎样授予信任;不用对话框授予信任的办法:在 ~/.claude.json 里把 projects["<文件夹>"].hasTrustDialogAccepted 设为 true。项目内联在智能体文件里的服务器按该智能体文件来源(你的项目、.claude/agents/、--add-dir 目录)适用同一规则,信任之前根本不加载。

使用 claude.ai 的连接器

用 claude.ai 账号登录 Claude Code 时,你在 claude.ai 里添加的 MCP 服务器(称为连接器)会自动出现在 Claude Code 里:在 claude.ai/customize/connectors 添加服务器(Team 和 Enterprise 方案里只有管理员能添加),在 claude.ai 完成所需认证,然后在 Claude Code 里用 /mcp 查看,来自 claude.ai 的服务器带来源标记。Anthropic 也自己提供一些连接器(如可用 Claude Docs 的账号上 /mcp 会列出 claude.ai Claude Docs,你要求写给别人看的文档时 Claude 会用它;想关闭就在 deniedMcpServers 里加对应的 serverName);组织在 claude.ai 里管理其认证的连接器在 /mcp 和 /plugin 里标为 managed(不改变 Claude Code 连接它的方式或你组织的工具控制);从未登录过的连接器折叠在 claude.ai 部分末尾的 Show unused connectors 行后面。只有当前认证方式是 claude.ai 订阅登录时才拉取连接器;即使之前运行过 /login,下列情况也不加载:ANTHROPIC_API_KEY、ANTHROPIC_AUTH_TOKEN 或 apiKeyHelper 在生效;Bedrock、Agent Platform 等第三方服务商在生效;ANTHROPIC_PROFILE、联合变量或活跃的 Anthropic profile 提供凭证;CLAUDE_CODE_OAUTH_TOKEN 持有来自 claude setup-token 的令牌(它只能发模型请求)。/mcp 没列出你添加的连接器时,运行 /status 确认当前认证方式,取消设置那个环境变量、移除 apiKeyHelper 或关掉 profile,再 /login 选 claude.ai 账号。会话启动时临时网络问题使连接器列表没加载出来,Claude Code 在后台重试最多三次;仍没出现就重启。/mcp 把连接器显示为 session token rejected 说明 claude.ai 拒绝了你 Claude Code 登录的令牌:运行 /login 重新登录,再从 /mcp 重连连接器。你在 Claude Code 里添加的服务器优先于指向同一 URL 的 claude.ai 连接器(/mcp 会把连接器标为隐藏并说明如何移除重复项);Microsoft 365、Gmail、Google Calendar 等 Anthropic 托管的连接器不支持来自 Claude Code 的本地 OAuth(上游身份提供方只接受 claude.ai 注册的重定向 URL),所以用 claude mcp add 或 .mcp.json 指向它们的条目要移除(claude mcp remove <名称>),然后在 claude.ai 里连接服务,连接器就会自动出现在 Claude Code 里。

连接器如何到达 Claude Code:终端、VS Code、JetBrains 和 Agent SDK 会话——Claude Code 自己从 claude.ai 拉取,受本节设置和托管 MCP 配置管控;云会话——由云主机传入,受你的 claude.ai 组织设置,加上到达会话的允许/拒绝列表设置和运行它的主机上的 managed-mcp.json 管控(会话代理会改写每个连接器的 URL,所以按连接器自身 URL 写的 serverUrl 模式匹配不上);桌面应用的本地和 SSH 会话——桌面应用以进程内 type: "sdk" 服务器的方式投递,任何 MCP 设置或 managed-mcp.json 都影响不到它们(用户通过在 claude.ai 断开连接器把它挡在自己的会话之外,组织则通过连接器工具控制里的 blocked 条目)。disableClaudeAiConnectors、ENABLE_CLAUDEAI_MCP_SERVERS、allowAllClaudeAiMcps 只作用于 Claude Code 自己拉取的连接器。组织对连接器工具的控制:Claude Code 在启动时读取并在本地强制执行(桌面应用本地和 SSH 会话除外):设为 ask 的工具每次调用都会提示,原因为 Your organization requires approval for this tool,即使在 acceptEdits、auto、bypassPermissions 模式下也出现,且从不提供「记住选择」,匹配它的 allow 规则也不跳过;设为 blocked 的工具在 Claude 看到之前就被过滤,不出现在 Claude 的工具列表里(Claude Code 自己拉取连接器的会话里 /mcp 工具列表仍显示它并标为 disabled by your organization);桌面应用和 claude.ai 聊天应用同样应用 blocked,桌面应用跳过所有工具都被屏蔽的连接器。关闭连接器:在任何设置范围里把 disableClaudeAiConnectors 设为 true(任一来源为真即生效:检入仓库的项目 .claude/settings.json 可以让某仓库退出 Claude Code 自己拉取的连接器,但项目级的 false 无法重新启用用户级或策略级 true 关掉的连接器);或把 ENABLE_CLAUDEAI_MCP_SERVERS 设为 false(对当前 shell 会话同效);只想屏蔽个别连接器,就按名称或 URL 模式加进 deniedMcpServers(如 serverName 为 "claude.ai Slack" 屏蔽 Slack 连接器),或用 /mcp 为当前会话开关任一连接器。

把 Claude Code 当作 MCP 服务器

可以让 Claude Code 自己作为 MCP 服务器供其他应用连接:运行 claude mcp serve。命令启动时不打印任何东西(stdio MCP 服务器通过 stdin 和 stdout 通信,所以终端静默阻塞说明服务器在运行、等待客户端连接)。在 Claude Desktop 里使用时,把它加到 claude_desktop_config.json:command 字段必须指向 Claude Code 可执行文件,claude 不在系统 PATH 里时要写完整路径(which claude 查找),否则会出现 spawn claude ENOENT 之类的错误。提示:在 Claude Desktop 里可以让 Claude 读目录里的文件、做编辑等;这个 MCP 服务器只把 Claude Code 的工具暴露给你的 MCP 客户端,对各个工具调用的用户确认要由你自己的客户端实现。