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.


Cursor ha annunciato il suo SDK TypeScript a fine aprile 2026 e lo ha rilasciato in beta pubblica. Il pacchetto è pubblicato come
@cursor/sdked è 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: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 agentCLI.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
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:
localoppurecloud.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
AgenteRun. 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 campotype. Nell’attuale beta pubblica, l’SDK emette eventisystem,user,assistant,tool_call,thinking,status,requestetask. Non c’è un evento documentatoconnection:reconnecting; le riconnessioni sono gestite all’interno dell’SDK.Per aggiornamenti a livello più basso,
agent.send()accetta anche callbackonDeltaeonStep.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:
Aggiungi
"type": "module"al tuopackage.jsoncosì che gli import funzionino come ESM. Poi aggiungi untsconfig.jsonche supportiawaita livello top e il dispose asincrono esplicito:Ottieni una chiave API di Cursor
La chiave veniva originariamente generata sotto
cursor.com/dashboard/cloud-agents, ma è stata spostata sucursor.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:Aggiungi
.enval tuo.gitignore. L’SDK legge direttamenteprocess.env; non carica i file.envper te.Struttura del progetto
Struttura cartelle:
package.json,tsconfig.json,.envesrc/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: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 bloccofinallyesplicito perché evita domande sulla versione diawait using.Invia un prompt e trasmetti la risposta
L’invio di un prompt restituisce un oggetto
Runcon il proprio stream e stato. Questo esempio legge lo stream in un ciclofor awaite stampa solo il testo dell’assistente.L’agente emette diversi tipi di evento, tra cui
thinking,tool_callestatus. Questo esempio filtra il testo dell’assistantperché è 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 leggiresult.resultdoporun.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 includonoAuthenticationErrorper una chiave non valida,ConfigurationErrorper un model id non valido,RateLimitError,IntegrationNotConnectedErroreNetworkError.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
.envdi Node etsx.Il flag
--env-file=.envcaricaCURSOR_API_KEYprima 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.enve conferma che la chiave sia stata generata dalla dashboard Integrations.