内容
# MCP服务器适用于SAP Focused Run
[](https://opensource.org/licenses/Apache-2.0)
[](https://www.python.org/downloads/)
[](https://github.com/mcp-ai/fastmcp)
> 本项目提供了一个模型-上下文-协议(MCP)服务器,作为大型语言模型(LLM)和SAP Focused Run系统之间的桥梁。它公开了Focused Run Landscape Management Database(LMDB)公共API,作为LLM可以轻松查询的一组工具。
## 关键特性
- **客户解析**:新的`find_customer`工具,通过最少的数据传输和模糊搜索功能,解析客户ID、名称和网络。
- 公开了全面的SAP Focused Run端点:**主机、系统、数据库、云租户、技术实例、ABAP客户端、软件组件和产品版本**。
- **高性能异步架构**:基于`httpx.AsyncClient`,带有连接池和异步传输支持(`stdio`、`sse`、`streamable-http`)。
- **生产弹性**:内置指数级重试机制,用于暂时的SAP API错误(502、503、504)和网络问题。
- **身份隔离缓存**:5分钟TTL缓存,严格的SHA-256身份隔离,确保不同租户或凭证之间不会发生数据泄露。
- **安全日志**:用户名和令牌等敏感值在日志中自动被删除。
- 打包为标准的Python应用程序,带有命令行入口。
- 包括用于深度系统分析和景观发现的预定义MCP提示。
## 快速入门
### 先决条件
- ***[uv](https://docs.astral.sh/uv/)*** 已安装。
- ***Python 3.13+***
- ***FocusedRun技术用户***,具有访问SAP FocusedRun实例的API权限,具备以下角色 ```SAP_FRN_LDB_ALL``` 和 ```SAP_FRN_LDB_DISP```。
- ***SAP ICF服务*** ```sap/frun/landscape/landscape_api``` 已激活。
- ***MCP客户端*** Cursor、Gemini、Claude Desktop、VS Code with Copilot等。
### 安装
1. **克隆仓库:**
```bash
git clone <your-repository-url>
cd mcp-sap-focusedrun
```
2. **使用uv安装依赖:**
该项目使用uv进行快速Python包管理。
```bash
uv sync
```
## 用法
服务器使用环境变量进行配置。在项目目录的根目录中创建一个`.env`文件,并添加以下凭证:
```env
API_BASE_URL="https://<your-focused-run-host>/sap/frun/landscape/landscape_api"
SAP_CLIENT="100"
API_USER="YOUR_API_USER"
API_PASSWORD="YOUR_API_PASSWORD"
CUSTOM_HEADERS='{"x-custom-header": "value"}'
```
或直接在MCP客户端配置中传递配置(无需.env文件):
```json
{
"mcpServers": {
"sap-focusedrun": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-sap-fucsedrun",
"run",
"mcp-sap-focusedrun"
],
"env": {
"API_BASE_URL": "https://<sap focused run host>/sap/frun/landscape/landscape_api",
"SAP_CLIENT": "100",
"API_USER": "YOUR_API_USER",
"API_PASSWORD": "YOUR_API_PASSWORD",
"CUSTOM_HEADERS": "{\"x-custom-header\": \"value\"}"
}
}
}
}
```
或通过Docker镜像:
```bash
docker build -t mcp-sap-focusedrun .
docker run -it --rm --name sap-mcp -p 8000:8000 --env-file .env mcp-sap-focusedrun
```
## 配置
| 变量 | 必需 | 默认值 | 描述 |
| --- | --- | --- | --- |
| `API_BASE_URL` | 是 | - | Focused Run API的基础URL |
| `SAP_CLIENT` | 是 | 100 | SAP FocusedRun客户端 |
| `API_USER` | 是 | - | 技术用户名 |
| `API_PASSWORD` | 是 | - | 技术用户密码 |
| `CUSTOM_HEADERS` | 否 | - | 自定义HTTP头部的可选JSON字符串 |
| `CF_ACCESS_CLIENT_ID` | 否 | - | Cloudflare Access客户端ID(可选) |
| `CF_ACCESS_CLIENT_SECRET` | 否 | - | Cloudflare Access客户端密钥(可选) |
| `MCP_SERVER_AUTH_TOKEN` | 否 | - | SSE/HTTP传输所需(原始令牌值) |
| `MCP_ALLOWED_HOSTS` | 否 | 127.0.0.1, localhost | 允许的主机头列表。在使用代理(如K8s Ingress)部署时需要,防止421 DNS重新绑定错误。(例如`mcp.my-domain.com,mcp-service`) |
| `TRANSPORT` | 否 | `stdio` | `sse`、`streamable-http`或`stdio` |
| `PORT` | 否 | 8000 | 通过HTTP运行时绑定的端口 |
| `HOST` | 否 | 0.0.0.0 | 绑定的主机接口 |
| `LOG_LEVEL` | 否 | INFO | 日志级别(DEBUG、INFO、WARNING、ERROR) |
| `CACHE_TTL` | 否 | 300 | API响应缓存TTL(秒) |
| `CACHE_MAXSIZE` | 否 | 100 | 缓存的最大响应数 |
## 配置覆盖(通过HTTP头部)
在服务器以`sse`或`streamable-http`模式运行时,可以为每个请求动态覆盖配置。这对于多租户设置非常理想。
### 支持的覆盖
| 头部 | 覆盖环境变量 |
| :--- | :--- |
| `x-api-base-url` | `API_BASE_URL` |
| `x-api-user` | `API_USER` |
| `x-api-password` | `API_PASSWORD` |
| `x-sap-client` | `SAP_CLIENT` |
| `x-cf-access-client-id` | `CF_ACCESS_CLIENT_ID` |
| `x-cf-access-client-secret` | `CF_ACCESS_CLIENT_SECRET` |
> **优先级:** 头部值优先于环境变量。如果未提供头部,服务器将回退到环境变量中定义的默认值。
### 身份验证
使用HTTP传输时,在`Authorization`头部提供`MCP_SERVER_AUTH_TOKEN`:
`Authorization: Bearer <your_token>`
服务器稳健,可以处理带有或不带有`Bearer `前缀的令牌。
## 运行测试
要运行测试套件并验证与SAP Focused Run系统的连接,请使用`uv`运行测试:
```bash
uv run pytest
```
## 提供的工具
- `find_customer`: (新)将客户名称或网络ID解析为最小数据集(`CUSTOMER_NETWORK`、`CUSTOMER_NETWORK_NAME`、`CUSTOMER_NAME`)。在整个景观中执行**详尽的递归搜索**,并在客户端进行重复数据删除。
- `search_lmdb_by_product_version`: (新)通过产品版本名称在LMDB中搜索客户系统。支持通配符查询(例如,`SAP ERP`或`*SAP ERP*`)、客户名称/网络过滤和环境层级的客户端过滤(例如,`DEV`、`QAS`、`PROD`、`Sandbox`、`DR`)。
- `get_lmdb_hosts`: 从LMDB获取主机信息。
- `get_lmdb_systems`: 获取技术系统。
- `get_lmdb_technical_instances`: 获取技术实例。
- `get_lmdb_databases`: 获取数据库实例。
- `get_lmdb_cloud_tenants`: 获取已注册的云租户。
- `get_lmdb_installed_software_components`: 获取已安装的软件组件。
- `get_lmdb_installed_product_versions`: 获取已安装的产品版本。
- `get_lmdb_abap_clients`: 获取配置的ABAP客户端。
- `get_lmdb_single_database`: 单个数据库的显式端点。
## 当前问题
1. 以下API端点尚未完全测试:
1. ```landscape_api_single_database``` - 此API服务本身似乎存在问题。