MCP-сервер — функциональность на стадии Preview. Набор инструментов и API могут измениться в следующих выпусках без сохранения обратной совместимости.
MCP-сервер — компонент Deckhouse Development Portal (DDP, портала), который реализует протокол MCP (Model Context Protocol) и обеспечивает взаимодействие внешних AI-клиентов (таких как LM Studio, Claude Desktop и других) с порталом. Сервер работает по JSON-RPC 2.0 и предоставляет набор инструментов для работы с ресурсами портала и проксирования запросов во внешние инфраструктурные сервисы.
MCP — это открытый протокол для взаимодействия AI-моделей с внешними системами. Подробнее о протоколе можно узнать на официальном сайте MCP.
Все инструменты портала и подключённых серверов доступны через MCP-коллекции, к которым у пользователя есть доступ. Настройка MCP-серверов, пользовательских MCP-инструментов и коллекций выполняется в разделе «Управление MCP».
Доступные инструменты
Инструменты портала включают операции API и специализированные инструменты с префиксом curated_. Любой инструмент требует включения в доступную пользователю MCP-коллекцию. Инструменты типа external доступны после синхронизации каталога MCP-сервера и добавления инструментов в MCP-коллекцию. Инструменты типа custom создаются вручную в подразделе «MCP-инструменты» и доступны после добавления в MCP-коллекцию.
Названия инструментов
В MCP-клиенте используйте название из tools/list. Платформенный агент и OpenCode рабочего пространства показывают модели те же инструменты с дополнительным префиксом ddp_. При настройке коллекции выбирайте название без этого префикса:
| Назначение | MCP-клиент и каталог коллекций | Название для модели агента |
|---|---|---|
| Операция API | get_resources | ddp_get_resources |
| Обозреватель каталога | query_catalog | ddp_query_catalog |
| Специализированный запуск процесса | curated_run_process | ddp_curated_run_process |
| Чтение навыка | curated_get_skill | ddp_curated_get_skill |
Ниже приведены названия для MCP-клиента и каталога коллекций. В инструкциях платформенному агенту добавляйте ddp_; внешний агент может задавать собственное представление названий для модели.
Инструменты операций API
В «AI» → «MCP» → «Каталог» отображаются названия инструментов, например get_resources и get_resource_entities, их описания и соответствующие HTTP-методы и пути API. По нажатию на название инструмента открывается схема его аргументов. Инструменты объединены в группы, например «Каталог», «Обозреватель каталога», «Действия», «Процессы и автоматизации» и «Рабочие пространства». Специализированные инструменты находятся в группе «Курируемые».
Аргументы инструмента описаны в inputSchema ответа tools/list. Например, run_process — операция API, а curated_run_process — специализированный инструмент с параметрами, описанными ниже. Их аргументы различаются.
Результат инструмента операции содержит HTTP-статус, тип содержимого, способ кодирования и тело ответа. Например:
{
"status": 200,
"contentType": "application/json; charset=utf-8",
"encoding": "json",
"body": []
}Для JSON тело передаётся как JSON. Для остальных форматов используется encoding: "base64". Неуспешный вызов возвращает MCP-результат с isError: true; ошибки «Обозревателя каталога» также поясняют, как исправить запрос.
Инструменты работы с каталогом
Инструменты группы «Обозреватель каталога» ищут и подсчитывают сущности, получают схему свойств и граф связей, разбирают запуски процессов и проверяют готовность запуска. Все эти инструменты только читают данные; проверка готовности не запускает процесс.
Результаты и счётчики ограничены доступными пользователю данными. Если видна хотя бы одна сущность, инструменты также показывают схему её ресурса для запросов по свойствам. Обход связей не проходит через недоступные сущности.
В каталоге коллекций и внешнем MCP-клиенте используются следующие названия. Для модели платформенного агента и OpenCode к ним добавляется ddp_, например ddp_query_catalog:
| Инструмент | Назначение |
|---|---|
describe_me | Текущий пользователь, команды, роли, разрешения, время и часовой пояс |
get_catalog_schema | Видимые ресурсы, свойства и типы связей; с resource — подробности одного ресурса |
search_catalog | Поиск ресурсов, команд и сущностей по словам |
query_catalog | Фильтрация, подсчёт и группировка сущностей |
get_entity_summary | Карточка сущности со свойствами, проверками, связями и последними запусками |
get_entity_relation_graph | Обход связей с глубиной и путём от исходной сущности |
list_process_runs | Поиск, подсчёт и группировка запусков процессов |
get_process_run | Диагностика запуска по событиям текущей попытки: ошибки, подтверждения, повторы и таймеры |
find_operations | Процессы и действия, доступные для чтения и привязанные к ресурсу сущности |
check_process_readiness | Проверка параметров и условий запуска процесса без выполнения |
Описание и точные аргументы доступны в «AI» → «MCP» → «Каталог» и в inputSchema ответа tools/list.
Следующие примеры показывают объект params для tools/call. При передаче тела запроса API используйте аргумент body. Сначала вызовите get_catalog_schema, чтобы узнать существующие идентификаторы ресурсов, свойств и связей. Идентификаторы services и language в примере замените на значения своей установки.
Сущности моих команд
Запрос группирует сервисы команд текущего пользователя по языку разработки:
{
"name": "query_catalog",
"arguments": {
"body": {
"resource": "services",
"where": {"field": "team", "op": "in", "value": {"context": "myTeams"}},
"groupBy": "properties.language"
}
}
}{"context":"myTeams"} подставляет команды вызывающего пользователя. Для фильтра по владельцу используется {"context":"me"}. countOnly: true возвращает количество сущностей без списка; groupBy возвращает группы с их счётчиками. В сгруппированном ответе total — число групп, entities — число найденных сущностей.
Для выборки нескольких условий объедините их в where.and или where.or. Доступны сравнения eq, ne, gt, gte, lt, lte, in, contains, containsAny, isEmpty, isNotEmpty и between; набор зависит от типа поля. Обращение к properties.<идентификатор> требует параметра resource.
Неуспешные запуски за вчера
Запрос выбирает запуски со статусом Failed за предыдущий календарный день в часовом поясе Москвы:
{
"name": "list_process_runs",
"arguments": {
"body": {
"status": ["Failed"],
"team": {"context": "myTeams"},
"since": {"calendar": "day", "offset": -1},
"timezone": "Europe/Moscow",
"limit": 20
}
}
}Для скользящего периода используйте since: {"last":"24h"}. countOnly: true возвращает количество запусков; groupBy группирует их по status, process, initiator, entity или day. Эти два режима не совмещаются. Для диагностики передайте UUID найденного запуска в get_process_run как run_uuid.
В чате портал передаёт часовой пояс браузера. Внешний MCP-клиент задаёт timezone явно; без него используется UTC. Неизвестный часовой пояс отклоняет запрос.
Проверка перед запуском процесса
Перед выполнением используйте последовательность:
- Найдите сущность через
search_catalogи получите доступные операции черезfind_operations. - Передайте UUID ресурса, сущности и процесса в
check_process_readiness. Вbodyукажите значения запуска:selectedProperties,actions,context,skippedElementUuidsиagentProviderRefs, когда они нужны. - Проверьте
ready,blockersиapprovalRequired. Проверка возвращает первое препятствие; исправьте его по подсказке и повторите вызов. Значения по умолчанию здесь не подставляются. - Для выполнения отдельно вызовите операцию API
run_processлибо специализированныйcurated_run_processс его собственной схемой аргументов.
Проверка требует control:processes глобально, на ресурс или сущность. Читаемая операция не обязательно доступна для запуска. Между проверкой и запуском состояние может измениться, поэтому итоговый результат проверяется по ответу запуска.
Ограничения и неполные ответы
При работе со списками учитывайте размер ответа и ограничения запроса:
limitпо умолчанию равен20, максимум —500. ЕслиhasMore: true, продолжайте сoffset, увеличенным наreturned. При ограничении размера ответа строк может быть меньше, чем запрошено.- Для графа связей
depthзадаётся от1до5. Приtruncated: trueследуйтеhints: уточните тип связи, глубину или лимит. Граф не поддерживаетoffset. - Дерево
whereдопускает до четырёх уровней вложенности и 20 условий. Если запрос слишком сложен, сузьте выборку или глубину обхода связей. - Карточка
get_entity_summaryсокращает длинные описания и значения. Для полного поля используйтеquery_catalogсfieldsи фильтром по UUID. - Диагностика запуска отмечает недостающие факты в
unknown. Отсутствующее время следующего повтора или событие шага нельзя считать подтверждением ошибки.
При отказе инструмент возвращает isError: true с причиной и подсказкой. Исправьте указанный аргумент, уточните неоднозначную ссылку или уменьшите запрос.
curated_get_external_data
Выполнить HTTP-запрос к внешнему сервису с учётными данными пользователя.
Параметры:
| Название | Тип | Обязательность | Описание |
|---|---|---|---|
external_service_uuid | строка | Да | UUID внешнего сервиса |
query | строка | Да | Описание запроса (например: «получить пайплайны проекта 123») |
api_path | строка | Да | Путь к API с параметрами запроса (например, пагинация) |
method | строка | Нет | HTTP-метод. По умолчанию: GET |
body | строка | Нет | Тело запроса для POST/PUT/PATCH (JSON-строка) |
Учётные данные и заголовки берутся из настроек внешнего сервиса в портале.
Возвращает: результат HTTP-запроса к внешнему сервису.
Пример:
Получи список проектов из внешнего сервиса GitLabcurated_get_processes
Получить список процессов с параметрами запуска.
Параметры:
| Название | Тип | Обязательность | Описание |
|---|---|---|---|
include_step_properties | булево | Нет | Вернуть также задачи процесса, которые принимают собственные значения параметров действия. По умолчанию выключено |
Возвращает: для каждого процесса — UUID, идентификатор, название, описание, ресурсы, параметры запуска (properties) и пути контекста запуска, которые читает процесс (contextPaths). С include_step_properties — также задачи процесса с параметрами действий (steps). Поле contextPathsComplete показывает, учтены ли тела действий при сборе путей; перед подготовкой запуска запросите include_step_properties: true. Схема элементов процесса не возвращается.
Пример:
Получи список процессовcurated_get_service_templates
Получить шаблоны микросервисов из реестра шаблонов.
Параметры:
| Название | Тип | Обязательность | Описание |
|---|---|---|---|
include_all_versions | булево | Нет | Вернуть все синхронизированные версии шаблонов. По умолчанию возвращается только текущая версия |
Возвращает: для каждого шаблона — templateId, version, source, название, описание, язык, признак текущей версии и параметры шаблона (values). Значения templateId, version и source передаются в контекст запуска процесса создания микросервиса как context.template.
Пример:
Получи список заготовок сервисовcurated_run_process
Запустить процесс для сущности.
Параметры:
| Название | Тип | Обязательность | Описание |
|---|---|---|---|
process_uuid | строка | Да | UUID процесса |
entity_uuid | строка | Да | UUID сущности ресурса, к которому привязан процесс |
properties | объект | Да | Параметры запуска процесса: идентификатор параметра → значение. Не переданные параметры получают значения по умолчанию. Если задавать нечего, передайте {} |
context | объект | Нет | Контекст запуска, доступный в шаблонах процесса как .context |
action_properties | объект | Нет | Значения параметров действий задач: UUID задачи → объект «идентификатор параметра → значение». UUID задач и параметры возвращает curated_get_processes с include_step_properties |
skipped_element_uuids | массив | Нет | UUID элементов «AI-агент» и «Шаблон», которые пропускаются в этом запуске |
agent_provider_refs | объект | Нет | AI-провайдеры для элементов «AI-агент»: UUID элемента → название провайдера |
Возвращает: сообщение о запуске и UUID созданного запуска процесса (instanceUUID).
Для сущности одновременно может выполняться только один запуск одного процесса: повторный запуск возвращает ошибку 409.
Для запуска требуется разрешение control:processes на уровне портала, ресурса или сущности.
Пример:
Запусти процесс «Deploy» для сущности «api-gateway» с версией 1.4.0curated_get_process_instance
Получить один запуск процесса с хранилищем.
Параметры:
| Название | Тип | Обязательность | Описание |
|---|---|---|---|
entity_uuid | строка | Да | UUID сущности |
instance_uuid | строка | Да | UUID запуска процесса из get_entity_process_history или из ответа curated_run_process |
wait_seconds | число | Нет | Сколько секунд ждать завершения запуска, не больше 45. Без параметра ответ возвращается сразу |
Возвращает: статус запуска, время, активные элементы и хранилище процесса. Для статусов Failed, Timeout и Partially Completed ответ содержит поле failureReason: элемент, на котором произошла ошибка, итоговое сообщение и последние строки лога этого элемента.
Пример:
Покажи результат экземпляра процесса 3fa85f64-5717-4562-b3fc-2c963f66afa6Навыки
Инструменты чтения навыков передают инструкции и дополнительные файлы:
| Инструмент | Аргументы | Результат |
|---|---|---|
curated_list_skills | Необязательная строка q | Доступные пользователю навыки с описаниями и последними версиями |
curated_get_skill | Обязательный name, необязательный version | Текст SKILL.md, версия и список файлов |
curated_get_skill_file | Обязательные name и path, необязательный version | Текст дополнительного файла |
В обычном MCP-клиенте версия выбирается меткой; без неё используется последняя активная. В запуске агента доступ ограничен назначенными ему навыками и зафиксированными версиями. Бинарные файлы и файлы больше 1 МиБ через curated_get_skill_file не читаются.
Рабочие пространства
Инструменты позволяют подготовить рабочее пространство из чата:
| Инструмент | Аргументы | Результат |
|---|---|---|
curated_get_workspace_templates | Нет | Доступные шаблоны с активной версией, настройками репозитория и параметрами |
curated_create_workspace | Обязательные template_uuid, name, ttl_hours; необязательные provider, repository_url, base_ref, entity_uuid, parameters | Состояние созданного пространства; операция выполняется асинхронно |
curated_get_workspace | Обязательный workspace_uuid, необязательный wait_seconds до 45 | Статус, готовность, последняя ошибка и активная операция |
curated_attach_workspace | Обязательный workspace_uuid | Прикрепление пространства к текущему чату |
provider можно не передавать, когда подходящий провайдер уже задан в контексте чата. При вызове вне такого контекста укажите его явно. parameters — объект значений переменных шаблона; ttl_hours — целое число от 1 до 720.
curated_attach_workspace работает только в контексте агента, отвечающего в чате портала. Используйте последовательность: получить шаблоны, создать пространство, дождаться готовности, прикрепить его к чату.
Подключение MCP-сервера
LM Studio
LM Studio 0.3.17 и новее поддерживает удалённые MCP-серверы. Серверы добавляются в файле mcp.json.
Чтобы подключить LM Studio к MCP-серверу портала:
В портале откройте «Профиль» и создайте API-токен.
В LM Studio откройте вкладку «Program» на правой боковой панели и выберите «Install» → «Edit mcp.json».
Добавьте MCP-сервер портала в объект
mcpServers:{ "mcpServers": { "ddp": { "url": "https://<DOMAIN>/api/v2/mcp", "headers": { "Authorization": "Bearer <API_TOKEN>" } } } }Где:
<DOMAIN>— домен портала;<API_TOKEN>— API-токен портала.
Сохраните файл.
После подключения модель может вызывать встроенные инструменты из раздела «Доступные инструменты» и инструменты из доступных вам MCP-коллекций. Все вызовы выполняются с вашими правами доступа.
Подключение в других MCP-клиентах
MCP-сервер принимает запросы JSON-RPC 2.0 по HTTP. Для подключения клиента используйте следующие параметры:
- URL эндпоинта:
https://<DOMAIN>/api/v2/mcp, где<DOMAIN>— домен портала. - HTTP-метод:
POST. - Аутентификация: заголовок
Authorization: Bearer <API_TOKEN>, где<API_TOKEN>— ваш API-токен портала из раздела «Профиль».
Сервер поддерживает следующие методы JSON-RPC:
initialize— возвращает информацию о сервере и версию протокола2024-11-05;tools/list— возвращает список инструментов, доступных пользователю;tools/call— вызывает инструмент.
Другие методы возвращают ошибку -32601 (Method not found).
Пример запроса к MCP-серверу
HTTP-заголовки:
Authorization: Bearer <API_TOKEN>
Content-Type: application/jsonТело запроса:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_resource_entities",
"arguments": {
"resource_uuid": "<RESOURCE_UUID>"
}
}
}Пример ответа от MCP-сервера
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"status\":200,\"contentType\":\"application/json; charset=utf-8\",\"encoding\":\"json\",\"body\":{\"response\":[],\"error\":null}}"
}
]
}
}Безопасность
Аутентификация:
- Все запросы к MCP-серверу должны проходить аутентификацию с помощью API-токена из раздела «Профиль». Токен передаётся в заголовке
Authorization: Bearer <API_TOKEN>. - Права доступа соответствуют правам вашего пользователя в портале.
Права доступа:
- Инструменты работают с теми же правами, что и пользователь.
curated_run_process,curated_create_workspace,curated_attach_workspaceи изменяющие операции API выполняют действия от имени пользователя.curated_get_external_dataтакже может отправитьPOST,PUT,PATCHилиDELETEво внешний сервис.- Если у вас нет доступа к ресурсу, инструмент вернёт ошибку доступа.
- Данные фильтруются в соответствии с вашими правами RBAC.
Устранение неполадок
Не удаётся подключиться к серверу
Если не получается подключиться к серверу:
- Проверьте правильность URL (должен заканчиваться на
/api/v2/mcp). - Убедитесь, что API-токен действителен.
- Проверьте, что портал доступен с вашего компьютера.
- Проверьте настройки файрвола и прокси.
Ошибка аутентификации
Если не проходит аутентификация:
- Проверьте правильность формата токена.
- Убедитесь, что токен не истёк.
- Убедитесь, что используется заголовок
Authorization: Bearer <API_TOKEN>.
Инструмент возвращает ошибку доступа
Если при обращении к инструменту возвращается ошибка доступа:
- Убедитесь, что у вашего пользователя есть права на доступ к запрашиваемому ресурсу.
- Проверьте правильность названия или идентификатора ресурса.
- Обратитесь к администратору портала для проверки прав доступа.
Данные не возвращаются
Если данные не возвращаются:
- Проверьте правильность параметров запроса.
- Убедитесь, что ресурс существует и содержит сущности.
- Проверьте логи портала для получения подробной информации об ошибке.