{count, plural, one {Corso} other {Corsi}}
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.

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 |
|
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-fileusato sotto per caricare.env. -
Un account Cursor Pro (20 $/mese) o superiore per gli agenti cloud.
-
Familiarità di base con TypeScript.
-
tsxper 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.

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.
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.
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.
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-kanbanelenca gli agenti cloud, li raggruppa per stato o repo e mostra in anteprima gli artifact. -
coding-agent-cliincapsula agenti locali e cloud in uno strumento da terminale. -
app-builderesegue 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_KEYe qualsiasi altro token, e ricorda che i valorienvdei 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: truecon 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.
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.


