次の方法で共有


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

Important

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

SQL MCP Server では、ホスト型シナリオとクラウド シナリオ用の ストリーミング可能な HTTP と、ローカル開発および直接エージェント統合用 の stdio という 2 つのトランスポートがサポートされています。 この記事では、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 が有効になっている既存の ( 必要な構成を参照)
  • MCP と互換性のあるクライアント (GitHub Copilot、Claude Desktop、またはカスタム エージェントを含む VS Code)

必要な構成

stdio トランスポートを使用する前に、自分の環境で MCP を有効にします。

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

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

Important

または ブロックがない場合、DAB は stdio モードで開始できません。

stdio モードで開始する

以下でフラグを使用します。

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

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

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

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

stdio モードのしくみ

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

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

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

シミュレーター認証

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

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

価値
MCP:StdioMode "true"
MCP:Role または
Runtime:Host:Authentication:Provider "Simulator"

HTTP リスナーなし

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

使用可能な MCP ツール

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

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

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

stdio 用に MCP クライアントを構成する

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

VS Code ()

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

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

Claude Desktop ()

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

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

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

Option (エンティティ)を使用した動作
--config 指定された構成ファイルを使用します (HTTP モードと同じ)
--LogLevel 指定したログ レベルを適用します
--verbose ログ レベルを情報に設定します
--no-https-redirect 受け入れられますが、影響はありません。HTTP サーバーは実行されません
dab start \
  --mcp-stdio role:api-reader \
  --config ./dab-config.json \
  --LogLevel Information

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

Failed to start the engine in MCP stdio mode.

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

  • 構成ファイルが有効です: 実行
  • データベース接続文字列は正しく、到達可能です。
  • 構成で MCP が有効になっています。

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

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

MCP ツールが一覧にない

グローバルに設定されているか、エンティティがその設定に値を持っているかのいずれかです。 また、 が されていることを確認します。

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

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