ZeroWidth Napkin
REMOTE · API.ZEROWIDTH.AI
Draw boards, write docs and sheets, and build decks with your brand in Napkin.
Available components
Last scanned (19 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 →
napkin_sheets_set_cells Write cells into a sheet tab ~220
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| cells | object | yes | A1 → raw value/formula, e.g. {"A1":"Region","B2":"=SUM(B3:B9)"}. |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| tabName | string | – | Tab name (defaults to the first tab). |
| 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_update Rename, describe, archive, or share a Napkin sheet ~201
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 | Type | Req | Description |
|---|---|---|---|
| archived | boolean | – | – |
| description | string | – | Short gallery summary. |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| 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_sheets_view_chart View a sheet chart ~182
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 | Type | Req | Description |
|---|---|---|---|
| chartId | string | yes | Chart id (napkin_sheets_list shows chart counts; the sheet's charts carry ids). |
| 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.
napkin_slide_add Add a slide to a deck ~210
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id (a deck). |
| content | string | – | Markdown body — blocks split on `---` lines. |
| layout | string | yes | Layout key: title | section | title-body | title-lead | two-column | three-column | comparison | statement | quote | closing | blank. |
| title | string | – | Slide title. |
| 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_slide_fill Fill a slide's empty text areas ~165
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id (a deck). |
| slide | integer | yes | 1-based slide number in presentation order. |
| texts | object | yes | Placeholder name → content, e.g. {"Add a title": "Q3 Review"}. |
| 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_slide_update Move or change a deck slide ~229
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id (a deck). |
| moveTo | integer | – | New 1-based position for this slide. |
| notes | string | – | Speaker notes (markdown); replaces the current notes. |
| pageNumber | boolean | – | Show the slide number on this slide. |
| skipped | boolean | – | true hides the slide from present mode and exports. |
| slide | integer | yes | 1-based slide number in presentation order. |
| 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_slide_view View one deck slide (rendered image) ~167
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 | Type | Req | Description |
|---|---|---|---|
| boardId | string | yes | Napkin board id (a deck). |
| slide | integer | yes | 1-based slide number in presentation order. |
| 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_tables_add_columns Add columns to a sheet table ~105
Adds columns to the end of a table. Existing records leave them empty.
| Name | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| columns | array | yes | – |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| table | string | yes | The table tab's name or id. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_add_records Add records to a sheet table ~148
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| records | array | yes | – |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| table | string | yes | The table tab's name or id. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_add_view Add a view to a sheet table ~218
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| formFields | array | – | – |
| formIntro | string | – | – |
| formTitle | string | – | – |
| groupBy | string | – | Board: the select or person column whose values are the lanes. |
| kind | string | yes | – |
| name | string | yes | – |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| sort | array | – | – |
| table | string | yes | The table tab's name or id. |
| where | array | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_create Make a table of records ~201
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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| columns | array | yes | – |
| name | string | yes | The table's name, e.g. Requests. |
| sheetId | string | – | Add to this sheet; omit to make a new sheet. |
| sheetTitle | string | – | Title for a new sheet. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_delete_records Delete records from a sheet table ~114
Deletes records by id. People can undo this in the sheet only while it's open, so confirm with the person first.
| Name | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| ids | array | yes | – |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| table | string | yes | The table tab's name or id. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_get Describe a sheet table ~93
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 | Type | Req | Description |
|---|---|---|---|
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| table | string | yes | The table tab's name or id. |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_query Find records in a sheet table ~155
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| match | string | – | – |
| offset | integer | – | – |
| search | string | – | – |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| sort | array | – | – |
| table | string | yes | The table tab's name or id. |
| where | array | – | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
napkin_tables_update_records Change records in a sheet table ~111
Changes some fields of records by id (from napkin_tables_query). Fields left out keep their values.
| Name | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| sheetId | string | yes | Sheet id from napkin_sheets_list. |
| table | string | yes | The table tab's name or id. |
| updates | array | yes | – |
| workspace | string | – | Workspace slug. Personal tokens with no default workspace MUST pass this. |
No output schema declared.
No examples provided.
search_docs Search ZeroWidth docs ~111
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 | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max number of results. Defaults to 10. |
| query | string | yes | Search query — keywords or natural-language phrase. |
No output schema declared.
No examples provided.
search_workspace Search the whole workspace ~431
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 | Type | Req | Description |
|---|---|---|---|
| folderId | string | – | Only search inside this folder and the folders under it (ids from workspace_folders_browse or a folder hit). |
| kinds | array | – | Restrict to these kinds (file, folder, flow, page, doc, dataset, …). Omit to search everything. |
| limit | integer | – | – |
| q | string | yes | Words, any order, case-insensitive. Fewer words find more. |
| 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.
workspace_files_save_from_chat Save a picture from this chat to your files ~223
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 <img src="file:<fileId>"> (CSS: url(file:<fileId>)). 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 | Type | Req | Description |
|---|---|---|---|
| approvalId | string | – | Approval id from a prior needs_confirmation response. Omit on the first call. |
| name | string | – | The picture's name, as in `[attached image: <name>]`. |
| workspace | string | – | Workspace slug. Ignored when the workspace is already set for this chat. |
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.