Appearance
Claude Code默认允许用户连接任意MCP服务器。管理员可以通过部署managed-mcp.json(系统级路径:macOS /Library/Application Support/ClaudeCode/、Linux /etc/claude-code/、Windows C:\Program Files\ClaudeCode\)来固定服务器集并禁止用户添加其他服务器,或通过允许列表(allowedMcpServers)和拒绝列表(deniedMcpServers)过滤服务器加载。验证命令:claude mcp list 查看生效服务器,claude mcp add --transport http test https://example.com/mcp 应返回企业策略错误。可选禁用MCP:在managed-mcp.json中写入空服务器映射{}。
Claude Code MCP访问控制:managed-mcp.json与允许列表配置
默认情况下,任何运行Claude Code的用户都可以连接他们选择的任意MCP服务器。Anthropic在将连接器添加到Anthropic Directory之前会根据审核标准进行审查,但不对任何MCP服务器进行安全审计或管理。作为管理员,您可以限制组织内运行的服务器,从部署固定的已批准集到完全禁用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服务器注册表供用户浏览和安装。对于已批准目录模式,请在用户能找到的地方(如内部wiki)分享已批准列表及其
claude mcp add命令,或者通过托管插件市场将服务器作为插件分发,以便用户可以从/plugin浏览和安装。
使用managed-mcp.json部署固定服务器集
如果部署了managed-mcp.json文件,Claude Code只加载该文件中定义的服务器。用户无法添加、修改或使用任何其他MCP服务器,包括由插件提供的服务器和claude.ai连接器。
另外两个设置可以进一步过滤托管集:
allowedMcpServers和deniedMcpServers也适用于托管服务器,因此不符合条件的托管服务器不会加载。- 用户自己的
deniedMcpServers会与其设置合并,因此用户可以为自己阻止某个托管服务器。
完整的检查顺序请参见服务器评估规则。
managed-mcp.json是一个独立文件,因此不能通过服务器托管设置分发。任何具有管理员权限并能写入系统路径的进程都可以部署它。规模化部署通常通过设备管理工具进行,例如macOS上的Jamf或配置描述文件、Windows上的组策略或Intune,或Linux上的Fleet管理工具。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相同的格式:
json
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
},
"sentry": {
"type": "http",
"url": "https://mcp.sentry.dev/mcp"
},
"company-internal": {
"type": "stdio",
"command": "/usr/local/bin/company-mcp-server",
"args": ["--config", "/etc/company/mcp-config.json"],
"env": {
"COMPANY_API_URL": "https://internal.example.com"
}
}
}
}每次用户凭证认证
机器上的任何用户都可以读取此文件,因此不要在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服务器:
json
{
"mcpServers": {}
}用户在/mcp中看不到任何MCP服务器,claude mcp add失败并显示上述企业策略错误。用户之前配置的服务器在下一次启动会话时将停止加载,且不会提示策略原因。
使用允许列表和拒绝列表进行策略控制
允许列表和拒绝列表过滤哪些已配置的服务器可以加载。它们不是注册表:服务器仍然需要由用户、插件或managed-mcp.json添加,之后允许列表或拒绝列表才会应用。要向用户部署服务器,请使用managed-mcp.json。
要使允许列表具有权威性,请在托管设置源中同时设置allowedMcpServers和allowManagedMcpServersOnly: true,例如服务器托管设置或部署的managed-settings.json文件。将允许列表限制为仅托管设置展示了配置。如果不设置allowManagedMcpServersOnly,来自所有设置源的允许列表都会合并,包括用户自己的~/.claude/settings.json,因此用户可能会扩大允许列表允许的范围。拒绝列表始终从所有来源合并。
allowManagedMcpServersOnly与allowManagedPermissionRulesOnly不同,后者仅锁定权限规则。设置该标志并不会强制执行MCP允许列表。
按URL、命令或名称匹配服务器
allowedMcpServers和deniedMcpServers是条目的列表。每个条目是一个对象,包含一个标识服务器的键,根据URL、命令或名称:
| 键 | 匹配方式 | 用途 |
|---|---|---|
serverUrl | 远程服务器URL,精确匹配或带*通配符 | HTTP和SSE服务器 |
serverCommand | 启动stdio服务器的完整命令和参数 | Stdio服务器 |
serverName | 用户分配的标签。仅精确匹配;通配符不展开 | 两种类型均可,但请注意下面的警告 |
不设置allowedMcpServers与将其设置为空数组是不同的:
| 设置 | 未设置(默认) | 空数组[] | 已填充 |
|---|---|---|---|
allowedMcpServers | 所有服务器都允许 | 不允许任何服务器 | 仅允许匹配的服务器 |
deniedMcpServers | 不阻止任何服务器 | 不阻止任何服务器 | 阻止匹配的服务器 |
仅使用
serverName条目的允许列表不是安全控制。名称是用户运行claude mcp add或编辑配置文件时分配的标签,而不是底层服务器,因此用户可以将任何服务器命名为github。要强制执行实际运行的服务器,请添加serverCommand或serverUrl条目。
服务器评估规则
在加载服务器之前(包括来自managed-mcp.json的服务器),Claude Code按顺序执行三项检查:
- 合并列表。 来自所有设置源的允许列表和拒绝列表条目合并为一个允许列表和一个拒绝列表。当
allowManagedMcpServersOnly为true时,仅保留托管允许列表;拒绝列表始终从所有来源合并。 - 检查拒绝列表。 匹配任何拒绝列表条目(按URL、命令或名称)的服务器将被阻止。没有内容可以覆盖拒绝列表匹配。
- 检查允许列表。 如果
allowedMcpServers在任何地方都没有设置,则所有通过拒绝列表检查的服务器都加载。如果设置了,服务器必须匹配的条目取决于其类型,如下表所示。
| 服务器类型 | 允许条件 |
|---|---|
| 远程(HTTP或SSE) | 匹配serverUrl条目。当允许列表中没有任何serverUrl条目时,仅凭serverName匹配也算数 |
| Stdio | 匹配serverCommand条目。当允许列表中没有任何serverCommand条目时,仅凭serverName匹配也算数 |
在这些检查中应用两条匹配规则:
- 命令精确匹配。 所有参数按顺序匹配。
["npx", "-y", "server"]不匹配["npx", "server"]或["npx", "-y", "server", "--flag"]。 - URL支持
*通配符,可以在模式中任意位置使用,包括协议。主机名匹配不区分大小写且忽略FQDN末尾的点,因此https://Mcp.Example.com/*匹配https://mcp.example.com/api。路径区分大小写。
| 模式 | 允许的URL |
|---|---|
https://mcp.example.com/* | 特定域下的所有路径 |
https://mcp.example.com | 同样允许该域下的所有路径。不带路径的模式匹配任何路径 |
https://*.example.com/* | example.com的任何子域 |
http://localhost:*/* | localhost的任何端口 |
*://mcp.example.com/* | 特定域的任何协议 |
示例配置
下面的配置设置了一个严格的允许列表和一个拒绝列表。高亮行改变了列表其余部分的评估方式,块后的标注解释了每一行:
json
{
"allowedMcpServers": [
{ "serverUrl": "https://api.githubcopilot.com/*" },
{ "serverUrl": "https://mcp.sentry.dev/*" },
{ "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "."] },
{ "serverCommand": ["python", "/usr/local/bin/approved-server.py"] },
{ "serverUrl": "https://mcp.example.com/*" },
{ "serverUrl": "https://*.internal.example.com/*" }
],
"deniedMcpServers": [
{ "serverName": "dangerous-server" },
{ "serverCommand": ["npx", "-y", "unapproved-package"] },
{ "serverUrl": "https://*.untrusted.example.com/*" }
]
}- 第3行:第一个
serverUrl条目。一旦存在一个,每个远程服务器都必须匹配一个URL模式,因此用户无法通过给未列出的远程服务器起一个允许的名称来绕过。 - 第5行:第一个
serverCommand条目。对stdio服务器效果相同,因此每个本地服务器都必须精确匹配列出的命令。 - 第11行:拒绝列表中的
serverName条目。拒绝列表条目始终适用,因此任何命名为dangerous-server的服务器都会被阻止,无论其URL或命令如何。
此允许列表中的serverName条目永远不会匹配任何内容,因为两种传输类型都已经有了更严格的条目。
下面的小节演示了服务器如何针对其他允许列表和拒绝列表组合进行评估。
仅URL允许列表
json
{
"allowedMcpServers": [
{ "serverUrl": "https://mcp.example.com/*" },
{ "serverUrl": "https://*.internal.example.com/*" }
]
}| 服务器 | 结果 |
|---|---|
HTTP服务器 https://mcp.example.com/api | 允许:匹配URL模式 |
HTTP服务器 https://api.internal.example.com/mcp | 允许:匹配通配符子域 |
HTTP服务器 https://external.example.com/mcp | 阻止:不匹配任何URL模式 |
| 任何命令的Stdio服务器 | 阻止:没有名称或命令条目可供匹配 |
仅命令允许列表
json
{
"allowedMcpServers": [
{ "serverCommand": ["npx", "-y", "approved-package"] }
]
}| 服务器 | 结果 |
|---|---|
Stdio服务器 ["npx", "-y", "approved-package"] | 允许:匹配命令 |
Stdio服务器 ["node", "server.js"] | 阻止:不匹配命令 |
名为my-api的HTTP服务器 | 阻止:没有名称条目可供匹配 |
混合名称和命令允许列表
json
{
"allowedMcpServers": [
{ "serverName": "github" },
{ "serverCommand": ["npx", "-y", "approved-package"] }
]
}| 服务器 | 结果 |
|---|---|
Stdio服务器名为local-tool,命令["npx", "-y", "approved-package"] | 允许:匹配命令 |
Stdio服务器名为local-tool,命令["node", "server.js"] | 阻止:命令条目存在但不匹配 |
Stdio服务器名为github,命令["node", "server.js"] | 阻止:stdio服务器在存在命令条目时必须匹配命令 |
HTTP服务器名为github | 允许:匹配名称 |
HTTP服务器名为other-api | 阻止:名称不匹配 |
仅名称允许列表
json
{
"allowedMcpServers": [
{ "serverName": "github" },
{ "serverName": "internal-tool" }
]
}| 服务器 | 结果 |
|---|---|
Stdio服务器名为github,任意命令 | 允许:没有命令限制 |
Stdio服务器名为internal-tool,任意命令 | 允许:没有命令限制 |
HTTP服务器名为github | 允许:匹配名称 |
任何名为other的服务器 | 阻止:名称不匹配 |
允许列表加拒绝列表覆盖
json
{
"allowedMcpServers": [
{ "serverUrl": "https://*.example.com/*" }
],
"deniedMcpServers": [
{ "serverUrl": "https://staging.example.com/*" }
]
}| 服务器 | 结果 |
|---|---|
HTTP服务器 https://mcp.example.com/api | 允许:匹配允许列表URL模式,无拒绝列表匹配 |
HTTP服务器 https://staging.example.com/api | 阻止:同时匹配两者,但拒绝列表优先 |
HTTP服务器 https://other.com/mcp | 阻止:不匹配允许列表 |
将允许列表限制为仅托管设置
要使托管允许列表成为唯一适用的列表,请在托管设置文件中设置allowManagedMcpServersOnly:
json
{
"allowManagedMcpServersOnly": true,
"allowedMcpServers": [
{ "serverUrl": "https://api.githubcopilot.com/*" },
{ "serverUrl": "https://*.internal.example.com/*" }
]
}当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服务器和工具名称,然后在收集器中聚合,查看用户实际连接了哪些服务器。请参阅监控以设置导出器和获取完整事件模式。
配置摘要
本文涉及的每个文件和设置、其控制内容以及分发方式:
| 表面 | 控制内容 | 所在位置 | 分发方式 |
|---|---|---|---|
managed-mcp.json | 固定服务器集,独占控制 | 系统路径:/Library/Application Support/ClaudeCode/、/etc/claude-code/或C:\Program Files\ClaudeCode\ | MDM、GPO、Fleet管理或任何具有管理员权限的进程。不能通过服务器托管设置设置 |
allowedMcpServers | 允许的服务器允许列表 | 任何设置文件;除非设置了allowManagedMcpServersOnly,否则所有来源的条目都会合并 | 强制执行需要使用托管设置源:服务器托管设置、managed-settings.json、MDM配置文件或注册表 |
deniedMcpServers | 阻止的服务器拒绝列表 | 任何设置文件;所有来源的条目都会合并 | 与allowedMcpServers相同 |
allowManagedMcpServersOnly | 将允许列表锁定到仅托管来源 | 仅限托管设置源;该设置在别处无效 | 与allowedMcpServers相同 |
相关资源
- 决定要实施的内容:MCP限制与权限规则、沙箱和其他管理员控制一起
- 通过MCP将Claude Code连接到工具:完整的MCP参考,包括传输、作用域和认证
- 设置:设置层次结构以及托管设置如何优先
- 服务器托管设置:从Claude.ai管理控制台分发
allowedMcpServers和deniedMcpServers - 安全:这些控制所防御的威胁模型
- Claude Enterprise管理员指南:SSO、SCIM、席位管理和推出手册
常见问题
如何完全禁用Claude Code的MCP?
部署managed-mcp.json文件,内容为空服务器映射:{"mcpServers": {}}。文件放置路径见本文。这样所有MCP服务器都会被阻止,用户无法通过claude mcp add添加新服务器,且之前配置的服务器会在下次会话时停止加载。
allowedMcpServers和deniedMcpServers有什么区别?
allowedMcpServers是允许列表,仅允许匹配的服务器加载;deniedMcpServers是拒绝列表,阻止匹配的服务器加载。拒绝列表优先于允许列表——如果服务器同时匹配两者,则被阻止。允许列表可以配合allowManagedMcpServersOnly锁定为仅来自托管设置源;拒绝列表始终从所有来源合并。
managed-mcp.json文件应该放到哪里?
根据操作系统:macOS放到/Library/Application Support/ClaudeCode/managed-mcp.json,Linux/WSL放到/etc/claude-code/managed-mcp.json,Windows放到C:\Program Files\ClaudeCode\managed-mcp.json。需要管理员权限才能写入这些路径。文件不能通过服务器托管设置(server-managed settings)分发,需要使用MDM、组策略或Fleet管理工具。