Все записи
БлогВыпускРасширенияБезопасность

Карточки сообщества, MCP-серверы и скиллы — всё подключается стрелкой

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

6 мин чтенияЧто вошло в 0.1.125

До этой недели каждая карточка на холсте NeuroSquad была нашей. 0.1.123 изменил это сразу в трёх местах: карточки сообщества, которые может сделать и опубликовать на GitHub кто угодно, MCP-серверы из официального реестра MCP и скиллы со skills.sh — и каждое из этого выдаётся конкретному агенту стрелкой. Через полтора часа 0.1.125 добавил проверенные карточки: отрецензированный список со значком, у которого точный смысл.

У холста есть одно правило, благодаря которому его можно читать: агент пользуется ровно тем, на что указывают его стрелки. Открывать холст для чужого кода имело смысл, только если это правило уцелеет. Большая часть работы в этих выпусках — о том, чтобы оно уцелело.

Сначала — сделать карточку дешёвой в добавлении

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

Поэтому сначала встроенные карточки стали плагинами: одна папка на стороне страницы, один модуль в главном процессе, IPC-каналы под общим префиксом, MCP-инструменты, которые регистрирует сама карточка, строки в собственном файле. Холст, сайдбар, стрелки и удаление обращаются с любой плагин-карточкой одинаково. Когда карточка — плагин, дать написать её кому-то другому — вопрос изоляции, а не проводки.

Карточки сообщества: песочница, из которой не выбраться за пределы карточки

Карточка сообщества — это маленькое веб-приложение. Его можно было бы запускать в отдельном нативном веб-представлении, но это оверлей уровня ОС: он лежал бы поверх холста, а не внутри него, и не масштабировался и не обрезался бы вместе с ним. Вместо этого карточка работает в изолированном iframe с непрозрачным origin, который отдаётся через собственный протокол приложения. Прежде чем строить на этом, мы проверили, что такой фрейм может и чего не может в этой конкретной версии Electron:

  • Он работает в отдельном процессе ОС. Карточка, крутившая пустой цикл четыре секунды, не заморозила холст: таймер хоста продолжал тикать, самый большой разрыв — 63 мс.
  • window.api, Node и require там просто нет, а обращение к родительской странице бросает ошибку безопасности.
  • localStorage и IndexedDB недоступны (отсюда собственный API хранилища), а внешние запросы блокирует политика безопасности контента фрейма.
  • Он не может открывать окна, уходить в полноэкранный режим, читать буфер обмена и включать микрофон.

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

Карточка никогда не общается со страницей, на которой нарисована. Она получает порт сообщений в главный процесс, привязанный к одному экземпляру карточки, и каждый запрос проверяется там по правам, которые пакет объявил, а вы выдали при установке. Всё, что доходит до другой карточки или агента, — передача данных через порт, промпт агенту, ввод в терминал, — требует и права, и стрелки между двумя карточками. Стрелка — это согласие именно на этот поток данных.

Установка — по адресу на GitHub, с привязкой к коммиту и сверкой с хэшем дерева файлов пакета. Обновления происходят только по вашему клику и сначала показывают, что изменилось в правах. Как сделать свою карточку — на странице Card SDK.

Проверенные карточки: значок, который значит одно

У установки по адресу есть очевидная дыра: как найти карточку, которую стоит ставить? 0.1.125 добавляет каталог карточек, проверенных командой NeuroSquad; он лежит в публичном репозитории и пополняется через пул-реквесты. Искать по нему можно в меню «Своя карточка…» или в настройках.

Вкладка «Проверенные» в выборе своей карточки: проверенная карточка с зелёным значком-щитом
Проверенные карточки в меню выбора. Щит означает, что проверен именно этот код, — а не что он никогда не может навредить.

Значок решает главный процесс, и значит он ровно следующее: установленная карточка взята из проверенного репозитория, на проверенном коммите, и хэш её файлов, посчитанный при установке, совпадает с хэшем в каталоге. Локальная папка разработки, другой коммит или другие файлы — значка нет.

Установка из каталога идёт на шаг дальше: если имя, версия или хэш не совпадают с записью каталога, установка отклоняется. Выбирать приходилось между «поставить без значка» и «не ставить», а подменённый пакет — не то, что стоит тихо ставить. Более новая проверенная версия предлагается как обновление с обычным сравнением прав и никогда не ставится сама; карточка, пропавшая из списка, теряет значок, и с вашего холста ничего не удаляется.

MCP-серверы и скиллы — по стрелке

Каталог в приложении ищет по официальному реестру MCP (около 35 тысяч серверов) и по skills.sh (20 тысяч самых устанавливаемых скиллов). Поиск локальный, прямо в приложении, по снимкам, которые идут вместе с ним и обновляются инкрементально, — поэтому он работает без сети и мгновенно.

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

Очевидный способ дать агенту MCP-сервер — прописать его в конфиг агентского CLI. Мы сознательно так не сделали. NeuroSquad сам выступает MCP-клиентом каждого установленного сервера и отдаёт его инструменты через собственный MCP-сервер как <alias>__<tool> — только агентам, у которых есть стрелка к карточке сервера, и только пока эта стрелка существует. В папки настроек вашего CLI ничего не пишется, а секреты сервера не покидают главный процесс. Claude Code подхватывает новую стрелку без перезапуска; остальные CLI видят её при следующем старте.

Живая копия — попробуйте
MCP
Figma Contextинструментов: 2

Figma Context

io.github.GLips/Figma-Context-MCP · v0.13.2

Готовnpm

Выдан агентам: 0

Протяните стрелку от карточки к агенту.

инструментов: 2 figma_context__*

get_figma_datadownload_figma_images
ДизайнерСтраница тарифов
Ждёт задачу
РевьюерСтраница тарифов
Ждёт задачу
Копия: установленный MCP-сервер, два агента и стрелка, которая отдаёт сервер ровно одному из них.

Скиллы устроены так же — через один инструмент, skill_load, в описании которого перечислены подключённые к агенту скиллы и когда какой применять. Один флаг отделил функцию от демонстрации: агенты прячут MCP-инструменты за поиском инструментов, и в живой проверке свежий агент ни разу не загрузил подходящий скилл. С пометкой «загружать всегда» он сам загрузил нужный.

Живая копия — попробуйте
skill
brainstormingфайлов: 8

brainstorming

obra/superpowers

Готовустановок: 374,9 тыс.

You MUST use this before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.

Выдан агентам: 0

Протяните стрелку от карточки к агенту.

ДизайнерСтраница тарифов
Ждёт задачу
РевьюерСтраница тарифов
Ждёт задачу
То же для скилла: подключён стрелкой, загружается, когда этого требует задача.

Что изменил аудит безопасности

Оба выпуска перед выходом прошли аудит безопасности, и три его результата стоит описать:

  • У каждого агента свой токен для MCP-сервера приложения, выведенный из секрета текущего запуска и id агента. Раньше один агент теоретически мог действовать от имени другого; теперь чужой путь отвечает 401.
  • Сторонние инструменты живут на втором MCP-сервере, которого нет в списке заранее разрешённых инструментов CLI. Поэтому CLI спрашивает вас перед каждым вызовом инструмента с чужого сервера, — а список инструментов при установке запоминается отпечатком, так что сервер, который позже поменяет свои инструменты, ждёт, пока вы примете изменения.
  • Скилл берётся целиком, с одного коммита. Собственный хэш содержимого skills.sh не воспроизводится по файлам, которые он отдаёт, поэтому приложение закрепляет свой SHA-256 ровно тех файлов, которые вы просмотрели, и ставит именно их.

Не всё встаёт на место. Официальный удалённый сервер Figma отвечает 403 на динамическую регистрацию клиента — он принимает только одобренных клиентов, — поэтому каталог предлагает вместо него сервер сообщества, который работает с личным токеном. Пакеты, которым нужен локальный HTTP-сервер, пока не поддерживаются. И то и другое записано, а не обойдено.

Подробнее — на страницах MCP-серверов и скиллов, полный список — в журнале изменений 0.1.123 и 0.1.125.