Weiter zum Inhalt

Cursor SDK Tutorial: Coding-Agents mit TypeScript ausführen

Nutze das Cursor SDK für einen lokalen Agenten und lass dann einen Cloud-Agenten einen kleinen Bug in einem GitHub-Repo beheben und einen Pull Request öffnen.
Aktualisiert 18. Sept. 2026  · 12 Min. lesen

Mit KI erkunden

ChatGPTClaudePerplexity

Cursor hat sein TypeScript SDK Ende April 2026 angekündigt und als öffentliche Beta veröffentlicht. Das Paket heißt @cursor/sdk und läuft in Node-Umgebungen wie Skripten, CI-Jobs und Backend-Services.

Der entscheidende Unterschied zur Nutzung von Cursor im Editor ist der Startpunkt der Aufgabe. Statt einen Chat zu öffnen und selbst einen Prompt einzugeben, erstellt dein Code den Agenten, sendet die Aufgabe, streamt Events, wartet auf das Ergebnis und behandelt Fehler.

In diesem Tutorial richten wir das SDK ein, führen ein lokales Quickstart-Beispiel aus und bauen dann das Hauptprojekt: einen Cloud-Agenten, der einen Bug in einem GitHub-Repo behebt und einen Pull Request öffnet. Ich halte den Bug bewusst klein, damit der SDK-Flow klar sichtbar bleibt. Danach sehen wir uns die Erweiterungspunkte und Safety-Checks an, die du vor der Anpassung des Musters brauchst. Das Cloud-Projekt nutzt ein Begleit-Repo mit dem Starterskript und dem Zielprojekt.

Das SDK ist in der öffentlichen Beta, also sieh in die offiziellen Docs, bevor du den Code in einem langfristigen Projekt wiederverwendest.

Was ist das Cursor SDK?

Das Cursor SDK ist ein TypeScript-Paket, @cursor/sdk, mit dem du Cursor-Agenten per Code erstellen und ausführen kannst. Es gibt dir Zugriff auf:

  • Lokal- und Cloud-Runs von Agenten.
  • Die Codebase-Tools von Cursor, inklusive Indexierung, Suche, Grep, MCP-Server, Skills, Hooks und Subagenten.
  • Die Modelle deines Cursor-Kontos, darunter Composer 2, GPT-5.5 und Claude.

Das SDK nutzt dasselbe Agentensystem wie die Cursor IDE, die CLI und die Web-App. Der Unterschied ist, dass du es aus TypeScript aufrufst.

Wann du das SDK nutzt

Das SDK passt zu Aufgaben, die aus Code heraus starten sollen statt von einer Person im Editor. Ich würde es z. B. für einen CI-Job nehmen, der einen Agenten einen fehlschlagenden Test untersuchen lässt, für einen Webhook, der einen Branch für einen Bugfix anlegt, oder für ein internes Tool, das eine feste Agentenaufgabe aus einem Formular heraus startet.

SDK versus Cursor-App

Das SDK ist ein weiterer Weg, Cursor-Agenten zu nutzen – neben der Cursor IDE und der cursor agent CLI.

Nutze die IDE für Editor-Chats. Nutze die CLI für Prompts im Terminal. Nutze das SDK, wenn TypeScript-Code den Agenten erstellen, die Aufgabe senden und das Ergebnis verarbeiten soll. Wie oben erwähnt, unterstützt die CLI keine externen Provider-Keys; auch das SDK authentifiziert ausschließlich über einen Cursor-API-Key.

So greift das Cursor SDK ineinander

Bevor du Code schreibst, hilft ein Blick auf die wenigen Objekte und Laufzeitumgebungen, die das SDK bereitstellt.

Diagramm zeigt Cursor SDK Code, der zu lokalem Node, Cursor-Cloud-VM oder nutzerverwalteter VM routet – alle teilen dieselben Agenten-Tools und die Modellschicht.

Cursor SDK Architektur über drei Laufzeiten. Bild: Autor.

Drei Laufzeiten

Das SDK unterstützt drei Orte, an denen ein Agent laufen kann.

Laufzeit 

Was sie macht

Wann nutzen

Lokal 

Führt den Agenten inline in deinem Node-Prozess aus, liest Dateien von der Festplatte

Dev-Skripte, CI-Checks gegen den Working Tree, schnelle Iteration

Cursor Cloud

Läuft in einer isolierten VM mit geklontem Repo, gemanagt von Cursor

Parallele Agenten, längere Aufgaben, Runs, die nach Disconnects weiterlaufen

Self hosted Cloud

Gleicher Aufbau wie Cloud, aber mit deinen VMs und deinem Netzwerk

Teams, die Code, Secrets und Build-Output in ihrer Umgebung halten müssen

In diesem Artikel nutzen wir Lokal und Cursor Cloud. Self hosted Cloud, wie oben gelistet, ist vor allem für Enterprise-Pläne. Die SDK-Konfiguration ändert sich über den Konfigschlüssel, den du übergibst: local oder cloud.

Laufzeit, Tools und Modelle

Ein Run im SDK hat drei Teile. Die Laufzeit legt fest, wo er ausgeführt wird. Die Agenten-Tools umfassen Indexierung, Suche, MCP-Toolaufrufe, Skills, Hooks und Subagenten. Das Modell wählst du mit model: { id: "composer-2" } oder einer anderen ID, die dein Konto nutzen kann.

Diese Bausteine setzt du in der Agenten-Konfiguration.

Agent und Run

Die zwei wichtigsten Objekte im SDK sind Agent und Run. Ein Agent hält den Gesprächsstatus, die Workspace-Config und die Modelleinstellungen. Ein Run ist ein einzelner Prompt an diesen Agenten – mit eigenem Stream, Status, Ergebnis und Cancel-Handle.

Diese Trennung ist wichtig, weil Cloud-Agenten genau einen aktiven Run pro Agenten erlauben. Versuchst du einen zweiten Prompt zu senden, während der erste noch läuft, gibt die API 409 agent_busy zurück. Für Parallellauf brauchst du getrennte Agenten, nicht mehrere Runs auf demselben Agenten.

Streaming-Events

Jeder Run stellt einen Event-Stream über run.stream() bereit, ein asynchroner Iterator. Jedes Event hat ein type-Feld. In der aktuellen öffentlichen Beta emittiert das SDK system, user, assistant, tool_call, thinking, status, request und task Events. Es gibt kein dokumentiertes connection:reconnecting-Event; Reconnects werden im SDK intern gehandhabt.

Für Ereignisse auf niedrigerer Ebene akzeptiert agent.send() auch onDelta- und onStep-Callbacks.

Das Cursor SDK einrichten

Für das Setup brauchst du nur Node, TypeScript und einen Cursor-API-Key.

Voraussetzungen

Du brauchst:

  • Node.js 22 oder neuer. Offiziell unterstützt das Paket Node 18 oder neuer, aber Node 22 passt zu den Beispielen aus dem Cookbook und unterstützt das --env-file-Flag unten zum Laden von .env.

  • Ein Cursor-Konto auf Pro (20 $/Monat) oder höher für Cloud-Agenten.

  • Grundkenntnisse in TypeScript.

  • tsx, um TypeScript ohne Kompilieren auszuführen.

Installiere das SDK und die TypeScript-Tools:

SDK installieren

In einem frischen Ordner:

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

Füge "type": "module" in deiner package.json hinzu, damit die Imports als ESM funktionieren. Lege dann eine tsconfig.json an, die Top-Level-await und explizites asynchrones Disposing unterstützt:

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

Cursor-API-Key holen

Der Key wurde ursprünglich unter cursor.com/dashboard/cloud-agents generiert, ist aber umgezogen nach cursor.com/dashboard/integrations. Wenn ein Guide auf „Cloud Agents“ verweist, schau stattdessen bei Integrations.

Cursor Dashboard Integrations-Seite mit hervorgehobenen User API Keys und sichtbarem Generate-Button.

Erzeuge User API Keys unter Integrations. Bild: Autor.

Erzeuge dort einen User-API-Key und speichere ihn als CURSOR_API_KEY:

echo 'CURSOR_API_KEY=crsr_your_key_here' > .env

Füge .env zu deiner .gitignore hinzu. Das SDK liest process.env direkt; es lädt .env-Dateien nicht für dich.

Projektstruktur

Ordnerlayout: package.json, tsconfig.json, .env und src/ für deine Skripte. Lege bei Bedarf einen .cursor/-Ordner für Hooks, Skills und Subagenten an.

Dein erster lokaler Cursor-Agent

Das erste Beispiel ist bewusst klein. Es erstellt einen lokalen Agenten, sendet einen Prompt, streamt die Antwort und entsorgt den Agenten.

Lokalen Agenten erstellen

Erstelle src/01-quickstart.ts:

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() gibt einen Handle zurück, bevor der Agent irgendetwas tut. local: { cwd: process.cwd() } zeigt den Agenten auf das aktuelle Arbeitsverzeichnis. Das SDK unterstützt asynchrones Disposing; in Tutorial-Code bevorzuge ich einen expliziten finally-Block, um Versionsfragen rund um await using zu vermeiden.

Prompt senden und Antwort streamen

Das Senden eines Prompts liefert ein Run-Objekt mit eigenem Stream und Status. Dieses Beispiel liest den Stream in einer for await-Schleife und druckt nur den Assistant-Text.

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]();
}

Der Agent emittiert mehrere Event-Typen, darunter thinking, tool_call und status. Dieses Beispiel filtert auf assistant-Text, weil das die sichtbare Antwort ist. event.message.content ist typisiert und für Streaming nutzbar, ist aber blockbasiert und kann Tool-Calls enthalten. Wenn du nur finalen Text brauchst, überspringe den Stream und lies result.result nach run.wait(). durationMs ist öffentlich, aber optional, daher behandelt das Beispiel es optional.

Fehler behandeln

Das SDK wirft typisierte Fehler, die CursorAgentError erweitern. Häufige Fälle sind AuthenticationError für einen ungültigen Key, ConfigurationError für eine falsche Modell-ID, RateLimitError, IntegrationNotConnectedError und 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;
  }
}

Das Flag isRetryable ist das, worauf deine Retry-Logik prüfen sollte. Netzwerkfehler und Ratenlimits sind wiederholbar; fehlerhafte Konfiguration und Authentifizierung nicht.

Ausführen

Speichere die Datei und starte sie mit dem .env-Loader von Node und tsx.

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

Das Flag --env-file=.env lädt CURSOR_API_KEY vor dem Skriptstart. Das Skript sollte Assistant-Text ausgeben und dann eine einzeilige Status-Fußzeile. Wenn du einen Authentifizierungsfehler siehst, prüfe deine .env und bestätige, dass der Key über das Integrations-Dashboard erzeugt wurde.

Streaming-Events von einem lokalen Agenten. Video: Autor.

Einen Cloud-Agenten zum Bugfixen bauen

Im nächsten Beispiel wechseln wir vom lokalen Ordner zu einem GitHub-Repo, das in der Cursor-Cloud geklont wird. Die Aufgabe bleibt klein: Einen fehlschlagenden Auth-Test reparieren und einen Pull Request öffnen.

Wann Cloud die richtige Wahl ist

Cloud-Agenten laufen in von Cursor verwalteten VMs. Sie klonen das Repo, richten eine Dev-Umgebung ein und laufen weiter, wenn dein lokales Skript endet. Am Ende können sie einen Branch pushen und einen Pull Request öffnen. Der Trade-off sind längere Startzeiten und höherer Tokenverbrauch im Vergleich zu einem kleinen lokalen Run.

Cloud-Run aus dem SDK gestartet. Video: Autor.

Cloud-Runs tauchen in Cursor Web und im Desktop-Agents-Fenster auf, während sie laufen. SDK-Cloud-Agenten sind aus der Standardliste herausgefiltert. In Cursor Web nutze Filter > Source > SDK. Im Desktop-Agents-Fenster nutze die Seitenleistenfußzeile: Show > SDK. Wenn du die bc- Agent-ID hast, kannst du sie auch direkt unter https://cursor.com/agents/bc-... oder per Desktop-Deep-Link öffnen. Eine einfache Faustregel: Nutze Cloud, wenn eines davon zutrifft:

  • Die Aufgabe dauert länger als eine lokale Skriptsession.
  • Du willst als Output einen PR oder Branch, nicht nur Text.
  • Du willst mehrere Agenten parallel gegen dasselbe Repo laufen lassen.
  • Der Agent muss Code (Tests, Builds) in einer isolierten Umgebung ausführen.

Für kurze lokale Checks nutze die lokale Laufzeit.

Agent konfigurieren

Die Cloud-Config ersetzt den local-Schlüssel durch cloud. Du listest das zu klonende Repo, pinnst optional einen Start-Branch und stellst ein, ob Cursor am Ende automatisch einen PR öffnen soll.

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 ist ein Array, aber Cloud v1 unterstützt derzeit ein einzelnes Repo pro Agenten. startingRef ist der Branch oder Commit, von dem der Agent startet. autoCreatePR: true bittet Cursor, nach Abschluss des Runs einen Pull Request zu öffnen. GitHub-Berechtigungen, Integrationsstatus, leere Diffs oder Repo-Regeln können dennoch dazu führen, dass du nur einen Branch statt eines PRs bekommst.

Damit der Agent das Repo klonen kann, muss in deinem Cursor-Konto die GitHub-Integration eingerichtet sein. Ist sie nicht verbunden, gibt das SDK einen IntegrationNotConnectedError mit einem helpUrl-Feld zurück.

Aufgabe senden und später wieder anbinden

Das Muster unten sendet eine Aufgabe und wartet dann über Agent.getRun() auf das Ergebnis. So kann sich ein anderer Prozess später wieder verbinden, wenn das ursprüngliche Skript beendet ist.

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});
}

Du kannst den Run streamen, um Live-Ausgaben zu sehen, aber wait() reicht, wenn du nur das Ergebnis brauchst. Wenn ein PR erstellt wird, kommt die URL unter result.git?.branches[0]?.prUrl zurück; Cloud v1 unterstützt noch keine mehreren Repos, daher ist Index 0 der Branch, den du prüfen solltest. Wenn es keine PR-URL gibt, prüfe branch?.branch und öffne den PR manuell. Hebe run.id und agent.agentId auf, wenn du später wieder anknüpfen willst.

GitHub-PR vom Cloud-Agenten. Video: Autor.

An diesem Punkt prüfst du den Pull Request wie jede andere Codeänderung.

Lokal versus Cloud im Überblick

Beide Laufzeiten nutzen dasselbe SDK, verhalten sich aber unterschiedlich.

Fähigkeit

Lokal

Cloud

Wo es läuft

Dein Node-Prozess

Eine von Cursor gemanagte VM

Dateizugriff

Deine Festplatte

Nur geklontes Repo

Übersteht Disconnects

Nein

Ja

Öffnet PRs

Nein

Ja, wenn die Repo-Rechte es erlauben

Gibt Artefakte zurück

Nein

Ja (15-minütige presigned URLs)

Einsatz für

Iteration, CI auf einem Checkout

Längere Tasks, parallele Runs, PR-Output

Nutze lokale Runs für schnelle Checks. Nutze Cloud-Runs, wenn du einen Branch, PR oder ein Artefakt brauchst.

Weitere Beispiele

Der Bugfixer hat den Hauptflow des SDKs genutzt: Agent anlegen, Aufgabe senden, Ergebnis abwarten und Output prüfen. Das Cookbook von Cursor zeigt dieselben SDK-Aufrufe in größeren Beispielen:

  • agent-kanban listet Cloud-Agenten, gruppiert sie nach Status oder Repo und zeigt Artefakt-Vorschauen.

  • coding-agent-cli kapselt lokale und Cloud-Agenten in einem Terminal-Tool.

  • app-builder startet einen lokalen Agenten aus einer Chat-UI und zeigt generierten React-Code an.

Ein Detail, das du im Blick behalten solltest, ist der Umgang mit Artefakten. Artefakte gibt es nur bei Cloud-Runs. Lokale Agenten sind für Textausgaben und schnelle Checks gedacht. Cloud-Agenten passen für Aufgaben, die Dateien, Branches oder PRs als Output brauchen.

MCP, Skills, Hooks und Subagenten

Das SDK kann dieselbe Projekt-Agenten-Konfiguration lesen, die Cursor in der IDE nutzt. Der Bugfixer braucht nicht alles, aber diese Bausteine werden wichtig, sobald der Agent in einem echten Repo arbeitet.

MCP-Server

Wie erwähnt, verbinden MCP-Server Agenten mit externen Tools. Du kannst Server inline in Agent.create() übergeben oder in .cursor/mcp.json definieren. Wenn du mcpServers erneut in agent.send() übergibst, nutzt dieser Run die Server aus send() statt der Server aus Agent.create(). Nutze HTTP-MCP-Server für gehostete Tools. Nutze stdio-MCP-Server für Tools, die neben dem Agenten laufen.

Skills

Skills sind Markdown-Dateien in .cursor/skills/, die dem Agenten Projektanweisungen geben, etwa Testframework-Auswahl, API-Konventionen oder Release-Regeln. Nutze sie für Leitplanken, die für jeden Run im Repo gelten sollen.

Hooks

Hooks leben in .cursor/hooks.json und laufen an bestimmten Punkten der Agentenschleife. Häufige Einsätze: Formatierung nach Datei-Edits und das Blockieren destruktiver Shell-Kommandos vor der Ausführung. Bei Safety-Hooks solltest du mit „fail closed“ arbeiten, damit ein defekter Hook die Aktion blockiert.

Subagenten

Subagenten sind benannte Agenten, die der Hauptagent für fokussierte Arbeit aufrufen kann, z. B. Code-Review oder Testschreiben. Definiere sie in .cursor/agents/*.md oder inline in Agent.create({ agents: { ... } }). Cloud-Agenten laden Projekt-Subagenten aus dem ausgecheckten Repo. Lokale Agenten brauchen local.settingSources: ["project"] , wenn sie Projekt- .cursor/-Config lesen sollen. Halte jeden Subagenten schlank.

Safety-Checks

Bevor Agenten ein echtes Repo anfassen, setze zuerst klare Grenzen. Diesen Teil würde ich nicht auslassen.

  • Berechtigungen eng fassen. Agenten können Dateien lesen, Befehle ausführen und alle Credentials nutzen, die du ihnen gibst. Gib Agenten repo-skopierten Zugriff, keine weitreichenden Service-Credentials.

  • Secrets aus Prompts raushalten. Prompts können in Transkripten landen. Nutze Umgebungsvariablen für CURSOR_API_KEY und alle anderen Tokens und denk daran, dass stdio-MCP- env-Werte die Laufzeit erreichen, in der der Server läuft.

  • Menschliches Review verlangen. Wenn ein Cloud-Agent PRs öffnen darf, sollte Branchschutz vor dem Merge eine menschliche Review verlangen. Kombiniere autoCreatePR: true nicht mit Auto-Merge, außer das Repo ist niedriges Risiko.

  • Kosten und Modellwahl im Blick behalten. SDK-Nutzung geht auf den tokenbasierten Nutzungspool von Cursor. Wie erwähnt, ist Composer 2 eine Modelloption für Coding-Aufgaben; rufe Cursor.models.list() auf, wenn du sehen willst, welche Modell-IDs dein Konto nutzen kann.

  • Run protokollieren. run.conversation() liefert eine strukturierte Sicht auf die Agenten-Turns. Speichere sie für Runs, die du später debuggen oder auditieren musst.

Fazit

In diesem Artikel haben wir npm install @cursor/sdk, einen lokalen Quickstart, einen Cloud-Agenten mit Pull Request und die wichtigsten Erweiterungspunkte für Repo-Agenten behandelt.

Nutze das SDK, wenn Code den Agenten starten und steuern soll. Wenn es nur um ein Gespräch im Editor geht, reicht die Cursor-App meist aus.

Zum Vergleich: Unsere Guides zum Claude Agent SDK und zum OpenAI Agents SDK decken Agenten-APIs in anderen Ökosystemen ab.


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

Ich bin Dateningenieur und Community-Builder und arbeite mit Datenpipelines, Cloud- und KI-Tools. Außerdem schreibe ich praktische, super nützliche Tutorials für DataCamp und angehende Entwickler.

FAQs

Funktioniert das Cursor SDK mit Python oder einer anderen Sprache?

Nicht offiziell. Das SDK ist in der öffentlichen Beta ausschließlich für TypeScript verfügbar; Python-User sollten die Cloud Agents REST API direkt aufrufen.

Kann ich das SDK im kostenlosen Hobby-Plan nutzen?

Ja für lokale Agenten – innerhalb der Limits und Nutzungskontingente des Free-Tiers. Nein für Cloud-Agenten; dafür brauchst du Pro oder höher.

Wie breche ich einen Run ab, der zu lange dauert?

Rufe run.cancel() auf. Der Status wechselt zu cancelled, der Livestream bricht ab und run.wait() liefert das abgebrochene Ergebnis.

Wo passen Hooks hin, wenn das SDK keinen programmatischen Callback hat?

Hooks sind Repo-Policy, keine pro-Skript-Logik. Lege gemeinsame Regeln in .cursor/hooks.json ab und halte run-spezifische Logik rund um agent.send() oder run.wait() in deinem TypeScript-Code.

Ist das SDK bereit für den Produktionseinsatz?

Setze es zuerst für risikoarme Aufgaben ein. Die SDK-Oberfläche ist noch in der öffentlichen Beta. Pinne @cursor/sdk, kapsle Secrets, verlange Reviews und rechne mit API-Änderungen bis zur allgemeinen Verfügbarkeit.

Themen
Künstliche Intelligenz

Lerne mit DataCamp

Kurs

Softwareentwicklung mit Cursor

1 Std. 30 Min.
4.2K
Erstell mit Cursor produktionsreifen Code. Lerne AI-Prompts, Refactoring, Testen und fortgeschrittene Workflows kennen.
Details anzeigenRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow