MCP 写入权限:让 AI 修改数据,什么才算安全

大约有一年时间,对“把 AI 助手连到我的笔记上安全吗”这个问题,诚实的回答是: 这条连接只会读。当时多数 面向会议记录的 MCP 服务器 确实如此,安全问题也因此变得简单:一个什么都改不了的工具,不可能改错东西。

有意思的问题已经不在那里了。助手现在会给录音打标签、重命名发言人、重新转写, 还会把笔记发布到共享频道——于是这个问题有了更窄、也更有用的版本:在让模型 修改您的数据之前,有哪些条件必须成立? 四条,而且没有一条是“厂商承诺会 小心”:客户端在调用前发问,改动小到一句话就能说清,不可撤销的改动被标注为 不可撤销,以及事后有一份您能读的日志。

本文讲的就是这条线画在哪里。如果您对协议本身还不熟悉,可以先看 什么是 MCP 服务器

“写入权限”实际包含什么

“写入权限”是用一个词概括了三件性质完全不同的事,而把它们混在一起,正是这个 话题显得比实际更吓人的原因。

打标注。 标签、标题、发言人姓名。这些是在录音旁边添加或替换元数据。如果 助手给错了会议打标签,您打开应用取消就是了。最坏的情况,也不过是替一个过于 积极的模型收拾一下。

替换内容。 对录音重新转写会生成新文本并丢掉旧的——包括您手动改过的地方。 数据没有离开您的机器,但属于您的东西没了。正是在这一类里,“可撤销”悄悄地 不再成立。

离开这台机器。 把录音发布到团队频道、用邮件分享转写稿、给某人授权。这里 变的主要不是您的数据,而是谁看过它。撤销是在一个社会事实上做技术操作,它不 起作用。

把这三件事当成一个开关的安全模型,会在两个方向上都出错:对第一类太吵,对第 三类太松。

调用前发问的是客户端,不是服务器

MCP 为此有一套词汇。工具定义可以带注解:readOnlyHint(只读)、 destructiveHint(可能覆盖而非追加)、idempotentHint(调用第二次不会再改变 什么)和 openWorldHint(会访问外部系统)。一台发布了分享类工具却不标 openWorldHint 的服务器,就是在错误地描述自己。

这套词汇值多少,由规范 里的两句话决定。第一句讲客户端的职责:“出于信任与安全考虑,应当始终有一个人 在环节中,并有权拒绝工具调用。”第二句讲注解本身:客户端“必须把工具注解视为 不可信的,除非它们来自可信的服务器”。

两句合起来,架构就定下来了。注解是服务器声明风险的方式,不是服务器能上的 锁。闸门在客户端一侧,您在工具运行前看到的那个确认提示,是您的客户端做出的 决定,参考了服务器的声明。例如 Claude Code 默认会对 MCP 工具发起确认,对自己 的内置工具则不会。

由此得出的现实结论并不舒服,但值得直说:您做决定的那一刻,就是您授予常驻 权限的那一刻。点过“始终允许”之后,对话框就不再是一道控制。请按工具而不是 按服务器授予:每小时搜索一次没问题,每小时分享一次就不行。

哪些改动能撤销,哪些不能

有用的坐标轴不是读与写,而是出错的代价。

操作 能否撤销 原因
添加或删除标签 能,在应用里 录音旁边的元数据
重命名录音或发言人 能,在应用里 是标注,不是内容
重新转写 不能 替换文本,包括手动修改
发布到团队频道 不能 同事可能已经读过
用邮件分享转写稿 不能 收件人手里留着已收到的内容

下面三行里的任何一项,都值得每次都单独确认;上面两行大概不必。工具列表就是 厂商说明自己提供了其中哪些的地方,接入任何东西之前都值得先读一遍。

为什么一份日志胜过再多一个对话框

确认提示会失效。一个调研任务就可能产生几十次提示,其中还包括那些根本改不了 任何东西的工具,而已有记录表明的结果是:人们会把提示整体关掉,而不是去读下 一条。一个训练您把它关掉的控制,不是控制。

日志不会失效,因为它是事后读的,而且只在您有疑问时才读。规范给客户端的建议 里就包含为审计目的记录工具使用,同样的道理也适用于服务器:如果助手能改动 什么,您就应当能事后看到它改了什么、什么时候改的、改的是哪条记录。

评估任何带写入权限的 MCP 集成,有个好用的检验:如果模型昨晚做了我没预料到 的事,我今天能在哪里读到? 如果答案是“哪儿也读不到”,那说明整套安全模型 一直由那个确认对话框独自扛着。

两个作用范围不同的关闭开关

阻止助手改动数据有两种办法,而它们不能互相替代。

按客户端,在该客户端的配置里。 以只读模式启动的服务器只发布读取类工具。 它和“拒绝调用”的区别不只是表面:模型看不见的工具就不会被它提议,所以您不会 遇到“我这就把它发布到团队频道”后面跟着一个报错。在 Speak-Y 里,这就是服务器 args 中的 --read-only 参数,加上之后仍保留六个读取类工具。

全局,在应用里。 一个开关一次覆盖所有已连接的客户端,无论请求来自哪一个。

这个区别之所以重要,是因为 Cursor 配置文件里的参数只约束 Cursor。按客户端的 参数说的是“Cursor 只能读,Claude Code 什么都能做”;只有应用内的开关才是关于 所有客户端的表态。

Speak-Y 把线画在哪里

Speak-Y 有意把两半分开,而且这种分法从外面看得见。

读取是本地的,不需要任何东西在运行。 搜索、转写稿、摘要、待办项和标签都 来自您 Mac 上的库,由一个独立进程以只读方式打开;应用不必处于运行状态。也没 有任何内容为了让助手读取而被上传——不过,和任何 MCP 服务器一样,它读到的东西 都会作为对话的一部分发送给您的模型提供方,而那是与数据存放在哪里 无关的另一个问题

改动要经过运行中的应用。 打标签、重命名、重新转写和发布到 团队频道,都由界面上按钮背后的那套代码执行,而不是另一套有自己规则 理解的实现。如果应用没在运行,这些工具会直说,而不是半途而废地工作。

每个操作都被声明并记录。 会改动数据的工具以 readOnlyHint: false 发布; 重新转写和频道发布还带 destructiveHint,发布另外带 openWorldHint,因为它 是唯一会离开这台机器的操作。最近 50 次操作列在设置 → 集成里,含时间、 操作、记录和结果——不含转写文本,否则那段文字会比它出自的录音活得更久。助手 操作的开关就在同一个界面上,而这台服务器在所有套餐里都免费。

其他会议工具怎么画这条线

于 2026 年 8 月 13 日,依据各厂商自己的文档核对:

Fireflies 这份清单最值得一看,因为“把这份转写稿分享给这几个邮箱”恰恰属于那 一类操作:客户端的确认,是被误解的指令和收件人之间唯一挡着的东西。这不是在 批评这个功能——把它写进工具列表正是诚实的做法。它是一个论据,说明在给整台 服务器授予常驻权限之前,应该先读那份列表。

打开写入权限之前

  1. 读工具列表,不是落地页。 名称和描述说明什么会被改动;营销文案说明的是 什么很方便。
  2. 找出不可撤销的那些——凡是会分享、发送、授权或替换既有内容的——把它们保持 在每次都询问。
  3. 按工具授予常驻权限,绝不按服务器。 更新会带来新工具,而服务器级别的 放行会提前把它们一并覆盖。
  4. 确认存在日志,并且知道在哪里打开。
  5. 清楚自己手里握的是哪个开关——是约束这一个客户端的,还是约束所有客户端的。

这些都不要求您信任厂商的意图,这正是关键所在。“让助手修改我的数据安全吗”没 有统一的答案,但它可以拆成有答案的问题:什么会变、谁来确认、什么能撤销,以及 它记在哪里。

如果您还没连过助手,实际的起点是 通过 MCP 连接会议记录,那里 讲了设置步骤和最初的几个提示词,在上面这些问题变得相关之前。

FAQ

只读的 MCP 服务器比能修改数据的更安全吗?

在一个很窄的意义上更安全:不能改动任何东西的工具,也就改不错东西。但只读是一把钝器,不是一套安全模型。真正保护您的,是知道哪些改动可以撤销、让客户端在不可撤销的操作前先问一句,以及事后能读到到底做了什么。只读服务器是靠放弃功能,来换取其中的第一条。

AI 助手通过 MCP 修改任何东西之前会先问我吗?

这取决于您的客户端,而不是服务器。MCP 规范要求始终有一个人在环节中,并且有权拒绝工具调用;Claude Code 这类客户端默认会对 MCP 工具发起确认。服务器可以用注解声明某个工具会修改数据或具有破坏性,但规范要求客户端把这些注解视为不可信,除非它们来自可信的服务器——所以注解只影响提示,并不构成强制。

对某个 MCP 工具点了“始终允许”会怎样?

确认对话框对这个工具就不再是一道控制,之后每次调用都不再询问。对搜索工具,这笔交换是划算的;对会把数据分享给其他人的工具,则并不划算。请按工具而不是按服务器授予常驻权限,并把操作日志当成回答“到底发生了什么”的那样东西。

能不能让一个助手可以修改,另一个保持只读?

可以,前提是服务器支持在客户端自己的配置里设置只读模式。Speak-Y 支持:在某个客户端 MCP 配置的 args 中加上 --read-only,就只向该客户端发布读取类工具,于是 Cursor 可以被限制为只读,而 Claude Code 保留完整权限。应用内的那个开关则相反,一次覆盖所有客户端。

对会议记录来说,哪些 MCP 操作无法撤销?

两类。重新转写会替换掉录音当前的文本,包括您手动做过的修改。把录音发布到团队频道会让同事看到,事后移除并不能让人没读过。标签、标题和发言人姓名属于标注,可以在应用里改回来。