[{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/series/azure-sre-agent-icin-sql-mcp/","section":"Series","summary":"","title":"Azure SRE Agent Için SQL MCP","type":"series"},{"content":"Azure SRE Agent\u0026rsquo;ın \u0026ldquo;sql02\u0026rsquo;de en çok hangi wait var?\u0026rdquo; ve \u0026ldquo;şu an kaç kullanıcı oturumu açık?\u0026rdquo; sorularını, eline hiçbir zaman bir SQL komut satırı vermeden cevaplamasını istedik. Agent\u0026rsquo;ın kimliğine sysadmin yok, serbest sorgu yok, SQL Server\u0026rsquo;larda yardımcı veritabanı yok, genel uç nokta yok. Bu yazı bunu Data API builder (DAB) 2.1.5 ve onun MCP uç noktasıyla nasıl kurduğumuzu ve yolda neyin kırıldığını anlatıyor.\n✅ = lab\u0026rsquo;imizde kanıtlandı · 📄 = yalnız belgede var (Microsoft Learn ya da DAB kaynak kodu), bizde test edilmedi.\nAmaç ve hedef kitle # Amaç. Sonunda agent, listelediğiniz her sunucuda yedi SQL Server DMV view\u0026rsquo;ını (wait\u0026rsquo;ler, sayaçlar, bellek, oturumlar, istekler, sorgu istatistikleri) okuyor. Bunu, agent\u0026rsquo;ın kendi managed identity\u0026rsquo;siyle kimlik doğrulayan ve VNet\u0026rsquo;inizin içinden geçen bir MCP connector\u0026rsquo;ı üzerinden yapıyor. SQL Server tarafında yalnızca düşük yetkili tek bir gMSA, Kerberos ile görünüyor. SQL\u0026rsquo;de bir login dışında hiçbir şey oluşturulmuyor.\nKimler için. SRE Agent kullanan ya da kullanmak üzere olan ve veritabanı sağlığını ona göstermek isteyen Azure ve SQL Server mühendisleri. Active Directory (gMSA), T-SQL login\u0026rsquo;leri, Entra uygulama kayıtları ve az rest size yabancı olmamalı.\nParçalar nasıl birleşiyor # DAB, JSON config\u0026rsquo;te listelenen veritabanı nesnelerini API olarak sunan, Microsoft\u0026rsquo;un açık kaynak motorudur. Biz yalnız MCP uç noktasını kullanıyoruz (/mcp, Streamable HTTP); REST ve GraphQL kapalı. DAB\u0026rsquo;ın kendine ait SQL\u0026rsquo;i yoktur: her araç çağrısı, sizin tanımladığınız bir view üzerinde bir SELECT\u0026lsquo;e dönüşür. ✅\nflowchart LR subgraph AZ[\"Azure VNet (genel uç nokta yok)\"] AG[\"Azure SRE Agentsystem-assigned MI\"] subgraph HOST[\"mcp01 (domain üyesi)\"] DAB[\"DAB 2.1.5 /mcpgMSA ile zamanlanmış görev\"] end end ENTRA[\"Entra IDuygulama sql-mcp-api, rol MCP.Read\"] SQL1[(\"sql01DMV view'ları\")] SQL2[(\"sql02DMV view'ları\")] AG -- \"1 api://appId için token\" --\u003e ENTRA AG -- \"2 HTTP :5000 + Bearer + X-MS-API-ROLE\" --\u003e DAB DAB -- \"3 imza anahtarları, giden 443\" --\u003e ENTRA DAB -- \"4 TDS 1433, gmsa-dab$ ile Kerberos\" --\u003e SQL1 DAB -- \"4\" --\u003e SQL2 Agent, managed identity\u0026lsquo;siyle Entra\u0026rsquo;dan api://\u0026lt;appId\u0026gt; için token ister. Token\u0026rsquo;ı yalnız MCP.Read uygulama rolüne sahip kimlikler alır: uygulama atama zorunlu tutar. ✅ Connector, token ve X-MS-API-ROLE: MCP.Read başlığıyla VNet üzerinden http://mcp01.contoso.local:5000/mcp adresini çağırır. ✅ DAB aud, iss ve imzayı (anahtarlar Entra\u0026rsquo;dan giden 443 ile alınır) ve rolü kontrol eder. ✅ DAB, SQL Server\u0026rsquo;a gMSA olarak Kerberos ile bağlanır. Çağıranın kimliğini aktarmaz. ✅ Agent\u0026rsquo;ın eline geçen, salt okunur üç araçtır: describe_entities (ne var, kolon açıklamalarıyla), read_records (filtre, sıralama, kolon seçimi, ilk N) ve aggregate_records (count, sum, avg, min, max, group by). \u0026ldquo;Sorgu çalıştır\u0026rdquo; diye bir araç yoktur. ✅\nÖn koşullar # Alan Gereksinim SRE Agent Egress modu Azure VNet, özel DNS çözümlemesi açık ✅ Remote MCP server access = kapalı (MCP trafiğini VNet\u0026rsquo;inizde tutar) ✅ System-assigned managed identity (user-assigned da olur) ✅ / 📄 Active Directory KDS root key\u0026rsquo;i olan bir domain; gMSA için Domain Admin ✅ MCP host\u0026rsquo;u Domain üyesi Windows Server, genel IP yok. Token imza anahtarları için Entra\u0026rsquo;ya giden TCP 443. İnternetten gelen trafik yok ✅ SQL Server ##MS_ServerPerformanceStateReader## için 2022 ve sonrası (biz 2025 ile çalıştık). 2016–2019 için VIEW SERVER STATE gerekir ✅ 2025 / 📄 eskiler Ağ Agent alt ağı → MCP host\u0026rsquo;u TCP 5000; host adı agent alt ağından çözülebilir ✅ Entra Uygulama kaydı oluşturup uygulama rolü atayabilen biri ✅ Admin makinesi Oturum açılmış Azure CLI. zsh ya da PowerShell ✅ zsh / 📄 PowerShell HTTPS şart değil: connector VNet içinde http:// kabul ediyor. ✅ Şirket içi SQL Server\u0026rsquo;lar da VPN ya da ExpressRoute üzerinden aynı şekilde çalışır; yeter ki agent alt ağı host\u0026rsquo;a ulaşabilsin. 📄\nAdımlar # Admin makinesinde çalışan komutlar iki sekmede. Kabuğunuzu bir kez seçin; sayfadaki bütün bloklar ona uyar. Bir Windows sunucusunda ya da SQL\u0026rsquo;de çalışan komutlar tek sefer yazıldı.\n1. gMSA\u0026rsquo;yı oluşturun (bir domain controller\u0026rsquo;da) # # KDS root key: once per forest. Production: -EffectiveImmediately, then wait 10 h. if (-not (Get-KdsRootKey)) { Add-KdsRootKey -EffectiveImmediately } New-ADServiceAccount -Name gmsa-dab -DNSHostName gmsa-dab.contoso.local ` -PrincipalsAllowedToRetrieveManagedPassword \u0026#39;mcp01$\u0026#39; 2. gMSA\u0026rsquo;ya bir login ve performans rolü verin (her SQL Server\u0026rsquo;da; komutları sysadmin yetkili bir DBA çalıştırır) # CREATE LOGIN [CONTOSO\\gmsa-dab$] FROM WINDOWS WITH DEFAULT_DATABASE = [master]; ALTER SERVER ROLE [##MS_ServerPerformanceStateReader##] ADD MEMBER [CONTOSO\\gmsa-dab$]; SELECT IS_SRVROLEMEMBER(\u0026#39;sysadmin\u0026#39;, N\u0026#39;CONTOSO\\gmsa-dab$\u0026#39;) AS is_sysadmin; -- expect 0 gMSA sysadmin değildir; yalnızca ##MS_ServerPerformanceStateReader## rolünü alır (SQL Server 2016–2019\u0026rsquo;da bunun yerine VIEW SERVER STATE).\n##MS_ServerPerformanceStateReader##, VIEW SERVER PERFORMANCE STATE demektir: performans DMV\u0026rsquo;leri, başka bir şey değil. Tablo verisi yok, güvenlik DMV\u0026rsquo;leri yok, hiçbir şeyi değiştirme imkânı yok. Veritabanı kullanıcısı da oluşturulmuyor. ✅\n2016–2019\u0026rsquo;da bunun yerine GRANT VIEW SERVER STATE kullanın. Daha geniştir (güvenlikle ilgili durumu ve başka oturumların sorgu metnini de kapsar). 📄\nYetki yoksa iki view hata vermez, yanlış söyler. sys.dm_exec_sessions ve sys.dm_exec_requests bu durumda yalnız DAB\u0026rsquo;ın kendi oturumunu döndürür. Sayılar geçerli görünür ama yanlıştır. \u0026ldquo;Satır dönüyor\u0026rdquo; diye değil, sys.server_permissions ile kontrol edin. 📄 (Learn; biz yalnız 2025 ile çalıştık) 3. DAB\u0026rsquo;ı MCP host\u0026rsquo;una kurun (yerel admin olarak) # Install-WindowsFeature RSAT-AD-PowerShell Install-ADServiceAccount gmsa-dab Test-ADServiceAccount gmsa-dab # True Sonra aynı host\u0026rsquo;ta:\ngMSA\u0026rsquo;ya Log on as a batch job hakkını verin (zamanlanmış görev bunu ister). DAB\u0026rsquo;ın GitHub sürümündeki kendi kendine yeten dab_net10.0_win-x64-2.1.5.zip dosyasını C:\\dab\\bin altına açın. .NET kurmak gerekmez. C:\\dab\\bin\\Microsoft.DataApiBuilder.exe --version çıktısı 2.1.5 olmalı. Sürümü sabitleyin: allowed-hosts 2.1.5 ile geldi. C:\\dab\\config (gMSA: okuma) ve C:\\dab\\logs (gMSA: değiştirme) klasörlerini oluşturun. Servis işini gören zamanlanmış görevi kaydedin (DAB bir Windows servisi değildir): $cmd = \u0026#39;/c set ASPNETCORE_URLS=http://0.0.0.0:5000\u0026amp;\u0026amp; C:\\dab\\bin\\Microsoft.DataApiBuilder.exe start --config dab-config.json \u0026gt; C:\\dab\\logs\\dab.log 2\u0026gt;\u0026amp;1\u0026#39; $a = New-ScheduledTaskAction -Execute cmd.exe -Argument $cmd -WorkingDirectory C:\\dab\\config $t = New-ScheduledTaskTrigger -AtStartup $p = New-ScheduledTaskPrincipal -UserId \u0026#39;CONTOSO\\gmsa-dab$\u0026#39; -LogonType Password # no password for a gMSA $s = New-ScheduledTaskSettingsSet -ExecutionTimeLimit ([TimeSpan]::Zero) -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) Register-ScheduledTask -TaskName \u0026#39;DAB-MCP\u0026#39; -Action $a -Trigger $t -Principal $p -Settings $s -Force TCP 5000\u0026rsquo;i yalnız agent ve VM alt ağlarına açın. Windows Firewall açık kalır: New-NetFirewallRule -Name dab-mcp-5000 -DisplayName \u0026#39;DAB MCP 5000 (VNet only)\u0026#39; -Direction Inbound ` -Protocol TCP -LocalPort 5000 -RemoteAddress \u0026lt;agent-subnet\u0026gt;,\u0026lt;vm-subnet\u0026gt; -Action Allow -Profile Any 4. DAB yapılandırmasını yazın # Dosya düzeni göründüğünden daha önemli; nedenini bulgular anlatıyor.\ndab-config.json, kök dosya: runtime, sunucu dosyalarının listesi ve bir yer tutucu veri kaynağı. Her SQL Server için bir dosya (sql01.json, sql02.json): bağlantı dizesi ve entity\u0026rsquo;leri. Bir entity = bir sunucudaki bir DMV view\u0026rsquo;ı, adı \u0026lt;sunucu\u0026gt;_\u0026lt;view\u0026gt;: sql01_wait_stats, sql02_sessions. Kök dosya (C:\\dab\\config\\dab-config.json):\n{ \u0026#34;data-source\u0026#34;: { \u0026#34;database-type\u0026#34;: \u0026#34;mssql\u0026#34;, \u0026#34;connection-string\u0026#34;: \u0026#34;Server=dab-placeholder.invalid;Database=master;Integrated Security=True;Encrypt=True;TrustServerCertificate=True\u0026#34;, \u0026#34;health\u0026#34;: { \u0026#34;enabled\u0026#34;: false, \u0026#34;name\u0026#34;: \u0026#34;placeholder\u0026#34; } }, \u0026#34;data-source-files\u0026#34;: [ \u0026#34;sql01.json\u0026#34;, \u0026#34;sql02.json\u0026#34; ], \u0026#34;entities\u0026#34;: {}, \u0026#34;runtime\u0026#34;: { \u0026#34;rest\u0026#34;: { \u0026#34;enabled\u0026#34;: false }, \u0026#34;graphql\u0026#34;: { \u0026#34;enabled\u0026#34;: false }, \u0026#34;mcp\u0026#34;: { \u0026#34;enabled\u0026#34;: true, \u0026#34;path\u0026#34;: \u0026#34;/mcp\u0026#34;, \u0026#34;allowed-hosts\u0026#34;: [ \u0026#34;mcp01\u0026#34;, \u0026#34;mcp01.contoso.local\u0026#34; ], \u0026#34;dml-tools\u0026#34;: { \u0026#34;describe-entities\u0026#34;: true, \u0026#34;read-records\u0026#34;: true, \u0026#34;aggregate-records\u0026#34;: true, \u0026#34;create-record\u0026#34;: false, \u0026#34;update-record\u0026#34;: false, \u0026#34;delete-record\u0026#34;: false, \u0026#34;execute-entity\u0026#34;: false } }, \u0026#34;host\u0026#34;: { \u0026#34;mode\u0026#34;: \u0026#34;production\u0026#34;, \u0026#34;authentication\u0026#34;: { \u0026#34;provider\u0026#34;: \u0026#34;EntraId\u0026#34;, \u0026#34;jwt\u0026#34;: { \u0026#34;audience\u0026#34;: \u0026#34;\u0026lt;appId\u0026gt;\u0026#34;, \u0026#34;issuer\u0026#34;: \u0026#34;https://login.microsoftonline.com/\u0026lt;tenant-id\u0026gt;/v2.0\u0026#34; } } }, \u0026#34;cache\u0026#34;: { \u0026#34;enabled\u0026#34;: false } } } Bir sunucu dosyası (sql01.json), tek entity ve üç kolonuna kısaltılmış hâli:\n{ \u0026#34;data-source\u0026#34;: { \u0026#34;database-type\u0026#34;: \u0026#34;mssql\u0026#34;, \u0026#34;connection-string\u0026#34;: \u0026#34;Server=sql01.contoso.local;Database=master;Integrated Security=True;Encrypt=True;TrustServerCertificate=True;Application Name=dab-mcp\u0026#34;, \u0026#34;health\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;sql01\u0026#34; } }, \u0026#34;entities\u0026#34;: { \u0026#34;sql01_wait_stats\u0026#34;: { \u0026#34;description\u0026#34;: \u0026#34;sql01: sys.dm_os_wait_stats\u0026#34;, \u0026#34;source\u0026#34;: { \u0026#34;object\u0026#34;: \u0026#34;sys.dm_os_wait_stats\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;view\u0026#34; }, \u0026#34;fields\u0026#34;: [ { \u0026#34;name\u0026#34;: \u0026#34;wait_type\u0026#34;, \u0026#34;primary-key\u0026#34;: true }, { \u0026#34;name\u0026#34;: \u0026#34;wait_time_ms\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Total wait time for this wait type in ms, including signal_wait_time_ms.\u0026#34; }, { \u0026#34;name\u0026#34;: \u0026#34;signal_wait_time_ms\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;Part of wait_time_ms spent waiting for CPU after the resource was ready (CPU pressure).\u0026#34; } ], \u0026#34;graphql\u0026#34;: { \u0026#34;enabled\u0026#34;: false }, \u0026#34;cache\u0026#34;: { \u0026#34;enabled\u0026#34;: false }, \u0026#34;permissions\u0026#34;: [ { \u0026#34;role\u0026#34;: \u0026#34;MCP.Read\u0026#34;, \u0026#34;actions\u0026#34;: [ \u0026#34;read\u0026#34; ] } ] } } } Sunucu başına yedi view ve DAB\u0026rsquo;ın her biri için istediği anahtar:\nEntity DMV view\u0026rsquo;ı Anahtar wait_stats sys.dm_os_wait_stats wait_type perf_counters sys.dm_os_performance_counters object_name, counter_name, instance_name sys_memory sys.dm_os_sys_memory total_physical_memory_kb memory_clerks sys.dm_os_memory_clerks memory_clerk_address sessions sys.dm_exec_sessions session_id requests sys.dm_exec_requests session_id, request_id query_stats sys.dm_exec_query_stats sql_handle, statement_start_offset, statement_end_offset, plan_handle Zor yoldan öğrendiğimiz kurallar:\nHer kolonu fields içinde listeleyin, agent\u0026rsquo;ın filtrelediği kolonlara açıklama yazın. describe_entities yalnız fields içindekileri gösterir. İlk denemede agent 72 \u0026ldquo;kullanıcı oturumu\u0026rdquo; saydı, çünkü is_user_process kolonundan habersizdi; kolon açıklanınca 2 dedi, doğrusu da buydu. ✅ anonymous rolü yok. Her entity\u0026rsquo;yi yalnız MCP.Read okuyabilir. ✅ Her yerde önbellek kapalı: bunlar canlı DMV\u0026rsquo;ler. ✅ Entity\u0026rsquo;leri tek tek ekleyin ve log\u0026rsquo;u izleyin. Tek bir hatalı entity bütün DAB\u0026rsquo;ı durdurur. ✅ Başlatın: Start-ScheduledTask DAB-MCP; ardından Get-NetTCPConnection -LocalPort 5000 -State Listen çıktısında 0.0.0.0 görünür.\n5. Entra uygulamasını oluşturun ve agent\u0026rsquo;a rolünü verin (admin makinesi) # api://\u0026lt;appId\u0026gt; tanımlayıcı URI\u0026rsquo;li, v2 token\u0026rsquo;lı, uygulamalar için tek bir MCP.Read rolü olan, atamayı zorunlu tutan ve bu rolü agent\u0026rsquo;ın managed identity\u0026rsquo;sine atayan sql-mcp-api uygulama kaydı. Blok tekrar çalıştırılabilir.\nzsh PowerShell AGENT=/subscriptions/\u0026lt;sub\u0026gt;/resourceGroups/\u0026lt;rg\u0026gt;/providers/Microsoft.App/agents/\u0026lt;agent\u0026gt; AGENT_MI_OID=$(az resource show --ids \u0026#34;$AGENT\u0026#34; --api-version 2026-01-01 --query identity.principalId -o tsv) APPID=$(az ad app list --display-name sql-mcp-api --query \u0026#34;[0].appId\u0026#34; -o tsv) [ -n \u0026#34;$APPID\u0026#34; ] || APPID=$(az ad app create --display-name sql-mcp-api --query appId -o tsv) az ad app update --id \u0026#34;$APPID\u0026#34; --identifier-uris \u0026#34;api://$APPID\u0026#34; az rest -m PATCH --url \u0026#34;https://graph.microsoft.com/v1.0/applications(appId=\u0026#39;$APPID\u0026#39;)\u0026#34; \\ --body \u0026#39;{\u0026#34;api\u0026#34;:{\u0026#34;requestedAccessTokenVersion\u0026#34;:2}}\u0026#39; ROLE=$(az ad app show --id \u0026#34;$APPID\u0026#34; --query \u0026#34;appRoles[?value==\u0026#39;MCP.Read\u0026#39;].id\u0026#34; -o tsv) if [ -z \u0026#34;$ROLE\u0026#34; ]; then ROLE=$(uuidgen | tr \u0026#39;A-Z\u0026#39; \u0026#39;a-z\u0026#39;) az rest -m PATCH --url \u0026#34;https://graph.microsoft.com/v1.0/applications(appId=\u0026#39;$APPID\u0026#39;)\u0026#34; \\ --body \u0026#34;{\\\u0026#34;appRoles\\\u0026#34;:[{\\\u0026#34;allowedMemberTypes\\\u0026#34;:[\\\u0026#34;Application\\\u0026#34;],\\\u0026#34;displayName\\\u0026#34;:\\\u0026#34;MCP.Read\\\u0026#34;,\\\u0026#34;description\\\u0026#34;:\\\u0026#34;Read DMVs through SQL MCP\\\u0026#34;,\\\u0026#34;id\\\u0026#34;:\\\u0026#34;$ROLE\\\u0026#34;,\\\u0026#34;isEnabled\\\u0026#34;:true,\\\u0026#34;value\\\u0026#34;:\\\u0026#34;MCP.Read\\\u0026#34;}]}\u0026#34; fi SPID=$(az ad sp list --filter \u0026#34;appId eq \u0026#39;$APPID\u0026#39;\u0026#34; --query \u0026#34;[0].id\u0026#34; -o tsv) [ -n \u0026#34;$SPID\u0026#34; ] || SPID=$(az ad sp create --id \u0026#34;$APPID\u0026#34; --query id -o tsv) az rest -m PATCH --url \u0026#34;https://graph.microsoft.com/v1.0/servicePrincipals/$SPID\u0026#34; --body \u0026#39;{\u0026#34;appRoleAssignmentRequired\u0026#34;:true}\u0026#39; az rest -m POST --url \u0026#34;https://graph.microsoft.com/v1.0/servicePrincipals/$SPID/appRoleAssignedTo\u0026#34; \\ --body \u0026#34;{\\\u0026#34;principalId\\\u0026#34;:\\\u0026#34;$AGENT_MI_OID\\\u0026#34;,\\\u0026#34;resourceId\\\u0026#34;:\\\u0026#34;$SPID\\\u0026#34;,\\\u0026#34;appRoleId\\\u0026#34;:\\\u0026#34;$ROLE\\\u0026#34;}\u0026#34; $AGENT = \u0026#39;/subscriptions/\u0026lt;sub\u0026gt;/resourceGroups/\u0026lt;rg\u0026gt;/providers/Microsoft.App/agents/\u0026lt;agent\u0026gt;\u0026#39; $AGENT_MI_OID = az resource show --ids $AGENT --api-version 2026-01-01 --query identity.principalId -o tsv $APPID = az ad app list --display-name sql-mcp-api --query \u0026#34;[0].appId\u0026#34; -o tsv if (-not $APPID) { $APPID = az ad app create --display-name sql-mcp-api --query appId -o tsv } az ad app update --id $APPID --identifier-uris \u0026#34;api://$APPID\u0026#34; \u0026#39;{\u0026#34;api\u0026#34;:{\u0026#34;requestedAccessTokenVersion\u0026#34;:2}}\u0026#39; | Out-File -Encoding ascii ver.json az rest -m PATCH --url \u0026#34;https://graph.microsoft.com/v1.0/applications(appId=\u0026#39;$APPID\u0026#39;)\u0026#34; --body \u0026#39;@ver.json\u0026#39; $ROLE = az ad app show --id $APPID --query \u0026#34;appRoles[?value==\u0026#39;MCP.Read\u0026#39;].id\u0026#34; -o tsv if (-not $ROLE) { $ROLE = [guid]::NewGuid().Guid @{ appRoles = @(@{ allowedMemberTypes = @(\u0026#39;Application\u0026#39;); displayName = \u0026#39;MCP.Read\u0026#39;; description = \u0026#39;Read DMVs through SQL MCP\u0026#39;; id = $ROLE; isEnabled = $true; value = \u0026#39;MCP.Read\u0026#39; }) } | ConvertTo-Json -Depth 5 | Out-File -Encoding ascii roles.json az rest -m PATCH --url \u0026#34;https://graph.microsoft.com/v1.0/applications(appId=\u0026#39;$APPID\u0026#39;)\u0026#34; --body \u0026#39;@roles.json\u0026#39; } $SPID = az ad sp list --filter \u0026#34;appId eq \u0026#39;$APPID\u0026#39;\u0026#34; --query \u0026#34;[0].id\u0026#34; -o tsv if (-not $SPID) { $SPID = az ad sp create --id $APPID --query id -o tsv } \u0026#39;{\u0026#34;appRoleAssignmentRequired\u0026#34;:true}\u0026#39; | Out-File -Encoding ascii req.json az rest -m PATCH --url \u0026#34;https://graph.microsoft.com/v1.0/servicePrincipals/$SPID\u0026#34; --body \u0026#39;@req.json\u0026#39; @{ principalId = $AGENT_MI_OID; resourceId = $SPID; appRoleId = $ROLE } | ConvertTo-Json | Out-File -Encoding ascii asg.json az rest -m POST --url \u0026#34;https://graph.microsoft.com/v1.0/servicePrincipals/$SPID/appRoleAssignedTo\u0026#34; --body \u0026#39;@asg.json\u0026#39; İki tuzak: az ad app update --set api… hata verir (\u0026ldquo;Couldn\u0026rsquo;t find \u0026lsquo;api\u0026rsquo;\u0026rdquo;), Graph PATCH\u0026rsquo;i bu yüzden. Bir uygulama rolünün id\u0026rsquo;si de bir kez oluşunca değiştirilemez, var olanın yeniden kullanılması bu yüzden. ✅ Rolü, agent ilk kez token istemeden önce atayın: managed identity token\u0026rsquo;ları 24 saate kadar önbellekte kalır ve erken alınmış bir token\u0026rsquo;da roles claim\u0026rsquo;i olmaz. 📄\n6. MCP trafiğini VNet\u0026rsquo;te tutun, sonra connector\u0026rsquo;ı ekleyin (admin makinesi) # \u0026ldquo;Remote MCP server access\u0026rdquo; kapalı olunca MCP trafiği VNet\u0026rsquo;inizden geçer. Açıkken Microsoft\u0026rsquo;un ağı üzerinden internete çıkar ve özel bir host\u0026rsquo;a ulaşamaz. egress nesnesini bütün olarak gönderin. ✅\nzsh PowerShell az rest -m PATCH --url \u0026#34;https://management.azure.com$AGENT?api-version=2026-01-01\u0026#34; \\ --body \u0026#39;{\u0026#34;properties\u0026#34;:{\u0026#34;sandboxConfiguration\u0026#34;:{\u0026#34;egress\u0026#34;:{\u0026#34;mode\u0026#34;:\u0026#34;AzureVNet\u0026#34;,\u0026#34;vnetConfiguration\u0026#34;:{\u0026#34;usePrivateDnsResolution\u0026#34;:true},\u0026#34;allowHttpMcpServerNetworkAccess\u0026#34;:false}}}}\u0026#39; az rest -m GET --url \u0026#34;https://management.azure.com$AGENT?api-version=2026-01-01\u0026#34; \\ --query properties.sandboxConfiguration.egress.allowHttpMcpServerNetworkAccess # false \u0026#39;{\u0026#34;properties\u0026#34;:{\u0026#34;sandboxConfiguration\u0026#34;:{\u0026#34;egress\u0026#34;:{\u0026#34;mode\u0026#34;:\u0026#34;AzureVNet\u0026#34;,\u0026#34;vnetConfiguration\u0026#34;:{\u0026#34;usePrivateDnsResolution\u0026#34;:true},\u0026#34;allowHttpMcpServerNetworkAccess\u0026#34;:false}}}}\u0026#39; | Out-File -Encoding ascii egress.json az rest -m PATCH --url \u0026#34;https://management.azure.com${AGENT}?api-version=2026-01-01\u0026#34; --body \u0026#39;@egress.json\u0026#39; az rest -m GET --url \u0026#34;https://management.azure.com${AGENT}?api-version=2026-01-01\u0026#34; ` --query properties.sandboxConfiguration.egress.allowHttpMcpServerNetworkAccess # false Şimdi connector. Portalda: Builder → Connectors → Add connector → MCP server, Streamable-HTTP, URL http://mcp01.contoso.local:5000/mcp, kimlik doğrulama Managed identity (system-assigned), scope api://\u0026lt;appId\u0026gt;/.default, özel başlık X-MS-API-ROLE = MCP.Read, sonra üç aracı seçin. 📄 (portal yolu; biz aşağıdaki ARM çağrısını çalıştırdık ✅)\nconnector.json içinde sır yok. Araç adlarının önüne connector\u0026rsquo;ın adı gelir:\n{\u0026#34;properties\u0026#34;:{\u0026#34;dataConnectorType\u0026#34;:\u0026#34;Mcp\u0026#34;,\u0026#34;dataSource\u0026#34;:\u0026#34;placeholder\u0026#34;,\u0026#34;identity\u0026#34;:\u0026#34;system\u0026#34;, \u0026#34;extendedProperties\u0026#34;:{\u0026#34;type\u0026#34;:\u0026#34;http\u0026#34;,\u0026#34;endpoint\u0026#34;:\u0026#34;http://mcp01.contoso.local:5000/mcp\u0026#34;, \u0026#34;authType\u0026#34;:\u0026#34;AzureARM\u0026#34;,\u0026#34;armScope\u0026#34;:\u0026#34;api://\u0026lt;appId\u0026gt;/.default\u0026#34;, \u0026#34;X-MS-API-ROLE\u0026#34;:\u0026#34;MCP.Read\u0026#34;, \u0026#34;selectedTools\u0026#34;:[\u0026#34;dmv_describe_entities\u0026#34;,\u0026#34;dmv_read_records\u0026#34;,\u0026#34;dmv_aggregate_records\u0026#34;], \u0026#34;toolsVisibleToMetaAgent\u0026#34;:[\u0026#34;dmv_describe_entities\u0026#34;,\u0026#34;dmv_read_records\u0026#34;,\u0026#34;dmv_aggregate_records\u0026#34;]}}} zsh PowerShell az rest -m PUT --url \u0026#34;https://management.azure.com$AGENT/connectors/dmv?api-version=2026-01-01\u0026#34; \\ --body @connector.json -o none az rest -m PUT --url \u0026#34;https://management.azure.com${AGENT}/connectors/dmv?api-version=2026-01-01\u0026#34; ` --body \u0026#39;@connector.json\u0026#39; -o none authType: AzureARM, portaldaki \u0026ldquo;Managed identity\u0026rdquo; seçeneğinin yazdığı değerdir; özel başlıklar extendedProperties içinde düz anahtar olarak durur. Sonradan yapılan bir GET, endpoint, armScope ve başlığı null gösterir; bunlar yalnız yazılabilir alanlardır. ✅\nDoğrulama # SQL\u0026rsquo;de (bir DBA olarak kontrol edin): DAB\u0026rsquo;ın oturumu gMSA\u0026rsquo;dır, Kerberos ile gelir, sysadmin değildir. ✅\nSELECT s.login_name, c.auth_scheme, IS_SRVROLEMEMBER(\u0026#39;sysadmin\u0026#39;, s.login_name) AS is_sysadmin FROM sys.dm_exec_sessions s JOIN sys.dm_exec_connections c ON c.session_id = s.session_id WHERE s.program_name LIKE \u0026#39;dab-mcp%\u0026#39;; -- CONTOSO\\gmsa-dab$ KERBEROS 0 Agent\u0026rsquo;a sorun: \u0026ldquo;sql01\u0026rsquo;de şu an kaç kullanıcı oturumu var?\u0026rdquo; ve \u0026ldquo;sql02\u0026rsquo;de en çok hangi wait türü var?\u0026rdquo;. Konuşmada MCP Tool çağrıları görünür. Hemen ardından sqlcmd ile karşılaştırın: aynı wait türleri, aynı sırada (değerler kümülatif) ve sqlcmd\u0026lsquo;de bir oturum fazla (kendisi). ✅\nYalnız agent okuyabilir ✅:\nhost\u0026rsquo;un kendi managed identity\u0026rsquo;si api://\u0026lt;appId\u0026gt; için token alamaz: AADSTS501051, atanmamış; bir ARM token\u0026rsquo;ı HTTP 401 alır (yanlış audience); X-MS-API-ROLE başlığı olmadan agent\u0026rsquo;ın çağrıları NoEntitiesConfigured döner. Yol VNet\u0026rsquo;tir. MCP host\u0026rsquo;unda Filtering Platform denetimini bir dakikalığına açın, agent\u0026rsquo;a bir şey sorun ve 5000 portuna gelen bağlantıların kaynaklarını listeleyin. Hepsi agent alt ağında olmalı. ✅\nauditpol /set /subcategory:\u0026#34;Filtering Platform Connection\u0026#34; /success:enable # ...ask the agent a question, then: Get-WinEvent -FilterHashtable @{LogName=\u0026#39;Security\u0026#39;; Id=5156; StartTime=(Get-Date).AddMinutes(-10)} | Where-Object { $_.Message -match \u0026#39;Destination Port:\\s+5000\u0026#39; -and $_.Message -match \u0026#39;Inbound\u0026#39; } | ForEach-Object { [regex]::Match($_.Message,\u0026#39;Source Address:\\s+(\\S+)\u0026#39;).Groups[1].Value } | Group-Object | ForEach-Object { \u0026#34;$($_.Count) x $($_.Name)\u0026#34; } auditpol /set /subcategory:\u0026#34;Filtering Platform Connection\u0026#34; /success:disable # it fills the Security log fast Neler bulduk # Bulgu 1: erişilemeyen tek bir SQL Server, açılışta bütün DAB\u0026rsquo;ı durdurur # DAB açılırken her entity\u0026rsquo;nin şemasını okur. O anda herhangi bir SQL Server\u0026rsquo;a erişilemiyorsa DAB kapanır. Sağlıklı sunucular da onunla birlikte gider. ✅\ndab.log şunu yazar: Unable to complete runtime initialization … Cannot obtain Schema for entity sql02_wait_stats … A network-related or instance-specific error. Entity\u0026rsquo;nin öneki hangi sunucu olduğunu söyler. ✅ Sunucu geri geldiğinde kendiliğinden toparlanmaz. Görevin \u0026ldquo;hata olursa yeniden başlat\u0026rdquo; ayarı hiç devreye girmez: cmd.exe sorunsuz başlamış, DAB -1 ile çıkmıştır ve Task Scheduler bunu completed olarak kaydeder (olay 201, dönüş kodu 4294967295, seviye Information). Onu yalnız Start-ScheduledTask DAB-MCP geri getirir. ✅ Görev çıktıyı \u0026gt; ile yönlendirir, yani her başlatma dab.log\u0026lsquo;un üzerine yazar. Yeniden başlatmadan önce okuyun. ✅ Application log\u0026rsquo;a .NET Runtime 1000 \u0026ldquo;Hosting failed to start\u0026rdquo; düşer; hiçbir sunucunun adını vermez. ✅ Bir sunucu DAB çalışırken ölürse yalnız onun entity\u0026rsquo;leri hata verir (ilk çağrı yaklaşık 15 sn sonra, bağlantı zaman aşımı) ve sunucu dönünce kendiliğinden düzelir. ✅ Görevi değil, dinleyiciyi izleyin. Bir SQL Server\u0026rsquo;ı yamaladıktan ya da MCP host\u0026rsquo;unu yeniden başlattıktan sonra TCP 5000\u0026rsquo;de bir şeyin dinlediğini (ya da bir MCP initialize çağrısının başarılı olduğunu) dışarıdan kontrol edin. Görev durumu Ready der ve zararsız görünür. DAB\u0026rsquo;ı yalnız bütün SQL Server\u0026rsquo;ları ayaktayken yeniden başlatın. Bulgu 2: .off çözümü # DAB 2.1.5\u0026rsquo;te bir veri kaynağı ya da entity için enabled bayrağı yok. Bariz anahtarları, sunuculardan birinin var olmayan bir adı gösterdiği bir config kopyasında denedik:\nDeneme Sonuç Ölü sunucunun bütün entity\u0026rsquo;lerinde \u0026quot;mcp\u0026quot;: false DAB yine açılışta düşer ✅ Üstüne veri kaynağında health.enabled: false yine düşer ✅ sql02.json dosyasının adını sql02.json.off yapmak açılır, sql01\u0026rsquo;in 7 entity\u0026rsquo;siyle ✅ Nedeni DAB\u0026rsquo;ın yükleyicisinde: data-source-files içinde listelenen ama diskte olmayan bir dosya sessizce atlanır. 📄 (kaynak kod) ✅ (davranış). Her sunucunun, ilki dahil, kendi dosyası olmasının ve kökte yalnız bir yer tutucu veri kaynağı bulunmasının nedeni bu: DAB 2.1.5 veri kaynağı olmayan bir kökü reddeder (\u0026ldquo;Invalid connection-string\u0026rdquo;), adı çözülemeyen ve entity\u0026rsquo;si olmayan yer tutucuya ise hiç bağlanmaz. ✅ Her DAB yükseltmesinden sonra bunu yeniden test edin; sonraki bir sürüm ona bağlanmayı deneyebilir. 📄\nBir sunucuyu host\u0026rsquo;ta devreden çıkarmak:\n$s = \u0026#39;sql02\u0026#39; Rename-Item \u0026#34;C:\\dab\\config\\$s.json\u0026#34; \u0026#34;$s.json.off\u0026#34; Stop-ScheduledTask DAB-MCP; Get-Process Microsoft.DataApiBuilder -EA SilentlyContinue | Stop-Process -Force Start-ScheduledTask DAB-MCP; Start-Sleep 15 [bool](Get-NetTCPConnection -LocalPort 5000 -State Listen -EA SilentlyContinue) # True = DAB is up Ya da bir Azure VM için admin makinesinden, VM agent\u0026rsquo;ı üzerinden (SSH gerekmez). 📄 (çalıştırılmadı)\nzsh PowerShell az vm run-command invoke -g \u0026lt;rg\u0026gt; -n mcp01 --command-id RunPowerShellScript --query \u0026#39;value[0].message\u0026#39; -o tsv --scripts \\ \u0026#39;Rename-Item C:\\dab\\config\\sql02.json sql02.json.off; Stop-ScheduledTask DAB-MCP; Get-Process Microsoft.DataApiBuilder -EA SilentlyContinue | Stop-Process -Force; Start-ScheduledTask DAB-MCP; Start-Sleep 15; [bool](Get-NetTCPConnection -LocalPort 5000 -State Listen -EA SilentlyContinue)\u0026#39; \u0026#39;Rename-Item C:\\dab\\config\\sql02.json sql02.json.off; Stop-ScheduledTask DAB-MCP; Get-Process Microsoft.DataApiBuilder -EA SilentlyContinue | Stop-Process -Force; Start-ScheduledTask DAB-MCP; Start-Sleep 15; [bool](Get-NetTCPConnection -LocalPort 5000 -State Listen -EA SilentlyContinue)\u0026#39; | Set-Content takeout.ps1 az vm run-command invoke -g \u0026lt;rg\u0026gt; -n mcp01 --command-id RunPowerShellScript --scripts \u0026#39;@takeout.ps1\u0026#39; --query \u0026#39;value[0].message\u0026#39; -o tsv Geri almak için iki adı yer değiştirip yeniden başlatın. Atlama sessiz olduğundan data-source-files içindeki bir yazım hatası da bir sunucuyu sessizce düşürür. Her değişiklikten sonra DAB\u0026rsquo;ın yükleyeceği entity\u0026rsquo;leri sayın ve sayı 7 × sunucu sayısının altına düşünce alarm verin:\n$c = \u0026#39;C:\\dab\\config\u0026#39;; $root = Get-Content \u0026#34;$c\\dab-config.json\u0026#34; -Raw | ConvertFrom-Json $n = 0 foreach ($f in $root.\u0026#39;data-source-files\u0026#39;) { if (Test-Path \u0026#34;$c\\$f\u0026#34;) { $n += @((Get-Content \u0026#34;$c\\$f\u0026#34; -Raw | ConvertFrom-Json).entities.PSObject.Properties).Count } else { \u0026#34;MISSING: $f (DAB skips it silently)\u0026#34; } } \u0026#34;entities DAB will load: $n\u0026#34; Get-ChildItem \u0026#34;$c\\*.json.off\u0026#34; -EA SilentlyContinue | ForEach-Object { \u0026#34;TAKEN OUT: $($_.Name)\u0026#34; } Toparlanmayı bilerek elle bıraktık. Otomatik bir yeniden deneme döngüsü, ölü sunucu çıkarılana ya da geri gelene kadar yine başarısız olur ve sorunu gizler.\nBulgu 3: sunucu yapılandırması neden açılmıyor # Doğal bir sonraki soru \u0026ldquo;sql01\u0026rsquo;de MAXDOP kaç?\u0026rdquo; oldu. DAB bunu SQL\u0026rsquo;de bir nesne olmadan cevaplayamıyor:\nsys.configurations, sys.database_scoped_configurations ve sys.dm_server_registry view\u0026rsquo;larında sql_variant kolonlar var. DAB bir view\u0026rsquo;ın şemasını SELECT * ile okur ve filtre modelini yalnız fields içindekilerden değil, bütün kolonlardan kurar. sql_variant\u0026lsquo;ın karşılığı yok, bu yüzden DAB açılışta düşer; kolonu fields dışında bırakmak da işe yaramaz. 📄 (DAB kaynak kodu; kolon tipleri kontrol edildi ✅) SERVERPROPERTY() ve @@VERSION fonksiyondur. DAB yalnız tablo, view ve stored procedure sunar. DMV fonksiyonlarını denedik (dm_exec_sql_text, dm_db_index_physical_stats, dm_io_virtual_file_stats): DAB, SQL hatası 216 ile (\u0026ldquo;parameters were not supplied\u0026rdquo;) açılamaz. ✅ Her şeyi düz tiplere çeviren bir sarmalayıcı view işe yarardı, ama o SQL\u0026rsquo;de bir nesnedir ve bu tasarım buna izin vermez. Yapılandırma soruları sqlcmd ve SSMS\u0026rsquo;te kalıyor. Bulgu 4: sınır kapasite değil, hata bağımlılığı # Tek bir DAB\u0026rsquo;a, her biri yedi entity\u0026rsquo;li 50 veri kaynağına kadar yükledik ve ölçtük. Veri kaynakları iki gerçek sunucumuzun takma adlarıydı. ✅\nSunucu Dinleyici ayakta / ilk okuma Bellek (working set) describe_entities tam / nameOnly / tek entity 2 2.1 s / 4.9 s 132 MB 74 KB / 2.3 KB / 1.5 KB 10 2.4 s / 5.2 s 152 MB 368 KB / 11 KB / 1.5 KB 25 3.5 s / 6.2 s 161 MB 921 KB / 27 KB / 1.5 KB 50 5.2 s / 8.0 s 176 MB 1.8 MB / 54 KB / 1.5 KB 25 sunucuda agent, \u0026ldquo;sql17\u0026rsquo;de en çok hangi wait var\u0026rdquo; ve \u0026ldquo;sql22\u0026rsquo;de kaç kullanıcı oturumu var\u0026rdquo; için doğru entity\u0026rsquo;yi kendi buldu: önce nameOnly ile describe_entities çağırdı (18 KB), sonra tek bir entity\u0026rsquo;yi; oturum sayısı sqlcmd ile aynıydı. 921 KB\u0026rsquo;lık tam açıklamayı hiç çekmedi. ✅\nYani sunucuları DAB başına sayıya göre değil, hata alanı ve bakım penceresine göre gruplayın ve her grubu 25 ya da daha az tutun (test ettiğimiz büyüklük). 25 ayrı gerçek sunucuyla ağ gecikmesi ve bağlantı havuzları ölçülmedi. 📄\nSorun giderme # Belirti Neden Çözüm Yeniden başlatmadan sonra DAB açılmıyor; dab.log: Cannot obtain Schema for entity … Açılışta bir SQL Server\u0026rsquo;a erişilemedi Sunucuyu geri getirin ya da dosyasının adını .off yapın, sonra Start-ScheduledTask DAB-MCP DAB duruyor, bütün entity\u0026rsquo;ler kapalı Tek bir hatalı entity (fonksiyon, sql_variant\u0026lsquo;lı view, yazım hatası) Son sağlam config\u0026rsquo;e dönün; entity\u0026rsquo;leri tek tek ekleyin HTTP 401, invalid_token Yanlış aud/iss, ya da host imza anahtarları için Entra\u0026rsquo;ya ulaşamıyor DAB audience = \u0026lt;appId\u0026gt; (api://… değil, GUID), issuer …/v2.0; Entra\u0026rsquo;ya giden 443 NoEntitiesConfigured ya da PermissionDenied X-MS-API-ROLE başlığı yok, rol authenticated kalıyor Başlığı connector\u0026rsquo;a ekleyin HTTP 403 Başlıktaki rol token\u0026rsquo;da yok MCP.Read rolünü agent\u0026rsquo;ın kimliğine atayın Token\u0026rsquo;da roles yok Managed identity token\u0026rsquo;ı atamadan önce alınmış ve önbellekte Bekleyin (~24 saate kadar); bir dahaki sefere ilk kullanımdan önce atayın Connector bağlanmıyor Ad agent alt ağından çözülmüyor, firewall kuralı yok, DAB 0.0.0.0\u0026lsquo;da değil, remote MCP access açık ya da Host allowed-hosts\u0026lsquo;ta yok Hepsini kontrol edin; Get-NetTCPConnection -LocalPort 5000 -State Listen Sessions/requests tek oturum gösteriyor Login\u0026rsquo;in yetkisi eksik; bu view\u0026rsquo;lar o zaman yalnız DAB\u0026rsquo;ın kendi oturumunu döndürür gMSA için sys.server_permissions\u0026lsquo;a bakın dab.log boş Production modunda normal Bunun yerine dinleyiciyi ve bir MCP çağrısını kontrol edin Ne öğrendik # DMV view\u0026rsquo;ları evet; DMV fonksiyonları hayır. SQL\u0026rsquo;de hiçbir nesne olmadan DAB view\u0026rsquo;ları sunar. Sorgu metni, index parçalanması ve dosya I/O bir sarmalayıcı ister; bu bir config ayarı değil, bir tasarım kararıdır. Bir gMSA ve ##MS_ServerPerformanceStateReader## yeterli. Tek login, Kerberos, veritabanı kullanıcısı yok, gMSA sysadmin değil. Uçtan uca managed identity, hiçbir yerde sır yok. Token\u0026rsquo;ı agent\u0026rsquo;ın MI\u0026rsquo;ı alır, uygulama rolü kapıyı tutar, DAB doğrular. Statik bir bearer token da çalışır ve bir günde süresi dolar. Açılışta erişilemeyen tek sunucu bütün sunucuları düşürür ve kimse yeniden başlatmaz. Dinleyiciyi dışarıdan izleyin; Task Scheduler başarı raporlar. Kapatma anahtarı yok, ama eksik dosya atlanıyor. Sunucu başına bir dosya ve yer tutucu bir kök, bunu temiz ama sessiz bir .off anahtarına çevirir. Entity\u0026rsquo;leri sayarak sesini açın. Kolonlarınızı açıklayın. is_user_process bir açıklamaya kavuşana kadar agent \u0026ldquo;72 kullanıcı oturumu\u0026rdquo; dedi. Serinin devamı: bu kurulumu izlemek: yukarıdaki hata sinyallerine, görev durumuna güvenmeden alarm kurmak.\n","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/posts/sql-mcp-part-1/","section":"Yazılar","summary":"","title":"Azure SRE Agent için SQL MCP kurulumu","type":"posts"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/azure-sre-agent/","section":"Tags","summary":"","title":"Azure-Sre-Agent","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/dab/","section":"Tags","summary":"","title":"Dab","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/entra-id/","section":"Tags","summary":"","title":"Entra-Id","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/gmsa/","section":"Tags","summary":"","title":"Gmsa","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/kerberos/","section":"Tags","summary":"","title":"Kerberos","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/mcp/","section":"Tags","summary":"","title":"Mcp","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/series/sql-mcp-for-azure-sre-agent/","section":"Series","summary":"","title":"SQL MCP for Azure SRE Agent","type":"series"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/sql-server/","section":"Tags","summary":"","title":"Sql-Server","type":"tags"},{"content":"Azure SRE Agent, MCP ve Data API builder için lab\u0026rsquo;de kanıtlanmış rehberler. Her yazı önce gerçek bir lab\u0026rsquo;de kurulur ve her iddia işaretlenir: ✅ lab\u0026rsquo;de kanıtlandı, 📄 yalnız belgede var.\nSeriler Azure SRE Agent Için SQL MCP · 1 Etiketler #Azure-Sre-Agent #Dab #Entra-Id #Gmsa #Kerberos #Mcp #Sql-Server ","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/","section":"SRE Agent Lab","summary":"","title":"SRE Agent Lab","type":"page"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"4 Ekim 2026","externalUrl":null,"permalink":"/tr/posts/","section":"Yazılar","summary":"","title":"Yazılar","type":"posts"},{"content":"","externalUrl":null,"permalink":"/tr/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/tr/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"}]