درس ۳۲ از ۳۳

الگوهای production deployment (Production deployment patterns)

عنوان اصلی: Production deployment patterns

هدف یادگیری: انتخاب الگوی deployment مناسب برای MCP server شما.

سه الگوی اصلی:

۱. Stateless serverless — روی Cloudflare Workers، Vercel، AWS Lambda. هر request یک invocation. بدون session id. عالی برای serverهایی که وضعیت ندارند (Time، Fetch، Calculator). overhead کم، مقیاس‌پذیر، اما هر request initialize لازم دارد یا client باید stateless mode را بفهمد.

۲. Stateful container — روی Cloud Run، Fargate، Kubernetes. session id دارد. برای serverهایی که DB connection، subscription یا state هستند. نیاز به sticky session دارد (load balancer باید درخواست‌های با همان Mcp-Session-Id را به همان pod بفرستد).

۳. Edge با OAuth — server یک endpoint OAuth 2.1 با PKCE دارد. host از کاربر اجازه می‌گیرد، token می‌گیرد، و آن را به‌عنوان Bearer روی هر request می‌فرستد. این الگوی Sentry، Atlassian، و GitHub remote MCP server است.

مثال عملی — Python (FastMCP پشت Bearer token)

from mcp.server.fastmcp import FastMCP
from starlette.middleware.base import BaseHTTPMiddleware

mcp = FastMCP("Auth'd")

class BearerAuthMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        token = request.headers.get("authorization", "").removeprefix("Bearer ")
        if not validate_token(token):
            return Response("Unauthorized", status_code=401)
        return await call_next(request)

# Attach middleware to FastMCP's HTTP app
mcp.streamable_http_app().add_middleware(BearerAuthMiddleware)

if __name__ == "__main__":
    mcp.run(transport="streamable-http")

Observability

از primitive logging به‌علاوه tracing استاندارد (OpenTelemetry) استفاده کنید. Mcp-Session-Id را به‌عنوان trace tag بگذارید تا بتوانید چندین request در یک session را correlate کنید. هرگز body خام request را که شامل سکرت است log نکنید.

اشتباهات رایج

  • deploy کردن stateful بدون sticky session. کاربر در میانه session ناگهان 404 Not Found می‌بیند چون request به replicaای رسیده که session را نمی‌شناسد.
  • استفاده از API key بدون expiry. OAuth 2.1 + PKCE استانداردتر است.
  • سکرت در log. بازنویسی هر بار که تیم spec را می‌خواند: «MUST NOT include credentials, PII, or internal system details».