Skip to content

feat(plugins): Codex gets the plugin surface /mcp/plugin/chatgpt; Claude Code keeps the full /mcp - #3

Merged
BestOwl merged 3 commits into
mainfrom
feat/codex-plugin-surface
Oct 26, 2026
Merged

BestOwl merged 3 commits into
mainfrom
feat/codex-plugin-surface

Conversation

@corespeed-agent-ensemble

@corespeed-agent-ensemble corespeed-agent-ensemble Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Production serves the surface

Met on 2026-10-15 22:15 UTC: https://api.corespeed.io/.well-known/oauth-protected-resource/mcp/plugin/chatgpt returns 200 (resource https://api.corespeed.io/mcp, authorization server https://login.corespeed.io), and an unauthenticated POST to the surface answers 401 with the OAuth challenge. The precondition was that production serves the surface before Codex users are pointed at it; it does now.

What

  • The root plugins/corespeed/.mcp.json now carries https://api.corespeed.io/mcp/plugin/chatgpt: it is what Codex reads (.codex-plugin/plugin.json keeps "mcpServers": "./.mcp.json") and the only mcpServers path the OpenAI Plugins Directory accepts (plugin_mcp_path_unsupported for anything else). Claude Code's .claude-plugin/plugin.json declares "mcpServers": "./.mcp.claude.json" with the full /mcp; Claude Code loads the root file first and the declared file after, and a server declared later replaces the earlier one of the same name, so Claude Code keeps the full server.
  • Manifest texts for Codex now describe memory, connector discovery and the CLI (no "connected apps / media / web / social through one MCP server" — those are not on the plugin surface). Three starter prompts to match. Both manifests go 0.2.1 → 0.3.0.
  • cs-cli skill (both copies, byte-identical): the intro says the Codex plugin's server carries memory and connector discovery only, so a connected app's tools are called with cs.
  • CI: validates both server files and pins four facts — the Codex manifest reads ./.mcp.json, that file points at the plugin surface, the Claude Code manifest reads ./.mcp.claude.json, that file points at /mcp.
  • cs-api skill: both URLs take the same credentials (one OAuth token; the URL picks the surface), and the Codex plugin's server is the surface.
  • README: which client gets which server, and what the Codex surface does.

Why

Codex drops a single MCP server above 2,048 tools, and the Plugins Directory reviews one fixed tools/list snapshot. /mcp/plugin/chatgpt is the same short list for every caller: ten memory tools, whoami, connectors_search / connectors_connect / connectors_wait (while the org's connect_requests flag is on), and approval_wait (while Smart Approvals is on). The agent finds an app, hands the person a one-click connect link, and calls the connected app's tools through the CLI. Claude Code loads tools lazily and keeps the full server.

Trade-offs to keep in view

  • Directory packaging. The portal accepts mcpServers only as the root ./.mcp.json; no inline map, no other path. That is why the root file is the plugin surface and the full server lives in a Claude-Code-only file. Any future change to the Codex/Directory server URL is a change to .mcp.json.
  • Two installs for the full experience in Codex. The plugin gives memory, identity, connector discovery and approvals; a connected app's tools need the cs CLI, which is a separate npm install -g @corespeed/cs plus cs login in a browser (the bundled cs-cli skill walks the agent through it). Codex's default sandbox has no network, so cs mcp call prompts for approval until the user allows network for the workspace.

Verified

  • Codex 0.151.0, from this tree as a local marketplace: codex plugin add corespeed@corespeed installs 0.3.0; codex mcp list shows corespeed https://api.corespeed.io/mcp/plugin/chatgpt.
  • Claude Code 2.1.251, same tree: claude plugin install corespeed@corespeed; claude mcp list shows plugin:corespeed:corespeed: https://api.corespeed.io/mcp — the manifest's declared file replaced the root entry. claude plugin validate plugins/corespeed passes.
  • The jq guards in check.yml pass locally; the two skill copies are byte-identical; prompts are within 128 characters.

🤖 Generated with Claude Code

Merged with main on 2026-10-26 (new review cycle)

main brought #2 (the skills-only corespeed-cli plugin) and #5 (the cs-cli skill knows the Drive; manifests 0.2.2; a guard that a Codex manifest carries at most three default prompts). Resolution:

#4 (the Cursor plugin) is stacked on this branch, since it inherits the root .mcp.json as the plugin surface.

Agent and others added 2 commits October 14, 2026 01:33
…ude Code keeps the full /mcp

The Codex manifest's mcpServers now points at its own file,
.mcp.codex.json, whose one server is https://api.corespeed.io/mcp/plugin/chatgpt:
the fixed surface corespeed-haas#1003 serves — shared memory, the caller's
identity, connector discovery (connectors_search / connect / wait) and the
approval wait — a small list no organization's connector count can push
past Codex's 2,048-tool catalog limit, and the shape the OpenAI Plugins
Directory reviews. A connected app's tools are called through the bundled
cs-cli skill; the skill's intro (both copies) says so. Claude Code keeps the
full /mcp through .mcp.json, unchanged. Manifest texts describe the Codex
plugin as memory, connector discovery and the CLI; both manifests go to
0.3.0. CI gains a guard pinning the Codex server file and its URL; the
README says which client gets which server.

Verified in Codex 0.151.0 from this tree: codex plugin add corespeed@corespeed
installs 0.3.0 and codex mcp list shows corespeed at
https://api.corespeed.io/mcp/plugin/chatgpt.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… manifest names the full server

The OpenAI Plugins Directory accepts mcpServers only as ./.mcp.json at the
plugin root (plugin_mcp_path_unsupported otherwise), so the surface Codex
and the Directory need — https://api.corespeed.io/mcp/plugin/chatgpt —
moves into the root file, and .mcp.codex.json goes. Claude Code's manifest
declares "./.mcp.claude.json" with the full /mcp: Claude Code loads the
root .mcp.json first, then the declared file, and a server declared later
replaces an earlier one of the same name, so Claude Code keeps the full
server. CI guards pin all four facts. cs-api says both URLs take the same
credentials and that the Codex plugin's server is the surface.

Verified: `claude plugin validate` passes; from this tree as a local
marketplace, Codex 0.151.0 lists corespeed at /mcp/plugin/chatgpt and
Claude Code 2.1.251 lists plugin:corespeed:corespeed at /mcp.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

@corespeed-hopper corespeed-hopper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Approved at a98aeb6, cycle 1, round 3/5. No remaining findings.

Reviewed the diff from merge base 3572d85 and carried forward the prior review. Both prior P2 findings are resolved. The PR records the Codex surface change, Directory packaging, and separate CLI installation/login trade-offs.

Production verification on 2026-10-15 at 22:17 UTC: the plugin protected-resource metadata returned 200. Its resource is https://api.corespeed.io/mcp and authorization server is https://login.corespeed.io. An unauthenticated tools/list POST returned 401 with the expected OAuth challenge. The production deployment precondition is met.

Both configured CI checks, manifests and scan, passed on this exact SHA: https://github.com/corespeed-io/cs/actions/runs/38496999795. The prior reviewer verified Claude Code's full-server override locally on this unchanged head. No full CI-covered suite was rerun.

Scope limit: private backend implementation and authenticated tools/list remain unverified here; supplied backend evidence was retained from the prior review. Product direction remains the human merger's decision.

Reviewer session: 45ac92ed-7dfe-4b06-a81c-7d8b16a5ce0a.

… client reaches it

main brought #5 (the cs-cli skill knows the Drive; manifests 0.2.2 and the
prompt-count guard). The Claude Code manifest keeps main's wording — its
server is the full /mcp, Drive tools included — and names .mcp.claude.json.
The Codex manifest keeps this branch's wording — its server is the fixed
plugin surface, which has no Drive tools — and says files move through
cs drive, as the connected apps' tools move through cs mcp call. Both go
to 0.3.0. The README carries both table rows and names cs drive in the
Codex paragraph; the skill copies merged identically.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
corespeed-agent-ensemble Bot pushed a commit that referenced this pull request Oct 26, 2026
…the plugin surface too

The root .mcp.json is now the fixed plugin surface (#3), and Cursor reads
it through its manifest, so Cursor loads memory and connector discovery and
reaches connected apps and the Drive through the cs-cli skill — the same
footing as Codex, since Cursor loads every tool of a server up front. The
Cursor manifest and marketplace entry say so, and go to 0.3.0 with the
other two; check.yml is the union of the server guards, the prompt-count
guard and the Cursor guards.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

@corespeed-hopper corespeed-hopper Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Approved at ba71a00, cycle 2, round 1/5. No new technical findings.

Reviewed the full diff from merge base fe28f8d. Also reviewed the delta from previously approved a98aeb6 and the merge conflict resolutions. Prior findings remain resolved. Claude Code keeps the full server; Codex keeps the fixed plugin surface. Drive copy directs Codex users to cs drive. The PR describes the server split, separate CLI installation and login, and merge choices for the human merger.

Both configured CI checks, manifests and scan, passed on this exact SHA: https://github.com/corespeed-io/cs/actions/runs/40255928584. The branch rules require ensemble-review; this review publishes that gate separately. There are no base conflicts. Targeted local verification confirmed manifest path resolution, prompt lengths, and a clean diff check. No CI-covered full suite was rerun.

Production verification on 2026-10-26 at 01:50 UTC: plugin protected-resource metadata returned 200 with resource https://api.corespeed.io/mcp and authorization server https://login.corespeed.io. An unauthenticated tools/list POST returned 401 with the expected OAuth challenge. Authenticated catalog contents and the private backend remain unverified here; the prior review's supplied backend evidence is carried forward.

Out-of-scope notes: the Codex listing subtitle already exceeded today's 30-character final Directory submission limit on main (43 characters; now 85). Package validation allows 240 characters, so this does not break package installation. Shorten the listing during Directory submission preparation; no additional review round is needed. Official source: https://developers.openai.com/plugins/deploy/submission-errors. The cs-api example also retains memory__search_memory while cs-cli uses memory__search; that mismatch is inherited from main.

Reviewer session: ebf92cb4-6dd5-4d3d-85d1-2f8aa78bd2bd.

@BestOwl
BestOwl merged commit 946a1db into main Oct 26, 2026
3 checks passed
@BestOwl
BestOwl deleted the feat/codex-plugin-surface branch October 26, 2026 02:29
corespeed-agent-ensemble Bot pushed a commit that referenced this pull request Oct 26, 2026
#3 landed on main as one squashed commit, so this branch's copy of its
content conflicted with the same content under other SHAs; every conflict
resolves to this branch's later wording (Cursor on the plugin surface, the
30-character subtitles, memory__search).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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