OpenCode plugin that connects to Cursor's API, giving you access to Cursor models inside OpenCode with full tool-calling support.
Install the plugin:
opencode2 plugin add opencode-cursor-oauthThe command adds the package to your global V2 configuration.
Start opencode2.
Run /connect.
Select Cursor.
The plugin adds Cursor OAuth and the available models to the V2 catalog.
You can also add the package directly to opencode.jsonc:
Add the package to ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"plugin": [
"opencode-cursor-oauth"
]
}Connect Cursor:
opencode auth login --provider cursorOpenCode V1 and OpenCode V2 add the cursor provider and its models.
OpenCode installs npm plugins during startup.
You do not have to clone this repository.
Start OpenCode and select any Cursor model. The plugin starts a local OpenAI-compatible proxy on demand and routes requests through Cursor's gRPC API.
- OAuth — browser-based login to Cursor via PKCE.
- Model discovery — queries Cursor's gRPC API for all available models.
- Local proxy — translates
POST /v1/chat/completionsinto Cursor's protobuf/HTTP/2 Connect protocol. - Native tool routing — redirects Cursor's built-in filesystem/shell tools to the equivalent OpenCode tools, and exposes OpenCode's tool surface via Cursor MCP.
HTTP/2 transport runs through a Node child process (h2-bridge.mjs) because
Bun's node:http2 support is not reliable against Cursor's API.
OpenCode --> /v1/chat/completions --> Bun.serve (proxy)
|
Node child process (h2-bridge.mjs)
|
HTTP/2 Connect stream
|
api2.cursor.sh gRPC
/agent.v1.AgentService/Run
1. Cursor model receives OpenAI tools via RequestContext (as MCP tool defs)
2. Model calls a tool:
- native tools (readArgs, shellArgs, grepArgs, ...) with an OpenCode
equivalent are redirected to it (read, bash, grep, glob, webfetch, write)
- native tools without an equivalent are rejected with a typed error
- MCP tools arrive as mcpArgs exec messages
3. Proxy emits OpenAI tool_calls SSE chunk, pauses H2 stream
4. OpenCode executes tool, sends result in follow-up request
5. Proxy resumes H2 stream with the typed native result (or mcpResult),
streams continuation
Conversation history is rebuilt from the OpenAI messages on every request
(rootPromptMessagesJson + content-addressed turn blobs), and server
checkpoints are persisted to ~/.cache/opencode-cursor/conversations/ so
context survives restarts. Set CURSOR_PROXY_DEBUG=1 to log the KV blob
handshake and exec traffic when debugging.
bun install
bun run build
bun test/smoke.ts
{ "$schema": "https://opencode.ai/config.json", "plugins": [ "opencode-cursor-oauth" ] }