MongoDB MCP Server 的 --readOnly 选项会把工具集合限制为读取、连接和元数据操作,从 MCP 层阻止 Agent 调用写入工具。它适合数据分析、报告、坚控和生产调试等只读场景。但该选项默认没有启用,而且它不是数据库权限:MongoDB 官方同时要求使用专用只读数据库用户,绝不能把写凭据交给 MCP Server。
可靠的防护需要两层同时存在。--readOnly 防止 MCP 工具表面出现修改能力,MongoDB 的 read 或自定义只读角色则在数据库执行层拒绝写入。即使配置参数被遗漏、版本行为变化或服务自身存在缺陷,数据库账号仍能提供独立边界。
只读模式限制 MongoDB MCP Server 仅运行读取、连接和元数据相关工具。创建、修改、删除数据或管理集群的工具不应出现在可调用表面。
这比只在提示中告诉模型不要写入更可靠。提示可能被用户要求、提示注入或模型错误改变,而服务端工具过滤是确定性配置。
只读模式不会判断每次读取是否符合业务需要,也不会自动隐藏个人数据。Agent 仍可能通过合法读取工具访问账号有权查看的全部集合和文档。
官方文档明确说明,默认未启用只读模式,MCP Server 可以执行集群写入操作。仅安装并启动最新版不能推断已经只读。
部署配置必须显式加入 --readOnly,或把 MDB_MCP_READ_ONLY 设置为 true。启动后还要查看工具列表并尝试受控写入,验证设置真实生效。
不能只看配置文件文本。客户端可能启动另一份配置、环境变量可能被覆盖,或旧进程仍在运行。有效运行状态才是证据。
本地客户端可在 npx 启动参数中加入 --readOnly,同时通过环境变量提供连接串。
MDB_MCP_CONNECTION_STRING='mongodb://localhost:27017/myDatabase'
npx -y mongodb-mcp-server@latest --readOnly
生产环境不要长期使用浮动 latest。固定经过验证的版本,记录包完整性,并在升级后比较工具表面和只读行为。
连接串不应作为命令行参数,因为命令历史、进程列表和诊断系统可能记录它。
也可以把 MDB_MCP_READ_ONLY 设置为字符串 true,让客户端 args 中不再出现选项。连接串使用 MDB_MCP_CONNECTION_STRING。
{
"env": {
"MDB_MCP_READ_ONLY": "true",
"MDB_MCP_CONNECTION_STRING": "mongodb://127.0.0.1:27019/app"
}
}
环境变量比命令参数更不容易出现在进程列表,但仍可能被子进程、崩溃报告和调试工具读取。运行用户和日志系统要受控。
变量缺失或值拼写错误时,部署应失败关闭,而不是继续以默认可写模式运行。可在包装脚本中启动前断言值等于 true。
Claude Desktop 等 stdio 客户端可以在 args 中固定 --readOnly。配置应由团队审查,禁止工作区覆盖为可写启动。
启动后请求 tools/list,保存工具目录。写入、删除、索引管理和项目管理类工具不应出现。
配置文件可能包含连接串,应限制为当前用户读取,不进入 Git、聊天或工单附件。
--readOnly 是 MCP Server 自身的行为开关。数据库用户权限由 MongoDB Server 或 Atlas 在每次操作时强制执行,处于更深一层。
若 MCP 配置不慎移除参数,写权限账号会立即让 Agent 获得修改能力;若账号只有 read,数据库仍会拒绝写命令。
MongoDB 官方建议为 MCP 创建专用用户,使用内置 read 角色或更窄的自定义角色,并明确禁止使用 write 凭据。
read 角色针对指定数据库提供读取数据和部分元数据所需权限。授权时必须指定具体数据库,不要为了方便授予跨库广泛角色。
如果 Agent 只需要少数集合,建立自定义角色,限定 find、listCollections 等所需动作与资源范围。
系统集合、诊断信息和索引元数据也可能敏感。根据工具实际调用补权限,不一次授予所有坚控与管理角色。
MongoDB MCP Server 可能同时使用 Atlas API 客户端访问项目或集群管理信息。API 角色与数据库用户角色彼此独立。
只查询项目与集群时使用 Organization Member、Organization Read Only 或 Project Read Only 等最低角色,不授予 Organization Owner。
--readOnly 对 MCP 工具的限制不能替代 Atlas 控制面权限。API client id 与 secret 也通过环境变量或秘密管理注入。
读取客户集合、身份数据或密钥文档不会修改数据库,却可能把敏感内容发送到模型上下文、客户端缓存和日志。
使用 collection 级自定义角色、只读视图、字段脱敏和专门分析副本,只暴露任务必需数据。
查询结果被视为不可信数据,不能让文档中的文字改变系统提示、工具权限或审批状态。
本地 MCP Server 与客户端在同一计算机运行。MongoDB 推荐单客户端场景使用 stdio,客户端把服务作为子进程启动并通过标准管道通信。
stdio 不开放端口,网络攻击面较小,但仍继承本机用户权限。恶意工作区可能读取配置、替换启动命令或访问环境变量。
锁定配置与包版本,限制运行用户权限,stdout 只用于协议,敏感诊断不要写入可被项目读取的位置。
Streamable HTTP 可在 localhost 上提供持久会话,方便多个本地客户端和测试。默认绑定 127.0.0.1,只接受本机连接。
不要把绑定地址改成 0.0.0.0 后仍认为它是本地服务。这样会向整个局域网暴露 MCP 入口,同网设备可能访问数据库上下文。
确需远程访问时,在前方增加经过认证的反向代理、TLS 和访问控制,不直接公开原始 MCP 端口。
远程 MCP Server 可集中管理配置、日志、版本和策略,也便于 CI 与多个 Agent 共用。但它成为网络服务和共享故障点。
至少需要网络隔离、入站身份验证、用户授权、TLS、秘密管理、速率限制与高可用设计。
MCP Server 对 MongoDB 的静态连接安全,并不自动保护客户端到 MCP 的连接。两段身份验证必须分别设计。
官方文档说明 MCP Server 本身不提供入站认证或授权,远程部署必须由外部服务实现。
把服务放到反向代理后,由代理验证令牌,并将允许的用户映射到特定 MCP Server 实例。绕过代理的网络路径必须被防火墙阻断。
如果原始端口仍能从其他网段访问,攻击者可以跳过所有 OAuth 与代理规则,直接使用服务器静态配置的数据库连接。
委派授权让用户把权限子集授予 Agent。授权服务器认证用户,资源服务器代理验证访问令牌,再允许调用 MCP。
MCP Server 与 MongoDB 不需要读取用户令牌,代理负责身份边界。审计可以区分真实用户、代理与后端数据库账号。
令牌权限应映射到独立实例或数据范围,不能让所有已登录用户共享同一套全局只读数据。
直接身份验证通常只识别 Agent 或客户端,不能准确说明它代表哪个用户。多人共用密钥时审计粒度不足。
撤销一个用户往往需要轮换所有客户端密钥,影响范围大。静态密钥也容易被复制和重放。
小型封闭环境可临时使用,但生产共享服务优先选择用户级委派与短期令牌。
用户模拟把用户自己的凭据交给 Agent。这样会泄露用户秘密,并让 Agent 获得该用户的全部能力,无法只授予有限功能。
当用户离开时,撤销 Agent 往往意味着轮换用户凭据,破坏正常工作。数据库审计也难以分辨用户本人和代理行为。
专用服务身份加委派授权能保持身份链清晰,不需要复制用户密码。
直通模式让代理接收数据库凭据再传给 MCP Server,要求秘密在多个组件之间流动。
链路对数据库不透明,任何中间组件都可能省略下一跳或记录凭据,只能使用可复制和可重放的低安全秘密。
应让 MCP Server 使用静态受限后端身份,由前置代理处理用户授权并把请求映射到受控实例。
数据库连接可使用 SCRAM-SHA-256,也可采用 LDAP、X.509、OIDC、Kerberos 或 mTLS 等企业方式。
无论采用哪种认证,授权角色都保持最小。强认证不能弥补账号拥有过大数据库权限。
证书和密码定期轮换,服务启动和日志不得回显。Atlas 网络允许列表只包含 MCP Server 的固定出口。
MongoDB 集群部署在私有 VPC 或 VNet,通过对等连接或私有端点访问,避免直接暴露互联网。
防火墙只允许授权应用服务器连接 27017,安全组与 ACL 同时限制入站和出站流量。
所有数据库连接使用 TLS 1.2 或更高,并验证服务器证书。私网不是关闭加密的理由。
logPath 指定日志目录。日志可能包含连接模式、查询形态、错误细节,甚至因异常处理不当包含连接串。
目录所有者设为 MCP 运行账号,只允许该用户读写,拒绝其他本机用户与进程访问。
定期轮换并设置保留周期,将审计日志发送到受保护系统。调试级日志只在短期故障窗口开启。
exportsPath 中的数据文件可能含完整数据库记录,即使 --readOnly 开启,读取并导出仍会产生敏感副本。
导出目录与其他进程隔离,只允许服务账号访问,坚控容量并按策略删除过期文件。
不需要导出功能时从工具表面禁用,并让文件系统目录不可写,缩小数据外流路径。
启动后保存 tools/list 输出,与批准清单比较。读取、连接和元数据工具可存在,写入与管理工具必须缺失。
升级版本后重复比较,发现新增工具先审查再开放。使用 latest 可能在无部署评审时改变工具表面,因此生产应固定版本。
还要尝试直接调用一个已知写工具名称,确认服务器拒绝未知或禁用工具,而不是仅从列表隐藏。
使用同一连接账号在隔离集合尝试 insert、update、delete、drop 与索引管理,数据库应返回未授权。
测试未批准数据库与集合的读取,确认自定义角色边界。查看有效角色与继承权限,防止意外继承 readWrite。
这组测试独立于 --readOnly。即使临时在测试实例关闭该参数,数据库仍应拒绝写入。
只读查询可能包含大聚合、全表扫描、排序和图查询,占用 CPU、内存与 IO。设置 maxTimeMS、结果上限、并发和连接池限制。
优先连接只读节点或分析副本,但副本仍包含敏感数据,不能替代权限。坚控慢查询和扫描文档数。
Agent 遇到超时不应无限重试,应缩小过滤范围或请求人工判断。
官方认为开发、暂存、受授权管理任务和非关键隔离测试集群可以考虑有限写权限。
这些场景使用单独 MCP 实例、单独账号和显著环境名称,不与生产只读实例共享连接串。
写工具要求人工确认、影响预览、事务和审计。不要为临时需要直接移除生产实例的 --readOnly。
确认 --readOnly 或 MDB_MCP_READ_ONLY=true 已显式设置,运行中的工具列表只包含读取、连接和元数据能力。
确认连接使用专用 read 或更窄自定义角色,不使用任何 write 凭据,Atlas API 角色保持项目级最低权限。
确认本地优先 stdio,HTTP 默认绑定 127.0.0.1;远程入口只能经带 OAuth、TLS 和授权的反向代理访问。
确认数据库位于私网、网络允许列表收窄、连接加密,日志和导出目录仅服务账号可读写。
确认包版本固定,升级后复核工具表面、写入拒绝、数据范围、审计和资源上限。
把批准的启动命令、环境变量名称、包版本和工具清单保存为部署基线。定期从实际运行进程读取版本与 tools/list,和基线自动比较,而不是只检查源配置文件。
如果 MDB_MCP_READ_ONLY 缺失、值不为 true、args 中移除了 --readOnly,或者出现新的写入与管理工具,健康检查应失败并阻止服务接收生产请求。
远程实例还要从反向代理外部测试原始端口不可达,从授权与未授权身份分别发起调用。代理规则、网络安全组和 MCP 配置任何一处漂移,都可能改变真实边界。
数据库端持续审计专用用户的角色。发现 readWrite、dbAdmin、clusterAdmin 或继承的新角色时告警,并在自动化允许的环境立即禁用连接。
先根据业务问题列出必需数据库、集合、操作和字段,再建立自定义角色。不要先授予整个数据库 read,之后才依赖模型自觉避开敏感集合。
MongoDB 角色主要控制资源与动作,字段级需求可通过只读视图实现。视图仅投影批准字段并加入必要过滤,专用用户只获得视图查询权,不直接读取基础集合。
多租户数据应在数据模型或独立实例层建立可靠隔离。仅让模型在查询里带 tenantId 不是授权,因为提示注入可以要求删除过滤条件。
用负向测试证明边界:查询未批准集合、访问基础集合、尝试列举其他数据库、执行写入和管理命令,分别确认由 MCP 工具层或 MongoDB RBAC 拒绝。把这些测试作为每次发布的门禁。
为 MCP 专用数据库用户、Atlas API 客户端和 OAuth 客户端分别准备吊销流程。单个凭据泄露时能局部失效,不影响正常应用账号。
保留用户身份、代理请求标识、MCP 会话、数据库连接身份和查询时间之间的关联。只记录共享服务账号而无法还原发起用户,会让调查停在入口。
发现异常读取时,先阻断代理与数据库网络路径,再轮换秘密、保存日志和导出文件证据,并检查是否有数据进入模型历史或外部工具。只读事故同样可能需要数据泄露响应。
MongoDB MCP Server 的 --readOnly 能有效缩小 Agent 可调用的工具表面,但它只是一道应用层开关。把它与专用只读数据库用户、最低 Atlas API 角色、受保护的入站代理、私有网络和文件权限结合,才能真正防止数据修改并控制读取范围。最关键的验收不是配置里出现了一个参数,而是写工具不可见、写请求被数据库拒绝、敏感集合不可读,而且每条远程请求都能关联到经过认证的用户。