ZeroWidth Napkin
REMOTE · API.ZEROWIDTH.AI
Draw boards, write docs and sheets, and build decks with your brand in Napkin.
Available components
Last scanned (20 hours ago)
Scores higher than 62% of remote servers
Reachable. Last reached 23 Oct 2026.
Category Design and Media
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security57
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (comments_resolve). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability81
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 27325 tokens (~135/item across 202 items; 68 tools + 134 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management50
- Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage93
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 78% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 69 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 22 Oct 26 0
- Tool “search_docs” rewrote its description, which is the text the model reads security
- “napkin_deck_compose” added an optional parameter “previews” cosmetic
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Oct 26 0
- Tool “search_workspace” rewrote its description, which is the text the model reads security
- “search_workspace” added an optional parameter “folderId” cosmetic
- “search_workspace” reworded the description of “kinds” cosmetic
- “search_workspace” reworded the description of “q” cosmetic
- 16 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Oct 26 0
- Tool “napkin_interfaces_create” rewrote its description, which is the text the model reads security
- Tool “napkin_interfaces_get” rewrote its description, which is the text the model reads security
- Tool “napkin_interfaces_view” rewrote its description, which is the text the model reads security
- Tool “napkin_interfaces_write” rewrote its description, which is the text the model reads security
- Schema quality: 113 → 134 ▼ functional
- Server version: 0.0.0 → 1.0.0 functional
- “napkin_interfaces_view” added an optional parameter “size” cosmetic
- “napkin_interfaces_view” added an optional parameter “steps” cosmetic
- “napkin_interfaces_create” reworded the description of “starter” cosmetic
- 14 Oct 26 0
- New tool “napkin_interfaces_grant_data”, which the server declares destructive security
- New tool “napkin_tables_delete_records”, which the server declares destructive security
- Tool “napkin_interfaces_create” rewrote its description, which is the text the model reads security
- Tool “napkin_interfaces_get” rewrote its description, which is the text the model reads security
- Tool “napkin_interfaces_write” rewrote its description, which is the text the model reads security
- Schema quality: 20409 → 22927 ▼ functional
- New resource “prism/synthetic-panels” functional
- New tool “napkin_tables_add_columns” functional
- New tool “napkin_tables_add_records” functional
- New tool “napkin_tables_add_view” functional
- New tool “napkin_tables_create” functional
- New tool “napkin_tables_get” functional
- New tool “napkin_tables_query” functional
- New tool “napkin_tables_update_records” functional
- “napkin_interfaces_write” added an optional parameter “append” cosmetic
- “napkin_interfaces_write” reworded the description of “body” cosmetic
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 23 Oct 2026 · Probed https://api.zerowidth.ai/mcp/x/napkin
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.zerowidth.ai | CN=WR3,O=Google Trust Services,C=US | 20 Sept 2026 | 19 Dec 2026 | RSA 2048 | SHA256-RSA | ef3f24a330d02ed80992778a6ead44bf |
| SANs: api.zerowidth.ai | ||||||
| CN=WR3,O=Google Trust Services,C=US (CA) | CN=GTS Root R1,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | RSA 2048 | SHA256-RSA | 7ff005a91568d63abc22861684aa4b5a |
| CN=GTS Root R1,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 19 Jun 2020 | 28 Jan 2028 | RSA 4096 | SHA256-RSA | 77bd0d6cdb36f91aea210fc4f058d30d |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of api.zerowidth.ai. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| ai. | present | 3799 | 8 | Verified |
| zerowidth.ai. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.zerowidth.ai/mcp/x/napkin | Verified | 200 | |
| http (plaintext) | http://api.zerowidth.ai/mcp/x/napkin | HTTPS enforced |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
comments_create Comment on an entity ~184
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | – |
| body | string | yes | – |
| entityId | string | yes | – |
| entityKind | string | yes | What the thread hangs on. |
| mentionedUserIds | array | – | – |
| rootId | string | – | Reply into this thread; omit to start a new one. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
comments_list Read an entity's comment threads ~105
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 | Type | Req | Description |
|---|---|---|---|
| entityId | string | yes | – |
| entityKind | string | yes | What the thread hangs on. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
comments_resolve Resolve or reopen a thread ~118
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | – |
| resolved | boolean | yes | – |
| rootId | string | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
entity_tags_browse Browse the workspace's tags ~149
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 | Type | Req | Description |
|---|---|---|---|
| tag | string | – | A tag to expand into its items. Omit to list tags. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
entity_tags_get Read the tags on entities ~130
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 | Type | Req | Description |
|---|---|---|---|
| entityKind | string | yes | Which kind the ids belong to. |
| ids | array | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
entity_tags_set Set an entity's tags ~173
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| entityId | string | yes | – |
| entityKind | string | yes | – |
| tags | array | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
get_doc Fetch ZeroWidth doc by slug ~73
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 | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | Page slug. Accepts 'compass/api', '/compass/api', or 'docs/compass/api'. |
No output schema declared.
No examples provided.
list_docs List ZeroWidth docs pages ~75
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 | Type | Req | Description |
|---|---|---|---|
| product | string | – | Optional product slug filter (e.g. 'compass', 'legal', 'overview'). |
No output schema declared.
No examples provided.
napkin_boards_create Create a Napkin board ~168
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 | Type | Req | Description |
|---|---|---|---|
| kind | string | – | Defaults to "sketch". |
| name | string | yes | Board name. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_boards_get Read a Napkin board's shapes ~155
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id (from napkin_boards_list). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_boards_list List Napkin sketches ~225
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 | Type | Req | Description |
|---|---|---|---|
| includeArchived | boolean | – | Also list archived boards (default false). |
| kind | string | – | Only sketches or only decks. |
| q | string | – | Name contains (case-insensitive). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_boards_update Rename, describe, archive, or share a Napkin board ~203
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 | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | – |
| boardId | string | yes | Napkin board id (from napkin_boards_list). |
| description | string | – | – |
| name | string | – | – |
| visibility | string | – | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_boards_view View a Napkin sketch (rendered image) ~135
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id to render. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_add_files Add pictures to a brand kit ~298
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 | Type | Req | Description |
|---|---|---|---|
| files | array | yes | – |
| kind | string | – | Only when no section has that title yet: the kind of section to make. |
| kitId | string | yes | The kit to add to (napkin_brand_list). |
| section | string | yes | Title of the section to add them to, like Logo, Imagery or Examples. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_apply Apply the brand to a piece ~249
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 | Type | Req | Description |
|---|---|---|---|
| accent | string | – | Name of one of the kit's colors to use as this piece's accent. |
| deck | string | – | Board id of a deck. |
| interface | string | – | Interface id. |
| kitId | string | – | A brand kit id from napkin_brand_list. Omit for the workspace's brand. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_check Check writing against the brand ~160
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | – | A deck or sketch to check. |
| docId | string | – | A doc to check. |
| kitId | string | – | A brand kit id from napkin_brand_list. Omit for the workspace's brand. |
| text | string | – | Text to check. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_draft Draft a brand kit ~503
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 | Type | Req | Description |
|---|---|---|---|
| content | object | – | – |
| description | string | – | – |
| fromKitId | string | – | New kits only: start from this kit's values. |
| kitId | string | – | Kit to edit. Omit to create a new kit. |
| name | string | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_examples Look at the brand's examples ~138
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 | Type | Req | Description |
|---|---|---|---|
| kitId | string | – | Kit to look at. Omit for the workspace's brand. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_fonts Get a brand's font files ~178
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 | Type | Req | Description |
|---|---|---|---|
| kitId | string | – | Kit to fetch fonts for. Omit for the workspace's brand. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_get Read the brand ~221
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 | Type | Req | Description |
|---|---|---|---|
| kitId | string | – | A brand kit id from napkin_brand_list. Omit for the workspace's brand. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_list List brand kits ~86
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 | Type | Req | Description |
|---|---|---|---|
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_brand_view Look at a brand's pictures ~230
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 | Type | Req | Description |
|---|---|---|---|
| kitId | string | – | A kit from napkin_brand_list. Omit for the workspace's brand. |
| names | array | – | Show these pictures, by name. |
| section | string | – | Show the pictures in this section. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_deck_compose Build a designed deck ~1,731
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 `layout` and `slots` instead of `html`. 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 - `html` is the inside of one slide: a `.slide` box 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 <style> block inside its html, or shared CSS in `css`. - 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-<color name>), var(--brand-font-heading), var(--brand-font-body), var(--brand-radius). Headings already use the heading face. - Pictures from the brand kit: <img src="kit:<file name exactly as the brief lists it>">, sized with CSS; object-fit: cover crops to fill, contain fits whole. Any workspace image: src="file:<file id>". - 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…
| Name | Type | Req | Description |
|---|---|---|---|
| accent | string | – | 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 | boolean | – | Add these slides after the existing ones. |
| boardId | string | – | Deck to rebuild or change. Omit to make a new deck. |
| css | string | – | CSS shared by every slide. |
| name | string | – | Name for a new deck. |
| previews | boolean | – | 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_vi… |
| size | string | – | 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 pos… |
| slide | integer | – | Replace just this slide (1-based) with the one slide given. |
| slides | array | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_deck_export Export a deck as images ~229
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | The deck to export. |
| slides | array | – | Just these slides (1-based, as the deck shows them). Omit for every slide. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_deck_outline Read a deck's outline (markdown) ~163
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id (a deck). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_deck_set_theme Set a deck's theme ~330
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 | Type | Req | Description |
|---|---|---|---|
| accent | string | – | 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 | string | yes | Napkin board id (a deck). |
| theme | string | yes | `brand` for the workspace's brand kit, `brand:<kit id>` for a particular kit (napkin_brand_list), or a built-in theme key. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_deck_write Write a whole deck from a markdown outline ~323
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 | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Deck name. |
| outline | string | yes | The markdown outline (dialect above). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_diagrams_create Create a Napkin diagram ~327
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 | Type | Req | Description |
|---|---|---|---|
| source | string | – | 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"))`,… |
| title | string | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_diagrams_get Read a Napkin diagram ~95
Fetch one Napkin diagram's mermaid source by id (from napkin_diagrams_list). Read before editing — napkin_diagrams_update replaces the whole source.
| Name | Type | Req | Description |
|---|---|---|---|
| diagramId | string | yes | Diagram id from napkin_diagrams_list. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_diagrams_list List Napkin diagrams ~173
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 | Type | Req | Description |
|---|---|---|---|
| includeArchived | boolean | – | Also list archived diagrams (default false). |
| q | string | – | Title contains (case-insensitive). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_diagrams_update Edit a Napkin diagram ~419
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| archived | boolean | – | – |
| description | string | – | Short gallery summary. |
| diagramId | string | yes | Diagram id from napkin_diagrams_list. |
| source | string | – | 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"))`,… |
| title | string | – | – |
| visibility | string | – | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_docs_create Create a Napkin doc ~197
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 | Type | Req | Description |
|---|---|---|---|
| body | string | – | 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 t… |
| title | string | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_docs_get Read a Napkin doc ~95
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 | Type | Req | Description |
|---|---|---|---|
| docId | string | yes | Doc id from napkin_docs_list. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_docs_list List Napkin docs ~184
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 | Type | Req | Description |
|---|---|---|---|
| includeArchived | boolean | – | Also list archived docs (default false). |
| q | string | – | Title contains (case-insensitive). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_docs_update Edit a Napkin doc ~381
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 | Type | Req | Description |
|---|---|---|---|
| append | string | – | Markdown appended to the end (own paragraph). |
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| archived | boolean | – | – |
| body | string | – | Full replacement markdown body. Prefer `edits` — this overwrites everything. Write each paragraph as ONE long line; the editor wraps it for the reader. |
| description | string | – | Short gallery summary. |
| docId | string | yes | Doc id from napkin_docs_list. |
| edits | array | – | Targeted find/replace pairs, applied in order. All must match or none are applied. |
| title | string | – | – |
| visibility | string | – | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_draw Draw on a Napkin board ~475
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id. |
| deletes | array | – | Ids of existing shapes to remove (from napkin_boards_get). |
| elements | array | – | New elements to draw, painted in order. |
| slide | integer | – | 1-based slide number (decks only) — makes coordinates slide-local. |
| updates | array | – | Existing shapes to change — move, resize, retext, restyle. Read napkin_boards_get first for ids and current geometry. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_create Create a Napkin interface ~3,286
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 <style> block. LIBRARIES: there is no build step and no CDN, and a <script src> 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: <script src="/lib/preact@10.29.8/preact.min.umd.js"></script> <script src="/lib/preact@10.29.8/hooks.umd.js"></script> <script src="/lib/htm@3.1.1/htm.umd.js"></script> 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: <script src="/lib/chart.js@4.5.1/chart.umd.min.js"></script> 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: <script src="/lib/lucide@1.49.0/lucide.min.js"></script>. In plain markup, write <i d…
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | – | – |
| starter | string | – | 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… |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_get Read a Napkin interface ~2,896
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 <style> block. LIBRARIES: there is no build step and no CDN, and a <script src> 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: <script src="/lib/preact@10.29.8/preact.min.umd.js"></script> <script src="/lib/preact@10.29.8/hooks.umd.js"></script> <script src="/lib/htm@3.1.1/htm.umd.js"></script> 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: <script src="/lib/chart.js@4.5.1/chart.umd.min.js"></script> 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: <script src="/lib/lucide@1.49.0/lucide.min.js"></script>. In plain markup, write <i data-lucide="calendar"></i> 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 re…
| Name | Type | Req | Description |
|---|---|---|---|
| interfaceId | string | yes | Interface id from napkin_interfaces_list. |
| path | string | – | One file to read, e.g. index.html. Omit for every file. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_grant Change what a Napkin interface can reach ~168
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| grants | array | yes | The complete list. Passing an empty list removes all access. |
| interfaceId | string | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_grant_data Change what data a Napkin interface can use ~249
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| interfaceId | string | yes | – |
| metrics | array | – | – |
| tables | array | – | – |
| tasks | array | – | Workbench Tasks the page may start with zw.tasks.start, and check with zw.tasks.get. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_list List Napkin interfaces ~103
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 | Type | Req | Description |
|---|---|---|---|
| includeArchived | boolean | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_publish Save a version of a Napkin interface ~112
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 | Type | Req | Description |
|---|---|---|---|
| interfaceId | string | yes | – |
| note | string | – | One line on what changed. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_view Look at a Napkin interface ~412
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 | Type | Req | Description |
|---|---|---|---|
| interfaceId | string | yes | – |
| size | string | – | The window to look through. Default desktop (1280 wide); phone is 390 wide. |
| steps | array | – | Done in order, with a picture at each `shot` (at most 6). Default: one shot of the first screen. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_interfaces_write Edit a Napkin interface's files ~3,256
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 <style> block. LIBRARIES: there is no build step and no CDN, and a <script src> 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: <script src="/lib/preact@10.29.8/preact.min.umd.js"></script> <script src="/lib/preact@10.29.8/hooks.umd.js"></script> <script src="/lib/htm@3.1.1/htm.umd.js"></script> 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: <script src="/lib/chart.js@4.5.1/chart.umd.min.js"></script> then new Chart(canvasElement, { type: "bar" | "line" | "doughnut" | …, data: { labels: [...], datasets:…
| Name | Type | Req | Description |
|---|---|---|---|
| append | boolean | – | 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 ord… |
| archived | boolean | – | – |
| body | string | – | 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. |
| deleteFile | boolean | – | Remove `path` from the interface. |
| description | string | – | – |
| edits | array | – | Targeted find/replace pairs, applied in order. All must match or none are applied. |
| interfaceId | string | yes | Interface id from napkin_interfaces_list. |
| name | string | – | – |
| path | string | – | Which file to write. Defaults to index.html. Use lowercase names like app.js or style.css. |
| visibility | string | – | Who can see it: PRIVATE (only the user), WORKSPACE (every member, the default), or SHARED (specific people, granted afterwards). Say 'make it private' → PRIVATE. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_layouts_list List slide layouts ~189
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 | Type | Req | Description |
|---|---|---|---|
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_sheets_add_chart Pin a chart onto a sheet ~196
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 | Type | Req | Description |
|---|---|---|---|
| series | array | – | – |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| sql | string | yes | The SELECT to chart. |
| stacked | boolean | – | Stack the series (bar/area only). |
| title | string | yes | Chart title. |
| type | string | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
| x | string | – | – |
No output schema declared.
No examples provided.
napkin_sheets_create Create a Napkin sheet ~97
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 | Type | Req | Description |
|---|---|---|---|
| title | string | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_sheets_list List Napkin sheets ~134
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 | Type | Req | Description |
|---|---|---|---|
| includeArchived | boolean | – | Also list archived sheets (default false). |
| q | string | – | Title contains (case-insensitive). |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_sheets_query Run SQL against a sheet ~149
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 | Type | Req | Description |
|---|---|---|---|
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| sql | string | yes | A single SELECT. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
napkin_sheets_schema A sheet's SQL schema ~116
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 | Type | Req | Description |
|---|---|---|---|
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this; tokens with a default can override per call. Ignored for workspace API keys. |
No output schema declared.
No examples provided.
How do I install the ZeroWidth Napkin MCP server?
ZeroWidth Napkin is a hosted endpoint at https://api.zerowidth.ai/mcp/x/napkin, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.zerowidth.ai
claude mcp add --transport http ai-zerowidth-napkin 'https://api.zerowidth.ai/mcp/x/napkin'
What is the ZeroWidth Napkin MCP server?
ZeroWidth Napkin is an MCP server listed in the public MCP registry as ai.zerowidth/napkin. Draw boards, write docs and sheets, and build decks with your brand in Napkin. This page covers its hosted endpoint (https://api.zerowidth.ai/mcp/x/napkin).
Is the ZeroWidth Napkin MCP server safe to use?
ZeroWidth Napkin scores 72 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the ZeroWidth Napkin MCP server expose?
ZeroWidth Napkin exposes 68 tools: search_docs, get_doc, list_docs, comments_list, comments_create, and 63 more. Their descriptions and schemas cost roughly 23,725 tokens of context every time the server is loaded.
Does the ZeroWidth Napkin MCP server require authentication?
No. We connected to ZeroWidth Napkin without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the ZeroWidth Napkin MCP server still maintained?
ZeroWidth Napkin is still listed as active in the MCP registry. We last reached this channel on 23 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.