SQL MCP Serverとは?Azure SQLでAIエージェント連携する変更点と導入時の注意点

SQL MCP Serverは、Azure SQLをAIエージェントから安全に扱うための新しい選択肢です。結論から言うと、これは「AIに自由なSQLを書かせる仕組み」ではなく、Data API builderの設定、権限、エンティティ定義を使って、AIエージェントに決められたデータ操作だけを実行させる仕組みです。

Azure SQLの管理者や開発者がまず確認すべき点は、Data API builderのバージョン、公開するテーブル・ビュー・ストアドプロシージャ、RBAC、認証、接続文字列の扱い、そして本番環境で無効化すべきDMLツールです。特に、既存のData API builder構成を使っている環境では「MCPでどのエンティティが見えるか」を必ず点検してください。

目次

SQL MCP Serverとは何か

SQL MCP Serverは、Model Context Protocol、つまりMCPを使って、AIエージェントがSQLデータベースと対話できるようにするData API builderの機能です。Microsoft Learnでは、SQL MCP Serverを「Data API builder上に構築され、エージェントアプリケーション向けに決定論的で安全な、本番対応のデータベース操作を提供するもの」と説明しています。(Microsoft Learn)

ここで重要なのは、SQL MCP ServerがAzure SQLのデータベースを直接AIに開放するわけではない点です。Data API builderのdab-config.jsonで、接続先、公開するテーブル・ビュー・ストアドプロシージャ、各ロールの権限を定義し、その設定をもとにMCPツールが生成されます。Microsoft Learnによると、SQL MCP ServerはData API builder 1.7以降に含まれ、ローカル実行にもセルフホストにも対応します。(Microsoft Learn)

たとえば、Azure SQL上にProductsテーブルがあっても、SQL MCP Serverに見せたい場合はData API builder側でエンティティとして追加し、読み取り・作成・更新・削除のどれを許可するかを明示します。AIエージェントはAzure SQLへ直接SQLを投げるのではなく、read_recordsupdate_recordのようなMCPツールを通じて操作します。

Azure SQL利用者にとっての主な変更点

SQL MCP Serverの公式情報で特に注目すべき変更は、AIエージェント連携がRESTやGraphQLと同じData API builderの設定モデルに統合されることです。Data API builderはもともとSQL Server、Azure SQL、Azure Cosmos DB、PostgreSQL、MySQLなどに対してREST・GraphQL APIを生成する構成ベースのエンジンで、1.7以降ではMCPも同じ機能群に加わっています。(Microsoft Learn)

変更点Azure SQL環境への影響確認すべきこと
MCPエンドポイントがData API builder構成から生成されるREST、GraphQL、MCPで権限設計をそろえやすいdab-config.jsonで公開エンティティと権限を確認する
NL2SQLではなくDABの抽象化レイヤーを使うAIが自由形式のSQLを生成するリスクを抑えやすいビューやストアドプロシージャで業務上安全な操作に絞る
DMLツールでCRUDや集計を扱うAIエージェントにデータ操作を任せられる範囲が明確になる本番ではdelete-recordなどを無効化するか判断する
フィールドやパラメーター説明が重要になる説明不足だとAIが列名や値を推測しやすいエンティティ、列、ストアドプロシージャ引数に説明を付ける
認証が受信・送信の2系統になるクライアント認証とAzure SQL接続認証を分けて設計する必要があるEntra ID、マネージドID、ゲートウェイ要否を確認する

Microsoft Learnでは、SQL MCP ServerはData API builderのエンティティ抽象化、RBAC、キャッシュ、テレメトリを利用し、REST、GraphQL、MCPで同じ設定を基盤にすると説明されています。(Microsoft Learn)

SQL MCP ServerはNL2SQLではない

SQL MCP Serverを検討するときに誤解しやすいのが、「自然言語からSQLを生成するNL2SQLツール」と同じものだと考えることです。公式情報では、SQL MCP Serverは意図的にNL2SQLをサポートしない場合があると説明されています。理由は、モデルが非決定的であり、複雑なSQLほど微妙な誤りを生みやすいからです。(Microsoft Learn)

実務上は、この設計のほうが本番環境に向いています。たとえば、営業担当が「在庫が少ない商品を教えて」とAIに尋ねた場合、AIが勝手に複雑なJOINや未検証のSQLを作るのではなく、事前に定義されたProductsビューやLowStockProductsビューをread_recordsで読む形にできます。

判断基準は次の通りです。

やりたいこと推奨される設計
単純な一覧取得、条件検索テーブルまたはビューをエンティティ化し、read_recordsを許可する
複雑なJOINや業務ロジックを含む検索Azure SQL側にビューまたはストアドプロシージャを作り、DABで公開する
データ更新対象エンティティと更新可能フィールドを絞り、ロール単位でupdateを許可する
スキーマ変更SQL MCP Serverではなく、通常のDB変更管理やMSSQL拡張機能、CI/CDで扱う

SQL MCP ServerはDML、つまり既存テーブルやビューのデータ作成・読み取り・更新・削除、ストアドプロシージャ実行を中心に設計されています。DDL、つまりテーブル作成やスキーマ変更のための仕組みではありません。(Microsoft Learn)

利用できるDMLツールとバージョン差分

SQL MCP ServerがAIエージェントに公開する主なDMLツールは、describe_entitiescreate_recordread_recordsupdate_recorddelete_recordexecute_entityaggregate_recordsです。これらはData API builderのRBAC、エンティティ権限、ポリシーに従って動作します。(Microsoft Learn)

ツール主な用途本番環境での注意点
describe_entities現在のロールで利用できるエンティティや操作を返す説明文が不足するとAIが意図を誤解しやすい
read_recordsテーブル・ビューの検索、フィルター、並べ替え、ページングキャッシュ、件数制限、対象列の制御を確認する
create_record新規行の作成入力制約と作成権限を最小化する
update_record既存行の更新主キー、更新可能フィールド、行レベル制約を確認する
delete_record既存行の削除本番では無効化を検討する
execute_entityストアドプロシージャ実行引数説明、実行権限、冪等性を確認する
aggregate_recordscount、sum、avg、min、maxなどの集計1.7.xでは利用不可。2.0 preview以降の機能として扱う

公式ドキュメントでは、aggregate_recordsはData API builder 1.7.xでは利用できず、2.0 preview以降で利用できるとされています。また、集計クエリにはquery-timeoutを設定でき、長時間実行によるリソース消費を抑える用途があります。(Microsoft Learn)

本番環境では、すべてのツールをそのまま有効にするのではなく、業務目的に合わせて絞ることが重要です。たとえば、社内FAQエージェントが商品在庫を答えるだけなら、read_recordsと必要に応じてaggregate_recordsだけで十分です。create_recordupdate_recorddelete_recordを有効にする理由がなければ無効化したほうが安全です。

{
  "runtime": {
    "mcp": {
      "enabled": true,
      "path": "/mcp",
      "dml-tools": {
        "describe-entities": true,
        "create-record": false,
        "read-records": true,
        "update-record": false,
        "delete-record": false,
        "execute-entity": true,
        "aggregate-records": {
          "enabled": true,
          "query-timeout": 30
        }
      }
    }
  }
}

公式ドキュメントでは、ランタイムレベルでツールを無効化すると、エンティティ権限やロール設定に関係なく、そのツールはAIエージェントから見えず、呼び出せないと説明されています。(Microsoft Learn)

既存のData API builder利用者が確認すべき移行ポイント

すでにAzure SQL向けにData API builderを使っている場合、SQL MCP Serverの導入はゼロから作り直す話ではありません。公式ドキュメントでは、既存のData API builder構成が動作している場合、1.7以降へアップグレードすると追加手順なしでSQL MCP Serverが動作すると説明されています。(Microsoft Learn)

ただし、これは「そのまま本番公開してよい」という意味ではありません。既存APIでは問題なかった構成でも、AIエージェントがMCPツールとして使うと影響範囲が変わります。

確認すべき順序は次の通りです。

手順確認内容失敗しやすいポイント
バージョン確認DAB 1.7以上か、2.0 previewを使うのかpreview機能を本番前提で組み込む
エンティティ棚卸しMCPに見せるテーブル・ビュー・SPを決める内部管理用テーブルまで見せてしまう
権限確認anonymousauthenticated、独自ロールの操作範囲を確認anonymous:*を検証用のまま残す
フィールド制御コスト、個人情報、内部メモなどを除外するRESTで使っていた公開範囲をMCPにも流用する
DMLツール制御削除、更新、集計、SP実行の要否を判断全ツール有効のまま本番化する
監視ログ、Application Insights、OpenTelemetryを確認AIエージェントの操作を追跡できない

特にData API builder 2.0 previewでは、カスタムMCPツール、OBOユーザー委任認証、Unauthenticatedプロバイダー、ロール継承、MCP実行のOpenTelemetryトレースなどが追加・強化されています。一方で、2.0はpublic previewであり、一部機能は正式提供前に変更される可能性があるため、本番採用時は安定版とpreview機能を分けて評価する必要があります。(Microsoft Learn)

エンティティ説明とフィールド説明は必須レベルで整備する

SQL MCP Serverでは、AIエージェントがdescribe_entitiesを使って、利用可能なエンティティ、フィールド、操作を把握します。公式ドキュメントは、フィールド名や説明がない場合、エージェントが列名を誤って推測する可能性があると警告しています。(Microsoft Learn)

単にProductIDStatusTypeのような列名を見せるだけでは不十分です。AIにとっては、その値が何を意味するのか、どの単位なのか、どの値が有効なのかが重要です。

悪い説明良い説明
Statusの説明が「ステータス」注文状態。使用可能な値: Pending, Approved, Shipped, Cancelled
UnitPriceの説明が「価格」商品単価。通貨はJPY。税込価格
CreatedAtの説明が空レコード作成日時。UTC、ISO 8601形式
Environmentの説明が「環境」デプロイ環境。使用可能な値: Prod, Dev, Test, UAT

Microsoft Learnでは、説明文はツール発見、クエリ精度、パラメーター利用、フィールド選択の改善に役立つとされています。特に固定値を持つ列では、説明に有効な値を明記することで、AIが似ているが誤った値を作るリスクを減らせます。(Microsoft Learn)

dab update Products \
  --fields.name Category \
  --fields.description "商品カテゴリ。使用可能な値: Electronics, Furniture, Office Supplies, Appliances"

dab update Products \
  --fields.name UnitPrice \
  --fields.description "商品単価。通貨はJPY。税込価格"

実務では、スキーマ定義書やER図にある説明をそのまま流用するのではなく、AIが判断に使える表現に直すことが重要です。「DB担当者に分かる説明」ではなく、「業務担当者の質問をAIが正しくデータ操作へ変換できる説明」にしてください。

認証は「受信」と「送信」を分けて設計する

SQL MCP Serverの認証は、クライアントからSQL MCP Serverへの受信認証と、SQL MCP ServerからAzure SQLへの送信認証に分けて考えます。Microsoft Learnでも、Microsoft AI FoundryエージェントやカスタムMCPクライアントを接続する場合、この2方向の認証設計が必要だと説明されています。(Microsoft Learn)

認証の方向何を守るか推奨される確認事項
受信認証AIエージェントやMCPクライアントが/mcpを呼ぶ権限Microsoft Entra ID、JWT、App Service認証、ゲートウェイの要否
送信認証SQL MCP ServerがAzure SQLへ接続する権限マネージドID、接続文字列、SQLユーザー、最小権限
ゲートウェイ認証APIキーなどJWT以外の方式を前段で扱うAzure API Managementなどの利用
複数クライアント同じMCPエンドポイントを複数のエージェントが使う認証方式が合わない場合はインスタンス分離

Azure環境では、SQL MCP ServerからAzure SQLへの接続にマネージドIDを使う設計が有力です。公式ドキュメントでは、Azure SQL向けにManaged Service Identitiesをサポートし、接続文字列にAuthentication=Active Directory Managed Identityを指定する例が示されています。(Microsoft Learn)

Server=tcp:<server>.database.windows.net,1433;
Initial Catalog=<database>;
Authentication=Active Directory Managed Identity;

ユーザー割り当てマネージドIDを使う場合は、接続文字列にクライアントIDを含めます。

Server=tcp:<server>.database.windows.net,1433;
Initial Catalog=<database>;
Authentication=Active Directory Managed Identity;
User Id=<uami-client-id>;

接続文字列をdab-config.jsonに直書きするのは避けてください。公式ドキュメントでも、@env()を使ってシークレットを構成ファイルから除外する方法が推奨されています。(Microsoft Learn)

{
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  }
}

Azure Container AppsとApp Serviceのどちらに展開するか

SQL MCP ServerはData API builderとして動作するため、Azure上ではAzure Container AppsやAzure App Serviceなどに展開できます。Data API builderの展開オプションには、Azure App Service、Azure Container Apps、Azure Container Instances、Azure Kubernetes Serviceなどが含まれます。(Microsoft Learn)

展開先向いているケース注意点
Azure Container Appsコンテナベースでスケールさせたい、環境分離したいingress、シークレット、レプリカ数、Azure SQLファイアウォールを確認
Azure App Serviceコンテナを管理せずコードベースで運用したいstartup script、アプリ設定、App Service認証の有効化を確認
AKS既存のKubernetes運用基盤がある運用負荷、Secret管理、ヘルスプローブを設計する
ローカル実行検証、VS Code、MCP Inspectorでの確認本番と認証・権限差分が出やすい

Azure Container Appsのクイックスタートでは、dab-config.jsonを含むカスタムイメージをAzure Container Registryでビルドし、Container Appsへデプロイする流れが示されています。デプロイ時にはMSSQL_CONNECTION_STRINGをシークレット参照として渡し、/healthで正常性を確認します。(Microsoft Learn)

App Serviceの場合は、コンテナイメージを管理せずにDABをデプロイでき、TLS、カスタムドメイン、スケーリング、監視、Microsoft Entra認証を利用できます。公式手順では、dab-config.json.config/dotnet-tools.jsonstartup.shをZIPデプロイし、App Serviceのアプリ設定に接続文字列を入れる流れが示されています。(Microsoft Learn)

本番環境では、まず次の3点を満たす構成を選んでください。

本番要件確認ポイント
外部公開範囲/mcpをインターネット公開するのか、社内・VNet内に閉じるのか
ID管理Entra ID、マネージドID、API Management、App Service認証の組み合わせ
監視と追跡Application Insights、Log Analytics、OpenTelemetry、/healthの監視

SQL MCP ServerとAzure MCP Serverを混同しない

Azure SQL関連のMCP情報では、「SQL MCP Server」と「Azure MCP ServerのAzure SQL Database用ツール」が混同されがちです。両者は目的が違います。

名称主な目的操作対象
SQL MCP ServerAIエージェントがデータベース内のデータを安全に操作するテーブル、ビュー、ストアドプロシージャなどのデータ面
Azure MCP ServerのAzure SQL Database用ツール自然言語でAzure SQL Databaseリソースを管理するデータベース作成、削除、更新、一覧表示、ファイアウォール規則などのAzureリソース面

Microsoft LearnのAzure SQL Database用Azure MCP Serverツールは、自然言語プロンプトでデータベースの作成、削除、更新、一覧表示などのAzure SQL Databaseリソース管理を行うものとして説明されています。これは、SQL MCP ServerのようにData API builderのエンティティを通じて業務データを操作する仕組みとは役割が異なります。(Microsoft Learn)

管理者の判断としては、次のように分けると安全です。

やりたいこと使う候補
Azure SQL Databaseを作成・削除・スケール変更したいAzure MCP ServerのAzure SQL Database用ツール
Azure SQL内の商品、注文、顧客データをAIエージェントから検索・更新したいSQL MCP Server
本番の業務データ操作をロールとフィールド単位で制御したいSQL MCP Server
Azureリソース操作を自然言語で補助したいAzure MCP Server

管理者・開発者向けの導入チェックリスト

SQL MCP ServerをAzure SQL環境へ導入する前に、次のチェックを行ってください。

項目確認内容
バージョンData API builder 1.7以上か。2.0 preview機能を使う場合は本番影響を評価したか
エンティティMCPに公開するテーブル、ビュー、ストアドプロシージャを最小限にしたか
権限anonymous:*を検証用のまま残していないか
フィールド制御個人情報、原価、内部メモ、監査ログなどを除外したか
DMLツールdelete-recordupdate-recordexecute-entityを本当に許可する必要があるか
説明文エンティティ、列、パラメーターに業務的な説明と有効値を付けたか
認証受信認証とAzure SQLへの送信認証を分けて設計したか
シークレット接続文字列を@env()、Key Vault、アプリ設定などで外出ししたか
ネットワークAzure SQLファイアウォール、Private Link、Container Apps/App Serviceの到達性を確認したか
監視/health、ログ、Application Insights、OpenTelemetryで操作を追跡できるか
検証describe_entitieslist_toolsで、AIに見える範囲を確認したか

よくある失敗と回避策

失敗: AIに見せるエンティティが広すぎる

検証時にanonymous:*で追加したエンティティをそのまま残すと、AIエージェントが想定以上の操作を実行できる可能性があります。まず読み取り専用のビューから始め、更新や削除は業務上必要な場合だけ許可してください。

失敗: 説明文が不足してAIが列や値を推測する

StatusTypeCodeのような列は、説明なしではAIが意味を取り違えやすい項目です。固定値、通貨、日時形式、nullの意味、業務ルールを説明に含めると、誤操作のリスクを下げられます。

失敗: 複雑なJOINをread_recordsに期待する

公式ドキュメントでは、read_recordsは単一のテーブルまたはビュー向けで、JOINはサポートされないと説明されています。複雑な問い合わせはビューまたはストアドプロシージャに閉じ込め、SQL MCP Serverからは安全なエンティティとして公開するのが現実的です。(Microsoft Learn)

失敗: 認証方式の違うクライアントを1つのMCPエンドポイントに集約する

SQL MCP Serverの受信認証はインスタンスごとに設定されます。公式ドキュメントでは、異なる受信認証方式が必要な場合、異なるruntime.host.authentication設定を持つ複数のSQL MCP Serverインスタンスを実行する方法が示されています。(Microsoft Learn)

まず何から始めるべきか

Azure SQLでSQL MCP Serverを検証するなら、最初の一歩は「読み取り専用のビューを1つ公開する」ことです。いきなり既存テーブル全体や更新系ストアドプロシージャを公開するのではなく、AIエージェントに答えさせたい業務質問を1つ選び、そのためのビュー、説明文、読み取り権限だけを作ります。

推奨する初期構成は次の通りです。

初期検証の設定内容
対象データAzure SQL上の読み取り専用ビュー
権限authenticated:readまたは検証用の最小権限
DMLツールdescribe-entitiesread-records中心
認証ローカル検証後、Entra IDまたはApp Service認証へ移行
接続@env()で接続文字列を外出し
監視/health、ログ、Application Insightsを確認

SQL MCP Serverは、Azure SQLをAIエージェントから扱うための強力な入口になります。ただし、安全性はツール自体ではなく、Data API builderのエンティティ設計、RBAC、認証、説明文、展開構成で決まります。まずは読み取り専用・小さな範囲で検証し、describe_entitiesでAIに見える世界を確認してから、更新やストアドプロシージャ実行へ段階的に広げるのが安全です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次