Accéder au contenu principal

Tutoriel Cursor SDK : exécuter des agents de code avec TypeScript

Utilisez le Cursor SDK pour exécuter un agent local, puis un agent cloud qui corrige un petit bug dans un dépôt GitHub et ouvre une pull request.
· 12 min lire

Explorez l'IA

Cursor a annoncé son SDK TypeScript fin avril 2026 et l'a publié en bêta publique. Le package est publié sous @cursor/sdk et 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 à :

  • Des exécutions d'agents en local et dans le cloud.
  • Les outils de base de code de Cursor, dont l'indexation, la recherche, grep, les serveurs MCP, les skills, les hooks et les sous-agents.
  • Les modèles disponibles via votre compte Cursor, dont Composer 2, GPT-5.5 et Claude.

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 agent CLI.

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.

Diagramme montrant le routage du code Cursor SDK vers un Node local, une VM cloud Cursor ou une VM gérée par l'utilisateur, toutes partageant les mêmes outils d'agent et la couche modèle.

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 : local ou cloud.

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 Agent et Run. 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 champ type. Dans la bêta publique actuelle, le SDK émet system, user, assistant, tool_call, thinking, status, request et task. 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 callbacks onDelta et onStep.

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-file utilisé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.

  • tsx pour exécuter du TypeScript sans compilation.

Installez le SDK et les outils TypeScript :

Installer le SDK

Dans un nouveau dossier :

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

Ajoutez "type": "module" dans votre package.json pour que les imports fonctionnent en ESM. Puis ajoutez un tsconfig.json qui prend en charge await au niveau supérieur et la libération asynchrone explicite :

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

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é vers cursor.com/dashboard/integrations. Si un guide renvoie à "Cloud Agents", regardez plutôt Intégrations.

Page Intégrations du tableau de bord Cursor avec la section User API Keys mise en avant et un bouton Generate visible.

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 :

echo 'CURSOR_API_KEY=crsr_your_key_here' > .env

Ajoutez .env à votre .gitignore. Le SDK lit process.env directement ; il ne charge pas les fichiers .env pour vous.

Structure du projet

Arborescence : package.json, tsconfig.json, .env et src/ 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 :

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() 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 bloc finally explicite pour éviter les questions de version autour de await using.

Envoyer une invite et streamer la réponse

Envoyer une invite renvoie un objet Run avec son propre flux et son statut. Cet exemple lit le flux dans une boucle for await et n'affiche que le texte de l'assistant.

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

L'agent émet plusieurs types d'événements, notamment thinking, tool_call et status. Cet exemple filtre le texte assistant car c'est la réponse visible. event.message.content est 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 lisez result.result après run.wait(). durationMs est 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 incluent AuthenticationError pour une mauvaise clé, ConfigurationError pour un id de modèle invalide, RateLimitError, IntegrationNotConnectedError et 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;
  }
}

Le drapeau isRetryable est 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 .env de Node et tsx.

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

L'option --env-file=.env charge CURSOR_API_KEY avant 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 .env et confirmez que la clé a été générée depuis le tableau de bord Intégrations.

Streaming d'événements depuis un agent local. Vidéo de l'auteur.

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.

Exécution cloud lancée depuis le SDK. Vidéo de l'auteur.

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.

PR GitHub depuis un agent cloud. Vidéo de l'auteur.

À 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-kanban liste les agents cloud, les regroupe par statut ou dépôt et prévisualise les artefacts.

  • coding-agent-cli enveloppe des agents locaux et cloud dans un outil en ligne de commande.

  • app-builder exé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_KEY et tout autre jeton, et souvenez-vous que les valeurs env des 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: true et 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.

Khalid Abdelaty

Auteur

Khalid Abdelaty

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.

Sujets

Contenus associés

blog

Comprendre les TPU et les GPU dans l'IA : Un guide complet