MCP tools
Every tool the server offers, what it takes and what it returns.
Updated
Agents normally pick these up on their own from the tool descriptions. This page is for people building with them directly, or trying to understand what an agent did.
Every tool returns Markdown text. Any tool that takes a page accepts either the page's id or its exact title (not case-sensitive), so agents can follow a [[Page Title]] link by passing the title straight in. Folder paths are written like Market/Battlecards.
On the sign-in URL, every tool also takes an optional workspace (a name or id). Leave it out to use the person's default workspace.
Reading
These are available to every connection.
get_context
Gets the rules and the relevant reference material for a task, within a token budget. This is the one agents should call before writing anything. How get_context chooses explains what comes back and why.
| Argument | Type | |
|---|---|---|
task |
string, required | What the agent is about to do, in plain words. Include the audience, channel and any product or competitor. |
max_tokens |
integer | Budget from 1,000 to 30,000. Default 12,000. |
pack |
string | A pack name to apply, instead of matching packs to the task. See list_packs. |
tags |
string[] | Only search sections with these tags. Rules, pinned and pack pages still come back. |
folder |
string | Only take material from this folder and its subfolders, like Market/Battlecards. Rules from anywhere still come back; pinned and pack pages outside it don't. |
Your team's agent instructions are added at the top of every result.
search
Searches published sections by words and meaning, and returns the best excerpts with their page ids, scores and tags. Better than get_context for looking something specific up; worse for gathering everything a writing task needs.
| Argument | Type | |
|---|---|---|
query |
string, required | What to look for. |
tags |
string[] | Only sections with these tags. |
limit |
integer | How many results, up to 30. Default 8. |
folder |
string | Only search this folder and its subfolders, like Market/Battlecards. |
get_structure
Shows how the published context is organized: the folder tree, and each page's id, type, tags, attached file and size in tokens. Rules, pinned pages and private notes are marked. Empty folders are included.
| Argument | Type | |
|---|---|---|
folder |
string | Show only this folder, like Market/Battlecards. |
include_headings |
boolean | Also list the headings inside each page. |
list_pages
Lists every published page as a flat list, with its folder path, id, type, role, tags and attached file.
read_page
Returns one published page in full, with its usage note and a note about any attached file. A table comes back as its description and as many rows as fit in about 6,000 tokens, with a pointer to query_table for the rest.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
get_file
Returns a download link for the file attached to a page, or for a table page's rows as a CSV. The link expires after two minutes, so fetch it straight away; call get_file again if it's expired. The result also includes the file's name, type and size, the page's usage note and its description.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
query_table
Filters, sorts and pages through the rows of a published table. Filters combine with AND. Column names match ignoring case. Returns a Markdown table of the matching rows and how many matched in total.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title of a table page. |
filters |
array | { "column", "op", "value" } objects. op is one of eq, neq, contains, starts_with, gt, gte, lt, lte, in (value is a list), empty, not_empty. |
sort |
object | { "column", "direction" }, direction asc (default) or desc. |
columns |
string[] | Only these columns, in this order. |
limit |
integer | Rows to return. Default 50, up to 500. |
offset |
integer | For paging. |
list_packs
Lists the workspace's packs, with their descriptions. get_context applies the packs a task matches on its own; this is for an agent that wants to name one.
list_tags
Lists the workspace's tag vocabulary, grouped by category.
list_workspaces
Only on the sign-in URL. Lists the workspaces the person can read, marking their default. Pass a name or id from here as workspace to any other tool.
Editing
These tools appear for connections that can edit: every sign-in connection, and API keys created with Can edit. What each call may actually change is checked against the person's or key's access every time, and a refusal comes back as a readable error. See When agents write back.
Changes to page text are saved as drafts. Agents keep getting the published version until someone publishes: in the app, or with publish_page, a separate tool that only works where the connection has publish access.
list_all_pages
Every page and folder the connection can see, including drafts, with id, folder path, type, role, tags and publish status (draft, published, or published with unpublished changes). Use this rather than list_pages before editing, since list_pages only shows published pages.
read_draft
Returns a page's current draft and properties. For a table, its columns and draft rows with their row_ids. The draft can differ from what read_page returns, so read this before edit_page, add_rows or update_rows.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
edit_page
Targeted find-and-replace edits to a page's draft. Each old_text must match the draft exactly, whitespace included, and appear exactly once. If any edit doesn't match, none are applied.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
edits |
array, required | One or more { "old_text": "...", "new_text": "..." }. |
rewrite_page
Replaces a page's whole draft. Meant for restructures; edit_page is better for everything else.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
markdown |
string, required | The new body, without the title as a # heading. |
create_page
Creates a new draft page.
| Argument | Type | |
|---|---|---|
title |
string, required | |
markdown |
string, required | The body, without the title as a # heading. Use ## and ### headings to split topics into sections. |
folder |
string | Folder path. Created if it doesn't exist. |
page_type |
string | One of the workspace's page types. An unknown type is refused with the list; agents can't add types. |
role |
string | reference (default) or rule. Rules need whole-workspace edit access. |
tags |
string[] | |
usage_note |
string | One line that travels with the page's content. |
private |
boolean | true makes a private note. Not available to workspace keys. |
create_table
Creates a new draft table: columns plus rows. Agents are told to use it instead of create_page for lists of records that share the same fields.
| Argument | Type | |
|---|---|---|
title |
string, required | |
columns |
array, required | Column names, or { "name", "type" } with type text (default), number, date, url or select. |
rows |
array | One object per row keyed by column name, or arrays of values in column order. |
description |
string | Markdown saying what the table holds and when to use it. |
title_column |
string | The column that names each row. Default: the first. |
folder |
string | Folder path. Created if it doesn't exist. |
page_type |
string | One of the workspace's page types. |
tags |
string[] | |
usage_note |
string | |
private |
boolean | true makes a private table only the user can see. |
add_rows
Adds rows to a table's draft. An unknown column name is refused with the list, unless it's passed in new_columns.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
rows |
array, required | As for create_table. |
new_columns |
array | Columns to add to the table first. |
update_rows
Changes cells in a table's draft rows. Rows are named by the row_id that read_draft shows; only the cells in set change.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
rows |
array, required | { "row_id", "set": { "Column": "value" } } objects. |
new_columns |
array | Columns to add first. |
delete_rows
Removes rows from a table's draft. Agents keep getting the published rows until the page is published again.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
row_ids |
string[], required | From read_draft. |
publish_page
Makes a page's draft the version every agent gets, as Publish in the app does. A separate step from editing: agents are told to call it only when the person asks for a page to be published. Needs publish access to the page: sign-in connections have it wherever the person could publish in the app, and API keys need Can edit and publish. A page that is already published as it stands is left alone. The publish is listed under Activity → Agent edits.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
update_page_properties
Changes a page's properties. Only the fields you pass change. Unlike body edits, these apply to the live page straight away.
| Argument | Type | |
|---|---|---|
page |
string, required | Page id or exact title. |
title |
string | Renaming also updates [[links]] to the page. |
folder |
string | Folder path. An empty string moves the page to the top level. |
page_type |
string or null | null clears it. |
role |
string | reference or rule. Needs whole-workspace edit access. |
tags |
string[] | Replaces the page's tags. |
usage_note |
string or null | |
pinned |
boolean | Always include. Needs whole-workspace edit access. |
expires_at |
string or null | YYYY-MM-DD. |
move
Moves a page, or a folder with everything in it, into another folder. Applies straight away. The destination must already exist. The connection can only move what it can edit, into folders it can edit (a person's own private notes can go in any folder they can see).
| Argument | Type | |
|---|---|---|
page |
string | Page id or exact title. Pass this or folder. |
folder |
string | Folder path or id. Pass this or page. |
to |
string, required | Destination folder path or id. An empty string is the top level. |
delete
Deletes a page or table, or a folder with everything in it, to Recently deleted, where it can be restored in the app for 90 days. Applies straight away; it isn't a draft. The connection can only delete what it can edit, and deleting anything published (a published page, or a folder with one inside) takes publish access. Other people's private notes in a deleted folder stay, moved up a level. Agents are told to delete only when the user asks.
| Argument | Type | |
|---|---|---|
page |
string | Page id or exact title. Pass this or folder. |
folder |
string | Folder path or id. Pass this or page. |
list_owners
Shows who has been given access to a page or folder, directly or through a folder above it, and whether they can read or edit. People with access to the whole workspace aren't listed, since they always have it.
| Argument | Type | |
|---|---|---|
page |
string | Pass this or folder. |
folder |
string | Pass this or page. |
update_owners
Gives people in the organization access to a page or folder, or removes it. Applies straight away. Needs the owners permission: sign-in connections have it wherever the person could make the change in the app, and API keys need Can change who has access to pages and folders.
| Argument | Type | |
|---|---|---|
page |
string | Pass this or folder. |
folder |
string | Pass this or page. |
add |
string[] | Emails to give access to. They must already be in the organization. |
access |
string | write (default; edit, changes stay drafts), publish (edit and publish) or read, for the people being added. Publish access can only be given by a connection that can publish the page or folder itself. |
remove |
string[] | Emails to remove. Only removes access given on this page or folder; access through a folder above it, or to the whole workspace, stays. |
Errors
Problems with a request come back as tool errors with a sentence saying what went wrong and usually what to do instead: a page that doesn't exist, an old_text that matched twice, an edit the connection isn't allowed to make. If the workspace has gone over its rate limit, tools say so and ask the agent to wait a minute.