Microsoft结构SQL分析端点–只读MCP服务器
A. 模型上下文协议(MCP) 服务器 为AI助手(Claude Desktop、Cowork或任何MCP客户端)提供只读SQL 访问Microsoft Fabric SQL Analytics端点。
______________________________________________________________________
目录
______________________________________________________________________
架构概述
Claude / Cowork
│
│ MCP stdio transport
▼
server.py (this repo)
│
│ pyodbc + AAD token
▼
Microsoft Fabric SQL Analytics Endpoint服务器使用 stdio传输,这意味着MCP客户端将其作为 子进程通过stdin/stdout进行处理和通信。没有web服务器或开放端口 是必需的。
______________________________________________________________________
1.在Azure Entra ID中注册服务主体
- 打开 Azure门户 并导航到
微软Entra ID→ 应用程序注册→ 新注册.
- 给它一个描述性的名字(例如。
fabric-mcp-reader). - 离开 重定向URI 空白并单击 注册.
- 上 概述 第页,注意 应用程序(客户端)ID 和
目录(租户)ID --这些进入你的 .env.
- 首选 证书和秘密→ 新客户机密,选择一个到期日,以及
复制 价值 立即(仅显示一次)。
______________________________________________________________________
2.在Microsoft Fabric中授予只读访问权限
Microsoft Fabric在工作区和项目级别控制数据访问。这 服务主体需求:
2a。工作区查看器角色
- 打开Fabric工作区。
- 点击 管理访问 (右上)。
- 搜索上面创建的应用程序注册名称。
- 分配 观众 角色和保存。
2b。SQL级只读权限
对于大多数结构仓库来说,仅查看器角色就足够了。更精细 控制、连接高权限帐户并执行:
-- Replace with the name of your app registration.
CREATE USER [] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [];重要提示: 做 不 分配db_owner,db_datawriter,或任何DDL 角色。MCP服务器也仅在应用层强制执行SELECT,但是 深度防御从数据库级别开始。
______________________________________________________________________
3.安装依赖项
先决条件
- Python 3.10或更高版本
- SQL Server的ODBC驱动程序18
安装在将运行服务器的计算机上。
# Verify ODBC driver is installed (Linux / macOS)
odbcinst -q -d | grep -i "ODBC Driver 18"
# Install Python dependencies
pip install -r requirements.txtLinux–ODBC驱动程序18快速安装(Debian/Ubuntu)
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/22.04/prod.list \
| sudo tee /etc/apt/sources.list.d/mssql-release.list
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18macOS
brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew install msodbcsql18______________________________________________________________________
4.配置凭据
cp .env.example .env编辑 .env 并填写五个值:
| 变量 | 在哪里可以找到它 |
|---|---|
FABRIC_SQL_ENDPOINT | 织物工作区→ SQL分析端点→ *连接字符串* |
FABRIC_DATABASE | 仓库或湖畔小屋名称 |
AZURE_TENANT_ID | 参赛者ID→ 应用程序注册→ 概述 |
AZURE_CLIENT_ID | 参赛者ID→ 应用程序注册→ 概述 |
AZURE_CLIENT_SECRET | 参赛者ID→ 应用程序注册→ 证书和秘密 |
______________________________________________________________________
5.在本地运行并验证连接
# Quick smoke-test: list tables via the CLI inspector
python -m mcp dev server.pyMCP检查器在浏览器中打开。在 工具 选项卡,呼叫 list_tables --您应该看到Fabric表以JSON格式返回。
或者,直接运行服务器并通过管道发送测试消息:
python server.py该过程启动并在stdin上等待MCP消息(正常行为 stdio传输)。按Ctrl-C停止。
______________________________________________________________________
6.连接克劳德桌面或协作
克劳德桌面(claude_desktop_config.json)
找到配置文件:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 窗户:
%APPDATA%\Claude\claude_desktop_config.json
在下面添加服务器 mcpServers:
{
"mcpServers": {
"fabric-sql": {
"command": "python",
"args": ["/absolute/path/to/smileset-fabric-mcp-reader/server.py"],
"env": {
"FABRIC_SQL_ENDPOINT": "yourworkspace.datawarehouse.fabric.microsoft.com",
"FABRIC_DATABASE": "YourWarehouse",
"AZURE_TENANT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"AZURE_CLIENT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"AZURE_CLIENT_SECRET": "your-secret"
}
}
}
}小贴士:如果你喜欢保守秘密.env,省略env阻止并确保.env存在于项目目录中--python-dotenv加载它 启动时自动。
重新启动克劳德桌面。工具 list_tables, describe_table, run_query, 和 get_schema_overview 应出现在工具选择器中。
同事
在Cowork的MCP设置中,添加新的 标准 服务器:
- 命令:
python /absolute/path/to/server.py - 工作目录:
/absolute/path/to/smileset-fabric-mcp-reader
______________________________________________________________________
7.在Azure虚拟机或Docker上部署
Azure虚拟机
# On the VM (Ubuntu 22.04 example)
git clone https://github.com/your-org/smileset-fabric-mcp-reader.git
cd smileset-fabric-mcp-reader
pip install -r requirements.txt
cp .env.example .env && nano .env # fill in credentials
python server.py # or use systemd / supervisord使用SSH端口转发或共享端口将MCP客户端指向VM的路径 文件系统挂载。
码头工人
FROM python:3.12-slim
# Install ODBC Driver 18
RUN apt-get update && apt-get install -y curl gnupg2 && \
curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add - && \
curl https://packages.microsoft.com/config/debian/12/prod.list \
> /etc/apt/sources.list.d/mssql-release.list && \
apt-get update && ACCEPT_EULA=Y apt-get install -y msodbcsql18 && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY server.py .
# .env is mounted at runtime – do not COPY it into the image
CMD ["python", "server.py"]docker build -t fabric-mcp-reader .
docker run --rm -i --env-file .env fabric-mcp-reader容器从stdin读取并写入stdout,与stdio匹配 MCP客户端期望的传输。
______________________________________________________________________
暴露的MCP工具
| 工具 | 说明 |
|---|---|
list_tables() | 返回所有具有模式名称和类型的表和视图 |
describe_table(table_name) | 返回列、数据类型和可空性 |
run_query(sql) | 执行SELECT查询,返回JSON(最多1000行) |
get_schema_overview() | 完整的模式摘要——首先调用此命令以确定LLM的方向 |
______________________________________________________________________
安全模型
- 应用层: 传递给的每个SQL字符串
run_query之前已解析
执行。第一个有意义的关键字不是的任何语句 SELECT 或 WITH (CTE)因描述错误而被拒绝。嵌入式写入关键字 (INSERT, UPDATE, DELETE, DROPCTE内的其他部分(如管道、管道、管道等)也被堵塞。
- 数据库层: 服务主体仅被分配
db_datareader
角色(以及可选的工作区查看器角色)。即使应用层 如果绕过保护,数据库将拒绝写入操作。
- 资格证书: 秘密从来不是硬编码的。它们是从
.env
(本地)或来自环境变量(CI/CD、Docker、VM)。确保 .env 是 在 .gitignore.
- 无原始堆栈痕迹: 所有错误都会被捕获并以人类可读的方式返回
消息,这样内部连接细节就不会泄露给LLM。
