Yapay zeka ajanları ve MCP

MCP gelen kutusu: yapay zeka ajanı kendi kaydını doğrulasın

Otonom bir ajan “e-postanda kodu kontrol et” adımına kadar gelir ve orada tıkanır. Çözümün tamamı bu: altı MCP aracı, hesap yok, anahtar yok — ve bunlardan biri, mesaj gerçekten gelene kadar çağrıyı bekletir.

  • Orta düzey
  • 13 dk okuma
Küçük, gri bir robot açık bir posta kutusuna mavi bir zarf uzatıyor; ikisinin arasında bir kronometre bekliyor.

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_inboxAjanı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_domainsHerkesin kullanabileceği genel alan adları — bir form bunlardan birini az önce reddettiyse işe yarar.
list_messagesBir adreste bekleyen her şey, en yeniden en eskiye. Hiçbir şey olmasa bile hemen döner.
read_messageBir mesajın tamamı: gönderen, konu, düz metin, HTML, ekler. Kod ya da giriş bağlantısı buradadır.
wait_for_messageBir şey gelene kadar çağrıyı bekletir, sonra onu eksiksiz döner. Bir form gönderilir gönderilmez çağrılacak araç budur.
delete_messageSü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:

mcp.json
{"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:

araçları terminalden listele
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:

  1. Önce create_inbox aracı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.
  2. Takma adı forma yazın. Kaydolunan hizmet, posta kutusuna ulaşan ama onu okumak için kullanılamayan, çalışan bir adres almış olur.
  3. Adresle birlikte wait_for_message aracı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.
  4. 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_message yalnızca daha önce gelmiş bir şey için gereklidir.
Ajanınızbir adres ve bir takma ad alırSitetakma adı alır, kodu gönderirGrabMailgeleni tutarwait_for_message, en fazla 25 snmesajın tamamını döndürür, ya da timed_out
Dört çağrı, ve bunlardan yalnızca biri bekler. Takma ad siteye gider; adres ajanda kalır ve ajanın dinlediği şey odur.

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:

konusunda “kod” geçen bir mesajı bekle
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:

sessiz bir bekleyişin ardından gelen yanıt
{
  "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_out ve 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_contains ve subject_contains, bu sırada gelen başka her şeyi bekleyişin görmezden gelmesini sağlar. Posta kutusunda zaten bir şey varsa geçilecek parametre since_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_message aracını çağırın, ve timed_out aldığınızda bunu bir hata saymak yerine yeniden çağırın. İki ya da üç kez normaldir.
  • Posta kutusu yeni değilse since_id geç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:

sistem promptu, ya da AGENTS.md içinde bir satı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ırDeğerBir ajan için anlamı
Tek bir bekleme25 saniyeSonra timed_out. Yeniden çağırın; bunu bir hata saymayın.
Aynı anda bekleme8Bu sayı aşıldığında araç hemen döner ve bunu belirtir. list_messages aracına geri dönün.
OkumalarAdres başına saniyede birBir 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 boyutu5 MBSMTP görüşmesi sırasında reddedilir, böylece asla gelmeyecek bir şeyi bekleyen ajan değil, gönderen taraf bilgilendirilir.
Saklama süresi5 günBir 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.

Henüz tazeyken deneyin

Bir adres tek tıkla alınır, hesap ve kart gerekmez. Bu rehberdeki her şey onunla hemen çalışır.

Tekrar hoş geldiniz

Kutularınız ve alan adlarınız tek bir yerde.