paper-mcp
Skill1 starsChanged 2 months agoMITView on GitHub
Work in Paper (paper.design) canvases through Paper's MCP tools — reading and editing layers, text, tokens, comments, screenshots, and exports.
4 other projects use a version of this.
Adopted by
Most recently taken up by
- artivilla/agent-skillstheir own version, first seen Nov 8, 2026
- Rajveerx11/skillstheir own version, first seen Oct 25, 2026
- rbrown101010/codex-marketing-skillstheir own version, first seen May 18, 2026
- rbrown101010/Rileys-Top-Skillstheir own version, first seen May 12, 2026
Other versions4 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 4
- rbrown101010/codex-marketing-skills★ 95same name
- rbrown101010/Rileys-Top-Skills★ 9same name
- Rajveerx11/skills★ 1same name
- artivilla/agent-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository39 other files it gives its agents.
- apple-native-motionSkill
- apple-ui-copySkill
- audit-macos-appSkill
- brain-wikiSkill
- catch-me-upSkill
- checkpointSkill
- claude-md-coachSkill
- claudeSkill
- codexSkill
- crash-debuggingSkill
- cut-memorySkill
- explaining-problemsSkill
- file-batch-safetySkill
- handoffSkill
- heads-downSkill
- hopper-mcpSkill
- icon-designSkill
- interface-integritySkill
- ios-defaultsSkill
- kitSkill
- macos-defaultsSkill
- mock-and-pickSkill
- obsess-heroSkill
- obsessSkill
- offline-archiveSkill
- os-workaroundsSkill
- predictionSkill
- second-loopSkill
- session-auditSkill
- ship-macosSkill
- show-meSkill
- slice-and-reviewSkill
- slow-modeSkill
- spatial-interfacesSkill
- standupSkill
- synthetic-fixturesSkill
- transitional-interfacesSkill
- web-design-defaultsSkill
- window-captureSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
14 rules. 0 are common, 7 are distinctive, and 7 are very specific to this project.
0
Common
Most of the 4 edited versions we read keep these.
7
Distinctive
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 8
Use when the user asks to read, build, or change something in Paper.
- Very specific: line 18
Prefer the native tools when the host lists them (in Claude Code they appear as mcp__paper__<tool>).
- Distinctive: line 20
When no native tools are loaded, use the bundled helper.
- Very specific: line 32
Call get_guide with topic: "paper-mcp-instructions" once per session.
- Distinctive: line 33
Read the live tool schemas instead of trusting memorized arguments.
- Very specific: line 36
Use get_selection to see what the user is focused on.
- Very specific: line 37
Check fonts with get_font_family_info before choosing a family.
- Very specific: line 46
Prefer targeted update_styles, set_text_content, move_nodes, and duplicate_nodes over delete-and-rebuild.
- Distinctive: line 48
Treat Paper as a compositor, not a darkroom.
- Distinctive: line 49
Never show internal node IDs to the user.
- Very specific: line 50
Call finish_working_on_nodes with the artboard IDs when done.
- Distinctive: line 65
Device size: use the project's actual target device in points.
- Very specific: line 66
Status bar: use Paper's official markup from get_guide({ topic: "mobile-status-bar" }), changing only its color.
- Distinctive: line 86
Read references/verified-snapshot.md only for debugging clues.
“Common” is measured: kept by at least 6 in 10 of the 4 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Paper MCP
Use when the user asks to read, build, or change something in Paper. Canvas edits change the user's real files, which sync to their Paper team. Stay within the named file, page, and artboard, and preserve existing work.
Connect
Paper ships its own MCP server. Paper Desktop's MCP panel installs it for each host:
- Claude Code: a
paperstdio server that runs~/.paper/bin/paper mcp, added directly or through thepaper-desktop@paperplugin from thepaper-design/agent-pluginsmarketplace. - Claude Desktop: the Paper
.mcpbextension. - Codex, Cursor: the same plugin repository ships configs for both.
Prefer the native tools when the host lists them (in Claude Code they appear as mcp__paper__<tool>). A server added mid-session loads only in a new session.
When no native tools are loaded, use the bundled helper. It speaks to Paper Desktop's local HTTP endpoint, which Paper now calls legacy but still serves while Desktop runs:
sid="$(<skill-directory>/paper-mcp.sh init)"
<skill-directory>/paper-mcp.sh call "$sid" get_guide '{"topic":"paper-mcp-instructions"}'
<skill-directory>/paper-mcp.sh call "$sid" get_basic_info '{"fileId":"<id>"}'The helper strips SSE data: framing and leaves MCP content intact. Tool payloads are usually JSON strings inside .result.content[].text; screenshots arrive as image blocks. PAPER_MCP_ENDPOINT and PAPER_MCP_PROTOCOL_VERSION override the defaults. If the HTTP endpoint stops answering, check whether Paper removed it before debugging the helper.
Start of session
- Call
get_guidewithtopic: "paper-mcp-instructions"once per session. The server requires it, and it documents current behavior better than any snapshot. - Read the live tool schemas instead of trusting memorized arguments.
- Call
get_basic_info. With nofileIdit reads the file the user is viewing, and fails with "Open a Paper file" when there is none. Then uselist_filesandopen_file, orcreate_filewhen the user asked for a new file. A new file lands in the user's Paper team, so don't create one as scratch space unasked. - Pass
fileIdandpageIdexplicitly from then on. The viewed page can change between calls, and tool results echo the file ID so a wrong target is visible. - Use
get_selectionto see what the user is focused on. Confirm the target when several files or artboards could match. - Check fonts with
get_font_family_infobefore choosing a family. It has nofileIdargument and may report no open file even afteropen_file. When it does, prefer families already in the file orsystem-ui, and say that the check was skipped.
Whose taste wins
Paper's guide has two kinds of content. Follow its mechanics: incremental writes, design tokens as CSS variables, cloning with <x-paper-clone>, screenshot review, and finish_working_on_nodes. Its taste rules (a design brief before any mutation, mood words, palettes, making a vague prompt impressive) are Paper's defaults. The user's own design instructions, the project's design system, and any mock-first workflow come first. For a technical test or a narrow edit, skip the brief.
Edit in reviewable groups
- One visual group per
write_htmlcall: a header, a row, a button bar. The user watches the canvas fill in real time. - Prefer targeted
update_styles,set_text_content,move_nodes, andduplicate_nodesover delete-and-rebuild.move_nodeskeeps node identity;write_htmlinreplacemode keeps the node's slot. - Inline
<span>styling inside a text node is flattened. For mixed styles, write separate text nodes in a flex row. - Treat Paper as a compositor, not a darkroom. Do heavy image processing locally, bring rasters in as data-URI layers, use inline SVG for line work, and keep live text as text.
- Never show internal node IDs to the user. Refer to layers by name.
- Call
finish_working_on_nodeswith the artboard IDs when done. It clears the working indicator.
Build with a system, not copies
Anything past a single screen needs a design system before the second screen exists. Copying earlier screens and patching them makes the copies drift apart, multiplies edits, and invites wrong-node mistakes.
- Tokens first. Before building screens, create design tokens with
create_tokens. If the project has code tokens (a theme file, CSS variables), mirror their names so the canvas and the code share one vocabulary. Write every color, radius, spacing and type size asvar(--token). Where the canvas and the code need different values, keep the code's name and put the difference in the value and description. - A Kit artboard of masters. Draw one master of each repeated part: buttons, fields, chips, tags, cards, nav bars, list rows, and a blank screen template. Name each one
Kit/<Part>. Build new screens from Kit masters with<x-paper-clone node-id="…">orduplicate_nodes, never by copying another screen. Change a part in the Kit, then re-clone it. - Clones don't stay linked. The MCP tool list has no component or instance tool, so assume a clone is an independent copy. Tokens are the only live link between copies. That makes tokens important and the Kit a convenience.
- Migrating an existing board.
find_nodeswithfilters: [{styleValue: "<hex>"}]returns every node using that literal, with the property inmatched[].styleName. Group the results by property and target token, then apply each group with oneupdate_stylescall. The results get large (one color can match more than 100 nodes), so hand migrations to a subagent to keep the main context clean.find_nodescaps at 200 results and counts nodes already converted tovar(), so a big migration can stall. A trailing wildcard ("#151515*") matches only the literal string. Nodes with a single-side border need the side property (borderTopColor), notborderColor.
Match the target platform
Mobile mocks should get the platform's basics right from the first screen, since fixing 40 screens later is a migration.
- Device size: use the project's actual target device in points. Check the simulator or the project config rather than defaulting to Paper's suggested 390×844.
- Status bar: use Paper's official markup from
get_guide({ topic: "mobile-status-bar" }), changing only its color. On iPhones with a Dynamic Island, add the island (about 126×37, 11px from the top, centered) and a home indicator (134×5, 8px from the bottom). - Continuous corners: CSS
corner-shape: squircleandsuperellipse()are not Apple's continuous corner, which is a different curve. Don't approximate it by eye. Measured against Core Animation's own render, Apple's corner leaves the straight edge further out than a circular arc, then rejoins the arc. The measured match (2026-10-08, Paper 0.5.15 and Chrome 154, against a Core Animation render) iscorner-shape: superellipse(1.45)with the radius ×1.3. Example: an iOS radius of 16 becomesborder-radius: 20.8px; corner-shape: superellipse(1.45). Error was at the measurement's noise floor. CSSsquirclewas 27× worse than that. Bake the ×1.3 into the radius tokens and note the corner-shape pairing in their descriptions. In the app itself, use the native curve (cornerCurve = .continuous, or React Native'sborderCurve: 'continuous'). Paper has no token type for corner shape and no components yet, so any corner change touches every node. - System metrics: a 44pt nav bar, a 34pt bold large title, 17pt body, 44pt minimum touch targets, a 51×31 switch, and 270pt alerts.
Boards of many screens
- Show one version of each screen. Don't place an as-built screen next to its planned replacement in the same row; reading left to right, it looks like a step forward into nearly the same screen. Pick the version the board is about (usually the target design) and tag each screen's status: built, change, new, later.
- One flow per row, left to right. Branches and variants (an error state, an alternate path, a sub-state) go in their own labeled row under the screen they come from. A variant should never look like the next step.
- Position explicitly.
create_artboardandduplicate_nodespick their own spot, so setleft/topwithupdate_stylesright after. Keep a grid (column step = artboard width + 80) and reserve a column for row labels. - Brief subagents with the system. Parallel subagents can each own a row, as long as each gets: the token names, the Kit node IDs, the exact copy, the board's positions, and any banned patterns. Without these, every agent invents its own card or button and the board drifts.
- Budget for limits. Paper plans can cap MCP calls; when a limit is hit, reads fail too. Stop, report what's half-built with node IDs, and leave the decision about upgrading to the user, since it costs money.
Verify
After a burst of edits, check node state (get_jsx, get_computed_styles) first, then take one screenshot once rendering settles. Screenshots are JPEG and can lag document state. Measure alignment from node bounds or full-resolution pixels, not a downscaled preview. Treat calls as a budget: inspect once, write coherent groups, screenshot at review points.
Export
Read the current export schema for formats and scales. Export only named nodes or artboards. The server chooses the output location, often Downloads, and returns the path. Touch only that file, copy it to the project if needed, and inspect the actual file for dimensions, transparency, and color.
Read references/verified-snapshot.md only for debugging clues. It records dated observations, not the live schema.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

