Skip to main content
Glama
Qingflow MCP (CRUD)

Qingflow MCP (CRUD)

by 853046310

Qingflow MCP (CRUD)

This MCP server exposes a canonical, agent-native public surface:

  • qf_tool_spec_get

  • qf_form_get

  • qf_field_resolve

  • qf_value_probe

  • qf.query.plan

  • qf.query.rows

  • qf.query.record

  • qf.query.aggregate

  • qf.query.export

  • qf.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

  1. Install dependencies:

npm install
  1. Set 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 dev

Build and run:

npm run build
npm start

Run tests:

npm test

Command Line Usage

qingflow-mcp still defaults to MCP stdio mode:

qingflow-mcp

Use 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.git

Install from npm (pinned version):

npm i -g qingflow-mcp@0.7.0

Or one-click installer:

curl -fsSL https://raw.githubusercontent.com/853046310/qingflow-mcp/main/install.sh | bash

Safer (review script before execution):

curl -fsSL https://raw.githubusercontent.com/853046310/qingflow-mcp/main/install.sh -o install.sh
less install.sh
bash install.sh

MCP client config example:

{
  "mcpServers": {
    "qingflow": {
      "command": "qingflow-mcp",
      "env": {
        "QINGFLOW_BASE_URL": "https://api.qingflow.com",
        "QINGFLOW_ACCESS_TOKEN": "your_access_token"
      }
    }
  }
}
  1. qf_apps_list to pick app.

  2. qf_form_get to inspect field ids/titles.

  3. qf_field_resolve for field-name to que_id mapping.

  4. qf_value_probe when the agent needs candidate field values and explicit match evidence.

  5. qf_record_create or qf_record_update.

  6. If create/update returns only request_id, call qf_operation_get to resolve async result.

Full calling contract (Chinese):

Canonical Usage

Public agent flow is now:

  1. qf_form_get / qf_field_resolve when field mapping is unclear

  2. qf_value_probe when field value candidates are unclear

  3. qf.query.plan

  4. Execute the returned plan_id with:

    • qf.query.rows

    • qf.query.record

    • qf.query.aggregate

    • qf.query.export

    • qf.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:

  1. Public execute tools require plan_id.

  2. Optional query / action echo is only used for drift checking.

  3. If execute input drifts from the planned canonical query, the server returns PLAN_DRIFT.

  4. Public filtering uses canonical where[]; legacy filters are 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_complete

  • raw_scan_complete

  • scan_limit_hit

  • fetched_pages

  • requested_pages

  • actual_scanned_pages

  • scanned_pages

  • scan_limit

  • has_more

  • next_page_token

  • stop_reason

  • output_truncated

  • omitted_items

  • omitted_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_REQUIRED

  • PLAN_NOT_READY

  • PLAN_DRIFT

  • FORBIDDEN_RUNTIME_ALIAS

  • VALIDATION_ERROR

  • INCOMPLETE_RESULT

  • UPSTREAM_TIMEOUT

  • UPSTREAM_API_ERROR

Troubleshooting

If you see runtime errors around Headers or missing web APIs:

  1. Upgrade Node to >=18.

  2. Upgrade package to latest:

npm i -g qingflow-mcp@latest
  1. Verify runtime:

node -e "console.log(process.version, typeof fetch, typeof Headers)"

Publish

npm login
npm publish

If you publish under an npm scope, use:

npm publish --access public

Security Notes

  1. Keep QINGFLOW_ACCESS_TOKEN only in runtime env vars; do not commit .env.

  2. Rotate token immediately if it appears in screenshots, logs, or chat history.

Community

Available Tools

10 tools
qf_field_resolveQingflow Field ResolveB
Read-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 GetC
Read-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 AggregateB
Read-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 ExportA
Read-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 PlanB
Read-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 RecordC
Read-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 RowsC
Read-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 GetA
Read-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 ProbeA
Read-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

    B3.1/5.0

    Scored across 10 tools

    Disambiguation5/5

    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 Consistency2/5

    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.

    Tool Count5/5

    10 tools is appropriate for a CRUD server with advanced query capabilities. Each tool serves a well-defined purpose without excessive overlap.

    Completeness2/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Provides AI agents with direct access to FileMaker databases through the FileMaker Data API, enabling natural language interactions for querying, managing records, and database introspection.
      28
      28 npm
      4
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI agents to interact with Ragic databases via MCP protocol, supporting form exploration, data CRUD, approval, and locking operations.
      11
      MIT
    • A
      license
      B
      quality
      D
      maintenance
      Enables AI agents to perform CRUD operations, query data, fetch schemas, and execute custom operations on Microsoft Dynamics 365 CRM entities.
      10
      24 npm
      2
      MIT