Construire un agent cloud de correction de bugs
L'exemple suivant passe d'un dossier local à un dépôt GitHub cloné dans le cloud de Cursor. La tâche reste simple : corriger un test d'auth en échec et ouvrir une pull request.
Quand passer au cloud
Les agents cloud tournent dans des VM gérées par Cursor. Ils clonent le dépôt, préparent un environnement de développement et poursuivent même si votre script local se termine. Une fois terminés, ils peuvent pousser une branche et ouvrir une pull request. Le compromis : un temps de démarrage plus long et une consommation de jetons plus élevée qu'une petite exécution locale.
Les exécutions cloud apparaissent dans Cursor Web et la fenêtre Agents du desktop pendant leur exécution. Les agents cloud issus du SDK sont filtrés de la liste par défaut. Dans Cursor Web, utilisez Filter > Source > SDK. Dans la fenêtre Agents du desktop, utilisez le pied de page de la barre latérale : Show > SDK. Si vous avez l'id d'agent bc-, vous pouvez également l'ouvrir directement sur https://cursor.com/agents/bc-... ou via le deep link desktop. Une règle simple : utilisez le cloud si l'une de ces conditions est vraie :
- La tâche peut durer plus longtemps qu'une session de script local.
- Vous voulez une PR ou une branche en sortie, pas uniquement du texte.
- Vous souhaitez exécuter plusieurs agents en parallèle sur le même dépôt.
- L'agent doit exécuter du code (tests, builds) dans un environnement isolé.
Pour des vérifications locales rapides, utilisez le runtime local.
Configurer l'agent
La config cloud remplace la clé local par une clé cloud. Vous listez le dépôt à cloner, optionnellement une branche de départ, et si Cursor doit ouvrir une PR à la fin du run.
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 est un tableau, mais la v1 cloud ne prend actuellement en charge qu'un seul dépôt par agent. startingRef est la branche ou le commit de départ. autoCreatePR: true demande à Cursor d'ouvrir une pull request à la fin de l'exécution. Les permissions GitHub, l'état de l'intégration, les diffs vides ou les règles du dépôt peuvent toutefois aboutir à une simple branche plutôt qu'à une PR.
Pour que l'agent clone le dépôt, votre compte Cursor doit avoir l'intégration GitHub configurée. Si elle n'est pas connectée, le SDK renvoie une IntegrationNotConnectedError avec un champ helpUrl.
Envoyer la tâche et se reconnecter plus tard
Le schéma ci-dessous envoie une tâche puis attend le résultat via Agent.getRun(). Cela permet à un autre processus de se reconnecter plus tard si le script initial s'arrête.
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});
}
Vous pouvez diffuser l'exécution en direct, mais wait() suffit lorsque vous n'avez besoin que du résultat. Lorsqu'une PR est créée, l'URL est renvoyée via result.git?.branches[0]?.prUrl à ; la v1 cloud ne gère pas encore plusieurs dépôts, donc l'index 0 est la branche à vérifier. S'il n'y a pas d'URL de PR, contrôlez branch?.branch et ouvrez la PR manuellement. Conservez run.id et agent.agentId si vous prévoyez de vous rattacher plus tard.
À ce stade, relisez la pull request comme n'importe quel changement de code.
Local versus cloud en un coup d'œil
Les deux runtimes utilisent le même SDK mais se comportent différemment.
|
Capacité |
Local |
Cloud |
|
Où ça tourne |
Votre processus Node |
Une VM gérée par Cursor |
|
Accès fichiers |
Votre disque |
Dépôt cloné uniquement |
|
Survit aux déconnexions |
Non |
Oui |
|
Ouvre des PR |
Non |
Oui, si les permissions du dépôt le permettent |
|
Retourne des artefacts |
Non |
Oui (URL présignées de 15 minutes) |
|
À utiliser pour |
Itération, CI sur un checkout |
Tâches plus longues, runs parallèles, sortie en PR |
Utilisez les exécutions locales pour des contrôles rapides. Utilisez le cloud quand vous avez besoin d'une branche, d'une PR ou d'un artefact.
Autres exemples
Le correcteur de bug a utilisé le flux principal du SDK : créer un agent, envoyer une tâche, attendre un résultat et revoir la sortie. Le cookbook de Cursor montre les mêmes appels SDK dans des exemples plus ambitieux :
-
agent-kanbanliste les agents cloud, les regroupe par statut ou dépôt et prévisualise les artefacts. -
coding-agent-clienveloppe des agents locaux et cloud dans un outil en ligne de commande. -
app-builderexécute un agent local depuis une interface de chat et prévisualise du code React généré.
Un point d'attention : la gestion des artefacts. Les artefacts ne sont disponibles que sur les exécutions cloud. Les agents locaux conviennent au texte et aux vérifications rapides. Les agents cloud conviennent aux tâches qui produisent des fichiers, des branches ou des PR.
MCP, skills, hooks et sous-agents
Le SDK peut lire la même configuration d'agent de projet que Cursor utilise dans l'IDE. Le correcteur de bug n'en a pas besoin pour l'instant, mais ces éléments comptent dès que l'agent opère dans un vrai dépôt.
Serveurs MCP
Comme indiqué plus tôt, les serveurs MCP connectent les agents à des outils externes. Vous pouvez définir des serveurs en ligne dans Agent.create() ou les définir dans .cursor/mcp.json. Si vous repassez mcpServers dans agent.send(), ce run utilisera les serveurs de send() plutôt que ceux de Agent.create(). Utilisez des serveurs MCP HTTP pour des outils hébergés. Utilisez des serveurs MCP stdio pour des outils qui tournent à côté de l'agent.
Skills
Les skills sont des fichiers Markdown dans .cursor/skills/ qui donnent à l'agent des consignes projet : choix de frameworks de test, conventions d'API, règles de release, etc. Utilisez-les pour des directives qui doivent s'appliquer à chaque exécution du dépôt.
Hooks
Les hooks vivent dans .cursor/hooks.json et s'exécutent à des moments précis de la boucle de l'agent. Exemples courants : formatage après édition de fichiers et blocage de commandes shell destructrices avant exécution. Pour les hooks de sécurité, adoptez un comportement de blocage par défaut (fail closed) afin qu'un hook cassé bloque l'action.
Sous-agents
Les sous-agents sont des agents nommés que l'agent principal peut appeler pour un travail ciblé (revue de code, écriture de tests, etc.). Définissez-les dans .cursor/agents/*.md ou en ligne dans Agent.create({ agents: { ... } }). Les agents cloud chargent les sous-agents du projet depuis le dépôt check-out. Les agents locaux ont besoin de local.settingSources: ["project"] si vous voulez qu'ils lisent la config .cursor/ du projet. Gardez chaque sous-agent focalisé.
Contrôles de sécurité
Avant de laisser des agents toucher un dépôt réel, définissez d'abord les limites. C'est la partie que je ne zapperais pas.
-
Limitez strictement les permissions. Les agents peuvent lire des fichiers, exécuter des commandes et utiliser tout identifiant que vous leur exposez. Donnez un accès limité au dépôt, pas des identifiants généraux de service.
-
Gardez les secrets hors des invites. Les invites peuvent apparaître dans des transcriptions. Utilisez des variables d'environnement pour
CURSOR_API_KEYet tout autre jeton, et souvenez-vous que les valeursenvdes serveurs MCP stdio arrivent jusqu'au runtime où s'exécute le serveur. -
Exigez une relecture humaine. Si un agent cloud peut ouvrir des PR, la protection de branche doit imposer un reviewer humain avant fusion. N'associez pas
autoCreatePR: trueet auto-merge sauf dépôt à faible risque. -
Surveillez les coûts et le choix de modèle. L'usage du SDK consomme le pool de jetons Cursor. Comme indiqué, Composer 2 est une option de modèle pour le code ; appelez
Cursor.models.list()si vous devez voir quels ids de modèle votre compte peut utiliser. -
Logguez l'exécution.
run.conversation()renvoie une vue structurée des tours de l'agent. Stockez-la pour les runs susceptibles d'être debuggués ou audités plus tard.
Conclusion
Cet article a couvert npm install @cursor/sdk, un démarrage rapide local, un agent cloud qui ouvre une pull request, et les principaux points d'extension pour le comportement d'agent sur dépôt.
Utilisez le SDK quand le code doit démarrer et piloter l'agent. Si la tâche est simplement une conversation dans l'éditeur, l'application Cursor suffit généralement.
Pour comparaison, nos guides sur le Claude Agent SDK et l'OpenAI Agents SDK couvrent les API d'agents dans d'autres écosystèmes.

Je suis ingénieur de données et créateur de communautés. Je travaille sur les pipelines de données, le cloud et les outils d'IA, tout en rédigeant des tutoriels pratiques et percutants pour DataCamp et les développeurs émergents.
FAQ
Le Cursor SDK fonctionne-t-il avec Python ou un autre langage ?
Officiellement non. Le SDK est uniquement en TypeScript à ce stade de la bêta publique ; les utilisateurs Python doivent appeler directement l'API REST Cloud Agents.
Puis-je utiliser le SDK avec l'offre gratuite Hobby ?
Oui pour les agents locaux, dans les limites de taux et de quotas de l'offre gratuite. Non pour les agents cloud ; ils exigent Pro ou au-dessus.
Comment annuler une exécution qui dure trop longtemps ?
Appelez run.cancel(). Le statut passe à cancelled, le flux en direct s'interrompt et run.wait() se résout avec le résultat annulé.
Où placer des hooks si le SDK n'a pas de callback programmatique ?
Les hooks sont des politiques de dépôt, pas une logique par script. Placez les règles partagées dans .cursor/hooks.json, et gardez la logique spécifique au run autour de agent.send() ou run.wait() dans votre code TypeScript.
Le SDK est-il prêt pour la production ?
Utilisez-le d'abord pour des tâches à faible risque. La surface du SDK est encore en bêta publique. Figez la version de @cursor/sdk, limitez la portée des secrets, exigez une relecture et anticipez des changements d'API avant la disponibilité générale.

Cursor a annoncé son SDK TypeScript fin avril 2026 et l'a publié en bêta publique. Le package est publié sous
@cursor/sdket s'exécute depuis des environnements Node : scripts, jobs CI et services backend.La principale différence avec l'usage de Cursor dans l'éditeur tient au point de départ de la tâche. Au lieu d'ouvrir un chat et de saisir vous-même une invite, votre code crée l'agent, envoie la tâche, streame les événements, attend le résultat et gère les erreurs.
Dans ce tutoriel, nous configurons le SDK, exécutons un démarrage rapide en local, puis construisons le projet principal : un agent cloud qui corrige un bug dans un dépôt GitHub et ouvre une pull request. Je garde le bug volontairement mineur pour que le flux du SDK reste lisible. Ensuite, nous couvrons les points d'extension et les contrôles de sécurité nécessaires avant d'adapter le schéma. Le projet cloud utilise un référentiel compagnon avec le script de lancement et le projet cible.
Le SDK est en bêta publique : consultez la documentation officielle avant de réutiliser ce code dans un projet de long terme.
Qu'est-ce que le Cursor SDK ?
Le Cursor SDK est un package TypeScript,
@cursor/sdk, qui vous permet de créer et d'exécuter des agents Cursor depuis du code. Il donne accès à :Le SDK utilise le même système d'agents que l'IDE Cursor, le CLI et l'application web. La différence : vous l'appelez depuis TypeScript.
Quand utiliser le SDK
Le SDK convient aux tâches qui doivent démarrer depuis du code plutôt que depuis une saisie humaine dans l'éditeur. Je l'utiliserais pour un job CI qui demande à un agent d'inspecter un test en échec, un webhook qui crée une branche pour un correctif, ou un outil interne qui exécute une tâche d'agent fixe depuis un formulaire.
SDK versus l'app Cursor
Le SDK est une autre façon d'utiliser les agents Cursor, aux côtés de l'IDE Cursor et du
cursor agentCLI.Utilisez l'IDE pour discuter dans l'éditeur. Utilisez le CLI pour des invites au terminal. Utilisez le SDK lorsque du code TypeScript doit créer l'agent, envoyer la tâche et gérer le résultat. Comme indiqué plus haut, le CLI ne prend pas en charge des clés de fournisseurs externes ; le SDK s'authentifie également uniquement via une clé API Cursor.
Comment s'articule le Cursor SDK
Avant d'écrire du code, il est utile de connaître les quelques objets et choix d'exécution que le SDK expose.
Architecture du Cursor SDK sur trois environnements d'exécution. Image de l'auteur.
Trois environnements d'exécution
Le SDK prend en charge trois lieux d'exécution pour un agent.
Runtime
Ce qu'il fait
Quand l'utiliser
Local
Exécute l'agent dans votre processus Node, avec lecture des fichiers depuis le disque
Scripts de dév, checks CI sur un working tree, itération rapide
Cursor cloud
Tourne dans une VM isolée avec votre dépôt cloné, gérée par Cursor
Agents en parallèle, tâches plus longues, exécutions qui continuent après déconnexion
Cloud auto-hébergé
Même principe que le cloud, mais avec vos VMs et votre réseau
Équipes qui doivent garder code, secrets et artefacts de build dans leur environnement
Dans cet article, nous utilisons local et Cursor cloud. Le cloud auto-hébergé, listé ci-dessus, vise surtout les offres Enterprise. Le code SDK varie selon la clé de config passée :
localoucloud.Runtime, outils et modèles
Une exécution dans le SDK a trois composantes. Le runtime est le lieu d'exécution. Les outils d'agent incluent indexation, recherche, appels d'outils MCP, skills, hooks et sous-agents. Le modèle se sélectionne avec
model: { id: "composer-2" }ou un autre id disponible pour votre compte.Vous définissez ces éléments dans la config de l'agent.
Agent et Run
Les deux principaux objets du SDK sont
AgentetRun. Un agent conserve l'état de la conversation, la config de l'espace de travail et les paramètres du modèle. Un run est une invite envoyée à cet agent, avec son propre stream, statut, résultat et handle d'annulation.Cette séparation est importante car les agents cloud imposent un run actif par agent. Si vous tentez d'envoyer une seconde invite pendant la première, l'API renvoie
409 agent_busy. Pour exécuter en parallèle, créez des agents distincts, pas des runs distincts sur le même agent.Streaming des événements
Chaque run expose un flux d'événements via
run.stream(), qui est un itérateur asynchrone. Chaque événement a un champtype. Dans la bêta publique actuelle, le SDK émetsystem,user,assistant,tool_call,thinking,status,requestettask. Il n'y a pas d'événement documentéconnection:reconnecting; les reconnexions sont gérées en interne par le SDK.Pour des mises à jour de plus bas niveau,
agent.send()accepte aussi des callbacksonDeltaetonStep.Configuration du Cursor SDK
La mise en place se limite à Node, TypeScript et une clé API Cursor.
Prérequis
Vous avez besoin :
De Node.js 22 ou plus récent. Le package prend officiellement en charge Node 18 ou plus, mais Node 22 correspond aux exemples du cookbook officiel et prend en charge l'option
--env-fileutilisée ci-dessous pour charger.env.D'un compte Cursor Pro (20 $/mois) ou plus pour les agents cloud.
De notions de base en TypeScript.
tsxpour exécuter du TypeScript sans compilation.Installez le SDK et les outils TypeScript :
Installer le SDK
Dans un nouveau dossier :
Ajoutez
"type": "module"dans votrepackage.jsonpour que les imports fonctionnent en ESM. Puis ajoutez untsconfig.jsonqui prend en chargeawaitau niveau supérieur et la libération asynchrone explicite :Obtenir une clé API Cursor
La clé était initialement générée sous
cursor.com/dashboard/cloud-agents, mais elle a déménagé verscursor.com/dashboard/integrations. Si un guide renvoie à "Cloud Agents", regardez plutôt Intégrations.Générez des User API Keys depuis Intégrations. Image de l'auteur.
Générez une User API Key à partir de là et stockez-la sous
CURSOR_API_KEY:Ajoutez
.envà votre.gitignore. Le SDK litprocess.envdirectement ; il ne charge pas les fichiers.envpour vous.Structure du projet
Arborescence :
package.json,tsconfig.json,.envetsrc/pour vos scripts. Ajoutez un dossier.cursor/pour les hooks, skills et sous-agents quand vous en avez besoin.Votre premier agent Cursor local
Le premier exemple est volontairement minimal. Il crée un agent local, envoie une invite, streame la réponse, puis libère l'agent.
Créer un agent local
Créez
src/01-quickstart.ts:Agent.create()renvoie un handle avant que l'agent ne fasse quoi que ce soit.local: { cwd: process.cwd() }pointe l'agent vers le répertoire de travail courant. Le SDK prend en charge la libération asynchrone ; dans un tutoriel, je préfère un blocfinallyexplicite pour éviter les questions de version autour deawait using.Envoyer une invite et streamer la réponse
Envoyer une invite renvoie un objet
Runavec son propre flux et son statut. Cet exemple lit le flux dans une bouclefor awaitet n'affiche que le texte de l'assistant.L'agent émet plusieurs types d'événements, notamment
thinking,tool_calletstatus. Cet exemple filtre le texteassistantcar c'est la réponse visible.event.message.contentest typé et exploitable pour le streaming, mais il est basé sur des blocs et peut inclure des appels d'outils. Si vous n'avez besoin que du texte final, ignorez le flux et lisezresult.resultaprèsrun.wait().durationMsest public mais optionnel, donc l'exemple le gère comme tel.Gérer les erreurs
Le SDK lève des erreurs typées qui étendent
CursorAgentError. Les cas courants incluentAuthenticationErrorpour une mauvaise clé,ConfigurationErrorpour un id de modèle invalide,RateLimitError,IntegrationNotConnectedErroretNetworkError.Le drapeau
isRetryableest celui que votre logique de retry doit vérifier. Les erreurs réseau et de rate limit sont réessayables ; une mauvaise configuration ou une authentification invalide ne le sont pas.Lancer l'exécution
Enregistrez le fichier et exécutez-le avec le chargeur
.envde Node ettsx.L'option
--env-file=.envchargeCURSOR_API_KEYavant le démarrage du script. Le script doit afficher le texte de l'assistant, puis un pied de page de statut sur une ligne. Si vous voyez une erreur d'authentification, vérifiez votre.envet confirmez que la clé a été générée depuis le tableau de bord Intégrations.