Kursus
Cursor mengumumkan TypeScript SDK pada akhir April 2026 dan merilisnya sebagai public beta. Paket ini dipublikasikan sebagai @cursor/sdk dan berjalan di lingkungan Node seperti skrip, job CI, dan layanan backend.
Perbedaan utama dari penggunaan Cursor di editor adalah titik awal tugas. Alih-alih membuka chat dan mengetik prompt sendiri, kode Anda membuat agen, mengirim tugas, melakukan streaming event, menunggu hasil, dan menangani error.
Dalam tutorial ini, kita menyiapkan SDK, menjalankan quickstart lokal, lalu membangun proyek utama: agen cloud yang memperbaiki bug di repo GitHub dan membuka pull request. Saya sengaja membuat bugnya kecil agar alur SDK tetap terlihat jelas. Setelah itu, kita membahas titik ekstensi dan pemeriksaan keamanan yang diperlukan sebelum mengadaptasi polanya. Proyek cloud menggunakan repo pendamping dengan skrip peluncur dan proyek target.
SDK ini berstatus public beta, jadi periksa dokumentasi resmi sebelum menggunakan ulang kode ini dalam proyek jangka panjang.
Apa itu Cursor SDK?
Cursor SDK adalah paket TypeScript, @cursor/sdk, yang memungkinkan Anda membuat dan menjalankan agen Cursor dari kode. Ini memberi Anda akses ke:
- Jalankan agen secara lokal dan di cloud.
- Alat codebase Cursor, termasuk pengindeksan, pencarian, grep, server MCP, skills, hook, dan subagent.
- Model yang tersedia melalui akun Cursor Anda, termasuk Composer 2, GPT-5.5, dan Claude.
SDK menggunakan sistem agen yang sama seperti Cursor IDE, CLI, dan web app. Bedanya, Anda memanggilnya dari TypeScript.
Kapan menggunakan SDK
SDK cocok untuk tugas yang seharusnya dimulai dari kode alih-alih dari seseorang yang mengetik di editor. Saya akan memilihnya untuk job CI yang meminta agen memeriksa tes yang gagal, webhook yang membuat branch untuk perbaikan bug, atau alat internal yang menjalankan tugas agen tetap dari sebuah formulir.
SDK versus aplikasi Cursor
SDK adalah cara lain untuk menggunakan agen Cursor, di samping Cursor IDE dan cursor agent CLI.
Gunakan IDE untuk chat di editor. Gunakan CLI untuk prompt di terminal. Gunakan SDK ketika kode TypeScript perlu membuat agen, mengirim tugas, dan menangani hasil. Seperti disebutkan di atas, CLI tidak mendukung kunci penyedia eksternal; SDK juga hanya melakukan autentikasi melalui kunci API Cursor.
Cara Kerja Keseluruhan Cursor SDK
Sebelum menulis kode, ada baiknya memahami beberapa objek dan pilihan runtime yang diekspos SDK.

Arsitektur Cursor SDK pada tiga runtime. Gambar oleh Penulis.
Tiga runtime
SDK mendukung tiga tempat eksekusi agen.
|
Runtime |
Fungsinya |
Kapan digunakan |
|
Lokal |
Menjalankan agen inline dalam proses Node Anda, dengan file dibaca dari disk |
Skrip dev, pemeriksaan CI terhadap working tree, iterasi cepat |
|
Cloud Cursor |
Berjalan di VM terisolasi dengan repo Anda yang dikloning, dikelola oleh Cursor |
Agen paralel, tugas lebih lama, run yang berlanjut setelah terputus |
|
Bentuknya sama seperti cloud tetapi dengan VM dan jaringan Anda |
Tim yang perlu kode, secret, dan output build tetap berada di dalam lingkungan mereka |
Dalam artikel ini, kita menggunakan lokal dan Cloud Cursor. Cloud self-hosted, seperti tercantum di atas, terutama untuk paket Enterprise. Kode SDK berubah melalui kunci konfigurasi yang Anda berikan: local atau cloud.
Runtime, alat, dan model
Satu run di dalam SDK memiliki tiga bagian. Runtime adalah tempat eksekusinya. Alat agen mencakup pengindeksan, pencarian, pemanggilan alat MCP, skills, hook, dan subagent. Model dipilih dengan model: { id: "composer-2" } atau id lain yang dapat digunakan akun Anda.
Anda menetapkan bagian-bagian ini di konfigurasi agen.
Agent dan Run
Dua objek utama dalam SDK adalah Agent dan Run. Agen menyimpan status percakapan, konfigurasi workspace, dan pengaturan model. Run adalah satu prompt yang dikirim ke agen tersebut, dengan stream, status, hasil, dan handle pembatalannya sendiri.
Pemisahan ini penting karena agen cloud memberlakukan satu run aktif per agen. Jika Anda mencoba mengirim prompt kedua saat yang pertama masih berjalan, API mengembalikan 409 agent_busy. Untuk menjalankan secara paralel, buat agen terpisah, bukan run terpisah pada agen yang sama.
Streaming event
Setiap run mengekspos stream event melalui run.stream(), yang merupakan async iterator. Setiap event memiliki field type. Dalam public beta saat ini, SDK memancarkan event system, user, assistant, tool_call, thinking, status, request, dan task. Tidak ada event terdokumentasi connection:reconnecting; reconnect ditangani di dalam SDK.
Untuk pembaruan level lebih rendah, agent.send() juga menerima callback onDelta dan onStep.
Menyiapkan Cursor SDK
Persiapannya hanya Node, TypeScript, dan kunci API Cursor.
Prasyarat
Anda memerlukan:
-
Node.js 22 atau lebih baru. Paket ini secara formal mendukung Node 18 atau lebih baru, tetapi Node 22 sesuai dengan contoh cookbook resmi dan mendukung flag
--env-fileyang digunakan di bawah untuk memuat.env. -
Akun Cursor pada Pro ($20/bulan) atau di atasnya untuk agen cloud.
-
Pemahaman dasar TypeScript.
-
tsxuntuk menjalankan TypeScript tanpa kompilasi.
Instal SDK dan alat TypeScript:
Instal SDK
Di folder baru:
npm init -y
npm install @cursor/sdk
npm install --save-dev typescript tsx @types/node
Tambahkan "type": "module" ke package.json agar import bekerja sebagai ESM. Lalu tambahkan tsconfig.json yang mendukung top level await dan disposal async eksplisit:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2022", "ESNext.Disposable"],
"strict": true,
"esModuleInterop": true
}
}
Dapatkan kunci API Cursor
Kunci awalnya dihasilkan di cursor.com/dashboard/cloud-agents, namun kini telah dipindahkan ke cursor.com/dashboard/integrations. Jika ada panduan yang menunjuk ke "Cloud Agents", periksa Integrations sebagai gantinya.

Hasilkan User API Keys dari Integrations. Gambar oleh Penulis.
Hasilkan User API Key dari sana dan simpan sebagai CURSOR_API_KEY:
echo 'CURSOR_API_KEY=crsr_your_key_here' > .env
Tambahkan .env ke .gitignore Anda. SDK membaca process.env secara langsung; SDK tidak memuat file .env untuk Anda.
Struktur proyek
Tata letak folder: package.json, tsconfig.json, .env, dan src/ untuk skrip Anda. Tambahkan folder .cursor/ untuk hook, skills, dan subagent saat Anda membutuhkannya.
Agen Cursor Lokal Pertama Anda
Contoh pertama sengaja dibuat kecil. Ini membuat agen lokal, mengirim satu prompt, melakukan streaming respons, dan membuang agen.
Buat agen lokal
Buat 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() mengembalikan handle sebelum agen melakukan pekerjaan apa pun. local: { cwd: process.cwd() } mengarahkan agen ke direktori kerja saat ini. SDK mendukung pembuangan async; dalam kode tutorial, saya lebih suka blok finally eksplisit karena menghindari pertanyaan versi await using.
Kirim prompt dan stream respons
Mengirim prompt mengembalikan objek Run dengan stream dan statusnya sendiri. Contoh ini membaca stream dalam loop for await dan hanya mencetak teks asisten.
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]();
}
Agen memancarkan beberapa tipe event, termasuk thinking, tool_call, dan status. Contoh ini memfilter teks assistant karena itulah jawaban yang terlihat. event.message.content bertipe dan dapat digunakan untuk streaming, tetapi berbasis blok dan mungkin menyertakan pemanggilan alat. Jika Anda hanya memerlukan teks akhir, lewati stream dan baca result.result setelah run.wait(). durationMs bersifat publik tetapi opsional, jadi contoh menanganinya sebagai opsional.
Tangani error
SDK melempar error bertipe yang memperluas CursorAgentError. Kasus umum termasuk AuthenticationError untuk kunci yang salah, ConfigurationError untuk id model yang tidak valid, RateLimitError, IntegrationNotConnectedError, dan 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;
}
}
Flag isRetryable adalah yang harus diperiksa oleh logika retry Anda. Error jaringan dan rate limit dapat dicoba ulang; konfigurasi buruk dan autentikasi tidak.
Jalankan
Simpan file dan jalankan dengan loader .env milik Node dan tsx.
node --env-file=.env --import tsx/esm src/01-quickstart.ts
Flag --env-file=.env memuat CURSOR_API_KEY sebelum skrip dimulai. Skrip harus mencetak teks asisten, lalu footer status satu baris. Jika Anda melihat error autentikasi, periksa .env Anda dan pastikan kunci dihasilkan dari dasbor Integrations.
Membangun Agen Perbaikan Bug di Cloud
Contoh berikut berpindah dari folder lokal ke repo GitHub yang dikloning di cloud Cursor. Tugasnya tetap kecil: perbaiki tes auth yang gagal dan buka pull request.
Kapan memilih cloud
Agen cloud berjalan di VM yang dikelola oleh Cursor. Agen mengkloning repo, menyiapkan lingkungan pengembangan, dan berlanjut jika skrip lokal Anda keluar. Saat selesai, agen dapat mendorong sebuah branch dan membuka pull request. Komprominya adalah waktu startup dan penggunaan token yang lebih tinggi dibanding run lokal kecil.
Run cloud muncul di Cursor Web dan jendela Agents desktop saat sedang berjalan. Agen cloud dari SDK tidak ditampilkan di daftar default. Di Cursor Web, gunakan Filter > Source > SDK. Di jendela Agents desktop, gunakan footer sidebar: Show > SDK. Jika Anda memiliki id agen bc-, Anda juga dapat membukanya langsung di https://cursor.com/agents/bc-... atau melalui deep link desktop. Aturan sederhana: gunakan cloud ketika salah satu dari berikut ini benar:
- Tugas mungkin memakan waktu lebih lama daripada sesi skrip lokal.
- Anda menginginkan PR atau branch sebagai output, bukan hanya teks.
- Anda ingin menjalankan beberapa agen secara paralel pada repo yang sama.
- Agen perlu menjalankan kode (tes, build) di lingkungan terisolasi.
Untuk pemeriksaan lokal singkat, gunakan runtime lokal.
Konfigurasi agen
Konfigurasi cloud menggantikan kunci local dengan kunci cloud. Anda mencantumkan repo yang akan dikloning, opsional mengunci branch awal, dan menetapkan apakah Cursor harus membuka PR saat run selesai.
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 adalah array, tetapi cloud v1 saat ini mendukung satu repo per agen. startingRef adalah branch atau commit tempat agen memulai. autoCreatePR: true meminta Cursor membuka pull request saat run selesai. Izin GitHub, status integrasi, diff kosong, atau aturan repo masih dapat membuat Anda hanya mendapatkan branch, bukan PR.
Agar agen dapat mengkloning repo, akun Cursor Anda perlu menyiapkan integrasi GitHub. Jika belum terhubung, SDK mengembalikan IntegrationNotConnectedError dengan field helpUrl.
Kirim tugas dan sambung kembali nanti
Pola di bawah ini mengirim tugas lalu menunggu hasil melalui Agent.getRun(). Ini memungkinkan proses lain menyambung kembali nanti jika skrip asli keluar.
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});
}
Anda dapat melakukan streaming run untuk output langsung, tetapi wait() sudah cukup saat Anda hanya memerlukan hasil. Saat PR dibuat, URL dikembalikan di result.git?.branches[0]?.prUrl; cloud v1 belum mendukung beberapa repo, jadi indeks 0 adalah branch yang perlu diperiksa. Jika tidak ada URL PR, periksa branch?.branch dan buka PR secara manual. Simpan run.id dan agent.agentId jika Anda berencana menyambung kembali nanti.
Pada titik ini, tinjau pull request seperti perubahan kode lainnya.
Sekilas: lokal versus cloud
Kedua runtime menggunakan SDK yang sama tetapi berperilaku berbeda.
|
Kemampuan |
Lokal |
Cloud |
|
Tempat berjalan |
Proses Node Anda |
VM yang dikelola Cursor |
|
Akses file |
Disk Anda |
Hanya repo hasil clone |
|
Tahan putus koneksi |
Tidak |
Ya |
|
Membuka PR |
Tidak |
Ya, bila izin repo mengizinkan |
|
Mengembalikan artefak |
Tidak |
Ya (URL presigned 15 menit) |
|
Digunakan untuk |
Iterasi, CI pada checkout |
Tugas lebih lama, run paralel, output PR |
Gunakan run lokal untuk pemeriksaan cepat. Gunakan run cloud saat Anda memerlukan branch, PR, atau artefak.
Contoh Lain
Perbaikan bug menggunakan alur utama SDK: membuat agen, mengirim tugas, menunggu hasil, dan meninjau output. Cookbook Cursor menunjukkan pemanggilan SDK yang sama dalam contoh yang lebih besar:
-
agent-kanbanmendaftar agen cloud, mengelompokkannya berdasarkan status atau repo, dan menampilkan pratinjau artefak. -
coding-agent-climembungkus agen lokal dan cloud dalam alat terminal. -
app-buildermenjalankan agen lokal dari UI chat dan menayangkan pratinjau kode React yang dihasilkan.
Satu detail yang perlu diingat adalah penanganan artefak. Artefak hanya tersedia pada run cloud. Agen lokal cocok untuk output teks dan pemeriksaan cepat. Agen cloud cocok untuk tugas yang membutuhkan file, branch, atau PR sebagai output.
MCP, Skills, Hook, dan Subagent
SDK dapat membaca konfigurasi agen proyek yang sama dengan yang digunakan Cursor di IDE. Perbaikan bug tidak membutuhkan semuanya, tetapi bagian-bagian ini penting setelah agen bekerja di repo nyata.
Server MCP
Seperti disebutkan sebelumnya, server MCP menghubungkan agen ke alat eksternal. Anda dapat meneruskan server secara inline di Agent.create() atau mendefinisikannya di .cursor/mcp.json. Jika Anda meneruskan mcpServers lagi di agent.send(), run tersebut akan menggunakan server dari send() alih-alih server dari Agent.create(). Gunakan server MCP HTTP untuk alat yang di-host. Gunakan server MCP stdio untuk alat yang berjalan di samping agen.
Skills
Skills adalah file markdown di .cursor/skills/ yang memberikan instruksi proyek kepada agen, seperti pilihan kerangka kerja tes, konvensi API, atau aturan rilis. Gunakan untuk panduan yang harus berlaku pada setiap run di repo.
Hook
Hook berada di .cursor/hooks.json dan berjalan pada titik tertentu dalam loop agen. Penggunaan umum termasuk formatting setelah edit file dan memblokir perintah shell yang destruktif sebelum dieksekusi. Untuk hook keamanan, gunakan perilaku fail closed sehingga hook yang rusak memblokir aksi.
Subagent
Subagent adalah agen bernama yang dapat dipanggil agen utama untuk pekerjaan terfokus, seperti code review atau penulisan tes. Definisikan di .cursor/agents/*.md atau inline di Agent.create({ agents: { ... } }). Agen cloud memuat subagent proyek dari repo yang di-checkout. Agen lokal memerlukan local.settingSources: ["project"] jika Anda ingin mereka membaca konfigurasi proyek .cursor/. Jaga agar setiap subagent tetap sempit cakupannya.
Pemeriksaan Keamanan
Sebelum agen menyentuh repo nyata, tetapkan batas-batasnya terlebih dahulu. Ini bagian yang tidak akan saya lewatkan.
-
Batasi izin secara ketat. Agen dapat membaca file, menjalankan perintah, dan menggunakan kredensial apa pun yang Anda berikan. Beri agen akses berskala repo, bukan kredensial layanan yang luas.
-
Jauhkan secret dari prompt. Prompt bisa masuk ke transkrip. Gunakan variabel lingkungan untuk
CURSOR_API_KEYdan token lainnya, dan ingat bahwa nilaienvpada MCP stdio menjangkau runtime tempat server dieksekusi. -
Wajibkan review manusia. Jika agen cloud dapat membuka PR, proteksi branch harus mewajibkan reviewer manusia sebelum merge. Jangan gabungkan
autoCreatePR: truedengan auto merge kecuali repo berisiko rendah. -
Perhatikan biaya dan pilihan model. Penggunaan SDK ditarik dari pool penggunaan berbasis token Cursor. Seperti disebutkan, Composer 2 adalah salah satu opsi model untuk tugas pengkodean; panggil
Cursor.models.list()jika Anda perlu melihat id model mana yang dapat digunakan akun Anda. -
Catat run.
run.conversation()mengembalikan tampilan terstruktur dari giliran agen. Simpan untuk run yang mungkin perlu Anda debug atau audit nanti.
Kesimpulan
Artikel ini membahas npm install @cursor/sdk, quickstart lokal, agen cloud yang membuka pull request, dan titik ekstensi utama untuk perilaku agen di repo.
Gunakan SDK ketika kode perlu memulai dan mengelola agen. Jika tugasnya hanya percakapan di editor, aplikasi Cursor biasanya sudah cukup.
Sebagai perbandingan, panduan kami tentang Claude Agent SDK dan OpenAI Agents SDK membahas API agen di ekosistem lain.
Saya seorang data engineer dan pembangun komunitas yang bekerja lintas pipeline data, cloud, dan perkakas AI sambil menulis tutorial praktis dan berdampak tinggi untuk DataCamp dan pengembang yang sedang berkembang.
FAQs
Apakah Cursor SDK berfungsi dengan Python atau bahasa lain?
Belum secara resmi. SDK hanya tersedia untuk TypeScript pada public beta; pengguna Python sebaiknya memanggil Cloud Agents REST API secara langsung.
Bisakah saya menggunakan SDK pada paket gratis Hobby?
Ya untuk agen lokal, dalam batas rate limit dan kuota penggunaan paket gratis. Tidak untuk agen cloud; itu memerlukan Pro atau di atasnya.
Bagaimana cara membatalkan run yang terlalu lama?
Panggil run.cancel(). Status berubah menjadi cancelled, stream langsung dibatalkan, dan run.wait() menyelesaikan dengan hasil yang dibatalkan.
Di mana posisi hook jika SDK tidak memiliki callback terprogram?
Hook adalah kebijakan repo, bukan logika per skrip. Taruh aturan bersama di .cursor/hooks.json, dan simpan logika spesifik run di sekitar agent.send() atau run.wait() dalam kode TypeScript Anda.
Apakah SDK siap untuk produksi?
Gunakan terlebih dahulu untuk tugas berisiko rendah. Permukaan SDK masih public beta. Pin @cursor/sdk, batasi secret, wajibkan review, dan harapkan perubahan API sebelum general availability.

