主题
托管 MCP 配置
组织管理员限制用户可添加或连接哪些 MCP server。
是什么
默认情况下,运行 Claude Code 的任何人都可以连接自己选择的任意 MCP server;Anthropic 仅按上架标准审核接入 Anthropic Directory 的 connector,但不对任何 MCP server 做安全审计或托管。作为管理员,你可以限制组织内允许运行哪些 server,控制范围从下发一组固定的已批准 server,到彻底禁用 MCP。
本页围绕两套机制展开:用 managed-mcp.json 下发固定 server 集合(独占控制),以及用 allowedMcpServers/deniedMcpServers 的允许名单/拒绝名单过滤用户所配置的 server。两者可单独或组合使用。
怎么工作
- managed-mcp.json 是独立文件,必须以管理员权限写入系统路径,无法通过 server-managed settings 下发,通常借助 Jamf、Group Policy、Intune 等设备管理工具部署。
- 部署 managed-mcp.json 后 Claude Code 只加载该文件定义的 server,用户无法添加、修改或使用其他任何 MCP server(包括插件提供的 server);默认还会抑制 claude.ai connector。
- 其文件格式与项目级 .mcp.json 相同,使用 mcpServers 键,每个 server 含 type(http/sse/stdio)、url 或 command/args/env 等字段。
- allowedMcpServers 与 deniedMcpServers 是过滤器而非注册表:server 必须先由用户、插件或 managed-mcp.json 添加,名单才会对其生效。
- 加载每个 server 前按顺序执行三步检查:1) 合并所有来源的允许/拒绝名单;2) 检查拒绝名单,匹配即拦截且无法被覆盖;3) 检查允许名单,未设置则放行所有通过拒绝名单的 server。
- 名单条目用三种键之一匹配:serverUrl(远程 URL,支持 * 通配符)、serverCommand(stdio 命令及全部参数须精确按序匹配)、serverName(用户自定义标签,仅精确匹配)。
- 在 managed settings 中同时设置 allowedMcpServers 与 allowManagedMcpServersOnly: true,可让允许名单成为权威:用户/项目/本地设置中的允许名单被忽略;但拒绝名单始终从所有来源合并。
怎么配置 / 用法
managed-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" }
}
}
}彻底禁用 MCP(空 server map):
json
{ "mcpServers": {} }硬性允许名单 + 拒绝名单:
json
{
"allowedMcpServers": [
{ "serverUrl": "https://api.githubcopilot.com/*" },
{ "serverCommand": ["npx", "-y", "@modelcontextprotocol/server-filesystem", "."] }
],
"deniedMcpServers": [
{ "serverName": "dangerous-server" },
{ "serverUrl": "https://*.untrusted.example.com/*" }
]
}将允许名单限定为仅 managed 来源(managed settings 文件中):
json
{ "allowManagedMcpServersOnly": true, "allowedMcpServers": [ { "serverUrl": "https://api.githubcopilot.com/*" } ] }什么时候用
- 想给所有用户下发同一组固定 server 且不允许添加其他 server:用带目标 server 的 managed-mcp.json。
- 想发布一份已批准 server 目录、用户自行添加其中的而拦截其余:allowedMcpServers + allowManagedMcpServersOnly: true。
- 想强制一份允许名单但仍允许用户在自己的设置中放宽:只用 allowedMcpServers。
- 只想拦截已知有问题的 server、其余全部放行:用 deniedMcpServers。
- 想在组织内彻底禁用 MCP:部署含空 server map 的 managed-mcp.json。
限制 / 坑
- 任何机器用户都能读取 managed-mcp.json,因此不要在 env 中存放 API 密钥等凭据;应改用 ${VAR} 展开、OAuth/按用户 header 或 headersHelper。
- 仅含 serverName 条目的允许名单不是安全控制:名称是用户自取的标签;要真正限定须用 serverCommand 或 serverUrl 条目。
- 当某 server 被策略新拦截时,它会在 /mcp 和 claude mcp list 中静默消失、无任何提示原因,需主动告知受影响用户。
- managed-mcp.json 无法通过 server-managed settings 下发,只能写入系统路径。
- allowAllClaudeAiMcps 需要 Claude Code v2.1.149 或更高版本,且仅从管理员控制的策略层读取。
硬事实速查(12 条)
- 三个系统路径:macOS /Library/Application Support/ClaudeCode/managed-mcp.json;Linux/WSL /etc/claude-code/managed-mcp.json;Windows C:\Program Files\ClaudeCode\managed-mcp.json。
- 部署 managed-mcp.json 后 Claude Code 只加载其定义的 server,且默认抑制 claude.ai connector 与插件提供的 server。
- allowedMcpServers 未设置=允许所有 server;设为空数组 []=不允许任何 server;已填充=仅允许匹配项。deniedMcpServers 未设置或为空都=不拦截。
- 拒绝名单优先级最高:匹配任一拒绝条目即被拦截,无法被允许名单覆盖。
- serverCommand 须精确匹配全部参数且按序。
- serverUrl 支持任意位置的 * 通配符;主机名匹配不区分大小写并忽略末尾 FQDN 点,路径区分大小写。
- allowManagedMcpServersOnly 为 true 时仅保留 managed 允许名单、忽略用户/项目/本地的允许名单,但拒绝名单始终从所有来源合并。
- allowManagedMcpServersOnly 与 allowManagedPermissionRulesOnly 是两个独立设置。
- 可用 strictPluginOnlyCustomization(list 中含 mcp)实现 server 只能来自插件。
- 验证:claude mcp list 应只显示 managed-mcp.json 中的 server;尝试 add 会报 enterprise MCP configuration is active 错误。
- 用户侧报错:被拒绝名单拦截显示 server is explicitly blocked by enterprise policy;不在允许名单显示 not allowed by enterprise policy。
- 配置 OpenTelemetry 并设 OTEL_LOG_TOOL_DETAILS=1 后,可在工具事件中记录 MCP server 与工具名称用于监控。