次の方法で共有


Stdio SQL MCPサーバーのトランスポート

Important

SQL モデル コンテキスト プロトコル (MCP) サーバーは、Data API Builder バージョン 1.7 以降で使用できます。

SQL MCP Server は、2 つのトランスポートをサポートしています。ホスト型シナリオとクラウド シナリオ用の ストリーミング可能な HTTP と、ローカル開発と直接エージェント統合用の stdio です。 この記事では、 stdio トランスポートについて説明します。

stdio モードでは、Data API Builder (DAB) は標準の入出力 (stdin/stdout) 経由で MCP クライアントと完全に通信します。 HTTP サーバーまたはネットワーク ポートは起動されません。 MCP クライアントは、DAB を子プロセスとして起動し、 モデル コンテキスト プロトコル (MCP) を使用してメッセージを前後にパイプします。

stdioトランスポートを使用する場合

シナリオ 推奨されるトランスポート
開発者ワークステーションでのローカル開発 stdio
vs Code with GitHub Copilot (エージェント モード) stdio
CI/CD パイプラインまたはスクリプト駆動のエージェントを用いた自動化 stdio
クラウド ホスティング (Container Apps、App Service) HTTP
リモート MCP エンドポイントを使用した AI Foundry エージェント HTTP
同じエンドポイントを共有するエージェントのチーム HTTP

開いているポートを使用しない最も簡単なローカル セットアップが必要な場合は、 stdio を選択します。 MCP サーバーがネットワーク経由で到達可能である必要がある場合は、HTTP を選択します。

[前提条件]

  • Data API Builder CLI がインストールされている (バージョン 1.7 以降)
  • MCP が有効になっている既存の dab-config.json ( 必要な構成を参照)
  • MCP と互換性のあるクライアント (GitHub Copilot、Claude Desktop、またはカスタム エージェントを含む VS Code)

必要な構成

stdioトランスポートを使用する前に、dab-config.jsonで MCP を有効にします。

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

path フィールドは HTTP トランスポートにのみ使用され、stdio モードでは無視されます。 dml-tools ブロックは、MCP ツールとして使用できるデータ操作を制御します。

Important

"mcp": { "enabled": false }またはmcp ブロックがない場合、DAB はstdio モードで起動できません。

stdio モードで開始する

--mcp-stdiodab start フラグを使用します。

dab start --mcp-stdio --config ./dab-config.json

特定のアクセス許可ロールで実行するには:

dab start --mcp-stdio role:authenticated --config ./dab-config.json

role:<name>引数は位置指定であり、--mcp-stdioのすぐ後に続く必要があります。 省略すると、ロールは既定で anonymousされます。 ロール名は、構成内の少なくとも 1 つのエンティティの permissions セクションで定義されているロールと一致する必要があります。

stdio モードのしくみ

--mcp-stdioが検出されると、DAB は内部的に次の変更を行います。

UTF-8 エンコード (バイト順マークなし)

コンソールの入力と出力は、バイトオーダー マーク (BOM) なしで UTF-8 に強制されます。 この UTF-8 設定は、多くの MCP クライアントが BOM プレフィックス付きストリームを拒否するため、クリーンな JSON-over-stdio 通信に必要です。

シミュレーター認証

構成ファイルで指定されている内容に関係なく、認証プロバイダーは シミュレーター モードにオーバーライドされます。 このシミュレーター モードでは、実際の JSON Web トークン (JWT) または ID プロバイダーなしで、指定されたロールを直接適用できます。 シミュレーター プロバイダーは開発シナリオ向けに設計されており、運用環境の HTTP エンドポイントをセキュリティで保護するために使用しないでください。ただし、ローカル stdio セッションにはまさに適しています。

次の値がメモリ内に適用され、セッション中に構成がオーバーライドされます。

価値
MCP:StdioMode "true"
MCP:Role "<role-name>" または "anonymous"
Runtime:Host:Authentication:Provider "Simulator"

HTTP リスナーなし

ASP.NET Core ホストが起動し、すべてのサービスが登録されますが、DAB は stdio.RunAsync() ではなく host.Run() を呼び出します。 伝送制御プロトコル (TCP) ポートはバインドされません。 すべての MCP プロトコル メッセージは、 stdin/stdout経由で送信されます。

使用可能な MCP ツール

stdioの構成とエンティティのアクセス許可に従って、次のツールをdml-tools モードで使用できます。

ツール 説明
describe_entities 使用可能なエンティティとそのフィールドとアクセス許可を一覧表示します
create_record 新しいレコードをテーブル限定で挿入します
read_records エンティティからレコードを読み取ります
update_record 既存のレコードを更新します
delete_record 既存のレコード (テーブルとビュー) を削除します
execute_entity ストアド プロシージャ エンティティを実行します。
aggregate_records テーブルとビューに対して集計クエリを実行します

ストアド プロシージャによってサポートされるカスタム MCP ツールも、 --mcp-stdioを使用するときに登録されます。

stdio のために MCP クライアントを設定する

stdioトランスポートをサポートする MCP クライアントは、サブプロセスとして DAB を起動し、そのstdin/stdoutをパイプ処理します。 クライアント構成の構文はクライアントによって異なります。

VS Code (mcp.json)

{
  "servers": {
    "sql-mcp-server": {
      "type": "stdio",
      "command": "dab",
      "args": [
        "start",
        "--mcp-stdio", "role:anonymous",
        "--config", "{path}/dab-config.json",
        "--LogLevel", "error"
      ]
    }
  }
}

このファイルをプロジェクト フォルダー内の .vscode/mcp.json として保存します。 VS Code は構成を自動的に検出し、 MCP: List Servers にサーバーを表示します。 クライアントはプロセス ライフサイクルを管理するため、ターミナルでを個別に実行する必要dab start

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "sql-mcp-server": {
      "type": "stdio",
      "command": "dab",
      "args": [
        "start",
        "--mcp-stdio", "role:anonymous",
        "--config", "{path}/dab-config.json",
        "--LogLevel", "error"
      ]
    }
  }
}

他の dab start オプションと組み合わせる

--mcp-stdio は、他のすべての dab start オプションと互換性があります。

Option --mcp-stdioを使用した動作
--config 指定された構成ファイルを使用します (HTTP モードと同じ)
--LogLevel 指定したログ レベルを適用します (error: stdioに推奨)
dab start \
  --mcp-stdio role:api-reader \
  --config ./dab-config.json \
  --LogLevel Error

stdio モードのトラブルシューティング

Failed to start the engine in MCP stdio mode

DAB を開始できませんでした。 次の内容を確認する:

  • 構成ファイルが有効です: 実行 dab validate --config <path>
  • データベース接続文字列は正しく、到達可能です。
  • 構成で MCP が有効になっています。 "mcp": { "enabled": true }

MCP ツール呼び出しでアクセス許可が拒否されました

role:<name>によって指定されたロールには、エンティティと操作に必要なアクセス許可がありません。 構成内の関連エンティティの permissions セクションを確認します。

MCP ツールが一覧にない

dml-toolsがグローバルにfalseに設定されているか、エンティティがその"dml-tools": false設定でmcpを持っているかのいずれかです。 また、 mcp.enabledtrueされていることを確認します。

文字化けした出力または JSON 解析エラー

MCP サーバーが起動する前に、スタートアップ コードで JSON 以外のテキストが stdout に書き込まれることはありません。 ログ出力は stdout ではなく stderr またはログ ファイルに出力されます。 必要に応じて、 --LogLevel を使用して詳細なスタートアップ メッセージを抑制します。