← notlar

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:

SunucuErişimKullanım
pricoda_prodRW (tek müşteri, kendi ürünüm)pricoda prod sorguları
pricoda_localRWlocal Docker dev
pricoda_global_prodread-only (pricoda_global_agent user)multi-tenant prod, risk yüksek
pricoda_global_localRWlocal 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/health durumunu 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.