Aracılığıyla paylaş


Hızlı Başlangıç: Azure Container Apps ile SQL MCP Server kullanma

Azure Container Apps'e dağıtılan bir SQL MCP Sunucusunu gösteren diyagram.

Önemli

SQL Model Bağlam Protokolü (MCP) Sunucusu önizleme aşamasındadır ve bu belgeler ve altyapı uygulaması değişebilir. Veri API oluşturucusu sürüm 1.7 önizleme aşamasındayken, MCP özellikleri henüz etikete dahil 1.7.83-rc edilmediğinden yayın öncesi sürümü açıkça kullanmanız gerekir (örneğin, :latest).

Bu hızlı başlangıçta SQL MCP Server'ın Azure Container Apps'e nasıl dağıtılacağı gösterilmektedir. Dağıtıldıktan sonra Visual Studio Code (VS Code), Microsoft Foundry veya başka bir Model Bağlam Protokolü (MCP) istemcisinden uzak sunucu uç noktası olarak bağlanabilirsiniz.

ACA dağıtım iş akışını gösteren sıralı diyagram.

Önkoşullar

Azure aboneliği

Etkin bir Azure aboneliğine ihtiyacınız vardır. Hesabınız yoksa ücretsiz bir Azure hesabı oluşturun.

Azure Komut Satırı Arayüzü (Azure CLI)

Kaynakları dağıtmak için Azure CLI'yi yükleyin:

winget install Microsoft.AzureCLI

.NET 9+

Bu aracı zaten yüklemiş olabilirsiniz. komutunu çalıştırın dotnet --version ve sürüm 9 veya üzerini bildirdiğinden emin olun.

winget install Microsoft.DotNet.Runtime.9

Veri API'si oluşturucu CLI

dotnet new tool-manifest
dotnet tool install microsoft.dataapibuilder --prerelease

Uyarı

SQL MCP Server şu anda ön sürümdedir. bayrağını --prerelease kullanmak, bu hızlı başlangıçta kullanılan tüm özelliklerle Data API builder'ın en son sürümünü edinmenizi sağlar.

PowerShell

Henüz yüklü değilse PowerShell'i yükleyin.

dotnet tool install --global PowerShell

1. Adım: Azure SQL Veritabanı oluşturma ve dağıtma

1. Azure'da oturum açın

az login
az account set --subscription "<your-subscription-id>"

2. Dağıtımınız için değişkenleri ayarlama

$RESOURCE_GROUP = "rg-sql-mcp"
$LOCATION = "eastus"
$SQL_SERVER = "sql-mcp-$(Get-Random -Minimum 1000 -Maximum 9999)"
$SQL_DATABASE = "ProductsDB"
$SQL_ADMIN = "sqladmin"
$SQL_PASSWORD = "<YourStrongPassword123!>"

3. Kaynak grubu oluşturma

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

4. Azure SQL Server oluşturma

az sql server create \
  --name $SQL_SERVER \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --admin-user $SQL_ADMIN \
  --admin-password $SQL_PASSWORD

5. Güvenlik duvarını Azure hizmetlerine izin verecek şekilde yapılandırma

az sql server firewall-rule create \
  --resource-group $RESOURCE_GROUP \
  --server $SQL_SERVER \
  --name AllowAzureServices \
  --start-ip-address 0.0.0.0 \
  --end-ip-address 0.0.0.0

6. Veritabanını oluşturma

az sql db create \
  --resource-group $RESOURCE_GROUP \
  --server $SQL_SERVER \
  --name $SQL_DATABASE \
  --service-objective S0

7. Örnek verilerle Ürünler tablosu oluşturma

Önce bağlantı dizenizi alın:

$CONNECTION_STRING = "Server=tcp:$SQL_SERVER.database.windows.net,1433;Database=$SQL_DATABASE;User ID=$SQL_ADMIN;Password=$SQL_PASSWORD;Encrypt=true;TrustServerCertificate=false;Connection Timeout=30;"

SQL betik dosyası create-products.sqloluşturma:

CREATE TABLE dbo.Products
(
    ProductID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    ProductName NVARCHAR(100) NOT NULL,
    Category NVARCHAR(50) NOT NULL,
    UnitPrice DECIMAL(10,2) NOT NULL,
    UnitsInStock INT NOT NULL,
    Discontinued BIT NOT NULL DEFAULT 0
);

INSERT INTO dbo.Products (ProductName, Category, UnitPrice, UnitsInStock, Discontinued) VALUES
('Laptop Pro 15', 'Electronics', 1299.99, 45, 0),
('Wireless Mouse', 'Electronics', 29.99, 150, 0),
('Office Chair', 'Furniture', 249.99, 30, 0),
('Standing Desk', 'Furniture', 599.99, 15, 0),
('Coffee Maker', 'Appliances', 89.99, 60, 0),
('Notebook Set', 'Office Supplies', 12.99, 200, 0),
('USB-C Hub', 'Electronics', 49.99, 80, 0),
('Desk Lamp', 'Furniture', 39.99, 100, 0),
('Bluetooth Headphones', 'Electronics', 149.99, 50, 0),
('Water Bottle', 'Office Supplies', 19.99, 120, 0);

VS Code, SQL Server Management Studio veya sqlcmd kullanarak yürütün.

2. Adım: SQL MCP Server'ı yapılandırma

1. dab-config.json oluşturun

Yapılandırmayı başlatın:

dab init `
  --database-type mssql `
  --connection-string "@env('MSSQL_CONNECTION_STRING')" `
  --host-mode Production `
  --config dab-config.json

2. Açıklamalarla Ürünler varlığını ekleyin

dab add Products `
  --source dbo.Products `
  --permissions "anonymous:read" `
  --description "Product catalog with pricing, category, and inventory information"

3. Alan açıklamalarıyla yapay zeka aracısı bağlamı sağlayın

Yapay zeka aracılarının veritabanı şemanızı anlamasına yardımcı olmak için alan açıklamaları ekleyin:

dab update Products `
  --fields.name ProductID `
  --fields.description "Unique product identifier" `
  --fields.primary-key true

dab update Products `
  --fields.name ProductName `
  --fields.description "Name of the product"

dab update Products `
  --fields.name Category `
  --fields.description "Product category (Electronics, Furniture, Office Supplies, Appliances)"

dab update Products `
  --fields.name UnitPrice `
  --fields.description "Retail price per unit in USD"

dab update Products `
  --fields.name UnitsInStock `
  --fields.description "Current inventory count available for purchase"

dab update Products `
  --fields.name Discontinued `
  --fields.description "True if product is no longer available for sale"

3. Adım: SQL MCP Server'ı Azure Container Apps'e dağıtma

1. Azure Container Registry oluşturma ve özel görüntü oluşturma

Kapsayıcı kayıt defteri oluşturun ve yapılandırmanız eklenmiş bir özel imaj oluşturun.

$ACR_NAME = "acrsqlmcp$(Get-Random -Minimum 1000 -Maximum 9999)"

az acr create `
  --resource-group $RESOURCE_GROUP `
  --name $ACR_NAME `
  --sku Basic `
  --admin-enabled true

2. Dockerfile oluşturma

Aynı klasörde Dockerfile adlı bir dosya oluşturun dab-config.json:

FROM mcr.microsoft.com/azure-databases/data-api-builder:1.7.83-rc
COPY dab-config.json /App/dab-config.json

3. İmajı oluştur ve gönder

az acr build `
  --registry $ACR_NAME `
  --image sql-mcp-server:1 `
  .

4. Container Apps ortamı oluşturma

$CONTAINERAPP_ENV = "sql-mcp-env"
$CONTAINERAPP_NAME = "sql-mcp-server"

az containerapp env create `
  --name $CONTAINERAPP_ENV `
  --resource-group $RESOURCE_GROUP `
  --location $LOCATION

5. SQL MCP Server kapsayıcısını dağıtma

$ACR_LOGIN_SERVER = az acr show `
  --name $ACR_NAME `
  --query loginServer `
  --output tsv

$ACR_USERNAME = az acr credential show `
  --name $ACR_NAME `
  --query username `
  --output tsv

$ACR_PASSWORD = az acr credential show `
  --name $ACR_NAME `
  --query "passwords[0].value" `
  --output tsv

az containerapp create `
  --name $CONTAINERAPP_NAME `
  --resource-group $RESOURCE_GROUP `
  --environment $CONTAINERAPP_ENV `
  --image "$ACR_LOGIN_SERVER/sql-mcp-server:1" `
  --registry-server $ACR_LOGIN_SERVER `
  --registry-username $ACR_USERNAME `
  --registry-password $ACR_PASSWORD `
  --target-port 5000 `
  --ingress external `
  --min-replicas 1 `
  --max-replicas 3 `
  --secrets "mssql-connection-string=$CONNECTION_STRING" `
  --env-vars "MSSQL_CONNECTION_STRING=secretref:mssql-connection-string" `
  --cpu 0.5 `
  --memory 1.0Gi

Kaynak grubunuz aşağıdaki örneğe benzemelidir:

Dağıtımdan sonra Azure portalı kaynak grubunun ekran görüntüsü.

6. MCP uç nokta URL'nizi alma

$MCP_URL = az containerapp show `
  --name $CONTAINERAPP_NAME `
  --resource-group $RESOURCE_GROUP `
  --query "properties.configuration.ingress.fqdn" `
  --output tsv

Write-Host "Your MCP Server URL: https://$MCP_URL/mcp"

Bu URL'yi kaydedin; BUNU MCP istemcilerinden bağlanmak için kullanırsınız.

7. Dağıtımınızı test edin

curl "https://$MCP_URL/health"

Sağlıklı bir yanıt görmelisiniz.

MCP istemcilerinden bağlanma

SQL MCP Sunucunuz artık dağıtıldı ve kullanıma hazır. Çeşitli istemcilerden şu şekilde bağlanabilirsiniz:

Visual Studio Code (VS Code)

VS Code ile Hızlı Başlangıç kılavuzunu izleyin ve yerel olarak çalıştırmak yerine dağıtılan MCP sunucu URL'nizi kullanın.

Microsoft Foundry'den

MCP sunucunuzu Özel MCP Aracı olarak eklemek için Microsoft Foundry ile Hızlı Başlangıç kılavuzunu izleyin.

Diğer MCP istemcileri

McP uyumlu istemcilerden bağlanmak için 3.6. Adımdaki MCP sunucusu URL'sini kullanın.

İzleme ve sorun giderme

Container Apps günlüklerini görüntüleme

az containerapp logs show \
  --name $CONTAINERAPP_NAME \
  --resource-group $RESOURCE_GROUP \
  --follow

MCP uç noktasının durumunu denetleme

curl "https://$MCP_URL/health"

Yaygın sorunlar

Bağlantı başarısız oldu hatası

  • Container Apps giriş ayarlarının external olarak ayarlandığından emin olun.
  • SQL bağlantı dizesinin doğru olduğunu doğrulayın
  • Azure SQL'de güvenlik duvarı kurallarını denetleme

Veri döndürülmedi

  • Products tablosunun oluşturulduğunu ve doldurulduğunu doğrulayın
  • dab-config.json içinde varlık izinlerini denetleme
  • Container Apps günlüklerini hatalar için gözden geçirin

Performans yavaş

  • CPU/bellek ayırmayı artırmayı göz önünde bulundurun
  • Yedeklerin (Replikaların) sayısını arttırmanız gerekip gerekmediğini kontrol edin
  • Application Insights ölçümlerini gözden geçirme

Üretim için en iyi güvenlik uygulamaları

  • Kimlik doğrulamasını etkinleştirme - Anonim erişim yerine Microsoft Entra ID kimlik doğrulamasını yapılandırma
  • Yönetilen kimlikleri kullanma - Container Apps'in yönetilen kimlik kullanarak SQL'de kimlik doğrulaması yapmasına izin verme
  • CORS uygulama - MCP sunucunuza erişebilecek etki alanlarını kısıtlama
  • Hız sınırlamayı etkinleştirme - Kötüye kullanıma karşı koruma
  • Azure Key Vault kullanma - Bağlantı dizelerini güvenli bir şekilde depolama
  • Application Insights ile izleme - Kullanımı ve performansı izleme
  • İzinleri kısıtla - Yalnızca gerekli erişim düzeylerini verme

Kaynakları temizle

İşiniz bittiğinde tüm kaynakları kaldırmak için kaynak grubunu silin:

az group delete --name $RESOURCE_GROUP --yes --no-wait

Tam örnek komut dosyası

Bu hızlı başlangıçtaki tüm adımları gerçekleştiren eksiksiz bir PowerShell betiği aşağıda verilmiştir. Çalıştırmadan önce kiracı kimliğini, abonelik kimliğini ve parola değişkenlerini güncelleştirin.

Tavsiye

Yönetilen kimlik doğrulaması, sistem durumu denetimleri ve otomatik temizleme ile üretime hazır bir dağıtım için Data API Builder demo ortam betiğine bakın.

# ============================================
# Variables - UPDATE THESE VALUES
# ============================================
$RESOURCE_GROUP = "rg-sql-mcp"
$LOCATION = "centralus"
$SQL_SERVER = "sql-mcp-$(Get-Random -Minimum 1000 -Maximum 9999)"
$SQL_DATABASE = "ProductsDB"
$SQL_ADMIN = "sqladmin"
$SQL_PASSWORD = "P@ssw0rd!"  # Replace with a strong password
$ACR_NAME = "acrsqlmcp$(Get-Random -Minimum 1000 -Maximum 9999)"
$CONTAINERAPP_ENV = "sql-mcp-env"
$CONTAINERAPP_NAME = "sql-mcp-server"

# ============================================
# Sign in to Azure
# ============================================
az login --tenant "<your-tenant-id>"
az account set --subscription "<your-subscription-id>"

# ============================================
# Check if resource group exists and create unique name
# ============================================
$RG_COUNTER = 0
$ORIGINAL_RG = $RESOURCE_GROUP
while ($true) {
    $RG_EXISTS = az group exists --name $RESOURCE_GROUP
    if ($RG_EXISTS -eq "false") {
        break
    }
    $RG_COUNTER++
    $RESOURCE_GROUP = "$ORIGINAL_RG-$RG_COUNTER"
}
Write-Host "Using resource group: $RESOURCE_GROUP" -ForegroundColor Green

# ============================================
# Step 1: Create Azure SQL Database
# ============================================
az group create --name $RESOURCE_GROUP --location $LOCATION

az sql server create `
  --name $SQL_SERVER `
  --resource-group $RESOURCE_GROUP `
  --location $LOCATION `
  --admin-user $SQL_ADMIN `
  --admin-password $SQL_PASSWORD

az sql server firewall-rule create `
  --resource-group $RESOURCE_GROUP `
  --server $SQL_SERVER `
  --name AllowAzureServices `
  --start-ip-address 0.0.0.0 `
  --end-ip-address 0.0.0.0

# Add current client IP to firewall
$MY_IP = (Invoke-RestMethod -Uri 'https://api.ipify.org?format=text')
az sql server firewall-rule create `
  --resource-group $RESOURCE_GROUP `
  --server $SQL_SERVER `
  --name AllowMyIP `
  --start-ip-address $MY_IP `
  --end-ip-address $MY_IP

az sql db create `
  --resource-group $RESOURCE_GROUP `
  --server $SQL_SERVER `
  --name $SQL_DATABASE `
  --service-objective S0

$CONNECTION_STRING = "Server=tcp:$SQL_SERVER.database.windows.net,1433;Database=$SQL_DATABASE;User ID=$SQL_ADMIN;Password=$SQL_PASSWORD;Encrypt=true;TrustServerCertificate=false;Connection Timeout=30;"

# Create sample table using sqlcmd
Write-Host "Creating Products table and sample data..." -ForegroundColor Yellow

$SQL_SCRIPT = @"
CREATE TABLE dbo.Products (
    ProductID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    ProductName NVARCHAR(100) NOT NULL,
    Category NVARCHAR(50) NOT NULL,
    UnitPrice DECIMAL(10,2) NOT NULL,
    UnitsInStock INT NOT NULL,
    Discontinued BIT NOT NULL DEFAULT 0
);

INSERT INTO dbo.Products (ProductName, Category, UnitPrice, UnitsInStock, Discontinued) VALUES
('Laptop Pro 15', 'Electronics', 1299.99, 45, 0),
('Wireless Mouse', 'Electronics', 29.99, 150, 0),
('Office Chair', 'Furniture', 249.99, 30, 0),
('Standing Desk', 'Furniture', 599.99, 15, 0),
('Coffee Maker', 'Appliances', 89.99, 60, 0);
"@

# Use Invoke-Sqlcmd if available, otherwise skip table creation
try {
    $SQL_SCRIPT | Out-File -FilePath "create-table.sql" -Encoding utf8
    sqlcmd -S "$SQL_SERVER.database.windows.net" -d $SQL_DATABASE -U $SQL_ADMIN -P $SQL_PASSWORD -i "create-table.sql"
    Remove-Item "create-table.sql" -ErrorAction SilentlyContinue
    Write-Host "Products table created successfully!" -ForegroundColor Green
} catch {
    Write-Host "Note: Could not create table automatically. You can create it manually later." -ForegroundColor Yellow
    Write-Host "SQL Script saved for manual execution if needed." -ForegroundColor Yellow
}

# ============================================
# Step 2: Configure SQL MCP Server
# ============================================
# Remove existing config if present
if (Test-Path "dab-config.json") {
    Remove-Item "dab-config.json" -Force
}

dab init `
  --database-type mssql `
  --connection-string "@env('MSSQL_CONNECTION_STRING')" `
  --host-mode Production `
  --config dab-config.json

dab add Products `
  --source dbo.Products `
  --permissions "anonymous:read" `
  --description "Product catalog with pricing, category, and inventory information"

# ============================================
# Step 3: Deploy to Azure Container Apps
# ============================================
az acr create `
  --resource-group $RESOURCE_GROUP `
  --name $ACR_NAME `
  --sku Basic `
  --admin-enabled true

# Create Dockerfile
@"
FROM mcr.microsoft.com/azure-databases/data-api-builder:1.7.83-rc
COPY dab-config.json /App/dab-config.json
"@ | Out-File -FilePath Dockerfile -Encoding utf8

az acr build --registry $ACR_NAME --image sql-mcp-server:1 .

az containerapp env create `
  --name $CONTAINERAPP_ENV `
  --resource-group $RESOURCE_GROUP `
  --location $LOCATION

# Get ACR credentials for initial deployment
$ACR_LOGIN_SERVER = az acr show --name $ACR_NAME --query loginServer --output tsv
$ACR_USERNAME = az acr credential show --name $ACR_NAME --query username --output tsv
$ACR_PASSWORD = az acr credential show --name $ACR_NAME --query "passwords[0].value" --output tsv

az containerapp create `
  --name $CONTAINERAPP_NAME `
  --resource-group $RESOURCE_GROUP `
  --environment $CONTAINERAPP_ENV `
  --image "$ACR_LOGIN_SERVER/sql-mcp-server:1" `
  --registry-server $ACR_LOGIN_SERVER `
  --registry-username $ACR_USERNAME `
  --registry-password $ACR_PASSWORD `
  --target-port 5000 `
  --ingress external `
  --min-replicas 1 `
  --max-replicas 3 `
  --secrets "mssql-connection-string=$CONNECTION_STRING" `
  --env-vars "MSSQL_CONNECTION_STRING=secretref:mssql-connection-string" `
  --cpu 0.5 `
  --memory 1.0Gi

# ============================================
# Output
# ============================================
$MCP_URL = az containerapp show `
  --name $CONTAINERAPP_NAME `
  --resource-group $RESOURCE_GROUP `
  --query "properties.configuration.ingress.fqdn" `
  --output tsv

Write-Host ""
Write-Host "Deployment complete!" -ForegroundColor Green
Write-Host "MCP Server URL: https://$MCP_URL/mcp" -ForegroundColor Cyan
Write-Host "Health check:   https://$MCP_URL/health" -ForegroundColor Cyan