16 KiB
Admin API
1. Назначение документа
Этот документ фиксирует целевые HTTP-контракты административного API, через которое UI управляет workspace, operations, agents, machine access и observability.
Для потоковой модели детальные HTTP DTO вынесены отдельно в:
docs/streaming-admin-api.md
2. Общие правила API
- все payload по умолчанию в
JSON; - import/export конфигурации используют
YAML; - все основные ресурсы являются
workspace-scoped; - версии operation и agent адресуются явно;
- published operation и published agent - ссылки на конкретные version;
- ошибки валидации возвращаются отдельно от transport errors.
Базовый префикс:
/api/admin
3. Основные ресурсы
workspacesauthmembershipsinvitationsoperationssecretsauth-profilesagentsagent-keyslogsusagesamplesdescriptorsconfig import/export
4. Workspace-scoped routing
Канонический префикс для UI-driven сценариев:
/api/admin/workspaces/{workspace_id}
5. Группы endpoints
5.0. Build capabilities
GET /api/admin/capabilitiesGET /api/admin/workspaces/{workspace_id}/protocol-capabilities
Контракт:
- endpoint возвращает capability payload текущей сборки;
- payload описывает:
editionsupported_protocolssupported_security_levelsmachine_access_modeslimits
- UI использует этот ответ для edition-aware gating и честного product copy.
GET /protocol-capabilitiesвозвращает только те протоколы и execution capabilities, которые реально доступны в текущей редакции;- для
Communityэто означает только:RESTGraphQLgRPC
5.1. Workspaces and members
GET /api/admin/workspacesPOST /api/admin/workspacesGET /api/admin/workspaces/{workspace_id}PATCH /api/admin/workspaces/{workspace_id}DELETE /api/admin/workspaces/{workspace_id}GET /api/admin/workspaces/{workspace_id}/membersPATCH /api/admin/workspaces/{workspace_id}/members/{user_id}DELETE /api/admin/workspaces/{workspace_id}/members/{user_id}GET /api/admin/workspaces/{workspace_id}/invitationsPOST /api/admin/workspaces/{workspace_id}/invitationsDELETE /api/admin/workspaces/{workspace_id}/invitations/{invitation_id}GET /api/admin/workspaces/{workspace_id}/export
Контракт:
POST /invitationsвозвращает metadata invitation и одноразовыйinvite_token;invite_tokenдоступен только в create-response и не возвращается повторно в list endpoints;PATCH /members/{user_id}меняет роль участника;DELETE /members/{user_id}удаляет участника из workspace;GET /exportвозвращает JSON snapshot workspace lifecycle-данных;DELETE /workspaces/{workspace_id}разрешен толькоowner.
5.2. Auth and session
POST /api/auth/loginPOST /api/auth/logoutGET /api/auth/sessionGET /api/auth/profilePATCH /api/auth/profilePOST /api/auth/current-workspacePOST /api/auth/password
Контракт:
POST /loginпринимаетemailиpassword;- при успешном логине backend выставляет
HttpOnlysession cookie; GET /sessionвозвращает текущего пользователя, memberships иcurrent_workspace_id;GET /profileвозвращает текущего пользователя, memberships иcurrent_workspace_idдля settings UI;PATCH /profileобновляетdisplay_nameиemailтекущего пользователя;POST /current-workspaceпереключает текущий workspace внутри текущей authenticated session;POST /passwordменяет пароль текущего пользователя после проверкиcurrent_password;POST /logoutинвалидирует текущую session.
5.3. Operations
GET /api/admin/workspaces/{workspace_id}/operationsPOST /api/admin/workspaces/{workspace_id}/operationsGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}PATCH /api/admin/workspaces/{workspace_id}/operations/{operation_id}DELETE /api/admin/workspaces/{workspace_id}/operations/{operation_id}POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/versionsGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/versions/{version}POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/publishPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/archivePOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/test-runsGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/exportPOST /api/admin/workspaces/{workspace_id}/operations/import
Контракт дополнительно включает:
- у операции задается обязательный
security_level; - допустимые значения:
standard,elevated,strict; - этот параметр определяет минимально допустимый режим машинного доступа при вызове через MCP.
- если поле не передано, используется
standardдля обратной совместимости с уже существующим YAML и draft payload; - в
Communitybackend принимает только:RESTGraphQLgRPCsecurity_level = standard
- попытка создать, обновить или импортировать операцию с неподдерживаемым
protocolилиsecurity_levelдолжна завершатьсяvalidation_errorеще на сторонеadmin-api, а не только скрываться в UI.
5.4. Samples and descriptors
POST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/samples/input-jsonPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/samples/output-jsonPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/drafts/generatePOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/protoPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/descriptor-setPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/wsdlPOST /api/admin/workspaces/{workspace_id}/operations/{operation_id}/descriptors/xsdGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/grpc/servicesGET /api/admin/workspaces/{workspace_id}/operations/{operation_id}/soap/services
Контракт:
POST /descriptors/wsdlпринимает raw WSDL payload и сохраняет inspection metadata для SOAP;POST /descriptors/xsdпринимает supporting XSD artifacts для SOAP operation;GET /soap/servicesвозвращает нормализованный списокservice -> port -> operationиз последнего WSDL текущего draft version.POST /operations/{operation_id}/test-runsостается единым test-run endpoint дляunary,window,sessionиasync_jobexecution modes;- test-run response всегда возвращает
mode,request_preview,response_preview,errors, а для streaming modes дополняется:windowсwindow_complete,truncated,has_more,cursor;stream_sessionсsession_id,status,expires_at,poll_after_ms,preview;async_jobсjob_id,status,progress.
5.5. Upstream auth profiles
-
GET /api/admin/workspaces/{workspace_id}/secrets -
POST /api/admin/workspaces/{workspace_id}/secrets -
GET /api/admin/workspaces/{workspace_id}/secrets/{secret_id} -
POST /api/admin/workspaces/{workspace_id}/secrets/{secret_id}/rotate -
DELETE /api/admin/workspaces/{workspace_id}/secrets/{secret_id} -
GET /api/admin/workspaces/{workspace_id}/auth-profiles -
POST /api/admin/workspaces/{workspace_id}/auth-profiles -
GET /api/admin/workspaces/{workspace_id}/auth-profiles/{auth_profile_id} -
PATCH /api/admin/workspaces/{workspace_id}/auth-profiles/{auth_profile_id} -
DELETE /api/admin/workspaces/{workspace_id}/auth-profiles/{auth_profile_id}
Контракт:
POST /secretsпринимает metadata и plaintext value, но create-response возвращает только metadata;GET /secretsиGET /secrets/{secret_id}возвращают только metadata,kind,status,current_version,created_at,updated_at,last_used_atпри наличии;POST /secrets/{secret_id}/rotateсоздает новую secret version;DELETE /secrets/{secret_id}отклоняется, если secret все еще используетсяAuthProfile;AuthProfile.configхранит ссылки наsecret_id, а не placeholder-строки${secrets.*}.
5.6. Agents
GET /api/admin/workspaces/{workspace_id}/agentsPOST /api/admin/workspaces/{workspace_id}/agentsGET /api/admin/workspaces/{workspace_id}/agents/{agent_id}PATCH /api/admin/workspaces/{workspace_id}/agents/{agent_id}DELETE /api/admin/workspaces/{workspace_id}/agents/{agent_id}POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/versionsGET /api/admin/workspaces/{workspace_id}/agents/{agent_id}/versions/{version}POST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/publishPOST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/unpublishPOST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/archivePOST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/bindingsDELETE /api/admin/workspaces/{workspace_id}/agents/{agent_id}/bindings/{operation_id}GET /api/admin/workspaces/{workspace_id}/agents/{agent_id}/platform-api-keysPOST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/platform-api-keysPOST /api/admin/workspaces/{workspace_id}/agents/{agent_id}/platform-api-keys/{key_id}/revokeDELETE /api/admin/workspaces/{workspace_id}/agents/{agent_id}/platform-api-keys/{key_id}
Контракт:
POST /agents/{agent_id}/platform-api-keysвозвращает metadata ключа и одноразовыйsecret;- полное значение ключа доступно только в create-response;
- list endpoints возвращают только metadata,
prefix,status,scopes,expires_atиlast_used_at; - в
Communityключ агента является основным машинным credential; - в коммерческих редакциях этот же ключ используется как исходный credential для более строгих токенных режимов.
5.7. Token issuance
Для расширенных редакций платформы:
POST /mcp-auth/v1/tokenPOST /mcp-auth/v1/token/one-time
Контракт:
POST /mcp-auth/v1/tokenвыдает короткоживущий токен доступа для операций уровняelevated;POST /mcp-auth/v1/token/one-timeвыдает одноразовый токен для операций уровняstrict;- открытая редакция работает только со статическим ключом агента и не обязана реализовывать эти конечные точки;
- детальная схема уровней и режимов доступа зафиксирована в
docs/agent-auth-model.md.
JSON payloads:
-
POST /mcp-auth/v1/token- request:
grant_type:agent_key | refresh_tokenagent_key?refresh_token?scope[]
- response:
access_tokentoken_typeexpires_inrefresh_token?machine_access_modesecurity_levelagent_id
- request:
-
POST /mcp-auth/v1/token/one-time- request:
agent_keyoperation_idscope[]
- response:
access_tokentoken_typeexpires_inmachine_access_modesecurity_levelagent_id
- request:
Community behavior:
- открытая редакция публикует эти конечные точки как stable public contract;
- в Community вызовы возвращают
403 forbiddenс structurederror.context, где явно указаны:editionmachine_access_modeupgrade_required
- private реализация short-lived и one-time token service подключается без изменения публичного HTTP surface.
5.8. Observability
GET /api/admin/workspaces/{workspace_id}/logsGET /api/admin/workspaces/{workspace_id}/logs/{log_id}GET /api/admin/workspaces/{workspace_id}/usageGET /api/admin/workspaces/{workspace_id}/usage/operations/{operation_id}GET /api/admin/workspaces/{workspace_id}/usage/agents/{agent_id}
Контракт:
GET /logsподдерживаетlevel,search,source,operation_id,agent_id,period,limit;periodиспользует UI-friendly значения30m,1h,6h,24h,7d,30d,90d,this_month;sourceразличаетadmin_test_runиagent_tool_call;GET /usageвозвращаетsummary,timeline,operations,agentsодним ответом;- detail endpoints по operation и agent возвращают rollup для выбранного периода.
6. Page-to-endpoint mapping
Operations catalog
Нужны:
- список операций;
- удаление операции;
- edit/open operation;
- publish/archive;
- usage summary для карточек и фильтров.
Wizard
Нужны:
- create/update version;
- test run;
- samples;
- draft generation;
- gRPC descriptor upload и discovery.
- upstream auth selector;
- quick-create secret / auth profile modal.
- execution mode selector;
- streaming config blocks, stream test-runs и tool family preview только там, где это разрешает capability model редакции;
Детальные DTO и response shapes для экранов Operations и Wizard зафиксированы отдельно в:
docs/operations-workspace-contracts.md
Agents
Нужны:
- CRUD агентов;
- bindings к operations;
- publish agent;
- выдача MCP endpoint metadata.
API Keys
Нужны:
- list/create/revoke/delete agent keys;
- one-time reveal значения ключа при создании;
- для расширенных редакций — выдача короткоживущих и одноразовых токенов.
Secrets
Нужны:
- list/create/rotate/delete upstream secrets;
- metadata-only retrieval после создания;
- связь с auth profiles;
- usage references, чтобы оператор видел, где секрет используется.
Logs
Нужны:
- list logs с фильтрами;
- log detail;
- polling или live refresh strategy.
Usage
Нужны:
- агрегаты по периодам;
- breakdown по operation;
- breakdown по agent;
- CSV export.
Текущая реализация:
- summary и breakdown считаются по
invocation_logs; - materialized
usage_rollupsостаются совместимым storage-слоем для дальнейшей оптимизации, но не являются единственным source of truth в MVP.
7. Принцип совместимости
Если UI расходится с текущим backend, приоритет отдается целевой продуктовой модели, но конфликт должен быть явно разобран в docs/as-is-to-be.md до начала реализации.