Документация · Интеграции
MCP для агентов
Полное руководство по подключению AI к своему аккаунту Gensite через удалённый MCP.
Удалённый MCP Gensite позволяет AI-агенту работать в вашем аккаунте: получать список проектов, создавать многостраничные сайты и собирать каждую страницу из блоков. Сервер уже работает на проде:
https://gensite.ru/api/mcp
Клонировать репозиторий, устанавливать Node.js, запускать npm run mcp или поднимать локальную копию Gensite не требуется. MCP-клиент отправляет запросы непосредственно на gensite.ru по HTTPS.
Как устроен доступ
Каждое подключение содержит Bearer-токен аккаунта:
Authorization: Bearer gs1.…
По токену Gensite определяет пользователя до выполнения любого инструмента. Агент:
- создаёт новые проекты с текущим пользователем в качестве владельца;
- получает принадлежащие пользователю и доступные ему проекты;
- добавляет, правит, удаляет и переупорядочивает блоки в проектах, где у него есть права редактора;
- не получает пароль и браузерную сессию;
- не может переключиться на другой аккаунт без другого токена;
- не получает административные права только из-за подключения MCP.
Токен действует 30 дней. Его нельзя публиковать, добавлять в Git или отправлять посторонним: он предоставляет такой же программный доступ к проектам, как API-токен.
Важно: выпуск нового токена пока не отзывает ранее выпущенный. Если токен раскрыт, удалите его из всех конфигураций и обратитесь к администратору; без ротации серверного секрета он перестанет работать только по истечении 30 дней.
Что потребуется
- Аккаунт на gensite.ru.
- MCP-клиент с поддержкой удалённых HTTP-серверов, например Cursor.
- Токен, выпущенный в настройках аккаунта.
Подключение в Cursor
- Войдите в Gensite.
- Откройте Кабинет → Настройки → MCP для AI.
- Нажмите Выпустить токен.
- Нажмите Скопировать под сгенерированным конфигом.
- В Cursor откройте Settings → MCP и добавьте скопированный JSON в глобальный или проектный MCP-конфиг.
- Перезапустите сервер MCP в настройках Cursor, если он не подключился автоматически.
Конфигурация выглядит так:
{
"mcpServers": {
"gensite": {
"url": "https://gensite.ru/api/mcp",
"headers": {
"Authorization": "Bearer gs1.…"
}
}
}
}
Заменять URL на localhost не нужно. Команды command, args, npx и путь к репозиторию также не нужны: это конфигурация удалённого HTTP MCP, а не локального stdio-процесса.
Подтверждения действий
Сам Gensite не открывает диалоги подтверждения внутри MCP. Инструменты передают стандартные annotations: чтение помечено readOnly, создание проекта/страницы/блока — как недеструктивное добавление, обновление и удаление — как изменение данных.
AI-клиент может применять собственную политику и всё равно запрашивать разрешение. Это поведение настраивается на стороне клиента и не может быть отключено MCP-сервером. Если агент пишет, что Gensite доступен «только через браузер», или вызывает GET /projects и получает HTML, он не использует это MCP-соединение и не читает контракт. Проверьте, что в списке инструментов есть whoami, list_projects, create_project, create_page и add_block. Для HTTP-клиентов без MCP базовый URL — https://gensite.ru/api/v1, контракт — https://gensite.ru/api/v1/openapi.json.
Первый запрос агента
После подключения попросите агента:
Вызови whoami и get_product_guide у MCP-сервера Gensite,
затем покажи список моих проектов.
Ожидаемое поведение:
whoamiвозвращает email и ID аккаунта.get_product_guideобъясняет агенту модель продукта и порядок работы.list_projectsвозвращает доступные аккаунту проекты.- После подтверждения задачи агент вызывает
create_project.
Отдельный login через MCP отсутствует и не нужен. Авторизация выполняется до вызова инструмента по токену из конфигурации.
Инструменты
whoami
Проверяет, к какому аккаунту привязано текущее соединение.
Аргументы отсутствуют. Результат:
{
"success": true,
"user": {
"id": "user_id",
"email": "agent@example.com",
"name": "Имя"
}
}
Используйте этот инструмент первым, если есть сомнение, в чей аккаунт попадёт новый проект.
get_product_guide
Возвращает инструкцию для AI: что считается проектом, как устроены блоки, где открыть редактор и какие инструменты вызывать. Аргументы отсутствуют.
Рекомендуется вызывать в начале новой сессии или перед задачей, для которой агенту нужен контекст Gensite.
list_projects
Возвращает проекты, доступные текущему аккаунту. В список могут входить:
- проекты, которыми пользователь владеет;
- проекты, которыми с ним поделились;
- общие демонстрационные проекты без владельца.
Аргументы отсутствуют. Основные поля результата:
{
"success": true,
"projects": [
{
"id": "project_id",
"title": "Лендинг клиента",
"slug": "landing-klienta",
"publishedAt": null,
"editorPath": "/editor/landing-klienta",
"editorUrl": "https://gensite.ru/editor/landing-klienta"
}
]
}
publishedAt: null означает черновик. Для надёжной идентификации проекта используйте id, а не только название.
get_project
Один проект по projectId или projectSlug. Тот же объект, что элемент list_projects. Не заменяет HTTP GET /projects на корне сайта.
create_project
Создаёт пустой проект, владельцем которого становится текущий пользователь.
Аргументы:
title— обязательная непустая строка, название проекта;clientName— необязательное имя клиента;description— необязательное описание задачи или сайта.
Пример вызова:
{
"title": "Сайт студии Север",
"clientName": "Студия Север",
"description": "Корпоративный лендинг для дизайн-студии"
}
Успешный результат содержит id, slug, editorPath и абсолютный editorUrl. Проект создаётся как черновик без блоков и не публикуется автоматически.
Перед созданием агенту полезно вызвать list_projects, чтобы не создать очевидный дубликат. Нельзя считать одинаковые названия гарантией дубликата: окончательное решение должен подтвердить пользователь.
delete_project
Удаляет проект целиком: страницы, блоки и связанные данные. Только владелец текущего аккаунта. Аргументы: projectId или projectSlug.
Действие необратимо. Редактор с доступом к проекту, но без владения, получит ошибку.
publish_project
Публикует проект или возвращает его в черновик. Аргументы:
projectIdилиprojectSlug— проект;publish—true(по умолчанию) публикует сайт,falseснимает с публикации.
Пока проект в черновике, публичная главная показывает заглушку «Проект не опубликован», а подстраницы отвечают 404; смотреть черновик можно только по preview-ссылке. После публикации главная и все подстраницы открываются по публичным адресам.
Ответ содержит published, publishedAt, publicPath и абсолютный publicUrl. Публиковать может владелец или редактор проекта.
Агент должен вызывать инструмент только по явной просьбе: публикация меняет то, что видят посетители сайта.
get_theme
Возвращает тему проекта: цвета, шрифты и настройки соцпревью. Аргументы: projectId или projectSlug. Инструмент только читает — вызывайте его перед update_theme, чтобы видеть текущие значения.
update_theme
Задаёт оформление сразу для всего сайта: главной, подстраниц и блога. Аргументы:
projectIdилиprojectSlug— проект;textColor,secondaryColor,backgroundColor,accentBackgroundColor— цвета в hex (#0f172a,#4f46e5);fontFamily,headingFont— семейства Google Fonts, напримерManropeиSora;fontFamilyCategory,headingFontCategory—sans-serif,serif,display,handwritingилиmonospace;fontSize— базовый размер текста вида17pxили1.1rem;lang— язык страниц (ru,en-US);ogTitle,ogDescription,ogImage,faviconUrl— превью в соцсетях и фавикон.
{
"projectSlug": "portfolio-ili",
"backgroundColor": "#0b1020",
"textColor": "#f8fafc",
"secondaryColor": "#94a3b8",
"accentBackgroundColor": "#6366f1",
"headingFont": "Sora",
"fontFamily": "Manrope"
}
Меняются только переданные поля, остальная тема сохраняется. null сбрасывает поле к значению по умолчанию. Некорректное значение (цвет не в hex, неизвестная категория шрифта, относительный URL картинки) вернёт ошибку с именем поля, и тема не изменится.
Смена fontFamily или headingFont сбрасывает сохранённый список начертаний: новый шрифт грузится с весами по умолчанию, а подобрать конкретные начертания можно в редакторе темы.
list_block_types
Справочник секций конструктора. Не добавляет блоки на страницу.
Ответ группирует блоки по семействам (family), а не плоским списком одинаковых названий:
note— как читать каталог;recommendedPageOrder— типичный порядок секций лендинга сверху вниз;families[]— семейство, поток (main|popup|utility|blog), зачем блок (purpose), когда брать (whenToUse), макеты (variants).
У варианта:
type— идентификатор макета в редакторе, напримерcover__cover_1(видсемейство__семейство_id);label— название в каталоге редактора;layout— чем этот макет отличается от соседних в том же семействе;fields— ключи, которые принимаютadd_block.fieldsиupdate_block_content.fields.
Потоки:
main— секция страницы;popup— всплывающее окно, не стоит в ленте;utility— CSS или JavaScript без видимой секции;blog— шаблоны блога проекта, не обычный лендинг услуг.
Агенту: вызывать перед выбором структуры сайта, а type варианта передавать в add_block.
list_pages
Возвращает обычные подстраницы проекта по порядку. Аргументы: projectId или projectSlug. У каждой страницы есть id, slug, title/SEO, blockCount, editorPath, previewPath и publicPath.
Шаблоны блога в этот список не входят.
create_page
Создаёт подстраницу. Обязательные аргументы:
projectIdилиprojectSlug;slug— адрес внутри сайта, напримерservices;title— название страницы.
Необязательно можно сразу передать metaTitle, metaDescription и ogImage. После создания используйте возвращённый page.id в add_block.
update_page
Меняет title, slug и SEO обычной подстраницы. Передайте проект и pageId либо pageSlug. Значение null очищает SEO-поле.
delete_page
Удаляет обычную подстраницу вместе с её блоками. Шаблоны блога инструмент не удаляет.
reorder_pages
Принимает проект и pageIds — все id обычных подстраниц в нужной последовательности, без повторов и пропусков.
list_project_blocks
Блоки главной или выбранной подстраницы в порядке сверху вниз. Всегда передайте projectId или projectSlug. Для подстраницы дополнительно передайте pageId либо pageSlug; без них инструмент читает главную.
{
"success": true,
"projectId": "project_id",
"blocks": [
{
"id": "block_id",
"type": "cover__cover_1",
"order": 0,
"fields": {
"text": {
"title": "Илья — фронтенд-разработчик",
"description": "React, TypeScript, современная вёрстка",
"ctaFill.text": "Связаться",
"ctaFill.href.value": "#contacts",
"image.url": "https://example.com/ilya.png"
},
"numbers": {},
"toggles": { "root.isVisible": true, "fullHeight": false },
"lists": {}
}
}
]
}
fields — карта правимых путей: text для строк, numbers для чисел, toggles для переключателей, lists для длины списков. Эти же ключи принимают add_block и update_block_content.
Пути бывают вложенными: ctaFill.href.value — ссылка кнопки, items[0].title — первая строка списка, items[0].image.url — картинка этой строки. Очень длинные значения (например, data-URI картинки-заглушки) в ответе обрезаны с пометкой …(обрезано) — ключ от этого не меняется.
add_block
Добавляет секцию на главную или выбранную подстраницу. Аргументы:
projectIdилиprojectSlug— проект;pageIdилиpageSlug— необязательно; без них блок добавляется на главную;type— макет изlist_block_types, напримерcover__cover_1;position— необязательный индекс вставки сверху вниз; по умолчанию блок идёт в конец;fields— необязательные значения полей, чтобы сразу наполнить блок;sharedAcrossPages— необязательный флаг «показывать на всех страницах» для блока главной;sharedPosition—before(сверху подстраниц) илиafter(снизу) для общего блока.
{
"projectSlug": "portfolio-ili",
"type": "cover__cover_1",
"fields": {
"title": "Илья — фронтенд-разработчик",
"description": "React, TypeScript, современная вёрстка",
"ctaFill.text": "Связаться"
}
}
Блок создаётся со значениями по умолчанию, поверх которых накладывается fields. Ответ содержит id, order и актуальные fields.
Ключи для нового блока заранее видны в variants[].fields ответа list_block_types. Если ключ не подошёл, ошибка перечислит доступные поля этого блока.
update_block_content
Меняет тексты и переключатели существующего блока. Аргументы: blockId и fields. Передаются только изменяемые ключи, остальное состояние блока сохраняется.
Неизвестный ключ вернёт ошибку с его именем — сверьтесь с list_project_blocks. Поля оформления отдельного блока (style.*) через MCP не меняются: цвета и шрифты задаются через update_theme, а точечные правки — CSS в блоке customStyles.
set_block_sharing
Включает или снимает у блока главной страницы показ на всех страницах сайта. Аргументы: blockId, sharedAcrossPages и необязательный sharedPosition (before | after).
Инструмент работает только с блоками главной: у блока подстраницы вернётся ошибка. Пригодится, когда меню или футер уже созданы отдельно на каждой странице и их нужно свести к одному экземпляру.
delete_block
Удаляет блок главной или подстраницы по blockId. Порядок оставшихся блоков пересчитывается автоматически.
reorder_blocks
Задаёт порядок блоков. Аргументы: проект, необязательная подстраница и blockIds — все id выбранной страницы в нужной последовательности, без повторов и пропусков. Иначе инструмент вернёт ошибку и порядок не изменится.
Общие блоки на всех страницах
Блок главной страницы с sharedAcrossPages: true рендерится и на подстраницах: sharedPosition: "before" ставит его сверху (меню, header), "after" — снизу (футер). Так меню и футер живут в одном экземпляре: правка через update_block_content меняет их на всём сайте сразу.
Тот же приём работает для блока customStyles — один CSS применяется ко всем страницам.
Флаг доступен только блокам главной. add_block с sharedAcrossPages: true и заданной подстраницей вернёт ошибку, а уже созданный блок главной переключается через set_block_sharing.
Единое оформление сайта
Цельный вид даёт тема проекта, а не настройки отдельных секций:
update_theme— цвета, шрифты, базовый размер текста и соцпревью на весь сайт.- Блок
customStyles(потокutility, полеcss) — точечные правки, которых нет в теме. add_blockсsharedAcrossPages: trueдля этого блока — CSS действует на всех страницах.
В CSS опирайтесь на переменные темы, чтобы стили не расходились с настройками проекта: --theme-text, --theme-secondary-text, --theme-background, --theme-accent, --theme-font-family, --theme-heading-font.
.section-title {
font-family: var(--theme-heading-font);
letter-spacing: -0.02em;
}
Границы работы с блоками
- Главная и обычные подстраницы доступны через одни block-инструменты; для подстраницы передавайте
pageId. - Попапы и шаблоны блога пока редактирует человек.
- Длина списков фиксирована шаблоном блока:
fieldsменяет существующие строки (items[0],items[1]), а добавление и удаление строк делается в редакторе. Если элементов нужно больше, чем в шаблоне, добавьте второй блок того же семейства. - Загрузка файлов недоступна: изображения задаются URL в полях вида
image.url. - Отступы и типографику отдельной секции настраивает человек в редакторе: у агента есть тема проекта и блок
customStyles. - Добавление блоков сайт не публикует: публикация — отдельный вызов
publish_projectпо просьбе пользователя.
Рекомендуемый сценарий для AI
- Вызвать
whoami. - Вызвать
get_product_guide. - Вызвать
list_projects. - Уточнить название, клиента и назначение нового сайта, если они не указаны.
- Вызвать
create_projectодин раз. - Задать оформление через
update_themeдо сборки секций. - Для многостраничного сайта создать подстраницы через
create_page. - Вызвать
list_block_typesи выбрать макеты под структуру каждой страницы. - Вызвать
add_blockпо одной секции сверху вниз; для подстраниц передаватьpageId. - Меню, футер и
customStylesдобавить на главную сsharedAcrossPages: true. - Вызвать
list_project_blocksотдельно для главной и каждой подстраницы. - Поправить содержимое через
update_block_content, порядок — черезreorder_blocks/reorder_pages. - Вернуть пользователю preview/editor URL и спросить, публиковать ли сайт.
- После подтверждения вызвать
publish_projectи вернуть публичный URL.
Ошибки подключения
401 Unauthorized
Токен отсутствует, повреждён или истёк. Выпустите новый в Настройки → MCP для AI и замените значение целиком, включая префикс Bearer.
Сервер не появляется в Cursor
Проверьте:
- URL равен
https://gensite.ru/api/mcp; - конфигурация содержит поле
url, а не локальныеcommandиargs; - заголовок называется
Authorization; - значение начинается с
Bearerи содержит один пробел; - JSON не содержит комментариев и завершающих запятых.
Агент видит не тот аккаунт
Вызовите whoami. Затем выпустите токен, находясь в нужном аккаунте, и замените конфигурацию MCP.
Токен работал, а затем перестал
Срок действия — 30 дней. Выпустите новый токен. Повторный деплой Gensite или перезапуск PM2 для этого не нужен.
Проект создан, но страница пустая
create_project создаёт только черновик. Блоки добавляются отдельными вызовами add_block. Если агент сообщает, что «редактор не применяет блоки», проверьте по его логу, вызывал ли он add_block: попытки кликать в интерфейс браузером к MCP не относятся.
Неизвестный тип блока
type не найден в реестре. Возьмите значение из variants[].type в ответе list_block_types, например cover__cover_1, а не название семейства.
У блока нет поля …
Ключ отсутствует в состоянии блока. Текст ошибки перечисляет доступные поля; их же отдают variants[].fields в list_block_types и fields в list_project_blocks. Частая причина — ключ из другого семейства: у обложки заголовок называется title, а у каталога — header.title.
Прямой HTTP API
MCP — рекомендуемый способ дать AI типизированные инструменты и инструкции. Если агент или интеграция не поддерживает MCP, подключите OpenAPI https://gensite.ru/api/v1/openapi.json и работайте с базовым URL https://gensite.ru/api/v1 тем же Bearer-токеном.
Полные форматы регистрации, логина, проектов, страниц, блоков и темы описаны в статье HTTP API v1.
Если клиент не умеет URL
Для продакшена нужен клиент с поддержкой удалённого Streamable HTTP MCP. Локальный mcp/server.ts остаётся только инструментом разработки Gensite и не требуется пользователям продукта.