Tools

The 18 tools a connected assistant gets, straight from the server’s definitions. Connect your AI first.

list_typesheets

Reads only

List the user's typesheets. A typesheet is a typed schema AND the rows that have satisfied it: imports accumulate into the sheet. Returns each sheet's id, fields, and public import link. Call this before import_rows to find the right sheet, or to check whether one must be created first.

create_typesheet

Writes

Create a typesheet: a typed schema (text, number, date, email, url, boolean, enum fields with required/unique rules) that spreadsheet data must conform to. Use when the user has tabular data but no matching sheet yet. Design the fields from what the data means, not just its headers. Returns the sheet id and its public import link.

ArgumentTypeDescription
name requiredstring
descriptionstringOne line: what one row represents.
fields requiredobject[]
fields[].keystringsnake_case machine key; derived from label if omitted.
fields[].label requiredstring
fields[].type required"text" | "number" | "date" | "email" | "url" | "boolean" | "enum"
fields[].requiredboolean
fields[].uniqueboolean
fields[].optionsstring[]enum type only.
fields[].descriptionstring

import_rows

Writes

Import tabular data into a typesheet. Columns are auto-mapped to the sheet's fields by meaning; every cell is coerced ('$185,000' → 185000, 'Aug 4, 2026' → 2026-08-04) and validated. Returns the issue report and a review URL where the user can see and edit the live grid. Fix issues you are CONFIDENT about with set_cells; for judgment calls, give the user the review URL instead of guessing.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
columns requiredstring[]Source header row.
rows requiredstring[][]Data rows, as strings, in source order.
source_namestringe.g. the filename. Shown in the app.

set_cells

Writes

Fix specific cells in an import (0-based row index from the issue report + field key). Re-validates everything and returns the updated issue report. Only fix values you can defend from the source data; never invent emails, dates, or amounts.

ArgumentTypeDescription
import_id requiredstring
cells requiredobject[]
cells[].row requiredinteger
cells[].field requiredstring
cells[].value requiredstring

drop_rows

Writes, can change or remove data

Drop rows from an import (junk lines, test rows, rows the user says to drop). Dropped rows leave validation and the export, and the user can restore them from the review grid. Returns the updated issue report. (Was named exclude_rows; that name still works.)

ArgumentTypeDescription
import_id requiredstring
rows requiredinteger[]

export_records

Writes, can change or remove data

Export an import's clean, typed records as JSON (field keys → coerced values) and certify it, which MERGES the rows into the typesheet itself (deduped on its unique fields) and fires the sheet's webhook if configured. The response says what the merge did ('38 new · 12 updated · 150 unchanged'): report that, not the row count, since re-sending a list the sheet already has changes nothing. REFUSES while issues remain: resolve them with set_cells / drop_rows, or send the user the review URL. This refusal is the product's guarantee that data reaching the sheet is clean.

ArgumentTypeDescription
import_id requiredstring

get_records

Reads only

Read the clean rows a typesheet holds: every row that has passed its schema, from every import, sender and write, each with its id, updated_at and values. Search across all fields with q, sort by one field, and page through large sheets. Use this to answer questions about the data, to check what a sheet already has before importing, or to hand clean data to another tool.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
qstringCase-insensitive substring match across every field.
sortstringField key to sort by, or 'updated_at' for the most recently changed.
direction"asc" | "desc"Default asc.
pageinteger0-based page. Default 0.
page_sizeintegerDefault 200.

upsert_records

Writes, can change or remove data

Create or update rows in a typesheet directly, without an import: the way to keep a sheet up to date as things change (a lead's status, a price, a new contact). Each entry is an object of field key to value. With an id it updates that row; without one it is matched by the sheet's unique fields and updated if found, created if not. Updates change only the fields you send. Every value is checked by the same validator imports use, and the write is all-or-nothing: if any entry fails, nothing is written and every reason comes back. Pass expected_updated_at (from get_records / get_record) to refuse the write if someone changed the row since you read it. Returns each row's id and updated_at.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
entries requiredobject[]
entries[].idstringRow id to update. Omit to match by unique fields or create.
entries[].values requiredobjectField key to value. Numbers, booleans and ISO dates may be sent as JSON values.
entries[].expected_updated_atstringThe row's updated_at when you read it. Refuses the write if it has changed since.

collect

Writes, can change or remove data

Push anything into a named collection, with no schema first: products you researched, leads, listings, jobs, papers. Send each item as a plain JSON object. The first push creates the collection and types its fields from the values (a number stays a number, a link a link); later pushes reuse those fields and add any new keys as new fields. Nested objects are flattened one level (specs.weight becomes specs_weight). An item that repeats an identity (id, sku, url, email) updates the existing one instead of adding a copy. Every value is checked against its field: items that don't fit are refused with the reason, the rest are saved. The collection shows itself automatically: items with pictures (an image URL) appear as image cards with their title, price, rating and link. Returns what was added and refused, and the collection's URL.

ArgumentTypeDescription
collection requiredstringThe collection's name, e.g. "Standing desks". Created on first push.
items requiredobject[]The things to save, each a JSON object of field to value, e.g. { name, brand, price, rating, url, image }. Use the same keys for the same facts on every push.
descriptionstringWhat the collection is for. Used when it's created.

get_record

Reads only

Read one row of a typesheet by its id: its values, when it was last changed, and whether a person, an assistant or an import changed it. Use it before updating a row you read a while ago.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
id requiredstring

delete_records

Writes, can change or remove data

Remove rows from a typesheet by id. They come off the sheet and every export; any import that brought them in is unchanged. Only delete what the user asked you to, and say which rows you removed.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
ids requiredstring[]

list_imports

Reads only

List recent imports (files people sent, or you imported), newest first: which sheet, the source file name, who sent it, how many rows, and status ('draft' means still in review, 'ready' means certified into the sheet). Use it to find deliveries waiting for review, then get_import for the issues in one.

ArgumentTypeDescription
typesheetstringOnly this sheet's imports (id or exact name).
status"draft" | "ready"Only imports in this state.
limitintegerDefault 20.

get_import

Reads only

The issue report for one import: every cell that failed its field's type or rules and why, how the source columns were matched, and the review URL. Same report import_rows and set_cells return. Use it to pick up a delivery someone else sent, then fix with set_cells / drop_rows and certify with export_records.

ArgumentTypeDescription
import_id requiredstring

update_typesheet

Writes, can change or remove data

Rename a typesheet, change its description, or replace its fields (the full list: to add a field, send the existing ones plus the new one; keep a field's key to keep its data). Changing which fields are unique re-identifies the rows already in the sheet. Tighten types and rules here rather than fixing the same bad value in every import.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
namestring
descriptionstring
fieldsobject[]
fields[].keystringsnake_case machine key; derived from label if omitted.
fields[].label requiredstring
fields[].type required"text" | "number" | "date" | "email" | "url" | "boolean" | "enum"
fields[].requiredboolean
fields[].uniqueboolean
fields[].optionsstring[]enum type only.
fields[].descriptionstring
Writes

Import rows from web links into a typesheet: each product or listing page becomes one row read off what the page publishes about itself, and a link to a file (a Google Sheet, a CSV, a spreadsheet on Dropbox) brings in the whole file. Returns the same issue report as import_rows. For a PDF or image you can read yourself, extract the table and call import_rows instead.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
urls requiredstring[]

list_senders

Reads only

List who sends data to a typesheet: each sender's name, email, whether they are active, and their personal import link if they have one.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.

create_sender

Writes

Add someone who sends data to a typesheet (a supplier, carrier, customer, colleague). With personal_link true they get their own import link: anyone with it can upload a file with no account, and they fix their own errors before it reaches the user. Their files are tagged with their name, and the sheet learns how they write dates and numbers. Give the link to the user to send on; never email it yourself unless asked.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
name requiredstringWho they are, e.g. 'Acme Freight'.
emailstringTheir address, so emailed files are recognised as theirs.
personal_linkbooleanMint their own import link. Default true.

set_webhook

Writes

Set where a typesheet's clean records go: an https URL that receives a signed JSON POST each time an import is certified (event import.ready, by export_records or a person in the app) and each time rows are written or deleted directly (event records.changed, by upsert_records, delete_records, or an edit in the app). Pass an empty string to turn it off.

ArgumentTypeDescription
typesheet requiredstringTypesheet id or exact name.
url requiredstringhttps URL, or '' to clear.