Skip to content

mcpx: the four genuine conformance gaps left at 2026-07-28, and the ~50 that are fixture artefacts not defects #1948

Closed

Description

@dezren39

Relocated from dezren39/darwin-nix#252 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).

Baseline from the official suite (@modelcontextprotocol/conformance@0.2.0-alpha.11) against the daemon's /mcp endpoint at 408bc2b:

requirement set passed failed
2026-07-28 115 54
2025-11-25 45 21 (2 of them #251)

Read the 54 correctly before acting on it. About 50 are scenarios that never reach a protocol assertion, because they assume the suite's own fixture surface: tools named slow_compute, confirm_delete, failing_job, test_missing_capability, json_schema_2020_12_tool; prompts named test_simple_prompt, test_prompt_with_arguments; resources under test://; and a tool carrying x-mcp-header annotations. mcpx is a proxy — it publishes its own small tool set and namespaces upstream resources as mcpx://<namespace>/<uri> — so those report failures that say nothing about conformance. Every input-required-result-*, every tasks-*, prompts-get-*, tools-call-{image,audio,embedded-resource,mixed-content,with-progress}, http-custom-header-server-validation and json-schema-2020-12 failure is in this bucket.

Chasing that number as if it were 54 defects would be weeks of work for four fixes.

The four genuine gaps

1. -32021 MissingRequiredClientCapability is never raised.
sep-2575-server-rejects-undeclared-capability. When a tool needs a client capability the request's _meta did not declare, 2026-07-28 requires -32021 (HTTP 400). mcpx runs the tool. The code exists as codeMissingCapability in internal/mcpserver/server.go but nothing in the tools/call path consults the declared capabilities before dispatching.

2. The tasks extension does not gate on the extension capability.
sep-2663-tasks-methods-non-declaring: tasks/get, tasks/update and tasks/cancel must answer -32021 to a client that did not declare io.modelcontextprotocol/tasks; mcpx answers -32602. The extension overview is explicit: "Never return a task to a client that did not declare support."

3. No server-directed task creation.
tasks-server-directed-creation-no-hint, sep-2663-result-type-task-on-create. In 2026 the server decides per request whether to return a CreateTaskResult (resultType: "task"); the per-request opt-in of 2025-11-25 is gone. mcpx only ever creates a task when asked. Also CreateTaskResult must carry ttlMs (renamed from v1 ttl).

4. Mcp-Method on a tools/call changes the result.
tasks-headers-tolerate-mcp-method-on-tools-call: "tool result content MUST be unaffected by the Mcp-Method header." The body is the source of truth; headers are mirrors for intermediaries to route on. Something in the header path is feeding dispatch.

(1)-(3) are properly exercisable only against a server that publishes the fixture tools, which argues for #133's scriptable mock MCP server rather than guessing.

Also worth recording

  • An official suite exists and is governance-critical. SEP-2484 (Final) makes a merged conformance scenario a condition of a Standards Track SEP reaching Final; SEP-1730 ties official SDK tiering to a percentage from it (Tier 1 = 100%). Its requirements/<revision>.yaml sets are frozen on purpose.
  • The npm latest tag is a 0.1.x that predates 2026-07-28. Install @alpha or you will score against the wrong revision.
  • SEP-1627, the earlier "conformance testing" proposal, is closed and superseded by SEP-2484; its golden-trace design was explicitly not carried forward. Reading 1627 and stopping is how you conclude no suite exists.
  • pkgs/mcpx/scripts/conformance.sh already runs both legs, including mcpx as the client under test via internal/conformance/officialclient. It needs CONFORMANCE_DIR; the install is the only step needing network, and nothing in go test touches it.
  • A per-revision record of what a server owes, including the obligations the prose implies but never states, is now at pkgs/mcpx/docs/spec/server-obligations.md §7.

Suggested next step

Wire scripts/conformance.sh into CI as a non-blocking job with a recorded baseline and an expected-failures file (the suite supports --expected-failures), so the number moves only deliberately. That is the cheap way to stop this regressing again — #251 is exactly the kind of drift it would have caught the same day.

Acceptance criteria

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#252 (verbatim, oldest first):


    @dezren39 · 2026-10-27T15:36:22Z

    Intake review

    Fleet monitor intake pass, 2026-10-27 (repo-fleet-monitor).

    Related: the 2026-09-30 mcpx conformance set — parent analysis #252, siblings #253, #254, #255, #256, #257, #258, #259 (filed together from docs/spec/conformance-matrix.md in dezren39/nix). Treat the set as one body of work; do not re-file per-gap issues.

    Notes: This is the parent analysis for the whole conformance set — its real content is the read of the 54 failures (≈50 fixture artefacts, 4 genuine). It already carried legacy bug/testing labels; normalized to the taxonomy here. Priority normal as the set's map; the genuine-gap children carry their own priorities.

    Risks: Treating this as a fix-it issue — it is a tracker/analysis item; work lands in the children.

    Suggested approach: keep open as the set tracker; re-baseline after the next conformance run.

  3. added
    bugSomething isn't working
    kind/bugSomething isn't working (prefixed form of the classic bug label)
    priority/normalOrdinary priority (the default)
    effort/lLarge: multi-day or open-ended; expect staged check-ins
    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. dezren39 commented on Oct 29, 2026

    @dezren39
    MemberAuthor

    Cross-reference from triage task 2824: relocated issue #1928 (mcpx tasks extension, from dezren39/darwin-nix#209) was closed as a duplicate of the #1554 set, with this issue named as the live owner of the residual tasks-extension conformance specifics — gaps 2 (extension-capability gating of tasks/get|update|cancel) and 3 (server-directed task creation) above. Full mapping: #1928 (comment)

  5. 9 remaining items

  6. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · picked up

    • Agent: queue worker (repo-worker-code), Lane C shift
    • Session / ID: queue task 3247
    • Found via: queue claim
    • Task: Implement gaps 1-2 of this tracker: -32021 MissingRequiredClientCapability in the tools/call dispatch and tasks/get|update|cancel gating in pkgs/mcpx/internal/mcpserver, with targeted tests. Gaps 3-4 stay tracked here.
    • Expectation: branch + PR this shift; merge on green CI + Codex disposition, else park with resume brief.
  7. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done (already implemented)

    • Agent: queue worker (repo-worker-code), Lane C shift
    • Session / ID: queue task 3247 — completed as already_done; no PR, no code changed
    • Found via: queue claim; revalidation against fresh main (fee1312) before touching any file
    • Task: Gaps 1-2 of this tracker are BOTH already implemented on current main, with tests — the task packet (triaged 2026-10-29) is stale:
      • Gap 2 (tasks gating): handleTask in pkgs/mcpx/internal/mcpserver/tasks.go returns missingTasks (-32021 with requiredCapabilities naming io.modelcontextprotocol/tasks) for modern tasks/get|update|cancel from a non-declaring client, checked before the task id. Pinned by TestTasksPerEra/2026-07-28/tasks/methods-from-a-non-declaring-client-are-32021 in requirements_test.go — run on the laptop this shift: PASS.
      • Gap 1 (tools/call capability): the pass-through relay now carries the caller's declared capabilities: internal/mcpclient/modern.go sets the per-request clientCapabilities meta to narrowCapabilities(own, ClientCapabilitiesFrom(ctx)) (never wider than mcpx's own), so an upstream that requires a capability the caller did not declare raises -32021 itself, and mcpserver relays that error whole (UpstreamError in capability.go). mcpclient package tests PASS on the laptop this shift. (docs/spec/official-suite.md still describes the old defect — worth a doc refresh when the conformance baseline is next re-run.)
    • Expectation: gaps 1-2 checked off here; gaps 3-4 remain tracked on this issue, still open. A conformance re-run (scripts/conformance.sh, needs CONFORMANCE_DIR) remains the end-to-end proof for the suite scenarios.
  8. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    agent-note:v1
    state: triaged → closed (all acceptance met at current main)
    Agent: queue worker (repo-worker-code), OpenChamber scheduled lane 02cafe76
    Found via: queue claim (task 7808, triage)

    Verdict: all four genuine gaps are fixed on main, the ~50 fixture failures are documented, and the baseline is now generated + recorded in CI. Nothing here needs routing; closing with evidence.

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

    1. -32021 for undeclared client capability. Implemented and tested — internal/mcpclient/modern.go narrows per-request clientCapabilities to the caller's declared set, and the relay carries the upstream's -32021 whole (UpstreamError). Verified on main 2026-10-30 by task 3247 (tests PASS).
    2. Tasks methods gating on the extension capability. handleTask returns missingTasks (-32021) before the task id for modern tasks/get|update|cancel from a non-declaring client; pinned by TestTasksPerEra/2026-07-28/tasks/methods-from-a-non-declaring-client-are-32021.
    3. Server-directed task creation. Implemented: a task-supporting slow call returns a flat CreateTaskResult with ttlMs/pollIntervalMs/status/createdAt/lastUpdatedAt — internal/mcpserver/requirements_test.go:862 (2026-07-28/tasks/server-directed-CreateTaskResult-is-flat), plus fast-call-is-answered-directly and the no-extension cases; scenario mapping in internal/conformance/coverage_stateful.go:11-13.
    4. Mcp-Method must not change a tools/call result. Header handling is a mirror check only: checkModernHeaders (internal/mcpserver/transport.go:287-320) rejects disagreement with the body (-32020) and dispatch reads the body, so the header cannot alter the result (internal/mcpserver/transport.go:314).

    Acceptance criteria:

    • ~50 fixture artefacts documented as artefacts — docs/spec/official-suite.md names the suite's fixture surface (reference everything-server.ts, the tasks SDK fixtures, internal/testsupport/taskmcp) and says to read failure lists, not totals.
    • Four gaps tracked — 1-2 were implemented under this tracker's follow-up (task 3247); 3-4 are implemented with the tests above. The remaining smaller gaps live at mcpx: smaller conformance gaps -- user identity, annotation trust, rate limits, cursors, URI encoding, prompt validation, restart, invalidation #1957.
    • Baseline replaced — docs/spec/conformance-matrix.md is now generated (do-not-edit, regenerated by TestMatrix) and .github/workflows/mcpx-conformance.yml runs the official suite non-blocking with per-leg recorded baselines (scripts/conformance-record.py), exactly the suggested next step.

    Closing as done. Reopen (or file fresh) if a 2026-07-28 scenario regresses; the CI record is the guard.

  9. added
    queue/queuedHas a queued task in the Supabase agent queue
    source/creatorFiled by the new-issue-creator job
    task/triageQueue packet kind: verify, reproduce, and route this item
    on Nov 3, 2026
  10. 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

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)bugSomething isn't workingeffort/lLarge: multi-day or open-ended; expect staged check-inskind/bugSomething isn't working (prefixed form of the classic bug label)meta/enrichedIntake review done: acceptance criteria, links, and normalized labels addedpriority/normalOrdinary priority (the default)queue/queuedHas a queued task in the Supabase agent queuesource/creatorFiled by the new-issue-creator jobstatus/needs-triageNot yet triaged; needs a first looktask/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