Repository navigation
feat(plugins): CoreSpeed as a Cursor plugin, for the Cursor Marketplace and Grok Bot - #4
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>
…ce and Grok Bot Grok Bot loads plugins only from the Cursor Marketplace. A Cursor plugin is the way CoreSpeed gets into Grok Bot and its bot templates. - plugins/corespeed/.cursor-plugin/plugin.json: the same plugin. It reuses .mcp.json and skills/, so all three clients get one MCP entry. - .cursor-plugin/marketplace.json at the repo root, as Cursor needs for a multi-plugin repo. It lists only corespeed. corespeed-cli is a Codex workaround. - assets/app-icon.svg: the square icon from corespeed.io. The old logos use currentColor and vanish on a dark page. - CI: validate the new JSON, keep the three versions equal, and block a second MCP file. - README: a Cursor and Grok Bot section. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Approved after review of merge base 3572d85 through head 86a374d. No introduced correctness or security findings.
Verified the marketplace source, manifest name, shared MCP file, both bundled skills, and self-contained SVG resolve inside the plugin. Targeted local path and SVG checks passed. git diff --check passed. Cursor's plugin reference supports explicit MCP paths and this multi-plugin layout. Its local testing instructions support the documented copy-and-reload flow.
CI passed on this exact head: manifests and scan. No CI-covered full suite was repeated locally.
Release limits remain visible in the PR description: Marketplace listing needs Cursor approval, and live Cursor/Grok Bot installation and OAuth were not tested here. The local import path also depends on the user's team policy. These are release verification notes, not technical blockers in this diff.
Cycle 1, round 1/5. Reviewer session: 9fd94292-21e1-46c8-996e-34632ab4e409.
… 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>
… surface too Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…it; cs-api calls memory__search Final Directory submission refuses a shortDescription over 30 characters (submission_subtitle_too_long); both Codex manifests are shortened and check.yml holds the limit. The cs-api sample uses the current memory tool name, as the cs-cli skill does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
There was a problem hiding this comment.
Approved with no introduced correctness or security findings.
Reviewed merge base ba71a00 through head 285b971. This is cycle 2 after the prior approval at 86a374d. The final documentation and Directory length-guard deltas were reviewed incrementally. Targeted boundary checks confirmed that the guard accepts 1 and 30 characters, and rejects 0, 31, and 240.
The Cursor marketplace resolves the plugin, its declared MCP file, both skills, and the self-contained SVG. Targeted path and SVG checks passed. The configured surface returns an OAuth challenge whose canonical metadata returns 200. Its path-specific metadata alias agrees. git diff --check passed. Cursor's plugin reference supports the explicit MCP path and multi-plugin layout. No CI-covered full suite was repeated locally.
CI passed on this exact head: manifests and scan. These are both jobs configured in check.yml. The main ruleset requires ensemble-review, which is published separately after this approval.
The PR records the product choice: Cursor gets memory and connector discovery through the smaller surface. Connected apps and Drive require the CLI, its separate installation, and browser sign-in. Marketplace publication and live Cursor/Grok installation remain unverified. These release limits are visible for the human merger.
Cycle 2, round 1/5. Reviewer session: e57f220f-c883-4111-b172-7c890a9ed80a.
#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>
There was a problem hiding this comment.
Approved with no findings. Cycle 3, round 1/5.
Reviewed merge base 946a1db through head 960774b. The new head has the identical Git tree as the approved 285b971: ed929eff4c65fc533e0a0029ff07d3ae556fce62. The squash-merged main base also has identical content to the prior base ba71a00. The merge preserved every reviewed change and resolved the base conflict.
The diff from main remains the reviewed Cursor packaging, client wording, Directory description limits, and sample tool-name correction. git diff --check passed. Prior targeted path, SVG, OAuth discovery, and length-boundary verification still applies to this identical tree; no full suite was repeated locally.
Fresh CI passed on this exact SHA: manifests and scan. The required ensemble-review check follows this review.
The PR retains the product choice and release limits: Cursor uses the smaller MCP surface, apps and Drive need separate CLI installation and browser sign-in, Marketplace publication is pending, and live Cursor/Grok installation remains untested.
Reviewer session: e57f220f-c883-4111-b172-7c890a9ed80a.
What
CoreSpeed becomes a Cursor plugin. This is the step that gets us into Grok Bot.
Grok Bot (xAI) loads plugins only from the Cursor Marketplace. Its bot templates carry first-party plugins but drop custom MCP servers. So CoreSpeed needs a Cursor Marketplace listing before a CoreSpeed bot template can install cleanly.
Changes
plugins/corespeed/.cursor-plugin/plugin.json: the existingcorespeedplugin, now for Cursor too. It points at the root.mcp.json— the plugin surfacehttps://api.corespeed.io/mcp/plugin/chatgpt, as for Codex (feat(plugins): Codex gets the plugin surface /mcp/plugin/chatgpt; Claude Code keeps the full /mcp #3) — andskills/. Every server entry is URL only, OAuth sign-in, no API key; Claude Code's full/mcplives in.mcp.claude.json..cursor-plugin/marketplace.json: Cursor needs it at the repo root for a multi-plugin repo. It lists onlycorespeed.corespeed-cliis a Codex-only workaround, so it is left out.plugins/corespeed/assets/app-icon.svg: the square icon from corespeed.io (dark tile, light mark). The existinglogo.svgandicon.svgusecurrentColor, so they turn black on a dark marketplace page.corespeedversions equal, pin the Cursor manifest to the root.mcp.json, and block a secondmcp.jsonthat would shadow it in Cursor.Verification
scripts/validate-template.mjs(fromcursor/plugin-template) passes. It warns "no mcp.json". The manifest'smcpServers: "./.mcp.json"replaces that default lookup, the same way Cursor's officialthird_party/firefliesplugin does it.type: "http"+urlentry matches the remote MCP plugins incursor/plugins(fireflies, hunter, github).csCLI: a separatenpm install -g @corespeed/csand a browsercs login, which the bundledcs-cliskill walks the agent through.For the PM
shortDescriptionnow fit the Plugins Directory's 30-character final-submission limit (the package validator allows 240, the Directory 30;check.ymlholds the stricter one), and thecs-apisample callsmemory__search, the current name — the two notes feat(plugins): Codex gets the plugin surface /mcp/plugin/chatgpt; Claude Code keeps the full /mcp #3's review inherited.corespeedmanifests are 0.3.0 (the version feat(plugins): Codex gets the plugin surface /mcp/plugin/chatgpt; Claude Code keeps the full /mcp #3 sets); the Claude Code and Codex plugins change only by that version. Thecs-cliandcs-apiskills say Cursor gets the plugin surface, as Codex does.https://github.com/corespeed-io/csat cursor.com/marketplace/publish. Cursor reviews every plugin by hand.🤖 Generated with Claude Code
Stacked on #3 on 2026-10-26 (new review cycle)
#3 merged to main (squashed) on 2026-10-26, so this PR targets main again; the branch merged main with every conflict resolving to this PR's later wording, and its diff from main is the Cursor plugin plus the two notes below. Before that it sat on
feat/codex-plugin-surface(#3) in a registered stack, because #3 makes the root.mcp.jsonthe fixed plugin surfacehttps://api.corespeed.io/mcp/plugin/chatgpt, and Cursor reads that file through its manifest.Decision for the PM — Cursor gets the plugin surface, as Codex does. Cursor loads every tool of a server up front (no deferred loading), so the fixed list of memory and connector discovery is what keeps the plugin installable for an organization with many connectors; connected apps and the Drive are reached through the bundled
cs-cliskill. The Cursor manifest, the Cursor marketplace entry and the README's Cursor section say so. The alternative is a Cursor-only server file naming the full/mcp(as Claude Code has): Cursor's manifestmcpServersis a path, so it is likely accepted, but it is unverified in a real Cursor, and it would hand Cursor a list that can exceed what it loads. The original approval (86a374d) reviewed Cursor with the full/mcp, before #3 changed what.mcp.jsonis.Other resolution: all three
corespeedmanifests at 0.3.0 (the version guard now covers Cursor);check.ymlis the union of #3's server guards, main's prompt-count guard and this PR's Cursor guards; the README intro and table name Cursor. Still not tested inside a real Cursor install.