@qingflow-tech/qingflow-cli 1.1.43-beta.2 → 1.1.43-beta.4

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 (62) hide show
  1. package/README.md +11 -5
  2. package/entry_point.py +1 -1
  3. package/npm/bin/qingflow.mjs +1 -2
  4. package/npm/lib/runtime.mjs +3 -7
  5. package/package.json +1 -2
  6. package/pyproject.toml +1 -3
  7. package/skills/qingflow-app-form/SKILL.md +23 -11
  8. package/skills/qingflow-cli/SKILL.md +4 -2
  9. package/skills/qingflow-cli/reference/QINGFLOW_CLI_FIELD_DATA_TYPES.md +1 -1
  10. package/skills/qingflow-cli/reference/QINGFLOW_CLI_SCHEMA_APPLY_FIELD_TYPES_AND_SCENARIOS.md +1 -1
  11. package/skills/qingflow-cli/reference/builder/10-build-single-app.md +3 -3
  12. package/skills/qingflow-cli/reference/builder/20-build-complete-system.md +1 -1
  13. package/skills/qingflow-cli/reference/builder/30-schema-fields.md +25 -24
  14. package/skills/qingflow-cli/reference/builder/40-layout.md +5 -5
  15. package/skills/qingflow-cli/reference/builder/README.md +3 -3
  16. package/skills/qingflow-cli/reference/builder/code-integrations/README.md +1 -1
  17. package/skills/qingflow-cli/reference/builder/reference/app-delivery-sop.md +7 -7
  18. package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_FIELD_DATA_TYPES.md +1 -1
  19. package/skills/qingflow-cli/reference/examples/README.md +1 -1
  20. package/skills/qingflow-common/SKILL.md +47 -0
  21. package/skills/qingflow-common/agents/openai.yaml +4 -0
  22. package/src/qingflow_mcp/__main__.py +2 -3
  23. package/src/qingflow_mcp/app_form_compat.py +11 -27
  24. package/src/qingflow_mcp/app_form_validator.py +201 -35
  25. package/src/qingflow_mcp/builder_facade/app_form.py +762 -148
  26. package/src/qingflow_mcp/builder_facade/app_form_schema.py +114 -3
  27. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +310 -245
  28. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +82 -27
  29. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +85 -32
  30. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +82 -30
  31. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +113 -37
  32. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +87 -64
  33. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +82 -27
  34. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +82 -27
  35. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +83 -28
  36. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +82 -27
  37. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +82 -27
  38. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +82 -27
  39. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +83 -28
  40. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +82 -27
  41. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +85 -32
  42. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +82 -27
  43. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +95 -40
  44. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +100 -28
  45. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +82 -27
  46. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +82 -27
  47. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +212 -117
  48. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +82 -27
  49. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +143 -161
  50. package/src/qingflow_mcp/builder_facade/service.py +3 -2
  51. package/src/qingflow_mcp/response_trim.py +2 -0
  52. package/src/qingflow_mcp/server.py +24 -3
  53. package/src/qingflow_mcp/server_app_builder.py +2 -2
  54. package/src/qingflow_mcp/tools/record_tools.py +3 -3
  55. package/src/qingflow_mcp/version.py +2 -4
  56. package/docs/local-agent-install.md +0 -370
  57. package/skills/qingflow-mcp-setup/SKILL.md +0 -115
  58. package/skills/qingflow-mcp-setup/agents/openai.yaml +0 -4
  59. package/skills/qingflow-mcp-setup/references/claude-desktop.md +0 -34
  60. package/skills/qingflow-mcp-setup/references/environments.md +0 -62
  61. package/skills/qingflow-mcp-setup/references/generic-stdio.md +0 -32
  62. package/skills/qingflow-mcp-setup/scripts/check_local_server.sh +0 -38
@@ -26,12 +26,32 @@ from .tools.workflow_tools import WorkflowTools
26
26
  from .tools.workspace_tools import WorkspaceTools
27
27
 
28
28
 
29
+ def _register_missing_builder_tools(server: FastMCP) -> None:
30
+ """Add current high-level builder tools to the unified MCP without duplicate names."""
31
+ from .server_app_builder import build_builder_server
32
+
33
+ builder_server = build_builder_server()
34
+ registered = server._tool_manager._tools
35
+ for tool in builder_server._tool_manager._tools.values():
36
+ if tool.name in registered:
37
+ continue
38
+ server.add_tool(
39
+ tool.fn,
40
+ name=tool.name,
41
+ title=tool.title,
42
+ description=tool.description,
43
+ annotations=tool.annotations,
44
+ icons=tool.icons,
45
+ meta=tool.meta,
46
+ )
47
+
48
+
29
49
  def build_server() -> FastMCP:
30
50
  today = date.today()
31
51
  current_year = today.year
32
52
  server = FastMCP(
33
53
  "Qingflow MCP",
34
- instructions=f"""Use this server for Qingflow operational workflows. Current date: `{today.isoformat()}`.
54
+ instructions=f"""Use this unified server for Qingflow operational and builder workflows. Current date: `{today.isoformat()}`.
35
55
 
36
56
  ## Authentication
37
57
 
@@ -203,9 +223,9 @@ Normalize relative dates before building DSL.
203
223
 
204
224
  Default to `prod` unless the user explicitly specifies `test`.
205
225
 
206
- ## Constraints
226
+ ## Builder Path
207
227
 
208
- Avoid builder-side app or schema changes here.
228
+ Use the public builder tools for package, AppForm, workflow, view, chart, portal, and application configuration work. Pin the AppForm Schema version, preserve complete form declarations and existing IDs from draft reads, and use `app_form_apply` for reconciliation. Do not fall back to legacy raw builder write routes.
209
229
 
210
230
  ## Feedback Path
211
231
 
@@ -235,6 +255,7 @@ If the current MCP capability is unsupported, the workflow is awkward, or the us
235
255
  WorkflowTools(sessions, backend).register(server)
236
256
  ViewTools(sessions, backend).register(server)
237
257
  SolutionTools(sessions, backend).register(server)
258
+ _register_missing_builder_tools(server)
238
259
  return server
239
260
 
240
261
 
@@ -36,7 +36,7 @@ def build_builder_server() -> FastMCP:
36
36
  "Use builder_tool_contract when you need a machine-readable contract, aliases, allowed enums, or a minimal valid example for a public builder tool. "
37
37
  "Use solution_install when the user explicitly wants to install a packaged solution/template by solution_key, optionally copying bundled demo data. "
38
38
  "Use package_list to find visible app packages by keyword and package_get to read package detail before editing; if creating or updating an app package may be appropriate, use package_apply with explicit user intent; otherwise use app_resolve to locate app resources, "
39
- "Use workspace_icon_catalog_get before creating app packages, apps, or portals when supported icon/color candidates are needed; new workspace resources require explicit non-template icon + color, and the CLI validates choices without inferring business defaults. "
39
+ "Use workspace_icon_catalog_get before creating app packages or portals when supported icon/color candidates are needed; those resources require explicit non-template icon + color. AppForm-created apps derive a stable default icon and color from spec.appName. "
40
40
  "app_form_schema plus app_form_get for versioned form work, using being_draft=true only for editing and the published default for relation or record consumers; use app_get as the default non-form app map read, then app_get_fields/app_repair_code_blocks/app_get_layout/app_get_views/app_get_flow/app_get_charts/portal_list/portal_get/view_get/chart_get for focused compatibility or non-form reads, "
41
41
  "member_search/role_search/role_create when workflow assignees must come from the directory or role catalog, preferring roles over explicit members unless the user explicitly names members, "
42
42
  "then app_form_apply for complete app form targets, explicit app_delete for application deletion, and app_flow_apply/app_views_apply/app_associated_resources_apply/app_charts_apply/portal_apply/portal_delete for non-form patches. app_custom_buttons_apply is maintenance-only for explicit standalone button work outside normal view design. These apply/delete tools perform validation, normalization, writes, and readback verification where applicable. AppForm publishes only after a draft change or when the published form lags behind; views noop requests skip publish, app_custom_buttons_apply and app_associated_resources_apply publish after at least one write succeeds and expose no draft-only parameter, charts are immediate-live without publish and resolve targets by chart_id first then exact unique chart name, portal updates use replace semantics only when sections are supplied and edit-mode base-info-only updates may omit sections, portal delete separates DELETE execution from readback verification, portal pc layout is a 24-column grid and mobile is a 6-column grid so omit position or use layout_preset when unsure, publish=false only guarantees draft/base-info updates for tools that still expose that parameter, and flow should use publish=false whenever you only want draft/precheck behavior. "
@@ -44,7 +44,7 @@ def build_builder_server() -> FastMCP:
44
44
  "For existing object parameter replacement, prefer patch_views, patch_buttons, patch_resources, and patch_charts with set/unset; the tool reads current config and full-saves internally, while upsert_* is for creation or full target configuration and should not be used as an incomplete partial update. "
45
45
  "For builder delete/remove apply results, separate delete execution from readback verification: after DELETE is sent, resources expose delete_executed, readback_status, and safe_to_retry_delete=false. If readback_status is unavailable or still_exists, do not blindly repeat the delete; confirm later with app_get/view_get/chart_get or the relevant apply readback. Views/buttons use single-item readback; associated resources use one app-level resource-pool readback because there is no confirmed single-item GET. "
46
46
  "For builder write/apply results, separate write execution from final readback verification: status=partial_success with write_executed=true and safe_to_retry=false means the write was sent or succeeded, while final readback, publish verification, or metadata confirmation is pending or permission-restricted. Report it as written but unverified; do not repeat the same write blindly. "
47
- "For app_form_apply, pin the version from app_form_schema, validate the JSON declaration with the qingflow-app-form Skill command, preserve the complete body and existing IDs from a draft get, and use dataTitle/dataCover on canonical fields; exactly one top-level dataTitle is required for a non-empty body, while dataCover is optional and must be a top-level attachment field. A root appKey means update and may include packageId; no appKey means create and requires packageId plus spec.appName, spec.icon, and spec.color selected from workspace_icon_catalog_get, with template forbidden. "
47
+ "For app_form_apply, pin the version from app_form_schema, preserve the complete body and existing IDs from a draft get, and configure data display through app-level spec.dataTitleField/spec.dataCoverField selectors rather than booleans on fields; App Builder MCP validates the declaration inside app_form_apply, while the CLI route has a separate static validate command. dataTitleField must resolve to exactly one top-level field for a non-empty body, while dataCoverField is optional and must resolve to a top-level attachment field. A root appKey means update and may include packageId; no appKey means create and requires packageId plus spec.appName. AppForm does not accept spec.icon or spec.color; creation derives a stable default icon and color from spec.appName. "
48
48
  "For app_views_apply, keep fixed saved filters in filters and configure the frontend query panel separately with query_conditions; query_conditions.rows is a matrix of field names compiled to backend queryCondition queIds. New views default associated report/view display to visible with limit_type=all; existing views preserve their current associated display unless associated_resources is explicitly patched. View writes use ViewManagementAuth (beingViewManageStatus), falling back to DataManageAuth when advanced app permissions are not enabled. "
49
49
  "For ordinary business buttons, declare them on the target view with app_views_apply.views[].action_buttons; app_views_apply writes the view first, then creates/binds the button. Use app_custom_buttons_apply only when the user explicitly asks to maintain existing standalone buttons outside view design, such as custom style/icon changes, cross-view reuse, deleting button bodies, bulk binding reorder, or exact qRobot/wings config. Button body writes require EditAppAuth; view_configs placement writes require ViewManagementAuth, matching the backend viewConfig route. For addData buttons, prefer action_buttons.target_app_key + field_mappings/default_values on the view path; do not ask agents to write raw que_relation unless maintaining a legacy config. field_mappings.source_field accepts source schema fields and supported system fields: 数据ID/row_record_id/apply_id/_id means current record id (-17), 编号/record_number means visible record number (0). To fill a target relation with the current record, map {'source_field': '数据ID', 'target_field': '目标引用字段'}; default_values is only for static constants. View button bindings merge by default; standalone view_configs are only for explicit maintenance. Builder view_key arguments are raw keys from app_get.views[].view_key and must not be prefixed with custom:. "
50
50
  "For BI reports, keep report-body development separate from Qingflow in-app display: use app_charts_apply to create, update, remove, or reorder app-source QingBI chart bodies/configs with dataSourceType=qingflow; chart dimension/metric/filter/query fields must come from app_get_fields.chart_fields, not record schema or form-only fields; dataset BI reports are not created or edited by app_charts_apply yet and should be created in QingBI first, then attached with app_associated_resources_apply using report_source=dataset. "
@@ -11895,7 +11895,7 @@ class RecordTools(ToolBase):
11895
11895
  raise RecordInputError(
11896
11896
  message=f"field '{field.que_title}' uses unsupported nested subtable writes",
11897
11897
  error_code="UNSUPPORTED_WRITE_FORMAT",
11898
- fix_hint="Nested subtable writes are not supported in app-user tools.",
11898
+ fix_hint="Nested subtable writes are not supported by the public record tools.",
11899
11899
  details={"location": location, "field": _field_ref_payload(field), "expected_format": _write_format_for_field(field), "received_value": item},
11900
11900
  )
11901
11901
  self._raise_if_verify_unsupported_write_field(field, item, location=location)
@@ -11960,7 +11960,7 @@ class RecordTools(ToolBase):
11960
11960
  raise RecordInputError(
11961
11961
  message=f"field '{field.que_title}' uses unsupported nested subtable writes",
11962
11962
  error_code="UNSUPPORTED_WRITE_FORMAT",
11963
- fix_hint="Nested subtable writes are not supported in app-user tools.",
11963
+ fix_hint="Nested subtable writes are not supported by the public record tools.",
11964
11964
  details={"location": location, "field": _field_ref_payload(field), "expected_format": _write_format_for_field(field), "received_value": raw_value},
11965
11965
  )
11966
11966
  self._raise_if_verify_unsupported_write_field(field, raw_value, location=location)
@@ -21150,7 +21150,7 @@ def _subtable_cell_ref_payload(
21150
21150
 
21151
21151
  def _unsupported_write_reason(que_type: int | None) -> str:
21152
21152
  if que_type == 14:
21153
- return "time range fields require a backend-specific native payload shape that app-user tools do not build yet"
21153
+ return "time range fields require a backend-specific native payload shape that public record tools do not build yet"
21154
21154
  if que_type == 34:
21155
21155
  return "image recognition fields are runtime AI fields and direct writes are not reliably persisted"
21156
21156
  if que_type == 35:
@@ -57,11 +57,9 @@ def _find_package_root() -> Path | None:
57
57
  if version and name in {
58
58
  "qingflow-mcp-workspace",
59
59
  "@qingflow-tech/qingflow-cli",
60
- "@qingflow-tech/qingflow-app-user-mcp",
61
- "@qingflow-tech/qingflow-app-builder-mcp",
60
+ "@qingflow-tech/qingflow-mcp",
62
61
  "@josephyan/qingflow-cli",
63
- "@josephyan/qingflow-app-user-mcp",
64
- "@josephyan/qingflow-app-builder-mcp",
62
+ "@josephyan/qingflow-mcp",
65
63
  }:
66
64
  return parent
67
65
  return None
@@ -1,370 +0,0 @@
1
- # 本地智能体安装
2
-
3
- 这个目录下现在有三个本地命令入口:
4
-
5
- 1. 统一 CLI:`qingflow`
6
- 2. 记录/待办优先的 `qingflow-app-user-mcp`
7
- 3. 精简 builder 的 `qingflow-app-builder-mcp`
8
-
9
- ## 本地鉴权推荐方案
10
-
11
- 本地模式现在推荐优先使用 `credential` 建立会话,而不是直接注入 `token`。
12
-
13
- 推荐链路:
14
-
15
- 1. createClaw 或其它本地宿主为当前实例保存 `credential`
16
- 2. 本地 MCP 调用 `auth_use_credential`
17
- 3. MCP 用该 `credential` 请求 apaas `/mcp/auth/context`
18
- 4. 解析并保存 `token / wsId / qfVersion / uid`
19
- 5. 业务工具直接使用这份上下文
20
-
21
- `auth_use_credential` 是本地唯一鉴权主路径。
22
-
23
- 补充说明:
24
-
25
- - 对 stdio MCP 来说,主路径仍然只有 `auth_use_credential`。
26
- - 如果你是在终端里直接使用 `qingflow` CLI,可以额外使用 `qingflow auth login` 作为“人类登录”入口;默认会提示轻流邮箱和隐藏密码,拿到 `token` 后建立本地 CLI 会话。
27
- - 也就是说,这次新增的是 CLI 的登录入口,不是给 MCP 增加第二套会话模型。
28
-
29
- ## npm 安装器适用场景
30
-
31
- 适合这类本地 agent / gateway:
32
-
33
- - Claude Desktop
34
- - Cline / Roo / Cursor 这类本地 MCP 客户端
35
- - OpenClaw 风格的本地 agent 容器或本地 gateway
36
- - 任何支持 `command + args + env` 的 stdio MCP 客户端
37
-
38
- ## 前置条件
39
-
40
- - Node.js >= 16.16
41
- - Python >= 3.11
42
- - 安装过程中可以访问 PyPI
43
-
44
- 如果机器上没有默认 `python3` / `python`,可以先设置:
45
-
46
- ```bash
47
- export QINGFLOW_MCP_PYTHON=/path/to/python3.11
48
- ```
49
-
50
- ## 安装方式
51
-
52
- ### 方式 1:在源码目录预热运行环境
53
-
54
- ```bash
55
- cd qingflow-support/mcp-server
56
- npm install
57
- ```
58
-
59
- 这个模式适合你已经有源码 checkout,只想让当前目录具备本地 agent 可调用的运行时。
60
-
61
- ### 方式 2:全局安装到当前机器
62
-
63
- ```bash
64
- cd qingflow-support/mcp-server
65
- npm install -g .
66
- ```
67
-
68
- ### 方式 3:安装到某个本地 agent workspace
69
-
70
- ```bash
71
- npm install /absolute/path/to/qingflow-support/mcp-server
72
- ```
73
-
74
- ### 方式 4:离线分发 tgz 安装包
75
-
76
- 先在源码目录打包:
77
-
78
- ```bash
79
- cd qingflow-support/mcp-server
80
- npm run pack:npm
81
- ```
82
-
83
- 会生成:
84
-
85
- ```bash
86
- dist/npm/qingflow-tech-qingflow-cli-<version>.tgz
87
- dist/npm/qingflow-cli-<version>.tgz
88
- dist/npm/qingflow-tech-qingflow-app-user-mcp-<version>.tgz
89
- dist/npm/qingflow-tech-qingflow-app-builder-mcp-<version>.tgz
90
- ```
91
-
92
- 然后在目标机器安装:
93
-
94
- ```bash
95
- npx -y -p /absolute/path/to/dist/npm/qingflow-cli-<version>.tgz qingflow-cli install --package /absolute/path/to/dist/npm/qingflow-tech-qingflow-cli-<version>.tgz
96
- npm install /absolute/path/to/dist/npm/qingflow-tech-qingflow-cli-<version>.tgz
97
- npm install /absolute/path/to/dist/npm/qingflow-tech-qingflow-app-user-mcp-<version>.tgz
98
- npm install /absolute/path/to/dist/npm/qingflow-tech-qingflow-app-builder-mcp-<version>.tgz
99
- ```
100
-
101
- 线上官网入口对应:
102
-
103
- ```bash
104
- npx qingflow-cli@latest install
105
- ```
106
-
107
- 安装器只安装真实 CLI 包 `@qingflow-tech/qingflow-cli`。它会先检查 Node.js、npm 和 Python 3.11+;如果 `npm install -g` 因本机全局目录权限失败,安装器会自动 fallback 到用户目录(macOS/Linux 为 `~/.local`,Windows 为当前用户 AppData npm 目录),但不会修改 shell 配置文件;PATH 缺失时会打印需要执行的 shell / PowerShell 命令。排障可加 `--verbose`;如需禁止 fallback 可加 `--no-fallback`。
108
-
109
- 安装时会自动:
110
-
111
- 1. 创建 `.npm-python/`
112
- 2. 在其中建立 Python 虚拟环境
113
- 3. 执行 `pip install .`
114
- 4. 在安装位置暴露对应入口:CLI 包暴露 `qingflow` / `qingflow-skills`;app-user 包暴露 `qingflow-app-user-mcp` / `qingflow-app-user-mcp-skills`;app-builder 包暴露 `qingflow-app-builder-mcp` / `qingflow-app-builder-mcp-skills`
115
- 5. 携带 `skills/<skill-name>/SKILL.md`,但不在 `postinstall` 阶段自动覆盖本机 agent skills
116
-
117
- ## Skills 挂载
118
-
119
- 显式查看包内 skills:
120
-
121
- ```bash
122
- qingflow-skills list
123
- ```
124
-
125
- 独立 MCP split 包使用包专属 skills 命令,避免全局安装多个包时发生 bin 覆盖:
126
-
127
- ```bash
128
- qingflow-app-user-mcp-skills list
129
- qingflow-app-builder-mcp-skills list
130
- ```
131
-
132
- 显式挂载到 Codex 用户目录:
133
-
134
- ```bash
135
- qingflow-skills install --agent codex --scope user
136
- ```
137
-
138
- 如果通过一次性 `npx -p <package>` 执行安装,请加 `--copy`,避免 symlink 指向 npm 临时执行缓存:
139
-
140
- ```bash
141
- npx -y -p @qingflow-tech/qingflow-cli qingflow-skills install --agent codex --scope user --copy
142
- ```
143
-
144
- 也可以挂载到项目级 agent 目录:
145
-
146
- ```bash
147
- qingflow-skills install --agent claude-code --scope project
148
- qingflow-skills install --agent cursor --scope project --copy
149
- qingflow-skills install --agent all --scope project
150
- ```
151
-
152
- 默认行为:
153
-
154
- - `--mode symlink`:使用 symlink,让 npm 包版本成为单一来源
155
- - `--scope user`:安装到用户级 agent skills 目录
156
- - `--agent codex`:目标 agent 为 Codex
157
- - 不覆盖已有同名 skill;需要替换时显式加 `--force`
158
- - 每次安装会在目标 skills 目录下写入 `.qingflow-skill-sources/<skill>.json`,记录 package、version、source、destination、agent、scope、mode
159
-
160
- ## 本地验证
161
-
162
- 如果你在源码目录执行了 `npm install`,可直接这样启动:
163
-
164
- ```bash
165
- cd qingflow-support/mcp-server
166
- node ./npm/bin/qingflow.mjs --help
167
- node ./npm/bin/qingflow-skills.mjs list
168
- node ./npm/bin/qingflow-app-user-mcp.mjs
169
- node ./npm/bin/qingflow-app-builder-mcp.mjs
170
- ```
171
-
172
- 如果你是全局安装对应包:
173
-
174
- ```bash
175
- qingflow --help
176
- qingflow-skills list
177
- qingflow-app-user-mcp
178
- qingflow-app-user-mcp-skills list
179
- qingflow-app-builder-mcp
180
- qingflow-app-builder-mcp-skills list
181
- ```
182
-
183
- 如果你是把包安装到了某个本地 agent workspace,安装对应包后命令通常位于:
184
-
185
- ```bash
186
- /absolute/path/to/agent-workspace/node_modules/.bin/qingflow
187
- /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-skills
188
- /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-user-mcp
189
- /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-user-mcp-skills
190
- /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-builder-mcp
191
- /absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-builder-mcp-skills
192
- ```
193
-
194
- 如果你是从 tgz 安装到某个空目录,命令通常位于:
195
-
196
- ```bash
197
- /absolute/path/to/install-dir/node_modules/.bin/qingflow
198
- /absolute/path/to/install-dir/node_modules/.bin/qingflow-app-user-mcp
199
- /absolute/path/to/install-dir/node_modules/.bin/qingflow-app-builder-mcp
200
- ```
201
-
202
- 这是 stdio MCP server,正常情况下不会输出欢迎信息,而是等待客户端连接。
203
-
204
- ## 客户端配置
205
-
206
- ### 通用 stdio MCP 客户端
207
-
208
- 如果你直接使用源码 checkout:
209
-
210
- ```json
211
- {
212
- "mcpServers": {
213
- "qingflow": {
214
- "command": "node",
215
- "args": [
216
- "/absolute/path/to/qingflow-support/mcp-server/npm/bin/qingflow-app-user-mcp.mjs"
217
- ],
218
- "env": {
219
- "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
220
- "QINGFLOW_MCP_HOME": "/absolute/path/to/.qingflow-mcp",
221
- "QINGFLOW_MCP_CREDIT_METER_ENABLED": "true",
222
- "QINGFLOW_MCP_CREDIT_APAAS_BASE_URL": "https://apaas.internal.example.com",
223
- "QINGFLOW_MCP_CREDIT_APAAS_PATH": "/user/credit/usage"
224
- }
225
- }
226
- }
227
- }
228
- ```
229
-
230
- 如果你已经全局安装:
231
-
232
- ```json
233
- {
234
- "mcpServers": {
235
- "qingflow": {
236
- "command": "qingflow-app-user-mcp",
237
- "args": [],
238
- "env": {
239
- "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
240
- "QINGFLOW_MCP_HOME": "/absolute/path/to/.qingflow-mcp",
241
- "QINGFLOW_MCP_CREDIT_METER_ENABLED": "true",
242
- "QINGFLOW_MCP_CREDIT_APAAS_BASE_URL": "https://apaas.internal.example.com",
243
- "QINGFLOW_MCP_CREDIT_APAAS_PATH": "/user/credit/usage"
244
- }
245
- }
246
- }
247
- }
248
- ```
249
-
250
- 如果你把包安装到了某个本地 agent workspace:
251
-
252
- ```json
253
- {
254
- "mcpServers": {
255
- "qingflow": {
256
- "command": "/absolute/path/to/agent-workspace/node_modules/.bin/qingflow-app-user-mcp",
257
- "args": [],
258
- "env": {
259
- "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
260
- "QINGFLOW_MCP_HOME": "/absolute/path/to/.qingflow-mcp",
261
- "QINGFLOW_MCP_CREDIT_METER_ENABLED": "true",
262
- "QINGFLOW_MCP_CREDIT_APAAS_BASE_URL": "https://apaas.internal.example.com",
263
- "QINGFLOW_MCP_CREDIT_APAAS_PATH": "/user/credit/usage"
264
- }
265
- }
266
- }
267
- }
268
- ```
269
-
270
- ### 使用 npx
271
-
272
- 如果不做全局安装,也可以直接运行独立包:
273
-
274
- ```json
275
- {
276
- "mcpServers": {
277
- "qingflow-user": {
278
- "command": "npx",
279
- "args": [
280
- "-y",
281
- "@qingflow-tech/qingflow-app-user-mcp"
282
- ],
283
- "env": {
284
- "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
285
- "QINGFLOW_MCP_CREDIT_METER_ENABLED": "true",
286
- "QINGFLOW_MCP_CREDIT_APAAS_BASE_URL": "https://apaas.internal.example.com",
287
- "QINGFLOW_MCP_CREDIT_APAAS_PATH": "/user/credit/usage"
288
- }
289
- },
290
- "qingflow-builder": {
291
- "command": "npx",
292
- "args": [
293
- "-y",
294
- "@qingflow-tech/qingflow-app-builder-mcp"
295
- ],
296
- "env": {
297
- "QINGFLOW_MCP_DEFAULT_BASE_URL": "https://qingflow.com/api",
298
- "QINGFLOW_MCP_CREDIT_METER_ENABLED": "true",
299
- "QINGFLOW_MCP_CREDIT_APAAS_BASE_URL": "https://apaas.internal.example.com",
300
- "QINGFLOW_MCP_CREDIT_APAAS_PATH": "/user/credit/usage"
301
- }
302
- }
303
- }
304
- }
305
- ```
306
-
307
- 说明:
308
- - 源码目录 `npm install` 不会把命令加到全局 PATH;这种模式请用 `node ./npm/bin/qingflow.mjs`、`node ./npm/bin/qingflow-app-user-mcp.mjs` 或 `node ./npm/bin/qingflow-app-builder-mcp.mjs`
309
- - `npx` 方式适合临时安装或容器化本地 agent
310
- - 全局安装方式更适合长期固定使用的本机开发环境
311
- - 计费接口使用当前登录会话的 `token` 与 `wsId` 请求头,可通过 `QINGFLOW_MCP_CREDIT_APAAS_BASE_URL/PATH` 覆盖调用记录接口地址
312
-
313
- ## 排障
314
-
315
- 如果安装失败,优先检查:
316
-
317
- 1. `node -v`
318
- 2. `python3 --version`
319
- 3. `pip` 是否能访问 PyPI
320
- 4. 是否设置了错误的 `QINGFLOW_MCP_PYTHON`
321
-
322
- 如果需要重装 Python 侧运行环境,可以删掉:
323
-
324
- ```bash
325
- rm -rf .npm-python
326
- ```
327
-
328
- 然后重新执行:
329
-
330
- ```bash
331
- npm install
332
- ```
333
-
334
- 如果 MCP 客户端一调用工具就报 `Transport closed`,优先检查这几件事:
335
-
336
- 1. 不要混用不同版本的 `@qingflow-tech/qingflow-cli`、`@qingflow-tech/qingflow-app-user-mcp`、`@qingflow-tech/qingflow-app-builder-mcp`
337
- 2. 删除安装目录下的 `.npm-python`
338
- 3. 重新执行 `npm install` 或重新安装对应 tgz/npm 包
339
- 4. 再启动 MCP 客户端
340
-
341
- 现在 stdio MCP 入口会拒绝在启动瞬间“边启动边重建 Python 运行时”,因为安装日志一旦写进 stdout,就会破坏 MCP 握手并表现成 `Transport closed`。如果运行时缺失或版本不一致,入口会直接报错并提示重装,而不是静默自修复。
342
-
343
- ## createClaw 本地接入示例
344
-
345
- 如果 createClaw 已经为当前本地实例保存了 `credential`,推荐在首次建链时调用:
346
-
347
- ```bash
348
- qingflow auth use-credential \
349
- --base-url https://qingflow.com/api \
350
- --credential-stdin
351
- ```
352
-
353
- 然后把 `credential` 写到 stdin。
354
-
355
- 等价 MCP 工具调用参数:
356
-
357
- ```json
358
- {
359
- "profile": "default",
360
- "base_url": "https://qingflow.com/api",
361
- "credential": "1602853_277941",
362
- "persist": false
363
- }
364
- ```
365
-
366
- 说明:
367
-
368
- - 本地会把解析后的 `token` 和原始 `credential` 写入 profile 文件,用于后续 CLI 命令恢复会话
369
- - `persist=true` 时,本地还会优先把解析后的 `token` 和原始 `credential` 同步写入系统 keychain
370
- - 当前工作区以 `/mcp/auth/context` 返回的 `wsId` 为准,不再通过本地 MCP 显式切换
@@ -1,115 +0,0 @@
1
- ---
2
- name: qingflow-mcp-setup
3
- description: Install, connect, authenticate, and troubleshoot the Qingflow MCP server in local AI clients such as Claude Desktop or any stdio-compatible MCP client. Use when the user wants to configure the MCP, verify local startup, log in with token/password, select a workspace, or fix connection/authentication issues.
4
- metadata:
5
- short-description: Install and connect the Qingflow MCP locally
6
- ---
7
-
8
- # Qingflow MCP Setup
9
-
10
- > **Skill 版本**:`qingflow-skills-2026.07.01.04`(入口文档版本;如需确认 CLI 包版本,使用 `qingflow --version` 或 `qingflow --json version`)。
11
-
12
- ## Overview
13
-
14
- This skill sets up the local Qingflow MCP server, connects it to a local AI client, and verifies authentication and workspace selection. Use it for installation, client configuration, token login, and connection troubleshooting.
15
-
16
- ## Workflow
17
-
18
- Follow these steps in order.
19
-
20
- `feedback_submit` is also available as a cross-cutting helper when setup or MCP capability gaps still block the user after reasonable troubleshooting. It does not require Qingflow login or workspace selection, and should be called only after explicit user confirmation.
21
-
22
- Before configuration or live calls, identify the target environment explicitly as `test` or `prod`, then read [references/environments.md](references/environments.md). If the user did not specify one, default to `prod`.
23
-
24
- ### Step 1: Verify the local project path
25
-
26
- Resolve the repository root first. In this repo, the MCP server should live at:
27
-
28
- - `<repo_root>/qingflow-support/mcp-server`
29
-
30
- Key entrypoint:
31
-
32
- - `<repo_root>/qingflow-support/mcp-server/qingflow-mcp`
33
-
34
- If the path differs, stop and update all client config snippets before proceeding.
35
- If the skill is installed under `$CODEX_HOME/skills` instead of the repo-local `.codex/skills`, set `QINGFLOW_MCP_ROOT=<repo_root>/qingflow-support/mcp-server` before running `scripts/check_local_server.sh`.
36
-
37
- ### Step 2: Install local dependencies
38
-
39
- Run:
40
-
41
- ```bash
42
- cd <repo_root>/qingflow-support/mcp-server
43
- python3 -m venv .venv
44
- ./.venv/bin/pip install -e '.[dev]'
45
- ```
46
-
47
- Use `scripts/check_local_server.sh` to verify the entrypoint and virtualenv. The script will first try `QINGFLOW_MCP_ROOT`, then the current git repo, then a repo-local `.codex/skills` layout.
48
-
49
- ### Step 3: Configure the local AI client
50
-
51
- For any stdio-compatible MCP client, map these values:
52
-
53
- - `command`: `<repo_root>/qingflow-support/mcp-server/qingflow-mcp`
54
- - `args`: `[]`
55
- - `env.QINGFLOW_MCP_DEFAULT_BASE_URL`: the target backend URL for the active environment
56
- - `env.QINGFLOW_MCP_DEFAULT_QF_VERSION`: set this when the environment must route to a specific version such as `canary`
57
-
58
- Client-specific snippets:
59
-
60
- - Claude Desktop: read [references/claude-desktop.md](references/claude-desktop.md)
61
- - Generic stdio MCP clients: read [references/generic-stdio.md](references/generic-stdio.md)
62
-
63
- When both test and production are in play, keep separate config snippets or clearly labeled `env` blocks so the user can switch without ambiguity.
64
-
65
- ### Step 4: Validate startup
66
-
67
- The server is a stdio MCP process. A direct terminal launch may print nothing and wait for a client. That is normal.
68
-
69
- Manual startup command:
70
-
71
- ```bash
72
- cd <repo_root>/qingflow-support/mcp-server
73
- ./qingflow-mcp
74
- ```
75
-
76
- Prefer validating through the client after config is added.
77
-
78
- ### Step 5: Use injected session first; authenticate only for setup or recovery
79
-
80
- For Wingent Momo runtime conversations, the session normally already carries the credential-derived token, workspace, and route context. Do not run `auth_use_credential`, `auth_login`, `workspace_list`, or `workspace_select` before ordinary business tools. Start with the smallest read-only business call that fits the task; if it succeeds, continue.
81
-
82
- For a standalone local MCP client that has no injected session, use this setup order:
83
-
84
- 1. `auth_use_credential` or `auth_login`
85
- 2. `workspace_list`
86
- 3. `workspace_select`
87
- 4. Run a small read-only business tool
88
-
89
- `auth_use_credential` gets the selected workspace from the credential context. If the user needs a different workspace after authentication, use `workspace_list` and then `workspace_select`.
90
- After auth, prefer one read-only tool call that returns `request_route` so you can confirm the live `base_url` and `qf_version` before proceeding.
91
- `auth_use_credential` is a tool call, not a custom HTTP header. It exchanges the createClaw credential for a Qingflow token, `wsId`, and when needed `Cookie: qfVersion=...` after the session is established.
92
- Do not run `workspace_select` on production paths unless the user explicitly asks to switch workspace or a business tool clearly reports that no workspace is selected. If `/user` does not return a version lane, the session now falls back to the workspace `systemVersion`.
93
-
94
- ### Step 6: Troubleshoot in the right layer
95
-
96
- - If the client cannot launch the server, check path, execute permission, and `.venv`
97
- - If tools return `auth required`, re-run `auth_use_credential` or `auth_login`
98
- - If tools return `workspace not selected`, call `workspace_list` and `workspace_select`
99
- - If calls fail after a working session, assume token expiry and re-authenticate
100
- - If the browser shows data but MCP does not, compare `request_route` against the browser environment and check whether `qf_version` should be `canary`
101
-
102
- ## Guardrails
103
-
104
- - Never write tokens into the skill files
105
- - In Wingent Momo runtime, trust injected workspace context until a business tool proves otherwise; for standalone clients, confirm workspace with `auth_whoami`, `workspace_select`, or a successful read-only business call.
106
- - When debugging, distinguish server startup issues from Qingflow auth issues
107
- - When the user mentions production, restate the exact `base_url`, `qf_version`, and workspace before any live validation
108
- - If setup is complete but the current MCP capability is still unsupported or the user's need still cannot be satisfied, summarize the gap, ask whether to submit feedback, and call `feedback_submit` only after explicit user confirmation
109
-
110
- ## Resources
111
-
112
- - Environment switching: [references/environments.md](references/environments.md)
113
- - Claude Desktop config: [references/claude-desktop.md](references/claude-desktop.md)
114
- - Generic stdio config: [references/generic-stdio.md](references/generic-stdio.md)
115
- - Local checks: [scripts/check_local_server.sh](scripts/check_local_server.sh)
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Qingflow MCP Setup"
3
- short_description: "Install and connect the Qingflow MCP locally"
4
- default_prompt: "Use $qingflow-mcp-setup to install and connect the Qingflow MCP in a local AI client, and to verify the active base_url, qf_version, auth state, and workspace selection."
@@ -1,34 +0,0 @@
1
- # Claude Desktop
2
-
3
- Use this when the user wants to install Qingflow MCP in Claude Desktop.
4
-
5
- ## Config snippet
6
-
7
- ```json
8
- {
9
- "mcpServers": {
10
- "qingflow": {
11
- "command": "<ABSOLUTE_PATH_TO_REPO>/qingflow-support/mcp-server/qingflow-mcp",
12
- "args": [],
13
- "env": {
14
- "QINGFLOW_MCP_DEFAULT_BASE_URL": "<QINGFLOW_BASE_URL>"
15
- }
16
- }
17
- }
18
- }
19
- ```
20
-
21
- ## Environment examples
22
-
23
- - `prod` (default): set `QINGFLOW_MCP_DEFAULT_BASE_URL` to `https://qingflow.com/api`
24
- - `test`: if needed, set `QINGFLOW_MCP_DEFAULT_BASE_URL` to the explicitly provided non-production backend
25
-
26
- Keep separate snippets for `test` and `prod` so switching environments does not require editing values in-place under pressure.
27
-
28
- ## Notes
29
-
30
- - After updating the config, restart Claude Desktop
31
- - Replace `<ABSOLUTE_PATH_TO_REPO>` with the real checkout path on the current machine
32
- - If the server path changes, update the `command` field
33
- - The server is local stdio MCP, so no remote URL is required
34
- - Do not store Qingflow credentials in Claude Desktop config; pass the createClaw credential through `auth_use_credential` inside the chat, or use `auth_login` when credential exchange is unavailable