Ga naar hoofdinhoud

Cursor SDK-tutorial: Coding-agents draaien met TypeScript

Gebruik de Cursor SDK om een lokale agent te draaien en daarna een cloudagent die een kleine bug in een GitHub-repo fixt en een pull request opent.
· 12 min lezen

Verken met AI

Cursor kondigde eind april 2026 zijn TypeScript-SDK aan en bracht die uit als publieke bèta. Het pakket wordt gepubliceerd als @cursor/sdk en draait vanuit Node-omgevingen zoals scripts, CI-jobs en backendservices.

Het grootste verschil met Cursor in de editor is waar de taak start. In plaats van zelf een chat te openen en een prompt te typen, maakt je code de agent aan, verstuurt de taak, streamt events, wacht op het resultaat en handelt fouten af.

In deze tutorial richten we de SDK in, draaien we een lokale quickstart en bouwen we daarna het hoofdproject: een cloudagent die een bug in een GitHub-repo fixt en een pull request opent. Ik houd de bug bewust klein zodat de SDK-flow zichtbaar blijft. Daarna behandelen we de extensiepunten en safety checks die je nodig hebt voordat je het patroon aanpast. Het cloudproject gebruikt een companion-repo met het launchscript en het doelproject.

De SDK is in publieke bèta, dus check de officiële docs voordat je deze code hergebruikt in een langlopend project.

Wat is de Cursor SDK?

De Cursor SDK is een TypeScript-pakket, @cursor/sdk, waarmee je Cursor-agents vanuit code kunt aanmaken en draaien. Je krijgt toegang tot:

  • Lokale en cloud-runs van agents.
  • De codebase-tools van Cursor, waaronder indexing, search, grep, MCP-servers, skills, hooks en subagents.
  • De modellen die via je Cursor-account beschikbaar zijn, waaronder Composer 2, GPT-5.5 en Claude.

De SDK gebruikt hetzelfde agentsysteem als de Cursor IDE, CLI en webapp. Het verschil is dat je het vanuit TypeScript aanroept.

Wanneer gebruik je de SDK

De SDK past bij taken die vanuit code moeten starten in plaats van door iemand die in de editor typt. Ik zou ’m gebruiken voor een CI-job die een agent vraagt een falende test te inspecteren, een webhook die een branch aanmaakt voor een bugfix, of een interne tool die een vaste agenttaak vanuit een formulier draait.

SDK versus de Cursor-app

De SDK is een andere manier om Cursor-agents te gebruiken, naast de Cursor IDE en de cursor agent CLI.

Gebruik de IDE voor editorchat. Gebruik de CLI voor terminalprompts. Gebruik de SDK wanneer TypeScript-code de agent moet aanmaken, de taak versturen en het resultaat afhandelen. Zoals hierboven genoemd, ondersteunt de CLI geen externe provider keys; de SDK authenticeert ook uitsluitend via een Cursor API-sleutel.

Hoe de Cursor SDK in elkaar zit

Voor je code schrijft, helpt het om de paar objecten en runtimekeuzes te kennen die de SDK blootlegt.

Diagram waarin te zien is dat Cursor SDK-code routeert naar lokale Node, Cursor cloud-VM of door de gebruiker beheerde VM, die allemaal dezelfde agenttools en modellayer delen.

Cursor SDK-architectuur over drie runtimes. Afbeelding door auteur.

Drie runtimes

De SDK ondersteunt drie plekken waar een agent kan draaien.

Runtime 

Wat het doet

Wanneer te gebruiken

Lokaal 

Draait de agent inline in je Node-proces, met bestanden vanaf disk

Dev-scripts, CI-checks tegen een working tree, snelle iteratie

Cursor cloud

Draait in een geïsoleerde VM met je repo ingeklonen, beheerd door Cursor

Parallelle agents, langere taken, runs die doorgaan na disconnects

Self-hosted cloud

Zelfde vorm als cloud maar met je eigen VM’s en netwerk

Teams die code, secrets en build-output binnen hun eigen omgeving willen houden

In dit artikel gebruiken we lokaal en Cursor cloud. Self-hosted cloud, hierboven genoemd, is vooral voor Enterprise-plannen. De SDK-code verandert via de configsleutel die je meegeeft: local of cloud.

Runtime, tools en modellen

Een run binnen de SDK heeft drie delen. De runtime is waar hij draait. De agenttools omvatten indexing, search, MCP-toolcalls, skills, hooks en subagents. Het model selecteer je met model: { id: "composer-2" } of een andere id die je account kan gebruiken.

Je stelt deze onderdelen in via de agentconfig.

Agent en Run

De twee belangrijkste objecten in de SDK zijn de Agent en de Run. Een agent bewaart conversatiestatus, workspaceconfig en modelinstellingen. Een run is één prompt die naar die agent wordt gestuurd, met een eigen stream, status, resultaat en cancel-handle.

Die scheiding is belangrijk omdat cloudagents één actieve run per agent afdwingen. Als je een tweede prompt probeert te sturen terwijl de eerste nog loopt, geeft de API 409 agent_busy terug. Voor parallel draaien maak je aparte agents, niet aparte runs op dezelfde agent.

Events streamen

Elke run biedt een stream van events via run.stream(), een async iterator. Elk event heeft een type-veld. In de huidige publieke bèta stuurt de SDK system, user, assistant, tool_call, thinking, status, request en task events uit. Er is geen gedocumenteerd connection:reconnecting-event; reconnects worden binnen de SDK afgehandeld.

Voor lagere-level updates accepteert agent.send() ook onDelta en onStep callbacks.

De Cursor SDK instellen

De setup is alleen Node, TypeScript en een Cursor API-sleutel.

Vereisten

Je hebt nodig:

  • Node.js 22 of nieuwer. Het pakket ondersteunt formeel Node 18 of nieuwer, maar Node 22 komt overeen met de officiële cookbookvoorbeelden en ondersteunt de --env-file-vlag die hieronder wordt gebruikt om .env te laden.

  • Een Cursor-account op Pro ($20/maand) of hoger voor cloudagents.

  • Basiskennis van TypeScript.

  • tsx om TypeScript te draaien zonder te compileren.

Installeer de SDK en de TypeScript-tools:

Installeer de SDK

In een lege map:

npm init -y
npm install @cursor/sdk
npm install --save-dev typescript tsx @types/node

Voeg "type": "module" toe aan je package.json zodat imports als ESM werken. Voeg daarna een tsconfig.json toe die top-level await en expliciete asynchrone disposals ondersteunt:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "lib": ["ES2022", "ESNext.Disposable"],
    "strict": true,
    "esModuleInterop": true
  }
}

Haal een Cursor API-sleutel op

De sleutel werd oorspronkelijk gegenereerd onder cursor.com/dashboard/cloud-agents, maar is verplaatst naar cursor.com/dashboard/integrations. Als een gids verwijst naar "Cloud Agents", kijk dan bij Integrations.

Cursor-dashboard Integrations-pagina met de sectie User API Keys gemarkeerd en een zichtbare Generate-knop.

Genereer User API Keys via Integrations. Afbeelding door auteur.

Genereer daar een User API Key en sla die op als CURSOR_API_KEY:

echo 'CURSOR_API_KEY=crsr_your_key_here' > .env

Voeg .env toe aan je .gitignore. De SDK leest process.env direct; hij laadt geen .env-bestanden voor je.

Projectstructuur

Mapindeling: package.json, tsconfig.json, .env en src/ voor je scripts. Voeg een .cursor/-map toe voor hooks, skills en subagents wanneer je die nodig hebt.

Je eerste lokale Cursor-agent

Het eerste voorbeeld is bewust klein. Het maakt een lokale agent aan, stuurt één prompt, streamt de respons en sluit de agent af.

Maak een lokale agent aan

Maak src/01-quickstart.ts aan:

import { Agent, type SDKMessage } from "@cursor/sdk";

const agent = await Agent.create({
  apiKey: process.env.CURSOR_API_KEY!,
  model: { id: "composer-2" },
  local: { cwd: process.cwd() },
});

Agent.create() geeft een handle terug voordat de agent iets heeft gedaan. local: { cwd: process.cwd() } wijst de agent op de huidige werkdirectory. De SDK ondersteunt asynchrone disposal; in tutorialcode geef ik de voorkeur aan een expliciet finally-blok omdat dat await using-versievraagstukken vermijdt.

Stuur een prompt en stream de respons

Een prompt sturen geeft een Run-object terug met een eigen stream en status. Dit voorbeeld leest de stream in een for await-lus en print alleen de assistent-tekst.

try {
  const run = await agent.send(
    `Write a terminal-friendly summary for a screenshot.

Output exactly:
Local agent summary
- Purpose: demonstrates a local Cursor SDK agent.
- Key files: src/01-quickstart.ts, package.json, tsconfig.json.
- SDK action: creates an agent and streams assistant text.

Rules:
Print exactly those three bullets.
No Markdown bold.
No extra explanation.`,
  );

  for await (const event of run.stream()) {
    if (event.type !== "assistant") continue;
    for (const block of event.message.content) {
      if (block.type === "text") {
        process.stdout.write(block.text);
      }
    }
  }

  const result = await run.wait();
  const duration = result.durationMs === undefined ? "" : `duration=${result.durationMs}ms`;
  console.log(`\n[done] status=${result.status}${duration}`);
} finally {
  await agent[Symbol.asyncDispose]();
}

De agent stuurt meerdere eventtypes uit, waaronder thinking, tool_call en status. Dit voorbeeld filtert op assistant-tekst omdat dat het zichtbare antwoord is. event.message.content is getypt en bruikbaar voor streaming, maar is block-based en kan toolcalls bevatten. Als je alleen eindtekst nodig hebt, sla de stream dan over en lees result.result na run.wait(). durationMs is publiek maar optioneel, dus het voorbeeld behandelt ’m als optioneel.

Fouten afhandelen

De SDK gooit getypte fouten die CursorAgentError uitbreiden. Veelvoorkomende gevallen zijn AuthenticationError voor een ongeldige sleutel, ConfigurationError voor een ongeldige model-id, RateLimitError, IntegrationNotConnectedError en NetworkError.

import { CursorAgentError } from "@cursor/sdk";

try {
  // ... agent code
} catch (error) {
  if (error instanceof CursorAgentError) {
    console.error([${error.code ?? "unknown"}] ${error.message});
    if (error.isRetryable) {
      console.error("Retryable. Try again in a moment.");
    }
  } else {
    throw error;
  }
}

De isRetryable-vlag is waar je retrylogica op moet letten. Netwerkfouten en rate limits zijn retryable; onjuiste configuratie en authenticatie niet.

Draaien

Sla het bestand op en draai het met de .env-loader van Node en tsx.

node --env-file=.env --import tsx/esm src/01-quickstart.ts

De vlag --env-file=.env laadt CURSOR_API_KEY voordat het script start. Het script zou assistent-tekst moeten printen, gevolgd door een statusvoetregel op één lijn. Zie je een authenticatiefout, check dan je .env en bevestig dat de sleutel vanuit het Integrations-dashboard is gegenereerd.

Events streamen vanaf een lokale agent. Video door auteur.

Een cloudagent bouwen die bugs fixt

Het volgende voorbeeld verplaatst zich van een lokale map naar een GitHub-repo die in Cursor’s cloud is gekloond. De taak blijft klein: fix een falende auth-test en open een pull request.

Wanneer kies je voor cloud

Cloudagents draaien in VM’s die door Cursor worden beheerd. Ze klonen de repo, zetten een ontwikkelomgeving op en gaan door als je lokale script stopt. Klaar? Dan kunnen ze een branch pushen en een pull request openen. De keerzijde is opstarttijd en hoger tokenverbruik vergeleken met een kleine lokale run.

Cloud-run gestart vanuit de SDK. Video door auteur.

Cloudruns verschijnen in Cursor Web en het Agents-venster op desktop terwijl ze draaien. SDK-cloudagents worden uit de standaardlijst gefilterd. In Cursor Web gebruik je Filter > Source > SDK. In het Agents-venster op desktop gebruik je de voettekst van de zijbalk: Show > SDK. Als je het bc- agent-id hebt, kun je ’m ook direct openen via https://cursor.com/agents/bc-... of via de desktop deeplink. Een eenvoudige vuistregel: gebruik cloud wanneer een van deze waar is:

  • De taak duurt mogelijk langer dan een lokale scriptsessie.
  • Je wilt een PR of branch als output, niet alleen tekst.
  • Je wilt meerdere agents parallel tegen dezelfde repo laten draaien.
  • De agent moet code draaien (tests, builds) in een geïsoleerde omgeving.

Voor korte lokale checks gebruik je de lokale runtime.

Configureer de agent

De cloudconfig vervangt de local-sleutel door een cloud-sleutel. Je geeft de repo op om te klonen, je kunt optioneel een startbranch vastpinnen en instellen of Cursor een PR moet openen wanneer de run klaar is.

import { Agent, CursorAgentError } from "@cursor/sdk";

const agent = await Agent.create({
  apiKey: process.env.CURSOR_API_KEY!,
  name: "Cloud bug fixer",
  model: { id: "composer-2" },
  cloud: {
    repos: [
      { url: "https://github.com/your-org/your-repo", startingRef: "main" },
    ],
    autoCreatePR: true,
  },
});

console.log(Started cloud agent ${agent.agentId});

repos is een array, maar cloud v1 ondersteunt momenteel één repo per agent. startingRef is de branch of commit waarvan de agent start. autoCreatePR: true vraagt Cursor een pull request te openen wanneer de run klaar is. GitHub-permissies, integratiestatus, lege diffs of reporegels kunnen er nog steeds voor zorgen dat je alleen een branch krijgt in plaats van een PR.

Om de agent de repo te laten klonen, moet je Cursor-account de GitHub-integratie hebben ingesteld. Als die niet is verbonden, geeft de SDK een IntegrationNotConnectedError terug met een helpUrl-veld.

Verstuur de taak en maak later opnieuw verbinding

Het onderstaande patroon verstuurt een taak en wacht vervolgens op het resultaat via Agent.getRun(). Zo kan een ander proces later opnieuw verbinden als het oorspronkelijke script is gestopt.

const run = await agent.send(
  "Find the failing test in the auth module, fix the bug, and add a regression test.",
);
console.log(Run ${run.id} in progress.);

const handle = await Agent.getRun(run.id, {
  runtime: "cloud",
  agentId: agent.agentId,
  apiKey: process.env.CURSOR_API_KEY!,
});

const result = await handle.wait();

const branch = result.git?.branches?.[0];
console.log(Status: ${result.status});
if (branch?.prUrl) {
  console.log(PR: ${branch.prUrl});
} else if (branch?.branch) {
  console.log(Branch: ${branch.branch});
}

Je kunt de run streamen voor live output, maar wait() is genoeg wanneer je alleen het resultaat nodig hebt. Wanneer een PR is aangemaakt, staat de URL op result.git?.branches[0]?.prUrl; cloud v1 ondersteunt nog geen meerdere repo’s, dus index 0 is de branch om te checken. Is er geen PR-URL, check dan branch?.branch en open de PR handmatig. Bewaar de run.id en agent.agentId als je later opnieuw wilt aansluiten.

GitHub-PR vanuit cloudagent. Video door auteur.

Bekijk op dit punt het pull request zoals elke andere codewijziging.

Lokaal versus cloud in één oogopslag

De twee runtimes gebruiken dezelfde SDK maar gedragen zich anders.

Capaciteit

Lokaal

Cloud

Waar het draait

Je Node-proces

Een VM die Cursor beheert

Bestandstoegang

Je schijf

Alleen gekloonde repo

Overleeft disconnects

Nee

Ja

Opent PR’s

Nee

Ja, wanneer reporechten dat toelaten

Levert artifacts op

Nee

Ja (15 minuten presigned URL’s)

Gebruik voor

Iteratie, CI op een checkout

Langere taken, parallelle runs, PR-output

Gebruik lokale runs voor snelle checks. Gebruik cloudruns wanneer je een branch, PR of artifact nodig hebt.

Andere voorbeelden

De bugfixer gebruikte de hoofdflow van de SDK: maak een agent, stuur een taak, wacht op een resultaat en beoordeel de output. De cookbook van Cursor toont dezelfde SDK-calls in grotere voorbeelden:

  • agent-kanban lijst cloudagents op, groepeert ze op status of repo en toont artifacts in preview.

  • coding-agent-cli wikkelt lokale en cloudagents in een terminaltool.

  • app-builder draait een lokale agent vanuit een chat-UI en toont gegenereerde React-code in preview.

Eén detail om scherp te houden is artifact-handling. Artifacts zijn alleen beschikbaar bij cloudruns. Lokale agents passen bij tekstoutput en snelle checks. Cloudagents passen bij taken die bestanden, branches of PR’s als output nodig hebben.

MCP, Skills, Hooks en Subagents

De SDK kan dezelfde projectagentconfig lezen die Cursor in de IDE gebruikt. De bugfixer heeft niet alles nodig, maar deze onderdelen zijn belangrijk zodra de agent in een echte repo werkt.

MCP-servers

Zoals eerder genoemd, verbinden MCP-servers agents met externe tools. Je kunt servers inline meegeven in Agent.create() of definiëren in .cursor/mcp.json. Als je mcpServers opnieuw meegeeft in agent.send(), gebruikt die run de servers uit send() in plaats van de servers uit Agent.create(). Gebruik HTTP-MCP-servers voor gehoste tools. Gebruik stdio-MCP-servers voor tools die naast de agent draaien.

Skills

Skills zijn markdownbestanden in .cursor/skills/ die de agent projectinstructies geven, zoals testframeworkkeuzes, API-conventies of releaseregels. Gebruik ze voor richtlijnen die op elke run in de repo van toepassing moeten zijn.

Hooks

Hooks staan in .cursor/hooks.json en draaien op specifieke punten in de agentloop. Veelgebruikte toepassingen zijn formatteren na bestandsedits en destructieve shellcommando’s blokkeren vóór uitvoering. Gebruik voor safety hooks fail-closed-gedrag zodat een kapotte hook de actie blokkeert.

Subagents

Subagents zijn benoemde agents die de hoofdagent kan aanroepen voor gefocust werk, zoals code review of tests schrijven. Definieer ze in .cursor/agents/*.md of inline in Agent.create({ agents: { ... } }). Cloudagents laden projectsubagents uit de uitgecheckte repo. Lokale agents hebben local.settingSources: ["project"] nodig als je wilt dat ze project- .cursor/config lezen. Houd elke subagent smal.

Safety checks

Voordat agents een echte repo aanraken, stel eerst de grenzen in. Dit is het deel dat ik niet zou overslaan.

  • Scope permissies strak. Agents kunnen bestanden lezen, commando’s uitvoeren en alle credentials gebruiken die jij ze geeft. Geef agents repo-scoped toegang, geen brede servicecredentials.

  • Houd secrets uit prompts. Prompts kunnen in transcripts terechtkomen. Gebruik omgevingsvariabelen voor CURSOR_API_KEY en elke andere token, en onthoud dat stdio-MCP- env-waarden de runtime bereiken waar de server draait.

  • Eis menselijke review. Als een cloudagent PR’s kan openen, moet branch protection een menselijke reviewer vereisen vóór merge. Combineer autoCreatePR: true niet met automerge, tenzij de repo laag risico is.

  • Let op kosten en modelkeuze. SDK-gebruik komt uit Cursor’s tokengebaseerde gebruikspool. Zoals eerder genoemd, is Composer 2 één modeloptie voor codingtaken; roep Cursor.models.list() aan als je wilt zien welke model-id’s je account kan gebruiken.

  • Log de run. run.conversation() geeft een gestructureerd beeld van de beurten van de agent. Sla het op voor runs die je later misschien moet debuggen of auditen.

Conclusie

Dit artikel behandelde npm install @cursor/sdk, een lokale quickstart, een cloudagent die een pull request opent en de belangrijkste extensiepunten voor agentgedrag in een repo.

Gebruik de SDK wanneer code de agent moet starten en beheren. Als de taak alleen een editorgesprek is, is de Cursor-app meestal genoeg.

Ter vergelijking: onze gidsen over de Claude Agent SDK en de OpenAI Agents SDK behandelen agent-API’s in andere ecosystemen.

Khalid Abdelaty

Auteur

Khalid Abdelaty

Ik ben een data-engineer en communitybouwer die werkt aan datapijplijnen, cloud en AI-tools, en tegelijkertijd praktische, impactvolle tutorials schrijft voor DataCamp en beginnende developers.

FAQs

Werkt de Cursor SDK met Python of een andere taal?

Niet officieel. De SDK is alleen voor TypeScript in de publieke bèta; Python-gebruikers zouden rechtstreeks de Cloud Agents REST API moeten aanroepen.

Kan ik de SDK gebruiken op het gratis Hobby-abonnement?

Ja voor lokale agents, binnen de rate limits en gebruikslimieten van de gratis tier. Nee voor cloudagents; daar is Pro of hoger voor nodig.

Hoe annuleer ik een run die te lang duurt?

Roep run.cancel() aan. De status wordt cancelled, de livestreamp wordt afgebroken en run.wait() resolve’t met het geannuleerde resultaat.

Waar passen hooks als de SDK geen programmatische callback heeft?

Hooks zijn repobeleid, geen per-scriptlogica. Zet gedeelde regels in .cursor/hooks.json, en houd run-specifieke logica rond agent.send() of run.wait() in je TypeScript-code.

Is de SDK klaar voor productiegebruik?

Gebruik het eerst voor laagrisico-taken. Het SDK-oppervlak is nog in publieke bèta. Pin @cursor/sdk, scope secrets, vereis review en reken op API-wijzigingen vóór algemene beschikbaarheid.

Onderwerpen

Gerelateerd