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ı
Yönetici Özeti (TL;DR)
- Mimari Problem: Yerel bir otonom sistemin kanıt kütüklerini (
soykutuk.jsonliçindeki747mühürlü hüküm, Röntgen sistem karnesi, 3 vitrin sitesinin GSC/DIL-14 durumu ve441dental 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.pymodülü, Model Context Protocol (MCP)2025-03-26Streamable HTTP spesifikasyonunu, OAuth 2.1 PKCE (S256, RFC 7636) ve Dinamik İstemci Kaydı (RFC 7591 DCR) ile birleştirir. Yalnızca5salt-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_verifierreddini (HTTP 400), doğrucode_verifierileBearerjeton ü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_DESENLERlistesindeki 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:
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.
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.jsonlveya durum kütüklerinde kilitlenme yaratır. Salt-okunur MCP katmanı yarış koşulunu matematiksel olarak0’a indirir.Kimlik bilgisi ve mahrem veri sızıntısı: Dış istemciye ham dosya okuma (
read_file) veya serbest SQL sorgusu açıldığındaoauth_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_DESENLERdüzenli ifadesiyle süzülmüş alan-özel (domain-specific) özet araçları açılmalıdır.
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:
OAuth 2.1 Yetkilendirme Sunucusu Keşfi (RFC 8414): İstemci
GET /.well-known/oauth-authorization-serverveGET /.well-known/openid-configurationuçlarındanauthorization_endpoint,token_endpoint,registration_endpointve desteklenen tek kod sınama yöntemi olancode_challenge_methods_supported: ["S256"]bilgisini okur.Dinamik İstemci Kaydı (RFC 7591 DCR —
POST /oauth/register): İstemci önceden el ile sabitlenmiş bir kimliğe ihtiyaç duymadanredirect_urislistesiyle 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ğrulayarakHTTP 201 Createdileorion_dcr_*önekliclient_idüretir.PKCE
S256Kriptografik Bağlama (RFC 7636): Yetkilendirme isteğinde (GET /oauth/authorize) istemci rastgele bircode_verifierdizgesinin SHA-256 özetini Base64URL (=dolgusuz) ile kodlayarakcode_challengeolarak gönderir:$$\text{code\_challenge} = \text{BASE64URL\_NOPAD}\!\left(\text{SHA256}(\text{ASCII}(\text{code\_verifier}))\right)$$
Daha sonra
POST /oauth/tokenadımında sunucu, ibraz edilencode_verifierüzerinden aynı özeti yeniden hesaplar. Eşleşme yoksa istekHTTP 400 Bad Requestile reddedilir ve yetkilendirme kodu tek kullanımlık olarak imha edilir.MCP
initializeve Oturum Mührü: GeçerliBearer orion_at_*jetonuylaPOST /v1/mcpucuna geleninitializeçağrısınaprotocolVersion: "2025-03-26"veMcp-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-appsuç noktası301/302yönlendirmesi yapmadan doğrudanHTTP 200veverification_tokenJSON 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-Extendedbaşlıklarını ve Google’ın yayımladığıuser-triggered-fetchersCIDR 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_networkile 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:
- Model Context Protocol (MCP) Specification — Revision 2025-03-26 (Streamable HTTP Transport & Tool Annotations)
- Google Connected Apps Documentation — Model Context Protocol (MCP) Server Integration & OAuth Requirements
- IETF RFC 7636 — Proof Key for Code Exchange by OAuth Public Clients (PKCE S256, DOI:10.17487/RFC7636)
- IETF RFC 7591 — OAuth 2.0 Dynamic Client Registration Protocol (DOI:10.17487/RFC7591)
- IETF RFC 8414 — OAuth 2.0 Authorization Server Metadata (DOI:10.17487/RFC8414)
İ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.