7 сентября 2026 г.

Что MCP-коннектор на самом деле скармливает твоему агенту

Андрей Присекин
Автор

Андрей Присекин

Создаю AI-агентов, автоматизирую бизнес-процессы

MCP-коннектор даёт агенту не только инструменты, но и текст. Описания этих инструментов и ответы сервера попадают прямо в контекст модели, часто ещё до первого вызова. Даже официальный коннектор Notion так возвращает агенту подсказки «нужен апгрейд» со ссылкой на оплату. Проверить, что именно шлёт коннектор, можно за пару минут через MCP Inspector.

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

Коннектор - это не только кнопки, но и слова

MCP (Model Context Protocol) обычно объясняют так: это разъём, через который модель получает доступ к внешним программам. Notion, Figma, база данных, файловая система - воткнул сервер, и агент умеет с ними работать. Всё верно, но это половина картины.

Вторая половина - текст. Когда клиент подключается к серверу, он первым делом спрашивает у него список инструментов методом tools/list. Сервер отвечает не голыми именами функций, а описаниями: что делает инструмент, какие принимает аргументы, когда его звать. И эти описания клиент вставляет в контекст модели. То есть сервер диктует агенту кусок его же инструкции. Плюс сами ответы инструментов - тоже текст от сервера, который агент читает как данные и на который опирается в следующем шаге.

Получается, коннектор влияет на агента двумя каналами: описаниями инструментов (грузятся сразу при подключении) и ответами на вызовы (прилетают по ходу работы). Оба канала ты обычно не видишь - они между сервером и моделью, мимо экрана.

Схема: MCP-коннектор шлёт агенту два потока текста - описания инструментов и ответы с подсказкой оплатить

Что реально делает официальный коннектор Notion

Тут не нужны догадки - есть документация Notion для разработчиков. Официальный сервер сообщает агенту, какие инструменты доступны на твоём тарифе, через карту current_tool_access. У каждого инструмента одно из состояний: available, available_with_limit, upgrade_required или not_enabled.

Ключевое - upgrade_required. По формулировке самой Notion, вызов такого инструмента «возвращает подсказку об апгрейде», а запись в карте несёт upgrade_url - ссылку на оплату. Есть и plan_required с полями landing_page_url и landing_page_action, когда Notion ведёт пользователя через страницу тарифа. А инструкция агенту прямым текстом советует «сторониться инструментов, которые вернут только подсказку об апгрейде».

Разложим по-человечески. Ты просишь агента что-то сделать в Notion. Часть возможностей на твоём тарифе закрыта. Официальный коннектор не просто говорит «недоступно» - он передаёт агенту готовую подсказку «нужен апгрейд» и ссылку на оплату. Захочет агент - озвучит это тебе. Это не тайный заговор и не скрытая инъекция. Это задокументированное поведение, встроенное в доверенный сервер. Но сути оно не меняет: коннектор формирует то, что агент тебе скажет, через текст, которого ты не видишь.

«Line jumping»: описание бьёт раньше вызова

Почему на этом стоит заострить внимание. В апреле 2025 Trail of Bits описал приём, который назвали «line jumping» - перепрыгивание очереди. Суть: описания инструментов из tools/list попадают в контекст модели сразу при подключении, до того как ты вызвал хоть один инструмент. По их словам, «описания инструментов сами по себе - главный вектор для инъекции промпта».

Дальше логика простая. Если в описание инструмента зашита инструкция, модель прочитает её как часть своей задачи и может начать ей следовать - ещё до того, как ты что-то подтвердил. Исследователи из Invariant Labs показали это наглядно: безобидный на вид инструмент сложения двух чисел, а в его описании спрятана команда сходить за приватными ключами и утащить их. Пользователь видит «сложить a и b», модель видит ещё и скрытую директиву.

То есть канал влияния работает не только на честные коммерческие подсказки вроде notion-овских. Тем же путём в агента можно засунуть что угодно, и это «что угодно» сработает раньше первого клика.

Это ломает совет «ставь только проверенные серверы»

Стандартный совет по безопасности MCP звучит так: подключай только серверы, которым доверяешь. Совет разумный, но история с Notion показывает его предел. Notion - это официальный, проверенный, всеми используемый сервер. И он всё равно кладёт в контекст агента текст, который влияет на его ответы. «Проверенный» не значит «ничего тебе не подсовывает».

У Notion и раньше были проблемы с этим каналом, только с другого конца. В сентябре 2025 Саймон Уиллисон разобрал атаку на агента Notion 3.0: в загруженный PDF прятали текст белым по белому, агент его честно читал и по спрятанной команде сливал конфиденциальные данные наружу через инструмент поиска. Классическая «летальная тройка» - доступ к приватным данным, чтение недоверенного контента и канал наружу в одном флаконе. Историю подтвердил и Брюс Шнайер.

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

Как проверить, что коннектор шлёт агенту

Хорошая новость: увидеть скрытый канал несложно. Есть штатный инструмент - MCP Inspector.

Запускается одной командой: npx @modelcontextprotocol/inspector. Поднимется локальный веб-интерфейс, к которому ты подключаешь сервер (для удалённого сервера Notion - адрес https://mcp.notion.com/mcp с авторизацией по OAuth). Дальше два шага:

  • Вкладка Tools - там сырой ответ tools/list: все описания инструментов и схемы аргументов ровно в том виде, в каком их видит модель. Это самый прямой способ поймать в описании маркетинг или спрятанную инструкцию.
  • Вызови инструмент прямо из Inspector и прочитай сырой JSON-ответ. Именно в ответах живут подсказки об апгрейде, upgrade_url и прочий текст, который сервер отдаёт агенту по ходу задачи.

Отдельно посмотри, что у тебя вообще подключено. В Claude Code это claude mcp list и claude mcp get <имя> - показывает настроенные серверы, лишние можно убрать. Одной команды «вывалить все описания инструментов» в Claude Code пока нет (есть открытый запрос на неё), поэтому для сырых описаний берём Inspector.

Что с этим делать на практике

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

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

Второе: давай коннектору минимум прав. Серверу для одной задачи не нужен доступ ко всему рабочему пространству и файловой системе. Чем уже периметр, тем меньше цена ошибки.

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

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

Источники

← Все статьи