MCP (Model Context Protocol) — то, чем Claude Desktop, OpenClaw и другие агенты подключают внешние инструменты. Мост Parreq — один исполняемый файл: скачали, прописали в настройках агента, ключ в переменную окружения. Ни Python, ни Node, ни прав администратора не нужно.
Файл собран статически: на Linux он одинаково работает и на Alpine с musl, и на Debian или Ubuntu с glibc. Разбираться, какая у вас libc, не придётся.

Скачать

Рядом с каждым файлом лежит .sha256 — проверить, что скачалось именно то:

Настроить

Ключ выдаётся в кабинете. Мост берёт его из окружения — в самом файле никаких настроек нет.
Файл настроек Claude Desktop лежит здесь:
  • Windows — %APPDATA%\Claude\claude_desktop_config.json
  • macOS — ~/Library/Application Support/Claude/claude_desktop_config.json
После правки агент нужно перезапустить.

Переменные

Что получает агент

Попросили extract, а parsed в ответе нет — причина лежит рядом, в extract_note: из fetch_metadata.extract_note облака или из note и unsupported коробки (в ней разбора моделью нет — страница не покидает вашу машину; задайте поля селекторами через fields). Раньше ответ приходил без parsed и без единого слова.
Описания составлены так, чтобы агент сам выбирал верный инструмент: в них сказано не только что делает каждый, но и чем он отличается от соседнего — иначе агент берёт fetch там, где нужен search, и открывает сессию ради одной страницы.

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

Агент открывает страницу и получает элементы со ссылками ref:
Дальше — заполняет поле и нажимает кнопку по этим ref, а в ответе видит, что из этого вышло: сменился ли адрес, что теперь на странице.
Идентификатор приходит в поле session_id, а в остальные инструменты кладётся в поле session. Имена разные не по недосмотру: session_id — служебное поле у части посредников, через которых агенты подключают MCP-серверы, и они забирают его себе, не доводя до моста. Снаружи это выглядело как «параметр не задан», хотя агент его послал. Старое имя мост по-прежнему принимает, если вы зовёте его напрямую.

Если страница пришла пустой

Так бывает, когда сайт отдаёт каркас, а содержимое приезжает сторонним виджетом: elements_count: 0, а в settled стоит ready: "loading" и десяток-другой узлов. Ждать дольше — wait_ms до 60 секунд, можно вместе с wait_for и CSS-селектором того, что должно появиться:
Если сессия уже открыта, перечитать страницу дешевле, чем открывать заново, — parreq_browser_state с тем же session.

Размер ответа

Окно агента — общий и исчерпаемый ресурс: страница средней руки весит под двести тысяч символов разметки, и одна такая выдача занимает весь разговор целиком. Поэтому мост отдаёт агенту не всё, что пришло от сервиса, а ровно то, что тот попросил, и не больше max_chars символов — по умолчанию 20 000. Выброшенное не исчезает молча: на его месте остаётся отметка с размером и подсказкой, как его получить.
Обрезанное поле помечается так же — text_truncated с полным и показанным размером, чтобы агент не принял обрубок за целую страницу. Резать по символам, а не по байтам, здесь принципиально: обрезка русского текста посередине буквы отдала бы битую строку, на которой споткнулся бы разбор ответа.

Скриншот приходит картинкой

Попросите снимок — и агент увидит саму страницу, а не ссылку на неё. Мост скачивает картинку и прикладывает её к ответу отдельным вложением: модель получает и разобранный JSON, и изображение.
В ответе рядом с текстом появляется блок с картинкой, а в самом JSON — отметка, что она приложена:
Полезно там, где текст не отвечает на вопрос: «почему форма не отправилась», «что за баннер перекрыл страницу», «как выглядит вёрстка». По тексту это не видно, по снимку видно сразу.
Снимок — платная надстройка, как и в обычном Fetch. Картинка весом больше шести мегабайт не прикладывается: она вытеснила бы из окна модели всё остальное. Тогда в ответе остаётся ссылка и объяснение, почему вложения нет.

Режим коробки

Если у вас стоит коробка, укажите мосту её адрес — и набор инструментов поменяется. Вместо восьми штук с подробными схемами появится один: коробка умеет разобрать команду сама, и агенту достаточно строки.
Режим включается сам, когда адрес на петле. Для коробки на соседней машине задайте PARREQ_BOX=1. Слова и буквы работают одинаково — пишите как удобнее. Ответы урезаны: текст до шести тысяч знаков, элементы страницы короткими ссылками вида b3. Добавьте full в конец команды, чтобы получить всё целиком.
Зачем это нужно: описания восьми инструментов агент отправляет модели при каждом обращении, а это несколько тысяч токенов независимо от того, нужен ему сейчас поиск или нет. Один инструмент со строкой занимает десятки.

Отказы

Мост различает два вида неудач, и это важно для поведения агента. Ошибка протокола — запрос неправильный: нет такого инструмента, не разобрались аргументы. Повторять бессмысленно. Отказ инструмента — приходит обычным ответом с признаком ошибки и полем retryable:
retryable: true означает, что повтор имеет смысл — обработчик греется, лимит временный, сессии заняты. false — повторять нечего: кончились кредиты, нет прав, страница не открылась.

Проверить, что работает

Мост запускается агентом, а не руками, но убедиться, что файл живой, можно так:
А целиком — отправив ему запрос протокола:
В ответ придёт список из восьми инструментов.

Обновления

Мост обновляется сам, начиная с версии 0.3.1. Устроено это иначе, чем у коробки, и разница из-за срока жизни: мост запускается на сессию агента и гаснет вместе с ней, десятки раз в день. Перезапускать себя ему не нужно и нельзя — стандартные потоки держит агент. Поэтому проверка идёт в фоне, а новая версия просто кладётся на место старой. Текущая сессия доработает прежним кодом, следующая возьмёт новый. Что при этом проверяется: контрольная сумма, размер, и что скачанное вправду запускается и представляется обещанной версией. Не сошлось — обновление не ставится, мост работает дальше как работал. О сделанном он пишет одну строку в поток ошибок, который агент показывает в своём журнале:
Выключить:
Выключатель нужен там, где мосту нельзя ходить наружу, и там, где его файлом управляет пакетный менеджер: подменять чужой файл — грубость. Если мост лежит в каталоге без права записи, он это увидит и не станет ничего делать.
Проверить свою версию: parreq-mcp --version. Что считает актуальным сервер:

Что внутри

Никаких сторонних библиотек: MCP поверх stdio — это JSON-RPC 2.0 через стандартный ввод-вывод, и он целиком помещается в стандартную библиотеку языка. Меньше вес, меньше поводов для обновлений и на одну сторону меньше, которой надо доверять на вашей машине. Ключ не пишется на диск и не попадает в сообщения об ошибках: он живёт только в окружении процесса.