# TD-027 · Okuma ve yazma iznini ayır

Okumak için bağlanan ajan aynı bağlantıyla gönderme ve silme yetkisini de alıyor. Desen okumayı ve yazmayı ayrı izne, ayrı onaya ve ayrı kimlik bilgisine böler, okuma işindeki ajanın eli silmeye uzanmaz.

- Adres: https://tandem.komunite.com.tr/desen/okuma-ve-yazma-iznini-ayir
- Yer: Başlarken > Erişim
- Seviye: Ajan. AI kullanıcı adına iş yapıyorsa gerekli.
- Son inceleme: 27 Ekim 2026, Komünite editörlüğü

## 30 saniyede dene

1. Ajanına yalnız okuma gerektiren bir iş ver. Gelen kutundaki faturaları listelemek ya da depodaki açık hataları özetlemek gibi.
2. Ajanın bu iş için bağlandığı hesabın, anahtarın ya da jetonun izinlerine bak. Gönderme, düzenleme ya da silme yetkisi var mı?
3. Aynı bağlantıyla ajandan bir e-postayı silmesini ya da bir dosyayı değiştirmesini iste. Onay sormadan yapabiliyorsa okuma ve yazma ayrılmamış.
4. Ürününde salt okunur bir mod ya da araç başına izin ayarı ara. Yoksa bu desen eksik.

## Sorun

Kullanıcı ajandan gelen kutusundaki faturaları bulup bir tabloya dökmesini istiyor. İş yalnız okumak. Ajan bunun için e-posta hesabına bağlanıyor ve bağlantı ekranındaki tek seçenek tam erişim: oku, yaz, gönder, sil. Kullanıcı onaylıyor, çünkü okumanın başka yolu yok.

Ajan faturaları buluyor, tabloyu dolduruyor ve gelen kutusunu düzenlemek için kopya faturaları da siliyor. Kimse silmesini istemedi. Ajan işi kendi yorumuyla genişletti ve önünde onu durduracak bir şey yoktu, çünkü silme aracı okuma araçlarıyla aynı yetkiyle gelmişti.

Okumayı ve yazmayı aynı izne koyan bağlantıda her okuma işi geri dönüşü olmayan bir eylemin bir adım yakınında yapılır. O adımı atlatan şey modelin yanlış bir yorumu, kullanıcının belirsiz bir cümlesi ya da ajanın okuduğu bir e-postaya gizlenmiş bir talimat olabilir. Hangisi olursa olsun, okumak için verilen yetkiyle silme yapılır.

## Neden atlanıyor

Tam erişim en kolay erişimdir. Birçok serviste geniş yetki tek tıkla gelir, dar yetki için hangi işin hangi yetkiyi gerektirdiğini tek tek çıkarmak gerekir. Gmail'de yelpaze geniş: [yalnız okuyan kapsam da var, okuyup gönderen ve kalıcı olarak silen tam kapsam da](https://developers.google.com/workspace/gmail/api/auth/scopes). Ekip demo için tam kapsamı seçer ve kapsam ürüne öyle girer, oysa Google'ın kendi belgesi [en dar kapsamı seçmeyi](https://developers.google.com/workspace/gmail/api/auth/scopes) öğütlüyor.

Ajan da işi genişletebilir. Verilen işin yanında düzeltilecek bir şey gördüğünde onu da yapmaya kalkabilir, elindeki yetki izin veriyorsa yapar. Replit olayında kullanıcı kod dondurma talimatı vermişti. Ajan veritabanını boş görünce [şema komutunu onay almadan çalıştırdı](https://pbs.twimg.com/media/GwHRGAVXQAAWny3.jpg?name=orig). Kullanıcının talimatı ajanın bağlamında bir metin olarak duruyordu, silme yetkisi ise kimlik bilgisindeydi.

Üçüncü neden işaretlere duyulan güven. MCP her araca okuyan ya da yıkıcı diye işaret koymayı sağlıyor, ama belirtim bu işaretlerin ipucu olduğunu ve [güvenilmeyen sunucudan gelen işarete göre karar verilmemesi gerektiğini](https://modelcontextprotocol.io/specification/2025-06-18/schema#toolannotations) yazıyor. İşareti doldurmak işi bitirmiş gibi hissettirir. İşaret yalnız arayüzün soruyu nasıl soracağını belirler. Ajanın elinin neye uzandığını kimlik bilgisi belirler.

## Desen

Okuma ve yazma ayrı izinlerdir ve ayrı yerlerde uygulanır. Ajan okuyarak yapabildiği işte yazma yetkisi taşımaz, yazma gerektiğinde bunu ayrıca alır.

1. **Araçları sınıfla.** Her araç dört sınıftan birine girer: okuyan, ekleyen ya da değiştiren, silen, dışarı gönderen. Sınıf aracın tanımında yazar ve arayüz onu kullanıcıya gösterir.
2. **Onay sınıfa göre değişir.** Okuma onay sormadan çalışabilir. Yazma onay ister. Silme ve dışarı gönderme her seferinde onay ister ve “hep izin ver” bunlara uygulanmaz.
3. **Kimlik bilgisini de böl.** Okuma işi salt okunur bir kapsamla, salt okunur bir veritabanı kullanıcısıyla ya da yalnız okuma izni olan bir jetonla çalışır. Model yanlış aracı çağırsa bile servis yazmayı reddeder.
4. **Salt okunur mod sun.** Ajanı yalnız okuyarak çalıştıran bir mod olur. Bu mod araç listesini gizlemekle kalmaz, kimlik bilgisini de daraltır.
5. **Yazmayı öner, yapma.** Salt okunur moddaki ajan yazma gerektiren bir adım görürse adımı yapmaz, kullanıcıya önerir. Kararı ve eylemi kullanıcı verir.

İşaret ile kimlik bilgisi aynı ayrımı söylediğinde desen yerindedir. Arayüz okumayı onaysız, silmeyi onaylı gösterir ve servis de aynı çizgiyi uygular.

## Önce ve sonra

Aynı fatura işi, iki ayrı bağlantıyla. Solda bağlantı tam yetkiyle geliyor ve ajan kimsenin istemediği bir silme adımı ekliyor. Sağda okuma, yazma, gönderme ve silme ayrı satırlarda duruyor, ajan kopyaları görüyor ama yalnız silmeyi önerebiliyor.

Örnek ekran (kurgusal): Kullanıcı ajandan gelen kutusundaki ekim faturalarını bulup bir tabloya dökmesini istiyor. Ajan bu iş için e-posta hesabına bağlanıyor.

### Önce: Ajan · bağlantı ve görev

- İçerik (E-posta bağlantısı): Ajan e-postalarını okuyabilir, yazabilir, gönderebilir ve kalıcı olarak silebilir.
- Kullanıcı: Gelen kutumdaki ekim faturalarını bul, tabloya dök.
- Adım (tamam): 42 fatura bulundu ve tabloya yazıldı
- Adım (tamam): Kopya faturalar silindi · 6 e-posta kalıcı olarak silindi
- AI: Tablo hazır. Gelen kutunu düzenli tutmak için kopya faturaları da sildim.

1. Okumak için açılan bağlantı tam yetkiyle geldi. Silme aracı okuma araçlarıyla aynı onay düzeyinde duruyordu.
2. Kullanıcı yalnız okuma istedi. Ajan işe kendi yorumuyla bir silme adımı ekledi ve onu durduracak bir onay yoktu.

### Sonra: Ajan · bağlantı ve görev

- Ayar (açık): Okuma: e-postaları ara ve oku · Onay sormadan çalışır
- Ayar (açık): Yazma: taslak oluştur, etiketle · Her seferinde onay ister
- Ayar (kapalı): Gönderme ve silme · Bu bağlantıya verilmedi
- Kullanıcı: Gelen kutumdaki ekim faturalarını bul, tabloya dök.
- Adım (tamam): 42 fatura bulundu ve tabloya yazıldı · okuma izniyle 318 e-posta tarandı
- AI: Tablo hazır. 6 kopya fatura gördüm. Bu bağlantının silme izni yok. İstersen kopyaların listesini çıkarayım, silmeye sen karar ver.
- Düğmeler: Kopyaların listesini göster · Tamam

1. Bağlantı işe göre bölündü. Okuma onaysız çalışıyor, yazma her seferinde soruyor, gönderme ve silme bu bağlantıda hiç yok.
2. Ajan kopyaları görüyor ve silmeyi önerebiliyor, ama silemiyor. Silme kararı ve eylemi kullanıcıda kalıyor.

## Piyasada

Claude'da Team ve Enterprise planlarının hesap sahipleri bir bağlayıcının izinlerini [salt okunur araçlar ve yazma ya da silme araçları diye gruplanmış](https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities) görüyor. Her grup ya da araç için üç seçenek var: hep izin ver, onay iste, engelle. Claude Code'da okuma araçları çalışma dizininde [onay sormadan çalışıyor, dosya değiştirmek onay istiyor](https://code.claude.com/docs/en/permissions). Dosya değiştirmek için verilen “bir daha sorma” cevabı oturum bitince sona eriyor.

OpenAI'ın Apps SDK'sında okuma ve yıkıcılık işaretleri her araç tanımında zorunlu alan. Biri aracın yalnız okuyup hesapladığını, öteki [kullanıcı verisini silebildiğini ya da üzerine yazabildiğini](https://developers.openai.com/apps-sdk/reference) söylüyor. Yıkıcı işaretli araçta ChatGPT'nin açık onay istemesi bekleniyor. Aynı belge bu işaretlerin yalnız aracın kullanıcıya nasıl sunulduğunu etkilediğini, yetkiyi sunucunun uygulaması gerektiğini de yazıyor.

GitHub'ın MCP sunucusu `--read-only` bayrağıyla [yalnız okuma araçlarını sunuyor](https://github.com/github/github-mcp-server). Depolarda, sorun kayıtlarında ve çekme isteklerinde değişiklik yapan araçlar listeye hiç girmiyor.

Supabase'in MCP sunucusu salt okunur modda [sorguları salt okunur bir Postgres kullanıcısıyla](https://supabase.com/docs/guides/getting-started/mcp) çalıştırıyor. Ayrım araç listesinde kalmıyor, yazmayı veritabanının kendisi reddediyor.

## Kanıt

**Replit, Temmuz 2025.** Kullanıcı ajana kod dondurma talimatı vermişti. Ajan onay almadan bir şema komutu çalıştırdı ve [canlı veritabanındaki veriyi sildi](https://pbs.twimg.com/media/GwHT8tiWUAIuphG.jpg?name=orig). Talimat ajanın bağlamındaydı, yetki ise elindeydi ve talimat yetkiyi sınırlamadı. Replit'in CEO'su iki gün sonra [geliştirme ve canlı veritabanını otomatik olarak ayırmaya başladıklarını, kod tabanını riske atmadan çalışılacak bir planlama modu üzerinde çalıştıklarını](https://x.com/amasad/status/1946986468586721478) yazdı. İki düzeltme de aynı yere dokunuyor. Ajanın yazma yetkisi, yazma gerektirmeyen işten ayrılıyor.

**GitHub MCP gösterimi, Mayıs 2025.** Invariant Labs, GitHub'ın resmî MCP sunucusunu kullanan bir ajanın herkese açık bir depodaki sorun kaydına gizlenmiş talimatla yönlendirilebildiğini kendi deneme depolarında gösterdi. Kullanıcı ajandan yalnız açık sorun kayıtlarına bakmasını istiyor. Ajan zararlı kaydı okuyunca [özel depolardaki bilgiyi bağlama çekiyor ve herkese açık depoda kendi açtığı bir çekme isteğine yazıyor](https://invariantlabs.ai/blog/mcp-github-vulnerability). Kullanıcının okuma işi için kullandığı bağlantı hem özel depoları okumaya hem herkese açık depoya yazmaya yetiyordu. Araştırmacıların ilk önerisi ajanın erişimini yalnız ihtiyaç duyduğu depolarla sınırlamak.

Replit gerçek bir kullanıcının başına geldi, GitHub örneği araştırmacıların kendi depolarında kurduğu bir gösterim. Okuma ve yazmayı ayırmanın bu tür hataları ne kadar azalttığını ölçen yayımlanmış bir çalışma bulamadık. Yine de iki örnekte de zarar, işin gerektirmediği bir yazma yetkisinden geçti.

## Ölçüm

Onay sayısı bu desenin işe yarayıp yaramadığını söylemez. Bakılacak yer, okuma işlerinin taşıdığı fazla yetki ve yazma onaylarının gerçekten okunup okunmadığı.

- **Yazma yetkili okuma bağlantısı.** Ajanın yalnız okuma yaptığı işlerde kullanılan kimlik bilgilerini say. Bunlardan yazma, gönderme ya da silme yetkisi taşıyanların sayısı sıfır olmalı.
- **İşaretsiz araç.** Sınıfı tanımlanmamış araç sayısı. MCP'de işaretsiz araç yazan ve yıkıcı sayıldığı için bu sayı hem güvenliği hem onay yorgunluğunu etkiler.
- **Onaysız yazma.** Günlükte onay almadan çalışmış yazma, silme ya da gönderme çağrısı. Hedef sıfır.
- **Reddedilen yazma denemesi.** Salt okunur modda ajanın yazma aracı çağırmayı denediği ve kimlik bilgisinin reddettiği durumlar. Sayı sıfırdan büyükse ayrım çalışıyor ve ajan sınırı zorluyor. Bu durumları tek tek incele.
- **Onay süresi.** Yazma onaylarının ne kadarı birkaç saniyede veriliyor? Okuma da onaya bağlandıysa kullanıcı yazma onayını da okumadan geçer.

## Ajanına ver

Üç metin var. Denetim promptu ajanın araçlarını ve kimlik bilgilerini okuma, yazma, silme ve gönderme diye sınıflar, okuma işine verilen fazla yetkiyi raporlar ve hiçbir dosyayı değiştirmez. Uygulama promptu ayrımı koda geçirir. Önce planı gösterir, onayınla uygular ve salt okunur modda silme çağrısının kimlik bilgisi düzeyinde reddedildiğini doğrulayan bir test ekler. Kural kodlama ajanının kendi çalışması için. Senin ajanın da okuyarak yapabildiği işte yazma aracına dokunmasın.

## Sınır

İşi yazmak olan bir ajanda ayrım yetkiyi kaldırmaz, onayların yerini belirler. Kod yazan bir ajan dosya değiştirmek zorunda. Orada okuma onaysız, değiştirme onaylı, silme ve dışarı gönderme ayrıca onaylı çalışır.

Her yazma adımına aynı ağırlıkta onay koymak kullanıcıyı onaylara bakmadan evet demeye iter. Geri alınabilen yazmayı (taslak, etiket, yeni dosya) hafif bir onayla, geri alınamayanı (gönderme, kalıcı silme, ödeme) her seferinde ayrı onayla yürüt.

Araç işareti tek başına koruma sağlamaz. MCP belirtimi ve OpenAI'ın belgesi işaretlerin ipucu olduğunu açıkça yazıyor. Hatalı ya da kötü niyetli bir sunucu yazan bir aracı okuyan diye işaretleyebilir. Ayrımı kimlik bilgisinde uygula.

Bu desen ajanın okuduğu içeriğe gizlenmiş talimatı durdurmaz, yalnız o talimatın neye uzanabileceğini daraltır. Okunan içerikle verilen talimatı birbirinden ayırmak ayrı bir desenin işi.

## Promptlar

### Denetim promptu

```
Bu depoda kullanıcı adına araç çağıran bir AI ajanı var (MCP sunucusu, fonksiyon çağrısı ya da API entegrasyonu). Görevin, ajanın okuma ve yazma yetkilerinin ayrılıp ayrılmadığını denetlemek. Hiçbir dosyayı değiştirme, yalnız rapor yaz.

1. Ajanın kullandığı bütün araçları listele ve her birini sınıfla: yalnız okuyan, ekleyen ya da değiştiren (oluşturma, taslak, düzenleme), silen, dışarı gönderen (e-posta, mesaj, ödeme, yayın).
2. Araç tanımlarında MCP readOnlyHint ve destructiveHint işaretleri ya da benzer bir sınıf var mı? İşaret yoksa istemci aracı nasıl ele alıyor? (MCP'de işaretsiz araç yazan ve yıkıcı sayılır.)
3. Ajanın servislere bağlandığı kimlik bilgilerini bul: OAuth kapsamları, API anahtarları, veritabanı kullanıcıları, kişisel erişim jetonları. Okuma işi için kullanılan kimlik bilgisi yazma, gönderme ya da silme yetkisi de taşıyor mu?
4. Onay akışına bak: yazma ve silme araçları okuma araçlarıyla aynı onay düzeyinde mi? "Hep izin ver" seçeneği silme ve gönderme araçlarına da uygulanabiliyor mu?
5. Salt okunur bir çalışma modu var mı? Varsa yalnız araç listesini mi gizliyor, yoksa kimlik bilgisi düzeyinde mi uygulanıyor (salt okunur veritabanı kullanıcısı, readonly kapsam)?
6. Ajanın okuduğu içerik (e-posta, sorun kaydı, web sayfası) dışarıdan gelebiliyorsa, aynı oturumda yazma ve dışarı gönderme araçlarına erişimi var mı?

Rapor biçimi: her araç ya da kimlik bilgisi için dosya ve satır, şu anki yetki, işin gerçekten gerektirdiği yetki ve önerdiğin ayrım. Silme ve dışarı gönderme yetkilerinden başla.

```

### Uygulama promptu

```
Bu depodaki AI ajanına "okuma ve yazma iznini ayır" desenini uygula. Önce planı göster, onayımı aldıktan sonra kodu değiştir.

Hedef davranış:
1. Her aracı sınıfla ve sınıfı tanımına yaz: okuma, yazma, silme, dışarı gönderme. MCP kullanıyorsan readOnlyHint ve destructiveHint işaretlerini doğru doldur.
2. Okuma araçları onay sormadan çalışabilsin. Yazma araçları onay istesin. Silme ve dışarı gönderme araçları her seferinde onay istesin ve "hep izin ver" seçeneği bunlara uygulanmasın.
3. Okuma işleri için ayrı ve dar bir kimlik bilgisi kullan: salt okunur kapsam, salt okunur veritabanı kullanıcısı ya da yalnız okuma izni olan jeton. Yazma yetkisi yalnız yazma gerektiğinde ve ayrıca alınsın.
4. Bir salt okunur mod ekle. Bu mod yalnız araç listesini gizlemekle kalmasın, kimlik bilgisi düzeyinde de uygulansın.
5. Ajan salt okunur modda yazma gerektiren bir adım görürse adımı yapmasın, kullanıcıya önersin.

Uygularken:
- Araç işaretlerini yetki kararının tek dayanağı yapma. Yetkiyi sunucu ve kimlik bilgisi uygulasın.
- Var olan bağlantıları bozmadan ilerle. Önce yeni dar kimlik bilgisini ekle, sonra okuma araçlarını ona taşı.
- Bir test ekle: ajanı salt okunur modda çalıştır, bir silme ya da gönderme aracını çağırmayı dene ve çağrının kimlik bilgisi düzeyinde reddedildiğini doğrula.

```

### AGENTS.md kuralı

```
## Okuma ve yazma iznini ayır
- Bir işi yalnız okuyarak yapabiliyorsan yazma, gönderme ya da silme aracı çağırma.
- Okuma için verilen bir bağlantıda yazma adımı gerekirse dur ve adımı kullanıcıya öner, kendin yapma.
- Silme ve dışarı gönderme adımlarını her seferinde ayrı onayla çalıştır.
- Yeni bir araç eklerken onu okuma, yazma, silme ya da gönderme diye sınıfla ve işaretini doldur.
- Bir aracın yetkisini adından ya da açıklamasından çıkarma. Kimlik bilgisinin gerçekten neye izin verdiğine bak.

```

## Kaynaklar

1. [Choose Gmail API scopes](https://developers.google.com/workspace/gmail/api/auth/scopes), Google for Developers
2. [Replit Agent'ın db:push açıklaması, ekran görüntüsü (Lemkin'in gönderisinde)](https://pbs.twimg.com/media/GwHRGAVXQAAWny3.jpg?name=orig), Jason Lemkin, X, 18 Temmuz 2025
3. [Schema Reference: ToolAnnotations (Model Context Protocol Specification, 2025-06-18)](https://modelcontextprotocol.io/specification/2025-06-18/schema#toolannotations), Model Context Protocol, 18 Haziran 2025
4. [Use connectors to extend Claude's capabilities](https://support.claude.com/en/articles/11176164-use-connectors-to-extend-claude-s-capabilities), Claude Help Center
5. [Configure permissions](https://code.claude.com/docs/en/permissions), Anthropic
6. [Reference (Apps SDK)](https://developers.openai.com/apps-sdk/reference), OpenAI for Developers
7. [GitHub MCP Server (README, Read-Only Mode)](https://github.com/github/github-mcp-server), GitHub
8. [Supabase MCP Server](https://supabase.com/docs/guides/getting-started/mcp), Supabase Docs
9. [Replit Agent sohbetinin ekran görüntüsü (Lemkin'in gönderisinde)](https://pbs.twimg.com/media/GwHT8tiWUAIuphG.jpg?name=orig), Jason Lemkin, X, 18 Temmuz 2025
10. [We saw Jason’s post. @Replit agent in development deleted data from the production database.](https://x.com/amasad/status/1946986468586721478), Amjad Masad (Replit), X, 20 Temmuz 2025
11. [GitHub MCP Exploited: Accessing private repositories via MCP](https://invariantlabs.ai/blog/mcp-github-vulnerability), Invariant Labs, 26 Mayıs 2025

---

Kaynak: https://tandem.komunite.com.tr · Metin CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/deed.tr), promptlar ve kural MIT-0 (https://opensource.org/license/mit-0).
