次の方法で共有


クイック スタート: Azure Container Apps で SQL MCP Server を使用する

Azure Container Apps にデプロイされた SQL MCP サーバーを示す図。

Important

SQL モデル コンテキスト プロトコル (MCP) サーバーはプレビュー段階であり、このドキュメントとエンジンの実装が変更される可能性があります。 Data API Builder バージョン 1.7 はプレビュー段階ですが、MCP 機能がまだ 1.7.83-rc タグに含まれていないため、プレリリース バージョン (:latest など) を明示的に使用する必要があります。

このクイック スタートでは、SQL MCP Server を Azure Container Apps にデプロイする方法について説明します。 デプロイ後、リモート サーバー エンドポイントとして Visual Studio Code (VS Code)、Microsoft Foundry、またはその他のモデル コンテキスト プロトコル (MCP) クライアントから接続できます。

ACA デプロイ ワークフローを示すシーケンス図。

[前提条件]

Azure サブスクリプション

アクティブな Azure サブスクリプションが必要です。 お持ちでない場合は、 無料の Azure アカウントを作成します

Azure CLI

Azure CLI をインストールしてリソースをデプロイします。

winget install Microsoft.AzureCLI

.NET 9 以降

このツールは既にインストールされている可能性があります。 dotnet --versionを実行し、バージョン 9 以降が報告されたことを確認します。

winget install Microsoft.DotNet.Runtime.9

データ API ビルダー CLI

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

SQL MCP Server は現在プレリリース中です。 --prerelease フラグを使用すると、このクイック スタートで使用されるすべての機能を使用して、最新バージョンの Data API ビルダーを取得できます。

PowerShell

PowerShell がまだインストールされていない場合はインストールします。

dotnet tool install --global PowerShell

手順 1: Azure SQL Database を作成してデプロイする

1. Azure にサインインする

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

2. デプロイの変数を設定する

$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. リソース グループを作成する

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

4.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.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. データベースを作成する

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

7. サンプル データを含む Products テーブルを作成する

最初に接続文字列を取得します。

$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 スクリプト ファイル 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);

VS Code、SQL Server Management Studio、または sqlcmd を使用して実行します。

手順 2: SQL MCP サーバーを構成する

1. dab-config.json を作成する

構成を初期化します。

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

2. 説明を含む Products エンティティを追加する

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

3. フィールドの説明を含む AI エージェント コンテキストを提供する

AI エージェントがデータベース スキーマを理解するのに役立つフィールドの説明を追加します。

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: SQL MCP サーバーを Azure Container Apps にデプロイする

1. Azure Container Registry を作成し、カスタム イメージをビルドする

コンテナー レジストリを作成し、構成を埋め込んでカスタム イメージを構築します。

$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 を作成する

Dockerfileと同じフォルダーに 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. イメージをビルドしてプッシュする

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

4.Container Apps 環境を作成する

$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 コンテナーをデプロイする

$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

リソース グループは次の例のようになります。

デプロイ後の Azure portal リソース グループのスクリーンショット。

6. MCP エンドポイント URL を取得する

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

この URL を保存します。MCP クライアントからの接続に使用します。

7. デプロイをテストする

curl "https://$MCP_URL/health"

正常な応答が表示されます。

MCP クライアントからの接続

これで、SQL MCP Server がデプロイされ、使用する準備が整いました。 さまざまなクライアントから接続する方法を次に示します。

Visual Studio Code (VS Code)

VS Code ガイドのクイック スタートに従い、ローカルで実行する代わりに、デプロイした MCP サーバー URL を使用します。

Microsoft Foundry から

MCP サーバーをカスタム MCP ツールとして追加するには、 Microsoft Foundry ガイドのクイック スタート に従います。

その他の MCP クライアント

手順 3.6 の MCP サーバー URL を使用して、MCP 互換クライアントから接続します。

監視とトラブルシューティング

Container Apps のログを表示する

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

MCP エンドポイントの正常性を確認する

curl "https://$MCP_URL/health"

一般的な問題

接続に失敗したエラー

  • Container Apps のイングレスが external に設定されていることを確認する。
  • SQL 接続文字列が正しいことを確認する
  • Azure SQL のファイアウォール規則を確認する

データが返されない

  • Products テーブルが作成され、設定されたことを確認する
  • dab-config.json でエンティティのアクセス許可をチェックする
  • Container Apps のログでエラーを確認する

パフォーマンスが遅い

  • CPU/メモリ割り当ての増加を検討する
  • レプリカをスケールアップする必要があるかどうかを確認する
  • Application Insights メトリックを確認する

運用環境のセキュリティのベスト プラクティス

  • 認証を有効にする - 匿名アクセスの代わりに Microsoft Entra ID 認証を構成する
  • マネージド ID を使用する - Container Apps がマネージド ID を使用して SQL に対して認証できるようにする
  • CORS の実装 - MCP サーバーにアクセスできるドメインを制限する
  • レート制限を有効にする - 不正使用から保護する
  • Azure Key Vault を使用 する - 接続文字列を安全に格納する
  • Application Insights を使用した監視 - 使用状況とパフォーマンスの追跡
  • アクセス許可を制限 する - 必要なアクセス レベルのみを付与する

リソースをクリーンアップする

完了したら、リソース グループを削除してすべてのリソースを削除します。

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

完全なサンプル スクリプト

このクイック スタートのすべての手順を実行する完全な PowerShell スクリプトを次に示します。 実行する前に、テナント ID、サブスクリプション ID、およびパスワード変数を更新します。

ヒント

マネージド ID 認証、正常性チェック、自動クリーンアップを使用した運用環境対応のデプロイについては、 データ API ビルダーのデモ環境スクリプトを参照してください。

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