Claude bir işletmenin sitesini nasıl yönetiyor: Marcapony MCP sunucusunun içi
Claude gibi AI istemcileri Marcapony'de sayfa açıyor, bölüm yazıyor, ürün güncelliyor. MCP sunucusunu nasıl kurduğumuzu ve yol boyunca verdiğimiz kararları anlatıyoruz.
Marcapony'de bir işletme sitesini, ürünlerini ve blogunu panelden yönetir. Bir süredir aynı işi Claude gibi AI istemcileri de yapabiliyor: sayfa açıyor, bölüm yazıyor, ürün güncelliyor, blog taslağı hazırlıyor. Bunu Marcapony'nin MCP (Model Context Protocol) sunucusu üzerinden yapıyorlar. Bu yazıda sunucuyu nasıl kurduğumuzu ve yol boyunca verdiğimiz kararları anlatıyoruz.
Neden MCP?
Panelin içinde kendi asistanımız Marco var. Ama işletmelerin ve ajansların önemli bir kısmı zaten Claude Desktop ya da Claude Code kullanıyor. Onları kendi arayüzümüze çekmek yerine, platformu onların kullandığı istemciye taşımak istedik. MCP tam olarak bunu sağlıyor: istemci bir kez bağlanıyor, hangi araçların olduğunu kendisi keşfediyor ve gerektiğinde çağırıyor.
İnce bir katman, kalın bir API
MCP sunucusu bir Cloudflare Worker. Kendi verisi ve kendi iş kuralı yok. Her araç, API'mizin MCP için ayrılmış RPC giriş noktasına yapılan tek bir çağrıdan ibaret. İki Worker arasındaki bağlantı bir service binding, yani istek genel internete hiç çıkmıyor.
Bu ayrımı bilerek koruyoruz. Doğrulama, yetkilendirme ve kayıt API'de yaşıyor. Panel, Marco ve MCP aynı kuralları paylaşıyor. Bir kuralı tek yerde değiştirdiğimizde üç yüzey birden doğru davranıyor. MCP oturumları Durable Object'lerde tutuluyor. İstemciler Streamable HTTP ile ya da eski SSE ile bağlanabiliyor.
Kimlik doğrulama ve kiracı izolasyonu
İstemci, panelden oluşturulan bir API anahtarıyla bağlanıyor. Anahtarları düz metin olarak saklamıyoruz. Her biri kendi tuzuyla PBKDF2-SHA-256 üzerinden hash'leniyor. OAuth akışı da aynı anahtarın üzerinde ince bir katman. Claude Desktop gibi OAuth isteyen istemciler o yoldan, anahtarı doğrudan veren istemciler başlık üzerinden geliyor.
En önemli kural şu: hangi hesapta çalışıldığını anahtar belirler, araç parametresi belirlemez. Hiçbir araç hesap kimliği almıyor. Hesap, doğrulanmış anahtardan çıkarılıp çağrı bağlamına yazılıyor. Bir araç bir gün hesap parametresi kabul etseydi, bu bir kiracıdan ötekine açılan bir kapı olurdu.
Okuma işlemleri serbest, yazma işlemleri kayıt altında. Her değişiklik, değişiklik kaydına kaynağı "mcp" olarak ve hangi anahtarla yapıldığı bilgisiyle düşüyor. Değişikliği bir insan da yapsa bir AI istemcisi de yapsa, nereden geldiği kayıtlı kalıyor.
Asıl ürün: araç açıklamaları
Sunucu bugün yaklaşık 100 araç sunuyor: sayfalar, bölümler, özel kod bölümleri, navbar ve footer, ürünler ve varyasyonlar, blog, medya araması, teklifler, SEO denetimi ve daha fazlası.
Bu kadar araçla en çok emek verdiğimiz şey kod değil, açıklamalar oldu. Model bir aracı yalnızca açıklamasından öğreniyor. Açıklama, aslında bir prompt. Yanlış ya da eskimiş bir açıklama, o aracı kullanan her istemciyi aynı anda yanlış yönlendiriyor. Bu yüzden açıklamalara kod kadar dikkatle bakıyoruz: hangi alanın zorunlu olduğu, hangi değerin nereden alınacağı, en sık yapılan hatalar.
Özel kod bölümleri bunun en uç örneği. Claude, sitenin içine React ve Tailwind ile bileşen yazabiliyor. Bunun kuralları (import yok, ilk render sunucuda yapılıyor, metinler düzenlenebilir girdi olarak tanımlanıyor) hem aracın açıklamasında hem de ayrı bir yazım kılavuzu aracında duruyor. Model ilk bileşeninden önce kılavuzu okuyor.
Her şey taslak
MCP üzerinden yapılan düzenlemeler canlı siteye gitmiyor. Sayfa ve bölüm değişiklikleri taslak olarak kaydediliyor, yayın kararını panelde bir insan veriyor. Tek istisna blog yazıları: bir yazıyı yayınlamak bilinçli olarak MCP'ye açık. Navbar ve footer gibi site genelindeki düzenler ise kaydedildiği anda devreye giriyor. Araç açıklaması bunu açıkça söylüyor, böylece model kullanıcıyı önceden uyarabiliyor.
Büyük bir bileşeni güvenle düzenlemek
İlk sürümde bir özel kod bölümünde tek bir rengi değiştirmek için bileşenin tamamını yeniden göndermek gerekiyordu. Bu hem pahalıydı hem de riskliydi: model, arada panelden yapılmış bir değişikliği farkında olmadan ezebiliyordu.
Şimdi düzenleme "bul ve değiştir" parçalarıyla yapılıyor. Her parça mevcut kaynakta tam olarak bir kez geçmek zorunda. Model, okuduğu sürümün hash'ini de gönderiyor. Bölüm o arada değiştiyse istek reddediliyor ve hiçbir şey yazılmıyor. Bir çağrıdaki parçalar ya hep birlikte uygulanıyor ya da hiçbiri uygulanmıyor.
Model kendi işine bakabiliyor
Kod yazan bir modelin en büyük eksiği, yazdığını görememesi. Bunun için bir önizleme aracı ekledik. Araç, bölümü kiracı sitesinin render ettiği şekilde, temanın renkleri ve boşluklarıyla birlikte render edip PNG olarak döndürüyor. Masaüstü ve mobil genişlikte bakılabiliyor. Model iki kat boşluk, taşan bir başlık ya da yanlış bir renk gördüğünde kendisi düzeltiyor.
Uzun kuyruk için iki araç
Platformda her işlem için ayrı bir araç tanımlamak, araç listesini istemcinin taşıyamayacağı kadar büyütürdü. Bu yüzden sık kullanılan işler kendi araçlarına sahip. Geri kalanlar ise iki araçtan geçiyor: biri hangi işlemlerin olduğunu listeliyor, diğeri seçilen işlemi çağırıyor. Silme ve iptal gibi geri dönüşü olmayan işlemleri bu yüzeye bilerek koymadık.
Kullanıcıyı hatırlamak
Kullanıcı "her zaman siz diye hitap et" ya da "başlıklarda emoji kullanma" gibi bir tercih belirttiğinde, bu tercih kaydediliyor. Aynı hafıza hem panel içindeki Marco hem de MCP istemcileri tarafından okunuyor. Böylece kullanıcı aynı şeyi iki yerde tekrar etmek zorunda kalmıyor.
Bu sayfa da böyle yapıldı
creafolks.com'daki Marcapony bölümü ve bu blogun liste ve yazı şablonları, bu sunucu üzerinden Claude ile hazırlandı ve yayından önce ekibimiz tarafından kontrol edildi. Sırada, bu deneyimi tek tıkla kurulabilen bir Claude eklentisine dönüştürmek var. İlk kapsam özel kod bölümleri.