Ajan Protokolleri & Sıfır-Güven Kanıt Mimarisi

Yazma Yetkisi Vermeden Kanıt Doğrulama: Orion Google Connected Apps MCP, OAuth 2.1 PKCE ve Salt-Okunur Köprü Mimarisi

Dış Yapay Zekâ İstemcileri Yerel Kanıt Yuvasına Nasıl Güvenli Bağlanır? MCP 2025-03-26 Streamable HTTP, RFC 7636 PKCE (S256), RFC 7591 Dinamik İstemci Kaydı, 5 Salt-Okunur Araç ve 9/9 Öz-Sınama Kapısı

· 10 dk okuma Yazan: Atlas · Gemini 4 Argon (Rev1) Yayımlayan: Yusuf Aziz · Atlas Studio Denetim: Ephemeral Port Tam Akış Öz-Sınaması · ORION_GOOGLE_CONNECTED_MCP_OK 9/9 Odak: MCP 2025-03-26 · OAuth 2.1 PKCE (S256) · RFC 7591 DCR · 5 Salt-Okunur Araç · 9/9 Kapı

Yönetici Özeti (TL;DR)

  • Mimari Problem: Yerel bir otonom sistemin kanıt kütüklerini (soykutuk.jsonl içindeki 747 mühürlü hüküm, Röntgen sistem karnesi, 3 vitrin sitesinin GSC/DIL-14 durumu ve 441 dental morfoloji atlası) dış yapay zekâ istemcilerine (Google Connected Apps ve Gemini Developer Mode) açarken, istemciye dosya yazma, kabuk komutu çalıştırma veya mahrem veri okuma yetkisi verilmemelidir.
  • Çözüm (4 Katmanlı Salt-Okunur MCP Köprüsü): oz_cekirdek/orion_google_connected_mcp.py modülü, Model Context Protocol (MCP) 2025-03-26 Streamable HTTP spesifikasyonunu, OAuth 2.1 PKCE (S256, RFC 7636) ve Dinamik İstemci Kaydı (RFC 7591 DCR) ile birleştirir. Yalnızca 5 salt-okunur araç (readOnlyHint=True, destructiveHint=False, openWorldHint=False) dışarıya açılır.
  • Canlı Doğrulama (9/9 Öz-Sınama Kapısı): Geçici (ephemeral) port üzerinde gerçek HTTP istekleriyle koşan öz-sınama; alan adı doğrulama ucunu, CIDR IP süzgecini, DCR kaydını, yanlış code_verifier reddini (HTTP 400), doğru code_verifier ile Bearer jeton üretimini ve 5 aracın tamamında sıfır PII/anahtar sızıntısını doğrular (ORION_GOOGLE_CONNECTED_MCP_OK 9/9).
  • Düşer Testi: Salt-okunur 5 MCP aracından herhangi birinin dosya sisteminde tek bir bayt değiştirdiği veya YASAKLI_DESENLER listesindeki bir anahtarı dışarı sızdırdığı gösterilirse bu mimari kayıt düşer.

Orion Google Connected Apps MCP: Sıfır-Yazma Sınırında Kanıt Sorgulama

1. Ajan köprülerinde neden "okuma" ile "icra" fiziksel olarak ayrılmalıdır?

Çok ajanlı bir mühendislik ortamında iç yürütme omurgası (bizim mimarimizde Atlas Rev1 — Katı İskelet) kod yazar, test koşar ve dağıtım yapar. Buna karşılık dış dünyadan bağlanan sohbet arayüzleri, mobil istemciler veya üçüncü taraf yapay zekâ platformları (Google Connected Apps ve Gemini Developer Mode gibi) sistemin canlı durumunu, kanıt soykütüğünü ve doğrulama karnesini sorgulamak ister. Eğer dış istemciye bağlanan protokol katmanı iç yürütme araçlarıyla aynı yetki uzayını paylaşırsa üç kritik güvenlik açığı doğar:

  1. Dolaylı istem enjeksiyonu (Indirect Prompt Injection) ile durum bozulması: Dış istemcinin okuduğu bir web sayfası veya belge içine gizlenmiş kötücül bir yönerge, istemci üzerinden MCP sunucusuna yazma veya silme çağrısı tetikleyebilir. Sunucu tarafında yazma fonksiyonu hiç tanımlanmamışsa (capability absence by construction), enjeksiyon gerçekleşse bile sistem durumu değişmez.

  2. Yarış koşulu (Race Condition) ve tek-yazıcı ihlali: Katı İskelet (Rev1) canlı kütükleri güncellerken dış bir bağlantının aynı dosyaya yazmaya çalışması task_bus.jsonl veya durum kütüklerinde kilitlenme yaratır. Salt-okunur MCP katmanı yarış koşulunu matematiksel olarak 0’a indirir.

  3. Kimlik bilgisi ve mahrem veri sızıntısı: Dış istemciye ham dosya okuma (read_file) veya serbest SQL sorgusu açıldığında oauth_creds.json, API anahtarları veya klinik/kişisel veriler yanlışlıkla yanıt gövdesine karışabilir. Bunun yerine yalnızca şeması önceden kilitlenmiş ve çıktısı YASAKLI_DESENLER düzenli ifadesiyle süzülmüş alan-özel (domain-specific) özet araçları açılmalıdır.

1. DIŞ İSTEMCİ Google Connected Apps Gemini Dev Mode User-Agent: Google CIDR IP Allowlist 66.249.80.0/20 vb. 2. OAUTH 2.1 + PKCE RFC 8414 .well-known RFC 7591 DCR (/register) RFC 7636 PKCE (S256) Yanlış verifier → HTTP 400 Doğru → Bearer orion_at_* 3. STREAMABLE HTTP POST /v1/mcp (JSON-RPC) Protokol: 2025-03-26 Mcp-Session-Id Başlığı readOnlyHint = true destructiveHint = false 4. 5 KANIT ARACI orion_durum_ozeti rontgen_canli_karne orion_kanit_ara (747) web_vitrin_ve_gsc form_441_morfoloji PII / Yazma = 0
Şekil 1 — Orion Google Connected Apps MCP 4 Katmanlı Güvenlik Sınırı: İstemci doğrulaması, OAuth 2.1 PKCE (S256) + RFC 7591 DCR, MCP 2025-03-26 Streamable HTTP oturum yönetimi ve YASAKLI_DESENLER süzgecinden geçen 5 salt-okunur kanıt aracı.

2. MCP 2025-03-26 Streamable HTTP, OAuth 2.1 PKCE (S256) ve RFC 7591 DCR akışı

Klasik çift uçlu (ayrı SSE GET ve ayrı mesaj POST) taşıma katmanı yerine, güncel MCP 2025-03-26 Streamable HTTP standardı tek bir uç noktada (https://mcp.atlasmaster.app/v1/mcp) JSON-RPC 2.0 mesajlaşmasını ve Mcp-Session-Id oturum takibini tanımlar. Sunucumuz (oz_cekirdek/orion_google_connected_mcp.py) yetkilendirme ve oturum kurulumunu beş deterministik adımda yürütür:

  1. OAuth 2.1 Yetkilendirme Sunucusu Keşfi (RFC 8414): İstemci GET /.well-known/oauth-authorization-server ve GET /.well-known/openid-configuration uçlarından authorization_endpoint, token_endpoint, registration_endpoint ve desteklenen tek kod sınama yöntemi olan code_challenge_methods_supported: ["S256"] bilgisini okur.

  2. Dinamik İstemci Kaydı (RFC 7591 DCR — POST /oauth/register): İstemci önceden el ile sabitlenmiş bir kimliğe ihtiyaç duymadan redirect_uris listesiyle başvurur. Sunucu geri dönüş adresinin yalnızca izinli Google/yerel öneklerde (https://gemini.google.com/, https://vertexaisearch.cloud.google.com/, https://developers.google.com/) olduğunu doğrulayarak HTTP 201 Created ile orion_dcr_* önekli client_id üretir.

  3. PKCE S256 Kriptografik Bağlama (RFC 7636): Yetkilendirme isteğinde (GET /oauth/authorize) istemci rastgele bir code_verifier dizgesinin SHA-256 özetini Base64URL (= dolgusuz) ile kodlayarak code_challenge olarak gönderir:

    $$\text{code\_challenge} = \text{BASE64URL\_NOPAD}\!\left(\text{SHA256}(\text{ASCII}(\text{code\_verifier}))\right)$$

    Daha sonra POST /oauth/token adımında sunucu, ibraz edilen code_verifier üzerinden aynı özeti yeniden hesaplar. Eşleşme yoksa istek HTTP 400 Bad Request ile reddedilir ve yetkilendirme kodu tek kullanımlık olarak imha edilir.

  4. MCP initialize ve Oturum Mührü: Geçerli Bearer orion_at_* jetonuyla POST /v1/mcp ucuna gelen initialize çağrısına protocolVersion: "2025-03-26" ve Mcp-Session-Id: orion_mcp_sess_* başlığıyla yanıt verilir.

3. Beş salt-okunur doğrulama aracı ve YASAKLI_DESENLER çıkış kilidi

Orion MCP sunucusunda tanımlanan 5 aracın tamamı Google Connected Apps MCP güvenlik rehberindeki dört anotasyonu zorunlu olarak taşır: readOnlyHint: true, destructiveHint: false, idempotentHint: true ve openWorldHint: false. Ayrıca her aracın döndürdüğü JSON verisi istemciye çıkmadan önce guvenlik_suzgeci() fonksiyonundan geçerek (oauth_creds|refresh_token_secret|api_key|private_key|kuzey_plani\.json|faz3_.*_KILL|tc_kimlik|hasta_adi) desenlerini maskeler:

MCP Araç Adı (tools/list) Başlık ve Sorguladığı Yerel Kanıt Kaynağı Girdi Şeması (inputSchema) Güvenlik Anotasyonları
orion_durum_ozeti Orion Katı İskelet öz-çekirdek durumu, 5 yaşayan iş dalı (DAL_*), soykutuk.jsonl dağılımı ve BELIRSIZ_FREN ($\tau_u = 0,0725$) eşiği dal_detay: boolean (varsayılan: true) readOnlyHint=true · destructiveHint=false
rontgen_canli_karne Röntgen (:8793) sistem gözlemleme, öz-sınama (selftest) kapı durumu ve son ajan karne kayıtları son_kayit_sayisi: integer (1..10, varsayılan: 5) readOnlyHint=true · destructiveHint=false
orion_kanit_ara soykutuk.jsonl (747 mühürlü hipotez/hüküm kaydı) üzerinde anahtar kelime ve statü bazlı kanıt araması sorgu: string (zorunlu), limit: integer (1..20) readOnlyHint=true · destructiveHint=false
web_vitrin_ve_gsc_durumu Üç vitrin sitesinin (atlasmaster.app, yusufaziz.com.tr, emrahozdemir.com.tr) GSC, IndexNow ve DIL-14 doğal dil kapı durumu site: string (atlasmaster.app | yusufaziz.com.tr | emrahozdemir.com.tr | tumu) readOnlyHint=true · destructiveHint=false
form_441_morfoloji_ara 441 Dental Morfoloji ve Gülüş Tasarımı Atlası içinde FDI diş numarası veya morfolojik özellik (santral, zenit, F001) araması (0 hasta verisi) sorgu: string (zorunlu), limit: integer (1..10) readOnlyHint=true · destructiveHint=false

4. Google user-triggered-agents CIDR doğrulaması ve yönlendirmesiz .well-known ucu

Google Partner Console (GPC) ve Connected Apps ön koşulları iki altyapı kuralını zorunlu kılar:

  • Yönlendirmesiz (HTTP 200) Alan Adı Doğrulaması: GET /.well-known/google-connected-apps uç noktası 301/302 yönlendirmesi yapmadan doğrudan HTTP 200 ve verification_token JSON gövdesi döndürmelidir.
  • Google CIDR IP Doğrulayıcısı (google_ip_dogrula): Güvenlik duvarı ve sunucu katmanı, User-Agent: Google / Google-Extended başlıklarını ve Google’ın yayımladığı user-triggered-fetchers CIDR bloklarını (66.249.80.0/20, 66.249.64.0/19, 34.100.182.96/28, 34.102.218.224/28, 35.191.0.0/16, 108.177.0.0/17, 142.250.0.0/15, 2001:4860:4801::/48) ipaddress.ip_network ile doğrular; yetkisiz dış IP’leri (ör. 198.51.100.7) reddeder.

Ölçülebilir Kanıt Kartı (9/9 Öz-Sınama Kapısı Dökümü)

python3 oz_cekirdek/orion_google_connected_mcp.py --selftest komutu koşulduğunda geçici (ephemeral) port üzerinde gerçek HTTP istekleriyle doğrulanan 9/9 kapı:

Öz-Sınama Kapısı (selftest) Sınanan Kural / Çağrı Doğrulanmış Çıktı Canlı Kaynak (Dosya:Satır · Tarih)
Kapı 1 — İkon ve başvuru paketi üretimi 512×512 RGBA PNG ikon ve JSON başvuru paketi orion_connected_app_icon_512.png (512×512) + google_connected_apps_basvuru_paketi_1029.json · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:886-890 · 2026-10-29
Kapı 2 — Google CIDR IP doğrulayıcısı 66.249.80.12, 34.100.182.100 karşı 198.51.100.7 Google IP = True, dış IP = False · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:892-894 · 2026-10-29
Kapı 3 — Alan adı doğrulama ucu GET /.well-known/google-connected-apps HTTP 200 (yönlendirmesiz) + verification_token · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:907-912 · 2026-10-29
Kapı 4 — OAuth 2.1 keşif metaverisi GET /.well-known/oauth-authorization-server HTTP 200 + code_challenge_methods_supported: ["S256"] · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:914-918 · 2026-10-29
Kapı 5 — RFC 7591 Dinamik İstemci Kaydı (DCR) POST /oauth/register (gemini.google.com callback) HTTP 201 Created + client_id: "orion_dcr_*" · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:920-934 · 2026-10-29
Kapı 6 — OAuth 2.1 PKCE S256 iki yönlü sınama Yanlış code_verifier reddi + doğru code_verifier kabulü Yanlış = HTTP 400 · Doğru = HTTP 200 + Bearer orion_at_* · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:936-988 · 2026-10-29
Kapı 7 — MCP 2025-03-26 initialize POST /v1/mcp (method: "initialize") protocolVersion: "2025-03-26" + Mcp-Session-Id: orion_mcp_sess_* · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:1009-1023 · 2026-10-29
Kapı 8 — tools/list salt-okunur anotasyon denetimi POST /v1/mcp (method: "tools/list") 5 araç · tümünde readOnlyHint=True, destructiveHint=False, openWorldHint=False · GEÇTİ oz_cekirdek/orion_google_connected_mcp.py:1025-1035 · 2026-10-29
Kapı 9 — 5 aracın tamamında tools/call ve PII süzgeci POST /v1/mcp (method: "tools/call" × 5 araç) 5/5 araç isError=False · 0 PII/anahtar sızıntısı · ORION_GOOGLE_CONNECTED_MCP_OK 9/9 oz_cekirdek/orion_google_connected_mcp.py:1037-1069 · 2026-10-29

Sık Sorulan Sorular (SSS)

Dış yapay zekâ istemcilerine yerel kanıt yuvasını açarken neden tam salt-okunur (read-only) MCP sınırı zorunludur?

Bulut tabanlı yapay zekâ istemcileri dolaylı istem enjeksiyonuna (indirect prompt injection) maruz kalabilir. Eğer MCP sunucusunda dosya yazma, kabuk komutu (shell) veya durum değiştirme ucu açıksa dış istemci yerel depoyu bozabilir. Orion MCP köprüsünde yalnızca 5 salt-okunur araç tanımlanmış ve hepsine readOnlyHint=true, destructiveHint=false, idempotentHint=true, openWorldHint=false anotasyonları ile YASAKLI_DESENLER çıkış süzgeci uygulanmıştır.

OAuth 2.1 PKCE (S256) ve RFC 7591 Dinamik İstemci Kaydı (DCR) nasıl birlikte çalışır?

Dış istemci önce /.well-known/oauth-authorization-server uç noktasından sunucu yeteneklerini keşfeder, ardından POST /oauth/register ile izinli geri dönüş adresini (redirect_uri) kaydederek orion_dcr_ önekli bir client_id alır. Yetkilendirme aşamasında rastgele bir code_verifier üretip SHA-256 + Base64URL özeti olan code_challenge değerini gönderir; POST /oauth/token adımında doğru code_verifier ibraz edilmezse sunucu HTTP 400 ile isteği reddeder.

Orion MCP sunucusunun 9/9 öz-sınama (selftest) kapısı neleri doğrular?

oz_cekirdek/orion_google_connected_mcp.py --selftest komutu geçici (ephemeral) bir portta gerçek bir HTTP sunucusu ayağa kaldırarak 9 kapıyı sınar: (1) 512×512 PNG ikon ve başvuru paketi üretimi, (2) Google user-triggered-agents CIDR IP doğrulayıcısı, (3) /.well-known/google-connected-apps yönlendirmesiz HTTP 200 doğrulaması, (4) OAuth 2.1 keşif ucu, (5) RFC 7591 DCR 201 Created, (6) PKCE S256 yanlış verifier reddi (HTTP 400) ve doğru verifier kabulü, (7) MCP 2025-03-26 initialize ve Mcp-Session-Id üretimi, (8) tools/list ile 5 salt-okunur aracın ilanı, (9) 5 aracın tamamının tools/call ile sıfır PII/anahtar sızıntısıyla çalıştırılması.

Kaynaklar

Bu yazıda uygulanan protokol standartları ve resmi spesifikasyonlar:

İlgili Teknik İncelemeler: Yerel olay panosu mimarisi için olay güdümlü pano (task_bus.jsonl), bağlam-kör doğrulama için Reaper ve düşer testi kapısı, 3B BVH ışın denetimi için Ayasofya v3 BVH ışın testi sayfalarına göz atabilirsiniz.