@josephyan/qingflow-mcp 0.1.0-beta.2
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.
- package/README.md +517 -0
- package/docs/local-agent-install.md +213 -0
- package/entry_point.py +13 -0
- package/npm/bin/qingflow-mcp.mjs +7 -0
- package/npm/lib/runtime.mjs +146 -0
- package/npm/scripts/postinstall.mjs +12 -0
- package/package.json +34 -0
- package/pyproject.toml +63 -0
- package/qingflow-mcp +15 -0
- package/src/qingflow_mcp/__init__.py +5 -0
- package/src/qingflow_mcp/__main__.py +5 -0
- package/src/qingflow_mcp/backend_client.py +336 -0
- package/src/qingflow_mcp/config.py +166 -0
- package/src/qingflow_mcp/errors.py +66 -0
- package/src/qingflow_mcp/json_types.py +18 -0
- package/src/qingflow_mcp/server.py +70 -0
- package/src/qingflow_mcp/session_store.py +235 -0
- package/src/qingflow_mcp/solution/__init__.py +6 -0
- package/src/qingflow_mcp/solution/build_assembly_store.py +137 -0
- package/src/qingflow_mcp/solution/compiler/__init__.py +265 -0
- package/src/qingflow_mcp/solution/compiler/chart_compiler.py +96 -0
- package/src/qingflow_mcp/solution/compiler/form_compiler.py +456 -0
- package/src/qingflow_mcp/solution/compiler/icon_utils.py +113 -0
- package/src/qingflow_mcp/solution/compiler/navigation_compiler.py +57 -0
- package/src/qingflow_mcp/solution/compiler/package_compiler.py +19 -0
- package/src/qingflow_mcp/solution/compiler/portal_compiler.py +60 -0
- package/src/qingflow_mcp/solution/compiler/view_compiler.py +51 -0
- package/src/qingflow_mcp/solution/compiler/workflow_compiler.py +134 -0
- package/src/qingflow_mcp/solution/design_session.py +222 -0
- package/src/qingflow_mcp/solution/design_store.py +100 -0
- package/src/qingflow_mcp/solution/executor.py +2064 -0
- package/src/qingflow_mcp/solution/normalizer.py +23 -0
- package/src/qingflow_mcp/solution/run_store.py +221 -0
- package/src/qingflow_mcp/solution/spec_models.py +755 -0
- package/src/qingflow_mcp/tools/__init__.py +1 -0
- package/src/qingflow_mcp/tools/app_tools.py +239 -0
- package/src/qingflow_mcp/tools/approval_tools.py +481 -0
- package/src/qingflow_mcp/tools/auth_tools.py +496 -0
- package/src/qingflow_mcp/tools/base.py +81 -0
- package/src/qingflow_mcp/tools/directory_tools.py +476 -0
- package/src/qingflow_mcp/tools/file_tools.py +375 -0
- package/src/qingflow_mcp/tools/navigation_tools.py +177 -0
- package/src/qingflow_mcp/tools/package_tools.py +142 -0
- package/src/qingflow_mcp/tools/portal_tools.py +100 -0
- package/src/qingflow_mcp/tools/qingbi_report_tools.py +258 -0
- package/src/qingflow_mcp/tools/record_tools.py +4305 -0
- package/src/qingflow_mcp/tools/role_tools.py +94 -0
- package/src/qingflow_mcp/tools/solution_tools.py +1860 -0
- package/src/qingflow_mcp/tools/task_tools.py +677 -0
- package/src/qingflow_mcp/tools/view_tools.py +324 -0
- package/src/qingflow_mcp/tools/workflow_tools.py +311 -0
- package/src/qingflow_mcp/tools/workspace_tools.py +143 -0
package/README.md
ADDED
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
# Qingflow MCP Server
|
|
2
|
+
|
|
3
|
+
基于用户态 `token` 与 `wsId` 的 Qingflow MCP 适配层,覆盖表单数据、文件、应用、流程、视图、报表、门户、导航,以及高层解决方案搭建能力。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 用户账号登录,复用现有 Qingflow 权限模型
|
|
8
|
+
- 支持直接注入用户 `token` 建立 MCP 会话
|
|
9
|
+
- 显式工作区选择,避免误用默认工作区
|
|
10
|
+
- 覆盖表单数据增查改删
|
|
11
|
+
- 覆盖内部成员 / 内部部门 / 外部联系人查询
|
|
12
|
+
- 覆盖应用 CRUD、表单结构读写、应用发布
|
|
13
|
+
- 覆盖应用包(Tag)CRUD
|
|
14
|
+
- 覆盖顶层 Navigation 导航配置
|
|
15
|
+
- 覆盖评论、通过、拒绝、回退、转交、改派、加签
|
|
16
|
+
- 覆盖门户 CRUD、门户发布
|
|
17
|
+
- 覆盖文件上传凭证获取与本地文件上传
|
|
18
|
+
- 覆盖流程设计与流程调试
|
|
19
|
+
- 覆盖视图设计与视图子类型配置
|
|
20
|
+
- 覆盖报表设计与图表排序/配置
|
|
21
|
+
- 覆盖 `solution_design_session` 任务级设计会话,支持分阶段 DSL 设计与 finalize
|
|
22
|
+
- 覆盖 staged 高层搭建工具与统一入口:`solution_build_all`、`solution_build_app_flow`、`solution_build_views`、`solution_build_analytics_portal`、`solution_build_navigation`
|
|
23
|
+
|
|
24
|
+
## 不支持
|
|
25
|
+
|
|
26
|
+
- 外部部门查询
|
|
27
|
+
- 应用包分组管理
|
|
28
|
+
- 应用包内导航项配置
|
|
29
|
+
- 签名图片、eSign
|
|
30
|
+
- 外部成员候选查询(转交/加签)
|
|
31
|
+
- 短信验证码、多因素登录挑战
|
|
32
|
+
- OpenAPI `accessToken` / `serviceToken`
|
|
33
|
+
|
|
34
|
+
## 安装
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
38
|
+
python3 -m venv .venv
|
|
39
|
+
./.venv/bin/pip install -e '.[dev]'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 本地智能体安装(npm)
|
|
43
|
+
|
|
44
|
+
如果你要给本地 agent / gateway 安装这套 MCP,而不是手动管理 Python 环境,可以直接用 npm:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
48
|
+
npm install -g .
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
或只在当前目录安装:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
55
|
+
npm install
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
如果你想把当前版本封装成可分发的 npm 安装包:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
62
|
+
npm run pack:npm
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
产物会输出到:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
dist/npm/qingflow-qingflow-mcp-<version>.tgz
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
另一台机器可直接安装这个 tgz:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm install /absolute/path/to/dist/npm/qingflow-qingflow-mcp-<version>.tgz
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
安装时会自动创建 `.npm-python/`,并在里面执行 `pip install .`。
|
|
78
|
+
|
|
79
|
+
如果你是全局安装,完成后本机可直接使用:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
qingflow-mcp
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
如果你只是对当前源码 checkout 执行了 `npm install`,请直接运行:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
89
|
+
node ./npm/bin/qingflow-mcp.mjs
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
适合这类本地 stdio MCP 客户端:
|
|
93
|
+
|
|
94
|
+
- Claude Desktop
|
|
95
|
+
- Cline / Cursor
|
|
96
|
+
- OpenClaw 风格的本地 agent / gateway
|
|
97
|
+
- 其它支持 `command + args + env` 的本地智能体
|
|
98
|
+
|
|
99
|
+
详细说明见:
|
|
100
|
+
|
|
101
|
+
- `docs/local-agent-install.md`
|
|
102
|
+
|
|
103
|
+
## 运行
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
107
|
+
./qingflow-mcp
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
也可以直接:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
cd <repo_root>/qingflow-support/mcp-server
|
|
114
|
+
PYTHONPATH=src python3 -m qingflow_mcp.server
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
如果你已经通过 `pip install -e '.[dev]'` 把脚本安装到当前 Python 环境,也可以直接运行:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
qingflow-mcp
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 配置
|
|
124
|
+
|
|
125
|
+
- `QINGFLOW_MCP_DEFAULT_BASE_URL`:默认 Qingflow 后端地址
|
|
126
|
+
- `QINGFLOW_MCP_DEFAULT_QF_VERSION`:默认 `qfVersion` 路由值
|
|
127
|
+
- `QINGFLOW_MCP_HOME`:本地会话目录,默认 `~/.qingflow-mcp`
|
|
128
|
+
- `QINGFLOW_MCP_DESIGN_HOME`:`solution_design_session` 本地设计会话目录,默认 `~/.qingflow-mcp/design-sessions`
|
|
129
|
+
- `QINGFLOW_MCP_BUILD_HOME`:分阶段 build assembly 目录,默认 `~/.qingflow-mcp/build-assemblies`
|
|
130
|
+
- `QINGFLOW_MCP_BOOTSTRAP_HOME`:`solution_bootstrap` 运行记录目录,默认 `~/.qingflow-mcp/bootstrap-runs`
|
|
131
|
+
- `QINGFLOW_MCP_TIMEOUT_SECONDS`:HTTP 超时秒数,默认 `30`
|
|
132
|
+
|
|
133
|
+
会话元数据写入 `~/.qingflow-mcp/profiles.json`。
|
|
134
|
+
|
|
135
|
+
配置文件会按下面的顺序查找第一个存在的文件:
|
|
136
|
+
|
|
137
|
+
1. `QINGFLOW_MCP_CONFIG_PATH`
|
|
138
|
+
2. 当前工作目录 `qingflow-mcp.config.json`
|
|
139
|
+
3. `~/.qingflow-mcp/config.json`
|
|
140
|
+
4. `/etc/qingflow-mcp/config.json`
|
|
141
|
+
|
|
142
|
+
`auth_login` / `auth_use_token` 的路由优先级是:
|
|
143
|
+
|
|
144
|
+
1. 工具参数里显式传入的 `base_url` / `qf_version`
|
|
145
|
+
2. 全局默认 `QINGFLOW_MCP_DEFAULT_BASE_URL` / `QINGFLOW_MCP_DEFAULT_QF_VERSION` 或配置文件里的 `default_base_url` / `default_qf_version`(同层里环境变量优先)
|
|
146
|
+
|
|
147
|
+
敏感 token 优先写入系统 keychain;如果当前环境没有可用 keychain,会自动退回仅内存会话。
|
|
148
|
+
|
|
149
|
+
示例配置文件:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"default_base_url": "https://qingflow.com/api",
|
|
154
|
+
"default_qf_version": "canary"
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## 会话模型
|
|
159
|
+
|
|
160
|
+
1. 调用 `auth_login` 或 `auth_use_token`
|
|
161
|
+
2. 调用 `workspace_list`
|
|
162
|
+
3. 调用 `workspace_select`
|
|
163
|
+
4. 再调用业务工具
|
|
164
|
+
|
|
165
|
+
未选择工作区前,除 `auth_*` 和 `workspace_*` 外的工具都会报错。
|
|
166
|
+
|
|
167
|
+
## 工具清单
|
|
168
|
+
|
|
169
|
+
### 认证与工作区
|
|
170
|
+
|
|
171
|
+
- `auth_login`
|
|
172
|
+
- `auth_use_token`
|
|
173
|
+
- `auth_whoami`
|
|
174
|
+
- `auth_logout`
|
|
175
|
+
- `workspace_list`
|
|
176
|
+
- `workspace_select`
|
|
177
|
+
- `workspace_set_plugin_status`
|
|
178
|
+
|
|
179
|
+
### 表单数据
|
|
180
|
+
|
|
181
|
+
- `record_field_resolve`
|
|
182
|
+
- `record_query_plan`
|
|
183
|
+
- `record_write_plan`
|
|
184
|
+
- `record_query`
|
|
185
|
+
- `record_aggregate`
|
|
186
|
+
- `record_create`
|
|
187
|
+
- `record_get`
|
|
188
|
+
- `record_update`
|
|
189
|
+
- `record_delete`
|
|
190
|
+
|
|
191
|
+
说明:
|
|
192
|
+
- `record_query` 是推荐的统一读入口,按 `query_mode` 路由到列表、单条详情或汇总分析
|
|
193
|
+
- `record_query(list)` 默认返回扁平宽表行,适合浏览、导出和分析;当选列超过后端单次字段上限时,工具会自动分批查询并按 `apply_id` 合并;单条完整详情请用 `record_get`
|
|
194
|
+
- `record_write_plan` 用于复杂写入前的静态预检,支持 `fields` 这种更友好的写法;每个字段都会返回 `write_format.support_level`,区分 `full`、`restricted`、`unsupported`
|
|
195
|
+
- `record_create` 和 `record_update` 都支持 `verify_write=true`,会在写入后读回记录并检测字段是否被静默丢弃、清空或数量不足
|
|
196
|
+
- 子表字段现在支持行对象写法,例如 `{"明细": [{"产品名称": "企业版", "数量": 2}]}`;更新既有子表行时可额外传 `rowId` / `row_id` / `__row_id__`
|
|
197
|
+
- `record_get` / `record_create` / `record_update` 继续保留,用于精确详情读取和明确写入
|
|
198
|
+
|
|
199
|
+
### 文件
|
|
200
|
+
|
|
201
|
+
- `file_get_upload_info`
|
|
202
|
+
- `file_upload_local`
|
|
203
|
+
|
|
204
|
+
### 应用
|
|
205
|
+
|
|
206
|
+
- `package_list`
|
|
207
|
+
- `package_get`
|
|
208
|
+
- `package_get_base`
|
|
209
|
+
- `package_create`
|
|
210
|
+
- `package_update`
|
|
211
|
+
- `package_delete`
|
|
212
|
+
|
|
213
|
+
- `navigation_list_published`
|
|
214
|
+
- `navigation_list_draft_page`
|
|
215
|
+
- `navigation_list_draft_all`
|
|
216
|
+
- `navigation_get_detail`
|
|
217
|
+
- `navigation_get_status`
|
|
218
|
+
- `navigation_set_visible`
|
|
219
|
+
- `navigation_create`
|
|
220
|
+
- `navigation_update`
|
|
221
|
+
- `navigation_delete`
|
|
222
|
+
- `navigation_publish`
|
|
223
|
+
- `navigation_reorder`
|
|
224
|
+
|
|
225
|
+
说明:
|
|
226
|
+
- `workspace_set_plugin_status` 会调用工作区插件安装接口,可用于安装或卸载指定插件。
|
|
227
|
+
- staged 高层 build 在创建导航时如果遇到 `50004 插件未安装`,会先尝试自动安装导航插件,再重试一次导航创建。
|
|
228
|
+
|
|
229
|
+
- `record_comment_add`
|
|
230
|
+
- `record_comment_list`
|
|
231
|
+
- `record_comment_mention_candidates`
|
|
232
|
+
- `record_comment_mark_read`
|
|
233
|
+
- `record_comment_stats`
|
|
234
|
+
- `record_approve`
|
|
235
|
+
- `record_reject`
|
|
236
|
+
- `record_rollback_candidates`
|
|
237
|
+
- `record_rollback`
|
|
238
|
+
- `record_transfer`
|
|
239
|
+
- `record_transfer_candidates`
|
|
240
|
+
- `record_reassign_get`
|
|
241
|
+
- `record_reassign`
|
|
242
|
+
- `record_countersign_candidates`
|
|
243
|
+
- `record_countersign`
|
|
244
|
+
|
|
245
|
+
- `app_list`
|
|
246
|
+
- `app_get_base`
|
|
247
|
+
- `app_update_base`
|
|
248
|
+
- `app_get_form_schema`
|
|
249
|
+
- `app_update_form_schema`
|
|
250
|
+
- `app_create`
|
|
251
|
+
- `app_delete`
|
|
252
|
+
- `app_publish`
|
|
253
|
+
|
|
254
|
+
### 流程
|
|
255
|
+
|
|
256
|
+
- `workflow_list_nodes`
|
|
257
|
+
- `workflow_get_node_detail`
|
|
258
|
+
- `workflow_add_node`
|
|
259
|
+
- `workflow_update_node`
|
|
260
|
+
- `workflow_delete_node`
|
|
261
|
+
- `workflow_copy_paste_node`
|
|
262
|
+
- `workflow_cut_paste_node`
|
|
263
|
+
- `workflow_create_sub_branch`
|
|
264
|
+
- `workflow_delete_sub_branch`
|
|
265
|
+
- `workflow_get_global_settings`
|
|
266
|
+
- `workflow_update_global_settings`
|
|
267
|
+
- `workflow_publish`
|
|
268
|
+
- `workflow_get_future_nodes`
|
|
269
|
+
- `workflow_get_future_nodes_app`
|
|
270
|
+
- `workflow_webhook_test`
|
|
271
|
+
- `workflow_qsource_query`
|
|
272
|
+
- `workflow_qsource_test`
|
|
273
|
+
- `workflow_get_qsource_active`
|
|
274
|
+
- `workflow_upsert_qsource_active`
|
|
275
|
+
- `workflow_get_qsource_passive`
|
|
276
|
+
- `workflow_upsert_qsource_passive`
|
|
277
|
+
- `workflow_switch_qsource_status`
|
|
278
|
+
- `workflow_delete_qsource`
|
|
279
|
+
- `workflow_get_editable_question_ids`
|
|
280
|
+
- `workflow_get_print_nodes`
|
|
281
|
+
|
|
282
|
+
### 视图
|
|
283
|
+
|
|
284
|
+
- `view_list`
|
|
285
|
+
- `view_list_flat`
|
|
286
|
+
- `view_reorder`
|
|
287
|
+
- `view_set_column_width`
|
|
288
|
+
- `view_create`
|
|
289
|
+
- `view_get_config`
|
|
290
|
+
- `view_get_base_info`
|
|
291
|
+
- `view_update`
|
|
292
|
+
- `view_delete`
|
|
293
|
+
- `view_copy`
|
|
294
|
+
- `view_list_questions`
|
|
295
|
+
- `view_list_associations`
|
|
296
|
+
- `view_update_member_config`
|
|
297
|
+
- `view_update_apply_config`
|
|
298
|
+
- `view_board_set_lane_config`
|
|
299
|
+
- `view_board_get_lane_base_info`
|
|
300
|
+
- `view_gantt_switch_auto_calibration`
|
|
301
|
+
- `view_gantt_batch_update_time`
|
|
302
|
+
- `view_get_future_nodes`
|
|
303
|
+
- `view_get_workflow_status`
|
|
304
|
+
|
|
305
|
+
### 报表
|
|
306
|
+
|
|
307
|
+
- `qingbi_report_list`
|
|
308
|
+
- `qingbi_report_create`
|
|
309
|
+
- `qingbi_report_get_base`
|
|
310
|
+
- `qingbi_report_update_base`
|
|
311
|
+
- `qingbi_report_get_config`
|
|
312
|
+
- `qingbi_report_update_config`
|
|
313
|
+
- `qingbi_report_get_data`
|
|
314
|
+
- `qingbi_report_delete`
|
|
315
|
+
- `qingbi_report_reorder`
|
|
316
|
+
- `qingbi_report_list_fields`
|
|
317
|
+
- `qingbi_report_list_field_options`
|
|
318
|
+
|
|
319
|
+
### 门户
|
|
320
|
+
|
|
321
|
+
- `portal_list`
|
|
322
|
+
- `portal_get`
|
|
323
|
+
- `portal_create`
|
|
324
|
+
- `portal_update`
|
|
325
|
+
- `portal_delete`
|
|
326
|
+
- `portal_publish`
|
|
327
|
+
|
|
328
|
+
### 通讯录
|
|
329
|
+
|
|
330
|
+
- `directory_search`
|
|
331
|
+
- `directory_list_internal_users`
|
|
332
|
+
- `directory_list_all_internal_users`
|
|
333
|
+
- `directory_list_internal_departments`
|
|
334
|
+
- `directory_list_all_departments`
|
|
335
|
+
- `directory_list_sub_departments`
|
|
336
|
+
- `directory_list_external_members`
|
|
337
|
+
|
|
338
|
+
### 解决方案编排
|
|
339
|
+
|
|
340
|
+
- `solution_design_session`
|
|
341
|
+
- `solution_build_all`
|
|
342
|
+
- `solution_build_app_flow`
|
|
343
|
+
- `solution_build_views`
|
|
344
|
+
- `solution_build_analytics_portal`
|
|
345
|
+
- `solution_build_navigation`
|
|
346
|
+
- `solution_build_status`
|
|
347
|
+
|
|
348
|
+
`solution_design_session` 用来承接上层 AI 的分阶段设计过程:
|
|
349
|
+
|
|
350
|
+
- `start`:创建或读取一个 task-scoped 设计会话
|
|
351
|
+
- `submit_stage`:提交 `discover/design/experience` 阶段 patch,返回当前 gate 状态和缺失项
|
|
352
|
+
- `get`:读取当前设计会话快照
|
|
353
|
+
- `finalize`:把分阶段 patch 合并成完整 `SolutionSpec`,并返回可执行 `execution_plan`
|
|
354
|
+
- 这是纯本地设计会话工具,不调用 Qingflow 后端,也不会影响智能体处理其他任务
|
|
355
|
+
|
|
356
|
+
公开高层搭建入口已经改成 staged build:
|
|
357
|
+
|
|
358
|
+
- `solution_build_all`
|
|
359
|
+
- 负责把完整 `SolutionSpec` 自动拆分到 `app_flow/views/analytics_portal/navigation`
|
|
360
|
+
- 支持 `preflight/plan/apply/repair`
|
|
361
|
+
- `verify=true` 时会在成功后自动做回读校验
|
|
362
|
+
- `repair` 时如果未传 `solution_spec`,会优先复用 `build_id` 已落盘的 manifest
|
|
363
|
+
|
|
364
|
+
- `solution_build_app_flow`
|
|
365
|
+
- 负责应用包、应用、字段、表单布局、角色、流程、模拟数据
|
|
366
|
+
- 支持 `preflight/plan/apply/repair`
|
|
367
|
+
- `target.package_tag_id` 可选;传入后会复用已有应用包
|
|
368
|
+
- `solution_build_views`
|
|
369
|
+
- 负责视图创建、排序、子类型配置、应用发布
|
|
370
|
+
- 支持 `preflight/plan/apply/repair`
|
|
371
|
+
- `solution_build_analytics_portal`
|
|
372
|
+
- 负责 Qingbi 报表、门户布局、筛选器、宫格入口、发布
|
|
373
|
+
- 支持 `preflight/plan/apply/repair`
|
|
374
|
+
- `solution_build_navigation`
|
|
375
|
+
- 负责导航创建、排序与发布
|
|
376
|
+
- 支持 `preflight/plan/apply/repair`
|
|
377
|
+
- `solution_build_status`
|
|
378
|
+
- 纯本地读取 `build_id` 对应的 assembly 状态
|
|
379
|
+
- 返回 `stage_statuses`、`ready_stages`、`next_recommended_stage`、`missing_prerequisites`
|
|
380
|
+
|
|
381
|
+
设计边界:
|
|
382
|
+
|
|
383
|
+
- AI 负责生成每个阶段的显式 DSL
|
|
384
|
+
- MCP 只做校验、归一化、原生接口转译和执行
|
|
385
|
+
- 支持 staged DSL,也支持通过 `solution_build_all` 直接提交完整 `SolutionSpec`
|
|
386
|
+
|
|
387
|
+
## 示例 MCP client 配置
|
|
388
|
+
|
|
389
|
+
见 `examples/claude_desktop_config.json`。
|
|
390
|
+
|
|
391
|
+
如果通过 npm 安装到本机,也可以直接配成:
|
|
392
|
+
|
|
393
|
+
```json
|
|
394
|
+
{
|
|
395
|
+
"mcpServers": {
|
|
396
|
+
"qingflow": {
|
|
397
|
+
"command": "qingflow-mcp",
|
|
398
|
+
"args": [],
|
|
399
|
+
"env": {
|
|
400
|
+
"QINGFLOW_MCP_DEFAULT_BASE_URL": "https://stable732.oalite.com/api"
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
## 示例调用顺序
|
|
408
|
+
|
|
409
|
+
见 `examples/transcript.md`。
|
|
410
|
+
|
|
411
|
+
## 设计文档
|
|
412
|
+
|
|
413
|
+
- 工具矩阵与后续扩展方案:`docs/tool-matrix.md`
|
|
414
|
+
|
|
415
|
+
## 典型用法
|
|
416
|
+
|
|
417
|
+
### 1. 登录
|
|
418
|
+
|
|
419
|
+
```json
|
|
420
|
+
{
|
|
421
|
+
"profile": "default",
|
|
422
|
+
"base_url": "https://qingflow.example.com",
|
|
423
|
+
"email": "user@example.com",
|
|
424
|
+
"password": "******",
|
|
425
|
+
"persist": true
|
|
426
|
+
}
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### 1b. 直接注入 token
|
|
430
|
+
|
|
431
|
+
```json
|
|
432
|
+
{
|
|
433
|
+
"profile": "default",
|
|
434
|
+
"base_url": "https://qingflow.example.com/api",
|
|
435
|
+
"token": "<user-token>",
|
|
436
|
+
"ws_id": 10001,
|
|
437
|
+
"persist": false
|
|
438
|
+
}
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
### 2. 查询工作区
|
|
442
|
+
|
|
443
|
+
```json
|
|
444
|
+
{
|
|
445
|
+
"profile": "default",
|
|
446
|
+
"page_num": 1,
|
|
447
|
+
"page_size": 20,
|
|
448
|
+
"include_external": false
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### 3. 选择工作区
|
|
453
|
+
|
|
454
|
+
```json
|
|
455
|
+
{
|
|
456
|
+
"profile": "default",
|
|
457
|
+
"ws_id": 10001
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 4. 新增记录
|
|
462
|
+
|
|
463
|
+
```json
|
|
464
|
+
{
|
|
465
|
+
"profile": "default",
|
|
466
|
+
"app_key": "APP_xxx",
|
|
467
|
+
"submit_type": 1,
|
|
468
|
+
"answers": [
|
|
469
|
+
{
|
|
470
|
+
"queId": 1001,
|
|
471
|
+
"queType": 2,
|
|
472
|
+
"values": [{ "value": "hello" }],
|
|
473
|
+
"tableValues": []
|
|
474
|
+
}
|
|
475
|
+
]
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 5. 搜索内部成员
|
|
480
|
+
|
|
481
|
+
```json
|
|
482
|
+
{
|
|
483
|
+
"profile": "default",
|
|
484
|
+
"keyword": "张",
|
|
485
|
+
"page_num": 1,
|
|
486
|
+
"page_size": 20,
|
|
487
|
+
"contain_disable": false
|
|
488
|
+
}
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### 6. 拉取全部内部成员
|
|
492
|
+
|
|
493
|
+
```json
|
|
494
|
+
{
|
|
495
|
+
"profile": "default",
|
|
496
|
+
"page_size": 200,
|
|
497
|
+
"max_pages": 100,
|
|
498
|
+
"contain_disable": false
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### 7. 拉取全部部门树
|
|
503
|
+
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"profile": "default",
|
|
507
|
+
"parent_dept_id": null,
|
|
508
|
+
"max_depth": 20,
|
|
509
|
+
"max_items": 2000
|
|
510
|
+
}
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
## 返回约定
|
|
514
|
+
|
|
515
|
+
- 成功时返回结构化 JSON
|
|
516
|
+
- Qingflow 后端报错会原样透出主要错误信息
|
|
517
|
+
- token 失效时会自动清除当前 profile 的本地会话,并提示重新登录
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# 本地智能体安装
|
|
2
|
+
|
|
3
|
+
这个目录下现在同时支持两种本地安装形态:
|
|
4
|
+
|
|
5
|
+
1. 直接用 Python 运行 `qingflow-mcp`
|
|
6
|
+
2. 通过 npm 安装一个本地 agent 友好的启动壳
|
|
7
|
+
|
|
8
|
+
## npm 安装器适用场景
|
|
9
|
+
|
|
10
|
+
适合这类本地 agent / gateway:
|
|
11
|
+
|
|
12
|
+
- Claude Desktop
|
|
13
|
+
- Cline / Roo / Cursor 这类本地 MCP 客户端
|
|
14
|
+
- OpenClaw 风格的本地 agent 容器或本地 gateway
|
|
15
|
+
- 任何支持 `command + args + env` 的 stdio MCP 客户端
|
|
16
|
+
|
|
17
|
+
## 前置条件
|
|
18
|
+
|
|
19
|
+
- Node.js >= 16.16
|
|
20
|
+
- Python >= 3.11
|
|
21
|
+
- 安装过程中可以访问 PyPI
|
|
22
|
+
|
|
23
|
+
如果机器上没有默认 `python3` / `python`,可以先设置:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
export QINGFLOW_MCP_PYTHON=/path/to/python3.11
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 安装方式
|
|
30
|
+
|
|
31
|
+
### 方式 1:在源码目录预热运行环境
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
cd qingflow-support/mcp-server
|
|
35
|
+
npm install
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
这个模式适合你已经有源码 checkout,只想让当前目录具备本地 agent 可调用的运行时。
|
|
39
|
+
|
|
40
|
+
### 方式 2:全局安装到当前机器
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
cd qingflow-support/mcp-server
|
|
44
|
+
npm install -g .
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 方式 3:安装到某个本地 agent workspace
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
npm install /absolute/path/to/qingflow-support/mcp-server
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 方式 4:离线分发 tgz 安装包
|
|
54
|
+
|
|
55
|
+
先在源码目录打包:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
cd qingflow-support/mcp-server
|
|
59
|
+
npm run pack:npm
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
会生成:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
dist/npm/qingflow-qingflow-mcp-<version>.tgz
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
然后在目标机器安装:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npm install /absolute/path/to/dist/npm/qingflow-qingflow-mcp-<version>.tgz
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
安装时会自动:
|
|
75
|
+
|
|
76
|
+
1. 创建 `.npm-python/`
|
|
77
|
+
2. 在其中建立 Python 虚拟环境
|
|
78
|
+
3. 执行 `pip install .`
|
|
79
|
+
4. 在安装位置暴露 `qingflow-mcp` 命令
|
|
80
|
+
|
|
81
|
+
## 本地验证
|
|
82
|
+
|
|
83
|
+
如果你在源码目录执行了 `npm install`,可直接这样启动:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
cd qingflow-support/mcp-server
|
|
87
|
+
node ./npm/bin/qingflow-mcp.mjs
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
如果你是全局安装:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
qingflow-mcp
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
如果你是把包安装到了某个本地 agent workspace,命令通常位于:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
/absolute/path/to/agent-workspace/node_modules/.bin/qingflow-mcp
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
如果你是从 tgz 安装到某个空目录,命令通常位于:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
/absolute/path/to/install-dir/node_modules/.bin/qingflow-mcp
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
这是 stdio MCP server,正常情况下不会输出欢迎信息,而是等待客户端连接。
|
|
109
|
+
|
|
110
|
+
## 客户端配置
|
|
111
|
+
|
|
112
|
+
### 通用 stdio MCP 客户端
|
|
113
|
+
|
|
114
|
+
如果你直接使用源码 checkout:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"mcpServers": {
|
|
119
|
+
"qingflow": {
|
|
120
|
+
"command": "node",
|
|
121
|
+
"args": [
|
|
122
|
+
"/absolute/path/to/qingflow-support/mcp-server/npm/bin/qingflow-mcp.mjs"
|
|
123
|
+
],
|
|
124
|
+
"env": {
|
|
125
|
+
"QINGFLOW_MCP_DEFAULT_BASE_URL": "https://stable732.oalite.com/api",
|
|
126
|
+
"QINGFLOW_MCP_HOME": "/absolute/path/to/.qingflow-mcp"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
如果你已经全局安装:
|
|
134
|
+
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"mcpServers": {
|
|
138
|
+
"qingflow": {
|
|
139
|
+
"command": "qingflow-mcp",
|
|
140
|
+
"args": [],
|
|
141
|
+
"env": {
|
|
142
|
+
"QINGFLOW_MCP_DEFAULT_BASE_URL": "https://stable732.oalite.com/api",
|
|
143
|
+
"QINGFLOW_MCP_HOME": "/absolute/path/to/.qingflow-mcp"
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
如果你把包安装到了某个本地 agent workspace:
|
|
151
|
+
|
|
152
|
+
```json
|
|
153
|
+
{
|
|
154
|
+
"mcpServers": {
|
|
155
|
+
"qingflow": {
|
|
156
|
+
"command": "/absolute/path/to/agent-workspace/node_modules/.bin/qingflow-mcp",
|
|
157
|
+
"args": [],
|
|
158
|
+
"env": {
|
|
159
|
+
"QINGFLOW_MCP_DEFAULT_BASE_URL": "https://stable732.oalite.com/api",
|
|
160
|
+
"QINGFLOW_MCP_HOME": "/absolute/path/to/.qingflow-mcp"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 使用 npx
|
|
168
|
+
|
|
169
|
+
如果不做全局安装,也可以直接让客户端运行 npm 包里的命令:
|
|
170
|
+
|
|
171
|
+
```json
|
|
172
|
+
{
|
|
173
|
+
"mcpServers": {
|
|
174
|
+
"qingflow": {
|
|
175
|
+
"command": "npx",
|
|
176
|
+
"args": [
|
|
177
|
+
"-y",
|
|
178
|
+
"@josephyan/qingflow-mcp"
|
|
179
|
+
],
|
|
180
|
+
"env": {
|
|
181
|
+
"QINGFLOW_MCP_DEFAULT_BASE_URL": "https://stable732.oalite.com/api"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
说明:
|
|
189
|
+
|
|
190
|
+
- 源码目录 `npm install` 不会把命令加到全局 PATH;这种模式请用 `node ./npm/bin/qingflow-mcp.mjs`
|
|
191
|
+
- `npx` 方式适合临时安装或容器化本地 agent
|
|
192
|
+
- 全局安装方式更适合长期固定使用的本机开发环境
|
|
193
|
+
|
|
194
|
+
## 排障
|
|
195
|
+
|
|
196
|
+
如果安装失败,优先检查:
|
|
197
|
+
|
|
198
|
+
1. `node -v`
|
|
199
|
+
2. `python3 --version`
|
|
200
|
+
3. `pip` 是否能访问 PyPI
|
|
201
|
+
4. 是否设置了错误的 `QINGFLOW_MCP_PYTHON`
|
|
202
|
+
|
|
203
|
+
如果需要重装 Python 侧运行环境,可以删掉:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
rm -rf .npm-python
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
然后重新执行:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
npm install
|
|
213
|
+
```
|