通用 CRUD MCP 会退出高风险生产写入吗?
不会彻底退出。它会被限制在合适的环境、身份和风险等级中;真正退出的,是“高权限账号 + 任意 CRUD + Agent 自主循环”这种默认生产模式。
谈到企业 Agent 的 Tool 设计,常见的争论有两个极端。
一种观点认为:
业务系统已经有 CRUD 和 RBAC
→ 直接包装成 MCP 就够了
另一种观点认为:
通用 CRUD 太危险
→ Agent 永远不应该接触 CRUD
→ 所有能力都必须重写成业务 Action
两边都抓住了一部分事实,也都容易走得太远。
CRUD 是大量企业系统最稳定、最普遍的基础接口。Agent 不可能绕开查询、创建、更新和删除这些基本操作。开发、运维、数据治理和低风险内部工具,也确实需要灵活的通用能力。
但“底层继续使用 CRUD”与“把任意 CRUD 直接暴露给生产 Agent”不是一回事。
更可能出现的长期格局是:
底层执行:继续大量复用原生 CRUD/API
Agent 暴露面:按环境、身份、资源范围和业务风险逐级收窄
高风险生产写入:从通用 CRUD 迁移到具名 Action Contract
所以,问题不是 CRUD 会不会消失,而是它还能以什么身份、在什么环境、对什么数据、以多大自动化程度存在。
先定义什么叫“通用 CRUD MCP”
并不是所有包含 create、update、delete 的 Tool 都属于危险的通用 CRUD。
本文所说的“通用 CRUD MCP”,主要指这类开放能力:
create_record(table, payload)
search_records(table, filter, fields, page)
update_record(table, id, arbitrary_patch)
delete_record(table, id)
call_api(method, url, headers, body)
execute_sql(query)
它们的共同特点是:
- 资源类型由调用者动态指定;
- 字段集合可以任意选择;
- 查询表达式足够开放;
- 状态迁移没有稳定业务名称;
- 调用者可以组合出设计者未明确审阅的行为;
- 单次 API 合法不代表整个 Agent 任务合理。
相反,下面这些即使底层仍使用 CRUD,也已经不是“任意 CRUD 暴露面”:
assign_case_to_self(case_id, expected_version)
submit_expense_claim(lines, evidence, idempotency_key)
cancel_unshipped_order(order_id, reason, expected_version)
update_my_contact_phone(new_phone, verification_proof)
它们仍可能执行 SELECT、INSERT 和 UPDATE,但对 Agent 暴露的是具名业务动作。
区分点不在数据库动词,而在能力边界。
为什么通用 CRUD 不会完全消失
1. 业务系统本来就以数据对象和 API 运转
CRM、ERP、HR、工单、内容管理和开发平台,都有成熟的对象模型与 API。
企业没有必要为了接入 Agent,把所有底层执行逻辑重新实现一遍。
如果源系统已经拥有:
- 记录级和字段级权限;
- 业务校验;
- 审计日志;
- 乐观锁;
- 事务;
- 回收站或版本历史;
Agent 层应该复用它们,而不是复制第二套数据库和 ACL。
2. 只读和探索场景需要一定灵活性
分析 Agent 可能需要组合查询:
查找过去 30 天的华东区商机
→ 按产品线汇总
→ 识别异常下降
如果每种查询都必须先创建一个新的业务 Action,迭代成本会很高。
在最终用户身份、源系统权限、字段限制、结果数量和数据外传控制都成立时,受约束的通用查询可以是合理选择。
3. 开发和沙箱环境需要通用工具
开发者调试数据模型、构建 Agent、验证 schema 时,往往需要:
list_tables
get_schema
create_test_record
update_test_record
delete_test_record
在隔离沙箱、合成数据和可重置环境中,通用 CRUD 的效率价值很高。
问题出在把开发工具原样带进生产,而不是开发工具本身存在。
4. 管理员本来就需要通用管理能力
数据库管理员、平台工程师和数据治理人员可能确实需要跨对象操作。
但这类能力应绑定管理员身份、受控终端、变更流程和审计,不应因为管理员拥有它,就自动开放给代表普通员工的 Agent。
5. 企业产品已经在复用连接器和原生操作
Microsoft Copilot Studio 官方文档将 Power Platform Connector 描述为 API 的 proxy 或 wrapper。Connector Tool 代表特定 action 或 operation,可连接 Microsoft 和非 Microsoft 服务。默认使用用户凭证,也可以配置为 Maker-provided credentials。
这证明“复用现成业务 API”不是反模式。
真正需要评估的是凭证模式和暴露的 operation:
最终用户凭证
→ 权限通常受用户原有范围限制
Maker-provided credentials
→ Agent 可能使用作者或服务账号能力
→ 必须重新建立用户级和任务级边界
连接器是否成熟,不能替代对身份和操作范围的审查。
为什么高风险生产写入会离开“任意 CRUD”
1. CRUD 描述数据变化,不描述业务决定
update payment set status = APPROVED
只描述字段变化。
它没有说明:
- 谁提交了付款;
- 谁有审批职责;
- 金额是否在限额内;
- 提交人与审批人是否分离;
- 当前付款是否处于可审批状态;
- 是否已经审批过;
- 后续是否会真正放款;
- 失败后如何对账。
高风险系统治理的是业务决定,不只是字段值。
2. 任意 patch 扩大了模型的参数空间
一个业务动作可能只允许修改三个字段。
通用 arbitrary_patch 却让模型决定:
- 改哪些字段;
- 字段之间如何组合;
- 是否清空未提及字段;
- 是否写入系统字段;
- 是否绕过正常状态迁移。
参数空间越大,越难审阅、授权和测试。
3. 单条 ACL 无法约束任务累计影响
源系统可以逐条判断用户是否有权修改记录。
但 Agent 任务还需要限制:
最多修改 20 条
累计金额不超过 10000 元
只能影响项目 A
只能执行 15 分钟
最多调用一次删除
通用 CRUD 接口通常不知道完整任务预算。
4. UI 中的安全摩擦不会自动迁移到 API
人工用户在页面中操作时,可能受到:
- 页面只展示可用动作;
- 字段按状态动态禁用;
- 高风险按钮二次确认;
- 批量操作数量限制;
- 审批页面展示完整上下文;
- 人工操作速度限制。
Agent 直接调用 API 后,这些 UI 摩擦可能消失。
如果后端没有实现对应控制,原本依赖页面约束的宽 API 会暴露出来。
5. Agent 会组合 CRUD
单独看:
search_records
update_record
send_email
都可能合理。
Agent 却能组合成:
查询全部投诉客户
→ 批量修改补偿状态
→ 向外部联系人发送邮件
Tool 级权限不能自动判断这条组合链是否符合当前任务。
6. 结果不确定时,通用重试容易重复副作用
对非幂等写操作:
请求超时
不等于:
操作没有执行
通用 CRUD Tool 如果缺少 idempotency key、Expected Version 和业务读回,Agent 的自动重试会放大重复建单、重复退款和覆盖写风险。
CRUD 的风险不是由方法名决定
不能简单制定规则:
GET 安全
POST 危险
DELETE 禁止
真实风险取决于更多维度。
数据敏感度
读取公开知识库与读取员工薪资,都是 read,风险不同。
资源范围
修改一条属于当前用户的草稿,与批量修改整个法人实体的数据,都是 update,风险不同。
身份模式
最终用户 OBO 与共享管理员账号,调用同一个 API,权限边界不同。
可逆性
修改标签、软删除、立即付款和触发物理设备,恢复成本不同。
自动化程度
一次人工批准调用与后台 Agent 连续运行八小时,风险不同。
源系统成熟度
一个拥有行列权限、状态机、幂等和审计的业务 API,与一个直接修改表数据的接口,风险不同。
因此,CRUD MCP 必须按上下文分级,不能按动词一刀切。
一个五级成熟度模型
L0:开放式管理接口
execute_sql
call_api(any_url)
update_any_table
特征:
- 任意资源;
- 任意字段;
- 宽服务账号;
- 无任务范围;
- 无业务动作审计;
- 可自主循环。
适用范围:
不应进入普通生产 Agent
即使管理员需要,也应放在受控运维路径中,不作为默认模型 Tool。
L1:隔离环境 CRUD
create_test_record
update_test_record
delete_test_record
约束:
- 独立沙箱;
- 合成或脱敏数据;
- 无生产凭证;
- 环境可重置;
- 调用有审计;
- 明确禁止跨环境访问。
适合开发、测试和 schema 探索。
L2:生产只读或窄 CRUD
search_my_cases
update_my_draft
add_comment_to_assigned_ticket
约束:
- 最终用户身份;
- 源系统每次校验;
- 固定对象类型;
- 字段白名单;
- 查询数量和分页上限;
- 数据外传控制;
- 短期 Task Grant;
- 写操作有版本前置条件。
低风险生产场景可以停在这一层。
L3:具名业务动作
cancel_unshipped_order
submit_purchase_request
approve_discount_within_limit
增加:
- 稳定业务意图;
- 参数间约束;
- 业务前置条件;
- 幂等;
- Expected Version;
- 影响预算;
- 执行后读回;
- Action 级审计。
高风险单系统写入通常应至少到这一层。
L4:治理型跨系统 Action
onboard_employee
settle_supplier_invoice
close_major_incident
增加:
- 跨系统状态机;
- 审批和职责分离;
- Saga 与补偿;
- UNKNOWN 与对账;
- 人工异常队列;
- 分层 Kill Switch;
- 完整 Subject、Actor、Task 和 Policy 证据。
适合高风险、长流程和多系统副作用。
这个模型不是要求所有能力都升到 L4。
它要求能力等级与业务风险匹配。
一张环境与风险矩阵
| 场景 | 通用查询 | 通用写入 | 推荐边界 |
|---|---|---|---|
| 本地开发 + 合成数据 | 可以 | 可以 | 沙箱隔离、无生产凭证 |
| 集成测试环境 | 可以 | 可以 | 测试账号、可重置、完整审计 |
| 生产公开数据只读 | 可以 | 不适用 | 限流和输出约束 |
| 生产低敏内部数据只读 | 条件允许 | 不适用 | 用户身份、源 ACL、字段和数量限制 |
| 生产个人草稿写入 | 条件允许 | 窄写入可接受 | 仅本人对象、字段白名单、版本控制 |
| 生产工单/CRM 普通写入 | 窄查询 | 谨慎 | 具名 Action 优先 |
| 生产批量修改 | 谨慎 | 不建议通用 CRUD | Task Grant、预算、审批、读回 |
| 资金、合同、HR 高敏写入 | 窄查询 | 禁止任意 CRUD | Action Contract、SoD、幂等、最终 Deny |
| 生产删除和不可逆操作 | 窄查询 | 禁止任意 CRUD | 精确 Proposal、审批、恢复窗口 |
| 跨系统副作用 | 窄查询 | 禁止直接拼 CRUD | Workflow/Action Service、Saga、对账 |
这里的“禁止”指普通 Agent 自动执行路径,不代表企业管理员永远不能通过受控工具操作。
GitHub MCP Server 给出的一个现实例子
GitHub 官方 MCP Server 没有把所有能力永远捆在一起。
它支持:
- 使用 Toolsets 启用或禁用不同能力组;
- 使用具体 Tool allowlist 做更细控制;
- 使用
--read-only只暴露只读 Tool; - 即使显式请求某个写 Tool,read-only 模式仍优先跳过写能力。
这是一种很实用的设计:同一个 Server 可以根据部署环境和用途暴露不同能力面。
它还提供 Lockdown Mode,用于减少来自不可信仓库内容的 Prompt Injection 风险。但官方 README 明确说明,Lockdown 是 best-effort 内容过滤,不是授权边界,也不会改变底层 GitHub credential 能读写什么。
这条边界很值得企业借鉴:
Tool 过滤、只读模式、内容过滤
≠
底层凭证授权
多层控制可以叠加,但不能把一种控制误当成另一种控制。
MCP annotations 能不能解决分级
MCP Tool 可以携带行为 annotations,例如只读、破坏性或幂等相关提示。
它们有助于 Client:
- 改善 Tool 展示;
- 决定是否要求确认;
- 做基础风险路由;
- 减少模型误选。
但 MCP 规范要求 Client 不要无条件信任来自非可信 Server 的 annotations。
更重要的是,annotation 是提示,不是源业务系统的授权证明。
一个 Tool 标记为 readOnly,仍可能读取高敏数据。
一个 Tool 标记为 destructive=false,也不能证明它不会触发外部邮件、审批或数据传播。
因此,企业可以使用 annotations 作为能力目录输入,但最终风险等级还要结合:
Server 信任级别
底层凭证
资源范围
Action 实现
业务状态
环境
Task Grant
最危险的组合不是 CRUD,而是四件事叠加
宽泛 CRUD
+ 高权限共享账号
+ 生产数据
+ Agent 自主循环
逐项看:
- CRUD 是常见 API 形式;
- 服务账号是常见集成方式;
- 生产数据是业务系统正常对象;
- 自动循环是 Agent 的核心价值之一。
叠加后却形成了极大的隐式能力。
服务账号让 Agent 越过用户权限上限。
通用 CRUD 让模型动态选择资源、字段和状态变化。
生产数据让错误直接影响真实业务。
自主循环让错误高速复制。
因此,高风险治理应优先拆掉这个组合,而不是争论“CRUD 三个字是否安全”。
最终用户凭证也不是万能答案
使用最终用户凭证或 OBO,可以让源系统继续执行用户原有记录权限。
这是很重要的基础。
但它仍没有自动回答:
- 用户是否委托 Agent 批量操作;
- 本次任务最多处理多少对象;
- 哪个 Agent 版本在执行;
- 是否允许循环和重试;
- 累计金额是否超限;
- 参数是否在批准后变化;
- 数据是否可以进入外部模型;
- 跨系统组合是否仍然合理。
所以:
最终用户凭证
= 资源权限上限的重要组成
≠ 完整的 Agent 任务授权
对低风险只读场景,这个基础可能已经足够。
对高风险生产写入,还需要 Task Grant 和 Action Contract。
共享服务账号什么时候仍可能存在
有些下游系统不支持 OBO,也没有细粒度用户授权接口,只能使用集成账号。
此时不能假装用户权限已经自然传递。
MCP Server 或 Action Service 必须显式承担策略执行点职责:
识别最终用户
→ 校验用户是否允许使用该 Action
→ 校验 Agent 与任务
→ 收窄资源和参数
→ 使用服务账号调用下游
→ 将 Subject、Actor 与服务账号关联记录
同时应做到:
- 服务账号按 Action 和环境拆分;
- 不使用全局管理员作为默认凭证;
- 凭证短期化和可撤销;
- 下游结果绑定最终用户和任务;
- 服务账号拥有的剩余宽权限不直接暴露给模型。
共享账号不是理想状态,但比“所有用户都通过同一个管理员账号调用任意 CRUD”更可治理。
查询能力也需要分级
很多团队把只读等同于低风险。
只读不会修改业务状态,却可能造成:
- 大规模数据导出;
- 多系统数据拼接;
- 敏感字段进入模型上下文;
- 跨租户或跨法人泄露;
- 查询表达式导致系统负载异常;
- Prompt Injection 内容进入后续决策链。
因此,通用查询至少要约束:
固定数据域
字段白名单或敏感字段脱敏
行级权限
最大结果数
最大分页深度
查询复杂度
聚合与导出权限
模型和存储目的地
缓存与日志保留
生产只读可以比写入更灵活,但不能无限开放。
从通用 CRUD 迁移到 Action,不要重写整个系统
最容易失败的迁移方式是:
先停止所有 CRUD MCP
→ 建设统一 Action 平台
→ 重写全部业务逻辑
→ 等所有系统迁移后再上线
这个计划通常过大,也会制造新的中央瓶颈。
更务实的路线是按风险切片。
第一步:建立现状清单
记录每个 CRUD Tool:
- 环境;
- 底层凭证;
- 对象类型;
- 字段范围;
- 是否写入;
- 是否可批量;
- 是否可自动循环;
- 是否可逆;
- 当前调用量;
- 业务 Owner。
第二步:先切断最危险组合
优先处理:
生产
+ 共享高权限账号
+ 任意资源/字段
+ 自动循环
可以先做:
- 改为 read-only;
- 缩小 Toolset;
- 替换为最终用户凭证;
- 限制对象和字段;
- 增加最大调用次数;
- 停止自动重试 mutation。
不需要等新 Action 平台建完。
第三步:选择少数高价值写动作
从这些动作开始:
- 调用量高;
- 业务边界清楚;
- 当前风险明显;
- 可以由源系统验证前置条件;
- 可以设计读回和幂等。
例如:
assign_case_to_self
cancel_unshipped_order
submit_expense_claim
第四步:让源系统继续拥有业务真相
如果业务系统已有 Custom API、Command、Flow 或 Workflow,直接薄封装。
只有源系统缺少具名命令时,才在其附近建立 Action Adapter。
不要把整个状态机复制进 MCP Gateway。
第五步:为剩余 CRUD 设置到期策略
每个生产 CRUD Tool 应有明确状态:
保留
收窄
只读化
迁移中
下线
例外批准
例外必须有 Owner、适用环境、风险说明和复核日期,不能永久写成“历史原因”。
一个可执行的能力清单
name: update_record
server: crm-mcp
owner: crm-platform
environment:
dev: enabled
test: enabled
prod: restricted
identity:
mode: on_behalf_of_user
shared_admin_credential: false
scope:
object_types: [case]
fields: [priority, assignee, internal_note]
arbitrary_filter: false
max_records_per_task: 20
behavior:
write: true
batch: true
autonomous_loop: false
automatic_mutation_retry: false
risk:
tier: medium
reversible: true
sensitive_data: internal
controls:
expected_version: required
task_grant: required
post_action_readback: required
audit_subject_actor_task: required
migration:
target_action: assign_cases
status: in_progress
exception_review_at: 2026-10-01
这类清单比简单记录“有一个 update_record Tool”更有治理价值。
什么时候通用 CRUD 可以留在生产
同时满足以下条件时,可以保留受约束 CRUD:
- 使用最终用户身份或等价的细粒度授权;
- 源系统继续校验行、列、对象和状态;
- 对象类型固定,不允许任意 table;
- 字段白名单明确,不允许 arbitrary patch;
- 查询、批量、次数和并发有上限;
- 仅限低风险、可逆动作;
- 有 Expected Version 和结果读回;
- mutation 不做不安全自动重试;
- Agent 和任务身份可审计;
- 能够快速切换 read-only 或关闭写 Tool。
这里已经不是“裸 CRUD”,而是窄化后的资源操作。
什么时候必须迁移到具名 Action
出现以下任一条件时,应优先迁移:
- 涉及付款、退款、合同、HR、生产删除或安全配置;
- 一个业务动作修改多个对象;
- 需要审批或职责分离;
- 需要累计金额、数量或次数预算;
- 参数之间存在复杂业务关系;
- 必须保证幂等;
- 必须进行 Expected Version 校验;
- 失败后需要补偿或对账;
- 需要把一次业务决定与多条底层修改关联;
- 跨多个系统产生副作用;
- 结果不可逆或恢复成本高。
这些要求不是 Tool description 能稳定承担的。
常见反对意见
“只要源系统 RBAC 正确,通用 CRUD 就没有问题”
RBAC 能继续限制用户原本能否操作资源,但通常不表达 Agent 本次任务的对象、次数、累计金额、TTL 和自动化规模。
源系统权限是必要条件,不是完整条件。
“任何 CRUD 都应该禁止,才最安全”
完全禁止会损失开发、探索、低风险查询和成熟业务系统复用价值。
更好的目标是把宽能力限制在隔离环境和受控管理员路径,把生产能力按风险逐级收窄。
“把 Tool 标成 read-only 就够了”
read-only 模式能阻止写 Tool,但不能自动解决敏感数据、批量导出、跨域拼接和底层凭证过宽。
它是重要控制,不是完整授权。
“每个 CRUD 前弹窗确认即可”
如果确认界面只显示方法名和 JSON,普通用户很难理解真实业务影响。
高风险操作应先形成具名、结构化的 Action Proposal,再让用户批准对象、金额、范围和后果。
“我们先全部开放,出了事故再收敛”
生产中的 Agent 会快速形成依赖和调用量。宽 Tool 一旦成为默认接口,再收窄会遇到兼容性和业务阻力。
至少应从第一天记录环境、凭证、风险等级、Owner 和最大影响范围。
企业应该追踪哪些指标
不要只统计 CRUD Tool 数量。
更值得追踪:
生产 Tool 中 read-only 占比
生产写 Tool 中具名 Action 占比
使用共享服务账号的 Tool 数量
允许 arbitrary resource/field 的 Tool 数量
没有 Task Grant 的自动写入数量
没有幂等语义的 mutation 数量
没有执行后读回的写操作数量
没有 Owner 和复核日期的例外数量
可在目标时限内切换 read-only 的 Server 比例
高风险 Action 的负面测试覆盖率
这些指标可以真实反映迁移是否在降低风险。
最终判断
通用 CRUD MCP 不会从企业 Agent 架构中完全消失。
它会长期存在于:
- 本地开发;
- 隔离测试;
- 合成数据环境;
- 受控管理员工具;
- 低风险只读;
- 最终用户身份下的窄资源操作;
- 已有成熟源系统权限和状态机的场景。
它会逐步退出的是:
高风险生产写入
+ 宽泛资源和字段
+ 共享高权限账号
+ Agent 自主循环
+ 无任务预算
+ 无幂等、读回和对账
底层仍然可以是 CRUD。
MCP 仍然可以是连接协议。
源系统仍然应该保留最终权限和业务状态权威。
但 Agent 看到的生产能力,会越来越像受约束的业务 Action,而不是数据库遥控器。
真正成熟的路线不是“消灭 CRUD”,而是建立一条清晰的升级路径:
开放式管理接口
→ 隔离环境 CRUD
→ 生产只读或窄 CRUD
→ 具名业务 Action
→ 跨系统治理型 Action
让每项能力停在与风险匹配的层级。
这比一刀切更务实,也比“封成 MCP 就算完成”更接近企业生产现实。
参考资料
- Model Context Protocol:Tools
- Model Context Protocol:Security Best Practices
- Microsoft Copilot Studio:Use Power Platform connectors as tools
- Microsoft Dataverse:Create and use custom APIs
- GitHub:GitHub MCP Server
- OWASP GenAI Security Project:LLM06:2025 Excessive Agency
- Palantir Foundry:Action type permissions
- NIST SP 800-53 Rev. 5
- RFC 9110:HTTP Semantics
发布摘要
通用 CRUD MCP 会从企业生产环境消失吗?不会。它会继续存在于开发、沙箱、受控管理员工具、低风险只读和窄资源操作中;但“共享高权限账号 + 任意 CRUD + Agent 自主循环”会逐步退出高风险生产写入。本文给出五级能力成熟度、环境风险矩阵和从开放 CRUD 迁移到具名 Action Contract 的渐进路线。
标签
AI Agent MCP CRUD 企业架构 权限系统 API 设计 Agent 安全 Action Contract 零信任 数据安全