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-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.
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-kanbanlistet Cloud-Agenten, gruppiert sie nach Status oder Repo und zeigt Artefakt-Vorschauen. -
coding-agent-clikapselt lokale und Cloud-Agenten in einem Terminal-Tool. -
app-builderstartet 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_KEYund 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: truenicht 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.

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.
Cursor hat sein TypeScript SDK Ende April 2026 angekündigt und als öffentliche Beta veröffentlicht. Das Paket heißt
@cursor/sdkund 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: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 agentCLI.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.
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:
localodercloud.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
AgentundRun. 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_busyzurü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 eintype-Feld. In der aktuellen öffentlichen Beta emittiert das SDKsystem,user,assistant,tool_call,thinking,status,requestundtaskEvents. Es gibt kein dokumentiertesconnection:reconnecting-Event; Reconnects werden im SDK intern gehandhabt.Für Ereignisse auf niedrigerer Ebene akzeptiert
agent.send()auchonDelta- undonStep-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:
Füge
"type": "module"in deinerpackage.jsonhinzu, damit die Imports als ESM funktionieren. Lege dann einetsconfig.jsonan, die Top-Level-awaitund explizites asynchrones Disposing unterstützt:Cursor-API-Key holen
Der Key wurde ursprünglich unter
cursor.com/dashboard/cloud-agentsgeneriert, ist aber umgezogen nachcursor.com/dashboard/integrations. Wenn ein Guide auf „Cloud Agents“ verweist, schau stattdessen bei Integrations.Erzeuge User API Keys unter Integrations. Bild: Autor.
Erzeuge dort einen User-API-Key und speichere ihn als
CURSOR_API_KEY:Füge
.envzu deiner.gitignorehinzu. Das SDK liestprocess.envdirekt; es lädt.env-Dateien nicht für dich.Projektstruktur
Ordnerlayout:
package.json,tsconfig.json,.envundsrc/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: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 explizitenfinally-Block, um Versionsfragen rund umawait usingzu 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 einerfor await-Schleife und druckt nur den Assistant-Text.Der Agent emittiert mehrere Event-Typen, darunter
thinking,tool_callundstatus. Dieses Beispiel filtert aufassistant-Text, weil das die sichtbare Antwort ist.event.message.contentist typisiert und für Streaming nutzbar, ist aber blockbasiert und kann Tool-Calls enthalten. Wenn du nur finalen Text brauchst, überspringe den Stream und liesresult.resultnachrun.wait().durationMsist öffentlich, aber optional, daher behandelt das Beispiel es optional.Fehler behandeln
Das SDK wirft typisierte Fehler, die
CursorAgentErrorerweitern. Häufige Fälle sindAuthenticationErrorfür einen ungültigen Key,ConfigurationErrorfür eine falsche Modell-ID,RateLimitError,IntegrationNotConnectedErrorundNetworkError.Das Flag
isRetryableist 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 undtsx.Das Flag
--env-file=.envlädtCURSOR_API_KEYvor dem Skriptstart. Das Skript sollte Assistant-Text ausgeben und dann eine einzeilige Status-Fußzeile. Wenn du einen Authentifizierungsfehler siehst, prüfe deine.envund bestätige, dass der Key über das Integrations-Dashboard erzeugt wurde.