内容
# SSAS MCP 服务器
只读 [模型上下文协议](https://modelcontextprotocol.io) 服务器,用于查询
**SQL Server 分析服务** — 包括 **多维数据集 (MDX)** 和 **表格模型 (DAX)** — 使用 **Windows 集成安全** (Kerberos/NTLM,无密码)。
与 [mssql_mcp_server](https://github.com/dbdave/mssql_mcp_server) 配套使用,但适用于 OLAP 方面。
## 功能
- **`list_metadata`** — 通过 `MDSCHEMA_*` DMV 发现多维数据集/模型的度量、维度 和 分层结构(适用于两种模型类型),因此代理永远不会猜测带括号的唯一名称。概述保持紧凑 — 度量、维度名称 和 多级用户分层结构;传递 `dimension="[Dim Event]"` 以深入了解一个维度的完整属性分层结构 和 级别(整个多维数据集的属性列表可以达到数万个标记)。
- **`execute_query`** — 运行 MDX (`SELECT`/`WITH`) 或 DAX (`EVALUATE`/`DEFINE`) 查询,并获取一个扁平化的 JSON 表格。
- **`execute_dmv`** — 用于 `SELECT ... FROM $SYSTEM.*` 架构行集的受保护直通(`MDSCHEMA_*`、`TMSCHEMA_*`、`DISCOVER_*`)进行更深入的检查。
- **仅读构造** — 不以 `SELECT`/`WITH`/`EVALUATE`/`DEFINE` 开头的语句被拒绝,XMLA 有效载荷被拒绝,并且没有任何 DDL/处理接口。
- **行限制 + 查询超时** 在每次调用上,以便运行失控的交叉连接不会淹没上下文窗口。
## 需求
由于构造原因,仅限 Windows(服务器通过 pythonnet 驱动 ADOMD.NET):
1. **Windows**,域加入,有权访问 SSAS 实例(默认实例 = TCP 2383)。
2. 运行服务器的 Windows 帐户对 SSAS 数据库具有 **读取** 访问权限(角色成员资格)。集成身份验证意味着“运行进程的人员”。
3. **ADOMD.NET 客户端库** — 随 SSMS 捆绑销售,或安装 [分析服务客户端库](https://learn.microsoft.com/en-us/analysis-services/client-libraries) 可重新分发。通常位于 `C:\Program Files\Microsoft.NET\ADOMD.NET\160`。
4. **Python 3.11+**
## 安装
```powershell
git clone https://github.com/dbdave/mssas_mcp_server
cd mssas_mcp_server
pip install -e .
```
在连接 MCP 之前进行连接性测试(如果失败,则是网络/身份验证/ADOMD 安装问题,而不是服务器):
```powershell
python test_connection.py <服务器> <目录>
```
## 配置
| 变量 | 必需 | 默认值 | 备注 |
|---|---|---|---|
| `SSAS_SERVER` | 是 | — | 主机、`主机\实例` 或 `http(s)://.../msmdpump.dll` URL |
| `SSAS_CATALOG` | 是 | — | SSAS 数据库名称 |
| `SSAS_DEFAULT_CUBE` | 否 | — | `list_metadata` 在未指定时使用的多维数据集/模型 |
| `SSAS_ROW_LIMIT` | 否 | `10000` | 返回行的硬上限 |
| `SSAS_QUERY_TIMEOUT` | 否 | `60` | 查询超时,秒 |
| `SSAS_ADOMD_DLL_DIR` | 否 | 自动检测 | 包含 `Microsoft.AnalysisServices.AdomdClient.dll` 的文件夹 |
身份验证始终是 Windows 集成安全 (`Integrated Security=SSPI`) — 配置中没有凭证。
## MCP 注册(Claude Code / Claude Desktop)
```json
{
"mcpServers": {
"ssas-cube": {
"command": "python",
"args": ["-m", "ssas_mcp.server"],
"env": {
"SSAS_SERVER": "my-ssas-host",
"SSAS_CATALOG": "My_Cube_Db",
"SSAS_DEFAULT_CUBE": "Sales"
}
}
}
}
```
一个已注册的服务器针对一个 SSAS 数据库。要使用多维和表格实例,请使用不同的 `SSAS_SERVER`/`SSAS_CATALOG` 环境块注册服务器两次 — 查询语言按调用选择(`execute_query` 接受 MDX 或 DAX,引擎本身只接受与模型类型匹配的语言)。
## 示例用法
多维(MDX):
```mdx
SELECT NON EMPTY { [Measures].[Tickets Issued] } ON COLUMNS,
NON EMPTY { [Sales Item Fact Ordered Date].[Calendar].[Year Name].MEMBERS } ON ROWS
FROM [Sales]
```
表格(DAX):
```dax
EVALUATE SUMMARIZECOLUMNS('Date'[Year], "Total Sales", [Total Sales])
```
DMV 检查:
```sql
SELECT [MEASURE_NAME], [MEASUREGROUP_NAME] FROM $SYSTEM.MDSCHEMA_MEASURES WHERE [CUBE_NAME] = 'Sales'
SELECT * FROM $SYSTEM.TMSCHEMA_MEASURES -- 表格模型
```
## 结果格式
工具返回 JSON:
```json
{
"columns": ["[Sales Item Fact Ordered Date].[Calendar].[Year Name].[MEMBER_CAPTION]", "[Measures].[Tickets Issued]"],
"rows": [["2025", 123456], ["2026", 98765]],
"row_count": 2,
"truncated": false
}
```
单元格可以为空,列可以是混合类型 — MDX 单元格集被防御性地展平(保留空值,`Decimal` → float,`DateTime` → ISO 字符串)。
## 测试
```powershell
pip install pytest
pytest tests/
```
## 许可证
MIT