2026-04-21
MCP sunucularını dev akışıma gömmek
Son birkaç ayda en çok verim aldığım değişiklik: Claude Code'a MCP (Model Context Protocol) sunucuları üzerinden prod/local veritabanına, Jenkins'e ve log infrastructure'ına scoped erişim verdim. Önceden "bir dakika, bakıp geleyim" dediğim işler artık konuşmanın içinde çözülüyor.
MCP nedir, kısaca
MCP, LLM'e dış sistem vermenin standardı. Sen bir "sunucu" yazıyorsun (veya hazır bir tane kuruyorsun), o sunucu belirli tool'lar expose ediyor, LLM de konuşmanın içinde o tool'u çağırabiliyor. Benim için önemli olan kısım şu: tool'un yetkisini sen belirliyorsun. Read-only DB user verebiliyorsun, belirli Jenkins folder'ına erişim verebiliyorsun.
Yani "Claude'a prod veritabanı şifresini ver" değil. "Claude'un SELECT'e izni olan, DML'siz bir user'ı var, onunla konuşuyor" diyorsun.
Benim setup
.claude/settings.local.json içinde dört PostgreSQL sunucusu var:
| Sunucu | Erişim | Kullanım |
|---|---|---|
pricoda_prod | RW (tek müşteri, kendi ürünüm) | pricoda prod sorguları |
pricoda_local | RW | local Docker dev |
pricoda_global_prod | read-only (pricoda_global_agent user) | multi-tenant prod, risk yüksek |
pricoda_global_local | RW | local dev |
Prod multi-tenant DB için ayrı bir RO user yarattım. GRANT SELECT only, DML yok. Claude yanlış sorgu önerse bile DB'ye zarar veremiyor. Bu benim için olmazsa olmaz; prod'a RW erişim vermek istemiyorum, istesem de.
Ne için kullanıyorum
DBA-lite sorular
Eskiden: IDE'de DataGrip aç, connection seç, tablo bul, query yaz, çalıştır, sonucu yorumla.
Şimdi:
"pricoda-global prod'da son 24 saatte kaç scheduled_search_run tetiklenmiş, kaçı başarısız?"
Claude sorguyu kendi yazıyor, çalıştırıyor, sonucu özetliyor. Yanlış tablo adı hatırlarsam düzeltiyor. 30 saniyelik iş 5 saniyeye düşüyor.
Deploy doğrulama
Blue/green deploy sonrası:
"son deploy'dan sonra
/actuator/healthdurumunu prod container'da kontrol et, ayrıca son 50 log satırına bak"
SSH tool'u ile container'a bakıyor, health endpoint'i çağırıyor, log'lardan ERROR'ları filtreliyor. Önce bakıp "iyi görünüyor" diyor, sonra bir anomali varsa flag ediyor.
Incident triage
Kullanıcı "bir arama takıldı" dediğinde:
"search_job ID 42891, full lifecycle'ını çıkar: event'ler, status geçişleri, fail sebebi"
Birden fazla tabloyu join'liyor (search_job, raw_search_result, fetch_metric), timeline çıkarıyor. Ben sadece okuyup yorumluyorum.
Kurarken öğrendiğim şeyler
Prod'a RO kullanıcı şart
İlk kurulumda herşeyi RW verdim, "aa güvenirim, ben kontrol ederim" dedim. İki gün sonra farkettim Claude bir sorgu önerdi ve ben Yes, and don't ask again bastım. DELETE olsaydı geri dönüşü yoktu. O günden sonra prod'lar RO user ile açılıyor. Local istediği kadar RW olsun.
Scoped MCP, global MCP'den iyi
MCP config'ini iki yere koyabiliyorsun:
~/.claude/settings.json: her projede aktif (global)..claude/settings.local.json: sadece o workspace (project-scoped).
Ben tamamen project-scoped tutuyorum. pricoda workspace'inde pricoda DB'leri görünsün, başka bir projede çalışırken bunlar görünmesin. Farklı context'ler birbirine karışmasın.
Connection string'i git'e koyma
.claude/settings.local.json .gitignore'da olmalı. Örnek ve şablon için .claude/settings.example.json bırakıyorum ama gerçek config'i asla commit'lemiyorum. Şifre görünmese bile DB host'u + kullanıcı adı bile ifşa olur.
Query sonucunu da filtrele
MCP sunucusu row limit koyuyor (default 1000 satır). Büyük tablolara SELECT * attırırsan context'i 50K token'la doldurursun. Claude'a "her zaman LIMIT koy, gerekirse saydır önce" dediğimde bu da çözüldü.
Sonuç
MCP'yi "bir asistan" olarak değil, "scoped çalışan bir junior DBA + ops mühendisi" olarak düşünmek oturdu. RW yetkisi olmayan, prod'da sorgu atabilen, Jenkins API'yi çağırabilen, log'ları okuyabilen biri. Ben sorumu soruyorum, sonucu okuyorum, kararı ben veriyorum.
Bu kadar verim alacağımı beklemiyordum. Şu an en büyük engel: henüz log infra'sı tam MCP'leşmedi (şimdilik SSH + docker logs tool'u ile). Loki veya benzeri bir şey kurunca o da direk query'lenebilir hale gelecek.