内容
# 詹纳SAS MCP服务器
从任何[模型上下文协议](https://modelcontextprotocol.io)的客户端运行和验证**SAS**程序 — Claude Desktop、Claude Code、Cursor等 — 无需SAS研究所许可证。该服务器封装了公共詹纳运行API(`https://api.jenneranalytics.com`),该API在锁定沙盒中执行兼容SAS的程序,并以结构化JSON返回日志、列表、输出文件、WORK数据集和诊断信息。
[Jenner](https://jenneranalytics.com)是一个兼容SAS的引擎:编写标准SAS(DATA步骤、PROC、宏)并直接运行。
## 服务器功能
| 工具 | 功能描述 |
|------|--------------|
| `run_sas` | 执行SAS/Jenner程序;返回状态、SAS日志、列表、WORK数据集(行/列 + 预览URL)、输出文件(PNG/SVG/CSV)和诊断信息。 |
| `validate_sas` | 解析检查程序(~10秒,无执行)- 在运行前确认语法,或检查生成的代码。 |
| `get_run` | 通过ID重新获取已完成的运行,并附带完整的(未剪辑的)日志和列表。 |
| `dataset_preview` | 预览由运行产生的WORK数据集的行。 |
## 快速入门
服务器通过标准输入/输出使用MCP。运行它的最快方法是使用[`uv`](https://docs.astral.sh/uv/)(无需手动安装步骤 - `uvx`按需获取并运行):
```bash
uvx jenner-sas-mcp
```
或使用pip将其安装到环境中:
```bash
pip install jenner-sas-mcp
jenner-sas-mcp # 启动标准输入/输出服务器
```
> 在软件包发布到PyPI之前,请从此存储库安装:
> `uvx --from git+https://github.com/JennerAnalytics/jenner-sas-mcp jenner-sas-mcp`
> 或 `pip install git+https://github.com/JennerAnalytics/jenner-sas-mcp`.
## 配置
所有配置均通过环境变量进行:
| 变量 | 默认值 | 用途 |
|----------|---------|---------|
| `JENNER_API_KEY` | *(无)* | Bearer令牌。没有它,您将以**匿名**层运行 - 超时时间更短,观察上限更低,速率限制更严格。提供密钥以获得更高的限制。 |
| `JENNER_API_URL` | `https://api.jenneranalytics.com` | 重定向到自托管网关或本地开发实例(`http://127.0.0.1:3000`)。 |
| `JENNER_MAX_LOG_CHARS` | `40000` | 返回给模型的每个字段的上限(日志/列表),以保护上下文窗口。完整的工件可以通过`get_run`检索。 |
## 连接客户端
### 克劳德桌面版
编辑您的`claude_desktop_config.json`
(macOS:`~/Library/Application Support/Claude/claude_desktop_config.json`,
Windows:`%APPDATA%\Claude\claude_desktop_config.json`)并添加:
```json
{
"mcpServers": {
"jenner-sas": {
"command": "uvx",
"args": ["jenner-sas-mcp"],
"env": {
"JENNER_API_KEY": "您的API密钥-可选"
}
}
}
}
```
重启克劳德桌面版。`jenner-sas`工具将出现在工具菜单中。
(此配置文件的副本位于[`examples/claude_desktop_config.json`](examples/claude_desktop_config.json)。)
### 克劳德代码
```bash
claude mcp add jenner-sas --env JENNER_API_KEY=您的密钥 -- uvx jenner-sas-mcp
```
或者,对于存储在存储库中的项目范围服务器,请将其添加到`.mcp.json`:
```json
{
"mcpServers": {
"jenner-sas": { "command": "uvx", "args": ["jenner-sas-mcp"] }
}
}
```
### 任何其他MCP客户端
以标准输入/输出服务器的身份启动`uvx jenner-sas-mcp`(或`jenner-sas-mcp`)。通过客户端的服务器配置传递上述环境变量。
## 试用
连接后,向模型提问,例如:
- *"运行此SAS程序并显示均值:`proc means data=sashelp.class; var height weight; run;`"*
- *"在运行之前验证此程序,然后修复任何错误。"*
- *"模拟1000次从正态分布的抽样,汇总它们,并使其不确定。"*
- *"运行我的回归并预览`outstat`数据集。"*
模型在后台进行的最小调用:
```python
run_sas(script="data a; x=1; output; run; proc print data=a; run;")
# -> { "ok": true, "exit_code": 0, "log": "...", "listing": "Obs x\n 1 1",
# "datasets": [{ "name": "a", "rows": 1, "columns": ["x"], ... }], ... }
```
## 结果返回方式
`run_sas`返回运行结果JSON的紧凑、模型友好型摘要:
- `ok` / `exit_code` — `exit_code`是SAS严重性(0表示干净,1表示警告但仍然正常,≥2表示错误);`ok`是布尔值`exit_code < 2`。
- `log` — SAS日志(第一个读取错误和`NOTE:`/`WARNING:`行的地方)。如果非常大,则剪辑头+尾;使用`get_run`获取完整文本。
- `listing` — 打印/标准输出输出(例如PROC PRINT、PROC MEANS表格)。
- `datasets` — 每个WORK数据集的`name`、`rows`、`columns`和`preview_url`/`download_url`。
- `files` — 输出工件(PNG/SVG/CSV/…)及其下载`url`。
- `diagnostics` — 解析和运行时警告。
- `run_id` + `access_token` — 将这些传递给`get_run` / `dataset_preview`以检索完整的工件。
默认情况下,**确定性是开启的**:RNG被播种,`today()`/`datetime()`被冻结,因此相同的程序产生相同的输出。设置`deterministic=false`以获得真正的随机性。
## 开发
```bash
git clone https://github.com/JennerAnalytics/jenner-sas-mcp
cd jenner-sas-mcp
uv sync --extra dev # 或:pip install -e ".[dev]"
pytest # 单元测试(无网络)
```
在本地网关上运行服务器:
```bash
JENNER_API_URL=http://127.0.0.1:3000 uv run jenner-sas-mcp
```
使用MCP检查器交互式检查工具:
```bash
npx @modelcontextprotocol/inspector uvx jenner-sas-mcp
```
## 许可证
Apache-2.0 — 请参阅[LICENSE](LICENSE)。
---
SAS和所有其他SAS研究所公司产品或服务名称是SAS研究所公司在美国和其他国家的注册商标或商标。®表示美国注册。Jenner不隶属于SAS研究所公司或得到其认可。