Skip to content

MCP tools

The MCP server exposes three families of tools: read, write, and build/schema. Agents design the workspace, not just fill it. Always call get_started first.

Tool What it does
get_started Orientation, a workspace map, and the filter cheat-sheet. Call first.
list_workspaces Workspaces the token can access.
list_databases Databases in a workspace.
describe_database A database’s schema — exact api_names, types, options, relation targets. Read before writing.
search Full-text record search — turn a name into a real id.
query_records Filter / sort / paginate records with the structured filter AST.
get_record One record in full, by uuid or public number.
get_links Web-app URLs for a database, its saved views, and/or a batch of records — no round-trip per record.
list_agent_activity Everything one configured Agent wrote in a date range — writes made through an ordinary token never carry agent attribution, so only agent-scoped ones show up here.
list_database_comments Every comment and #record reference across a whole database, newest first — see mentions and notifications.
list_hierarchy_activity The same feed, rooted at one record and walked down a chain of relation fields (e.g. Epic → Story → Task), up to 5 levels — permission-checked at every level.

Each write returns the resulting record; each 422 is surfaced verbatim.

Tool What it does
create_record Create a record; values by api_name, selects accept the label.
upsert_record Match-or-create on a unique field — a matching value updates that record, no match creates one. Returns { record, created } so a caller can tell which branch it took; idempotent on repeat. An automation rule’s own “Create a record” action can do the same thing via upsert.
update_record Merge-update (null clears); record by uuid or public number.
delete_record Trash a record (restorable 30 days).
update_records / delete_records Apply one patch to, or trash, up to 200 records in one call; partial failures come back per record. An update returns a restorable list.
undo_batch_update Revert an update_records call by passing its restorable list back verbatim.
enqueue_bulk_record_job / get_bulk_record_job For selections above one call’s limit (up to 50,000): a durable, resumable background update/delete job, then poll its progress. See bulk operations.
link_records Link a record to targets through a relation field.
add_comment Post a comment.
run_button Press a button field, running its automation actions.
duplicate_record Copy a record within the same database (unlike copy_records, a different one) — values, links, description, and its comment thread + attachments, all copied onto the new record. Owned one-to-many collections are NOT copied (a duplicated project doesn’t clone its tasks).
copy_records Copy one or more records into a different database (unlike duplicate_record, same database). Fields auto-match by name; one with a value and no destination match blocks the copy. Call with dry_run: true (the default) to see the mapping and any blocking fields, resolve a row with skip (drop it) or override (send it to a specific destination field instead of the auto-match — or resolve an ambiguous relation by naming which candidate to use), then call again with dry_run: false. override is MCP/API-only — the web dialog’s mapping is still read-only.

Databases, spaces, and views are trashed and restorable the same way a record is — nothing here erases outright.

Tool What it does
list_trash / restore_records A database’s deleted records (30-day retention) and bringing one back.
list_views_trash / restore_view A database’s deleted views.
list_spaces_trash / restore_space Workspace-wide deleted spaces (admin only) — restoring one brings back every database it held automatically.
list_databases_trash / restore_database Workspace-wide deleted databases (admin only).

A view or space owned by the calling identity, invisible to everyone else including admins — see Personal space for what that guarantees.

Tool What it does
get_or_create_personal_space My own personal space. Idempotent — lazily provisioned on first call, returns the same space every time after.
create_personal_view A view over a shared database that only I can see (deleting a record through it still deletes it for everyone — it’s a lens, not a private copy). Needs only read access, unlike create_view, and is never folder-placed.

create_personal_view accepts form as a type; the web dialog doesn’t offer it. The app’s own picker restricts to seven types for a reason stated in the UI (form and dashboard don’t fit a private-lens framing) — that’s a client-side choice, not an API restriction, so a form-type personal view is only reachable from here today.

Tool What it does
list_spaces / create_space List / create spaces.
create_database / update_database / delete_database Create, rename/move, or delete a database (delete needs confirm = name).
add_field / update_field / delete_field / change_field_type Manage fields; select options by label; convert a field’s type (dry_run to preview).
create_view / update_view / delete_view Manage views; accepts group_by / card_fields / date fields plus filters + sorts.
create_relation / delete_relation Link two databases (one_to_many / many_to_many) — paired relation fields.
reorder_fields / reorder_views Set field / view order by name.
Tool What it does
get_workspace One workspace by name, slug or id, with its full metadata and settings.
list_members / list_invites Who is in the workspace and their role (check before writing a user field — a non-member is rejected); invitations not yet accepted. Read-only.
list_relations / get_relation The whole relation graph in one call (read before structural work); one relation’s sides, cardinality, auto-link rules and the comparable fields set_auto_link accepts.
list_linked_records The full link set of one relation field on a record, as records you can act on. (Not get_links, which builds web URLs.)
list_records Records in the hand-arranged (drag) order a person sees — the one thing query_records can’t express.
count_records_grouped Count, or sum/average/min/max a numeric field, per group of another field, computed in the database — for “how many of each status” and board column counts.
get_field_usage What depends on a field before you delete it: records with a value, and the views, automations and formulas that reference it. Call before delete_field.
get_view One view by id, whether it belongs to a database or a space.
list_space_views Views that belong to a space (dashboards over several databases), which describe_database never shows.
list_sources / list_youtube_channels The scheduled syncs feeding a database (provider, schedule, status, last sync); the channels a connected Google account owns, needed to configure a YouTube source.
get_record_description A record’s rich-text description (the block editor under its title) — not a custom field called “description”.
list_comments A record’s comment thread, newest first, each with its id, author, and source.
update_comment / delete_comment Edit or delete a comment you wrote (admins may delete any; editing someone else’s is refused). Deleting is final — a comment has no browsable trash.
list_action_gates / list_approvals Workspace-declared approval gates and the held items. Read-only by design — approving is a person’s act, in the app Inbox.

A document is a standalone page in a space, belonging to no record — use it for a write-up or plan instead of cramming prose into a record or inventing a database for one page.

Tool What it does
list_documents / get_document Titles and ids in a space; one document as Markdown, with its version. Nested lists, images (as Markdown image syntax), dividers (---) and toggles (as a bullet with the body nested under it) come through and are read back on update; a toggle’s type is not kept, its content is. Files, video and audio appear as links.
create_document Write a page in a space (content is Markdown).
update_document Change title, icon, folder or body. content replaces the whole body, so read it first; pass the version you read to be told about a conflicting edit rather than overwrite it.
delete_document Permanent — a document has no browsable trash.
list_folders / create_folder / update_folder / delete_folder Sidebar folders in a space. List first so you don’t make a near-duplicate. Deleting a folder deletes nothing in it — contents fall back to the space root.
update_record_description Overwrite a record’s rich-text description (Markdown).
restore_document_version / restore_version Roll a record’s description, or its field values, back to a captured version — see record history. Both are recorded and undoable.
Tool What it does
propose_schema → build_schema Turn a plain-language goal into a plan of databases, fields, relations and states (each create-new or reuse-existing) — creates nothing; then build the approved plan in one call.
list_templates / apply_template Single-database or small-space starter templates. They seed sample rows; remove_sample_data deletes exactly those and nothing a person added.
list_packs / install_pack / list_installed_packs / uninstall_pack The built-in Business Pack gallery; install by slug (idempotent; preview shows what it would create without creating it); what’s installed, with the install id uninstall needs. Check installed packs first — installing twice makes a second copy.
browse_pack_marketplace / list_pack_submissions / export_pack Community packs; your submissions’ review status (read-only); turn part of this workspace into an installable pack manifest.
duplicate_database / duplicate_view Copy a database’s schema, views and self-relations into a new independent database; copy a view with its filters, sorts and layout.
set_auto_link / run_auto_link Teach a relation to link itself from matching field pairs; apply the rules to records that already exist (use after an import).
find_select_drift / fix_select_drift Find records that look linked through a matching select label but carry no actual link; link them in one call (show the list to a person first).
unlink_records / move_record Remove specific links without touching the relation; reposition a record in manual order (before or after).
create_records Create up to 100 records in one atomic call — all succeed or none do.
set_default_view / set_favorite Which view people land on; star a record or database for the calling identity.
list_icon_set The curated icon names usable as icon on databases and spaces.
Tool What it does
create_space_view / update_space_view / delete_space_view A space-level dashboard that reads from several databases (update can also move a database dashboard into a space). Deleting a view never deletes the records it showed.
list_space_groups / create_space_group / update_space_group / delete_space_group Presentational sidebar groups above spaces. Deleting a group leaves its spaces ungrouped.
delete_space Soft delete of a space and everything in it — restorable; see trash and restore.

Alongside the tools above: list_personal_views (every personal view you own, workspace-wide), copy_view_to_personal_space / copy_document_to_personal_space (an independent fork, never synced back), and publish_view / move_document_to_space (the one-way move out of Personal). get_personal_filter / set_personal_filter read and set your own extra filter on a view — “the team board, but just my rows”; invisible to teammates, and clear: true removes it. The get_personal_collection_filter / set_personal_collection_filter pair does the same for a record page’s embedded relation collection.

Tool What it does
get_my_work assigned (default), created, or recent records for the identity the token belongs to.
list_notifications / get_unread_count / mark_notifications What’s waiting for you (assignments, mentions, comments, state changes, approval requests); a single unread number; mark read or archive (all: true clears the inbox).
Tool What it does
get_agents / setup_agents Whether the Agentic OS space exists (with a summary), and provisioning it (idempotent).
run_agent / delegate_to_agent Run an agent by hand and get its Run back; hand one record to an agent, which posts its outcome back on the record as a comment linking to the Run.
create_agent_trigger Fire an agent when a record reaches a given state; human_gate: true makes it stage its action for a person to approve.
get_run / get_staged_action / rerun_action / get_run_quota One run in full (each action’s attempts and artifacts); what a parked run is waiting to do (read-only — approving is human-only); retry one failed action with its original inputs; this month’s run usage against your plan.
test_automation / get_automation_last_payload Dry-run a rule against one record before trusting it (no side effects unless you pass an action_index); the latest payload a webhook-triggered rule received.
  • query_records / get_record return select values as labels (not option ids).
  • create_record / update_record accept a plain string on a rich_text field (auto-wrapped to blocks) and select labels.
  • create_record reports any unset template fields so the agent can fill them.
  • get_record / query_records / create_record / update_record all include a url — a clickable web-app link for that record, e.g. https://app.storyos.dev/w/{workspace_id}/d/{database_id}/r/{title-slug}-{number} (falls back to the record’s uuid when it has no public number yet). Use get_links for a database or view link, or to resolve a batch of record links in one call.
  • A workflow field (the canonical status column on almost every database) filters exactly like select over MCP — describe_database returns its own ops array so you don’t have to guess, and query_records / count_records accept either an option’s label or its id, translating eq/neq to has/has_none for you. See the operator × type matrix for the raw API’s own shape, which wants the option id only — the label resolution above is an MCP-side convenience.

For the concepts these tools operate on, see databases & fields, relations, and views.