Özet: Her yeni SaaS çıktığında JARVIS için yeni bir MCP adapter yazmaktan yoruldum. Lucid, ekranı gören ve mouse ile klavyeyi insan gibi kullanan bir masaüstü AI ajanı. Bir kez gösteriyorum, sonra “Ahmet’e SEO için 12.000 TL fatura kes” dediğimde hatırlıyor ve yapıyor. Yakında MIT lisansıyla açık kaynak.
Her SaaS İçin Ayrı Bir Adapter Yazmaktan Yoruldum
Son iki yılda JARVIS’e 15 MCP sunucu, 320’den fazla araç bağladım. Gmail için mcp__google-workspace__sendGmailMessage, WhatsApp için WAHA, Binance için başka bir MCP, Figma için başka biri. Her yeni aracın dokümanını oku, auth akışını çöz, rate limit’lerini haritala, hata senaryolarına test yaz, sonra güncellemelerde tekrar kırılsın.
Bir süre sonra şunu fark ettim: aslında istediğim şey bir insan personelin yaptığı iş. Oturup uygulamayı açıyor, müşteriyi seçiyor, kalem ekliyor, tutarı yazıyor, kaydet’e basıyor. O insan programın API’sine bakmıyor. Ekrana bakıyor, mouse ile tıklıyor, klavye ile yazıyor.
O zaman bu işi yapan bir AI ajan neden olmasın?
Lucid tam olarak bu. Geçtiğimiz haftalarda geliştirdim ve şimdi günlük işlerimde kullanıyorum. Yakında MIT lisansıyla GitHub’a açacağım. Bu yazıda neyi neden yaptığımı, hangi kırıklara tosladığımı ve nasıl çözdüğümü anlatacağım.
“Personel” Metaforu ve 3 Mod
Lucid’i geliştirirken kafamdaki tek soru şuydu: ilk gününde bir stajyere nasıl iş öğretirdim? Omzunun üstünden bakardım, gösterirdim, sonra “bunu yap” derdim.
Lucid’de üç mod var:
- Answer: Ekranı görür, cevap verir. “Açık olan Excel’de A1 hücresinde ne yazıyor?” dersem bakar, söyler. Mouse’a dokunmaz.
- Teach: Kaydeder. “Şimdi sana fatura kesmeyi göstereceğim” derim, adımları atarım, Lucid izler ve anlamsal bir workflow çıkarır.
- Execute: Kontrolü alır. Mouse ve klavyeyi kullanarak işi yapar.
Ctrl+Shift+Kile her an durdurabilirim.
Üç mod da aynı beyinden (Claude) besleniyor. Aradaki fark, hangi araçların o modda açık olduğu ve prompt’un ne söylediği.
Pixel Tahmin Etme, Önce Kısayol Dene
İlk versiyonda klasik “computer use” yaklaşımını denedim: ekran görüntüsü al, modele gönder, “şu butona tıkla, koordinatları ver” de, tıkla. Tek bir açık pencerede iyi çalışıyordu. Üç açık pencere, iki monitör, %125 ölçeklendirme olunca tamamen çöktü.
Sorun şu: modele pixel koordinatı tahmin ettirmek bir kumar. Her seferinde doğru çıkacak diye bir garanti yok.
Bu yüzden Lucid’in sistem prompt’una şu kuralı gömdüm: “Pixel tahmin etme. Önce kısayol dene.” Uygulama açmak için Win+R, browser adres çubuğu için Ctrl+L, form gezmek için Tab, kaydetmek için Ctrl+S, yeni sekme için Ctrl+T. Sonuç: işlerin %80’i mouse’a dokunmadan bitiyor, %80 daha güvenilir.
Ama bazen kısayol yok. O zaman üç katmanlı bir fallback kuruyor:
click_element: Pixel tahmin etmek yerine Windows UI Automation ağacını geziyor. “Temizle ve onar” ya da “Kaydet” gibi etiketten butonu buluyor, sistem seviyesinde tıklıyor. Pencere kaydığında bile çalışıyor.focus_window: Alt+Tab karışıklığı yok. Pencere başlığı ile doğrudan odak alıyor (EnumWindows+SetForegroundWindow).file_dialog_paste: Open/Save dialog’larda klasör ağacıyla boğuşmak yok.Ctrl+Lile path yapıştır, Enter.
Sadece bunlar hiç çalışmazsa en son mouse koordinatına iniyor.
Küçük Gibi Görünen, Aslında Her Şeyi Bozan Bug’lar
İşin ilginç kısmı burada başlıyor. Lucid’i geliştirirken en çok başımı ağrıtan iki bug, computer use’u prodüksiyona alınca kesin çarpacağınız türdendi.
Türkçe Klavyede “/” Yerine “.” Yazılıyordu
Lucid ilk günlerde adres çubuğuna “https://ertugrulakben.com” yazmak istediğinde “https:..ertugrulakben.com” yazıyordu. Başta şaka sandım. Sonra pydirectinput‘un scan code ile doğrudan klavye interrupt gönderdiğini, Türkçe klavye layout’unda “/” karakterinin farklı bir scan code’a mapping’lendiğini fark ettim.
Çözüm: tüm type eylemlerini clipboard paste ile yapmak. Lucid ne yazacaksa panoya koyuyor, Ctrl+V ile yapıştırıyor. Her klavye layout’unda doğru çalışıyor, üstelik karakter karakter yazmaktan 10 kat daha hızlı.
%125 Ölçeklendirmede Tıklamalar Kayıyordu
Modern Windows laptop’larda ölçeklendirme varsayılan olarak %125 ya da %150. Ben ekran görüntüsünü mss kütüphanesiyle alıyordum, mss fiziksel pixel’de çalışıyor. Ama pyautogui tıklarken sanal pixel’de tıklıyor. Yani model “x=1000, y=500” dediğinde aslında x=800, y=400’e tıklanıyordu. Sistematik bir koordinat kayması.
Çözüm SetProcessDpiAwareness(2) ile process’i per-monitor DPI aware yapmak. Bir satır kod, saatlerce debug.
Bu iki bug’ı paylaşıyorum çünkü açık kaynak olunca kullanıcıların ilk gün tosladığı bug’lar bunlar olacak. Çoktan çözdüm, paket içinde geliyor.
Güvenlik: Destructive Action, Kill Switch, Retry Guard
Mouse ve klavye kontrolünü bir AI’ya vermek tehlikeli. Lucid’de üç güvenlik katmanı var:
- Destructive action onayı: “rm -rf”, “DROP TABLE”, “DELETE FROM”, password field’a yazma gibi tespitler yapılıyor. Her birinde Allow / Deny / Always-in-session modal çıkıyor.
- Kill switch (Ctrl+Shift+K): Her yerden çalışıyor. Lucid hangi eylemi yapıyorsa anında durur.
- Retry escalation: Aynı koordinata iki kez başarısız tıklarsa “retry-guard” uyarısıyla Claude’a “başka yaklaşım dene” der. Tek bir yerde sonsuza kadar takılıp kalmaz.
- Timeout: Her aksiyon maksimum 30 saniye. Aşarsa abort.
Bir de captcha_solver var: reCAPTCHA v2 checkbox ve Cloudflare Turnstile’ı çözebiliyor. Ama saatte 10 ile sınırlı ve kendi hesaplarımda kullandığım için açık. Mass bot kullanımı niyeti olan biri için tasarlanmadı.
Hafıza: Bir Kere Göstermek Yetiyor
Lucid’in belki en hoşuma giden kısmı memory sistemi. SQLite’ta facts diye bir tablo tutuyor. Başarılı her işten sonra kısa bir özet çıkarıp buraya yazıyor. Sonraki benzer işte Claude önce bu öğrendiklerine bakıyor, aynı hataya iki kere girmiyor.
Ayrıca dosya sistemi index’i var. “Geçen hafta açtığım rapor” gibi soruları yanıtlayabiliyor.
Ama asıl güç named workflows kısmında.
Teach modunda oturup Lucid’e şöyle diyorum:
“fatura_kes: Logo Go’ya gir, müşteri seç, kalem ekle, tutar yaz, kaydet.”
Adımları omzunun üstünden bana baktırıyormuş gibi atıyorum. Lucid UI Automation olaylarını kaydediyor, Claude semantik bir workflow çıkarıyor ve değişkenleri kendiliğinden tespit ediyor: musteri, urun, tutar.
Sonra günlük kullanımda:
“Ahmet’e SEO için 12.000 TL fatura kes.”
Lucid alias eşleşmesini buluyor (“fatura_kes”), parametreleri çıkarıyor (musteri=Ahmet, urun=SEO, tutar=12000), workflow’u replay ediyor. İlk kurulumdan sonra günde onlarca fatura aynı cümleyle kesiliyor.
Bu özelliği kurmaktaki hedefim başından beri şuydu: her tekrar eden iş, bir kere gösterdikten sonra cümle düzeyi komuta düşsün.
Kullanıcı Profili: Kodda Hardcode Yok
Lucid’in açık kaynak olabilmesi için bir şart koydum: kodun hiçbir yerinde benim özel bilgilerim olmayacak. Mail adresim, imzam, sık kullandığım klasörler, pinned app’ler, hepsi profile.yaml dosyasında. Kodda sadece “profile’dan oku” çağrıları var.
Kullanıcı indiriyor, profile.yaml‘ı kendi bilgileriyle dolduruyor, çalıştırıyor. İçinde “password”, “şifre” ya da “token” geçen notlar otomatik redakte ediliyor, Claude’a hiç gönderilmiyor.
Tüm veri .tools/Lucid/data/ klasöründe duruyor. APPDATA’ya sızıntı yok. Klasörü başka bilgisayara taşırsan Lucid de taşınır. Portable by design.
Felsefe: UI Son Çare, API Her Zaman Tercih
Buraya kadar okuduktan sonra şöyle düşünebilirsiniz: “Madem Lucid her şeyi insan gibi yapıyor, MCP’yi at gitsin.”
Bu yanlış olurdu. Lucid’in felsefesi şu: “UI only son çare.”
Gmail API varken Lucid’e Gmail arayüzünü açtırmak aptallık. mcp__google-workspace__sendGmailMessage milisaniyelerde, hatasız, auth’lu çalışıyor. Lucid’in aynı işi yapması 20-30 saniye, tıklama hatası riski var, rate limit yok ama ekran kilidine takılabilir.
Lucid’in parladığı noktalar şunlar:
- Resmi API’si olmayan uygulamalar: Özel admin paneli, iç CRM, bağımsız kurulum bir muhasebe programı. İnsan kullanabiliyorsa Lucid de kullanabilir.
- Dokümantasyon olmayan, auth’u ağır olan, API’si ücretli olan servisler.
- Uzun bir UI akışının otomasyonu. 15 tıklama gereken bir süreç varsa, insanın o 15 tıklamayı yapmasını Lucid’e yüklemek mantıklı.
Yani JARVIS’te Gmail hâlâ MCP ile gidiyor. Ama Logo Go, iç CRM’im, bazı bankacılık panelleri artık Lucid’e gidiyor. Doğru araç, doğru iş.
Teknik Özet
- Dil: Python 3.10+
- Platform: Windows 10/11
- Backend: Anthropic API (default) ya da Claude Code CLI. Claude Code aboneliği varsa Answer modu sıfır ek API maliyeti.
- Test: 78 test
- Lisans: MIT
- Bağımlılıklar:
uiautomation,pygetwindow,pyperclip,mss,anthropic - Veri: SQLite (memory), YAML (profile), dosyalar
.tools/Lucid/data/içinde
Yakında Açık Kaynak
Lucid’i iki hedefle geliştirdim: kendi işlerimi kolaylaştırmak ve başkalarının da kullanabileceği bir temel çıkarmak. Şu an ikincisi için son testleri yapıyorum.
GitHub’a açıldığında duyuracağım. Bu arada @ertugrulakben‘den ya da ertugrulakben.com‘dan takipte kalın. JARVIS, HYRVE AI ve CashClaw’a dair diğer içeriklerden de haberdar olun.
MCP’siz, API’siz, insan gibi çalışan bir masaüstü AI ajanı fikri ne kadar işine yarar, yorum kısmında söyleyin. Kendi akışınızda en çok neyi otomatikleştirmek isterdiniz, onu merak ediyorum.