Комментарии 7
Как вы решаете per-user авторизацию для MCP?
Token-exchange в клоке: мой MCP-сервер умеет в OAuth - при подключении авторизуемся через PKCE (через браузер), потом MCP-сервер меняет токен на соответствующий для таргета. Как я понимаю - вам больше первая стадия интересна
Стараемся оставлять поддержку сквозной авторизации в тех MCP серверах, которые ее поддерживают. В остальных случаях пока через общую сервисную учетоку. Через Keycloak интересное решение. Если правильно понял флоу: клиент при подключении к MCP-серверу проходит OAuth 2.1 с PKCE через браузер, получает токен, а дальше MCP-сервер делает token exchange в Keycloak и ходит к целевым системам уже от имени конкретного пользователя?
Да, всё верно. По сути, механика следующая:
Клиент логинится через браузер по OAuth 2.1 с PKCE и получает от Keycloak токен, выписанный специально для MCP-сервера. Дальше клиент просто прикрепляет его ко всем своим запросам.
Получив запрос, MCP-сервер берёт этот токен, стучится в Keycloak и меняет его (через token exchange по RFC 8693) на новый, предназначенный уже для конкретной целевой системы. Идентификатор пользователя при этом сохраняется. С этим новым токеном MCP-сервер и идёт в систему, действуя от лица юзера.
Но схема работает, только если конечная система умеет валидировать токены Keycloak. Например, с Jira DC это не прокатило - там пришлось поднимать отдельный OAuth-флоу до самой Джиры и хранить токены индивидуально для каждого пользователя в шифрованном кэше.
Чтобы не положить Keycloak постоянными запросами на обмен, новые токены кэшируются в памяти MCP-сервера. Они лежат там до тех пор, пока до истечения срока их действия (exp) не останется 30 секунд.
Опубликовал релиз: https://github.com/andrico21/rmcp-server-kit
GUIDE.md, Recipe 2 - натравите ллмку, будет быстрее понять 😁
Хорошая статья. С per-user авторизацией сейчас реальная беда, стандартов нет совсем. Я сам из-за бесконечных костылей с доступами и локальными конфигами агентов в итоге перебрался в Kodik - там хотя бы можно просто кодить и нормально контролить диффы, не настраивая перед этим K8s-кластер) Для агентского кодинга мне кажется лучший вариант сейчас

MCP-серверы для всей команды: от локального запуска, до централизованного доступа