SAP B1-HANA经纪人MCP
用于SAP HANA读取和SAP服务层写入的经过身份验证、范围感知的MCP服务器。通过按呼叫者配置文件、审批门和深度防御安全将Claude等LLM连接到您的SAP环境。
特性
- 两次运输 --stdio(开发,无身份验证)和HTTP(生产,承载令牌身份验证)
- 基于范围的访问控制 --配置文件定义了每个调用者可以查看和使用的工具
- HANA读取工具 --模式自检、表采样、只读SQL查询
- SAP写入工具 --通过服务层处理生产订单、采购请求、库存变动
- 审批工作流程 --写操作在执行前可能需要人工批准
- 安全控制 --SQL验证、速率限制、行限制、查询超时、审计日志记录
- SAP HANA 2.0 SPS05+ 和 SAP Business One服务层 兼容的
安装
git clone
cd sap-hana-mcp
# Configure SAP npm registry (required for @sap/hana-client)
npm config set @sap:registry https://npm.sap.com
pnpm install
pnpm build配置
环境变量
复制 .env.example 到 .env 并填写你的价值观。
| 变量 | 必填 | 默认 | 描述 |
|---|---|---|---|
| 经纪人 | |||
BROKER_TRANSPORT | 没有 | stdio | stdio (dev)或 http (生产) |
BROKER_HOST | 没有 | 127.0.0.1 | HTTP绑定地址 |
BROKER_PORT | 没有 | 3000 | HTTP端口 |
BROKER_CONFIG | 没有 | ./broker.config.yaml | 代理配置路径(仅限HTTP模式) |
BROKER_TLS | 没有 | false | 为代理端点启用HTTPS |
BROKER_TLS_KEY | 没有 | /opt/sap-broker/tls/key.pem | 启用TLS时的PEM私钥路径 |
BROKER_TLS_CERT | 没有 | /opt/sap-broker/tls/cert.pem | 启用TLS时的PEM证书路径 |
| 哈纳 | |||
HANA_HOST | 是 | - | HANA服务器主机名或IP |
HANA_PORT | 没有 | 30015 | HANA端口(3\15) |
HANA_USER | 是 | - | 数据库用户名 |
HANA_PASSWORD | 是 | - | 数据库密码 |
HANA_SCHEMA | 否 | - | 限制为单个架构(空=全部) |
HANA_ENCRYPT | 没有 | true | 启用TLS加密 |
HANA_SSL_VALIDATE_CERTIFICATE | 没有 | true | 验证SSL证书 |
HANA_ROW_LIMIT | 没有 | 1000 | 每次查询的最大行数 |
HANA_QUERY_TIMEOUT | 没有 | 30000 | 查询超时(ms) |
HANA_CONNECTION_TIMEOUT | 没有 | 5000 | 连接超时(ms) |
| SAP服务层 (可选) | |||
SAP_BASE_URL | 无 | - | 服务层URL(启用写入工具) |
SAP_COMPANY_DB | 否 | - | 公司数据库名称 |
SAP_USERNAME | 否 | - | 服务层用户名 |
SAP_PASSWORD | 否 | - | 服务层密码 |
代理配置(HTTP模式)
broker.config.yaml 定义范围、配置文件、令牌和审批规则。有关完整注释的示例,请参阅随附文件。
范围 映射到工具集:
| 范围 | 工具 |
|---|---|
read:metadata | list_schemas, list_tables, list_views, describe_table, get_table_sample |
query:hana | execute_query |
write:production_orders | create_production_order, update_production_order |
write:purchase_requests | create_purchase_request, update_purchase_request |
write:inventory | receive_inventory, issue_inventory |
档案 为不同角色(观察者、分析师、计划员、仓库、操作员)捆绑范围。
代币 SHA-256哈希承载令牌映射到配置文件:
# Generate a token + hash pair
TOKEN=$(openssl rand -hex 32)
HASH=$(echo -n "$TOKEN" | shasum -a 256 | cut -d' ' -f1)
echo "token: $TOKEN"
echo "hash: sha256:$HASH"审批规则 门写入工具: required (人类必须批准), auto (立即执行),或 deny (块)。
设置
开发模式(stdio)
创建 .mcp.json 在项目根目录中:
{
"mcpServers": {
"sap-broker": {
"type": "stdio",
"command": "node",
"args": ["/path/to/sap-hana-mcp/dist/index.js"],
"env": {
"HANA_HOST": "your-hana-host.example.com",
"HANA_PORT": "30015",
"HANA_USER": "MCP_READER",
"HANA_PASSWORD": "your_password",
"HANA_SCHEMA": "YOUR_SCHEMA"
}
}
}
}或者通过CLI:
claude mcp add sap-broker --transport stdio \
--env HANA_HOST=your-hana-host.example.com \
--env HANA_PORT=30015 \
--env HANA_USER=your_user \
--env HANA_PASSWORD=your_password \
--env HANA_SCHEMA=YOUR_SCHEMA \
-- node /path/to/sap-hana-mcp/dist/index.js在stdio模式下,所有工具都可以在没有身份验证的情况下使用(仅限开发人员)。
生产模式(HTTP)
BROKER_TRANSPORT=http \
BROKER_HOST=127.0.0.1 \
BROKER_PORT=3000 \
BROKER_TLS=true \
BROKER_TLS_KEY=/opt/sap-broker/tls/key.pem \
BROKER_TLS_CERT=/opt/sap-broker/tls/cert.pem \
HANA_HOST=your-hana-host.example.com \
HANA_USER=MCP_READER \
HANA_PASSWORD=your_password \
node dist/index.js呼叫者通过以下方式进行身份验证 Authorization: Bearer 并且只看到与其配置文件范围匹配的工具。
可用工具
读取工具(HANA)
| 工具 | 说明 |
|---|---|
list_schemas | 列出可访问的数据库架构 |
list_tables | 列出架构中具有记录计数的表 |
list_views | 列出架构中的视图 |
describe_table | 获取列、主键;将全部详细信息写入文件 |
execute_query | 执行只读SELECT查询 |
get_table_sample | 表中的示例行(写入CSV) |
写入工具(SAP服务层)
要求 SAP_BASE_URL 待配置。仅在包含写入权限的范围内可用。
| 工具 | 说明 |
|---|---|
create_production_order | 创建生产订单(需要OriginAbs) |
update_production_order | 通过DocEntry更新生产订单 |
create_purchase_request | 创建购买请求 |
update_purchase_request | 通过DocEntry更新采购请求 |
receive_inventory | 收货(库存GenEntries) |
issue_inventory | 货物出库(库存GenExits) |
HTTP API
MCP端点
| 方法 | 路径 | 描述 |
|---|---|---|
POST | /mcp | 初始化会话或发送MCP请求 |
GET | /mcp | 现有会话的SSE流 |
DELETE | /mcp | 结束会话 |
会话通过以下方式跟踪 Mcp-Session-Id 头球
批准API(侧通道)
| 方法 | 路径 | 描述 |
|---|---|---|
GET | /approvals | 列出待批准事项 |
POST | /approvals/:id/approve | 批准待处理的请求 |
POST | /approvals/:id/deny | 拒绝待处理的请求(可选 reason 体内) |
健康检查
GET /health --退货 { status, sessions, pendingApprovals } (未经身份验证)。如果 BROKER_TLS=true,用 curl -k https://127.0.0.1:${BROKER_PORT:-3000}/health.
安全模型
纵深防御架构
Agent Request
|
[1] Bearer Token Auth ────── Validate token, resolve profile + scopes
|
[2] Scope Filtering ─────── Only tools matching caller scopes are visible
|
[3] Approval Gate ────────── Write tools may require human approval
|
[4] SQL Keyword Validator ── Block INSERT, UPDATE, DELETE, DROP, etc.
|
[5] Query Parser ─────────── Single statement only (no injection)
|
[6] Prefix Validation ────── Must start with SELECT, WITH, or EXPLAIN
|
[7] Rate Limiter ─────────── Sliding window (30 req / 60s)
|
[8] DB User Privileges ───── SELECT-only grants (recommended)
|
[9] Result Limits ─────────── Row count and query timeout enforcement被阻止的SQL关键字
INSERT, UPDATE, DELETE, MERGE, UPSERT, REPLACE
CREATE, ALTER, DROP, TRUNCATE, RENAME
GRANT, REVOKE, CALL, EXEC, EXECUTE
BEGIN, COMMIT, ROLLBACK, SAVEPOINT, SET
IMPORT, EXPORT, LOAD, UNLOAD推荐:只读数据库用户
CREATE USER MCP_READER PASSWORD "YourSecurePassword";
GRANT SELECT ON SCHEMA YOUR_SCHEMA TO MCP_READER;
ALTER USER MCP_READER DISABLE PASSWORD LIFETIME;发展
pnpm dev # stdio mode with hot reload
pnpm build # compile TypeScript
pnpm start # run production build项目结构
sap-hana-mcp/
├── src/
│ ├── index.ts # Entry point, transport selection
│ ├── config.ts # Environment configuration
│ ├── hana/
│ │ └── client.ts # HANA connection & query execution
│ ├── sap/
│ │ ├── client.ts # SAP Service Layer HTTP client
│ │ └── tools.ts # Write tool implementations
│ ├── security/
│ │ ├── query-validator.ts # SQL injection prevention
│ │ ├── rate-limiter.ts # Sliding window rate limiter
│ │ └── audit.ts # Query audit logging
│ ├── auth/
│ │ ├── config.ts # Broker config YAML loader
│ │ ├── tokens.ts # Bearer token validation
│ │ └── scopes.ts # Scope resolution
│ ├── server/
│ │ ├── context.ts # Caller context model
│ │ ├── registry.ts # Scope-aware tool registration
│ │ ├── stdio.ts # Dev transport
│ │ └── http.ts # Production HTTP transport
│ ├── tools/
│ │ ├── index.ts # Read tool definitions & handlers
│ │ ├── format.ts # Result formatting (table, CSV)
│ │ └── output.ts # File output management
│ └── approval/
│ ├── service.ts # Approval gate wrapper
│ ├── store.ts # In-memory approval store
│ └── routes.ts # Approval REST API
├── broker.config.yaml # Scopes, profiles, tokens, approval rules
├── .env.example # Environment variable template
├── package.json
└── tsconfig.json故障排除
认证失败
- 验证用户名/密码
- 检查用户是否存在:
SELECT USER_NAME FROM SYS.USERS WHERE USER_NAME = 'MCP_READER'
连接被拒绝
- 验证HANA是否正在运行:
ssh user@host "HDB info" - 检查端口:
30015例如00,30115例如01 - 测试连接性: `telnet
`
查询验证失败
- 只允许SELECT、WITH、EXPLAIN查询
- 检查被阻止的关键字
- 不允许多语句查询
HTTP 401/403
- 确保
Authorization: Bearer标题已设置 - 验证令牌哈希是否在
broker.config.yaml - 检查令牌的配置文件是否具有所需的范围
写入工具不可用
- 集
SAP_BASE_URL,SAP_COMPANY_DB,SAP_USERNAME,SAP_PASSWORD - 确保调用者的配置文件包括写入范围
HANA系统视图参考
| 查看 | 目的 |
|---|---|
SYS.SCHEMAS | 列出架构 |
SYS.TABLES | 列出表格 |
SYS.VIEWS | 列表视图 |
SYS.TABLE_COLUMNS | 列元数据 |
SYS.INDEXES | 索引信息 |
SYS.CONSTRAINTS | 主键/外键 |
M_CS_TABLES | 列存储表统计数据(记录计数) |
许可证
麻省理工学院
