モデルコンテキストプロトコルサーバーとしてのデータエージェント

モデル コンテキスト プロトコル (MCP) は、AI システムが自分以外のツールやデータと接続できるようにする、AI ランドスケープの新たな標準です。 AIモデルが利用可能なものをどのように見つけて、一貫した方法でそれと対話できるかを定義します。 MCP は、1 回限りの統合を構築する代わりに、さまざまなアプリやサービス間で動作するものをプラグインする標準的な方法を提供します。 このアプローチにより、AI システムは、一貫性を保ちながら、組み込みの知識をはるかに簡単に超えやすくなります。 また、チームは毎回同じつながりを再発明する必要がないため、より迅速に移動するのにも役立ちます。

MCP には、クライアントとサーバーの 2 つの主要な部分があります。

MCP クライアントは、ユーザーが操作するアプリまたはエクスペリエンスです。 ここで質問したり、アクションをトリガーしたりします。 クライアントは MCP サーバーにアクセスしてツールを見つけて使用します。 たとえば、Visual Studio Codeは外部ツールに接続してデータを取得したり、コードを記述して実行したりするときに MCP クライアントとして機能できます。

MCP サーバーは、クライアントがツール、データ、またはサービスを使用できるように公開します。 使用できる内容と使用方法がクライアントに通知されます。 たとえば、Fabric データ エージェントは、AI システムが使用できるエンタープライズ データとクエリを公開することで、MCP サーバーとして機能できます。

クライアントとサーバーを組み合わせることで、毎回カスタム統合を構築することなく、AI システムを実際のデータとアクションに簡単に接続できます。

Important

Fabric データ エージェントを MCP サーバーとして使用する場合、データ エージェントによって返される応答は、Fabricのコンプライアンス境界または地理的リージョンの外部に送信され、使用する MCP クライアントの用語とデータ処理ポリシーに従って処理または格納される可能性があります。

[前提条件]

動作方法

Fabricデータエージェントを公開すると、それは単一のMCPツールを公開するMCPサーバーとなります。 このツールはデータ エージェント自体を表しているため、MCP クライアントはそのツールに質問を送信し、データ エージェントが Fabric OneLake 内でアクセスできるデータに基づく回答を受け取ります。

クライアントはツールを呼び出すタイミングを決定するため、データ エージェントの説明が重要になります。 データ エージェントを発行すると、その説明は MCP サーバーがアドバタイズするツールの説明になります。 クライアントやオーケストレーターはその説明を読み取り、いつどのようにデータエージェントに連絡するかを判断します。したがって、エージェントが知っていることや回答可能な質問の種類を明確で詳細かつ具体的な説明書に書きましょう。

データエージェントMCPサーバーは、特定のツールやエディタだけでなく、どのMCPクライアントからも利用できます。 クライアントがストリーミング可能なHTTP経由でMCPをサポートし、Fabricで認証でき、有効なFabricベアラートークンをリクエストに付与できれば、サーバーに接続できます。 次のセクションでは、2 つのクライアント (Python スクリプトとVisual Studio Code) を示します。 同じエンドポイントと認証の方法を、構築または導入する他のMCPクライアントでも使うことができます。

MCP サーバーと通信するものは MCP を話す必要があるため、定義上は MCP クライアントとして機能します。 "MCP クライアント" という用語は、特定の製品または SDK を意味するものではありません。 これは、プロトコルに従う任意のコードを意味します。 エンドポイントは、任意の要求を送信できるプレーンな REST API ではありません。 接続は、MCP メッセージ フロー ( initialize ハンドシェイク、ツールを検出するための tools/list 呼び出し、質問を行う tools/call 要求) に従います。 MCP Python SDK などの SDK は、そのフローを自動的に処理しますが、要求がプロトコルに従っている限り、プレーン HTTP 経由で自分で実装することもできます。 ハンドシェイクとメッセージ形式をスキップする汎用 HTTP クライアントは機能しません。

注

データエージェントのMCPサーバーは動的クライアント登録やクライアント識別メタデータをサポートしていません。 この制限により、これらの機能に依存して自動的にMCPサーバーに登録・認証するクライアントは接続できません。 代わりに、クライアントは独自の認証フローを使ってFabricトークンを取得し、この記事の例に示すように各リクエストにそれを付与する必要があります。

MCP サーバーの詳細を取得する

データ エージェントを発行したら、その 設定を 開き、[ モデル コンテキスト プロトコル ] タブに移動します。このタブには、次の情報が表示されます。

  • データ エージェント MCP サーバー名
  • MCP サーバー URL (この値をコピーします。すべてのクライアントで使用します)
  • データ エージェントの MCP ツール名
  • MCP サーバー ツールの説明

このタブから mcp.json ファイルをダウンロードして、その形式を読み取るクライアント (Visual Studio Code など) を構成することもできます。

データ エージェントの [MCP サーバー設定] タブを示すスクリーンショット。

ワークスペース ID とデータ エージェント ID から URL を自分で作成することもできます。

https://api.fabric.microsoft.com/v1/mcp/workspaces/{WorkspaceId}/dataagents/{DataAgentId}/agent
Placeholder 説明
{WorkspaceId} データ エージェントを含むFabric ワークスペースの ID。
{DataAgentId} 公開されたデータエージェントの ID。

手動で構築された URL は、データ エージェントを発行した後にのみ機能します。 エージェントが発行されていない場合、URL が正しい場合でも、エンドポイントはエラーを返します。

Authentication

MCP エンドポイントに対するすべての要求は、Fabricに対して認証する必要があります。 クライアントは、 Authorization ヘッダーにベアラー トークンをアタッチします。トークンには、ターゲット ワークスペースとデータ エージェントにアクセスするためのアクセス許可が必要です。 トークンは、ユーザー ID またはサービス プリンシパルを表すことができます。

トークンを取得する方法は、クライアントによって異なります。 Visual Studio Code では、対話的にサインインするよう求められます。 Python スクリプトでは、azure-identityなどのライブラリを使用してトークンを取得し、自分で要求ヘッダーに追加します。 クライアントが何であれ、 https://api.fabric.microsoft.com/.default スコープのトークンを要求します。

長時間実行リクエストとMCPタスク

回答に時間がかかる質問もあります。 大きなテーブルをスキャンしたり複数のクエリを実行したりする質問は、クライアントやネットワーク仲介者が接続を開いている時間よりも長くかかることがあります。 このような場合、データエージェントのMCPサーバーがタスクをサポートします。

タスクはサーバーが接続を開いたまま応答できるようにします。 データエージェントは質問の処理を開始すると、回答ではなく、その処理の識別子を返します。 クライアントは結果が準備できたときに識別子を使って求めます。 接続が切れたりクライアントが再起動した場合、クライアントは識別子を保持し、中断したところから再開します。

タスクはMCP仕様の io.modelcontextprotocol/tasks 拡張に従います。 クライアントは tasks/get で結果を求め、タスクが作業完了を報告するまで何度も尋ね続けます。 不要になった作業を止めるために、クライアントは tasks/cancelを送ります。 キャンセルは即時ではないため、タスクはキャンセル後も短時間まだ動作していると報告でき、ほぼ完了していた作業も完了可能です。

タスク拡張機能をサポートするクライアントはタスクを受け取ります。 それ以外のすべてのクライアントについては、何も変わりません。 データエージェントは同じ接続で応答しており、この記事の他の箇所でも示されています。

メッセージ形式およびタスクライフサイクルの詳細については、 MCPタスク拡張を参照してください。

Python から接続する

この例では、スタンドアロン Python スクリプトからデータ エージェント MCP エンドポイントに接続し、ツールを検出し、質問を送信して、回答を出力します。 MCP Python SDK と azure-identity ライブラリを使用します。

Python クライアントの前提条件

  • Python 3.10 以降。
  • mcp および azure-identity パッケージ。
  • Fabricにサインインする方法。 この例では、Azure CLIを使用します。 Azure CLIをインストールし、az loginを実行し、ワークスペースとデータ エージェントにアクセスできるアカウントでサインインします。

パッケージをインストールします。

pip install mcp azure-identity

クライアントをステップ バイ ステップでビルドする

次のセクションでは、スクリプトを一度に 1 つずつビルドします。 各ブロックは同じファイルを続行するため、1 つの .py ファイルに順番に貼り付けて実行できます。

ライブラリをインポートし、値を設定します。 ワークスペース ID、データ エージェント ID、および質問を独自の値に置き換えます。 mcp_urlは、前に説明したエンドポイント形式に従います。

import asyncio

from azure.identity import AzureCliCredential
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

workspace_id = "<your-workspace-id>"
data_agent_id = "<your-data-agent-id>"
question = "<your question>"

mcp_url = (
    f"https://api.fabric.microsoft.com/v1/mcp/workspaces/{workspace_id}"
    f"/dataagents/{data_agent_id}/agent"
)

トークンを取得し、認証ヘッダーを作成します。 AzureCliCredential は、 az loginからのサインインを再利用します。 ヘルパーは Fabric スコープのトークンを要求し、すべてのリクエストに含まれる Authorization ヘッダーとしてそれを返します。

credential = AzureCliCredential()


def get_auth_headers():
    token = credential.get_token("https://api.fabric.microsoft.com/.default")
    return {"Authorization": f"Bearer {token.token}"}

接続を開き、ツールを見つけて、質問します。 この関数は、認証ヘッダーを使用してストリーミング可能な HTTP 接続を開き、 initializeを使用して MCP ハンドシェイクを実行し、ツールを一覧表示して、データ エージェントが公開する 1 つのツールを読み取ります。 ツールの入力スキーマから質問引数の名前が見つかるので、ハードコーディングせず、ツールを呼び出して応答からテキストを収集します。

async def query_data_agent(question):
    headers = get_auth_headers()

    async with streamablehttp_client(mcp_url, headers=headers) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()

            # The data agent exposes a single tool. Discover it, then call it.
            tools = await session.list_tools()
            tool = tools.tools[0]
            question_arg = next(iter(tool.inputSchema["properties"]))

            result = await session.call_tool(tool.name, {question_arg: question})

            answers = [block.text for block in result.content if block.type == "text"]
            return "\n".join(answers)

それを実行し、回答を印刷します。 query_data_agent はコルーチンであるため、 asyncio.run は完了までドライブし、結果を返します。

answer = asyncio.run(query_data_agent(question))
print(answer)

スクリプトは、サーバーがアドバタイズする最初のツールを読み取り、ツールの入力スキーマから質問引数を検索するため、ツール名または引数名が変更されても動作し続けます。 どちらの値もハードコーディングする必要はありません。

Tip

AzureCliCredential は、 az loginで作成したサインインを読み取ります。 サービスまたはジョブでの実行など、無人で実行するには、代わりにサービス プリンシパルの資格情報を使用してください。たとえば ClientSecretCredential や DefaultAzureCredential です。 残りのコードは同じままです。

Visual Studio Code から接続する

Visual Studio Codeは MCP クライアントとして機能できます。 次の手順では、データ エージェント MCP サーバーを追加し、エディターから質問します。 これらの手順は 1 つの例です。エンドポイントとトークンは、他の MCP クライアントが使用するエンドポイントと同じです。

MCP サーバーを追加する

  1. Visual Studio Codeを開き、作業するフォルダーを選択します。

  2. 選択したフォルダーに .vscode フォルダーを作成します。

  3. .vscode 内に、mcp.jsonという名前のファイルを作成します。

  4. Visual Studio Codeウィンドウの右下に青い [サーバーの追加] ボタンが表示されます。

    MCP サーバーの json ファイルを示すスクリーンショット。

  5. [ サーバーの追加] を選択し、[ HTTP] を選択します。 URL の入力を求められたら、先ほどコピーした MCP サーバーの URL を 貼り付けます。

    HTTP の選択を示すスクリーンショット。

    MCP サーバーの URL を入力する場所を示すスクリーンショット。

  6. Enter キーを押し、サーバーの名前を指定します。 Visual Studio Codeはこの名前を使用してサーバーを表示します。

  7. Visual Studio Codeは認証を試みます。 [ 許可] を選択し、資格情報でサインインします。

サーバーが作成されます。

データ エージェントの MCP ファイルを示すスクリーンショット。

エージェント モードを有効にする

サーバーを追加したら、エージェント モードを有効にして、Visual Studio Codeが質問をデータ エージェントにルーティングできるようにします。

  1. コマンド パレットを開きます (Ctrl + Shift + P または Cmd + Shift + P)。

  2. [エージェント モードの有効化] を検索して選択します。

  3. モードをアクティブ化するためのプロンプトを確認します。

    エージェント モードのVisual Studio Codeデータ エージェントを示すスクリーンショット。

エージェント モードがアクティブな場合は、質問を処理するオーケストレーターを選択します。 オーケストレーターは、エディター内の質問とデータ エージェント MCP サーバーの間のフローを管理します。 利用可能なオーケストレーターにはGPT-5、GPT-4.1、Claude Sonnet 4.5、Gemini 2.5 Proなどがあります。

質問する

エージェント モードがオンでオーケストレーターが選択されている状態で、エディターから直接質問します。 オーケストレーターは各質問をデータ エージェント MCP サーバーにルーティングし、エージェントは OneLake でアクセスできるデータに基づいている回答を返します。 組織の知識をAIワークフローに活用しながら、エディターを離れることなく作業できます。