Last chance! 50% off DataCamp Premium
Sale ends in
Cursor, Nisan 2026 sonunda TypeScript SDK’sını duyurdu ve herkese açık beta olarak yayımladı. Paket @cursor/sdk adıyla yayınlanır ve betikler, CI işleri ve arka uç servisleri gibi Node ortamlarında çalışır.
Editörde Cursor kullanmaya kıyasla temel fark, görevin nerede başladığıdır. Sohbet penceresi açıp istemi kendiniz yazmak yerine, kodunuz ajanı oluşturur, görevi gönderir, olayları akışla alır, sonucu bekler ve hataları ele alır.
Bu eğitimde SDK’yı kuruyor, yerel bir hızlı başlangıç çalıştırıyor, ardından ana projeyi inşa ediyoruz: GitHub deposundaki bir hatayı düzelten ve bir pull request açan bulut ajanı. SDK akışı görünür kalsın diye hatayı bilerek küçük tutuyorum. Sonrasında, deseni uyarlamadan önce gereken genişletme noktalarını ve güvenlik kontrollerini ele alıyoruz. Bulut projesi, başlatıcı betik ve hedef projeyi içeren bir eşlik deposu kullanır.
SDK herkese açık betadadır, bu kodu uzun vadeli bir projede yeniden kullanmadan önce resmi dokümanları kontrol edin.
Cursor SDK, @cursor/sdk adlı bir TypeScript paketidir ve koddan Cursor ajanları oluşturup çalıştırmanıza olanak tanır. Şunlara erişim sağlar:
SDK, Cursor IDE, CLI ve web uygulamasıyla aynı ajan sistemini kullanır. Fark, onu TypeScript’ten çağırmanızdır.
SDK, görevin editörde bir kişinin yazmasından değil de koddan başlaması gerektiği durumlara uygundur. Başarısız bir testi incelemesi için ajana soran bir CI işi, bir hata düzeltmesi için dal (branch) oluşturan bir webhook veya bir formdan sabit bir ajan görevini çalıştıran bir dahili araç için kullanmayı tercih ederim.
SDK, Cursor IDE ve cursor agent CLI ile birlikte Cursor ajanlarını kullanmanın başka bir yoludur.
Editör sohbeti için IDE’yi kullanın. Terminal istemleri için CLI’yı kullanın. Ajanı oluşturması, görevi göndermesi ve sonucu işlemesi gerektiğinde SDK’yı kullanın. Yukarıda belirtildiği gibi, CLI harici sağlayıcı anahtarlarını desteklemez; SDK da yalnızca bir Cursor API anahtarı üzerinden kimlik doğrular.
Kod yazmadan önce, SDK’nın açığa çıkardığı birkaç nesneyi ve çalışma zamanı seçeneklerini bilmek faydalıdır.

Üç çalışma zamanı genelinde Cursor SDK mimarisi. Görsel: Yazar.
SDK, bir ajanın çalışabileceği üç yeri destekler.
|
Çalışma zamanı |
Ne yapar |
Ne zaman kullanılır |
|
Yerel |
Ajani Node süreciniz içinde satır içi çalıştırır, dosyaları diskten okur |
Geliştirme betikleri, çalışan ağaç üzerinde CI kontrolleri, hızlı yineleme |
|
Cursor bulut |
Depo klonlanmış şekilde, Cursor tarafından yönetilen izole bir VM’de çalışır |
Paralel ajanlar, daha uzun görevler, bağlantı koptuktan sonra da süren çalıştırmalar |
|
Bulut ile aynı şekil ama kendi VM’leriniz ve ağınızla |
Kodun, sırların ve derleme çıktısının kendi ortamlarında kalması gereken ekipler |
Bu yazıda yereli ve Cursor bulutu kullanıyoruz. Yukarıda listelenen kendi barındırdığınız bulut daha çok Kurumsal planlar içindir. SDK kodu, verdiğiniz yapılandırma anahtarına göre değişir: local veya cloud.
SDK içindeki bir çalıştırma üç parçadan oluşur. Çalışma zamanı, yürütmenin gerçekleştiği yerdir. Ajan araçları; indeksleme, arama, MCP araç çağrıları, beceriler, kancalar ve alt ajanları içerir. Model, model: { id: "composer-2" } veya hesabınızın kullanabildiği başka bir id ile seçilir.
Bu parçaları ajan yapılandırmasında belirlersiniz.
SDK’daki iki ana nesne Agent ve Run’dır. Bir ajan; konuşma durumunu, çalışma alanı yapılandırmasını ve model ayarlarını tutar. Bir run, o ajana gönderilen tek bir istemdir; kendi akışına, durumuna, sonucuna ve iptal tutamacına sahiptir.
Bu ayrım önemlidir, çünkü bulut ajanları her ajan için bir etkin run zorunluluğu uygular. İlk çalışma sürerken ikinci bir istem göndermeye çalışırsanız, API 409 agent_busy döndürür. Paralel çalıştırmalar için ayrı run’lar değil, ayrı ajanlar oluşturursunuz.
Her run, bir async yineleyici olan run.stream() aracılığıyla bir olay akışı sunar. Her olayın bir type alanı vardır. Mevcut herkese açık betada SDK, system, user, assistant, tool_call, thinking, status, request ve task olayları yayar. Belgelenmiş bir connection:reconnecting olayı yoktur; yeniden bağlanmalar SDK içinde ele alınır.
Daha alt düzey güncellemeler için, agent.send() ayrıca onDelta ve onStep geri çağrılarını kabul eder.
Kurulum sadece Node, TypeScript ve bir Cursor API anahtarından ibarettir.
Gerekenler:
Node.js 22 veya daha yeni. Paket resmen Node 18 ve üzerini destekler, ancak Node 22 resmi yemek kitabı örnekleriyle eşleşir ve aşağıda --env-file bayrağıyla .env dosyasının yüklenmesini destekler.
Bulut ajanları için Pro (aylık 20 ABD doları) veya üzeri bir Cursor hesabı.
Temel TypeScript bilgisi.
tsx ile TypeScript’i derlemeden çalıştırmak.
SDK’yı ve TypeScript araçlarını kurun:
Yeni bir klasörde:
npm init -y
npm install @cursor/sdk
npm install --save-dev typescript tsx @types/node
package.json dosyanıza "type": "module" ekleyin ki içe aktarmalar ESM olarak çalışsın. Ardından, üst düzey await ve açıkça async temizlemeyi destekleyen bir tsconfig.json ekleyin:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"lib": ["ES2022", "ESNext.Disposable"],
"strict": true,
"esModuleInterop": true
}
}
Anahtar başlangıçta cursor.com/dashboard/cloud-agents altında üretiliyordu, ancak taşındı ve artık cursor.com/dashboard/integrations adresindedir. Bir kılavuz “Cloud Agents”a işaret ediyorsa, bunun yerine Integrations’a bakın.

Integrations üzerinden User API Keys üretin. Görsel: Yazar.
Oradan bir Kullanıcı API Anahtarı üretin ve CURSOR_API_KEY olarak saklayın:
echo 'CURSOR_API_KEY=crsr_your_key_here' > .env
.env dosyasını .gitignore’a ekleyin. SDK doğrudan process.env okur; sizin için .env dosyalarını yüklemez.
Klasör düzeni: package.json, tsconfig.json, .env ve betikleriniz için src/. İhtiyaç duyduğunuzda kancalar, beceriler ve alt ajanlar için bir .cursor/ klasörü ekleyin.
İlk örnek kasıtlı olarak küçüktür. Yerel bir ajan oluşturur, tek bir istem gönderir, yanıtı akışla alır ve ajanı kapatır.
Şunu oluşturun: 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(), ajan herhangi bir iş yapmadan önce bir tutamak döndürür. local: { cwd: process.cwd() } ajanı geçerli çalışma dizinine yönlendirir. SDK async temizlemeyi destekler; eğitim kodunda, await using sürüm sorularından kaçındığı için açık bir finally bloğunu tercih ederim.
Bir istem göndermek, kendi akışına ve durumuna sahip bir Run nesnesi döndürür. Bu örnek, akışı bir for await döngüsünde okur ve yalnızca assistant metnini yazdırır.
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]();
}
Ajan, thinking, tool_call ve status dahil birkaç olay türü yayar. Bu örnek, görünür yanıt olduğu için assistant metnini filtreler. event.message.content akış için türlenmiştir ve kullanılabilirdir, ancak blok tabanlıdır ve araç çağrılarını içerebilir. Yalnızca nihai metne ihtiyacınız varsa, akışı atlayın ve run.wait() sonrasında result.result’ı okuyun. durationMs aleni ama isteğe bağlıdır, bu yüzden örnek onu isteğe bağlı olarak ele alır.
SDK, CursorAgentError’ı genişleten türlenmiş hatalar fırlatır. Yaygın durumlar: hatalı anahtar için AuthenticationError, geçersiz model id için ConfigurationError, RateLimitError, IntegrationNotConnectedError ve 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;
}
}
isRetryable bayrağı, tekrar deneme mantığınızın kontrol etmesi gereken işarettir. Ağ hataları ve hız sınırlamaları yeniden denenebilir; hatalı yapılandırma ve kimlik doğrulama yeniden denenemez.
Dosyayı kaydedin ve Node’un .env yükleyicisi ve tsx ile çalıştırın.
node --env-file=.env --import tsx/esm src/01-quickstart.ts
--env-file=.env bayrağı, betik başlamadan önce CURSOR_API_KEY ’i yükler. Betik, assistant metnini yazdırmalı ve ardından tek satırlık bir durum altlığı göstermelidir. Kimlik doğrulama hatası görürseniz, .env ’nizi kontrol edin ve anahtarın Integrations panosundan üretildiğini doğrulayın.
Bir sonraki örnek, yerel bir klasörden Cursor’un bulutunda klonlanan bir GitHub deposuna geçiyor. Görev hâlâ küçük: başarısız olan bir kimlik doğrulama testini düzeltmek ve bir pull request açmak.
Bulut ajanları, Cursor’un yönettiği VM’lerde çalışır. Depoyu klonlar, bir geliştirme ortamı kurarlar ve yerel betiğiniz çıksa bile çalışmaya devam ederler. İşleri bittiğinde bir dalı itebilir ve pull request açabilirler. Karşılık olarak, küçük bir yerel çalıştırmaya göre başlatma süresi ve daha yüksek belirteç (token) kullanımı söz konusudur.
Bulut çalıştırmaları, çalışırken Cursor Web’de ve masaüstü Ajanlar Penceresinde görünür. SDK bulut ajanları varsayılan listeden süzülüdür. Cursor Web’de Filter > Source > SDK’yı kullanın. Masaüstü Ajanlar Penceresinde, kenar çubuğu altbilgisini kullanın: Show > SDK. bc- ile başlayan ajan id’si sizdeyse, https://cursor.com/agents/bc-... adresinden doğrudan açabilir veya masaüstü derin bağlantısıyla gidebilirsiniz. Basit bir kural olarak, aşağıdakilerden herhangi biri doğruysa bulutu kullanın:
Kısa yerel kontroller için yerel çalışma zamanını kullanın.
Bulut yapılandırması, local anahtarını cloud anahtarıyla değiştirir. Klonlanacak depoyu listelersiniz, isteğe bağlı olarak başlangıç dalını sabitlersiniz ve çalışma bittiğinde Cursor’ın PR açıp açmamasını belirlersiniz.
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 bir dizidir, ancak bulut v1 şu anda ajan başına tek depo destekler. startingRef, ajanın başlayacağı dal veya committir. autoCreatePR: true, çalışma bittiğinde Cursor’dan bir pull request açmasını ister. GitHub izinleri, entegrasyon durumu, boş diff’ler veya depo kuralları yine de PR yerine bir dal ile bırakabilir.
Ajanın depoyu klonlayabilmesi için Cursor hesabınızda GitHub entegrasyonunun kurulmuş olması gerekir. Bağlı değilse, SDK bir IntegrationNotConnectedError ve helpUrl alanı döndürür.
Aşağıdaki desen, bir görevi gönderir ve ardından sonucu Agent.getRun() üzerinden bekler. Bu, ilk betik çıksa bile başka bir sürecin daha sonra yeniden bağlanmasına imkân tanır.
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});
}
Canlı çıktı için çalıştırmayı akışla alabilirsiniz, ancak yalnızca sonuca ihtiyacınız varsa wait() yeterlidir. Bir PR oluşturulduğunda URL, result.git?.branches[0]?.prUrl alanında döner; bulut v1 henüz birden çok depoyu desteklemez, bu yüzden kontrol edilecek dal indeks 0’dır. Bir PR URL’si yoksa, branch?.branch ’i kontrol edin ve PR’ı elle açın. Daha sonra yeniden bağlanmayı planlıyorsanız run.id ve agent.agentId’yi saklayın.
Bu noktada, pull request’i diğer kod değişiklikleri gibi gözden geçirin.
İki çalışma zamanı aynı SDK’yı kullanır ancak farklı davranırlar.
|
Yetenek |
Yerel |
Bulut |
|
Nerede çalışır |
Node süreciniz |
Cursor’ın yönettiği bir VM |
|
Dosya erişimi |
Diskiniz |
Yalnızca klonlanan depo |
|
Bağlantı kopmalarını atlatır |
Hayır |
Evet |
|
PR açar |
Hayır |
Evet, depo izinleri izin veriyorsa |
|
Eser (artifact) döndürür |
Hayır |
Evet (15 dakikalık ön imzalı URL’ler) |
|
Kullanım amacı |
Yineleme, bir checkout üzerinde CI |
Daha uzun görevler, paralel çalıştırmalar, PR çıktısı |
Hızlı kontroller için yerel çalıştırmaları kullanın. Bir dal, PR veya eser gerektiğinde bulut çalıştırmalarını kullanın.
Hata düzeltici, ana SDK akışını kullandı: bir ajan oluşturma, bir görev gönderme, sonucu bekleme ve çıktıyı inceleme. Cursor’ın yemek kitabı daha büyük örneklerde aynı SDK çağrılarını gösterir:
agent-kanban bulut ajanlarını listeler, duruma veya depoya göre gruplar ve eserleri önizler.
coding-agent-cli yerel ve bulut ajanlarını bir terminal aracında sarar.
app-builder bir sohbet arayüzünden yerel bir ajan çalıştırır ve oluşturulan React kodunu önizler.
Dikkat edilmesi gereken bir ayrıntı eser (artifact) yönetimidir. Eserler yalnızca bulut çalıştırmalarında mevcuttur. Yerel ajanlar metin çıktısı ve hızlı kontroller için uygundur. Bulut ajanları ise çıktı olarak dosyalar, dallar veya PR’lar gerektiren görevler için uygundur.
SDK, Cursor’ın IDE’de kullandığı aynı proje ajan yapılandırmasını okuyabilir. Hata düzeltici bunların hepsine ihtiyaç duymaz, fakat ajan gerçek bir depoda çalışmaya başladığında bu parçalar önem kazanır.
Önceden belirtildiği gibi, MCP sunucuları ajanları harici araçlara bağlar. Sunucuları Agent.create() içinde satır içi geçebilirsiniz veya .cursor/mcp.json’da tanımlayabilirsiniz. mcpServers’ı agent.send() içinde yeniden geçerseniz, o çalıştırma send() ’den gelen sunucuları Agent.create()’den gelenlere tercih eder. Barındırılan araçlar için HTTP MCP sunucularını, ajanın yanında çalışan araçlar için stdio MCP sunucularını kullanın.
Beceriler, ajana proje yönergeleri veren .cursor/skills/ altındaki markdown dosyalarıdır; örneğin test çerçevesi tercihleri, API kuralları veya sürümleme kuralları. Depodaki her çalıştırmada geçerli olması gereken yönergeler için kullanın.
Kancalar .cursor/hooks.json içinde bulunur ve ajan döngüsünün belirli noktalarında çalışır. Yaygın kullanımlar arasında dosya düzenlemelerinden sonra biçimlendirme ve yürütülmeden önce yıkıcı kabuk komutlarını engelleme yer alır. Güvenlik kancaları için, bir kancanın bozulması işlemi engellesin diye varsayılan kapalı (fail closed) davranışı kullanın.
Alt ajanlar, ana ajanın odaklı işler için (ör. kod inceleme veya test yazımı) çağırabileceği adlandırılmış ajanlardır. Bunları .cursor/agents/*.md içinde veya Agent.create({ agents: { ... } }) içinde satır içi tanımlayın. Bulut ajanları, proje alt ajanlarını check-out edilen depodan yükler. Yerel ajanların proje .cursor/ yapılandırmasını okumasını istiyorsanız local.settingSources: ["project"] kullanın. Her alt ajanı dar kapsamlı tutun.
Ajanlar gerçek bir depoya dokunmadan önce sınırları belirleyin. Bu kısmı atlamazdım.
İzin kapsamını sıkı tutun. Ajanlar dosya okuyabilir, komut çalıştırabilir ve onlara açtığınız kimlik bilgilerini kullanabilir. Ajanlara geniş servis kimlik bilgileri değil, depo kapsamlı erişim verin.
Gizli bilgileri istemlerden uzak tutun. İstemler transkriptlere düşebilir. CURSOR_API_KEY ve diğer tüm belirteçler için ortam değişkenleri kullanın ve stdio MCP env değerlerinin sunucunun çalıştığı çalışma zamanına ulaştığını unutmayın.
İnsan incelemesi zorunlu olsun. Bir bulut ajanı PR açabiliyorsa, birleştirme öncesinde dal koruması bir insanın incelemesini gerektirmelidir. Depo düşük riskli olmadıkça autoCreatePR: true ile otomatik birleştirmeyi birlikte kullanmayın.
Maliyeti ve model seçimini izleyin. SDK kullanımı, Cursor’ın belirteç tabanlı kullanım havuzundan düşer. Önceden belirtildiği gibi, Composer 2 kodlama görevleri için bir model seçeneğidir; hesabınızın kullanabildiği model id’lerini görmek istiyorsanız Cursor.models.list() çağrısını yapın.
Çalıştırmayı kaydedin. run.conversation() ajanın turlarının yapılandırılmış bir görünümünü döndürür. Daha sonra hata ayıklamanız veya denetlemeniz gerekebilecek çalıştırmalar için saklayın.
Bu makalede npm install @cursor/sdk, yerel bir hızlı başlangıç, pull request açan bir bulut ajanı ve depo ajan davranışı için ana genişletme noktaları ele alındı.
Kodun ajana başlaması ve onu yönetmesi gerektiğinde SDK’yı kullanın. Görev yalnızca bir editör konuşması ise, Cursor uygulaması genellikle yeterlidir.
Karşılaştırma için, Claude Agent SDK ve OpenAI Agents SDK hakkındaki rehberlerimiz diğer ekosistemlerdeki ajan API’larını kapsar.
Veri hatları, bulut ve YZ araçları üzerinde çalışan; aynı zamanda DataCamp ve gelişmekte olan geliştiriciler için pratik, yüksek etkili eğiticiler yazan bir veri mühendisi ve topluluk inşacısıyım.
Resmi olarak hayır. Halk betası itibarıyla SDK yalnızca TypeScript’tir; Python kullanıcıları Cloud Agents REST API’sini doğrudan çağırmalıdır.
Ücretsiz katmandaki hız ve kullanım sınırları dahilinde yerel ajanlar için evet. Bulut ajanları için hayır; onlar Pro veya üzerini gerektirir.
run.cancel() çağırın. Durum cancelled olur, canlı akış iptal edilir ve run.wait() iptal edilmiş sonuçla çözümlenir.
Kancalar depo politikasıdır, betik başına mantık değildir. Paylaşılan kuralları .cursor/hooks.json içine koyun ve çalıştırmaya özgü mantığı TypeScript kodunuzda agent.send() veya run.wait() etrafında tutun.
Önce düşük riskli görevler için kullanın. SDK yüzeyi hâlâ herkese açık betadadır. @cursor/sdk sürümünü sabitleyin, sırları sınırlayın, inceleme gerektirin ve genel kullanıma geçmeden önce API değişikliklerini bekleyin.
DataCamp ile öğrenin
Kurs
Program

blog
Abid Ali Awan
14 dk.
blog
Dario Radečić
15 dk.
Eğitim
Kurtis Pykes
8 dk.
Eğitim
Adel Nehme