Goal
Use NocoBase MCP tools to locate the right collection, query business data safely, and produce reliable summaries or grouped analysis.
Prerequisite
- NocoBase MCP must already be reachable and authenticated.
- If MCP returns authentication errors such as
Auth required, stop and ask the user to refresh MCP authentication before continuing.
Default strategy
- Inspect the data source path first.
- Prefer the
main data source.
- If the target collection is not in
main, inspect other enabled data sources.
- Once the collection is located, use that
dataSource explicitly in every subsequent resource_* call.
- Prefer
resource_query for counts and grouped analysis only after confirming the query parameter contract.
- Fall back to
resource_list plus manual counting when query results are suspicious or need cross-checking.
Useful references:
references/analysis-patterns.md for common business analysis shapes
references/metric-checklist.md for metric definition and scope checks
references/entity-mapping.md for mapping business terms to collections and fields
Data source discovery
- If the user explicitly names a data source, use it directly.
- Otherwise start with
main.
- When the target collection is not found in
main, call data_sources:list_enabled and inspect other enabled data sources one by one.
- If multiple data sources contain the same collection name:
- default to
main when main is one of them;
- otherwise present the candidates and explain which one you are using.
- In the final answer, state which data source was used.
Collection discovery
- If the user gives a collection name, verify it exists before querying.
- If the user uses business terms such as "leads", "users", "orders", or "opportunities", inspect collection metadata to map the business term to the actual collection name.
- Prefer
collections:listMeta for a fast overview.
- Then use
collections:get with appends: ["fields"] when you need exact field names, relation targets, or enum options.
- Use
references/entity-mapping.md as a reusable heuristic for common business nouns and likely field categories.
Query contract checks
Before using resource_query, verify the request shape matches the real backend contract:
measures[].aggregation, not aggregate
orders[].order, not direction
field should usually be passed as a field path array such as ["id"] or ["owner", "nickname"]
- Use
alias whenever the result will be referenced in output or having
Correct examples:
{
"resource": "lead",
"dataSource": "main",
"measures": [
{ "aggregation": "count", "field": ["id"], "alias": "lead_count" }
]
}
{
"resource": "lead",
"dataSource": "main",
"dimensions": [
{ "field": ["status"], "alias": "status" }
],
"measures": [
{ "aggregation": "count", "field": ["id"], "alias": "lead_count" }
],
"orders": [
{ "field": ["status"], "alias": "status", "order": "asc" }
]
}
Recommended workflow
1. Confirm reachability
- Use
auth:check.
- If authentication fails, stop.
2. Find the collection
- First inspect
main.
- If not found, inspect other enabled data sources.
- Read fields before querying if field names or relations are uncertain.
3. Start with simple counts
- Use
resource_query with a single count(id) measure.
- Keep the first query minimal so you can validate the result shape quickly.
4. Add grouped analysis
Common grouped views:
- by status
- by owner
- by source
- by department
- by created date or month
For relation labels, use field paths such as:
["owner", "nickname"]
["mainDepartment", "title"]
5. Cross-check when needed
Re-check with resource_list when:
- the grouped rows look duplicated unexpectedly;
- the numeric result looks like record IDs instead of counts;
- totals do not match between summary and grouped output;
- the collection may be affected by ACL scope or hidden filters.
When cross-checking:
- fetch enough rows to cover the visible dataset or use pagination;
- count and group manually from the returned records;
- compare the manual result with
resource_query.
6. Present the result
Report:
- the collection used;
- the data source used;
- the total count;
- the key grouped breakdowns;
- any caveat such as ACL scope, null values, or fallback to manual verification.
Analysis entry points
Classify the user request before querying:
overview for current totals and main distributions
distribution for grouped counts by status, owner, source, team, or department
funnel for stage-based business progression
trend for date or month-based change over time
ranking for top owners, sources, accounts, or products
quality-check for missing values, null-heavy fields, suspicious statuses, or orphaned relations
Use references/analysis-patterns.md for the recommended query shapes for each pattern.
Metric definition checks
Before returning an answer, verify the metric scope:
- what time range is included
- which time field drives the range
- whether the metric is total count, distinct count, sum, or average
- whether archived, inactive, null, or other terminal states should be included
- whether grouped totals reconcile with the grand total
Use references/metric-checklist.md when the user request is ambiguous or the metric may be interpreted in more than one way.
Common pitfalls
- Do not assume the collection is in
main; check main first, then search other enabled data sources.
- Do not omit
dataSource after the collection has been located.
- Do not use
aggregate in query measures; the backend expects aggregation.
- Do not use
direction in query orders; the backend expects order.
- Do not assume suspicious aggregate output is correct.
- If a "count" result looks like
36, 54, 80, or another plausible record ID, verify whether aggregation was actually applied.
- Relation label grouping requires the real relation path and target field, not guessed labels.
Verification checklist
- MCP is authenticated.
- The collection exists in the chosen data source.
- The fields used in
dimensions, measures, orders, and filter actually exist.
resource_query uses aggregation and order.
- Summary totals match grouped totals, or any mismatch is explained.
- The final answer states the data source and any verification fallback used.
1---2name: nocobase-data-analysis3description: Query and analyze business data in NocoBase via MCP. Use when users want current counts, grouped breakdowns, owner/source distributions, or business summaries across collections, with main data source first and fallback discovery to other enabled data sources.4---56# Goal78Use NocoBase MCP tools to locate the right collection, query business data safely, and produce reliable summaries or grouped analysis.910# Prerequisite1112- NocoBase MCP must already be reachable and authenticated.13- If MCP returns authentication errors such as `Auth required`, stop and ask the user to refresh MCP authentication before continuing.1415# Default strategy16171. Inspect the data source path first.182. Prefer the `main` data source.193. If the target collection is not in `main`, inspect other enabled data sources.204. Once the collection is located, use that `dataSource` explicitly in every subsequent `resource_*` call.215. Prefer `resource_query` for counts and grouped analysis only after confirming the query parameter contract.226. Fall back to `resource_list` plus manual counting when query results are suspicious or need cross-checking.2324Useful references:2526- `references/analysis-patterns.md` for common business analysis shapes27- `references/metric-checklist.md` for metric definition and scope checks28- `references/entity-mapping.md` for mapping business terms to collections and fields2930# Data source discovery3132- If the user explicitly names a data source, use it directly.33- Otherwise start with `main`.34- When the target collection is not found in `main`, call `data_sources:list_enabled` and inspect other enabled data sources one by one.35- If multiple data sources contain the same collection name:36 - default to `main` when `main` is one of them;37 - otherwise present the candidates and explain which one you are using.38- In the final answer, state which data source was used.3940# Collection discovery4142- If the user gives a collection name, verify it exists before querying.43- If the user uses business terms such as "leads", "users", "orders", or "opportunities", inspect collection metadata to map the business term to the actual collection name.44- Prefer `collections:listMeta` for a fast overview.45- Then use `collections:get` with `appends: ["fields"]` when you need exact field names, relation targets, or enum options.46- Use `references/entity-mapping.md` as a reusable heuristic for common business nouns and likely field categories.4748# Query contract checks4950Before using `resource_query`, verify the request shape matches the real backend contract:5152- `measures[].aggregation`, not `aggregate`53- `orders[].order`, not `direction`54- `field` should usually be passed as a field path array such as `["id"]` or `["owner", "nickname"]`55- Use `alias` whenever the result will be referenced in output or `having`5657Correct examples:5859```json60{61 "resource": "lead",62 "dataSource": "main",63 "measures": [64 { "aggregation": "count", "field": ["id"], "alias": "lead_count" }65 ]66}67```6869```json70{71 "resource": "lead",72 "dataSource": "main",73 "dimensions": [74 { "field": ["status"], "alias": "status" }75 ],76 "measures": [77 { "aggregation": "count", "field": ["id"], "alias": "lead_count" }78 ],79 "orders": [80 { "field": ["status"], "alias": "status", "order": "asc" }81 ]82}83```8485# Recommended workflow8687## 1. Confirm reachability8889- Use `auth:check`.90- If authentication fails, stop.9192## 2. Find the collection9394- First inspect `main`.95- If not found, inspect other enabled data sources.96- Read fields before querying if field names or relations are uncertain.9798## 3. Start with simple counts99100- Use `resource_query` with a single `count(id)` measure.101- Keep the first query minimal so you can validate the result shape quickly.102103## 4. Add grouped analysis104105Common grouped views:106107- by status108- by owner109- by source110- by department111- by created date or month112113For relation labels, use field paths such as:114115- `["owner", "nickname"]`116- `["mainDepartment", "title"]`117118## 5. Cross-check when needed119120Re-check with `resource_list` when:121122- the grouped rows look duplicated unexpectedly;123- the numeric result looks like record IDs instead of counts;124- totals do not match between summary and grouped output;125- the collection may be affected by ACL scope or hidden filters.126127When cross-checking:128129- fetch enough rows to cover the visible dataset or use pagination;130- count and group manually from the returned records;131- compare the manual result with `resource_query`.132133## 6. Present the result134135Report:136137- the collection used;138- the data source used;139- the total count;140- the key grouped breakdowns;141- any caveat such as ACL scope, null values, or fallback to manual verification.142143# Analysis entry points144145Classify the user request before querying:146147- `overview` for current totals and main distributions148- `distribution` for grouped counts by status, owner, source, team, or department149- `funnel` for stage-based business progression150- `trend` for date or month-based change over time151- `ranking` for top owners, sources, accounts, or products152- `quality-check` for missing values, null-heavy fields, suspicious statuses, or orphaned relations153154Use `references/analysis-patterns.md` for the recommended query shapes for each pattern.155156# Metric definition checks157158Before returning an answer, verify the metric scope:159160- what time range is included161- which time field drives the range162- whether the metric is total count, distinct count, sum, or average163- whether archived, inactive, null, or other terminal states should be included164- whether grouped totals reconcile with the grand total165166Use `references/metric-checklist.md` when the user request is ambiguous or the metric may be interpreted in more than one way.167168# Common pitfalls169170- Do not assume the collection is in `main`; check `main` first, then search other enabled data sources.171- Do not omit `dataSource` after the collection has been located.172- Do not use `aggregate` in query measures; the backend expects `aggregation`.173- Do not use `direction` in query orders; the backend expects `order`.174- Do not assume suspicious aggregate output is correct.175- If a "count" result looks like `36`, `54`, `80`, or another plausible record ID, verify whether aggregation was actually applied.176- Relation label grouping requires the real relation path and target field, not guessed labels.177178# Verification checklist179180- MCP is authenticated.181- The collection exists in the chosen data source.182- The fields used in `dimensions`, `measures`, `orders`, and `filter` actually exist.183- `resource_query` uses `aggregation` and `order`.184- Summary totals match grouped totals, or any mismatch is explained.185- The final answer states the data source and any verification fallback used.