NocoDB MCP Tools Reference
All tools use the mcp__nocodb__ prefix. Every tool call goes through the NocoDB MCP server.
Discovery Tools
Use these first to understand what data is available.
| Tool |
Purpose |
Key Parameters |
getBaseInfo |
Get base name, ID, and metadata |
None |
getTablesList |
List all tables you can access |
None |
getTableSchema |
Get columns, types, and views for a table |
tableId |
Always start with getTablesList to get table IDs. You need a tableId for almost every other tool.
Read Tools
Retrieve data without changing anything.
| Tool |
Purpose |
Key Parameters |
queryRecords |
Search and list records with filters, sorting, and pagination |
tableId, where, fields[], sort[], page, pageSize |
getRecord |
Fetch one specific record by its ID |
tableId, recordId, fields |
countRecords |
Count how many records match a filter |
tableId, where |
Write Tools
Create, change, or remove data.
| Tool |
Purpose |
Key Parameters |
createRecords |
Add new records (single or bulk, up to 2000) |
tableId, records[{fields:{}}] |
updateRecords |
Change existing records (send only changed fields) |
tableId, records[{id, fields:{}}] |
deleteRecords |
Remove records permanently |
tableId, records[{id}] |
Analytics Tools
Run calculations across your data.
| Tool |
Purpose |
Key Parameters |
aggregate |
Sum, count, average, min, max, median, std_dev, and more |
tableId, aggregations[{field, type}], filterGroups[{alias, where}] |
File Tools
Work with file attachments stored in records.
| Tool |
Purpose |
Key Parameters |
readAttachment |
Read files attached to a record |
files[] |
Filter Syntax
Filters use the format: (field,operator,value)
Operators:
| Category |
Operators |
| Comparison |
eq, neq, gt, lt, gte, lte |
| Range |
btw, nbtw |
| Text |
like, nlike |
| List |
in, allof, anyof, nallof, nanyof |
| Empty checks |
blank, notblank, null, notnull, empty, notempty |
| Checkbox |
checked, notchecked |
Combine filters with ~and, ~or, ~not:
(Status,eq,Active)~and(Priority,eq,High)
Common Patterns
Pattern 1 -- List with filter and sort
Find all active orders sorted by date, showing only key fields:
Tool: mcp__nocodb__queryRecords
Params:
tableId: <orders_table_id>
where: "(Status,eq,Active)"
fields: ["Order Number", "Customer", "Total", "Date"]
sort: ["-Date"]
pageSize: 25
Prefix a field name with - to sort descending.
Pattern 2 -- Create and verify
Add a new record, then confirm it was saved:
Step 1 - Tool: mcp__nocodb__createRecords
Params:
tableId: <contacts_table_id>
records: [{ "fields": { "Name": "Jane Smith", "Email": "jane@example.com" } }]
Step 2 - Tool: mcp__nocodb__queryRecords
Params:
tableId: <contacts_table_id>
where: "(Email,eq,jane@example.com)"
Pattern 3 -- Aggregate report
Get total revenue and order count, split by status:
Tool: mcp__nocodb__aggregate
Params:
tableId: <orders_table_id>
aggregations: [
{ "field": "Total", "type": "sum" },
{ "field": "Id", "type": "count" }
]
filterGroups: [
{ "alias": "Active", "where": "(Status,eq,Active)" },
{ "alias": "Completed", "where": "(Status,eq,Completed)" }
]
Best Practices
- Resolve table IDs first -- always call
getTablesList before operating on data. Never guess IDs.
- Check the schema -- call
getTableSchema to confirm exact field names and types before querying.
- Use pagination -- set
pageSize (default is 25, max is 2000) and use page for large datasets.
- Filter on the server -- apply
where filters instead of fetching all records and filtering locally.
- Request only needed fields -- use
fields[] to limit returned data and keep responses fast.
- Bulk operations -- prefer batch calls (up to 2000 records) over looping one-by-one.
Error Handling
| Error |
Meaning |
What to Do |
| "Table not found" |
Wrong tableId |
Re-run getTablesList and use the correct ID |
| "Field not found" |
Typo or wrong field name |
Run getTableSchema to see exact field names |
| "Invalid filter" |
Bad where syntax |
Check parentheses and operator spelling |
| "Record not found" |
Wrong recordId |
Query first to confirm the record exists |
| "Too many records" |
Batch exceeds 2000 limit |
Split into smaller batches |
| 401 / 403 |
Auth or permission issue |
See the setup skill for troubleshooting |
1---2name: mcp-patterns-23description: NocoDB MCP tools reference -- available tools, parameters, and usage patterns. Use when: - "what NocoDB tools are available?" - "how do I query records?" - "show me NocoDB MCP parameters" - "which tool do I use for..." - "NocoDB tool reference"4---56# NocoDB MCP Tools Reference78All tools use the `mcp__nocodb__` prefix. Every tool call goes through the NocoDB MCP server.910## Discovery Tools1112Use these first to understand what data is available.1314| Tool | Purpose | Key Parameters |15|------|---------|---------------|16| `getBaseInfo` | Get base name, ID, and metadata | None |17| `getTablesList` | List all tables you can access | None |18| `getTableSchema` | Get columns, types, and views for a table | `tableId` |1920**Always start with `getTablesList`** to get table IDs. You need a `tableId` for almost every other tool.2122## Read Tools2324Retrieve data without changing anything.2526| Tool | Purpose | Key Parameters |27|------|---------|---------------|28| `queryRecords` | Search and list records with filters, sorting, and pagination | `tableId`, `where`, `fields[]`, `sort[]`, `page`, `pageSize` |29| `getRecord` | Fetch one specific record by its ID | `tableId`, `recordId`, `fields` |30| `countRecords` | Count how many records match a filter | `tableId`, `where` |3132## Write Tools3334Create, change, or remove data.3536| Tool | Purpose | Key Parameters |37|------|---------|---------------|38| `createRecords` | Add new records (single or bulk, up to 2000) | `tableId`, `records[{fields:{}}]` |39| `updateRecords` | Change existing records (send only changed fields) | `tableId`, `records[{id, fields:{}}]` |40| `deleteRecords` | Remove records permanently | `tableId`, `records[{id}]` |4142## Analytics Tools4344Run calculations across your data.4546| Tool | Purpose | Key Parameters |47|------|---------|---------------|48| `aggregate` | Sum, count, average, min, max, median, std_dev, and more | `tableId`, `aggregations[{field, type}]`, `filterGroups[{alias, where}]` |4950## File Tools5152Work with file attachments stored in records.5354| Tool | Purpose | Key Parameters |55|------|---------|---------------|56| `readAttachment` | Read files attached to a record | `files[]` |5758---5960## Filter Syntax6162Filters use the format: `(field,operator,value)`6364**Operators:**6566| Category | Operators |67|----------|----------|68| Comparison | `eq`, `neq`, `gt`, `lt`, `gte`, `lte` |69| Range | `btw`, `nbtw` |70| Text | `like`, `nlike` |71| List | `in`, `allof`, `anyof`, `nallof`, `nanyof` |72| Empty checks | `blank`, `notblank`, `null`, `notnull`, `empty`, `notempty` |73| Checkbox | `checked`, `notchecked` |7475**Combine filters** with `~and`, `~or`, `~not`:7677```78(Status,eq,Active)~and(Priority,eq,High)79```8081---8283## Common Patterns8485### Pattern 1 -- List with filter and sort8687Find all active orders sorted by date, showing only key fields:8889```90Tool: mcp__nocodb__queryRecords91Params:92 tableId: <orders_table_id>93 where: "(Status,eq,Active)"94 fields: ["Order Number", "Customer", "Total", "Date"]95 sort: ["-Date"]96 pageSize: 2597```9899Prefix a field name with `-` to sort descending.100101### Pattern 2 -- Create and verify102103Add a new record, then confirm it was saved:104105```106Step 1 - Tool: mcp__nocodb__createRecords107Params:108 tableId: <contacts_table_id>109 records: [{ "fields": { "Name": "Jane Smith", "Email": "jane@example.com" } }]110111Step 2 - Tool: mcp__nocodb__queryRecords112Params:113 tableId: <contacts_table_id>114 where: "(Email,eq,jane@example.com)"115```116117### Pattern 3 -- Aggregate report118119Get total revenue and order count, split by status:120121```122Tool: mcp__nocodb__aggregate123Params:124 tableId: <orders_table_id>125 aggregations: [126 { "field": "Total", "type": "sum" },127 { "field": "Id", "type": "count" }128 ]129 filterGroups: [130 { "alias": "Active", "where": "(Status,eq,Active)" },131 { "alias": "Completed", "where": "(Status,eq,Completed)" }132 ]133```134135---136137## Best Practices1381391. **Resolve table IDs first** -- always call `getTablesList` before operating on data. Never guess IDs.1402. **Check the schema** -- call `getTableSchema` to confirm exact field names and types before querying.1413. **Use pagination** -- set `pageSize` (default is 25, max is 2000) and use `page` for large datasets.1424. **Filter on the server** -- apply `where` filters instead of fetching all records and filtering locally.1435. **Request only needed fields** -- use `fields[]` to limit returned data and keep responses fast.1446. **Bulk operations** -- prefer batch calls (up to 2000 records) over looping one-by-one.145146## Error Handling147148| Error | Meaning | What to Do |149|-------|---------|-----------|150| "Table not found" | Wrong `tableId` | Re-run `getTablesList` and use the correct ID |151| "Field not found" | Typo or wrong field name | Run `getTableSchema` to see exact field names |152| "Invalid filter" | Bad `where` syntax | Check parentheses and operator spelling |153| "Record not found" | Wrong `recordId` | Query first to confirm the record exists |154| "Too many records" | Batch exceeds 2000 limit | Split into smaller batches |155| 401 / 403 | Auth or permission issue | See the **setup** skill for troubleshooting |