Головна / Статті

Створення масштабованих, безстанових серверів MCP 2026 (технічний детальний аналіз)

Покрокове керівництво з створення масштабованих, безстанових серверів MCP 2026 (технічний детальний аналіз): контракти, перевірки та готові фрагменти коду для команд, які використовують цю архітектуру.

Видавець: REACTAPP.TOP11 хв читання2446 слів

Джерела: Stateless Model Context Protocol: Building Scalable MCP 2026 Specification Servers (Technical Deepdive)

Використовуйте цей документ як оновлену версію ідей з книги „Stateless Model Context Protocol: Building Scalable MCP 2026 Specification Servers (Technical Deepdive)“ для співробітників-операторів: чіткі етапи, впорядковані блоки коду та примітки щодо відновлення, які зберігаються після передачі обов’язків. Етап Огляду найкраще функціонує, якщо його розглядати як вимірювану поверхню. Запишіть один ідеальний запис, один випадок збою та примітки щодо скасування змін перед розширенням обсягу роботи. Записуйте час виконання та витрати на токени або запити поруч із функціональними результатами. Візуалізація витрат заздалегідь запобігає несподіваним рахункам під час переходу від демо-версії до спільних середовищ.

Проблема зі станом даних: чому MCP до 2026 року мала труднощі з масштабуванням

На етапі «The Stateful Bottleneck Why» необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись визначити прихований стан. Конфігурацію слід тримати окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Коли наступним кроком є код або виклик інструменту, краще використовувати структуровані результати з перевіркою схеми, ніж вільний текст.

+--------------------------------------------------------------------------+
|                       Pre-2026 Stateful Architecture                     |
|                                                                          |
|   +--------------+      WebSocket / SSE      +-----------------------+   |
|   | Client Agent | <=======================> | MCP Server Pod A      |   |
|   +--------------+    (Session Pinned)       | (In-Memory Session)   |   |
|                                              +-----------------------+   |
|                                                          |               |
|                                                    State Lookup          |
|                                                          v               |
|                                              +-----------------------+   |
|                                              | Central Redis Cache   |   |
|                                              +-----------------------+   |
+--------------------------------------------------------------------------+

Труднощі, пов’язані з афінністю сеансів

Для етапу «The Friction of Session» необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори мають мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Необхідно документувати як шлях успішного виконання, так і шлях відновлення одночасно. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. У разі, коли наступним кроком є код або виклик інструменту, краще використовувати структуровані результати з перевіркою схеми, ніж вільний текст.

Як працює MCP 2026–07–28: маршрутизація заголовків та самоописувані RPC

Для етапу «Під капотом» необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Краще використовувати невеликі, перевірювані одиниці коду замість об’ємних скриптів. Коли крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану структуру процесу. Коли наступним кроком є код чи виклик інструменту, краще використовувати структуровані результати з перевіркою схеми замість вільного тексту. Для етапу «Під капотом» необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись вгадати прихований стан. Записуйте час виконання та витрати на токени чи запити разом із функціональними результатами. Відображення витрат на ранньому етапі запобігає несподіваним рахункам під час переходу від демо-середовища до спільних середовищ.

+--------------------------------------------------------------------------+
|                     MCP 2026-07-28 Stateless Architecture                |
|                                                                          |
|   +--------------+    HTTP POST (Self-Describing)    +---------------+   |
|   | Client Agent | --------------------------------> | Round-Robin   |   |
|   +--------------+   Headers: Mcp-Method, Mcp-Name   | Load Balancer |   |
|                                                      +---------------+   |
|                                                              |           |
|                                           Any Worker Pod     |           |
|                                       +----------------------+--------+  |
|                                       |                      |        |  |
|                                       v                      v        v  |
|                                  +--------+              +--------+ +---+|
|                                  | Pod 1  |              | Pod 2  | |...||
|                                  +--------+              +--------+ +---+|
+--------------------------------------------------------------------------+

Самоописуваний JSON-RPC 2.0 через _meta

Під час роботи над етапом самоописуваного JSON-RPC 2.0 спочатку запишіть умови використання: необхідні параметри входу, сигнал про успіх та наслідки часткової невдачі. Такий перелік допоможе зберегти чесність подальших змін у коді. Зберігайте конфігурацію окремо від коду додатку. Файли середовища, сховища секретів та флаги функцій мають знаходитися в одному місці, щоб оператори могли їх перевіряти, не читаючи весь код. Зберігайте у кеші стабільні інструкції системи та схеми інструментів. Повторна передача ідентичних даних є поширеною причиною витрат ресурсів.

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "query_database",
    "arguments": {
      "query": "SELECT count(*) FROM users WHERE status = 'active';"
    }
  },
  "id": "req-98421",
  "_meta": {
    "protocolVersion": "2026-07-28",
    "clientInfo": {
      "name": "AutonomousAgentWorker",
      "version": "4.1.0"
    },
    "progressToken": "tok_998122",
    "traceContext": {
      "traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
    }
  }
}

Обов’язкові заголовки маршрутизації HTTP рівня 7

Під час роботи над етапом обов’язкового маршрутизування HTTP на рівні 7 записуйте спочатку контракт: необхідні вхідні дані, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Документуйте як шлях успішної роботи, так і шлях відновлення. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Зберігайте у кеші стабільні інструкції системи та схеми інструментів. Повторна передача ідентичного вступу є поширеною причиною надмірних витрат.

Виявлення серверів та розумний кешування

Під час роботи над етапами виявлення серверів та інтелектуальної обробки спочатку запишіть умови взаємодії: необхідні дані вхіду, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Віддавайте перевагу невеликим, тестованим одиницям коду перед об’ємними скриптами. Якщо якийсь крок зазнає невдачі, причина має вказувати на конкретну функцію, а не на складну послідовність операцій. Зберігайте у кеші стабільні інструкції системи та схеми інструментів. Повторна передача ідентичних даних є поширеною причиною зайвих витрат. Під час роботи над етапами виявлення серверів та інтелектуальної обробки спочатку запишіть умови взаємодії: необхідні дані вхіду, сигнал про успіх та те, що відбувається у разі часткової невдачі. Такий перелік допомагає зберігати чесність пізніших змін у коді. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Чітке бачення витрат заздалегідь запобігає несподіваним рахункам під час переходу від демо-версії до спільних середовищ.

{
  "jsonrpc": "2.0",
  "result": {
    "protocolVersion": "2026-07-28",
    "capabilities": {
      "tools": { "listChanged": false }
    },
    "serverInfo": {
      "name": "Scalable-Stateless-MCP-Server",
      "version": "2.0.0"
    },
    "cacheControl": {
      "ttlMs": 3600000,
      "cacheScope": "public"
    }
  },
  "id": "disc-001"
}

Створення сервера без стану для продакшну: FastAPI, FastMCP 2.0 та OAuth 2.1

Етап створення сервера без стану для продакшну найкраще функціонує, якщо його розглядати як вимірювану поверхню. Запишіть один ідеальний приклад роботи, один випадок збою та примітки щодо скасування змін перед розширенням обсягу роботи. Тримайте конфігурацію окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функцій мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Встановіть ліміти на кількість токенів за раунд та сесію. Інструменти типу агентів активно розширюють контекст; жорсткі обмеження запобігають тому, що демонстрації перетворюються на несподівані рахунки.

+-----------------------------------------------------------------------------+
|                       Stateless Request Dispatching                         |
|                                                                             |
|   Client Request w/ Bearer JWT                                              |
|   + Header: Mcp-Method: tools/call                                          |
|   + Header: Mcp-Name: query_database                                        |
|                                                                             |
|         │                                                                   |
|         ▼                                                                   |
|   +------------------------------------+                                    |
|   | OAuth 2.1 Bearer Validation        |  ---> (401 Unauthorized if invalid)|
|   | verify_token()                     |                                    |
|   +------------------------------------+                                    |
|         │                                                                   |
|         ▼ Decoded Claims (user_info)                                        |
|   +------------------------------------+                                    |
|   | Header-Based Route Dispatcher      |                                    |
|   | extract Mcp-Method / Mcp-Name      |                                    |
|   +------------------------------------+                                    |
|         │                                                                   |
|         ├──────────────────────────────┐                                    |
|         ▼                              ▼                                    |
|   [ tools/call ]               [ server/discover ]                          |
|   Execute tool handler          Return cached capability                    |
|   Scoped to user_info['sub']    manifest & protocol specs                   |
+-----------------------------------------------------------------------------+
from fastapi import FastAPI, Depends, HTTPException, Header, Security
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from pydantic import BaseModel
from typing import Dict, Any, Optional
import jwt


app = FastAPI(title="Stateless MCP 2026 Server")
security = HTTPBearer()
JWT_SECRET = "production_secret_key"
JWT_ALGORITHM = "HS256"
def verify_token(credentials: HTTPAuthorizationCredentials = Security(security)) -> Dict[str, Any]:
    """
    Validates incoming OAuth 2.1 Bearer JWT tokens.
    Converts the MCP server into a standard OAuth Resource Server.
    """
    try:
        payload = jwt.decode(credentials.credentials, JWT_SECRET, algorithms=[JWT_ALGORITHM])
        return payload
    except Exception:
        raise HTTPException(status_code=401, detail="Invalid Bearer token")
class JsonRpcRequest(BaseModel):
    jsonrpc: str = "2.0"
    method: str
    params: Optional[Dict[str, Any]] = None
    id: Any
    _meta: Optional[Dict[str, Any]] = None
@app.post("/mcp")
async def handle_mcp_request(
    request: JsonRpcRequest,
    mcp_method: Optional[str] = Header(None, alias="Mcp-Method"),
    mcp_name: Optional[str] = Header(None, alias="Mcp-Name"),
    user_info: Dict[str, Any] = Depends(verify_token)
):
    """
    Stateless MCP Request Handler conforming to the 2026-07-28 specification.
    Prefers Mcp-Method and Mcp-Name headers for fast execution dispatch.
    """
    effective_method = mcp_method or request.method
    # Route: Tool Execution
    if effective_method == "tools/call":
        tool_name = mcp_name or (request.params.get("name") if request.params else None)
        arguments = request.params.get("arguments", {}) if request.params else {}

        if tool_name == "query_database":
            query = arguments.get("query")
            user_id = user_info.get("sub", "anonymous")

            # Context is scoped directly to the authenticated token claims
            return {
                "jsonrpc": "2.0",
                "result": {
                    "content": [
                        {
                            "type": "text",
                            "text": f"Executed query '{query}' for user {user_id}"
                        }
                    ]
                },
                "id": request.id
            }

        # Standard JSON-RPC Method Not Found (-32601)
        return {
            "jsonrpc": "2.0",
            "error": {
                "code": -32601,
                "message": f"Tool '{tool_name}' not found"
            },
            "id": request.id
        }
    # Route: Server Discovery
    elif effective_method == "server/discover":
        return {
            "jsonrpc": "2.0",
            "result": {
                "protocolVersion": "2026-07-28",
                "capabilities": {
                    "tools": {"listChanged": False}
                },
                "serverInfo": {
                    "name": "Scalable-Stateless-MCP-Server",
                    "version": "2.0.0"
                }
            },
            "id": request.id
        }
    # Unsupported Protocol Method
    return {
        "jsonrpc": "2.0",
        "error": {
            "code": -32601,
            "message": f"Method '{effective_method}' unsupported"
        },
        "id": request.id
    }

Керування трафіком на рівні 7 без аналізу: конфігурація Envoy та Gateway

Етап керування трафіком з нульовим аналізом на рівні 7 працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітки щодо скасування змін перед розширенням обсягу роботи. Документуйте як успішний, так і відновлювальний сценарії роботи. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. Визначте бюджет на кількість операцій за раз та за сеанс. Інструменти з агентним підходом активно розширюють контекст; жорсткі обмеження запобігають тому, що демонстрації перетворюються на несподівані рахунки.

routes:
  - match:
      prefix: "/mcp"
      headers:
        - name: "Mcp-Method"
          exact_match: "tools/call"
        - name: "Mcp-Name"
          exact_match: "query_database"
    route:
      cluster: mcp_database_tools_cluster
  - match:
      prefix: "/mcp"
    route:
      cluster: mcp_general_cluster

Керування станом без сеансів: багатокрокові запити та компроміси

Етап керування станом без сеансів працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Віддавайте перевагу невеликим, тестованим одиницям перед об’ємними скриптами. Коли якийсь крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану послідовність дій. Встановіть ліміти на кількість токенів за хід та за сеанс. Інструменти типу агентів активно розширюють контекст; жорсткі обмеження запобігають тому, що демонстрації перетворюються на несподівані рахунки. Етап керування станом без сеансів працює найкраще, коли його розглядають як вимірювану поверхню. Збережіть один ідеальний запис, один випадок збою та примітку про скасування змін перед розширенням обсягу роботи. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Видимість витрат заздалегідь запобігає несподіваним рахункам, коли процес переходить від демонстрації до спільних середовищ.

Інтерактивний цикл багатократних запитів (MRTR)

Для етапу багатократних запитів MRTR необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись визначити прихований стан. Конфігурацію слід тримати окремо від коду додатку. Файли середовища, сховища конфіденційних даних та флаги функціоналу мають знаходитися в одному місці, де оператори можуть їх перевіряти, не читаючи весь код. Коли наступним кроком є код або виклик інструменту, краще використовувати структуровані результати з перевіркою схеми, ніж вільний текст.

Аналіз архітектурних компромісів

На етапі аналізу компромісів у архітектурі необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись визначити прихований стан. Необхідно документувати як успішний, так і відновлювальний сценарії роботи. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації. У разі, коли наступним кроком є написання коду чи виклик інструменту, краще використовувати структуровані результати з перевіркою схеми, ніж вільний текст.

Розгортання у хмарі: масштабування MCP на Kubernetes та Serverless

Для етапу MCP з масштабуванням розгортання типу Cloud-Native необхідно визначити вхідні дані, власника кроку та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись здогадатися про прихований стан. Краще використовувати невеликі, перевірювані одиниці коду замість об’ємних скриптів. Коли крок зазнає невдачі, причина має вказувати на конкретну відповідальність, а не на заплутану структуру процесу. Коли наступним кроком є код або виклик інструменту, краще використовувати структуровані результати з перевіркою схеми, ніж вільний текст.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: mcp-tool-server-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: mcp-tool-server
  minReplicas: 3
  maxReplicas: 50
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
    - type: External
      external:
        metric:
          name: nginx_ingress_controller_requests
        target:
          type: Value
          averageValue: 1000m

Висновки та наступні кроки

На етапі Висновки та наступних кроків необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не здогадуючись про прихований стан. Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Призначте назви документів, визначте критерії успіху та не допускайте мовчазного часткового завершення. У разі, коли наступним кроком є код або виклик інструменту, віддавайте перевагу структурованим результатам із перевіркою за схемою перед вільним текстом.

Ресурси для отримання додаткової інформації

На етапі „Ресурси для отримання додаткової інформації“ необхідно визначити вхідні дані, відповідальну особу за крок та критерії завершення перед зміною коду. Оператори повинні мати можливість перезапустити крок з відомої точки контролю, не намагаючись визначити прихований стан. Записуйте час виконання та витрати на токени чи запити поруч із функціональними результатами. Чітке відображення витрат заздалегідь запобігає несподіваним рахункам під час переходу з демо-середовища у спільні середовища. У разі, коли наступним кроком є написання коду чи виклик інструменту, краще використовувати структуровані результати з перевіркою схеми, ніж вільний текст.

Чек-лист для експлуатації

Під час роботи за чек-листом для експлуатації спочатку запишіть умови виконання: необхідні вхідні дані, сигнал про успіх та наслідки часткової невдачі. Цей чек-лист допомагає зберігати чесність під час подальших змін у коді.

Розглядайте цей етап як контракт між вхідними даними та перевіреними результатами. Дайте назви кожним елементам, визначте критерії успіху та не допускайте мовчазного часткового виконання.

Зберігайте у кеші стабільні інструкції системи та схеми інструментів. Повторна передача ідентичних даних є поширеною причиною проблем.

Розкривайте інструменти з вузькими схемами та чіткими позначеннями побічних ефектів. Хостам потрібно знати, які виклики змінюють стан, перш ніж автоматично схвалити їх.

Коли дозволяє бюджет, додавайте тест на базову функціональність, який перевіряє критичний шлях у процесі CI за допомогою фікстур, а не реальних платних API.

Документуйте як шлях успішної роботи, так і шлях відновлення одночасно. Повторні спроби, людський контроль та обробка некоректних повідомлень є частиною продукту, а не етапом подальшої оптимізації.

Перш ніж запускати стек у продакшн, заморозьте версії, створіть «золотий» запис для критичного шляху та підтвердьте кроки відкату. У спільних середовищах необхідні обмеження швидкості, перевірки прав власності та чіткий власник для зміни секретів. Віддавайте перевагу надійності перед креативними одноразовими демонстраціями.

Примітка для ecba7bb3b9c6: не зберігайте ключі постачальника у репозиторії, встановіть ліміт токенів на сеанс та зберігайте записи поруч із фікстурами оцінки, щоб подальша заміна моделей залишалася порівнянною.