A typed-tools MCP server for Penpot

Hi all,

I design a real product in Penpot with Claude Code, and like other people, I spent more time fixing what the agent did than designing. Part of the Plugin API code it writes quietly does nothing or lands in the wrong place.

So I wrote an MCP server with typed tools instead: GitHub - pdasilem/penpot-mcp-server-unofficial: MCP server for self-hosted Penpot — AI-powered UI/UX design and prototyping (66 tools) · GitHub

It’s in Clojure on top of Penpot’s common library, uses Penpot’s own plugin and runs in place of the official server. Each of the 115 tools checks its arguments, checks that Penpot really applied the change and reports clear errors. The Plugin API traps I hit are handled inside the tools. The server also opens the right page before every edit and never lets editor calls overlap. I now run up to 17 calls at once and everything holds; with the official server about 7 were enough to hang the editor for me.

Files, comments, versions, tokens and more work without the editor through the backend API, and Claude Design HTML can be imported as native boards with flex and grid layouts.

On a file with ~9,000 shapes an edit on the open page takes about 0.17 s. Token use is low too: the agent doesn’t write code, an edit answers with only the fields that changed, and only the reading and editing tools are loaded until the agent asks for more.

Would validated tools like these be useful in the official server? Happy to share details or help upstream.

3 Likes

A small update: the mcp server can now export a file’s design system as code. One tool call takes the design tokens of every theme combination, plus the library colors and typographies, and writes them out as CSS variables, SCSS, Tailwind (v4 or v3), TypeScript, DTCG JSON, Kotlin Multiplatform or SwiftUI.

Token values are computed on the server the same way Penpot computes them, references and math included. So what lands in your code matches what you see in the editor. The result comes back as a one-time download link, so the agent doesn’t have to push the whole archive through its context.

The export tool lives in the export group, which is off by default. Claude Code can turn it on by itself with set_toolset and use it right away. Some other clients don’t refresh their tool list mid-session: there you may need to reconnect after switching the group on, or start the server with PENPOT_MCP_TOOLSETS=read,edit,export so the group is enabled from the start.

1 Like