@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.
- package/README.md +11 -5
- package/entry_point.py +1 -1
- package/npm/bin/qingflow.mjs +1 -2
- package/npm/lib/runtime.mjs +3 -7
- package/package.json +1 -2
- package/pyproject.toml +1 -3
- package/skills/qingflow-app-form/SKILL.md +23 -11
- package/skills/qingflow-cli/SKILL.md +4 -2
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_FIELD_DATA_TYPES.md +1 -1
- package/skills/qingflow-cli/reference/QINGFLOW_CLI_SCHEMA_APPLY_FIELD_TYPES_AND_SCENARIOS.md +1 -1
- package/skills/qingflow-cli/reference/builder/10-build-single-app.md +3 -3
- package/skills/qingflow-cli/reference/builder/20-build-complete-system.md +1 -1
- package/skills/qingflow-cli/reference/builder/30-schema-fields.md +25 -24
- package/skills/qingflow-cli/reference/builder/40-layout.md +5 -5
- package/skills/qingflow-cli/reference/builder/README.md +3 -3
- package/skills/qingflow-cli/reference/builder/code-integrations/README.md +1 -1
- package/skills/qingflow-cli/reference/builder/reference/app-delivery-sop.md +7 -7
- package/skills/qingflow-cli/reference/core/QINGFLOW_CLI_FIELD_DATA_TYPES.md +1 -1
- package/skills/qingflow-cli/reference/examples/README.md +1 -1
- package/skills/qingflow-common/SKILL.md +47 -0
- package/skills/qingflow-common/agents/openai.yaml +4 -0
- package/src/qingflow_mcp/__main__.py +2 -3
- package/src/qingflow_mcp/app_form_compat.py +11 -27
- package/src/qingflow_mcp/app_form_validator.py +201 -35
- package/src/qingflow_mcp/builder_facade/app_form.py +762 -148
- package/src/qingflow_mcp/builder_facade/app_form_schema.py +114 -3
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +310 -245
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +85 -32
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +82 -30
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +113 -37
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +87 -64
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +83 -28
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +83 -28
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +85 -32
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +95 -40
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +100 -28
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +212 -117
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +82 -27
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +143 -161
- package/src/qingflow_mcp/builder_facade/service.py +3 -2
- package/src/qingflow_mcp/response_trim.py +2 -0
- package/src/qingflow_mcp/server.py +24 -3
- package/src/qingflow_mcp/server_app_builder.py +2 -2
- package/src/qingflow_mcp/tools/record_tools.py +3 -3
- package/src/qingflow_mcp/version.py +2 -4
- package/docs/local-agent-install.md +0 -370
- package/skills/qingflow-mcp-setup/SKILL.md +0 -115
- package/skills/qingflow-mcp-setup/agents/openai.yaml +0 -4
- package/skills/qingflow-mcp-setup/references/claude-desktop.md +0 -34
- package/skills/qingflow-mcp-setup/references/environments.md +0 -62
- package/skills/qingflow-mcp-setup/references/generic-stdio.md +0 -32
- 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
|
-
##
|
|
226
|
+
## Builder Path
|
|
207
227
|
|
|
208
|
-
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
61
|
-
"@qingflow-tech/qingflow-app-builder-mcp",
|
|
60
|
+
"@qingflow-tech/qingflow-mcp",
|
|
62
61
|
"@josephyan/qingflow-cli",
|
|
63
|
-
"@josephyan/qingflow-
|
|
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
|