Vai al contenuto principale

Tutorial sul Cursor SDK: esegui agenti di coding con TypeScript

Usa il Cursor SDK per eseguire un agente locale, poi un agente cloud che corregge un piccolo bug in un repo GitHub e apre una pull request.
Aggiornato 29 set 2026  · 12 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

Cursor ha annunciato il suo SDK TypeScript a fine aprile 2026 e lo ha rilasciato in beta pubblica. Il pacchetto è pubblicato come @cursor/sdk ed è eseguibile da ambienti Node come script, job di CI e servizi backend.

La principale differenza rispetto all’uso di Cursor nell’editor è il punto di avvio dell’attività. Invece di aprire una chat e digitare tu stesso un prompt, il tuo codice crea l’agente, invia il task, trasmette gli eventi in streaming, attende il risultato e gestisce gli errori.

In questo tutorial configuriamo l’SDK, eseguiamo un quickstart locale, poi costruiamo il progetto principale: un agente cloud che corregge un bug in un repo GitHub e apre una pull request. Tengo il bug piccolo di proposito per mantenere visibile il flusso dell’SDK. Dopo, vediamo i punti di estensione e i controlli di sicurezza necessari prima di adattare il pattern. Il progetto cloud usa un repo di accompagnamento con lo script di lancio e il progetto target.

L’SDK è in beta pubblica, quindi controlla la documentazione ufficiale prima di riutilizzare questo codice in un progetto a lungo termine.

Cos’è il Cursor SDK?

Il Cursor SDK è un pacchetto TypeScript, @cursor/sdk, che ti permette di creare ed eseguire agenti Cursor da codice. Ti dà accesso a:

  • Esecuzioni di agenti locali e nel cloud.
  • Gli strumenti per codebase di Cursor, inclusi indicizzazione, ricerca, grep, server MCP, skill, hook e subagent.
  • I modelli disponibili tramite il tuo account Cursor, tra cui Composer 2, GPT-5.5 e Claude.

L’SDK usa lo stesso sistema di agenti dell’IDE Cursor, della CLI e dell’app web. La differenza è che lo chiami da TypeScript.

Quando usare l’SDK

L’SDK si adatta ai task che dovrebbero partire dal codice invece che da una persona che digita nell’editor. Lo userei per un job di CI che chiede a un agente di ispezionare un test fallito, un webhook che crea un branch per una correzione bug o uno strumento interno che esegue un task fisso dell’agente da un form.

SDK vs app Cursor

L’SDK è un altro modo di usare gli agenti Cursor, insieme all’IDE Cursor e alla cursor agent CLI.

Usa l’IDE per la chat in editor. Usa la CLI per i prompt da terminale. Usa l’SDK quando del codice TypeScript deve creare l’agente, inviare il task e gestire il risultato. Come detto sopra, la CLI non supporta chiavi di provider esterni; anche l’SDK si autentica solo tramite una chiave API di Cursor.

Come si incastra il Cursor SDK

Prima di scrivere codice, è utile conoscere i pochi oggetti e le scelte di runtime esposte dall’SDK.

Diagramma che mostra il routing del codice del Cursor SDK verso Node locale, VM cloud di Cursor o VM gestita dall’utente, tutti condivisiono gli stessi strumenti dell’agente e il livello modello.

Architettura del Cursor SDK su tre runtime. Immagine dell’autore.

Tre runtime

L’SDK supporta tre luoghi in cui un agente può essere eseguito.

Runtime 

Cosa fa

Quando usarlo

Locale 

Esegue l’agente inline nel tuo processo Node, con file letti dal disco

Script di sviluppo, controlli CI su una working tree, iterazione veloce

Cloud Cursor

Esegue in una VM isolata con il tuo repo clonato, gestita da Cursor

Agenti in parallelo, task più lunghi, esecuzioni che continuano dopo disconnessioni

Cloud self-hosted

Stessa struttura del cloud ma con le tue VM e rete

Team che necessitano che codice, secret e output di build restino nel loro ambiente

In questo articolo usiamo locale e Cloud Cursor. Il cloud self-hosted, elencato sopra, è principalmente per i piani Enterprise. Il codice dell’SDK cambia tramite la chiave di config che passi: local oppure cloud.

Runtime, strumenti e modelli

Un’esecuzione nell’SDK ha tre parti. Il runtime è dove viene eseguita. Gli strumenti dell’agente includono indicizzazione, ricerca, chiamate a tool MCP, skill, hook e subagent. Il modello si seleziona con model: { id: "composer-2" } o un altro id che il tuo account può usare.

Imposti questi elementi nella config dell’agente.

Agent e Run

I due oggetti principali dell’SDK sono Agent e Run. Un agente contiene lo stato della conversazione, la config dell’area di lavoro e le impostazioni del modello. Un run è un singolo prompt inviato a quell’agente, con il proprio stream, stato, risultato e handle di annullamento.

La distinzione è importante perché gli agenti cloud impongono un run attivo per agente. Se provi a inviare un secondo prompt mentre il primo è ancora in corso, l’API restituisce 409 agent_busy. Per eseguire in parallelo, crei agenti separati, non run separati sullo stesso agente.

Streaming di eventi

Ogni run espone uno stream di eventi tramite run.stream(), che è un async iterator. Ogni evento ha un campo type. Nell’attuale beta pubblica, l’SDK emette eventi system, user, assistant, tool_call, thinking, status, request e task. Non c’è un evento documentato connection:reconnecting; le riconnessioni sono gestite all’interno dell’SDK.

Per aggiornamenti a livello più basso, agent.send() accetta anche callback onDelta e onStep.

Configurare il Cursor SDK

La configurazione richiede solo Node, TypeScript e una chiave API di Cursor.

Prerequisiti

Ti servono:

  • Node.js 22 o superiore. Il pacchetto supporta ufficialmente Node 18 o superiore, ma Node 22 corrisponde agli esempi del cookbook ufficiale e supporta il flag --env-file usato sotto per caricare .env.

  • Un account Cursor Pro (20 $/mese) o superiore per gli agenti cloud.

  • Familiarità di base con TypeScript.

  • tsx per eseguire TypeScript senza compilare.

Installa l’SDK e gli strumenti TypeScript:

Installa l’SDK

In una cartella nuova:

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

Aggiungi "type": "module" al tuo package.json così che gli import funzionino come ESM. Poi aggiungi un tsconfig.json che supporti await a livello top e il dispose asincrono esplicito:

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

Ottieni una chiave API di Cursor

La chiave veniva originariamente generata sotto cursor.com/dashboard/cloud-agents, ma è stata spostata su cursor.com/dashboard/integrations. Se una guida punta a "Cloud Agents", controlla invece Integrations.

Pagina Integrations della dashboard di Cursor con la sezione User API Keys evidenziata e un pulsante Generate visibile.

Genera User API Keys da Integrations. Immagine dell’autore.

Genera da lì una User API Key e salvala come CURSOR_API_KEY:

echo 'CURSOR_API_KEY=crsr_your_key_here' > .env

Aggiungi .env al tuo .gitignore. L’SDK legge direttamente process.env; non carica i file .env per te.

Struttura del progetto

Struttura cartelle: package.json, tsconfig.json, .env e src/ per i tuoi script. Aggiungi una cartella .cursor/ per hook, skill e subagent quando ti servono.

Il tuo primo agente Cursor locale

Il primo esempio è volutamente piccolo. Crea un agente locale, invia un prompt, trasmette in streaming la risposta ed effettua il dispose dell’agente.

Crea un agente locale

Crea 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() restituisce un handle prima che l’agente abbia fatto qualsiasi lavoro. local: { cwd: process.cwd() } punta l’agente alla directory di lavoro corrente. L’SDK supporta il dispose asincrono; nel codice del tutorial, preferisco un blocco finally esplicito perché evita domande sulla versione di await using.

Invia un prompt e trasmetti la risposta

L’invio di un prompt restituisce un oggetto Run con il proprio stream e stato. Questo esempio legge lo stream in un ciclo for await e stampa solo il testo dell’assistente.

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’agente emette diversi tipi di evento, tra cui thinking, tool_call e status. Questo esempio filtra il testo dell’assistant perché è la risposta visibile. event.message.content è tipizzato e utilizzabile per lo streaming, ma è basato su blocchi e può includere chiamate a tool. Se ti serve solo il testo finale, salta lo stream e leggi result.result dopo run.wait(). durationMs è pubblico ma facoltativo, quindi l’esempio lo gestisce come opzionale.

Gestisci gli errori

L’SDK genera errori tipizzati che estendono CursorAgentError. I casi comuni includono AuthenticationError per una chiave non valida, ConfigurationError per un model id non valido, RateLimitError, IntegrationNotConnectedError e 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;
  }
}

Il flag isRetryable è ciò che la tua logica di retry dovrebbe controllare. Gli errori di rete e i rate limit sono ripetibili; configurazione errata e autenticazione no.

Eseguilo

Salva il file ed eseguilo con il loader di .env di Node e tsx.

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

Il flag --env-file=.env carica CURSOR_API_KEY prima che lo script inizi. Lo script dovrebbe stampare il testo dell’assistente, poi un footer di stato su una riga. Se vedi un errore di autenticazione, controlla il tuo .env e conferma che la chiave sia stata generata dalla dashboard Integrations.

Eventi in streaming da un agente locale. Video dell’autore.

Creare un agente cloud per correggere bug

Il prossimo esempio passa da una cartella locale a un repo GitHub clonato nel cloud di Cursor. Il task è ancora piccolo: correggere un test di autenticazione fallito e aprire una pull request.

Quando scegliere il cloud

Gli agenti cloud vengono eseguiti in VM gestite da Cursor. Clonano il repo, configurano un ambiente di sviluppo e continuano se il tuo script locale termina. Quando finiscono, possono pushare un branch e aprire una pull request. Il compromesso è il tempo di avvio e un uso di token più alto rispetto a una piccola esecuzione locale.

Esecuzione cloud avviata dall’SDK. Video dell’autore.

Le esecuzioni cloud compaiono in Cursor Web e nella finestra Agents desktop mentre lavorano. Gli agenti cloud dell’SDK sono filtrati dall’elenco predefinito. In Cursor Web, usa Filter > Source > SDK. Nella finestra Agents desktop, usa il footer della sidebar: Show > SDK. Se hai l’id agente bc-, puoi anche aprirlo direttamente su https://cursor.com/agents/bc-... o tramite deep link desktop. Una regola semplice è usare il cloud quando è vera una di queste condizioni:

  • Il task può durare più di una sessione di script locale.
  • Vuoi come output una PR o un branch, non solo testo.
  • Vuoi eseguire più agenti in parallelo sullo stesso repo.
  • L’agente deve eseguire codice (test, build) in un ambiente isolato.

Per brevi controlli locali, usa il runtime locale.

Configura l’agente

La config cloud sostituisce la chiave local con una chiave cloud. Elenchi il repo da clonare, opzionalmente fissi un branch di partenza, e imposti se Cursor debba aprire una PR al termine dell’esecuzione.

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 è un array, ma il cloud v1 attualmente supporta un singolo repo per agente. startingRef è il branch o il commit da cui l’agente parte. autoCreatePR: true chiede a Cursor di aprire una pull request quando il run termina. Permessi GitHub, stato dell’integrazione, diff vuoti o regole del repo possono comunque lasciarti con un branch invece che con una PR.

Per clonare il repo, il tuo account Cursor deve avere configurata l’integrazione con GitHub. Se non è connessa, l’SDK restituisce un IntegrationNotConnectedError con un campo helpUrl.

Invia il task e riconnetti più tardi

Il pattern seguente invia un task e poi attende il risultato tramite Agent.getRun(). Questo consente a un altro processo di riconnettersi in seguito se lo script originale termina.

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

Puoi trasmettere in streaming il run per output live, ma wait() basta quando ti serve solo il risultato. Quando viene creata una PR, l’URL è restituito in result.git?.branches[0]?.prUrl; il cloud v1 non supporta ancora più repo, quindi l’indice 0 è il branch da controllare. Se non c’è un URL PR, controlla branch?.branch e apri la PR manualmente. Conserva run.id e agent.agentId se prevedi di riattaccarti più tardi.

PR GitHub da agente cloud. Video dell’autore.

A questo punto, rivedi la pull request come qualsiasi altra modifica al codice.

Locale vs cloud in breve

I due runtime usano lo stesso SDK ma si comportano in modo diverso.

Funzionalità

Locale

Cloud

Dove gira

Il tuo processo Node

Una VM gestita da Cursor

Accesso ai file

Il tuo disco

Solo il repo clonato

Sopravvive alle disconnessioni

No

Sì

Apre PR

No

Sì, quando i permessi del repo lo consentono

Restituisce artifact

No

Sì (URL presigned da 15 minuti)

Usalo per

Iterazione, CI su un checkout

Task più lunghi, run in parallelo, output PR

Usa le esecuzioni locali per controlli rapidi. Usa le esecuzioni cloud quando ti serve un branch, una PR o un artifact.

Altri esempi

Il correttore di bug ha usato il flusso principale dell’SDK: creare un agente, inviare un task, attendere un risultato e rivedere l’output. Il cookbook di Cursor mostra le stesse chiamate SDK in esempi più grandi:

  • agent-kanban elenca gli agenti cloud, li raggruppa per stato o repo e mostra in anteprima gli artifact.

  • coding-agent-cli incapsula agenti locali e cloud in uno strumento da terminale.

  • app-builder esegue un agente locale da un’interfaccia chat e mostra in anteprima codice React generato.

Un dettaglio da tenere a mente è la gestione degli artifact. Gli artifact sono disponibili solo sulle esecuzioni cloud. Gli agenti locali sono adatti a output testuale e controlli veloci. Gli agenti cloud si adattano a task che necessitano di file, branch o PR come output.

MCP, skill, hook e subagent

L’SDK può leggere la stessa config dell’agente di progetto che Cursor usa nell’IDE. Il correttore di bug non ha bisogno di tutto, ma questi elementi contano quando l’agente lavora in un repo reale.

Server MCP

Come detto, i server MCP connettono gli agenti a strumenti esterni. Puoi passare i server inline in Agent.create() o definirli in .cursor/mcp.json. Se passi mcpServers di nuovo in agent.send(), quel run usa i server di send() anziché quelli di Agent.create(). Usa server MCP HTTP per strumenti ospitati. Usa server MCP stdio per strumenti che girano accanto all’agente.

Skill

Le skill sono file markdown in .cursor/skills/ che forniscono all’agente istruzioni di progetto, come scelte di framework di test, convenzioni API o regole di rilascio. Usale per indicazioni che dovrebbero valere per ogni run nel repo.

Hook

Gli hook vivono in .cursor/hooks.json e vengono eseguiti in punti specifici del loop dell’agente. Usi comuni includono il formatting dopo modifiche ai file e il blocco di comandi shell distruttivi prima dell’esecuzione. Per gli hook di sicurezza, usa un comportamento di fail closed in modo che un hook rotto blocchi l’azione.

Subagent

I subagent sono agenti nominati che l’agente principale può chiamare per lavori mirati, come code review o scrittura di test. Definiscili in .cursor/agents/*.md o inline in Agent.create({ agents: { ... } }). Gli agenti cloud caricano i subagent di progetto dal repo check-out. Gli agenti locali necessitano local.settingSources: ["project"] se vuoi che leggano la config .cursor/ del progetto. Mantieni ciascun subagent ristretto.

Controlli di sicurezza

Prima che gli agenti tocchino un repo reale, definisci prima i confini. Questa è la parte che non salterei.

  • Limita strettamente i permessi. Gli agenti possono leggere file, eseguire comandi e usare qualsiasi credenziale tu esponi. Dai agli agenti accesso con scope sul repo, non credenziali di servizio ampie.

  • Tieni i secret fuori dai prompt. I prompt possono finire in trascrizioni. Usa variabili d’ambiente per CURSOR_API_KEY e qualsiasi altro token, e ricorda che i valori env dei server MCP stdio raggiungono il runtime in cui il server viene eseguito.

  • Richiedi revisione umana. Se un agente cloud può aprire PR, la protezione del branch dovrebbe richiedere un revisore umano prima del merge. Non combinare autoCreatePR: true con l’unione automatica a meno che il repo sia a basso rischio.

  • Tieni d’occhio i costi e la scelta del modello. L’uso dell’SDK attinge dal pool di utilizzo a token di Cursor. Come detto, Composer 2 è una delle opzioni di modello per task di coding; chiama Cursor.models.list() se ti serve vedere quali id modello il tuo account può usare.

  • Logga il run. run.conversation() restituisce una vista strutturata dei turni dell’agente. Conservala per run che potresti dover eseguire il debug o auditare in seguito.

Conclusione

Questo articolo ha trattato npm install @cursor/sdk, un quickstart locale, un agente cloud che apre una pull request e i principali punti di estensione per il comportamento degli agenti su repo.

Usa l’SDK quando il codice deve avviare e gestire l’agente. Se il task è solo una conversazione da editor, di solito basta l’app Cursor.

Per confronto, le nostre guide su Claude Agent SDK e OpenAI Agents SDK coprono le API per agenti in altri ecosistemi.


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

Sono un data engineer e community builder: lavoro su pipeline dati, cloud e strumenti di AI, e scrivo tutorial pratici e ad alto impatto per DataCamp e per sviluppatori alle prime armi.

FAQ

Il Cursor SDK funziona con Python o con un’altra lingua?

Non ufficialmente. L’SDK è solo TypeScript nella beta pubblica; chi usa Python dovrebbe chiamare direttamente la REST API dei Cloud Agents.

Posso usare l’SDK con il piano gratuito Hobby?

Sì per gli agenti locali, entro i rate limit e i cap di utilizzo del piano free. No per gli agenti cloud; richiedono Pro o superiore.

Come annullo un’esecuzione che sta durando troppo?

Chiama run.cancel(). Lo stato passa a cancelled, lo stream live si interrompe e run.wait() si risolve con il risultato cancellato.

Dove si collocano gli hook se l’SDK non ha una callback programmatica?

Gli hook sono policy del repo, non logica per script. Metti le regole condivise in .cursor/hooks.json e mantieni la logica specifica del run attorno a agent.send() o run.wait() nel tuo codice TypeScript.

L’SDK è pronto per l’uso in produzione?

Usalo prima per task a basso rischio. La superficie dell’SDK è ancora in beta pubblica. Fissa la versione di @cursor/sdk, limita lo scope dei secret, richiedi revisione e aspettati cambiamenti API prima della GA.

Argomenti
Intelligenza artificiale

Impara con DataCamp

{count, plural, one {Corso} other {Corsi}}

Sviluppo software con Cursor

{hours} ore {minutes} min
4.3K
Crea codice pronto per la produzione con Cursor. Scopri i prompt AI, il refactoring, i test e i flussi di lavoro avanzati.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

{count, plural, one {blog} other {blogs}}

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

{count, plural, one {blog} other {blogs}}

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

{count, plural, one {blog} other {blogs}}

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

Mostra AltroMostra Altro