SDK
SDK Changelog
The latest features, improvements, and fixes shipping to the Cursor SDK, covering @cursor/sdk on npm and cursor-sdk on PyPI.
- Replace the system prompt.
systemPromptonAgent.create()replaces Cursor's built-in system prompt for the main agent loop with your own text. Rules, skills, and tool schemas still load, and subagents keep their own prompts. TypeScript local agents only; pass it again onAgent.resume(), and access is enabled per account. - Steer a run while it is running.
run.steer(text)injects a message into the turn in flight and resolvescomplete_delivered, orrevert_to_followupwhen you should send it as a normal follow-up instead. It works while a foreground subagent is running, and that subagent moves to the background and keeps going. TypeScript local runs only; cloud runs resolverevert_to_followup. - Background subagents report back. When the agent runs a subagent in the background, its result now returns to the parent as a follow-up turn on the same run instead of being dropped when the parent turn ends.
run.stream()keeps yielding through those turns andrun.wait()resolves after them. Local agents, in TypeScript and Python. - Annotate custom tools.
annotationson alocal.customToolsentry passes MCP tool annotations (title,readOnlyHint,destructiveHint,idempotentHint,openWorldHint) through to the model. They are descriptive hints only; the SDK does not enforce them. TypeScript only.
- Long-running local agents keep their credentials fresh. Local runs in TypeScript and Python refresh the short-lived access token before it expires, so agents that run for more than an hour no longer fail with authentication errors. Cloud runs are unaffected.
- Output schemas on custom tools.
outputSchemain TypeScript andoutput_schemain Python declare a JSON Schema for a custom tool's structured result, advertised to the model as the tool's MCP output schema. Results are not validated against it. Local agents only.
- Ship the SDK as a single file. Under Bun,
@cursor/sdknow resolves to a flat single-file bundle, sobun build --compileworks with no import change and no moreCannot find module './986.js'.@cursor/sdk/bundledand@cursor/sdk/bundled/sqliteexpose the same build as explicit entries for other single-file bundlers such as esbuild. TypeScript only.
- Restrict the agent's toolset.
toolsallowlists the built-in tools offered to the model ([]means text-only), anddisallowedToolsremoves tools while keeping the rest. Both take public names like"read"or capability groups like"shell"and"mcp", in TypeScript and Python (tools,disallowed_tools). Local agents only for now, and not persisted acrossresume. - Log in from the browser in TypeScript.
Cursor.auth.login()opens a browser login, mints an API key, and stores it in~/.cursor/sdk/auth.json;Cursor.auth.status()andCursor.auth.logout()round it out. After login,Agent.create()and theCursor.*reads work withoutapiKeyorCURSOR_API_KEY. - Usage and cost for local agents.
agent.getUsage()in TypeScript andagent.get_usage()in Python now work for local agents too, returning a per-turn breakdown. Pass arunIdfrom a previous result to narrow to one turn. - Open PRs as the Cursor GitHub App.
cloud.openAsCursorGithubAppin TypeScript andopen_as_cursor_github_appin Python control PR authorship. Service-account keys default to the app; user keys default to the key's owner. - Multi-root local workspaces. Pass
local.dirsto load rules, skills, and project context from several folders;cwdstays the single primary working directory. Replaces thecwdarray form, which only ever used the first entry. - Clearer Python errors. Failures that previously surfaced as a bare "internal error" now carry the underlying message and code.
- Admin command denylists apply to local runs. Shell commands matching your team's admin denylist are rejected with a policy message before they execute, including on paths that skip approval prompts.
- Warm up a local workspace before the first send.
platform.prewarmLocalWorkspace(options)resolves rules, skills, MCP servers, and ignore files ahead of time, so the firstsend()against that workspace starts immediately. It returns a release function to call on shutdown. - Control how long workspace scans stay cached.
configureCursorSdk({ local: { workspaceScanCacheTtlMs } })sets the cache lifetime for workspace scans, and theCURSOR_RIPWALK_CACHE_TTL_MSenvironment variable sets the same value for hosted deployments. Long-lived servers on stable checkouts can now skip repeated re-scans. - Custom tools run without approval prompts. Host-defined tools passed via
customToolsno longer fail with an interactive-approval error on sandboxed or auto-review local runs. Deny rules and sandbox limits still apply. - Signed macOS binaries. The
@cursor/sdkmacOS platform packages now ship code-signed binaries, so Gatekeeper and endpoint security tools no longer block them. - Cleaner Python exception hierarchy.
PermissionDeniedError,BadRequestError, andInternalServerErrornow inherit directly fromCursorSDKErrorinstead ofAuthenticationError,ConfigurationError, andNetworkError, soexceptblocks catch what their names say. - Fixed intermittent startup failures in Python. Roughly 1 in 64 agent launches failed before reaching the first send. Launches are now reliable.
- Billed usage and cost on demand.
agent.getUsage()in TypeScript andagent.get_usage()in Python return token usage, billed cost, and a per-run breakdown for cloud agents, andAgent.getUsage(agentId)works without a handle. Cost is server-derived, includes discounts, and settles shortly after a run ends. Cloud-only for now; local runs throw a typed configuration error.
- TypeScript and Python now release together. Starting with 1.0.24,
@cursor/sdkon npm andcursor-sdkon PyPI ship from the same release and share a version number. Python releases no longer trail TypeScript. - More reliable long-running streams. Streaming responses on heavy runs no longer drop mid-stream, which previously surfaced as network errors in Python clients on long turns.
Ships with Python SDK 0.1.9.
- Per-send environment variables for cloud runs. Pass
send(prompt, { cloud: { envVars } })to scope env vars to a single run, including the first send that creates the agent.Agent.create({ cloud: { envVars } })still sets agent-scoped defaults. - Error details on failed runs. Local and cloud runs that fail now expose a structured error with
messageandcodefields, so you can tell what went wrong without parsing logs.run.wait()behaves the same as before. - Token usage in Python. Run streams emit typed
usagemessages with per-turn token counts, and cumulative totals are available onrun.usageandRunResult.usage, matching TypeScript from 1.0.22. - Sturdier local run history. Run history on disk now survives interrupted writes, fixing a class of failures where a crashed process left runs that could not be resumed.
- Fixed streaming stalls on Bun. Run streams under Bun no longer stall on long responses.
- Token usage on every run. Local runs emit per-turn
usageevents onrun.stream()and cumulative totals onrun.wait(). Cloud runs surface the same usage on their stream andwait()results, and totals persist for detached local handles so a process that reattaches still gets them.
- Run agents under Bun.
agent.send()now works under Bun with the same behavior as Node. This also fixes fresh Node installs that could miss a required dependency. - Friendlier runtime names in Python. List APIs and
get_runacceptruntime="cloud","local", and"auto", matching the documented values.
- The SDK imports cleanly under Bun. Importing
@cursor/sdkno longer crashes under Bun. Running agents under Bun follows in 1.0.21.