Atwork
Server Details
Connect Claude, ChatGPT or any MCP client to your Atwork sheets, tasks, pages and dashboards.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- Atwork
TDQS
Scored across 125 tools
Most tools map to a distinct resource+action, but there are real overlaps: sheet.rename vs sheet.update (both set the name), form.update vs peek.update_options vs peek.update_field_options (all patch form/layout settings), and item.create_humanized vs task.create (tasks are items in a tasksheet). The highly detailed descriptions carry most of the disambiguation burden, but with 125 tools an agent will still misselect among the sheet/form/peek/item quartet.
The set overwhelmingly follows a dotted namespace.action snake_case convention (sheet.add_attribute, item.update_many, workflow.publish), which is readable and predictable. Minor deviations exist: notifications.* (plural) vs the singular namespaces elsewhere, and sheet.rename sits alongside the broader sheet.update rather than a uniform verb_noun scheme.
125 tools is far beyond the 3-15 sweet spot and pushes well past the 25+ 'too many' threshold; the breadth (sheets, pages, dashboards, workflows, forms, peeks, bookings, integrations, access, agents) explains it but does not make it manageable. Even organized by namespace, the surface is too large for an agent to hold in context, raising selection errors and latency.
Core sheet/page/folder/space/view/widget/workflow lifecycles are well covered, including restore paths, but there are notable gaps: calendar events cannot be created (only calendars and reads), goals have only create, locations and members lack read/create/delete companions, comments are write-only, and items can be archived but not deleted. These are workable-but-limiting holes rather than total dead ends.
Available Tools
125 toolsaccess.grantGrant AccessADestructiveIdempotentInspect
Give a team or a member a role on a space (its folders and sheets follow) or on one sheet. The caller needs Admin access there. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | admin manages access; editor changes structure and rows; operator edits rows; viewer reads; filler only submits forms | |
| team | No | Team name | |
| member | No | Or a member's name | |
| sheetId | No | Or one sheet | |
| spaceId | No | The space (from workspace.structure) |
Output Schema
| Name | Required | Description |
|---|---|---|
| who | Yes | |
| role | Yes | |
| result | Yes | |
| target | Yes |
access.readRead AccessARead-onlyIdempotentInspect
Who can use a space or a sheet, and with which role. Each entry's aclId is what access.update and access.revoke take.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | No | Or one sheet | |
| spaceId | No | The space (from workspace.structure) |
Output Schema
| Name | Required | Description |
|---|---|---|
| acls | Yes | |
| target | Yes | |
| inherited | Yes | true while a sheet or folder still follows its parent's access |
access.revokeRevoke AccessADestructiveIdempotentInspect
Remove one access entry (a team, a member or everyone) from a space or a sheet. Read the entries with access.read first. On a space, its folders and sheets lose that access too. Always asks the user first; afterwards tell the user which role was removed.
| Name | Required | Description | Default |
|---|---|---|---|
| aclId | Yes | The entry's aclId from access.read | |
| sheetId | No | Or one sheet | |
| spaceId | No | The space (from workspace.structure) |
Output Schema
| Name | Required | Description |
|---|---|---|
| who | Yes | |
| undo | Yes | The call that gives the same access back |
| scope | Yes | |
| target | Yes | |
| removedRole | Yes |
access.updateChange Access RoleADestructiveIdempotentInspect
Change the role of one access entry on a space or a sheet. Read the entries with access.read first. The caller needs Admin access there. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | admin manages access; editor changes structure and rows; operator edits rows; viewer reads; filler only submits forms | |
| aclId | Yes | The entry's aclId from access.read | |
| sheetId | No | Or one sheet | |
| spaceId | No | The space (from workspace.structure) |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| who | Yes | |
| from | Yes | |
| scope | Yes | |
| target | Yes |
app.createCreate AppAInspect
Create a custom app: a named page holding existing views, forms, pages and dashboards, in order. It starts as a draft; app.publish (asks first) makes it live.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | A Bootstrap icon class | bi-grid |
| name | Yes | ||
| items | Yes | What the app shows, in order | |
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Path of the app, on the org's panel domain |
| name | Yes | |
| appId | Yes | |
| status | Yes |
app.publishPublish AppBDestructiveIdempotentInspect
Publish a custom app so the people it is shared with can open it. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The app from app.create |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| appId | Yes | |
| status | Yes |
app.unpublishUnpublish AppADestructiveIdempotentInspect
Take a custom app offline: it goes back to draft and the people it is shared with can no longer open it. app.publish puts it back. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| appId | Yes | The app's id |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| appId | Yes | |
| status | Yes | |
| publishWith | Yes | How to put it back online |
availability.createAdd Time Off or Focus BlockAInspect
Add the user's own time off (type ooo: whole days, shown in the calendar, on the profile and in Settings → Availability; booking pages offer no slots) or a focus block (type focus: a day or a time range, shown in the calendar). Dates and times are in the user's profile timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | A single day; same as startDate with no endDate | |
| type | Yes | ooo = time off (whole days); focus = blocked time for focus work | |
| endDate | No | Inclusive; defaults to startDate | |
| endTime | No | ||
| message | No | Time off only: the auto-reply note | |
| startDate | No | ||
| startTime | No | Focus only, in the profile timezone; absent = all day |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| block | Yes |
availability.deleteRemove Time Off or Focus BlockADestructiveIdempotentInspect
Remove one of the user's own time off or focus blocks by id (from availability.read). Time off is removed from the calendar, the profile and Settings → Availability. The removal is permanent; the output holds the input to re-create it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The block's id, from availability.read |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | |
| deleted | Yes | The removed block, in full |
| recreate | Yes | availability.create input that brings it back |
availability.readRead Time Off and Focus BlocksARead-onlyIdempotentInspect
List the user's own time off and focus blocks between two days (default: the next 30), with their ids, shown in the user's profile timezone. Read before availability.delete.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last day, inclusive; defaults to 30 days after from | |
| from | No | First day, in the profile timezone; defaults to today |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| from | Yes | |
| blocks | Yes | |
| timezone | Yes |
booking_link.createCreate Booking LinkAInspect
Create a booking link (a public page where people book a meeting with the user; guests fill in its form, and each booking becomes a row in the user's Bookings sheet). Slots follow the user's working hours. Pass hours when the user named the hours the link should offer; when they differ from the working hours the result says so, and only working_hours.update can change them.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | URL part after the handle; defaults to the title, slugified. | |
| hours | No | The hours the user asked the link to offer. The link always follows the user's working hours; this is only compared with them. | |
| title | Yes | Shown to the people who book, e.g. "Intro call". | |
| daysAhead | No | How many days ahead people can book. | |
| description | No | ||
| durationMinutes | Yes | Meeting length in minutes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | Path of the public booking page, on the org's panel domain |
| note | No | |
| title | Yes | |
| hoursMatch | No | false when the asked hours differ from the working hours |
| workingHours | Yes | The working hours the link offers |
| durationMinutes | Yes |
booking_link.updateUpdate Booking LinkAIdempotentInspect
Change one of the user's booking links: its title, meeting length, how many days ahead people can book, or turn it off (active: false) and on again. Name the link by its title or id.
| Name | Required | Description | Default |
|---|---|---|---|
| link | Yes | The link's id (from booking_link.create) or its current title | |
| title | No | ||
| active | No | false turns the link off; true turns it back on | |
| daysAhead | No | How many days ahead people can book. | |
| durationMinutes | No | Meeting length in minutes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | Path of the public booking page, on the org's panel domain |
| title | Yes | |
| active | Yes | |
| daysAhead | No | Set when people can book a rolling number of days ahead |
| durationMinutes | Yes |
calendar.createAdd CalendarAIdempotentInspect
Add a personal calendar for the user (My Calendars in the calendar sidebar) with a name, an optional #RRGGBB colour and free/busy-only visibility. A calendar with the same name is returned instead of a second one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| color | No | ||
| freeBusyOnly | No | Others see only busy/free, not the events |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | Yes | false: a calendar with that name already existed and is returned instead |
| calendar | Yes |
calendar.prep_briefPrepare Meeting BriefARead-onlyIdempotentInspect
Return a structured meeting prep brief — linked work, attendees, context, open threads — plus an optional 1-paragraph summary. Retrieval is deterministic graph traversal from Schedulable.itemRef outward via internal *-agent libs. The LLM is a renderer only — it never decides what to fetch. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| eventId | Yes | Schedulable event ID | |
| userDayKey | Yes | Calendar date in user's zone, YYYY-MM-DD — used as cache key segment | |
| bypassCache | No | Force re-retrieval, ignoring cached brief | |
| includeSummary | No | Whether to request an LLM-written summary |
Output Schema
| Name | Required | Description |
|---|---|---|
| context | Yes | |
| summary | No | LLM-written summary; absent when not requested or the call failed |
| cacheKey | Yes | |
| attendees | Yes | |
| linkedWork | Yes | |
| generatedAt | Yes | |
| openThreads | Yes |
calendar.propose_timesPropose Meeting TimesARead-onlyIdempotentInspect
Propose ranked meeting time slots given duration, window, attendees and ranking strategy. Returns deterministic free-busy-derived slots; the top 3 carry a short LLM-written 'why' string when includeWhy is true. Each slot lists teammates by attendeeUserId and external attendees by externalIndex, their position in externalAttendeeEmails. Read-only — never creates an event.
| Name | Required | Description | Default |
|---|---|---|---|
| rankBy | No | soonest | |
| windowEnd | Yes | ISO datetime in user's zone, inclusive | |
| includeWhy | No | ||
| maxResults | No | ||
| windowStart | Yes | ISO datetime in user's zone, inclusive | |
| preferredZones | No | IANA tz names | |
| attendeeUserIds | No | ||
| durationMinutes | Yes | ||
| honorOOOAndFocus | No | ||
| honorWorkingHours | No | ||
| sourceCalendarIds | No | Logical calendar ids | |
| externalAttendeeEmails | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| slots | Yes | Ranked free slots, best first; start/end are ISO UTC, score is 0..1 |
| nlSummary | No |
calendar.readRead Calendar EventsARead-onlyIdempotentInspect
List the user's calendar events in an inclusive date range. Optionally restrict to one calendar by id. Returns up to limit event objects with id, summary, startDate/endDate (and times if present), dueDate, assigneeId + assigneeName, calendarId + calendarName, location, and an optional truncated content. Prefer the *Name fields in user-facing prose; the *Id fields are FKs for follow-up tools.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max events to return | |
| endDate | Yes | ISO date (YYYY-MM-DD), inclusive | |
| startDate | Yes | ISO date (YYYY-MM-DD), inclusive | |
| calendarId | No | Limit to one calendar |
Output Schema
| Name | Required | Description |
|---|---|---|
| events | Yes | Events in the range sorted by start/due date; dates are ISO strings, `content` is capped at 300 chars |
calendar.updateEdit CalendarADestructiveIdempotentInspect
Rename one of the user's own personal calendars, or change its #RRGGBB colour or free/busy-only visibility; by id or name. Connected (Google) and shared calendars are not changed here.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| color | No | ||
| calendar | Yes | The calendar's id or its name | |
| freeBusyOnly | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| calendar | Yes |
comment.postPost CommentAInspect
Post a comment on an item, named by its sheetId and item id (uuid). The comment is attributed to the agent (visible as 'AI commented'). The user can delete the comment from the item's activity log.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | The item's id (uuid) | |
| content | Yes | ||
| sheetId | Yes | The sheet the item is on |
Output Schema
| Name | Required | Description |
|---|---|---|
| messageId | Yes | Id of the posted comment |
| conversationId | Yes | The item conversation the comment was posted in |
custom_agent.createCreate Custom AgentADestructiveInspect
Create a custom agent: a teammate with its own instructions, capabilities and, with sheetIds / spaceIds / pageIds, a limited view of the workspace. Owner or an Admin only. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| model | No | Model id; defaults to the org's default model | |
| skills | No | Skill keys from the org's skills | |
| pageIds | No | …and/or these pages | |
| sheetIds | No | Limit what it can see to these sheets | |
| spaceIds | No | …and/or these spaces | |
| description | No | ||
| capabilities | No | What it may read (and write): sheets, pages, calendar, comments, members, files, dashboards, web, vista | |
| instructions | Yes | What the agent does and how it answers (its persona) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| name | Yes |
dashboard.createCreate DashboardAInspect
Add an empty dashboard to a sheet; it shows as a Charts view. Then add charts and numbers with widget.create. To build a sheet together with its dashboards, use steps.draft instead.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Bootstrap icon name. Default: bi-bar-chart. | |
| name | Yes | ||
| sheetId | Yes | The sheet whose rows the dashboard's charts count. | |
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| viewId | No | The sheet's Charts view that shows it |
| sheetId | Yes | |
| dashboardId | Yes | For widget.create |
dashboard.deleteDelete DashboardADestructiveIdempotentInspect
Delete a dashboard with its widgets and its Charts view. This always asks the user first: say which dashboard goes before you call it. dashboard.restore brings it back.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboardId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| deleted | Yes | |
| sheetId | Yes | |
| dashboardId | Yes | |
| restoreWith | Yes | The tool that brings it back, with sheetId + dashboardId |
dashboard.readRead DashboardARead-onlyIdempotentInspect
Read a dashboard's structure: returns dashboard (id, title, description, sheetId + sheetName when bound to a sheet) and widgets[] (each id, title, type, optional summary). Set includeWidgetData=true to also fetch each widget's current rendered numbers — slower, only needed when answering questions ABOUT the numbers (totals, trends, breakdowns) rather than the layout. Without it you save a fetch per widget.
| Name | Required | Description | Default |
|---|---|---|---|
| dashboardId | Yes | ||
| includeWidgetData | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| widgets | Yes | Widgets in layout order; `summary` describes the rendered data when includeWidgetData was set |
| dashboard | Yes | The dashboard and, when bound to one, its sheet |
dashboard.restoreRestore DashboardAIdempotentInspect
Bring back a deleted dashboard with its widgets and its Charts view, by the sheetId and dashboardId dashboard.delete (or view.delete) returned.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes | ||
| dashboardId | Yes | The deleted dashboard's id, as dashboard.delete returned it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sheetId | Yes | |
| restored | Yes | |
| dashboardId | Yes |
dashboard.updateUpdate DashboardADestructiveIdempotentInspect
Change a dashboard's name, icon, description or filter (the sheet.read filter form; every widget counts only those rows; null clears it). Only what you pass changes; its widgets stay.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | No | ||
| filter | No | Rows every widget counts, by field name. `null` clears it. | |
| dashboardId | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | Yes | The settings that were saved |
| dashboardId | Yes |
file.confirm_uploadConfirm File UploadAIdempotentInspect
Finish a file upload started with file.request_upload, after the bytes have been PUT to the presigned URL. Returns the stored filename — add that value to a File List field or set it as a Cover.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The `key` returned by file.request_upload, after you PUT the bytes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| filename | Yes | Stored filename to add to a File List field or set as a Cover |
file.request_uploadRequest File UploadAInspect
Start a file upload. Returns a presigned URL — you must then PUT the file's bytes to that URL yourself, with Content-Type set to the mime you gave (upload_headers), and finally call file.confirm_upload with the returned key. Images (image/png, image/jpeg, image/webp), a PDF (application/pdf, private only — e.g. a LinkedIn document post) or an MP4 (video/mp4, private only — e.g. a social video), max 10MB. Use visibility: "public" for anything that must load on a website.
| Name | Required | Description | Default |
|---|---|---|---|
| mime | Yes | Content type of the file. One of: image/png, image/jpeg, image/webp, application/pdf (private only), video/mp4 (private only). | |
| size_bytes | Yes | Exact byte length of the file you will upload. | |
| visibility | No | `public` is world-readable — use it for blog covers and other web assets. | private |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | Pass to file.confirm_upload once the PUT succeeded |
| upload_url | Yes | Presigned URL to PUT the bytes to |
| upload_headers | Yes | Headers the PUT must send exactly; the URL is signed for this Content-Type |
| expires_in_seconds | Yes | Lifetime of the upload URL |
folder.createCreate FolderAInspect
Create an empty folder in a space, at the top or inside parentFolderId. Ids come from workspace.structure.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | Yes | ||
| spaceId | Yes | ||
| description | No | ||
| parentFolderId | No | Omit for a folder at the top of the space |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| folderId | Yes | |
| location | Yes |
folder.deleteDelete FolderADestructiveIdempotentInspect
Delete a folder with its subfolders and the sheets and pages inside them. This always asks the user first: say what is inside before you call it. folder.restore brings it all back.
| Name | Required | Description | Default |
|---|---|---|---|
| spaceId | Yes | The space the folder is in | |
| folderId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| deleted | Yes | |
| folderId | Yes | |
| restoreWith | Yes | The tool that brings it back, with the same spaceId and folderId |
folder.restoreRestore FolderAIdempotentInspect
Bring back a deleted folder with the subfolders, sheets and pages its delete removed. Restore the folder it was in first when that one is deleted too.
| Name | Required | Description | Default |
|---|---|---|---|
| spaceId | Yes | The space the folder was in | |
| folderId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| folderId | Yes | |
| restored | Yes | What came back with it: only what its delete removed |
folder.updateUpdate FolderADestructiveIdempotentInspect
Rename a folder, change its icon or description, or move it inside another folder of the same space. Only the settings you name change. Ids come from workspace.structure.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | No | ||
| spaceId | Yes | The space the folder is in | |
| folderId | Yes | ||
| description | No | ||
| parentFolderId | No | Move the folder inside another folder of the same space |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| changed | Yes | |
| folderId | Yes | |
| location | Yes | Where the folder now sits |
form.createCreate FormAInspect
Add a form (a peek of kind form) to an existing sheet: each submission becomes a row. fields are field names or codes in order, or { field, required, label, help, placeholder, width } (width 25, 50, 75 or 100 percent of the row in the classic layout). layout: classic (default; fields side by side by width) or steps (one question at a time). Optional submitLabel, description above the questions and successMessage after sending. Fields must already exist on the sheet (add them with sheet.add_attribute first). Theme, accent and header: peek.update_options. Publishing it and its public link stay in the form builder.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | Yes | ||
| fields | Yes | The questions, in order; each submission becomes a row. | |
| layout | No | How the questions are laid out. Default classic. | |
| sheetId | Yes | ||
| description | No | Text shown above the questions. | |
| submitLabel | No | The Submit button's text, in the form's language. Default: Submit in the visitor's language. | |
| successMessage | No | Thank-you message shown after the form is sent (plain text; answer tokens, answers, button and Submit another are set in Form Studio). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| fields | Yes | The field names the form asks for, in order |
| formId | Yes | The new form's id, for form.update and form.delete |
| sheetId | Yes |
form.deleteDelete FormADestructiveIdempotentInspect
Delete a form (a peek of kind form) from a sheet; the rows it collected stay; a record layout is refused. This always asks the user first: say which form goes before you call it. form.restore brings it back with its questions and settings.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The form to delete (sheet.schema lists a sheet's forms). | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| formId | Yes | |
| deleted | Yes | |
| sheetId | Yes | |
| restoreWith | Yes | The tool that brings it back, with sheetId + formId |
form.restoreRestore FormAIdempotentInspect
Bring back a deleted form with its questions and settings, by the sheetId and formId form.delete returned. A record layout (how a row opens) is refused.
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | The deleted form's id, as form.delete returned it. | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| formId | Yes | |
| sheetId | Yes | |
| restored | Yes |
form.statsRead Form StatsARead-onlyIdempotentInspect
How a form is doing: views (public page loads), starts (first field typed), submissions (rows the form added), the same three for the previous equal period, the median time to finish, submissions per day for the last 14 days, and how many who started reached each question with the question that loses the most people. Use for questions like 'how is my inquiry form doing?' or 'where do people drop off my form?'. Pass the form's peekId (sheet.schema lists a sheet's forms).
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | 7d, 30d or all (all time has no previous period) | 7d |
| peekId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | Yes | |
| reach | Yes | Where people stop: how many who started reached each question |
| views | Yes | |
| peekId | Yes | |
| perDay | Yes | Last 14 days, oldest first |
| starts | Yes | |
| previous | Yes | The same numbers for the equal period before; null for all time |
| biggestDrop | Yes | The question that loses the most people compared with the one before; null when none does |
| fillSamples | Yes | How many submissions the median covers |
| submissions | Yes | |
| medianFillMs | Yes | Median time from first input to submit, in ms |
form.updateUpdate FormADestructiveIdempotentInspect
Change a form (a peek of kind form: it collects new rows): name, description, addFields (names or codes, or { field, required, label, help, placeholder, width }, added at the end), removeFields, editFields (a question's label, required, help, placeholder or width: 25, 50, 75 or 100 percent of the row in the classic layout), order (every question in the new order), layout (classic, or steps: one question at a time), submitLabel (the Submit button's text), visibleWhen (per question: show it only when a sheet.read-style filter on the answers holds; when: null always shows it) successMessage, aiReply (the thank-you screen shows Dana's reply written from each person's answers: a plain-text prompt where {Field name} stands for an answer, and a fallback shown when it is slow; null goes back to the message) and redirect (send people to a web page after they submit; put answers in the link as {Field name}; null goes back to the message). onResponse turns the response emails on or off: notify emails the people you name (members; default you) one email per response with the answers, copy emails the respondent their answers at an Email field on the form (a form anyone with the link can fill needs Block spam first). Pass aiReply or redirect, not both. Only what you pass changes; the other questions and settings stay. Without formId it changes the form open in Form Studio. A record layout (how a row opens) is refused: change it with the peek.* tools. Theme, accent and header: peek.update_options. Publishing, and blocks (a heading, text, image, divider or section), stay in the form builder.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| order | No | Every question on the form (field names or codes) in the new order, after addFields and removeFields; headings and other blocks keep their place. | |
| formId | No | The form's id (sheet.schema lists a sheet's peeks with their kind). Default: the form open in Form Studio. | |
| layout | No | classic places the questions side by side by width (100% takes the row), steps asks one at a time. | |
| aiReply | No | Show each person an AI reply written from their answers on the thank-you screen; null shows the thank-you message again. | |
| sheetId | No | The form's sheet. Default: the form's own sheet. | |
| redirect | No | Send people to a web page after they submit; null goes back to the thank-you message. | |
| addFields | No | Questions to add at the end of the form. | |
| editFields | No | Change a question's label, required flag, help, placeholder or width; the other questions stay. | |
| onResponse | No | The emails a response sends; only the switch you pass changes. | |
| description | No | Text shown above the questions. | |
| submitLabel | No | The Submit button's text, in the form's language. Default: Submit in the visitor's language. | |
| visibleWhen | No | ||
| removeFields | No | Field names or codes to take off the form. | |
| successMessage | No | Thank-you message shown after the form is sent (plain text; answer tokens, answers, button and Submit another are set in Form Studio). |
Output Schema
| Name | Required | Description |
|---|---|---|
| fields | Yes | The field names the form asks for now, in order |
| formId | Yes | |
| changed | Yes | What was saved |
| sheetId | Yes |
goal.createCreate GoalCInspect
Create a goal on the Goals page: personal or for the organization, measured by completed tasks, by a sheet's rows (count, or sum / average of a number field), or not measured.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | YYYY-MM-DD | |
| name | Yes | ||
| type | No | kpi | |
| scope | No | personal | |
| start | No | YYYY-MM-DD | |
| target | No | ||
| measure | Yes | ||
| direction | No | Whether to stay above or below the target | above |
| recurrence | No | How often the target resets | one_time |
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| url | Yes | |
| name | Yes |
inbound_email.regenerateReplace Inbound Email AddressADestructiveInspect
Replace a sheet's inbound email address with a new random one, e.g. when the old one gets spam. The old address stops working. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes | The sheet whose inbound address is replaced |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| from | Yes | |
| note | Yes | |
| sheetId | Yes |
inbound_email.renameRename Inbound Email AddressADestructiveIdempotentInspect
Rename a sheet's inbound email address (the address that turns emails into rows). The old address stops working. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The new name, the part before the first dot, e.g. "leads" | |
| sheetId | Yes | The sheet whose inbound address changes |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| from | Yes | |
| note | Yes | |
| sheetId | Yes |
integration.list_operationsList Connected App OperationsARead-onlyIdempotentInspect
Discover what the workspace's connected integrations can do. Call with no arguments for the connected providers and their operations. Pass provider to get that provider's operations WITH their field schemas. Each operation reports access: run read ones with integration.query, write and destructive ones with integration.execute (a destructive one deletes, archives or overwrites, and the user approves it every time). Fields marked dynamic need integration.list_options before use. Use the provider value exactly as returned here when calling the other integration tools. Connections marked mine: true belong to the current user; prefer those. When more than one applies, show the user the labels and let them choose — never ask which connection to use without listing the options.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Provider name, e.g. 'slack'. Omit for the list of connected providers. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | |
| provider | No | With `provider`: the provider named |
| providers | No | Without `provider`: the connected providers |
| operations | No | With `provider`: its operations, with field schemas |
| needsAccess | No |
integration.list_optionsList Connected App OptionsARead-onlyIdempotentInspect
Resolve the valid values for a dynamic field — one marked dynamic by integration.list_operations, e.g. the Slack channels you may post to. Returns [{value, label}]; pass the value in params.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | The field marked `dynamic` by integration.list_operations | |
| provider | Yes | Provider name exactly as integration.list_operations returned it | |
| resource | Yes | ||
| operation | Yes | ||
| credentialId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| options | Yes |
integration.queryQuery Connected AppARead-onlyIdempotentInspect
Run a READ integration operation, e.g. list Slack channels or fetch channel history. Only operations integration.list_operations reports with access read are allowed — use integration.execute for write and destructive ones. credentialId is optional when the provider has exactly one connection.
| Name | Required | Description | Default |
|---|---|---|---|
| params | No | ||
| provider | Yes | Provider name exactly as integration.list_operations returned it | |
| resource | Yes | ||
| operation | Yes | ||
| credentialId | No | Only needed when the provider has several connections |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | The provider's response, as the integration service returned it |
item.archiveArchive ItemsADestructiveIdempotentInspect
Archive (archived: true) or unarchive (archived: false) up to 50 rows of a sheet. An archived row keeps all its data but leaves default reads and search, sends no reminders and fires no workflows; unarchiving brings it back. Read archived rows with sheet.read and archived: "only".
| Name | Required | Description | Default |
|---|---|---|---|
| itemIds | Yes | Ids of the rows to archive or unarchive (1–50) | |
| sheetId | Yes | ||
| archived | Yes | true archives the rows; false unarchives them |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | Yes | Ids now in the requested state, including ones that already were |
| notFound | Yes | Ids that are not rows of this sheet |
item.create_humanizedCreate ItemAInspect
Create a row (item) in any sheet using HUMAN VALUES for its fields — you don't need ids. Provide sheetId and a fields map of attribute name→value; option/select/status/member/team/job values are resolved to the sheet's real values, and an unrecognised value returns an error listing the valid options rather than guessing. Document/Description fields accept MARKDOWN and are stored as rich text. Blocking / Blocked By take item titles, Index (#10) or ids from the same sheet. Returns {itemId}.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Attribute name/code → human value. Select/Status/Member/Team/Job values are matched to the sheet's real options (best-match; an unrecognised value errors with the valid list). e.g. { Status: 'In Progress', Assignee: 'Ali Reza' } | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Panel link that opens the row; use it as the target of a markdown link |
| itemId | Yes | Id of the created row |
| sheetId | Yes | Sheet the row was created in |
| spaceId | Yes | Space of that sheet; null for a sheet outside a space |
item.create_manyCreate ItemsAInspect
Create many rows (items) in one sheet in ONE call — use it instead of repeated item.create_humanized whenever you add more than one row (e.g. "add these 50 leads" from a pasted list). Each row is a fields map of attribute name → HUMAN VALUE, resolved exactly as item.create_humanized does. Up to 200 rows per call; for more, make several calls. A row whose value cannot be resolved, or that matches an existing row by a unique field, is skipped with a reason and the rest are created. Workflows on the sheet run for every created row, as for a row added by hand. The whole call is one batch: item.undo_batch with the returned batchId and sheetId removes every row it created. Returns { batchId, created, skipped, skippedCount, url } — tell the user the counts and the skip reasons.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | The rows to create, 1–200; split a longer list into several calls | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Panel link to the sheet |
| batchId | Yes | Id of the batch; pass it with sheetId to item.undo_batch to undo the whole batch. Null when nothing was written |
| created | Yes | Rows created |
| sheetId | Yes | Sheet the rows are in |
| skipped | Yes | Rows left unchanged and why; at most 20 are listed |
| spaceId | Yes | Space of that sheet; null for a sheet outside a space |
| stopped | No | Set when a row failed unexpectedly: rows after it were not attempted; the rest stay written |
| updated | Yes | Rows updated |
| skippedCount | Yes | All rows skipped, including ones not listed |
item.read_filesRead Item FilesARead-onlyIdempotentInspect
Read the text of the files on one row: uploads in its File List fields, and Google Drive files the user linked themselves. Reads up to 5 files (10 MB each) in field and cell order until the text budget is spent; more counts the rest — pass attribute to read one field. PDF, DOCX, XLSX, PPTX, CSV, text, and Google Docs, Sheets and Slides are read. An audio upload is listed under unreadable to transcribe with audio.transcribe. A Drive file another member linked, an image, or a file that cannot be read is listed under unreadable with why (and the Drive link): tell the user, and never guess what it contains.
| Name | Required | Description | Default |
|---|---|---|---|
| itemId | Yes | The row's id | |
| sheetId | Yes | ||
| attribute | No | Read only this File List field (its name or code); omit to read every File List field |
Output Schema
| Name | Required | Description |
|---|---|---|
| item | Yes | |
| more | Yes | Files not read: past the first 5, or after the text budget ran out |
| note | No | |
| files | Yes | |
| unreadable | Yes | Files that could not be read, with why |
item_tree.duplicateDuplicate Sheet Page Or FolderAInspect
Copy a sheet (structure and rows), a page, or a folder with what is in it, into a space or folder. Ids come from workspace.structure.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | ||
| sheetId | No | The sheet to copy (give exactly one of sheetId, pageId, folderId) | |
| folderId | No | A folder is copied, with the sheets and pages in it, within its own space | |
| toSpaceId | Yes | The space the copy goes to | |
| toFolderId | No | A folder of `toSpaceId`; omit for the top of the space |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | |
| name | Yes | The name of what was copied |
| location | Yes | Where the copy sits |
| sourceId | Yes |
item_tree.moveMove Sheet Page Or FolderBDestructiveIdempotentInspect
Move a sheet or page to another space or folder, or a folder inside another folder of its space. Ids come from workspace.structure. Returns where it now sits, by name.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | No | ||
| sheetId | No | The sheet to move (give exactly one of sheetId, pageId, folderId) | |
| folderId | No | A folder moves only within its own space | |
| toSpaceId | Yes | The space it goes to | |
| toFolderId | No | A folder of `toSpaceId`; omit for the top of the space |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| kind | Yes | |
| name | Yes | |
| location | Yes | Where it now sits |
item.undo_batchUndo Item BatchADestructiveIdempotentInspect
Undo a whole batch written by item.create_many, item.update_many or item.update_where, in one step, naming the batchId it returned and the sheetId it wrote: a create batch deletes the rows it created that still exist; an update batch restores each field's previous value unless it was changed since (those are reported as conflicts and kept). Only the user who ran the batch (or the org owner) can undo it, once, within 7 days. Use it when the user asks to undo a bulk change. Effects workflows already had (emails, external calls) are not reverted.
| Name | Required | Description | Default |
|---|---|---|---|
| batchId | Yes | The batchId item.create_many or item.update_many returned | |
| sheetId | Yes | The sheet the batch wrote, as that call returned it |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | Yes | What undo does not revert; tell the user |
| status | Yes | undone, or why nothing was changed |
| reverted | Yes | Rows deleted (create batch) or restored (update batch) |
| conflicts | Yes | Rows with fields changed since the batch; those fields were kept, not restored |
| alreadyGone | Yes | Rows of the batch deleted since; nothing to undo for them |
item.update_humanizedUpdate ItemADestructiveIdempotentInspect
Update a row (item) using HUMAN VALUES. Provide sheetId, itemId, and a fields map of attribute name→value; only the given fields change. Option/member/etc. values are resolved to real ids (unrecognised → error listing valid options). Document/Description fields accept MARKDOWN and are stored as rich text. File List fields take the files the cell should hold: stored filenames from file.confirm_upload, or the entry objects sheet.read shows for this row; a replace drops the files it does not name. Blocking / Blocked By take item titles, Index (#10) or ids from the same sheet.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | `append` only affects Document/Description fields (new content is added after the existing content) and File List fields (new files are added to the cell's). All other field types always replace. | replace |
| fields | Yes | Attribute name/code → human value. Only the given fields change; values are matched to the sheet's real options. | |
| itemId | Yes | ||
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Panel link that opens the row; use it as the target of a markdown link |
| itemId | Yes | Id of the updated row |
item.update_manyUpdate ItemsADestructiveInspect
Update a LISTED set of rows (by id) in one sheet in ONE call — use it instead of repeated item.update_humanized whenever you change more than one row. Each row is { itemId, fields }; only the given fields change and values are HUMAN VALUES resolved as in item.update_humanized. Up to 200 rows per call. Rows that are not in the sheet, archived, read-only or have an unresolvable value are skipped with a reason and never changed; the rest are updated. Workflows on the sheet run for every updated row, as for an edit by hand. The whole call is one batch: item.undo_batch with the returned batchId and sheetId restores the previous values. Returns { batchId, updated, skipped, skippedCount, url } — tell the user the counts and the skip reasons.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | The rows to change, 1–200, each by id with only the fields that change | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Panel link to the sheet |
| batchId | Yes | Id of the batch; pass it with sheetId to item.undo_batch to undo the whole batch. Null when nothing was written |
| created | Yes | Rows created |
| sheetId | Yes | Sheet the rows are in |
| skipped | Yes | Rows left unchanged and why; at most 20 are listed |
| spaceId | Yes | Space of that sheet; null for a sheet outside a space |
| stopped | No | Set when a row failed unexpectedly: rows after it were not attempted; the rest stay written |
| updated | Yes | Rows updated |
| skippedCount | Yes | All rows skipped, including ones not listed |
item.update_whereUpdate Items By FilterADestructiveInspect
Set the same field values on EVERY row of one sheet that matches a filter, in ONE call — e.g. "Country = Germany where Country is DE or Deutschland". Prefer it over reading rows and calling item.update_many whenever the rows to change are described by a condition. filter is { operator: AND|OR, conditions: [{ column, operator, value }] } (≤ 10 conditions, operators as in sheet.aggregate) and fields maps field name → ONE literal human value (≤ 30); columns take names or codes and option/member values are matched as in item.update_humanized. File List fields are set per row with item.update_many, not here. Rows already holding the values are left alone; archived and read-only rows are skipped. When more than 20 rows would change, the user confirms first: in a chat on a preview card (the call waits for it); over MCP the call is refused with ROWS_NEED_CONFIRM, the count and a sample, and nothing changes — show the user and call again with confirmRows set to that count only once they accept. At most 1,000 rows per call — narrow the filter otherwise. The change is one batch: item.undo_batch with the returned batchId and sheetId restores the previous values. Returns { batchId, updated, unchanged, skipped, skippedCount, url }.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | Yes | Attribute name/code → human value, as in item.create_humanized, at most 30 per row. Select/Status/Member/Team/Job values are matched to the sheet's real options. | |
| filter | Yes | ||
| sheetId | Yes | ||
| confirmRows | No | MCP only: the number of rows the user accepted after a ROWS_NEED_CONFIRM refusal. Needed when more than 20 rows would change; never set it before the user agrees. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Panel link to the sheet |
| batchId | Yes | Id of the batch; pass it with sheetId to item.undo_batch to undo the whole batch. Null when nothing was written |
| created | Yes | Rows created |
| sheetId | Yes | Sheet the rows are in |
| skipped | Yes | Rows left unchanged and why; at most 20 are listed |
| spaceId | Yes | Space of that sheet; null for a sheet outside a space |
| stopped | No | Set when a row failed unexpectedly: rows after it were not attempted; the rest stay written |
| updated | Yes | Rows updated |
| unchanged | Yes | Matching rows that already held every value |
| skippedCount | Yes | All rows skipped, including ones not listed |
| nothingToChange | No | Set when every matching row already held the values |
language.updateChange LanguageADestructiveIdempotentInspect
Change the language the user's panel, emails and notifications are in: English or Farsi. Dana keeps answering in the language the user writes in.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | en = English, fa = Farsi (right to left) |
Output Schema
| Name | Required | Description |
|---|---|---|
| language | Yes |
location.createAdd a LocationADestructiveInspect
Add a location (an office or branch) to the organization: its name and IANA timezone, with an optional address, city, state, country, zip code and phone number. main: true makes it the main location. The organization's Owner or an Admin only; always asks first.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| main | No | Make this the organization's main location; the current main one stops being main | |
| name | Yes | ||
| state | No | ||
| address | No | Street and number | |
| country | No | ||
| zipCode | No | ||
| timezone | Yes | ||
| phoneNumber | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| city | Yes | |
| main | Yes | |
| name | Yes | |
| state | Yes | |
| address | Yes | |
| country | Yes | |
| zipCode | Yes | |
| timezone | Yes |
location.updateUpdate a LocationADestructiveIdempotentInspect
Change one of the organization's locations, named by its current name or id: rename it, or change its timezone, address, city, state, country, zip code or phone number; main: true makes it the main location. Only the fields given change. The organization's Owner or an Admin only; always asks first.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | ||
| main | No | Make this the organization's main location; the current main one stops being main | |
| name | No | The location's name, e.g. Berlin office | |
| state | No | ||
| address | No | Street and number | |
| country | No | ||
| zipCode | No | ||
| location | Yes | The location to change, by its current name or id | |
| timezone | No | IANA zone, e.g. Europe/Berlin | |
| phoneNumber | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| city | Yes | |
| main | Yes | |
| name | Yes | |
| state | Yes | |
| address | Yes | |
| country | Yes | |
| zipCode | Yes | |
| timezone | Yes |
member.readList MembersARead-onlyIdempotentInspect
List org members. Optionally filter by name prefix. Returns up to limit member objects (id, userId, fullName, teamId, teamName, jobId, jobName). teamName/jobName are the resolved display titles — use them in prose; the *Id fields are FKs for tools that need them. Note: AI-agent identities may appear in the list — exclude them when answering questions about people.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| nameStartsWith | No | Case-insensitive prefix filter on full name |
Output Schema
| Name | Required | Description |
|---|---|---|
| members | Yes | Org members; `id` is the employee id (assignee FK), `userId` the user id; *Name fields are display names |
member.update_profileUpdate a Member's ProfileADestructiveIdempotentInspect
Owner only: change another member's profile (name, job title, @handle, pronouns, bio, phone number, status, timezone, out-of-office days). Always asks the user first. For the user's own profile use profile.update.
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Up to 280 characters; empty clears it | |
| job | No | A job title from the organization's Jobs list, by name; jobs are never created here | |
| phone | No | Phone number as the user wrote it: digits, spaces and + ( ) - . only, at least 3 digits; empty clears it. Who sees it is a preference. | |
| handle | No | The @handle of the public profile | |
| member | Yes | The member's full name, as member.read lists it | |
| status | No | The status line next to the name; null clears it | |
| lastName | No | ||
| pronouns | No | Empty clears them | |
| timezone | No | IANA zone, e.g. Europe/Berlin | |
| firstName | No | ||
| outOfOffice | No | Whole-day time off in the calendar, inclusive days; the list replaces current and future whole-day time off, past time off is kept; to: null = until further notice; null clears it |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | Each changed field as saved |
| member | Yes |
notifications.readRead Notification SettingsARead-onlyIdempotentInspect
Read the user's notification switches: each category by in-app, push, email and Telegram. Categories: MENTION (@mentions), PAGE_COMMENT (page comment replies), TASK_ASSIGNEE (assigned to you), DUE_DATE, UPDATE_ITEM (changes to your items), MESSAGE (chat), REMINDER, DAILY_CLOSEOUT (end-of-day close-out), AGENT_DONE, AGENT_NEEDS_INPUT, BOOKING, SUPPORT_TICKET (replies to your support tickets). Also whether quiet hours are on.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| categories | Yes | |
| quietHours | Yes | Push and email held outside working hours (notifications.set_quiet_hours) |
| telegramLinked | Yes | Telegram can only be switched on once a chat is linked |
notifications.resetReset Notification SettingsADestructiveIdempotentInspect
Put every notification switch of the user back to the default: all on, Telegram off. Only when the user asks to reset them.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| reset | Yes |
notifications.set_quiet_hoursSet Quiet HoursADestructiveIdempotentInspect
Turn the user's own quiet hours on or off: when on, push and email outside their working hours wait and arrive together when the day starts; in-app notifications still collect. Turning on needs working hours (working_hours.update). Turning off sends anything held. In Atwork's chat the user confirms the change on a card first.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | true holds push and email outside working hours, false sends them right away |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | Yes | false when quiet hours were already in the asked state |
| enabled | Yes | |
| workingHours | No | The working hours quiet hours follow, when turned on |
notifications.updateUpdate Notification SettingsADestructiveIdempotentInspect
Turn the user's notifications on or off per category and channel (inApp, push, email, telegram). Push is only the per-category switch; browser push itself is turned on in the browser. Telegram needs a linked chat first.
| Name | Required | Description | Default |
|---|---|---|---|
| switches | Yes | One entry per category and channel to turn on or off. Categories: MENTION (@mentions), PAGE_COMMENT (page comment replies), TASK_ASSIGNEE (assigned to you), DUE_DATE, UPDATE_ITEM (changes to your items), MESSAGE (chat), REMINDER, DAILY_CLOSEOUT (end-of-day close-out), AGENT_DONE, AGENT_NEEDS_INPUT, BOOKING, SUPPORT_TICKET (replies to your support tickets) |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes |
org.updateUpdate Organization SettingsADestructiveIdempotentInspect
Change the organization's settings for everyone: its name, default language (en or fa), calendar (gregorian or jalali) and the day the week starts on. Only the fields given change. The organization's Owner or an Admin only; always asks first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The organization's name | |
| calendar | No | The default calendar | |
| language | No | The default language new members start with | |
| startOfWeek | No | The day calendars and weekly views start on |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| calendar | Yes | |
| language | Yes | |
| startOfWeek | Yes |
page.createCreate PageAInspect
Save a draft as a real page in the workspace. markdown is the body — the server converts to BlockNote. Use AFTER drafting the prose in the conversation, when the user signals 'save it' / 'make this a page' / 'add it to ' — never speculatively. The page becomes live immediately; the user has 30 seconds to undo from the trace bubble. For a named destination pass its spaceId (find a space by name with workspace.structure); omit spaceId to save in the space the user is on.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| spaceId | No | Target space. Omit to use the space the user is on. | |
| folderId | No | ||
| markdown | Yes | Standard CommonMark. Use # for the page top-level heading (NOT the page name — the name field is separate), ## for sections, * for bullets, **bold**, *italic*. Do NOT include front matter, HTML tags, or BlockNote-specific syntax. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | Page name as stored |
| pageId | Yes | Id of the created page |
| spaceId | Yes | Space the page landed in |
page.deleteDelete PageADestructiveIdempotentInspect
Delete a page. This always asks the user first. page.restore brings it back with its content.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| pageId | Yes | |
| deleted | Yes | |
| restoreWith | Yes | The tool that brings it back, with the same pageId |
page.editEdit PageADestructiveInspect
Patch an existing page with one of five targeted operations. append/prepend add markdown at end/start. append-to-section inserts at the end of a section (before the next heading) — use this when adding to a section, NOT replace-section. replace-section swaps a section's heading + body with new markdown; drops any non-text blocks (images/files) inside it. delete-section removes a section entirely. sectionHeading matches case-insensitive trim. Always call page.read FIRST so you know the actual heading text. The page changes immediately; the user has 30 seconds to undo.
| Name | Required | Description | Default |
|---|---|---|---|
| op | Yes | ||
| pageId | Yes | ||
| markdown | No | ||
| sectionHeading | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| op | Yes | The operation that ran |
| name | Yes | Page name |
| pageId | Yes | Id of the edited page |
| spaceId | Yes | Space the page is in |
| previousContent | Yes | The replaced or removed blocks (BlockNote JSON) for undo, or null |
| previousContentTooLarge | Yes | True when previousContent was omitted for size |
page.readRead PageARead-onlyIdempotentInspect
Read a page's name, body (text, capped at 15,000 chars), cover, author, date and other metadata. Use when the user references a page by name ("the launch brief", "Sara's onboarding page") and you need the actual content to summarize, recap, translate, or quote. The bodyTruncated: true flag means content was clipped — for very long pages, ask the user which section they care about, or accept that you're working from the head of the page.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Page id |
| body | Yes | Page text, capped at 15,000 chars |
| date | Yes | The page's date, YYYY-MM-DD |
| icon | Yes | Icon name |
| name | Yes | Page name |
| cover | Yes | Built-in cover (`atw:1`…`atw:6`) or an uploaded file's name |
| spaceId | Yes | Space id |
| authorId | Yes | Employee id of the page's author |
| authorName | Yes | The author's name; null when no author or no longer a member |
| mentionCount | Yes | Number of mentions |
| bodyTruncated | Yes | True when `body` was clipped |
| attachmentCount | Yes | Number of attachments |
page.restoreRestore PageAIdempotentInspect
Bring back a deleted page with its content, in the place it was deleted from.
| Name | Required | Description | Default |
|---|---|---|---|
| pageId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| pageId | Yes | |
| restored | Yes |
page.updateUpdate PageADestructiveIdempotentInspect
Rename a page, change its icon, set or clear its cover, author or date, or move it to another space or folder. Only what you name changes; edit the page's content with page.edit.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The page's date, `YYYY-MM-DD`; null removes it | |
| icon | No | ||
| name | No | ||
| cover | No | A built-in cover, `atw:1` to `atw:6`; null removes it | |
| pageId | Yes | ||
| authorId | No | Employee id (from `member.read`) shown as the page's author; null removes it | |
| toSpaceId | No | Move the page to this space | |
| toFolderId | No | Move the page into this folder (of `toSpaceId`, or of the page's own space when that is absent) |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| pageId | Yes | |
| changed | Yes | |
| location | Yes | Where the page sits |
peek.add_layout_itemAdd Field To Record LayoutAInspect
Append (or insert at index) an item into a record layout (how a row opens; a form is refused: change its questions with form.update). Types: 'attribute' (a field; pass attributeCode, one of the sheet's field codes from sheet.schema or peek.read), 'tabs' (a Tabs block; pass tabTitles, 1-8), 'related_rows' (the rows a Relation field links to; pass the Relation field's attributeCode and display list | table), 'history' (the row's change history), 'comments' (the row's comments). Pass tabId (from peek.read) to put any item inside that tab. Pass underTitle: true with type 'attribute' to show the field on the line under the record's title, at its end (at most 4 short fields: Status, Select, Date, Number, Email, Short Text, Modified at…; a field already on the layout moves there). 'header', 'welcome' and 'submit' are legacy form items and are refused on a record layout.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | ||
| index | No | ||
| tabId | No | ||
| title | No | ||
| peekId | No | ||
| display | No | ||
| tabTitles | No | ||
| isRequired | No | ||
| underTitle | No | ||
| attributeCode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| layoutItemId | Yes |
peek.readRead Record LayoutARead-onlyIdempotentInspect
Read a peek and return its kind (form: it collects new rows; record: a record layout, how a row opens), its layoutStyle, its layout array and options. Items reference sheet attributes by code; a record layout also holds Tabs blocks (tabs, and tabId on the items inside a tab), Related rows (display), History and Comments, and marks the fields shown under the record's title underTitle: true. Use before changing a record layout with peek.add_layout_item, peek.remove_layout_item, peek.reorder_layout, peek.update_options or peek.update_field_options; a form is changed with form.update.
| Name | Required | Description | Default |
|---|---|---|---|
| peekId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| kind | Yes | form: it collects new rows; record: how a row opens |
| name | Yes | |
| layout | Yes | |
| peekId | Yes | |
| options | Yes | |
| sheetId | Yes | |
| description | Yes | |
| layoutStyle | Yes | A form's layout: classic (side by side by width) or steps (one question at a time); a record layout: columns |
peek.remove_layout_itemRemove Field From Record LayoutADestructiveIdempotentInspect
Remove an item from a record layout (how a row opens; a form is refused: take a question off it with form.update removeFields). Identify the item by layoutItemId (returned by peek.read) or by attributeCode (removes the first attribute item matching that code — useful for 'remove cover/icon'). Removing from the layout does NOT delete the underlying sheet attribute; use sheet.remove_attribute for that. Removing a field shown under the title takes it off the layout altogether; to move it back into the body instead, use peek.reorder_layout underTitle without it.
| Name | Required | Description | Default |
|---|---|---|---|
| peekId | No | ||
| layoutItemId | No | ||
| attributeCode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| removedCount | Yes |
peek.reorder_layoutReorder Record LayoutADestructiveIdempotentInspect
Reorder a record layout's (how a row opens) items by passing the full list of item ids in the desired order. Must be a permutation of the current layout (no missing or extra ids — call peek.read first to discover ids). For 'move X to top' or 'put Y after Z', read the layout, build the new id sequence yourself, and pass it here. Pass underTitle (item ids, in order, at most 4 short fields) to set exactly which fields show on the line under the record's title; fields left out go back into the body where they sit, and [] empties the line. orderedItemIds is optional with underTitle. A form is refused: reorder its questions with form.update order.
| Name | Required | Description | Default |
|---|---|---|---|
| peekId | No | ||
| underTitle | No | ||
| orderedItemIds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
peek.update_field_optionsUpdate Record Layout FieldADestructiveIdempotentInspect
Patch per-field options on a single item of a record layout (how a row opens; a form is refused: change a question's label or required flag with form.update editFields): title override (the label for this field, separate from the sheet attribute name), isRequired flag, background, color, borderColor, borderSize, radiusSize, radius, align. Identify the item by layoutItemId (from peek.read) or attributeCode (matches first attribute item). Only included option keys are touched.
| Name | Required | Description | Default |
|---|---|---|---|
| peekId | No | ||
| options | Yes | ||
| layoutItemId | No | ||
| attributeCode | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| matchedItemId | Yes |
peek.update_optionsUpdate Record Layout SettingsADestructiveIdempotentInspect
Patch a peek's options. A form (kind form): theme { preset workspace | paper | sand | ocean | forest | dusk, appearance auto | light | dark }, accent (a palette token color-N), header { logo, cover, width narrow | normal | wide, direction auto | ltr | rtl } and submit { label }; its questions and layout change with form.update. A record layout (how a row opens): color, accentColor, border, size, direction, rows, header text/background/size/align, and record — saving (auto | button), buttons { saveAndNew, discard, rowNav } (shown with a Save button), readOnly, openAs (panel | dialog | page), use { newRow (the layout + New uses; one per sheet, so true clears it on the sheet's other layouts), openAsMenu (listed in the Open as menu) }. record is merged key by key into the stored one. To make a layout the sheet's default when a row opens, use sheet.update defaultFormId. Pass only the keys you want to change — existing options are preserved. Booking-specific options are not exposed via this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| peekId | No | ||
| options | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes |
portal.updateUpdate PortalADestructiveIdempotentInspect
Set up the client portal (what customers see): title, welcome text, sign-in, and sections for an FAQ read from a sheet, a contact form and a contact card. Settings and sections not named are kept; a second FAQ or form on the same sheet updates the first. Owner or an Admin only. Always asks the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| faq | No | An FAQ section that reads its questions and answers from a sheet | |
| title | No | ||
| contact | No | A contact card | |
| contactForm | No | A section with a form customers fill in | |
| welcomeText | No | ||
| requireLogin | No | Customers must sign in to see the portal | |
| customerRegistration | No | Customers may sign up on their own |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| changed | Yes |
preferences.readRead PreferencesARead-onlyIdempotentInspect
Read the user's own preferences: language, theme, calendar, start page, sidebar, presence status, live-update toasts, chat history retention, pins and who sees each profile field.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| dock | Yes | |
| pins | Yes | |
| theme | Yes | |
| calendar | Yes | |
| language | Yes | |
| presence | Yes | |
| startPage | Yes | |
| dockAutohide | Yes | |
| navCollapsed | Yes | |
| toastPosition | Yes | |
| toastMaxVisible | Yes | |
| liveUpdateToasts | Yes | |
| profileVisibility | Yes | Who sees each profile field (email, phone, pronouns, location, workingHours, timezone): org, team or admins |
| agentHistoryRetentionDays | Yes |
preferences.updateUpdate PreferencesADestructiveIdempotentInspect
Change the user's own preferences: theme, calendar (Gregorian or Jalali), start page, sidebar position and auto-hide, collapsed nav, presence status, live-update toasts, chat history retention, pins and who sees each profile field (profileVisibility). Only the keys given change. Language is not here: use language.update.
| Name | Required | Description | Default |
|---|---|---|---|
| dock | No | Sidebar position | |
| pins | No | The pinned spaces and apps, in order; replaces the whole list | |
| theme | No | ||
| calendar | No | Which calendar dates are shown in | |
| presence | No | auto = from the calendar and working hours | |
| startPage | No | The section the panel opens on after login | |
| dockAutohide | No | ||
| navCollapsed | No | Side nav collapsed to the mini rail | |
| toastPosition | No | Screen corner where notification pop-ups appear; errors stay top center | |
| toastMaxVisible | No | Most notification pop-ups shown at once; null = no limit | |
| liveUpdateToasts | No | Toast when teammates change items in open sheets | |
| profileVisibility | No | Who sees each profile field: org = everyone in the org, team = the user's team, admins = only admins. Only the fields given change; admins and the user always see everything. | |
| agentHistoryRetentionDays | No | Delete Dana chats older than this many days; null keeps them forever |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | The preferences as saved |
profile.updateUpdate Your ProfileADestructiveIdempotentInspect
Change the user's own profile: first and last name, job title (from the organization's list), @handle, pronouns, bio, phone number, status line, timezone and out-of-office days. Only the fields given change. Who sees each field is a preference (preferences.update profileVisibility). Working hours: working_hours.update.
| Name | Required | Description | Default |
|---|---|---|---|
| bio | No | Up to 280 characters; empty clears it | |
| job | No | A job title from the organization's Jobs list, by name; jobs are never created here | |
| phone | No | Phone number as the user wrote it: digits, spaces and + ( ) - . only, at least 3 digits; empty clears it. Who sees it is a preference. | |
| handle | No | The @handle of the public profile | |
| status | No | The status line next to the name; null clears it | |
| lastName | No | ||
| pronouns | No | Empty clears them | |
| timezone | No | IANA zone, e.g. Europe/Berlin | |
| firstName | No | ||
| outOfOffice | No | Whole-day time off in the calendar, inclusive days; the list replaces current and future whole-day time off, past time off is kept; to: null = until further notice; null clears it |
Output Schema
| Name | Required | Description |
|---|---|---|
| saved | Yes | Each changed field as saved |
recipe.searchFind Build And Automation RecipesARead-onlyIdempotentInspect
Find worked recipes for builds (a formula, rollup, rating or autofill field, dependencies, a board or filtered view, a CRM with a dashboard, a tracker with a page, a template, a booking link, the client portal, publishing a view, team access) and automations (email to a sheet, a scheduled item, notify on a new item or a status change, a daily digest, Slack or Telegram messages, Telegram notifications). Call it before drafting a build or an automation. Each recipe has the questions to ask when the request is ambiguous (ask), what must exist first (prerequisites), the tools to call, a template whose "<<name>>" strings you replace with values like the placeholders samples, and what to tell the user after (afterApply). A steps template is the doc for steps.draft (steps.apply over MCP); a tool template is the args of that tool; a setting template is a setting the user changes, not a workflow. A then call, when present, runs once the template is applied, with the ids of what it created.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | The user's request, in their words and language |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Why `recipes` is empty |
| recipes | Yes | Best match first |
schedule.readRead Day PlanARead-onlyIdempotentInspect
Read the invoking user's working-hours schedule. Returns the work interval for a given date (today by default), the full workdays list (0=Sun … 6=Sat), and the user's timezone. When the user hasn't configured working hours the tool returns Mon–Fri 09:00–17:00 UTC with fallback: true — the agent should caveat its response accordingly.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO date (YYYY-MM-DD) to check. Defaults to today in the user's timezone when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fallback | Yes | True when the user has no working hours and the Mon–Fri 09–17 UTC default was used |
| timezone | Yes | The user's IANA timezone |
| workdays | Yes | Days of the week with working hours, 0 = Sunday … 6 = Saturday |
| isWorkday | Yes | |
| todayDate | Yes | The date checked, YYYY-MM-DD |
| todayInterval | Yes | The working window (HH:mm) on that date; null on a day off |
sheet.add_attributeAdd Sheet FieldAInspect
Add a new attribute (field) to an existing sheet. Use during refinement (add a phone field). dataType MUST be a canonical Atwork name; for currency, pass dataType Number with description: "USD; whole numbers". Returns the new attributeId. For a Status/Select/Multi-Select field, pass the choices as options.items: [{title, color?, stage?}] — ids are generated server-side; on a Status field stage (Todo / InProgress / Complete) puts the choice in that stage, default Todo. Set isUnique: true on a field whose value identifies a row: item.create then dedupes on it. For a Relation to an existing sheet pass options.relatedSheetId (from workspace.structure) and twoWay: true to add the reverse field there too (default one-way). For a Code field (raw source with a language tag) pass options.language, one of: plain / html / json / typescript / javascript / sql / css / markdown. Computed fields name other fields, never ids: Formula takes options.formula with fields in braces ({Price} * {Quantity}); Mirror takes options.relation (a Relation field here) + options.field (on the related sheet); Rollup takes options.relation + options.function (COUNT / DISTINCT_COUNT / SUM / AVG / MIN / MAX) + options.field (a Number field there, not for COUNT); Rate takes options.stars; Pipeline takes options.stages; Summary takes options.template with fields in braces; Button takes options.workflow, the name of a manual-trigger workflow on this sheet. File List may take options.allowedFiles (any / images / documents / media / custom), options.allowedExtensions (with custom, e.g. ["pdf"]) and options.maxFiles (1–100). A name that does not exist is refused with the valid ones. Timer and DocX need nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| options | No | Choices for Status / Select / Multi-Select fields, in display order — `language` for a Code field — `relatedSheetId` (+ `twoWay`) for a Relation — or the settings of a Formula, Mirror, Rollup, Rate, Pipeline, Summary or Button field. | |
| sheetId | Yes | ||
| dataType | Yes | ||
| isUnique | No | Reject a second row with the same value; item.create then dedupes on this field. Only on Short Text / Number / Email / URL / PhoneNumber fields. | |
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| attributeId | Yes | Id of the new field |
sheet.aggregateAggregate Sheet DataARead-onlyIdempotentInspect
Compute one or more aggregations (COUNT, DISTINCT_COUNT, SUM, AVG, MIN, MAX, FIRST, LAST) over a sheet's rows, with optional filter and groupBy. Use for analytical questions like 'total revenue by stage', 'count of leads created this month', 'average response time per assignee'. Multiple functions in one call share the same column/filter/groupBy — pass ["SUM", "AVG"] together to get both for free. For date columns, group with timeBucket: 'month' (or 'quarter', etc.). Filter operators include the usual comparison ops plus date shortcuts (THIS_MONTH, BEFORE_TODAY, etc.) — see the schema. Filter values on Status, Select, Multi-Select, Pipeline, person, team, job and relation columns may be the names you see in sheet.read (e.g. 'Done'); grouped rows carry label = the name and labelId = the raw id. Read sheet.read once first to discover attribute codes; aggregate is the right tool when raw rows would exceed your context.
| Name | Required | Description | Default |
|---|---|---|---|
| column | No | ||
| filter | No | ||
| groupBy | No | ||
| sheetId | Yes | ||
| functions | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | Aggregation rows as the worksheet service returns them, one per group |
| summary | Yes | Echo of the request that ran |
sheet.convert_to_taskConvert Sheet To TasksheetBDestructiveIdempotentInspect
Turn a worksheet into a tasksheet in place: it gains Status, Assignee, Due Date and Priority, and its rows become tasks. Rows and fields stay.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| type | Yes | |
| sheetId | Yes |
sheet.createCreate SheetAInspect
Create a new sheet with optional initial attributes. intent: 'form' is for public-facing data-collection forms; intent: 'sheet' is for internal data tables. Pass the user's full proposed schema in attributes — this is the first-turn fat call. dataType values must be canonical Atwork names; if the user asks for currency, use Number with description: "USD; whole numbers". Every sheet gets a primary column that is a literal Title: do not add a separate name field in attributes; rename the Title to fit the sheet (Company, Task) with sheet.update_attribute. Returns the new sheetId. Call this exactly once per conversation; refinements use sheet.add_attribute / sheet.update_attribute / sheet.remove_attribute. Pass spaceId and folderId to say where the sheet goes — list them with workspace.structure. Without folderId the sheet goes in the space's root folder. (Panel-invoked calls may omit both; the invocation's placement is then used.) For a Status/Select/Multi-Select field, pass its choices as options.items: [{title, color?, stage?}]; on a Status field stage (Todo / InProgress / Complete) puts the choice in that stage, default Todo — give the done choices Complete. Set isUnique: true on a field whose value identifies a row (an external id, an email): item.create then dedupes on it.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Bootstrap icon name, e.g. 'bi-archive'. | |
| name | Yes | ||
| type | Yes | ||
| intent | Yes | ||
| spaceId | No | Space to create the sheet in. Get it from workspace.structure. | |
| folderId | No | Folder inside that space. Get it from workspace.structure. | |
| attributes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| sheetId | Yes | Id of the new sheet |
| spaceId | Yes | Space the sheet landed in |
sheet.deleteDelete SheetADestructiveIdempotentInspect
Delete a sheet with its rows, views, forms, dashboards and workflows. This always asks the user first: say what goes before you call it. sheet.restore brings it back, except the files in its File List fields: those are deleted for good, and the approval card says so.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| deleted | Yes | |
| sheetId | Yes | |
| restoreWith | Yes | The tool that brings it back, with the same sheetId |
sheet.readRead Sheet RowsARead-onlyIdempotentInspect
Read rows from a sheet the user has access to. Returns the sheet's title and up to limit row objects. ID-typed cells are pre-resolved to display names: single-value (Member, Team, Job, Status, Select, Pipeline, Actor, CreatedBy, ModifiedBy) become the resolved name; list-valued (Employee List, Team List, Job List, Multi-Select, Relation) become a comma-joined string. Original FK ids are preserved on each row under _ids[code] (string for single-valued, string[] for list-valued) when you need them for follow-up tools. Mirror and File List cells pass through as raw values. filters values on those columns may be the names you see (e.g. Status EQ 'Done', Assignee EQ 'Sara'); an unknown or ambiguous name is an error that lists the choices. Document and Description cells are returned IN FULL as markdown by default — headings, lists, links and code preserved — so you never need a second call to read a description. All other cells are clipped to 80 characters with a trailing '…'. Rows come in a stable order. Each call returns as many whole rows as fit (up to limit), with total (rows matching the filters), hasMore and nextOffset: to read every row, call again with offset = nextOffset until hasMore is false. To count rows that match a condition, pass filters and read total instead of paging. Use a tighter limit when you only need a sample. Archived rows are left out unless archived is shown or only; then each row carries Archived and ArchivedAt. Contact cells (email, phone, address, location; on the employee sheet also handle and bio) come back as null unless includeContactFields is true — set it only when the user explicitly asks for contact details. Password cells are always null. sort orders the rows by up to three fields (name or code, asc or desc); for latest, recent or newest questions sort by ModifiedAt desc (recently changed) or CreatedAt desc (recently added), for the oldest use asc. Without sort rows keep the sheet's board order. Empty cells come first in a descending sort, and a sort field edited between calls can shift rows across pages. fields returns only the named attributes plus id; documents = preview clips Document and Description cells to 80 characters and omit leaves them out — use either to scan many rows in one call, then read one row (e.g. filter Index EQ) for its documents in full.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Row order, up to three keys applied in turn; `field` is an attribute name or code. Newest first = `[{ field: "ModifiedAt", direction: "desc" }]` (recently changed) or CreatedAt desc (recently added) | |
| limit | No | ||
| fields | No | Return only these attributes (names or codes) plus `id`; use it to scan many rows per call | |
| offset | No | Row position to start at; pass the previous call's `nextOffset` to read the next page | |
| filters | No | ||
| sheetId | Yes | ||
| archived | No | Archived rows: hidden (default), shown alongside the rest, or only the archived ones | |
| documents | No | Document and Description cells: `full` markdown (default), an 80-char plain-text `preview`, or `omit` them | full |
| includeContactFields | No | Return email, phone, address and location cells. Set it only when the user explicitly asks for someone's contact details. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | Yes | Row objects keyed by attribute code; ID-typed cells are display names, raw ids under `_ids` |
| sheet | Yes | The sheet that was read |
| total | Yes | How many rows match the filters and archived setting |
| offset | Yes | Position of the first returned row |
| hasMore | Yes | True when rows remain after this page |
| returned | Yes | How many rows this call returned |
| truncated | Yes | Same as `hasMore` |
| nextOffset | Yes | Pass as `offset` to read the next page; null when `hasMore` is false |
sheet.remove_attributeRemove Sheet FieldADestructiveIdempotentInspect
Remove an attribute from a sheet. The server may reject removing the primary Title column (PRIMARY_TITLE_PROTECTED). Removed attributes go to a deleted-attributes pool and can be restored if needed; this is therefore mutating_reversible. The files of a File List field are the exception: they are deleted for good. Removing a File List field that holds files is refused with FILE_LIST_FILES_LOST, naming the field and how many rows hold files, and nothing is removed; tell the user and call again with confirmFileLoss: true only once they accept. In a chat the user accepts on a card instead: the call waits for it.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes | ||
| attributeId | Yes | ||
| confirmFileLoss | No | Remove a File List field whose files are deleted for good. Only once the user accepts it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | The change was applied |
| name | Yes | Its name |
| attributeId | Yes | The removed field |
sheet.renameRename SheetADestructiveIdempotentInspect
Rename a sheet (display label change only — does not affect attributes or data). Server may reject on name conflicts within the same space (SHEET_NAME_CONFLICT) — Formia should disambiguate via prose if rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | The change was applied |
sheet.restoreRestore SheetAIdempotentInspect
Bring back a deleted sheet with its rows, views, forms, dashboards, workflows and task records, in the place it was deleted from. Its workflows come back turned off: tell the user, who turns them on again.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| tasks | Yes | |
| sheetId | Yes | |
| restored | Yes | |
| workflows | Yes | |
| dashboards | Yes |
sheet.restore_attributeRestore Sheet FieldAIdempotentInspect
Restore a field that was removed from a sheet with sheet.remove_attribute. Removal is a soft delete — the column and its data are kept — so this brings the field and its values back. Use it to undo a removal you or the user regrets; you need the same attributeId the field had.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes | ||
| attributeId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | The change was applied |
sheet.schemaRead Sheet StructureARead-onlyIdempotentInspect
Read a sheet's STRUCTURE (not its rows): every attribute with its id, code, name and canonical dataType, plus the live option items of Select/Status/Multi-Select fields (an archived choice carries archived: true), each field's default value when it has one, the sheet's views, and its peeks with their kind (form: collects new rows, changed with form.; record: a record layout, how a row opens, changed with peek.). Call this before any structural edit — sheet.update_attribute needs the attribute id, and editing options requires the EXISTING option ids returned here (reusing an id edits that option in place; a new option is added by omitting the id). Use sheet.read instead when you want the data in the rows.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| peeks | Yes | Peeks (detail layouts) and forms |
| sheet | Yes | The sheet |
| views | Yes | Views on the sheet |
| truncated | Yes | True when the sheet's schema was too large to return in full |
| attributes | Yes | Fields with their live option ids; reuse those ids verbatim when editing choices |
sheet.set_autofillSet Field AutofillADestructiveIdempotentInspect
Make a field fill itself on an existing sheet, or stop it. source: ai writes from an instruction reading readFields (by name) — it uses AI credit, so tell the user (the result's note). source: formula computes the value from formula, with fields in braces ({Price} * {Quantity}). source: manual removes the field's autofill. Fields are named as sheet.schema lists them; an unknown name is refused with the valid ones.
| Name | Required | Description | Default |
|---|---|---|---|
| when | No | When it fills: `created` (new rows), `first_value` (once the named field gets a value) or `changed` (whenever the named fields change). Default: AI on created; a formula whenever the fields it reads change. | |
| field | Yes | Name (or code) of the field that fills itself. | |
| source | Yes | `ai` fills from an instruction, `formula` computes it, `manual` turns autofill off. | |
| formula | No | Formula only: fields in braces, e.g. `{Price} * {Quantity}`. | |
| sheetId | Yes | ||
| readFields | No | AI only: the fields the AI reads, by name. | |
| instruction | No | AI only: what to write into the field. | |
| keepUpdated | No | Also refill a value autofill wrote earlier (never a person's). Default: true for a formula, false for AI. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Tell the user this (AI credit use) |
| field | Yes | The field whose autofill was set |
| source | Yes | What fills it now; manual = autofill removed |
| workflowId | No | The autofill workflow |
sheet.set_dependenciesSet Sheet DependenciesADestructiveIdempotentInspect
Turn dependencies on or off for a worksheet or tasksheet. On adds the Blocking / Blocked By fields (or brings them back with their links); off hides them from every view and keeps the links. Once on, link rows with item.update_humanized / item.create_humanized using Blocked By (or Blocking) values given as item titles, Index (#10) or ids from the same sheet. Off is refused while the sheet has a Gantt view.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | true adds the Blocking / Blocked By fields; false hides them and keeps the links | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| enabled | Yes | Whether the sheet now has dependencies |
| blockingAttributeId | Yes | Id of the Blocking field; null when off |
| blockedByAttributeId | Yes | Id of the Blocked By field; null when off |
sheet.updateUpdate Sheet SettingsADestructiveIdempotentInspect
Change a sheet's settings: name, icon, description, color, row prefix, item noun, sub-items, the form rows open in, or the order of its views. Only the settings you name change. Ids come from sheet.schema.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | No | ||
| color | No | A palette color name or a hex color | |
| prefix | No | The key shown before each row's index, e.g. "MRK" for MRK-10 | |
| sheetId | Yes | ||
| itemNoun | No | What one row is called, e.g. "campaign" | |
| subItems | No | Let rows have sub-items | |
| viewOrder | No | Every view id, in the order the tabs show | |
| description | No | ||
| defaultFormId | No | The record layout (a peek of kind record from `sheet.schema`) a row opens in, or "default"; a form is refused |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| changed | Yes | The settings this call changed |
| sheetId | Yes |
sheet.update_attributeUpdate Sheet FieldADestructiveIdempotentInspect
Update an existing attribute (field) on a sheet. Pass only what changes. Call sheet.schema first for the field's id, its live option ids, its current default and its archived choices.
Basics:
name,description,icon,dataType,isUnique(Title, Short Text, URL, Phone Number, Email; on a field that already holds duplicates it fails with UNIQUE_HAS_DUPLICATES and nothing changes, so ask the user to remove them first), anddefault, the value new rows start with (choices, members, teams, jobs, Date).Format:
number(format such as Euro or Dollar,decimals,showAs),date(dateFormat,timeFormat),checkboxStyle,selectStyle,language(Code), andrelationon a Relation field:subtitle(a related field shown under each link),viewandform(by name, of the related sheet),filter(which related rows can be picked, in sheet.read'sfiltersshape). Underoptions:formula/returnType(Formula),relation/field/function(Mirror, Rollup),stars(Rate, 2–20),workflow(Button, by name),template(Summary),allowedFiles(any / images / documents / media / custom),allowedExtensions(with custom, e.g. ["pdf"]) andmaxFiles(1–100, null for no limit) (File List). Every setting is merged into the field's live settings; a setting for another type is refused, naming the types it applies to, and an unknown name is refused listing the valid ones.Choices of a Status/Select/Multi-Select field: option edits are a MERGE, so reuse a live option's
idto rename or recolour it in place, omit the id to add a new choice, and list ids inremoveOptionIdsto delete choices. Leaving an option out never deletes it. Never invent an option id — rows reference options by id and a wrong id is rejected.archived: truehides a Select/Multi-Select choice from pickers while rows keep it (Status choices cannot be archived).isDefault: truemakes a choice the default (a Multi-Select adds it to its defaults),falsetakes it out.orderlists the choice ids in their new order, every live id exactly once. On a Status field each choice sits in a stage bucket;sheet.schemareports it asstage(Todo / InProgress / Complete). Passstageon an item to put a new choice in that stage or move a live one (keep its id); a new choice defaults to Todo, and a Statusordermay also name just one stage's choices.stageis rejected on Select / Multi-Select and on an older Status field whose choices are not in stages.Not here: a relation's two-way setting (turning it off deletes the reverse field for good), a relation's target sheet (fixed once created), Pipeline stages (their ids are stored in the rows) and the Duration format. Point the user to the field's settings in the panel.
A dataType change follows a fixed compatibility list: a type that is not offered is refused with DATA_TYPE_CHANGE_NOT_ALLOWED, listing the allowed types, and nothing is changed. A change that would empty or shorten values is refused with DATA_TYPE_CHANGE_BLOCKED, carrying the counts, before → after samples and the views and workflows that use the field, and nothing is changed; show that to the user and call again with
confirmLoss: trueonly once they accept the loss. In a chat the user confirms the loss on a card instead: the call waits for it and applies the change once they accept.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date only: how the date and the time are written. | |
| icon | No | A Bootstrap icon name, e.g. `bi-star`. | |
| name | No | ||
| order | No | Choice ids in their new order, each live id exactly once. On Status, either every choice or every choice of one stage; a choice keeps its stage. | |
| number | No | Number only: currency or number format (e.g. Euro), decimal places, and how it shows (NUMBER, BAR…). | |
| default | No | The value new rows start with, as a human value: a choice title, a member, team or job name (a list for list fields), `creator` for whoever adds the row, or `today` for a Date's creation day. null clears it. | |
| options | No | ||
| sheetId | Yes | ||
| dataType | No | ||
| isUnique | No | Title, Short Text, URL, Phone Number and Email only: refuse duplicate values. | |
| language | No | Code only. | |
| relation | No | Relation only: how linked rows are shown and picked. | |
| attributeId | Yes | ||
| confirmLoss | No | Apply a dataType change even though it empties or shortens values. Only after reading the preview. | |
| description | No | ||
| selectStyle | No | Select / Multi-Select only. | |
| checkboxStyle | No | Checkbox only. | |
| removeOptionIds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | The change was applied |
| name | Yes | Its name after the change |
| changed | Yes | The inputs that were applied, e.g. name, number, order, default |
| attributeId | Yes | The field that changed |
space.createCreate SpaceAInspect
Create a new, empty space. Use steps.apply instead when the space should come with sheets, pages or automations.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | An emoji or icon name | |
| name | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| spaceId | Yes |
space.deleteDelete SpaceADestructiveIdempotentInspect
Delete a space with every folder, sheet and page in it. This always asks the user first: say what is inside before you call it. space.restore brings it all back.
| Name | Required | Description | Default |
|---|---|---|---|
| spaceId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| deleted | Yes | |
| spaceId | Yes | |
| restoreWith | Yes | The tool that brings it back, with the same id |
space.restoreRestore SpaceAIdempotentInspect
Bring back a deleted space with the folders, sheets and pages its delete removed. Something deleted on its own before the space stays deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| spaceId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| spaceId | Yes | |
| restored | Yes | What came back with it: only what its delete removed |
space.updateUpdate SpaceADestructiveIdempotentInspect
Change a space's name, icon or description. Only the settings you name change. Get spaceId from workspace.structure.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | No | ||
| spaceId | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| changed | Yes | The settings this call changed |
| spaceId | Yes |
steps.applyScaffold Workspace StructureAInspect
Apply a declarative 'Steps' document that scaffolds a whole workspace at once: a space (new, or an existing one you name), optional folders, and one or more sheets (each with attributes/views/peeks). Use this for multi-sheet apps (e.g. a CRM with Contacts + Deals) instead of creating sheets one by one.
Every node has a doc-local 'ref'; cross-references use {"$ref":""}; attributes are targeted by their author-assigned 'code'.
To LINK two sheets (a relation), use dataType "Relation" with options.relatedSheet:{"$ref":""}, or {"$existing":{"sheetId":}} to link to a sheet that already exists in this workspace (id from workspace.structure). Do NOT use "Link" — that is a plain URL field, not a cross-sheet relation.
A count or sum over linked rows: dataType "Rollup" with options {type:"RELATION", relatedAttr:{"$ref":""}, fn:{functionType:"COUNT"}, returnType:"Number"}. A linked row's field: dataType "Mirror" with options {relationAttr:{"$ref":""}, mirroredAttr:{"$ref":"<field of the related sheet, or Title>"}}. Name fields by ref or code, never by id; new sheets only.
Set
isUnique: trueon an attribute whose value identifies a row (an external id, an email): item.create then dedupes on it.On a Status attribute give each option a
bucket("Todo" / "InProgress" / "Complete") so done choices read as done — give every option one.bucketis rejected on Select / Multi-Select.A sheet with no 'folder' lands at the space root. Only set a sheet's folder to a ref you declared in 'folders' — never to a space ref.
dataType values must be canonical Atwork names (e.g. "Short Text", "Long Text", "Number", "Email", "Date", "Select", "Status", "Relation"); a file field is always "File List".
Do NOT include a version or capabilities in the doc — those are handled automatically.
Placement: pass
spaceId(and optionallyfolderId) fromworkspace.structureto install into an EXISTING space. Omit both to create a new space.Optional extras: top-level 'forms' ({ref,name,sheet:{$ref},fields:[{code,required?,label?}]}), 'dashboards' ({ref,name,sheet:{$ref},widgets}), 'pages' ({ref,name,markdown}), 'spaceHome' ({widgets}) and 'seedRows' ({"": [{"": value}]}) for starter rows. Pass a draft from steps.draft unchanged; any other top-level key is an error.
'workflows' use the Steps workflow format from the build skill; a doc with only workflows on existing sheets ({"$existing":{"sheetId":}}) creates no space. Returns the created spaceId, a map of sheet ref -> new sheetId, each workflow's state or error, and the address of every sheet that now takes email.
| Name | Required | Description | Default |
|---|---|---|---|
| doc | Yes | ||
| spaceId | No | Install into this EXISTING space instead of creating a new one. From workspace.structure. | |
| folderId | No | Folder inside that space; defaults to the space root. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spaceId | No | The space the document was applied to (new or existing) |
| sheetIds | No | Sheet ref → new sheetId |
| workflows | No | One per workflow: active = running; error = why it was not created or turned on — tell the user |
| inboundAddresses | No | Email to this sheet: give the user this address; each email sent to it creates an item |
task.createCreate TaskAInspect
Create a task. Required: title. The task is created as an item in a tasksheet: pass sheetId, or omit it to use the user's default task sheet. assignee (a member name), status (an option label like 'In Progress'), and dueDate (ISO 8601) are optional and resolved to the sheet's real values — an unrecognised value returns an error listing the valid options. Returns {taskId, sheetId, spaceId}.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| status | No | Status by its option label, e.g. 'To Do' / 'In Progress' | |
| dueDate | No | ISO 8601 date/datetime | |
| sheetId | No | Tasksheet to create the task in. Omit to use the user's default task sheet. | |
| assignee | No | Assignee by name (resolved to a member); omit to leave unassigned |
Output Schema
| Name | Required | Description |
|---|---|---|
| taskId | Yes | Id of the created task item |
| sheetId | Yes | Task sheet the task was created in |
| spaceId | Yes | Space of that sheet; null for a sheet outside a space |
task.readList TasksARead-onlyIdempotentInspect
List tasks. For 'my tasks' / 'my open tasks' / 'what's due', call this with NO assigneeUserId — it defaults to the CURRENT authenticated user, so you never need an id. Only set assigneeUserId to look up a specific other person whose numeric userId you already have. Filter completion with state ('open' = not done, 'completed' = done) and use overdue: true for past-due, not-completed tasks. Also filterable by due-date window and sheet. limit caps the result count (default 25). Returns task objects with assigneeName, reporterName, sheetName (and their *Id FKs for follow-up tools) — prefer the *Name fields in prose.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| state | No | Completion filter via the task stage: 'open' = not completed (stage != Complete), 'completed' = done, 'all' = no filter. Omit to include all stages. | |
| overdue | No | When true, return ONLY tasks past their due date that are not completed (overdue). Overrides `state` and the due window. | |
| sheetId | No | Restrict to tasks attached to this sheet | |
| dueAfter | No | ISO datetime — tasks whose due date is after this | |
| dueBefore | No | ISO datetime — tasks whose due date is before this | |
| assigneeUserId | No | OMIT for the current user's own tasks ('my tasks', 'my open tasks') — the caller is inferred from auth. Never guess this. Only set it when the user explicitly asks about a specific OTHER person AND you already hold their numeric userId from a prior tool result. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tasks | Yes | Tasks matching the filters; prefer the *Name fields in prose, the *Id fields are FKs |
| truncated | Yes | True when more tasks may exist than `limit` returned |
template.browseBrowse TemplatesARead-onlyIdempotentInspect
List the published templates a user can install (the in-app template gallery): slug, name, tagline, categories and how many sheets, views, dashboards, pages and example rows each has. Filter by query words, category or language.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Words to match in a template's name, tagline or categories, e.g. 'crm'. | |
| category | No | ||
| language | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| templates | Yes |
template.installInstall TemplateAInspect
Install a published template: it builds the template's whole space (sheets, views, dashboards, pages, workflows and, unless includeSampleData is false, example rows) as a new space, or inside spaceId / folderId. Call it once the user has said yes. Returns the space and the main sheet.
| Name | Required | Description | Default |
|---|---|---|---|
| spaceId | No | Install into this existing space (from workspace.structure). Omit to create a new space. | |
| folderId | No | Folder inside `spaceId` to install into. | |
| template | Yes | Template slug (or id) from template.browse. | |
| includeSampleData | No | false installs the template without its example rows. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spaceId | Yes | The space the template was installed into |
| sheetIds | Yes | Sheet ref -> new sheet id |
| primarySheetId | No | The template's main sheet |
template.previewPreview TemplateARead-onlyIdempotentInspect
What a published template builds, in names: its sheets with their fields and views, dashboards, pages, workflows and how many example rows. Use it to describe a template before installing it.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Template slug from template.browse. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| slug | Yes | |
| pages | Yes | |
| sheets | Yes | |
| workflows | Yes | |
| dashboards | Yes | |
| description | No | |
| exampleRows | Yes |
view.createCreate Sheet ViewAInspect
Add a view to a sheet, with its settings in one call. Types: TABLE, KANBAN (board: columns by a Status or Select field — groupBy), CALENDAR, GANTT_CHART and TIME_LINE (rows placed on a Date field — dateField; a timeline's rows come from resourceField), GALLERY (needs at least one File List field on the sheet), CARD, EMAIL (only on an email sheet, one with the message_id and account fields a connected mailbox creates), BLOG (posts are the pages of a Document field — contentField) and PROCESS_MAP (how cards move between the values of one Status, Select, Employee or Team field — groupBy, required). Settings by field NAME: filter (the sheet.read filter form), sort, groupBy for a table's or card view's groups, hiddenFields / shownFields (TABLE, KANBAN, CARD). An unknown field name is refused with the names that exist. Vista views are not creatable here.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | Bootstrap icon name, e.g. 'bi-kanban'. | |
| name | Yes | ||
| sort | No | Row order, up to three keys; `field` is a name or code. `[]` clears it. | |
| type | Yes | ||
| filter | No | Rows the view shows. `null` clears the filter. | |
| groupBy | No | Field name or code to group by: a board's columns (Status/Select), or a table's or card view's groups. | |
| sheetId | Yes | ||
| dateField | No | Date field name or code that places rows on a CALENDAR, GANTT_CHART or TIME_LINE. | |
| shownFields | No | Field names or codes to show again (TABLE, KANBAN and CARD views). | |
| contentField | No | BLOG only: the Document field whose pages are the posts. Default: the sheet's first one. | |
| hiddenFields | No | Field names or codes to hide (TABLE, KANBAN and CARD views). | |
| resourceField | No | TIME_LINE only: the field whose values become the timeline's rows, e.g. Assignee. Default: the title. |
Output Schema
| Name | Required | Description |
|---|---|---|
| viewId | No | Id of the new view |
| sheetId | Yes | Sheet the view was added to |
| spaceId | Yes | Space of that sheet; null outside a space or when unknown |
view.deleteDelete Sheet ViewADestructiveIdempotentInspect
Delete a view from a sheet; its rows stay. Deleting a Charts (DASHBOARD) view deletes its dashboard. The sheet's default view cannot be deleted. This always asks the user first: say which view goes before you call it. The result names the restore tool.
| Name | Required | Description | Default |
|---|---|---|---|
| viewId | Yes | The view to delete (from sheet.schema). | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| viewId | Yes | |
| deleted | Yes | |
| sheetId | Yes | |
| dashboardId | No | For a Charts view: the dashboard to pass to dashboard.restore |
| restoreWith | Yes | The tool that brings it back: view.restore with sheetId + viewId, or dashboard.restore for a Charts view |
view.publishPublish Sheet ViewADestructiveIdempotentInspect
Publish a view as a read-only page (an app holding the view), viewable by anyone with the link unless public is false. Needs Admin access on the view's sheet. Always asks the user first. Returns the page's path.
| Name | Required | Description | Default |
|---|---|---|---|
| public | No | true: anyone with the link can view it. false: only members who have access. | |
| viewId | Yes | The view to publish (from sheet.schema) |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Path of the published page, on the org's panel domain |
| appId | Yes | |
| public | Yes | |
| created | Yes | false when the view was already published and was reused |
view.restoreRestore Sheet ViewAIdempotentInspect
Bring back a deleted view with its settings, by the sheetId and viewId view.delete returned. A Charts view comes back with its dashboard and widgets.
| Name | Required | Description | Default |
|---|---|---|---|
| viewId | Yes | The deleted view's id, as view.delete returned it. | |
| sheetId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| viewId | Yes | |
| sheetId | Yes | |
| restored | Yes | |
| dashboardId | No | For a Charts view: the dashboard that came back with it |
view.updateUpdate Sheet ViewADestructiveIdempotentInspect
Change an existing view's settings by field NAME: filter (the sheet.read filter form; null clears it), sort ([] clears it), groupBy, hiddenFields / shownFields (TABLE, KANBAN, CARD), dateField (CALENDAR, GANTT_CHART, TIME_LINE), resourceField (TIME_LINE), or its name / icon. Only what you pass changes; the view's other settings stay. The view id comes from sheet.schema.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | No | ||
| sort | No | Row order, up to three keys; `field` is a name or code. `[]` clears it. | |
| filter | No | Rows the view shows. `null` clears the filter. | |
| viewId | Yes | The view to change (from sheet.schema). | |
| groupBy | No | Field name or code to group by: a board's columns (Status/Select), or a table's or card view's groups. | |
| sheetId | Yes | ||
| dateField | No | Date field name or code that places rows on a CALENDAR, GANTT_CHART or TIME_LINE. | |
| shownFields | No | Field names or codes to show again (TABLE, KANBAN and CARD views). | |
| hiddenFields | No | Field names or codes to hide (TABLE, KANBAN and CARD views). | |
| resourceField | No | TIME_LINE only: the field whose values become the timeline's rows, e.g. Assignee. Default: the title. |
Output Schema
| Name | Required | Description |
|---|---|---|
| viewId | Yes | Id of the changed view |
| changed | Yes | The settings that were saved |
widget.createCreate Dashboard WidgetAInspect
Add a chart or number to a dashboard, in the shape steps.draft uses, with field names: type NUMBER, COLUMN, BAR, LINE, AREA or GAUGE; series: [{ legend, fn: { functionTypes: ["SUM"], params: [{ type: "ATTRIBUTE", value: "Amount" }] } }] (COUNT takes params: []); a chart that groups adds groupBy: { type: "PROPERTY", property: "Stage" }. A NUMBER tile takes an icon and options.withoutGroup: true. Place it with options.position: { x, y, cols, rows } on a 24-column grid.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | Yes | ||
| type | Yes | ||
| filter | No | Rows the whole widget counts | |
| series | No | ||
| groupBy | No | ||
| options | No | e.g. `position: { x, y, cols, rows }` on a 24-column grid; a NUMBER tile takes `withoutGroup: true` | |
| subGroup | No | Field name or code that splits each group | |
| dashboardId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| widgetId | Yes | |
| dashboardId | Yes |
widget.deleteDelete Dashboard WidgetADestructiveIdempotentInspect
Delete a chart or number widget from a dashboard. This always asks the user first: say which widget goes before you call it. widget.restore brings it back.
| Name | Required | Description | Default |
|---|---|---|---|
| widgetId | Yes | The widget to delete (dashboard.read lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| deleted | Yes | |
| widgetId | Yes | |
| dashboardId | Yes | |
| restoreWith | Yes | The tool that brings it back, with dashboardId + widgetId |
widget.restoreRestore Dashboard WidgetAIdempotentInspect
Bring back a deleted widget with its settings, by the dashboardId and widgetId widget.delete returned. A deleted dashboard comes back first with dashboard.restore.
| Name | Required | Description | Default |
|---|---|---|---|
| widgetId | Yes | The deleted widget's id, as widget.delete returned it. | |
| dashboardId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| restored | Yes | |
| widgetId | Yes | |
| dashboardId | Yes |
widget.updateUpdate Dashboard WidgetADestructiveIdempotentInspect
Change a widget's name, icon, type, series, filter, groupBy, subGroup or options, in widget.create's shape with field names. Only what you pass changes; options merges into the current ones.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | ||
| name | No | ||
| type | No | ||
| filter | No | Rows the whole widget counts | |
| series | No | ||
| groupBy | No | ||
| options | No | e.g. `position: { x, y, cols, rows }` on a 24-column grid; a NUMBER tile takes `withoutGroup: true` | |
| subGroup | No | Field name or code that splits each group | |
| widgetId | Yes | The widget to change (dashboard.read lists them). |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | Yes | The settings that were saved |
| widgetId | Yes | |
| dashboardId | Yes |
workflow.deleteDelete WorkflowADestructiveIdempotentInspect
Delete a workflow: it turns off, cancels scheduled runs, frees the sheet's email address. This always asks the user first. workflow.restore brings it back with its steps and versions, turned off.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| deleted | Yes | |
| stopped | Yes | What stopped with it |
| workflowId | Yes | |
| restoreWith | Yes | The tool that brings it back, turned off, with the same workflowId |
workflow.from_templateCreate Workflow From TemplateAInspect
Create a workflow on a sheet from a built-in template (workflow.list templates). It is a draft and off; adjust it with workflow.update and turn it on with workflow.publish.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| formId | No | A form id (sheet_schema peeks of kind form): a form of the sheet; the workflow runs only for that form's responses. Only for a template that starts on a new row | |
| sheetId | Yes | The sheet the workflow runs on | |
| templateId | Yes | A template id from workflow.list templates |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| nodes | Yes | Every step after the trigger, in canvas order |
| sheet | Yes | |
| state | Yes | |
| trigger | Yes | |
| workflowId | Yes | |
| description | No |
workflow.listList WorkflowsARead-onlyIdempotentInspect
List workflows, optionally for one sheet, with their state: on or off, published version, unpublished draft changes. deleted: true lists deleted ones for workflow.restore; templates: true lists the built-in templates for workflow.from_template.
| Name | Required | Description | Default |
|---|---|---|---|
| deleted | No | List deleted workflows instead, to bring one back with workflow.restore | |
| sheetId | No | Only the workflows of this sheet | |
| templates | No | List the built-in templates for workflow.from_template instead |
Output Schema
| Name | Required | Description |
|---|---|---|
| templates | No | |
| workflows | No |
workflow.publishPublish WorkflowADestructiveInspect
Publish a workflow's draft as a new version and turn it on. This always asks the user first. When the draft has errors nothing is published and the workflow stays as it was: errors say what to fix.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| errors | Yes | Why it was not published; fix them with workflow.update |
| version | No | |
| isActive | Yes | |
| warnings | Yes | |
| published | Yes | |
| workflowId | Yes |
workflow.readRead WorkflowARead-onlyIdempotentInspect
Read a workflow's draft: its sheet, trigger, every step with its ref, name, type, config, onError (if the action fails, on the steps that have it) and next (port → ref, an error branch on port error), and its state. Read it before workflow.update and name steps by these refs.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| nodes | Yes | Every step after the trigger, in canvas order |
| sheet | Yes | |
| state | Yes | |
| trigger | Yes | |
| workflowId | Yes | |
| description | No |
workflow.restoreRestore WorkflowAIdempotentInspect
Bring back a deleted workflow with its steps and versions. It comes back turned off: workflow.publish turns it on again. Restore its sheet first when that is deleted too.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes | A deleted workflow, from workflow.list deleted |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| note | Yes | |
| isActive | Yes | |
| workflowId | Yes |
workflow.toggleTurn Workflow On Or OffADestructiveIdempotentInspect
Turn a published workflow on or off. Turning it on asks the user first; turning it off runs at once and cancels its scheduled runs. It runs its published version: a workflow never published is turned on with workflow.publish.
| Name | Required | Description | Default |
|---|---|---|---|
| isActive | Yes | true turns it on (the user confirms first), false turns it off | |
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| isActive | Yes | |
| workflowId | Yes |
workflow.unpublishUnpublish WorkflowADestructiveIdempotentInspect
Unpublish a workflow: it turns off and its scheduled runs are cancelled. The draft and the published versions stay; workflow.publish turns it back on.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| isActive | Yes | |
| workflowId | Yes |
workflow.updateUpdate WorkflowADestructiveInspect
Edit a workflow's draft: rename it, replace its trigger, add, change or remove steps (branches included), or revert: true to discard the draft. Read it with workflow.read first and name nodes by their ref; never guess one. New steps are Steps workflow steps, and {{steps.<ref>.<path>}} may name an existing node's ref or a new step's ref. If the action fails: update: [{ref, onError}] sets stop, continue (skip failed items) or fallback_path (error branch) on integration_action, agent, transcribe and run_workflow steps; then add: [{after: ref, port: "error", steps}] puts steps on the error branch, in the same call or later (a step added in this call gets onError in a later call, by the ref workflow.read shows), and failed items reach them with the reason in {{ $input.error }}. Leaving fallback_path removes the steps only the error branch led to. On a workflow that is on, the change goes live only after workflow.publish.
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Steps inserted between `after` and what followed it | |
| name | No | ||
| remove | No | Refs to remove; an if or switch takes the steps under its branches along | |
| revert | No | Discard the draft and go back to the published version | |
| update | No | ||
| trigger | No | A Steps trigger; replaces the trigger's type and config and keeps what follows it | |
| workflowId | Yes | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| note | No | |
| added | Yes | Names of the steps added |
| removed | Yes | |
| updated | Yes | |
| isActive | Yes | |
| reverted | No | |
| workflowId | Yes | |
| triggerChanged | Yes | |
| hasDraftChanges | Yes |
working_hours.updateUpdate Working HoursADestructiveIdempotentInspect
Set the user's working hours on the named days (other days keep theirs). Every booking link and the day plan follow them.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | 24-hour "HH:mm" | |
| days | Yes | Days of the week, e.g. ["mon","tue","wed","thu","fri"] for weekdays. | |
| start | Yes | 24-hour "HH:mm" | |
| timezone | No | IANA zone, e.g. Europe/Amsterdam. Defaults to the current one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| workingHours | Yes | The working hours after the change |
workspace.searchSearch WorkspaceARead-onlyIdempotentInspect
Search the workspace by content across sheets, pages, dashboards, items, tasks, employees, teams, and jobs. Returns up to limit ranked hits with kind/id/name/snippet. Use when the user references something by name ("the Pipeline sheet", "Sara's onboarding", "the launch blog") and you need its id to pass to other tools. Item-level search (rows inside sheets) covers all column content. Use parentSheetId to restrict to a specific sheet. Archived items are never returned; read them with sheet.read and archived: "only". Email addresses and phone numbers in names and snippets come back as [redacted].
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| types | No | Restrict to a subset of kinds. Omit to search all. | |
| parentSheetId | No | Restrict to items inside a specific sheet (e.g. 'find rows in the Pipeline sheet matching X'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Ranked hits; `id` is what other tools take (items are UUIDs, top-level entities numeric ids as strings) |
| truncated | Yes | True when more hits matched than `limit` allowed |
workspace.structureList Spaces And FoldersARead-onlyIdempotentInspect
List the spaces the user can see, each with its folders and the items inside them (sheets, pages, dashboards). Call this FIRST when you need to create something and must decide where it goes: spaceId and folderId from here are what sheet.create, page.create and steps.apply take as their target. For an item, refId is the entity id to pass to other tools (e.g. a SHEET item's refId is the sheetId for sheet.schema). Use workspace.search instead when you know the name of the thing you want and just need its id.
| Name | Required | Description | Default |
|---|---|---|---|
| spaceId | No | Return only this space. Omit for every space you can see. |
Output Schema
| Name | Required | Description |
|---|---|---|
| spaces | Yes | Spaces the caller can see, each with its folders and items; an item's `refId` is the sheet/page/dashboard id |
| truncated | Yes | True when spaces were dropped to fit the result cap; narrow with `spaceId` |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- Changed
form.update1 field changed- added
Input schema / properties / onResponseAdded value: +{ + "description": "The emails a response sends; only the switch you pass changes.", + "properties": { + "copy": { + "description": "Email the person who filled the form a copy of their answers", + "properties": { + "field": { + "description": "The Email field on the form holding the address; default: the first one", + "minLength": 1, + "type": "string" + }, + "on": { + "type": "boolean" + } + }, + "required": [ + "on" + ], + "type": "object" + }, + "notify": { + "description": "Email these members one email per response, with the answers", + "properties": { + "on": { + "type": "boolean" + }, + "people": { + "description": "Members to email, by name or employee id; default: you", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 20, + "type": "array" + } + }, + "required": [ + "on" + ], + "type": "object" + } + }, + "type": "object" +}
- Changed
item.update_where1 field changed- added
Input schema / properties / confirmRowsAdded value: +{ + "description": "MCP only: the number of rows the user accepted after a ROWS_NEED_CONFIRM refusal. Needed when more than 20 rows would change; never set it before the user agrees.", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +}
- Changed
preferences.read3 fields changed- added
Output schema / properties / toastMaxVisibleAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / toastPositionAdded value: +{ + "enum": [ + "top-right", + "top-left", + "bottom-right", + "bottom-left" + ], + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "theme", - "calendar", - "startPage", - "dock", - "dockAutohide", - "navCollapsed", - "presence", - "liveUpdateToasts", - "agentHistoryRetentionDays", - "pins", - "profileVisibility", - "language" -]New value: +[ + "theme", + "calendar", + "startPage", + "dock", + "dockAutohide", + "navCollapsed", + "presence", + "liveUpdateToasts", + "toastPosition", + "toastMaxVisible", + "agentHistoryRetentionDays", + "pins", + "profileVisibility", + "language" +]
- Changed
preferences.update4 fields changed- added
Input schema / properties / toastMaxVisibleAdded value: +{ + "anyOf": [ + { + "anyOf": [ + { + "const": 1, + "type": "number" + }, + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + }, + { + "const": 5, + "type": "number" + } + ] + }, + { + "type": "null" + } + ], + "description": "Most notification pop-ups shown at once; null = no limit" +} - added
Input schema / properties / toastPositionAdded value: +{ + "description": "Screen corner where notification pop-ups appear; errors stay top center", + "enum": [ + "top-right", + "top-left", + "bottom-right", + "bottom-left" + ], + "type": "string" +} - added
Output schema / properties / saved / properties / toastMaxVisibleAdded value: +{ + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / saved / properties / toastPositionAdded value: +{ + "enum": [ + "top-right", + "top-left", + "bottom-right", + "bottom-left" + ], + "type": "string" +}
- Changed
sheet.add_attribute3 fields changed- added
Input schema / properties / options / properties / allowedExtensionsAdded value: +{ + "description": "File List only: the extensions a Custom rule takes, without the dot, e.g. [\"pdf\", \"docx\"].", + "items": { + "maxLength": 11, + "minLength": 1, + "type": "string" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / options / properties / allowedFilesAdded value: +{ + "description": "File List only: which files it takes; `media` is audio and video, `custom` takes allowedExtensions.", + "enum": [ + "any", + "images", + "documents", + "media", + "custom" + ], + "type": "string" +} - added
Input schema / properties / options / properties / maxFilesAdded value: +{ + "anyOf": [ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "File List only: at most this many files (1–100); null removes the limit." +}
- Changed
sheet.schema1 field changed- added
Output schema / properties / attributes / items / properties / options / properties / fileRulesAdded value: +{ + "additionalProperties": false, + "description": "File List only: which files the field takes and how many", + "properties": { + "allowedExtensions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "allowedFiles": { + "type": "string" + }, + "maxFiles": { + "type": "number" + } + }, + "required": [ + "allowedFiles" + ], + "type": "object" +}
- Changed
sheet.update_attribute3 fields changed- added
Input schema / properties / options / properties / allowedExtensionsAdded value: +{ + "description": "File List only: the extensions a Custom rule takes, without the dot, e.g. [\"pdf\", \"docx\"].", + "items": { + "maxLength": 11, + "minLength": 1, + "type": "string" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / options / properties / allowedFilesAdded value: +{ + "description": "File List only: which files it takes; `media` is audio and video, `custom` takes allowedExtensions.", + "enum": [ + "any", + "images", + "documents", + "media", + "custom" + ], + "type": "string" +} - added
Input schema / properties / options / properties / maxFilesAdded value: +{ + "anyOf": [ + { + "maximum": 100, + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "File List only: at most this many files (1–100); null removes the limit." +}
- Changed
workflow.from_template3 fields changed- added
Input schema / properties / formIdAdded value: +{ + "description": "A form id (sheet_schema peeks of kind form): a form of the sheet; the workflow runs only for that form's responses. Only for a template that starts on a new row", + "maxLength": 64, + "pattern": "^[A-Za-z0-9_-]+$", + "type": "string" +} - added
Output schema / properties / nodes / items / properties / onErrorAdded value: +{ + "description": "If the action fails (integration_action, agent, transcribe and run_workflow steps only): stop, continue (skip failed items) or fallback_path (error branch, its steps on port `error` in next)", + "enum": [ + "stop", + "continue", + "fallback_path" + ], + "type": "string" +} - changed
Output schema / properties / trigger / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "config": { - "additionalProperties": {}, - "description": "Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "next": { - "items": { - "additionalProperties": false, - "properties": { - "port": { - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "port", - "ref" - ], - "type": "object" - }, - "type": "array" - }, - "operation": { - "type": "string" - }, - "ref": { - "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "ref", - "name", - "type", - "config", - "next" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "description": "Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "next": { + "items": { + "additionalProperties": false, + "properties": { + "port": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "port", + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "onError": { + "description": "If the action fails (integration_action, agent, transcribe and run_workflow steps only): stop, continue (skip failed items) or fallback_path (error branch, its steps on port `error` in next)", + "enum": [ + "stop", + "continue", + "fallback_path" + ], + "type": "string" + }, + "operation": { + "type": "string" + }, + "ref": { + "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "ref", + "name", + "type", + "config", + "next" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
workflow.read2 fields changed- added
Output schema / properties / nodes / items / properties / onErrorAdded value: +{ + "description": "If the action fails (integration_action, agent, transcribe and run_workflow steps only): stop, continue (skip failed items) or fallback_path (error branch, its steps on port `error` in next)", + "enum": [ + "stop", + "continue", + "fallback_path" + ], + "type": "string" +} - changed
Output schema / properties / trigger / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "config": { - "additionalProperties": {}, - "description": "Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them", - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "next": { - "items": { - "additionalProperties": false, - "properties": { - "port": { - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "port", - "ref" - ], - "type": "object" - }, - "type": "array" - }, - "operation": { - "type": "string" - }, - "ref": { - "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "ref", - "name", - "type", - "config", - "next" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "description": "Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "next": { + "items": { + "additionalProperties": false, + "properties": { + "port": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "port", + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "onError": { + "description": "If the action fails (integration_action, agent, transcribe and run_workflow steps only): stop, continue (skip failed items) or fallback_path (error branch, its steps on port `error` in next)", + "enum": [ + "stop", + "continue", + "fallback_path" + ], + "type": "string" + }, + "operation": { + "type": "string" + }, + "ref": { + "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "ref", + "name", + "type", + "config", + "next" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
workflow.update2 fields changed- changed
Input schema / properties / add / items / properties / port / descriptionPrevious value: -"output (default), an if's true/false, or a switch's case port or default"New value: +"output (default); an if's true/false; a switch's case port or default; a classify agent's label_<id> or other; `error` for the error branch of a step whose onError is fallback_path" - added
Input schema / properties / update / items / properties / onErrorAdded value: +{ + "description": "If the action fails: stop (the default), continue (skip failed items) or fallback_path (error branch: failed items go on port `error` with the reason in {{ $input.error }}). Only integration_action, agent, transcribe and run_workflow steps have it", + "enum": [ + "stop", + "continue", + "fallback_path" + ], + "type": "string" +}
7 tool updates
- Changed
item.create_many1 field changed- changed
Output schema / properties / batchId / descriptionPrevious value: -"Id of the batch; pass it to item.undo_batch to undo the whole batch. Null when nothing was written"New value: +"Id of the batch; pass it with sheetId to item.undo_batch to undo the whole batch. Null when nothing was written"
- Changed
item.undo_batch2 fields changed- added
Input schema / properties / sheetIdAdded value: +{ + "description": "The sheet the batch wrote, as that call returned it", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "batchId" -]New value: +[ + "batchId", + "sheetId" +]
- Changed
item.update_many1 field changed- changed
Output schema / properties / batchId / descriptionPrevious value: -"Id of the batch; pass it to item.undo_batch to undo the whole batch. Null when nothing was written"New value: +"Id of the batch; pass it with sheetId to item.undo_batch to undo the whole batch. Null when nothing was written"
- Changed
item.update_where1 field changed- changed
Output schema / properties / batchId / descriptionPrevious value: -"Id of the batch; pass it to item.undo_batch to undo the whole batch. Null when nothing was written"New value: +"Id of the batch; pass it with sheetId to item.undo_batch to undo the whole batch. Null when nothing was written"
- Changed
peek.add_layout_item1 field changed- added
Input schema / properties / underTitleAdded value: +{ + "type": "boolean" +}
- Changed
peek.read1 field changed- added
Output schema / properties / layout / items / properties / underTitleAdded value: +{ + "const": true, + "description": "A field on the line under the record's title (at most 4 short fields)", + "type": "boolean" +}
- Changed
peek.reorder_layout2 fields changed- added
Input schema / properties / underTitleAdded value: +{ + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +} - removed
Input schema / requiredRemoved value: -[ - "orderedItemIds" -]
22 tool updates
- Changed
app.create1 field changed- changed
Input schema / properties / items / items / oneOfPrevious value: -[ - { - "properties": { - "kind": { - "const": "view", - "type": "string" - }, - "viewId": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "kind", - "viewId" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "form", - "type": "string" - }, - "peekId": { - "description": "The form's id (from sheet.schema peeks)", - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind", - "peekId" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "page", - "type": "string" - }, - "pageId": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - } - }, - "required": [ - "kind", - "pageId" - ], - "type": "object" - }, - { - "properties": { - "dashboardId": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "kind": { - "const": "dashboard", - "type": "string" - } - }, - "required": [ - "kind", - "dashboardId" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "kind": { + "const": "view", + "type": "string" + }, + "viewId": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "kind", + "viewId" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "form", + "type": "string" + }, + "peekId": { + "description": "The form's id (a sheet.schema peek of kind form; a record layout is refused)", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "peekId" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "page", + "type": "string" + }, + "pageId": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "kind", + "pageId" + ], + "type": "object" + }, + { + "properties": { + "dashboardId": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "kind": { + "const": "dashboard", + "type": "string" + } + }, + "required": [ + "kind", + "dashboardId" + ], + "type": "object" + } +]
- Changed
comment.post8 fields changed- added
Input schema / properties / itemId / descriptionAdded value: +"The item's id (uuid)" - removed
Input schema / properties / itemId / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / itemId / formatAdded value: +"uuid" - removed
Input schema / properties / itemId / maximumRemoved value: -9007199254740991 - added
Input schema / properties / itemId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$" - changed
Input schema / properties / itemId / typePrevious value: -"integer"New value: +"string" - added
Input schema / properties / sheetIdAdded value: +{ + "description": "The sheet the item is on", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" +} - changed
Input schema / requiredPrevious value: -[ - "itemId", - "content" -]New value: +[ + "sheetId", + "itemId", + "content" +]
- Changed
file.request_upload1 field changed- changed
Input schema / properties / mime / descriptionPrevious value: -"Content type of the file. One of: image/png, image/jpeg, image/webp."New value: +"Content type of the file. One of: image/png, image/jpeg, image/webp, application/pdf (private only), video/mp4 (private only)."
- Changed
form.create4 fields changed- changed
Input schema / properties / fields / items / anyOfPrevious value: -[ - { - "description": "A field name or code", - "minLength": 1, - "type": "string" - }, - { - "properties": { - "field": { - "description": "A field name or code", - "minLength": 1, - "type": "string" - }, - "label": { - "description": "The question shown on the form. Default: the field name.", - "minLength": 1, - "type": "string" - }, - "required": { - "type": "boolean" - } - }, - "required": [ - "field" - ], - "type": "object" - } -]New value: +[ + { + "description": "A field name or code", + "minLength": 1, + "type": "string" + }, + { + "properties": { + "field": { + "description": "A field name or code", + "minLength": 1, + "type": "string" + }, + "help": { + "description": "Help text shown under the question.", + "maxLength": 300, + "minLength": 1, + "type": "string" + }, + "label": { + "description": "The question shown on the form. Default: the field name.", + "minLength": 1, + "type": "string" + }, + "placeholder": { + "description": "Hint shown inside the empty answer box.", + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "required": { + "type": "boolean" + }, + "width": { + "anyOf": [ + { + "const": 25, + "type": "number" + }, + { + "const": 50, + "type": "number" + }, + { + "const": 75, + "type": "number" + }, + { + "const": 100, + "type": "number" + } + ], + "description": "Share of the row in the classic layout, in percent; steps ignores it. Default 100." + } + }, + "required": [ + "field" + ], + "type": "object" + } +] - added
Input schema / properties / layoutAdded value: +{ + "description": "How the questions are laid out. Default classic.", + "enum": [ + "classic", + "steps" + ], + "type": "string" +} - added
Input schema / properties / submitLabelAdded value: +{ + "description": "The Submit button's text, in the form's language. Default: Submit in the visitor's language.", + "maxLength": 40, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / successMessage / descriptionPrevious value: -"Shown after the form is sent."New value: +"Thank-you message shown after the form is sent (plain text; answer tokens, answers, button and Submit another are set in Form Studio)."
- Added
form.stats - Changed
form.update11 fields changed- changed
Input schema / properties / addFields / items / anyOfPrevious value: -[ - { - "description": "A field name or code", - "minLength": 1, - "type": "string" - }, - { - "properties": { - "field": { - "description": "A field name or code", - "minLength": 1, - "type": "string" - }, - "label": { - "description": "The question shown on the form. Default: the field name.", - "minLength": 1, - "type": "string" - }, - "required": { - "type": "boolean" - } - }, - "required": [ - "field" - ], - "type": "object" - } -]New value: +[ + { + "description": "A field name or code", + "minLength": 1, + "type": "string" + }, + { + "properties": { + "field": { + "description": "A field name or code", + "minLength": 1, + "type": "string" + }, + "help": { + "description": "Help text shown under the question.", + "maxLength": 300, + "minLength": 1, + "type": "string" + }, + "label": { + "description": "The question shown on the form. Default: the field name.", + "minLength": 1, + "type": "string" + }, + "placeholder": { + "description": "Hint shown inside the empty answer box.", + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "required": { + "type": "boolean" + }, + "width": { + "anyOf": [ + { + "const": 25, + "type": "number" + }, + { + "const": 50, + "type": "number" + }, + { + "const": 75, + "type": "number" + }, + { + "const": 100, + "type": "number" + } + ], + "description": "Share of the row in the classic layout, in percent; steps ignores it. Default 100." + } + }, + "required": [ + "field" + ], + "type": "object" + } +] - added
Input schema / properties / aiReplyAdded value: +{ + "anyOf": [ + { + "properties": { + "fallback": { + "description": "Plain text shown instead when the reply can't be written within 15 seconds.", + "maxLength": 500, + "type": "string" + }, + "prompt": { + "description": "What Dana's reply to each person should say, plain text; {Field name} stands for their answer to a question on the form.", + "maxLength": 4000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "prompt" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Show each person an AI reply written from their answers on the thank-you screen; null shows the thank-you message again." +} - added
Input schema / properties / editFieldsAdded value: +{ + "description": "Change a question's label, required flag, help, placeholder or width; the other questions stay.", + "items": { + "properties": { + "field": { + "description": "A field on the form, by name or code", + "minLength": 1, + "type": "string" + }, + "help": { + "description": "Help text shown under the question.", + "maxLength": 300, + "minLength": 1, + "type": "string" + }, + "label": { + "description": "The question shown on the form", + "minLength": 1, + "type": "string" + }, + "placeholder": { + "description": "Hint shown inside the empty answer box.", + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "required": { + "type": "boolean" + }, + "width": { + "anyOf": [ + { + "const": 25, + "type": "number" + }, + { + "const": 50, + "type": "number" + }, + { + "const": 75, + "type": "number" + }, + { + "const": 100, + "type": "number" + } + ], + "description": "Share of the row in the classic layout, in percent; steps ignores it. Default 100." + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": "array" +} - changed
Input schema / properties / formId / descriptionPrevious value: -"The form's id (sheet.schema lists a sheet's forms)."New value: +"The form's id (sheet.schema lists a sheet's peeks with their kind). Default: the form open in Form Studio." - added
Input schema / properties / layoutAdded value: +{ + "description": "classic places the questions side by side by width (100% takes the row), steps asks one at a time.", + "enum": [ + "classic", + "steps" + ], + "type": "string" +} - added
Input schema / properties / orderAdded value: +{ + "description": "Every question on the form (field names or codes) in the new order, after addFields and removeFields; headings and other blocks keep their place.", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / redirectAdded value: +{ + "anyOf": [ + { + "properties": { + "notice": { + "description": "Show \"Thanks, taking you to <site>…\" for 3 seconds first. Default true.", + "type": "boolean" + }, + "url": { + "description": "An http or https address; put answers in the link as {Field name}, after the site name (https://example.com/thanks?name={Full name}).", + "minLength": 1, + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Send people to a web page after they submit; null goes back to the thank-you message." +} - added
Input schema / properties / sheetId / descriptionAdded value: +"The form's sheet. Default: the form's own sheet." - added
Input schema / properties / submitLabelAdded value: +{ + "description": "The Submit button's text, in the form's language. Default: Submit in the visitor's language.", + "maxLength": 40, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / successMessage / descriptionPrevious value: -"Shown after the form is sent."New value: +"Thank-you message shown after the form is sent (plain text; answer tokens, answers, button and Submit another are set in Form Studio)." - removed
Input schema / requiredRemoved value: -[ - "sheetId", - "formId" -]
- Changed
member.update_profile1 field changed- added
Input schema / properties / phoneAdded value: +{ + "description": "Phone number as the user wrote it: digits, spaces and + ( ) - . only, at least 3 digits; empty clears it. Who sees it is a preference.", + "maxLength": 32, + "type": "string" +}
- Changed
notifications.read2 fields changed- added
Output schema / properties / quietHoursAdded value: +{ + "description": "Push and email held outside working hours (notifications.set_quiet_hours)", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "telegramLinked", - "categories" -]New value: +[ + "telegramLinked", + "categories", + "quietHours" +]
- Added
notifications.set_quiet_hours - Changed
page.read5 fields changed- added
Output schema / properties / authorIdAdded value: +{ + "description": "Employee id of the page's author", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / authorNameAdded value: +{ + "description": "The author's name; null when no author or no longer a member", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / coverAdded value: +{ + "description": "Built-in cover (`atw:1`…`atw:6`) or an uploaded file's name", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / dateAdded value: +{ + "description": "The page's date, YYYY-MM-DD", + "type": [ + "string", + "null" + ] +} - changed
Output schema / requiredPrevious value: -[ - "id", - "name", - "icon", - "spaceId", - "body", - "bodyTruncated", - "attachmentCount", - "mentionCount" -]New value: +[ + "id", + "name", + "icon", + "spaceId", + "body", + "bodyTruncated", + "attachmentCount", + "mentionCount", + "cover", + "authorId", + "authorName", + "date" +]
- Changed
page.update3 fields changed- added
Input schema / properties / authorIdAdded value: +{ + "anyOf": [ + { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Employee id (from `member.read`) shown as the page's author; null removes it" +} - added
Input schema / properties / coverAdded value: +{ + "anyOf": [ + { + "enum": [ + "atw:1", + "atw:2", + "atw:3", + "atw:4", + "atw:5", + "atw:6" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "description": "A built-in cover, `atw:1` to `atw:6`; null removes it" +} - added
Input schema / properties / dateAdded value: +{ + "description": "The page's date, `YYYY-MM-DD`; null removes it", + "type": [ + "string", + "null" + ] +}
- Changed
peek.add_layout_item4 fields changed- added
Input schema / properties / displayAdded value: +{ + "enum": [ + "list", + "table" + ], + "type": "string" +} - added
Input schema / properties / tabIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / tabTitlesAdded value: +{ + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "attribute", - "header", - "welcome", - "history", - "comments", - "submit" -]New value: +[ + "attribute", + "tabs", + "related_rows", + "history", + "comments", + "header", + "welcome", + "submit" +]
- Changed
peek.read7 fields changed- added
Output schema / properties / kindAdded value: +{ + "description": "form: it collects new rows; record: how a row opens", + "enum": [ + "form", + "record" + ], + "type": "string" +} - added
Output schema / properties / layout / items / properties / displayAdded value: +{ + "description": "How a Related rows block shows", + "enum": [ + "list", + "table" + ], + "type": "string" +} - added
Output schema / properties / layout / items / properties / sectionIdAdded value: +{ + "description": "The section (an item of type 'section') this item sits in", + "type": "string" +} - added
Output schema / properties / layout / items / properties / tabIdAdded value: +{ + "description": "The tab this item sits in", + "type": "string" +} - added
Output schema / properties / layout / items / properties / tabsAdded value: +{ + "description": "A Tabs block's tabs; pass a tab id as tabId to peek.add_layout_item", + "items": { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / layoutStyleAdded value: +{ + "description": "A form's layout: classic (side by side by width) or steps (one question at a time); a record layout: columns", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "peekId", - "sheetId", - "name", - "description", - "layout", - "options" -]New value: +[ + "peekId", + "sheetId", + "name", + "description", + "kind", + "layoutStyle", + "layout", + "options" +]
- Changed
peek.update_options14 fields changed- added
Input schema / properties / options / additionalPropertiesAdded value: +false - added
Input schema / properties / options / properties / accentAdded value: +{ + "description": "A palette token (color-N) for Submit, selections and progress", + "pattern": "^color-\\d{1,2}$", + "type": "string" +} - removed
Input schema / properties / options / properties / autosaveRemoved value: -{ - "type": "boolean" -} - added
Input schema / properties / options / properties / header / anyOfAdded value: +[ + { + "additionalProperties": false, + "properties": { + "align": { + "type": "string" + }, + "background": { + "type": "string" + }, + "color": { + "type": "string" + }, + "size": { + "type": "number" + }, + "text": { + "type": "string" + } + }, + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "cover": { + "description": "Show the cover band", + "type": "boolean" + }, + "direction": { + "description": "auto follows the visitor's language", + "enum": [ + "auto", + "ltr", + "rtl" + ], + "type": "string" + }, + "logo": { + "description": "Show the workspace logo above the title", + "type": "boolean" + }, + "width": { + "description": "The public form card: 560, 680 or 840 px", + "enum": [ + "narrow", + "normal", + "wide" + ], + "type": "string" + } + }, + "type": "object" + } +] - removed
Input schema / properties / options / properties / header / propertiesRemoved value: -{ - "align": { - "type": "string" - }, - "background": { - "type": "string" - }, - "color": { - "type": "string" - }, - "size": { - "type": "number" - }, - "text": { - "type": "string" - } -} - removed
Input schema / properties / options / properties / header / typeRemoved value: -"object" - removed
Input schema / properties / options / properties / navButtonsRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / options / properties / newButtonRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / options / properties / readonlyRemoved value: -{ - "type": "boolean" -} - added
Input schema / properties / options / properties / recordAdded value: +{ + "additionalProperties": false, + "properties": { + "buttons": { + "additionalProperties": false, + "properties": { + "discard": { + "type": "boolean" + }, + "rowNav": { + "type": "boolean" + }, + "saveAndNew": { + "type": "boolean" + } + }, + "type": "object" + }, + "openAs": { + "enum": [ + "panel", + "dialog", + "page" + ], + "type": "string" + }, + "readOnly": { + "type": "boolean" + }, + "saving": { + "enum": [ + "auto", + "button" + ], + "type": "string" + }, + "use": { + "additionalProperties": false, + "properties": { + "newRow": { + "type": "boolean" + }, + "openAsMenu": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" +} - removed
Input schema / properties / options / properties / resetButtonRemoved value: -{ - "type": "boolean" -} - removed
Input schema / properties / options / properties / saveAndNewButtonRemoved value: -{ - "type": "boolean" -} - added
Input schema / properties / options / properties / submitAdded value: +{ + "additionalProperties": false, + "properties": { + "label": { + "description": "The Submit button's text", + "maxLength": 40, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" +} - added
Input schema / properties / options / properties / themeAdded value: +{ + "additionalProperties": false, + "properties": { + "appearance": { + "description": "auto follows the visitor's light or dark setting", + "enum": [ + "auto", + "light", + "dark" + ], + "type": "string" + }, + "preset": { + "enum": [ + "workspace", + "paper", + "sand", + "ocean", + "forest", + "dusk" + ], + "type": "string" + } + }, + "required": [ + "preset" + ], + "type": "object" +}
- Changed
portal.update1 field changed- changed
Input schema / properties / contactForm / properties / peekId / descriptionPrevious value: -"The form (from sheet.schema)"New value: +"The form (a sheet.schema peek of kind form; a record layout is refused)"
- Changed
preferences.read2 fields changed- added
Output schema / properties / profileVisibilityAdded value: +{ + "additionalProperties": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "description": "Who sees each profile field (email, phone, pronouns, location, workingHours, timezone): org, team or admins", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "theme", - "calendar", - "startPage", - "dock", - "dockAutohide", - "navCollapsed", - "presence", - "liveUpdateToasts", - "agentHistoryRetentionDays", - "pins", - "language" -]New value: +[ + "theme", + "calendar", + "startPage", + "dock", + "dockAutohide", + "navCollapsed", + "presence", + "liveUpdateToasts", + "agentHistoryRetentionDays", + "pins", + "profileVisibility", + "language" +]
- Changed
preferences.update2 fields changed- added
Input schema / properties / profileVisibilityAdded value: +{ + "additionalProperties": false, + "description": "Who sees each profile field: org = everyone in the org, team = the user's team, admins = only admins. Only the fields given change; admins and the user always see everything.", + "properties": { + "email": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "location": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "phone": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "pronouns": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "timezone": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "workingHours": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + } + }, + "type": "object" +} - added
Output schema / properties / saved / properties / profileVisibilityAdded value: +{ + "additionalProperties": { + "enum": [ + "org", + "team", + "admins" + ], + "type": "string" + }, + "description": "Who sees each profile field (email, phone, pronouns, location, workingHours, timezone): org, team or admins", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
- Changed
profile.update1 field changed- added
Input schema / properties / phoneAdded value: +{ + "description": "Phone number as the user wrote it: digits, spaces and + ( ) - . only, at least 3 digits; empty clears it. Who sees it is a preference.", + "maxLength": 32, + "type": "string" +}
- Changed
sheet.schema3 fields changed- added
Output schema / properties / peeks / items / properties / isForm / descriptionAdded value: +"kind === \"form\"" - added
Output schema / properties / peeks / items / properties / kindAdded value: +{ + "description": "form: collects new rows; record: how a row opens", + "enum": [ + "form", + "record" + ], + "type": "string" +} - changed
Output schema / properties / peeks / items / requiredPrevious value: -[ - "id", - "name", - "isForm" -]New value: +[ + "id", + "name", + "kind", + "isForm" +]
- Changed
sheet.update1 field changed- changed
Input schema / properties / defaultFormId / descriptionPrevious value: -"The form (peek id from `sheet.schema`) a row opens in"New value: +"The record layout (a peek of kind record from `sheet.schema`) a row opens in, or \"default\"; a form is refused"
- Changed
sheet.update_attribute1 field changed- changed
Input schema / properties / relation / properties / form / descriptionPrevious value: -"The related sheet's form or peek a link opens"New value: +"The related sheet's record layout (a peek of kind record) a link opens a row in"
- Changed
view.create1 field changed- changed
Input schema / properties / type / enumPrevious value: -[ - "TABLE", - "KANBAN", - "CALENDAR", - "GALLERY", - "GANTT_CHART", - "TIME_LINE", - "CARD", - "EMAIL", - "BLOG" -]New value: +[ + "TABLE", + "KANBAN", + "CALENDAR", + "GALLERY", + "GANTT_CHART", + "TIME_LINE", + "CARD", + "EMAIL", + "BLOG", + "PROCESS_MAP" +]
76 tool updates
- Added
app.create - Added
app.publish - Added
availability.create - Added
availability.delete - Added
availability.read - Added
booking_link.create - Added
calendar.create - Added
calendar.prep_brief - Changed
calendar.propose_times1 field changed- changed
Input schema / properties / externalAttendeeEmails / items / patternPrevious value: -"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"New value: +"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
- Changed
calendar.read2 fields changed- removed
Output schema / properties / events / items / properties / calendarId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Output schema / properties / events / items / properties / calendarId / typeAdded value: +[ + "string", + "number" +]
- Added
calendar.update - Added
custom_agent.create - Changed
dashboard.read4 fields changed- removed
Output schema / properties / dashboard / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Output schema / properties / dashboard / properties / id / typeAdded value: +[ + "string", + "number" +] - removed
Output schema / properties / widgets / items / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Output schema / properties / widgets / items / properties / id / typeAdded value: +[ + "string", + "number" +]
- Changed
file.confirm_upload1 field changed- changed
Output schema / properties / filename / descriptionPrevious value: -"Stored filename to set on a File or Cover attribute"New value: +"Stored filename to add to a File List field or set as a Cover"
- Changed
file.request_upload2 fields changed- added
Output schema / properties / upload_headersAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "Headers the PUT must send exactly; the URL is signed for this Content-Type", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "upload_url", - "key", - "expires_in_seconds" -]New value: +[ + "upload_url", + "upload_headers", + "key", + "expires_in_seconds" +]
- Changed
folder.create4 fields changed- removed
Output schema / properties / location / properties / folderId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / location / properties / folderName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderName / typeAdded value: +[ + "string", + "null" +]
- Changed
folder.update4 fields changed- removed
Output schema / properties / location / properties / folderId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / location / properties / folderName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderName / typeAdded value: +[ + "string", + "null" +]
- Added
goal.create - Added
integration.list_operations - Added
integration.list_options - Added
integration.query - Changed
item_tree.duplicate4 fields changed- removed
Output schema / properties / location / properties / folderId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / location / properties / folderName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderName / typeAdded value: +[ + "string", + "null" +]
- Changed
item_tree.move4 fields changed- removed
Output schema / properties / location / properties / folderId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / location / properties / folderName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderName / typeAdded value: +[ + "string", + "null" +]
- Changed
item.create_humanized3 fields changed- changed
Input schema / properties / fields / additionalProperties / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "items": { - "type": "string" - }, - "type": "array" - } -]New value: +[ + { + "type": "string" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "properties": { + "connectionId": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "name": { + "description": "The stored filename `file.confirm_upload` returned, or the entry's name as read", + "type": "string" + }, + "originalName": { + "type": "string" + }, + "source": { + "enum": [ + "upload", + "gdrive", + "dropbox" + ], + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + ] + }, + "type": "array" + } +] - removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Changed
item.create_many4 fields changed- removed
Output schema / properties / batchId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / batchId / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Added
item.read_files - Changed
item.update_humanized2 fields changed- changed
Input schema / properties / fields / additionalProperties / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "items": { - "type": "string" - }, - "type": "array" - } -]New value: +[ + { + "type": "string" + }, + { + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "properties": { + "connectionId": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "name": { + "description": "The stored filename `file.confirm_upload` returned, or the entry's name as read", + "type": "string" + }, + "originalName": { + "type": "string" + }, + "source": { + "enum": [ + "upload", + "gdrive", + "dropbox" + ], + "type": "string" + }, + "type": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + ] + }, + "type": "array" + } +] - changed
Input schema / properties / mode / descriptionPrevious value: -"`append` only affects Document/Description fields — new content is added after the existing content. All other field types always replace."New value: +"`append` only affects Document/Description fields (new content is added after the existing content) and File List fields (new files are added to the cell's). All other field types always replace."
- Changed
item.update_many4 fields changed- removed
Output schema / properties / batchId / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / batchId / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Added
item.update_where - Added
language.update - Added
location.create - Added
location.update - Added
member.update_profile - Added
notifications.read - Added
notifications.reset - Added
notifications.update - Added
org.update - Changed
page.create2 fields changed- removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Changed
page.edit4 fields changed- removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Changed
page.read6 fields changed- removed
Output schema / properties / icon / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / icon / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Changed
page.restore2 fields changed- removed
Output schema / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / name / typeAdded value: +[ + "string", + "null" +]
- Changed
page.update4 fields changed- removed
Output schema / properties / location / properties / folderId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / location / properties / folderName / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / location / properties / folderName / typeAdded value: +[ + "string", + "null" +]
- Added
peek.add_layout_item - Added
peek.read - Added
peek.remove_layout_item - Added
peek.reorder_layout - Added
peek.update_field_options - Added
peek.update_options - Added
portal.update - Added
preferences.read - Added
preferences.update - Added
profile.update - Added
recipe.search - Added
schedule.read - Changed
sheet.add_attribute1 field changed- changed
Input schema / properties / dataType / enumPrevious value: -[ - "Short Text", - "Long Text", - "Number", - "Date", - "DateRange", - "Email", - "URL", - "PhoneNumber", - "CheckBox", - "Status", - "Select", - "Multi-Select", - "Employee", - "Employee List", - "Team", - "Team List", - "Job", - "Job List", - "Actor", - "File List", - "Document", - "Location", - "Address", - "Duration", - "Link", - "Vote", - "Goal", - "Code", - "Relation", - "Formula", - "Mirror", - "Rollup", - "Rate", - "Timer", - "Pipeline", - "Summary", - "DocX", - "Button" -]New value: +[ + "Short Text", + "Long Text", + "Number", + "Date", + "Email", + "URL", + "PhoneNumber", + "CheckBox", + "Status", + "Select", + "Multi-Select", + "Employee", + "Employee List", + "Team", + "Team List", + "Job", + "Job List", + "Actor", + "File List", + "Document", + "Location", + "Address", + "Duration", + "Link", + "Vote", + "Goal", + "Code", + "Relation", + "Formula", + "Mirror", + "Rollup", + "Rate", + "Timer", + "Pipeline", + "Summary", + "DocX", + "Button" +]
- Changed
sheet.aggregate1 field changed- changed
Input schema / properties / filter / properties / conditions / items / properties / value / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - }, - { - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - "type": "array" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "items": { + "type": [ + "string", + "number" + ] + }, + "type": "array" + } +]
- Changed
sheet.convert_to_task2 fields changed- removed
Output schema / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / type / typeAdded value: +[ + "string", + "null" +]
- Changed
sheet.create1 field changed- changed
Input schema / properties / attributes / items / properties / dataType / enumPrevious value: -[ - "Short Text", - "Long Text", - "Number", - "Date", - "DateRange", - "Email", - "URL", - "PhoneNumber", - "CheckBox", - "Status", - "Select", - "Multi-Select", - "Employee", - "Employee List", - "Team", - "Team List", - "Job", - "Job List", - "Actor", - "File List", - "Document", - "Location", - "Address", - "Duration", - "Link", - "Vote", - "Goal" -]New value: +[ + "Short Text", + "Long Text", + "Number", + "Date", + "Email", + "URL", + "PhoneNumber", + "CheckBox", + "Status", + "Select", + "Multi-Select", + "Employee", + "Employee List", + "Team", + "Team List", + "Job", + "Job List", + "Actor", + "File List", + "Document", + "Location", + "Address", + "Duration", + "Link", + "Vote", + "Goal" +]
- Changed
sheet.read2 fields changed- removed
Output schema / properties / nextOffset / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / nextOffset / typeAdded value: +[ + "number", + "null" +]
- Changed
sheet.schema16 fields changed- removed
Output schema / properties / attributes / items / properties / code / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / attributes / items / properties / code / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / color / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / color / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / id / anyOfRemoved value: -[ - { - "anyOf": [ - { - "type": "string" - }, - { - "type": "number" - } - ] - }, - { - "type": "null" - } -] - added
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / id / typeAdded value: +[ + "string", + "number", + "null" +] - removed
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / stage / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / stage / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / peeks / items / properties / id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - } -] - added
Output schema / properties / peeks / items / properties / id / typeAdded value: +[ + "string", + "number" +] - removed
Output schema / properties / sheet / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / sheet / properties / spaceId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / sheet / properties / type / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / sheet / properties / type / typeAdded value: +[ + "string", + "null" +]
- Added
sheet.set_autofill - Changed
sheet.set_dependencies4 fields changed- removed
Output schema / properties / blockedByAttributeId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / blockedByAttributeId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / blockingAttributeId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / blockingAttributeId / typeAdded value: +[ + "number", + "null" +]
- Changed
sheet.update_attribute1 field changed- changed
Input schema / properties / dataType / enumPrevious value: -[ - "Short Text", - "Long Text", - "Number", - "Date", - "DateRange", - "Email", - "URL", - "PhoneNumber", - "CheckBox", - "Status", - "Select", - "Multi-Select", - "Employee", - "Employee List", - "Team", - "Team List", - "Job", - "Job List", - "Actor", - "File List", - "Document", - "Location", - "Address", - "Duration", - "Link", - "Vote", - "Goal" -]New value: +[ + "Short Text", + "Long Text", + "Number", + "Date", + "Email", + "URL", + "PhoneNumber", + "CheckBox", + "Status", + "Select", + "Multi-Select", + "Employee", + "Employee List", + "Team", + "Team List", + "Job", + "Job List", + "Actor", + "File List", + "Document", + "Location", + "Address", + "Duration", + "Link", + "Vote", + "Goal" +]
- Changed
task.create2 fields changed- removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Added
template.browse - Added
template.install - Added
template.preview - Changed
view.create2 fields changed- removed
Output schema / properties / spaceId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaceId / typeAdded value: +[ + "number", + "null" +]
- Added
view.publish - Added
view.update - Changed
workflow.from_template2 fields changed- added
Output schema / properties / nodes / items / properties / config / descriptionAdded value: +"Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them" - changed
Output schema / properties / trigger / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "config": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "next": { - "items": { - "additionalProperties": false, - "properties": { - "port": { - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "port", - "ref" - ], - "type": "object" - }, - "type": "array" - }, - "operation": { - "type": "string" - }, - "ref": { - "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "ref", - "name", - "type", - "config", - "next" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "description": "Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "next": { + "items": { + "additionalProperties": false, + "properties": { + "port": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "port", + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "operation": { + "type": "string" + }, + "ref": { + "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "ref", + "name", + "type", + "config", + "next" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Changed
workflow.list2 fields changed- removed
Output schema / properties / workflows / items / properties / trigger / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / workflows / items / properties / trigger / typeAdded value: +[ + "string", + "null" +]
- Changed
workflow.read2 fields changed- added
Output schema / properties / nodes / items / properties / config / descriptionAdded value: +"Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them" - changed
Output schema / properties / trigger / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "config": { - "additionalProperties": {}, - "propertyNames": { - "type": "string" - }, - "type": "object" - }, - "name": { - "type": "string" - }, - "next": { - "items": { - "additionalProperties": false, - "properties": { - "port": { - "type": "string" - }, - "ref": { - "type": "string" - } - }, - "required": [ - "port", - "ref" - ], - "type": "object" - }, - "type": "array" - }, - "operation": { - "type": "string" - }, - "ref": { - "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", - "type": "string" - }, - "type": { - "type": "string" - } - }, - "required": [ - "ref", - "name", - "type", - "config", - "next" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "config": { + "additionalProperties": {}, + "description": "Secrets (authorization, API keys, tokens) read as ••••••; send them back unchanged to keep them", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "next": { + "items": { + "additionalProperties": false, + "properties": { + "port": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "port", + "ref" + ], + "type": "object" + }, + "type": "array" + }, + "operation": { + "type": "string" + }, + "ref": { + "description": "The node's id: name it in workflow.update as after, ref or {{steps.<ref>.<path>}}", + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "ref", + "name", + "type", + "config", + "next" + ], + "type": "object" + }, + { + "type": "null" + } +]
- Added
working_hours.update - Changed
workspace.search6 fields changed- removed
Output schema / properties / results / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / name / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / parentSheetId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / parentSheetId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / results / items / properties / snippet / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / snippet / typeAdded value: +[ + "string", + "null" +]
- Changed
workspace.structure6 fields changed- removed
Output schema / properties / spaces / items / properties / folders / items / properties / parentId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaces / items / properties / folders / items / properties / parentId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / spaces / items / properties / items / items / properties / folderId / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaces / items / properties / items / items / properties / folderId / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / spaces / items / properties / items / items / properties / name / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / spaces / items / properties / items / items / properties / name / typeAdded value: +[ + "string", + "null" +]
61 tool updates
- Added
access.grant - Added
access.read - Added
access.revoke - Added
access.update - Added
app.unpublish - Added
booking_link.update - Added
dashboard.create - Added
dashboard.delete - Added
dashboard.restore - Added
dashboard.update - Added
folder.create - Added
folder.delete - Added
folder.restore - Added
folder.update - Added
form.create - Added
form.delete - Added
form.restore - Added
form.update - Added
inbound_email.regenerate - Added
inbound_email.rename - Added
item_tree.duplicate - Added
item_tree.move - Changed
item.create_humanized3 fields changed- added
Output schema / properties / sheetIdAdded value: +{ + "description": "Sheet the row was created in", + "type": "number" +} - added
Output schema / properties / spaceIdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Space of that sheet; null for a sheet outside a space" +} - changed
Output schema / requiredPrevious value: -[ - "itemId", - "url" -]New value: +[ + "itemId", + "url", + "sheetId", + "spaceId" +]
- Changed
item.create_many3 fields changed- added
Output schema / properties / sheetIdAdded value: +{ + "description": "Sheet the rows are in", + "type": "number" +} - added
Output schema / properties / spaceIdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Space of that sheet; null for a sheet outside a space" +} - changed
Output schema / requiredPrevious value: -[ - "batchId", - "created", - "updated", - "skipped", - "skippedCount", - "url" -]New value: +[ + "batchId", + "created", + "updated", + "skipped", + "skippedCount", + "url", + "sheetId", + "spaceId" +]
- Changed
item.update_many3 fields changed- added
Output schema / properties / sheetIdAdded value: +{ + "description": "Sheet the rows are in", + "type": "number" +} - added
Output schema / properties / spaceIdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Space of that sheet; null for a sheet outside a space" +} - changed
Output schema / requiredPrevious value: -[ - "batchId", - "created", - "updated", - "skipped", - "skippedCount", - "url" -]New value: +[ + "batchId", + "created", + "updated", + "skipped", + "skippedCount", + "url", + "sheetId", + "spaceId" +]
- Changed
page.create2 fields changed- added
Input schema / properties / spaceId / descriptionAdded value: +"Target space. Omit to use the space the user is on." - changed
Input schema / requiredPrevious value: -[ - "name", - "markdown", - "spaceId" -]New value: +[ + "name", + "markdown" +]
- Added
page.delete - Changed
page.edit2 fields changed- added
Output schema / properties / spaceIdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Space the page is in" +} - changed
Output schema / requiredPrevious value: -[ - "pageId", - "name", - "op", - "previousContent", - "previousContentTooLarge" -]New value: +[ + "pageId", + "name", + "spaceId", + "op", + "previousContent", + "previousContentTooLarge" +]
- Added
page.restore - Added
page.update - Changed
sheet.add_attribute11 fields changed- changed
Input schema / properties / dataType / enumPrevious value: -[ - "Short Text", - "Long Text", - "Number", - "Date", - "DateRange", - "Email", - "URL", - "PhoneNumber", - "CheckBox", - "Status", - "Select", - "Multi-Select", - "Employee", - "Employee List", - "Team", - "Team List", - "Job", - "Job List", - "Actor", - "File List", - "Document", - "Location", - "Address", - "Duration", - "Link", - "Vote", - "Goal", - "Code", - "Relation" -]New value: +[ + "Short Text", + "Long Text", + "Number", + "Date", + "DateRange", + "Email", + "URL", + "PhoneNumber", + "CheckBox", + "Status", + "Select", + "Multi-Select", + "Employee", + "Employee List", + "Team", + "Team List", + "Job", + "Job List", + "Actor", + "File List", + "Document", + "Location", + "Address", + "Duration", + "Link", + "Vote", + "Goal", + "Code", + "Relation", + "Formula", + "Mirror", + "Rollup", + "Rate", + "Timer", + "Pipeline", + "Summary", + "DocX", + "Button" +] - changed
Input schema / properties / options / descriptionPrevious value: -"Choices for Status / Select / Multi-Select fields, in display order — `language` for a Code field — or `relatedSheetId` (+ `twoWay`) for a Relation."New value: +"Choices for Status / Select / Multi-Select fields, in display order — `language` for a Code field — `relatedSheetId` (+ `twoWay`) for a Relation — or the settings of a Formula, Mirror, Rollup, Rate, Pipeline, Summary or Button field." - added
Input schema / properties / options / properties / fieldAdded value: +{ + "description": "Mirror: the related sheet's field to show. Rollup: the Number field to aggregate (not for COUNT).", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / formulaAdded value: +{ + "description": "Formula only: fields in braces, e.g. `{Price} * {Quantity}`; functions IF, round, days_between…", + "maxLength": 2000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / functionAdded value: +{ + "description": "Rollup only: how the related rows are aggregated.", + "enum": [ + "COUNT", + "DISTINCT_COUNT", + "SUM", + "AVG", + "MIN", + "MAX" + ], + "type": "string" +} - added
Input schema / properties / options / properties / relationAdded value: +{ + "description": "Mirror / Rollup only: the name of a Relation field on this sheet.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / returnTypeAdded value: +{ + "description": "Formula only: what it returns. Default number.", + "enum": [ + "number", + "text" + ], + "type": "string" +} - added
Input schema / properties / options / properties / stagesAdded value: +{ + "description": "Pipeline only: the stages in order; won stages `succeed`, lost ones `failed`.", + "items": { + "properties": { + "color": { + "type": "string" + }, + "outcome": { + "description": "Default open", + "enum": [ + "open", + "succeed", + "failed" + ], + "type": "string" + }, + "title": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / options / properties / starsAdded value: +{ + "description": "Rate only: number of stars (2–20), default 5.", + "maximum": 20, + "minimum": 2, + "type": "integer" +} - added
Input schema / properties / options / properties / templateAdded value: +{ + "description": "Summary only: text with fields in braces, e.g. `{Company} — {Stage}`.", + "maxLength": 4000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / workflowAdded value: +{ + "description": "Button only: the name of a workflow on this sheet with a manual trigger.", + "minLength": 1, + "type": "string" +}
- Added
sheet.convert_to_task - Changed
sheet.create2 fields changed- added
Output schema / properties / spaceIdAdded value: +{ + "description": "Space the sheet landed in", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "sheetId" -]New value: +[ + "sheetId", + "spaceId" +]
- Added
sheet.delete - Changed
sheet.remove_attribute4 fields changed- added
Input schema / properties / confirmFileLossAdded value: +{ + "description": "Remove a File List field whose files are deleted for good. Only once the user accepts it.", + "type": "boolean" +} - added
Output schema / properties / attributeIdAdded value: +{ + "description": "The removed field", + "type": "number" +} - added
Output schema / properties / nameAdded value: +{ + "description": "Its name", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "ok" -]New value: +[ + "ok", + "attributeId", + "name" +]
- Added
sheet.restore - Changed
sheet.schema2 fields changed- added
Output schema / properties / attributes / items / properties / defaultAdded value: +{ + "description": "The value a new row starts with" +} - added
Output schema / properties / attributes / items / properties / options / properties / items / items / properties / archivedAdded value: +{ + "type": "boolean" +}
- Added
sheet.update - Changed
sheet.update_attribute28 fields changed- added
Input schema / properties / checkboxStyleAdded value: +{ + "description": "Checkbox only.", + "enum": [ + "checkbox", + "toggle", + "switch" + ], + "type": "string" +} - added
Input schema / properties / dateAdded value: +{ + "description": "Date only: how the date and the time are written.", + "properties": { + "dateFormat": { + "enum": [ + "Compact", + "Full Date", + "Relative", + "Month/Day/Year", + "Day/Month/Year", + "Year/Month/Day" + ], + "type": "string" + }, + "timeFormat": { + "enum": [ + "12 hour", + "24 hour" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / defaultAdded value: +{ + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "The value new rows start with, as a human value: a choice title, a member, team or job name (a list for list fields), `creator` for whoever adds the row, or `today` for a Date's creation day. null clears it." +} - added
Input schema / properties / iconAdded value: +{ + "description": "A Bootstrap icon name, e.g. `bi-star`.", + "maxLength": 80, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / isUniqueAdded value: +{ + "description": "Title, Short Text, URL, Phone Number and Email only: refuse duplicate values.", + "type": "boolean" +} - added
Input schema / properties / languageAdded value: +{ + "description": "Code only.", + "enum": [ + "plain", + "html", + "json", + "typescript", + "javascript", + "sql", + "css", + "markdown" + ], + "type": "string" +} - added
Input schema / properties / numberAdded value: +{ + "description": "Number only: currency or number format (e.g. Euro), decimal places, and how it shows (NUMBER, BAR…).", + "properties": { + "decimals": { + "maximum": 10, + "minimum": 0, + "type": "integer" + }, + "format": { + "enum": [ + "Number", + "Number with commas", + "Percent", + "Dollar", + "Euro", + "Riyal", + "Rand", + "Real", + "Pound", + "Ruble", + "Rupee", + "Rupiah", + "Yen", + "Yuan", + "Won", + "Canadian dollar", + "Franc" + ], + "type": "string" + }, + "showAs": { + "enum": [ + "NUMBER", + "BAR", + "RING", + "GAUGE", + "RATE" + ], + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / options / properties / fieldAdded value: +{ + "description": "Mirror: the related sheet's field to show. Rollup: the Number field to aggregate (not for COUNT).", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / formulaAdded value: +{ + "description": "Formula only: fields in braces, e.g. `{Price} * {Quantity}`; functions IF, round, days_between…", + "maxLength": 2000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / functionAdded value: +{ + "description": "Rollup only: how the related rows are aggregated.", + "enum": [ + "COUNT", + "DISTINCT_COUNT", + "SUM", + "AVG", + "MIN", + "MAX" + ], + "type": "string" +} - added
Input schema / properties / options / properties / items / items / properties / archivedAdded value: +{ + "description": "Select / Multi-Select only: true hides the choice from pickers; rows keep it. false brings it back.", + "type": "boolean" +} - added
Input schema / properties / options / properties / items / items / properties / isDefaultAdded value: +{ + "description": "true makes this choice the field's default for new rows (on Multi-Select, adds it); false removes it.", + "type": "boolean" +} - added
Input schema / properties / options / properties / items / items / properties / title / descriptionAdded value: +"Required for a new option; a live one keeps its title." - removed
Input schema / properties / options / properties / items / items / requiredRemoved value: -[ - "title" -] - added
Input schema / properties / options / properties / relationAdded value: +{ + "description": "Mirror / Rollup only: the name of a Relation field on this sheet.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / returnTypeAdded value: +{ + "description": "Formula only: what it returns. Default number.", + "enum": [ + "number", + "text" + ], + "type": "string" +} - added
Input schema / properties / options / properties / stagesAdded value: +{ + "description": "Pipeline only: the stages in order; won stages `succeed`, lost ones `failed`.", + "items": { + "properties": { + "color": { + "type": "string" + }, + "outcome": { + "description": "Default open", + "enum": [ + "open", + "succeed", + "failed" + ], + "type": "string" + }, + "title": { + "maxLength": 80, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "maxItems": 30, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / options / properties / starsAdded value: +{ + "description": "Rate only: number of stars (2–20), default 5.", + "maximum": 20, + "minimum": 2, + "type": "integer" +} - added
Input schema / properties / options / properties / templateAdded value: +{ + "description": "Summary only: text with fields in braces, e.g. `{Company} — {Stage}`.", + "maxLength": 4000, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / options / properties / workflowAdded value: +{ + "description": "Button only: the name of a workflow on this sheet with a manual trigger.", + "minLength": 1, + "type": "string" +} - removed
Input schema / properties / options / requiredRemoved value: -[ - "items" -] - added
Input schema / properties / orderAdded value: +{ + "description": "Choice ids in their new order, each live id exactly once. On Status, either every choice or every choice of one stage; a choice keeps its stage.", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / relationAdded value: +{ + "description": "Relation only: how linked rows are shown and picked.", + "properties": { + "filter": { + "anyOf": [ + { + "properties": { + "conditionOperator": { + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "items": { + "properties": { + "attribute": { + "description": "A field name of the related sheet", + "minLength": 1, + "type": "string" + }, + "conditionOperator": { + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "items": {}, + "type": "array" + }, + "queryOperator": { + "minLength": 1, + "type": "string" + }, + "value": {} + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "filters" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Which related rows can be picked, in sheet.read's `filters` shape, fields and values by name" + }, + "form": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The related sheet's form or peek a link opens" + }, + "subtitle": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "A related sheet's field shown under each link; null clears it" + }, + "view": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The related sheet's view the picker lists rows from" + } + }, + "type": "object" +} - added
Input schema / properties / selectStyleAdded value: +{ + "description": "Select / Multi-Select only.", + "enum": [ + "dropdown", + "toggle" + ], + "type": "string" +} - added
Output schema / properties / attributeIdAdded value: +{ + "description": "The field that changed", + "type": "number" +} - added
Output schema / properties / changedAdded value: +{ + "description": "The inputs that were applied, e.g. name, number, order, default", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / nameAdded value: +{ + "description": "Its name after the change", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "ok" -]New value: +[ + "ok", + "attributeId", + "name", + "changed" +]
- Added
space.create - Added
space.delete - Added
space.restore - Added
space.update - Changed
steps.apply13 fields changed- added
Input schema / properties / doc / additionalPropertiesAdded value: +false - added
Input schema / properties / doc / properties / dashboardsAdded value: +{ + "items": { + "properties": { + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "ref": { + "minLength": 1, + "type": "string" + }, + "sheet": { + "anyOf": [ + { + "properties": { + "$ref": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "$ref" + ], + "type": "object" + }, + { + "properties": { + "$existing": { + "properties": { + "sheetId": { + "description": "An existing sheet in this workspace (from workspace.structure)", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "sheetId" + ], + "type": "object" + } + }, + "required": [ + "$existing" + ], + "type": "object" + } + ] + }, + "widgets": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ref", + "name", + "sheet", + "widgets" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / doc / properties / forms / items / properties / sheet / anyOfAdded value: +[ + { + "properties": { + "$ref": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "$ref" + ], + "type": "object" + }, + { + "properties": { + "$existing": { + "properties": { + "sheetId": { + "description": "An existing sheet in this workspace (from workspace.structure)", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "sheetId" + ], + "type": "object" + } + }, + "required": [ + "$existing" + ], + "type": "object" + } +] - removed
Input schema / properties / doc / properties / forms / items / properties / sheet / propertiesRemoved value: -{ - "$ref": { - "minLength": 1, - "type": "string" - } -} - removed
Input schema / properties / doc / properties / forms / items / properties / sheet / requiredRemoved value: -[ - "$ref" -] - removed
Input schema / properties / doc / properties / forms / items / properties / sheet / typeRemoved value: -"object" - added
Input schema / properties / doc / properties / pages / items / properties / contentAdded value: +{ + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / doc / properties / sheets / items / properties / removeAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / doc / properties / sheets / items / properties / targetAdded value: +{ + "properties": { + "sheetId": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "sheetId" + ], + "type": "object" +} - added
Input schema / properties / doc / properties / spaceHomeAdded value: +{ + "properties": { + "widgets": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "widgets" + ], + "type": "object" +} - added
Input schema / properties / doc / properties / workflowsAdded value: +{ + "items": { + "additionalProperties": {}, + "properties": { + "actions": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + "active": { + "description": "true = publish it so it runs now; omit to leave a draft", + "type": "boolean" + }, + "name": { + "minLength": 1, + "type": "string" + }, + "ref": { + "minLength": 1, + "type": "string" + }, + "sheet": { + "anyOf": [ + { + "properties": { + "$ref": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "$ref" + ], + "type": "object" + }, + { + "properties": { + "$existing": { + "properties": { + "sheetId": { + "description": "An existing sheet in this workspace (from workspace.structure)", + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + } + }, + "required": [ + "sheetId" + ], + "type": "object" + } + }, + "required": [ + "$existing" + ], + "type": "object" + } + ] + }, + "trigger": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "ref", + "name", + "sheet", + "trigger", + "actions" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / inboundAddressesAdded value: +{ + "description": "Email to this sheet: give the user this address; each email sent to it creates an item", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "address": { + "type": "string" + }, + "sheetId": { + "type": "number" + } + }, + "required": [ + "sheetId", + "address", + "active" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / workflowsAdded value: +{ + "description": "One per workflow: active = running; error = why it was not created or turned on — tell the user", + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "error": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "sheetId": { + "type": "number" + } + }, + "required": [ + "ref", + "name", + "active" + ], + "type": "object" + }, + "type": "array" +}
- Changed
task.create3 fields changed- added
Output schema / properties / sheetIdAdded value: +{ + "description": "Task sheet the task was created in", + "type": "number" +} - added
Output schema / properties / spaceIdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Space of that sheet; null for a sheet outside a space" +} - changed
Output schema / requiredPrevious value: -[ - "taskId" -]New value: +[ + "taskId", + "sheetId", + "spaceId" +]
- Changed
view.create12 fields changed- added
Input schema / properties / contentFieldAdded value: +{ + "description": "BLOG only: the Document field whose pages are the posts. Default: the sheet's first one.", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / dateField / descriptionPrevious value: -"CALENDAR only: attribute CODE of the Date field to place events on."New value: +"Date field name or code that places rows on a CALENDAR, GANTT_CHART or TIME_LINE." - added
Input schema / properties / filterAdded value: +{ + "anyOf": [ + { + "description": "The sheet.read filter form: `{ conditionOperator: \"AND\", filters: [{ attribute: \"Stage\", queryOperator: \"NEQ\", value: \"Won\" }] }`. `attribute` is a field name or code; Status, Select, member and team values may be their names. Groups nest.", + "properties": { + "conditionOperator": { + "default": "AND", + "enum": [ + "AND", + "OR" + ], + "type": "string" + }, + "filters": { + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "filters" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Rows the view shows. `null` clears the filter." +} - changed
Input schema / properties / groupBy / descriptionPrevious value: -"KANBAN only: attribute CODE of the Status/Select field to group columns by."New value: +"Field name or code to group by: a board's columns (Status/Select), or a table's or card view's groups." - added
Input schema / properties / hiddenFieldsAdded value: +{ + "description": "Field names or codes to hide (TABLE, KANBAN and CARD views).", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / resourceFieldAdded value: +{ + "description": "TIME_LINE only: the field whose values become the timeline's rows, e.g. Assignee. Default: the title.", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / shownFieldsAdded value: +{ + "description": "Field names or codes to show again (TABLE, KANBAN and CARD views).", + "items": { + "minLength": 1, + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Row order, up to three keys; `field` is a name or code. `[]` clears it.", + "items": { + "properties": { + "direction": { + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "field": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "field", + "direction" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" +} - changed
Input schema / properties / type / enumPrevious value: -[ - "TABLE", - "KANBAN", - "CALENDAR", - "GALLERY" -]New value: +[ + "TABLE", + "KANBAN", + "CALENDAR", + "GALLERY", + "GANTT_CHART", + "TIME_LINE", + "CARD", + "EMAIL", + "BLOG" +] - added
Output schema / properties / sheetIdAdded value: +{ + "description": "Sheet the view was added to", + "type": "number" +} - added
Output schema / properties / spaceIdAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Space of that sheet; null outside a space or when unknown" +} - added
Output schema / requiredAdded value: +[ + "sheetId", + "spaceId" +]
- Added
view.delete - Added
view.restore - Added
widget.create - Added
widget.delete - Added
widget.restore - Added
widget.update - Added
workflow.delete - Added
workflow.from_template - Added
workflow.list - Added
workflow.publish - Added
workflow.read - Added
workflow.restore - Added
workflow.toggle - Added
workflow.unpublish - Added
workflow.update
2 tool updates
- Changed
page.read1 field changed- changed
Output schema / properties / body / descriptionPrevious value: -"Page text, capped at 4000 chars"New value: +"Page text, capped at 15,000 chars"
- Changed
sheet.read3 fields changed- added
Input schema / properties / documentsAdded value: +{ + "default": "full", + "description": "Document and Description cells: `full` markdown (default), an 80-char plain-text `preview`, or `omit` them", + "enum": [ + "full", + "preview", + "omit" + ], + "type": "string" +} - added
Input schema / properties / fieldsAdded value: +{ + "description": "Return only these attributes (names or codes) plus `id`; use it to scan many rows per call", + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / sortAdded value: +{ + "description": "Row order, up to three keys applied in turn; `field` is an attribute name or code. Newest first = `[{ field: \"ModifiedAt\", direction: \"desc\" }]` (recently changed) or CreatedAt desc (recently added)", + "items": { + "properties": { + "direction": { + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "field": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "field", + "direction" + ], + "type": "object" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" +}
32 tool updates
- First observed
calendar.propose_times - First observed
calendar.read - First observed
comment.post - First observed
dashboard.read - First observed
file.confirm_upload - First observed
file.request_upload - First observed
item.archive - First observed
item.create_humanized - First observed
item.create_many - First observed
item.undo_batch - First observed
item.update_humanized - First observed
item.update_many - First observed
member.read - First observed
page.create - First observed
page.edit - First observed
page.read - First observed
sheet.add_attribute - First observed
sheet.aggregate - First observed
sheet.create - First observed
sheet.read - First observed
sheet.remove_attribute - First observed
sheet.rename - First observed
sheet.restore_attribute - First observed
sheet.schema - First observed
sheet.set_dependencies - First observed
sheet.update_attribute - First observed
steps.apply - First observed
task.create - First observed
task.read - First observed
view.create - First observed
workspace.search - First observed
workspace.structure
Publisher details
- Operator
- Atwork Solutions · Publisher source
- Operator website
- https://atwork.so
- Vendor relationship
- First-party
- Documentation
- https://atwork.so/mcp
- Trust center
- https://atwork.so/privacy
- Restrictions
- Not applicable
Related MCP Connectors
Build and run AI workflows, agents, data tables and 1000+ API integrations from any MCP client.
Connect your business apps to your MCP compatible AI in 1 click
AI-native Kanban board — connect Claude to claim, work and move your tasks over MCP.
Connect AI assistants to ITM Platform projects, tasks, budgets, risks, and team workload.
Related MCP Servers
- AlicenseBqualityDmaintenanceConnects AI assistants like Claude to productivity tools such as Notion, Monday, Jira, and Slack via a remote MCP integration hub.71127 npmMIT
- AlicenseNot gradedqualityAmaintenanceConnects a workspace and project management platform to Claude, Cursor, VS Code, Windsurf, and other MCP clients, letting users list workspaces, create and manage projects and tasks, and build, train, and prompt AI agents. Also generates MCP tools from any OpenAPI spec.1,958 npmMIT

Onboard MCPofficial
AlicenseNot gradedqualityDmaintenanceConnect Claude, Cursor, or any MCP client to your Onboard workspace to manage projects, KPIs, tasks, and preview-first writes.1MIT- AlicenseNot gradedqualityCmaintenanceConnect MCP-compatible AI assistants like Claude, Codex, and ChatGPT to your InterviewFlowAI workspace so they can search candidates, review interview scores and details, and update supported candidate fields through permission-aware tools.2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.