LearnNewsExamplesServices
Frontmatter
titlefix(ai): rename server transport to streamable-http (#15188)
authorneo-gpt
stateOpen
createdAt1:23 AM
updatedAt1:23 AM
closedAt
mergedAt
branchesdevcodex/15188-streamable-http-server-value
urlhttps://github.com/neomjs/neo/pull/15191
contentTrust
projected
quarantined0
signals[]
Open
neo-gpt
neo-gpt commented on 1:23 AM

Resolves #15188

Refs #15184

Renames Neo's server-side HTTP transport value from sse to streamable-http across the shared startup selector, declarative configuration, Knowledge Base and Memory Core consumers, Docker/Compose profiles, operator documentation, and focused tests. BaseServer#connectTransport() now accepts exactly stdio or streamable-http; the old value emits a targeted migration error, arbitrary values fail closed, and genuine client-side SSEClientTransport support remains unchanged.

Evidence: L3 (real Dockerized KB/MC Streamable HTTP endpoints, stdio non-regression, OIDC, proxy identity, and tenant isolation) → L3 required (all close-target runtime and deployment ACs). No residuals.

Deltas from ticket

None substantive. The repair-capable preflight also removed two stale tracking tokens from explanatory comments in the already-touched authorization spec; no test behavior changed.

Config-template synchronization

  • Changed config keys: no key or environment-variable names changed. The transport leaves in the root, Knowledge Base, Memory Core, and GitLab Workflow templates now document the only supported server values as stdio and streamable-http.
  • Local follow-up: any gitignored config.mjs that currently sets transport: 'sse' must be changed manually to transport: 'streamable-http' after merge. Existing stdio configs require no edit.
  • Restart boundary: remote HTTP MCP servers must be rebuilt/recreated or restarted after applying the value change. Local stdio harnesses do not need a transport-driven restart.

Test Evidence

  • npm run agent-preflight -- <all 48 changed files> — passed, including block alignment and ticket-archaeology checks.
  • npm run test-unit -- test/playwright/unit/ai/mcp/server/BaseServer.spec.mjs test/playwright/unit/ai/mcp/server/knowledge-base/IngestSourceFilesTool.spec.mjs test/playwright/unit/ai/mcp/server/knowledge-base/config.template.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/config.template.spec.mjs test/playwright/unit/ai/mcp/client/McpClientTransportConfig.spec.mjs test/playwright/unit/ai/services/knowledge-base/SearchService.spec.mjs — 90 passed.
  • npm run test-unit -- test/playwright/unit/ai/mcp/server/memory-core/Server.spec.mjs — 20 passed.
  • npm run test-unit -- test/playwright/unit/ai/buildScripts/util/check-aiconfig-test-mutation.spec.mjs test/playwright/unit/ai/scripts/maintenance/kbPushClient.spec.mjs test/playwright/unit/ai/mcp/Authorization.spec.mjs test/playwright/unit/ai/scripts/lint/lintConfigTemplateSsot.spec.mjs test/playwright/unit/ai/mcp/server/shared/services/TransportService.spec.mjs — 85 passed.
  • npm run test-integration-unified -- test/playwright/integration/KBRemoteMcpTransport.integration.spec.mjs test/playwright/integration/KBOidcAuth.integration.spec.mjs test/playwright/integration/KBAuthRejection.integration.spec.mjs test/playwright/integration/AuthRejection.integration.spec.mjs test/playwright/integration/OidcAuth.integration.spec.mjs test/playwright/integration/RemoteMcpTransport.integration.spec.mjs — 20 passed against real Dockerized services on the rebased head.
  • Broader integration disposition: the full 50-case run passed 46 and skipped 2; only the two sustained-liveness p95 checks missed the 500 ms host threshold at 504/506 ms. A focused retry produced 515/505 ms. The same two tests on untouched origin/dev@310026f76f produced 508/508 ms on the same Colima host, establishing baseline host variance rather than a transport-rename regression. The threshold was not weakened.
  • Repository-wide negative sweep found only the intentional old-value migration guard/documentation plus genuine client-side SSE and SSE-framing references; no server-side NEO_TRANSPORT=sse or transport === 'sse' consumer remains outside the migration rejection.
  • git diff --check — passed.

Release-note handoff

This is a small breaking server-configuration change. The first release notes containing it must state:

  • exact migration: NEO_TRANSPORT=sseNEO_TRANSPORT=streamable-http (and the equivalent aiConfig.transport edit);
  • old server configurations now fail startup with a migration error;
  • operators must update configuration before or together with the Neo upgrade, then rebuild/recreate affected MCP servers;
  • client-side transportType: 'sse' and SSEClientTransport remain supported.

Signal Ledger

  • gpt: source-author signal by @neo-gpt at the D#15173 body anchor 2026-07-14T21:44:26Z.
  • claude: non-author graduation approval by @neo-opus-vega at the same body anchor in GRADUATION_APPROVED.
  • Scope precision: that approval governs the graduated local-PoC architecture. This rename leaf was added afterward under the Epic and is not represented as a separate Vega review.

Unresolved Dissent

None recorded at the approved source-body anchor.

Unresolved Liveness

  • The external GENESIS_PROBE_READY receipt remains outstanding for the later end-to-end PoC journey; it does not gate this server-value migration.
  • revalidationTrigger: a substantive change to the approved D#15173 body after 2026-07-14T21:44:26Z, or evidence reversing the one-canonical-name / standard-Streamable-HTTP contract.

Post-Merge Validation

  • Build the KB/MC deployment images from merged dev and repeat the remote transport smoke.
  • Update each affected gitignored remote config.mjs before restarting that server.
  • Confirm the first release notes containing this change carry the exact migration and client-side non-impact above.

Authored by Euclid (OpenAI GPT-5.6 Sol Ultra, Codex Desktop). Session 5b19219a-d8ad-4505-864f-19b5eab44a45.