内容
# 1c-bsp-context
[](https://modelcontextprotocol.io)
[](https://kotlinlang.org)
[](https://spring.io/projects/spring-boot)
[](LICENSE)
[](https://github.com/phill752/1c-bsp-context/actions/workflows/build.yml)
MCP服务器,提供给AI代理 **精确且可验证** 的1C:企业8.3标准子系统库(BSP)API参考。
服务器解析BSP配置以EDT(XML)格式导出,并索引所有公共模块(过程、函数、参数、描述、子系统绑定),然后通过 **6个MCP工具** 回答模型查询。
## 架构
```
LLM (ChatGPT, Claude, Cascade, Kilo Code)
│
MCP客户端 (SSE / stdio)
│
1c-bsp-context (Kotlin + Spring AI)
│
EDT-BSP导出 (CommonModules/ + Subsystems/)
```
服务器启动时,索引约800个模块和20,000个过程,内存占用小于2秒。每个查询返回源代码的精确数据,包含文件和行号。
## 关键功能
- **精确搜索** — 按过程名称、模块、子字符串、子系统
- **结构化文档块** — 参数类型、返回值、示例、警告
- **可验证性** — 每个事实都附带文件路径和行号 (`sourcePath:startLine`)
- **原始文档块** — 在 `<details>` 折叠块中保留原始注释文本
- **紧凑模式** — 描述 + 参数 + 签名,无源代码(节省约80%标记)
- **明确的数据缺失** — `_无描述_` 代替空字段,以免模型误解
- **APK过滤** — 排除服务标记 `APK:*`,但保留在原始文档块中
- **内存索引** — 约800个模块 / 20,000个过程,耗时小于2秒
## 技术栈
- **Kotlin 2.1** + **Spring Boot 3.5** + **Spring AI 1.0.0**
- **Jackson XML** (dataformat-xml) 用于解析EDT元数据
- **Gradle 8.5** (Kotlin DSL)
- **Java 17** (eclipse-temurin)
- 传输: **SSE** (HTTP, 端口8085) 和 **stdio**
## 构建和运行
### 要求
- Java 17+ (JDK)
- BSP配置以EDT格式导出(XML + `.bsl` 文件)
### 本地(stdio)
```bash
./gradlew bootJar
java -jar build/libs/mcp-bsp-context-0.1.0.jar \
--mode stdio \
--bsp-path /path/to/ssl-edt-export
```
### 本地(SSE)
```bash
./gradlew bootJar
java -jar build/libs/mcp-bsp-context-0.1.0.jar \
--mode sse \
--port 8085 \
--bsp-path /path/to/ssl-edt-export
```
服务器将在 `http://localhost:8085/sse` 提供服务。
### Docker
```bash
docker build -t 1c-bsp-context .
docker run --rm -p 127.0.0.1:8085:8085 \
-v /path/to/ssl-edt-export:/app/bsp:ro \
-e BSP_SOURCE_PATH=/app/bsp \
-e SSE_ADDRESS=0.0.0.0 \
1c-bsp-context
```
> `SSE_ADDRESS=0.0.0.0` 在Docker中是必需的,以便服务器在容器内侦听。默认情况下(无Docker),服务器仅在 `127.0.0.1` 上可用。
### Docker Compose
```yaml
services:
bsp-context:
build: /path/to/mcp-bsp
ports:
- "127.0.0.1:8085:8085"
volumes:
- /path/to/ssl-edt-export:/app/bsp:ro
environment:
- BSP_SOURCE_PATH=/app/bsp
- SSE_ADDRESS=0.0.0.0
restart: unless-stopped
```
## 数据源
期望1C配置导出目录以 **EDT** 格式:
```
ssl/
CommonModules/
地址分类器/
Ext/Module.bsl
地址分类器.xml
...
Subsystems/
标准子系统/
Subsystems/
数据从文件加载.xml
...
```
服务器启动时:
1. 递归遍历 `CommonModules/` — 对于每个模块,解析 `<Name>.xml`(元数据)和 `Ext/Module.bsl`(源代码)
2. 递归遍历 `Subsystems/` — 对于每个子系统,提取别名、子系统和模块列表从 `<Content>` 部分
3. 构建反向映射 `moduleName → subsystemName`
4. 将所有内容索引到内存中
## MCP工具
| 工具 | 用途 | 参数 |
|---|---|---|
| `search_bsp_api` | 按术语和/或子系统搜索过程/函数 | `query`, `subsystem?`, `limit?` |
| `get_bsp_procedure_info` | 过程的完整信息:描述、参数、类型、返回值、示例、警告、源代码、原始文档块 | `name`, `module?`, `compact?` |
| `get_bsp_module_info` | 公共模块信息 + 所有导出过程/函数的列表 | `moduleName`, `nameFilter?` |
| `list_bsp_procedures` | 模块的过程列表:名称、类型、签名、目的、来源。无源代码和参数 | `moduleName`, `nameFilter?` |
| `get_bsp_subsystem_overview` | 子系统概览:每个模块和关键过程 | `subsystemName` |
| `get_bsp_usage_example` | 调用过程和参数存根的现成BSL代码片段 | `procedureName`, `moduleName?` |
### 紧凑模式 (`get_bsp_procedure_info`)
`compact=true` 参数禁用源代码、示例、警告和合成调用示例的输出。保留:描述、参数类型、签名、原始文档块。节省约80%的标记。
### 按名称过滤 (`get_bsp_module_info`, `list_bsp_procedures`)
`nameFilter` 参数按名称中的子字符串(不区分大小写)过滤过程。例如,`nameFilter=" реквизит "` 仅返回名称中带有“ реквизит ”的过程。
### 可验证性
`get_bsp_procedure_info` 和 `list_bsp_procedures` 的每个结果都包含:
- **来源** — 文件路径和行号 (`CommonModules/公共目的/Ext/Module.bsl:64`)
- **原始文档块** — 原始注释行在 `<details>` 块中,用于与源代码进行校验
### 数据缺失规则
- 没有描述的参数 → `_源代码中无描述_`
- 没有文档块的过程 → `_无描述_`
- 服务标记 `APK:*` 从描述中排除,但保留在原始文档块中
## 在MCP客户端中连接
### Cascade (Windsurf) — `~/.codeium/windsurf/mcp_config.json`
```json
"1c-bsp-context": {
"url": "http://localhost:8085/sse",
"disabled": false
}
```
### Kilo Code — `~/.config/Code/User/globalStorage/kilocode.kilo-code/settings/mcp_settings.json`
```json
"1c-bsp-context": {
"autoApprove": [],
"disabled": false,
"timeout": 60,
"type": "sse",
"url": "http://localhost:8085/sse"
}
```
### Claude Desktop — `claude_desktop_config.json`
```json
"1c-bsp-context": {
"url": "http://localhost:8085/sse"
}
```
## 项目结构
```
mcp-bsp/
├── build.gradle.kts
├── settings.gradle.kts
├── gradle/libs.versions.toml
├── Dockerfile
├── README.md
├── LICENSE
├── CHANGELOG.md
└── src/main/
├── kotlin/ru/bsp/context/
│ ├── McpServerApplication.kt # 入口点 (--mode, --port, --bsp-path)
│ ├── business/
│ │ ├── model/ # BspModule, BspProcedure, BspParameter, BspSubsystem
│ │ └── services/
│ │ └── BspFormatterService.kt # 结果的Markdown格式化
│ ├── infrastructure/
│ │ ├── configuration/
│ │ │ └── BspContextConfiguration.kt
│ │ ├── edt/
│ │ │ ├── EdtXmlParser.kt # EDT元数据解析
│ │ │ ├── SubsystemParser.kt # 子系统XML解析
│ │ │ └── BslParser.kt # Module.bsl + 文档块解析
│ │ ├── persistent/
│ │ │ ├── BspContextLoader.kt # 文件遍历 + 索引构建
│ │ │ └── BspContextStorage.kt # 内存存储
│ │ └── search/
│ │ ├── BspSearchEngine.kt # 评分搜索
│ │ └── SearchHit.kt # 结果模型
│ └── presentation/
│ └── mcp/
│ ├── BspContextMcpController.kt # 6个@Tool方法
│ └── McpConfiguration.kt # Spring AI ToolCallbackProvider
└── resources/
├── application.yml
├── application-sse.yml
├── application-stdio.yml
└── logback-mcp.xml
```
## 法律声明
存储库不包含BSP或1C配置的源代码。用户自行提供BSP的本地导出,并负责遵守其许可条款。MIT许可证仅适用于此MCP服务器的代码。
## 许可证
[MIT](LICENSE)