Claude Code 管理与部署
Claude Code 管理与部署
统一管理 MCP 配置
5 分钟阅读
控制组织的 MCP 服务器访问权限
使用托管配置文件、允许列表和拒绝列表,限制用户可以添加或连接哪些 MCP 服务器。
默认情况下,任何运行 Claude Code 的用户都可以连接自己选择的任意 MCP 服务器。Anthropic 会按照其上架标准审查连接器,通过后再将其加入 Anthropic Directory,但不会对任何 MCP 服务器开展安全审计或进行管理。作为管理员,你可以限制组织中允许运行的服务器:既可以部署一组固定的已批准服务器,也可以完全禁用 MCP。
本页介绍如何:
- 选择一种模式,匹配所需的控制程度
- 使用
managed-mcp.json部署固定的服务器集合,包括如何完全禁用 MCP - 使用允许列表和拒绝列表控制服务器
- 当限制阻止服务器时,向用户说明会出现什么情况
- 监控组织实际使用的服务器
安全性页面介绍 MCP 威胁模型,以及批准服务器前的评估方法。确定要强制执行的内容则将 MCP 限制与其他管理控制措施放在一起说明。
选择一种模式
Claude Code 支持不同程度的限制。每种模式都会使用下文介绍的一种或两种机制:用 managed-mcp.json 部署固定集合,以及用 allowedMcpServers/deniedMcpServers 筛选用户配置的内容。
| 模式 | 作用 | 配置 |
|---|---|---|
| 禁用 MCP | 所有位置均不加载服务器 | 使用服务器映射为空的 managed-mcp.json |
| 固定部署 | 每位用户获得相同的服务器,且不能添加其他服务器 | 在 managed-mcp.json 中配置所需服务器 |
| 已批准目录 | 发布已批准服务器列表;用户自行添加所需服务器,其他服务器均被阻止 | allowedMcpServers + allowManagedMcpServersOnly: true |
| 仅允许插件服务器 | 服务器只能来自插件;用户不能自行添加 | 使用 strictPluginOnlyCustomization,并在列表中加入 mcp |
| 软允许列表 | 强制执行允许列表,但用户可以在自己的设置中扩展它 | 使用 allowedMcpServers,但不设置 allowManagedMcpServersOnly |
| 仅拒绝列表 | 阻止已知有问题的服务器,允许其他所有服务器 | deniedMcpServers |
| 不作限制 | 用户可以添加任意服务器 | 不部署任何托管 MCP 配置 |
Claude Code 没有可供用户浏览和安装 MCP 服务器的内置 registry。采用“已批准目录”模式时,请在用户容易找到的位置(例如内部 Wiki)共享已批准列表及相应的 claude mcp add 命令;也可以通过托管插件市场将服务器作为插件分发,让用户通过 /plugin 浏览并安装。
使用 managed-mcp.json 进行独占控制
部署 managed-mcp.json 文件后,Claude Code 只会加载该文件定义的服务器。用户不能添加、修改或使用任何其他 MCP 服务器,包括插件提供的服务器。除非你允许 claude.ai 连接器与托管集合同时使用,否则该文件还会禁止 claude.ai 连接器。
另外两个设置可以进一步筛选托管集合:
allowedMcpServers和deniedMcpServers同样适用于托管服务器,因此不符合这些设置的托管服务器不会加载。- 用户自身设置中的
deniedMcpServers会合并进来,因此用户可以为自己阻止某个托管服务器。
完整的检查顺序请参阅服务器的评估方式。
managed-mcp.json 是独立文件,因此不能通过服务器托管设置下发。任何能够以管理员权限写入系统路径的流程都可以部署此文件。大规模部署通常会使用设备管理工具,例如 macOS 上的 Jamf 或配置描述文件、Windows 上的组策略或 Intune,以及 Linux 上所选的设备群管理系统。Claude Code 会在以下路径之一查找该文件:
| 平台 | 路径 |
|---|---|
| macOS | /Library/Application Support/ClaudeCode/managed-mcp.json |
| Linux 和 WSL | /etc/claude-code/managed-mcp.json |
| Windows | C:\Program Files\ClaudeCode\managed-mcp.json |
该文件使用与项目 .mcp.json 文件相同的格式:
使用每位用户各自的凭据进行身份验证
计算机上的任何用户都可以读取此文件,因此不要在 env 块中存储 API 密钥或其他凭据。请改用以下方式之一传入每位用户的凭据:
- 使用
${VAR}展开,从每位用户的环境中读取密钥。 - 使用 OAuth 或每位用户各自的请求头,让每位用户以自己的身份进行身份验证。
- 使用
headersHelper,在连接时生成凭据。
验证配置
要确认该文件已生效,请在一台托管计算机上执行两项检查:
claude mcp list应只显示managed-mcp.json中的服务器。如果仍显示用户自己的服务器,说明文件未被读取;请检查路径和权限。claude mcp add --transport http test https://example.com/mcp应失败并显示Cannot add MCP server: enterprise MCP configuration is active and has exclusive control over MCP servers。该 URL 不必指向真实服务器,因为策略检查会在连接任何目标之前拒绝命令。
完全禁用 MCP
部署一个服务器映射为空的 managed-mcp.json,即可阻止所有 MCP 服务器:
用户在 /mcp 中看不到任何 MCP 服务器,claude mcp add 也会因上述企业策略错误而失败。用户此前配置的服务器会在下次启动会话时停止加载,但不会出现说明原因为策略的警告。
允许 claude.ai 连接器与托管集合同时使用
默认情况下,部署 managed-mcp.json 会禁止 claude.ai 连接器,包括管理员在 claude.ai 管理控制台中为组织配置的连接器。要在加载 managed-mcp.json 中服务器的同时加载这些连接器,请在托管设置来源中设置 "allowAllClaudeAiMcps": true。需要 Claude Code v2.1.149 或更高版本。
启用该设置后,Claude Code 会加载未部署 managed-mcp.json 时本应加载的同一组 claude.ai 连接器。允许列表和拒绝列表仍会应用于这些连接器,因此可以使用 deniedMcpServers 阻止特定连接器。此设置只影响 claude.ai 连接器;插件提供的服务器仍会被禁止。
Claude Code 只会从管理员控制的策略层级读取此设置:服务器托管设置、MDM 下发的 plist 或 HKLM registry key,或者系统 managed-settings.json 文件。将其放入用户或项目设置不会生效,因此用户无法重新启用被独占控制禁止的连接器。
使用允许列表和拒绝列表进行策略控制
允许列表和拒绝列表用于筛选已配置服务器中哪些可以加载。它们不是 registry:服务器仍需先由用户、插件或 managed-mcp.json 添加,之后允许列表或拒绝列表才会对其生效。如需向用户部署服务器,请使用 managed-mcp.json。
要让允许列表成为权威来源,请在托管设置来源中同时设置 allowedMcpServers 和 allowManagedMcpServersOnly: true,例如使用服务器托管设置或已部署的 managed-settings.json 文件。将允许列表限定为仅使用托管设置给出了具体配置。如果不设置 allowManagedMcpServersOnly,来自每个设置来源的允许列表都会合并,包括用户自己的 ~/.claude/settings.json,因此用户可以扩展你的允许列表所允许的范围。无论如何,所有来源的拒绝列表都会合并。
allowManagedMcpServersOnly 与 allowManagedPermissionRulesOnly 是不同的设置;后者只锁定权限规则。设置该标志不会强制执行 MCP 允许列表。
按 URL、命令或名称匹配服务器
allowedMcpServers 和 deniedMcpServers 都是由条目组成的列表。每个条目都是只含一个 key 的对象,按服务器 URL、命令或名称识别服务器:
| Key | 匹配内容 | 适用对象 |
|---|---|---|
serverUrl | 远程服务器 URL;精确匹配或使用 * 通配符 | HTTP 和 SSE 服务器 |
serverCommand | 启动 stdio 服务器的确切命令和参数 | Stdio 服务器 |
serverName | 用户指定的标签。仅精确匹配;不会展开通配符 | 两种类型均可,但请阅读下方 Warning |
未设置 allowedMcpServers 与将其设为空数组的含义不同:
| 设置 | 未设置(默认) | 空数组 [] | 已填充 |
|---|---|---|---|
allowedMcpServers | 允许所有服务器 | 不允许任何服务器 | 只允许匹配的服务器 |
deniedMcpServers | 不阻止任何服务器 | 不阻止任何服务器 | 阻止匹配的服务器 |
两个列表对 serverName 的验证方式不同:
- 在
deniedMcpServers中,serverName接受任意非空字符串,因此可以按显示名称阻止 claude.ai 连接器。例如,{ "serverName": "claude.ai Slack" }会阻止 Slack 连接器。如果需要确保重命名后仍能阻止连接器,建议改用serverUrl条目;当连接器名称发生冲突并增加(N)后缀时,也应如此。 - 在
allowedMcpServers中,serverName仅限字母、数字、连字符和下划线。如需将 claude.ai 连接器列入允许列表,请使用serverUrl。
如需关闭所有 claude.ai 连接器,请参阅 disableClaudeAiConnectors。
服务器的评估方式
加载服务器(包括来自 managed-mcp.json 的服务器)之前,Claude Code 会依次执行三项检查:
- 合并列表。 来自所有设置来源的允许列表和拒绝列表条目会分别合并为一个允许列表和一个拒绝列表。当
allowManagedMcpServersOnly为true时,只保留托管允许列表;拒绝列表始终合并所有来源。 - 检查拒绝列表。 如果服务器按 URL、命令或名称匹配任何拒绝列表条目,则会被阻止。拒绝列表匹配不能被任何其他规则覆盖。
- 检查允许列表。 如果所有位置都未设置
allowedMcpServers,则通过拒绝列表检查的所有服务器都会加载。如果已设置,服务器需要匹配的内容取决于其类型,如下表所示。
| 服务器类型 | 在以下情况下允许 |
|---|---|
| 远程(HTTP 或 SSE) | 匹配 serverUrl 条目。serverName 匹配仅在允许列表不包含任何 serverUrl 条目时才有效 |
| Stdio | 匹配 serverCommand 条目。serverName 匹配仅在允许列表不包含任何 serverCommand 条目时才有效 |
上述检查中还会应用两项匹配规则:
- 命令必须完全匹配。 包括每个参数及其顺序。
["npx", "-y", "server"]不匹配["npx", "server"],也不匹配["npx", "-y", "server", "--flag"]。 - URL 支持
*通配符,通配符可以出现在模式中的任意位置,包括 scheme。主机名匹配不区分大小写,并忽略末尾的 FQDN 点,因此https://Mcp.Example.com/*匹配https://mcp.example.com/api。路径仍区分大小写。
| 模式 | 允许的范围 |
|---|---|
https://mcp.example.com/* | 指定域名下的所有路径 |
https://mcp.example.com | 同样允许该域名下的所有路径。不含路径的模式匹配任意路径 |
https://*.example.com/* | example.com 的任意子域名 |
http://localhost:*/* | localhost 上的任意端口 |
*://mcp.example.com/* | 指定域名上的任意 scheme |
配置示例
以下配置同时设置严格允许列表和拒绝列表。高亮行会改变列表其余部分的评估方式,代码块后的标注逐一说明其作用:
- 第 3 行:第一个
serverUrl条目。一旦存在此类条目,每个远程服务器都必须匹配某个 URL 模式,因此用户不能靠指定一个获准名称来绕过列表,使用未列出的远程服务器。 - 第 5 行:第一个
serverCommand条目。它对 stdio 服务器产生同样效果,因此每个本地服务器都必须与列出的命令完全匹配。 - 第 11 行:拒绝列表中的
serverName条目。拒绝列表条目始终生效,因此无论 URL 或命令是什么,任何名为dangerous-server的服务器都会被阻止。
由于两种传输类型都已有更严格的条目,因此在此允许列表中添加 serverName 条目不会匹配任何内容。
下面的折叠面板演示服务器如何与其他允许列表和拒绝列表组合进行比较。
仅 URL 允许列表
仅 URL 允许列表
| 服务器 | 结果 |
|---|---|
位于 https://mcp.example.com/api 的 HTTP 服务器 | 允许:匹配 URL 模式 |
位于 https://api.internal.example.com/mcp 的 HTTP 服务器 | 允许:匹配通配符子域名 |
位于 https://external.example.com/mcp 的 HTTP 服务器 | 阻止:不匹配任何 URL 模式 |
| 使用任意命令的 Stdio 服务器 | 阻止:没有可匹配的名称或命令条目 |
仅命令允许列表
仅命令允许列表
| 服务器 | 结果 |
|---|---|
使用 ["npx", "-y", "approved-package"] 的 Stdio 服务器 | 允许:匹配命令 |
使用 ["node", "server.js"] 的 Stdio 服务器 | 阻止:不匹配命令 |
名为 my-api 的 HTTP 服务器 | 阻止:没有可匹配的名称条目 |
混合名称和命令的允许列表
混合名称和命令的允许列表
| 服务器 | 结果 |
|---|---|
名为 local-tool、使用 ["npx", "-y", "approved-package"] 的 Stdio 服务器 | 允许:匹配命令 |
名为 local-tool、使用 ["node", "server.js"] 的 Stdio 服务器 | 阻止:存在命令条目,但该服务器不匹配 |
名为 github、使用 ["node", "server.js"] 的 Stdio 服务器 | 阻止:存在命令条目时,stdio 服务器必须匹配命令 |
名为 github 的 HTTP 服务器 | 允许:匹配名称 |
名为 other-api 的 HTTP 服务器 | 阻止:名称不匹配 |
仅名称允许列表
仅名称允许列表
| 服务器 | 结果 |
|---|---|
名为 github、使用任意命令的 Stdio 服务器 | 允许:没有命令限制 |
名为 internal-tool、使用任意命令的 Stdio 服务器 | 允许:没有命令限制 |
名为 github 的 HTTP 服务器 | 允许:匹配名称 |
名为 other 的任意服务器 | 阻止:名称不匹配 |
允许列表与拒绝列表覆盖
允许列表与拒绝列表覆盖
| 服务器 | 结果 |
|---|---|
位于 https://mcp.example.com/api 的 HTTP 服务器 | 允许:匹配允许列表 URL 模式,且不匹配拒绝列表 |
位于 https://staging.example.com/api 的 HTTP 服务器 | 阻止:同时匹配两者,但拒绝列表优先 |
位于 https://other.com/mcp 的 HTTP 服务器 | 阻止:不匹配允许列表 |
将允许列表限定为仅使用托管设置
要让托管允许列表成为唯一生效的允许列表,请在托管设置文件中设置 allowManagedMcpServersOnly:
当 allowManagedMcpServersOnly 为 true 时,来自用户、项目和本地设置的允许列表会被忽略。拒绝列表仍会合并所有来源,因此用户始终可以为自己阻止服务器。
限制在用户端的表现
当限制阻止服务器时,用户要么会看到 claude mcp add 返回错误,要么会发现服务器悄然停止加载。可通过下表识别用户报告的情况,并在推广部署变更前告知用户将会发生什么:
| 限制 | 用户看到的内容 |
|---|---|
存在 managed-mcp.json,且用户运行 claude mcp add | Cannot add MCP server: enterprise MCP configuration is active and has exclusive control over MCP servers |
服务器在拒绝列表中,且用户运行 claude mcp add | Cannot add MCP server "<name>": server is explicitly blocked by enterprise policy |
服务器不在允许列表中,且用户运行 claude mcp add | Cannot add MCP server "<name>": not allowed by enterprise policy |
| 之前配置的服务器现在被策略阻止 | 服务器从 /mcp 和 claude mcp list 中悄然消失,不显示警告 |
在最后一种情况下,用户不会收到任何说明服务器因策略而消失的提示。因此,在推广部署新限制时,请告知受影响用户哪些服务器会被阻止。
监控 MCP 用量
配置 OpenTelemetry 导出后,Claude Code 可以记录用户调用了哪些 MCP 服务器和工具。设置 OTEL_LOG_TOOL_DETAILS=1,在工具事件中加入 MCP 服务器和工具名称,然后在收集器中聚合数据,即可查看用户实际连接了哪些服务器。有关导出器设置方法和完整事件 schema,请参阅监控。
配置摘要
本页涉及的所有文件和设置、各自控制的内容及其下发方式如下:
| 配置入口 | 控制的内容 | 所在位置 | 下发方式 |
|---|---|---|---|
managed-mcp.json | 固定服务器集合、独占控制 | 系统路径:/Library/Application Support/ClaudeCode/、/etc/claude-code/ 或 C:\Program Files\ClaudeCode\ | MDM、GPO、设备群管理系统,或任何拥有管理员权限的流程。不能通过服务器托管设置配置 |
allowedMcpServers | 允许使用的服务器列表 | 任意设置文件;除非设置 allowManagedMcpServersOnly,否则所有来源的条目都会合并 | 要强制执行,请使用托管设置来源:服务器托管设置、managed-settings.json、MDM 描述文件或 registry |
deniedMcpServers | 被阻止的服务器列表 | 任意设置文件;所有来源的条目都会合并 | 与 allowedMcpServers 相同 |
allowManagedMcpServersOnly | 将允许列表锁定为仅使用托管来源 | 仅限托管设置来源;此设置在其他位置无效 | 与 allowedMcpServers 相同 |
allowAllClaudeAiMcps | 加载 claude.ai 连接器并与 managed-mcp.json 同时使用,而不是将其禁止 | 仅限托管设置来源;此设置在其他位置无效 | 与 allowedMcpServers 相同 |
相关资源
- 确定要强制执行的内容:MCP 限制与权限规则、沙箱及其他管理控制措施
- 通过 MCP 将 Claude Code 连接到工具:完整的 MCP 参考,包括传输方式、作用域和身份验证
- 设置:设置层级,以及托管设置如何获得更高优先级
- 服务器托管设置:从 Claude.ai 管理控制台下发
allowedMcpServers和deniedMcpServers - 安全性:这些控制措施所防范的威胁模型
- Claude Enterprise 管理员指南:SSO、SCIM、席位管理和推广部署手册