Bagikan melalui


Mulai Cepat: Menggunakan SQL MCP Server dengan Azure Container Apps

Diagram yang memperlihatkan SQL MCP Server yang disebarkan ke Azure Container Apps.

Penting

Server Protokol Konteks Model SQL (MCP) sedang dalam pratinjau, dan dokumentasi ini serta implementasi mesin dapat berubah. Saat Data API Builder versi 1.7 dalam pratinjau, Anda harus menggunakan versi prarilis secara eksplisit (misalnya, 1.7.83-rc) karena fitur MCP belum disertakan dalam tag :latest.

Panduan cepat ini menunjukkan kepada Anda cara mendeploy SQL MCP Server ke Azure Container Apps. Setelah disebarkan, Anda dapat menyambungkannya dari Visual Studio Code (VS Code), Microsoft Foundry, atau klien Model Context Protocol (MCP) lainnya sebagai titik akhir server jarak jauh.

Diagram urutan yang memperlihatkan alur kerja penyebaran ACA.

Prasyarat

Langganan Azure

Anda memerlukan langganan Azure aktif. Jika Anda tidak memilikinya, buat akun Azure gratis.

Azure CLI (antarmuka baris perintah Azure)

Instal Azure CLI untuk menyebarkan sumber daya:

winget install Microsoft.AzureCLI

.NET 9+

Anda mungkin sudah menginstal alat ini. Jalankan dotnet --version dan konfirmasikan laporan versi 9 atau yang lebih baru.

winget install Microsoft.DotNet.Runtime.9

CLI pembangun API Data

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

Nota

SQL MCP Server saat ini sedang dalam prarilis. Menggunakan tanda --prerelease memastikan Anda mendapatkan versi terbaru dari Data API Builder dengan semua fitur yang digunakan dalam panduan cepat ini.

PowerShell

Instal PowerShell jika belum diinstal.

dotnet tool install --global PowerShell

Langkah 1: Membuat dan menyebarkan Azure SQL Database

1. Masuk ke Azure

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

2. Atur variabel untuk penerapan Anda

$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. Membuat grup sumber daya

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

4. Buat Azure SQL Server

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

5. Mengonfigurasi firewall untuk mengizinkan layanan Azure

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. Buat database

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

7. Buat tabel Produk dengan data sampel

Dapatkan string koneksi Anda terlebih dahulu:

$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;"

Buat file skrip SQL create-products.sql:

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);

Jalankan menggunakan VISUAL Code, SQL Server Management Studio, atau sqlcmd.

Langkah 2: Mengonfigurasi SQL MCP Server

1. Buat dab-config.json Anda

Menginisialisasi konfigurasi:

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

2. Tambahkan entitas Produk dengan deskripsi

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

3. Berikan konteks agen AI dengan deskripsi bidang

Tambahkan deskripsi bidang untuk membantu agen AI memahami skema database Anda:

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"

Langkah 3: Menyebarkan SQL MCP Server ke Azure Container Apps

1. Buat Azure Container Registry dan buat gambar kustom

Buat registri kontainer dan buat gambar kustom dengan konfigurasi Anda yang disematkan:

$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. Buat Dockerfile

Buat file bernama Dockerfile di folder yang sama dengan :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. Bangun dan dorong citra

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

4. Buat lingkungan Aplikasi Kontainer

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

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

5. Sebarkan kontainer SQL MCP Server

$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

Grup sumber daya Anda harus menyerupai contoh berikut:

Cuplikan layar grup sumber daya portal Microsoft Azure setelah penyebaran.

6. Dapatkan URL titik akhir MCP Anda

$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"

Simpan URL ini - Anda menggunakannya untuk menyambungkan dari klien MCP.

7. Uji penyebaran Anda

curl "https://$MCP_URL/health"

Anda akan melihat respons yang baik.

Menghubungkan dari klien MCP

Server MCP SQL Anda sekarang disebarkan dan siap digunakan. Berikut cara terhubung dari berbagai klien:

Visual Studio Code (Visual Studio Code)

Ikuti panduan Mulai Cepat dengan Visual Studio Code dan gunakan URL server MCP yang Anda sebarkan alih-alih berjalan secara lokal.

Dari Microsoft Foundry

Untuk menambahkan server MCP Anda sebagai Alat MCP Kustom, ikuti panduan Mulai Cepat dengan Microsoft Foundry .

Klien MCP lainnya

Gunakan URL server MCP dari Langkah 3.6 untuk menyambungkan dari klien yang kompatibel dengan MCP.

Pemantauan dan pemecahan masalah

Menampilkan log aplikasi container

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

Memeriksa kesehatan titik akhir MCP

curl "https://$MCP_URL/health"

Masalah umum

Kesalahan koneksi gagal

  • Pastikan pengaturan ingress pada Container Apps diatur ke external
  • Verifikasi string koneksi SQL sudah benar
  • Memeriksa aturan firewall di Azure SQL

Tidak ada data yang dikembalikan

  • Verifikasi bahwa tabel Produk telah dibuat dan diisi
  • Periksa izin entitas di dab-config.json
  • Tinjau log Container Apps untuk kesalahan

Kinerja terlalu lambat

  • Pertimbangkan untuk meningkatkan alokasi CPU/memori
  • Periksa apakah Anda perlu meningkatkan replika
  • Memeriksa metrik Application Insights

Praktik terbaik keamanan untuk produksi

  • Mengaktifkan autentikasi - Mengonfigurasi autentikasi ID Microsoft Entra alih-alih akses anonim
  • Menggunakan identitas terkelola - Biarkan Container Apps mengautentikasi ke SQL menggunakan identitas terkelola
  • Menerapkan CORS - Membatasi domain mana yang dapat mengakses server MCP Anda
  • Mengaktifkan pembatasan tarif - Melindungi dari penyalahgunaan
  • Menggunakan Azure Key Vault - Menyimpan string koneksi dengan aman
  • Memantau dengan Application Insights - Melacak penggunaan dan performa
  • Membatasi izin - Hanya berikan tingkat akses yang diperlukan

Membersihkan sumber daya

Setelah selesai, hapus grup sumber daya untuk menghapus semua sumber daya:

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

Skrip sampel lengkap

Berikut adalah skrip PowerShell lengkap yang melakukan semua langkah-langkah dalam panduan memulai cepat ini. Sebelum berjalan, perbarui ID penyewa, ID langganan, dan variabel kata sandi.

Petunjuk / Saran

Untuk penyebaran siap produksi dengan autentikasi identitas terkelola, pemeriksaan kesehatan, dan pembersihan otomatis, lihat skrip lingkungan demo penyusun API Data.

# ============================================
# 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