SAP HANA连接器

SAP B1-HANA Broker MCP是一个经过认证的、具有范围感知的MCP服务器,用于SAP HANA读取和SAP Service Layer写入,通过每个调用者配置文件、审批门和深度防御安全将LLM(如Claude)连接到SAP环境。

  • by novarii
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 novarii/sap-hana-mcp

使用说明

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 <repo-url>
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 <token> 并且只看到与其配置文件范围匹配的工具。

可用工具

读取工具(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 <host> <port>

查询验证失败

  • 只允许SELECT、WITH、EXPLAIN查询
  • 检查被阻止的关键字
  • 不允许多语句查询

HTTP 401/403

  • 确保 Authorization: Bearer <token> 标题已设置
  • 验证令牌哈希是否在 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 列存储表统计数据(记录计数)

许可证

麻省理工学院