Important
SQL MCP Server はプレビュー段階であり、このドキュメントとエンジンの実装は、この評価期間中に変更される可能性があります。
このクイック スタートでは、アスパイアを使用してコンテナー ベースのソリューションを構築します。 このソリューションの内容は次のとおりです。
- サンプル データを含む SQL データベース
- データ API ビルダーを利用した SQL モデル コンテキスト プロトコル (MCP) サーバー
- テスト用 MCP インスペクター
Aspireがすべてを実行し、サービスを開始してコンテナを接続し、Aspireを終了するとサービスを停止します。
[前提条件]
開始する前に、これらのツールをインストールします。
1. .NET 10
この手順では、このクイックスタートに必要な前提条件を満たすマシンを準備します。
Important
このツールは既にインストールされている可能性があります。
dotnet --versionを実行してテストし、バージョン 10 以降が報告されたことを確認します。 このインストールを実行し、.NET が既に存在する場合は、問題を引き起こさずにシステムを更新します。
ウィンドウズ
winget install Microsoft.DotNet.SDK.10
またはダウンロード
https://get.dot.net
2. コンテナー ランタイム
この手順では、Docker Desktop をインストールして、アスパイア プロジェクトをサポートします。
Important
このツールは既にインストールされている可能性があります。
docker --versionを実行してテストし、Docker が使用可能であることを確認します。 このインストールを実行し、Docker が既に存在する場合は、問題を引き起こさずにシステムを更新します。
ウィンドウズ
winget install Docker.DockerDesktop
macOS
brew install --cask docker
注
Podman も機能しますが、セットアップは異なります。 Podman を好む開発者は、これらの手順を調整できます。
3. Aspire と Data API ビルダー ツール
この手順では、後で使用する既定のアスパイア プロジェクト ファイルを作成します。
次のコマンドを実行します
dotnet new tool-manifest
dotnet tool install aspire.cli
dotnet tool install microsoft.dataapibuilder --prerelease
aspire init
注
SQL MCP Server は現在プレリリース中です。
--prerelease フラグを使用すると、このクイック スタートで使用されるすべての機能を使用して、最新バージョンの Data API ビルダーを取得できます。
メッセージが表示されたら、すべての既定値を選択します。
このコマンドを実行すると、ツールがインストールされ、次のファイルが作成されます。
.
├── .config
│ └── dotnet-tools.json
├── AppHost.cs
└── apphost.run.json
4. AppHost.cs ファイルを完成する
この手順では、 AppHost.cs を正しいコードで更新して、このクイック スタートを実行します。
AppHost.csの内容を次のように置き換えます。
#:sdk Aspire.AppHost.Sdk@13.0.2
#:package Aspire.Hosting.SqlServer@13.0.2
#:package CommunityToolkit.Aspire.Hosting.McpInspector@9.8.0
using System.ComponentModel;
using Aspire.Hosting;
using Aspire.Hosting.ApplicationModel;
var builder = DistributedApplication.CreateBuilder(args);
var db = AddSqlServer(builder);
WithSqlCommander(db);
var mcp = AddMcpServer(db);
WithMcpInspector(mcp);
await builder.Build().RunAsync();
IResourceBuilder<SqlServerDatabaseResource> AddSqlServer(IDistributedApplicationBuilder builder) => builder
.AddSqlServer("sql-server").WithDataVolume()
.AddDatabase("sql-database", "productsdb")
.WithCreationScript(SqlScript("productsdb"));
IResourceBuilder<ContainerResource> WithSqlCommander(IResourceBuilder<SqlServerDatabaseResource> db) => db
.ApplicationBuilder.AddContainer("sql-cmdr", "jerrynixon/sql-commander", "latest")
.WithImageRegistry("docker.io")
.WithHttpEndpoint(targetPort: 8080, name: "http")
.WithEnvironment("ConnectionStrings__db", db)
.WithParentRelationship(db)
.WaitFor(db)
.WithUrls(x =>
{
x.Urls.Clear();
x.Urls.Add(new() { Url = "/", DisplayText = "Commander", Endpoint = x.GetEndpoint("http") });
});
IResourceBuilder<ContainerResource> AddMcpServer(IResourceBuilder<SqlServerDatabaseResource> db) => db
.ApplicationBuilder.AddContainer("sql-mcp-server", "azure-databases/data-api-builder", "1.7.83-rc")
.WithImageRegistry("mcr.microsoft.com")
.WithHttpEndpoint(targetPort: 5000, name: "http")
.WithEnvironment("MSSQL_CONNECTION_STRING", db)
.WithBindMount("dab-config.json", "/App/dab-config.json", true)
.WaitFor(db)
.WithUrls(x =>
{
x.Urls.Clear();
x.Urls.Add(new() { Url = "/swagger", DisplayText = "Swagger", Endpoint = x.GetEndpoint("http") });
});
IResourceBuilder<McpInspectorResource> WithMcpInspector(IResourceBuilder<ContainerResource> mcp) => mcp
.ApplicationBuilder.AddMcpInspector("mcp-inspector")
.WithMcpServer(mcp)
.WithParentRelationship(mcp)
.WaitFor(mcp)
.WithUrls(x =>
{
x.Urls[0].DisplayText = "Inspector";
});
string SqlScript(string db) => $"""
CREATE DATABASE {db};
GO
SELECT *
INTO {db}.dbo.Products
FROM (VALUES
(1, 'Action Figure', 40, 14.99, 5.00),
(2, 'Building Blocks', 25, 29.99, 10.00),
(3, 'Puzzle 500 pcs', 30, 12.49, 4.00),
(4, 'Toy Car', 50, 7.99, 2.50),
(5, 'Board Game', 20, 34.99, 12.50),
(6, 'Doll House', 10, 79.99, 30.00),
(7, 'Stuffed Bear', 45, 15.99, 6.00),
(8, 'Water Blaster', 35, 19.99, 7.00),
(9, 'Art Kit', 28, 24.99, 8.00),
(10,'RC Helicopter', 12, 59.99, 22.00)
) AS x (Id, Name, Inventory, Price, Cost);
ALTER TABLE {db}.dbo.Products
ADD CONSTRAINT PK_Products PRIMARY KEY (Id);
""";
このコードでは、次のリソースを構成します。
.
├── SQL Server (sql)
│ └── SQL Database (productsdb)
└── SQL MCP Server (sql-mcp-server)
└── MCP Inspector (inspector)
5. dab-config.json ファイルを作成する
プロジェクト フォルダー ( AppHost.cs があるのと同じフォルダー) でこれらのコマンドを実行します。
@env('MSSQL_CONNECTION_STRING')構文は、実行時に環境変数から接続文字列を読み取るように Data API ビルダーに指示します。 この変数はコンテナーの起動時に自動的に設定されるため、ローカルで設定する必要はありません。
dab init --database-type mssql --connection-string "@env('MSSQL_CONNECTION_STRING')" --host-mode Development --config dab-config.json
dab add Products --source dbo.Products --permissions "anonymous:read" --description "Toy store products with inventory, price, and cost."
注
@env(...)式は、dab init中ではなく、実行時に環境変数を解決する DAB 構成機能です。 生成された dab-config.json には、コンテナーの起動時に DAB によって解決されるリテラル文字列 @env('MSSQL_CONNECTION_STRING')が含まれています。
dab-config.json ファイルは、データベースに接続するように SQL MCP Server を構成し、公開するオブジェクトを識別します。 この場合、 Products が公開されます。
このコマンドを実行すると、新しいファイルがプロジェクトに追加されます
dab-config.json
Important
バインド マウントは相対パス (dab-config.json) を使用するため、aspire run ファイルは、./dab-config.jsonを実行するのと同じディレクトリに存在する必要があります。
必要に応じて、フィールドの説明を追加します
このメタデータは、言語モデルがスキーマを理解するのに役立ちます。
dab update Products --fields.name Id --fields.primary-key true --fields.description "Product Id"
dab update Products --fields.name Name --fields.description "Product name"
dab update Products --fields.name Inventory --fields.description "Units in stock"
dab update Products --fields.name Price --fields.description "Retail price"
dab update Products --fields.name Cost --fields.description "Store cost"
ソリューションのテスト
この手順では、アスパイア環境を実行し、SQL Server、SQL MCP Server、MCP Inspector が連携していることを確認します。
1. Aspire を開始する
aspire run
Important
Docker が実行されていることを確認します。 アスパイアでは、コンテナーホストが適切に動作する必要があります。
ダッシュボードが開くと、Swagger、MCP、Inspector のリンクが表示されます。
必要な URL
[アスパイア] ダッシュボードには、次のリンクが表示されます (ポートは動的に割り当てられます)。
| Resource | Link | Description |
|---|---|---|
| sql-mcp-server | Swagger | REST API のドキュメント |
| sql-mcp-server | MCP | MCP エンドポイント (/mcp) |
| インスペクター | Inspector | MCP インスペクター UI |
2. Swagger を使用して REST API をテストする
ダッシュボードから Swagger を選択します。
製品の GET 操作を試してください。 このテストでは、SQL MCP Server が実行されており、データベースに接続できることを確認します。
3. MCP ツールを調べる
ダッシュボードから [インスペクター] を選択します。
Try:
-
list_tools利用可能な MCP ツールを表示するには -
read_recordsProductsエンティティの場合
フィルターを試す (構文の例):
{ "filter": "Price gt 20" }
このテストでは、MCP が動作していることを確認します。
4. ストップアスパイア
アスパイアを停止するには、 Ctrl+Cを押します。
Aspireはすべてのサービスを停止します。 SQL Server データは、コードで .WithDataVolume() と .WithLifetime(ContainerLifetime.Persistent)を使用するため、実行間で保持されます。
トラブルシューティング
SQL MCP Server コンテナーの起動に失敗する
- エラーの詳細については、アスパイア ダッシュボードのコンテナー ログを確認します
-
--config引数が DAB コンテナーの予期される構文と一致するかどうかを確認します (一部のバージョンでは、代わりに--ConfigFileNameを使用する場合があります) -
dab-config.jsonを実行するのと同じディレクトリに存在することを確認しますaspire run
データベース初期化スクリプトが見つかりません
-
init-db.sqlが AppHost プロジェクト ディレクトリ内にあるかどうかを確認する - ファイルがプロジェクトに含まれていることを確認し、必要に応じて出力にコピーします
MCP Inspector が接続できない
- SQL MCP Server コンテナーが実行されていて正常であることを確認する
- MCP エンドポイント パス (
/mcp) が DAB 構成と一致するかどうかを確認する