Skip to content

Repository files navigation

opencode-cursor — Cursor models in OpenCode, direct API, native OAuth

npm version npm downloads MIT license linux, macos, windows latest release

Cursor models inside OpenCode — browser OAuth, live catalog discovery,
and a local OpenAI-compatible proxy tuned for agent loops.

Quick start · Authenticate · Why this plugin · Architecture · Troubleshooting · Changelog


Use every model on your Cursor subscription from OpenCode: Claude, GPT, Gemini, Grok, Composer, and Cursor Auto — with thinking, effort variants, streaming, and tool calls that actually finish.

No cursor-agent binary. No SDK child-process gymnastics. Direct Cursor API over HTTP/2.

Quick start

1. Install the plugin

npm install -g @otto-assistant/opencode-cursor-oauth

2. Register it in OpenCode

Add (or merge) this into ~/.config/opencode/opencode.json:

{
  "$schema": "https://opencode.ai/config.json",
  "plugin": ["@otto-assistant/opencode-cursor-oauth"],
  "provider": {
    "cursor": { "name": "Cursor" }
  }
}

3. Sign in with Cursor (browser OAuth — not an API key)

opencode auth login --provider cursor

A browser window opens. Approve access. Tokens land in ~/.local/share/opencode/auth.json and refresh automatically.

4. Use a Cursor model

opencode run "Summarise this repository in five bullets." --model cursor/default

In the TUI: pick provider cursor, then a model (including Thinking / Fast / effort variants when Cursor exposes them).

From source (optional)

git clone https://github.com/otto-assistant/opencode-cursor.git
cd opencode-cursor
bun install && bun run build
npm install -g .

Authenticate

Step What happens
opencode auth login --provider cursor Starts PKCE browser OAuth
You approve in the browser Cursor returns access + refresh tokens
Plugin stores credentials ~/.local/share/opencode/auth.json
Access expires Plugin refreshes silently; permanent 4xx → re-login

If you use OpenChamber and never see an OAuth button, the plugin still prints a login URL and embeds it in the placeholder model name — open that URL, then reload.

You do not need a Cursor API key. Browser OAuth is the only supported path.

Why this plugin

Direct API Talks to Cursor over HTTP/2. No cursor-agent install, no brittle CLI wrapper.
Native OAuth opencode auth login — PKCE browser flow with automatic token refresh.
Live models Discovers your account's catalog, including Thinking, Fast, 1M context, and effort levels.
Agent-grade streaming Tool calls continue correctly; parked bridges resume with results instead of restating forever.
Phase-aware stalls Reasoning gets time to think; silent post-tool hangs recover in ~90s, not minutes.
Measured speed v2.2: first message −39% to −44% TTFB vs prior release (cold start + H2 pre-connect).

Architecture

OpenCode
  └─ /v1/chat/completions
       └─ Local OpenAI-compatible proxy
            └─ Node HTTP/2 bridge
                 └─ Cursor API (api2.cursor.sh)
Layer Responsibility
Plugin hooks OAuth, provider config, model catalog, selection headers
Proxy OpenAI ↔ Cursor protocol, tool loops, stalls, checkpoints
Transport Persistent / one-shot HTTP/2 bridges to Cursor

Model listings map Cursor's variant catalog into OpenCode-native choices (Opus 4.8, Opus 4.8 Thinking, effort lowmax, Fast, …). Selection is encoded for the proxy so Cursor receives the exact RequestedModel parameters your account supports.

Performance notes

From the v2.2.0 release:

Scenario Before After
First message, gpt-5.4-nano 8.5s 4.8s
First message, cursor/default 6.1s 3.7s
Post-tool silent stall budget 180s 90s

Knobs (optional): OPENCODE_CURSOR_PRE_OUTPUT_STALL_TIMEOUT_MS, OPENCODE_CURSOR_POST_TOOL_PRE_OUTPUT_STALL_TIMEOUT_MS, OPENCODE_CURSOR_TOOL_DEBOUNCE_MS.

Debug logs: OPENCODE_CURSOR_DEBUG=1.

Requirements

  • OpenCode
  • Active Cursor subscription
  • Bun (plugin runtime) · Node.js ≥ 18 (HTTP/2 bridge)

Development

bun install
bun run build
bun run test

Troubleshooting

Symptom Fix
Cursor missing from provider list Confirm plugin includes @otto-assistant/opencode-cursor-oauth and restart OpenCode
"sign in required" / login URL in model name Open the printed URL, approve OAuth, reload
Refresh rejected / re-login required Run opencode auth login --provider cursor again
Model not found Wait for live discovery after login; avoid relying on stale offline catalogs
Tool loop restates forever Update to latest plugin — post-tool resume + phase-aware stalls are required

FAQ

Do I need to clone the repo?
No. Configure the npm package in opencode.json and OpenCode installs it.

Is this the same as cursor-agent bridges?
No. This plugin authenticates with Cursor OAuth and proxies the Cursor API directly. You do not need the cursor-agent CLI.

Where are releases?
GitHub Releases · npm · Changelog

License

MIT

About

OpenCode plugin: Cursor API via OAuth, model discovery, and local OpenAI-compatible proxy

Resources

Stars

8 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages