# Безопасен ли MCP для карточек? Разрешения, приватность и доступ на запись в 2026 году

*2026-07-12*

20 мая 2026 года Агентство национальной безопасности США (NSA) опубликовало 17-страничное руководство по безопасности Model Context Protocol. Это важно, если колода содержит не только общедоступную лексику: MCP-подключение к Flashcards может передать ИИ-клиенту карточки, метаданные рабочих пространств и историю повторений. Те же учётные данные дают полный доступ к коннектору, включая инструмент, который меняет карточки или помечает их как удалённые. Поэтому вопрос **безопасен ли MCP для карточек** сводится к двум проверкам: можно ли передавать эти данные выбранному клиенту и есть ли у него доступ к инструменту записи.

OAuth защищает процесс авторизации и обмен токенами, а сервер Flashcards ограничивает возможности своих инструментов. Но эти меры не оценивают разумность предложенного изменения, не гарантируют, что полученные данные останутся внутри Flashcards, и не заставляют ИИ-клиент запрашивать подтверждение перед записью.

Смотреть стоит на конкретные границы: к каким данным и действиям открывает доступ каждый инструмент, какие ограничения обеспечивает Flashcards и какие меры защиты работают только в вашем клиенте.

![Тёплый рабочий стол с отдельными секциями для чтения и записи через MCP Flashcards](/blog/is-mcp-safe-for-flashcards.png)

## Безопасен ли MCP для карточек? Проследите реальный путь данных

В удалённой MCP-сессии могут участвовать четыре стороны:

1. вы
2. приложение с ИИ или MCP-клиент, в котором вы отправляете запрос
3. поставщик модели, если модель обрабатывает данные за пределами клиента
4. MCP-сервер и бэкенд Flashcards

Некоторые продукты объединяют клиент и поставщика модели. Другие передают результаты инструментов отдельному сервису. Гарантировано только одно: Flashcards возвращает запрошенные данные аутентифицированному MCP-клиенту. Дальше всё зависит от архитектуры, тарифного плана и настроек клиента. Результат может попасть в контекст модели, остаться в инфраструктуре одного поставщика или перейти к другому обработчику.

На практике риски связаны с чтением, записью и интерпретацией инструкций. При чтении клиент может получить текст карточек, структуру колод, настройки рабочих пространств или события повторений. Запись может создать ненужные карточки, изменить содержимое или пометить карточки и колоды как удалённые. Наконец, агент может неверно понять ваш запрос или принять инструкции из импортированного материала за команды.

[Рекомендации NSA по безопасности MCP от мая 2026 года](https://www.nsa.gov/Press-Room/Press-Releases-Statements/Press-Release-View/Article/4496698/nsa-releases-security-design-considerations-for-ai-driven-automation-leveraging/) проводят полезное разграничение. Аутентификация, авторизация и проверка данных по-прежнему необходимы, но они не снимают риски динамических вызовов инструментов, общего контекста и неявного доверия. Общедоступная колода для изучения языка и колода из конфиденциальных заметок о клиентах требуют разных решений.

## Что именно защищает OAuth в Flashcards

Для интерактивных MCP-клиентов Flashcards использует OAuth-поток с кодом авторизации, PKCE и Dynamic Client Registration. Вы подтверждаете подключение в браузере, а PKCE привязывает обмен кодом к клиенту, который его начал. Сервер также проверяет, что токен доступа был выдан именно для MCP-ресурса Flashcards. В [руководстве по MCP-коннектору Flashcards](/ru/docs/mcp-connector/) указаны адрес подключения и метаданные обнаружения.

Эти меры защищают вход и обмен токенами. Стабильная [спецификация авторизации MCP от 25 ноября 2025 года](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization) требует использовать в этом потоке PKCE и токены, привязанные к конкретному ресурсу. Там же сказано, что в целом авторизация в MCP необязательна. Поэтому наличие OAuth у одного коннектора ничего не говорит о том, как устроена авторизация на другом сервере.

Сейчас Flashcards объявляет одну область доступа OAuth: `flashcards`. Отдельных OAuth-разрешений на чтение и запись нет, а учётные данные дают доступ ко всем инструментам коннектора. Поэтому режим «только чтение» существует только на стороне ИИ-клиента: он должен отключить или заблокировать `sql_execute`. Сервер гарантирует, что сам `sql_query` не умеет записывать данные. Но те же учётные данные позволяют вызвать `sql_execute`, если клиент отправит такой запрос.

Блокировка инструментов на стороне клиента полезна в обычной работе. Само OAuth-разрешение от неё не меняется, а вредоносный или взломанный клиент с действующими учётными данными этой настройкой не ограничен.

## Что на самом деле умеют три MCP-инструмента Flashcards

Коннектор не даёт выполнять произвольные запросы PostgreSQL: встроенный парсер разрешает только запросы из ограниченного SQL-диалекта. У каждого из трёх инструментов своя зона доступа:

| Инструмент | Доступ сейчас | Изменяет данные? | Консервативная настройка клиента |
| --- | --- | --- | --- |
| `list_workspaces` | Возвращает до 100 доступных пользователю рабочих пространств: ID, название, число активных карточек, время последней активности и признак пространства по умолчанию | Нет | Включайте, только если готовы передать клиенту эти метаданные всего аккаунта |
| `sql_query` | Читает `workspace`, `cards`, `decks` и `review_events` в одном указанном рабочем пространстве | Нет | Включайте для конкретной задачи чтения и запрашивайте только нужные столбцы |
| `sql_execute` | Добавляет, обновляет или помечает удалёнными записи в `cards` и `decks` в одном указанном рабочем пространстве | Да | Оставляйте выключенным, если клиент не умеет приемлемо для вас ограничивать запись |

[Руководство по MCP](/ru/docs/mcp-connector/) и [справочник API](/ru/docs/api/) описывают публичный диалект. В реализации есть ещё несколько деталей, важных для оценки безопасности подключения.

### Как на самом деле выбирается рабочее пространство

Каждый SQL-вызов работает ровно с одним рабочим пространством. Перед выполнением запроса Flashcards заново проверяет, что у пользователя всё ещё есть к нему доступ. Поэтому вызывающая сторона не может получить доступ к чужому пространству, просто передав его ID.

Пространство по умолчанию не ограничивает подключение только им. Если `workspaceId` не указан, инструмент использует значение по умолчанию. Если ID передан, подключение может обратиться к любому рабочему пространству, доступному пользователю. `list_workspaces` возвращает ID только тех рабочих пространств, которые входят в результат; лимит в 100 результатов не является границей изоляции, поскольку явно указанный `workspaceId` по-прежнему позволяет обратиться к любому рабочему пространству, доступному пользователю.

Тестовое рабочее пространство всё равно полезно: на нём можно посмотреть, как клиент показывает вызовы инструментов, и снизить ущерб от обычной ошибки, если вызов действительно останется внутри него. Но это не граница изоляции. То же подключение может указать любое другое доступное пространство. Для строгого разделения нужен отдельный аккаунт без доступа к рабочему пространству с настоящими данными или отдельное развёртывание.

### Что может раскрыть даже доступ только для чтения

`list_workspaces` и `sql_query` не могут менять состояние карточек. Они также не умеют исправлять данные или пересчитывать расписание. Это разделение обеспечивается сервером и заметно снижает вероятность случайной записи, когда `sql_execute` недоступен клиенту.

Но возвращённые данные всё равно покидают бэкенд Flashcards. Запрос о темах, которые вы знаете хуже, может включать текст карточек и события повторений. Даже короткая карточка может содержать данные о пациенте, название внутренней системы, личный пример для изучения языка или заметки к собеседованию.

[Политика приватности Flashcards](/ru/privacy/) распространяется на данные, запрошенные через MCP и Agent API. На границе протокола Flashcards передаёт результат MCP-клиенту. Получит ли его отдельный поставщик модели, как долго данные будут храниться и можно ли использовать их для обучения, зависит от архитектуры и настроек клиента, а также от условий поставщика. Проверяйте эти детали: режим «только чтение» ограничивает изменения, но не гарантирует приватность.

### Доступ на запись ограничен карточками и колодами

`sql_execute` поддерживает `INSERT`, `UPDATE` и `DELETE`, но только для `cards` и `decks`. Ресурсы `workspace` и `review_events` доступны только для чтения. Поля расписания карточек, включая даты следующего повторения, число повторений и сохранённое состояние FSRS, через этот диалект тоже доступны только для чтения. MCP не может зарегистрировать результат учебного повторения или напрямую переписать состояние расписания FSRS.

И `UPDATE`, и `DELETE` требуют условия `WHERE`. Это не даёт выполнить SQL-оператор совсем без фильтра, хотя корректное широкое условие всё равно может затронуть много строк. Проверка синтаксиса не понимает, соответствует ли фильтр вашему намерению.

Для карточек и колод `DELETE` не стирает строку из базы сразу. Он устанавливает метку удаления (tombstone), которую использует синхронизация. Удалённые элементы исчезают из активных данных, а в MCP-коннекторе нет инструмента отмены или восстановления. С точки зрения пользователя ошибочное удаление всё равно придётся исправлять вне MCP или из резервной копии.

[Условия использования](/ru/terms/) просят пользователей проверять результаты работы ИИ перед применением изменений. Здесь это особенно важно: Flashcards может проверить тип SQL-оператора, ресурс, столбцы и лимит строк. Причину, по которой вы решили внести изменение, сервер проверить не может.

## За подтверждения отвечает клиент

Flashcards помечает `sql_query` аннотацией `readOnlyHint`, а `sql_execute` — аннотацией `destructiveHint`. В стабильной [схеме MCP от 25 ноября 2025 года](https://modelcontextprotocol.io/specification/2025-11-25/schema) аннотации инструментов прямо названы подсказками. Они помогают совместимому клиенту выбрать правила подтверждения, но сами ничего не обеспечивают.

Получив корректный аутентифицированный вызов `sql_execute`, Flashcards выполняет его сразу. Второго экрана подтверждения со стороны Flashcards нет. Одобрение человеком возможно только в ИИ-клиенте, до того как запрос дойдёт до сервера.

Поведение клиентов различается. Например, [документация OpenAI по режиму разработчика](https://developers.openai.com/api/docs/guides/developer-mode) говорит, что действия записи по умолчанию требуют подтверждения, и позволяет запомнить решение на время беседы. [Страница справки о MCP-приложениях](https://help.openai.com/en/articles/12584461-developer-mode-and-mcp-apps-in-chatgpt-beta) объясняет, что запросы подтверждения зависят от разрешений приложения, контекста и правил рабочего пространства. Другие клиенты могут предлагать иные средства контроля или не предлагать их вовсе.

Используйте самый строгий вариант, который действительно поддерживает ваш клиент:

- Если можно отключать отдельные инструменты, оставляйте `sql_execute` выключенным, пока он не понадобится для конкретной задачи.
- Если можно требовать подтверждение каждого изменения, включите эту настройку и не сохраняйте разрешение для последующих операций записи.
- Когда клиент показывает предлагаемый вызов, проверяйте `workspaceId`, каждый SQL-оператор, условия `WHERE` и ожидаемое число подходящих записей.
- Если клиент не умеет блокировать инструмент записи или надёжно останавливаться перед вызовами, с самого начала считайте подключение доступом на запись.

Эти настройки снижают вероятность ошибки. Результат модели всё равно требует человеческой оценки.

## Что означает лимит в 100 строк на один SQL-оператор

Один SQL-оператор может вернуть или затронуть не более 100 записей, а пакет — содержать до 50 операторов. Поэтому один аутентифицированный вызов инструмента теоретически может изменить до 5 000 записей, если каждый оператор достигнет лимита. Один вызов способен затронуть намного больше одной карточки.

Пакеты изменений атомарны: либо выполняются все операторы, либо вся транзакция завершается ошибкой. Атомарность защищает от частично применённого пакета, если один оператор не сработал. Она не проверяет намерение пользователя и не позволяет отменить корректный пакет после фиксации транзакции.

На сериализованный результат также действует лимит в 48 000 символов. Он применяется после выполнения изменений и ограничивает только размер MCP-ответа. Изменение может зафиксироваться до того, как слишком большой результат будет отклонён. Поэтому масштаб изменений нужно оценивать по лимиту в 100 строк на оператор, а широкую выборку перед записью проверять через `sql_query`.

## Промпт-инъекция может прийти из учебного материала

Карточки написаны на естественном языке — именно такой текст интерпретирует ИИ-клиент. В импортированных заметках могут оказаться скрытые инструкции, промпты в цитатах или текст недоверенного автора. Если агент читает такой материал при доступном инструменте записи, он может принять данные за новую команду.

OAuth при этом может работать без сбоев: авторизованный клиент уже имеет право попытаться выполнить запись.

В [полном отчёте NSA о безопасности MCP](https://www.nsa.gov/Portals/75/documents/Cybersecurity/CSI_MCP_SECURITY.pdf) результаты инструментов и моделей описаны как недоверенные входные данные для следующего шага в цепочке. В отчёте рекомендуются строгие границы ресурсов, проверка параметров, внимательная оценка выходных данных и минимальные привилегии. Эти меры снижают риск, но не делают промпт-инъекцию невозможной.

Flashcards добавляет серверные ограничения. Парсер отклоняет неподдерживаемые типы SQL-операторов и ресурсы, а MCP-инструмент нельзя превратить в командную оболочку или неограниченное подключение к базе данных. Но внедрённая инструкция всё равно может запросить синтаксически корректное изменение доступных карточек. Сервер видит разрешённый запрос, но не беседу, которая убедила модель его отправить.

При работе с чувствительными данными ограничивайте сессию: один доверенный источник, одно выбранное рабочее пространство и только нужные инструменты. Не объединяйте недоверенный импорт, посторонние коннекторы и автоматическую запись в Flashcards без участия человека в одном запуске агента. В небольшой сессии подозрительные вызовы проще заметить, но границы изоляции она не создаёт.

## Границу приватности после 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](/ru/privacy/) описывает удаление данных из облачной версии. Flashcards не может удалить данные, которые уже сохранил клиент или поставщик модели. Для этого понадобятся средства управления того поставщика.

## Отключение коннектора и отзыв учётных данных — разные действия

Текущая реализация OAuth в Flashcards выдаёт токены доступа на один час и ротируемые refresh-токены без фиксированного срока действия. Сейчас в Flashcards нет пользовательского интерфейса для отзыва OAuth-подключений или публичного API для отзыва OAuth-токенов. При удалении коннектора клиент может удалить свои учётные данные, но это действие на его стороне не гарантирует аннулирование токена на сервере.

Ключи Agent API с префиксом `fca_`, рассчитанные на сценарии без интерактивного входа, — отдельный тип учётных данных. Их можно отозвать в разделе **Agent Connections** в Flashcards. Не смешивайте эти два способа аутентификации, когда описываете или закрываете доступ.

Если ваша модель угроз требует немедленного отзыва OAuth на стороне сервера, текущий OAuth-коннектор не даёт пользователю такой возможности. Для длительного подключения с чувствительными данными это ограничение важнее, чем для одноразовой общедоступной колоды.

## Практический чек-лист перед подключением

1. Определите категорию исходных материалов. Общедоступные учебные заметки, персональные данные, конфиденциальные материалы работодателя и регулируемые данные не должны подчиняться одной политике доступа. Если у вас нет разрешения отправлять материал клиенту и его обработчикам, не открывайте его через MCP.
2. Проверьте URL сервера. Документированный адрес — `https://mcp.flashcards-open-source-app.com/mcp`. Избегайте доменов-двойников и описаний коннекторов, скопированных из неизвестных источников.
3. Прочитайте политики обеих сторон. Начните с [политики приватности Flashcards](/ru/privacy/), затем проверьте правила конкретного ИИ-клиента о хранении, обучении, памяти, логировании и удалении.
4. Решите, достаточно ли запасного рабочего пространства. Оно подходит для пробного запуска, но подключение всё равно может обратиться к другим рабочим пространствам того же аккаунта. Если нужна строгая изоляция, используйте отдельный аккаунт или развёртывание.
5. Сначала заблокируйте `sql_execute` в клиенте. Если клиент не умеет этого делать, ещё до подключения учтите, что OAuth-учётные данные по-прежнему позволяют выполнять запись.
6. Запрашивайте минимум данных. Выбирайте только нужные для ответа столбцы и строки и не передавайте в беседу посторонние секретные данные.
7. Перед массовыми изменениями сделайте резервную копию и проверьте, что она работает. Более широкий процесс описан в [руководстве по резервному копированию карточек](/ru/blog/how-to-back-up-flashcards/).
8. Перед любым широким обновлением или удалением проверяйте выборку через `sql_query`. Используйте точные ID карточек или колод, сверяйте число совпадений с ожидаемым и разбивайте изменение на небольшие SQL-операторы.
9. Используйте подтверждения клиента, если они есть. Каждый раз проверяйте рабочее пространство и всё содержимое вызова. Не рассчитывайте, что пометка о разрушительном действии сама заставит клиента запросить подтверждение.
10. Закрывайте доступ осознанно. Отключите OAuth-коннектор и удалите сохранённые учётные данные из клиента, учитывая текущее ограничение отзыва на стороне сервера. Отзовите ключи `fca_` в Agent Connections и отдельно удалите данные, сохранённые дальше по цепочке.

Когда примете эти решения, пошаговую настройку можно найти в статье [Как подключить Flashcards к Claude через MCP](/ru/blog/how-to-connect-flashcards-to-claude-with-mcp/). Руководство объясняет, куда нажимать, а этот чек-лист помогает решить, стоит ли подключать MCP к конкретной колоде.

## Чем помогают открытый исходный код и самостоятельное развёртывание

У коннектора Flashcards есть несколько полезных свойств: отдельные инструменты чтения и записи, закрытый список разрешённых SQL-операторов, проверка доступа к рабочему пространству при каждом вызове, доступ к полям расписания только на чтение и открытый исходный код. Так проще проверить и ограничить доступ коннектора. Эти меры снижают риск, но не могут гарантировать безопасность клиента или правильность решения модели.

[Самостоятельное развёртывание](/ru/docs/self-hosting/) позволяет разместить данные и операции Flashcards в подконтрольной вам инфраструктуре. Но запросы к внешнему ИИ-сервису всё равно выносят данные карточек за её пределы. Цепочка клиента и модели должна отвечать тем же требованиям приватности, что и база данных.

## Простое правило для принятия решения

Используйте инструменты чтения MCP, если допустимо, что запрошенные данные покинут Flashcards и пройдут по выбранной цепочке клиента, условия поставщика вас устраивают, а задача оправдывает такую передачу. Считайте подключение полным доступом, если клиент на самом деле не заблокировал `sql_execute`.

Включайте инструмент записи только для узкой задачи, когда клиент может остановиться перед каждым важным вызовом, вы заранее проверили целевые строки и у вас есть пригодная резервная копия. Помните: один пакет может затронуть гораздо больше 100 записей, а отменить удаление через MCP нельзя.

Откажитесь от подключения, если колоду нельзя передавать клиенту или его обработчикам, дальнейшие правила работы с данными неясны, на одном аккаунте нужна строгая изоляция рабочих пространств, требуется немедленный отзыв OAuth или сценарий предполагает разрушительные изменения без подтверждения. В таких случаях используйте Flashcards без MCP либо выберите развёртывание и путь к модели, в которых весь поток данных соответствует вашим требованиям.

---
*[Открыть оформленную HTML-версию этой страницы](https://flashcards-open-source-app.com/ru/blog/is-mcp-safe-for-flashcards/)*

*AI-агенты могут создать аккаунт пользователя в этом сервисе, начиная с `GET https://api.flashcards-open-source-app.com/v1/`. После настройки они также могут подключиться по MCP по адресу `https://mcp.flashcards-open-source-app.com/mcp`.*

*Совет: добавьте `.md` к любому URL на https://flashcards-open-source-app.com, чтобы получить чистую Markdown-версию страницы.*