Безпечні масштабовані віддалені МСР-сервери своїми руками

MCP (Model Context Protocol) — це протокол, який дає можливість AI-агентам підключатися до різних інструментів і даних. Без складного коду та десятків конекторів.
Наприклад, можна автоматично витягувати дані з інвойсів, шукати шматки коду в проєкті чи підсумовувати сапорт-квитки. І все це — у єдиному та уніфікованому форматі.
Звучить зручно — і воно дійсно так. Але є нюанс: чим більше можливостей, тим більшою є поверхня атаки.
MCP-сервер може відкривати доступ до важливих внутрішніх ресурсів компанії. А це значить, що будь-який прорахунок у безпеці — це не просто «упс». Це ризик втрати даних, контролю, або навіть можливість впливати на поведінку штучного інтелекту.
Тому безпека — не опція, а фундамент. Її потрібно закладати ще до першого запиту. І саме про це ми зараз поговоримо.
Як працює авторизація в MCP?
MCP не вигадує свій велосипед — він використовує OAuth 2.1. Це добре, бо замість написання кастомних механізмів перевірки доступу, можна просто взяти надійні інструменти й бібліотеки.
Коли AI-агент хоче звернутись до захищеного MCP-сервера, йому потрібен токен доступу. Але все відбувається автоматично і за правилами, які добре відомі кожному, хто працював з OAuth.
Ось як виглядає типовий флоу:
- AI-агент (MCP-клієнт) звертається до MCP-сервера без токена.
- Сервер каже: «Сорі, 401 Unauthorized» і додає в заголовок посилання, де взяти метадані для авторизації.
- Клієнт читає ці метадані й дізнається, через який авторизаційний сервер треба йти.
- Якщо підтримується, реєструється автоматично (так званий Dynamic Client Registration).
- Далі — класичний OAuth-флоу: з підтвердженням доступу, токеном і всім іншим.
- Клієнт отримує токен і надсилає його з кожним наступним запитом до MCP-сервера.
Що важливо, цей флоу повністю стандартний. MCP просто дотримується нормальної специфікації, а не вводить свої вимоги. Тобто:
- можна використовувати наявні OAuth-сервери (типу Auth0, Azure AD, Keycloak, Google Identity)
- не потрібно вигадувати нові протоколи
- можна швидко почати без зайвих налаштувань
Що має бути реалізовано на MCP-сервері?
Просто увімкнути OAuth недостатньо. Щоб авторизація працювала, MCP-сервер має вміти розпізнавати, перевіряти й правильно обробляти токени.
Тому ось які речі треба реалізувати на сервері:
PRM endpoint
Сервер має показувати клієнтам, з яким авторизаційним сервером він працює. Для цього він публікує endpoint із метаданими за стандартною адресою:
/.well-known/oauth-protected-resource
Там клієнт знайде всю потрібну інфу для авторизації: URL авторизаційного сервера, підтримувані scope, вимоги до токена тощо.
У деяких SDK (наприклад, у TypeScript-версії від MCP) це вже реалізовано.
Перевірка токенів
Прийняти токен — ще не значить, що він валідний. Потрібно:
- дістати токен із заголовка Authorization:
Bearer <token>
- перевірити підпис через JWKS (JSON Web Key Set)
- переконатися, що токен не протух (перевірити exp)
перевірити аудиторію (aud) — тобто токен має бути виданий саме для цього сервера, а не якогось іншого
Можна використовувати бібліотеки типу PyJWT
, jsonwebtoken
, oauthlib
— вони вміють усе це робити.
Обробка помилок
Коли щось іде не так, сервер має чітко пояснювати, що саме сталося:
- відсутній токен:
401 Unauthorized + WWW-Authenticate заголовок
; - токен неправильний або прострочений: теж
401
; - токен є, але доступ до ресурсу заборонено:
403 Forbidden
.
Це важливо, бо від цього залежить, чи клієнт зможе зрозуміти, в чому проблема, і що з нею робити.
Підтримка Dynamic Client Registration
Тобто можливість автоматично реєструвати клієнтів через OAuth, без ручного додавання їх в адмінці.
На жаль, не всі провайдери це підтримують, але з часом ситуація покращується. Якщо хочеш бути на крок попереду — варто подумати про цю функцію вже зараз.
Багатокористувацькі сценарії
Коли MCP-сервер працює з багатьма користувачами одночасно, важливо чітко розмежовувати, хто до чого має доступ.
Один промах, і користувач «А» випадково побачить або змінить дані користувача «Б». Це і є confused deputy — коли система виконує запит, не розібравшись, від чийого імені й для кого.
Перевіряй користувача
- перевір підпис токена та його дійсність
- діставай ID (sub) і переконайся, що токен для твого сервера (aud)
Знати права
- зв’язуй користувача з профілем
- перевір, що дозволено робити
- пам’ятай: автентифікація ≠ авторизація
Ізоляція даних
- кожен запит до бази, API чи логів — тільки в межах користувача
- не довіряй токену без перевірок
- користуйся готовими бібліотеками для токенів і сесій
Навіщо потрібен AI gateway?
Коли MCP-сервер працює з великою кількістю AI-запитів, на нього звалюється купа технічних завдань. Щоб не перевантажувати сервер зайвим, їх краще винести в AI gateway — проміжну ланку між клієнтом і сервером.
Замість тебе він буде робити:
- перевірку токенів
- рейт-лімітинг
- кешування відповідей
- трансформацію запитів/відповідей
- базовий захист (CORS, заголовки безпеки)
Секрети в MCP: де зберігати й чого не робити
У більшості проєктів усе починається з .env. Але коли MCP-сервер виходить у продакшен і стає точкою входу до внутрішніх систем, такий підхід стає небезпечним.
Секрети — це ключі до всього (баз даних, зовнішніх API, OAuth-серверів). І якщо на них забити, зловмисник отримає доступ не тільки до MCP, а й до всього, що за ним стоїть.
Надійний варіант — зберігати секрети у спеціалізованих сховищах типу AWS Secrets Manager, Azure Key Vault або HashiCorp Vault. Вони дають шифрування, аудит, контроль доступу й автоматичну ротацію.
Ще краще — взагалі не передавати паролі, а використовувати так звану ідентифікацію навантаження (workload identity), коли твій застосунок отримує права напряму від хмари, без явних ключів.
І найголовніше: кожен MCP-сервер має бачити лише ті секрети, які йому реально потрібні. Якщо щось піде не так, менший доступ означає менші наслідки.
Спостереження й моніторинг
Запустити MCP-сервер — лише пів справи. Складніше бачити, що відбувається, і вчасно реагувати. Для цього варто зосередитися на трьох речах:
- Логи з унікальними ID
Кожен запит отримує свій ідентифікатор (correlation ID). Це дозволяє відстежити його шлях через сервер і зовнішні сервіси, навіть якщо стався збій. - Трейси
Хочеш знати, де система тупить? Трейси (наприклад, через OpenTelemetry) показують, як запит проходить крок за кроком і де виникають вузькі місця. - Метрики та алерти
Слідкуй за основними показниками: кількість запитів, затримки, помилки авторизації. Автоматичні алерти та дашборди допомагають помітити проблеми перш ніж вони вплинуть на користувачів.
Підсумок
Безпечний і масштабований MCP-сервер — це не тільки код, а структура, яка продумала права користувачів, захист секретів і контроль за запитами.
Якщо правильно налаштувати авторизацію, ізоляцію даних і спостереження, сервер зможе працювати з тисячами користувачів і інструментів одночасно, без хаосу і сюрпризів.
І в тебе однозначно все вийде!