Галоўная / Артыкулы

Разгортванне MCP-сервера на EC2 пасля пераходу спецыфікацыі на працу без стану

Пераносім MCP-сервер з localhost на EC2: streamable HTTP, nginx і bearer-аўтэнтыфікацыя, а потым — што сесіі без стану і OAuth 2.1 азначаюць для рэальнага разгортвання.

Выдавец: REACTAPP.TOP11 хв чытання2446 слоў

Крыніцы: MCP Servers Explained: A Complete Guide to What I Learned Deploying One to AWS EC2

З localhost на справжній сервер

Універсалія парадоксальна ў тым, што матэрыялы пра MCP застаюцца абстрактнымі. У іх показваецца кліент, які знаходзіцца пляцоўкай паляў пры серверэ, протакол пораўнюецца з портом USB-C, або прадстаўляецца пяцірадковы прыклад, які работае толькі на localhost і ніколі не выходзіць за межы ноутбука распрацоўшчыка. Справжняя праца пачынаецца пасля гэтага: інструмент, напісаны локальна, павінен работаць на справжнім серверэ, за справжнім рэверсным проксі, дзе справжній кліент можа з’явіцца да яго праз публічны Інтэрнэт. Гэта адзінэцкія проблемы, і яе мала прадстаўляюць у матэрыялах.

Тут опісаные працэсы запуску пачынаюцца з локальнага сервера MCP, пасля чаго ён пераносіцца на інстанцу EC2 і аддаецца да сэрвісу праз транспорт HTTP, дзе nginx выкарыстоўвае токен-перавязку загадзя. Усё працавала нормальна. Чырз калькі часоў протакол быў перанесены пад ўправлінне яго. 28 ліпня 2026 года самая большая па велічыне перасмотра спецыфікацыі MCP стала фінальной, і ў яе рэзультаце протакол стаў безстановым. Команды часта пісаюць „падтрымка MCP“ як адну пункт, але на самай працэ па ёй дзеляюцца на тры аспекты: транспорт, аўтэнтыфікацыя і, пасля гэтага апдэйта, масштабаванне. Неправы выбор у будзь-ям з гэтых аспектаў і ўзначае розніцу між інструментам дэманстрацыйнага рангу і тым, якому можна даверыць у працэйных умовах.

У статты рассматрываецца калькольнае колька спытанняў: якія часткі проблемы MCP апісвае, а якія залеўчае, чаму транспорт на аднойчынных HTTP-звязках заменіў транспорт на аднойчынных SSE, як nginx і токен-несучы выканаюць адкрыцце локальнага сервера на EC2, якія змяны відбуваюцца пад час безстановай перапісі, чаму статычны токен вважаецца засобам аутэнтыфікацыі, але не падпадае пад ваказаныя стандартамі вакаліднасці, і якія часткі розгортання павінны былі змяніцца, каб застаць у тонусе.

Што стандартызуе, а што — ні MCP

У тэорыі протакол Model Context Protocol выклікае адзін ключовы момант: спосаб, якім прыкладнэнне ІІ знаходзіць і запускае інструменты, а таксама чытае рэсурсы, якія надае адзінэцкі працэс сервера, за дапамою паведамленняў JSON-RPC, якія перадаюцца праз вяліканаведзены канал зв’язку. Логіка інструментаў, дызайн агентаў і ўстановка ўсё гэта знаходзіцца па за межамі гэтага протакола. Гэта стандарт для з’яеднання, а не фрэймворк. Раней кожная прыкладнэнне ІІ, якая хацела адразу даць доступ да такога чыгуна, як внутрашняя API, вымагала індывідуальнай інтэграцыі. За дапамою MCP адзін сервер служыць усім сумяшчаным кліентам.

Якшча паглядзець на гэта так, стае зрозумела прычына труднасцэў пад час установкі. Протакол опісвае структуру паведамленняў, але не адзначае, чы можна даць доступ да сервера толькі з аднаго ноутбука чы з будзь-якага месца, чы ён захішчаны чым-небудзь, і чы можа ён адрабатваць кілька кліентоў адразу. На всія гэтыя пытанні адпавядае аператар.

Чаму публічная установка ўжо іншая

  • Локальныя серверы адкрываюць практычна нічога, а публічныя — многа. З публічным URL сервер стае адмініструемым API, як і будзь-кім іншым, таму обработка токенаў і перакананне вхідных дадзеных маюць такое ж значэнне.
  • Правіла працы сэсій і масштабавання раней былі неясныя. Неправыя прыпускі моглі прывесты або да таго, што сервер тыхаў адмовіў пад адночасным навантажэнням, або да сітуацыі, калі ён быў перавантажаны неканэцыянтнымі сэсіямі, якія ў яго не былі неабходныя.
  • Стандарт не застаецца незменным. Развертанне, пабудавана на прыпускх, якія ўжо шэсць месцаў застарэлі, можа перастаць адпавядаць стандартам без жадных адхылэнняў, таму што кліенты проста дагадваюцца прыйняць старэйшую версію пратаколу.

Архітэктура выглядае так.

AI Client ── HTTPS POST ──▶ nginx (TLS termination, auth check, reverse proxy)
                                    │
                                    ▼
                          MCP Server Process
                          (Streamable HTTP transport)
                                    │
                       ┌────────────┴────────────┐
                    Tools                    Resources

Адзін прынцып керуе всім гэтым. Калі сервер MCP атрымле публічны URL, яго трэба адмаўляць як будзь-які аўтэнтыфікованы API, які выдаецца з EC2, адтолькі ў структурнай прамаве ён ёсць такім жа. MCP — гэта проста фармат паведамленняў, тады як пытанні безпекі і масштабавання застаюцца тымі ж, якія і у будзь-якага бэкенду.

1. Транспорт HTTP з можлівасцю стрымавання

HTTP з можлівасцю стрымавання — цэх адзін HTTP-эндпаінт, які прымае запыты POST з паведамленнямі JSON-RPC. Ён заменіў пакульшы транспорт HTTP+SSE, які выклікаў патрэбу у стойкім стрыме server-sent-events паўстаўшы ў дапамогу звычайным HTTP-запытам.

Адзін POST-эндпаінт — гэта знайомая сфера для будзь-якага рыверс-прайкса, балансэра навантажэння чы API-гейтвэя, таму няма проблем з падтрымкай дзейна стрыму праз nginx чы ALB. Трафік выглядае як звычайны HTTP-API, а блок location у nginx застаецца корачым.

location /mcp {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header Authorization $http_authorization;
    proxy_http_version 1.1;
    proxy_read_timeout 300s;
}

Парадакт для працы: нават калі вы вікорыстоўваеце транспорт з аднім канцэнтрам, заставьце таймаут чытання проксі быць достатньм. Одна-едынстая вызова інструмента можа заканчыцца дыяўальна дыльней, чым звычайны запіт API, і занадта строгі таймаут знішчыць як правільныя дыльнія вызовы, так і тыя, якія справа застраглі.

2. Аўтэнтыфіка за дапамою токена Bearer

У гэтым падходзе фіксаваны токен знаходзіцца ў заголовку Authorization і пераверачаецца пры перадачы запіта да процэса сервера MCP, чы гэта ў nginx, чы ў мідлвэрэ аплікацыі. Для всего, што знаходзіцца на публічнай URL, гэта ўсё, што можна прыйняць з точкі зору безпекі, і гэта разумны першы крок. Аднак токен ніколі не выгорае, не прыязджае ні да якога конкрэтнага сервера і не захоўвае апэнтнай захопненасці, калі ён потрапіць у логі. Ён толькі паведамляе, што запіт несе аўтэнтыфікацыйныя даны.

Эскіз мідлвэра FastAPI пачынаецца з імпортаў.

from fastapi import Request, HTTPException

Потым прыходзіце сама пераказна ведомаць.

VALID_TOKEN = "your-rotated-secret-token"async def verify_bearer(request: Request):
    auth = request.headers.get("authorization", "")
    if auth != f"Bearer {VALID_TOKEN}":
        raise HTTPException(status_code=401, detail="Unauthorized")

Ішчырэй парадакт: не павінны быць у логах доступу неапдытаваныя заголовкі Authorization. Стандартныя фарматы логаў nginx і аплікацый лёгкая прыводзяць да таго, што іх працягваюць працягваць не зазначыць, а калі яны там, файл лога стае джэрэлам выцякання аутантыкацыйных даных.

3. Безстановасць, сэрцо перапісвы з ліпеня 2026 года

За спецыфікацыяй 2026-07-28 сесіі на рэвэлі протакола знікаюць. Існаванне заголовка Mcp-Session-Id больш не існуе, а таксідарыянт таксама відмовляецца ад дугага часу трываючага потоку GET, які ранэйшыя версіі выкарыстоўвалі, каб падтрымаць супараднасць кліента і сервера пад час размовы. Кожны запіт несе ў сабе усё, што яму трэба.

Скэлінг — гэта ключовы момант. Старыяя модэлі дазволялі серверу запам’ятаваць інфармацыю пра кліента між запытамі, а калі за балансавальнікам навантажэння знаходзіліся калькі інстансаў, такая памяць вымагала вікорыстання «лепкіх сэсій». Без стану на рэвэлі протакола будзь-яя інстанцыя можа обрабатваць будзь-яы запыт, што дае справжній горызонтальны скэлінг і звалічвае кліентаў ад прыкрэплення да адной машыны.

У практыцы сервер, які зберагаў стан пра кліента ў памяці між запытамі, не будзе працаваць па новым стандартам. Усі важлівыя даны трэба пераказаць у тэле запыту або у зовнішній хранільнік, такі як Redis, які можа чытаць кожная інстанцыя.

4. Калькі запытов з кількіма раунд-трыпамі

Нават протакол без стану патрабуе спосабу, якім сервер мог бы задаць запыт кліенту падчас адклекання дадзенняў, напрыклад, прабавіць запытаць пра падтверджэнне або відсутны параметр. Новая спецыфікацыя рашае гэтыя проблемы за дапамою Multi Round-Trip Requests. У зменшэнні ад таго, каб заставіць стрым ачытым, сервер адпавядае з InputRequiredResult, у яком пераказаны яго запыты разам з незрозумелым значэннем requestState. Кліент сабіра адпаведзі і зноў адправляе первісны запыт, дадаючы гэтыя адпаведзі і не зменяючы стан.

Самэ гэта робіць справжню безстановасць працэспрэтной. Паколькі все, што патрабуе сервер для продакцыі працы, находзіцца ў пэйлоадзе, які кліент адправляе назад, будзь-якая інстанцыя, не обавязкова тая, якая пачала запыт, можа перадаць яго занова і завершыць.

Кліянты должны не трогаць requestState: ніякага аналізу, ніякіх змян. Ёго трэба заставіць такім, які ён быў, і вернуць як было, інакша програма, якая выкарыстоўвае яго цэласнасць, можа зламацца.

5. Паўнейшая захоўка автарызацыі

Адрэдагаваны стандарт спакойвае даўневыя серверы MCP на вікорыстанне OAuth 2.1 з PKCE і выкалікае неабходнасць наявнасці паказчыкаў рэсурсаў (RFC 8707), якія прыяўляюць выданы токен да таго самога сервера, для якога ён і быў прызначаны.

Апасцярожнасць трэба выказваць пра можлівасць павторнага выкарыстоўвання токенаў. Калі выйдзе на волю статычны токен-носіцель, які хто-небудзь зможа прыйняць, гэты сервер стане метай. Токен, прыяўлены да конкрэтнага рэсурса, закрывае гэтыя слабасці, таму токен, выданы для аднаго сервера MCP, не будзе працаваць на іншым, нават калі оба выкарыстоўваюць аднаго і таго ж прадаўця аідэнтычнасці.

Установка на асоціяцыйны токен, з якой пачаткаюць багато людзей, падпадае пад трэбаванні «гэты канцэнтрабыт выклікае аутэнтыфікацыю». Яна не задовольняе трэбаванням да інтэроперабельнасці і захавання ад працэйкання, якія новыя стандарты адначыцца ад задовольнайучага даўневага сервера, і гэтыя праслейкі трэба усунуць, прытымкі URL дасягне каго-небудзь за межамі основнай каманды.

6. Палітыка занепаду і расшырэнні

Магчымасці ў стандарце цяпер праходзяць па формальнай жыцёвай шляху: Актыўныя, Занепадзілыя і Усунутыя, пры чым між стадыяй занепаду і усунення ёсць ўжо каля дванаццаці месцаў. Новыя функцыі, такія як інтэрфейс, выконваны серверам, або задачы, якія працуюць дзяўно, спачатку прыходзяць у вастоўкай форме як расшырэнні, а не безпосерэдна ў основную частку стандарта. Дзеязныя функцыі, з-паśрэды корэні, выбіранне дадзеных і логаванне ў ўсходзічных формах, праходзяць па шляху занепаду, каб іх заменіць на новыя варыянты.

Для аператараў гэта значыць, што работаючая інтэграцыя не будзе зламана за адну ночь па вынікненні новай версіі, а новыя можлівасці можна будзе адмацаваць цярпяча, а не пад тым тыслом, каб адгукнуцца да усяго, што дадае спефікацыя.

Пашаговы апіс

Шлях ад локальнага пратотыпа да рэалізацыі на EC2, якая адпавядае спефікацыі, выглядае так:

  1. Локальны тэставанне. Сервер працуе праз stdio з локальным кліентам, без сеткі і без аўтэнтыфікацыі, таму ітэрацыі ведуцься быстра.
  2. Пераход на HTTP з потокавым перадаваннем. Сервер пераканфігуруецца для вікорыстання транспорту HTTP з потокавым перадаваннем і размешчаецца на экземплярэ EC2.
  3. nginx як прыемнік запытоў. nginx завершае працэс TLS, перакантролюее токен-носіцель прыбліжна перш чым запыт дасягне процэса MCP, а пасля перасылае яго далей.
  • Звычны ўтварэнне запыту. Адна пакетацыя POST несе запыт JSON-RPC, а рэзультат вяртаецца ў тым жа запыты і адпаведзе.
  • Узгадка версіі. Пасля завершэння стандарта 2026-07-28 кліент і сервер узгадваюць версію протаколу. Кліент, які не апдэйтаваўся, автаматычна пераходзіць на версію 2025-11-25 і не выклікае краху.
  • Патрэбны дадзеныя. У заместо таго, каб заліць з’ёднанне відкрытым, сервер адпавядае з InputRequiredResult, у яком пераказвае, што яму ўсё шчэ трэба запытаць.
  • Аднова запыту. Кліент павтарае запыт, дадаўшы адпаведзі і вярнуўшы requestState. Павторны запыт не залежыць ад конкрэтнага экземпляра, таму яго можа прыняць будзь-які камп’ютар, які працуе пад nginx.
  • Адміністрацыя зусібоў. Запыты без токена або з некорэктным токенам адхіліяюцца на серверы nginx. Код прыкладнага праграмы ніколі з імі не сталкнёцца.
  • Спецыяльныя случаі

    Памедленныя операцыі. Работа, якая раней выконвалася за дапамою стрэму, які залішаліся ачытым працоўнае врэмя, трэба перавесты на розшырэнне Tasks. Стварэнне стойкага з’ѐеднання на транспорце, які не падтрымвае такіх з’еднанняў, — глыбока памылка.

    Інструменты, якія ніколі не будуць выкорыстоўваны на расстоянні. Для сервера, які выконваецца толькі локальна разам з кліентам, найкрашча падходзіць стандартна бібліятэка stdio, і тут практычна не існуе праблем, зв’язаных з развёртваннем.

    Кліенты з разнымі версіямі. Паколькі старэйшы кліенты автаматычна пераходзяць на версію 2025-11-25, адна версія протаколу можа практычна падтрымваць обе версіі кліентоў прычынам часу, таму не кожны кліент павінен апдэйтавацца адразу ж разам з серверам.

    Масштабаванне і проблемы у працэйнай асяроддзі

    Калькі лічэбніка. У модэлі сэсій пры трыванні звязку кліента з тым лічэбнікам, які яго ведаў, выкарыстоўваліся «лепкія» сэсіі або спяльны хранэнне сэсій. Гэтае патрабаванне знікло, і для тых, хто аперуе больш адной машыны, гэта галоўная перадчынта перапісвы.

    TLS на адной групе машын. Кераванне сертыфікатам на кожным лічэбніку EC2 быстра стае некантрольным. Кераваны балансэр навантажэння, які храніць сертыфікат ACM пры входзе ў групу машын, выклікае значна меншыя зусіллі, чым настройка TLS у nginx на кожной машыне.

    Выдача і замена токэнаў. Статычныя токэны-носіцы маюць паказаныя меры безпекі, і ўсё ж яны ствараюць проблемы па часе аператыўнай працы, калі ёсць ўжо калькі кліентаў, адтак кожная замена выклікае ручную коордынацыю. Выдача токэнаў на адной падставе OAuth 2.1 адразу усунея проблемы з безпекай і труднасці з заменай.

    Аналіз вызоваў без сеансаў на стороне сервера. Калі на серверэ няма сеанса, які бы з’ѐеднаў серыю вызоваў, ідэнтыфікаторы корэляцыі, якія перавозяцца ў пакеце запіту, стаюць ўжо ўсём, што можа дапамагчы відновіць, што саме было адбулось пад час адноўы взаімадзеяння з агентам у межах кальколькіх вызоваў.

    Обработка продакцыі на кліенце

    Канфігурацыя nginx і проміжны элемент bearer-check абавязуюцца транспортам і базовым аутэнтыфікацыям. Ёсць мінімальны прыклад структуры для кліентскай часткі багатараундовага запіту.

    async def call_tool_with_resume(client, tool_name, params):
        result = await client.call_tool(tool_name, params)
        if result.get("type") == "InputRequiredResult":
            answers = collect_answers(result["questions"])
            return await client.call_tool(
                tool_name,
                {**params, "answers": answers, "requestState": result["requestState"]},
            )
        return result
    

    Сэрцаўым моментам ёсць апошнія лінія, дзе requestState вяртаецца абсолютна так, як яго задаў сервер.

    Звычныя падступы

    • Вважаць, што працэс "deployed" значыць, што продукт гатовы да выкарыстоўвання ў працэсе віробніцтва." nginx паўнасцю з бэрэр-токенам скасоўвае толькі найболей простыя вакансіі, а не ўсе ўмовы. Неабходна прысталяць MCP-эндпаінт да стандартаў будзь-якага публічнага API: з належным аутэнтыфікацыяй, рэгулярным логаваннем і обмежэнням частоты запытоў, прычым перш чым URL будзе шырока распространены.
    • Апыліванне на памяць сервера. Некалькі ранніх версій працэса развіцця мовчкі спакоюваліся на тым, што сервер запамятае кліента з паканальнага запыту. Неабходна планаваць, што кожны запыт можа прайсці да іншай інстанцыі, чым паканальная, адколі ныякія стандарты гэта дазваляюць.
  • Фіксацыя адной версіі пратаколу. Кліент, прычыплёны да аднай версіі, перастае працаваць, калі сервер апдэйтуецца. Неабяжна наявнасць механізма пераговора з разумным альтэрнатыўным рашэннем, каб апдэйт адной стороны не выключыў другую.
  • Адмова ад аўтэнтыфікацыі для внутрашняга інструмента. Інструмент, які зараз ўжо ўнутрашні, можа пазней быць пераданы партнерскай командзе, і тады статычны токен будзе недастатковы. Калі сервер можа знаходзіцца не толькі на ноутбуке, але і ў VPC, з самага пачатку неабяжна вікорыстоўваць OAuth 2.1 і паказчыкі рэсурсаў.
  • Практыкі, якія працуюць у працоўным сераўеры

    • Ўтрымвацца ад стану, калі інфраструктура не можа масштабавацца. Усё, што павінна застацца між вызывамі, трэба зберагаць у пэйлоадзе або у зовнішнім сховішчы.
    • Прыязычваць кожны токен да конкрэтнага рэсурса, таму што токен, які прыймае кожны сервер, якому вы даваеце доверы, раней чы пазней будзе вікорыстоўвацца там, дзе яго не трэба.
    • Перагавайце версіі пратакола і не прыемлівайце якую-небудзь адзіну. Кліенты і серверы рэдка калі апдэююцца ў той самы дзень, таму трэба врачываць гэты перыяд.
    • Пераканаўце аўтэнтыфікацыю на роўні входу. Калі nginx адхоўляе некарэктны запіт, працэс MCP застаецца простым і адкрывае менш магчымасцей.
    • Не чапайцеся за незрозумелыя поля. requestState і падобныя елементы існуюць таму, што сервер можа пакладацца на тое, што ён вяртае, таму кліенты не должны іх чытаць чы рэгулюваць.

    Якія наследкі для развяртання

    У тэорыі MCP ёсць просты. Развяртанне включае важлівыя рашэнні, і апдэйт спецыфікацыі 28 ліпеня 2026 года іх змяніў. Streamable HTTP лёгкае для запуску за дапамогою звычайной інфраструктуры, абсэнцыя стану робіць дадаўанне екземпляра EC2 рэалістычным варыянтом заместо праекта з керуванням сесіямі, а модэль автарызацыі цяпер падходзіць для сервера, які ўжо ў доступе для публікі. Нічога з гэтага не ёсць складным, калі тое разумець, і гэта і частка, якую пры тэорычных аналізах часта прыхоўляюць.

    Супаўязаныя матэрыялы

  • Перыяканне каліквіткі за токены MCP: два опісы інструментаў сталі прычынай ўзросту — Паўторны запуск дзевяці сервераў MCP працэсам 13 дзён паказаў, што калькіліквіткі інструментаў выраслі з 36 320 да 38 738 токенав, прычым практычна усё гэта сталася завяршэннем аднаго з сервераў, які перапісаў яе існуючыя апісанні. —