@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.
Files changed (52) hide show
  1. package/README.md +517 -0
  2. package/docs/local-agent-install.md +213 -0
  3. package/entry_point.py +13 -0
  4. package/npm/bin/qingflow-mcp.mjs +7 -0
  5. package/npm/lib/runtime.mjs +146 -0
  6. package/npm/scripts/postinstall.mjs +12 -0
  7. package/package.json +34 -0
  8. package/pyproject.toml +63 -0
  9. package/qingflow-mcp +15 -0
  10. package/src/qingflow_mcp/__init__.py +5 -0
  11. package/src/qingflow_mcp/__main__.py +5 -0
  12. package/src/qingflow_mcp/backend_client.py +336 -0
  13. package/src/qingflow_mcp/config.py +166 -0
  14. package/src/qingflow_mcp/errors.py +66 -0
  15. package/src/qingflow_mcp/json_types.py +18 -0
  16. package/src/qingflow_mcp/server.py +70 -0
  17. package/src/qingflow_mcp/session_store.py +235 -0
  18. package/src/qingflow_mcp/solution/__init__.py +6 -0
  19. package/src/qingflow_mcp/solution/build_assembly_store.py +137 -0
  20. package/src/qingflow_mcp/solution/compiler/__init__.py +265 -0
  21. package/src/qingflow_mcp/solution/compiler/chart_compiler.py +96 -0
  22. package/src/qingflow_mcp/solution/compiler/form_compiler.py +456 -0
  23. package/src/qingflow_mcp/solution/compiler/icon_utils.py +113 -0
  24. package/src/qingflow_mcp/solution/compiler/navigation_compiler.py +57 -0
  25. package/src/qingflow_mcp/solution/compiler/package_compiler.py +19 -0
  26. package/src/qingflow_mcp/solution/compiler/portal_compiler.py +60 -0
  27. package/src/qingflow_mcp/solution/compiler/view_compiler.py +51 -0
  28. package/src/qingflow_mcp/solution/compiler/workflow_compiler.py +134 -0
  29. package/src/qingflow_mcp/solution/design_session.py +222 -0
  30. package/src/qingflow_mcp/solution/design_store.py +100 -0
  31. package/src/qingflow_mcp/solution/executor.py +2064 -0
  32. package/src/qingflow_mcp/solution/normalizer.py +23 -0
  33. package/src/qingflow_mcp/solution/run_store.py +221 -0
  34. package/src/qingflow_mcp/solution/spec_models.py +755 -0
  35. package/src/qingflow_mcp/tools/__init__.py +1 -0
  36. package/src/qingflow_mcp/tools/app_tools.py +239 -0
  37. package/src/qingflow_mcp/tools/approval_tools.py +481 -0
  38. package/src/qingflow_mcp/tools/auth_tools.py +496 -0
  39. package/src/qingflow_mcp/tools/base.py +81 -0
  40. package/src/qingflow_mcp/tools/directory_tools.py +476 -0
  41. package/src/qingflow_mcp/tools/file_tools.py +375 -0
  42. package/src/qingflow_mcp/tools/navigation_tools.py +177 -0
  43. package/src/qingflow_mcp/tools/package_tools.py +142 -0
  44. package/src/qingflow_mcp/tools/portal_tools.py +100 -0
  45. package/src/qingflow_mcp/tools/qingbi_report_tools.py +258 -0
  46. package/src/qingflow_mcp/tools/record_tools.py +4305 -0
  47. package/src/qingflow_mcp/tools/role_tools.py +94 -0
  48. package/src/qingflow_mcp/tools/solution_tools.py +1860 -0
  49. package/src/qingflow_mcp/tools/task_tools.py +677 -0
  50. package/src/qingflow_mcp/tools/view_tools.py +324 -0
  51. package/src/qingflow_mcp/tools/workflow_tools.py +311 -0
  52. 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
+ ```