Skip to content

feat(auth): directory-review support — env-gated reviewer login + submission prep#144

Merged
ABB65 merged 1 commit into
mainfrom
feat/mcp-submission-prep
Jul 13, 2026
Merged

feat(auth): directory-review support — env-gated reviewer login + submission prep#144
ABB65 merged 1 commit into
mainfrom
feat/mcp-submission-prep

Conversation

@ABB65

@ABB65 ABB65 commented Jul 13, 2026

Copy link
Copy Markdown
Member

What

PR4 of the remote-MCP program (PR1: #141, PR2: #142, PR3: #143) — the in-repo half of directory-submission prep.

Reviewer login (the OpenAI hard requirement)

OpenAI rejects test accounts that need OAuth, MFA, SMS or email confirmation; Studio's login is OAuth + magic link only. Solution (user-approved): an env-gated password login.

  • POST /api/auth/review-login + /auth/review-login page.
  • Exists only when NUXT_REVIEW_ACCOUNT_EMAIL + NUXT_REVIEW_ACCOUNT_PASSWORD are both set on the managed pair — otherwise a plain 404, indistinguishable from a nonexistent route. Default everywhere (including prod until a review window opens) is unset.
  • Accepts exactly the configured address; SHA-256 + timingSafeEqual comparison; 5/min per-IP rate limit; password <16 chars fails boot validation (it gates a real login).
  • Sign-in materializes the user through the normal email bootstrap chain (same as magic link) and sets the standard session cookie — nothing else about auth changes.

OpenAI domain verification

/.well-known/openai-apps-challenge serves the portal-issued token from NUXT_OPENAI_APPS_CHALLENGE as text/plain; unset → 404.

Runbook

docs/REMOTE_MCP_SUBMISSION.md — operator playbook: org prerequisites (Claude Team org + directory access, OpenAI org verification + global residency), review-account setup/rotation, 9-step manual test matrix (Inspector / Claude / Claude Code / ChatGPT / Codex / step-up / refresh / revoke / write path), both portal walkthroughs, post-listing invariants (origin is contractual; PRM resource never changes), and the upstream @contentrain/mcp checklist from auditing the installed 1.8.1:

  • ✅ every tool has title + correct readOnlyHint/destructiveHint, names ≤64
  • openWorldHint missing on all 19 tools (OpenAI requires it) → upstream, rides 1.9.0
  • ❌ server instructions unsupported in 1.8.1 → lands with 1.9.0 (sessionFingerprint integration noted alongside)

Tests

Review-login gating matrix (env opt-in shapes ×4, wrong creds, case-insensitive email, rate limit, session cookie set), challenge route (token / 404), middleware public-path pin.

pnpm lint ✓ · pnpm typecheck ✓ · unit+integration+nuxt 1007 ✓

…mission prep

Everything the Claude Directory / OpenAI Apps reviews need from this
repo, ahead of listing the remote MCP endpoint.

- POST /api/auth/review-login + /auth/review-login page: password login
  for directory reviewers (OpenAI rejects OAuth/MFA/email-confirmation
  test accounts). Exists ONLY when NUXT_REVIEW_ACCOUNT_EMAIL +
  NUXT_REVIEW_ACCOUNT_PASSWORD (>=16 chars, boot-validated) are set on
  the managed pair; accepts exactly that one address; timing-safe
  digest comparison; per-IP rate limit; 404 otherwise
- /.well-known/openai-apps-challenge: domain-verification token from
  NUXT_OPENAI_APPS_CHALLENGE (unset = route does not exist)
- docs/REMOTE_MCP_SUBMISSION.md: operator runbook — org prerequisites,
  review-account setup, 9-step manual test matrix, Claude + OpenAI
  portal walkthroughs, post-listing invariants, and the upstream
  @contentrain/mcp checklist (openWorldHint missing on all 19 tools;
  server instructions + sessionFingerprint land with 1.9.0)
- tests: review-login gating matrix (env opt-in shapes, wrong creds,
  rate limit, session cookie), challenge route, middleware public-path
  pin for /api/auth/review-login
@ABB65
ABB65 merged commit 0537323 into main Jul 13, 2026
2 checks passed
@ABB65
ABB65 deleted the feat/mcp-submission-prep branch July 13, 2026 10:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant