Repository navigation
feat(plugins): Codex gets the plugin surface /mcp/plugin/chatgpt; Claude Code keeps the full /mcp - #3
Conversation
…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>
There was a problem hiding this comment.
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>
…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>
There was a problem hiding this comment.
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.
#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>
Production serves the surface
Met on 2026-10-15 22:15 UTC:
https://api.corespeed.io/.well-known/oauth-protected-resource/mcp/plugin/chatgptreturns 200 (resourcehttps://api.corespeed.io/mcp, authorization serverhttps://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
plugins/corespeed/.mcp.jsonnow carrieshttps://api.corespeed.io/mcp/plugin/chatgpt: it is what Codex reads (.codex-plugin/plugin.jsonkeeps"mcpServers": "./.mcp.json") and the onlymcpServerspath the OpenAI Plugins Directory accepts (plugin_mcp_path_unsupportedfor anything else). Claude Code's.claude-plugin/plugin.jsondeclares"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.cs-cliskill (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 withcs../.mcp.json, that file points at the plugin surface, the Claude Code manifest reads./.mcp.claude.json, that file points at/mcp.cs-apiskill: both URLs take the same credentials (one OAuth token; the URL picks the surface), and the Codex plugin's server is the surface.Why
Codex drops a single MCP server above 2,048 tools, and the Plugins Directory reviews one fixed
tools/listsnapshot./mcp/plugin/chatgptis the same short list for every caller: ten memory tools,whoami,connectors_search/connectors_connect/connectors_wait(while the org'sconnect_requestsflag is on), andapproval_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
mcpServersonly 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.csCLI, which is a separatenpm install -g @corespeed/cspluscs loginin a browser (the bundledcs-cliskill walks the agent through it). Codex's default sandbox has no network, socs mcp callprompts for approval until the user allows network for the workspace.Verified
codex plugin add corespeed@corespeedinstalls 0.3.0;codex mcp listshowscorespeed https://api.corespeed.io/mcp/plugin/chatgpt.claude plugin install corespeed@corespeed;claude mcp listshowsplugin:corespeed:corespeed: https://api.corespeed.io/mcp— the manifest's declared file replaced the root entry.claude plugin validate plugins/corespeedpasses.check.ymlpass 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-cliplugin) and #5 (thecs-cliskill knows the Drive; manifests 0.2.2; a guard that a Codex manifest carries at most three default prompts). Resolution:/mcp) and names.mcp.claude.json. Codex keeps this PR's wording — memory and connector discovery through the plugin surface — and says connected apps' tools and the Drive are reached through thecsCLI (cs mcp call,cs drive), because the plugin surface has no Drive tools. Both manifests go 0.2.2 → 0.3.0.cs drive. The twocs-cliskill copies merged identically (this PR's intro about the Codex surface, feat(skills): the cs-cli skill knows the Drive — cs drive, every built-in prefix; plugins 0.2.2 and 0.1.1 #5's Drive section and prefix list).check.ymlmerged without conflict: the server guards of this PR plus the prompt-count guard.#4 (the Cursor plugin) is stacked on this branch, since it inherits the root
.mcp.jsonas the plugin surface.