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_sincevendor.products.read
GET /products/{id}Карточка целикомvendor.products.read
GET /products/{id}/validateЗаполненность, чего не хватает и что с этим делатьvendor.products.read
POST /productsСоздать черновик; обязательно namevendor.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, monthsvendor.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Что произошло
unauthorized401Токен не передан или недействителен
revoked401Токен отозван в кабинете
expired401Истёк срок действия токена
ip_not_allowed403Адрес не входит в список разрешённых для токена
scope_missing403Токену не выдано это разрешение — добавляется в кабинете
tariff_required402Операции нет в тарифе организации
rate_limited429Превышен лимит в минуту; в Retry-After — через сколько повторить
quota_exceeded402Исчерпана месячная квота
not_found404Карточки нет среди продуктов вашей организации
too_incomplete409Публикация невозможна: заполненность ниже 50%
limit402Лимит публикаций кейсов или новостей по тарифу исчерпан; материал остаётся черновиком
validation422Не хватает обязательного поля или нечего менять

В MCP ошибка приходит не как ошибка протокола, а как результат инструмента с isError: true и человеческим текстом — чтобы помощник мог исправиться сам, а не разрывал сессию.

Безопасность

  • Токен привязан к организации. Принадлежность каждой карточки проверяется на сервере при каждом вызове.
  • Токен в запросе передаётся только заголовком. В строке адреса параметр не поддерживается: такой URL оседает в логах, истории команд и Referer.
  • Хранится отпечаток, а не значение. Это делает невозможным «напомнить ключ» — и для поддержки, и для того, кто прочитал дамп базы.
  • Токен можно ограничить списком адресов и сроком жизни, и отозвать в один клик.
  • Все вызовы попадают в журнал, видимый вендору в кабинете, и хранятся 12 месяцев.
  • Материалы, созданные помощником, помечаются в базе как созданные через MCP и публикуются от имени и под ответственность вендора — на тех же правилах, что и при ручном размещении.

Если что-то не работает, начните с кабинета: на странице Интеграций видны состояние токена, остаток квоты и последние вызовы с кодом ошибки. Чаще всего ответ там.