MCP и вендорский API
Программный доступ вендора к собственным карточкам на Platforms.su. Один и тот же набор операций доступен двумя способами: как инструменты MCP для ИИ-клиента и как обычный REST для скриптов.
Подключение
1. Токен
Кабинет → Профиль → Интеграции → «Выпустить токен».
Значение вида plsu_v1_… показывается один раз: в базе хранится только его отпечаток,
и восстановить значение не сможет никто, включая поддержку. Забыли — выпустите новый.
Там же выбираются разрешения. Для первого знакомства оставьте только чтение.
2. Адрес сервера
https://platforms.su/mcp
Транспорт — Streamable HTTP. Авторизация — заголовок Authorization: Bearer <токен>.
Сервер понимает обе актуальные редакции спецификации MCP: 2026-07-28 (без рукопожатия, с
server/discover) и 2025-11-25, 2025-06-18, 2025-03-26 (через initialize).
Версию выбирает клиент, настраивать ничего не нужно. Сессий сервер не хранит: каждый вызов самодостаточен.
3. Конфигурация клиента
Claude Code — одной командой:
claude mcp add --transport http platforms-su https://platforms.su/mcp \
--header "Authorization: Bearer plsu_v1_ваш_токен"
Claude (веб, Desktop, Cowork) — Настройки → Коннекторы → «Добавить свой коннектор»: адрес
https://platforms.su/mcp, заголовок запроса Authorization со значением
Bearer plsu_v1_ваш_токен. Заголовки запроса в коннекторах Claude — бета-возможность;
в организации коннектор добавляет администратор, и токен тогда общий для всех её участников.
Cursor и другие клиенты с файлом mcp.json:
{
"mcpServers": {
"platforms-su": {
"url": "https://platforms.su/mcp",
"headers": {
"Authorization": "Bearer plsu_v1_ваш_токен"
}
}
}
}
Для .mcp.json проекта Claude Code добавьте в блок "type": "http".
Клиенты, которые умеют только локальные (stdio) серверы, подключаются через мост mcp-remote:
{
"mcpServers": {
"platforms-su": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://platforms.su/mcp",
"--header", "Authorization:${PLSU_AUTH}"],
"env": { "PLSU_AUTH": "Bearer plsu_v1_ваш_токен" }
}
}
}
Если токен ограничен списком IP, учтите, откуда ходит клиент. Локальный клиент (Claude Code, Cursor,
mcp-remote) обращается с адреса вашего компьютера. Облачный клиент — с адресов своего сервиса:
коннекторы Claude ходят из подсети 160.79.104.0/21, её можно указать целиком.
4. Проверка
Если клиент подключился, он увидит инструменты. Проверить руками можно так:
curl -s -X POST https://platforms.su/mcp \
-H 'Authorization: Bearer plsu_v1_ваш_токен' \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Инструменты
Набор зависит от уровня тарифа: клиент видит только то, что действительно может вызвать.
get_account_info — Сведения об организации и доступе
Какая организация стоит за этим токеном, какой у неё тариф, какой уровень ИИ-управления карточками и сколько вызовов осталось в месячной квоте. Вызывайте первым, если не знаете контекста.
list_my_products — Список карточек продуктов
Карточки продуктов организации на Platforms.su: название, статус, версия и процент заполненности. С этого начинают, когда нужно понять, что вообще размещено.
query,
status,
limit,
page
get_product — Карточка продукта целиком
Все заполненные поля одной карточки: описания, ссылки, версия, категории, отрасли, признаки API и SaaS. Нужен перед правкой, чтобы не затереть то, что уже написано.
product_id*
validate_product — Проверить заполненность карточки
Проверяет карточку по тем же восьми пунктам, что и каталог, и возвращает процент заполненности, список недостающего и что именно для этого нужно сделать. Используйте перед публикацией и когда вендор спрашивает, что улучшить.
product_id*
create_product_draft — Создать черновик карточки
Создаёт новую карточку продукта в статусе черновика. Обязательно только название. В каталоге черновик не показывается: публикация — отдельным вызовом publish_product после проверки.
name*,
short_name,
description,
content,
parameters_description,
version,
license,
website,
demo_url,
trial_url,
documentation_url,
purchase_url,
support_email,
compatibility_notes,
has_api,
has_saas,
has_mobile_version,
meta_title,
meta_description
update_product_draft — Изменить поля карточки
Меняет переданные поля карточки. Не переданные поля остаются как были. Статус карточки этот инструмент не меняет: опубликованная останется опубликованной, черновик — черновиком.
product_id*,
name,
short_name,
description,
content,
parameters_description,
version,
license,
website,
demo_url,
trial_url,
documentation_url,
purchase_url,
support_email,
compatibility_notes,
has_api,
has_saas,
has_mobile_version,
meta_title,
meta_description
list_my_cases — Кейсы внедрения
Кейсы, размещённые вашей организацией, и кейсы других авторов, где участвует ваш продукт. У каждого отмечено, ваш ли он: менять можно только свои.
status,
limit,
page
get_case — Кейс целиком
Полный текст кейса: заказчик, задача, решение, результаты, продукты.
case_id*
create_case_draft — Создать черновик кейса
Создаёт кейс внедрения черновиком. Обязательны: название, описание, заказчик, подборка. Привязать можно только продукты вашей организации. Публикация — publish_case, в пределах лимита кейсов по тарифу.
name*,
company_name*,
customer_inn,
description*,
problem,
goals,
task,
results,
cost,
time_install,
link,
product_ids,
category_id*
update_case_draft — Изменить кейс
Меняет переданные поля кейса, размещённого вашей организацией. Статус не меняет. product_ids, если передан, заменяет список продуктов целиком.
case_id*,
name,
company_name,
customer_inn,
description,
problem,
goals,
task,
results,
cost,
time_install,
link,
product_ids
publish_case — Опубликовать кейс
Публикует кейс, если тариф позволяет (лимит кейсов за период). Если лимит исчерпан — кейс остаётся черновиком, в ответе сказано почему. Спросите подтверждение перед вызовом.
case_id*
list_my_news — Новости организации
Новости и статьи, размещённые вашей организацией.
status,
limit
create_news_draft — Создать черновик новости
Создаёт новость черновиком. Нужны заголовок и текст (допустим простой HTML). Публикация — publish_news, в пределах лимита новостей по тарифу.
title*,
content*,
source_url,
source_name,
product_ids
update_news_draft — Изменить новость
Меняет заголовок, текст или ссылку на первоисточник новости вашей организации. Статус не меняет.
news_id*,
title,
content,
source_url,
source_name,
product_ids
publish_news — Опубликовать новость
Публикует новость, если тариф позволяет. Если лимит исчерпан или новости не входят в тариф — остаётся черновиком, в ответе сказано почему. Спросите подтверждение перед вызовом.
news_id*
get_product_stats — Статистика карточек
Просмотры карточек и переходы на сайт вендора по месяцам, плюс число заявок за период. Без product_id — сумма по всем карточкам организации. Роботы и краулеры отсеяны.
product_id,
months
batch_update_products — Пакетная правка карточек
Меняет поля сразу у нескольких карточек: items — массив объектов {product_id, …поля как в update_product_draft}. Элементы независимы, итог по каждому возвращается отдельно. Размер пачки ограничен тарифом.
items*
publish_product — Опубликовать карточку
Публикует карточку в каталоге. Требует заполненности не ниже 50%: если меньше, вернётся список недостающего. Публикация видна всем посетителям, поэтому спросите подтверждение у пользователя перед вызовом.
product_id*
Чего в наборе нет и не будет: удаления карточек, смены тарифа и платёжных реквизитов, управления ролями, загрузки изображений и записи произвольного HTML на страницу продукта. Инструмент, которого нет, нельзя вызвать ни по ошибке, ни по подсказке из постороннего текста, попавшего в контекст агента.
REST API
Те же операции без MCP — для скриптов и CI. База: https://platforms.su/api/v1/vendor,
авторизация тем же токеном.
| Метод и путь | Что делает | Разрешение |
|---|---|---|
GET /me | Организация, тариф, уровень, остаток квот, лимиты публикации | любое |
GET /products | Список карточек; query, status, page, per_page, updated_since | vendor.products.read |
GET /products/{id} | Карточка целиком | vendor.products.read |
GET /products/{id}/validate | Заполненность, чего не хватает и что с этим делать | vendor.products.read |
POST /products | Создать черновик; обязательно name | vendor.products.draft.write |
PATCH /products/{id} | Изменить переданные поля; статус не меняется | vendor.products.draft.write |
POST /products/{id}/publish | Опубликовать; нужна заполненность от 50% | vendor.products.publish |
POST /products/batch | Пакетная правка: {"items": [{"product_id": …, …поля}]}; итог по каждому элементу | vendor.products.batch |
GET /stats | Просмотры и переходы по месяцам, заявки; product_id, months | vendor.analytics.read |
GET /cases, GET /cases/{id} | Свои кейсы и кейсы с вашими продуктами (owned) | vendor.content.read |
POST /cases, PATCH /cases/{id} | Черновик кейса; менять можно только свои | vendor.content.draft.write |
POST /cases/{id}/publish | Опубликовать в пределах лимита кейсов | vendor.content.publish |
GET /news | Новости организации | vendor.content.read |
POST /news, PATCH /news/{id} | Черновик новости | vendor.content.draft.write |
POST /news/{id}/publish | Опубликовать в пределах лимита новостей | vendor.content.publish |
curl -s https://platforms.su/api/v1/vendor/products?per_page=5 \
-H 'Authorization: Bearer plsu_v1_ваш_токен'
Какие поля можно менять
name, short_name, description, content,
parameters_description, version, license, price,
website, demo_url, trial_url, documentation_url,
purchase_url, support_email, compatibility_notes,
has_api, has_saas, has_mobile_version,
meta_title, meta_description, lifecycle_status.
Всё остальное игнорируется молча, а в ответе поле updated перечисляет то, что применилось —
по нему видно, что прошло, а что нет. Ссылки принимаются только с http:// и https://.
Категории, отрасли, опции, версии, тарифы, обложка и галерея меняются в кабинете.
Лимиты и квоты
| Уровень | В минуту | Записей в минуту | В месяц | Токенов |
|---|---|---|---|---|
| MCP Basic | 20 | 5 | 3 000 | 1 |
| MCP Management | 60 | 15 | 15 000 | 3 |
| MCP Automation | 120 | 30 | 60 000 | 10 |
| MCP Enterprise | 300 | 60 | 250 000 | 50 |
Квоты считаются по организации, а не по токену: второй токен лимит не удваивает.
Месячная квота обнуляется первого числа. Остаток приходит в заголовках
X-Vendor-Quota-Remaining и X-Vendor-Rate-Limit.
Ошибки
| Код | HTTP | Что произошло |
|---|---|---|
unauthorized | 401 | Токен не передан или недействителен |
revoked | 401 | Токен отозван в кабинете |
expired | 401 | Истёк срок действия токена |
ip_not_allowed | 403 | Адрес не входит в список разрешённых для токена |
scope_missing | 403 | Токену не выдано это разрешение — добавляется в кабинете |
tariff_required | 402 | Операции нет в тарифе организации |
rate_limited | 429 | Превышен лимит в минуту; в Retry-After — через сколько повторить |
quota_exceeded | 402 | Исчерпана месячная квота |
not_found | 404 | Карточки нет среди продуктов вашей организации |
too_incomplete | 409 | Публикация невозможна: заполненность ниже 50% |
limit | 402 | Лимит публикаций кейсов или новостей по тарифу исчерпан; материал остаётся черновиком |
validation | 422 | Не хватает обязательного поля или нечего менять |
В MCP ошибка приходит не как ошибка протокола, а как результат инструмента с isError: true
и человеческим текстом — чтобы помощник мог исправиться сам, а не разрывал сессию.
Безопасность
- Токен привязан к организации. Принадлежность каждой карточки проверяется на сервере при каждом вызове.
- Токен в запросе передаётся только заголовком. В строке адреса параметр не поддерживается: такой URL оседает в логах, истории команд и Referer.
- Хранится отпечаток, а не значение. Это делает невозможным «напомнить ключ» — и для поддержки, и для того, кто прочитал дамп базы.
- Токен можно ограничить списком адресов и сроком жизни, и отозвать в один клик.
- Все вызовы попадают в журнал, видимый вендору в кабинете, и хранятся 12 месяцев.
- Материалы, созданные помощником, помечаются в базе как созданные через MCP и публикуются от имени и под ответственность вендора — на тех же правилах, что и при ручном размещении.
Если что-то не работает, начните с кабинета: на странице Интеграций видны состояние токена, остаток квоты и последние вызовы с кодом ошибки. Чаще всего ответ там.