diff --git a/README.md b/README.md index b5a6400..6390605 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ |---|---|---| | Браузер | cookie-сессия gnexus-auth (`/auth/login` → PKCE → callback) | `GHARD_AUTH_CLIENT_ID` задан | | Скрипты, MCP | `Authorization: Bearer ` | `GHARD_ADMIN_TOKEN` задан | +| ИИ-агенты | `Authorization: Bearer mcp_…` — персональный ключ, выдаётся на странице «MCP-ключи» | вход в panel + таблица `mcp_tokens` | | Агент (`hard-monitor`) | заголовок `X-Server-Key: ghm_…` (только ingest своего сервера) | ключ сервера в БД панели | Если все три выключены — панель полностью открыта (личный режим). @@ -270,6 +271,11 @@ сервисы, по убыванию; 1..1000) - `GET/PATCH /api/v1/me` — профиль + язык (GET), override языка (PATCH; только cookie-сессия — у Bearer-админа нет личности) +- `GET/POST /api/v1/me/mcp_tokens`, `POST /api/v1/me/mcp_tokens/{id}/revoke` — + персональные MCP-ключи (только cookie-сессия; plaintext в ответе POST + ровно один раз; активных ≤10 — иначе 409) +- `GET /api/v1/admin/mcp_tokens`, `POST /api/v1/admin/mcp_tokens/{id}/revoke` — + ключи всех пользователей (ревок любого) ## Сервисы (health-чеки) @@ -418,11 +424,36 @@ Для любого другого MCP-клиента — тот же URL, транспорт streamable HTTP. -**Заметка про токен**: `/mcp` сейчас открыт так же, как REST API при -пустом `GHARD_ADMIN_TOKEN`. Если панель торчит в интернет и ты задаёшь -токен — закрыть `/mcp` на reverse proxy нельзя (агенты подключаются с -`Authorization: Bearer ` в заголовке); оставь доступ -только из доверенной сети, иначе любой сможет читать метрики. +### Персональные ключи (страница «MCP-ключи») + +Каждый пользователь панели может выдать себе свои ключи агентов — раздел +«MCP-ключи» в навигации (конвенция экосистемы, канон = gnexus-synapse, +в handbook: [10-platform/mcp.md](https://git.gnexus.space/root/gnexus-handbook/raw/master/10-platform/mcp.md)): + +- ключ — Bearer `mcp_…`, имя («агент Navi rei»), **plaintext показывается один + раз** при создании; в БД только sha256-хэш и хвост-хинт для опознания в списке; +- активных ключей у пользователя ≤10 (полный — панель просит отозвать лишний); +- вместо архива — **ревок**: ключ перестаёт работать сразу; списки сохраняют + отозванные с хвост-хинтом, plaintext никогда не возвращается; +- у ключа снейпшот роли владельца на момент выпуска; набор MCP-инструментов + у всех ключей одинаков — данные панели общие, тулы read-only; +- блокировка пользователя в gnexus-auth (вебхук `user.blocked/deleted/archived`) + отзывает все его ключи; простой SSO-логаут ключи **не** трогает — это + самостоятельные креды; +- админ видит ключи всех пользователей и может отозвать любой. + +Подключение агента с персональным ключом: + +```bash +claude mcp add --transport http ghard https://panel.example.com/mcp \ + --header "Authorization: Bearer mcp_…" +``` + +**Заметка про токен**: `/mcp` открыт так же, как REST API при пустом +`GHARD_ADMIN_TOKEN`. Если панель торчит в интернет и ты задаёшь токен — +закрыть `/mcp` на reverse proxy нельзя (агенты подключаются с +`Authorization: Bearer mcp_…` или `` в заголовке); +оставь доступ только из доверенной сети, иначе любой сможет читать метрики. ## Статус