Bir bağlantıya tıklıyorsunuz, sayfa yüklenmeye başlıyor ve siz daha bir cümle okumadan üzerine bir popup kayıyor. Dokuz saniye önce geldiğiniz bir şirkete e-posta adresinizi verirseniz yüzde on indirim. Kapatıyorsunuz. Aşağıda bir yerde, geri tuşuna doğru hareket edeceğiniz anı bekleyen ikincisi duruyor.
O popup bir tasarım hatası değil. Tam olarak yapılmak üzere kurulduğu şeyi yapıyor ve pazarlama ekibinden kimsenin kaldırılmasını savunmayacağı kadar iyi çalışıyor.
Bir e-posta adresi, elde tutma programının anahtarı. Bir marka bir adres edindiğinde her ecommerce platformunun arkasında duran yaşam döngüsü akışlarını çalıştırabiliyor: kayıtta tetiklenen karşılama serisi, birisi bir ürünü görüp ayrıldığında giden gezinme terki e-postası, sepet ve ödeme terki dizisi, satın alma sonrası ve yenileme hatırlatmaları, sessizleşen herkes için geri kazanım. Bunların hiçbiri adres olmadan başlayamıyor. Hepsi davranışla tetikleniyor ve ziyaretçiyi getiren reklamın parası çoktan ödendikten uzun süre sonra bile kazandırmayı sürdürüyor.
Yüzde onun satın aldığı şey bu. İndirim, kalıcı bir iletişim hattının satın alma bedeli ve sizi getiren ücretli tıklamanın yanında ucuz kalıyor. Tetiklenen akışlar alıcı başına toplu bir bültenden çok daha fazla kazandırıyor ve terk edilen sepet dizisi hepsinin içinde en çok kazandıranı, dolayısıyla bir adresin değerini hesaplayan bir pazarlamacı tek bir e-postayı saymıyor. Yıllarca sürecek bir akışı sayıyor.
Zamanlamayı da bu açıklıyor. Popup, geldiğinizde, kaydırma derinliğinde ya da geri tuşuna yöneldiğinize dair ilk işarette tetikleniyor, çünkü adres vermeden ayrılan bir ziyaretçiye sonsuza dek ulaşılamıyor, adres veren bir ziyaretçi ise bir dizinin başlangıcı oluyor. Ziyaretçilerinin yüzde üçünden adres toplayan bir marka, diğer doksan yediyi rahatsız etmenin bedeline karşılık çok kârlı bir alışveriş yapıyor.
WebMCP bunların hiçbirine dokunmuyor. Değiştirdiği şey mekanizma. Bir sayfa kaydını bir fonksiyon olarak yayımlayabiliyor, ne yaptığını sade bir dille tarif edebiliyor ve ziyaretçi teklifi gerçekten istediğinde onun için çalışan AI ajanının bunu çağırmasına izin verebiliyor. Adres yine geliyor, indirim yine gönderiliyor ve okumayı hiçbir şey bölmüyor.
Okuyan kişi için ödülün tamamı bu. Soru, bugün bunun ne kadarının toplanabileceği ve dürüst yanıt: bir dilimi.
Ziyaretçi popup’ın kalkmasını nasıl deneyimliyor
İşte aynı teklif, iki farklı yolla toplanmış hâliyle. Solda bir ziyaretçinin bugün gördüğü şey var. Sağda ise sayfa kaydını asistanının yerine getirebileceği bir şey olarak yayımladığında aynı kişinin gördüğü şey.
Bugünkü popup
Bir örnekleme, canlı bir teklif değil. Okuma duruyor, ekran kapanıyor ve ziyaretçi ya bir adres yazıyor ya da kapatma düğmesini arıyor.
Aynı teklif, bir araç üzerinden
SizBeni WISLR.ai indirimine kaydet. E-postam [email protected].
Ajansubscribe_to_offer({ email: "[email protected]" })
SayfaOnay e-postası gönderildi. Kod, adres onaylandığında geliyor.
Hiçbir şey kapanmadı ve hiçbir şey yazılmadı. Adres, bir zamanlayıcı sormaya karar verdiği için değil ziyaretçi teklifi istediği için geliyor.
Aracı bu sayfada deneyin
Bu tarayıcının WebMCP'yi açıp açmadığı kontrol ediliyor.
Bu, bir asistanın kullanacağı aracın aynısı olan contact_wislr aracını çağırır ve mesaj gerçekten ekibimize ulaşır. E-postanızı ekleyin, yanıt alırsınız. Yanıtlamanın hiçbir yolu olmadığında aracın ne cevap verdiğini görmek için boş bırakın.
- 1. Sayfa bir araç sunuyor
- 2. Asistan onu şu argümanlarla çağırıyor
- 3. Sayfa mesajı tarayıcınızdan gönderiyor
- 4. Araç size değil asistana cevap veriyor
Ya da sayfayı bir asistana verin
ChatGPT ya da Claude'dan bu bağlantıyı açmasını isteyin, size aracı çağıramayacaklarını söyleyeceklerdir. Haklılar. Onların çekme işlemi bir sunucuda gerçekleşiyor, hiç JavaScript çalışmıyor ve okuyabilecekleri bir araç listesi hiç oluşturulmuyor. Ona yalnızca bir Chromium sayfasının içinde çalışan bir ajan ulaşabiliyor, ki bu bugün Chrome içindeki Gemini gibi bir şey demek.
Aracı çağıramayan bir asistan yine de var olduğunu doğrulayabilir. Bu sayfa araç açıklamasını düz JSON olarak taşıyor, dolayısıyla HTML'i çeken her ajan onu okuyabilir. Kendi asistanınızdan bu sayfadaki wislr-webmcp-tools bloğunu bulmasını ve listelediği aracı tarif etmesini isteyin.
Popup’ı gerçekte bitirecek olan şey trafikteki bir değişim
Markadaki bazı kişiler popup’ı tümden kaldırırdı. Kalmasının sebebi, insanları bölmenin e-posta adreslerini güvenilir biçimde toplayan tek yöntem olması ve bu bölmenin bedelinin, onu seçen ekibe değil ziyaretçiye çıkması. Küçük bir yüzdesi adres versin diye okuyan herkes daha kötü bir deneyim yaşıyor ve bu takas yaklaşık yirmi yıldır geçerli, çünkü başka hiçbir şey adresleri bu kadar iyi toplamadı.
Takas ancak ikinci bir yöntem aynı adresleri bölmeden toplamaya başladığında bozuluyor ve her seferinde bir ziyaret olarak bozuluyor.
Bir popup yalnızca ekrana bakan bir insan üzerinde işe yarıyor. Okumayı bir asistan yaptığında kaplanacak bir ekran ve zamanlanacak bir tereddüt olmuyor, dolayısıyla popup ne kadar iyi ayarlanmış olursa olsun o ziyaret hiç adres üretmiyor.
Aynı ziyaret yine de bir adres üretebilir. Asistanından indirimi isteyen biri, istediği anda ve bir isimle birlikte adresini gönüllü olarak veriyor. O adres daha temiz, arkasındaki niyet daha güçlü ve onu almak için hiçbir iyi niyet harcanmadı.
Bir pazarlama ekibi popup’ı kazandırdığı sürece tutar. Asistanlar üzerinden daha çok ziyaret geldikçe popup, küçülen bir kitleye küçülen bir getiri için tetikleniyor, yol açtığı rahatsızlık ise sabit kalıyor. Onu sayfaya koyan hesabın kendisi eninde sonunda onu sayfadan kaldırıyor.
Bunların hiçbiri bir spesifikasyonun denetlediği bir takvimle gelmiyor. Yeterince insan webi kendi adına okuyan bir şey üzerinden okumaya başladığında geliyor, ki bu bir standart sorusu değil bir trafik sorusu ve bugün kendi günlüklerinizde ölçülebiliyor.
Açıkça söylenmeye değer olan şey, varış noktasının iyi olduğu. Teklifin isteyen herkese açık, istemeyen herkese görünmez olduğu bir web, okuyucu için daha iyi ve marka için daha kötü değil. Bu nadir bir birleşim ve erişimin gelmesini beklemek yerine buna karşı erkenden inşa etmeye değmesinin sebebi de bu.
Apple’ın itirazı, bir sitenin bir ajanın sürdüğünü asla bilmemesi gerektiği
İki Apple mühendisi WebKit’in itirazını Haziran 2026 boyunca kamuya açık standart pozisyonları başlığında ortaya koydu ve pozisyon 11 Haziran’da karşı çıkma olarak sonuçlandırıldı. Altı gerekçe veriyorlar ve ilki bir ajanın ne olduğuna gidiyor.
WebKit’in pozisyonu, bir kullanıcı adına hareket eden bir ajanın “fiilen yardımcı teknoloji” olduğunu savunuyor: “bir siteyi kullanıcının işleteceği gibi işletmelidir ve site onu farklı muamele için ayırmamalıdır.” WebMCP bunun tersini yapıyor. “Bir ajan sürüyor” ifadesini gözlemlenebilir bir olguya çeviriyor ve bu ayrıca adreslenebilir olduğunda iki yüzeyi eşit tutan hiçbir şey kalmıyor. Bir site ajanlara kendi arayüzünden esirgediği yetenekleri verebilir ya da onları ajanlardan esirgeyebilir; bunu “ekran okuyucu engelleme sorununun AI ajanlarına uygulanmış hâli” olarak tarif ediyorlar.
Güvenilirlik vaadinden de kuşku duyuyorlar. Bir ajan bir aracı yine ismini ve açıklamasını okuyarak seçiyor; spesifikasyonun kendisi bunların belirsiz ve doğrulanamaz olduğunu kabul ediyor, “bir WebMCP aracının beyan edilen niyetinin gerçek davranışıyla eşleştiğine dair hiçbir garanti” yok. Tipli bir şema bir argümanın biçimini sabitliyor, ajanın çıkarsaması gereken anlamı değil, dolayısıyla onların okumasına göre kırılganlık ortadan kalkmıyor, sayfadan çıkıp araç açıklamalarına taşınıyor.
Gizlilik itirazı alışıldık olandan daha keskin. Bir site ihtiyacından fazla parametre isteyebilir ve yardımsever bir ajan bunları sitenin değil kullanıcının ajana söylediği şeylerden doldurur. Spesifikasyon bunu kendi metninde “kişiselleştirmeden parmak izine” giden bir boru hattı olarak adlandırıyor.
Bir değerlendiricinin bunların herhangi birine karar verebilmesi için gereken parçaların, aralarında kaynaklar arası güvenlik analizi ve rıza kancasının da olduğu, hâlâ yapılacak iş olarak işaretlendiğine ve makine öğrenmesi etrafında kurulmuş bir grubun, asıl yeri HTML ve erişilebilirlik semantiği olan değişiklikler için yanlış mecra olduğuna da işaret ediyorlar.
Belirttikleri değişmezlerden biri doğrudan bu makalenin konusunu gösteriyor: “Bazı kullanıcılar ajan kullanmayacak ya da kullanamayacak, dolayısıyla sonuç tüm kullanıcılara fayda sağlamalı ve ajanı olanlara ayrıcalık tanımamalıdır.”
Bunu yukarıdaki koddaki desenin yanına koyun. Popup’ı bastırmak, sayfanın bir ajanın hareket ettiğini öğrenmesine bağlı ve bu, tam olarak Apple’ın var olmaması gerektiğini savunduğu gözlemlenebilirlik. Daha önce anlatılan sessiz deneyim, ikinci bir motorun webin açığa vurmaması gerektiğini söylediği bir sinyalle satın alınıyor. İkisi de doğru olabilir ve bunun üzerine inşa eden herkes, yerleşmiş bir aracı eline aldığını değil bir taraf seçtiğini bilmeli.
Google’ın editörleri aynı başlıkta cevap verdi ve buyurgan API’yi kaldırmanın dışında WebKit’i neyin tatmin edeceğini sordu. Yanıt, her sorunun yaklaşımın sağlam olduğunu varsaydığı gerekçesiyle madde madde cevap vermeyecekleri oldu ve baştan başlamayı önerdiler: yeni bir topluluk grubu, herhangi bir çözümden önce tanımlanan bir problem ve Ekim 2026 sonunda TPAC etrafında bir çalıştay.
Hiçbir iPhone bunu çalıştıramaz, iPhone için Chrome dahil
Apple’ın pozisyonu yalnızca bir standart başlığındaki bir oy değil. Platformdaki her tarayıcı için özelliğin kaderini belirliyor.
Bugün iOS üzerinde yayımlanan her tarayıcı WebKit ile render ediyor. iPhone için Chrome, Google’ın arayüzünü giymiş Safari motoru ve aynısı Edge, Firefox ve geri kalanı için de geçerli. WebKit’in uygulamayı reddettiği bir özellik, dolayısıyla birisi hangi tarayıcı simgesine dokunursa dokunsun bir iPhone’da kullanılamıyor.
Bu yavaş yavaş değişebilir. Birleşik Krallık Rekabet ve Piyasalar Kurumu, Apple’ın motor zorunluluğunu Stratejik Piyasa Statüsü rejiminin ihlali saydı; uyum planı Haziran 2026’da teslim edilecek, değişikliklerin 2026 sonbaharında iOS 20 ile gelmesi ve Ocak 2027’de tam uyumun sağlanması bekleniyor. AB’nin Dijital Piyasalar Yasası 2024’ten beri alternatif motorlara izin veriyor. Pratikte ikisi de bir motor üretmiş değil: hiçbir tarayıcı üreticisi App Store üzerinden alternatif bir motor yayımlamadı ve hem Google’ın hem Mozilla’nın yayımlanmamış hâlde duran portları var.
Bir ecommerce markası için bu, herhangi bir spesifikasyon tarihinden daha çok önem taşıyan sayı, çünkü iPhone trafiği çoğu mağazanın büyük bir payı ve bugün bunun hiçbiri kaydedilmiş bir araca ulaşamıyor.
Denemek bir Chromium tarayıcısı gerektiriyor, ki çoğu ajan zaten onu kullanıyor
Okumayı yapan ajanlar zaten doğru motorda. Claude, Chrome içinde bir uzantı olarak çalışıyor, Gemini Chrome’un içine gömülü, Copilot Edge’de duruyor ve Perplexity’nin Comet’i kendi başına bir Chromium tarayıcısı. Masaüstünde ajanlı gezinme bugün ezici çoğunlukla Chromium, dolayısıyla motor nadiren engel oluyor.
İnsanların gözden kaçırdığı engel, sayfanızı okuyan her asistanın bir tarayıcı olmaması. Bir sohbet penceresinde ChatGPT’den ya da Claude’dan bir URL açmasını isteyin, çekme işlemi genellikle bir sunucuda gerçekleşir: HTML’iniz alınır, hiç JavaScript çalışmaz ve hiçbir araç listesi oluşturulmaz. O asistan sayfanızın her kelimesini okuyabilir ve üzerinde bir araç kaydedildiğinden yine de hiç haberi olmaz. Aracı yalnızca gerçek bir Chromium sayfasının içinde çalışan bir ajan görür, ki bu bugün Chrome içindeki Gemini gibi bir şey ya da keşfi kendisi uygulayan bir uzantı demek.
Asıl engel, özelliğin hâlâ kapılı olması ve kapıdan geçmenin iki yolu var.
Site, Chrome’un origin trial’ına kaydolur ve token’ı sunar. Bir üretim mağazasının izlediği yol bu ve üç adımdan oluşuyor.
Kaynağı developer.chrome.com/origintrials/#/register_trial/4163014905550602241 adresinde kaydedin; bu, WebMCP denemesi ve Chrome 149’dan Chrome 156’ya kadar sürüyor. Sayfalarınızı gerçekten sunan kaynağı, alt alan adı dahil olacak şekilde girin, çünkü example.com için verilen bir token www.example.com adresini kapsamıyor. Ana alan adınız www’ye yönlendiriyorsa www sunucusunu kaydedin ve alt alan adı eşleştirmesini atlayın, çünkü bir yönlendirme hiçbir zaman bir belge yüklemez ve dolayısıyla token’a hiç ihtiyaç duymaz.
Size verdiği token’ı, bir yanıt başlığı olarak ya da araç kaydeden her sayfanın head bölümünde bir meta etiketi olarak sunun:
<meta http-equiv="origin-trial" content="YOUR_TOKEN_HERE">
Yalnızca elinizde bir tane varken yayınlayın. Boş ya da süresi dolmuş bir token her sayfa yüklemesinde konsola hata yazıyor, o yüzden boş bir öznitelik yapıştırıp unutmak yerine etiketi koşullu hâle getirin.
Edge, kendi kaydı ve kendi token’ı olan ayrı bir deneme yürütüyor. Birine kaydolmak diğeri için hiçbir şey yapmıyor.
Ya da ziyaretçi bunu kendisi açar, Chrome’u --enable-blink-features=WebMCP ile başlatarak ya da chrome://flags içinde deneysel web platformu özelliklerini açarak. Bu bir müşterinin değil bir geliştiricinin yolu.
Bu sayfa ilk yolu izliyor. Bu sitedeki her sayfa bir WebMCP origin trial token’ı sunuyor, dolayısıyla Chrome 149 ile 156 arasında gelen bir ziyaretçi hiçbir şey açmadan document.modelContext alıyor ve yukarıdaki panel bunu söylüyor. O token 17 Kasım 2026’da sona eriyor; o noktada araç, deneme uzatılana ya da özellik yayımlanana kadar sıradan ziyaretçiler için susuyor ve form her zamanki gibi çalışmaya devam ediyor. Safari kullanan, iPhone üzerinde herhangi bir tarayıcı kullanan ya da o sürüm aralığının dışındaki bir Chrome kullanan herkes formu görüyor ve başka bir şey görmüyor.
Eski eğitimler çalışmayacak ve çoğunun tarihi yanlış
WebMCP bitmiş bir web standardı değil. Google ve Microsoft mühendislerinin editörlüğünü yaptığı bir taslak ve taslaklar, insanlar zaten üzerlerine inşa ederken değişiyor. Bu taslak da kodu bozan bir şekilde değişti.
Çağırdığınız isim taşındı. Eskiden navigator.modelContext idi, artık document.modelContext. Chrome bir süre iki ismi de kabul etti ve geliştiricileri konsolda uyardı, sonra Chrome 152’de eskisini kabul etmeyi bıraktı ve bu sürüm 25 Ağustos 2026’da herkese ulaştı. Eski yöntemle yazılmış kod yavaşlamıyor ya da bozulmuyor. Duruyor.
Bunu belirtiyoruz, çünkü yazılar bunun ne zaman olduğu konusunda anlaşamıyor. Birkaçı değişikliği Ağustos 2026’ya koyuyor. Projenin kendi geçmişi ise üç ay öncesine, Mayıs ayına koyuyor:
| Ne oldu | Ne zaman |
|---|---|
| Birisi taşınmasını önerdi | 28 Nisan 2026 |
| Spesifikasyonda yeniden adlandırıldı | 27 Mayıs 2026 |
| Chrome yeni ismi ekledi | 26 Mayıs 2026, Chrome 150 ile yayımlandı |
| Chrome eski ismi kaldırdı | 9 Temmuz 2026, Chrome 152 ile yayımlandı |
| Chrome’un o sürümü herkese ulaştı | 25 Ağustos 2026 |
document.modelContext kullanın. navigator uzanan bir eğitim, artık var olmayan bir şeye karşı yazılmış ve bir blog yazısındaki tarih, aynı tarihin projenin kendi commit geçmişinden gelen hâlinden daha az değerli.
Destek Chromium ve başka hiçbir şey değil. Chrome, Haziran 2026’da Chrome 156’ya kadar sürecek bir kamuya açık test açtı. Edge, Edge 150’den itibaren kendi testini yürütüyor ve Brave’de deneysel olarak var; ikisi de Chrome’un motoru üzerine kurulu. Apple 11 Haziran 2026’da öneriye resmen karşı çıktı. Mozilla taraf tutmadı ve bir prototipi açık tutuyor.
Bir araç, bir fonksiyon artı bir asistana onu ne zaman kullanacağını söyleyen kelimelerdir
Bir araç; bir isim, bir açıklama, bir JSON girdi şeması ve bir execute geri çağırması taşıyan bir sözlüktür. İsim, alt çizgi, tire ve nokta ile birlikte 1 ila 128 ASCII alfanümerik karakteri kabul eder. Güvenli bağlam koşulu, getTools ve executeTool dahil olmak üzere arayüzün tamamını kapsar ve erişim, varsayılan izin listesi 'self' olan tools adlı bir Permissions Policy özelliğiyle yönetilir.
Açıklama isimden daha çok ağırlık taşıyor. Bir ajan araçlar arasında açıklamaları okuyarak seçim yapıyor, dolayısıyla bir geliştirici değişiklik günlüğü için yazılmış bir açıklama, karar veren kişi için yazılmış olana kaybeder.
Kaydı bir araç olarak yazmak yaklaşık otuz satır sürüyor
Desenin iki yarısı var. Teklifi bir araç olarak kaydedin ve modala, teklif kabul edildikten sonra geri çekilmeyi öğretin.
const modelContext = document.modelContext || navigator.modelContext;
if (modelContext) {
modelContext.registerTool({
name: "subscribe_to_offer",
title: "Get the first-order discount code",
description:
"Starts a first-order discount signup by sending a confirmation email to an " +
"address. The code arrives only after the address is confirmed. Call this when " +
"the visitor asks for the discount or asks to join the mailing list.",
inputSchema: {
type: "object",
properties: {
email: {
type: "string",
format: "email",
description: "The address the visitor wants the code sent to."
}
},
required: ["email"]
},
annotations: { readOnlyHint: false },
execute: async ({ email }, { signal }) => {
const res = await fetch("/api/subscribe", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, source: "webmcp" }),
signal
});
if (!res.ok) {
return "The signup did not go through. The form near the foot of the page still works.";
}
// Silence the popup for the rest of this visit. Make it permanent from the
// server when the confirmation link is clicked, never from here.
try { sessionStorage.setItem("offer_asked", "1"); } catch (e) {}
return "Confirmation email sent. The code arrives once the address is confirmed.";
}
});
}
Popup, araç çalıştığı anda susuyor ve bütün bunları yapmanın asıl amacı bu.
Bayrak bilinçli olarak yalnızca o ziyaret boyunca sürüyor. Popup’ı, henüz kimse onay bağlantısına tıklamadan kalıcı olarak kapatmak, adresi hiç onaylanmamış bir ziyaretçiden kaydı tümden alıp götürür ve ona abone olmak için hiçbir yol bırakmaz. Ziyaret süresince popup’ı sayfadan susturun. Onaya tıklandığında kalıcı hâle getirmeyi sunucunuzdan yapın.
annotations: { readOnlyHint: false } ajana çağrının bir şey okumak yerine bir şey değiştirdiğini söylüyor. Bu zaten varsayılan ve açıkça yazmak, bir sonraki okuyucuyu, bir ajanın üzerine hareket edeceği metni döndüren her araç için önemli olan açıklama olan untrustedContentHint ifadesinden bir satır uzağa getiriyor.
signal, tarayıcının çalıştırdığı her araca verdiği bir iptal sinyali. Onu isteğe geçirmek, yarı yolda vazgeçen bir ajanın, artık istemeyen birisi için tamamlanan bir kayıt bırakmamasını sağlıyor.
Sayfaya bir ajanın onu izleyip izlemediğini sormanın hiçbir yolu yok. Spesifikasyon getTools, executeTool ve bir toolchange olayı sunuyor ve hiçbiri bu soruyu yanıtlamıyor. Kendi aracınızın çağrılması, elinize geçen tek güvenilir sinyal. Popup’ınızın zaten kontrol ettiği bayrağın aynısını yazın; birisi formu doldurduktan sonra tetiklenmeyi bıraktığı gibi o ziyaretçi için de bırakacaktır.
Bu sayfada çalışan sürüm
Bu site contact_wislr adında tek bir araç kaydediyor ve bu makale yayımlandığından beri yayında. Bu sitedeki iletişim formu çıkış niyetiyle tetiklenmek yerine bir tıklamayla açılıyor, dolayısıyla araç burada bir bölmeyi ortadan kaldırmıyor. Yazmayı ortadan kaldırıyor.
O uygulamadaki üç karar kopyalanmaya değer.
Şema, formun istediğinden fazlasını istiyor. Form, insanlara isimlerini ve e-postalarını eklemelerini hatırlatan bir yer tutucusu olan tek bir metin alanı. Mesajların birçoğu ikisi de olmadan geliyor ve yanıt adresi olmayan bir mesaj, cevaplanamayan bir müşteri adayı. Araç, mesajın yanında name, email ve website alanlarını adlandırılmış girdiler olarak beyan ediyor, böylece çağrıyı dolduran bir ajanın bunları koyacağı bariz bir yer oluyor.
Dönüş değeri ajana üzerine hareket edeceği bir şey veriyor. Execute geri çağırması herhangi bir şeye çözümlenebiliyor ve executeTool ajana okuduğu bir dizgi veriyor. Bir mesaj e-posta adresi olmadan geldiğinde bizimki bunu söylüyor ve ajandan bir tane toplayıp ikinci bir mesaj göndermesini istiyor. Yalnızca “gönderildi” diyen bir onay, çağrıyı ziyaretçi hâlâ oradayken düzeltmenin tek şansını harcıyor.
Ajan, formun gönderim bütçesini paylaşıyor. Form, sessionStorage içinde sayılan, gezinme oturumu başına üç mesaja izin veriyor. Araç aynı sayacı okuyup yazıyor, dolayısıyla aynı sayfada çalışan bir ajan ile bir ziyaretçi üçer değil aralarında üç mesaj alıyor. Bu, sayacı sayfa yüklenirken bir kez okuyup bir değişkende tutan formda bir değişiklik gerektirdi. Önbelleğe alınmış bir kopya her yüzeye kendi bütçesini veriyor ve hangisi en son yazarsa diğerini geri almasına izin veriyor, ki bu ancak ikinci bir yüzey var olduğunda ortaya çıkan türden bir hata.
Uç nokta, formun zaten istek gönderdiği uç noktanın kendisi. Adlandırılmış alanlar, istek çıkmadan önce mesaj gövdesinde birleştiriliyor, dolayısıyla mevcut işleyicinin onları okumak için hiçbir değişikliğe ihtiyacı olmadı ve yük, ajanın gönderdiği mesajların düzyazı ayrıştırmadan yazılanlardan ayrı sayılabilmesi için bir source alanı taşıyor.
Çalıştığını nasıl görürsünüz
Bu site deneme token’ını sunuyor, dolayısıyla hiçbir şeyi açmanız gerekmiyor. Buradaki herhangi bir sayfayı Chrome 149 ile 156 arasında açın ve bu makalenin başındaki panel tarayıcınızda aracın olup olmadığını size söylesin, ardından altındaki düğme onu gerçekten çağırsın.
Bunu kendiniz kontrol etmek için tarayıcıya kendisine hangi araçların sunulduğunu sorun:
const mc = document.modelContext || navigator.modelContext;
const tools = await mc.getTools();
console.log(tools.map(t => t.name));
// ["contact_wislr"]
Chrome 151’de iki isim de hâlâ çözümleniyordu, ki takma ad son sürümünde oradaydı. Chrome 152 ve sonrasında yalnızca document.modelContext yanıt veriyor.
Denemeye kaydolmamış bir sitede document.modelContext tanımsız oluyor ve bunların hiçbiri çalışmıyor. Chrome’u --enable-blink-features=WebMCP ile başlatmak API’yi yerel olarak açıyor, ki bir token var olmadan önce buna karşı geliştirmenin yolu bu.
Spesifikasyon ile uygulama arasındaki bir fark, size bir öğleden sonraya mal olmadan önce bilinmeye değer. IDL, executeTool fonksiyonunun ikinci argümanını bir nesne olarak tiplendiriyor ve bir nesne geçmek, hangi argüman ya da neden olduğunu söylemeyen UnknownError: Failed to parse input arguments hatasıyla başarısız oluyor. Chrome argümanları serileştirilmiş istiyor:
await mc.executeTool(tool, JSON.stringify({ message: "How do you measure AI referrals?" }));
getTools() de aynı şekilde yanıt veriyor. Döndürülen bir araçtaki inputSchema, kaydedilen nesne yerine bir JSON dizgisi olarak geliyor, dolayısıyla onu geri okuyan her şeyin önce ayrıştırması gerekiyor.
Aynı sayfada daha faydalı şeyler duruyor
Başlanacak yer kayıt, çünkü uç nokta, rıza akışı ve onay e-postası zaten var. Aynı zamanda sayfada açığa çıkarmaya değer en küçük şey.
Bir ziyaretçinin elle tamamladığı her etkileşim bir aday ve birkaç adım süren etkileşimler tek bir çağrıya indirgenmekten en çok kazananlar.
| Etkileşim | Bugün bir ziyaretçiye maliyeti | Kaydetmeye değer araç |
|---|---|---|
| Bülten ya da ilk sipariş teklifi | Sayfayı kaplayan bir modal | subscribe_to_offer |
| Site içi arama | Bir sorgu yazmak, sonra sonuçları yeniden sıralamak | Yapılandırılmış eşleşmeler döndüren search_products |
| Bir kategoriyi filtrelemek | Kırılımlar arasında dört beş tıklama | Beden, renk ve fiyat alan filter_products |
| Stok kontrolü | Her varyant için bir ürün sayfası yüklemek | SKU ve konum alan check_availability |
| Görüşme ayarlamak | Bir iframe içindeki takvim aracı | list_available_times ve book_time |
| Sipariş durumu | Giriş yapmak, sonra siparişi bulmak | Mevcut kimlik doğrulamanızın arkasındaki get_order_status |
Salt okunur araçlar başlamak için daha güvenli yer. Bir arama ya da stok aracına readOnlyHint: true koymak ajana çağrının hiçbir şeyi değiştirmediğini söylüyor ve bir hata, veritabanınıza yazılmış bir kayda değil boşa giden bir sorguya mal oluyor.
Kimlik doğrulamanın arkasındaki her şey kimlik doğrulamanın arkasında kalıyor. Kaydedilmiş bir araç sayfada, ziyaretçinin zaten sahip olduğu oturumla çalışıyor, dolayısıyla get_order_status tam olarak okuduğu hesap sayfası kadar korunuyor, daha fazlası değil.
Buradaki hiçbir şey popup’ın neden yapıldığını değiştirmiyor
Bir araç ancak birisi bir şey istedikten sonra çalışıyor. Asistanlarına indirimi almasını söylediler ve asistan bunu yapan fonksiyonu buldu. O kişi, onlara hangi yolu verirseniz verin adresini verecekti.
Popup ise tam tersi kişiyi hedefliyor. Hiçbir şeye karar vermemiş ve çıkışa yönelmiş, bir zamanlayıcının ya da geri tuşuna doğru hareket eden farenin yakaladığı birisi. Yerini, dönüşmeyecek olan insanları dönüştürerek hak ediyor ve bir ekibin onları elde etmek için diğer herkesi rahatsız etmeyi kabul etmesinin tek sebebi bu.
Popup’ı ajan trafiği için kapatmak dolayısıyla hiçbir şeye mal olmuyor, çünkü o ziyaretçiler zaten hiç hedefi değildi. Onu herkes için silmek ise yakalamak üzere kurulduğu adreslerden ve o adresler üzerinden yürüyen yıllarca sürecek e-postadan vazgeçmek demek.
Pazarlama ekipleri listenin ne kadar hızlı büyüdüğüne ve yaşam döngüsü e-postalarının ne kadar gelir getirdiğine göre ölçülüyor. WebMCP bu sayıların ikisini de kımıldatmıyor. İstekli bir ziyaretçiye daha temiz bir yol veriyor ve bölmenin sebebine dokunmuyor.
Gerisine destek karar veriyor. Yalnızca Chromium, Chrome 156’da biten testlerde ve Apple karşıda. Bir kayıt formunu bir araçla değiştirmek, neredeyse her ziyaretçinin kullandığı yolu, tek bir tarayıcının bir kesrinde çalışan bir yol karşılığında ortadan kaldırmak olurdu.
Şimdilik bu, fazladan bir giriş yolu. Asistanlar üzerinden daha çok ziyaret geldikçe popup daha seyrek tetiklenecek ve bir adres toplamak kendini finanse etmeyi bıraktığı gün tümden ortadan kalkacak. Hiçbir spesifikasyon o günü öne çekemez.
Açık bir kayıt formu, insanların posta altında kalmasının yoludur
Bir kayıt aracı, doğrulayamadığı bir e-posta adresini alıp ona posta gönderiyor. Bir ajanı yönlendirebilen herkes onu herhangi bir gelen kutusuna yöneltebilir. Formunuzda da aynı açık var, çünkü ikisinin de arkasındaki adres, bir betiğin sayfanızı hiç yüklemeden istek gönderebileceği herkese açık bir URL.
Saldırının bir adı var. Bir liste bombardımanında tek bir mağdurun adresi aynı anda yüzlerce ya da binlerce siteye, her birine bir istek olacak şekilde gönderiliyor. Her site tek ve sıradan bir kayıt görüyor ve hiçbir yerde bir şey yanlış görünmüyor. Mağdur bir saat içinde binlerce onay e-postası alıyor ve bu sel genellikle aynı gelen kutusuna ulaşan başka bir şeyin örtüsü oluyor: bankasından bir dolandırıcılık uyarısı, bir parola sıfırlama, birisinin kartıyla yaptığı bir alışverişin makbuzu. Gönderim itibarınız da darbe alıyor ve olan bitenin en küçük parçası bu.
Bu biçim, çoğu kişinin başvurduğu savunmayı boşa çıkarıyor. Bir hız sınırı istekleri sayıyor ve size tam olarak bir istek gönderen bir kampanyada sayacak hiçbir şey olmuyor.
Dört şey yardımcı oluyor.
Kaydın önüne bir doğrulama koyun, böylece otomatik bir gönderim, gerçek bir kişinin fark etmeden geçtiği bir şeyi geçmek zorunda kalsın.
Adrese göre yinelenenleri ayıklayın ve bir bastırma listesi tutun, böylece aynı gelen kutusu tekrar tekrar kaydedilemesin ve zaten bekleyen bir onayı olan bir adres için gelen ikinci bir istek hiçbir şey göndermesin.
İnsanları bir listeye eklemeden önce onaylamalarını isteyin, böylece kötüye kullanılan bir çağrı bir abonelik üretemesin. İnsanları yanıltan bir uyarı: Kanada’nın istenmeyen posta karşıtı yasası uyarınca bir onay e-postası kendi başına ticari bir mesaj sayılıyor, dolayısıyla hiç talep etmemiş bir adrese bunu göndermek koruma değil ihlalin kendisi oluyor. Alman mahkemeleri aynı soruda ikiye bölündü. Onay çoğu yerde doğru varsayılan ve evrensel değil.
Her kaydın nereden geldiğini, satır yazılırken kaydedin. Bunu bir olaydan sonra çıkarmak, hangi adreslerin gerçek olduğunu tahmin etmek demek.
Tıklamayı yazılım yaptığında rızayı kanıtlamak daha zor
Bir form gönderimi, ziyaretçinin ne gördüğüne dair bir kayıt üretiyor. Onay kutusu, yanındaki etiket, gizlilik bağlantısı ve zaman damgası sizin tarafınızda duruyor.
Bir araç çağrısı ise bir fonksiyon argümanı içinde bir e-posta adresi üretiyor. Ajan harekete geçmeden önce ziyaretçiye ne söylendiği, sizin erişiminiz olmayan bir konuşmada gerçekleşti. GDPR uyarınca rızanın özgürce verilmiş, belirli, bilgilendirilmiş ve açık olması gerekir ve bir veri sorumlusunun bunu sonradan ispatlayabilmesi gerekir. Bir ajan üzerinden gelen bir adres bunların hiçbirini tek başına karşılamıyor.
Çift onay burada da ağırlığın çoğunu taşıyor. Onay e-postası adresin kendisine gidiyor ve ona tıklamak, adına hareket eden bir şey tarafından değil abonenin kendisi tarafından yapılmış, zaman damgalı bir eylem üretiyor. Ajan aracılı kayıtları depolamada ayırt edilebilir tutun ki bir denetim, listenin tamamını tek bir kaynaktan gelmiş gibi görmek yerine onları form gönderimlerinden ayırabilsin.
Bu kayıtlar sessizce kayboluyor, o yüzden önce saymayı kurun
Kaydedilmiş bir aracı çağıran bir ajan, sayfanın içinde bir geri çağırma çalıştırıyor. Bir sayfa görüntülemesi yok, bir form gönderme olayı yok ve bir tarayıcı analitiği aracının kastettiği anlamda çoğu zaman hiç oturum yok. Dönüşüm gerçekleşiyor ve abone gerçek, rapor ise hiçbir şey göstermiyor. Bunu yanlış kurun, arıza sessiz oluyor: aboneler artıyor, hiçbir kaynak onları açıklamıyor ve arayüzde bozuk görünen hiçbir şey yok.
Bu, AI tarayıcılarını ve AI yönlendirmelerini tarayıcı analitiğinden gizleyen aynı yapısal boşluk, yeni bir katmanda ortaya çıkıyor. Bir tarayıcı botu kendisini raporlayacak JavaScript’i hiç çalıştırmıyor. Bir ajan JavaScript’i çalıştırıyor ve dönüşümü tamamlayan kısmı çalıştırırken onu ölçecek her kısmı atlıyor.
Abonelik uç noktanıza ulaşan istek, dönüşümün sizin sahip olduğunuz bir biçimde var olduğu tek yer. Onu orada, birinci taraf günlüklerinde etiketleyin ve kanal, gelecek çeyrek boyutlandırabileceğiniz bir şeye dönüşsün.
Kaybolmalarını önleyen dört şey
Kaynağı sunucuda, aboneyi oluşturan yazma işleminin içinde damgalayın. Sayfa istekle birlikte bir kaynak alanı gönderiyor, sunucu da onu satıra, adresin ve zaman damgasının yanına koyuyor. Bunu sonradan mesajın ifadesinden çıkarmak tahmin yürütmek olur ve yönlendiren sizi kurtarmaz, çünkü ajanlar sıklıkla hiç yönlendiren göndermiyor.
Kaydı, başarı işleyicisinin içinde değil ağ çağrısından önce raporlayın. Yarı yolda terk edilen ya da sunucu işi zaten yaptıktan sonra başarısız olan bir çağrı, başarı dalına hiç ulaşmıyor. Çıkarken raporlayın ve denemeyi sayın, ki aslında istediğiniz sayı da bu.
Olayı analitik aracınızda, aracı yayına almadan önce oluşturun. Özel olaylar çoğunlukla kabul edilip sonra, eşleşen isimde bir hedef var olana kadar her rapordan düşürülüyor, dolayısıyla kaydedilmemiş bir olay başarı kodu döndürüyor ve hiçbir yerde görünmüyor. Panodaki sessizlik hiçbir şeyin tetiklenmediğinin kanıtı değil ve baştan beri çalışan bir kodu ayıklayarak bir hafta harcamanın en kolay yolu bu.
Haftada bir kez, bilinçli olarak mutabakat yapın. Kendi verinizde ajan kaynağını taşıyan satırları sayın, sonra bunu analitiğinizin aynı günler için gösterdiğiyle karşılaştırın. Birbirini tutan iki sayı, borunun sağlam olduğu anlamına gelir. Bir fark, kör noktanızın büyüklüğüdür. Bir tarafta trafik, diğerinde sıfır olması olayın hiç ulaşmadığı anlamına gelir ve bunu artık çeyreğin sonunda değil bir hafta içinde biliyorsunuzdur.
Bu çeyrekte ne yapmalı
Tek bir araç kaydetmek bir öğleden sonra sürüyor. İnsanları uğruna zaten böldüğünüz teklifle başlayın, çünkü uç nokta, rıza akışı ve onay e-postası kurulu ve çalışıyor.
Formu koruyun. Ziyaret edenlerin neredeyse tamamı yine onu kullanacak ve Apple pozisyonunu koruduğu sürece bu böyle kalacak.
document.modelContext kullanın ve araca bayrağı açmış geliştiricilerin değil sıradan ziyaretçilerin ulaşmasını istiyorsanız Chrome denemesine kaydolun.
Araç yayına girmeden önce kayıt uç noktanıza kaynak alanını ekleyin. Bunu sonradan yapmak, veritabanınızdaki mevcut kayıtların hangilerinin bir ajandan geldiğini söyleyememek demek.
Sonuçları kendi sunucunuzdan okuyun. Bir analitik mülkü bu kayıtları size hiç göstermeyecek ve onlar sayılmadan geçerken içinde hiçbir şey bozuk görünmeyecek.
İzlemeye değer sayı bunların hiçbiri değil. Ziyaretlerinizin bir asistan üzerinden gelen payı, ki bunun ne zaman bir deney olmaktan çıkacağına o karar veriyor ve hiç araç kaydetmeseniz bile bunu bugün günlüklerinizden ölçebilirsiniz.