SDK
SDK Changelog
The latest features, improvements, and fixes shipping to the Cursor SDK, covering @cursor/sdk on npm and cursor-sdk on PyPI.
- 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.