{
  "summary": "Supplemental research confirms the 2026 v2 options `responseMode: \"sse\"` and `legacy: \"stateless\"` are current. The exact compatibility blocker is instead `toNodeHandler(route)`: the adapter expects the handler object returned by `createMcpHandler`. Fix three blockers first: serve RFC 9728 metadata and challenge with the resource-server URL; validate Origin before MCP dispatch; and verify or replace `responseMode: \"sse\"` plus `legacy: \"stateless\"` against the pinned 2026-07-28 SDK. Also enforce strict JWT claims, tenant predicates, distributed quotas, ordered shutdown, and initialized OpenTelemetry.",
  "detectedLanguage": "TypeScript",
  "framework": null,
  "runtime": "Node.js",
  "detectedTechniques": [
    {
      "name": "Cooperative cancellation with AbortSignal",
      "category": "Control flow",
      "evidence": "The handler combines `AbortSignal.timeout(8_000)` with `extra.signal`, but the index checks the signal only once."
    },
    {
      "name": "Asynchronous control flow",
      "category": "Control flow",
      "evidence": "Authentication, tool execution, routing, and shutdown use promises and `await`."
    },
    {
      "name": "HTTP requests with Fetch",
      "category": "Networking",
      "evidence": "No direct `fetch()` call is visible; remote JWKS retrieval is an indirect outbound boundary."
    },
    {
      "name": "Environment-based configuration",
      "category": "Configuration",
      "evidence": "Issuer, audience, JWKS URL, and port come from environment variables."
    },
    {
      "name": "Runtime schema validation",
      "category": "Validation",
      "evidence": "Zod constrains query length, result count, and request-key format."
    },
    {
      "name": "Function decomposition",
      "category": "Architecture",
      "evidence": "Authentication, authorization, limiting, indexing, routing, and shutdown are separated."
    }
  ],
  "modernityAnalysis": [
    {
      "technique": "Cooperative cancellation with AbortSignal",
      "status": "modern",
      "explanation": "Signal composition matches current cancellation practice, including transport-driven cancellation when a response stream closes. The real dependency chain must honor the signal.",
      "recommendation": "Propagate the composed signal into every database, HTTP, vector-search, worker, and stream operation; classify timeout separately from disconnect.",
      "citations": [
        "S1",
        "WEB-3",
        "WEB-6"
      ]
    },
    {
      "technique": "Asynchronous control flow",
      "status": "modern",
      "explanation": "Async handlers suit I/O-bound MCP work, but async execution alone does not bound resource use or drain work during shutdown.",
      "recommendation": "Add per-tenant concurrency limits and track active operations for cancellation and draining.",
      "citations": [
        "S5",
        "S9",
        "WEB-1",
        "WEB-6"
      ]
    },
    {
      "technique": "HTTP requests with Fetch",
      "status": "acceptable",
      "explanation": "No direct Fetch client exists, so retry, redirect, SSRF, timeout, and response-size policies cannot be audited.",
      "recommendation": "For future outbound clients, enforce HTTPS and host allowlists, propagate cancellation, cap responses, disable unsafe redirects, and retry only classified idempotent failures.",
      "citations": [
        "S2",
        "S9"
      ]
    },
    {
      "technique": "Environment-based configuration",
      "status": "acceptable",
      "explanation": "Startup configuration is externalized, but URL trust, port range, and canonical resource identity are not validated.",
      "recommendation": "Validate all configuration once, require HTTPS outside development, and add a canonical `MCP_RESOURCE_URL`.",
      "citations": [
        "S3",
        "S4",
        "WEB-2"
      ]
    },
    {
      "technique": "Runtime schema validation",
      "status": "modern",
      "explanation": "Zod validates tool arguments, but `payload as Claims` supplies no runtime validation for JWT claims.",
      "recommendation": "Strictly parse verified claims and bound serialized output bytes. Remove `requestKey` unless backed by replay storage and clear semantics.",
      "citations": [
        "S3",
        "WEB-2"
      ]
    },
    {
      "technique": "Function decomposition",
      "status": "modern",
      "explanation": "Responsibilities are separated, but policy remains split between HTTP routing and individual tools.",
      "recommendation": "Centralize typed authentication and authorization context, with a default-deny capability declaration for every tool.",
      "citations": [
        "S10",
        "WEB-1",
        "WEB-2"
      ]
    },
    {
      "technique": "Current MCP v2 handler options",
      "status": "modern",
      "explanation": "`createMcpHandler`, `McpServer`, `responseMode`, `legacy: \"stateless\"`, pass-through `authInfo`, and handler `close()` remain current v2 concepts as of August 2026.",
      "recommendation": "Retain these APIs, but pass the `createMcpHandler` result—not the custom route function—to `toNodeHandler`; choose `legacy: \"reject\"` if legacy compatibility is unnecessary.",
      "citations": [
        "WEB-13",
        "WEB-14"
      ]
    }
  ],
  "securityConcerns": [
    {
      "title": "Protected Resource Metadata and challenge target are incorrect.",
      "severity": "high",
      "codeEvidence": null,
      "explanation": "No RFC 9728 endpoint is served, and the challenge derives its URL from the authorization-server issuer rather than the MCP protected resource.",
      "recommendation": "Serve path-aware metadata for a canonical MCP resource URL and challenge with that metadata URL plus the required scope where appropriate.",
      "citations": [
        "WEB-1",
        "WEB-2",
        "WEB-4",
        "WEB-5"
      ]
    },
    {
      "title": "Mandatory Origin validation is absent.",
      "severity": "high",
      "codeEvidence": null,
      "explanation": "The MCP route reaches dispatch without checking Origin. Current Streamable HTTP requires rejecting an invalid present Origin with 403 as a DNS-rebinding defense.",
      "recommendation": "Validate Origin against an explicit allowlist before authentication and dispatch; define deliberate behavior for clients that omit Origin.",
      "citations": [
        "WEB-3",
        "WEB-6"
      ]
    },
    {
      "title": "Node adapter receives the wrong handler shape",
      "severity": "high",
      "codeEvidence": "const nodeHandler = toNodeHandler(route);",
      "explanation": "The current adapter expects the object returned by `createMcpHandler`, exposing `fetch` and `close`. `route` is only a function, producing a type defect and possible runtime failure.",
      "recommendation": "Pass `mcp` to `toNodeHandler` and place health routing, authentication, and security middleware around that adapter according to the SDK mounting API.",
      "citations": [
        "WEB-13",
        "WEB-14",
        "WEB-15"
      ]
    },
    {
      "title": "Host validation is also absent",
      "severity": "high",
      "codeEvidence": "httpServer.listen(config.port, \"127.0.0.1\");",
      "explanation": "Binding to loopback does not prevent DNS rebinding through an attacker-controlled Host value. The raw Node mounting guide pairs Host and Origin validation before dispatch.",
      "recommendation": "Compose `localhostHostValidation()` and `localhostOriginValidation()` for loopback use; use explicit production host/origin allowlists for public deployments.",
      "citations": [
        "WEB-15"
      ]
    },
    {
      "title": "explain_access lacks tool-specific authorization",
      "severity": "high",
      "codeEvidence": "\"explain_access\",",
      "explanation": "Any authenticated token can retrieve the subject, workspace, and complete scope set because this handler has no `requireScope` call.",
      "recommendation": "Require a dedicated scope such as `mcp:permissions:read`, minimize the response, or remove the tool.",
      "citations": [
        "WEB-2",
        "WEB-4"
      ]
    }
  ],
  "performanceConcerns": [
    {
      "title": "The in-memory limiter grows without bound.",
      "severity": "medium",
      "codeEvidence": null,
      "explanation": "Idle keys are never removed, each acceptance filters and reallocates an array, and quotas are neither shared nor atomic across replicas.",
      "recommendation": "Use an expiring distributed token bucket or counter, plus per-tenant concurrency and cost budgets. Return 429 with `Retry-After`.",
      "citations": [
        "S9"
      ]
    },
    {
      "title": "OpenTelemetry lifecycle and propagation are incomplete.",
      "severity": "medium",
      "codeEvidence": null,
      "explanation": "No NodeSDK, provider, exporter, HTTP instrumentation, context extraction, metrics, or telemetry shutdown is shown; clearing the active span may discard useful context.",
      "recommendation": "Initialize NodeSDK before listening, preserve incoming context, avoid raw identity attributes, and flush or shut down telemetry within the shutdown deadline.",
      "citations": [
        "WEB-10",
        "WEB-11",
        "WEB-12"
      ]
    },
    {
      "title": "Shutdown ordering can stall on active MCP exchanges",
      "severity": "high",
      "codeEvidence": "await mcp.close();",
      "explanation": "`mcp.close()` runs only after awaiting `httpServer.close()`. Active MCP exchanges can therefore keep HTTP shutdown open until the deadline. Telemetry is also not explicitly flushed.",
      "recommendation": "Make shutdown idempotent; stop admission, close or cancel MCP exchanges, drain bounded work, close HTTP connections, then perform bounded OpenTelemetry `forceFlush()` and `shutdown()` before exit.",
      "citations": [
        "WEB-13",
        "WEB-10",
        "WEB-11",
        "WEB-19"
      ]
    },
    {
      "title": "Forced SSE adds avoidable connection pressure",
      "severity": "medium",
      "codeEvidence": "responseMode: \"sse\",",
      "explanation": "SSE is always selected even for short, notification-free calls. Modern Streamable HTTP also differs from legacy resumable GET/SSE behavior.",
      "recommendation": "Prefer `auto` where negotiation is supported, or JSON for short calls. If SSE is required, configure proxy buffering and idle timeouts and test legacy behavior separately.",
      "citations": [
        "WEB-13",
        "WEB-3",
        "WEB-18"
      ]
    }
  ],
  "maintainability": {
    "assessment": "The implementation has clear modules and useful boundary schemas, but production policy and lifecycle behavior are fragmented and several critical dependencies remain stubs or unverified.",
    "strengths": [
      "Tool arguments are bounded with Zod.",
      "JWT verification constrains issuer, audience, and algorithms.",
      "Tool work receives a composed cancellation signal."
    ],
    "improvements": [
      "Pin exact MCP package versions and add 2026-07-28 conformance tests.",
      "Replace JWT type assertions with strict parsing and central policy context.",
      "Track transports and active operations through an idempotent shutdown coordinator.",
      "Validate `PORT` as an integer from 1 through 65535; the current `Number(...)` accepts invalid values.",
      "Use an awaited async startup path so listen errors are observed.",
      "Make shutdown a shared idempotent promise and clear any deadline timer after successful cleanup."
    ]
  },
  "modernAlternatives": [
    {
      "current": "Issuer-derived OAuth metadata challenge.",
      "alternative": "Canonical MCP resource URL with RFC 9728 path-aware metadata.",
      "rationale": "Authorization-server and protected-resource identities have different discovery roles.",
      "citations": [
        "WEB-4",
        "WEB-5"
      ]
    },
    {
      "current": "Process-local array-based rate limiter.",
      "alternative": "Distributed expiring limiter plus bounded concurrency.",
      "rationale": "This keeps quotas consistent across replicas and bounds storage and downstream load.",
      "citations": [
        "S9"
      ]
    },
    {
      "current": "Plain JSON text containing repository excerpts.",
      "alternative": "Structured untrusted content with repository, commit, path, and line provenance.",
      "rationale": "Repository content may contain prompt injection; provenance creates a clearer trust boundary, though annotations remain emerging guidance.",
      "citations": [
        "WEB-7",
        "WEB-8",
        "WEB-9"
      ]
    }
  ],
  "upgradeSuggestions": [
    {
      "priority": "now",
      "title": "Repair OAuth resource-server behavior and JWT validation.",
      "steps": [
        "Add and validate `MCP_RESOURCE_URL`, serving its RFC 9728 metadata document.",
        "Point 401 challenges to resource metadata; use 403 insufficient-scope challenges where transport-level step-up is intended.",
        "Strictly require string `sub` and `workspace_id`, required `exp`, expected audience and issuer, and deployment-specific token-use claims.",
        "Pass expiry through verified SDK authentication context."
      ],
      "citations": [
        "WEB-2",
        "WEB-4",
        "WEB-5",
        "WEB-7",
        "S3"
      ]
    },
    {
      "priority": "now",
      "title": "Conform and test the current Streamable HTTP transport.",
      "steps": [
        "Pin exact SDK versions and migrate unverified `responseMode` and `legacy` options to documented 2026-07-28 APIs.",
        "Validate Origin before dispatch.",
        "Test POST-only JSON/SSE responses, protocol-version metadata, notification handling, disconnect cancellation, and proxy behavior."
      ],
      "citations": [
        "WEB-1",
        "WEB-3",
        "WEB-6"
      ]
    },
    {
      "priority": "now",
      "title": "Enforce authorization and isolation below the tool layer.",
      "steps": [
        "Declare a default-deny scope matrix for every tool and redact `explain_access`.",
        "Derive tenant identity only from verified claims and enforce it in database or index predicates and partitions.",
        "Add cross-tenant substitution, stale-membership, malformed-claim, and mixed-result tests."
      ],
      "citations": [
        "WEB-2",
        "WEB-4",
        "WEB-7"
      ]
    },
    {
      "priority": "now",
      "title": "Correct v2 Node mounting",
      "steps": [
        "Keep the current `createMcpHandler` options.",
        "Pass the resulting `mcp` handler object to `toNodeHandler`.",
        "Compose Host and Origin guards before dispatch.",
        "Add a compile test against the exact pinned SDK versions."
      ],
      "citations": [
        "WEB-13",
        "WEB-14",
        "WEB-15"
      ]
    },
    {
      "priority": "next",
      "title": "Define safe retry behavior",
      "steps": [
        "Use bounded exponential backoff with jitter only for transient transport reconnection or explicitly idempotent operations.",
        "Do not blindly replay side-effecting `tools/call` requests after ambiguous failures.",
        "Do not retry invalid tokens; permit only the SDK-defined credential refresh path on 401."
      ],
      "citations": [
        "WEB-3",
        "WEB-16",
        "WEB-17"
      ]
    }
  ],
  "educationalExamples": [
    {
      "title": "Strict verified-claim parsing.",
      "concept": "JWT verification and claim validation are separate steps.",
      "explanation": "Verify cryptography first, then parse authorization claims at runtime rather than asserting a TypeScript type.",
      "code": "const ClaimsSchema = z.object({\n  sub: z.string().min(1),\n  workspace_id: z.string().min(1),\n  exp: z.number().int().positive(),\n  scope: z.string().optional(),\n}).passthrough();\n\nasync function authenticate(token: string) {\n  const { payload } = await jwtVerify(token, jwks, {\n    issuer: config.issuer,\n    audience: config.audience,\n    algorithms: [\"RS256\", \"ES256\"],\n  });\n  return ClaimsSchema.parse(payload);\n}",
      "language": "TypeScript",
      "citations": [
        "S3",
        "WEB-2",
        "WEB-4"
      ]
    },
    {
      "title": "Origin gate and resource-server challenge.",
      "concept": "Streamable HTTP and OAuth discovery checks belong before MCP dispatch.",
      "explanation": "This focused route rejects untrusted browser origins and advertises metadata belonging to the protected resource.",
      "code": "const allowedOrigins = new Set([\"https://agent.example\"]);\nconst resourceMetadata =\n  \"https://mcp.example/.well-known/oauth-protected-resource/mcp\";\n\nfunction guard(request: Request): Response | undefined {\n  const origin = request.headers.get(\"origin\");\n  if (origin && !allowedOrigins.has(origin)) {\n    return new Response(\"Forbidden\", { status: 403 });\n  }\n  if (!request.headers.has(\"authorization\")) {\n    return new Response(\"Unauthorized\", {\n      status: 401,\n      headers: { \"WWW-Authenticate\":\n        `Bearer resource_metadata=\"${resourceMetadata}\", scope=\"code:read\"` },\n    });\n  }\n}",
      "language": "TypeScript",
      "citations": [
        "WEB-3",
        "WEB-4",
        "WEB-5"
      ]
    }
  ],
  "generatedAt": "2026-08-27T11:31:57.722Z",
  "sources": [
    {
      "title": "WHATWG DOM Standard: aborting ongoing activities",
      "url": "https://dom.spec.whatwg.org/#aborting-ongoing-activities",
      "publisher": "WHATWG",
      "kind": "standard",
      "summary": "Defines AbortController and AbortSignal cancellation semantics.",
      "relevance": "Provides primary semantics for cooperative cancellation of web-platform operations.",
      "official": true,
      "publishedAt": null,
      "id": "S1"
    },
    {
      "title": "Fetch Standard",
      "url": "https://fetch.spec.whatwg.org/",
      "publisher": "WHATWG",
      "kind": "standard",
      "summary": "Living standard for browser fetch behavior.",
      "relevance": "Defines request, response, CORS, and fetch-processing semantics.",
      "official": true,
      "publishedAt": null,
      "id": "S2"
    },
    {
      "title": "Zod documentation",
      "url": "https://zod.dev/",
      "publisher": "Zod",
      "kind": "official-doc",
      "summary": "Official Zod schema-validation documentation.",
      "relevance": "Defines current parsing, validation, and type-inference APIs.",
      "official": true,
      "publishedAt": null,
      "id": "S3"
    },
    {
      "title": "OWASP Secrets Management Cheat Sheet",
      "url": "https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html",
      "publisher": "OWASP Foundation",
      "kind": "engineering-article",
      "summary": "Security guidance for managing application credentials.",
      "relevance": "Supports recommendations about key storage, rotation, and least privilege.",
      "official": true,
      "publishedAt": null,
      "id": "S4"
    },
    {
      "title": "ECMAScript language specification",
      "url": "https://tc39.es/ecma262/",
      "publisher": "Ecma TC39",
      "kind": "standard",
      "summary": "Normative specification for the ECMAScript language.",
      "relevance": "Provides primary evidence for JavaScript language semantics.",
      "official": true,
      "publishedAt": null,
      "id": "S5"
    },
    {
      "title": "RFC 9110: HTTP Semantics",
      "url": "https://www.rfc-editor.org/rfc/rfc9110",
      "publisher": "RFC Editor",
      "kind": "standard",
      "summary": "The current core specification for HTTP semantics.",
      "relevance": "Provides normative evidence for status, method, and caching behavior.",
      "official": true,
      "publishedAt": "2022-06-01T00:00:00.000Z",
      "id": "S6"
    },
    {
      "title": "AbortController API",
      "url": "https://developer.mozilla.org/en-US/docs/Web/API/AbortController",
      "publisher": "Mozilla",
      "kind": "official-doc",
      "summary": "Reference for aborting web requests and other asynchronous operations.",
      "relevance": "Defines AbortController and AbortSignal behavior used in effect cleanup.",
      "official": true,
      "publishedAt": null,
      "id": "S7"
    },
    {
      "title": "MDN Web Docs",
      "url": "https://developer.mozilla.org/en-US/docs/Web",
      "publisher": "Mozilla",
      "kind": "official-doc",
      "summary": "Primary reference material for browser platform APIs.",
      "relevance": "Defines current browser APIs, language behavior, and compatibility guidance.",
      "official": true,
      "publishedAt": null,
      "id": "S8"
    },
    {
      "title": "Node.js API documentation",
      "url": "https://nodejs.org/docs/latest/api/",
      "publisher": "OpenJS Foundation",
      "kind": "official-doc",
      "summary": "The maintained Node.js runtime API reference.",
      "relevance": "Documents current runtime behavior and built-in APIs.",
      "official": true,
      "publishedAt": null,
      "id": "S9"
    },
    {
      "title": "TypeScript Handbook",
      "url": "https://www.typescriptlang.org/docs/handbook/intro.html",
      "publisher": "Microsoft",
      "kind": "official-doc",
      "summary": "The official TypeScript language handbook.",
      "relevance": "Documents the supported type-system features and recommended language patterns.",
      "official": true,
      "publishedAt": null,
      "id": "S10"
    },
    {
      "title": "colinhacks/zod v4.4.3",
      "url": "https://github.com/colinhacks/zod/releases/tag/v4.4.3",
      "publisher": "colinhacks",
      "kind": "release-note",
      "summary": "Latest stable GitHub release: v4.4.3.",
      "relevance": "Provides primary release timing and migration context.",
      "official": true,
      "publishedAt": "2026-05-04T07:06:55Z",
      "id": "S11"
    },
    {
      "title": "microsoft/TypeScript TypeScript 7.0.2",
      "url": "https://github.com/microsoft/TypeScript/releases/tag/v7.0.2",
      "publisher": "microsoft",
      "kind": "release-note",
      "summary": "Latest stable GitHub release: v7.0.2.",
      "relevance": "Provides primary release timing and migration context.",
      "official": true,
      "publishedAt": "2026-08-20T18:09:49Z",
      "id": "S12"
    },
    {
      "title": "nodejs/node 2026-08-26, Version 26.8.1 (Current), @aduh95",
      "url": "https://github.com/nodejs/node/releases/tag/v26.8.1",
      "publisher": "nodejs",
      "kind": "release-note",
      "summary": "Latest stable GitHub release: v26.8.1.",
      "relevance": "Provides primary release timing and migration context.",
      "official": true,
      "publishedAt": "2026-08-26T22:10:37Z",
      "id": "S13"
    },
    {
      "title": "colinhacks/zod repository",
      "url": "https://github.com/colinhacks/zod",
      "publisher": "colinhacks",
      "kind": "github",
      "summary": "TypeScript-first schema validation with static type inference",
      "relevance": "Primary implementation repository, active as of 2026-08-27T09:21:33Z.",
      "official": true,
      "publishedAt": "2026-08-27T09:21:33Z",
      "id": "S14"
    },
    {
      "title": "microsoft/TypeScript repository",
      "url": "https://github.com/microsoft/TypeScript",
      "publisher": "microsoft",
      "kind": "github",
      "summary": "TypeScript is a superset of JavaScript that compiles to clean JavaScript output.",
      "relevance": "Primary implementation repository, active as of 2026-08-26T23:49:27Z.",
      "official": true,
      "publishedAt": "2026-08-26T23:49:27Z",
      "id": "S15"
    },
    {
      "title": "nodejs/node repository",
      "url": "https://github.com/nodejs/node",
      "publisher": "nodejs",
      "kind": "github",
      "summary": "Node.js JavaScript runtime ✨🐢🚀✨",
      "relevance": "Primary implementation repository, active as of 2026-08-27T10:37:23Z.",
      "official": true,
      "publishedAt": "2026-08-27T10:37:23Z",
      "id": "S16"
    },
    {
      "id": "WEB-1",
      "title": "TypeScript SDK server guide",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/server.md",
      "publisher": "Model Context Protocol",
      "kind": "official-doc",
      "summary": "Current TypeScript SDK server construction, Streamable HTTP, stateless mode, and shutdown guidance.",
      "relevance": "Primary evidence for current SDK server APIs, transport options, and lifecycle behavior.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-2",
      "title": "TypeScript SDK authorization serving guide",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/serving/authorization.md",
      "publisher": "Model Context Protocol",
      "kind": "official-doc",
      "summary": "Current bearer-auth middleware, verified AuthInfo, protected-resource metadata helpers, and scope behavior.",
      "relevance": "Primary evidence for OAuth resource-server integration and authorization errors.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-3",
      "title": "MCP Streamable HTTP specification, 2026-07-28",
      "url": "https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2026-07-28/basic/transports/streamable-http.mdx",
      "publisher": "Model Context Protocol",
      "kind": "standard",
      "summary": "Current Streamable HTTP rules including POST-only operation, JSON/SSE responses, Origin validation, protocol-version headers, and cancellation.",
      "relevance": "Primary protocol evidence for transport compatibility and security findings.",
      "official": true,
      "publishedAt": "2026-07-28"
    },
    {
      "id": "WEB-4",
      "title": "MCP authorization specification, 2026-07-28",
      "url": "https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2026-07-28/basic/authorization/index.mdx",
      "publisher": "Model Context Protocol",
      "kind": "standard",
      "summary": "Current MCP OAuth discovery, RFC 9728, scope challenges, and status-code requirements.",
      "relevance": "Primary protocol evidence for authorization metadata and tool-scope findings.",
      "official": true,
      "publishedAt": "2026-07-28"
    },
    {
      "id": "WEB-5",
      "title": "RFC 9728: OAuth 2.0 Protected Resource Metadata",
      "url": "https://www.rfc-editor.org/rfc/rfc9728.html",
      "publisher": "IETF RFC Editor",
      "kind": "standard",
      "summary": "Standards-track protected-resource metadata format and audience-restricted-token recommendation.",
      "relevance": "Primary standards evidence for resource metadata and audience binding.",
      "official": true,
      "publishedAt": "2025-04"
    },
    {
      "id": "WEB-6",
      "title": "TypeScript SDK migration notes for protocol 2026-07-28",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/migration/support-2026-07-28.md",
      "publisher": "Model Context Protocol",
      "kind": "release-note",
      "summary": "Migration behavior for modern versus legacy protocol eras and cancellation semantics.",
      "relevance": "Primary evidence for compatibility uncertainty and modern cancellation behavior.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-7",
      "title": "MCP authorization security considerations",
      "url": "https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2026-07-28/basic/authorization/security-considerations.mdx",
      "publisher": "Model Context Protocol",
      "kind": "standard",
      "summary": "Security considerations covering audience binding, token passthrough, OAuth 2.1 practices, and confused deputy risks.",
      "relevance": "Primary evidence for audience validation, token isolation, and authorization hardening.",
      "official": true,
      "publishedAt": "2026-07-28"
    },
    {
      "id": "WEB-8",
      "title": "MCP prompt-injection issue involving server instructions",
      "url": "https://github.com/modelcontextprotocol/modelcontextprotocol/issues/3213",
      "publisher": "Model Context Protocol",
      "kind": "engineering-article",
      "summary": "Reported prompt-injection and cache-poisoning risks in server-provided instructions.",
      "relevance": "Emerging evidence for treating server-authored instructions and content as untrusted; not itself a normative specification.",
      "official": true,
      "publishedAt": "2026-08-07"
    },
    {
      "id": "WEB-9",
      "title": "MCP trust annotations proposal",
      "url": "https://github.com/modelcontextprotocol/modelcontextprotocol/issues/711",
      "publisher": "Model Context Protocol",
      "kind": "engineering-article",
      "summary": "Proposal for provenance, sensitivity, and open-world annotations on MCP content.",
      "relevance": "Supports emerging provenance and prompt-injection-boundary recommendations, with proposal status explicitly noted.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-10",
      "title": "OpenTelemetry JavaScript repository",
      "url": "https://github.com/open-telemetry/opentelemetry-js",
      "publisher": "OpenTelemetry",
      "kind": "github",
      "summary": "NodeSDK setup and graceful shutdown examples for OpenTelemetry JavaScript.",
      "relevance": "Primary implementation evidence for SDK initialization and shutdown.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-11",
      "title": "OpenTelemetry specification: tracing SDK",
      "url": "https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/sdk.md",
      "publisher": "OpenTelemetry",
      "kind": "standard",
      "summary": "Shutdown and force-flush requirements for tracing SDKs and processors.",
      "relevance": "Supports bounded telemetry shutdown and flush recommendations.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-12",
      "title": "OpenTelemetry JavaScript Node SDK README",
      "url": "https://github.com/open-telemetry/opentelemetry-js/blob/main/experimental/packages/opentelemetry-sdk-node/README.md",
      "publisher": "OpenTelemetry",
      "kind": "official-doc",
      "summary": "NodeSDK resource, exporter, instrumentation, and shutdown examples.",
      "relevance": "Supports the OpenTelemetry modernization finding.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-13",
      "title": "TypeScript SDK server and HTTP serving guide",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/serving/http.md",
      "publisher": "Model Context Protocol",
      "kind": "official-doc",
      "summary": "Documents createMcpHandler, per-request factories, responseMode, legacy serving, authInfo pass-through, Node mounting, and handler.close().",
      "relevance": "Primary source for the current TypeScript SDK HTTP handler contract and lifecycle.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-14",
      "title": "TypeScript SDK public server exports and handler types",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/server/src/index.ts",
      "publisher": "Model Context Protocol",
      "kind": "github",
      "summary": "Exports createMcpHandler and McpServer; the handler type exposes fetch and close.",
      "relevance": "Primary source for exact public server exports and handler shape.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-15",
      "title": "TypeScript SDK plain Node HTTP mounting guide",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/docs/serving/http.md",
      "publisher": "Model Context Protocol",
      "kind": "official-doc",
      "summary": "Shows toNodeHandler(handler) plus localhostHostValidation and localhostOriginValidation for raw node:http.",
      "relevance": "Primary source for the exact Node mounting and DNS-rebinding defenses.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-16",
      "title": "TypeScript SDK StreamableHTTPClientTransport implementation",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/blob/main/packages/client/src/client/streamableHttp.ts",
      "publisher": "Model Context Protocol",
      "kind": "github",
      "summary": "Documents reconnection options, bounded backoff, resumption tokens, and one 401 authorization retry.",
      "relevance": "Primary source for current client retry and SSE reconnection behavior.",
      "official": true,
      "publishedAt": null
    },
    {
      "id": "WEB-17",
      "title": "MCP legacy Streamable HTTP transport specification, 2025-03-26",
      "url": "https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-03-26/basic/transports.mdx",
      "publisher": "Model Context Protocol",
      "kind": "standard",
      "summary": "Defines older GET SSE, Last-Event-ID, event IDs, resumability, and replay rules.",
      "relevance": "Primary source for legacy-era retry and resumption distinctions.",
      "official": true,
      "publishedAt": "2025-03-26"
    },
    {
      "id": "WEB-18",
      "title": "SDK issue: responseMode and legacy fallback behavior",
      "url": "https://github.com/modelcontextprotocol/typescript-sdk/issues/2648",
      "publisher": "Model Context Protocol",
      "kind": "engineering-article",
      "summary": "Reports that responseMode may not affect 2025-era legacy fallback traffic in a current SDK build.",
      "relevance": "Compatibility evidence and limitation for mixed-era response negotiation; not normative.",
      "official": true,
      "publishedAt": "2026-08-11"
    },
    {
      "id": "WEB-19",
      "title": "Node.js HTTP server API",
      "url": "https://nodejs.org/api/http.html",
      "publisher": "Node.js",
      "kind": "official-doc",
      "summary": "Defines server.close, closeIdleConnections, closeAllConnections, request timeouts, and connection shutdown behavior.",
      "relevance": "Primary runtime source for graceful HTTP shutdown ordering.",
      "official": true,
      "publishedAt": null
    }
  ]
}
