Получение доступа MCP-агентом

Эта страница описывает только создание agent account и получение первого Bearer-токена. После этого агент работает не через эти endpoints, а через обычные ERP-методы, перечисленные в разделе «MCP: как агент работает с Gigma ERP».

Agent account не может войти по одноразовому паролю:

POST /api/send_password
POST /api/login

Для пользователя с is_agent = true оба метода возвращают 403.

Полный self-service flow

1. MCP-клиент создаёт access request
2. Gigma отправляет владельцу письмо
3. Владелец просматривает и подтверждает permissions
4. MCP-клиент опрашивает status
5. После approved один раз вызывает consume
6. Backend создаёт agent account и возвращает Agent Token
7. MCP-сервер сохраняет токен как секрет и переходит к обычным ERP endpoints

Access request живёт 30 минут. Возможные состояния:

СтатусЗначение
pendingожидается решение владельца
approvedможно выполнить consume
declinedвладелец отказал
expiredTTL истёк
consumedagent account и первый токен уже созданы

1. Создать запрос

Создание запроса доступа

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests
Авторизация
Не требуется
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
201

Параметры запроса

  • owner_email (string, обязательно) — e-mail владельца или уполномоченного администратора проекта, до 255 символов;
  • agent_name (string, обязательно) — понятное имя агента, от 1 до 255 символов;
  • agent_login (string, необязательно) — уникальный технический login, от 3 до 255 символов;
  • permissions (string[], необязательно) — до 100 существующих permissions с guard_name = user;
  • purpose (string, необязательно) — назначение агента, до 5000 символов.

project_id и role_id клиент не передаёт.

Пример запроса

{
	"owner_email": "owner@example.com",
	"agent_name": "MCP Order Assistant",
	"agent_login": "mcp-order-assistant",
	"permissions": [
		"view-orders",
		"view-counterparties"
	],
	"purpose": "Читать заказы и готовить сводки"
}

Ответ

{
	"message": "Если такой администратор есть, мы отправили запрос.",
	"request": {
		"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
		"request_token": "<request_token>",
		"expires_at": "2026-08-16T16:30:00+00:00"
	}
}

Сохраните public_id и request_token сразу. request_token показывается клиенту в этом ответе и используется для status и consume.

Ответ намеренно нейтрален: он не раскрывает, существует ли owner_email и имеет ли пользователь право подтверждать запрос.

Backend ограничивает отправку approval-письма одному владельцу: не чаще одного письма за 10 минут. Новый access request при этом всё равно может получить 201, но письмо для него не будет отправлено. Не создавайте запросы повторно сразу после успешного ответа.

2. Открыть страницу подтверждения

Страница подтверждения для владельца

Метод
GET
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review
Авторизация
Не требуется
Headers
Accept: text/html
Успешный ответ
200

Параметры пути

  • publicId (string, обязательно) — публичный UUID запроса из ответа создания.

Пример запроса

GET /api/agent-access-requests/3f48862d-516d-4c7b-b486-9b7bb205f920/review
Accept: text/html

Ответ

Backend возвращает HTML-страницу подтверждения. Ссылка из письма содержит секрет во fragment:

https://api.gigma.ru/api/agent-access-requests/{publicId}/review#approval_token=<secret>

Fragment не отправляется серверу в URL. Страница читает approval_token, удаляет его из адресной строки и передаёт дальше только в JSON body.

3. Получить данные запроса

Получение данных для review

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/review
Авторизация
Approval token из письма
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • approval_token (string, обязательно) — секрет из fragment ссылки подтверждения.

approval_token запрещено передавать в query string. Backend вернёт 422.

Пример запроса

{
	"approval_token": "<approval_token>"
}

Ответ

{
	"status": "pending",
	"request": {
		"public_id": "3f48862d-516d-4c7b-b486-9b7bb205f920",
		"agent_name": "MCP Order Assistant",
		"agent_login": "mcp-order-assistant",
		"role": {
			"id": 14,
			"name": "employee"
		},
		"requested_permissions": [
			"view-orders",
			"view-counterparties"
		],
		"approved_permissions": null,
		"purpose": "Читать заказы и готовить сводки",
		"expires_at": "2026-08-16T16:30:00+00:00"
	}
}

4. Одобрить или отклонить

Подтверждать доступ может только незаблокированный человек текущего проекта:

  • owner или admin;
  • либо пользователь с edit-admins;
  • либо пользователь с edit-permissions.

Agent account подтверждать запрос не может.

Одобрение доступа

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/approve
Авторизация
Approval token из письма
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • approval_token (string, обязательно) — секрет подтверждения;
  • permissions (string[], необязательно) — итоговое подмножество первоначально запрошенных permissions.

Если permissions не переданы, backend пытается одобрить весь requested-набор. Недоступные права не отбрасываются автоматически: запрос вернёт 422.

Во время approve backend выбирает роль проекта:

  1. employee;
  2. если её нет — legacy employer.

Если подходящей роли нет или подтверждающий пользователь не может её назначить, backend возвращает 422.

Пример запроса

{
	"approval_token": "<approval_token>",
	"permissions": [
		"view-orders"
	]
}

Ответ

{
	"status": "approved",
	"message": "Доступ одобрен. Агент может забрать токен."
}

Отклонение доступа

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/decline
Авторизация
Approval token из письма
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • approval_token (string, обязательно) — секрет подтверждения.

Пример запроса

{
	"approval_token": "<approval_token>"
}

Ответ

{
	"status": "declined",
	"message": "Запрос доступа отклонён."
}

5. Проверить статус

Статус запроса доступа

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/status
Авторизация
Request token MCP-клиента
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • request_token (string, обязательно) — секрет, полученный при создании access request.

request_token передаётся только в JSON body. Query string отклоняется с 422.

Пример запроса

{
	"request_token": "<request_token>"
}

Ответ

{
	"status": "approved",
	"expires_at": "2026-08-16T16:30:00+00:00",
	"server_time": "2026-08-16T16:05:12+00:00"
}

Polling:

  • используйте интервал не меньше 3–5 секунд;
  • применяйте backoff после 429;
  • после approved переходите к consume;
  • остановитесь после declined, expired или consumed.

6. Один раз получить Agent Token

Создание агента и получение первого токена

Метод
POST
URL
https://api.gigma.ru/api/agent-access-requests/{publicId}/consume
Авторизация
Request token MCP-клиента
Headers
Accept: application/json; Content-Type: application/json
Успешный ответ
200

Параметры запроса

  • request_token (string, обязательно) — секрет, полученный при создании access request.

Вызывайте endpoint только после статуса approved.

Пример запроса

{
	"request_token": "<request_token>"
}

Ответ

Первый успешный ответ:

{
	"status": "consumed",
	"agent": {
		"id": 214,
		"name": "MCP Order Assistant",
		"login": "mcp-order-assistant"
	},
	"agent_token": {
		"id": 901,
		"name": "mcp-self-service",
		"value": "<agent_bearer>",
		"expires_at": "2027-08-16T16:05:20+00:00"
	}
}

agent_token.value показывается только в этом ответе. Сохраните его в secret storage до завершения операции.

Повторный consume не возвращает секрет:

{
	"status": "consumed",
	"already_consumed": true
}

Backend окончательно проверяет уникальность agent_login именно во время consume. Если login уже занят, ответ — 409; изменить login в одобренном request нельзя, нужен новый запрос.

Перед созданием агента backend повторно проверяет, что владелец всё ещё активен, имеет право подтверждать доступ и остаётся в том же проекте. После временного 403 или project conflict тот же одобренный request можно повторить после устранения причины, пока не истёк общий 30-минутный TTL.

Текущие route limits

EndpointТекущий limit
POST /api/agent-access-requests5/min
GET /api/agent-access-requests/{publicId}/review30/min
POST /api/agent-access-requests/{publicId}/review30/min
POST /api/agent-access-requests/{publicId}/approve10/min
POST /api/agent-access-requests/{publicId}/decline10/min
POST /api/agent-access-requests/{publicId}/status30/min
POST /api/agent-access-requests/{publicId}/consume10/min

Это текущая runtime-конфигурация routes, а не бессрочное продуктовое обещание. Клиент обязан обрабатывать 429, учитывать Retry-After, если заголовок присутствует, и не дублировать write-запрос вслепую.

После consume

  1. Сохраните agent_token.value как секрет.
  2. Выполните GET /api/user.
  3. Сверьте фактическую роль, филиал и permissions.
  4. Включите только заранее определённый allowlist tools.
  5. Перейдите к обычным ERP endpoints из раздела «MCP: как агент работает с Gigma ERP».

Если первый Bearer потерян, восстановить его нельзя. Сотрудник с manage-agent-tokens должен выпустить новый токен через /api/agents/{agent}/tokens.

© 2026 Gigma