Package Exports
- @rama_nigg/open-cursor
- @rama_nigg/open-cursor/lib
Readme

No prompt limits. No broken streams. Full thinking + tool support in OpenCode. Your Cursor subscription, properly integrated.
Installation
Option A — One-line installer
Linux & macOS:
curl -fsSL https://raw.githubusercontent.com/Nomadcxx/opencode-cursor/main/install.sh | bashWindows:
npm install -g @rama_nigg/open-cursor
open-cursor installThen authenticate and verify:
cursor-agent login
opencode models | grep cursor-acpOption B — npm global + CLI
npm install -g @rama_nigg/open-cursor
open-cursor installUpgrade: npm update -g @rama_nigg/open-cursor
Option C — Add to opencode.json
Add to ~/.config/opencode/opencode.json (or %USERPROFILE%\.config\opencode\opencode.json on Windows):
{
"plugin": ["@rama_nigg/open-cursor@latest"],
"provider": {
"cursor-acp": {
"name": "Cursor ACP",
"npm": "@ai-sdk/openai-compatible",
"options": {
"baseURL": "http://127.0.0.1:32124/v1"
},
"models": {
"cursor-acp/auto": { "name": "Auto" },
"cursor-acp/claude-opus-4-7": { "name": "Claude 4.7 Opus" },
"cursor-acp/claude-4.6-opus": { "name": "Claude 4.6 Opus" },
"cursor-acp/claude-4.6-sonnet": { "name": "Claude 4.6 Sonnet" },
"cursor-acp/claude-4.5-opus": { "name": "Claude 4.5 Opus" },
"cursor-acp/claude-4.5-sonnet": { "name": "Claude 4.5 Sonnet" },
"cursor-acp/claude-4.5-haiku": { "name": "Claude 4.5 Haiku" },
"cursor-acp/claude-4-sonnet": { "name": "Claude 4 Sonnet" },
"cursor-acp/gpt-5.5": { "name": "GPT-5.5" },
"cursor-acp/gpt-5.4": { "name": "GPT-5.4" },
"cursor-acp/gpt-5.4-mini": { "name": "GPT-5.4 Mini" },
"cursor-acp/gpt-5.4-nano": { "name": "GPT-5.4 Nano" },
"cursor-acp/gpt-5.3-codex": { "name": "GPT-5.3 Codex" },
"cursor-acp/gpt-5.2": { "name": "GPT-5.2" },
"cursor-acp/gpt-5.2-codex": { "name": "GPT-5.2 Codex" },
"cursor-acp/gpt-5.1-codex": { "name": "GPT-5.1 Codex" },
"cursor-acp/gpt-5.1-codex-max": { "name": "GPT-5.1 Codex Max" },
"cursor-acp/gpt-5.1-codex-mini":{ "name": "GPT-5.1 Codex Mini" },
"cursor-acp/gpt-5-mini": { "name": "GPT-5 Mini" },
"cursor-acp/gemini-3.1-pro": { "name": "Gemini 3.1 Pro" },
"cursor-acp/gemini-3-pro": { "name": "Gemini 3 Pro" },
"cursor-acp/gemini-3-flash": { "name": "Gemini 3 Flash" },
"cursor-acp/composer-2": { "name": "Composer 2" },
"cursor-acp/composer-2-fast": { "name": "Composer 2 Fast" },
"cursor-acp/composer-1.5": { "name": "Composer 1.5" },
"cursor-acp/grok-4-20": { "name": "Grok 4.20" },
"cursor-acp/kimi-k2.5": { "name": "Kimi K2.5" }
}
}
}
}Refresh models anytime with the bundled CLI:
open-cursor sync-models # plain list open-cursor sync-models --variants --compact # group thinking / fast / -low/-high variants under each baseThe
--variants --compactform is recommended — it folds dozens of*-thinking-fast,*-high-fast, etc. into a single entry per family with avariantsmap, and includescostfrom the official Cursor pricing table so OpenCode TokenSpeed can render usage correctly.
Option D — Go TUI installer
git clone https://github.com/Nomadcxx/opencode-cursor.git
cd opencode-cursor
go build -o ./installer ./cmd/installer && ./installerOption E — LLM paste
Install open-cursor for OpenCode: edit ~/.config/opencode/opencode.json, add "@rama_nigg/open-cursor@latest" to "plugin", add a "cursor-acp" provider with npm "@ai-sdk/openai-compatible" and a baseURL of http://127.0.0.1:32124/v1. Populate models by running `open-cursor sync-models --variants --compact` after install (or copy the model list from the README). Auth: `cursor-agent login`. Verify: `opencode models | grep cursor-acp`.Option F — Development (from source)
git clone https://github.com/Nomadcxx/opencode-cursor.git
cd opencode-cursor
./scripts/install-plugin.shVerify: opencode models | grep cursor-acp
Authentication
Most users:
cursor-agent loginOr via OpenCode:
opencode auth login --provider cursor-acpSDK backend auth (only if using CURSOR_ACP_BACKEND=sdk or SDK fallback)
Set a real Cursor API key from cursor.com/settings:
export CURSOR_API_KEY=<your-api-key>Other supported methods (priority order): OpenCode auth store (opencode auth login --provider cursor-acp), or apiKey in the cursor-acp provider options in opencode.json.
Do not use the historical cursor-agent placeholder string as an SDK key.
Usage
opencode run "your prompt" --model cursor-acp/auto
opencode run "your prompt" --model cursor-acp/sonnet-4.5MCP Tool Bridge
Any MCP servers already configured in your opencode.json work automatically with cursor-acp models — no extra setup needed. The plugin discovers them at startup and injects usage instructions into the system prompt so the model calls them via cursor-agent's Shell tool.
mcptool is a shell CLI, so opencode applies your bash permission rules to mcptool call .... If you rely on MCP tools asking for confirmation, keep bash as ask or add explicit ask/deny rules for mcptool call *.
mcptool servers # list discovered servers
mcptool tools [server] # list available tools
mcptool call hybrid-memory memory_stats # call a tool manually
mcptool call playwright browser_navigate '{"url":"https://example.com"}'Any MCP server using stdio transport works. Tested with hybrid-memory, @modelcontextprotocol/server-filesystem, @playwright/mcp, and @modelcontextprotocol/server-everything.
Architecture
flowchart TB
OC["OpenCode"] --> SDK["@ai-sdk/openai-compatible"]
SDK -->|"POST /v1/chat/completions"| PROXY["open-cursor proxy :32124"]
PROXY -->|"spawn persistent"| RUNNER["Node runner: sdk-runner.mjs"]
RUNNER -->|"stdin: {model, prompt, cwd}"| CURSORSDK["@cursor/sdk Agent.create + send()"]
CURSORSDK -->|"HTTPS"| CURSOR["Cursor API"]
CURSOR --> CURSORSDK
CURSORSDK -->|"stdout: NDJSON StreamJsonEvent"| PARSER["Parse + convert to SSE"]
PARSER -->|"assistant / thinking events"| SSE["SSE content chunks"]
PARSER -->|"tool_call event"| BOUNDARY["Provider boundary (v1 default)"]
BOUNDARY --> COMPAT["Schema compat + alias normalization"]
COMPAT --> GUARD["Tool-loop guard"]
GUARD -->|"emit tool_calls + finish_reason=tool_calls"| SDK
SDK --> OC
OC -->|"execute tool locally"| TOOLRUN["OpenCode tool runtime"]
TOOLRUN -->|"next request includes role:tool result"| SDK
SDK -->|"TOOL_RESULT prompt block"| RUNNER
RUNNER -->|"Shell tool_call"| MCPTOOL["mcptool CLI"]
MCPTOOL -->|"stdio"| MCP["MCP Servers"]
MCP --> MCPTOOL
MCPTOOL --> RUNNERHow the proxy works
The proxy uses a dual-backend runtime. In auto mode (default) it prefers the cursor-agent binary when available. If cursor-agent is unavailable and a real Cursor API key is configured, or if CURSOR_ACP_BACKEND=sdk is set, a persistent Node.js child process (scripts/sdk-runner.mjs) runs @cursor/sdk on behalf of the proxy.
By default, the SDK Agent runs in isolated mode (settingSources: []). To load Cursor environment settings in SDK mode, set CURSOR_ACP_SETTING_SOURCES=all.
Default tool-loop mode: CURSOR_ACP_TOOL_LOOP_MODE=opencode. Details: docs/architecture/runtime-tool-loop.md.
Startup model refresh is additive by default. Use CURSOR_ACP_MODEL_AUTO_REFRESH=false to disable it, or CURSOR_ACP_MODEL_AUTO_REFRESH=compact to fold Cursor model variants into opencode variants.
Alternatives
THERE is currently not a single perfect plugin for cursor in opencode, my advice is stick with what is the LEAST worst option for you.
| open-cursor | yet-another-opencode-cursor-auth | opencode-cursor-auth | cursor-opencode-auth | |
|---|---|---|---|---|
| Architecture | HTTP proxy via cursor-agent | Direct Connect-RPC | HTTP proxy via cursor-agent | Direct Connect-RPC/protobuf |
| Platform | Linux, macOS, Windows | Linux, macOS | Linux, macOS | macOS only (Keychain) |
| Max Prompt | Unlimited (HTTP body) | Unknown | ~128KB (ARG_MAX) | Unknown |
| Streaming | ✓ SSE | ✓ SSE | Undocumented | ✓ |
| Error Parsing | ✓ (quota/auth/model) | ✗ | ✗ | Debug logging |
| Installer | ✓ TUI + one-liner | ✗ | ✗ | ✗ |
| OAuth Flow | ✓ OpenCode integration | ✓ Native | Browser login | Keychain |
| Tool Calling | ✓ OpenCode-owned loop | ✓ Native | ✓ Experimental | ✗ |
| MCP Bridge | ✓ mcptool CLI (any MCP server) | ✗ | ✗ | ✗ |
| Stability | Stable (uses official CLI) | Experimental | Stable | Experimental |
| Dependencies | bun, cursor-agent | npm | bun, cursor-agent | Node.js 18+ |
| Port | 32124 | 18741 | 32123 | 4141 |
Troubleshooting
fetch() URL is invalidor auth errors →cursor-agent loginoropencode auth login --provider cursor-acpCURSOR_API_KEY not setin SDK mode → set a real API key from cursor.com/settings, or useCURSOR_ACP_BACKEND=autowith a workingcursor-agent- Model not responding → verify your API key/quota
- Quota exceeded → cursor.com/settings
- Proxy not starting → ensure port 32124 is available
Debug logging: CURSOR_ACP_LOG_LEVEL=debug opencode run "your prompt" --model cursor-acp/auto
Roadmap
flowchart LR
P1[/Stabilise/] --> P2[/MCP Bridge/] --> P3[/Simplify/] --> P4[/ACP + MCP/]
style P1 fill:#264653,stroke:#1d3557,color:#fff
style P2 fill:#264653,stroke:#1d3557,color:#fff
style P3 fill:#495057,stroke:#343a40,color:#adb5bd
style P4 fill:#495057,stroke:#343a40,color:#adb5bd[X] Stabilise — Clean up dead code, fix test isolation
[X] MCP Bridge — Bridge MCP servers into Cursor models via mcptool CLI
[ ] Simplify — Rip out serialisation layers
[ ] ACP + MCP — Structured protocols end-to-end
ACP + MCP (deferred) — End goal is a thin OpenCode → Cursor ACP → MCP plugin, not an evolved proxy. We ship the bridge until Cursor's ACP path passes MCP + headless approval re-validation. Why and when →
License
BSD-3-Clause