ipm14-mcp 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ipm14_mcp-1.0.0/PKG-INFO +263 -0
- ipm14_mcp-1.0.0/README.md +246 -0
- ipm14_mcp-1.0.0/pyproject.toml +39 -0
- ipm14_mcp-1.0.0/setup.cfg +4 -0
- ipm14_mcp-1.0.0/src/gap_variables.py +96 -0
- ipm14_mcp-1.0.0/src/ipm14_mcp.egg-info/PKG-INFO +263 -0
- ipm14_mcp-1.0.0/src/ipm14_mcp.egg-info/SOURCES.txt +15 -0
- ipm14_mcp-1.0.0/src/ipm14_mcp.egg-info/dependency_links.txt +1 -0
- ipm14_mcp-1.0.0/src/ipm14_mcp.egg-info/entry_points.txt +2 -0
- ipm14_mcp-1.0.0/src/ipm14_mcp.egg-info/requires.txt +7 -0
- ipm14_mcp-1.0.0/src/ipm14_mcp.egg-info/top_level.txt +7 -0
- ipm14_mcp-1.0.0/src/ipm_mcp_server.py +425 -0
- ipm14_mcp-1.0.0/src/mbal_variables.py +87 -0
- ipm14_mcp-1.0.0/src/plot_utils.py +248 -0
- ipm14_mcp-1.0.0/src/prosper_exporter.py +117 -0
- ipm14_mcp-1.0.0/src/prosper_openserver.py +516 -0
- ipm14_mcp-1.0.0/src/prosper_variables.py +994 -0
ipm14_mcp-1.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ipm14-mcp
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: MCP server for Petroleum Experts IPM 14.0 (PROSPER / MBAL / GAP) driven through OpenServer COM
|
|
5
|
+
License-Expression: LicenseRef-Proprietary
|
|
6
|
+
Keywords: mcp,ipm,prosper,mbal,gap,openserver,petroleum,well-analysis
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
9
|
+
Classifier: Topic :: Scientific/Engineering
|
|
10
|
+
Requires-Python: >=3.10
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
Requires-Dist: pywin32>=306; sys_platform == "win32"
|
|
13
|
+
Requires-Dist: mcp>=1.2.0
|
|
14
|
+
Requires-Dist: openpyxl>=3.1.0
|
|
15
|
+
Requires-Dist: matplotlib>=3.7.0
|
|
16
|
+
Requires-Dist: pandas>=2.0.0
|
|
17
|
+
|
|
18
|
+
# IPM 14.0 连接器(ipm14-mcp)
|
|
19
|
+
|
|
20
|
+
把 **Petroleum Experts IPM 套件**(PROSPER 单井 / MBAL 油藏 / GAP 油田)通过 **OpenServer(Windows COM)**
|
|
21
|
+
封装成标准 MCP Server,让 WorkBuddy 等 AI 客户端用自然语言完成
|
|
22
|
+
「打开模型 → 改参数 → 重算 → 读结果 → 敏感性扫描 → 导出绘图」全流程。
|
|
23
|
+
|
|
24
|
+
> 连接器在客户端中的显示名为 **IPM 14.0**,MCP 服务标识为 `IPM14.0`(工具前缀 `mcp__IPM14.0__*`)。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## 1. 前置条件(重要)
|
|
29
|
+
|
|
30
|
+
本连接器是**本地型**(stdio + COM),不是云端服务,因此:
|
|
31
|
+
|
|
32
|
+
| 项 | 要求 |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| 操作系统 | Windows x64 |
|
|
35
|
+
| 石油工程软件 | 本机已安装 IPM **14.0 或 11.0**,且 `prosper.exe / mbal.exe / gap.exe` 可正常启动 |
|
|
36
|
+
| OpenServer | IPM 安装时勾选 OpenServer 组件,并具备可用授权(license) |
|
|
37
|
+
| Python | 3.10+(`uvx` 方式由 uv 自动准备,无需预装) |
|
|
38
|
+
| 客户端 | WorkBuddy ≥ 4.22.12 |
|
|
39
|
+
|
|
40
|
+
**IPM 软件与授权需用户自行购买安装,本包不包含、不代理任何商业授权。**
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 2. 安装方式
|
|
45
|
+
|
|
46
|
+
### 方式 A:作为 WorkBuddy 连接器安装(推荐)
|
|
47
|
+
|
|
48
|
+
连接器包结构(符合 WorkBuddy 开放平台提交规范 `open.workbuddy.cn/docs/connector`):
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
ipm14-connector/
|
|
52
|
+
├── connector-meta.json # ★ 连接器元信息(平台注册 / 市场展示)
|
|
53
|
+
├── mcp.json # ★ MCP 服务定义(stdio / uvx,仅一个 Server)
|
|
54
|
+
├── icon.svg # ★ 市场图标
|
|
55
|
+
├── skills/ipm-openserver/SKILL.md # AI 使用说明(教模型何时、如何调用这些工具)
|
|
56
|
+
├── src/ # 连接器本体,7 个 Python 模块
|
|
57
|
+
│ ├── ipm_mcp_server.py # MCP 入口,17 个工具
|
|
58
|
+
│ ├── prosper_openserver.py # OpenServer COM 封装(连接 / 读写 / 命令)
|
|
59
|
+
│ ├── prosper_variables.py # PROSPER 变量表 + 双版本映射
|
|
60
|
+
│ ├── mbal_variables.py # MBAL 变量表
|
|
61
|
+
│ ├── gap_variables.py # GAP 变量表
|
|
62
|
+
│ ├── plot_utils.py # 绘图
|
|
63
|
+
│ └── prosper_exporter.py # 导出 xlsx / csv / txt
|
|
64
|
+
├── pyproject.toml # 发行配置(发布 PyPI,供 uvx 拉取)
|
|
65
|
+
└── README.md
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**为什么代码必须随包**:本连接器没有远程服务,逻辑全部在本机 Python 进程内通过 COM 调用 IPM,
|
|
69
|
+
因此 `src/` 的 7 个模块就是产品本体,不可精简为配置——其中 `prosper_variables.py`(59 KB)
|
|
70
|
+
是 PROSPER / MBAL / GAP 三套变量字典与 v11/v14 映射表,是这套连接器最核心的资产。
|
|
71
|
+
|
|
72
|
+
客户端安装态清单(`.codebuddy-plugin/plugin.json`)与 512×512 客户端图标由平台发布时自动生成,
|
|
73
|
+
包内不再冗余提供。
|
|
74
|
+
|
|
75
|
+
`mcp.json` 通过 `uvx ipm14-mcp` 拉起服务,因此需先把源码发布到 Python 包索引(见第 6 节),
|
|
76
|
+
或在客户端里改为本机直跑(方式 C)。
|
|
77
|
+
|
|
78
|
+
### 方式 B:pip 安装
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install . # 在包根目录执行
|
|
82
|
+
ipm14-mcp # 验证:能启动并打印日志即为正常
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
安装后手动在 MCP 配置中登记:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"mcpServers": {
|
|
90
|
+
"IPM14.0": {
|
|
91
|
+
"type": "stdio",
|
|
92
|
+
"command": "ipm14-mcp",
|
|
93
|
+
"env": { "PYTHONUTF8": "1" }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 方式 C:源码直跑(本地内测,最快)
|
|
100
|
+
|
|
101
|
+
无需安装,直接指向源码脚本(`src` 目录会自动进入 `sys.path`):
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"mcpServers": {
|
|
106
|
+
"IPM14.0": {
|
|
107
|
+
"type": "stdio",
|
|
108
|
+
"command": "python",
|
|
109
|
+
"args": ["<包根绝对路径>/src/ipm_mcp_server.py"],
|
|
110
|
+
"env": { "PYTHONUTF8": "1" }
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
依赖:`pip install pywin32 mcp openpyxl matplotlib pandas`(与 `pyproject.toml` 的 dependencies 一致)。
|
|
117
|
+
|
|
118
|
+
> ⚠️ 若同一台机器已存在名为 `IPM14.0` 的 MCP 配置,**先移除旧条目**再启用连接器,
|
|
119
|
+
> 否则两个实例会抢占同一 OpenServer 会话与 license。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 3. 工具清单(17 个)
|
|
124
|
+
|
|
125
|
+
**会话 / 文件**
|
|
126
|
+
|
|
127
|
+
| 工具 | 作用 |
|
|
128
|
+
| --- | --- |
|
|
129
|
+
| `ping` | 健康检查,确认能连上本机 OpenServer |
|
|
130
|
+
| `start_app` | 启动 PROSPER / MBAL / GAP 并等待就绪 |
|
|
131
|
+
| `open_model` | 打开 `.Out` 模型(程序未启动时自动拉起) |
|
|
132
|
+
| `save_model` | 保存 / 另存当前模型 |
|
|
133
|
+
|
|
134
|
+
**通用读写**
|
|
135
|
+
|
|
136
|
+
| 工具 | 作用 |
|
|
137
|
+
| --- | --- |
|
|
138
|
+
| `get_variable` | 读取 OpenServer 变量(`raw=true` 取油田单位原始值) |
|
|
139
|
+
| `set_variable` | 写入变量(数值自动转 float;拒绝空值) |
|
|
140
|
+
| `run_command` | 执行 OpenServer 命令(`slow=true` 等待耗时计算完成) |
|
|
141
|
+
| `set_unit_system` | 切换单位制(oilfield / norsi / cansi / gersi / fresi / latsi) |
|
|
142
|
+
| `array_count` | 取可变长数组元素个数(`.COUNT`) |
|
|
143
|
+
| `list_variables` | 按关键词检索内置变量/命令表(PROSPER + MBAL + GAP) |
|
|
144
|
+
|
|
145
|
+
**版本兼容**
|
|
146
|
+
|
|
147
|
+
| 工具 | 作用 |
|
|
148
|
+
| --- | --- |
|
|
149
|
+
| `detect_ipm_version` | 探测本机 IPM 版本(`v11` / `v14`,读 `prosper.exe` 文件版本) |
|
|
150
|
+
| `resolve_variable` | 逻辑名 → 版本化变量路径(如「产液量」→ v14 `SOL[0].QLIQ` / v11 `Results[0].Sol.LiqRate`) |
|
|
151
|
+
|
|
152
|
+
**业务计算 / 输出**
|
|
153
|
+
|
|
154
|
+
| 工具 | 作用 |
|
|
155
|
+
| --- | --- |
|
|
156
|
+
| `run_system_analysis` | 设压力 + 含水率 → 跑系统分析 → 返回产液量 |
|
|
157
|
+
| `run_calc` | 对任意 IPM 程序执行一次计算(可带清除命令) |
|
|
158
|
+
| `sensitivity_sweep` | 变量敏感性扫描:设值 → 计算 → 读结果,可选导出 |
|
|
159
|
+
| `export_result` | 导出 xlsx / csv / txt(默认写入 `outputs/`) |
|
|
160
|
+
| `plot_result` | 把扫描结果绘成折线图并保存 PNG |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 4. 双版本兼容(IPM 11.0 / 14.0)
|
|
165
|
+
|
|
166
|
+
两个版本的 OpenServer 变量命名风格完全不同:
|
|
167
|
+
|
|
168
|
+
- **14.0**:缩写风格 —— `SOL[0].QLIQ`
|
|
169
|
+
- **11.0**:全称风格 —— `Results[0].Sol.LiqRate`
|
|
170
|
+
|
|
171
|
+
**使用铁律**:首次驱动变量前先 `detect_ipm_version`,再用 `resolve_variable` 按逻辑名取路径,
|
|
172
|
+
不要裸写某一版本的变量字符串。探测到未收录版本(如 v15)会明确返回警告,此时应停止套用映射表。
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 5. 安全与隐私
|
|
177
|
+
|
|
178
|
+
- **数据不出本机**:连接器只通过本机 COM 与 IPM 进程通信,不含任何网络上传、遥测或统计上报。
|
|
179
|
+
- **模型文件位置**:只读写用户显式传入的路径;导出与绘图默认落在包目录 `outputs/`。
|
|
180
|
+
- **日志**:运行日志写 `logs/ipm_mcp.log`(本地文件),仅记录调用名与错误,不记录模型内容。
|
|
181
|
+
- **无凭据处理**:不需要账号、密钥或 Token。
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 6. 打包与发布
|
|
186
|
+
|
|
187
|
+
### 6.1 先发布 Python 包(`uvx` 分发的前提)
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
# 1) 构建 wheel + sdist
|
|
191
|
+
python -m pip install --upgrade build
|
|
192
|
+
python -m build
|
|
193
|
+
|
|
194
|
+
# 2) 发布到 PyPI(先配置 ~/.pypirc 或用环境变量 TWINE_PASSWORD)
|
|
195
|
+
python -m twine upload dist/*
|
|
196
|
+
|
|
197
|
+
# 3) 校验:新机器上直接跑通即为可分发给客户
|
|
198
|
+
uvx ipm14-mcp
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
发布后 `mcp.json` 中的 `uvx ipm14-mcp` 即可正常工作。
|
|
202
|
+
|
|
203
|
+
> **镜像坑(2026-10-30 实测)**:`mcp.json` 默认**不指定** PyPI 镜像,走官方源。
|
|
204
|
+
> 原因:清华源(`pypi.tuna.tsinghua.edu.cn`)实测拉不到 `pywin32`(`No matching distribution found`),
|
|
205
|
+
> 一旦把 `UV_DEFAULT_INDEX` 指向该镜像,安装会直接失败。
|
|
206
|
+
> 如需加速,先确认目标镜像上 `pywin32`、`mcp`、`matplotlib` 均可获取,再写入 `env`。
|
|
207
|
+
>
|
|
208
|
+
> **首次启动耗时**:干净环境下完整安装依赖实测约 **3 分 35 秒**(官方源,含 matplotlib / pandas),
|
|
209
|
+
> 之后走 uv 缓存为秒级。这是 `uvx` 首次冷启动的正常表现,不是卡死。
|
|
210
|
+
|
|
211
|
+
### 6.2 提交 WorkBuddy 开放平台(open.workbuddy.cn)
|
|
212
|
+
|
|
213
|
+
1. 注册并完成开发者认证(企业认证可开放全部能力;个人认证不支持 Buddy 应用与硬件)。
|
|
214
|
+
2. 进入后台 → **连接器** → 新建 → 上传本目录打包的 zip。
|
|
215
|
+
3. 平台会解析 `connector-meta.json` 与 `mcp.json`;只需再选**分类**、**服务类目**、**头像**。
|
|
216
|
+
4. 提交审核,常规 7 个工作日;通过后进入连接器市场,更新版本需重新提交。
|
|
217
|
+
|
|
218
|
+
审核重点(本包已逐条对齐):
|
|
219
|
+
|
|
220
|
+
| 检查项 | 本包状态 |
|
|
221
|
+
| --- | --- |
|
|
222
|
+
| 目录结构符合 MCP + Skill 规范 | ✅ `connector-meta.json` + `mcp.json` + `icon.svg` + `skills/` |
|
|
223
|
+
| `source` 为 kebab-case 且全局唯一 | ✅ `ipm14-mcp` |
|
|
224
|
+
| 中英文名称/描述/示例齐全(示例各 2~5 条) | ✅ 各 5 条 |
|
|
225
|
+
| 仅配置一个 MCP Server | ✅ 只有 `IPM14.0` |
|
|
226
|
+
| 声明 `minWorkbuddyVersion` | ✅ `4.24.0`(`examples_*` 字段自 4.24.0 起生效) |
|
|
227
|
+
| 图标清晰、透明底 | ✅ `icon.svg` + `icon.png` 64×64 |
|
|
228
|
+
| 文件中无真实凭证 | ✅ 无需 Token / 无密钥 |
|
|
229
|
+
| Skill 覆盖全部核心能力 | ✅ 17 个工具 + 铁律 + 故障速查 |
|
|
230
|
+
|
|
231
|
+
> **审核可能追问的一点**:本连接器是**本地 stdio + COM**,工具价值依赖用户本机已装 IPM 与 OpenServer 授权,
|
|
232
|
+
> 无法在云端环境演示。建议在提交说明里写明「面向已购买 IPM 的石油工程师,本地运行、数据不出本机」,
|
|
233
|
+
> 并说明 `uvx` 首次拉取依赖约 100 MB、启动较慢属正常。
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 7. 常见问题
|
|
238
|
+
|
|
239
|
+
**Q:首次连接很慢(十几秒到一分钟)?**
|
|
240
|
+
`uvx` 首次会解析并下载 matplotlib / pandas 等依赖(约 100 MB+)。之后走缓存,启动在秒级。
|
|
241
|
+
对时效敏感可改用方式 B(预装到本机 Python),或配置 `UV_DEFAULT_INDEX` 指向内网镜像。
|
|
242
|
+
|
|
243
|
+
**Q:工具调用报「尚未调用 CoInitialize」?**
|
|
244
|
+
已修复:服务对每个工作线程做一次线程级 COM 初始化(`threading.local` + `CoInitialize`)。
|
|
245
|
+
若仍出现,确认 `pywin32` 已正确安装,且未在非 Windows 环境运行。
|
|
246
|
+
|
|
247
|
+
**Q:报 RPC_E_WRONG_THREAD / 「已为另一线程整理的接口」?**
|
|
248
|
+
OpenServer 的 COM 对象是套间(STA)绑定的。服务已按线程维护独立会话,避免跨线程传对象;
|
|
249
|
+
自定义扩展代码时不要跨线程复用 `ProsperServer` 实例。
|
|
250
|
+
|
|
251
|
+
**Q:IPM 窗口越开越多 / license 被占满?**
|
|
252
|
+
任务收尾必须同时调用 `shutdown("PROSPER")` 与 `disconnect()`:
|
|
253
|
+
`disconnect()` 只释放 OpenServer 连接,**不会**关掉 IPM GUI 实例窗口。详见配套技能文档。
|
|
254
|
+
|
|
255
|
+
**Q:`get_variable` 返回空值?**
|
|
256
|
+
多为变量名不存在或该字段确实为空。先用 `list_variables` 检索,或 `resolve_variable` 取正确路径。
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 8. 许可
|
|
261
|
+
|
|
262
|
+
Proprietary / 内部使用。IPM、PROSPER、MBAL、GAP、OpenServer 为 Petroleum Experts 的商标,
|
|
263
|
+
本包仅做协议封装,与该公司无隶属关系。
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# IPM 14.0 连接器(ipm14-mcp)
|
|
2
|
+
|
|
3
|
+
把 **Petroleum Experts IPM 套件**(PROSPER 单井 / MBAL 油藏 / GAP 油田)通过 **OpenServer(Windows COM)**
|
|
4
|
+
封装成标准 MCP Server,让 WorkBuddy 等 AI 客户端用自然语言完成
|
|
5
|
+
「打开模型 → 改参数 → 重算 → 读结果 → 敏感性扫描 → 导出绘图」全流程。
|
|
6
|
+
|
|
7
|
+
> 连接器在客户端中的显示名为 **IPM 14.0**,MCP 服务标识为 `IPM14.0`(工具前缀 `mcp__IPM14.0__*`)。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 前置条件(重要)
|
|
12
|
+
|
|
13
|
+
本连接器是**本地型**(stdio + COM),不是云端服务,因此:
|
|
14
|
+
|
|
15
|
+
| 项 | 要求 |
|
|
16
|
+
| --- | --- |
|
|
17
|
+
| 操作系统 | Windows x64 |
|
|
18
|
+
| 石油工程软件 | 本机已安装 IPM **14.0 或 11.0**,且 `prosper.exe / mbal.exe / gap.exe` 可正常启动 |
|
|
19
|
+
| OpenServer | IPM 安装时勾选 OpenServer 组件,并具备可用授权(license) |
|
|
20
|
+
| Python | 3.10+(`uvx` 方式由 uv 自动准备,无需预装) |
|
|
21
|
+
| 客户端 | WorkBuddy ≥ 4.22.12 |
|
|
22
|
+
|
|
23
|
+
**IPM 软件与授权需用户自行购买安装,本包不包含、不代理任何商业授权。**
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. 安装方式
|
|
28
|
+
|
|
29
|
+
### 方式 A:作为 WorkBuddy 连接器安装(推荐)
|
|
30
|
+
|
|
31
|
+
连接器包结构(符合 WorkBuddy 开放平台提交规范 `open.workbuddy.cn/docs/connector`):
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
ipm14-connector/
|
|
35
|
+
├── connector-meta.json # ★ 连接器元信息(平台注册 / 市场展示)
|
|
36
|
+
├── mcp.json # ★ MCP 服务定义(stdio / uvx,仅一个 Server)
|
|
37
|
+
├── icon.svg # ★ 市场图标
|
|
38
|
+
├── skills/ipm-openserver/SKILL.md # AI 使用说明(教模型何时、如何调用这些工具)
|
|
39
|
+
├── src/ # 连接器本体,7 个 Python 模块
|
|
40
|
+
│ ├── ipm_mcp_server.py # MCP 入口,17 个工具
|
|
41
|
+
│ ├── prosper_openserver.py # OpenServer COM 封装(连接 / 读写 / 命令)
|
|
42
|
+
│ ├── prosper_variables.py # PROSPER 变量表 + 双版本映射
|
|
43
|
+
│ ├── mbal_variables.py # MBAL 变量表
|
|
44
|
+
│ ├── gap_variables.py # GAP 变量表
|
|
45
|
+
│ ├── plot_utils.py # 绘图
|
|
46
|
+
│ └── prosper_exporter.py # 导出 xlsx / csv / txt
|
|
47
|
+
├── pyproject.toml # 发行配置(发布 PyPI,供 uvx 拉取)
|
|
48
|
+
└── README.md
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**为什么代码必须随包**:本连接器没有远程服务,逻辑全部在本机 Python 进程内通过 COM 调用 IPM,
|
|
52
|
+
因此 `src/` 的 7 个模块就是产品本体,不可精简为配置——其中 `prosper_variables.py`(59 KB)
|
|
53
|
+
是 PROSPER / MBAL / GAP 三套变量字典与 v11/v14 映射表,是这套连接器最核心的资产。
|
|
54
|
+
|
|
55
|
+
客户端安装态清单(`.codebuddy-plugin/plugin.json`)与 512×512 客户端图标由平台发布时自动生成,
|
|
56
|
+
包内不再冗余提供。
|
|
57
|
+
|
|
58
|
+
`mcp.json` 通过 `uvx ipm14-mcp` 拉起服务,因此需先把源码发布到 Python 包索引(见第 6 节),
|
|
59
|
+
或在客户端里改为本机直跑(方式 C)。
|
|
60
|
+
|
|
61
|
+
### 方式 B:pip 安装
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install . # 在包根目录执行
|
|
65
|
+
ipm14-mcp # 验证:能启动并打印日志即为正常
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
安装后手动在 MCP 配置中登记:
|
|
69
|
+
|
|
70
|
+
```json
|
|
71
|
+
{
|
|
72
|
+
"mcpServers": {
|
|
73
|
+
"IPM14.0": {
|
|
74
|
+
"type": "stdio",
|
|
75
|
+
"command": "ipm14-mcp",
|
|
76
|
+
"env": { "PYTHONUTF8": "1" }
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 方式 C:源码直跑(本地内测,最快)
|
|
83
|
+
|
|
84
|
+
无需安装,直接指向源码脚本(`src` 目录会自动进入 `sys.path`):
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"mcpServers": {
|
|
89
|
+
"IPM14.0": {
|
|
90
|
+
"type": "stdio",
|
|
91
|
+
"command": "python",
|
|
92
|
+
"args": ["<包根绝对路径>/src/ipm_mcp_server.py"],
|
|
93
|
+
"env": { "PYTHONUTF8": "1" }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
依赖:`pip install pywin32 mcp openpyxl matplotlib pandas`(与 `pyproject.toml` 的 dependencies 一致)。
|
|
100
|
+
|
|
101
|
+
> ⚠️ 若同一台机器已存在名为 `IPM14.0` 的 MCP 配置,**先移除旧条目**再启用连接器,
|
|
102
|
+
> 否则两个实例会抢占同一 OpenServer 会话与 license。
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 3. 工具清单(17 个)
|
|
107
|
+
|
|
108
|
+
**会话 / 文件**
|
|
109
|
+
|
|
110
|
+
| 工具 | 作用 |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| `ping` | 健康检查,确认能连上本机 OpenServer |
|
|
113
|
+
| `start_app` | 启动 PROSPER / MBAL / GAP 并等待就绪 |
|
|
114
|
+
| `open_model` | 打开 `.Out` 模型(程序未启动时自动拉起) |
|
|
115
|
+
| `save_model` | 保存 / 另存当前模型 |
|
|
116
|
+
|
|
117
|
+
**通用读写**
|
|
118
|
+
|
|
119
|
+
| 工具 | 作用 |
|
|
120
|
+
| --- | --- |
|
|
121
|
+
| `get_variable` | 读取 OpenServer 变量(`raw=true` 取油田单位原始值) |
|
|
122
|
+
| `set_variable` | 写入变量(数值自动转 float;拒绝空值) |
|
|
123
|
+
| `run_command` | 执行 OpenServer 命令(`slow=true` 等待耗时计算完成) |
|
|
124
|
+
| `set_unit_system` | 切换单位制(oilfield / norsi / cansi / gersi / fresi / latsi) |
|
|
125
|
+
| `array_count` | 取可变长数组元素个数(`.COUNT`) |
|
|
126
|
+
| `list_variables` | 按关键词检索内置变量/命令表(PROSPER + MBAL + GAP) |
|
|
127
|
+
|
|
128
|
+
**版本兼容**
|
|
129
|
+
|
|
130
|
+
| 工具 | 作用 |
|
|
131
|
+
| --- | --- |
|
|
132
|
+
| `detect_ipm_version` | 探测本机 IPM 版本(`v11` / `v14`,读 `prosper.exe` 文件版本) |
|
|
133
|
+
| `resolve_variable` | 逻辑名 → 版本化变量路径(如「产液量」→ v14 `SOL[0].QLIQ` / v11 `Results[0].Sol.LiqRate`) |
|
|
134
|
+
|
|
135
|
+
**业务计算 / 输出**
|
|
136
|
+
|
|
137
|
+
| 工具 | 作用 |
|
|
138
|
+
| --- | --- |
|
|
139
|
+
| `run_system_analysis` | 设压力 + 含水率 → 跑系统分析 → 返回产液量 |
|
|
140
|
+
| `run_calc` | 对任意 IPM 程序执行一次计算(可带清除命令) |
|
|
141
|
+
| `sensitivity_sweep` | 变量敏感性扫描:设值 → 计算 → 读结果,可选导出 |
|
|
142
|
+
| `export_result` | 导出 xlsx / csv / txt(默认写入 `outputs/`) |
|
|
143
|
+
| `plot_result` | 把扫描结果绘成折线图并保存 PNG |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 4. 双版本兼容(IPM 11.0 / 14.0)
|
|
148
|
+
|
|
149
|
+
两个版本的 OpenServer 变量命名风格完全不同:
|
|
150
|
+
|
|
151
|
+
- **14.0**:缩写风格 —— `SOL[0].QLIQ`
|
|
152
|
+
- **11.0**:全称风格 —— `Results[0].Sol.LiqRate`
|
|
153
|
+
|
|
154
|
+
**使用铁律**:首次驱动变量前先 `detect_ipm_version`,再用 `resolve_variable` 按逻辑名取路径,
|
|
155
|
+
不要裸写某一版本的变量字符串。探测到未收录版本(如 v15)会明确返回警告,此时应停止套用映射表。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 5. 安全与隐私
|
|
160
|
+
|
|
161
|
+
- **数据不出本机**:连接器只通过本机 COM 与 IPM 进程通信,不含任何网络上传、遥测或统计上报。
|
|
162
|
+
- **模型文件位置**:只读写用户显式传入的路径;导出与绘图默认落在包目录 `outputs/`。
|
|
163
|
+
- **日志**:运行日志写 `logs/ipm_mcp.log`(本地文件),仅记录调用名与错误,不记录模型内容。
|
|
164
|
+
- **无凭据处理**:不需要账号、密钥或 Token。
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## 6. 打包与发布
|
|
169
|
+
|
|
170
|
+
### 6.1 先发布 Python 包(`uvx` 分发的前提)
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# 1) 构建 wheel + sdist
|
|
174
|
+
python -m pip install --upgrade build
|
|
175
|
+
python -m build
|
|
176
|
+
|
|
177
|
+
# 2) 发布到 PyPI(先配置 ~/.pypirc 或用环境变量 TWINE_PASSWORD)
|
|
178
|
+
python -m twine upload dist/*
|
|
179
|
+
|
|
180
|
+
# 3) 校验:新机器上直接跑通即为可分发给客户
|
|
181
|
+
uvx ipm14-mcp
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
发布后 `mcp.json` 中的 `uvx ipm14-mcp` 即可正常工作。
|
|
185
|
+
|
|
186
|
+
> **镜像坑(2026-10-30 实测)**:`mcp.json` 默认**不指定** PyPI 镜像,走官方源。
|
|
187
|
+
> 原因:清华源(`pypi.tuna.tsinghua.edu.cn`)实测拉不到 `pywin32`(`No matching distribution found`),
|
|
188
|
+
> 一旦把 `UV_DEFAULT_INDEX` 指向该镜像,安装会直接失败。
|
|
189
|
+
> 如需加速,先确认目标镜像上 `pywin32`、`mcp`、`matplotlib` 均可获取,再写入 `env`。
|
|
190
|
+
>
|
|
191
|
+
> **首次启动耗时**:干净环境下完整安装依赖实测约 **3 分 35 秒**(官方源,含 matplotlib / pandas),
|
|
192
|
+
> 之后走 uv 缓存为秒级。这是 `uvx` 首次冷启动的正常表现,不是卡死。
|
|
193
|
+
|
|
194
|
+
### 6.2 提交 WorkBuddy 开放平台(open.workbuddy.cn)
|
|
195
|
+
|
|
196
|
+
1. 注册并完成开发者认证(企业认证可开放全部能力;个人认证不支持 Buddy 应用与硬件)。
|
|
197
|
+
2. 进入后台 → **连接器** → 新建 → 上传本目录打包的 zip。
|
|
198
|
+
3. 平台会解析 `connector-meta.json` 与 `mcp.json`;只需再选**分类**、**服务类目**、**头像**。
|
|
199
|
+
4. 提交审核,常规 7 个工作日;通过后进入连接器市场,更新版本需重新提交。
|
|
200
|
+
|
|
201
|
+
审核重点(本包已逐条对齐):
|
|
202
|
+
|
|
203
|
+
| 检查项 | 本包状态 |
|
|
204
|
+
| --- | --- |
|
|
205
|
+
| 目录结构符合 MCP + Skill 规范 | ✅ `connector-meta.json` + `mcp.json` + `icon.svg` + `skills/` |
|
|
206
|
+
| `source` 为 kebab-case 且全局唯一 | ✅ `ipm14-mcp` |
|
|
207
|
+
| 中英文名称/描述/示例齐全(示例各 2~5 条) | ✅ 各 5 条 |
|
|
208
|
+
| 仅配置一个 MCP Server | ✅ 只有 `IPM14.0` |
|
|
209
|
+
| 声明 `minWorkbuddyVersion` | ✅ `4.24.0`(`examples_*` 字段自 4.24.0 起生效) |
|
|
210
|
+
| 图标清晰、透明底 | ✅ `icon.svg` + `icon.png` 64×64 |
|
|
211
|
+
| 文件中无真实凭证 | ✅ 无需 Token / 无密钥 |
|
|
212
|
+
| Skill 覆盖全部核心能力 | ✅ 17 个工具 + 铁律 + 故障速查 |
|
|
213
|
+
|
|
214
|
+
> **审核可能追问的一点**:本连接器是**本地 stdio + COM**,工具价值依赖用户本机已装 IPM 与 OpenServer 授权,
|
|
215
|
+
> 无法在云端环境演示。建议在提交说明里写明「面向已购买 IPM 的石油工程师,本地运行、数据不出本机」,
|
|
216
|
+
> 并说明 `uvx` 首次拉取依赖约 100 MB、启动较慢属正常。
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## 7. 常见问题
|
|
221
|
+
|
|
222
|
+
**Q:首次连接很慢(十几秒到一分钟)?**
|
|
223
|
+
`uvx` 首次会解析并下载 matplotlib / pandas 等依赖(约 100 MB+)。之后走缓存,启动在秒级。
|
|
224
|
+
对时效敏感可改用方式 B(预装到本机 Python),或配置 `UV_DEFAULT_INDEX` 指向内网镜像。
|
|
225
|
+
|
|
226
|
+
**Q:工具调用报「尚未调用 CoInitialize」?**
|
|
227
|
+
已修复:服务对每个工作线程做一次线程级 COM 初始化(`threading.local` + `CoInitialize`)。
|
|
228
|
+
若仍出现,确认 `pywin32` 已正确安装,且未在非 Windows 环境运行。
|
|
229
|
+
|
|
230
|
+
**Q:报 RPC_E_WRONG_THREAD / 「已为另一线程整理的接口」?**
|
|
231
|
+
OpenServer 的 COM 对象是套间(STA)绑定的。服务已按线程维护独立会话,避免跨线程传对象;
|
|
232
|
+
自定义扩展代码时不要跨线程复用 `ProsperServer` 实例。
|
|
233
|
+
|
|
234
|
+
**Q:IPM 窗口越开越多 / license 被占满?**
|
|
235
|
+
任务收尾必须同时调用 `shutdown("PROSPER")` 与 `disconnect()`:
|
|
236
|
+
`disconnect()` 只释放 OpenServer 连接,**不会**关掉 IPM GUI 实例窗口。详见配套技能文档。
|
|
237
|
+
|
|
238
|
+
**Q:`get_variable` 返回空值?**
|
|
239
|
+
多为变量名不存在或该字段确实为空。先用 `list_variables` 检索,或 `resolve_variable` 取正确路径。
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 8. 许可
|
|
244
|
+
|
|
245
|
+
Proprietary / 内部使用。IPM、PROSPER、MBAL、GAP、OpenServer 为 Petroleum Experts 的商标,
|
|
246
|
+
本包仅做协议封装,与该公司无隶属关系。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ipm14-mcp"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "MCP server for Petroleum Experts IPM 14.0 (PROSPER / MBAL / GAP) driven through OpenServer COM"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = "LicenseRef-Proprietary"
|
|
12
|
+
keywords = ["mcp", "ipm", "prosper", "mbal", "gap", "openserver", "petroleum", "well-analysis"]
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
"Operating System :: Microsoft :: Windows",
|
|
16
|
+
"Topic :: Scientific/Engineering",
|
|
17
|
+
]
|
|
18
|
+
dependencies = [
|
|
19
|
+
"pywin32>=306; sys_platform == 'win32'",
|
|
20
|
+
"mcp>=1.2.0",
|
|
21
|
+
"openpyxl>=3.1.0",
|
|
22
|
+
"matplotlib>=3.7.0",
|
|
23
|
+
"pandas>=2.0.0",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.scripts]
|
|
27
|
+
ipm14-mcp = "ipm_mcp_server:main"
|
|
28
|
+
|
|
29
|
+
[tool.setuptools]
|
|
30
|
+
package-dir = { "" = "src" }
|
|
31
|
+
py-modules = [
|
|
32
|
+
"ipm_mcp_server",
|
|
33
|
+
"prosper_openserver",
|
|
34
|
+
"prosper_variables",
|
|
35
|
+
"gap_variables",
|
|
36
|
+
"mbal_variables",
|
|
37
|
+
"plot_utils",
|
|
38
|
+
"prosper_exporter",
|
|
39
|
+
]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
"""gap_variables.py — GAP (IPM 管网/地面网络优化) OpenServer 变量/命令表。
|
|
3
|
+
|
|
4
|
+
数据来源:
|
|
5
|
+
- PE Limited《OpenServer User Guide》(OpenServer.pdf, IPM 14.0) 中出现的 GAP.* 变量名
|
|
6
|
+
(用 pymupdf 提取,共 58 个真实 token,其中 GAP.MOD 出现 227 次为最核心的模型导航命令)。
|
|
7
|
+
- 应用命令(START/OPENFILE/SAVEFILE/SHUTDOWN/NEWFILE/ISREADY)沿用与 PROSPER/MBAL
|
|
8
|
+
一致的通用 OpenServer 约定(本机待实测确认,机制与 PROSPER/MBAL 平行)。
|
|
9
|
+
|
|
10
|
+
分档:
|
|
11
|
+
- COMMAND_DB 中 6 个标准应用命令:与 PROSPER/MBAL 同构,按通用约定标注。
|
|
12
|
+
- COMMAND_DB 中 GAP 特有命令:来自官方手册 PDF;描述依据命名/上下文推断,非官方逐条定义,
|
|
13
|
+
使用前务必先用 run_command / get_variable 实测确认。
|
|
14
|
+
- REFERENCE_VARS:值类后缀(UNITNAME/RAWVAL/LASTCMDRET)与少量依据命名推断的项。
|
|
15
|
+
|
|
16
|
+
重要(与 MBAL 同理):OpenServer 变量名随 IPM 版本/模块略有差异,不确定时务必先
|
|
17
|
+
get_variable 实测;读取失败(GetLastError 报错)则说明变量名不符,应反馈用户确认。
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
# 已验证变量(本机暂无实测读取成功的 GAP 数值变量,待逐个实测补充)
|
|
21
|
+
VERIFIED_VARS = {}
|
|
22
|
+
|
|
23
|
+
# 命令表(DoCommand / run_command 可用)
|
|
24
|
+
COMMAND_DB = {
|
|
25
|
+
# ---- 6 个标准应用命令(与 PROSPER/MBAL 同构)----
|
|
26
|
+
"GAP.START": "启动 GAP(通用启动命令;本机待实测确认,机制与 PROSPER/MBAL 平行)",
|
|
27
|
+
"GAP.ISREADY": "GAP 就绪状态(0=未就绪 / 1=就绪 / 2=未启动或无许可)",
|
|
28
|
+
"GAP.SHUTDOWN": "关闭 GAP,释放实例与许可证",
|
|
29
|
+
"GAP.OPENFILE": "打开模型文件(用法 GAP.OPENFILE(\"路径\"))",
|
|
30
|
+
"GAP.SAVEFILE": "保存模型(GAP.SAVEFILE 或 GAP.SAVEFILE(\"路径\") 另存)",
|
|
31
|
+
"GAP.NEWFILE": "新建(重置数据)",
|
|
32
|
+
# ---- GAP 特有命令(来自 OpenServer.pdf)----
|
|
33
|
+
"GAP.MOD": "GAP 模型导航/选择项(出现 227 次,最核心命令;用法 GAP.MOD(\"路径/项\"),待实测)",
|
|
34
|
+
"GAP.NEWITEM": "新建模型项",
|
|
35
|
+
"GAP.COPYITEM": "复制模型项",
|
|
36
|
+
"GAP.DELITEM": "删除模型项",
|
|
37
|
+
"GAP.LINKITEMS": "建立模型项链接",
|
|
38
|
+
"GAP.LINKITEMPORTS": "建立端口链接",
|
|
39
|
+
"GAP.UNLINKITEMS": "断开模型项链接",
|
|
40
|
+
"GAP.APPLYSCHEDULETO": "应用计划到指定项",
|
|
41
|
+
"GAP.CLEARAPPLIEDSCHEDULE": "清除已应用计划",
|
|
42
|
+
"GAP.ExtractArchive": "提取归档文件",
|
|
43
|
+
"GAP.WELLCALC": "井计算(Well calculation)",
|
|
44
|
+
"GAP.PACALC": "分配计算(Allocation calculation)",
|
|
45
|
+
"GAP.ACTUALCALC": "实际计算(Actual calculation)",
|
|
46
|
+
"GAP.SOLVENETWORK": "求解管网网络(Solve network)",
|
|
47
|
+
"GAP.TRANSFERPROSPERIPR": "从 PROSPER 传入 IPR 曲线",
|
|
48
|
+
"GAP.PCCALC": "PCC 计算",
|
|
49
|
+
"GAP.PCCMANIPRES": "PCC 操作压力",
|
|
50
|
+
"GAP.PCCGASINJ": "PCC 注气",
|
|
51
|
+
"GAP.PCCANS": "PCC 求解答案",
|
|
52
|
+
"GAP.PCCDANSDG": "PCC DANS DG",
|
|
53
|
+
"GAP.REFITPC": "重新拟合 PC 曲线",
|
|
54
|
+
"GAP.RESETALLOCINPUTS": "重置分配输入",
|
|
55
|
+
"GAP.PURGEALLRESULTS": "清除全部计算结果",
|
|
56
|
+
"GAP.VLPIMPORT": "导入 VLP 数据",
|
|
57
|
+
"GAP.VLPIPRPCGEN": "生成 VLP/IPR/PC 数据",
|
|
58
|
+
"GAP.PREDINIT": "预测初始化",
|
|
59
|
+
"GAP.PREDDOSTEP": "预测执行一步",
|
|
60
|
+
"GAP.PREDEND": "预测结束",
|
|
61
|
+
"GAP.PREDRESTART": "预测重启",
|
|
62
|
+
"GAP.PREDCURDATE.DATESTR": "预测当前日期(字符串)",
|
|
63
|
+
"GAP.PREDCURSTEPDATE": "预测当前步日期",
|
|
64
|
+
"GAP.PREDPREVSTEPDATE": "预测上一步日期",
|
|
65
|
+
"GAP.PREDSTEPLENGTH": "预测步长",
|
|
66
|
+
"GAP.PREDSNAPSHOT.LOAD": "加载预测快照",
|
|
67
|
+
"GAP.PREDSNAPSHOT.TIME": "预测快照时间",
|
|
68
|
+
"GAP.PREDSNAPSHOT.TIME.COUNT": "预测快照时间计数",
|
|
69
|
+
"GAP.PREDSNAPSHOT.UNLOAD": "卸载预测快照",
|
|
70
|
+
"GAP.STARTASYNC": "异步启动 GAP",
|
|
71
|
+
"GAP.InputUnitSystem": "输入单位系统",
|
|
72
|
+
"GAP.OutputUnitSystem": "输出单位系统",
|
|
73
|
+
"GAP.Preferences.DefaultInputUnitSystem": "默认输入单位系统",
|
|
74
|
+
"GAP.Preferences.DefaultOutputUnitSystem": "默认输出单位系统",
|
|
75
|
+
"GAP.Preferences.AlwaysUseDefaultUnitSystems": "总是使用默认单位系统",
|
|
76
|
+
"GAP.OpenServerUseKeywords": "OpenServer 关键字使用开关",
|
|
77
|
+
"GAP.EnableNetworkValidation": "启用管网校验",
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# 参考变量(值类后缀与少量依据命名推断的项)
|
|
81
|
+
REFERENCE_VARS = {
|
|
82
|
+
"GAP.UNITNAME": "变量单位名后缀(如 GAP.xxx.UNITNAME)",
|
|
83
|
+
"GAP.RAWVAL": "原始值后缀(如 GAP.xxx.RAWVAL,忽略当前界面单位)",
|
|
84
|
+
"GAP.LASTCMDRET": "最近一次命令的返回值",
|
|
85
|
+
"GAP.PIPH2S": "管流 H2S 相关(依据命名推断)",
|
|
86
|
+
"GAP.PIPGOR": "管流 GOR 相关(依据命名推断)",
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# 函数表(GAP 的 DoGet 检索函数,待实测补充)
|
|
90
|
+
FUNCTIONS = {}
|
|
91
|
+
|
|
92
|
+
# 动作变量(只写不读,待实测补充)
|
|
93
|
+
ACTION_VARS = {}
|
|
94
|
+
|
|
95
|
+
# 合并变量表(供 search_variables 使用)
|
|
96
|
+
ALL_VARS = {**VERIFIED_VARS, **REFERENCE_VARS}
|