Playbook
Server Details
Media backend: search, organize, upload, and share creative files and folders
- Status
- Healthy
- Uptime
- 93.6% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 69 tools
Most tools have distinct purposes and the descriptions explicitly cross-reference alternatives (e.g., get_asset vs get_assets, upload_from_url vs create_upload_url). However, the set contains several near-duplicate single/batch pairs and multiple upload/search routes, which can still cause hesitation.
Nearly every tool follows a predictable snake_case verb_noun pattern (list_assets, create_board, update_page_element, delete_custom_field). The only minor deviation is ai_search, which is still clear and consistently cased.
At 69 tools, this is far beyond the typical 3-15 range and the 50+ threshold for extreme mismatch. Many tools are single/batch duplicates (upload_from_url/upload_from_urls, create_upload_url/create_upload_urls, finish_upload/finish_uploads), bloating the surface an agent must navigate.
The surface covers assets, boards, custom fields, versions, comments, imports, apps, sharing, and page layout comprehensively. Minor gaps exist, such as no update/delete for comments and limited bulk tag operations, but agents can work around these.
Available Tools
69 toolsadd_asset_permalinksAdd asset permalinksAInspect
Give assets a permalink: a permanent, PUBLIC URL that needs no login and never expires, unlike the signed display_url, which dies at the end of the next day. Use it when a URL has to keep working — an external site, a deck, a doc, a hand-off to another system. Publishing is the point: the file is copied to a public bucket and anyone holding the URL can fetch it, so a sensitive file becomes public. It serves files, not web pages: an HTML file behind a permalink is sandboxed and its scripts never run, so never use it to host a page or app — deploy_app is for that. The copy runs in the background. This call waits up to about 20 seconds for it and returns the finished URLs under created; anything still copying comes back under pending with no URL. Read those with get_asset_permalinks shortly after — never publish them again; a URL does not work until it is reported there. A large video can take minutes. Assets that already have one are left untouched and are NOT in created — they are listed under already_had_permalink; read their URL with get_asset_permalinks. Assets that all already have one publish nothing and come back listed under already_had_permalink, not as a failure. A permalink only exists for real uploaded files: a link asset, a note, a colour swatch, or an upload still ingesting (is_skeleton: true) is listed under no_file_to_publish and nothing is created — poll get_asset until the upload finishes before asking. failed_to_publish means the file could not be copied at all and the permalink was withdrawn; retrying will not help. Capped per plan (10 Free, 100 on trials, 1,000 Pro, 5,000 Team/Business); going over returns 422 and publishes NOTHING — the whole batch is refused, not the overflow, and the count is taken before the unpublishable assets are skipped, so near the cap send only real files. If the call fails partway, the response still reports what was published or queued plus a remaining list — call again with exactly that list, never with the original one. Send the whole set in one call, up to 200 tokens. The response reports quota after the writes, and list_organizations reports the same headroom without publishing anything, so check it there before a batch you are not sure fits. Requires write scope and update permission on every asset; one unknown token fails the whole call.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_tokens | Yes | Asset tokens to give a permalink (max 200 per call). Tokens that already have one are skipped. If the response carries `remaining`, call again with exactly those tokens. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: it discloses the public-exposure consequence (a sensitive file becomes public), the sandboxing of HTML, the background copy with a ~20s wait and a `pending` class, quota caps per plan with whole-batch 422 refusal, partial-failure `remaining` semantics, write-scope and per-asset permission requirements, and the rule that one unknown token fails everything. Annotations only give readOnly/destructive/openWorld/idempotent hints; this description supplies the operational reality.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single dense paragraph is well front-loaded: purpose, then public-URL warning, then serving limits, then async/return-shape semantics, then edge cases and quota. Nearly every sentence carries decision-relevant information, but the wall-of-text form makes it harder to scan than it needs to be for the volume of distinct edge cases packed in.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description carries the full burden of return semantics and does so completely: it enumerates `created`, `pending`, `already_had_permalink`, `no_file_to_publish`, `failed_to_publish`, `remaining`, and `quota`, and explains what each means and what the agent should do next. For a batch mutation with async completion and partial failure, this is the required level of detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the schema already documents both parameters, giving a baseline of 3. The description adds genuine semantics beyond it: the whole set must be sent in one call (not fanned out), the max-200 limit, that tokens already permalinked are skipped, and that a retry must use exactly the `remaining` token list. It also explains when to pass `organization` versus omitting it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('give assets a permalink') and immediately defines what a permalink is and how it differs from the signed display_url. It also carves out what it is NOT for (hosting pages/apps) and names the sibling that handles that case. An agent can distinguish it from get_asset_permalinks, deploy_app, and share_asset from the first two sentences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when a URL has to keep working — external site, deck, doc, hand-off') and explicit when-not-to-use ('never use it to host a page or app — deploy_app is for that'). It routes the agent to the correct follow-up (get_asset_permalinks to read URLs) and the correct pre-check (list_organizations for quota) rather than re-publishing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_page_elementAdd page elementAInspect
Insert one element into a slot of a board's published page, or into a column of a section element when parent_element_id is given. Returns the slot as it now stands plus element_id. Supply element.id yourself: re-sending the same add then converges (200, nothing inserted), while the same id with DIFFERENT content is 409 element_exists — pick another id or use update_page_element. Props that carry HTML or a URL must be strings. An asset_token prop takes a token from list_assets; the server copies that asset into the page's library and stores the copy's token. To add several elements, or a section plus its contents, prefer apply_page_operations (atomic). Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| element | Yes | ||
| slot_id | Yes | A slot's id from get_page_layout, or its NAME (e.g. `menu`, `grid`). Use the name when get_page_layout reports `slots: null`: the write stores the template defaults and the response carries real ids to address from then on. | |
| at_index | Yes | 0-based position in the slot (or column). Past the end appends. | |
| column_id | No | Id to give a column this call CREATES (with create_new_column, or when column_index is past the last column). It does NOT pick an existing column: without column_index the element lands in column 0. Address an existing column with column_index. | |
| column_index | No | Section column to insert into, by 0-based position. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| create_new_column | No | Create a new column in the section for this element. | |
| parent_element_id | No | Insert into this `section` element's columns instead of at slot top level. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations, which only give readOnly/destructive/openWorld hints. It discloses the idempotency contract (same id + same content converges; same id + different content is 409 element_exists), the compare-and-swap semantics of expected_version_token, which 409s are safe to repeat, the converged/materialized response keys and their absence-when-false convention, and a one-hour public-page staleness window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and scope, then layered into error, concurrency, and response semantics; virtually every sentence carries operational weight. It is long and dense, but the length is justified by the tool's complexity rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return payload (the slot as it now stands, element_id, the new version_token, converged/materialized flags), plus auth failures, concurrency conflicts, and caching delays. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 91%, so the schema carries most parameter meaning, but the description adds real value: element.id as an idempotency token, props carrying HTML/URL must be strings, asset_token is copied into the page library, and expected_version_token is an echoed compare-and-swap value. The column_id vs column_index distinction is covered in the schema rather than the prose, leaving little to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: insert one element into a slot of a published page, or into a section column when parent_element_id is given. It also names the sibling it differs from (update_page_element for changes, apply_page_operations for batches), so the agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: use update_page_element when the same id carries different content, and prefer apply_page_operations for several elements or a section plus contents (atomic). It also states the permission precondition (modify + page-layout API writes) and which errors are safe to retry versus which are not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ai_searchAI searchARead-onlyInspect
AI-powered visual search for assets in a Playbook workspace. Understands what is depicted inside assets — colors, subjects, scenes, objects, and compositions. Use this when the user describes visual content: 'ocean waves in blue', 'product shots on white background', 'videos with people outdoors'. Works regardless of filename or tags. Prefer this over search_assets for any content-descriptive query. Scope it to a board with collection_token (plus nested_assets for a parent board) — unscoped it searches the whole workspace, which for a moodboard, pitch reel or client hand-off returns mostly assets from other projects. Also filters by uploader and by date range. To find what a PERSON uploaded, call list_members to resolve their name to a token, then pass that token as uploaded_by. Putting a person's name in query does NOT match the person who uploaded an asset — it searches the asset's own text and will return unrelated files.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language search query | |
| fields | No | Return ONLY these fields on each result. `token` is always included. Valid names: token, title, media_type, text_type, status, approved, approved_after, tags, permalink, display_url, stream_url, collection_token, size, is_skeleton, uploaded_by, source_error, ai_generated, ai_agent_payload. `display_url` and `permalink` are ~400 characters each, so narrowing a large result set is most of the saving. An unknown name is refused, not ignored: there is no `created_at`, `updated_at` or `type` among them — `media_type` is the name for an asset's kind, and its other metadata comes from get_asset or get_assets. | |
| date_to | No | Inclusive upper bound, ISO 8601 date or datetime | |
| statuses | No | Restrict results to assets carrying these status or custom field VALUES, e.g. ['Approved']. Case-insensitive, and it covers the built-in Status and every custom field, exactly as in search_assets. Several values match ANY of them — unlike search_assets there is no `and` mode here. | |
| date_from | No | Inclusive lower bound, ISO 8601 date or datetime (e.g. '2026-08-13') | |
| parent_id | No | Search token returned as pagination.parent_id. Pass it alone to refine that search, or together with after_cursor to fetch its next page. | |
| date_field | No | Which date the range applies to. 'original' is when the file itself was created (EXIF date where available); 'uploaded' is when it was added to Playbook. Defaults to 'original', EXCEPT when `uploaded_by` is set, where it defaults to 'uploaded' — so 'what did Max upload last week' means what you expect. | |
| uploaded_by | No | Restrict results to assets uploaded by these people. Pass member tokens from list_members. A name is accepted as a fallback and resolved server-side, but only when it matches exactly one member — otherwise the call fails and lists the candidates to choose from. | |
| after_cursor | No | Opaque cursor returned as pagination.after_cursor. Must be paired with parent_id from the same response. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| nested_assets | No | Search the board's entire nested subtree rather than only the assets sitting directly in it. Requires `collection_token`. Set it whenever the token might be a PARENT board — without it a parent whose assets all live in sub-boards returns nothing at all. Caveat: subtree matching reads a search-index field that refreshes when an asset is re-indexed, so it can briefly lag a board being MOVED; list_assets with `nested_assets` reads the database and cannot. | |
| get_ai_payload | No | Include each result's `ai_agent_payload`. Default false, and the key is then ABSENT rather than null. This only RETURNS the payload — it is not part of what is searched. | |
| collection_token | No | Limit the search to a specific board |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered; the description still adds substantial non-obvious behavior: unscoped searches span the whole workspace, nested_assets is required for parent boards or the search returns nothing, subtree matching can lag a board move whereas list_assets reads the database, and putting a person's name in `query` does not match the uploader. These are genuine gotchas not derivable from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then scoping, then the uploader pitfall — a sensible priority order with no filler sentences. It runs long for a description, but for a 13-parameter tool every paragraph carries operative guidance rather than restating schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, no output schema, and rich annotations, the description covers calling correctly: scope, nesting, uploader resolution, date-field defaults, and payload retrieval. It stops short of describing the result shape or pagination flow (parent_id/after_cursor are left to the schema), which is the only meaningful gap for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema does not: collection_token is framed as the scoping lever with a stated consequence, nested_assets is tied to parent-board tokens, and uploaded_by is tied to a list_members resolution step. The name-in-query pitfall is a semantic warning absent from the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('AI-powered visual search for assets') and immediately qualifies what makes it distinct: it understands depicted content (colors, subjects, scenes, objects, compositions) rather than filenames or tags. It explicitly names the sibling it displaces ('Prefer this over search_assets'), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use examples ('ocean waves in blue', 'product shots on white background'), an explicit alternative and the condition that selects it (content-descriptive queries vs search_assets), plus a scoping recommendation with the failure mode for not scoping (moodboard/pitch reel returns other projects' assets). It also spells out the correct multi-tool workflow for uploader queries via list_members.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_page_operationsApply page operationsADestructiveInspect
Apply up to 50 page edits to a board's published page in order and ATOMICALLY — the first failure rolls everything back, and the error carries operation_index naming the failing operation. Each operation is { type: add|update|move|delete|reorder, ...} with exactly the arguments of the matching single tool (add_page_element etc., minus organization/token/subboard_token/expected_version_token, which are batch-level); operations in get_page_elements_catalog is the authoritative argument map, and unknown keys are refused. Ids the server mints inside a batch cannot be addressed by later operations of the same batch, so give every new element (and a new section's columns) your own id. Returns the whole document (slots) and one summary per operation. Top-level converged appears only when EVERY operation converged, and never on a batch containing an update. One batch edits one document: the main page, or one nested board's section. Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| operations | Yes | The edits, e.g. { type: 'delete', slot_id: 'grid', element_id: '<id from get_page_layout>' }. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (destructive, non-idempotent, open-world) by disclosing atomic rollback, the operation_index on failure, id-minting constraints, permission prerequisites (403 page_layout_api_disabled), compare-and-swap staleness behavior (409 stale_document applies nothing), which 409s are safe to retry, and the up-to-one-hour public propagation delay.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the atomic batch purpose before the operational detail, and nearly every sentence carries a distinct operational fact. It is nonetheless a dense wall of text that could be tightened, which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, destructive, non-idempotent batch mutation with no output schema, the description covers error semantics, concurrency, permissions, and the exact shape of the response (slots, per-operation summaries, converged, materialized) — nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it points to get_page_elements_catalog as the authoritative argument map, notes unknown keys are refused, and explains the compare-and-swap role of expected_version_token and the new token returned after a successful write.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource — applying up to 50 page edits to a board's published page — plus the defining trait (ordered, atomic). It clearly differentiates itself from the single-operation siblings (add_page_element, update_page_element) by being the batched equivalent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives extensive operational context: each operation takes the arguments of the matching single tool, batch-level params are excluded, and one batch edits exactly one document. However, it never states plainly when an agent should prefer this batch tool over looping the single-tool siblings, leaving that routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_asset_tagsChange asset tagsADestructiveIdempotentInspect
Add and/or remove tags on a single asset. Pass add_tags and/or remove_tags as string arrays. Tags not in either list are left untouched.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token | |
| add_tags | No | Tags to add | |
| remove_tags | No | Tags to remove | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so safety is covered. The description adds meaningful merge semantics: tags not in either list are left untouched, which tells the agent that unrelated tags are preserved. It still omits auth/permission requirements and error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the operation and scope, then parameter mechanics, then the key preservation guarantee. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully documented schema, rich safety annotations, and no output schema, the description supplies the critical merge behavior and scope. It leaves minor gaps, such as overlap between add_tags and remove_tags, but is largely complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only restates that add_tags and remove_tags are string arrays, adding no syntax, validation, or case-handling detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (add/remove tags) and scope (single asset), which clearly separates it from generic asset-mutation siblings like update_asset. It does not explicitly name or compare against any sibling tool, so it falls short of the top-tier sibling-differentiation bar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains how to pass add_tags/remove_tags but never says when to use this tool instead of update_asset or any other tag-related operation. There is no context, prerequisite, or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_assetsCopy assetsAInspect
Copy one or more assets into a target board. Accepts an array of asset tokens and the destination board token. Returns immediately (202 Accepted) — the copy runs asynchronously, so the new assets may take a few seconds to appear. Requires a token with the write scope.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_tokens | Yes | Asset tokens to copy | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| collection_token | Yes | Destination board token |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=false). The description adds meaningful context beyond them: the 202 Accepted asynchronous behavior, the delay before assets appear, and the required write scope. It stops short of explaining duplicate-call behavior or what asset properties are copied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences with zero waste. The core action is front-loaded, followed by the async behavior and the auth requirement, in a logical order an agent can act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation tool with no output schema, the description covers the critical async return behavior and scope requirement. It leaves some gaps around failure modes, partial success, and exactly what gets copied, but the rich schema and annotations carry much of the remaining burden.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself provides detailed parameter descriptions (including the nuanced organization parameter). The description only restates the two main parameters, adding no semantic detail beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Copy'), resource ('assets'), and scope ('into a target board'), with the one-or-more plurality. The verb 'copy' inherently distinguishes it from the sibling 'move_assets' without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation described (copying assets), but there is no explicit guidance on when to choose this tool over alternatives like move_assets or create_asset_version. The write-scope requirement is a prerequisite, not a usage condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_asset_versionCreate asset versionADestructiveInspect
Upload a file from a public URL as a NEW VERSION of an existing asset — the asset keeps its token, boards, and links, and its live bytes are REPLACED (head_version_number moves forward; the current head is snapshotted first). Requires a write-scope token and versioning enabled on the workspace plan. The URL must be a public https:// address (private/loopback/metadata hosts are refused). NOT idempotent — each call uploads fresh bytes and mints a new version even for an identical file, so on a timeout do NOT blind-retry; re-list versions with list_asset_versions to check whether it landed. v1 uploads a single request up to a size cap; files that need multipart upload on this workspace's storage (>=5MB on Backblaze) or exceed the cap are refused with an error directing you to the Playbook web or desktop app. The optional comment is recorded on the snapshot of the REPLACED head (not on the new content), matching revert.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Public https:// URL of the new file's bytes | |
| title | No | Filename used to derive extension/media type; defaults to the URL's last path segment | |
| token | Yes | Token of the EXISTING asset to add a version to | |
| width | No | Pixel width — only pass if actually known; do NOT guess. Omit and the server derives it. | |
| height | No | Pixel height — only pass if actually known; do NOT guess. Omit and the server derives it. | |
| comment | No | Optional note recorded on the snapshot of the REPLACED head (not the new content) | |
| media_type | No | MIME type; defaults to the source response's Content-Type | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/non-idempotent, but the description adds substantial context beyond them: live bytes are replaced while the current head is snapshotted, a write-scope token and versioning-enabled plan are required, private/loopback/metadata URLs are refused, and the comment lands on the replaced head's snapshot. This is rich disclosure of side effects and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first clause, then layers constraints, failure modes, and retry guidance in dense, non-redundant sentences. Despite its length, every sentence carries distinct decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers mutation semantics, auth/plan prerequisites, URL validation, size/multipart failure behavior, and the retry-vs-check procedure. An agent has everything needed to call it correctly and handle failure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 8 parameters and the baseline would be 3. The description adds operational meaning beyond the schema: it clarifies the uri constraint (public https, private hosts refused) and explains the comment's placement relative to revert semantics, though most param detail duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: uploading a file from a public URL as a NEW VERSION of an EXISTING asset, and explicitly contrasts with creating fresh assets by noting the asset keeps its token, boards, and links. An agent can distinguish this from siblings like upload_from_url or create_upload_url immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (existing asset + versioning enabled) and when-not (files needing multipart or over the cap are refused and redirected to the Playbook web/desktop app). It names list_asset_versions as the recovery step after a timeout and forbids blind retry, which is exactly the alternative-selection guidance a caller needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_boardCreate boardAInspect
Create a new board in a workspace. Optionally nest it under an existing parent board by passing parent_collection_token.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Board title | |
| description | No | Board description | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| parent_collection_token | No | Parent board token (omit to create at workspace root) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the agent knows this is a non-destructive, non-idempotent write. The description adds the useful default behavior that omitting parent_collection_token creates at the workspace root, but says nothing about permissions, side effects, or failure modes beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and then the optional variant. Every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create tool with full schema coverage and annotations covering the safety profile, the definition is nearly sufficient. The only minor gap is that with no output schema, the description does not hint at what the created board returns (e.g. a token), which an agent may need for follow-up calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, including the org-resolution rules and the parent token default. The description's mention of parent_collection_token largely restates what the schema already says, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource (create a board) with scope stated (in a workspace) and a distinguishing capability (nesting under a parent board). An agent can separate it from update_board, get_board, and the many other create_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the optional nesting parameter applies, but gives no explicit when-to-use vs alternatives guidance (e.g. when to create a root board vs. a nested one) and no prerequisites. Usage is inferable from the schema's organization parameter notes rather than the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_colorsCreate colorsADestructiveInspect
Add colour swatches to a Playbook board — the building blocks of a palette or a brand's colour spec. Send two or more codes and Playbook merges them into a palette (a group asset), returned as group; send one and group comes back null. A colour is a hex code ("#FF0000", "#F00"), CMYK ("CMYK(0%, 100%, 100%, 0%)"), a two-stop gradient ("#FF0000\u2192#0000FF"), or a Pantone name written WITHOUT the "PANTONE " prefix, exactly as it appears in Playbook's Pantone list — "185 C", not "PANTONE 185 C". Anything else is rejected with 406. Returns the finished swatches immediately (nothing is uploaded, so there is no polling step). Requires a token with the write scope. Tip: validate collection_token with get_board first — an unknown token silently falls back to an anonymous default board.
| Name | Required | Description | Default |
|---|---|---|---|
| titles | No | Optional titles, positionally aligned with color_codes. A null entry falls back to the code itself. | |
| color_codes | Yes | 1-100 colours per call. Each is a hex code ("#FF0000", "#F00"), CMYK ("CMYK(0%, 100%, 100%, 0%)"), a two-stop gradient of two hex codes joined by → ("#FF0000\u2192#0000FF"), or a Pantone name with no "PANTONE " prefix and exact casing ("185 C", "185 CP", "20-0001 TPM"). An unrecognized value fails the whole call with 406 — nothing is created. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| parent_token | No | Merge the new swatches into this existing asset or group instead of letting them form a palette of their own. | |
| collection_token | No | Destination board token. If omitted or unknown, Playbook silently routes to a default anonymous board — call get_board first to validate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: atomic failure semantics ('An unrecognized value fails the whole call with 406 — nothing is created'), no upload or polling step, merge-into-group behavior for multi-code calls, null `group` for single-code calls, and the silent anonymous-board fallback. The description is consistent with destructiveHint=true and idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and each sentence carries operational weight (formats, error behavior, auth scope, validation tip). It is dense rather than padded, though the colour-format enumeration partially duplicates the schema and makes the paragraph long.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five parameters, no output schema, and a mutation with destructive semantics, the description covers return shape (`group` vs null), error behavior, auth scope, and a critical pre-validation step. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: the group/palette merge behavior tied to color_codes cardinality, the exact Pantone prefix convention ('185 C' not 'PANTONE 185 C'), and the rationale for omitting/passing `organization`. It does not fully explain `parent_token` beyond a brief gloss.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add colour swatches to a Playbook board') and immediately scopes the concept ('building blocks of a palette or a brand's colour spec'). This clearly separates it from siblings like create_board, create_note, or create_asset_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions and routing advice: send one code vs two or more (different return semantics), requires a `write` scope token, and explicitly recommends validating `collection_token` with get_board first because unknown tokens silently fall back to a default board. It lacks an explicit 'do not use this when...' statement, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_commentCreate commentAInspect
Post a top-level comment on an asset or board. Exactly one of asset_token or board_token must be provided.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_token | No | Asset token (provide this OR board_token, not both) | |
| board_token | No | Board token (provide this OR asset_token, not both) | |
| description | Yes | Comment body | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, so the safety profile is covered. The description adds the "top-level only" scoping rule, which is real behavioral context, but says nothing about permissions, duplicate handling, or visibility on the target.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, the core action front-loaded and the hard constraint immediately after. No filler, no restating the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple non-idempotent create with no output schema, and annotations plus the fully documented schema cover most of what an agent needs. The mutual-exclusion and top-level rules are surfaced; only error/failure behavior is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the mutual-exclusion notes on asset_token/board_token and a detailed organization explanation, so the schema carries the burden and baseline 3 applies. The description's restatement of the xor constraint is accurate but adds nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Post") and resource ("top-level comment") plus the two target types ("asset or board"). The "top-level" qualifier distinguishes it from nested/reply comment operations, so an agent can place it against siblings like get_comments and edit_asset_version_comment without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description establishes the create-comment intent and the mutual-exclusion requirement, but never names when to choose this over get_comments (reading) or edit_asset_version_comment (editing), nor any prerequisites. Adequate but with a clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_custom_fieldCreate custom fieldADestructiveIdempotentInspect
Create a custom field on a workspace, or REPLACE the options of one that already exists. Matching is by name: if a select field with this name exists, its option list is overwritten and every option missing from options is deleted, taking that value off every asset holding it. Always pass the complete intended option set, and check list_custom_fields first when the field may already exist. The workspace's built-in 'Status' field cannot be replaced through this tool; use update_asset_status to assign its value to an asset. For a select field (the default) options cannot be empty. For a date, person or url field pass field_type and no options; an existing field with the same name and type is returned unchanged, and a name already used by a field of another type is refused. A NEW field is refused once the workspace reaches its plan's custom field quota — replacing the options of an existing field still works at the limit, so check list_custom_fields before assuming the workspace needs another field. A field's VALUE is set on an asset with update_asset's fields argument ({ "Priority": "High" }); there is no separate set-value tool. Field and option names are matched EXACTLY; update_asset answers an unknown one with an error naming the valid ones, and list_custom_fields has the spelling. Requires a write-scope token and workspace owner/admin permission.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Field name, e.g. 'Priority'. An existing field with this name is reused and its options replaced. The built-in 'Status' field is protected and cannot be replaced. | |
| options | No | The complete set of values a select field allows, e.g. ['Low', 'Medium', 'High']. Replaces the existing options; anything omitted is deleted. Required and non-empty for a select field; omit it for date, person and url fields. | |
| field_type | No | What the field holds: 'select' (default) for a fixed set of options, 'date' for an ISO date, 'person' for a workspace member, 'url' for a link. Cannot be changed later. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true and idempotentHint=true, and the description richly corroborates beyond them: it discloses exactly what is destroyed (options omitted are deleted, removing the value from every asset holding it), the plan quota on new fields, auth requirements (write scope + owner/admin), and exact-name matching with error behavior on unknown names. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the primary create/replace behavior, then caveats, quota, and auth. It is dense and long, and a couple of statements (Status-field protection, options replacement) partially restate the schema, but nearly every sentence carries actionable information, so the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four params, one mutation with destructive side effects, no output schema, and a large sibling set, the description covers creation, overwrite semantics, quota limits, auth, sibling routing, and value-setting. An agent has everything needed to call it correctly; the absent output schema is not a gap since nothing about the response is required to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter detail largely duplicates schema text, but the description adds cross-parameter semantics: the field_type/options dependency (select needs non-empty options; date/person/url pass field_type and omit options), the unchanged return for a same name+type field, and refusal when the name belongs to another type. That is genuine meaning beyond the schema, though much overlaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb (Create / REPLACE) and resource (custom field on a workspace), and immediately distinguishes the dual create-or-overwrite behavior. It differentiates itself from siblings by naming delete_custom_field's counterpart (list_custom_fields), update_asset_status, and update_asset explicitly, so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not guidance: check list_custom_fields first if the field may exist, do NOT use this for the built-in 'Status' field (use update_asset_status), and set a field's VALUE via update_asset's `fields` argument because no separate tool exists. The alternatives are named with the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_noteCreate noteADestructiveInspect
Add a note to a Playbook board — a sticky-note asset that holds text rather than a file. Use it to annotate a board: a brief, a caption, a to-do, context for the assets around it. Returns the finished note immediately (nothing is uploaded, so there is no polling step). Requires a token with the write scope. Tip: validate collection_token with get_board first — an unknown token silently falls back to an anonymous default board.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Manual tags to apply on creation | |
| text | Yes | The note's content | |
| color | No | Note background as a hex code. Use a note palette colour, matched exactly including case: #ffffff, #F1F3F7, #ECEAF2, #F4EBE0, #F4EFD9, #E6EEE7, #F1E5E5, #ECEAE6. Any other value is accepted but has no dark-mode counterpart, so in dark mode the note keeps its light background under light text and is hard to read. Omit it and nothing is stored — the note renders white and reads back as `average_color: null`, which is not a failed write. | |
| title | No | Optional title shown above the note | |
| height | No | Note card height in pixels | |
| status | No | Status label to set on creation | |
| description | No | Optional longer description | |
| group_token | No | Token of an existing GROUP asset to place the note inside | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| collection_token | No | Destination board token. If omitted or unknown, Playbook silently routes to a default anonymous board — call get_board first to validate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: confirms the note returns synchronously with no upload/polling step, states the required `write` scope, and discloses the critical silent-failure mode where an unknown collection_token falls back to an anonymous default board. It also explains the color omission consequence (average_color: null is not a failed write). These are exactly the traps an agent needs flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, behavior, auth requirement, and the get_board tip in a logical order. Every sentence carries information, though the density makes it longer than strictly minimal for a 10-param tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers creation semantics, sync return behavior, auth scope, the silent-fallback risk, and the no-output-schema case by stating what is returned. For a mutation with 10 parameters and no output schema, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema descriptions are unusually detailed (color palette, organization resolution, collection_token fallback), so the schema does the heavy lifting. The description largely restates the collection_token warning rather than adding new per-parameter meaning, so baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a note to a Playbook board') and immediately differentiates it from file-based siblings by defining it as 'a sticky-note asset that holds text rather than a file.' An agent can distinguish it from create_comment, add_page_element, and upload_* without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use contexts ('a brief, a caption, a to-do, context for the assets around it') and a specific prerequisite workflow: validate collection_token with get_board first. It does not name an alternative tool for cases where the agent wanted a file asset, but the usage condition is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upload_urlCreate upload URLAInspect
Step 1 of 2 for uploading a file you already HOLD — one generated locally, returned as base64 by an image API, or sitting on disk. Returns a one-time address to send the bytes to, plus the exact HTTP requests to make; the caller sends the bytes and finish_upload then turns them into an asset. Requires a token with the write scope and a caller that can make HTTP requests. Prefer upload_from_url whenever the file is already at a URL Playbook can fetch — that route is one call and needs nothing from you. Come here when it is not: no URL at all, a URL behind a login, an expired signed URL, a host that blocks datacenter addresses, or an ingest that failed with "Source URL too large to fetch; upload manually" (Playbook's fetcher runs to a five-minute streaming budget, which this path does not have — though it has a size ceiling of its own, below). When neither a reachable URL nor HTTP requests are available, share_board with enable_uploads returns a link a person can drop the file on. Files above 104857600 bytes are refused: these tools transfer in a single request, and splitting a larger file into chunks is what the Playbook web and desktop apps are for.
| Name | Required | Description | Default |
|---|---|---|---|
| size | Yes | Exact size of the file in BYTES. It is checked against the workspace's storage allowance before the upload address is issued, and a wrong value here produces a signature that does not match the bytes you actually send. Measure it, do not estimate it. | |
| filename | Yes | Filename including its extension, e.g. "moon.png". Playbook derives the stored file extension from it, so a name with no extension produces an object with no usable type. It does NOT become the asset's title — the two calls share no state, so pass the title again to finish_upload. | |
| media_type | Yes | MIME type of the file, e.g. "image/png". Required, and required again at completion: it is covered by the upload signature, so the value you give here is the exact Content-Type the recipe will tell you to send. Get it from whatever produced the file rather than guessing from the extension. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: requires a token with the `write` scope, requires a caller capable of making HTTP requests, returns a one-time address, and enforces a hard 104857600-byte ceiling with an explanation (single-request transfer). It also contrasts Playbook's five-minute streaming fetcher budget against this path's lack of it. This is rich, non-obvious behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded ('Step 1 of 2...'), then the preference and fallback routing follow. It is long and dense, but nearly every clause carries routing or constraint information, so little is wasted; a slightly tighter phrasing would reach 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains what comes back (a one-time address plus exact HTTP requests to make) and how the two-call flow completes. Combined with full schema coverage and the annotations, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters, setting the baseline at 3. The description adds the 104857600-byte ceiling that constrains the `size` parameter and reinforces the cross-call state (title must be re-passed to finish_upload), giving modest value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and frames it as 'Step 1 of 2 for uploading a file you already HOLD', immediately distinguishing it from the fetch-based sibling upload_from_url and from finish_upload. An agent can tell exactly what this produces: a one-time address plus the HTTP requests to send.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Prefer upload_from_url whenever the file is already at a URL', then enumerates the exact conditions that select this tool instead (no URL, URL behind a login, expired signed URL, blocked host, failed ingest), and names share_board with enable_uploads as the fallback when neither route is available. When-to-use, when-not, and alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_upload_urlsCreate upload URLsAInspect
Batch form of create_upload_url: request upload addresses for up to 100 files in one call, then send each file's bytes and finish them all with finish_uploads. Give every item a uuid of your own — it is echoed back beside that item's address, and with several similar files it is the only reliable way to tell which address belongs to which file. Returns a batch_id that finish_uploads needs: it holds a reservation against the workspace's quota until the batch completes — so prepare a batch only when you are ready to finish it, and pass the batch_id back. Use upload_from_urls instead when the files are already at URLs Playbook can fetch. If any single file cannot be handled the whole call is refused rather than half of it succeeding.
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | Files to prepare (1-100) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-idempotent, non-destructive mutation, but the description adds substance beyond them: the returned batch_id holds a reservation against the workspace quota until completion, and the call is all-or-nothing ('if any single file cannot be handled the whole call is refused'). The uuid echo behavior is also disclosed. Lacks return-shape detail, which is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, mechanics, the uuid rationale, the batch_id/quota warning, and the alternative are all front-loaded into one dense paragraph with no filler sentences. Slightly long, but every clause carries operational weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers the return value (batch_id), the cross-call dependency (finish_uploads), the quota/cost implication, and the failure mode. An agent has everything needed to call it correctly without opening other tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description genuinely adds rationale the schema lacks: why a caller-supplied uuid matters ('with several similar files it is the only reliable way to tell which address belongs to which file') and why the batch_id must be passed back. It also reinforces the 'measure, do not estimate' size constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('request upload addresses for up to 100 files in one call') and explicitly frames itself as the batch form of create_upload_url. The agent can immediately distinguish it from the singular sibling and from upload_from_urls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('prepare a batch only when you are ready to finish it'), a named alternative with the condition that selects it ('Use upload_from_urls instead when the files are already at URLs Playbook can fetch'), and the required follow-up call (finish_uploads). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_appDelete hosted appADestructiveInspect
Take a hosted app offline and delete it. Its public address stops working within a minute and its slug becomes free for any workspace to take. NOT reversible: the files are gone, and bringing the app back means deploying them again with deploy_app. The board and its assets are untouched. Requires write scope and permission to edit the board the app shows. Needs hosted apps enabled for the workspace: without it the call answers 403 hosted_apps_disabled, which no tool can change — tell the user to ask Playbook support.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug of the app to delete, from list_apps | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=false, openWorld=true, but the description goes well beyond them: exact timing of address failure (within a minute), slug redistribution to any workspace, permanent file loss, the fact that board and assets are unaffected, and a specific error code path with an escalation instruction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four front-loaded sentences with no filler: the action, the irreversible consequence, the blast radius, and the permission/error prerequisites. Each sentence carries distinct information an agent needs before invoking.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent tool with no output schema, the description covers reversibility, side effects, scope boundaries, required permissions, and the unhandlable error case. Nothing material to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are documented in the schema itself, including the slug pattern and the single-vs-multi-workspace resolution rule for organization. The description adds nothing parameter-specific, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Take a hosted app offline and delete it') with a clear scope statement about what happens to the app's address and slug. An agent can distinguish this from delete_asset and delete_board immediately, and the description reinforces that the board and its assets are untouched.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the tool as non-reversible and names deploy_app as the alternative path to bring the app back, plus states the prerequisites (write scope, board-edit permission, hosted apps enabled). The hosted_apps_disabled 403 case and the instruction to tell the user to contact support give the agent a concrete fallback behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_assetDelete assetADestructiveInspect
Soft-delete an asset. This is reversible from the Playbook trash for a limited time.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations supply destructiveHint=true and idempotentHint=false, and the description adds genuinely new behavior: the deletion is soft and recoverable from the Playbook trash for a limited time. That materially changes an agent's risk calculus. It stops short of a 5 because it says nothing about permissions or what happens once the trash window lapses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, no filler, and the critical reversibility caveat is stated immediately after the action. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, fully documented delete operation with strong annotations, the description covers the essentials an agent needs. Nothing about return values is required since no output schema exists, though a note on the recovery window duration would make it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both token and organization fully documented in the schema (including when to omit the workspace slug). The description adds no parameter meaning of its own, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (soft-delete) and resource (asset), and the 'soft' qualifier meaningfully distinguishes it from a hard destroy or from revert_asset. It does not explicitly name a sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage through 'soft-delete an asset' and notes the reversibility window, which hints at when it is safe to call, but it never states when to prefer this over alternatives such as revert_asset, or any prerequisite conditions. Guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_boardDelete boardBDestructiveInspect
Delete a board and all of its contents. Destructive.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds one genuinely new fact — that all board contents are deleted along with the board (cascade) — but says nothing about irreversibility, recovery, or required permissions. 'Destructive.' merely restates the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and scope. The second sentence ('Destructive.') largely duplicates the destructiveHint annotation rather than earning its place, but the overall text is tight and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an irreversible cascading deletion with no output schema, the description covers the minimum: what is removed. It omits recovery expectations, permission requirements, and how to obtain the token, which an agent would benefit from before invoking a destructive operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the organization parameter has a thorough inline description explaining when to pass or omit it. The tool description adds no parameter meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) and resource (board), plus the scope of the operation — 'and all of its contents' — which signals a cascading delete. It does not distinguish itself from sibling delete_* tools, but the name and verb make the target unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus update_board, or on prerequisites such as needing a board token obtained from list_boards/get_board. There is no mention of alternatives or conditions under which deletion is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_custom_fieldDelete custom fieldADestructiveInspect
Delete a custom field of any type, with all of its options. This strips the field's value from every asset that carried one, and is not reversible. The workspace's built-in 'Status' field is protected and cannot be deleted. Takes the field token from list_custom_fields, not its name. Requires a write-scope token and workspace owner/admin permission.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Custom field token from list_custom_fields | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantial beyond-annotation context: values are stripped from every asset, the action is not reversible, the Status field is protected, and it requires a write-scope token plus owner/admin permission. Auth and irreversibility are exactly the extra disclosure the annotations don't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive effect and irreversibility in the first two sentences, then appends the protection and auth constraints. Every sentence carries distinct, actionable information with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive 2-parameter tool with no output schema, the description covers impact, irreversibility, protected resources, parameter source, and auth requirements. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a meaningful clarification that the token must be the identifier from list_custom_fields and explicitly not the field's name — a real semantic guard beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Delete) and resource (custom field), plus scope ('of any type, with all of its options'). It is clearly distinguishable from sibling create_custom_field and read-only list_custom_fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context for use: it names the source of the token (list_custom_fields) and explicitly excludes the built-in 'Status' field, which cannot be deleted. It does not name an alternative sibling, but the when/when-not conditions are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_page_elementDelete page elementADestructiveIdempotentInspect
Remove an element from a board's published page and return the slot as it now stands. An id that is nowhere on the page succeeds with converged: true, which means nothing was removed. An id that exists but in a different slot than slot_id is a 404. Deleting a section removes its contents with it. Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| slot_id | Yes | The slot holding the element (id or name). | |
| element_id | Yes | Id of the element to remove, from get_page_layout. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavioral detail beyond the annotations: cascade semantics for sections, permission and workspace-enabled requirements, exact error codes (403 page_layout_api_disabled, 409 stale_document), version token handling, idempotency via converged/materialized flags, and a one-hour propagation delay for the public page. This is exactly the kind of context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but all sentences earn their place; the core action is front-loaded and edge cases follow logically. Nothing is redundant, and each sentence adds critical operational detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains return semantics (converged, materialized, version_token) and covers permissions, concurrency, error handling, and propagation delay. An agent has everything needed to invoke and interpret results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning: it clarifies that element_id must match slot_id (else 404) and explains how to use expected_version_token from get_page_layout for compare-and-swap. That is useful semantic guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Remove an element from a board's published page') and clarifies it returns the slot as it now stands. An agent can distinguish this from siblings like update_page_element or move_page_element without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides rich context about when the call succeeds (id nowhere on page) and when it fails (id in a different slot returns 404, missing permissions return 403), plus concurrency behavior with version tokens. It does not explicitly name an alternative tool, but for a delete operation the when-to-use conditions are thoroughly covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_appDeploy hosted appADestructiveIdempotentInspect
Put a small web app that you wrote live at a public address, or replace the files of the app this workspace already has under the same slug. A hosted app is static files — HTML, CSS, JavaScript, no build step — that show ONE board and its sub-boards: a gallery, a portfolio, a catalogue. Returns the app's url. Read the hosted_apps topic with read_documentation BEFORE writing the files: it has the contract and a working starter. In short, the page reads the board through its own address: a GET of the RELATIVE URL playbook/api/<path> returns the Playbook REST API's answer to /v1/{organization}/<path> (e.g. playbook/api/assets?nested_assets=true), and playbook/app answers { board }. The page needs and gets no token; every URL in the app must be relative. The app is PUBLIC. Anyone with the address sees everything on the board with no login, unapproved assets and uploader names included, and boards added under it later too, so confirm the board with the user before deploying. Everything in files is public as well: never put a token, a key, or content read from another board into them. The only write is visitors' uploads into the board (playbook/upload, see the topic), and only while the board's share link has Allow uploads or the upload-only page on, with no password, no email form and no past expiry; the app cannot comment or change anything else. Limits: an index.html is required; text files only (.html .css .js .mjs .json .svg .txt .webmanifest); at most 50 files and 1 MB in total — images stay in Playbook and are never part of the app; at most 10 apps per workspace. A deploy replaces the whole file set, so send every file each time, not only the changed ones. If the call times out, check list_apps before deploying again; a repeat is safe. Requires write scope and permission to edit the board. Needs hosted apps enabled for the workspace: without it the call answers 403 hosted_apps_disabled, which no tool can change — tell the user to ask Playbook support.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the app, at most 100 characters | |
| slug | Yes | The app's address: lowercase letters, digits and hyphens, at most 63 characters, starting with a letter or digit. Unique across all of Playbook, so make it specific; one taken by another workspace is refused with a 422. A slug this workspace already uses replaces that app's files. | |
| files | Yes | The complete file set: contents as text, keyed by path relative to the app's root, e.g. { "index.html": "<!doctype html>…", "app.js": "…", "styles.css": "…" }. Paths are plain names joined by `/` and `.`, with no leading slash. A top-level `worker.js` is the app's optional backend and is not served as a file; leave it out unless the `hosted_apps` topic says you need one. Nothing may sit under `playbook/`, which Playbook answers itself. | |
| board_token | Yes | Token of the board the app shows, from list_boards. Its sub-boards are readable too; nothing else in the workspace is. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/openWorld, and the description goes well beyond them: the app is public with no login, files must never contain secrets, the only write is visitor uploads under stated share-link conditions, plus hard limits (index.html required, 50 files/1 MB, 10 apps/workspace), write scope requirement, and the 403 `hosted_apps_disabled` failure mode that no tool can fix.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and each block (contract, public exposure warning, limits, failure modes) earns its place, but the description is very long and dense for a single tool, with some packaging detail that could be delegated to the referenced `hosted_apps` topic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, open-world deploy with a nested `files` object and no output schema, the description supplies everything needed: return value (`url`), prerequisites, constraints, idempotency behavior, and the un-actionable 403 case with user-facing guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: a deploy replaces the whole file set so every file must be re-sent, files are public, and board_token scope is limited to the board and its sub-boards. It stops short of restating per-parameter syntax, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a concrete verb and resource ('put a small web app... live at a public address, or replace the files of the app...') and defines what a hosted app is (static files, one board and its sub-boards). It is clearly distinguishable from delete_app and list_apps, which appear in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: read the `hosted_apps` topic with read_documentation BEFORE writing files, confirm the board with the user because the app is public, and check list_apps first if the call times out instead of re-deploying blindly. When-to-use-vs-alternatives is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_asset_version_commentEdit asset version commentADestructiveIdempotentInspect
Edit the comment/note on an existing asset version, addressed by version_number. Requires a write-scope token and versioning enabled. Does NOT create a version and does NOT change the asset's bytes or head. Pass an empty string to clear the comment. Use list_asset_versions to find the version_number; an unknown or out-of-range number returns not found. Note the newest stored version is head_version_number − 1 (head_version_number is the next, not-yet-assigned number).
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token | |
| comment | Yes | New comment text. Pass an empty string to clear it. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| version_number | Yes | Version whose comment to edit (from list_asset_versions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, idempotent=true, destructive=true) by disclosing the required scope, the versioning-enabled precondition, the exact blast radius (does not change bytes or head), the clear-with-empty-string behavior, and the not-found error for unknown/out-of-range versions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and address key, then preconditions, then the side-effect exclusions. Every sentence carries information, though the trailing head_version_number arithmetic adds density that could be split or trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description covers auth scope, preconditions, side effects, edge cases (empty string, unknown version), and failure mode. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely non-obvious meaning: empty string clears the comment, and the newest stored version is `head_version_number − 1` rather than the head value itself. That resolves a real ambiguity an agent would otherwise hit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Edit the comment/note on an existing asset version') and pins the addressing key (`version_number`). It also explicitly differentiates from the nearest siblings by declaring it does NOT create a version, which separates it from create_asset_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite path ('Use `list_asset_versions` to find the `version_number`') and states the conditions required (write-scope token, versioning enabled). It does not name the alternative tool to use when you actually want a new version, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finish_uploadFinish uploadAInspect
Step 2 of 2: turn bytes you have already sent to storage into a Playbook asset. Call it only after every step returned by create_upload_url has succeeded — this call does not transfer anything, it records what landed. Pass the signed_gcs_id from create_upload_url unchanged. If a step failed, do NOT call this; start over with a fresh create_upload_url.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Byte size, as passed to create_upload_url | |
| title | No | Asset title. Pass the same filename you gave create_upload_url — it is NOT remembered between the two calls, and omitting it creates an untitled asset. | |
| width | No | Pixel width, if known. Do not guess. | |
| height | No | Pixel height, if known. Do not guess. | |
| media_type | Yes | MIME type of the stored file. Required, and it must be the SAME value you gave when you asked for the upload address — nothing is carried between the two calls, so a different value here labels the asset as something the stored bytes are not. | |
| description | No | Optional description | |
| ai_generated | No | Mark the asset as produced by an AI tool. On this upload path the flag does more than label it: it also suppresses automatic duplicate merging and grouping, which matters when you are pushing many variants of one image. It only has that effect when set HERE, at creation — setting it later records the marker but cannot un-merge anything. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| signed_gcs_id | Yes | The value create_upload_url returned. Pass it back exactly, it is signed. | |
| ai_agent_payload | No | Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable. | |
| collection_token | No | Destination board token. If omitted or unknown, Playbook silently routes to a default anonymous board — call get_board first to validate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: this call 'does not transfer anything, it records what landed', which corrects the likely assumption that finish_upload moves bytes, and it implies the retry semantics by requiring a fresh create_upload_url on failure. It stops short of stating explicitly what happens to a partially-recorded asset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the workflow position and purpose, then the precondition, then the failure exclusion. Every sentence earns its place and nothing is repeated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation with 11 params, a nested object and no output schema, the description supplies the crucial orchestration context (two-step flow, ordering precondition, failure handling) that the schema cannot express. It is nearly complete; the only thin patch is what the caller gets back or how to confirm the asset landed, which is arguably outside description scope given the sibling get_asset exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 11 parameters are already documented in-schema, including the signed_gcs_id and media_type 'pass it back unchanged' constraints. The description re-states the signed_gcs_id rule but adds no syntax or format detail the schema lacks. Baseline 3 applies when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('turn bytes you have already sent to storage into a Playbook asset') and frames itself as 'Step 2 of 2', which cleanly distinguishes it from the sibling create_upload_url that precedes it. An agent can place it in the upload workflow without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('only after every step returned by create_upload_url has succeeded') and an explicit when-NOT-to, with the alternative action spelled out ('If a step failed, do NOT call this; start over with a fresh create_upload_url'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finish_uploadsFinish uploadsAInspect
Batch form of finish_upload: turn bytes already sent to storage into assets, all on the same board. Include only the items whose byte transfers actually succeeded. IMPORTANT — this call is NOT atomic: it creates the assets one at a time and does not roll back, so a failure partway through leaves the earlier ones created while the call reports an error. Never retry it after a failure; see the recovery steps in the error itself.
| Name | Required | Description | Default |
|---|---|---|---|
| assets | Yes | Completed uploads (1-100) | |
| batch_id | Yes | The batch_id create_upload_urls returned. Required: it is the only thing that releases the quota Playbook reserved for this batch, and an unreleased reservation counts against the workspace's asset and storage limits. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| collection_token | No | Destination board token, applied to every asset in the batch. If omitted or unknown, Playbook silently routes to a default anonymous board — call get_board first to validate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses traits the annotations cannot express: the call is NOT atomic, creates assets one at a time, does not roll back, and a partial failure leaves earlier assets created while reporting an error. The no-retry rule is a behavioral constraint beyond idempotentHint=false and does not contradict destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, then the inclusion rule, then the failure warning. Every sentence carries a distinct operational constraint and nothing is repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-atomic mutation tool with no output schema, the description covers the failure and recovery model well, and the schema covers the per-item fields and the echoed uuid. It stops short of describing the success response shape or partial-success reporting, which is the one gap an agent calling a non-atomic batch would want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so batch_id, assets and collection_token semantics are already fully documented in the schema, including the quota-release role of batch_id and the silent default-board routing. The description adds no parameter-level detail of its own, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('turn bytes already sent to storage into assets') and immediately scopes it as the batch counterpart of finish_upload, letting an agent separate it from that sibling without opening either schema. The 'all on the same board' clause adds the batch-level constraint that distinguishes the two.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says which items to include ('only the items whose byte transfers actually succeeded') and gives a hard prohibition with a pointer to the alternative path ('Never retry it after a failure; see the recovery steps in the error itself'). The relationship to finish_upload is stated, so selection between the two is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetGet assetARead-onlyInspect
Get full details of a specific asset by its token. For more than one asset use get_assets, which reads up to 100 in a single call — calling this in a loop is the slow way to read a board. This one always returns ai_agent_payload, where get_assets makes it opt-in. Returns metadata including approval state, title, media type, tags, statuses, description, URLs, and dimensions. Signed display URLs expire after about 24 hours; permalink, when present, does not expire. colors holds the image's primary colours as hex codes, most dominant first, so a board's palette can be built from its assets' colors without downloading the images. It is empty for anything with no rendered preview (notes, colour swatches, links), which means not analysed, not colourless. List and search results do not carry it; ask for an asset by token. A video's stream_url is null until an HLS encode has finished; reading never starts one — retry_video_processing does.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/non-destructive/non-open-world, and the description layers on substantial extra behavior: signed display URLs expire in ~24h while permalink does not, colors is empty for anything with no rendered preview (meaning 'not analysed', not 'colourless'), stream_url stays null until HLS encoding finishes, and reading never triggers an encode. These are real operational traits an agent needs and none are in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then the sibling routing rule, then return-field semantics — a logical order with no filler sentences. It is dense for a single-token getter, but each clause (expiry, colors emptiness, stream_url) carries distinct information rather than restating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so thoroughly: enumerates the metadata returned, explains URL expiry, colors ordering and edge case, and the video stream_url precondition. Nothing an agent needs to call and interpret this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the organization parameter already carries rich usage guidance in the schema itself. The description reinforces 'ask for an asset by token' but adds no new syntax, format, or meaning for either parameter, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get full details of a specific asset by its token') and explicitly distinguishes itself from the sibling get_assets, including the behavioral difference (this one always returns ai_agent_payload; get_assets makes it opt-in). An agent can route between the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: use get_assets for more than one asset (up to 100 per call) and avoid looping this tool, plus 'ask for an asset by token' because list/search results don't carry colors. It names the alternative and the condition that selects it, and points to retry_video_processing for the stream_url case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_download_urlsGet asset download URLsARead-onlyInspect
Get a signed URL of the ORIGINAL file of one or more assets: the uploaded bytes, unchanged, where display_url, previews and image permalinks are re-encoded renders. This is the way to hand a full-quality video, PDF, font or source image to another system, or to fetch it yourself. The URL needs no login and expires within about a day; file contents do not travel through this server. A URL that has to keep working longer is a permalink (add_asset_permalinks). An asset with no file of its own — a note, a colour swatch, a group, an upload still ingesting — is listed under no_file; a link asset returns the address it points to, with a null size. Tokens that do not exist or are not visible to this token are under not_found, and a token whose read failed for another reason is under failed with the reason. Requires download permission on each asset. Each asset read counts as one API request against the plan's quota. Up to 25 assets per call.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_tokens | Yes | Asset tokens to get original-file URLs for (max 25 per call) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, and the description adds substantial non-obvious behaviour: the URL is unauthenticated, expires in about a day, file contents do not pass through the server, each asset read consumes one API request against quota, and download permission is required per asset. It also enumerates response buckets (no_file, not_found, failed) which an agent needs to interpret outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but well ordered: the core purpose comes first, then edge-case handling, then permissions and quota limits. Every sentence carries distinct operational information with no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates fully by explaining the returned URL properties (unauthenticated, ~1-day expiry) and the failure/skip categories an agent will encounter. Permission, quota and batch-size constraints are all covered, leaving nothing essential unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented, including the max-25 constraint and the workspace-resolution rule for `organization`. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies; its token-level semantics (link assets returning a null size) describe results rather than inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a signed URL of the ORIGINAL file of one or more assets') and immediately disambiguates from near neighbours by contrasting the original bytes with `display_url`, previews and image permalinks. An agent can distinguish it from get_asset_previews, get_asset_permalinks, and get_asset without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('hand a full-quality video, PDF, font or source image to another system, or fetch it yourself') and an explicit exclusion plus alternative: if the URL must keep working longer, use `add_asset_permalinks` instead. The requirement of download permission and the 25-asset limit are also stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_permalinksGet asset permalinksARead-onlyInspect
Read the permanent public URL of one or more assets, optionally rendered at a size you choose. Reads only — it never publishes anything, so an asset that has no permalink yet is reported under not_published; run add_asset_permalinks on those first. An asset under pending is still being published: its URL is withheld until the file is in place, so read it again shortly instead of publishing it again. This is the URL to use anywhere the link has to outlive the session: a document, a deck, a web page, a hand-off to another system. For a throwaway image to look at right now, use get_asset_previews instead — it needs no permalink and costs no quota. width/height resize IMAGES only (one of the two keeps the aspect ratio); PDFs, video and everything else are served at their stored size and ignore both.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Render images this wide, in pixels | |
| height | No | Render images this tall, in pixels | |
| asset_tokens | Yes | Asset tokens to read (max 1000) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds substantial context beyond them: it never publishes, assets without a permalink appear under `not_published`, and `pending` assets withhold the URL until the file is in place. These status behaviors are not derivable from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose before the status edge cases and the sibling alternative. It is dense and long, but nearly every sentence earns its place; only the use-case list ('a document, a deck, a web page...') is slightly padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the meaningful return states (`not_published`, `pending`) and the resize semantics, which is what an agent needs to interpret results. Complete for a read tool whose safety profile is already carried by annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics: width/height resize IMAGES only, supplying one keeps the aspect ratio, and PDFs/video/other types ignore both. It does not elaborate on asset_tokens or organization, but those are fully covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read the permanent public URL of one or more assets') plus an optional rendering behavior, and explicitly differentiates itself from get_asset_previews. An agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rules: run add_asset_permalinks first for assets under `not_published`, re-read rather than re-publish for `pending`, and use get_asset_previews instead for a throwaway image. Names the alternatives and the exact conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_previewsGet asset previewsARead-onlyInspect
Render one or more assets as images at a size you choose, and get a URL per asset. This is how you LOOK at Playbook assets: the display_url on an asset is the full-size render (5000px is normal), which is wasteful to fetch and too large for most vision models. Ask for 1024 wide and you get a 1024px image. The URLs are SHORT-LIVED — they die at the end of the next hour, so 1-2 hours depending on when you call. They suit fetching now or showing in the current reply; anything that must keep working later — a stored link, a document, a hand-off — needs get_asset_permalinks. A SIZE IS REQUIRED — pass width, height, or both; without one this would hand back the same full-size render you already have. IMAGES ONLY: it renders the asset's original file, so a video or a PDF comes back with a URL that will not load, and an asset with no file at all (a note, a colour swatch, a link) is listed under no_file_to_render rather than given a URL. Check media_type starts with image/ first. Tokens missing from the response entirely are under not_found — unknown, or not visible to this token. One render per token per call, so ask for the assets you actually need to see rather than a whole board.
| Name | Required | Description | Default |
|---|---|---|---|
| width | No | Width in pixels. 1024 is plenty for a vision model; pass width alone to keep the aspect ratio | |
| format | No | Output format. Omit to keep the original — pass jpeg when the consumer is picky about webp | |
| height | No | Height in pixels | |
| asset_tokens | Yes | Tokens of the IMAGE assets to render (max 100 per call) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly, non-destructive, not open-world). The description adds rich behavior beyond that: URLs are short-lived (~1-2 hours), a size is mandatory or you get the full render back, non-image assets return URLs that won't load, no-file assets land in no_file_to_render, unknown/invisible tokens land in not_found, and one render per token per call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then the size requirement and image-only constraint, so the agent hits the critical rules early. It is long and heavy on caps emphasis, with a couple of sentences that could be tightened, but nearly every line carries a distinct constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param tool with no output schema, the description compensates by naming the response buckets (no_file_to_render, not_found, URL-per-asset) and the size/format/media constraints. An agent has enough to call it correctly and interpret the result without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning the schema cannot: why width/height must be supplied (otherwise the same full-size render), and the token-visibility semantics behind not_found. It stops short of adding format or organization guidance beyond what the schema already carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Render one or more assets as images... get a URL per asset') and explicitly distinguishes itself from the full-size display_url render and from get_asset_permalinks. An agent can tell it apart from get_asset and get_asset_permalinks without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('This is how you LOOK at Playbook assets'), when-not ('wasteful to fetch and too large for most vision models'), and the alternative for durable links ('anything that must keep working later... needs get_asset_permalinks'). It also states the pre-condition (check media_type starts with image/).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetsGet assetsARead-onlyInspect
Get full details for up to 100 assets in ONE call — the batch form of get_asset. Use it after list_assets or a search to read the fields those rows do not carry: description, colors, source_url, custom fields, dimensions and comment counts. Prefer it over calling get_asset in a loop; a 60-asset board is one call, not sixty. Tokens that do not exist, or that you cannot see, come back in not_found rather than failing the whole call — check it, because a missing asset is otherwise indistinguishable from one you forgot to ask for. Grouped child assets ARE returned here, unlike in list_assets, which lists only top-level rows.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_tokens | Yes | Asset tokens to read (1-100 per call). The parameter name is `asset_tokens`, not `tokens`. Split a larger set and call again. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| get_ai_payload | No | Include each asset's `ai_agent_payload`. Default false here, UNLIKE get_asset, which always returns it: each payload can be up to 4 KB, so 100 of them is a very large response. The key is absent rather than null when not asked for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish readOnly/non-destructive/openWorld=false, but the description adds substantial behavioral detail beyond them: partial-failure semantics for unknown or invisible tokens in not_found, the contrast with list_assets regarding grouped children, and the return-field scope. It also warns that get_ai_payload defaults differently here than in get_asset and that payload responses can be very large.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The batch purpose and the get_asset alternative are front-loaded, and each subsequent sentence carries a distinct constraint (return fields, loop avoidance, not_found handling, grouped children). No sentence is redundant with the title, annotations, or schema prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the fields returned, explaining the not_found bucket, and calling out the get_ai_payload size/default difference. For a 3-parameter read tool with annotations covering safety, this is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each parameter already has its own detailed description; the baseline is 3. The description reinforces the 1-100 bound and the not_found behavior but adds little parameter-level meaning beyond the schema for organization or get_ai_payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get full details for up to 100 assets'), identifies the tool as 'the batch form of get_asset,' and explicitly contrasts it with list_assets and get_asset. An agent can distinguish it from every relevant sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete usage sequence ('after list_assets or a search'), an explicit preference rule ('Prefer it over calling get_asset in a loop'), and a scoping contrast with list_assets ('Grouped child assets ARE returned here, unlike in list_assets'). It also explains when not to expect success for individual tokens via the not_found bucket.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_boardGet boardARead-onlyInspect
Get details of a specific board by its token. Returns the board's title, description, asset count, parent board, and child board count. published_page says whether the board's public page is live (active), its url (null unless live) and the template its page design uses (can be set on a page that is not live). asset_count covers the board AND every board nested under it (each group/stack counted once); list_assets on a board returns only assets sitting directly on it unless you pass nested_assets: true, so compare the count against that, not the plain listing.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token, as returned by list_boards, list_board_children or ai_search — the parameter name is `token`, not `board_token`. The id in a share link (`/s/{workspace}/{id}`) is NOT a board token: pass the link to resolve_share_link, which returns the board. Nothing converts a published page URL: look that board up by title with list_boards `query` or ai_search instead of taking an id out of a URL, a spreadsheet or an earlier session. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, non-destructive and closed-world, so the safety profile is covered. The description goes beyond that by disclosing semantics an agent could not infer: asset_count includes nested boards (each group/stack counted once), published_page url is null unless live, and template can be set on a non-live page. That is real added behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the return-field semantics in a compact block. Every sentence carries information, though the asset_count/list_assets sentence is dense and slightly long-winded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must describe the return shape — and it does, naming title, description, asset_count, parent board, child board count and published_page sub-fields. Complete enough for a two-parameter read tool; only the child/parent field formats remain unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so token and organization are already fully documented (including the token-vs-share-link trap and workspace omission rule). The description only repeats 'by its token' and adds no format or edge-case guidance beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Get details of a specific board by its token') and enumerates exactly which fields come back. This distinguishes it from list_boards/list_board_children, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: there is no 'use this when you already have a token' or 'to enumerate boards use list_boards instead'. It does give one actionable comparison rule (asset_count vs list_assets without nested_assets), but no when/when-not framing against the many sibling read tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_commentsGet commentsCRead-onlyInspect
List comments on an asset or board. Specify entity_type as 'asset' or 'board' and provide the token.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| token | Yes | Asset or board token | |
| entity_type | Yes | Type of entity: 'asset' or 'board' | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds no behavioral context beyond the implied read (no pagination behavior, ordering, or result scope), so it earns little credit even against the lower annotated bar.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler and the core action front-loaded. The second sentence is somewhat redundant with schema content, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with annotations and full schema coverage this is minimally complete, but with no output schema the description could have said something about pagination (the page parameter) or what the returned comments contain. Those omissions leave a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (including the organization workspace nuance and page) are already fully documented in the schema. The description's restatement of entity_type values adds nothing beyond the enum, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (comments) plus the scope (asset or board), so an agent can tell what the tool does. It does not, however, explicitly contrast itself with the closely related create_comment or edit_asset_version_comment siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance; the second sentence merely restates the required parameters already present in the schema. Nothing tells the agent to prefer this over create_comment or edit_asset_version_comment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_importGet import statusARead-onlyInspect
Read an import run's progress: status (pending, active, completed, canceled), cancel_reason, scanning (still listing folders), the target board_token (files are in sub-boards named after each folder), and files counts (total, pending, completed, skipped, failed). skipped includes files already on the board unchanged. cancel_reason on canceled: overlimit — out of storage or assets, or the next file would have crossed into storage overage the workspace has not agreed to (nothing past that point was stored); incomplete — some files failed; failed_to_start — could not start, e.g. sustained provider rate limiting; oauth_credential_deleted / target_collection_deleted — the connection or board was removed; blocked — blocked by an admin. Poll no more than every 15–30 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Import token returned by import_from_google_drive or import_from_dropbox | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only safety profile, and the description goes well beyond them by documenting a rate limit, the meaning of `skipped`, and the full semantics of every `cancel_reason` value (including that nothing past an overlimit point was stored). This is exactly the operational context an agent needs and cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, and the dense enumeration of status/cancel_reason values is justified because no output schema exists to carry that information. The backtick-heavy value list is slightly unwieldy but every clause carries meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly shoulders the burden of explaining the return payload, and it does so thoroughly, including terminal-state interpretation. Combined with annotations covering safety, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `token` and `organization` are already fully documented in the schema, and the description adds no further parameter guidance. The mention of `board_token` and `files` describes returned fields, not inputs, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read an import run's progress') and immediately enumerates the fields it returns, so the agent knows exactly what this retrieves. The `token` semantics tie it to import_from_google_drive/import_from_dropbox, distinguishing it from the tools that start imports rather than report on them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context is given: this is the polling tool for an in-progress import, with an explicit cadence constraint ('Poll no more than every 15-30 seconds'). It does not name an alternative or state when not to use it, so it stops short of full routing guidance, but the intended usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_elements_catalogGet page elements catalogARead-onlyInspect
The vocabulary for designing a board's published page — read it BEFORE publishing with a template or writing any page element. Returns: templates (the valid template ids for publish_board, each with its display name, default background/typography and the slots it mounts itself — a floor, not an inventory), element_types (the names of every element type), enum_sets, background_colors and typographies (the values update_page_settings accepts), operations (the argument map for apply_page_operations), and limits. The same for every workspace. The props of the element types are large (~40 KB together), so they come back only for the types named in the element_types argument, under elements: each type with the camelCase props it accepts, flagged html, url, asset_token or dead — a dead prop is stored but no longer rendered. A designed page is built from sections (up to 3 columns, each holding note and asset rows) under a banner hero, and its look comes from the style prop on notes and assets — gradients, cards, shadows, tilts, big type; read style on note before relying on color. There is no carousel or slideshow element: present a deck as ordered sections, or as a grid with horizontalView and autoScroll.
| Name | Required | Description | Default |
|---|---|---|---|
| element_types | No | Element types to return the props of, under `elements` (e.g. ['banner', 'button']). Without it the response lists the type names and no props. An unknown type is refused with the valid list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/openWorld=false, and the description adds substantial operational context beyond them: the ~40 KB props payload is only returned for types named in the argument, dead props are stored but not rendered, and the catalog is identical for every workspace. It also discloses a design constraint (no carousel element; use sections or a grid with horizontalView/autoScroll).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is dense and long, but front-loaded with the core purpose and downstream consumers before the return-value detail; nearly every sentence carries actionable information, though the style/carousel guidance could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden of explaining return structure, the conditional props behavior, and the element taxonomy (sections, columns, banner, notes/assets, style prop), leaving nothing essential for correct invocation unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description already explains the element_types argument's effect and unknown-type refusal, so baseline is 3. The description adds the ~40 KB size hint that matters for request planning, which is a genuine incremental detail over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description defines the tool as 'the vocabulary for designing a board's published page' and then enumerates exactly what it returns (templates, element_types, enum_sets, background_colors, typographies, operations, limits), making its distinct role unmistakable against siblings like get_page_layout or publish_board.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit imperative timing rule — 'read it BEFORE publishing with a template or writing any page element' — and ties its outputs to the sibling tools that consume them (publish_board, update_page_settings, apply_page_operations), so an agent knows precisely when this must be called.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_page_layoutGet page layoutARead-onlyInspect
Read the stored design of a board's published page: template, the page's own background_color and typography (null = inherited), slots (the page's regions and their elements), subboards_settings (one full second document per nested board shown on the page) and version_token. Returned verbatim — the ids and camelCase keys are exactly what the page element tools take back. slots: null is NORMAL for a page nobody has edited yet: it still renders its template's defaults. Address such a page by slot NAME (see templates in get_page_elements_catalog); the first write stores the defaults and returns real ids. 404 page_layout_not_found means the board has no page design — publish it with publish_board and a template first. Reads never change anything and are not gated by the page-layout write flag.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial context beyond them: the verbatim return contract (ids/camelCase keys match the element tools), the meaning of slots:null, the first-write-stores-defaults lifecycle, the 404 error code semantics, and that reads bypass the page-layout write flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A dense but well-ordered block that front-loads the purpose and return contents before edge cases. It is somewhat long, and given there is no output schema the extra detail on lifecycle and errors mostly earns its place, though minor compression would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by explaining every returned field, the null/inheritance semantics, and the 404 path. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both token and organization are fully documented in the schema itself, including the organization-omission guidance. The description adds no parameter-specific syntax or format detail, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource: reading the stored design of a board's published page, and enumerates exactly the fields returned (template, background_color, typography, slots, subboards_settings, version_token). An agent can immediately distinguish this from sibling page tools like get_page_elements_catalog which return element catalogs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions: use publish_board with a template when 404 page_layout_not_found occurs, address unedited pages by slot name via get_page_elements_catalog, and notes reads aren't gated by the write flag. It lacks an explicit 'use X instead when...' comparison against sibling element-read tools, but the contextual routing is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
group_assetsGroup assetsADestructiveInspect
Merge assets into a group. A group is a container asset that holds other assets as variants — different formats or crops of the same thing, or a set of colour swatches, which Playbook shows as a palette. The group has no file of its own and takes its preview from its first displayable child. Pass the asset the others should join as parent_asset_token; if it is already a group they are added to it, otherwise a new group is created around it. Children move to the parent's board. Requires a token with the write scope. Two rejections to plan around: every child must be ungrouped or already in this same group — one that belongs to a different group fails the whole call, so ungroup it first — and parent_asset_token must not itself be sitting inside a group. To add to an existing group, pass the GROUP's own token, not the token of one of its members.
| Name | Required | Description | Default |
|---|---|---|---|
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| child_asset_tokens | Yes | Tokens of the assets to move into the group | |
| parent_asset_token | Yes | The asset the others join. May itself be an existing group, but must NOT be an asset that sits inside one — that is rejected with 422. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnly=false, and the description goes well beyond them: it discloses the required write scope, the two 422 rejection conditions, that children move to the parent's board, and that a group has no file and derives its preview from its first displayable child. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and concept, and the operational warnings are grouped near the end. It is dense but nearly every sentence adds distinct value; slight length is justified by the non-obvious data model.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent mutation with no output schema, the description covers purpose, auth scope, failure modes, and side effects (children moving boards). An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds meaningful semantics beyond the schema: it clarifies that parent_asset_token may be an existing group or spawns a new one, and warns to pass the group's own token rather than a member's.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Merge assets into a group') and then defines what a group actually is, which is essential given the unusual data model. It clearly distinguishes this from siblings like ungroup_assets and move_assets by explaining the container/member relationship.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions for use: pass the target asset as parent_asset_token, add to an existing group by passing the GROUP's token, and ungroup a child first if it belongs to another group. It does not explicitly name alternative sibling tools (e.g. move_assets, ungroup_assets) for adjacent tasks, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_from_dropboxImport from DropboxAInspect
Import Dropbox folders into a board. Use this for files that live in the user's Dropbox, including private and team folders — upload_from_url cannot reach those. Google Drive and Dropbox are connected ONCE, by a person, in the Playbook web app — there is no tool that connects them. Connections belong to a Playbook user: this server only sees connections made by the same Playbook account it is signed in as. When list_import_sources has no source with the needed provider, its connect_url is where a person connects that service; the source is listed once they have. FOLDERS: pass the folder URL from the Dropbox address bar (https://www.dropbox.com/home/… on a personal account, /work/… for a team member), its path (/Clients/Acme), or an id: key. Shared links (dropbox.com/scl/…) are refused; the address-bar URL or the path is required. Every folder is checked against the connected Dropbox account first; one it cannot find is refused with the account's email. RE-SYNC: importing the same folder into the same board_token skips files already there unchanged (compared by Dropbox content hash), so a recurring sync should reuse the board. A file changed in Dropbox is added as a SECOND asset next to the old one, and renaming the Dropbox folder or its sub-board imports that folder again in full. Files that were first imported before this skipping shipped are downloaded again on every re-sync; the copies are usually merged away, but a workspace with duplicate merging turned off, or an asset kept in a group, ends up with real duplicates. Import into a new board to get skipping for them. WHERE FILES LAND: each folder becomes a sub-board NAMED AFTER THE FOLDER inside the target board, with its sub-folders nested below — not the target board itself. Find it with list_board_children on board_token, or list_assets with nested_assets. The import is ASYNCHRONOUS: this returns a run in pending; poll get_import until status is completed or canceled. Plans without unrestricted imports allow one active import per workspace; the refusal names the active import's token, so poll that instead of retrying. Storage overage cannot be agreed to here: the call is refused when the workspace has no storage left before overage it has not agreed to, and the import is canceled (overlimit) before storing a file that would cross it. A rate-limit error carries a retry delay — wait that long. Requires a write-scope token and workspace owner/admin permission.
| Name | Required | Description | Default |
|---|---|---|---|
| folders | Yes | 1–20 Dropbox folders: address-bar URLs (https://www.dropbox.com/home/… or /work/…), paths (/Clients/Acme) or `id:` keys. Folders only — a file, a shared link or the Dropbox root is refused. | |
| board_token | No | Board to import into; each folder lands in a sub-board of it. Omit to create a new top-level board named 'Dropbox import (date)'; pass the board from an earlier run to re-sync it. A deleted board is not found. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| source_token | Yes | Token of a `dropbox` source from list_import_sources |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses async execution (returns pending, poll get_import until completed/canceled), the re-sync skip logic and the duplicate-asset risk for changed/renamed folders, one-active-import-per-workspace limits, storage-overage refusal, rate-limit retry delay, and the required write-scope + owner/admin auth. The idempotentHint=false annotation is consistent with the described partial-skip-but-adds-second-asset behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then structured under clear FOLDERS / RE-SYNC / WHERE FILES LAND headings that make it scannable. It is verbose (~450 words) but the density is warranted by the tool's async, re-sync and duplicate-handling complexity; little is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fills that gap by explaining what the call returns (a run in pending, polled via get_import) and where imported files land (a named sub-board found via list_board_children or list_assets). Auth, failure modes, and connection prerequisites are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented in the schema, including folder URL/path/id formats, the refused shared-link/root cases, board_token re-sync semantics, and organization resolution. The description largely reinforces rather than extends these, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Import Dropbox folders into a board') and immediately distinguishes itself from the closest sibling: 'upload_from_url cannot reach those' for private/team Dropbox folders. An agent can route between this, import_from_google_drive, and upload_from_url without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use with the alternative named ('files that live in the user's Dropbox... upload_from_url cannot reach those'), plus guidance for the no-source case ('when list_import_sources has no source... its connect_url is where a person connects'). Re-sync guidance tells the agent when to reuse board_token vs create a new board.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_from_google_driveImport from Google DriveAInspect
Import Google Drive folders into a board. Use this for files that live in the user's Google Drive, including private folders — upload_from_url cannot reach those. Google Drive and Dropbox are connected ONCE, by a person, in the Playbook web app — there is no tool that connects them. Connections belong to a Playbook user: this server only sees connections made by the same Playbook account it is signed in as. When list_import_sources has no source with the needed provider, its connect_url is where a person connects that service; the source is listed once they have. Every folder is checked against the connected Google account first; one it cannot see is refused with the account's email, which usually means the folder must be shared with that account. RE-SYNC: importing the same folder into the same board_token skips files already there unchanged, so a recurring sync should reuse the board. But a file changed in Drive is added as a SECOND asset next to the old one, and renaming the Drive folder or its sub-board imports that folder again in full. WHERE FILES LAND: each folder becomes a sub-board NAMED AFTER THE FOLDER inside the target board, with its sub-folders nested below — not the target board itself. Find it with list_board_children on board_token, or list_assets with nested_assets. The import is ASYNCHRONOUS: this returns a run in pending; poll get_import until status is completed or canceled. Plans without unrestricted imports allow one active import per workspace; the refusal names the active import's token, so poll that instead of retrying. Storage overage cannot be agreed to here: the call is refused when the workspace has no storage left before overage it has not agreed to, and the import is canceled (overlimit) before storing a file that would cross it. A rate-limit error carries a retry delay — wait that long. Requires a write-scope token and workspace owner/admin permission.
| Name | Required | Description | Default |
|---|---|---|---|
| folders | Yes | 1–20 Google Drive folder URLs (https://drive.google.com/drive/folders/…) or bare folder IDs. Folders only — a file URL is refused. | |
| board_token | No | Board to import into; each folder lands in a sub-board of it. Omit to create a new top-level board named 'Google Drive import (date)'; pass the board from an earlier run to re-sync it. A deleted board is not found. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| source_token | Yes | Token of a `google_drive` source from list_import_sources |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=true) only sketch the safety profile; the description adds substantial non-obvious behavior: asynchronous run in `pending`, per-folder validation against the connected account, re-sync dedup but duplicate-on-change and full re-import on rename, storage-overage refusal/cancel, rate-limit retry delay, and write-scope plus owner/admin auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but front-loaded and organized with ALL-CAPS section markers (RE-SYNC, WHERE FILES LAND) so an agent can scan it. Nearly every sentence carries distinct operational information, though a few clauses (storage overage detail) could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining the return (a run in `pending` with get_import polling to completed/canceled) and failure modes. For a complex, async, externally-dependent import tool, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the field docs (baseline 3). The description adds meaning beyond it, notably the board_token reuse pattern for re-sync and where imported folders land as sub-boards, which an agent needs to pick board_token correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Import Google Drive folders into a board') and immediately scopes it against the sibling it is not ('upload_from_url cannot reach those' private folders). An agent can distinguish it from upload_from_url and import_from_dropbox without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes: use this for user's Drive files including private folders; connects are done by a person in the web app via list_import_sources connect_url; reuse the board_token for recurring sync. It also names the async follow-up (poll get_import) and the one-active-import constraint with the alternative (poll the named token).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsList hosted appsARead-onlyInspect
List the hosted apps of a workspace: small public web apps, each showing one board, that were deployed with deploy_app. Returns each app's slug, name, public url, the board_token of the board it shows, and enabled. An app with enabled: false was switched off: its address answers 404 and no tool here switches it back on. The files of a deployed app cannot be read back, so keep the source if it will be edited later. Needs hosted apps enabled for the workspace: without it the call answers 403 hosted_apps_disabled, which no tool can change — tell the user to ask Playbook support.
| Name | Required | Description | Default |
|---|---|---|---|
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the read-only annotations by disclosing that enabled:false means the address 404s and no tool re-enables it, that app source files cannot be read back, and that a disabled workspace answers 403 hosted_apps_disabled with no in-tool remedy (escalate to support). These are exactly the behavioral traps an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and scannable; the return fields and failure modes are ordered sensibly. It runs slightly long, and the 'keep the source' aside is tangential for a pure list operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract itself (slug, name, url, board_token, enabled) and covers prerequisites and failure behavior, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the sole `organization` parameter is already fully documented in the schema. The description adds no format or edge-case meaning beyond it, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (hosted apps of a workspace) and defines what an app is: a small public web app showing one board, deployed with deploy_app. An agent can distinguish this from deploy_app/delete_app without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it lists apps produced by deploy_app and names the prerequisite (hosted apps enabled for the workspace) plus the failure mode if not. It stops short of explicitly routing to delete_app or naming when not to call it, but for a listing tool the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsList assetsARead-onlyInspect
List assets in a Playbook workspace, optionally filtered to a specific board. Set nested_assets with a board token to include its entire subtree. Use cursor pagination for a stable full crawl/reconcile; it is not a change feed and does not report deletions. For 'what is new in this board since X', pass created_after with collection_token and nested_assets. Signed display URLs expire after about 24 hours; store permalink when a permanent URL is required. Set uploaded_by to list everything one person added — prefer this over the search tools when you want a COMPLETE list, since it walks the database directly and is not subject to the search engine's result ceiling. Resolve the person with list_members first.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| cursor | No | Use stable cursor pagination for a full crawl instead of page numbers | |
| fields | No | Return ONLY these fields on each row. `token` is always included. Valid names: token, title, media_type, text_type, status, approved, approved_after, tags, permalink, display_url, stream_url, collection_token, size, is_skeleton, uploaded_by, source_error, ai_generated, ai_agent_payload. Use it when scanning a large board: `display_url` and `permalink` are ~400 characters each, so a 100-row page is mostly URL unless you narrow it. An unknown name is refused, not ignored: there is no `created_at`, `updated_at`, `width` or `height` among them, and an asset's dimensions come from get_asset or get_assets instead. | |
| per_page | No | Items per page (1-100, default 20) | |
| uploaded_by | No | List only assets uploaded by this person. Pass a member token from list_members. A name is accepted as a fallback and resolved server-side, but only when it matches exactly one member — otherwise the call fails and lists the candidates. One person per call; use search_assets or ai_search to filter by several at once. | |
| after_cursor | No | Opaque cursor returned by the previous cursor-paginated response | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| created_after | No | Only assets uploaded strictly after this ISO 8601 timestamp or date (a bare date is midnight UTC). Sees NEW uploads only: an asset edited, retagged or moved into the board later keeps its original upload time and is not returned, and neither is an upload that auto-grouping stacked into a group that already existed. An unparseable value is refused. | |
| nested_assets | No | Include assets from the board's entire nested subtree. Requires `collection_token` — on its own, with no board token, it is refused. | |
| get_ai_payload | No | Include each asset's `ai_agent_payload` on the rows. Default false, and the key is then ABSENT rather than null, so you can tell 'I did not ask' from 'nothing is stored'. Each payload can be up to 4 KB, so a full page with this on is a large response — ask for it when you actually need the context, not by default. get_asset always returns it. | |
| collection_token | No | Board token to filter by — the parameter name is `collection_token`, not `board_token`. Take the token from list_boards, list_board_children or ai_search: the id in a shared board link, a published page URL or a permalink is a different identifier, and passing one here fails the same way as a token from another workspace. A share link goes through resolve_share_link first, which returns the board token. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/no-destroy, so the description is free to add the non-obvious behaviors: cursor pagination is not a change feed and does not report deletions, signed display URLs expire in ~24h so permalink should be stored, `ai_agent_payload` is absent rather than null when not requested, and `created_after` ignores later edits/retags/moves. These are exactly the traits an agent cannot infer from schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and then organized by task (filtering, pagination, freshness, URLs, per-uploader). It is dense and slightly long at roughly six sentences, but each one carries distinct operational guidance rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with no output schema, the description covers the gaps that matter: pagination model and its limitations, URL expiry, absence-vs-null semantics, failure modes for bad tokens/names, and how to select the right alternative tool. Nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the per-field descriptions already carry most parameter detail, so the baseline is 3. The description adds integrative meaning beyond individual fields by binding parameters into workflows — 'for what is new in this board since X, pass created_after with collection_token and nested_assets' — and by reiterating the complete-list rationale for uploaded_by.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'List assets in a Playbook workspace, optionally filtered to a specific board.' It also distinguishes the tool from siblings by noting it should be preferred over the search tools when a complete list is needed, since it walks the database directly rather than going through the search index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use recipes: cursor pagination for a stable crawl/reconcile, `created_after` + `collection_token` + `nested_assets` for 'what is new since X', and `uploaded_by` for a complete per-person list with the alternative (search_assets/ai_search) named for multi-person filtering. It also states prerequisites (resolve the person with list_members, resolve share links via resolve_share_link).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_asset_versionsList asset versionsARead-onlyInspect
The entry point for anything about an asset's earlier states — version history, previous or older versions, what changed and when, and picking one to restore or roll back to with revert_asset (annotate one with edit_asset_version_comment). Lists the version history of an asset, newest first. Each version has a version_number (the key to revert to or annotate), md5 (content md5; may be a storage-placeholder value for async uploads), size, media_type, source (UPLOAD or REVERT), comment, created_at, created_by_token, a revertable flag, and thumbnails. Also returns head_version_number — the number the next version write will take (1 for a never-versioned asset). Reads are always available regardless of plan. On Free/Pro plans, versions older than the revert window are gated: primary_gcs_id is null and thumbnails is empty (the full-resolution original is not available on those plans). Use the live asset's display_url to preview current content.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| token | Yes | Asset token | |
| per_page | No | Items per page (1-100, default 100) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, it discloses plan-dependent gating (Free/Pro: primary_gcs_id null and thumbnails empty for versions older than the revert window), that reads are always available regardless of plan, and that md5 may be a storage-placeholder for async uploads.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the 'entry point' statement and otherwise dense with useful facts, though it is on the long side and packs a wall of field names into one sentence. Nearly every clause earns its place, but the field enumeration could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing the return shape and does so thoroughly (version_number, md5, size, media_type, source, comment, created_at, created_by_token, revertable, thumbnails, head_version_number), plus the plan-gating caveat and a pointer to display_url for current content.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, per_page, token and organization are already documented in the schema; the description adds no pagination or parameter guidance. Its detail is instead directed at return fields, which is not what this dimension measures, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Lists the version history of an asset, newest first') and scopes it broadly as 'the entry point for anything about an asset's earlier states'. It explicitly names the sibling tools it feeds into (revert_asset, edit_asset_version_comment), so an agent can place it relative to alternatives without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent exactly when to reach for this tool (version history, previous/older versions, what changed and when, choosing a version to restore) and names the downstream alternatives with their purpose. The follow-on routing to revert_asset for rollback and edit_asset_version_comment for annotation is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_board_childrenList child boardsARead-onlyInspect
List the direct child boards of a given board. Use this to navigate the board hierarchy one level at a time — more efficient than list_boards with depth when you only need one node's immediate children. asset_count covers the board AND every board nested under it (each group/stack counted once); list_assets on a board returns only assets sitting directly on it unless you pass nested_assets: true, so compare the count against that, not the plain listing.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Parent board token — the parameter name is `token`, not `board_token` or `collection_token`. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, non-destructive, closed-world), but the description adds a genuinely non-obvious semantic: asset_count includes nested boards, each group/stack counted once, and must be compared against list_assets only with nested_assets: true. It stops short of disclosing ordering, pagination, or permission requirements, so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: purpose first, routing second, semantic caveat last. No restatement of the title or name, and the most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries return-value burden, and it does explain the key count field's semantics well. It does not describe the shape of the returned child-board records or ordering, leaving a modest gap for a no-output-schema tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema itself already carries the meaningful param guidance (token naming caveat, when to omit organization). The description adds no additional parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'List the direct child boards of a given board' — with the scope word 'direct' making the boundary explicit. It is immediately distinguishable from list_boards (which can traverse depth) and list_board_descendants (deeper traversal) named in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when: navigating the hierarchy one level at a time, and names the alternative it beats ('more efficient than list_boards with depth when you only need one node's immediate children'). The condition that selects this tool over the depth-based sibling is spelled out, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_board_descendantsList board descendantsARead-onlyInspect
List EVERY board nested under a given board — children, their children, and so on — in one paginated call, instead of walking list_board_children level by level. Each board carries its absolute tree_depth. asset_count covers the board AND every board nested under it (each group/stack counted once); list_assets on a board returns only assets sitting directly on it unless you pass nested_assets: true, so compare the count against that, not the plain listing.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| token | Yes | Board token whose subtree to list (the board itself is not included) | |
| per_page | No | Items per page (1-100, default 20) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond annotations: it specifies that results are paginated, that each board carries an absolute tree_depth, and that asset_count aggregates the entire subtree—details not present in the annotations or schema. It does not mention rate limits or auth, but the required token parameter is clear from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph front-loaded with the core purpose. Every sentence earns its place by adding distinct information: subtree scope, tree_depth, asset_count semantics, and the list_assets contrast. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must carry the burden of explaining return values. It does so by describing tree_depth and asset_count semantics, including how asset_count relates to list_assets' default behavior. For a paginated list tool with readOnly annotations, this is complete enough for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already fully documents all four parameters (token, page, per_page, organization). The description adds no parameter-level guidance beyond what the schema provides; it focuses on output semantics and sibling comparison. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (list) and resource (board descendants) with explicit scope: 'EVERY board nested under a given board — children, their children, and so on — in one paginated call.' It directly contrasts with the sibling list_board_children, making the tool's distinct purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the alternative (list_board_children) and explains that this tool avoids walking that sibling level by level. It further clarifies how to interpret asset_count versus plain list_assets and the nested_assets parameter, providing clear when-to-use and when-to-choose-alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_boardsList boardsARead-onlyInspect
List boards (collections) in a Playbook workspace. Supports title search via query and hierarchy depth control via depth ('1' = top-level only, 'all' = full tree). Results are paginated — use page to navigate. asset_count covers the board AND every board nested under it (each group/stack counted once); list_assets on a board returns only assets sitting directly on it unless you pass nested_assets: true, so compare the count against that, not the plain listing.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| depth | No | Hierarchy depth: '1' for top-level only, '2', or 'all' for the full tree. Default: '1'. | |
| query | No | Search boards by title | |
| per_page | No | Items per page (1-100, default 20) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so the safety profile is covered. The description adds genuinely non-obvious behavior: results are paginated, and `asset_count` is recursive (counts the board plus every nested board) while list_assets counts only direct assets unless `nested_assets: true`. That is valuable disclosure beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose then parameter behavior. Dense but each sentence carries real information (search, depth, pagination, count semantics). Slightly long and the last sentence is clause-heavy, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description must carry return semantics, and it does explain pagination and the meaning of `asset_count`. It stops short of describing the board object fields or total-count metadata, leaving minor gaps for a list tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents page, depth, query, per_page, and organization. The description restates the depth values and pagination, adding no syntax or format details the schema lacks; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List boards (collections) in a Playbook workspace') and clarifies the hierarchy scope via `depth`, which implicitly separates it from list_board_children / list_board_descendants. It does not name those siblings directly, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context for each relevant mode: title search via `query`, tree breadth via `depth` ('1' vs 'all'), and pagination via `page`. The closing sentence even tells the agent how to reconcile `asset_count` against list_assets output. No explicit when-not-to-use or named alternative tool, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_custom_fieldsList custom fieldsARead-onlyInspect
List a workspace's custom fields — the structured metadata vocabulary its assets use (Priority, Season, Usage Rights), each with its field_type and the options it allows. Call this FIRST before setting or filtering a field value: it is the only source of the exact field and option spelling. A field's VALUE is set on an asset with update_asset's fields argument ({ "Priority": "High" }); there is no separate set-value tool. Field and option names are matched EXACTLY; update_asset answers an unknown one with an error naming the valid ones, and list_custom_fields has the spelling. The list also contains the workspace's built-in 'Status' field, whose value is set with update_asset_status instead. A select field holds one of its options; a date, person or url field has no options and holds one free value per asset — see update_asset's fields parameter for the value formats. Returns every field in one call — this endpoint is not paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, non-destructive, closed world), and the description layers on non-obvious behavior: exact-match semantics for field and option names, the downstream error behavior of update_asset, the presence of a built-in Status field, and the fact that the endpoint is not paginated and returns everything in one call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose and the call-first instruction lead, and follow-on caveats (Status field, no separate set-value tool, matching rules, no pagination) each carry distinct information. Slightly redundant in restating that 'list_custom_fields has the spelling' after already stating exact matching, which keeps it just short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the work of describing the return shape — fields carry a `field_type` and allowed options, `select` holds one option while `date`/`person`/`url` hold a free value — and it points to update_asset's `fields` parameter for value formats. Nothing an agent needs to call and then use this result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single `organization` parameter, so the schema already carries the slug format, the omit-when-single-workspace rule, and when to pass it. The description adds only implicit workspace scoping ('a workspace's custom fields') and no syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List a workspace's custom fields') and immediately defines what those are ('the structured metadata vocabulary its assets use') with concrete examples (Priority, Season, Usage Rights). An agent can distinguish it from create_custom_field and delete_custom_field without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering instruction ('Call this FIRST before setting or filtering a field value'), names the alternative paths (update_asset's `fields` argument, update_asset_status for the built-in Status field), and states there is no separate set-value tool. When-to-use and which-sibling-to-use are both fully resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentationList documentationARead-onlyInspect
List all available Playbook documentation topics. Returns a catalog of guides and references. Use the topic slug with read_documentation to read the full content.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuine value beyond that by describing the return content ('catalog of guides and references') and how the returned slug is consumed, though it says nothing about pagination or output format specifics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and resource, then the return, then the follow-up workflow. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-param, read-only catalog tool with readOnly annotations, the description covers purpose, return content, and downstream usage, which is sufficient to invoke it correctly. It could be slightly richer on the shape of the returned catalog, but no critical gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema-side burden is nil and the baseline for a no-param tool is 4. Nothing in the description is needed to clarify inputs, and it correctly implies no arguments are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List all available Playbook documentation topics') and clarifies the output is a catalog of guides and references. This lets an agent distinguish it from read_documentation, which reads a single topic's full content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent: use the topic slug here with read_documentation to get full content, establishing the list-then-read workflow and naming the relevant sibling. It stops short of stating when NOT to use this tool, so it's clear context rather than a complete when/when-not rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_group_childrenList group childrenARead-onlyInspect
List the assets inside a group. list_assets and the search tools return only top-level rows, so this is how a group's members are read. A group is a container asset that holds other assets as variants — different formats or crops of the same thing, or a set of colour swatches, which Playbook shows as a palette. The group has no file of its own and takes its preview from its first displayable child. token must be a group — an asset whose is_group is true in get_asset or get_assets; anything else is refused as not a group. Results are paginated, newest first.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| token | Yes | Token of the group asset | |
| fields | No | Return ONLY these fields on each row. `token` is always included. Valid names: token, title, media_type, text_type, status, approved, approved_after, tags, permalink, display_url, stream_url, collection_token, size, is_skeleton, uploaded_by, source_error, ai_generated, ai_agent_payload. An unknown name is refused, not ignored. | |
| per_page | No | Items per page (1-100, default 20) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=true, openWorldHint=false, destructiveHint=false), yet the description still adds real behavioral detail: results are paginated and ordered newest first, non-group tokens are refused outright, and the group itself has no file and borrows its preview from its first displayable child. Auth/permission requirements are not mentioned, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the sibling distinction are front-loaded in the first two sentences, which is the right ordering. It runs longer than strictly necessary — the palette/preview aside is contextual colour rather than call-critical information — but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, no-output-schema list tool with fully documented parameters, the description covers the concept of a group, the routing decision, pagination ordering, and the error case. Only auth/permission scope and any rate-limit behavior are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents page, per_page, fields, and organization, establishing a baseline of 3. The description goes beyond that by defining what a valid `token` is (`is_group` true in get_asset/get_assets) and what happens otherwise — meaning the schema does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('List the assets inside a group') and immediately differentiates itself from siblings by noting that list_assets and the search tools return only top-level rows. An agent can route to this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the alternative tools (list_assets, search tools) and the condition that selects this one over them. It also names a hard precondition for the required argument — `token` must be a group asset — so misuse is prevented rather than merely discouraged.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_import_sourcesList import sourcesARead-onlyInspect
List the storage accounts connected for import, each with its provider (google_drive or dropbox), the token import_from_google_drive / import_from_dropbox takes (use a source of the matching provider), and the account email it reads from (briefly null right after connecting). Google Drive and Dropbox are connected ONCE, by a person, in the Playbook web app — there is no tool that connects them. Connections belong to a Playbook user: this server only sees connections made by the same Playbook account it is signed in as. When list_import_sources has no source with the needed provider, its connect_url is where a person connects that service; the source is listed once they have. Requires workspace owner/admin permission.
| Name | Required | Description | Default |
|---|---|---|---|
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/non-destructive/closed-world, but the description adds substantial context: connections are scoped to the signed-in Playbook account only, the email field is briefly null right after connecting, and the connect_url is only populated once a connection exists. These are behavioral traits an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core payload description, then the operational caveats. It is dense but every sentence carries needed information; slight length and packing of multiple concepts into single sentences keep it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it explains every returned field, the null-email edge case, and the connect_url fallback. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one optional parameter (organization) with 100% schema description coverage, so the schema fully documents it. The description adds no meaning about the parameter itself, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the storage accounts connected for import') and enumerates the exact fields returned per entry (provider, token, email). It also names the sibling tools that consume the output (import_from_google_drive / import_from_dropbox), so an agent can place it precisely in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use a source of the matching provider for the import_* tools, connections are made by a person in the web app (no connecting tool exists), and when no source of the needed provider is present the connect_url is the next step. It also states the owner/admin permission prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_membersList workspace membersARead-onlyInspect
List the people in a Playbook workspace, or find one by name. Pass query to search by name or email — the match is fuzzy, so a partial or misspelled name works ('quackenbsh' finds 'Zephyrine Quackenbush'). Returns each member's token, which is the value the uploader filters on ai_search, search_assets, and list_assets require. Call this FIRST whenever a request names a person ('what did Max upload', 'files from Sarah') — a person's name typed into a search query does NOT match the person who uploaded an asset. A name can match several members; each comes back with its own token.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| query | No | Find members by name or email. Fuzzy match, tolerates typos and partial names. Omit to list everyone. Ignored when shorter than 2 characters. | |
| per_page | No | Items per page (1-100, default 20) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds real behavior: the query match is fuzzy (with a misspelling example), a single name can return several members, and each carries its own token. It doesn't discuss pagination or the shape of each member record beyond the token.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then layers query behavior, the token return, and the routing guidance in a logical order. It is dense but every sentence carries distinct, actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although there is no output schema, the description explains what comes back (a token per member) and why it matters. Combined with full schema coverage and annotations, an agent has everything needed to call and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters, including query's fuzzy/typo tolerance. The description reinforces query's fuzzy behavior with an example and clarifies the token's downstream use, but adds little syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (people in a Playbook workspace), plus the secondary find-by-name mode. It also distinguishes itself from siblings by explaining the token output feeds ai_search, search_assets, and list_assets, so an agent can place it in the workflow without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call this FIRST whenever a request names a person, with concrete examples ('what did Max upload', 'files from Sarah'), and warns that a name typed into a search query does NOT match the uploader. That is a clear when-to-use plus the failure mode of the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_organizationsList workspacesARead-onlyInspect
List all Playbook workspaces (organizations) the authenticated user belongs to. Returns each workspace's slug (used as identifier in other tools), name, and the user's role. permalink_quota reports how many permanent public URLs the plan still allows (left of total) — check it here before a large add_asset_permalinks call, since going over the cap refuses the entire batch.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. Beyond that, the description discloses the response shape, the meaning of permalink_quota as left-of-total, and the downstream failure mode where exceeding the cap rejects the entire add_asset_permalinks batch — real context an agent cannot get from the empty schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what it returns, then the quota caveat. Every sentence earns its place, though the final clause about the refused batch is slightly long-winded for the value it carries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so fully: fields, the slug's role as cross-tool identifier, and the quota structure. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to compensate for. It adds no param detail because none exists to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list workspaces/organizations) and immediately disambiguates the term 'organizations' against 'workspaces'. It also enumerates the returned fields (slug, name, role), which no sibling list_* tool claims, so an agent can tell it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete when-to-use: call this before a large add_asset_permalinks batch to check remaining permanent-URL quota, explaining the overage consequence. It also notes the slug is the identifier other tools expect. It does not, however, position itself against the other list_* siblings (list_boards, list_members), so no exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_assetsMove assetsADestructiveIdempotentInspect
Move one or more assets to a target board. Accepts an array of asset tokens and the destination board token. Requires a token with the write scope. The caller must have update permission on every source asset.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_tokens | Yes | Asset tokens to move | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| collection_token | Yes | Destination board token |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the mutation/safety profile is covered. The description adds value the annotations do not carry: the required `write` scope and the per-asset update permission on every source asset, which is exactly the kind of auth precondition an agent needs. It does not explain what happens to the source board listing, but that is largely implied by 'move'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, purpose front-loaded, then parameters, then permission constraints — well structured. The middle sentence partially duplicates what the 100%-covered schema already states, so it is not perfectly waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with full schema coverage, no output schema, and annotations covering safety, the description supplies the missing auth/permission layer. An agent has enough to invoke correctly; only return/error behavior is unspecified, which is acceptable given no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a detailed note on the optional `organization` parameter, so the schema carries the semantic load. The description restates the asset-token array and destination board token without adding format, ordering, or limit details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Move') and resource ('assets') plus the destination ('target board'). It is clearly distinguishable from copy_assets and move_page_element by verb alone, though it does not explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real prerequisites (write scope token, update permission on every source asset) which implies when the call will succeed. However it offers no guidance on when to prefer this over copy_assets or how it differs from moving a page element — the alternative-selection dimension is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_page_elementMove page elementADestructiveIdempotentInspect
Move an element to another position, another slot, or into/out of a section column on a board's published page. Returns both affected slots. A move that would change nothing converges. Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| at_index | Yes | 0-based destination position. | |
| column_id | No | Id to give a column this move CREATES. It does NOT pick an existing column: without column_index the element lands in column 0. Address an existing column with column_index. | |
| element_id | Yes | Id of the element to move, from get_page_layout. | |
| to_slot_id | Yes | Destination slot (id or name); may equal from_slot_id. | |
| column_index | No | Destination section column, by 0-based position. | |
| from_slot_id | Yes | Slot currently holding the element (id or name). | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| create_new_column | No | Create a new column in the destination section. | |
| to_parent_element_id | No | Move INTO this `section` element's columns. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotation bar: it names the 403 error code and states that only Playbook can enable it (retrying is futile), explains that a 409 `stale_document` applies NOTHING, describes version-token rotation on success and the resulting staleness of the caller's own token, distinguishes retry-safe from non-retry-safe 409s, and discloses the up-to-one-hour public-page lag. It also clarifies that `converged`/`materialized` keys are ABSENT when false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Eight dense sentences with the core purpose front-loaded and no filler, but the token/concurrency block is packed tightly and could be split for readability. Given the complexity and the absence of an output schema, nearly every sentence carries weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutating tool with no output schema, the description supplies the missing pieces an agent needs: auth requirements, all relevant error codes and their remedies, concurrency protocol, and the meaning of the response keys (including when they are absent). Nothing material is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 12 parameters including the column_id vs column_index trap and expected_version_token's compare-and-swap role. The description adds behavioral meaning to the version token round-trip but no parameter-level detail the schema lacks, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb (move), resource (page element), and the three distinct move targets: position, slot, or into/out of a section column. It also announces the return shape ('Returns both affected slots'), which cleanly separates it from siblings like reorder_page_slot and update_page_element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit preconditions ('Requires `modify` on the board and page-layout API writes enabled') and a precise recovery protocol for 409s, including which two are safe to retry. What it lacks is any explicit comparison to adjacent siblings (reorder_page_slot, update_page_element), so the agent must infer when a move is the right call from the move semantics alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_boardPublish boardADestructiveIdempotentInspect
Create or update a board's public page, optionally changing its expiry, download restriction, or password. Returns the public URL. This is different from share_board — a published board is a standalone public landing page, while share_board returns an invite-style shareable link. Pass template to give the page a designed layout: valid ids are the keys of templates in get_page_elements_catalog (an unknown id is refused with the valid list). A template publish creates the page design that get_page_layout and the page element tools read and edit. Omit template on a board that is NOT live and has no page design yet, and it is published with standard so it is editable straight away (a workspace's own version of that template applies if it has one). A live page, or a board that already has a design, is never given a template implicitly. template_applied in the response names the template this call applied, and is absent when the design was left alone. An explicit template is refused with 409 page_design_exists when the page has stored element edits, rather than overwriting them: republish WITHOUT template to keep that design, and edit it with the page element tools. That refusal does NOT cover a design that is only page settings (background colour, typography set with update_page_settings) — a template publish replaces those. A page still following its template (never edited) switches to the new one. Exposure: this makes the board and its assets publicly accessible on the internet to anyone with the URL.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token, as returned by list_boards, list_board_children or ai_search — the parameter name is `token`, not `board_token` or `collection_token`. | |
| password | No | Password-protect the page; empty string clears it | |
| template | No | Page-design template id: a key of `templates` in get_page_elements_catalog, such as `brand` — not its `display_name`. Omit to keep an existing design, or to get `standard` on a board that is not live and has none. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| expiration_date | No | ISO 8601 expiry; empty string clears an existing expiry | |
| disable_downloads | No | Prevent downloads from the published page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (destructiveHint, openWorldHint, idempotentHint) only sketch the profile; the description adds the substantive behavior: public internet exposure of the board and its assets, the 409 refusal code and its scope, that a template publish replaces page settings but not stored element edits, and that `template_applied` is absent when the design was untouched. Nothing here contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical scoping and the sibling differentiation are front-loaded, and the dense template semantics are genuinely load-bearing for correct invocation. It is still a long, paragraph-heavy block with some repetition around template handling that could be tightened, so it falls short of ideal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity, destructive, open-world mutation tool with no output schema, the description covers the mutation surface, the return values (public URL, `template_applied`), the failure mode (409) and its remedy, and the exposure consequence. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the conditional meaning of `template` (implicit `standard` on a non-live board, workspace-specific template override, refusal when edits exist) and the resolution rules around `organization`. The remaining parameters are covered adequately by the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb+resource (create/update a board's public page) plus the mutation surface (expiry, download restriction, password) and the return value (public URL). It then explicitly contrasts itself with the sibling `share_board`, so an agent can route between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to pass `template`, when to omit it, when an implicit `standard` applies, and the recovery path when a 409 `page_design_exists` is returned (republish without `template` and use the page element tools). The share_board vs publish_board distinction and the 'live page or existing design is never given a template implicitly' rule are explicit exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_documentationRead documentationARead-onlyInspect
Read a specific Playbook documentation page. Use list_documentation first to see available topics. Returns the text of a public Playbook developer-docs page (https://dev.playbook.com), including code examples and endpoints.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes | Documentation topic slug (e.g., 'upload', 'search', 'ai_search', 'getting_started'). Use list_documentation to see all topics. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds value by disclosing what comes back (docs text, code examples, endpoints) and that the content is a public developer-docs page. It does not mention rate limits or whether content is cached, keeping it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scoping, then the prerequisite, then the return value. Nothing is redundant and nothing is missing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with no output schema, the description supplies exactly what is needed: how to pick a topic, what the call returns, and where the content comes from. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents the single 'topic' parameter with slug examples and a pointer to list_documentation. The description adds no syntax or format detail beyond that, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and resource (a specific Playbook documentation page), and distinguishes itself from the sibling list_documentation by scope (one page vs. the topic index). An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to call list_documentation first to discover available topics, which is a clear prerequisite and names the sibling alternative. There is no explicit 'when not to use' guidance, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_asset_permalinksRemove asset permalinksADestructiveInspect
Revoke assets' permalinks, freeing the plan's permalink allowance. Destructive and NOT reversible in place: adding a permalink back mints a DIFFERENT URL, so anything embedding the old one stays broken. NOT an emergency takedown: the asset stops reporting a permalink at once, but the file already published stays fetchable to anyone holding the URL until the public copy is purged, which runs on a safety delay of about a week — so this call does not stop a leak that is already under way. Assets that have no permalink are skipped and are NOT in the response; if none of them has one the call is a 406. The response reports the freed-up quota. Requires write scope and update permission on every asset; one unknown token fails the whole call.
| Name | Required | Description | Default |
|---|---|---|---|
| asset_tokens | Yes | Asset tokens whose permalinks should be revoked (max 100 per call). Tokens without one are skipped. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint/idempotentHint) by disclosing irreversibility specifics (re-adding mints a DIFFERENT URL, old embeds stay broken), the real-world scope of the takedown (public copy stays fetchable ~1 week), auth requirements (write scope plus update permission on every asset), and all-or-nothing failure on an unknown token.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Seven sentences, but each carries distinct operational information (irreversibility, takedown limits, skip semantics, error code, permissions) and the destructive warning is front-loaded. Slightly dense, though nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the response (freed `quota`, absent skipped assets, 406 when nothing had a permalink) and the full permission model. An agent has everything needed to call this safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds semantics the schema does not: a single unknown token fails the whole call, and the response reports the freed `quota`. The `organization` parameter's resolution behavior is left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Revoke assets' permalinks') and immediately frames the outcome ('freeing the plan's permalink allowance'). It is trivially distinguishable from the sibling add_asset_permalinks/get_asset_permalinks by direction of operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly carves out when NOT to use it ('NOT an emergency takedown', with the week-long purge delay explained), and states the edge-case behavior (assets without permalinks skipped, 406 if none). It does not name a competing alternative tool for takedown scenarios (e.g. delete_asset), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reorder_page_slotReorder page slotADestructiveIdempotentInspect
Set the order of a slot's top-level elements on a board's published page. ordered_ids must be EXACTLY the slot's current top-level element ids — none missing, none repeated, none extra (ids nested in a section count as extra) — otherwise 422 reorder_id_mismatch names the offending ids and nothing changes. An order that already holds converges. To move one element, move_page_element is simpler. Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| slot_id | Yes | The slot to reorder (id or name). | |
| ordered_ids | Yes | Every top-level element id of the slot, in the wanted order. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations present (readOnlyHint=false, destructiveHint=true, idempotentHint=true, openWorldHint=true), the bar for extra behavioral disclosure is lower, yet the description goes far beyond them. It explains the 422 reorder_id_mismatch error path, 403 page_layout_api_disabled, 409 stale_document semantics, which 409s are safe to retry, that the write is compare-and-swap via expected_version_token, that a successful write rotates the token, and that the public page can lag up to an hour. This is exactly the kind of write-behavior context annotations cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constraint, then organized into paragraphs for errors, concurrency, and response flags. It is dense but every clause carries operational weight; it is slightly over-detailed with dual error-path and token-protocol sections, keeping it just below the high bar for conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, three-required write tool with no output schema, the description covers everything an agent needs: required input semantics, exact error codes, idempotency/retry rules, version-token handling, and response flag behavior. Nothing material is missing, and it correctly does not attempt to explain a return value that has no schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema, including token, slot_id, ordered_ids, organization, subboard_token, and expected_version_token. The description adds operational meaning for ordered_ids (exact match required, nested ids count as extra) and the token semantics, but the schema already covers the basics. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set the order) and resource (a slot's top-level elements on a board's published page), introspected from the very first sentence. It also names the simpler sibling move_page_element for a single-element move, so it is clearly distinguishable from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use move_page_element when moving one element, and lays out the concurrency protocol. It also states the exact requirement (modify on board and page-layout API writes enabled) and what to do when they're missing, so the agent knows when and when-not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retry_video_processingRetry video processingAInspect
Start the HLS encode of a video whose stream_url is null. Starts one unless one has already finished — whether the last attempt failed, died on its way to the encoder, or was never made at all. A workspace that encodes every video on upload needs it only for an encode that failed or stalled. Other workspaces encode on request, and this is the request: reading the asset does not start one. stream_url fills in a few minutes after the call. CALL IT ONCE, NOT IN A LOOP: it cannot tell a running encode from a dead one, so calling it again while one is under way queues a second job. To wait for a result, poll get_asset and watch stream_url. An error back means the encode already succeeded, or the workspace's plan does not stream video.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token of the video | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this non-idempotent and non-read-only, and the description goes well beyond them: it warns that calling in a loop queues a second job, explains that an error response means the encode already succeeded or the plan doesn't stream video, and states stream_url fills in a few minutes later. This is rich behavioral context for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation, then constraints, then the loop warning and polling alternative, all in tight prose. Slightly dense with repeated stream_url references, but every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, preconditions, idempotency caveat, failure semantics, result-timing, and the polling alternative. With no output schema, the description fully carries the burden for this mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds the semantic condition tying the token to the video whose stream_url is null and clarifies the effect on stream_url. It does not add detail on the organization parameter beyond the schema, so it lands just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (start the HLS encode of a video whose stream_url is null), and explicitly carves out the sibling boundary versus get_asset (reading the asset does not start an encode). An agent can distinguish this from get_asset / update_asset without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (workspaces that encode on upload only need it for failed/stalled encodes; request-and-encode workspaces use it as the request), when-not (assumes you shouldn't loop), and names the alternative for waiting (poll get_asset). This is unusually complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revert_assetRevert asset to a versionADestructiveIdempotentInspect
Revert an asset to a prior version by version_number. Requires a write-scope token and versioning enabled on the workspace plan. A content-changing revert does NOT move the head back to N — it snapshots the current head as a new REVERT version and rotates the bytes to the target, so head_version_number moves FORWARD (old head + 1). A revert whose target content already matches the current head is a no-op (no new version, head unchanged) — this also covers a client-timeout retry of a just-completed revert. Note head_version_number is the next, not-yet-assigned number, so passing version_number equal to it is a benign no-op; the newest stored version is head_version_number − 1. On Free/Pro plans, reverting to a version older than the revert window is refused (revert_window_exceeded). Call list_asset_versions first to pick a valid, revertable version_number.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token | |
| comment | No | Optional note recorded on the snapshot of the replaced head | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| version_number | Yes | Version to revert to (>= 1, from list_asset_versions) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: explains that head_version_number moves FORWARD rather than back, that a no-op covers client-timeout retries (reconciling with idempotentHint), states the write-scope and versioning-plan requirements, and names the revert_window_exceeded refusal on Free/Pro plans.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the surprising head-rotation semantics, then the edge cases. Dense and information-rich, though the long chain of parenthetical edge cases could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation with no output schema, the description covers preconditions, side effects, error conditions, and validation steps — everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: head_version_number is the next unassigned number, the newest stored version is head−1, and passing version_number equal to head is a benign no-op. It also clarifies the organization omission rule contextually.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('revert an asset to a prior version') with the key discriminator — reverting does not rewind history but creates a new REVERT snapshot. An agent can distinguish this from create_asset_version, update_asset, and delete_asset without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite workflow ('Call list_asset_versions first to pick a valid, revertable version_number') and delineates no-op scenarios, but never explicitly states when to prefer a sibling (e.g. create_asset_version) instead of reverting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_assetsSearch assetsARead-onlyInspect
Search for assets in a Playbook workspace by metadata: filename, title, or tags. Use this when the user knows the name of an asset or is searching by tag or file type. Does NOT understand visual content — use ai_search for queries about what is depicted in the asset. Supports filtering by media type (image, video, document, audio), board, uploader, and status or custom field value. This is also the ONLY tool that finds assets BY a custom field value ('everything marked High') — pass the value as statuses, which ai_search also accepts. A filter-only call automatically searches all text (query: '*'), and any statuses call without an explicit media type searches every media type. To find what a PERSON uploaded, call list_members to resolve their name to a token, then pass that token as uploaded_by. Putting a person's name in query does NOT match the person who uploaded an asset — it searches the asset's own text and will return unrelated files.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number (1-indexed) | |
| query | No | Text search query. Omit it for a filter-only search such as `statuses` | |
| fields | No | Return ONLY these fields on each result. `token` is always included. Valid names: token, title, media_type, text_type, status, approved, approved_after, tags, permalink, display_url, stream_url, collection_token, size, is_skeleton, uploaded_by, source_error, ai_generated, ai_agent_payload. `display_url` and `permalink` are ~400 characters each, so narrowing a large result set is most of the saving. An unknown name is refused, not ignored: there is no `created_at`, `updated_at` or `type` among them — `media_type` is the name for an asset's kind, and its other metadata comes from get_asset or get_assets. | |
| statuses | No | Restrict results to assets carrying these status or custom field VALUES, e.g. ['High', 'Approved']. Case-insensitive, and it covers both the built-in Status and every custom field — get the exact option names from list_custom_fields. Matching is on the option name ALONE, with no way to say which field it came from, so a value name two fields share matches assets tagged under either. | |
| media_type | No | Filter by type. Ordinarily omitting this searches images only. When `statuses` is set, the tool automatically uses 'all' so no asset type is silently excluded. | |
| statuses_op | No | How to combine several `statuses`: 'or' (default) matches any of them, 'and' requires all of them at once — which is how you intersect values from different fields, e.g. Priority High AND Season Summer. Ignored unless `statuses` is set. | |
| uploaded_by | No | Restrict results to assets uploaded by these people. Pass member tokens from list_members. A name is accepted as a fallback and resolved server-side, but only when it matches exactly one member — otherwise the call fails and lists the candidates to choose from. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| nested_assets | No | Search the board's entire nested subtree rather than only the assets sitting directly in it. Requires `collection_token`. Set it whenever the token might be a PARENT board — without it a parent whose assets all live in sub-boards returns nothing at all. Caveat: subtree matching reads a search-index field that refreshes when an asset is re-indexed, so it can briefly lag a board being MOVED; list_assets with `nested_assets` reads the database and cannot. | |
| get_ai_payload | No | Include each result's `ai_agent_payload`. Default false, and the key is then ABSENT rather than null. This only RETURNS the payload — you cannot search or filter on its contents. | |
| collection_token | No | Limit search to a specific board |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly, non-destructive, closed-world); the description adds non-obvious behavior beyond them: a filter-only call silently runs `query: '*'`, an omitted media_type defaults to images but flips to 'all' when `statuses` is set, and custom-field values are matched on the option name alone with no field attribution. These disclose hidden side effects an agent could not infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the ai_search split, and the later sentences carry genuinely high-value warnings (uploader-name pitfall, statuses/media_type coupling). It is dense and long, with a couple of clauses that restate schema facts, but waste is low relative to payload.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, zero-required discovery tool with no output schema, the description covers routing, filter interactions and the main failure modes well. It omits return-shape and pagination behavior (page size, total counts) that an agent must guess from the solo `page` parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and already very descriptive, so the baseline would be 3; the description still adds cross-cutting semantics the schema cannot, notably that `statuses` is the only path to filtering by custom field value and that ai_search accepts the same value. It does not re-derive the per-parameter detail already in the schema, which is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (search assets by metadata) and immediately scopes what it does not do ('Does NOT understand visual content'). It differentiates itself from the sibling ai_search by name mid-sentence, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('user knows the name of an asset or is searching by tag or file type') and when-not ('use ai_search for queries about what is depicted'), plus the concrete anti-pattern that a person's name in `query` will not match the uploader and the required list_members→token workaround.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_asset_approvalSet asset approvalADestructiveIdempotentInspect
Approve or unapprove up to 1000 assets, including assets from different boards. Set approved_after only when unapproving to schedule when the assets become visible again. This controls visibility on shared and published pages and requires approval-management permission.
| Name | Required | Description | Default |
|---|---|---|---|
| approved | Yes | Whether the assets are currently approved and externally visible | |
| asset_tokens | Yes | Asset tokens to update | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| approved_after | No | ISO 8601 timestamp when unapproved assets become approved again |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is partly covered. The description adds real value beyond them: it discloses that the change controls visibility on shared and published pages and that it requires approval-management permission, both of which are behavioral facts an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and batch scope, followed by the parameter caveat and the permission requirement. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive batch mutation with no output schema, the description covers the action, the batch limit, the visibility consequence, and the required permission. It leaves unaddressed what happens on partial failure across up to 1000 tokens, but the essentials for calling it correctly are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds a genuine conditional constraint the schema does not state: approved_after should only be set when unapproving. That refines how the parameter should be used rather than merely restating its type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb pair (approve/unapprove) and resource (assets), and adds scope detail: up to 1000 assets and cross-board support. It does not, however, differentiate itself from the sibling update_asset_status, which an agent might reasonably confuse with this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a conditional usage rule for one parameter ('Set approved_after only when unapproving') and states the prerequisite permission, but it never says when to pick this tool over alternatives such as update_asset_status or share_asset. Usage is implied by the effect on shared/published pages rather than stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ungroup_assetsUngroup assetsADestructiveInspect
Pull assets out of the group they belong to, leaving them as standalone assets on the board. A group is a container asset that holds other assets as variants — different formats or crops of the same thing, or a set of colour swatches, which Playbook shows as a palette. The group has no file of its own and takes its preview from its first displayable child. Requires a token with the write scope. Every token must name an asset that is currently inside a group — one that is not makes the whole call fail. IMPORTANT: a group left with fewer than two assets is dissolved — its last asset is freed too and the group asset is deleted. So ungrouping one member of a two-member group frees both, and the returned list names only the assets you asked for, not every asset that changed. Re-read the group with get_asset if you need its current state.
| Name | Required | Description | Default |
|---|---|---|---|
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| child_asset_tokens | Yes | Tokens of the grouped assets to pull out |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, but the description adds the non-obvious behavioral core: a group dropping below two assets is dissolved, the last asset is freed, the group asset is deleted, and the returned list names only requested assets rather than everything changed. Auth scope and failure mode are also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and then layers requirement, destructive caveat, and return-value note in a logical order. It is longer than typical and the group-definition aside is arguably expendable, but nearly every sentence carries load-bearing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema, the description covers the safety scope, the error case, the surprising cascade deletion, and what the return list actually contains. An agent has enough to invoke it correctly and anticipate side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning to child_asset_tokens by constraining each token to an asset currently inside a group and explaining the all-or-nothing failure. The organization parameter's behavior is left entirely to the schema, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb+resource ('pull assets out of the group... leaving them as standalone assets') and even defines what a group is, which disambiguates it from sibling tools like group_assets and get_asset. An agent knows exactly what state change this produces without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (write scope required; every token must name an asset currently inside a group; the call fails otherwise) and warns to re-read with get_asset for current state. It stops short of naming the inverse sibling (group_assets) or when to prefer re-reading over ungrouping, so it is strong but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_assetUpdate assetADestructiveIdempotentInspect
Update an asset's editable metadata: title, description, tags (replaces existing), status, custom field values, or move it to a different board. Only the fields you pass are changed — omit a field to leave it as-is. fields is where custom field VALUES are set; call list_custom_fields first for the exact spelling.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Full set of manual tags to apply (replaces existing) | |
| title | No | New title | |
| token | Yes | Asset token | |
| fields | No | Custom field values, keyed by field name: { "Priority": "High" }. For an option field, both the field name and the value must match an existing field and one of its options EXACTLY (see list_custom_fields) — one that does not exist comes back as an error naming the valid fields or options, while the rest of the update is still saved. The built-in Status field is set with `status`, not here. Typed fields take a plain string instead: a date field an ISO date (YYYY-MM-DD), a person field a member token (from list_members), a url field an http(s) URL; "" clears a typed field, and an unparseable value fails the whole update. list_custom_fields gives each field's `field_type` and exact name. Each supplied value REPLACES the asset's previous value for that field; custom fields omitted from the map remain unchanged. A value written on a group also applies to its members. | |
| status | No | Status label | |
| description | No | New description | |
| ai_generated | No | Mark the asset as produced by an AI tool. Prefer setting this when you CREATE the asset: on uploads that go through upload_prepare/upload_complete it also suppresses automatic duplicate merging and grouping, and that runs once the upload finishes — setting it later records the marker but cannot undo a merge. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| ai_agent_payload | No | Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object, so read the asset first if you mean to keep existing keys. You can read it back per asset (get_asset, or list/search with get_ai_payload=true) but you CANNOT search or filter on it — do not try to find assets by payload contents. | |
| collection_token | No | Board token to move the asset to |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description usefully qualifies the destructiveness (only passed fields change, but tags REPLACE the existing set) and flags the list_custom_fields prerequisite for custom-field spelling. It does not mention permission requirements or what the response contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the editable surface, then patch semantics, then the one actionable prerequisite. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description plus the very rich input schema covers field semantics, replacement behavior, and the custom-field prerequisite. Gaps are limited to permissions and failure handling, which annotations partially offset.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents every parameter in depth, including the fields/status split and the list_custom_fields reference. The description's only added signal is the reminder that `fields` holds custom field VALUES, which the schema states as well, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (update) plus the resource and enumerates the editable surface: title, description, tags, status, custom fields, and board move. It does not, however, name the overlapping siblings (update_asset_status, change_asset_tags, move_assets) that a caller might otherwise reach for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Patch semantics are explicit ("Only the fields you pass are changed — omit a field to leave it as-is") and there is one prerequisite ("call list_custom_fields first"). But there is no when-not guidance and no routing away from update_asset_status / change_asset_tags / move_assets, which cover subsets of this tool's surface.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_asset_statusUpdate asset statusADestructiveIdempotentInspect
Set the status label on an asset (e.g. 'Approved', 'In Review', 'Rejected'). The status value is created on the workspace if it doesn't already exist.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Asset token | |
| status | Yes | Status label to set | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=true, idempotent=true, so the safety profile is covered. The description adds genuinely new context beyond them: the status label is auto-created on the workspace if absent, which tells the agent this call has workspace-level side effects. It does not state whether an existing asset status is overwritten, which holds it back from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and followed by the one non-obvious behavior. No filler or restated fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the destructive/idempotent profile and no output schema to explain, the description supplies what an agent needs: the effect, example values, and the workspace-level creation side effect. Nothing essential is missing for a 3-parameter mutation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds value the schema lacks: concrete example status labels ('Approved', 'In Review', 'Rejected'), which matters because the schema defines no enum for the status field. Token and organization parameters are left to their schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('Set') and resource ('status label on an asset'), with example values that make the effect concrete. It is distinguishable from siblings like change_asset_tags and update_asset, though it never explicitly contrasts with the neighboring set_asset_approval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance is given: it never says when to reach for this versus set_asset_approval or update_asset, nor any prerequisites. The only additional sentence covers a side effect, not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_boardUpdate boardADestructiveIdempotentInspect
Update an existing board's title, description, or parent. Pass only the fields you want to change. To rename a board, pass just title. To move it under a different parent, pass parent_collection_token.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New title | |
| token | Yes | Board token | |
| description | No | New description | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| parent_collection_token | No | New parent board token |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuinely useful partial-update semantics (PATCH-like behavior, only supplied fields change), which the annotations don't convey. However, annotations declare destructiveHint=true and the description never mentions that reparenting or editing can be destructive or whether changes are reversible — a notable omission given the mutation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the mutation scope and followed by the two most common usage patterns. Every sentence carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with full schema coverage, no output schema, and annotations covering idempotency and safety, the description supplies enough to call it correctly. The only gap is the absence of any warning aligned with destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the fields and the organization-resolution rule are already documented in the schema. The description adds intent-based mapping ('to rename, pass just title'; reparenting uses parent_collection_token'), which is modest added value over the structured data, keeping it near the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update'), resource ('an existing board'), and the exact mutable fields (title, description, parent), which cleanly separates it from create_board and delete_board. It stops short of naming any sibling explicitly, so it lands just below the top mark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: pass only the fields you want to change, and two worked intent-to-parameter examples (rename via `title`, reparent via `parent_collection_token`). It doesn't state when not to use this tool or point to a board-specific alternative, but no such sibling exists here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_page_elementUpdate page elementADestructiveIdempotentInspect
Replace an element's content on a board's published page. This is a FULL-element replace, not a field patch: every top-level key you send replaces the stored one WHOLESALE, so { props: { text } } DROPS every other stored prop. Read the element with get_page_layout, change what you need, and send its whole props back; top-level keys you omit are left alone. elementType cannot change, and element.id must be omitted or equal element_id. The response never reports converged, even when nothing changed. Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| element | Yes | ||
| slot_id | Yes | The slot holding the element (id or name). A section row is addressed through its slot. | |
| element_id | Yes | Id of the element to replace, from get_page_layout. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as destructive/idempotent/open-world; the description goes far beyond that with wholesale-replace semantics, immutable elementType, the 403 page_layout_api_disabled condition, 409 stale_document applying NOTHING, converged/materialized flags being absent when false, and up-to-an-hour propagation delay on the public page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The replace-vs-patch warning is front-loaded and the paragraph is organized by concern (semantics, errors, concurrency, response flags), so the density is justified. It runs long and could be trimmed slightly, but essentially every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by explaining every response signal (new version_token, converged, materialized, absent-when-false) plus the stale-read window. For a destructive, token-gated write with nested params, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (86%), so the baseline is 3, and the description earns above that by explaining semantics the schema only hints at: props keys replace WHOLESALE, element.id must be omitted or match element_id, expected_version_token acts as compare-and-swap, and omitted top-level keys are left alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace an element's content on a board's published page') and immediately distinguishes its semantics from a field patch. It also names the companion read tool (get_page_layout), so an agent can differentiate it from add_page_element, delete_page_element, and move_page_element.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow ('read with get_page_layout, change what you need, send its whole props back'), states the prerequisite ('requires modify and page-layout API writes enabled ... retrying does not help'), identifies which 409s are safe to repeat, and describes how to thread version_token between writes. When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_page_settingsUpdate page settingsADestructiveIdempotentInspect
Change a board's published page's own background colour and/or typography. A PARTIAL update: a setting you do not name is left as it is; one sent as null is CLEARED and the page inherits it again (from the template; a cleared nested-board section inherits the page first). Legal values are background_colors and typographies in get_page_elements_catalog. Elements are untouched. If the board followed a workspace template, a real change detaches it so a later template roll-out does not revert it. Requires modify on the board and page-layout API writes enabled for the workspace — otherwise 403 page_layout_api_disabled, which only Playbook can turn on; retrying does not help. Concurrency: pass the version_token from get_page_layout as expected_version_token; if the page changed since, the call answers 409 stale_document and applies NOTHING — read again, re-decide, re-send. A successful write that sent a token returns the NEW version_token: send that on your next write, because your own write already made the old one stale. Of the 409s only lock_wait_timeout and page_layout_library_locked are safe to repeat unchanged. converged: true in the response means nothing changed (the goal state already held); materialized: true means the page had no stored document and this call saved the template's defaults. Both keys are ABSENT when false. The public page can keep showing the old version for up to an hour after a successful write, so a reload may not show the change.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Board token of the published board | |
| typography | No | New typography, or null to clear it. Omit to leave it unchanged. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| subboard_token | No | Edit a nested board's section of this page instead of the page itself: the `collectionToken` of an entry in get_page_layout's `subboards_settings`. Omit for the main page. | |
| background_color | No | New background colour, or null to clear it. Omit to leave it unchanged. | |
| expected_version_token | No | The `version_token` from get_page_layout, echoed verbatim to make this write a compare-and-swap. Omit to write unconditionally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Exceptionally rich disclosures well beyond the annotations: template detachment on real change, the 403 page_layout_api_disabled prerequisite that retrying cannot fix, 409 stale_document applying nothing, which 409s are safe to repeat, the rotated version_token contract, and converged/materialized response flags. It also warns the public page can serve the old version for up to an hour. This is far past what destructiveHint/idempotentHint convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long and dense, but front-loaded with the core operation and then ordered by concern (semantics, prerequisites, concurrency, response flags, caching). Nearly every sentence carries operational weight; only the restatement of omit/null semantics slightly overlaps the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry return-value meaning, and it does: version_token rotation, converged, and materialized flags including their absent-when-false convention. Combined with auth prerequisites, error taxonomy, and concurrency guidance, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the inheritance rule for cleared values ('inherits from the template; a cleared nested-board section inherits the page first'), the subboard_token targeting semantics, and the compare-and-swap contract for expected_version_token. The omit-vs-null distinction largely duplicates the schema wording, which keeps this at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Change a board's published page's own background colour and/or typography') and immediately scopes it away from element editing ('Elements are untouched'), which cleanly separates it from update_page_element and add_page_element. An agent knows exactly what this tool mutates versus its closest siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete decision rules (omit = unchanged, null = cleared, subboard_token = edit a nested section, expected_version_token = compare-and-swap) and names supporting tools (get_page_elements_catalog, get_page_layout, list_organizations). It stops short of explicitly stating when to choose update_page_element or apply_page_operations instead, so it is clear context rather than full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_from_urlUpload from URLAInspect
Upload a single asset to a Playbook board by giving Playbook a public URL to fetch. Returns immediately with a skeleton asset; the byte fetch runs asynchronously in the background. Requires a token with the write scope. Playbook fetches the URL itself, anonymously — a link behind a login or a signed URL that has expired will not work here, and neither will a file that exists only on someone's machine. For those, use share_board with enable_uploads. It returns a link a person can drop files on without signing in, and whatever they add lands on that board for you to collect with list_assets. It needs a live human and it shows the board's existing contents to anyone holding the link, so reach for it only once no fetchable URL is available. The fetch runs to a time budget (five minutes of streaming), so a source that is very large or very slow fails with "Source URL too large to fetch; upload manually" — when that happens, send the bytes yourself with create_upload_url rather than retrying. Tip: validate collection_token with get_board first — an unknown token silently falls back to an anonymous default board.
| Name | Required | Description | Default |
|---|---|---|---|
| uri | Yes | Public URL of the file to ingest | |
| tags | No | Manual tags to apply | |
| title | No | Override the title. Defaults to the filename in the URL. Not derived when as_link is true — Playbook titles those from the linked page's own metadata. | |
| status | No | Status label to set | |
| as_link | No | If true, store as a bare link instead of fetching bytes (default false) | |
| description | No | Optional description | |
| ai_generated | No | Mark the asset as produced by an AI tool. Set it at creation rather than by a later update. Through these tools it is a marker and nothing else; on Playbook's REST presigned-upload endpoints the same flag additionally suppresses automatic duplicate merging and grouping. | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| ai_agent_payload | No | Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable. | |
| collection_token | No | Destination board token. If omitted or unknown, Playbook silently routes to a default anonymous board — call get_board first to validate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: returns a skeleton asset immediately while the fetch runs async, requires the `write` scope, fetches anonymously, has a five-minute streaming budget with a specific failure string, and silently falls back to an anonymous board on an unknown token. None of this is inferable from readOnlyHint/openWorldHint/idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then conditions and fallbacks in a logical order. It is long and the share_board detour runs several clauses, but nearly every sentence carries operational weight (auth, async, timeout, fallback).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async mutation tool with 10 params and no output schema, it covers return timing (skeleton asset), lifecycle, auth scope, failure modes, and error recovery paths. An agent has everything needed to call it or route elsewhere correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds real value on the highest-risk parameter by cautioning that `collection_token` silently defaults to an anonymous board and should be validated via get_board first, slightly exceeding what the schema text conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb, resource, and mechanism: 'Upload a single asset to a Playbook board by giving Playbook a public URL to fetch.' The word 'single' and 'fetch' distinguish it from upload_from_urls (plural) and the presigned create_upload_url path without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the when-not conditions (login-gated links, expired signed URLs, local-only files) and routes to named alternatives: share_board with enable_uploads for human drop, create_upload_url when the fetch fails. It even frames share_board's downside (needs a live human, leaks existing contents) to gate its use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_from_urlsUpload from URLsAInspect
Upload up to 100 assets in one call by giving Playbook public URLs to fetch. All assets land in the same board. Returns an array of skeleton assets immediately; the byte fetches run asynchronously per asset in the background. Requires a token with the write scope. Playbook fetches each URL itself, anonymously — links behind a login, expired signed URLs, and files that exist only on someone's machine cannot be ingested here. For those, use share_board with enable_uploads. It returns a link a person can drop files on without signing in, and whatever they add lands on that board for you to collect with list_assets. It needs a live human and it shows the board's existing contents to anyone holding the link, so reach for it only once no fetchable URL is available. Each fetch runs to a time budget (five minutes of streaming), so a source that is very large or very slow fails with "Source URL too large to fetch; upload manually" — when that happens, send those bytes yourself with create_upload_urls rather than retrying. Tip: validate collection_token with get_board first — an unknown token silently falls back to an anonymous default board.
| Name | Required | Description | Default |
|---|---|---|---|
| assets | Yes | Array of URL ingest specs (1-100 items) | |
| organization | No | Workspace slug, as returned by list_organizations. Omit it when the account has a single workspace — it is then resolved from your token. Pass it only when the account has several, or when you mean a workspace other than the obvious one. | |
| collection_token | Yes | Destination board token (applied to every asset) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only say readOnly=false, destructive=false, openWorld=true, idempotent=false). It discloses the required `write` scope, anonymous fetching that cannot handle auth-gated or expired URLs, the exact five-minute streaming budget and its error string, the asynchronous byte-fetch behavior, and the silent fallback to an anonymous default board for an unknown token.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, scope and return semantics, then alternatives and failure handling. It is on the long side and the share_board detour runs a few sentences, but nearly every sentence carries operative information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly explains the return (an array of skeleton assets immediately, bytes fetched later) and covers auth scope, failure modes, and fallback behavior. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine meaning beyond the schema by warning that an unknown `collection_token` silently falls back to an anonymous default board, which the schema only describes as 'Destination board token'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Upload up to 100 assets in one call by giving Playbook public URLs to fetch. All assets land in the same board.' It also clarifies the async return shape, which separates it from the singular upload_from_url sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names alternatives and the exact condition that selects them: share_board with enable_uploads when no fetchable URL exists, create_upload_urls when a fetch fails on size/time, and get_board to validate collection_token first. It even states a preference ordering ('reach for it only once no fetchable URL is available').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Added
delete_app - Added
deploy_app - Added
list_apps
6 tool updates
- Added
get_asset_download_urls - Changed
get_board1 field changed- changed
Input schema / properties / token / descriptionPrevious value: -"Board token, as returned by list_boards, list_board_children or ai_search — the parameter name is `token`, not `board_token`. The id in a shared board link or a published page URL is NOT a board token and nothing converts one: look the board up by title with list_boards `query` or ai_search instead of taking an id out of a URL, a spreadsheet or an earlier session."New value: +"Board token, as returned by list_boards, list_board_children or ai_search — the parameter name is `token`, not `board_token`. The id in a share link (`/s/{workspace}/{id}`) is NOT a board token: pass the link to resolve_share_link, which returns the board. Nothing converts a published page URL: look that board up by title with list_boards `query` or ai_search instead of taking an id out of a URL, a spreadsheet or an earlier session."
- Changed
list_assets1 field changed- changed
Input schema / properties / collection_token / descriptionPrevious value: -"Board token to filter by — the parameter name is `collection_token`, not `board_token`. Take the token from list_boards, list_board_children or ai_search: the id in a shared board link, a published page URL or a permalink is a different identifier, and passing one here fails the same way as a token from another workspace."New value: +"Board token to filter by — the parameter name is `collection_token`, not `board_token`. Take the token from list_boards, list_board_children or ai_search: the id in a shared board link, a published page URL or a permalink is a different identifier, and passing one here fails the same way as a token from another workspace. A share link goes through resolve_share_link first, which returns the board token."
- Changed
list_boards3 fields changed- added
Input schema / properties / depth / anyOfAdded value: +[ + { + "type": "string" + }, + { + "minimum": 1, + "type": "integer" + } +] - changed
Input schema / properties / depth / descriptionPrevious value: -"Hierarchy depth as a STRING: '1' for top-level only, '2', or 'all' for the full tree. Default: '1'. A bare number is rejected — quote the digit."New value: +"Hierarchy depth: '1' for top-level only, '2', or 'all' for the full tree. Default: '1'." - removed
Input schema / properties / depth / typeRemoved value: -"string"
- Added
list_group_children - Changed
resolve_share_link1 field changed- changed
Input schema / properties / share_url / descriptionPrevious value: -"The full share URL, or just its last path segment"New value: +"The full share URL, or just its last path segment. A full URL names its own workspace, so `organization` is not needed with one."
65 tool updates
- Changed
add_asset_permalinks3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "context" -]New value: +[ + "asset_tokens" +]
- Changed
add_page_element3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "slot_id", - "at_index", - "element", - "context" -]New value: +[ + "token", + "slot_id", + "at_index", + "element" +]
- Changed
ai_search3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "query", - "context" -]New value: +[ + "query" +]
- Changed
apply_page_operations3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "operations", - "context" -]New value: +[ + "token", + "operations" +]
- Changed
change_asset_tags3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
copy_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "collection_token", - "context" -]New value: +[ + "asset_tokens", + "collection_token" +]
- Changed
create_asset_version3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "uri", - "context" -]New value: +[ + "token", + "uri" +]
- Changed
create_board3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "title", - "context" -]New value: +[ + "title" +]
- Changed
create_colors3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "color_codes", - "context" -]New value: +[ + "color_codes" +]
- Changed
create_comment3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "description", - "context" -]New value: +[ + "description" +]
- Changed
create_custom_field3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "name", - "context" -]New value: +[ + "name" +]
- Changed
create_note3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "text", - "context" -]New value: +[ + "text" +]
- Changed
create_upload_url3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "filename", - "size", - "media_type", - "context" -]New value: +[ + "filename", + "size", + "media_type" +]
- Changed
create_upload_urls3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "files", - "context" -]New value: +[ + "files" +]
- Changed
delete_asset3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
delete_board3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
delete_custom_field3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
delete_page_element3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "element_id", - "slot_id", - "context" -]New value: +[ + "token", + "element_id", + "slot_id" +]
- Changed
edit_asset_version_comment3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "version_number", - "comment", - "context" -]New value: +[ + "token", + "version_number", + "comment" +]
- Changed
finish_upload4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / ai_agent_payload / descriptionPrevious value: -"Your own scratch space on this asset — prompt, model, seed, source job id, anything you need to recognise it in a later session. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable."New value: +"Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable." - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "signed_gcs_id", - "media_type", - "context" -]New value: +[ + "signed_gcs_id", + "media_type" +]
- Changed
finish_uploads4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / assets / items / properties / ai_agent_payload / descriptionPrevious value: -"Your own scratch space on this asset — prompt, model, seed, source job id, anything you need to recognise it in a later session. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable."New value: +"Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable." - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "batch_id", - "assets", - "context" -]New value: +[ + "batch_id", + "assets" +]
- Changed
get_asset3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
get_asset_permalinks3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "context" -]New value: +[ + "asset_tokens" +]
- Changed
get_asset_previews3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "context" -]New value: +[ + "asset_tokens" +]
- Changed
get_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "context" -]New value: +[ + "asset_tokens" +]
- Changed
get_board3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
get_comments3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "entity_type", - "token", - "context" -]New value: +[ + "entity_type", + "token" +]
- Changed
get_import3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Removed
get_more_tools - Changed
get_page_elements_catalog4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / properties / element_types / descriptionPrevious value: -"Return only these entries of `elements` (e.g. ['banner', 'button']). Everything else is always returned. An unknown type is refused with the valid list."New value: +"Element types to return the props of, under `elements` (e.g. ['banner', 'button']). Without it the response lists the type names and no props. An unknown type is refused with the valid list." - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
get_page_layout3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
group_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "parent_asset_token", - "child_asset_tokens", - "context" -]New value: +[ + "parent_asset_token", + "child_asset_tokens" +]
- Changed
import_from_dropbox3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "source_token", - "folders", - "context" -]New value: +[ + "source_token", + "folders" +]
- Changed
import_from_google_drive3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "source_token", - "folders", - "context" -]New value: +[ + "source_token", + "folders" +]
- Changed
list_asset_versions3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
list_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
list_board_children3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
list_board_descendants3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
list_boards3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
list_custom_fields3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
list_documentation2 fields changed- removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
list_import_sources3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
list_members3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
list_organizations2 fields changed- removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
move_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "collection_token", - "context" -]New value: +[ + "asset_tokens", + "collection_token" +]
- Changed
move_page_element3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "element_id", - "from_slot_id", - "to_slot_id", - "at_index", - "context" -]New value: +[ + "token", + "element_id", + "from_slot_id", + "to_slot_id", + "at_index" +]
- Changed
publish_board3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
read_documentation3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "topic", - "context" -]New value: +[ + "topic" +]
- Changed
remove_asset_permalinks3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "context" -]New value: +[ + "asset_tokens" +]
- Changed
reorder_page_slot3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "slot_id", - "ordered_ids", - "context" -]New value: +[ + "token", + "slot_id", + "ordered_ids" +]
- Changed
resolve_share_link3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "share_url", - "context" -]New value: +[ + "share_url" +]
- Changed
retry_video_processing3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
revert_asset3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "version_number", - "context" -]New value: +[ + "token", + "version_number" +]
- Changed
search_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - removed
Input schema / requiredRemoved value: -[ - "context" -]
- Changed
set_asset_approval3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "asset_tokens", - "approved", - "context" -]New value: +[ + "asset_tokens", + "approved" +]
- Changed
share_asset3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
share_board4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / properties / enable_uploads / descriptionPrevious value: -"Let anyone holding the link add files to the board without signing in. Two things to tell the user before setting it. There is NO upload-only mode — such a link still shows the board's contents to whoever opens it. And this endpoint returns the board's EXISTING link when it already has one, so turning uploads on grants upload rights to everyone who was already given that URL for viewing; share a fresh board instead if that matters. Requires a plan with shared-link customization, otherwise the call fails with 403. Pair it with `password` and `expiration_date` when the link leaves a trusted group."New value: +"Let anyone holding the link add files to the board without signing in. It has two consequences. There is NO upload-only mode — such a link still shows the board's contents to whoever opens it. And this endpoint returns the board's EXISTING link when it already has one, so turning uploads on grants upload rights to everyone who was already given that URL for viewing; share a fresh board instead if that matters. Requires a plan with shared-link customization, otherwise the call fails with 403. Pair it with `password` and `expiration_date` when the link leaves a trusted group." - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
ungroup_assets3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "child_asset_tokens", - "context" -]New value: +[ + "child_asset_tokens" +]
- Changed
update_asset5 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / ai_agent_payload / descriptionPrevious value: -"Your own scratch space on this asset — prompt, model, seed, source job id, anything you need to recognise it in a later session. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object, so read the asset first if you mean to keep existing keys. You can read it back per asset (get_asset, or list/search with get_ai_payload=true) but you CANNOT search or filter on it — do not try to find assets by payload contents."New value: +"Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object, so read the asset first if you mean to keep existing keys. You can read it back per asset (get_asset, or list/search with get_ai_payload=true) but you CANNOT search or filter on it — do not try to find assets by payload contents." - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / properties / fields / descriptionPrevious value: -"Custom field values, keyed by field name: { \"Priority\": \"High\" }. For an option field, both the field name and the value must match an existing field and one of its options EXACTLY (see list_custom_fields) — the API skips anything it cannot match and still reports success, so verify the returned `fields` map. Typed fields take a plain string instead: a date field an ISO date (YYYY-MM-DD), a person field a member token (from list_members), a url field an http(s) URL; \"\" clears a typed field, and an unparseable value fails the whole update. list_custom_fields gives each field's `field_type` and exact name. Each supplied value REPLACES the asset's previous value for that field; custom fields omitted from the map remain unchanged. A value written on a group also applies to its members."New value: +"Custom field values, keyed by field name: { \"Priority\": \"High\" }. For an option field, both the field name and the value must match an existing field and one of its options EXACTLY (see list_custom_fields) — one that does not exist comes back as an error naming the valid fields or options, while the rest of the update is still saved. The built-in Status field is set with `status`, not here. Typed fields take a plain string instead: a date field an ISO date (YYYY-MM-DD), a person field a member token (from list_members), a url field an http(s) URL; \"\" clears a typed field, and an unparseable value fails the whole update. list_custom_fields gives each field's `field_type` and exact name. Each supplied value REPLACES the asset's previous value for that field; custom fields omitted from the map remain unchanged. A value written on a group also applies to its members." - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
update_asset_status3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "status", - "context" -]New value: +[ + "token", + "status" +]
- Changed
update_board3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
update_page_element3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "element_id", - "slot_id", - "element", - "context" -]New value: +[ + "token", + "element_id", + "slot_id", + "element" +]
- Changed
update_page_settings3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "token", - "context" -]New value: +[ + "token" +]
- Changed
upload_from_url4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / ai_agent_payload / descriptionPrevious value: -"Your own scratch space on this asset — prompt, model, seed, source job id, anything you need to recognise it in a later session. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable."New value: +"Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable." - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "uri", - "context" -]New value: +[ + "uri" +]
- Changed
upload_from_urls4 fields changed- added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / assets / items / properties / ai_agent_payload / descriptionPrevious value: -"Your own scratch space on this asset — prompt, model, seed, source job id, anything you need to recognise it in a later session. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable."New value: +"Free-form JSON metadata stored with the asset — for example generation settings such as model and seed, or a source job id. Playbook never interprets it. Max 4096 BYTES of serialised JSON; anything larger is REJECTED, never truncated. A write REPLACES the whole object. Readable per asset (get_asset, or list/search with get_ai_payload=true) but NOT searchable or filterable." - removed
Input schema / properties / contextRemoved value: -{ - "description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\"", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "collection_token", - "assets", - "context" -]New value: +[ + "collection_token", + "assets" +]
65 tool updates
- First observed
add_asset_permalinks - First observed
add_page_element - First observed
ai_search - First observed
apply_page_operations - First observed
change_asset_tags - First observed
copy_assets - First observed
create_asset_version - First observed
create_board - First observed
create_colors - First observed
create_comment - First observed
create_custom_field - First observed
create_note - First observed
create_upload_url - First observed
create_upload_urls - First observed
delete_asset - First observed
delete_board - First observed
delete_custom_field - First observed
delete_page_element - First observed
edit_asset_version_comment - First observed
finish_upload - First observed
finish_uploads - First observed
get_asset - First observed
get_asset_permalinks - First observed
get_asset_previews - First observed
get_assets - First observed
get_board - First observed
get_comments - First observed
get_import - First observed
get_more_tools - First observed
get_page_elements_catalog - First observed
get_page_layout - First observed
group_assets - First observed
import_from_dropbox - First observed
import_from_google_drive - First observed
list_asset_versions - First observed
list_assets - First observed
list_board_children - First observed
list_board_descendants - First observed
list_boards - First observed
list_custom_fields - First observed
list_documentation - First observed
list_import_sources - First observed
list_members - First observed
list_organizations - First observed
move_assets - First observed
move_page_element - First observed
publish_board - First observed
read_documentation - First observed
remove_asset_permalinks - First observed
reorder_page_slot - First observed
resolve_share_link - First observed
retry_video_processing - First observed
revert_asset - First observed
search_assets - First observed
set_asset_approval - First observed
share_asset - First observed
share_board - First observed
ungroup_assets - First observed
update_asset - First observed
update_asset_status - First observed
update_board - First observed
update_page_element - First observed
update_page_settings - First observed
upload_from_url - First observed
upload_from_urls
Publisher details
- Operator
- Playbook Digital, Inc. · Publisher source
- Operator website
- https://www.playbook.com
- Vendor relationship
- Not applicable
- Documentation
- https://dev.playbook.com/docs/guides/mcp/ · Publisher source
- Trust center
- Not applicable
- Restrictions
- Requires a Playbook account. Sign in through the browser (OAuth) or pass a Playbook API token as a Bearer header; no custom OAuth app or admin approval. Rate limit: 120 requests per 60 seconds. · Publisher source
Related MCP Connectors
Digital asset manager - upload, organize, search, and generate on-brand images and videos
Upload, organize, search, and transform images, videos, and files with AI-powered tools.
AI-native digital asset management: semantic search, generative image edits, and CDN delivery.
Official ImageKit media library server: search, upload, organize, tag, share and manage assets.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceEnables AI agents to manage media assets on any S3-compatible storage, including uploads, downloads, tagging, and collections, via presigned URLs.MIT- AlicenseNot gradedqualityBmaintenanceProvides a local creator asset library MCP server that scans folders to catalog media files, batch-renames them, applies tags, tracks asset lineage between source and finished works, and offers keyword- and BGE-vector-based semantic search. It also lets other content-production MCP servers auto-register their generated outputs into the library for later retrieval and reuse.MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients and AI agents to search and retrieve images and videos from a stock media library, with filtering by media type, orientation, category, dimensions, colors, safe search, ordering, and pagination.13 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to store, version, browse, search, and share artifacts in workspace drives and folders through MCP tools, with keys that gate which tools are offered. Uploads produce shareable public links and rendered previews, and the same bearer key works across the REST API and MCP transport.Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.