Repository navigation
Conversation
Add a Cursor plugin manifest that starts the server with Node from PATH
via ${CURSOR_PLUGIN_ROOT}. package:cursor writes
release/cursor-plugin/mobile-dev without Codex-only files, and
test:cursor starts the server from that folder with no client
capabilities to check the chat fallback and disabled updater.
cursor:config writes an mcp.json snippet for ~/.cursor/mcp.json when
running from a checkout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
grabbou
added this pull request to stack #41
October 24, 2026 09:09
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #39 (
feat/devices-card), which is stacked on #34.What Cursor supports
From the Cursor MCP docs, plugins and plugin reference:
mcpServersin.cursor/mcp.json(project) or~/.cursor/mcp.json(global). Transports are stdio, SSE and Streamable HTTP. Supports${userHome},${workspaceFolder}and${env:…}interpolation..cursor-plugin/plugin.json(onlynameis required), withskills/discovered automatically andmcpServersinline or inmcp.json.${CURSOR_PLUGIN_ROOT}expands incommand,args,envandcwd. Install locally at~/.cursor/plugins/local/<name>; the marketplace takes reviewed, open-source Git repositories.cursor://anysphere.cursor-deeplink/mcp/install?name=…&config=<base64>. Not used here: a stdio config would need absolute paths on each machine, since nothing is published to npm.What changed
.cursor-plugin/plugin.json: same metadata as the Claude plugin. It startsnode ${CURSOR_PLUGIN_ROOT}/dist/server.mjsfromPATH.npm run package:cursor(scripts/package-cursor.mjs): reusesscripts/package.mjsand writesrelease/cursor-plugin/mobile-devwithdist,assets,skillsand the docs. It leaves out.mcp.json,.codex-pluginand the launcher.npm run cursor:config(scripts/cursor-config.mjs): writes.local-dev/cursor-mcp.jsonwith absolute paths, for merging into the global~/.cursor/mcp.jsonwhen running from a checkout.npm run test:cursor(scripts/smoke-cursor-package.mjs): copies the plugin folder to a path with spaces and runs the server with a minimalPATHand a freshHOME, in bothdevelopmentandreleaseenvironments. With no client capabilities, it checks the manifest, the payload, that Codex-only files are absent, the tools, the UI resource, the chat fallback formobile_show_deviceswith aselectionMode, and the disabled updater.docs/releases.md.No server or UI code changes and no Cursor-specific branches. Behavior still follows advertised client capabilities. If Cursor advertises
io.modelcontextprotocol/ui, the device card and workspace render. If not,mobile_show_devicesreturns the device list as text, and choice requests tell the agent to ask in chat.Telemetry
Coverage is preserved unchanged. The server, UI and native helpers are the same, so existing surfaces, metrics (including
device_picker.*) and error capture apply in Cursor too. Thedevelopment/releaseenvironments come from the same build (package:cursor -- --releasefor public builds), and the smoke test checks the packaged environment meta in both. No new identity sources or attributes, and telemetry opt-out is honored (the smoke test runs withMOBILE_DEV_TELEMETRY=off).Testing
npm run build && npm run package:cursor && npm run test:cursor: passes in both environments.npm run package:claude && npm run test:claude: passes (no regression).npm run cursor:config: generates the snippet.npm test: 808 of 811 tests pass. Two failed:tests/http-runtime.test.ts"server startup prevents socket QoS crashes…" (a known, unrelated failure) and the Baguette relocation test, which passed when rerun alone and looks flaky under full-suite load.🤖 Generated with Claude Code