AI tools
32 tools an AI assistant can use on farm data through the MCP server. Every tool is read-only; none controls devices.
Connect
- Add the MCP server to your assistant (ChatGPT, Claude, Copilot, Cursor, Gemini, Grok…):
https://mcp.nextfarm.vn/mcp - Sign in with OAuth and pick a farm, or send an API key in the Authorization header.
- The assistant only sees tools within the granted scopes. MCP guide →
Maps & seasons · 9
farm_overviewParcel area summaryParcel area grouped by household, zone or crop: number of households, parcels, total area (ha) and parcels without a boundary. Sorted by area, largest first.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
crop_type_id | string | Only one crop type |
group_by | string | Group by: owner · zone · crop |
page_size | integer | Maximum number of groups |
status | string | Parcel status |
zone_id | string | Only one zone |
{
"group_by": "zone"
}gis_crop_types_listCrop typesThe farm's crop type catalogue: code, name and category. Use the crop type ID to filter parcels, seasons and yields.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
category | string | Crop category (e.g. rice, fruit trees) |
gis_farmers_listHouseholdsFarmer households / members of the sourcing area: name, zone, group and member type. Filter by zone, group or type.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
groupId | string | Only one household group |
memberType | string | Member type |
pageSize | integer | Maximum rows |
zoneId | string | Only one zone |
gis_parcels_getParcel detailOne parcel: name, code, area, zone, owner, current crop and status.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
id * | string | Parcel ID (UUID) |
{
"id": "0190a3c2-5b1e-7c3d-8e4f-000000000001"
}gis_parcels_listParcelsThe farm's parcels: code, area (ha), zone, owner, current crop and status. Filter by zone, crop or status.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
crop_type_id | string | Only one crop type |
page | integer | Page, from 1 |
page_size | integer | Rows per page |
status | string | Parcel status |
zone_id | string | Only one zone |
{
"page": 1,
"page_size": 50
}gis_searchSearch parcels, zones, farmers, seasonsSearch parcels, seasons, farmers and zones by keyword; groups outside the key's scopes come back empty.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
limit | integer | Maximum results per group |
q * | string | Keyword, diacritics optional |
{
"q": "A-12"
}gis_seasons_groupsSeason groups of a yearSeasons with the same crop and season name across parcels in one year (e.g. Rice · Winter-Spring): parcel count, total area, earliest/latest planting date.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
branchId | string | Only one branch / cooperative |
year * | integer | Year |
{
"year": 2026
}gis_seasons_listSeasonsSeasons for one parcel (cultivation history) or for a year: crop, season name, planting date, expected harvest date and status. Provide a parcel or a year.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
parcelId | string | Parcel ID |
year | integer | Year (e.g. 2026) |
{
"year": 2026
}gis_zones_statsZone statisticsNumber of parcels and total area (ha) of one zone.
Scope: gis:read
| Parameter | Type | Description |
|---|---|---|
id * | string | Zone ID (UUID) |
Harvest & traceability · 8
certification_expiringExpiring certificatesCertificates (VietGAP, GlobalGAP, organic…) about to expire or already expired, sorted by expiry date.
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
include_expired | boolean | Include already expired certificates |
within_days | integer | Expiring within this many days (default 30) |
{
"within_days": 60
}harvest_phi_activeParcels under pre-harvest intervalParcels, ponds and pens currently under a pesticide pre-harvest interval or veterinary withdrawal period: earliest safe date and the blocking application.
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
on | string | Check date (yyyy-MM-dd, default today) |
harvest_record_listHarvest recordsDeclared harvest records: parcel, crop, declared yield (kg), status (draft · confirmed · verified · collected · void), harvest date and traceability lot.
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
page | integer | Page, from 1 |
page_size | integer | Rows per page |
status | string | Filter by status |
{
"status": "confirmed"
}harvest_searchSearch harvests, labels, certificatesSearch harvest records, QR labels and certificates by keyword (record code, label code, certificate name).
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
limit | integer | Maximum results per group |
q * | string | Keyword |
{
"q": "VietGAP"
}harvest_summaryYield summaryHarvested yield (confirmed records only) grouped by household, zone, crop or parcel within a harvest date range. Sorted by total kg, largest first.
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
crop_type_id | string | Only one crop type |
from | string | Harvest date from (yyyy-MM-dd) |
group_by | string | parcel · crop · zone · owner |
to | string | Harvest date to (yyyy-MM-dd) |
zone_id | string | Only one zone |
{
"from": "2026-10-01",
"group_by": "crop",
"to": "2026-10-31"
}harvest_trace_getTraceability lot detailOne traceability lot: cultivation log, certificates and photos — what a buyer sees when scanning the QR label.
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
id * | string | Traceability lot ID (UUID) |
harvest_trace_listTraceability lotsPublished traceability lots of the farm: parcel, zone, product, certification, harvest date, farmer and number of stages.
Scope: harvest:read
phi_statusPre-harvest interval of a parcelWhether a parcel is still within a pesticide pre-harvest interval, the earliest safe harvest date and the application holding it.
Scope: harvest:read
| Parameter | Type | Description |
|---|---|---|
on | string | Check date (yyyy-MM-dd, default today) |
parcel_id * | string | Parcel ID (UUID) |
IoT (read-only) · 8
iot_alerts_listSensor alertsSensor threshold alerts: device, metric, value, threshold, severity and handling status.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
device_id | string | One device |
from | string | From |
page | integer | Page |
page_size | integer | Rows per page |
severity | string | Severity |
status | string | Status (e.g. triggered, acknowledged, resolved) |
to | string | To |
{
"status": "triggered"
}iot_command_statusDevice commandsLatest commands sent to one controller: command type, status, sent time and whether the device acknowledged it.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
device_id * | string | Controller ID (UUID) |
limit | integer | Number of commands (max 20) |
iot_device_listIoT devicesThe farm's IoT devices: name, type, online or offline, last report time. Filter by status, parcel or zone.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
page | integer | Page, from 1 |
page_size | integer | Rows per page |
parcel_id | string | Only devices of one parcel |
status | string | online · offline · active · inactive · maintenance |
zone_id | string | Only devices of one zone |
{
"status": "offline"
}iot_devices_searchSearch devicesSearch devices by name or code.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
limit | integer | Maximum results |
q * | string | Keyword |
{
"q": "NK2"
}iot_irrigation_outputsController valves and pumpsIrrigation outputs of one controller: type (pump, zone valve, fertigation), index and the user-given name (e.g. 'Block A').
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
device_id * | string | Controller ID (UUID) |
iot_readings_historyReading historySensor reading history for a device or zone within a time range, newest first.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
device_id | string | One device |
from | string | From (ISO 8601) |
page | integer | Page, from 1 |
page_size | integer | Rows per page (max 500) |
to | string | To (ISO 8601) |
zone_id | string | One zone |
{
"from": "2026-10-27",
"to": "2026-10-28"
}iot_readings_latestLatest readingsThe latest value of each sensor (temperature, humidity, EC, pH…) for the whole farm or one zone.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
zone_id | string | Only sensors of one zone |
iot_schedule_upcomingUpcoming irrigation runsUpcoming scheduled irrigation runs: controller, start time, duration (seconds), valves, skipped or already run.
Scope: iot:read
| Parameter | Type | Description |
|---|---|---|
days | integer | Number of days ahead (1–7) |
device_id | string | Only one controller |
from | string | From date (yyyy-MM-dd, default today) |
{
"days": 2
}Farm books & tasks · 5
office_automations_listAutomation rulesThe farm's automation rules: name, status, trigger type and last run.
Scope: office:read
| Parameter | Type | Description |
|---|---|---|
page | integer | Page, from 1 |
page_size | integer | Rows per page |
search | string | Keyword |
status | string | Status |
office_books_fieldsTable columnsColumns of one table: name, data type and options — needed to read row values correctly.
Scope: office:read
| Parameter | Type | Description |
|---|---|---|
table_id * | string | Table ID (UUID) |
office_books_listFarm booksThe farm's custom books (logs, inventory, costs…): name, description and number of tables.
Scope: office:read
| Parameter | Type | Description |
|---|---|---|
page | integer | Page, from 1 |
page_size | integer | Rows per page |
search | string | Keyword |
office_books_recordsTable rowsRead rows of a book table, paginated; values keyed by column ID.
Scope: office:read
| Parameter | Type | Description |
|---|---|---|
page | integer | Page, from 1 |
page_size | integer | Rows per page |
table_id * | string | Table ID (UUID) |
office_books_tablesBook tablesTables inside one farm book.
Scope: office:read
| Parameter | Type | Description |
|---|---|---|
app_id * | string | Book ID (UUID) |
Reports · 2
report_catalogReport catalogueAvailable farm reports: code, name, group and the number of data blocks you can see.
Scope: reports:read
report_queryRun a reportRun a report by code over a date range: KPIs, time series, breakdowns and tables. Without dates the last 30 days are used.
Scope: reports:read
| Parameter | Type | Description |
|---|---|---|
code * | string | Report code (from the report catalogue) |
from | string | From date (yyyy-MM-dd) |
grain | string | Time grain: day · week · month · quarter · year |
to | string | To date (yyyy-MM-dd) |
{
"code": "SX-01",
"from": "2026-10-01",
"grain": "week",
"to": "2026-10-28"
}