Skip to content

Resolve and pin MCP OAuth credential stores#30293

Open
stevenlee-oai wants to merge 5 commits into
dev/stevenlee/mcp-oauth-independent-1-store-locksfrom
dev/stevenlee/mcp-oauth-independent-2-refresh-transaction
Open

Resolve and pin MCP OAuth credential stores#30293
stevenlee-oai wants to merge 5 commits into
dev/stevenlee/mcp-oauth-independent-1-store-locksfrom
dev/stevenlee/mcp-oauth-independent-2-refresh-transaction

Conversation

@stevenlee-oai

@stevenlee-oai stevenlee-oai commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Codex Thread 019edd6d-6f14-74e2-853c-345d1803d4a6

Stack

Review and merge in order. Every layer is independently correct and documents its safe stopping point.

  1. openai/codex#30292 — aggregate File/Secrets store locking
  2. openai/codex#30293 — resolve and lifecycle-pin the exact OAuth store
  3. openai/codex#30416 — serialized authoritative refresh transaction
  4. openai/codex#30294 — Codex-owned transport refresh and one-shot 401 recovery
  5. openai/codex#30295 — login/logout transaction serialization
  6. openai/codex#30296 — diagnostic-only Auto store drift reporting

This PR is layer 2.

Why

Auto is keyring-first with a File fallback, but re-evaluating that policy during transport reconstruction or persistence can make one MCP client read from one store and later write to another. With rotating refresh tokens, the second store may contain an older token. This layer makes the source selected at client startup explicit and keeps that authority stable for the client lifecycle.

What this PR does

  • Replaces the policy-only loader with resolve_oauth_tokens, which returns both credentials and the concrete File or Keyring source that supplied them.
  • Separates policy resolution from load_oauth_tokens_from_store, the exact-store reread operation used after a source is selected.
  • Pins the first concrete source in the transport recipe, so initialization retries and session reconstruction cannot re-evaluate Auto and adopt another store.
  • Gives OAuthPersistor the resolved store and keeps subsequent persistence and removal on that store.
  • Keeps login-time Auto behavior unchanged: prefer Keyring, fall back to File when unavailable, and clean up legacy File state after a successful keyring save.
  • Ensures an exact selected-keyring write does not mutate or adopt a stale fallback File entry.

Explicit decisions and non-goals

  • The selection is lifecycle-local and in memory. This PR does not add a durable backend selector, migration, reconciliation registry, or global source of truth outside CODEX_HOME.
  • Auto may choose File at the start of a later process if keyring availability changes. Once this client resolves, a selected-store failure is returned instead of hot-switching.
  • Different CODEX_HOME instances remain independent even when they can access the same Direct keyring credential.
  • Cross-process refresh serialization is intentionally not part of this layer.

Safe stopping point

This PR can merge alone. A single MCP client no longer hot-switches credential stores across transport rebuilds or persistence. Two processes can still refresh the same selected credential concurrently until layer 3.

Review size

The net layer is 7 files, +336/−129. It contains store resolution/pinning only; the per-credential lock and refresh transaction were moved to openai/codex#30416.

Validation

  • just test -p codex-rmcp-client (97 passed; expected environment skips)
  • Exact-store regression coverage with different File and Keyring tokens
  • cargo shear

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c432fcdffc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread codex-rs/rmcp-client/src/oauth/refresh_transaction.rs Outdated
@stevenlee-oai stevenlee-oai force-pushed the dev/stevenlee/mcp-oauth-independent-2-refresh-transaction branch from c432fcd to 38b9e10 Compare June 26, 2026 21:30
@stevenlee-oai stevenlee-oai force-pushed the dev/stevenlee/mcp-oauth-independent-1-store-locks branch 2 times, most recently from c99bdc7 to e4dcca6 Compare June 26, 2026 21:48
@stevenlee-oai stevenlee-oai force-pushed the dev/stevenlee/mcp-oauth-independent-2-refresh-transaction branch from 38b9e10 to c003752 Compare June 26, 2026 21:48
@stevenlee-oai stevenlee-oai force-pushed the dev/stevenlee/mcp-oauth-independent-2-refresh-transaction branch from c003752 to c93f236 Compare June 26, 2026 22:25
@stevenlee-oai stevenlee-oai force-pushed the dev/stevenlee/mcp-oauth-independent-1-store-locks branch from e4dcca6 to f1e1c17 Compare June 26, 2026 22:25
@stevenlee-oai

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown
Contributor

Codex Review: Didn't find any major issues. Another round soon, please!

Reviewed commit: c93f2368a5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# Conflicts:
#	codex-rs/rmcp-client/src/oauth.rs
@stevenlee-oai

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown
Contributor

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: 2722bf8ad5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

# Conflicts:
#	codex-rs/rmcp-client/src/oauth.rs
@stevenlee-oai stevenlee-oai changed the title Serialize MCP OAuth refresh transactions Resolve and pin MCP OAuth credential stores Jun 28, 2026
@stevenlee-oai

Copy link
Copy Markdown
Contributor Author

@codex review

— Codex

@chatgpt-codex-connector

Copy link
Copy Markdown
Contributor

Codex Review: Didn't find any major issues. More of your lovely PRs please.

Reviewed commit: fb2c35f05a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

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