· kaynak dev.to (home feed)
Chrome uzantısı, Claude Code'un bir sitenin WebMCP araçlarını uzaktan çağırmasını sağlıyor
AgentRQ'nun dev.to'daki yazısına göre bir Chrome uzantısı, sayfanın WebMCP araçlarını Claude Code gibi dış MCP ajanlarına açıyor; böylece bu ajanlar çağrıları oturum açık olan tarayıcı sekmenizde çalıştırabiliyor, yazma işlemleri ise insan onayı bekliyor.

Uzantı ne yapıyor
WebMCP, bir sayfanın document.modelContext üzerine araçlar kaydederek bunları yapay zekâ ajanlarına sunmasını sağlayan genç bir tarayıcı standardı; her aracın bir adı, bir açıklaması ve girdisi için bir JSON Schema'sı var. Araç ekibinin dev.to'daki yazısına göre bu tasarım açık bir sınır bırakıyor: araçlar sayfanın JavaScript'inde yaşadığı için yalnızca aynı sekmede çalışan bir ajan onlara erişebiliyor. Bir Claude Code terminal oturumu, bir build makinesindeki ajan veya başka bir yerde cron ile uyandırılan bir işin erişimi yok.
AgentRQ'nun anlattığı Chrome uzantısı bu boşluğu kapatıyor. Bir siteyi uzantının popup'ı üzerinden bir workspace ile paylaşın, herhangi bir MCP istemcisi — Claude Code, Codex veya başka bir ajan — o sitenin araçlarını her yerden keşfedip çağırabiliyor. Çağrı yine oturum açık sekmenizin içinde çalışıyor ve durumu değiştiren her şey onayınızı bekliyor. Aynı popup, bağlı her makinedeki bağlantılı her ajanın canlı terminalini gösteriyor.
Taklit etmeden gözlemlemek
Belirgin yaklaşım — bir modelContext nesnesi enjekte edip sayfanın içine ne koyduğunu izlemek — yazıya göre reddedilmiş; çünkü o zaman uzantı hangi sayfaların WebMCP alacağına karar vermiş olur ve API'yi feature-detect eden bir sayfa Chrome yerine uzantıyı algılardı. Bunun yerine küçük bir observer script, document start anında sayfanın kendi JavaScript dünyasında çalışıyor ve tarayıcının yerleşik registerTool'unu sarmalayarak kaydedilenleri kayda geçirirken çağrıların Chrome'a geçmesine izin veriyor. Tarayıcıda modelContext yoksa observer etkisiz kalıyor.
Üç uç durum önemliydi: sayfalar bir AbortSignal ile araçları geri çekebiliyor ve devam eden çağrılar o zaman askıda kalmak yerine net bir hatayla başarısız oluyor; bir adı yeniden kaydetmek eski aracın yerine geçiyor; ve JSON serileştirmesinden sağlam çıkamayan tanımlayıcılar düşürülüyor, çünkü bunlar zaten uzak bir ajana asla tanımlanamazdı.
Content-script sınırını güvenli biçimde aşmak
Content script'ler iki dünyada çalışır: main world sayfa ile JavaScript paylaşır ama uzantı API'lerini kullanamaz; isolated world kullanabilir ama sayfa nesnelerini göremez. Bu yüzden tasarım, sayfanın da gözlemleyebildiği DOM üzerinden konuşan iki script gerektiriyor. Sabit bir event adı, herhangi bir sayfanın çağrıları dinlemesine ya da sonuç sahtelemesine izin verirdi. Bunun yerine isolated-world bridge rastgele bir UUID üretiyor, html elementine bir data attribute olarak bırakıyor ve observer, sayfa script'leri çalışmadan önce onu okuyup siliyor. Her mesaj, event türü o nonce olan bir CustomEvent olarak gidip geliyor; böylece sayfa abone olamıyor veya sahteleme yapamıyor. Observer ayrıca sonradan patch'lenmeye direnmek için başlangıçta dispatchEvent, CustomEvent ve JSON referanslarını önbelleğe alıyor. Ekibin karşılaştığı ince bir pürüz: Chrome, document-start script'lerini kayıt sırasına değil kayıt ID'sine göre sıralıyor, dolayısıyla bridge'in ID'si observer'ınkinden önce gelmek zorunda.
NAT arkasındaki tarayıcıya ulaşmak
Bir sunucu NAT arkasındaki tarayıcıya ulaşamaz; bu yüzden tarayıcı dışarı arıyor: uzantının Manifest V3 service worker'ı AgentRQ sunucusuna bir WebSocket açıyor. Yazıya göre bu üç sorun doğurdu. Service-worker socket'leri çerez taşımıyor; bu, önce normal oturum çereziyle bir dakikalık bir ticket alınarak çözüldü. Chrome boşta kalan worker'ları öldürüyor ve sunucu ping'leri trafik sayılmıyor; bu yüzden worker kendisi her 20 saniyede bir ping atıyor. Socket yalnızca en az bir site paylaşılıyorken açık ve bir ile otuz saniye arasında backoff ile yeniden bağlanıyor.
Sekmeler, gezinme ve token bütçeleri
Worker her çağrıyı, o origin'de aracı sunan en son kullanılan sekmeye yönlendiriyor; hepsini kapattıysanız siteyi arka planda bir sekmede yeniden açıyor. Çağrılar sekme başına değil document başına izleniyor, çünkü siteler arası bir gezinmeden sonra yeni sayfa, eski sayfanın unload event'i gelmeden araçlarını duyurabiliyor. Back/forward önbelleği sayfaları script'leri yeniden çalıştırmadan geri yüklüyor; bu yüzden bridge, kalıcı bir pageshow'da kayıtlı araç listesini yeniden duyuruyor.
Ajanın context window'unu korumak için MCP yüzeyi şöyle bölünmüş: listSiteTools (yalnızca adlar ve açıklamalar), getSiteToolDefinition (istek üzerine tek bir tam şema) ve callSiteTool. Sunucu, tarayıcıya herhangi bir şey ulaşmadan önce argümanları sayfanın kendi şemasına göre doğruluyor; böylece hatalı biçimli çağrılar hızla başarısız oluyor; çağrıların 60 saniyelik bir son teslim tarihi var ve sonuçlar 256 KiB ile sınırlı.
Neden önemli
Güvenlik modeli en ilginç kısım. Uzak ajan sizin oturumunuzla hareket ediyor ama hiçbir şifre, çerez veya API token görmüyor — siteye göre o, sadece sizin sekmenizde sitenin sunmayı seçtiği bir aracı kullanan sizsiniz. Salt-okunur araçlar otomatik çalışıyor, geri kalan her şey önce soruyor; site ve araç başına "her zaman izin ver" seçenekleri var ve her yazma görünür bir taskId'ye bağlı. Yalnızca bir insan site paylaşabilir ve detection varsayılan olarak kapalı. Daha geniş açıdan bu, tarayıcıya açılan yapay zekâ araçlarının yönünü çiziyor: web siteleri yalnızca sekme içi asistanlar için değil, terminallerde ve sunucularda gerçek işler yapan ajanlar için de araç sağlayıcısı oluyor; tarayıcı ise kimlik doğrulamış, kullanıcı gözetimindeki yürütme ortamı olarak iş görüyor. Hesap birinci ağızdan ve uzantının yapımcıları tarafından kendileri tarafından aktarıldığı için mühendislik iddiaları bağımsız doğrulamayı bekliyor; ama mimari, WebMCP'ye uzaktan erişim için inandırıcı bir şema çiziyor.
- #mcp
- #webmcp
- #chrome-extension
- #claude-code
- #ai-agents
- #browser