ZeroWidth Napkin
Server Details
Draw boards, write docs and sheets, and build decks with your brand in Napkin.
- Status
- Healthy
- Uptime
- 99.9% over 23 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 68 tools
Most tools target a distinct resource+action, and descriptions work hard to separate near-neighbours (napkin_docs_create vs napkin_boards_create vs napkin_deck_write vs napkin_diagrams_create explicitly cross-reference each other). But several genuine collision pairs remain: napkin_sheets_set_cells vs napkin_tables_add_records (two ways to write row data), napkin_sheets_create vs napkin_tables_create (a table is a tab in a sheet), napkin_deck_compose vs napkin_deck_write vs napkin_boards_create (three deck-creation paths), and unprefixed get_doc/list_docs/search_docs vs napkin_docs_get/list_next to each other. An agent must read long descriptions to choose correctly.
The dominant pattern is napkin_<domain>_<verb> (napkin_docs_get, napkin_sheets_query), which is predictable, but verb-only names (napkin_draw, napkin_deck_write, napkin_slide_view) and middle-verb names (napkin_brand_add_files, napkin_deck_set_theme) break it. A whole cluster of tools has no prefix at all (comments_create, entity_tags_browse, get_doc, list_docs, search_workspace, workspace_files_save_from_chat), and those flip the word order to verb_noun while prefixed ones are noun_verb — so the same action reads differently depending on domain.
68 tools is well past the point where an agent can reliably select among them in one pass. The breadth is real — docs, decks, slides, boards, diagrams, interfaces, brand kits, sheets, tables, comments, tags, search — but several domains contribute 5-10 tools each and the surface would be far more usable split into focused servers. Only the genuine multi-product scope keeps this from being the worst case.
Lifecycle coverage is unusually thorough: create/get/list/update/archive for docs, boards, diagrams, interfaces, sheets, brand kits, plus slide-level and cell/record-level editing, search, tags and comments. Minor dead ends: search_workspace points at workspace_files_read which is not exposed, there is no way to list workspace members despite several tools requiring member/user ids, and comments can be created and resolved but not edited or deleted.
Available Tools
68 toolscomments_createComment on an entityAInspect
Posts a comment on a workspace entity — a new thread, or a reply when rootId is given. Use it to leave findings where the discussion already lives (an eval result on the flow being debated, a summary on a long thread). Mention people via mentionedUserIds (from workspace member ids) to ring their notification bell; never mention someone who didn't ask to be pulled in.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| rootId | No | Reply into this thread; omit to start a new one. | |
| entityId | Yes | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | ||
| entityKind | Yes | What the thread hangs on. | |
| mentionedUserIds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write, non-destructive, closed-world behavior, so the baseline is set. The description adds genuine behavioral context: the mention path 'rings their notification bell', which is a side effect an agent should know about, plus the thread-vs-reply branching. It stops short of noting auth requirements or idempotency.
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 core action and mode selection before the usage example. The closing etiquette line ('never mention someone who didn't ask') is editorializing but arguably still useful guardrail content.
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 write tool with no output schema and annotations covering safety, the description covers purpose, use case, thread/reply behavior, and mention side effects. Missing pieces are minor (approvalId meaning, mention limits, what a successful post returns).
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 only 43%, so the description is expected to compensate. It meaningfully explains mentionedUserIds (workspace member ids) and rootId (reply target), but leaves approvalId, workspace, entityKind semantics, and body constraints unexplained. Partial compensation warrants a baseline 3.
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 ('Posts a comment on a workspace entity') and clarifies the two modes — new thread vs reply when rootId is given. An agent can immediately tell what this does 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?
Gives concrete use cases ('leave findings where the discussion already lives', 'a summary on a long thread') that establish when to reach for it. It does not, however, distinguish this from siblings comments_list or comments_resolve, nor state any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comments_listRead an entity's comment threadsARead-onlyInspect
Lists the comment threads on one workspace entity (open first, then resolved) with authors and timestamps. Read this before weighing in on contested work — the threads are where disagreement lives before it becomes a decision.
| Name | Required | Description | Default |
|---|---|---|---|
| entityId | Yes | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| entityKind | Yes | What the thread hangs on. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=true, destructiveHint=false), so the bar is lower, and the description still adds real behavioral content: result ordering (open first, then resolved) and the fact that authors and timestamps are included. It stops short of stating pagination, volume limits, or behavior for entities with no threads.
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 operative fact (what is listed, in what order) before the advisory second sentence. The second sentence is slightly rhetorical ("where disagreement lives before it becomes a decision") but it does convey routing intent, so little is wasted.
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 returned content (threads, authors, timestamps, ordering), which is the key information an agent needs. It remains silent on result size/pagination and on empty-result behavior, so it is strong but not fully 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 67%: workspace is well documented in the schema, entityKind has only a terse "What the thread hangs on" description, and entityId has none. The description says only "one workspace entity," adding no format, valid-value, or relationship detail beyond the schema enum, so a 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 concrete verb and resource ("Lists the comment threads on one workspace entity") and adds ordering detail (open first, then resolved). It implicitly separates itself from the write-side siblings comments_create and comments_resolve through the read verb, but never names or contrasts with them outright, so sibling differentiation is inferred rather than stated.
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?
"Read this before weighing in on contested work" gives a thematic when-to-use cue, which is more than nothing. However, no alternatives are named (notably comments_resolve or comments_create, the natural next/previous steps) and there is no when-not-to-use guidance or note on whether resolved threads can be filtered out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
comments_resolveResolve or reopen a threadADestructiveInspect
Sets a comment thread's resolved state (rootId = the thread's root comment id). Resolve ONLY when the human asked or the thread's question is demonstrably settled — and say what settled it in a reply first. Reopening is for new evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| rootId | Yes | ||
| resolved | Yes | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a non-read-only, destructive mutation. The description adds meaningful policy context beyond that: the operation is a reversible toggle (resolve/reopen), and there is a sequencing constraint requiring justification before resolving. It does not state permission/auth requirements or what happens to existing replies, so it stops short of full 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?
Two dense sentences with the mechanical fact (what rootId is) front-loaded, followed by the policy. No filler, no restatement 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?
For a 4-parameter mutation tool with no output schema, the description covers purpose, when-to-use, and the key parameter. The gaps are approvalId (never explained) and workspace/auth expectations, which matter for a destructive operation, but the core agent decision-making path is well served.
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 only 25%, so the description must carry more weight. It usefully defines rootId (the thread's root comment id) and implies resolved=true/false via 'resolve or reopen', but says nothing about workspace (which the schema does describe) or approvalId (undocumented in both places). Partial compensation for a low-coverage 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 (sets the resolved state) and resource (a comment thread), and clarifies the ambiguous rootId by equating it to the thread's root comment id. It clearly covers both directions of the operation (resolve and reopen). It does not explicitly distinguish itself from comments_create/comments_list, though the reply-first instruction implies a division of labor.
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 rules: resolve only when the human asked or the question is demonstrably settled, and reopen only for new evidence. It also imposes a prerequisite workflow step ('say what settled it in a reply first'), which implicitly routes the agent to comments_create. This is about as prescriptive as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entity_tags_browseBrowse the workspace's tagsARead-onlyInspect
Without a tag: every tag in use across the workspace with how many entities carry it, most-used first — the vocabulary the team already organizes by. With a tag: everything filed under it across every tool, each with its kind, id, title, and path. Use it to reuse existing labels instead of inventing near-duplicates, and to answer 'show me everything about X' when X is a label.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | A tag to expand into its items. Omit to list tags. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
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 non-annotation behavior: result ordering ('most-used first') and the fields returned in each mode (tag name + count; kind, id, title, path), but says nothing about result limits or pagination.
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 two modes that matter most before the usage advice. It is efficient, though 'the vocabulary the team already organizes by' is slight editorial padding for an agent-facing definition.
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-shape burden and does so for both modes, which is the key gap an agent would otherwise face. It omits pagination/size limits, the only remaining incompleteness for a browse 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 baseline is 3, and the schema already documents omitting the tag. The description goes beyond that by spelling out what each mode actually produces, which clarifies the semantics of the tag parameter's presence/absence rather than just restating 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?
The description names the resource precisely and separates the two operating modes: no tag lists all workspace tags with usage counts, a tag expands to all items filed under it across every tool. That mode split makes it trivially distinguishable from entity_tags_get and entity_tags_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?
It gives concrete usage triggers: 'reuse existing labels instead of inventing near-duplicates' and answering 'show me everything about X' when X is a label. It stops short of naming alternatives (entity_tags_get, search_workspace) or stating when not to use it, so it is clear context without explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entity_tags_getRead the tags on entitiesARead-onlyInspect
Returns the tags on a batch of entities of one kind — the labels galleries organize by. Ids come from the kind's list/get tool or from search_workspace. Use it before entity_tags_set so you replace the full set knowingly, and to answer 'what is this filed under'. Entities the user can't see are omitted.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| entityKind | Yes | Which kind the ids belong to. |
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 genuinely useful behavior beyond that: results are batch-scoped to one entityKind and 'Entities the user can't see are omitted', i.e. permission-based filtering of results. It does not describe pagination or the shape of the returned tag set.
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 packed sentences, front-loaded with the return value before the usage guidance. The gloss 'the labels galleries organize by' earns its place by disambiguating 'tags' in this domain. Slightly dense but no filler sentences.
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 burden of describing the return, which it does at a high level ('returns the tags on a batch of entities'). Combined with the permission-omission note and the id-sourcing guidance, an agent has enough to call it correctly, though the exact tag object shape remains 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 coverage is 67%: workspace and entityKind are documented in the schema, but ids is not. The description compensates by explaining where ids come from (the kind's list/get tool or search_workspace) and that they belong to a single kind, which is the key constraint linking ids and entityKind. It does not mention the 100-item batch ceiling, which the schema already enforces.
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 ('Returns the tags on a batch of entities of one kind') and immediately distinguishes itself from entity_tags_set, which it names explicitly. An agent can tell it apart from the sibling tag tools 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 strong context: ids come from the kind's list/get tool or from search_workspace, and it should be run before entity_tags_set so the full set is replaced knowingly. It also frames a concrete question it answers ('what is this filed under'). It stops short of naming when NOT to use it versus entity_tags_browse, so it is not a full when/when-not/alternative spec.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
entity_tags_setSet an entity's tagsADestructiveInspect
Replaces the FULL tag set on one entity (an empty list clears it). Read the current tags with entity_tags_get first and pass the merged list — this is not additive. Tags are lowercase letters, numbers, spaces, and hyphens; prefer labels already in use (entity_tags_browse) so the workspace's vocabulary stays small. The id comes from the kind's list/get tool or search_workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | ||
| entityId | Yes | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| entityKind | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds the crucial nuance annotations cannot: that this is a full replacement rather than an append, that an empty list clears tags, and how to avoid accidental data loss by reading first. It also discloses the tag format constraints and workspace-vocabulary preference, which are real behavioral characteristics.
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 tight sentences, front-loaded with the destructive replacement semantic that matters most. Every sentence carries distinct, non-redundant information: replacement behavior, read-then-merge workflow, format/vocabulary rules, and id sourcing.
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 not explain what the call returns (e.g. the resulting tag list), and it does not mention the needs_confirmation/approvalId flow that the schema implies for a destructive operation. Otherwise it is complete: mutation semantics, safety guidance, format constraints, and id sourcing 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 coverage is only 40%, so the description must compensate, and it does so for the highest-risk parameter: tags format (lowercase/numbers/spaces/hyphens) and replace semantics. It also explains where entityId comes from. It does not explain entityKind's 20 enum values or workspace/approvalId semantics, which the schema carries on its own.
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 clause 'Replaces the FULL tag set on one entity' gives an exact verb, resource, and scope, and the parenthetical '(an empty list clears it)' nails the edge case. It is clearly distinguished from the read-oriented siblings entity_tags_get and entity_tags_browse, which it names directly.
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 when and how to use it: read current tags with entity_tags_get first, merge, then pass the full list, and warns that the call is not additive. It also directs the agent to entity_tags_browse for vocabulary and to the kind's list/get tool or search_workspace for the id, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docFetch ZeroWidth doc by slugARead-onlyInspect
Fetch the full Markdown body of a specific docs page by its slug. Use this after search_docs when the user needs the complete content of a page. No authentication required.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Page slug. Accepts 'compass/api', '/compass/api', or 'docs/compass/api'. |
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 two things beyond that: the return payload is the 'full Markdown body' (valuable because there is no output schema) and that no authentication is required. It does not discuss rate limits or caching, hence not 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?
Three short sentences with no filler; the core action is front-loaded and the sequencing hint and auth note each carry distinct information. Nothing could be removed without losing content.
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 the missing pieces: what is returned (full Markdown body), when to reach for it versus search, and the absence of an auth barrier. 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?
Only one parameter, and the schema documents it at 100% coverage including accepted slug formats ('compass/api', '/compass/api', 'docs/compass/api'). The description adds nothing about the slug beyond restating 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 (fetch) and resource (full Markdown body of a docs page) plus the retrieval key (slug). An agent can immediately distinguish this from search_docs (search) and list_docs (enumerate) 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 positions itself in a workflow: 'Use this after search_docs when the user needs the complete content of a page,' which names the alternative and the condition that selects this tool. It does not mention list_docs as the other plausible sibling, so it stops just short of exhaustive routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docsList ZeroWidth docs pagesARead-onlyInspect
Enumerate all available docs pages, optionally filtered by product (e.g. 'compass', 'legal', 'overview'). Use this to discover what slugs exist before calling get_doc. No authentication required.
| Name | Required | Description | Default |
|---|---|---|---|
| product | No | Optional product slug filter (e.g. 'compass', 'legal', 'overview'). |
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 genuinely new context beyond that: 'No authentication required.' It stops short of describing pagination or result shape, but that gap is minor for a simple read.
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, no filler, and the scoping/workflow guidance is front-loaded before the operational note about authentication.
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 tell the agent what it will get conceptually (available pages, their slugs) and how it fits with get_doc. It omits return fields and pagination behavior, which an agent might want, but nothing prevents 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% and the single optional 'product' parameter is already documented with the same example values in the schema. The description repeats the filter semantics and examples rather than adding new 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 ('Enumerate all available docs pages') with scope and an optional filter named upfront. It is clearly distinguishable from sibling reads like get_doc, list_posts, and search_docs.
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 states the use case: 'discover what slugs exist before calling get_doc', which gives the agent a concrete workflow position. It names one downstream sibling but does not contrast against search_docs, which is the closest overlapping discovery tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_boards_createCreate a Napkin boardAInspect
Creates a blank Napkin board — a sketch (free canvas) or a deck (slides). NOT for written documents: 'draft/write a doc, note, memo' is napkin_docs_create. Use when the user asks for one, or proactively when a sketch/deck would carry the conversation better than words; hand it over with [[board:ID]] alone on its own line. For a deck with content, prefer napkin_deck_write (one call, whole deck).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Defaults to "sketch". | |
| name | Yes | Board name. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly=false, destructive=false, openWorld=false). The description adds genuinely non-structured behavior: that the board is created blank, the hand-off convention (`[[board:ID]]` alone on its own line), and the preference to use napkin_deck_write when content exists. It doesn't discuss rate limits or the response shape, so it stops 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?
Front-loaded with the core purpose, then routing, then usage, then hand-off syntax. Dense but every clause (the doc exclusion, the proactive trigger, the deck_write alternative, the `[[board:ID]]` format) 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?
A create tool with no output schema and full param coverage needs only purpose, sibling routing, and invocation convention — all present. An agent has everything required to call it correctly and to hand the result back.
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 kind, name, and workspace (including the token/default-workspace rule). The description's mention of sketch/deck merely restates the kind enum, adding no syntax or format detail beyond structured data. 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 ('Creates a blank Napkin board') and immediately scopes it to the two kinds (sketch/deck). It also explicitly excludes the closest-looking sibling, napkin_docs_create, so an agent can distinguish it 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 asks, or proactively when a sketch/deck carries the conversation better) plus when-not (written documents → napkin_docs_create) and a named alternative for a specific case (napkin_deck_write for a deck with content). 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.
napkin_boards_getRead a Napkin board's shapesARead-onlyInspect
Returns a board's shapes as data — each with its id, kind, position, size, and text — so you can TARGET one to change or remove with napkin_draw (updates / deletes take these ids and absolute board coordinates). Pen strokes come back as a point count, not the points. For what the board LOOKS like, use napkin_boards_view instead. Board ids come from napkin_boards_list.
| Name | Required | Description | Default |
|---|---|---|---|
| boardId | Yes | Napkin board id (from napkin_boards_list). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only safety, but the description adds real behavioral detail: the exact return fields (id, kind, position, size, text) and the limitation that pen strokes come back as a point count rather than points. It omits things like result size limits or error behavior, so it falls 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?
Three tightly packed sentences, front-loaded with the purpose and return shape, then the pen-stroke caveat and sibling routing. No wasted words.
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 describing the returned shape fields and the pen-stroke truncation; read-only safety is covered by annotations. Nothing needed 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 description coverage is 100%, so both boardId and workspace are already documented, and the description's note that ids come from napkin_boards_list duplicates the schema text. Baseline 3 applies since the description adds no new parameter meaning.
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 ("Returns a board's shapes as data") and enumerates the returned fields, immediately distinguishing it from napkin_boards_view (visual) and napkin_draw (edits). An agent can tell it apart from every 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?
Explicit routing: use this to target a shape for change/removal via napkin_draw, use napkin_boards_view for appearance, and get board ids from napkin_boards_list. Both the when and the when-not alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_boards_listList Napkin sketchesARead-onlyInspect
Lists sketch boards in the active workspace — name, id, kind (sketch / deck), shape count, last activity. Boards are SPATIAL canvases (drawing, diagrams); the markdown DOCUMENTS are docs — napkin_docs_list. Archived boards are hidden unless includeArchived; q narrows by name. When the user mentions a sketch, drawing, whiteboard, or napkin, find it here, then LOOK at it with napkin_boards_view before discussing its contents. When referring the user to a sketch in your reply, put [[board:ID]] alone on its own line — it renders as a clickable card with a live thumbnail.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Name contains (case-insensitive). | |
| kind | No | Only sketches or only decks. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| includeArchived | No | Also list archived boards (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond annotations: archived boards are hidden by default, and the [[board:ID]] citation convention renders a clickable card. This is useful, non-obvious behavior that the schema and annotations do not 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?
Every sentence is front-loaded with high-value information: scope, return fields, sibling disambiguation, filter behavior, and the two-step find-then-view workflow. No filler or repetition.
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 optional parameters with full schema coverage and no output schema, the description supplies the missing behavioral layer: default archiving visibility, the view-before-discussing workflow, and the citation format. An agent can invoke this tool correctly and follow the intended downstream behavior.
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 semantic nuance not captured in the schema: includeArchived reveals hidden archived boards specifically, and q narrows by name. The workspace parameter's default-workspace behavior is left to the schema, which handles it thoroughly.
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 ('Lists sketch boards') and immediately enumerates the returned fields (name, id, kind, shape count, last activity). It explicitly differentiates itself from the sibling napkin_docs_list by contrasting spatial canvases with markdown documents.
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 routing guidance: when the user mentions a sketch, drawing, whiteboard, or napkin, find it here, then view it with napkin_boards_view before discussing contents. It also names napkin_docs_list as the alternative for documents, leaving no ambiguity about when 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.
napkin_boards_updateRename, describe, archive, or share a Napkin boardADestructiveInspect
Edits a board's details: name, description, visibility, or archived (true takes it out of the gallery; false brings it back — the recovery move for a board you created by mistake or the user no longer wants). Board ids come from napkin_boards_list. Boards are working material: no approval card, every change attributed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| boardId | Yes | Napkin board id (from napkin_boards_list). | |
| archived | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| visibility | No | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description adds material context beyond them: it discloses that archiving is reversible ('false brings it back'), which softens the destructive flag, and notes the governance model ('no approval card, every change attributed'). Still silent on auth requirements or rate limits, so not 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?
Three sentences, front-loaded with the verb and the field list, with the operational detail (archive semantics) in the middle and provenance last. The parenthetical about archiving is dense but earns its place; slightly overstuffed for a single tool but no wasted sentences.
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-param mutation with no output schema, the description covers mutation semantics, reversibility, id provenance, and governance. The only gap is the workspace parameter, which the description ignores but the schema documents, so an agent has what it needs to call 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?
At 50% schema coverage the description has to carry weight, and it does: it explains the semantics of name, description, visibility, and archived, plus the id provenance (napkin_boards_list). Only the workspace parameter is left entirely to the schema, so it adds real value over structured fields.
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 (edits) and resource (board details) and enumerates exactly which fields can change: name, description, visibility, archived. This separates it cleanly from the napkin_boards_create/get/list/view siblings without the agent needing to open 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?
Usage is implied rather than stated: the archived-field explanation gives a clear scenario ('recovery move for a board you created by mistake') and 'Board ids come from napkin_boards_list' supplies the prerequisite. But there is no explicit when-to-use/when-not-to-use statement or named alternative tool, so guidance remains inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_boards_viewView a Napkin sketch (rendered image)ARead-onlyInspect
Renders the sketch board to an image and returns it so you can SEE what's drawn — layout, arrows, handwriting-style strokes, sticky notes — not just data about it. Use this before answering any question about a sketch's contents, and cite the board when you do — [[board:ID]] alone on its own line embeds the sketch card in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| boardId | Yes | Napkin board id to render. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds the key non-obvious behavior the schema cannot convey: the tool returns a rendered image (layout, arrows, strokes, sticky notes) rather than structured data, plus the required citation format. It omits render size/latency limits.
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 tight sentences, with the core capability and the 'SEE' contrast front-loaded before the usage and citation guidance. Slightly long due to the embed syntax, but every clause is actionable and nothing is redundant.
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 exactly what comes back (a rendered image of the drawing). Combined with when-to-use and citation guidance, and with safety covered by annotations, an agent has everything needed to call 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?
With 2 parameters at 100% schema description coverage, the schema already fully documents boardId and workspace (including the personal-token workspace requirement). The description alludes to boardId via the [[board:ID]] citation example but adds no new parameter semantics, 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?
The description states a precise verb (renders the board to an image and returns it) and resource (sketch board), and explicitly distinguishes itself from the data-only sibling by saying 'not just data about it.' An agent can tell this apart from napkin_boards_get 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 gives a clear selection rule: 'Use this before answering any question about a sketch's contents,' and adds the citation convention ([[board:ID]]) for replies. It stops short of naming the alternative tool (napkin_boards_get) or stating exclusions, so it is clear context rather than fully explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_brand_add_filesAdd pictures to a brand kitAInspect
Adds pictures to a brand kit section — logo versions, product marks, example screenshots, imagery. Each file comes from a public https url (fetched by the server) or, for a small file that isn't online, base64 data with a filename. PNG, JPEG, WebP, GIF and SVG, up to 20 MB each. Every file becomes a workspace file and an asset on the section, appended after the ones already there. Give each a name and a note saying what it's for; on logo sections set backdrop to the hex of the ground it's made for (#ffffff for a dark logo, #000000 for a reversed one), which is how pages pick the right version. Same rule as napkin_brand_draft: you can change any kit except the workspace's brand. Files that fail are reported and the rest still land.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only when no section has that title yet: the kind of section to make. | |
| files | Yes | ||
| kitId | Yes | The kit to add to (napkin_brand_list). | |
| section | Yes | Title of the section to add them to, like Logo, Imagery or Examples. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnly=false, destructive=false, openWorld=true, the description carries the real behavioral weight: files are appended (not replaced), each becomes both a workspace file and a section asset, failures are reported while the rest still land, and the workspace-brand edit restriction. These are non-obvious side effects and partial-success semantics beyond what annotations state.
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, then formats/limits, then naming and backdrop guidance, then the permission rule and failure behavior. Dense and largely waste-free, though the parenthetical backdrop example and repeated cross-reference make it a touch long for 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 mutating tool with no output schema, the definition covers inputs, limits, side effects, permission constraints, and partial-failure reporting. It omits the auto-create-section behavior of the kind parameter (left entirely to the schema), a minor 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 coverage is 80%, so the schema already documents most parameters. The description still adds meaning: url is server-fetched, data is base64 for offline small files, and backdrop is explained functionally ('how pages pick the right version') rather than just as a hex pattern. The kind/auto-create-section parameter is left to the schema, keeping this at 4.
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 ('Adds pictures to a brand kit section') and immediately enumerates the concrete sub-cases (logo versions, product marks, screenshots, imagery). An agent can distinguish this from sibling napkin_brand_fonts/napkin_brand_draft 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 clear operating context: which source forms are valid, size/format limits, and an explicit constraint ('you can change any kit except the workspace's brand'), cross-referenced to napkin_brand_draft for the shared rule. It does not name an explicit 'use X instead' alternative, so it falls 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.
napkin_brand_applyApply the brand to a pieceADestructiveInspect
Restyles a piece in the brand — the workspace's brand unless you name a kit. deck (a board id): every slide gets the brand's background, typefaces, and text colors; sizes are kept. interface (an interface id): rewrites its brand.css, so anything styled with var(--brand-*) updates. accent makes one of the kit's colors the piece's accent — use it when the piece is about one product or campaign that has its own color in the brand (read the kit's Colors section to see which). Docs need nothing — they read the brand when exported. Check a deck afterwards with napkin_slide_view.
| Name | Required | Description | Default |
|---|---|---|---|
| deck | No | Board id of a deck. | |
| kitId | No | A brand kit id from napkin_brand_list. Omit for the workspace's brand. | |
| accent | No | Name of one of the kit's colors to use as this piece's accent. | |
| interface | No | Interface id. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, but the description goes well past them: it specifies what actually changes per mode (every slide's background, typefaces, text colors), what is preserved (sizes are kept), and the mechanism for interfaces (rewrites brand.css so var(--brand-*) consumers update). That is exactly the kind of mutation-scope detail the 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?
Purpose is front-loaded in the opening clause, then each sentence maps to one mode and one actionable instruction. Dense but every clause carries information; no restating of the name or 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 carries return-value burden lightly and appropriately (it points to napkin_slide_view for verification instead). For a 5-parameter, zero-required-parameter tool with three behavioral modes, the only gap is what happens when no target is supplied or when multiple mode parameters are combined.
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 nonetheless adds meaning beyond the schema: it explains that omitting kitId yields the workspace brand, that deck takes a board id, and — most valuably — the semantic selection rule for `accent`. It does not clarify whether deck and interface are mutually exclusive, which keeps 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 specific verb and resource (restyles a piece in the brand) and then disambiguates the three target types — deck, interface, accent — with concrete effects for each. An agent can tell exactly what the tool does and how it differs from siblings like napkin_deck_set_theme or napkin_interfaces_write.
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 gives the condition for using `accent` (piece is about one product/campaign with its own brand color, and tells you to read the kit's Colors section), states a when-not case (docs need nothing because they read the brand at export), and names a verification follow-up (napkin_slide_view). This is the rare case of explicit when/when-not/next-step guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_brand_checkCheck writing against the brandARead-onlyInspect
Finds words the brand says to avoid in a piece of writing, with what to say instead and why. Pass text, or a deck (boardId) or doc (docId) to check its words. Run it on your own drafts before handing them back.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Text to check. | |
| docId | No | A doc to check. | |
| kitId | No | A brand kit id from napkin_brand_list. Omit for the workspace's brand. | |
| boardId | No | A deck or sketch to check. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real value beyond that by disclosing what the operation returns ('what to say instead and why'), which matters because there is no output schema, and by pointing to which inputs select which target. It says nothing about rate limits, empty-brand behavior, or result size limits.
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, no filler, with the core purpose front-loaded before the input options and the usage nudge. Every sentence carries distinct 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?
Read-only safety comes from annotations, source selection and return content come from the description, and all five parameters are documented in the schema; with no output schema, the description's note about returning the offending words plus replacements and rationale fills the remaining gap. An agent has enough 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 a relationship the schema cannot express: that text, boardId, and docId are alternative ways to supply the content to check (the schema merely lists all five as optional with no exclusivity). It does not clarify kitId or workspace, which the schema already documents.
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: 'Finds words the brand says to avoid in a piece of writing', and it clarifies the return payload (what to say instead and why). This is clearly distinguishable from siblings like napkin_brand_get, napkin_brand_list, or napkin_brand_apply.
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 usage occasion: 'Run it on your own drafts before handing them back', which tells the agent when to reach for this tool. It does not name explicit alternatives (e.g., versus another review/check tool) or state when not to use it, so it falls 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.
napkin_brand_draftDraft a brand kitADestructiveInspect
Creates a new brand kit, or edits one that is NOT the workspace's brand. Use it when someone asks you to put their brand together (from their site, a deck, or what they tell you) or to try a variation. You can't change the workspace's brand itself — make a draft and tell the user they can choose it in Napkin's Brand section. A kit is a document of sections, each with title, kind (overview, voice, colors, typography, logo, imagery, motion, layout, examples, custom), markdown body, and rules ({rule, why}); colors sections hold swatches ({name, value: 6-digit hex, note}), typography sections hold faces ({name: what it's for, family: a font name or sans / serif / mono / rounded / marker, note}), voice sections hold use and avoid ({term, instead, why}), and any section can hold assets ({fileId: an image already in the workspace's files, name, note, backdrop: hex}) — logo versions, example images — and links ({url, title, note}). An examples section holds work that gets the brand right: screenshots as assets and pages as links, each with a note on what makes it good. Exact numbers (timings, spacing) go in the section's prose. New kits start with empty standard sections plus the workspace's colors. content.sections upserts by title (or id): fields you pass replace, lists inside replace, sections you don't mention are kept; removeSections drops by title. content.uses says how Napkin uses the brand — color roles (ink, muted, background, surface, accent, accent2) and fonts (heading, body, mono) — by swatch or face NAME. Give every rule a why: the reason is what lets people decide cases the rule doesn't cover.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| kitId | No | Kit to edit. Omit to create a new kit. | |
| content | No | ||
| fromKitId | No | New kits only: start from this kit's values. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=true), the description discloses the upsert contract in detail: 'fields you pass replace, lists inside replace, sections you don't mention are kept; removeSections drops by title,' plus new-kit defaults ('empty standard sections plus the workspace's colors'). This is exactly the mutation semantics an agent needs to avoid clobbering data.
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 information is mostly load-bearing for a deeply nested schema, but it is delivered as one dense, unbroken paragraph that mixes usage, data model, and upsert semantics. Front-loading is good, yet the wall-of-text formatting hurts scannability.
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 nested-object tool with no output schema, the description is largely complete: it covers creation/editing rules, defaults, section kinds, and destruction semantics. Gaps remain around the top-level name/description/fromKitId parameters and any return shape, but the core invocation contract is 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?
With only 50% schema description coverage, the description compensates well by explaining the section data model (title/kind/body/rules, swatches, faces, use/avoid, assets, links), the hex format, and how content.sections/uses/removeSections behave. It omits meaning for name, description, and fromKitId, which the schema only partially covers.
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 pairing, 'Creates a new brand kit, or edits one that is NOT the workspace's brand,' which immediately scopes it apart from the other napkin_brand_* siblings (get, list, apply, view). An agent can tell this is the drafting/mutation tool 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?
It gives explicit trigger conditions — 'Use it when someone asks you to put their brand together (from their site, a deck, or what they tell you) or to try a variation' — and states a clear negative boundary plus the workaround for the workspace brand. It stops short of naming the alternative tool (e.g. napkin_brand_apply) by name, so routing 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.
napkin_brand_examplesLook at the brand's examplesARead-onlyInspect
Shows you the pictures in a kit's Examples sections — screenshots of work that gets the brand right — with each one's note on what makes it good, plus the example links. Look before you design a deck, page or interface in the brand, and hold your work to the same bar: the layouts, density, type sizes and use of color you see there.
| Name | Required | Description | Default |
|---|---|---|---|
| kitId | No | Kit to look at. Omit for the workspace's brand. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
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 adds real value beyond that by disclosing what the return contains — screenshots, per-example notes on what makes them good, and the example links — which is meaningful behavioral context. It says nothing about count limits or pagination, keeping it below 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 with the core action front-loaded in the first. The second sentence is longer and prescriptive but does earn its place by conveying the intended workflow. Slightly verbose in its closing clause, but 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 read-only, two-optional-parameter tool with no output schema, the description covers what it returns (images, notes, links) and when to use it. The main omission is any indication of volume/pagination behavior, but otherwise an agent has enough 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 both kitId and workspace are already fully documented (including the 'omit for workspace brand' and token rules). The description adds no parameter-level meaning beyond that, making the baseline 3 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?
The description states a specific verb and resource — it shows the pictures inside a kit's Examples sections, along with each one's note and links — which is concrete and distinguishable from general brand tools. It does not, however, name or explicitly contrast itself with the nearby siblings (napkin_brand_get, napkin_brand_view, napkin_brand_fonts), so differentiation is inferred rather than stated.
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 clear when-to-use guidance: 'Look before you design a deck, page or interface in the brand.' That is a strong contextual cue. It stops short of any when-not or named-alternative routing (e.g. when to use brand_get instead), so it is a clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_brand_fontsGet a brand's font filesAInspect
Gets the font files for a kit's typefaces from Google Fonts and keeps them in the kit, so decks, slide pictures and the canvas draw the brand's real typefaces instead of a stand-in. Only typefaces that name a family (like Poppins) and don't have files yet are fetched. Works on any kit, including the workspace's brand: it adds the files for the typefaces the kit already names and changes nothing else. A typeface Google doesn't have is reported back; the user can upload its files in the kit's typography section.
| Name | Required | Description | Default |
|---|---|---|---|
| kitId | No | Kit to fetch fonts for. Omit for the workspace's brand. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag readOnlyHint=false and openWorldHint=true; the description independently supplies useful behavior beyond them: it fetches externally from Google Fonts, stores the files in the kit, is idempotent ('only typefaces ... that don't have files yet are fetched'), is non-destructive ('changes nothing else'), and reports missing typefaces. Missing only details like failure/rate-limit 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?
Purpose is front-loaded in the first sentence, with supporting constraints following. Four sentences are mostly earned (idempotency, scope, error handling), though the phrasing is somewhat wordy and 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 mutating, externally-calling tool with no output schema, the description covers what it writes, what it leaves untouched, and what happens on failure. The main gaps (return shape, failure modes) are minor given annotations carry the safety profile and no output schema is declared.
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 kitId and workspace, including that omitting kitId targets the workspace's brand. The description's line about working on any kit adds context but no syntax or format detail beyond the schema, so the 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?
Specific verb (gets/fetches font files) plus resource (a kit's typefaces from Google Fonts) and scope (adds files for typefaces the kit already names). It is distinguishable from neighbors like napkin_brand_add_files (manual upload) and napkin_brand_get (reads brand data), so an agent can route correctly 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 clear context for when the tool applies: it fetches only typefaces that name a family (e.g. Poppins) and lack files, on any kit including the workspace's brand, and reports typefaces Google doesn't have so the user can upload them. It never explicitly names a sibling tool to prefer, so no exclusions are stated – clear context but no alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_brand_getRead the brandARead-onlyInspect
Reads a brand kit — the workspace's brand unless you name another. READ THIS BEFORE writing or designing anything for the workspace: a deck, a doc, an interface, copy. Returns brief (the whole kit as markdown: every section — overview, voice, colors, typography, imagery, motion, and whatever else the team wrote — with the reason behind each rule; follow the reasons when a case isn't covered), css (the --brand-* variables; interfaces already link it as brand.css, so style with var(--brand-accent) etc. rather than hex values), and tokens (the resolved values Napkin uses). Before any kit exists it returns values from the workspace's colors with kit: null.
| Name | Required | Description | Default |
|---|---|---|---|
| kitId | No | A brand kit id from napkin_brand_list. Omit for the workspace's brand. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic read-only/closed-world profile. The description adds real behavioral context: the three return sections (brief, css, tokens), the fact that interfaces already link css as brand.css so callers should use var(--brand-*) rather than hex, that the brief carries the reasons behind each rule, and that before any kit exists it returns workspace colors with kit: null. That is meaningful disclosure beyond 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, then the when-to-use directive, then the return breakdown, so the important material leads. It is dense and packs several ideas into one sentence, but with no output schema each clause carries information an agent needs, so little is wasted.
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 and only two optional parameters, the description carries the burden of describing returns and does so thoroughly: the three fields, their shapes (markdown brief, --brand-* variables, resolved tokens), the consumer convention for css, and the no-kit fallback with kit: null. An agent has enough to call it 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 description coverage is 100%, so the schema already documents both kitId (sourced from napkin_brand_list, omit for workspace brand) and workspace (slug, required for personal tokens without a default, ignored for API keys). The description's 'unless you name another' largely restates the kitId default rather than adding format or constraint detail, 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 gives a specific verb and resource ('Reads a brand kit') plus a clear default scope ('the workspace's brand unless you name another'), and it routes to napkin_brand_list as the source of kitId. It does not, however, distinguish itself from sibling napkin_brand_view, which could plausibly also read a brand, leaving one ambiguity unresolved.
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 stated forcefully and concretely: 'READ THIS BEFORE writing or designing anything for the workspace: a deck, a doc, an interface, copy.' It also names napkin_brand_list as the way to obtain a kitId. It stops short of stating when not to call it (e.g., when the brief is already in context), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_brand_listList brand kitsARead-onlyInspect
Lists the workspace's brand kits: id, name, description, and which one is the workspace's brand (isDefault). Most workspaces have one. Use napkin_brand_get to read a kit.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
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 safety is covered. The description adds real context beyond them with the cardinality note ('Most workspaces have one'), which tells the agent not to expect a paginated multi-page result or a large collection. It does not mention pagination or ordering, but that gap is minor given the safety 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?
Two short sentences, zero filler, front-loaded with what is returned and followed immediately by the sibling pointer. Every clause carries 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?
There is no output schema, and the description compensates by naming the exact fields returned (id, name, description, isDefault), so the agent knows the response shape. With one fully documented optional parameter and full annotation coverage, nothing needed 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 description coverage is 100% and the workspace parameter's description already explains the slug semantics, token defaults and the API-key exception in detail. The description adds no parameter-level meaning beyond that, so the baseline 3 for a fully documented schema 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 (Lists) plus resource (workspace's brand kits) and enumerates the returned fields (id, name, description, isDefault). It also distinguishes itself from the sibling napkin_brand_get, 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?
Explicitly routes the agent to napkin_brand_get for reading a single kit, giving a clear use-vs-alternative boundary. It stops short of stating when a brand kit listing is or isn't the right call (e.g. to discover a brand before applying it), so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_brand_viewLook at a brand's picturesARead-onlyInspect
Look at the pictures in a brand kit — logos, product marks, footage stills, layout references, examples — before you use them. Without section or names it lists every picture by section with its note, so you know what exists. With section (a section title, like Imagery) or names (pictures' names as the brief lists them) it shows you those pictures, up to 8 at a time. Look before you build a design around a picture: whether a photo has room for text, which part of it carries the color, and whether it suits texture inside type are things you can only tell by seeing it.
| Name | Required | Description | Default |
|---|---|---|---|
| kitId | No | A kit from napkin_brand_list. Omit for the workspace's brand. | |
| names | No | Show these pictures, by name. | |
| section | No | Show the pictures in this section. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds genuinely useful behavior beyond that, namely that the no-argument form enumerates every picture by section along with its note, and that a targeted call returns at most 8 at a time. It says nothing about auth or workspace/token handling, so it is not complete enough for 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 list-vs-show mechanics are front-loaded, and the closing rationale about checking whether a photo has room for text or is suited to texture inside type earns its place as decision guidance. The three sentences are dense but not padded, though they could be tightened 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?
For a read-only viewer with no output schema and four fully documented params, the description supplies what an agent needs: what is returned (pictures by section with notes), how to filter, and the 8-per-call limit. It omits any mention of kitId/workspace resolution, a minor gap given those live in the 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 the baseline is 3, but the description adds real meaning: section is a section title ("like Imagery"), names are the picture names "as the brief lists them," and the two modes have distinct list-vs-show behavior with an 8-item cap. kitId and workspace are left to the schema, which is acceptable since both are already documented there.
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 (look at) and a well-enumerated resource (logos, product marks, footage stills, layout references, examples in a brand kit), so the agent knows exactly what object it retrieves. It does not explicitly contrast itself with nearby siblings such as napkin_brand_get, napkin_brand_fonts, or napkin_brand_examples, which keeps it 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?
Gives clear when-to-use framing ("before you use them", "Look before you build a design around a picture") and explains the two invocation modes: no section/names lists everything by section with notes; section or names shows specific pictures. It never names an alternative tool or an exclusion case, so it stops at 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_deck_composeBuild a designed deckADestructiveInspect
Builds a designed deck: each slide is a layout with its slots filled, or HTML and CSS you write; a real browser lays it out, and it becomes an ordinary Napkin deck people can edit. Use this whenever a deck should look designed — it's how to get layout, big numbers, color blocks, and pictures right.
LAYOUTS FIRST
For ads, posts, carousels and title slides, start from a layout (napkin_layouts_list): give
layoutandslotsinstead ofhtml. Layouts adapt to every size, fit their text, keep to each size's safe zones, and use the brand's own logos. A slide made from a layout remembers it, so when someone resizes it, it's laid out again instead of scaled.A set of ads is one slide with
sizes: ["1:1","4:5","9:16","1.91:1"] — each size gets its own arrangement.Write HTML only for something no layout does.
HOW TO WRITE A SLIDE
htmlis the inside of one slide: a.slidebox 960×540 px (the deck's own size if it has one). Margins are reset; lay out with flexbox or grid, padding and gap. Put each slide's CSS in a block inside its html, or shared CSS incss.Read the brand first (napkin_brand_get). Style ONLY with its variables: var(--brand-ink), var(--brand-muted), var(--brand-background), var(--brand-surface), var(--brand-accent), var(--brand-accent-2), var(--brand-color-), var(--brand-font-heading), var(--brand-font-body), var(--brand-radius). Headings already use the heading face.
Pictures from the brand kit: , sized with CSS; object-fit: cover crops to fill, contain fits whole. Any workspace image: src="file:".
What carries over: boxes with a solid background, border, and rounded corners; text, including bold, italic, color, and size changes inside a line; pictures. What doesn't: gradients, shadows, background images, inline SVG — use solid color boxes instead.
Design like a designer: one idea per slide, a clear hierarchy, big numbers set large in the accent color, generous space, text 18px or larger (never under 14px), and something visual on most slides — a color panel, a photo, the logo. Keep every slide on the brand's own palette and voice.
Use the brand's own pictures. Put the logo on the title and closing slides (the reversed one on dark color), and use the kit's photos and icons where they carry the point — the brief lists every file under "Files", by name.
Say only what's true. Facts, figures, prices, eligibility, and how things work come from the brand kit and from what the user told you — never invent them. When a slide needs a fact you don't have, leave it out or ask.
HOW TO USE IT
New deck: pass
nameand allslides. Rebuild a deck: passboardIdand allslides(replaces everything on it).Ads, posts and other non-slide pieces: pass
size— a key like1:1(square post, 1080×1080),4:5(portrait post),9:16(story or reel),1.91:1(LinkedIn or Facebook landscape),og(link preview),300x250or728x90(display ads). The.slidebox is then that shape with its long side 960 px, so type sizes mean what they do on a slide, and the deck exports at the size's real pixels. A single ad is a one-slide deck; a carousel is a deck at1:1or4:5.A set of ads — the same ad at several sizes, or several headlines — is one deck: give each slide its own
size. Lay each size out for its own shape rather than squeezing one layout into all of them (a 9:16 story stacks what a 1.91:1 landscape puts side by side), and keep text out of the outer 7% of every edge and the top and bottom 14% of a 9:16. The deck's PNG export names each file by its pixels. Fix one slide:boardId,slide(1-based), and a single slide. Add slides:append: true.The result lists each slide's
warnings— text that overflows its box or the slide, overlapping text, text too small, low contrast, pictures that didn't load — and shows you a picture of every slide it made. Fix every warning and anything that reads badly in the pictures by recomposing just that slide. The contrast check is the standard one (4.5:1 for small text, 3:1 for large or bold text), so a contrast warning is real: darken the color, lighten the background, or set the text larger; never explain it away. You don't need napkin_slide_view afterwards: the pictures are the slides.Cite the deck with [[board:ID]] alone on its own line.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | CSS shared by every slide. | |
| name | No | Name for a new deck. | |
| size | No | The size of every slide, for a new deck or a whole rebuild: 16:9 = Widescreen slide 1920×1080; 16:10 = 16:10 slide 1920×1200; 4:3 = Standard slide 1024×768; 1:1 = Square 1080×1080; 4:5 = Portrait post 1080×1350; 9:16 = Story and reel 1080×1920; 1.91:1 = Landscape post 1200×628; x-post = X post 1600×900; og = Link preview 1200×630; pin = Pin 1000×1500; youtube-thumb = YouTube thumbnail 1280×720; linkedin-page = LinkedIn page cover 1128×191; linkedin-profile = LinkedIn profile banner 1584×396; x-header = X header 1500×500; youtube-banner = YouTube channel banner 2560×1440; facebook-cover = Facebook cover 851×315; 300x250 = Medium rectangle 300×250; 336x280 = Large rectangle 336×280; 728x90 = Leaderboard 728×90; 970x250 = Billboard 970×250; 300x600 = Half page 300×600; 160x600 = Wide skyscraper 160×600; 320x50 = Mobile banner 320×50; 320x100 = Large mobile banner 320×100; email-header = Email header 600×200; letter = Letter page 2550×3300; a4 = A4 page 2480×3508. Omit for a 16:9 deck or to keep a deck's size. | |
| slide | No | Replace just this slide (1-based) with the one slide given. | |
| accent | No | Name of one of the brand's colors to use as var(--brand-accent) for this deck — for a deck about one product or campaign that has its own color in the brand. | |
| append | No | Add these slides after the existing ones. | |
| slides | Yes | ||
| boardId | No | Deck to rebuild or change. Omit to make a new deck. | |
| previews | No | Default true: the result includes a picture of every slide made. Pass false to skip the pictures — the call returns sooner, which helps with long decks; look at slides afterwards with napkin_slide_view. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the destructive path directly: passing boardId with slides 'replaces everything on it', which matches destructiveHint=true, and it explains the response shape (per-slide warnings plus a rendered picture of every slide) despite no output schema. It does not cover permission requirements or what happens to a deck's prior theme/notes on rebuild, but the main mutating risk is stated plainly.
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 content is front-loaded and sectioned (LAYOUTS FIRST, HOW TO WRITE A SLIDE, HOW TO USE IT), and the operational facts each earn their place. Some prescriptive design advice — 'design like a designer,' palette and font-size coaching — is quality guidance rather than invocation guidance and stretches an already long definition.
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 composition tool with no output schema, the description covers everything an agent needs: sizing model, layout vs HTML, brand variables and image references, destructive rebuild semantics, warning remediation, and the [[board:ID]] citation convention. The remaining gap is only the absence of a formal return schema, which the prose compensates for.
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 90%, yet the description still adds real meaning: layout-vs-html exclusivity, `sizes` producing one arrangement per size, `slide` being 1-based for a single-slide recompose, `append` for adding, and worked examples of size keys and their pixel implications. The slots contract (kit: vs file: references, `points` one item per line) is also explained in prose.
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 names a concrete verb and artifact ('Builds a designed deck') and immediately defines the two composition modes: a layout with filled slots, or HTML/CSS the caller writes, rendered by a real browser into an editable Napkin deck. That is enough to separate it from the plain drafting/editing siblings like napkin_deck_write or napkin_slide_add, which do not claim designed rendering.
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 between alternatives and modes: start from a layout (napkin_layouts_list) for ads/posts/title slides, write HTML only when no layout fits, and it lists the exact call patterns for new deck, full rebuild, single-slide fix, and append. It also sets the threshold for when a size-specific variant should be used instead of one squeezed layout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_deck_exportExport a deck as imagesAInspect
Exports a deck's slides as PNG files at each slide's real pixels — a square post at 1080×1080, a story at 1080×1920, a leaderboard at 728×90 — ready to upload to an ad platform or a social post. One slide comes back as a PNG; several as a .zip named by deck, slide and size. Hidden slides are left out. The file is saved to the workspace's files; give the user downloadUrl (it opens for anyone signed in to the workspace) and say it's also in their files. Slide numbers and the workspace mark aren't drawn. For a PDF or PowerPoint, the user exports from the deck's File menu.
| Name | Required | Description | Default |
|---|---|---|---|
| slides | No | Just these slides (1-based, as the deck shows them). Omit for every slide. | |
| boardId | Yes | The deck to export. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly=false, destructive=false, openWorld=false, so the description must add substance — and it does: it explains hidden slides are excluded, slide numbers and watermark aren't drawn, units are real pixels per layout, and the result is saved to workspace files vs returned as a download. That's meaningful behavioral detail beyond 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?
Five tight sentences, each earning its place: output format/resolution, single vs multi behavior, hidden-slide rule, where the file lives, and the PDF/PPT exclusion. Front-loaded with the primary purpose.
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?
Complete for a 3-parameter export tool with no output schema: it covers output type, size/dimensions, file count behavior, storage location, download URL semantics, and the alternative for other formats. Nothing critical 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 baseline is 3. The description adds meaning: slide numbers are '1-based, as the deck shows them' and omitted = every slide, and constrains the range for ad-unit use (post/story/leaderboard sizes). It also implies boardId semantics. Slightly 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 (exports) and resource (a deck's slides) and output format (PNG files). Distinct from napkin_deck_outline/napkin_deck_compose siblings, and it explicitly clarifies it is image export, not PDF/PPT, routing to the File menu for those.
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 states when NOT to use it: 'For a PDF or PowerPoint, the user exports from the deck's File menu.' It also pre-empts outputs (what a single vs multiple slide result looks like) with concrete conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_deck_outlineRead a deck's outline (markdown)ARead-onlyInspect
Returns a Napkin deck as a markdown outline — one section per slide in presentation order, with slide titles, text content (bold + bullets preserved), empty layout stubs still awaiting content, and a summary of drawn marks. This is the cheap way to know what a deck SAYS; use napkin_slide_view when you need to see how a specific slide LOOKS. Works on any board that has slides. Cite the deck with [[board:ID]] alone on its own line.
| Name | Required | Description | Default |
|---|---|---|---|
| boardId | Yes | Napkin board id (a deck). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
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 safety is covered. The description adds real behavioral value beyond that: the output shape (one section per slide, presentation order), the presence of empty layout stubs, and the `[[board:ID]]` citation requirement. It omits return-size/pagination behavior, keeping 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?
Three front-loaded sentences ordered by importance: what it returns, when to use it vs the alternative, then the citation convention. Dense but every clause earns its place; 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?
A read-only tool with no output schema, so the description carries the burden of describing the return value, which it does thoroughly (sections, titles, formatting, stubs, marks summary). The only gap is absence of any note on sizing or ordering guarantees beyond 'presentation order', which is minor.
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 `boardId` and `workspace` are documented in the schema itself, including the workspace-default nuance for personal tokens. The description adds nothing about parameter meaning or format, 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 ('Returns a Napkin deck as a markdown outline') and enumerates the exact content the outline contains (slide titles, bold+bullets, empty layout stubs, drawn-mark summary). It explicitly distinguishes itself from sibling `napkin_slide_view`, so an agent can pick it 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 routing: 'the cheap way to know what a deck SAYS; use `napkin_slide_view` when you need to see how a specific slide LOOKS.' Also states the applicability precondition ('Works on any board that has slides') and the citation convention. 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.
napkin_deck_set_themeSet a deck's themeADestructiveInspect
Paints every slide of a deck with a theme — slide background, heading and body typefaces, and text colors — in one call, the same as picking it in the deck's theme menu. Font sizes are kept. Prefer "brand" (the workspace's own brand kit) unless the user asks for something else. Built-in themes: plain (Helvetica on white. Gets out of the way.); editorial (Garamond headings on cream. Reads like a document.); stage (Helvetica, light on dark, for a projected room.); blueprint (Consolas headings on mist. For technical decks.); warm (Rounded on amber. Softer than it sounds.); notebook (Marker headings. Keeps the sketchbook feel.). For one-off colors or sizes on a single shape, use napkin_draw's updates instead. Check the result with napkin_slide_view.
| Name | Required | Description | Default |
|---|---|---|---|
| theme | Yes | `brand` for the workspace's brand kit, `brand:<kit id>` for a particular kit (napkin_brand_list), or a built-in theme key. | |
| accent | No | Brand themes only: the name of one of the kit's colors to use as this deck's accent instead of the kit's own — for a deck about one product or campaign that has its own color in the brand. | |
| boardId | Yes | Napkin board id (a deck). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as a non-read-only, destructive mutation, and the description corroborates by saying it repaints every slide in one call. It adds a genuinely useful preservation rule ('Font sizes are kept') and a verification tip (napkin_slide_view). However it never states explicitly that existing per-slide customizations beyond font size are overwritten.
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 before the theme catalog, and the catalog is justified because the schema carries no enum. The parenthetical character notes ('Gets out of the way', 'Softer than it sounds') are slightly decorative, but each still helps a model pick a theme, so waste is minimal.
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, annotation-covered mutation with a fully documented schema and no output schema, the description supplies everything needed: scope of change, what is preserved, the full theme vocabulary, defaults, alternatives, and how to verify 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 the baseline is 3, but the description adds real value the schema lacks: it enumerates the six built-in theme keys (the schema exposes no enum and only says 'a built-in theme key') and explains the brand/brand:<kit> distinction and the accent concept. That is meaningful beyond the structured fields.
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 ('Paints every slide of a deck with a theme') and enumerates exactly what changes: slide background, heading/body typefaces, and text colors. It also distinguishes itself from siblings by pointing to napkin_draw for one-off shape edits, so an agent can tell it apart from the other napkin_* tools.
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 default ('Prefer "brand" ... unless the user asks for something else'), names the alternative for a different job ('For one-off colors or sizes on a single shape, use napkin_draw's `updates` instead'), and points to napkin_slide_view to verify. 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.
napkin_deck_writeWrite a whole deck from a markdown outlineAInspect
Creates a deck from a markdown outline — the SAME dialect napkin_deck_outline reads back, so any deck you've read shows the format. Decks are SLIDES for presenting; a prose document ('write this up', 'draft a doc') is napkin_docs_create instead. Rules: ## Heading starts a slide (heading becomes the slide title and its biggest text block); optional trailing [layout: title | section | title-body | title-lead | two-column | three-column | comparison | statement | quote | closing | blank]; body lines fill the layout's remaining text areas in order, split into areas by a line containing only ---; - bullets are kept as bullets. Slides default to title-body (or title, when bodyless). Layout text areas you don't fill stay as visible prompts for the user. Example:
Q3 Review [layout: title]
What happened, what's next
Revenue [layout: title-body]
up 40% QoQ
churn flat
Bets [layout: two-column]
Double down on decks
Sunset legacy plans
After writing, cite the deck with [[board:ID]] alone on its own line — the user opens it from there.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Deck name. | |
| outline | Yes | The markdown outline (dialect above). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), and the description adds real behavioral detail beyond them: defaults to title-body/title layouts, unfilled layout areas remain as visible user prompts, and the board-citation convention. It does not say whether reusing an existing deck name overwrites or errors, which is a meaningful omission for a write 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?
Long, but front-loaded with purpose and the doc-vs-deck fork, then rules, then a worked example. The example and layout list justify their length given the non-obvious dialect, though the rules block is dense enough that a reader must parse carefully.
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, yet the description closes the loop by telling the agent how to surface the created deck ([[board:ID]]), and the required/optional parameter split is clear. Nothing essential for a correct call 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 goes further by fully specifying the outline's mini-language (slide delimiters, layout options, area splitting, bullet handling) that the schema only gestures at as 'the markdown outline (dialect above)'. It adds genuine meaning over the structured fields.
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 ('creates a deck from a markdown outline') and immediately distinguishes itself from siblings: it is the writing counterpart to napkin_deck_outline and explicitly not napkin_docs_create. An agent can route correctly 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 and when-NOT-to-use guidance: decks vs prose documents ('write this up' → napkin_docs_create), and states that the outline dialect matches the reader tool. It even specifies the post-write step of citing the deck with [[board:ID] on its own line.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_diagrams_createCreate a Napkin diagramAInspect
Create a Napkin diagram — an interactive FLOWCHART (process, decision tree, system map), not a doc (napkin_docs_create) or drawing canvas (napkin_boards_create). Pass the mermaid source. Use for process maps the user asked you to draw. After creating, cite it as [[diagram:ID]] alone on its own line — it renders as a clickable card. NEVER cite it as [[board:ID]].
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| source | No | Mermaid flowchart source. Start with `flowchart TD` (top-down) or `flowchart LR` (left-right). Declare shaped nodes — `A["Rect"]`, `B("Rounded")`, `C{"Decision"}`, `D(["Stadium"])`, `E(("Circle"))`, `F{{"Hexagon"}}` — and link them with `A -->|label| B`, `A -.-> B` (dotted), or `A ==> B` (thick). Group steps with `subgraph Name["Title"] ... end`. Color a node with a trailing `style A fill:#fee2e2` line. Only the flowchart subset is supported. Each label is a short name on one line, written plainly: no `\n`, no backslashes before quotes. A step's label is its name everywhere in Compass. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the write/non-destructive profile is covered. The description adds genuinely non-obvious behavioral context: the mermaid-only input expectation and the post-creation citation protocol (cite as [[diagram:ID]] on its own line, never as [[board:ID]]). It stops short of stating auth/workspace requirements beyond what the schema already notes.
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?
Roughly four tight sentences, front-loaded with the identity/exclusion before the input format and the post-create citation rule. No filler or repeated annotation data.
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, but the description reveals the artifact's identity (the returned ID) via the citation format, so the agent knows what comes back. With 0 required parameters the tool is tolerant, and schema handles the input format; only a note on auth/workspace defaults 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 67%; the 'source' parameter carries a rich schema description covering node shapes, link syntax, subgraphs and styling, and 'workspace' documents token behavior. The description only says 'Pass the mermaid source', adding a pointer rather than new semantics, and 'title' stays undocumented in both places. Baseline 3 for a schema doing most of the work.
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, then pins down the artifact type ('interactive FLOWCHART — process, decision tree, system map') and explicitly names the two siblings it is not (napkin_docs_create, napkin_boards_create). An agent can distinguish it from every other napkin_* create tool 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 a positive trigger ('Use for process maps the user asked you to draw') and explicit exclusions routed to alternatives by name. Nothing about when to pick this over the doc/board create tools 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.
napkin_diagrams_getRead a Napkin diagramARead-onlyInspect
Fetch one Napkin diagram's mermaid source by id (from napkin_diagrams_list). Read before editing — napkin_diagrams_update replaces the whole source.
| Name | Required | Description | Default |
|---|---|---|---|
| diagramId | Yes | Diagram id from napkin_diagrams_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered, but the description adds genuine context: it returns mermaid source and, importantly, discloses that the sibling update performs a full-source replacement rather than a patch. It stops short of noting error behavior for a missing id or workspace-resolution edge cases, but the replacement semantics are a meaningful non-obvious 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?
Two tight sentences with zero filler: the read purpose and id provenance come first, the editing workflow cue second. Nothing could be removed without losing 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 carries the return-value burden and does identify the return as the diagram's mermaid source, plus the id provenance and a mutation warning. It is essentially complete for a simple single-record read, though a hint about not-found behavior would close the last 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 coverage is 100% and both parameters are already documented, including that diagramId comes from napkin_diagrams_list — which the description merely repeats. The workspace parameter's token/default rules exist only in the schema and are not echoed in the description, so no value is added beyond structured data. 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 (Fetch), resource (one Napkin diagram's mermaid source) and lookup key (by id), and explicitly differentiates from siblings by naming napkin_diagrams_list as the id source and napkin_diagrams_update as the mutation counterpart. An agent can distinguish this from the other napkin_diagrams_* tools 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 an explicit workflow condition — 'Read before editing — napkin_diagrams_update replaces the whole source' — naming the alternative and the reason it must precede it. This is exactly the when/why guidance that prevents a destructive blind overwrite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_diagrams_listList Napkin diagramsARead-onlyInspect
Lists the workspace's Napkin diagrams (interactive flowcharts — processes, decision trees, system maps) newest first. Archived diagrams are hidden unless includeArchived; q narrows by title. Fetch one's mermaid source with napkin_diagrams_get. When referring the user to a diagram in your reply, put [[diagram:ID]] alone on its own line — it renders as a clickable card. NEVER cite a diagram as [[board:ID]]; boards are sketches.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Title contains (case-insensitive). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| includeArchived | No | Also list archived diagrams (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, non-destructive, closed-world read. The description adds behavior beyond them: default ordering (newest first) and the default exclusion of archived diagrams, plus the citation rendering convention. It stops short of describing pagination or result limits, 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, zero filler, and the core purpose is front-loaded before the parameter notes and the cross-tool pointer. The citation rule is separated into its own high-salience clause ('NEVER cite a diagram as [[board:ID]]'), which is the right structure for a formatting constraint the agent must obey.
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-shape burden, and it does convey that diagram records (with IDs, per the [[diagram:ID]] convention) come back in a defined order. It omits pagination or result-size behavior and says nothing about the `workspace` parameter, which is a real gap for a no-required-parameter listing tool, but overall an agent has enough 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 the schema already documents `q`, `workspace`, and `includeArchived`; the description restates the effect of `q` and `includeArchived` without adding format or syntax detail. The `workspace` parameter, with its non-obvious token/default rules, is not mentioned in the description at all. 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 (lists), resource (the workspace's Napkin diagrams), defines what the resource is with examples (interactive flowcharts — processes, decision trees, system maps), and specifies ordering (newest first). It also disambiguates from the adjacent napkin_boards concept by warning that boards are sketches, so an agent can separate the two resource families 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 conditions for the optional behaviors: archived items are hidden unless `includeArchived`, and `q` narrows by title. It routes to the sibling that supplies more detail ('Fetch one's mermaid source with napkin_diagrams_get'), which is exactly the when-to-use-the-other-tool guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_diagrams_updateEdit a Napkin diagramADestructiveInspect
Edit a Napkin diagram: retitle, describe, REPLACE the whole mermaid source, set visibility, or archived (true takes it out of the gallery, false brings it back — the recovery move for a diagram created by mistake). Read the diagram first (napkin_diagrams_get) so your new source keeps the parts the user wants. Diagram ids come from napkin_diagrams_list.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| source | No | Mermaid flowchart source. Start with `flowchart TD` (top-down) or `flowchart LR` (left-right). Declare shaped nodes — `A["Rect"]`, `B("Rounded")`, `C{"Decision"}`, `D(["Stadium"])`, `E(("Circle"))`, `F{{"Hexagon"}}` — and link them with `A -->|label| B`, `A -.-> B` (dotted), or `A ==> B` (thick). Group steps with `subgraph Name["Title"] ... end`. Color a node with a trailing `style A fill:#fee2e2` line. Only the flowchart subset is supported. Each label is a short name on one line, written plainly: no `\n`, no backslashes before quotes. A step's label is its name everywhere in Compass. | |
| archived | No | ||
| diagramId | Yes | Diagram id from napkin_diagrams_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| visibility | No | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. | |
| description | No | Short gallery summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description reinforces this by emphasizing that source REPLACE-es the whole mermaid source, plus explains archived semantics (removes/restores from gallery). It discloses what is overwritten and a recovery path, adding real context beyond the annotations, though it does not describe auth or approval flow.
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 verb and effects, then the read-first workflow, then the id source. Dense but every clause carries actionable information; the archived parenthetical earns its length by explaining recovery semantics.
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 8-param destructive mutation with no output schema, it covers what can change, the read-before-write prerequisite, id sourcing, and the archive recovery path. Approval/workspace mechanics are left to the schema descriptions, which is acceptable, so 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?
With schema coverage at 75% the baseline is 3, and the description earns above that: it maps each mutable operation to a field (retitle→title, describe→description, source replacement, visibility) and adds the crucial 'whole source is replaced' semantics and archived recovery behavior that the bare enum/boolean schema does not convey.
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 (edit) and resource (Napkin diagram) and enumerates the exact mutable fields (title, description, mermaid source, visibility, archived). This clearly separates it from napkin_diagrams_create, napkin_diagrams_get and napkin_diagrams_list without the agent 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 a concrete workflow: read via napkin_diagrams_get first so the new source preserves wanted parts, and get ids from napkin_diagrams_list. It also frames archived=false as the recovery move for a mistaken diagram. It stops short of explicit when-not/alternatives routing, but the prerequisite guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_docs_createCreate a Napkin docAInspect
Create a Napkin doc — a markdown DOCUMENT (prose, structure, code blocks), not a drawing canvas (that's napkin_boards_create) and not slides (napkin_deck_write). Optionally pass a title and initial markdown body. Use for drafts the user asked you to start. After creating, cite it as [[doc:ID]] alone on its own line — it renders as a clickable card. NEVER cite it as [[board:ID]].
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Initial markdown body. Write each paragraph as ONE long line — the editor wraps text to the reader's column, and hard-wrapped source shows up as narrow ragged lines when someone opens the paragraph to edit it. | |
| title | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (not read-only, not destructive, closed world). The description adds genuinely non-derivable behavioral context: the citation format [[doc:ID]] and the prohibition on citing as [[board:ID]]. It does not cover auth/workspace caveats or return shape, but with annotations carrying the safety profile this is solid.
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 disambiguation, then usage, then citation rule. Every sentence earns its place 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-required-param create tool with no output schema, the description covers purpose, alternatives, and the critical citation convention. Only gaps are the return value / resulting ID surface and workspace caveats, which the schema partially handles.
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 67%; the schema already documents body (with the hard-wrap rationale) and workspace (token behavior), while title has only min/max length. The description adds only that title and body are optional initial values, so it neither compensates for the title gap nor adds meaning 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 (create a Napkin doc) and explicitly distinguishes it from two siblings by name (not a drawing canvas like napkin_boards_create, not slides like napkin_deck_write). The agent can route correctly 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 alternatives and the condition that selects them ('Use for drafts the user asked you to start'), and gives post-creation citation guidance including a hard NEVER rule. Nothing left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_docs_getRead a Napkin docARead-onlyInspect
Fetch one Napkin doc's full markdown body by id (from napkin_docs_list). Read before editing — napkin_docs_update replaces or appends against the current body.
| Name | Required | Description | Default |
|---|---|---|---|
| docId | Yes | Doc id from napkin_docs_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is covered. The description adds value beyond that by disclosing the return shape ('full markdown body') and the mutation model of the related update tool (replace or append against current body), which matters because there is no output 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?
Two tight sentences, front-loaded with the core action and identifier source, followed by the one piece of workflow advice that actually changes agent behavior. 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?
With no output schema, the description correctly compensates by naming the return value ('full markdown body'), and it covers the edit relationship. What an agent needs to call it correctly is present; only deeper behavioral detail (e.g. permissions, missing-doc behavior) 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 description coverage is 100%, and docId's description already says it comes from napkin_docs_list, so the description largely repeats the schema on that point. It adds nothing about the workspace parameter, relying on the schema for the token/default-workspace rules, which is the expected 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 ('Fetch one Napkin doc's full markdown body') plus the identifier source ('by id (from napkin_docs_list)'). It distinguishes itself from the list tool that produces ids and the update tool that consumes the body, so an agent can route 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 clear sequencing guidance ('Read before editing') and names the downstream alternative (napkin_docs_update) along with its semantics ('replaces or appends against the current body'). It lacks an explicit when-not condition, but 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.
napkin_docs_listList Napkin docsARead-onlyInspect
Lists the workspace's Napkin docs (quick markdown documents — drafts, notes, working text; the LINEAR surface, distinct from boards which are drawing canvases) newest first, with excerpts. Archived docs are hidden unless includeArchived; q narrows by title. Fetch one with napkin_docs_get. When referring the user to a doc in your reply, put [[doc:ID]] alone on its own line — it renders as a clickable card. NEVER cite a doc as [[board:ID]]; boards are sketches.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Title contains (case-insensitive). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| includeArchived | No | Also list archived docs (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, non-destructive profile. The description adds real behavioral context beyond that: newest-first ordering, excerpt inclusion, and the default-hide-archived rule with its override. It omits pagination/result-limit behavior, keeping 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?
Front-loaded with the core purpose and scoping rules before the citation-format instructions. The [[doc:ID]] guidance is slightly verbose but is a genuinely useful output convention that 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?
Given no output schema, the description does a good job explaining what comes back (excerpts, ordering) and the archive/search behavior. Missing pagination or limit details, but 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 includeArchived and q semantics are already documented in the schema. The description restates them in prose and never covers the workspace parameter, so it adds little beyond the structured fields – baseline 3.
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 (Lists) and resource (Napkin docs), defines what they are (quick markdown documents), and explicitly distinguishes them from the sibling surface (boards are drawing canvases). An agent can identify this tool 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?
Clearly routes the agent to napkin_docs_get for fetching a single doc and explains the filtering conditions (includeArchived, q). It does not name content-search alternatives like search_workspace, but for the doc-listing domain the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_docs_updateEdit a Napkin docADestructiveInspect
Edit a Napkin doc. For a change to existing prose use edits — a list of exact find/replace pairs, which is the SAFEST option and the one to reach for by default: it leaves everything you did not target untouched, and it fails loudly rather than clobbering a doc somebody else is typing in. append adds a section at the end. body replaces the WHOLE document and should be a last resort. Also retitle, describe, set visibility, or archived (true takes it out of the gallery, false brings it back). Read the doc with napkin_docs_get first — edits match the current text exactly. Doc ids come from napkin_docs_list.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Full replacement markdown body. Prefer `edits` — this overwrites everything. Write each paragraph as ONE long line; the editor wraps it for the reader. | |
| docId | Yes | Doc id from napkin_docs_list. | |
| edits | No | Targeted find/replace pairs, applied in order. All must match or none are applied. | |
| title | No | ||
| append | No | Markdown appended to the end (own paragraph). | |
| archived | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| visibility | No | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. | |
| description | No | Short gallery summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag destructiveHint=true; the description goes far beyond by explaining WHY and HOW: edits 'leaves everything you did not target untouched' and 'fails loudly rather than clobbering a doc somebody else is typing in', while body 'replaces the WHOLE document'. The archived true/false round-trip semantics 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?
Dense but front-loaded: the primary recommendation (edits) leads, riskier modes follow, prerequisites and id provenance close it out. No filler sentences and 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 10-param mutation tool with no output schema, the description covers the decision logic, the safety model, the read-first prerequisite, and where ids come from. An agent has everything needed to call it correctly without further context.
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 80%, so the baseline is 3, but the description adds interpretation the schema lacks: the default-vs-last-resort ranking of edits/append/body and the gallery/archive round-trip behavior of archived. It maps none of the less-obvious params (visibility enum, approvalId) beyond what the schema already states.
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 ('Edit a Napkin doc') and then breaks down the distinct mutation modes (edits, append, body, retitle, visibility, archived). It clearly differentiates itself from sibling napkin_docs_get (read) and napkin_docs_list (ids), so an agent can place 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 prescribes edits as 'the SAFEST option and the one to reach for by default', labels body a 'last resort', and states the prerequisite 'Read the doc with napkin_docs_get first'. This is textbook when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_drawDraw on a Napkin boardADestructiveInspect
Draws shapes, strokes, and labels on a board — diagram on a sketch, annotate a deck slide — and, via updates / deletes, changes or removes shapes that are already there (ids from napkin_boards_get; the fix for something you drew wrong). For NEW elements never compute absolute board coordinates: with slide, coordinates are slide-local — (0, 0) top-left to (960, 540) bottom-right of that slide. Without slide (sketches), (0, 0) is the top-left of the existing content — the same area napkin_boards_view renders, so place by what you saw there; on an empty board just start at (0, 0). Example — circle a slide's title and margin-note it:
{"boardId": "…", "slide": 2, "elements": [ {"type": "ellipse", "x": 60, "y": 40, "w": 400, "h": 90, "color": "#dc2626"}, {"type": "arrow", "x": 560, "y": 140, "x2": 470, "y2": 90, "color": "#dc2626"}, {"type": "text", "x": 575, "y": 130, "w": 260, "text": "tighten this claim", "color": "#dc2626"} ]}
After drawing, cite the board with [[board:ID]] alone on its own line.
| Name | Required | Description | Default |
|---|---|---|---|
| slide | No | 1-based slide number (decks only) — makes coordinates slide-local. | |
| boardId | Yes | Napkin board id. | |
| deletes | No | Ids of existing shapes to remove (from napkin_boards_get). | |
| updates | No | Existing shapes to change — move, resize, retext, restyle. Read napkin_boards_get first for ids and current geometry. | |
| elements | No | New elements to draw, painted in order. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive=true and readOnly=false, and the description adds real context on top: that deletes remove existing shapes permanently, that updates patch live shapes by id, and that ids must come from napkin_boards_get. It stops short of saying whether edits are undoable or what happens when an id is stale.
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 verb and the coordinate rule before the example, and every sentence carries information (coordinate origin, id source, citation format). The embedded JSON example is long but earns its space by demonstrating multi-element composition; the parenthetical asides add minor noise.
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, nested-schema mutation tool with no output schema and destructive annotations, the description covers the risky parts: coordinate frames, id sourcing, update/delete semantics, and the citation follow-up. It omits return behavior and failure modes for invalid ids, but nothing essential to a correct call 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 genuine semantics the schema lacks — the slide-local (0,0)-(960,540) coordinate frame versus board-relative origin for sketches, and the placement rule for empty boards. The worked JSON example also clarifies element field usage in practice.
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-and-resource statement ('Draws shapes, strokes, and labels on a board') and extends it to the mutate path ('via updates / deletes, changes or removes shapes that are already there'). It also names the sibling helpers (napkin_boards_get, napkin_boards_view) so an agent can place it in the board-tool family 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 concrete usage context: read napkin_boards_get for ids before updating, and use napkin_boards_view's rendered area as the coordinate frame. It does not explicitly state when to prefer this over other drawing surfaces (napkin_diagrams_create, napkin_deck_write, napkin_slide_fill), so routing between draw tools still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_createCreate a Napkin interfaceAInspect
Create an interface — a small screen of its own the user can open and send to people. Use when someone asks for a custom chat UI, a little tool, or a prototype of how something would feel in their product. It starts with a working index.html you then edit. It can reach NOTHING in the workspace until a flow is granted with napkin_interfaces_grant. Cite it in your reply as [[interface:ID]] alone on its own line — it renders as a card the user can click. Do NOT paste an image URL or try to embed the picture yourself; that renders as a broken image. An interface is plain HTML, CSS and JavaScript in one or more files, served from its own origin. Put styles in a block. LIBRARIES: there is no build step and no CDN, and a to any other site is blocked. A fixed shelf of libraries is served from the interface's own origin instead; load them with exactly these tags (the versions are pinned, and any other /lib/ path is not found): PREACT + HTM, for a page with several screens or a lot of state — components and hooks with no build: then var html = htm.bind(preact.h); var useState = preactHooks.useState; function App(){ var s = useState(0); return html<button onClick=${function(){ s[1](s[0] + 1) }}>${s[0]}</button> } preact.render(html<${App}/>, document.getElementById("app")). Templates are tagged strings (html…), not JSX. CHART.JS, for a chart: then new Chart(canvasElement, { type: "bar" | "line" | "doughnut" | …, data: { labels: [...], datasets: [{ label, data: [...] }] }, options: {} }). Color the datasets from the brand variables, read with getComputedStyle(document.documentElement).getPropertyValue("--brand-accent"). LUCIDE, for icons: . In plain markup, write and call lucide.createIcons() once it's on the page (again after adding more). In a Preact page DON'T — createIcons swaps elements Preact owns; draw the icon from its shapes instead: lucide.icons.Calendar is a list of [tag, attributes], so render with preact.h(tag, attributes) for each (the app starter has an Icon component that does this). Names are lucide.dev's: kebab-case in markup, PascalCase in lucide.icons. A one-screen page needs none of these: plain HTML, CSS and JavaScript is still the default. React, Tailwind and every other library are not available. index.html is the entry point and must exist. THE BRAND: every interface carries the workspace brand as files — link it with and style with its variables: var(--brand-ink), var(--brand-muted), var(--brand-background), var(--brand-surface), var(--brand-accent), var(--brand-accent-2), var(--brand-color-) (napkin_interfaces_view lists the exact names this brand defines), var(--brand-font-heading), var(--brand-font-body), var(--brand-radius). Never hard-code the brand's colours or font names. brand.css already loads the brand's own font files; web fonts (Google Fonts or any other) are BLOCKED, so linking one leaves the page in a system font. The brand's logos are files under brand/ (brand.css lists them at the top): . Use the logo rather than typing the name, and real icons (inline SVG) rather than emoji. Read the brand with napkin_brand_get first, and say only what the brand kit or the user tells you. PICTURES: a picture from anywhere on the web is BLOCKED and draws as a broken image, so never use an external image URL. Show a picture from the workspace's files with (in CSS, url(file:)) — PNG, JPEG, GIF or WebP, up to 5 MB. Write the reference literally; a file id assembled in JavaScript is not found. When the user gives you a picture in chat, save it with workspace_files_save_from_chat and use the file id it returns. A picture that's only on a website has to be attached in chat first, or uploaded in the interface's Files panel. LOOK before you hand it over: napkin_interfaces_view draws the page as it is now. Fix anything that doesn't look like the brand and look again. Load the client with . Then zw.ready() resolves with the context { viewer, grants, flows, tables, metrics, tasks }; ctx.flows lists the flow grants, each with its id, name and variables. zw.flows.run(flow.id, input) runs one. Call it inside zw.ready().then(...), and handle the rejection — it rejects only when the page isn't open in ZeroWidth, so show "Open this from ZeroWidth" there instead of a dead button. A run can take up to two minutes; show it working (stream it, below), and show the error's message when one fails — err.message is a sentence written for the person using the page. Input is {kind:"chat", messages:[{role:"user", content:"…"}]} or {kind:"form", values:{…}} — the same shapes the public API takes. zw.replyText(result) pulls the assistant text out of a chat result. SOURCES: when the flow searches a knowledge base, zw.sources(result) lists the documents the run actually read, as [{ name, documentId }], once each. Show those under the answer for "where did this come from" — never ask the model to write a sources line and parse it out of the text. The flow needs the knowledge base attached BEFORE it is published (workbench_flows_attach_knowledge_base, then workbench_flows_publish, then re-grant the new version here); the interface runs the published version it was granted. FEEDBACK: to let someone rate an answer or flag a wrong one, call zw.feedback.send(result, { rating: "up" | "down", correction, comment }) with the result zw.flows.run returned. It goes to Caliper, into the flow's feedback dataset, with the question and the answer taken from the run itself; correction is what the answer should have been. Needs no extra grant and no table — never make a table to log flagged answers. It returns a promise: say it was sent only once it resolves, and show the error's message if it rejects. Tell the user flagged answers are in Caliper, in the dataset named after the flow, under Datasets. VARIABLES: a flow grant lists variables — the values the flow reads besides the conversation, usually the {{key}} tokens in its prompt (who the user is, their plan, the page they are on). Send them on the same chat run: {kind:"chat", messages:[…], values:{: value}}, using each variable's exact name and its type (string, number, boolean, array, object). A variable left out reaches the prompt empty. Read them from napkin_interfaces_get while you write the page, or at run time from ctx.flows[i].variables. A SHIM is not a flow and takes a different call: zw.shims.run(shimId, text), which decides on the viewer's own device with no network and no cost. It resolves with the same envelope a flow does, so read the decision with zw.decision(result) — NOT result.decision, which is undefined and makes an interface show one answer for every input. The decision is { answer, confidence, familiarity, action, probs, gates }; branch on action, the shim's own call about whether it was sure enough. Calling zw.flows.run with a shim id is refused. ctx.grants tells you which you have: each entry carries a kind of "flow" or "shim" alongside its id and name. DATA: an interface can be granted a sheet TABLE or a Ledger METRIC with napkin_interfaces_grant_data. ctx.tables lists each table with its fields (name, type, options) and access ("read", "add" or "edit"); ctx.metrics lists each metric with its unit and access ("read" or "record"). Records travel keyed by field NAME, choices by option NAME. zw.tables.query(table, { where: [{ field, op, value }], sort: [{ field, dir }], limit }) resolves { records: [{ id, fields }], total }; zw.tables.add(table, { Field: value }) or a list adds records; zw.tables.update(table, id, fields) and zw.tables.remove(table, ids) need "edit". zw.metrics.read(metric, { from, to }) resolves { metric, readings: [{ value, at, note }] }; zw.metrics.record(metric, value, { note }) needs "record". Name a table or metric by its id or its name. Through a share link a guest can read and add, never change or delete — so an intake form works when shared, a triage board needs a signed-in viewer. A granted Workbench TASK (ctx.tasks; each says whether it takesInput) starts with zw.tasks.start(task, input), which resolves { runId, status } at once — the run carries on after the page closes — and zw.tasks.get(task, runId) reads { status, output } for runs this page started. Running a shim on every keystroke is fine — it costs nothing and there is no rate limit. Debounce ~150ms and COALESCE: remember the latest text and run it when the current call finishes, so the answer matches what is on screen. Clear any in-flight guard on failure as well as success, or one call that doesn't come back wedges the interface. d.action is "act" | "suggest" | "refuse" — those three strings, nothing else. Branch on it rather than on a confidence threshold you invent; "refuse" means the shim doesn't recognise the input well enough to answer, so say so rather than showing a low-confidence guess. If you run a requestAnimationFrame loop, remove CSS transitions from any property it writes — the two fight and the property looks frozen. A flow answers in markdown: render it with el.replaceChildren(zw.markdown(text)). It builds DOM nodes, so model output is never treated as markup. STREAM chat answers: zw.flows.run(id, input, { onEvent: fn }) delivers the text token by token, and a flow that takes several seconds reads as broken without it. Use zw.textDelta(event) for each chunk — it returns null for anything that isn't text, so pass it every event — and accumulate. The promise still settles at the end with the whole result; take the final text from there. onEvent also sees node_start / node_complete / node_error if you want to name the step. Don't name a top-level variable history, name, status, length, origin or top: those are already window properties, so var history = [] leaves you with the browser's History object and history.push fails. Prefix it, or keep it inside a function. THE KIT: every new interface also has kit.css, components built only from the brand's variables — link it after brand.css () and build from its classes rather than styling from scratch: layout (.page, .page.wide, .header, .stack, .row, .grid), type (h1, h2, h3, .muted, .small, .label, .num, .stat), buttons (.btn, .btn.secondary, .btn.quiet, .btn.sm, .btn.icon), fields (.field with a .label, then .input / .select / .textarea, then a .hint or .error; .check for a checkbox), .chips and .chip, .badge (.up, .down, .accent), .card, .list, .meter, states (.empty, .skeleton, .spinner, .notice, .notice.error), chat (.thread, .bubble.me, .bubble.them, .typing, .composer), and .icon for a Lucide icon. Its tokens are var(--ink), var(--muted), var(--bg), var(--surface), var(--accent), var(--line), var(--tint), var(--radius) and spacing var(--s1)…var(--s7). The starters show the kit used well; read one before writing a page of your own. Design it the way a good product is designed: a clear hierarchy, real spacing, states for loading, empty and failure, and a layout that works on a phone first. Use the brand kit (napkin_brand_get) for what the brand looks like and how it sounds.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| starter | No | Which worked example to start from — a whole working page, written well, that you then shape to what was asked. `blank`: a title and the client library. Start here unless one of the others is exactly the shape you want. `chat`: a conversation against one flow, streamed, keeping the history client-side so the flow sees the whole thread. `form`: labelled fields sent as a form run, with the answer underneath. `decision`: text in, a shim's answer out, with its confidence and the action it recommends. `app`: an app with several screens (Preact, htm and Lucide from the shelf): tabs along the bottom on a phone and the top on a wide screen, the screen kept in the address, a home screen and a streamed chat. For a member app or a tool with a few views. `dashboard`: cards over the granted data (Chart.js from the shelf): each Ledger metric's latest reading and a line of its history, each table's count, a bar of how it splits on its first choice column, and its latest records. `intake`: a form built from a granted table's columns that adds a record to it, with a done state and 'add another'. Works through a share link. `board`: a granted table's records in lanes by its first choice column, moved a lane at a time by someone who may edit. Needs a signed-in viewer to move cards. Take `blank` (the default) when none of the others is the shape you want, rather than deleting one you didn't need. The data starters (dashboard, intake, board) read what's granted with napkin_interfaces_grant_data, so grant the table or metric too. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this writes (readOnlyHint=false) and is not destructive; the description goes far beyond that, disclosing that the interface reaches nothing until napkin_interfaces_grant, that external images/CDNs/web fonts are blocked, that libraries are a pinned same-origin shelf, the 5 MB file limit, the two-minute flow run window, that tasks continue after the page closes, and that feedback lands in Caliper. This is exactly the extra context the dimension rewards.
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 genuinely long, but the density is warranted for a tool that generates an arbitrary HTML/CSS/JS app, and the purpose plus the critical citation rule (`[[interface:ID]]` on its own line) are front-loaded before the reference material. The all-caps section headers (LIBRARIES, THE BRAND, DATA, STREAM) give it navigable structure, though the volume sits at the upper limit of what a description should carry.
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 takes on the full burden and meets it: it explains the grant model, the client library (/zerowidth.js) and its zw.* APIs, table/metric/shim/task access shapes, streaming, markdown rendering, and how results surface in the reply. An agent has everything needed to produce and hand over a working interface.
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 67% and the enum description for `starter` is already exhaustive, so the schema carries the parameter burden. The description only gestures at that parameter ('It starts with a working index.html you then edit'; 'The starters show the kit used well') and says nothing new about `name` or `workspace`. Baseline 3 fits: the schema does the heavy lifting and the description adds marginal value.
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 precise verb and resource: 'Create an interface — a small screen of its own the user can open and send to people.' That distinguishes it cleanly from napkin_boards_create, napkin_docs_create, and napkin_deck_compose without requiring the schema. The follow-on examples (custom chat UI, little tool, prototype) sharpen the intent further.
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 the triggering condition ('Use when someone asks for a custom chat UI, a little tool, or a prototype'), names the companion tools (napkin_interfaces_grant for reaching workspace data, napkin_interfaces_view to look before handing over, napkin_interfaces_get for variables, napkin_brand_get for brand truth), and routes edits elsewhere by saying it 'starts with a working index.html you then edit.' Nothing about when-to-use 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.
napkin_interfaces_getRead a Napkin interfaceARead-onlyInspect
Read one interface: its name, the flows it may run (with the published version each is pinned to), and the contents of its files. READ BEFORE EDITING — napkin_interfaces_write matches text exactly against what is there now. Pass a path to read one file when the interface has several. An interface is plain HTML, CSS and JavaScript in one or more files, served from its own origin. Put styles in a block. LIBRARIES: there is no build step and no CDN, and a to any other site is blocked. A fixed shelf of libraries is served from the interface's own origin instead; load them with exactly these tags (the versions are pinned, and any other /lib/ path is not found): PREACT + HTM, for a page with several screens or a lot of state — components and hooks with no build: then var html = htm.bind(preact.h); var useState = preactHooks.useState; function App(){ var s = useState(0); return html<button onClick=${function(){ s[1](s[0] + 1) }}>${s[0]}</button> } preact.render(html<${App}/>, document.getElementById("app")). Templates are tagged strings (html…), not JSX. CHART.JS, for a chart: then new Chart(canvasElement, { type: "bar" | "line" | "doughnut" | …, data: { labels: [...], datasets: [{ label, data: [...] }] }, options: {} }). Color the datasets from the brand variables, read with getComputedStyle(document.documentElement).getPropertyValue("--brand-accent"). LUCIDE, for icons: . In plain markup, write and call lucide.createIcons() once it's on the page (again after adding more). In a Preact page DON'T — createIcons swaps elements Preact owns; draw the icon from its shapes instead: lucide.icons.Calendar is a list of [tag, attributes], so render with preact.h(tag, attributes) for each (the app starter has an Icon component that does this). Names are lucide.dev's: kebab-case in markup, PascalCase in lucide.icons. A one-screen page needs none of these: plain HTML, CSS and JavaScript is still the default. React, Tailwind and every other library are not available. index.html is the entry point and must exist. THE BRAND: every interface carries the workspace brand as files — link it with and style with its variables: var(--brand-ink), var(--brand-muted), var(--brand-background), var(--brand-surface), var(--brand-accent), var(--brand-accent-2), var(--brand-color-) (napkin_interfaces_view lists the exact names this brand defines), var(--brand-font-heading), var(--brand-font-body), var(--brand-radius). Never hard-code the brand's colours or font names. brand.css already loads the brand's own font files; web fonts (Google Fonts or any other) are BLOCKED, so linking one leaves the page in a system font. The brand's logos are files under brand/ (brand.css lists them at the top): . Use the logo rather than typing the name, and real icons (inline SVG) rather than emoji. Read the brand with napkin_brand_get first, and say only what the brand kit or the user tells you. PICTURES: a picture from anywhere on the web is BLOCKED and draws as a broken image, so never use an external image URL. Show a picture from the workspace's files with (in CSS, url(file:)) — PNG, JPEG, GIF or WebP, up to 5 MB. Write the reference literally; a file id assembled in JavaScript is not found. When the user gives you a picture in chat, save it with workspace_files_save_from_chat and use the file id it returns. A picture that's only on a website has to be attached in chat first, or uploaded in the interface's Files panel. LOOK before you hand it over: napkin_interfaces_view draws the page as it is now. Fix anything that doesn't look like the brand and look again. Load the client with . Then zw.ready() resolves with the context { viewer, grants, flows, tables, metrics, tasks }; ctx.flows lists the flow grants, each with its id, name and variables. zw.flows.run(flow.id, input) runs one. Call it inside zw.ready().then(...), and handle the rejection — it rejects only when the page isn't open in ZeroWidth, so show "Open this from ZeroWidth" there instead of a dead button. A run can take up to two minutes; show it working (stream it, below), and show the error's message when one fails — err.message is a sentence written for the person using the page. Input is {kind:"chat", messages:[{role:"user", content:"…"}]} or {kind:"form", values:{…}} — the same shapes the public API takes. zw.replyText(result) pulls the assistant text out of a chat result. SOURCES: when the flow searches a knowledge base, zw.sources(result) lists the documents the run actually read, as [{ name, documentId }], once each. Show those under the answer for "where did this come from" — never ask the model to write a sources line and parse it out of the text. The flow needs the knowledge base attached BEFORE it is published (workbench_flows_attach_knowledge_base, then workbench_flows_publish, then re-grant the new version here); the interface runs the published version it was granted. FEEDBACK: to let someone rate an answer or flag a wrong one, call zw.feedback.send(result, { rating: "up" | "down", correction, comment }) with the result zw.flows.run returned. It goes to Caliper, into the flow's feedback dataset, with the question and the answer taken from the run itself; correction is what the answer should have been. Needs no extra grant and no table — never make a table to log flagged answers. It returns a promise: say it was sent only once it resolves, and show the error's message if it rejects. Tell the user flagged answers are in Caliper, in the dataset named after the flow, under Datasets. VARIABLES: a flow grant lists variables — the values the flow reads besides the conversation, usually the {{key}} tokens in its prompt (who the user is, their plan, the page they are on). Send them on the same chat run: {kind:"chat", messages:[…], values:{: value}}, using each variable's exact name and its type (string, number, boolean, array, object). A variable left out reaches the prompt empty. Read them from napkin_interfaces_get while you write the page, or at run time from ctx.flows[i].variables. A SHIM is not a flow and takes a different call: zw.shims.run(shimId, text), which decides on the viewer's own device with no network and no cost. It resolves with the same envelope a flow does, so read the decision with zw.decision(result) — NOT result.decision, which is undefined and makes an interface show one answer for every input. The decision is { answer, confidence, familiarity, action, probs, gates }; branch on action, the shim's own call about whether it was sure enough. Calling zw.flows.run with a shim id is refused. ctx.grants tells you which you have: each entry carries a kind of "flow" or "shim" alongside its id and name. DATA: an interface can be granted a sheet TABLE or a Ledger METRIC with napkin_interfaces_grant_data. ctx.tables lists each table with its fields (name, type, options) and access ("read", "add" or "edit"); ctx.metrics lists each metric with its unit and access ("read" or "record"). Records travel keyed by field NAME, choices by option NAME. zw.tables.query(table, { where: [{ field, op, value }], sort: [{ field, dir }], limit }) resolves { records: [{ id, fields }], total }; zw.tables.add(table, { Field: value }) or a list adds records; zw.tables.update(table, id, fields) and zw.tables.remove(table, ids) need "edit". zw.metrics.read(metric, { from, to }) resolves { metric, readings: [{ value, at, note }] }; zw.metrics.record(metric, value, { note }) needs "record". Name a table or metric by its id or its name. Through a share link a guest can read and add, never change or delete — so an intake form works when shared, a triage board needs a signed-in viewer. A granted Workbench TASK (ctx.tasks; each says whether it takesInput) starts with zw.tasks.start(task, input), which resolves { runId, status } at once — the run carries on after the page closes — and zw.tasks.get(task, runId) reads { status, output } for runs this page started. Running a shim on every keystroke is fine — it costs nothing and there is no rate limit. Debounce ~150ms and COALESCE: remember the latest text and run it when the current call finishes, so the answer matches what is on screen. Clear any in-flight guard on failure as well as success, or one call that doesn't come back wedges the interface. d.action is "act" | "suggest" | "refuse" — those three strings, nothing else. Branch on it rather than on a confidence threshold you invent; "refuse" means the shim doesn't recognise the input well enough to answer, so say so rather than showing a low-confidence guess. If you run a requestAnimationFrame loop, remove CSS transitions from any property it writes — the two fight and the property looks frozen. A flow answers in markdown: render it with el.replaceChildren(zw.markdown(text)). It builds DOM nodes, so model output is never treated as markup. STREAM chat answers: zw.flows.run(id, input, { onEvent: fn }) delivers the text token by token, and a flow that takes several seconds reads as broken without it. Use zw.textDelta(event) for each chunk — it returns null for anything that isn't text, so pass it every event — and accumulate. The promise still settles at the end with the whole result; take the final text from there. onEvent also sees node_start / node_complete / node_error if you want to name the step. Don't name a top-level variable history, name, status, length, origin or top: those are already window properties, so var history = [] leaves you with the browser's History object and history.push fails. Prefix it, or keep it inside a function. THE KIT: every new interface also has kit.css, components built only from the brand's variables — link it after brand.css () and build from its classes rather than styling from scratch: layout (.page, .page.wide, .header, .stack, .row, .grid), type (h1, h2, h3, .muted, .small, .label, .num, .stat), buttons (.btn, .btn.secondary, .btn.quiet, .btn.sm, .btn.icon), fields (.field with a .label, then .input / .select / .textarea, then a .hint or .error; .check for a checkbox), .chips and .chip, .badge (.up, .down, .accent), .card, .list, .meter, states (.empty, .skeleton, .spinner, .notice, .notice.error), chat (.thread, .bubble.me, .bubble.them, .typing, .composer), and .icon for a Lucide icon. Its tokens are var(--ink), var(--muted), var(--bg), var(--surface), var(--accent), var(--line), var(--tint), var(--radius) and spacing var(--s1)…var(--s7). The starters show the kit used well; read one before writing a page of your own. Design it the way a good product is designed: a clear hierarchy, real spacing, states for loading, empty and failure, and a layout that works on a phone first. Use the brand kit (napkin_brand_get) for what the brand looks like and how it sounds.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | One file to read, e.g. index.html. Omit for every file. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| interfaceId | Yes | Interface id from napkin_interfaces_list. |
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 useful context that a grant is pinned to a published version and that the returned files are raw HTML/CSS/JS served from their own origin, but discloses nothing about auth needs, pagination or the exact response shape.
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 tool-relevant content is correctly front-loaded into the first two sentences, which is the only thing keeping this above a 1. Everything after that — library tags, brand variables, shim semantics, kit.css classes, streaming, feedback — is a build manual for napkin_interfaces_write and buys a reader of a read-only tool nothing.
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 carry the return shape, which it does well (name, flow grants plus pinned version, file contents) and it makes the read-before-write ordering clear. What is missing is small and adjacent: no indication of size limits, truncation, or how a multi-file interface is keyed back to `path`.
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 three parameters are already documented in the schema. The description adds only a light gloss on `path` ('one file when the interface has several'), which is baseline-consistent rather than compensating for a gap.
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 is specific: it reads one interface and enumerates what comes back (name, flow grants with the pinned published version, file contents), and it explicitly differentiates from napkin_interfaces_write via 'READ BEFORE EDITING'. It never positions itself against the closest read-side sibling, napkin_interfaces_view, and the following ~2,000 words are about authoring, not reading.
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 trigger condition ('READ BEFORE EDITING') and a per-case rule ('Pass a path to read one file when the interface has several'). It does not name the alternative for previewing the rendered page (napkin_interfaces_view) or for finding an interfaceId (napkin_interfaces_list), both of which an agent must pick between.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_grantChange what a Napkin interface can reachADestructiveInspect
Set what an interface may run — flows and shims, each pinned to a published version. This is the interface's ONLY reach into the workspace, and it replaces the whole list, so include everything it should keep. Ids and published versions come from workbench_flows_list / workbench_shim_list and their revisions. Ask the user before widening this.
| Name | Required | Description | Default |
|---|---|---|---|
| grants | Yes | The complete list. Passing an empty list removes all access. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| interfaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, but the description makes the destruction concrete: the call replaces the entire grant list, so anything omitted is revoked, and an empty list removes all access. It also imposes a consent rule ('Ask the user before widening this') and names the upstream sources for valid ids — 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?
Four tight sentences, front-loaded with the verb and the destructive replace semantics before the sourcing and confirmation details. No filler, no restatement 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?
For a destructive mutation with no output schema, the description covers what is destroyed, what constitutes valid input, and the consent expectation. It leaves the confirmation/approvalId round-trip to the schema rather than describing the needs_confirmation flow, which is the only real omission.
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 75% and already documents kind/version/targetId/workspace/approvalId, so the baseline is 3. The description adds non-obvious semantics the schema only gestures at: the list is complete and authoritative, and the version must be a published revision sourced from the flows/shims list tools.
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 ('Set what an interface may run — flows and shims'), and the object model is precise: each grant is pinned to a published version. It clearly distinguishes itself from the other napkin_interfaces_* siblings, which create, publish, write content, or grant data access rather than execution reach.
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 strong operational context: it replaces the whole list, so you must include everything to keep; empty list removes all access; ids/versions come from workbench_flows_list / workbench_shim_list and their revisions; and it explicitly says to ask the user before widening. It never names a sibling alternative for narrowing vs widening, but the surrounding guidance is unusually actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_grant_dataChange what data a Napkin interface can useADestructiveInspect
Set the sheet tables, Ledger metrics and Workbench Tasks an interface may use (ADR 0085, 0086), replacing the whole list. Tables: access read, add (read and add records) or edit (also change and delete); optionally limit to some columns by name. Metrics: read or record. Tasks: the page may start them. The page then calls zw.tables.query / add / update / remove, zw.metrics.read / record and zw.tasks.start / get. Anyone who can open the interface, including people it's shared with, gets this access (a shared link can only read and add), so ask the user before widening it.
| Name | Required | Description | Default |
|---|---|---|---|
| tasks | No | Workbench Tasks the page may start with zw.tasks.start, and check with zw.tasks.get. | |
| tables | No | ||
| metrics | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| interfaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true; the description goes beyond that by revealing this REPLACES the whole list, who receives the access (anyone who can open, including shared links, with shared-link read/add limits), and the downstream zw.* calls the page will use.
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 action and replacement semantics come first, followed by per-resource access meanings and the warning. The mid-sentence zw.* function lists are a slight detour but still earn their 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 destructive, open-world mutation with no output schema, the description covers replacement semantics, access audience, and the confirmation-worthy widening risk. It stops short of noting reversibility or how to recover the prior grant list, which for a whole-list replacement would be worth stating.
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 50%, and the description explains the access-level semantics ('read, add, edit' and 'read or record') and the optional column limiting, adding real meaning for those fields. But workspace, approvalId, and the per-item structures get no coverage from the description, leaving the enum-less access fields partly to inference.
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 — setting the tables, metrics, and tasks an interface may use — and names the sibling interface tools by effect. The scope ('replacing the whole list') is explicit, so an agent can distinguish this from napkin_interfaces_write or napkin_interfaces_publish.
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 implies when to use it (changing an interface's data access) and warns to ask the user before widening access, but it never names an alternative tool or states when NOT to call this versus napkin_interfaces_create or napkin_interfaces_write.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_listList Napkin interfacesBRead-onlyInspect
List the interfaces in a workspace — small self-contained screens (a custom chat, a control panel, a prototype) that run on their own origin and can call the flows they've been granted. Returns ids, names and how many flows each may run.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| includeArchived | No |
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 value beyond annotations by disclosing what is returned (ids, names, and granted-flow counts) and the runtime nature of interfaces, which matters since no output schema exists.
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 and uses a single em-dash elaboration plus one short return sentence. No wasted phrasing, though the parenthetical example list is slightly verbose.
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 two-parameter list tool with annotations covering safety, the definition is largely adequate and even covers return contents. However, the undocumented includeArchived flag leaves a real behavioral gap that an agent would need to resolve.
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?
At 50% schema coverage, the description should compensate for undocumented parameters, but it says nothing about includeArchived or whether archived interfaces are excluded by default. The workspace parameter is already well documented in the schema, so the description adds no parameter-level meaning.
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 interfaces in a workspace") and elaborates on what an interface is (self-contained screens like a custom chat, control panel, or prototype). The listing intent clearly contrasts with napkin_interfaces_get, though no sibling is named 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 by the verb and the workspace scoping, but there is no explicit when-to-use guidance or routing to alternatives like napkin_interfaces_get or napkin_interfaces_view. Nothing states prerequisites or when this is the wrong tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_publishSave a version of a Napkin interfaceAInspect
Save where an interface is now as a numbered version. Share links point at a published version, so what someone was sent doesn't change while work continues. Do this when the user says it's ready to show people, not after every edit.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | One line on what changed. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| interfaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so safety is partly covered, but the description adds genuinely non-obvious semantics: publishing produces a numbered version that share links bind to, so previously shared recipients keep a stable view. It doesn't clarify whether this replaces the prior published version or how publish relates to the version count, so it stops short of full 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?
Three tight sentences front-loaded with the core action, then the versioning rationale, then the usage trigger. 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 mutation tool with annotations and no output schema, the description covers what the operation means and when to invoke it. It omits what a successful publish returns or exposes (e.g., version identifier/link), but the core guidance an agent needs is 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 67%: 'note' and 'workspace' are documented in the schema, while 'interfaceId' is undocumented in both places. The description adds no parameter-level detail (no syntax or format for interfaceId), so this sits at the baseline for a mid-coverage 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 ('Save where an interface is now as a numbered version') and captures the snapshot/versioning nature of the action. By contrasting it against ongoing edits ('not after every edit'), it effectively distinguishes this from the write/edit 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?
Explicit when-to-use ('when the user says it's ready to show people') and when-not ('not after every edit'). Both the trigger condition and the exclusion are stated, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_viewLook at a Napkin interfaceARead-onlyInspect
See what an interface LOOKS like and DOES right now: the page RUNS from its current files under the same rules as the live page (no web fonts, no remote pictures), and you get a picture plus anything that went wrong (script errors, failed promises, blocked requests, console errors). Use it after every write and before saying an interface is finished: reading the code tells you what you wrote, not what it renders. size: "phone" looks at it 390px wide — use it for anything meant for a phone, like a mobile app mockup. steps drive the page before and between pictures, so you can check every screen and that buttons work: {click: "Plan"} (by visible text or label, or a CSS selector like "#nav-plan"), {type: {into: "textarea", text: "hi"}}, {press: "Enter"}, {wait: 500}, and {shot: "Plan screen"} for a picture. With no steps you get one picture of the first screen. Check each tab of an app in ONE call: shot, click a tab, shot, click the next, shot. Flows don't run here: a flow call gets a placeholder reply, so you can see the chat send and answer without spending anything; tables and metrics read empty. Look for text that's too small or runs together, stray system fonts, emoji standing in for icons, and anything that doesn't look like the brand.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | The window to look through. Default desktop (1280 wide); phone is 390 wide. | |
| steps | No | Done in order, with a picture at each `shot` (at most 6). Default: one shot of the first screen. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| interfaceId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish that this is a safe, non-open-world read. The description adds substantial behavior beyond that: the page runs from current files under live-page rules with no web fonts or remote images, the result is a picture plus script errors, failed promises, blocked requests and console errors, and flows return a placeholder while tables and metrics read empty. That last detail (what is stubbed out) is exactly the kind of non-obvious behavior an agent cannot infer.
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 what it does and when to use it, and there is little pure filler. It is long and dense across three paragraphs, and the closing list of aesthetic things to look for is helpful but ancillary to invocation, so it is a notch below maximally tight.
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, but the description explains the return shape (a picture plus a consolidated error report), covers all four parameters including the workspace token rule, and warns about stubbed flows/tables. 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 75%, and the description compensates by giving semantics the schema does not: click targets resolve "by visible text or label, or a CSS selector like #nav-plan", the steps model is shown as worked examples, and the default single-shot behavior is restated. This is meaningfully more than the anyOf blocks convey.
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 (see what a Napkin interface looks like and does by actually rendering it), and explicitly separates itself from the sibling that reads source: "reading the code tells you what you wrote, not what it renders." An agent can distinguish this from napkin_interfaces_get, napkin_interfaces_write, and napkin_boards_view 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 an explicit usage rule ("Use it after every write and before saying an interface is finished"), calls out when the phone size applies ("anything meant for a phone, like a mobile app mockup"), and shows the multi-step pattern for checking each tab in one call. It also states the boundary against the alternative of reading code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_interfaces_writeEdit a Napkin interface's filesADestructiveInspect
Write one file of an interface. Use edits — exact find/replace pairs — which is the SAFEST option and the one to reach for by default: it leaves everything you did not target untouched, and it fails loudly rather than clobbering a file somebody is editing. body replaces the WHOLE file and is for a new file or a deliberate rewrite. ONE CALL HOLDS ABOUT 15,000 CHARACTERS of file: a longer body is cut off mid-write and fails. Write a big file in parts instead — the first part with body, then each further part with body plus append: true, in order — and split an app across files (index.html, style.css, app.js) so each stays readable. deleteFile removes one (index.html can't be removed). Read with napkin_interfaces_get first — edits match the current text exactly. Also rename, describe, set visibility, or archive. An interface is plain HTML, CSS and JavaScript in one or more files, served from its own origin. Put styles in a block. LIBRARIES: there is no build step and no CDN, and a to any other site is blocked. A fixed shelf of libraries is served from the interface's own origin instead; load them with exactly these tags (the versions are pinned, and any other /lib/ path is not found): PREACT + HTM, for a page with several screens or a lot of state — components and hooks with no build: then var html = htm.bind(preact.h); var useState = preactHooks.useState; function App(){ var s = useState(0); return html<button onClick=${function(){ s[1](s[0] + 1) }}>${s[0]}</button> } preact.render(html<${App}/>, document.getElementById("app")). Templates are tagged strings (html…), not JSX. CHART.JS, for a chart: then new Chart(canvasElement, { type: "bar" | "line" | "doughnut" | …, data: { labels: [...], datasets: [{ label, data: [...] }] }, options: {} }). Color the datasets from the brand variables, read with getComputedStyle(document.documentElement).getPropertyValue("--brand-accent"). LUCIDE, for icons: . In plain markup, write and call lucide.createIcons() once it's on the page (again after adding more). In a Preact page DON'T — createIcons swaps elements Preact owns; draw the icon from its shapes instead: lucide.icons.Calendar is a list of [tag, attributes], so render with preact.h(tag, attributes) for each (the app starter has an Icon component that does this). Names are lucide.dev's: kebab-case in markup, PascalCase in lucide.icons. A one-screen page needs none of these: plain HTML, CSS and JavaScript is still the default. React, Tailwind and every other library are not available. index.html is the entry point and must exist. THE BRAND: every interface carries the workspace brand as files — link it with and style with its variables: var(--brand-ink), var(--brand-muted), var(--brand-background), var(--brand-surface), var(--brand-accent), var(--brand-accent-2), var(--brand-color-) (napkin_interfaces_view lists the exact names this brand defines), var(--brand-font-heading), var(--brand-font-body), var(--brand-radius). Never hard-code the brand's colours or font names. brand.css already loads the brand's own font files; web fonts (Google Fonts or any other) are BLOCKED, so linking one leaves the page in a system font. The brand's logos are files under brand/ (brand.css lists them at the top): . Use the logo rather than typing the name, and real icons (inline SVG) rather than emoji. Read the brand with napkin_brand_get first, and say only what the brand kit or the user tells you. PICTURES: a picture from anywhere on the web is BLOCKED and draws as a broken image, so never use an external image URL. Show a picture from the workspace's files with (in CSS, url(file:)) — PNG, JPEG, GIF or WebP, up to 5 MB. Write the reference literally; a file id assembled in JavaScript is not found. When the user gives you a picture in chat, save it with workspace_files_save_from_chat and use the file id it returns. A picture that's only on a website has to be attached in chat first, or uploaded in the interface's Files panel. LOOK before you hand it over: napkin_interfaces_view draws the page as it is now. Fix anything that doesn't look like the brand and look again. Load the client with . Then zw.ready() resolves with the context { viewer, grants, flows, tables, metrics, tasks }; ctx.flows lists the flow grants, each with its id, name and variables. zw.flows.run(flow.id, input) runs one. Call it inside zw.ready().then(...), and handle the rejection — it rejects only when the page isn't open in ZeroWidth, so show "Open this from ZeroWidth" there instead of a dead button. A run can take up to two minutes; show it working (stream it, below), and show the error's message when one fails — err.message is a sentence written for the person using the page. Input is {kind:"chat", messages:[{role:"user", content:"…"}]} or {kind:"form", values:{…}} — the same shapes the public API takes. zw.replyText(result) pulls the assistant text out of a chat result. SOURCES: when the flow searches a knowledge base, zw.sources(result) lists the documents the run actually read, as [{ name, documentId }], once each. Show those under the answer for "where did this come from" — never ask the model to write a sources line and parse it out of the text. The flow needs the knowledge base attached BEFORE it is published (workbench_flows_attach_knowledge_base, then workbench_flows_publish, then re-grant the new version here); the interface runs the published version it was granted. FEEDBACK: to let someone rate an answer or flag a wrong one, call zw.feedback.send(result, { rating: "up" | "down", correction, comment }) with the result zw.flows.run returned. It goes to Caliper, into the flow's feedback dataset, with the question and the answer taken from the run itself; correction is what the answer should have been. Needs no extra grant and no table — never make a table to log flagged answers. It returns a promise: say it was sent only once it resolves, and show the error's message if it rejects. Tell the user flagged answers are in Caliper, in the dataset named after the flow, under Datasets. VARIABLES: a flow grant lists variables — the values the flow reads besides the conversation, usually the {{key}} tokens in its prompt (who the user is, their plan, the page they are on). Send them on the same chat run: {kind:"chat", messages:[…], values:{: value}}, using each variable's exact name and its type (string, number, boolean, array, object). A variable left out reaches the prompt empty. Read them from napkin_interfaces_get while you write the page, or at run time from ctx.flows[i].variables. A SHIM is not a flow and takes a different call: zw.shims.run(shimId, text), which decides on the viewer's own device with no network and no cost. It resolves with the same envelope a flow does, so read the decision with zw.decision(result) — NOT result.decision, which is undefined and makes an interface show one answer for every input. The decision is { answer, confidence, familiarity, action, probs, gates }; branch on action, the shim's own call about whether it was sure enough. Calling zw.flows.run with a shim id is refused. ctx.grants tells you which you have: each entry carries a kind of "flow" or "shim" alongside its id and name. DATA: an interface can be granted a sheet TABLE or a Ledger METRIC with napkin_interfaces_grant_data. ctx.tables lists each table with its fields (name, type, options) and access ("read", "add" or "edit"); ctx.metrics lists each metric with its unit and access ("read" or "record"). Records travel keyed by field NAME, choices by option NAME. zw.tables.query(table, { where: [{ field, op, value }], sort: [{ field, dir }], limit }) resolves { records: [{ id, fields }], total }; zw.tables.add(table, { Field: value }) or a list adds records; zw.tables.update(table, id, fields) and zw.tables.remove(table, ids) need "edit". zw.metrics.read(metric, { from, to }) resolves { metric, readings: [{ value, at, note }] }; zw.metrics.record(metric, value, { note }) needs "record". Name a table or metric by its id or its name. Through a share link a guest can read and add, never change or delete — so an intake form works when shared, a triage board needs a signed-in viewer. A granted Workbench TASK (ctx.tasks; each says whether it takesInput) starts with zw.tasks.start(task, input), which resolves { runId, status } at once — the run carries on after the page closes — and zw.tasks.get(task, runId) reads { status, output } for runs this page started. Running a shim on every keystroke is fine — it costs nothing and there is no rate limit. Debounce ~150ms and COALESCE: remember the latest text and run it when the current call finishes, so the answer matches what is on screen. Clear any in-flight guard on failure as well as success, or one call that doesn't come back wedges the interface. d.action is "act" | "suggest" | "refuse" — those three strings, nothing else. Branch on it rather than on a confidence threshold you invent; "refuse" means the shim doesn't recognise the input well enough to answer, so say so rather than showing a low-confidence guess. If you run a requestAnimationFrame loop, remove CSS transitions from any property it writes — the two fight and the property looks frozen. A flow answers in markdown: render it with el.replaceChildren(zw.markdown(text)). It builds DOM nodes, so model output is never treated as markup. STREAM chat answers: zw.flows.run(id, input, { onEvent: fn }) delivers the text token by token, and a flow that takes several seconds reads as broken without it. Use zw.textDelta(event) for each chunk — it returns null for anything that isn't text, so pass it every event — and accumulate. The promise still settles at the end with the whole result; take the final text from there. onEvent also sees node_start / node_complete / node_error if you want to name the step. Don't name a top-level variable history, name, status, length, origin or top: those are already window properties, so var history = [] leaves you with the browser's History object and history.push fails. Prefix it, or keep it inside a function. THE KIT: every new interface also has kit.css, components built only from the brand's variables — link it after brand.css () and build from its classes rather than styling from scratch: layout (.page, .page.wide, .header, .stack, .row, .grid), type (h1, h2, h3, .muted, .small, .label, .num, .stat), buttons (.btn, .btn.secondary, .btn.quiet, .btn.sm, .btn.icon), fields (.field with a .label, then .input / .select / .textarea, then a .hint or .error; .check for a checkbox), .chips and .chip, .badge (.up, .down, .accent), .card, .list, .meter, states (.empty, .skeleton, .spinner, .notice, .notice.error), chat (.thread, .bubble.me, .bubble.them, .typing, .composer), and .icon for a Lucide icon. Its tokens are var(--ink), var(--muted), var(--bg), var(--surface), var(--accent), var(--line), var(--tint), var(--radius) and spacing var(--s1)…var(--s7). The starters show the kit used well; read one before writing a page of your own. Design it the way a good product is designed: a clear hierarchy, real spacing, states for loading, empty and failure, and a layout that works on a phone first. Use the brand kit (napkin_brand_get) for what the brand looks like and how it sounds.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Full replacement contents for `path`. Creates the file when it doesn't exist. Prefer `edits` on a file that already has something in it. With `append: true`, added to the end of the file instead. | |
| name | No | ||
| path | No | Which file to write. Defaults to index.html. Use lowercase names like app.js or style.css. | |
| edits | No | Targeted find/replace pairs, applied in order. All must match or none are applied. | |
| append | No | With `body`: add it to the end of `path` (creating the file if needed) instead of replacing it. How to write a file too long for one call: first part with `body`, the rest with `append: true`, in order. | |
| archived | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| deleteFile | No | Remove `path` from the interface. | |
| visibility | No | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. | |
| description | No | ||
| interfaceId | Yes | Interface id from napkin_interfaces_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, and the description adds substantial context beyond that: the ~15,000-character ceiling that silently truncates, the all-or-nothing semantics of edit batches, and that index.html cannot be deleted. It loses a point because the stated 15k write ceiling sits in tension with the schema's maxLength of 400000, leaving the real limit ambiguous.
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 first two sentences are tight and front-loaded, but the body then expands into a multi-thousand-word manual covering library tags, brand variables, chart config, kit.css class names and task APIs. Much of this is useful content, but it is overwhelmingly long for a tool description and buries the operative write semantics.
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 file-writing tool with no output schema and 11 parameters, the description supplies everything needed to call it correctly: write modes, size limits, ordering, file conventions, and the reading/inspection loop. Nothing an agent needs to invoke it safely 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?
With 73% schema coverage and 11 params, the description still adds meaning for the params the schema leaves bare: 'Also rename, describe, set visibility, or archive' covers name/description/archived/visibility, and it explains append as the chunked-write mechanism. It does not add much on `workspace`, but the important write parameters are well explained.
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 'Write one file of an interface' gives a specific verb and resource, and the description immediately names the three write modes (`edits`, `body`, `deleteFile`) plus the read sibling (`napkin_interfaces_get`) an agent must call first. An agent can distinguish this from napkin_interfaces_create, napkin_interfaces_view and napkin_interfaces_grant_data 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?
Explicit routing: `edits` is 'the SAFEST option and the one to reach for by default', `body` is 'for a new file or a deliberate rewrite', `append: true` for parts of a long file, and 'Read with napkin_interfaces_get first'. When-to-use and alternatives are stated outright rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_layouts_listList slide layoutsARead-onlyInspect
Lists the slide layouts napkin_deck_compose can build from — the brand kit's own first, then the built-in ones — with when to use each and the slots it takes (needs must be filled; takes are optional). Every layout adapts to every size, fits its text, and uses the brand's colors, faces and logos; the logo fills itself in. Pick by what the slide has to say: one line (statement), a number (stat), a quote, a list (points, steps), an event, a carousel (cover, inner, closing), a picture (image-top, image-full, split, corner, product-shot), or a display ad (banner).
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
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 safety is covered. The description adds genuine context beyond that: ordering of results, that every layout adapts to every size, fits its text, inherits brand colors/faces/logos, and that the logo fills itself in. It does not discuss pagination or whether workspace scoping changes the result set.
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 verb, resource and composition target, then the ordering rule, then the field semantics, then the selection taxonomy. Dense and mostly waste-free, though the trailing layout enumeration is long and only a picker list keeps it from being bloat.
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 carries the burden of describing the return contents — it does so by naming the (needs filled, takes optional) field distinction and the ordering. Combined with the selection taxonomy, an agent can call this and act on the result without further discovery.
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 parameter (workspace) at 100% schema coverage, so the schema already documents it and the description does not need to. The needs/takes explanation refers to returned layout metadata rather than to input parameters, 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 and resource ('Lists the slide layouts') and ties it directly to its consumer, napkin_deck_compose, which is a sibling tool. The added detail that brand-kit layouts come first, then built-in ones, makes the scope unambiguous versus other napkin_* list tools.
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 selection by slide intent: 'Pick by what the slide has to say: one line (statement), a number (stat), a quote, a list (points, steps), an event...'. It also names the downstream tool it feeds, so an agent knows this is the discovery step before composing. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_add_chartPin a chart onto a sheetAInspect
Adds a LIVE chart to a sheet — its SQL re-runs against the tabs on every view, so it never goes stale. Write the query with napkin_sheets_query first to confirm the shape (first column = x axis, numeric columns = series, or set x/series explicitly). Prefer aggregated queries (GROUP BY) — a chart of raw rows is rarely the answer.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | ||
| sql | Yes | The SELECT to chart. | |
| type | Yes | ||
| title | Yes | Chart title. | |
| series | No | ||
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| stacked | No | Stack the series (bar/area only). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description adds a genuinely non-obvious behavioral trait: the chart is live, re-executing its SQL against the tabs on every view. It doesn't mention limits, failure behavior on invalid SQL, or chart-count 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?
Three sentences, each earning its place: the live-behavior hook is front-loaded, then the query-shape prerequisite, then the aggregation recommendation. No filler or restated field names.
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 8-parameter mutation tool with no output schema, the description covers the key unknowns an agent needs: that the chart is live, how columns map to axes/series, and the recommended query shape. It omits what is returned (e.g., a chart id) and any failure conditions, which are the remaining gaps.
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 63% and the two chart-mapping fields (x, series) carry no schema descriptions, yet the description explains their derivation rule: first column = x axis, numeric columns = series, overridable by setting them explicitly. That is meaning the schema cannot express. It says nothing about type/stacked interplay or the workspace parameter, which the schema partly covers.
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 ('Adds a LIVE chart to a sheet') and immediately distinguishes the artifact from a static image by explaining the SQL re-runs on every view. Enough to separate it from siblings like napkin_sheets_view_chart or napkin_sheets_set_cells 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 a concrete prerequisite workflow ('Write the query with napkin_sheets_query first') and a preference ('Prefer aggregated queries (GROUP BY)'), which steers the agent before it commits. It stops short of explicit when-not-to-use guidance or a stated alternative to pinning a chart at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_createCreate a Napkin sheetAInspect
Creates a Napkin sheet (multi-tab spreadsheet), optionally titled. Then populate it with napkin_sheets_set_cells (headers in row 1). Tell the user where it landed — the Sheets tab in Napkin.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write operation (readOnlyHint false), non-destructive, and non-open-world. The description adds useful behavioral context beyond annotations: it creates a multi-tab spreadsheet, supports optional title, prescribes headers in row 1 when populating, and tells where the sheet appears.
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 front-loaded sentences with zero waste: what it creates, how to populate it, and what to tell the user. Every sentence contributes actionable guidance.
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 creation tool with no output schema, the description covers the core action, next step, and outcome location. It omits workspace/auth nuance that the schema documents, but no critical calling information 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 50%; the workspace parameter is documented in the schema, but title has no schema description. The description only says 'optionally titled,' adding minimal semantic detail and no format or length guidance, so it does not fully compensate for the coverage gap.
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 ('Creates') and resource ('Napkin sheet'), clarifies it is a multi-tab spreadsheet, and explicitly names the sibling tool for populating it (napkin_sheets_set_cells). This clearly distinguishes it from update/list/query 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?
Gives clear context for use: create the sheet, then populate via napkin_sheets_set_cells, and tell the user where it landed. It does not explicitly state when not to use it or name alternative creation/update tools, but the intended workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_listList Napkin sheetsARead-onlyInspect
Lists the workspace's Napkin sheets (multi-tab spreadsheets — the small-data surface) newest first with tab/chart counts. Archived sheets are hidden unless includeArchived; q narrows by title. Inspect one with napkin_sheets_schema, then query it with napkin_sheets_query.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Title contains (case-insensitive). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| includeArchived | No | Also list archived sheets (default false). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely useful behavior beyond that: results are ordered newest-first, archived sheets are hidden by default, and counts are included per sheet — all of which affect how the agent interprets the result set.
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 dense sentences with zero filler: the first front-loads what is listed and how results are shaped, the second handles filtering defaults and the downstream tool chain. Every clause carries information an agent needs.
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 list tool with full schema coverage and no output schema, the description supplies ordering, filtering defaults, and result content, which is enough to call it correctly. It stops short of mentioning pagination or result caps, a minor gap for a listing endpoint.
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 `q`, `workspace`, and `includeArchived`, including the workspace-default rules. The description repeats the `includeArchived` default and `q` title-matching without adding syntax, format, or precedence detail beyond the schema, so the baseline of 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 (lists) and resource (Napkin sheets) and defines the resource inline as 'multi-tab spreadsheets — the small-data surface', distinguishing it from sibling surfaces like tables and boards. It also specifies ordering and return content (newest first, tab/chart counts), so an agent knows exactly what this returns.
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 to the follow-up flow: 'Inspect one with napkin_sheets_schema, then query it with napkin_sheets_query,' which names the correct alternatives and their sequence. However, it gives no exclusion criteria (e.g., skip listing when the sheet id is already known), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_queryRun SQL against a sheetARead-onlyInspect
Runs a SQLite SELECT over a sheet's tabs-as-tables (get the table/column names from napkin_sheets_schema first). Full SQLite dialect: WHERE, GROUP BY, ORDER BY, JOINs across tabs, aggregates. Results cap at 200 rows. This is THE way to answer questions about a sheet's data — never eyeball cells when a query can answer precisely.
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | A single SELECT. | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, so safety is covered; the description adds two behavioral facts the structured data does not: the 200-row result cap and the supported SQL surface. It does not say what happens to non-SELECT input or where the cap is enforced (truncation vs error), which keeps it out of 5 territory.
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 resource, then the prerequisite in parentheses, then the dialect and cap, then the usage directive. Nothing is redundant, though the emphatic 'This is THE way' phrasing is slightly promotional for the informational payload 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?
For a 3-parameter read-only tool with no output schema and full schema coverage, the essentials are present: prerequisite tool, dialect, row cap, and when to use it. The only gap is that nothing describes the shape of the returned result set beyond its row ceiling.
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 exceeds it by explaining what 'sql' can actually contain (JOINs across tabs, aggregates, GROUP BY/ORDER BY) and by clarifying the tabs-as-tables mental model that makes 'sheetId' meaningful. It still leaves the 5000-char limit and the 'single SELECT' constraint 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?
The description names a specific verb (runs a SQLite SELECT) and resource (a sheet's tabs-as-tables), and immediately bounds the scope with 'Full SQLite dialect: WHERE, GROUP BY, ORDER BY, JOINs across tabs, aggregates.' An agent can distinguish it from napkin_sheets_set_cells (write) or napkin_tables_query (a different resource) 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 gives an explicit prerequisite and ordering ('get the table/column names from napkin_sheets_schema first') plus a clear directive on when to prefer querying over reading cells ('never eyeball cells when a query can answer precisely'). It stops short of naming the exclusion case explicitly — e.g., distinguishing it from napkin_tables_query for non-sheet data — so it is strong context rather than fully exhaustive routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_schemaA sheet's SQL schemaARead-onlyInspect
Returns a sheet's tabs as SQL table definitions — CREATE TABLE scripts with row counts (each tab is a table; its header row names the columns; formula cells contribute computed values). Read this BEFORE writing a napkin_sheets_query so your SQL matches the real tables.
| Name | Required | Description | Default |
|---|---|---|---|
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
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 genuinely new behavioral context the annotations cannot: the shape of the returned artifact (CREATE TABLE scripts with row counts) and the semantic mapping that each tab is a table, its header row names columns, and formula cells contribute computed values. It does not mention pagination or size limits for large sheets, 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?
Two sentences, no filler. The purpose and return shape are front-loaded, and the imperative prerequisite ('Read this BEFORE...') closes the description as the action-driving clause.
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 carries the burden of describing the return value — and it does, down to the CREATE TABLE format, row counts, column naming, and formula evaluation. For a two-parameter read-only tool this is 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 description coverage is 100%, so sheetId and workspace are already fully documented, including the workspace-token rules. The description only implies that a sheet is addressed, adding no syntax or format detail beyond the schema — the baseline 3 for schema-carried parameters.
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 ('Returns a sheet's tabs as SQL table definitions — CREATE TABLE scripts with row counts') and immediately distinguishes itself from napkin_sheets_query, which returns data rather than structure. An agent can tell the two apart 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?
Explicitly prescribes the workflow: 'Read this BEFORE writing a napkin_sheets_query so your SQL matches the real tables.' It names the sibling tool and the condition that should trigger this call, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_set_cellsWrite cells into a sheet tabADestructiveInspect
Sets cells in one tab of a sheet, by A1 address — values or formulas ('=SUM(B2:B9)'). Additive and surgical: only the addressed cells change. Check napkin_sheets_schema first so you know the tab names and where data ends; put headers in row 1 when creating a new region. To build a whole small table, write header cells + data cells in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| cells | Yes | A1 → raw value/formula, e.g. {"A1":"Region","B2":"=SUM(B3:B9)"}. | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| tabName | No | Tab name (defaults to the first tab). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuinely useful nuance that tempers that hint: 'Additive and surgical: only the addressed cells change', clarifying that the write is scoped rather than wholesale. It does not mention the needs_confirmation/approvalId flow, but that is documented in 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 action, then behavior ('additive and surgical'), then the workflow prerequisite and construction advice. Four dense sentences with no filler, each carrying distinct 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 5-param mutation tool with no output schema, the description covers the prerequisite lookup, the write semantics, and how to compose a small table in one call. It omits any hint about the return value or the approval round-trip, but annotations plus the schema's approvalId field cover enough that the gap is minor.
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 schema already documents the A1-keyed cells map, sheetId, tabName default, workspace rules and approvalId. The description's 'values or formulas' and A1 notes largely restate what the cells property description already gives, adding little beyond 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 and resource ('Sets cells in one tab of a sheet, by A1 address') and enumerates what can be written (values or formulas with an example). It also distinguishes itself from the broader sheet-level siblings like napkin_sheets_update by emphasizing the per-cell, surgical scope, so an agent can pick it 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 an explicit prerequisite ('Check napkin_sheets_schema first so you know the tab names and where data ends') and a structural convention ('put headers in row 1 when creating a new region'). It stops short of naming a competing tool to use instead for other cases (e.g. napkin_sheets_update vs this), but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_updateRename, describe, archive, or share a Napkin sheetADestructiveInspect
Edits a sheet's details: title, description, visibility, or archived (true takes it out of the gallery; false brings it back — the recovery move for a sheet created by mistake or no longer wanted). Cells are edited with napkin_sheets_set_cells, not here. Sheet ids come from napkin_sheets_list.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| archived | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| visibility | No | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. | |
| description | No | Short gallery summary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes beyond them by explaining what the destruction actually is: archived=true removes the sheet from the gallery and false restores it, framing it as a reversible recovery move. It does not disclose permission/authorization requirements or whether omitting a field leaves it unchanged.
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 tight sentences, front-loaded with the editable field list, followed by the sibling exclusion and id source. The parenthetical on archived is the only long clause and it earns its space by defining the destructive behavior.
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 annotations covering the safety profile and no output schema, the definition covers intent, editable fields, sibling boundaries, and id sourcing. The one real gap is partial-update semantics: it never says whether passing only title preserves the other fields, which matters for a four-optional-field update.
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 67%, and the description compensates for the two bare parameters by explaining archived's true/false semantics, which the schema leaves undocumented. title and description are only named, not elaborated, but their names are self-explanatory against the schema's maxLength constraints.
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 (Edits) and resource (a sheet's details) and enumerates the exact editable fields: title, description, visibility, archived. It also distinguishes itself from the sibling napkin_sheets_set_cells by explicitly stating cells are edited there, not here.
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 the sibling alternative for cell edits ('Cells are edited with napkin_sheets_set_cells, not here') and the id source ('Sheet ids come from napkin_sheets_list'), which prevents the most likely misuse. It does not explicitly state when to prefer this over napkin_sheets_create, though the field list makes that mostly self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_sheets_view_chartView a sheet chartARead-onlyInspect
Renders one of a sheet's pinned charts against the LIVE data and returns the image so you can SEE it — the exact chart the user sees. The text part carries imageUrl; to show the user the chart inline in your reply, put a markdown image on its own line: . Use after napkin_sheets_add_chart to confirm the chart reads well, or whenever the user asks about a chart.
| Name | Required | Description | Default |
|---|---|---|---|
| chartId | Yes | Chart id (napkin_sheets_list shows chart counts; the sheet's charts carry ids). | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false and closed-world, so the safety profile is covered. The description adds real value beyond that: it explains the output is an image rendered against live data and that the text part carries an imageUrl for inline markdown display. It stops short of covering failure modes (invalid chartId, no pinned charts).
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 core action and result, followed by the practical display instruction and then usage triggers. No sentence is redundant and the markdown snippet is directly actionable.
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 usefully compensates by explaining the returned imageUrl and how to render it inline. Parameters are fully documented in the schema, so an agent has what it needs to invoke correctly; only error/edge-case behavior 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 description coverage is 100%, so chartId, sheetId and workspace are already documented in the schema; the baseline is 3. The description adds only marginal meaning, clarifying that the chartId refers to a pinned chart of the sheet, which the schema largely conveys already.
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 (renders/returns an image), a specific resource (one of a sheet's pinned charts), and a precise scope (against LIVE data, the exact chart the user sees). It is easily distinguished from siblings like napkin_sheets_add_chart or napkin_sheets_query 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 gives two explicit triggers: 'Use after napkin_sheets_add_chart to confirm the chart reads well' and 'whenever the user asks about a chart,' naming the predecessor sibling. There is no when-not guidance or mention of alternative viewing tools, so it falls just short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_slide_addAdd a slide to a deckAInspect
Appends one slide to an existing deck. Pick a layout (title | section | title-body | title-lead | two-column | three-column | comparison | statement | quote | closing | blank), give the title, and optionally content — markdown for the layout's remaining text areas, split by --- lines (two-column/comparison take one block per column). Check the deck first with napkin_deck_outline.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Slide title. | |
| layout | Yes | Layout key: title | section | title-body | title-lead | two-column | three-column | comparison | statement | quote | closing | blank. | |
| boardId | Yes | Napkin board id (a deck). | |
| content | No | Markdown body — blocks split on `---` lines. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation is mutating but non-destructive and closed-world, so the safety bar is lower. The description adds that slides are appended to an existing deck (position at end) and how content maps to layout text areas, which is useful behavioral context beyond 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 purpose, and the ordering instruction comes last. The inline layout enumeration duplicates the schema's layout description verbatim, which is minor redundancy, though the enumeration does earn its place as an at-a-glance reference.
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 moderate-complexity, 5-parameter mutation tool with no output schema, the description covers purpose, layout choice, content formatting, and a prerequisite check. It does not describe what is returned (e.g., a slide id usable with napkin_slide_update), but with no output schema that omission is acceptable.
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 beyond it: content is 'markdown for the layout's remaining text areas' and 'two-column/comparison take one block per column.' It explains the per-column block behavior that the schema does not.
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: 'Appends one slide to an existing deck.' An agent can tell this adds a single slide rather than creating a deck. However, it never explicitly distinguishes itself from siblings like napkin_deck_write, napkin_slide_update, or napkin_slide_fill, so differentiation is left to inference.
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 workflow prerequisite: 'Check the deck first with napkin_deck_outline,' naming a companion tool. It also clarifies what to supply (layout, title, optional content). It stops short of explicit when-not-to-use guidance or naming the write/update siblings as alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_slide_fillFill a slide's empty text areasAInspect
Fills a slide's empty layout text areas by NAME — the names napkin_deck_outline surfaces as [empty text stub: "…"]. Pass texts mapping those exact names to content (markdown - bullets welcome). Read the outline first to see which stubs a slide still has open.
| Name | Required | Description | Default |
|---|---|---|---|
| slide | Yes | 1-based slide number in presentation order. | |
| texts | Yes | Placeholder name → content, e.g. {"Add a title": "Q3 Review"}. | |
| boardId | Yes | Napkin board id (a deck). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-destructive mutation, and the description adds the key behavioral nuance — it only fills *empty* areas, so it will not clobber existing content, and markdown formatting is honored. It does not say what happens on a name mismatch or repeated fills.
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, then the name contract, then the precondition. Nothing is redundant with the title or 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?
Covers the mutation semantics, the naming contract, and the outline-first workflow for a tool with no output schema. Missing only edge-case behavior (unknown stub names, whether re-filling an already-filled area overwrites or errors).
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 semantics beyond it: `texts` keys must be the *exact* stub names surfaced by the outline, and values accept markdown bullets. That name-matching constraint is not in 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 with its distinguishing scope: it fills only a slide's *empty layout* text areas, keyed by name. An agent can tell it apart from napkin_slide_update or napkin_deck_write 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 a clear precondition and workflow: read the outline first to see which stubs remain open, then pass those exact names. It names napkin_deck_outline as the source of truth, but does not state when not to use it (e.g. for non-stub content, use slide_update).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_slide_updateMove or change a deck slideADestructiveInspect
Changes one slide as a whole: move it to another position in the deck (moveTo, 1-based — the other slides shift around it), hide it from the show without deleting it (skipped), show or hide its slide number (pageNumber), or replace its speaker notes (notes, markdown). Slide numbers come from napkin_deck_outline. To change what's ON the slide, use napkin_slide_fill or napkin_draw.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Speaker notes (markdown); replaces the current notes. | |
| slide | Yes | 1-based slide number in presentation order. | |
| moveTo | No | New 1-based position for this slide. | |
| boardId | Yes | Napkin board id (a deck). | |
| skipped | No | true hides the slide from present mode and exports. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. | |
| pageNumber | No | Show the slide number on this slide. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false. The description adds useful context beyond them: moveTo shifts other slides, skipped hides without deleting, and notes replaces existing notes. It does not discuss undo or permissions, but it meaningfully clarifies side effects.
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 overall purpose, then lists supported parameters compactly, and ends with routing guidance. No sentence is wasted.
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 operation scope and sibling alternatives, and no output schema means return values need not be explained. Missing only minor details such as reversibility or required permissions beyond the schema's workspace note.
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 each parameter. The description repeats key semantics (1-based moveTo, skipped hides, notes markdown) and adds only that other slides shift around the moved slide, so the baseline of 3 is appropriate when structured data does most of the work.
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 ('Changes one slide as a whole') and enumerates the four supported operations: move, hide, page-number toggle, and speaker-notes replacement. It also explicitly distinguishes this tool from content-editing siblings napkin_slide_fill and napkin_draw.
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 the alternatives for changing slide content ('use napkin_slide_fill or napkin_draw') and points to napkin_deck_outline as the source for slide numbers. This gives clear when-to-use and when-to-use-something-else guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_slide_viewView one deck slide (rendered image)ARead-onlyInspect
Renders a single slide of a Napkin deck to an image — exactly what present mode shows, cropped to the slide. Navigate by 1-based slide number in presentation order (get the map from napkin_deck_outline first; the result echoes slideIndex/slideCount so you can step through a deck slide by slide). Use this to check visual layout, drawings, and images that the text outline can't carry.
| Name | Required | Description | Default |
|---|---|---|---|
| slide | Yes | 1-based slide number in presentation order. | |
| boardId | Yes | Napkin board id (a deck). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/destructive hints, so the safety profile is covered. The description adds real context beyond annotations: the output is a rendered image matching present mode, it echoes slideIndex/slideCount enabling stepwise navigation, and it warns the text outline can't carry visual content. It doesn't mention pagination, rate limits, or auth nuance (beyond workspace, which the schema covers).
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 what it produces, then navigation and rationale. Efficient and no filler, though the parenthetical about slideIndex/slideCount packs in navigation detail that could be tighter.
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 3-param renderer with no output schema, the description covers what the tool returns (an image, present-mode-equivalent), how to navigate a deck, and when to use it versus the outline. 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%, so boardId, slide, and workspace are fully documented in the schema. The description reinforces the 1-based presentation-order semantics of 'slide' and explains that the result echoes slideIndex/slideCount, but adds no syntax or format 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?
Specific verb (renders) plus resource (a single slide of a Napkin deck) plus the equivalence 'exactly what present mode shows, cropped to the slide'. This distinguishes it cleanly from siblings like napkin_deck_outline (text map) and napkin_deck_export.
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: check visual layout, drawings, and images the text outline can't carry. Explicit prerequisite workflow: get the map from napkin_deck_outline first, navigate by 1-based slide number. It names the alternative source of information and states the condition selecting this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_add_columnsAdd columns to a sheet tableAInspect
Adds columns to the end of a table. Existing records leave them empty.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | The table tab's name or id. | |
| columns | Yes | ||
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is partly covered. The description adds real value beyond them by disclosing the data consequence: columns are appended at the end and existing records are left empty (i.e., no backfill, no data loss). It omits the approval/needs_confirmation flow that the approvalId parameter implies.
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, zero filler, with the verb and resource front-loaded and the behavioral caveat placed second. Every sentence carries 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 mutation tool with no output schema, the description covers purpose and one behavioral consequence, and the rich schema carries most remaining detail (limits of 30 columns, sheetId source, approval flow). It still leaves prerequisites and the approval handshake to inference, so it is only minimally 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 description coverage is 80%, so the schema already documents sheetId, table, workspace, approvalId, and the nested column fields (name, type, format, options, description). The description adds no parameter-level detail beyond what the schema provides, 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 ('Adds columns') plus scope ('to the end of a table'), which distinguishes it from napkin_tables_create and napkin_tables_add_records without naming them. Clear and unambiguous, but it never explicitly routes the agent away from the sibling tools that also mutate table structure.
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: it doesn't say to reach for this only on an existing table, nor how it relates to napkin_tables_create (which likely defines columns up front) or napkin_tables_update_records. The agent must infer the scenario entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_add_recordsAdd records to a sheet tableAInspect
Adds records, each a map of field name → value. Choices by option name (a new name becomes a new option); dates as YYYY-MM-DD; people by user id; checkboxes true/false. Every problem is reported at once and nothing is written until all records are valid.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | The table tab's name or id. | |
| records | Yes | ||
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, closed-world behavior. Beyond that, the description discloses meaningful runtime semantics: records are validated atomically ('nothing is written until all records are valid') and all errors are returned in one batch. It omits any mention of permissions or the 200-record cap, but the transactional guarantee is exactly the kind of context an agent cannot get from 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 short sentences, front-loaded with the core action, then input formats, then the atomicity guarantee. Every clause carries information and nothing is repeated from the schema or 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 covers input semantics and failure behavior well enough to call the tool correctly, but it never says what a successful call returns (e.g., created identifiers or an insertion count). That is the one gap for a mutation tool with no documented response.
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 80%, so the baseline is 3, but the description adds real meaning the schema lacks: the records payload is additionalProperties with no field-level typing, and the description supplies value formats (option name for choices, YYYY-MM-DD for dates, user id for people, true/false for checkboxes). It does not explain workspace/approvalId flows, 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 description states a specific verb and resource ('Adds records' to a table, per the title), which is unambiguous and distinct from add_columns or query. However, it never explicitly distinguishes itself from the closest sibling napkin_tables_update_records, leaving the agent to infer the boundary from the tool name alone.
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, no prerequisites, and no routing to alternatives such as update_records or delete_records. The text is entirely about input formatting, not about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_add_viewAdd a view to a sheet tableAInspect
Adds a saved view everyone sees: a grid (with where / sort), a board (lanes from a select or person column — groupBy), or a form people fill in to add records (formFields, formTitle, formIntro). A form's share link is made from the sheet's form view.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| name | Yes | ||
| sort | No | ||
| table | Yes | The table tab's name or id. | |
| where | No | ||
| groupBy | No | Board: the select or person column whose values are the lanes. | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| formIntro | No | ||
| formTitle | No | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| formFields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-destructive mutation (readOnlyHint=false, destructiveHint=false), and the description adds meaningful context beyond that: views are shared ('everyone sees') and a form's share link is derived from the sheet's form view. Auth/approval mechanics are left to 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?
A single front-loaded sentence that leads with the core action and visibility scope, then branches into the three kinds. Dense but essentially waste-free; only mildly long for the information carried.
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 12 parameters and no output schema, the description covers the three view kinds and their key fields well. It omits the workspace/approval requirements, but those are already documented in the schema, so the description is nearly 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 description coverage is only 42%, so the description must compensate. It helpfully maps parameters to view kinds (where/sort for grid, groupBy for board, formFields/formTitle/formIntro for form), but gives no format or syntax detail and leaves several parameters unexplained.
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 (Adds) and resource (a saved view) scoped to a sheet table, then enumerates the three view kinds (grid, board, form) with their distinguishing mechanics. An agent can immediately tell what it creates 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?
Usage is implied through the kind options and their descriptions (grid for where/sort, board for lanes, form for data entry), but there is no explicit when-to-use vs when-not guidance or named alternative among siblings like napkin_tables_create or napkin_boards_create.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_createMake a table of recordsAInspect
Makes a table tab — typed columns, one record per row, with grid, board and form views — in an existing sheet, or in a new sheet when sheetId is omitted. Use a table (not napkin_sheets_set_cells) for lists people keep: requests, vendors, bugs, contacts. The first column names each record. Column types: text, long_text, number, date, checkbox, select, multi_select, person, url, email.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The table's name, e.g. Requests. | |
| columns | Yes | ||
| sheetId | No | Add to this sheet; omit to make a new sheet. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. | |
| sheetTitle | No | Title for a new sheet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-destructive write (readOnlyHint=false, destructiveHint=false). The description adds genuine context beyond that: that a new sheet is created when sheetId is omitted and that the first column names each record. It does not mention the approval/confirmation flow, though the approvalId parameter documents that in 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 action and scope, then usage guidance, then column types. Every sentence carries weight, though the trailing column-type enumeration slightly overlaps the schema enum and adds length without much new 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 creation tool with no output schema, the description covers what is built, where it lands, and the column vocabulary. The only minor gap is not surfacing the needs_confirmation/approvalId interaction, which the schema handles instead.
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 83%, so the schema already documents most parameters, including the sheetId-omission behavior. The description's column-type list largely duplicates the schema enum, and only the 'first column names each record' detail adds meaning 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?
States a specific verb and resource ('Makes a table tab') and immediately distinguishes it from the sibling napkin_sheets_set_cells. It also describes the artifact concretely (typed columns, one record per row, grid/board/form views), so an agent knows exactly what is produced.
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 alternative it is not ('not napkin_sheets_set_cells') and gives the selecting condition ('lists people keep: requests, vendors, bugs, contacts'). It also states the branch behavior for sheetId omission, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_delete_recordsDelete records from a sheet tableADestructiveInspect
Deletes records by id. People can undo this in the sheet only while it's open, so confirm with the person first.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | ||
| table | Yes | The table tab's name or id. | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is known. The description adds important behavioral context beyond the annotations: the undo limitation ('only while it's open') and the need for human confirmation. It does not cover permissions or rate limits, but adds significant value.
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 that are front-loaded with the core action and immediately follow with critical usage guidance. 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?
Given the tool's complexity (5 parameters, destructive action, no output schema), the description covers the essential behavioral aspects: deletion operation, undo window, and confirmation requirement. It is nearly complete, though it could mention required permissions or workspace context.
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 80%, meaning most parameters are documented in the schema itself. The description adds no parameter-specific details, so the baseline score of 3 is appropriate as 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?
The description states a specific verb and resource: 'Deletes records by id'. This clearly distinguishes it from sibling tools like napkin_tables_add_records and napkin_tables_update_records, as it is the only delete operation among the napkin table tools.
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 provides a crucial prerequisite: 'confirm with the person first', which sets a condition for use. However, it does not explicitly mention alternatives or when not to use it, though the action is inherently distinct from other table operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_getDescribe a sheet tableARead-onlyInspect
A table tab's columns (name, type, choices), its views, and how many records it holds. Read this before writing records so field names and choices match.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | The table tab's name or id. | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive, non-open-world behavior, so the bar is lower. The description adds that the call returns column definitions, views, and record counts, which is meaningful behavioral detail given no output schema exists.
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, zero filler, with the payload front-loaded and the usage instruction second. Every clause 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 no output schema, the description carries the return-shape burden and does so reasonably (columns, views, record count), and annotations cover the safety profile. Minor gaps remain: no pagination/size hints for large tables and no mention of the query sibling for reading actual records.
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 three parameters (sheetId, table, workspace) are already documented in the schema. The description adds no field-level syntax or format guidance beyond that, 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 specifies the exact payload (columns with name/type/choices, views, record count) for a table tab, which cleanly separates it from napkin_tables_query (records) and napkin_sheets_schema (sheet-level). It is a noun-style description of returned content rather than an explicit verb phrase, but the resource and scope are 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?
'Read this before writing records so field names and choices match' gives a clear, actionable when-to-use trigger tied to the write siblings (napkin_tables_add_records/update_records). It stops short of naming those siblings or the query alternative explicitly, so it is clear context without full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_queryFind records in a sheet tableBRead-onlyInspect
Records from a table tab, keyed by field name, with optional where / sort / search / limit (max 500). For counts, sums and joins, napkin_sheets_query runs SQL over tables too (each table is an SQL table with an id column).
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| limit | No | ||
| match | No | ||
| table | Yes | The table tab's name or id. | |
| where | No | ||
| offset | No | ||
| search | No | ||
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. |
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 useful context that results are keyed by field name and that the limit is capped at 500, plus the SQL-over-tables note, but says nothing about pagination, defaults, or the workspace/auth requirement mentioned only in 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?
Two dense sentences, front-loaded with what is returned before the options and the alternative tool. Nothing is redundant, though the SQL aside is parenthetical and slightly compresses two distinct ideas into one sentence.
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 query with no output schema, the description gives only a hint of the return shape ('keyed by field name') and does not explain pagination/offset behavior or result ordering. It is adequate for a basic fetch but leaves real gaps for a 9-parameter query 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 only 33% across 9 parameters, so the description must carry weight. It names where, sort, search and limit (with the 500 cap) but adds no operator, format or default detail, and ignores offset, match and workspace entirely — the offset/pagination behavior in particular is undocumented anywhere in the description.
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: it returns records from a table tab, keyed by field name, with named filter/sort options. It also carves out an adjacent use case (aggregation) for a sibling. It does not distinguish itself from close siblings like napkin_tables_get, 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?
It explicitly routes the agent elsewhere when the task is a count, sum or join, naming napkin_sheets_query and explaining that each table is an SQL table with an id column. That is a concrete alternative with a selecting condition, though it gives no explicit 'do not use this for X' for other siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
napkin_tables_update_recordsChange records in a sheet tableAInspect
Changes some fields of records by id (from napkin_tables_query). Fields left out keep their values.
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | The table tab's name or id. | |
| sheetId | Yes | Sheet id from napkin_sheets_list. | |
| updates | Yes | ||
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so safety is covered; the description adds genuinely new behavioral context by specifying this is a partial merge ('Fields left out keep their values'), which is not derivable from the annotations. It does not mention the confirmation/approval flow implied by approvalId, so it is 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?
Two tight sentences with no filler; the core action and the id-source pointer are front-loaded. Every clause carries information an agent needs.
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 whose annotations already carry the safety profile, the description covers action, targeting, and merge semantics adequately, and the absence of an output schema means return values need not be explained. Minor gaps remain: the schema-only approval flow and the 200-item cap are not echoed, but they are documented in the 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?
With 80% schema coverage the baseline is 3, but the description adds real meaning to the `updates`/`fields` payload by explaining that omitted fields are preserved rather than cleared. Other parameters (sheetId, table, workspace) are handled adequately 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 (changes), resource (fields of records in a sheet table), and mechanism (by id), which cleanly separates it from siblings like napkin_tables_add_records and napkin_tables_delete_records. It also names napkin_tables_query as the source of ids, giving the agent a clear entry point.
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 supplies a concrete prerequisite/cross-tool path by directing the agent to obtain ids from napkin_tables_query, which is clear usage context. It does not spell out when NOT to use this tool (e.g. full-row replacement vs. cell edits), so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch ZeroWidth docsARead-onlyInspect
Search ZeroWidth product documentation. Returns matching pages with title, slug, public URL, and a query-relevant snippet. Use this when the user asks about a ZeroWidth product (Compass, Workbench, Caliper, Prism, Ledger, Napkin, the assistant), an API behavior, or a policy. No authentication required — the docs corpus is public.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max number of results. Defaults to 10. | |
| query | Yes | Search query — keywords or natural-language phrase. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond the annotations by disclosing that no authentication is required and that the corpus is public — something readOnlyHint/openWorldHint do not convey. However, it says nothing about result ordering, pagination, or behavior when nothing matches, leaving meaningful behavioral gaps for a search 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?
Three short sentences, front-loaded with what it does, then return shape, then when to use it, then the auth fact. Zero 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 two-parameter read-only search with a fully described schema and annotations, this covers purpose, trigger conditions, return fields, and access requirements. Nothing an agent needs in order to call it 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 both parameters are documented inline, so the schema carries the load. The description adds no syntax, ranking, or limit guidance beyond what is already structured; 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 (search ZeroWidth product documentation) and scopes the corpus precisely — public product docs, not workspace content — which separates it from siblings like search_workspace, workbench_kb_search, and compass_pages_search 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 enumerates the triggering conditions: questions about a named ZeroWidth product, API behavior, or policy. It never names an alternative tool or a when-not-to-use case, 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.
search_workspaceSearch the whole workspaceARead-onlyInspect
Finds anything in the workspace in one call — uploaded files (searching the text inside them), folders, Workbench flows, shims, knowledge bases and tasks, Compass pages and changes, Caliper datasets, evals, rubrics, reviews, specs and sources, Ledger entries, Napkin sketches, decks, docs, sheets, diagrams and interfaces. The same search the person uses in Home. Use it FIRST whenever the user mentions something without saying where it lives ('the SOW', 'the dispatch interviews', 'that invoice'). The query is words in any order: each word must appear in the thing's name, its tags, the names of the folders it's filed under, or the text inside it — so 'northwind sow' finds the SOW filed in the Northwind folder, and 'dispatch interview' finds 'Dispatcher interview 1.md'. Results are ranked best first. Each hit carries its id, kind, path (for a link), folderPath (where it's filed, top-down), tags, and a snippet when the words were found inside it rather than in its name — say where a thing lives using folderPath. A file's id feeds workspace_files_read; other ids feed the kind's *_get tool. Pass folderId to search only inside one folder and everything under it. If nothing comes back, try fewer or different words before telling the user it doesn't exist. Results only include what the user can see, and only kinds this token may read.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Words, any order, case-insensitive. Fewer words find more. | |
| kinds | No | Restrict to these kinds (file, folder, flow, page, doc, dataset, …). Omit to search everything. | |
| limit | No | ||
| folderId | No | Only search inside this folder and the folders under it (ids from workspace_folders_browse or a folder hit). | |
| workspace | No | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnly/non-destructive/closed-world, the description adds substantial behavior the annotations cannot express: AND-of-words matching across name, tags, folder names and body text, best-first ranking, per-hit fields (id, kind, path, folderPath, tags, snippet), recursive folderId scoping, and permission-based result filtering ('only what the user can see, and only kinds this token may read').
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 'use it FIRST' rule are front-loaded, and every later sentence adds either query semantics, return shape, or id-chaining guidance. The long enumeration of object kinds is the one place it runs heavy, though it doubles as scope documentation.
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 supplies what an agent needs about results (fields, ranking, snippet meaning, using folderPath to say where a thing lives) and how to chain ids into workspace_files_read or the kind's *_get tool. Permissions, empty-result handling, and workspace/scope limits 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 coverage is 80%, but the description still adds real meaning: it explains what the q words are matched against (name, tags, parent folder names, inner text) and gives worked examples ('northwind sow' finds the SOW in the Northwind folder). It also clarifies folderId is recursive, matching the schema, and leaves well-documented kinds/limit/workspace 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?
Opens with a specific verb and scope: 'Finds anything in the workspace in one call', then enumerates the object kinds covered (files, folders, flows, shims, knowledge bases, tasks, pages, datasets, evals, rubrics, reviews, specs, sources, Ledger entries, Napkin artifacts). This clearly separates it from focused siblings like compass_pages_search, search_docs, workbench_kb_search, and rooms_search, which each cover one kind.
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 trigger condition: 'Use it FIRST whenever the user mentions something without saying where it lives', backed by three concrete user-phrase examples. It also gives a recovery procedure when results are empty ('try fewer or different words before telling the user it doesn't exist'), which is when-to-use guidance beyond the happy path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workspace_files_save_from_chatSave a picture from this chat to your filesAInspect
Save a picture the user attached in THIS conversation to the workspace's files, in the Home folder "From chat", and get back its file id. Use it when the user wants a picture they sent you used somewhere — an interface shows it as (CSS: url(file:)). Pick the picture by name: the name in its [attached image: <name>] marker. Omit name only when the latest message with pictures has exactly one. Saving the same picture again returns the file it was already saved as. Only pictures from this conversation can be saved; a picture on a website can't be fetched, so ask the user to attach it here.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The picture's name, as in `[attached image: <name>]`. | |
| workspace | No | Workspace slug. Ignored when the workspace is already set for this chat. | |
| approvalId | No | Approval id from a prior needs_confirmation response. Omit on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=false), so the bar is lower. The description still adds genuine behavior: idempotent re-saves return the already-saved file, and the destination folder is fixed. It does not discuss failures beyond the website-fetch case, so 4 rather than 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?
Front-loaded with purpose, destination, and return value, then the selection and constraint rules. Mostly earns its place, though the inline CSS/markup rendering detail is slightly incidental to invoking the 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?
With no output schema, the description covers the return (file id) and idempotency, the fixed destination, selection logic, and the source restriction. Nothing needed to call it correctly against the 3-param schema 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 baseline is 3. The description goes beyond it by explaining how to choose `name` (match the `[attached image: <name>]` marker) and the precise condition for omitting it (only when the latest message has exactly one picture), which the schema does not state.
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 (save), resource (a picture attached in this conversation), and destination (workspace files, Home folder 'From chat'), plus the return value (file id). It is clearly distinguishable from sibling reads like workspace_files_read and workspace_folders_browse.
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 trigger ('use it when the user wants a picture they sent you used somewhere') and an explicit boundary ('Only pictures from this conversation can be saved; a picture on a website can't be fetched, so ask the user to attach it here'). The fallback instruction to ask the user makes the when-not case actionable.
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.
2 tool updates
- Changed
napkin_deck_compose1 field changed- added
Input schema / properties / previewsAdded value: +{ + "description": "Default true: the result includes a picture of every slide made. Pass false to skip the pictures — the call returns sooner, which helps with long decks; look at slides afterwards with napkin_slide_view.", + "type": "boolean" +}
- Changed
search_workspace1 field changed- changed
Input schema / properties / kinds / items / enumPrevious value: -[ - "flow", - "page", - "dataset", - "eval", - "entry", - "board", - "file", - "shim", - "knowledge_base", - "task", - "rubric", - "review", - "spec", - "source", - "doc", - "sheet", - "diagram", - "interface", - "change", - "folder" -]New value: +[ + "flow", + "page", + "dataset", + "eval", + "entry", + "board", + "file", + "shim", + "knowledge_base", + "task", + "rubric", + "review", + "spec", + "source", + "doc", + "sheet", + "diagram", + "interface", + "change", + "field", + "study", + "metric", + "folder" +]
1 tool update
- Changed
search_workspace4 fields changed- added
Input schema / properties / folderIdAdded value: +{ + "description": "Only search inside this folder and the folders under it (ids from workspace_folders_browse or a folder hit).", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / kinds / descriptionPrevious value: -"Restrict to these kinds (flow, page, dataset, eval, entry, board). Omit to search everything."New value: +"Restrict to these kinds (file, folder, flow, page, doc, dataset, …). Omit to search everything." - changed
Input schema / properties / kinds / items / enumPrevious value: -[ - "flow", - "page", - "dataset", - "eval", - "entry", - "board", - "file", - "shim", - "knowledge_base", - "task", - "rubric", - "review", - "spec", - "source" -]New value: +[ + "flow", + "page", + "dataset", + "eval", + "entry", + "board", + "file", + "shim", + "knowledge_base", + "task", + "rubric", + "review", + "spec", + "source", + "doc", + "sheet", + "diagram", + "interface", + "change", + "folder" +] - changed
Input schema / properties / q / descriptionPrevious value: -"Case-insensitive substring matched against names/titles."New value: +"Words, any order, case-insensitive. Fewer words find more."
Related MCP Connectors
Markdown notes and whiteboards your AI agent can read and write.
Build decks in your own brand, from the AI agent you already use. Then edit them yourself.
Markdown editor for writing, notes, editable diagrams, drawing and painting with your AI assistant.
- KlyaksaOAuthapp.klyaksa
Online whiteboard your AI agent draws on: live shared canvases, solo or with your team.
Related MCP Servers
- AlicenseBqualityBmaintenanceEnables MCP-capable agents to read, create, modify, align, distribute, organize and export local-first infinite whiteboard content, including sticky notes, text, shapes, arrows, ink, mind maps, images, files and links across multiple pages. Provides 16 tools over stdio or Streamable HTTP, plus resources and prompts, with version-conflict protection and audit trails so canvas edits never silently overwrite newer content.1614MIT
- AlicenseAqualityAmaintenanceOpen-source mind maps and whiteboard your agent draws on live: 22 tools for mind maps, notes, shapes, tables, charts, connectors, comments and HTML/PDF export; boards are local files.4238AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to collaboratively read, write, draw, and diagram on a shared real-time whiteboard canvas with live human edits.1MIT
- AlicenseNot gradedqualityDmaintenanceA shared whiteboard for you and your AI agent I wanted my AI agent and me to be able to point at the same thing. Any MCP-capable agent can read the canvas, draw on it, drop thought bubbles, animate elements, and react when you sketch something.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.