Qingflow MCP (CRUD)
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Qingflow MCP (CRUD) Query all records in app 'my_app' with field 1003 between 2026-01-01 and 2026-01-31"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Qingflow MCP (CRUD)
This MCP server exposes a canonical, agent-native public surface:
qf_tool_spec_getqf_form_getqf_field_resolveqf_value_probeqf.query.planqf.query.rowsqf.query.recordqf.query.aggregateqf.query.exportqf.records.mutate
Legacy tools still exist internally for compatibility logic, but they are no longer advertised via listTools().
It intentionally excludes delete for now.
Setup
Runtime requirement:
Node.js
>=18
Install dependencies:
npm installSet environment variables:
export QINGFLOW_BASE_URL="https://api.qingflow.com"
export QINGFLOW_ACCESS_TOKEN="your_access_token"Optional:
export QINGFLOW_FORM_CACHE_TTL_MS=300000
export QINGFLOW_REQUEST_TIMEOUT_MS=18000
export QINGFLOW_EXECUTION_BUDGET_MS=20000
export QINGFLOW_ADAPTIVE_PAGING=1
export QINGFLOW_ADAPTIVE_MIN_PAGE_SIZE=20
export QINGFLOW_ADAPTIVE_TARGET_PAGE_MS=1200
export QINGFLOW_EXPORT_MAX_ROWS=10000
export QINGFLOW_EXPORT_DIR="/tmp/qingflow-mcp-exports"Related MCP server: ragic-mcp
Run
Development:
npm run devBuild and run:
npm run build
npm startRun tests:
npm testCommand Line Usage
qingflow-mcp still defaults to MCP stdio mode:
qingflow-mcpUse CLI mode for quick local invocation:
# list all available tools
qingflow-mcp cli tools
# machine-readable tool list
qingflow-mcp cli tools --json
# canonical plan -> execute
qingflow-mcp cli call qf.query.plan --args '{
"kind":"rows",
"query":{
"app_key":"your_app_key",
"select":[1001,1002],
"where":[{"field":1003,"op":"between","from":"2026-01-01","to":"2026-01-31"}],
"limit":20
}
}'
# then execute with returned plan_id
qingflow-mcp cli call qf.query.rows --args '{"plan_id":"plan_xxx"}'CLI Install
Global install from GitHub:
npm i -g git+https://github.com/853046310/qingflow-mcp.gitInstall from npm (pinned version):
npm i -g qingflow-mcp@0.7.0Or one-click installer:
curl -fsSL https://raw.githubusercontent.com/853046310/qingflow-mcp/main/install.sh | bashSafer (review script before execution):
curl -fsSL https://raw.githubusercontent.com/853046310/qingflow-mcp/main/install.sh -o install.sh
less install.sh
bash install.shMCP client config example:
{
"mcpServers": {
"qingflow": {
"command": "qingflow-mcp",
"env": {
"QINGFLOW_BASE_URL": "https://api.qingflow.com",
"QINGFLOW_ACCESS_TOKEN": "your_access_token"
}
}
}
}Recommended Flow
qf_apps_listto pick app.qf_form_getto inspect field ids/titles.qf_field_resolvefor field-name toque_idmapping.qf_value_probewhen the agent needs candidate field values and explicit match evidence.qf_record_createorqf_record_update.If create/update returns only
request_id, callqf_operation_getto resolve async result.
Full calling contract (Chinese):
Canonical Usage
Public agent flow is now:
qf_form_get/qf_field_resolvewhen field mapping is unclearqf_value_probewhen field value candidates are unclearqf.query.planExecute the returned
plan_idwith:qf.query.rowsqf.query.recordqf.query.aggregateqf.query.exportqf.records.mutate
Planner Example
{
"kind": "aggregate",
"query": {
"app_key": "your_app_key",
"where": [
{ "field": 1003, "op": "between", "from": "2026-01-01", "to": "2026-01-31" }
],
"group_by": [1003],
"metrics": [
{ "op": "count" },
{ "column": 1002, "op": "sum" }
],
"strict_full": true
}
}Execute Example
{
"plan_id": "plan_xxx"
}Rules:
Public execute tools require
plan_id.Optional
query/actionecho is only used for drift checking.If execute input drifts from the planned canonical query, the server returns
PLAN_DRIFT.Public filtering uses canonical
where[]; legacyfiltersare no longer part of the public contract.
Aggregate Business Counts
Aggregate business summaries use one canonical count contract:
{
"summary": {
"counts": {
"source_record_count": 370,
"group_assignment_count": 405,
"metric_nonnull_record_count": 395
},
"primary_metric_total": 12272931.75,
"primary_metric_missing_count": 10
}
}Default answer for “多少单/多少条” must read summary.counts.source_record_count.
Completeness
Canonical completeness is technical-only:
is_completeraw_scan_completescan_limit_hitfetched_pagesrequested_pagesactual_scanned_pagesscanned_pagesscan_limithas_morenext_page_tokenstop_reasonoutput_truncatedomitted_itemsomitted_chars
When strict_full=true, any incomplete result fails with INCOMPLETE_RESULT.
Error Protocol
Failures return structured JSON with a machine-readable error.code, for example:
{
"ok": false,
"error": {
"code": "PLAN_REQUIRED",
"message": "...",
"fix_hint": "...",
"retryable": true
}
}Common codes:
PLAN_REQUIREDPLAN_NOT_READYPLAN_DRIFTFORBIDDEN_RUNTIME_ALIASVALIDATION_ERRORINCOMPLETE_RESULTUPSTREAM_TIMEOUTUPSTREAM_API_ERROR
Troubleshooting
If you see runtime errors around Headers or missing web APIs:
Upgrade Node to
>=18.Upgrade package to latest:
npm i -g qingflow-mcp@latestVerify runtime:
node -e "console.log(process.version, typeof fetch, typeof Headers)"Publish
npm login
npm publishIf you publish under an npm scope, use:
npm publish --access publicSecurity Notes
Keep
QINGFLOW_ACCESS_TOKENonly in runtime env vars; do not commit.env.Rotate token immediately if it appears in screenshots, logs, or chat history.
Community
Contributing: CONTRIBUTING.md
Security: SECURITY.md
Conduct: CODE_OF_CONDUCT.md
Available Tools
10 toolsqf_field_resolveQingflow Field ResolveBRead-onlyIdempotent
Resolve natural language field names/aliases into stable que_id mappings for one app.
Inputs: app_key (required), query, queries, top_k, +1 more. Returns: ok, data, meta
qf_form_getQingflow Form GetCRead-onlyIdempotent
Get form metadata and compact field summaries for one app.
Inputs: app_key (required), user_id, force_refresh, include_raw. Returns: ok, data, meta
qf.query.aggregateQingflow Canonical Query AggregateBRead-onlyIdempotent
Aggregate records through the canonical DSL and return metrics_by_column plus query handle resources.
Inputs: plan_id (required), query. Returns: ok, data, meta
qf.query.exportQingflow Canonical Query ExportARead-onlyIdempotent
Export canonical row queries and return resource links instead of large inline payloads.
Inputs: plan_id (required), query. Returns: ok, data, meta
qf.query.planQingflow Canonical Query PlanBRead-onlyIdempotent
Preflight canonical query DSL, normalize loose inputs, translate into internal tools and estimate whether the query is ready for a final conclusion.
Inputs: kind (required), query, action, probe, +1 more. Returns: ok, data, meta
qf.query.recordQingflow Canonical Query RecordCRead-onlyIdempotent
Fetch one record through the canonical DSL and return a query handle.
Inputs: plan_id (required), query. Returns: ok, data, meta
qf.query.rowsQingflow Canonical Query RowsCRead-onlyIdempotent
Query rows through the canonical DSL and return query handles plus resource links.
Inputs: plan_id (required), query. Returns: ok, data, meta
qf.records.mutateQingflow Canonical Records MutateC
Canonical write entry for create/update operations.
Inputs: plan_id (required), action. Returns: ok, data, meta
qf_tool_spec_getQingflow Tool Spec GetARead-onlyIdempotent
Return MCP tool parameter requirements, limits, aliases and minimal examples for agent prompt grounding.
Inputs: tool_name, include_all. Returns: ok, data, meta
qf_value_probeQingflow Value ProbeARead-onlyIdempotent
Probe likely field values for one app field, with explicit match mode and matched value evidence.
Inputs: app_key (required), field (required), query, match_mode, +3 more. Returns: ok, data, meta
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 10 tools
Each tool has a clearly distinct purpose. Query tools (aggregate, export, plan, record, rows) are separated from non-query tools (field resolve, form get, mutate, spec get, value probe), and even within queries, each serves a unique function.
Naming convention is inconsistent: some tools use underscores (qf_field_resolve, qf_form_get, qf_tool_spec_get, qf_value_probe) while others use dot notation (qf.query.aggregate, qf.query.export, etc.). This mixed pattern can confuse an agent.
10 tools is appropriate for a CRUD server with advanced query capabilities. Each tool serves a well-defined purpose without excessive overlap.
Significant gaps exist: no explicit delete operation (qf.records.mutate only mentions create/update), no listing tools for forms or apps, and no field management beyond resolving. This will cause agent failures when delete or listing is needed.
Maintenance
Related MCP Connectors
Query and update Teable records, manage tables, and access the Teable API with AI agents.
Create AgentUI data apps: define tables, read and write records, and run programs on your data.
Give AI agents access to form submissions — read, search, update, and process file attachments.
Query records, run reports and formulas, and insert or update records in Quickbase.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides AI agents with direct access to FileMaker databases through the FileMaker Data API, enabling natural language interactions for querying, managing records, and database introspection.2828 npm4MIT
- AlicenseAqualityDmaintenanceEnables AI agents to interact with Ragic databases via MCP protocol, supporting form exploration, data CRUD, approval, and locking operations.11MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with the FormIO API for dynamic form creation, submission management, and user roles using natural language.-
- AlicenseBqualityDmaintenanceEnables AI agents to perform CRUD operations, query data, fetch schemas, and execute custom operations on Microsoft Dynamics 365 CRM entities.1024 npm2MIT