Claude Code теперь добавляет картинки в заметки: загрузка файлов по MCP

Product

Попросите ИИ-ассистента описать вчерашний инцидент, и он хорошо справится — ровно до графика. Скриншот лежит у вас на рабочем столе, в заметке написано «см. вложение», а вложения нет. До сих пор MCP-сервер Notez умел читать, писать и перестраивать ваши заметки, но до файла на вашем компьютере дотянуться не мог.

Notez v0.11.0 это исправляет. Любой MCP-ассистент, который умеет выполнять команды в терминале, — Claude Code, Cursor, Codex CLI — теперь загружает картинку или файл с вашего компьютера и вставляет прямо в заметку.

Как это выглядит

Вы пишете:

Добавь ./grafana-latency.png в заметку «Инцидент 2026-09-10» сразу под заголовок «Хронология» и приложи сырые логи из ./incident-logs.zip.

Ассистент загружает оба файла и редактирует заметку. Скриншот появляется прямо в тексте под заголовком «Хронология», архив становится плашкой файла, по клику на которую он скачивается. Оба файла видны на странице Файлы, занимают место в вашем хранилище, как и всё остальное, и подчиняются тем же ограничениям на форматы и размер, что и в редакторе.

Это работает везде, где пишется заметка: при создании новой, при правке части текста и при полной перезаписи.

Почему файл не проходит через чат

Очевидное решение — инструмент, который принимает файл аргументом. Но вызовы инструментов в MCP — это JSON, и файл пришлось бы передавать текстом в base64 прямо в ответе модели: около 35 000 токенов на скриншот в 100 КБ, а PDF не влез бы вовсе. Способа передать файл в протоколе пока нет; предложение ровно об этом всё ещё в черновике.

Поэтому я пошёл тем же путём, что и редактор Notez. Когда вы перетаскиваете картинку в редактор, браузер запрашивает у сервера подписанную ссылку для загрузки и отправляет байты прямо в файловое хранилище. Ассистент делает то же самое в три шага:

  1. Запрашивает загрузку. Инструмент create_upload получает имя файла, его тип и точный размер и отвечает готовой командой curl, подписанной для этого единственного файла.

  2. Выполняет команду. Файл идёт с вашего компьютера прямо в файловое хранилище. Через разговор ничего не проходит, поэтому PDF на 20 МБ стоит столько же токенов, сколько файл на 20 КБ.

  3. Подтверждает. confirm_upload проверяет, что файл действительно дошёл, и возвращает однострочный фрагмент разметки, который ассистент вставляет в заметку.

Ограничение простое: для второго шага нужен терминал. Ассистенты, которые умеют выполнять команды, например Claude Code и Cursor, справляются без подсказок. Клиенты, где есть только чат, например Claude Desktop, этого не умеют и честно об этом говорят, а не притворяются: они отправляют вас в приложение.

Проверка, что файл правда дошёл

Агент может отчитаться «готово» о команде, которая упала. Поэтому confirm_upload не верит ему на слово, а спрашивает файл у хранилища. Если файла нет, ассистент получает указание выполнить команду ещё раз. Если размер дошедших байтов не совпадает с заявленным, загрузка отклоняется, и он начинает заново. В квоту засчитывается именно заявленный размер, поэтому файл, размер которого указан неверно, Notez не регистрирует вовсе.

Фрагмент, а не ссылка, и ошибка, которую я исключил заранее

На эту часть я потратил больше всего времени.

Notez следит за каждым файлом, который использует заметка. Благодаря этому он убирает за вами: когда вы удаляете картинку из заметки, место со временем освобождается, а файл, который загрузили, но так и не использовали, удаляется через три дня. В редакторе вы этого не замечаете, потому что в каждой картинке, которую он вставляет, есть скрытый id файла.

Ассистент пишет Markdown вручную. После загрузки самое естественное для модели — написать обычную ссылку на картинку: ![latency](https://…/grafana.png). Она отображается. Выглядит правильно. Но id файла в ней нет, и для Notez заметка этот файл не использует. Через три дня очистка его удаляет, и в заметке, которой вы поделились на прошлой неделе, молча появляется битая картинка.

Я заметил это, пока делал функцию, а не после релиза, и закрыл проблему с двух сторон:

  • Ассистент получает правильную разметку. confirm_upload возвращает фрагмент, в котором уже есть id файла, а инструкции сервера велят ассистенту вставить его без изменений.

  • Notez не принимает неправильную разметку. Если при записи заметки только что загруженный файл вставлен одной ссылкой по адресу, запись отклоняется с объяснением, и ассистент повторяет её с фрагментом. Ссылки на всё остальное работают как раньше: картинки с других сайтов и файлы, которые уже надёжно живут в другой заметке.

Та же проверка защищает ИИ-чат в приложении, так что ни один из ассистентов не оставит в ваших заметках бомбу замедленного действия.

Что знать, прежде чем пробовать

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

  • Место расходуется из хранилища владельца рабочего пространства. Загрузки учитываются в аккаунте владельца пространства, как бы ни подключился ассистент.

  • Скриншоты хранятся в полном размере. Редактор сжимает картинки в браузере, а файл от ассистента приходит ровно таким, каким лежит на диске.

  • ИИ-чат в приложении не загружает файлы. Он работает в браузере и не видит ваших файлов. Два инструмента загрузки и list_workspaces для подключений через вход в аккаунт — единственные, которые есть у MCP-сервера и нет у чата.

Попробуйте

  1. В Notez откройте Настройки → Интеграции → MCP-сервер Notez и нажмите Создать ключ MCP.

  2. Добавьте ключ в Claude Code командой с этой страницы или в Cursor через JSON-конфигурацию.

  3. Попросите о чём-нибудь с файлом: «Вставь ./architecture.png в мою заметку „Архитектура системы“».

Полный справочник со всеми инструментами, ошибками и ограничениями — в статье Настройка MCP-сервера, а о форматах и месте рассказывает статья Файлы и вложения.

Частые вопросы

Может ли Claude Code загружать картинки в Notez?

Да. Claude Code умеет выполнять команды в терминале, поэтому через инструменты create_upload и confirm_upload кладёт картинку или файл с вашего компьютера в любую заметку рабочего пространства, к которому подключён.

Это работает в Claude Desktop?

Из коробки — нет. Шаг загрузки выполняет команду curl, а Claude Desktop не выполняет команды, если вы не дали ему инструмент, который это умеет. Он предложит добавить файл в приложении.

Какие файлы может загрузить ИИ-ассистент?

Те же, что и редактор: картинки (JPG, PNG, GIF, SVG, WEBP и другие), PDF и офисные документы, видео, архивы ZIP и RAR — в пределах ограничения на размер файла вашего тарифа.

Загруженный файл занимает место в моём хранилище?

Да, в хранилище аккаунта владельца рабочего пространства, точно так же, как файл, добавленный в редакторе.

Что значит NOTE_UPLOAD_NOT_LINKED?

Ассистент попытался вставить загруженный файл одной ссылкой по адресу. Notez это отклоняет, потому что такой файл не отслеживался бы и удалился бы через три дня. Ассистент должен вставить фрагмент, который вернул confirm_upload, и большинство ассистентов сами повторяют запись.

Читайте также