模型上下文协议(MCP)是 AI 环境中新兴的标准,允许 AI 系统与自身外部的工具和数据连接。 它定义 AI 模型如何发现可用内容,以及如何以一致的方式与之交互。 MCP 没有构建一次性集成,而是提供一种标准方法来插入可跨不同应用和服务运行的内容。 此方法使 AI 系统能够更轻松地超越其内置知识,同时保持一致。 它还有助于团队更快地移动,因为它们不必每次都重新建立相同的连接。
MCP 有两个主要部分:客户端和服务器。
MCP 客户端是应用或用户与之交互的体验。 这是你提出问题或触发操作的位置。 客户端向 MCP 服务器发送请求以查找并使用工具。 例如,当Visual Studio Code连接到外部工具以检索数据或帮助你编写和运行代码时,Visual Studio Code可以充当 MCP 客户端。
MCP 服务器公开工具、数据或服务,以便客户端可以使用它们。 它告知客户端可用内容以及如何使用它。 例如,Fabric数据代理可以通过公开 AI 系统可以使用的企业数据和查询来充当 MCP 服务器。
客户端和服务器一起可以轻松将 AI 系统与实际数据和操作连接起来,而无需每次生成自定义集成。
重要
此功能目前为预览版。
重要
使用Fabric数据代理作为 MCP 服务器时,数据代理返回的响应可能会发送到Fabric符合性边界或地理区域之外,并根据所使用的 MCP 客户端的术语和数据处理策略进行处理或存储。
先决条件
- 付费的 F2 或更高版本的 Fabric 容量,或启用了 Microsoft Fabric 的 Power BI Premium 按容量(P1 或更高)容量。
- 根据Fabric 数据代理租户设置中的要求,启用AI 的跨地理区域处理和跨地理区域存储。
- 至少有一个包含数据的数据源:仓库、湖仓、Power BI 语义模型、KQL 数据库、镜像数据库或本体。 必须具有对数据源的读取访问权限。
- 已发布的数据代理。 MCP 服务器仅在发布数据代理后工作。 有关详细信息,请参阅 创建 Fabric 数据代理。
工作原理
已发布的Fabric数据代理公开提供一个 MCP 工具。 该工具代表数据代理本身,因此,MCP 客户端会向该工具发送问题,并得到一个基于数据代理可在 Fabric OneLake 中访问的数据所生成的答案。
由于客户端决定何时调用该工具,因此数据代理说明很重要。 发布数据代理时,其描述将成为 MCP 服务器对外公布的工具描述。 客户端和业务流程协调程序读取该说明,以确定何时以及如何调用数据代理,因此请编写一个清晰而具体的说明,说明代理知道的内容及其可回答的问题类型。
可以从任何 MCP 客户端使用数据代理 MCP 服务器,而不仅仅是一个工具或编辑器。 只要客户端通过可流式传输的 HTTP 使用 MCP 协议,并且能够在请求中附加有效的 Fabric Bearer 令牌,就可以进行连接。 以下各节显示了两个客户端:一个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 服务器不支持动态客户端注册。 客户端无法自行注册并通过协议自动获取凭据。 相反,你需要通过你自己的身份验证流程获取 Fabric 令牌,并将其附加到每个请求中,如本文示例所示。
获取 MCP 服务器详细信息
发布数据代理后,打开其 “设置” 并转到“ 模型上下文协议 ”选项卡。此选项卡显示:
- 数据代理 MCP 服务器名称
- MCP 服务器 URL (复制此值;在每个客户端中使用它)
- 数据代理 MCP 工具名称
- MCP 服务器工具说明
还可以从此选项卡中下载 mcp.json 文件,以配置读取该格式的客户端,例如Visual Studio Code。
还可以从工作区 ID 和数据代理 ID 自行生成 URL:
https://api.fabric.microsoft.com/v1/mcp/workspaces/{WorkspaceId}/dataagents/{DataAgentId}/agent
| 占位符 | Description |
|---|---|
{WorkspaceId} |
包含数据代理的Fabric工作区的 ID。 |
{DataAgentId} |
已发布的数据代理的 ID。 |
只有在发布数据代理后,手动生成的 URL 才有效。 如果未发布代理,则即使 URL 正确,终结点也会返回错误。
Authentication
发送到 MCP 端点的每个请求都必须通过 Fabric 进行身份验证。 客户端在 Authorization 标头中附加 Bearer 令牌,该令牌必须具有访问目标工作区和数据代理的权限。 令牌可以表示用户标识或服务主体。
获取令牌的方式取决于客户端。 Visual Studio Code提示你以交互方式登录。 在 Python 脚本中,可以通过 azure-identity 等库获取令牌,并自行将其添加到请求标头中。 无论使用哪种客户端,都请求 https://api.fabric.microsoft.com/.default 作用域的令牌。
从 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
逐步生成客户端
以下各节将逐步构建这个脚本。 每个块都继续相同的文件,因此可以按顺序将它们粘贴到单个 .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 握手,列出工具,并读取数据代理公开的唯一工具。 它从工具的输入架构中查找问题参数的名称,因此不要对其进行硬编码,然后调用该工具并从响应中收集文本。
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 服务器,并在编辑器中提问。 这些步骤是一个示例;终结点和令牌与任何其他 MCP 客户端使用的终结点和令牌相同。
添加 MCP 服务器
打开Visual Studio Code并选择要使用的文件夹。
在所选文件夹中创建 .vscode 文件夹。
在 .vscode 中,创建名为 .
mcp.jsonvscode 的文件。Visual Studio Code显示窗口右下角的蓝色“添加服务器”按钮。
选择 “添加服务器”,然后选择“ HTTP”。 出现 URL 提示时,粘贴之前复制的 MCP 服务器 URL 。
按 Enter 并为服务器提供名称。 Visual Studio Code使用此名称来显示服务器。
Visual Studio Code尝试进行身份验证。 选择 “允许 ”并使用凭据登录。
服务器已创建。
启用代理模式
添加服务器后,启用代理模式,以便Visual Studio Code可以将问题路由到数据代理:
当代理模式处于活动状态时,请选择一个业务流程协调程序来处理你的问题。 协调器负责管理你在编辑器中提出的问题与数据代理 MCP 服务器之间的流转。 预览版中的可用业务流程协调程序包括 GPT-5、GPT-4.1、Claude Sonnet 4.5、Gemini 2.5 Pro 等。
提出问题
启用代理模式并选择协调器后,可直接在编辑器中提问。 编排器将每个问题路由到数据代理 MCP 服务器,而该代理会基于其在 OneLake 中可访问的数据返回答案。 在将组织知识引入 AI 工作流程的同时,您始终无需离开编辑器。