# 通过 MCP 连接 Flashcards 安全吗？2026 年权限、隐私与写入访问

*2026-07-12*

2026 年 5 月 20 日，美国国家安全局（NSA）发布了一份 17 页的 Model Context Protocol 安全指南。如果牌组里保存的不只是公开词汇，这份指南就与你有关：Flashcards MCP 连接可以向 AI 客户端返回卡片、工作区元数据和复习历史。同一份拥有完整访问权限的凭据也能调用工具，修改卡片或将其标记为已删除。要判断 **通过 MCP 连接 Flashcards 安全吗**，先确认两件事：是否允许把这些数据交给所选客户端，以及客户端能否使用写入工具。

OAuth 保护授权流程和令牌交换，Flashcards 服务器则限定工具能做什么。但它们都无法判断某项编辑是否合理，也不能阻止已读取的数据离开 Flashcards，或保证 AI 客户端会在写入前征求确认。

判断风险时，需要看清三个具体边界：每个工具能访问什么、哪些规则由 Flashcards 强制执行，以及哪些保护措施只存在于客户端。

![暖色书桌上分开的 Flashcards MCP 读取与写入权限区域](/blog/is-mcp-safe-for-flashcards.png)

## 通过 MCP 连接 Flashcards 安全吗？先看真实数据流

一次远程 MCP 会话可能涉及四个角色：

1. 你
2. 你用来发出请求的 AI 应用或 MCP 客户端
3. 模型提供商（如果模型处理在客户端之外运行）
4. Flashcards MCP 服务器和后端

有些产品把客户端和模型提供商合在一起，另一些则把工具结果转发给单独的服务。唯一确定的是：Flashcards 会把请求的数据返回给已认证的 MCP 客户端。接下来数据如何流转，取决于客户端的架构、套餐和设置。结果可能进入模型上下文，留在同一家提供商的基础设施内，也可能传给另一家处理方。

实际风险有三类。读取操作可能暴露卡片文本、牌组结构、工作区设置或复习事件。写入操作可能创建不需要的卡片、修改内容，或把卡片和牌组标记为已删除。代理也可能误解你的请求，或把导入材料中的指令当成命令执行。

[NSA 2026 年 5 月发布的 MCP 指南](https://www.nsa.gov/Press-Room/Press-Releases-Statements/Press-Release-View/Article/4496698/nsa-releases-security-design-considerations-for-ai-driven-automation-leveraging/)指出了一个关键区别：认证、授权和验证仍不可少，但动态工具调用、共享上下文和隐式信任带来的风险，不能由这些控制解决。公开的语言学习牌组和根据机密客户笔记制作的牌组，不该采用同一种判断标准。

## Flashcards OAuth 保护哪些环节

交互式 MCP 客户端通过 Flashcards 连接时，会使用支持 PKCE 与 Dynamic Client Registration 的授权码流程。你在浏览器中批准连接，PKCE 会把授权码交换绑定到发起流程的客户端。服务器还会确认访问令牌确实签发给 Flashcards MCP 资源。[Flashcards MCP 连接器指南](/zh/docs/mcp-connector/)列出了端点和发现元数据。

这套机制保护登录和令牌交换。2025 年 11 月 25 日的稳定版 [MCP 授权规范](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization)要求此流程使用 PKCE 和资源专用令牌。规范也指出，MCP 实现不一定都支持授权。因此，某个连接器使用 OAuth，不能证明另一个服务器也有同样的保护。

Flashcards 目前只声明一个 OAuth scope：`flashcards`。它不会分别签发只读和读写权限；这类凭据可以授权连接器公开的全部工具。因此，客户端所谓的“只读”设置，实际含义是禁用或阻止了 `sql_execute`。服务器会强制保证 `sql_query` 无法写入，但只要客户端调用 `sql_execute`，同一份凭据也能为其授权。

在客户端禁用工具是一项有效的操作控制，但不会缩小 OAuth 授权范围。仍持有该凭据的恶意客户端或已遭入侵的客户端，不受这项设置约束。

## Flashcards 三个 MCP 工具的实际权限

连接器开放的不是任意 PostgreSQL，而是由解析器强制限制的 SQL 方言。三个工具的访问范围各不相同：

| 工具 | 当前访问范围 | 会更改数据吗？ | 保守的客户端设置 |
| --- | --- | --- | --- |
| `list_workspaces` | 列出用户能访问的最多 100 个工作区，包括 ID、名称、活跃卡片数、最近活动时间和默认工作区标识 | 否 | 仅在你接受将这些账户级元数据返回给客户端时启用 |
| `sql_query` | 读取指定工作区中的 `workspace`、`cards`、`decks` 和 `review_events` | 否 | 只为明确的读取任务启用，并且只请求所需列 |
| `sql_execute` | 在指定工作区的 `cards` 和 `decks` 中插入、更新记录，或将记录标记为已删除 | 是 | 除非客户端能按你认可的方式限制写入，否则保持禁用 |

[MCP 指南](/zh/docs/mcp-connector/)和 [API 参考](/zh/docs/api/)介绍了公开方言。实现中另有几项安全细节，决定你能在多大程度上信任它。

### 工作区是如何选定的

每次 SQL 调用只操作一个工作区，Flashcards 会在语句运行前再次验证当前用户是否仍有访问权限。这可以防止调用方直接提供其他用户的工作区 ID。

所选工作区只是默认目标。省略 `workspaceId` 时，工具使用该默认工作区；显式提供 ID 时，同一连接可以访问用户有权访问的任意工作区。`list_workspaces` 只会返回其结果集中工作区的 ID；100 条结果的上限并不是隔离边界，因为显式指定 `workspaceId` 仍可将目标设为用户有权访问的任意工作区。

测试工作区仍适合用来了解客户端如何展示工具调用。只要调用确实停留在那里，它就能降低无心失误的代价。但它并不是严格的隔离边界，因为同一连接仍能指定其他有权访问的工作区。要严格隔离，需要使用未加入实际工作区的另一个账户，或单独部署一套系统。

### 只读权限仍会暴露哪些数据

`list_workspaces` 和 `sql_query` 无法更改卡片状态，也不能修复数据或重新计算排期。当客户端无法调用 `sql_execute` 时，这种由服务器强制执行的读写分离，可以显著降低意外修改数据库的概率。

返回的数据仍会离开 Flashcards 后端。查询薄弱知识点时，结果可能包含卡片文本和复习事件。即使卡片很短，也可能写有患者信息、内部系统名称、私人语言示例或面试笔记。

[Flashcards 隐私政策](/zh/privacy/)涵盖通过 MCP 和 Agent API 请求的数据。从协议层面看，Flashcards 会把结果发送给 MCP 客户端。之后是否交给独立的模型提供商、由任何一方保留多久、能否用于训练，都取决于客户端设置和提供商条款。请核实这些细节，不要把“只读”当成隐私标签。

### 写入权限只覆盖卡片和牌组

`sql_execute` 接受 `INSERT`、`UPDATE` 和 `DELETE`，但只能用于 `cards` 和 `decks`。`workspace` 和 `review_events` 仍为只读。卡片排期字段也为只读，包括到期日期、复习次数和已持久化的 FSRS 状态。MCP 无法提交复习结果，也不能直接改写 FSRS 排期状态。

`UPDATE` 和 `DELETE` 都必须包含 `WHERE` 子句。这可以阻止完全不带筛选条件的语句，但一个语法有效的宽泛条件仍可能匹配大量记录。语法验证无法判断该筛选条件是否表达了你的真实意图。

对卡片和牌组执行 `DELETE` 时，系统会写入供同步使用的删除时间戳（tombstone）；数据库行不会立即被物理擦除。已删除项目不再出现在活跃数据中，而 MCP 连接器没有撤销或恢复工具。对用户来说，误删后仍需通过其他途径或备份恢复。

[服务条款](/zh/terms/)要求用户在应用更改前检查 AI 生成的输出。这一点在这里尤其重要：Flashcards 可以验证语句类别、资源、列和行数上限，却无法判断你为什么要执行这项编辑。

## 审批只发生在客户端

Flashcards 为 `sql_query` 添加 `readOnlyHint`，为 `sql_execute` 添加 `destructiveHint`。2025 年 11 月 25 日的稳定版 [MCP schema](https://modelcontextprotocol.io/specification/2025-11-25/schema) 明确将工具注解定义为提示。兼容客户端可以据此选择审批策略，但这些注解不能强制客户端审批。

Flashcards 一旦收到有效且通过认证的 `sql_execute` 调用，就会立即执行，不会再显示第二个确认页面。任何人工审批都发生在 AI 客户端中，也就是请求到达服务器之前。

不同客户端的审批行为并不相同。例如，OpenAI 的[开发者模式文档](https://developers.openai.com/api/docs/guides/developer-mode)说明，写入操作默认需要确认，并允许用户在当前对话中记住某项决定。其 [MCP apps 帮助页面](https://help.openai.com/en/articles/12584461-developer-mode-and-mcp-apps-in-chatgpt-beta)解释，是否弹出确认取决于应用权限、上下文和工作区控制。其他客户端可能提供不同的控制，也可能完全不提供。

请使用客户端实际提供的最严格选项：

- 如果可以逐个禁用工具，在任务确实需要之前，始终关闭 `sql_execute`。
- 如果可以要求每次更改都审批，请启用该设置，不要让客户端记住写入审批。
- 客户端显示准备发出的调用时，检查 `workspaceId`、每条语句、`WHERE` 条件和预计匹配的记录数。
- 如果客户端无法禁用写入工具，也不能可靠地在调用前暂停，从连接开始就应将其视为具备写入权限。

这些设置只能减少出错机会，模型输出仍需人工判断。

## 每条语句限制 100 行究竟意味着什么

每条语句最多可以返回或影响 100 条记录，一个批次最多包含 50 条语句。因此，如果每条语句都达到上限，一次通过认证的工具调用理论上最多可以影响 5,000 条记录。这远远超出一次只确认一张卡片的范围。

写入批次具有原子性：批次中的语句要么全部成功，要么整个事务失败。原子性可以避免某条语句报错后，批次只执行一部分，但它不会检查意图，也不会在有效批次提交后提供撤销功能。

序列化结果还设有 48,000 个字符的上限。该上限在写入执行后才应用，而且只限制 MCP 响应大小。写入可能已经提交，响应随后才因结果过大而被拒绝。评估最大影响范围时，应以每条语句 100 行的上限为准，并在写入前用 `sql_query` 预览范围较大的目标。

## 提示词注入可能来自学习材料

闪卡是自然语言文本，而 AI 客户端会解读自然语言。导入的笔记可能含有隐藏指令、引用的提示词，或来自不可信作者的文本。如果代理读取这些材料时可以使用写入工具，就可能把数据误当成新命令。

要造成这种问题，OAuth 无需失效。获得授权的客户端本来就可以尝试写入。

NSA 的[完整 MCP 安全报告](https://www.nsa.gov/Portals/75/documents/Cybersecurity/CSI_MCP_SECURITY.pdf)把工具输出和模型输出都视为处理管线下一步的不可信输入。报告建议设置严格的资源边界、验证参数、审查输出并坚持最小权限。这些措施可以降低风险，但无法彻底消除提示词注入。

Flashcards 提供了一些服务器端限制。解析器会拒绝不支持的语句类别和资源，MCP 工具也无法变成 shell 或不受限制的数据库连接。但注入内容仍可能诱导代理对有权访问的卡片发出语法有效的修改请求。服务器只能看到权限范围内的请求，看不到促使模型发起请求的完整对话。

处理敏感工作时，应缩小会话范围：只使用一个可信来源、一个指定工作区，以及任务所需的工具。不要在同一次代理运行中同时使用不可信的导入内容、无关连接器和无人值守的 Flashcards 写入。较小的会话范围更容易发现可疑调用，但不能形成隔离边界。

## 客户端和模型设置决定下游隐私边界

Flashcards 仍是权威数据源，请求的内容则会传到 MCP 客户端。之后如何处理因产品而异。客户端可能自行运行模型、调用独立的提供商、把工具结果保留在对话历史中、让工作区管理员看到这些结果，或将其用于记忆功能。不同架构对应不同的隐私边界。

OpenAI 提供了一个具体例子。其当前的 [Apps in ChatGPT 文档](https://help.openai.com/en/articles/11487775-connector)说明，应用取回的数据可以用作回答上下文，并可能与记忆或网页搜索交互。文档还说明，Business、Enterprise 和 Edu 账户与启用“Improve the model for everyone”的个人套餐采用不同的默认训练规则。这些是 OpenAI 自身的规则，并不代表一般的 MCP 行为。

请核实你将使用的具体客户端、账户类型、工作区政策、地区和设置，重点查看保留期限、训练、记忆、管理员访问、子处理商和删除规则。如果文档没有说清机密源材料是否可能离开客户端，就不要用真实牌组来测试。

删除 Flashcards 托管账户、断开连接器和删除下游副本是三件不同的事。[Flashcards 隐私政策](/zh/privacy/)介绍了托管数据的删除方式。Flashcards 无法删除客户端或模型提供商已经保留的数据；你还需要使用该提供商的控制功能。

## 断开连接与撤销凭据是两个不同步骤

Flashcards 当前的 OAuth 实现会签发有效期为一小时的访问令牌，以及没有固定过期时间的轮换刷新令牌。Flashcards 目前没有面向用户的 OAuth 连接撤销界面，也没有公开的撤销端点。移除连接器可能会让客户端丢弃凭据，但这项客户端操作不能保证服务器端令牌失效。

供无界面代理使用的 `fca_` Agent API 密钥是另一种凭据。你可以在 Flashcards 的 **Agent Connections** 中撤销这些密钥。记录认证方式或停用访问权限时，务必区分这两条认证路径。

如果你的威胁模型要求立即在服务器端撤销 OAuth，当前 OAuth 连接器无法提供这种用户控制。与一次性使用的公开牌组相比，这项限制对敏感的长期连接影响更大。

## 连接前的实用检查清单

1. 先给源材料分类。公开学习笔记、个人信息、雇主机密内容和受监管数据不应共用一套访问策略。如果你无权把材料发送给客户端及其处理方，就不要通过 MCP 暴露它。
2. 核对服务器 URL。文档中的端点是 `https://mcp.flashcards-open-source-app.com/mcp`。避开仿冒域名和从未知来源复制的连接器定义。
3. 阅读双方政策。先看 [Flashcards 隐私政策](/zh/privacy/)，再核实具体 AI 客户端关于数据保留、训练、记忆、日志和删除的规则。
4. 判断备用工作区是否足够。它适合演练，但同一账户上的连接仍可以指定其他有权访问的工作区。需要严格隔离时，请使用不同账户或单独部署。
5. 一开始就在客户端禁用 `sql_execute`。如果客户端无法禁用它，请在连接前明确：OAuth 凭据仍具备写入能力。
6. 只请求最少的数据。仅选择回答问题所需的列和行，不要把无关机密放进对话。
7. 批量更改前先制作备份，并确认能够恢复。[闪卡备份指南](/zh/blog/how-to-back-up-flashcards/)介绍了更完整的流程。
8. 范围较大的更新或删除，都先用 `sql_query` 预览。优先使用准确的卡片或牌组 ID，对照预期检查匹配数量，并把更改拆成小语句。
9. 如果客户端支持审批，就启用它。每次都确认工作区和完整请求内容；不要指望破坏性提示一定触发确认。
10. 主动关闭访问。断开 OAuth 连接器，并从客户端移除其存储的凭据，同时注意当前服务器端撤销功能的限制。在 Agent Connections 中撤销 `fca_` 密钥，并单独处理下游数据删除。

作出这些选择后，如需继续完成设置，请阅读[如何通过 MCP 将 Flashcards 接入 Claude](/zh/blog/how-to-connect-flashcards-to-claude-with-mcp/)。连接指南负责说明具体点击步骤；这份检查清单则帮助你判断某个连接是否应该接触特定牌组。

## 开源和自托管能解决什么

Flashcards 连接器有几项实用特性：读写工具分离、固定的语句白名单、每次调用都检查工作区成员权限、排期字段只读，以及源代码公开。这些控制让接口更容易审查和限制。它们可以降低风险，但无法保证客户端安全，也无法保证模型判断正确。

[自托管部署](/zh/docs/self-hosting/)可以把 Flashcards 的存储和操作迁到你控制的基础设施上。发送给外部 AI 服务的查询仍会把卡片数据带出该部署。模型和客户端路径也必须符合与数据库同等的隐私标准。

## 一条简单的决策规则

只有当你能接受请求的数据沿所选客户端路径离开 Flashcards、也能接受提供商条款，而且任务值得披露这些数据时，才使用 MCP 读取工具。除非客户端确实禁用了 `sql_execute`，否则应把连接视为拥有完整访问权限。

只有在任务范围明确、客户端能在每次重要调用前暂停并征求批准、你已预览目标行，而且有可用备份时，才启用写入工具。一个批次可以影响远超 100 条记录，而且删除后无法通过 MCP 撤销。

如果牌组不能与客户端或其处理方共享、下游政策不明确、同一账户需要严格的工作区隔离、必须立即撤销 OAuth，或工作流需要无人值守的破坏性写入，就不要连接。在这些情况下，请继续使用 Flashcards，但不要接入 MCP；或者选择一套完整数据流符合你要求的部署方式和模型路径。

---
*[查看此页面的带样式 HTML 版本](https://flashcards-open-source-app.com/zh/blog/is-mcp-safe-for-flashcards/)*

*AI agent 可以从 `GET https://api.flashcards-open-source-app.com/v1/` 开始，为用户在该服务中创建账号。完成设置后，也可以通过 MCP 连接 `https://mcp.flashcards-open-source-app.com/mcp`。*

*提示：在 https://flashcards-open-source-app.com 上任意 URL 后追加 `.md`，即可获得该页面的纯 Markdown 版本。*