Bir ajanın REST API'de bulamadığı şey nedir?
Bu sitede bir REST API vardır ve onu kendi koduna entegre eden bir yazılımcı için sorun çıkmaz. Bir ajan için çıkar: referans sayfasını açıp üç uç noktadan hangisini istediğine karar veremez, doğru sorgu dizesiyle bir isteği elle yazamaz. Onun yerine sunucuya ne yapabileceğini sorar, makine tarafından okunabilir şemalar alır ve bunlardan birini çağırır.
Bu yüzden hizmetin yaptığı her şey ikinci kez, araçlar olarak da sunulur. Altı tanedirler ve çağrılar arasında yönetilecek bir durum yoktur:
| Araç | Ne işe yarar |
|---|---|
create_inbox | Ajanın hemen dışarı verebileceği yeni bir adres uydurur. Sunucu tarafında hiçbir şey rezerve edilmediği için başarısız olamaz. İsteğe bağlı, okunabilir bir prefix alır; rastgele bir sonek onu benzersiz kılar. |
list_domains | Herkesin kullanabileceği genel alan adları — bir form bunlardan birini az önce reddettiyse işe yarar. |
list_messages | Bir adreste bekleyen her şey, en yeniden en eskiye. Hiçbir şey olmasa bile hemen döner. |
read_message | Bir mesajın tamamı: gönderen, konu, düz metin, HTML, ekler. Kod ya da giriş bağlantısı buradadır. |
wait_for_message | Bir şey gelene kadar çağrıyı bekletir, sonra onu eksiksiz döner. Bir form gönderilir gönderilmez çağrılacak araç budur. |
delete_message | Süresinin dolması için 5 gün beklemek yerine bir mesajı hemen kaldırır. İdempotenttir, yani bir ajanın yeniden denemesinin bedeli yoktur. |
Sunucu ayrıca initialize çağrısını kısa bir talimat paragrafıyla yanıtlar; çoğu istemci bunu doğrudan modele iletir. Böylece bir ajan, kimse bunu bir prompt'a yazmadan, bu hizmetin ne işe yaradığını ve tek gerçek uyarısının ne olduğunu zaten bilerek işe başlar.
Bir istemci tek satırda nasıl bağlanır?
Uç nokta tek bir URL'dir ve genel alan adları için kaydolunacak hiçbir şey yoktur. Her MCP istemcisi aynı biçimde bir yapılandırma alır — Claude Desktop, Claude Code, Cursor, Continue, OpenAI Agents SDK ve protokolü konuşan her şey:
{"mcpServers":{"grabmail":{"url":"https://grabmail.io/mcp"}}}Taşıma katmanı Streamable HTTP'dir: JSON-RPC 2.0 taşıyan tek bir POST, tek bir JSON yanıt, açık tutulan bir akış yok. Dolayısıyla her şeyi, herhangi bir ajan işin içine girmeden önce bir terminalden kontrol edebilirsiniz:
curl -sX POST https://grabmail.io/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Bir insana sormadan önce sunucuyu arayan istemciler, alan adında aynı uç noktayı ve taşımasını tanımlayan /.well-known/mcp.json dosyasını bulur.
Kayıt akışının tamamı dört araç çağrısıyla nasıl tamamlanır?
Neredeyse her ajanın ihtiyaç duyduğu sıra budur, başka bir şey yoktur:
- Önce
create_inboxaracını çağırın. Karşılığında bir adres, bir takma ad, alan adı ve ikisinden hangisinin verileceğini söyleyen bir not gelir. Hiçbir şey oluşturulmadı — posta kutusu, içine ilk mesaj düştüğünde var olmaya başlar. - Takma adı forma yazın. Kaydolunan hizmet, posta kutusuna ulaşan ama onu okumak için kullanılamayan, çalışan bir adres almış olur.
- Adresle birlikte
wait_for_messagearacını çağırın. Bir zamanlayıcıyla değil, gönderir gönderilmez. Çağrı bekletilir; ajanın kendi yazması gereken bir döngüde yoklama yapılmaz. - Kodu mesajın içinden okuyun. Bekleme çağrısı gövdenin tamamını da döndürür, bu yüzden genellikle ikinci bir çağrıya hiç gerek kalmaz —
read_messageyalnızca daha önce gelmiş bir şey için gereklidir.
wait_for_message posta gelmeden neden döner?
Bir ajanı işler kılan araç budur, ve davranışı insanları şaşırtan da odur — bu yüzden bir dakikayı hak ediyor. Bir çağrı şöyle görünür:
curl -sX POST https://grabmail.io/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":
{"name":"wait_for_message",
"arguments":{"address":"demo.5kuqarzuch@grabmail.io",
"subject_contains":"code"}}}'En fazla 25 saniye bekletir. O zamana kadar hiçbir şey gelmediyse başarısız olmaz — sade bir yanıtla döner ve yeniden çağrılmasını ister:
{
"timed_out": true,
"waited_seconds": 25,
"message": null,
"note": "Nothing arrived yet. Call wait_for_message again ..."
}- Neden bir üst sınır var
- Beklemenin her saniyesi, uyumaktan başka bir şey yapmayan bir sunucu işçisidir ve bunlardan sabit sayıda vardır. Beş dakika sürebilecek bir bekleme, yüz başka ajanın ihtiyaç duyduğu bir yuvayı tek bir ajanın tutması demektir. 25 saniye aynı zamanda her istemcinin varsayılan zaman aşımı süresinin içinde kalır, böylece çağrı, istemci ondan vazgeçmeden döner.
- Aynı anda yalnızca 8 bekleme
- Bu sayı aşıldığında araç,
timed_outve bunu açıklayan bir notla hemen yanıt verir. Geri gelmesi söylenmek, haberi olmadan yedi başka ajanın arkasında sıraya girmekten iyidir. - Filtreleme: yanlış posta bekleyişi bitirmesin diye
from_containsvesubject_contains, bu sırada gelen başka her şeyi bekleyişin görmezden gelmesini sağlar. Posta kutusunda zaten bir şey varsa geçilecek parametresince_id'dir: görülen en yeni kimliği ona verin, çağrıyı yalnızca gerçekten yeni bir posta tatmin etsin.
Takma ad mı, adres mi dışarı verilmeli?
Buradaki her posta kutusunun, aynı kutuya teslimat yapan ama onu okuyamayan, on iki karakter uzunluğunda ikinci bir adresi vardır. Bu ayrım bir ajan için bir insana göre çok daha önemlidir, çünkü bir ajan kendisine verileni bulduğu her alana seve seve yapıştırır.
Bu yüzden create_inbox tek bir adres verip umut etmekle yetinmez. İkisini birden döndürür, ve hangisinin hangisi olduğunu söyleyen bir next_step alanı ekler — ajan kendi araç sonucunu okur, böylece talimat, döngüdeki kimsenin okuyamadığı bir dokümantasyon sayfasında oturmak yerine ihtiyaç duyulan yere ulaşır.
Ajanın kendi talimatlarına ne yazılmalı?
Araçlar kendilerini yeterince iyi tanımlar, öyle ki yetenekli bir model bunu hiç yönlendirilmeden de doğru yapar. Beş satır, bunu olası olmaktan çıkarıp güvenilir kılar:
- Kayıt başına bir adres. Her yerde yeniden kullanılan tek bir adres değil: altı hizmetin postasını tutan bir posta kutusu, ajanın birbirinden ayırt etmesi gereken altı doğrulama ve hepsini birden açığa çıkaracak tek bir sızıntı demektir.
- Takma adı verin, adresi asla. Araç sonucu da bunu söylese bile açıkça belirtmeye değer.
- Gönderdikten hemen sonra
wait_for_messagearacını çağırın, vetimed_outaldığınızda bunu bir hata saymak yerine yeniden çağırın. İki ya da üç kez normaldir. - Posta kutusu yeni değilse
since_idgeçirin, yoksa eski bir mesaj bekleyişi tatmin eder ve ajan bir saat önce süresi dolmuş bir kodu okur. - Kod kullanıldıktan sonra mesajı silin. Zorunlu değildir — zaten her şey 5 gün içinde gider — ama pencereyi erken kapatır ve bedeli tek bir idempotent çağrıdır.
Bir talimat bloğu olarak yazıldığında, uzunluğu aşağı yukarı şu kadardır:
Bir e-posta adresine ihtiyacın olduğunda create_inbox aracını çağır ve
döndürdüğü TAKMA ADI ver, adresi asla. Formu gönderir göndermez
wait_for_message aracını adresle çağır. timed_out gelirse yeniden çağır —
bu normaldir, hiçbir şey kaybolmaz. Posta kutusu boş değilse since_id
parametresini geçir. Kod kullanılınca mesajı sil.Bunun üzerine bir şey kurmadan önce hangi sınırları bilmek gerekir?
Hepsi keşfedilmek yerine yayımlanmıştır ve hiçbirini yükselten bir plan yoktur:
| Sınır | Değer | Bir ajan için anlamı |
|---|---|---|
| Tek bir bekleme | 25 saniye | Sonra timed_out. Yeniden çağırın; bunu bir hata saymayın. |
| Aynı anda bekleme | 8 | Bu sayı aşıldığında araç hemen döner ve bunu belirtir. list_messages aracına geri dönün. |
| Okumalar | Adres başına saniyede bir | Bir araç çağırma döngüsünün yaptığından çok daha yukarıda. Bekletmeli bir çağrı tek bir istektir, altmış değil. |
| Mesaj boyutu | 5 MB | SMTP görüşmesi sırasında reddedilir, böylece asla gelmeyecek bir şeyi bekleyen ajan değil, gönderen taraf bilgilendirilir. |
| Saklama süresi | 5 gün | Bir işin uyguladığı kesin bir sınırdır. Ajanın saklaması gereken her şeyi kendisinin bir yere yazması gerekir. |
Gönderim için ne bir uç nokta ne de bir araç vardır. Bu hizmet yalnızca alır, kimliği doğrulanmamış bir posta kutusunun bir spam kaynağına dönüşmesini engelleyen de tam olarak budur — bu yüzden bir insana yanıt vermesi gereken bir ajanın başka bir yerde gerçek bir posta kutusuna ihtiyacı vardır.
Bir form genel alan adlarını reddederse ne yapılır?
Pek çok hizmet, tek kullanımlık posta alan adlarının listesini tutar ve buradaki üç genel alan adı da bu listelerdedir. Bir ajan bunu, kendisine az önce verilen adresi reddeden — ya da daha kötüsü, kabul edip hiçbir şey göndermeyen — bir form olarak yaşar.
Kalıcı çözüm, sahibi olduğunuz bir alan adıdır. Tek bir MX kaydı, üzerindeki her adresi burada bir posta kutusuna dönüştürür; hiçbir listede yoktur çünkü bu sitede hiçbir yerde yazılı değildir ve aynı altı araç onun üzerinde de değişmeden çalışır — bunun tek istisnası create_inbox'tur, çünkü o adresleri yalnızca genel alan adları üzerinde uydurur. Ajan basitçe siz-seçin@alan-adınız adresini kullanır ve onun üzerinde wait_for_message aracını çağırır.
Alan adınız için MX kaydı10 smtp.grabmail.io
Adım adım tam anlatım burada — kayıt, onu yayımlamanın neyi kanıtladığı ve parolası olmayan bir posta kutusunun gerçek sınırları.
Bir ajana bununla neler yaptırılmamalı?
Dürüst olan kısım, ve bir öğleden sonrayı kurtaran kısım:
- Geri almanız gerekecek hiçbir şey için değil. Para, kimlik ya da iş barındıran hiçbir şey için. Posta kutusu 5 gün içinde yeniden boşalır ve adresi bilen herkes tarafından okunabilir, bu yüzden gelecek yıl oraya gönderilecek bir parola sıfırlama kimseye — ya da başka birine — ulaşır.
- İkinci bir doğrulama faktörü olarak değil. Parolası olmayan bir posta kutusu bir faktör değildir.
- Özel hiçbir şey için değil. Onu biz okuduğumuz için değil, devredeki tek sır adresin kendisi olduğu ve bir ajanın onu bir log'a, bir konuşma dökümüne ya da bir commit mesajına yazmış olması pekâlâ mümkün olduğu için.
- Hacim için değil. Yüzlerce hesap açan bir ajan, tam olarak her kara listenin var olma sebebi olan davranıştır ve genel alan adlarının başka herkes için de reddedilmesini sağlamanın en hızlı yoludur.
Ne ise o olarak kullanıldığında — bir ajanla asıl yapması istenen şey arasında duran doğrulama adımı — onu güvenilir biçimde durduran o tek adımı ortadan kaldırır.
Sorular
API anahtarına ya da bir hesaba ihtiyacım var mı?
Hayır. Genel alan adları, araçlar ve kendi alan adınız — hepsi ücretsiz ve kimlik doğrulaması gerektirmez. Anahtar gerektiren tek durum, talep üzerine kapatılmış ve bu yüzden bir Authorization başlığı isteyen bir alan adıdır.
Bu hangi istemcilerle çalışır?
Model Context Protocol'u konuşan her istemciyle — Claude Desktop, Claude Code, Cursor, Continue, OpenAI Agents SDK ve gerisiyle. Taşıma katmanı, güncel istemcilerin varsayılan olarak kullandığı Streamable HTTP'dir ve üç protokol sürümü kabul edilir, böylece eski bir istemci de bağlanabilir.
wait_for_message neden timed_out ile döner?
Çünkü tek bir bekleme, bilerek, en fazla 25 saniyeyle sınırlandırılmıştır. Bu bir hata değildir ve hiçbir şey kaybolmamıştır: yeniden çağırın. Posta, onu vadeden sayfanın ima ettiğinden çoğunlukla daha uzun sürer ve art arda iki üç bekleme sıradan bir kayıttır.
Ajan bunun yerine kendi alan adımı kullanabilir mi?
Evet, ve adres dışında hiçbir şey değişmez. Bir MX kaydını smtp.grabmail.io adresine yöneltin, o alan adındaki her adres aynı araçlar üzerinden okunabilir hale gelir. Yalnızca create_inbox genel alan adlarıyla sınırlıdır, çünkü sizin için bir isim uyduran araç odur.
Bir ajan bunun üzerinden e-posta gönderebilir mi?
Hayır. Tasarım gereği ne bir gönderme aracı ne de bir gönderme uç noktası vardır: posta gönderebilen, kimliği doğrulanmamış bir hizmet bir gün içinde spam kaynağına dönüşürdü. SPF kaydımız v=spf1 -all, DMARC kaydımız ise p=reject'tir; bu yüzden buradaki bir adresten geldiğini iddia eden her şey sahtedir.
Gelen kutusu özel mi?
Hayır, ve bir ajana açıkça söylenmesi gereken tek uyarı da budur. Genel bir alan adında, adresi bilen ya da tahmin eden herkes onu okuyabilir. Tahmin edilemeyecek bir adres kullanın, adres yerine takma adı dışarı verin ve özel hiçbir şeyi ona yaklaştırmayın.
İki ajan aynı anda aynı adreste bekleyebilir mi?
Bekleyebilirler, ve mesaj geldiğinde ikisine de verilir. Sınırlanan şey, hizmetin tamamında aynı anda gerçekleşen bekleme sayısıdır, 8; bu sayı aşıldığında araç hemen yanıt verir ve bunu belirtir, list_messages ise yine de çalışır.
Mesajlar ne kadar süre kalır?
Varıştan itibaren 5 gün, okunmuş olsun olmasın, ve bunu uzatan bir ayar yoktur. Her mesaj bir expires_at taşır, böylece bir ajanın bu tarihi kendisinin hesaplaması hiç gerekmez.
Bu, REST API'yi bir betikten çağırmaktan nasıl farklıdır?
Bir betik için farklı değildir, ve daha uygun olan REST API'dir — doğrulama akışlarını test etme rehberi bu şekli, son tarihleri ve yardımcıları dahil ederek anlatır. MCP ise kimsenin döngüyü yazmadığı durum içindir: model bir gelen kutusu açmaya kendisi karar verir ve araçların dokümante edilmiş olmaktan çok keşfedilebilir olmasına ihtiyaç duyar.


