Skip to content

mcpx: OAuth authorization for remote servers and for /mcp (61 conformance rows) #1950

Open

Description

@dezren39

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

The conformance matrix (docs/spec/conformance-matrix.md, gap key pending:oauth) lists 61 authorization requirements across 2025-03-26..2026-07-28, client and server side, that mcpx does not implement (corrected 2026-10-30 by task 3245: the pending:oauth gap key no longer exists — the rows are now expressed per row per the decision recorded in the comments; remaining gaps point at #1950/#1975): mcpx has no OAuth client (every auth/* scenario of the official suite fails) and /mcp performs no authorization. Related: #240 (configured auth never applied — dezren39/nix number; code-side successor #1926). Scope: decide client OAuth (metadata discovery, PKCE, resource indicators, token binding per issuer) and whether /mcp acts as a resource server.

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


    @dezren39 · 2026-10-27T17:45:06Z

    Intake review

    Related: #240 (configured auth never applied — named in the issue body as related; likely a prerequisite for the client side). Evidence: docs/spec/conformance-matrix.md, gap key pending:oauth — 61 authorization requirements across spec versions 2025-03-26..2026-07-28.

    Liveness: still live — no merged PR implementing mcpx OAuth was found this run (searched merged PRs for OAuth/mcpx), and the issue body itself frames the first step as a scope decision.

    Notes / risks: this is the largest unenriched item in the fleet (effort/l). The decision step (client OAuth scope + whether /mcp is a resource server) should be taken before any implementation task is enqueued, otherwise 61 conformance rows is an unbounded packet. Cross-repo note: mcpx also lives in developing-today/code — a fix here may be a cross-repo set per the fleet's propagation rule; the origin issue stays here.

    Suggested approach: (1) record the scope decision on this issue; (2) split implementation into client-OAuth and /mcp-resource-server follow-ups, each with its conformance rows as the test list; (3) sequence #240 first if it blocks token application.

    🤖 Agent note · handed off

  3. added
    kind/featureNew feature or capability request
    source/humanFiled directly by a human
    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
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 28, 2026
  4. added
    work/assignedQueue worker lifecycle state
    queue/claimedQueue worker lifecycle state
    and removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Oct 29, 2026
  5. 63 remaining items

  6. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Agent note — queue worker Lane D (task 3245, resume)

  7. added a commit that references this issue on Oct 30, 2026
  8. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    Agent note — queue worker Lane D (task 3245, done)

  9. dezren39 commented on Oct 30, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · done

    • Agent: repo-worker-code (OpenChamber scheduled lane)
    • Session / ID: task 3245 (attempt 2/2), queue repo-health-code-pilot
    • Found via: queue claim; prior park was CI pending on PR docs(mcpx): conformance matrix expresses the #1950 OAuth decision per row #2619
    • Task: record the OAuth scope decision and make the conformance matrix express it
    • Expectation: m — done = decision recorded, matrix expresses it per row, golden consistent

    Outcome: PR #2619 MERGED at 2026-10-30T10:50:12Z (merge commit b3f6d2b2), ancestor of current main. Verified fresh this run:

    Pre-existing-at-merge regression, already tracked (not this task's work): TestAuthSplit / TestMatrix fail on current main. I bisected it precisely: fail at PR #2619's merge commit b3f6d2b2, pass at its parent. It is a semantic merge conflict with PR #2673 (39acd905, the authsplit machinery for #1972), which merged 12 minutes earlier; #2619's branch predated it, so its CI never ran the two together. On main, 74 of authsplit.json's 82 judged row-sides no longer bind mcpx, leaving 8 (all permissive, 0 validation). Full analysis, the blast-radius numbers, and the two candidate fixes are posted on #2695, which already tracks this and is assigned to Drew.

    Notes / risks: the authsplit_test.go counts (61 rows / 82 sides / 69 permissive / 13 validation) are now inconsistent with the post-#1950 applicability data — repairing that is a scope call between #1972 (validation rows bound) and #1950's waiver decision, which is why it went to #2695 rather than a passing-test edit here. Until it lands, MCPX_UPDATE_MATRIX=1 fails before the golden write, so any change needing a matrix regeneration is blocked.

  10. 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
  11. 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

  12. dezren39 commented on Nov 3, 2026

    @dezren39
    MemberAuthor

    🤖 Agent note · triaged — live, one scoped remainder, blocked on #2695

    • Agent: queue worker (repo-worker-code), OpenChamber scheduled lane
    • Session / ID: ses_e5e5db7d11cffeh9uGRhQN1hIJ; queue task 7805 (triage)
    • Found via: atomic queue claim (coverage pass, code slices 3+)

    Verdict: #1950 stays open, but most of its acceptance is already satisfied at main 048da81f1; the remainder is mechanical and gated on #2695. Recorded here with fresh evidence rather than re-litigating the 2026-10-30 decision.

    Acceptance, item by item:

    Item State
    Decision recorded (client OAuth, /mcp as resource server) done — recorded 2026-10-30; PR #2619 merged, matrix expresses the decision per row. Client OAuth remains deferred by choice.
    /mcp resource server implemented — #1975 → PR #2711 merged 2026-10-30; pkgs/mcpx/internal/daemon/bearer.go on main with TestRequireBearer / TestValidateBearerToken. Issue #1975 closed COMPLETED 2026-11-03T15:08Z.
    Conformance/-official-suite scenario for unauthenticated /mcp rejection missing — daemon unit tests exist, no conformance-set scenario found (grep -rn bearer internal/conformance/*.go → none).
    Prerequisite #1926 (ex-#240) done — closed; PR #2593 merged 2026-10-30.

    Remaining scope (ordered):

    1. pkgs/mcpx/internal/conformance/catalogue.go:51 still renders server-side authorization rows as not-implemented: #1975 — a pointer to a closed issue and to work that has merged. Server rows should now bind; client rows keep the deferral with its recorded reason. (Line 50, oauthClientIssue = "#1950", is still correct.)
    2. Regenerate the golden matrix (per-row waivers landing in docs/spec/conformance-matrix.md).
    3. Add the conformance scenario showing /mcp rejects unauthenticated requests on a bearer-configured transport, closing acceptance item 3.

    Blocker (reproduced this run, not inherited hearsay): matrix regeneration cannot proceed while #2695 is unfixed. On clean main at 048da81f1, with no local changes:

    FAIL TestAuthSplit  authsplit_test.go:21: authorization-http-should-conform-stdio-should-not/server does not bind mcpx
    FAIL TestMatrix      matrix_test.go:148: authorization-custom-auth-may/server does not bind mcpx
    

    so MCPX_UPDATE_MATRIX=1 fails before writing the golden. #2695 is open, queued for triage (priority/normal) and assigned to Drew; its latest comment already contains the correct fix (LoadAuthSplit must stop judging n/a:-prefixed sides, then re-derive the pinned counts). Steps 2–3 above wait on it; step 1 can land independently.

    Links: #1975 · PR #2711 · PR #2619 · #2695 · #1926 · pkgs/mcpx/internal/conformance/catalogue.go:50-51

  13. removed
    queue/queuedHas a queued task in the Supabase agent queue
    on Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

effort/lLarge: multi-day or open-ended; expect staged check-inskind/featureNew feature or capability requestmeta/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 itemuser/reviewNeeds a user-look: Muse reviews first and handles what it can

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions