Skip to content

mcpx client: the deprecated HTTP+SSE transport, for remote servers that still speak it #1944

Closed

Description

@dezren39

Relocated from dezren39/darwin-nix#220 on 2026-10-28 (placement audit): mcpx's single source lives in developing-today/code (pkgs/mcpx); re-home tracked at #309. Original body below; issue references inside it are historical (dezren39/nix numbering).

Parent: #181

Summary

mcpx speaks stdio and Streamable HTTP. The 2024-11-05 HTTP+SSE transport (two endpoints, a persistent event stream) is neither served nor spoken, transport: sse in config is ignored, and there is no fallback from Streamable HTTP to it, which the backward-compatibility guidance in every later revision describes. The transport is deprecated and on a short removal clock (2026-07-28/deprecated.mdx:31), so this is worth doing only if a server someone uses still needs it; opencode v1 has the fallback.

Found while writing the comparison register (pkgs/mcpx/docs/compare/) and checked against the code at 05c78b2. Each row below links its register entry, which carries the value, effort, risk, the specification text and every source.

Register rows

row difference mcpx @ 05c78b2 effort
TR-10 HTTP+SSE transport (2024-11-05) ✗ — neither served nor spoken; transport: sse ignored M
TR-11 Client fallback from Streamable HTTP to HTTP+SSE ✗ — no fallback M

What to do

Decide first: implement the fallback, or reject transport: sse with a message naming the alternative (the declared-but-inert setting is the #177 bug either way).

Ease · Impact · Related

Ease M · Impact low · Related: #177

Acceptance criteria

  • The decision is recorded on this issue first: implement HTTP+SSE support, or explicitly reject it — and if rejected, transport: sse in config fails loudly (error or warning) instead of being silently ignored.
  • If implemented: the mcpx client falls back from Streamable HTTP to the 2024-11-05 HTTP+SSE transport (register TR-11), and mcpx speaks/serves that transport where the register requires it (TR-10).
  • A regression test exercises the fallback against an SSE-only test server.
  • Docs (pkgs/mcpx/docs/) describe the supported transports and the config behavior.

Activity

  1. developing-today commented on Oct 28, 2026

    @developing-today
    Contributor
  2. dezren39 commented on Oct 28, 2026

    @dezren39
    MemberAuthor

    History carried over from dezren39/darwin-nix#220 (verbatim, oldest first):


    @dezren39 · 2026-10-28T04:30:00Z

    🤖 Intake review — fleet monitor, 2026-10-27 run

    • Related: parent tracker Phase 3: sync, blob gate, and relays #181; register rows TR-10/TR-11 in pkgs/mcpx/docs/compare/register/transports.md.
    • Evidence caveat: the register evidence was verified against mcpx at 05c78b2 (2026-09-30). Re-verify each row against current main before fixing — a row may have moved since.
    • Still live: checked this run — no merged PR references this issue (cross-references are the register/tracker issues themselves).
    • Risks: the transport is deprecated with a short removal clock (per the body's register citation) — the decision step matters more than the code; do not build it if no server in use still needs it.
    • Suggested approach: decision first (one comment), then the client fallback only, which is the half a user can actually hit.
  3. added
    enhancementNew feature or request
    source/humanFiled directly by a human
    priority/normalOrdinary priority (the default)
    effort/mMedium: expected under 1 day of work
    meta/enrichedIntake review done: acceptance criteria, links, and normalized labels added
    app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 28, 2026
  4. added
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 29, 2026
  5. 7 remaining items

  6. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: triaged (coverage pass)
    Agent: queue worker (repo-worker-code), OpenChamber scheduled lane 02cafe76
    Found via: queue claim (task 7790, triage)

    Verdict: mostly done; re-scoped to one live docs item. Follow-up enqueued as task 8141.

    Evidence (fresh, at origin/main 314fbbe, 2026-11-03):

    • Client speaking of 2024-11-05 HTTP+SSE: implemented — connectSSE (internal/pool/pool.go:904), LegacySSETransport, era fast path (pool.go:659-664), era write (pool.go:718-726, TransportHTTPSSE in internal/pool/eras.go:30).
    • Streamable→HTTP+SSE fallback: implemented — LegacyHTTPRefusedError refusal path (pool.go:674-687), regression test TestHTTPSSEFallback (internal/pool/sse_test.go:118) against SSE-only double oldSSEServer (sse_test.go:20-30).
    • Stale: docs/compare/register/transports.md:32-33 still claim TR-10 "neither served nor spoken; transport: sse ignored (feat(id): add terminal buffer capture interface #220)" and TR-11 "no fallback (feat(id): add terminal buffer capture interface #220)"; detail :259 still cites pre-migration 05c78b2 lines.
    • Verified true on main: no /sse+/messages server routes in internal/daemon, internal/api, internal/mcpserver; transport: sse is documented as an http-equivalent alias (docs/modes.md:80-87, internal/api/ops_settings.go:129).

    Decisions recorded here (see the 2026-10-29 re-scope):

    • Server-side HTTP+SSE: do not serve — deprecated with the shortest removal clock, no demand. Revisit only if a real server requires mcpx downstream as an SSE server.
    • One live item remains: truth-up TR-10/TR-11 (enqueued small_fix task 8141).
  7. added
    queue/queuedHas a queued task in the Supabase agent queue
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: triaged (coverage pass)
    Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
    Found via: coverage pass 2026-11-03

  9. added
    queue/claimedQueue worker lifecycle state
    work/assignedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
  10. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done — already implemented (task 8141)

    • Agent: repo-worker-code, lane code-j (direct execution lane)
    • Task: task 8141 (small_fix) — completed as already_done. The decision this issue asked for was overtaken by events: the fleet implemented the fallback, so the "if implemented" acceptance branch applies and is satisfied on current main.
    • Evidence (fresh this run, origin/main 8e151e8 + this morning's main):
      • pkgs/mcpx/internal/mcpclient/sse.go — LegacySSETransport speaks the 2024-11-05 HTTP+SSE transport (GET opens the stream, first endpoint event names the POST URL; header comment cites both spec revisions and the backwards-compatibility procedure). TR-10's client half: done.
      • Fallback (TR-11): the probe POSTs first and reports LegacyHTTPRefusedError on a 400/404/405 without a modern body; the pool then uses the legacy client and forces the legacy era — documented in pkgs/mcpx/docs/modes.md ("Transport options") and in the /v1 ops description (internal/api/ops_settings.go:129: "Streamable HTTP first, falling back to the legacy 2024-11-05 HTTP+SSE transport when an endpoint refuses it").
      • Regression tests exist and pass (run this run on the laptop at current main): TestHTTPSSETransport, TestALegacyServerIsReachedOnTheFirstTry, TestALegacyServerIsStillReachedWhenModernIsPreferred, TestLegacyHTTPStreamResumption, plus the legacy lifecycle/version-header suites — go test ./internal/mcpclient/ -run Legacy… green.
      • transport: "sse" is no longer silently inert: its documented meaning (modes.md, ops_settings enum stdio|http|sse) is "names a URL server like http — the protocol era is negotiated per endpoint", which now matches the pool's actual behaviour.
      • Server side: mcpx does not serve HTTP+SSE, and that is a recorded choice, not a gap — internal/conformance/requirements.json records "not-implemented-by-choice — mcpx does not serve HTTP+SSE", and docs/in-name-only.md tracks the residual docs wording.
    • Decision recorded (per acceptance criterion 1): implement — done by the fleet as above; the reject-loudly branch is moot. Closing this issue as completed on the evidence above.
    • Labels: claim labels removed at this terminal state.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

app/mcpxPackage/app: mcpx (pkgs/ or apps/ in this repo)effort/mMedium: expected under 1 day of workenhancementNew feature or requestkind/enhancementmeta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)source/humanFiled directly by a humantask/triageQueue packet kind: verify, reproduce, and route this item

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions