Tools
The 18 tools a connected assistant gets, straight from the server’s definitions. Connect your AI first.
list_typesheets
Reads onlyList 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
WritesCreate 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.
| Argument | Type | Description |
|---|---|---|
name required | string | |
description | string | One line: what one row represents. |
fields required | object[] | |
fields[].key | string | snake_case machine key; derived from label if omitted. |
fields[].label required | string | |
fields[].type required | "text" | "number" | "date" | "email" | "url" | "boolean" | "enum" | |
fields[].required | boolean | |
fields[].unique | boolean | |
fields[].options | string[] | enum type only. |
fields[].description | string |
import_rows
WritesImport 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
columns required | string[] | Source header row. |
rows required | string[][] | Data rows, as strings, in source order. |
source_name | string | e.g. the filename. Shown in the app. |
set_cells
WritesFix 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.
| Argument | Type | Description |
|---|---|---|
import_id required | string | |
cells required | object[] | |
cells[].row required | integer | |
cells[].field required | string | |
cells[].value required | string |
drop_rows
Writes, can change or remove dataDrop 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.)
| Argument | Type | Description |
|---|---|---|
import_id required | string | |
rows required | integer[] |
export_records
Writes, can change or remove dataExport 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.
| Argument | Type | Description |
|---|---|---|
import_id required | string |
get_records
Reads onlyRead 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
q | string | Case-insensitive substring match across every field. |
sort | string | Field key to sort by, or 'updated_at' for the most recently changed. |
direction | "asc" | "desc" | Default asc. |
page | integer | 0-based page. Default 0. |
page_size | integer | Default 200. |
upsert_records
Writes, can change or remove dataCreate 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
entries required | object[] | |
entries[].id | string | Row id to update. Omit to match by unique fields or create. |
entries[].values required | object | Field key to value. Numbers, booleans and ISO dates may be sent as JSON values. |
entries[].expected_updated_at | string | The row's updated_at when you read it. Refuses the write if it has changed since. |
collect
Writes, can change or remove dataPush 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.
| Argument | Type | Description |
|---|---|---|
collection required | string | The collection's name, e.g. "Standing desks". Created on first push. |
items required | object[] | 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. |
description | string | What the collection is for. Used when it's created. |
get_record
Reads onlyRead 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
id required | string |
delete_records
Writes, can change or remove dataRemove 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
ids required | string[] |
list_imports
Reads onlyList 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.
| Argument | Type | Description |
|---|---|---|
typesheet | string | Only this sheet's imports (id or exact name). |
status | "draft" | "ready" | Only imports in this state. |
limit | integer | Default 20. |
get_import
Reads onlyThe 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.
| Argument | Type | Description |
|---|---|---|
import_id required | string |
update_typesheet
Writes, can change or remove dataRename 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
name | string | |
description | string | |
fields | object[] | |
fields[].key | string | snake_case machine key; derived from label if omitted. |
fields[].label required | string | |
fields[].type required | "text" | "number" | "date" | "email" | "url" | "boolean" | "enum" | |
fields[].required | boolean | |
fields[].unique | boolean | |
fields[].options | string[] | enum type only. |
fields[].description | string |
import_from_links
WritesImport 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
urls required | string[] |
list_senders
Reads onlyList who sends data to a typesheet: each sender's name, email, whether they are active, and their personal import link if they have one.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
create_sender
WritesAdd 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
name required | string | Who they are, e.g. 'Acme Freight'. |
email | string | Their address, so emailed files are recognised as theirs. |
personal_link | boolean | Mint their own import link. Default true. |
set_webhook
WritesSet 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.
| Argument | Type | Description |
|---|---|---|
typesheet required | string | Typesheet id or exact name. |
url required | string | https URL, or '' to clear. |