Penpot MCP Server
A comprehensive Model Context Protocol (MCP) server for Penpot, the open-source design platform. This server provides full access to Penpot's capabilities through 14 powerful tools covering projects, files, components, design tokens, exports, comments, teams, and more.
Features
- ๐๏ธ Project Management: Full CRUD operations for projects with file organization
- ๐ File Operations: Create, edit, duplicate, move files with version history
- ๐งฉ Component Library: Manage reusable components with instances, annotations, and stats
- ๐จ Design Tokens: Colors, typography with export to CSS/JSON/SCSS/Tailwind
- ๐ค Asset Export: PNG, SVG, PDF, JPEG, WebP with multi-scale and batch support
- ๐ฌ Comments & Reviews: Thread-based commenting with resolution tracking
- ๐ฅ Team Collaboration: Team management, invitations, roles, and permissions
- ๐ค Profile Management: User settings, notifications, recent files
- ๐ Library Sharing: Shared libraries, linking, publishing, and sync
- ๐ Global Search: Search across files, objects, components, tokens
- ๐ Design Analysis: Design system audits, accessibility, duplicates detection
Architecture
penpot-mcp/
โโโ src/
โ โโโ index.ts # Entry point
โ โโโ server-core.ts # MCP server implementation
โ โโโ config.ts # Configuration management
โ โโโ logger.ts # Logging utility
โ โโโ api/
โ โ โโโ client-factory.ts # API client factory (9 domain clients)
โ โ โโโ base/ # Base API client & utilities
โ โ โ โโโ base-client.ts
โ โ โ โโโ error-handler.ts
โ โ โ โโโ response-formatter.ts
โ โ โ โโโ index.ts
โ โ โโโ domains/ # Domain-specific API clients
โ โ โโโ projects-api.ts # Project CRUD, files, stats
โ โ โโโ files-api.ts # File operations, pages, objects
โ โ โโโ components-api.ts # Components, instances, annotations
โ โ โโโ tokens-api.ts # Colors, typography, export
โ โ โโโ exports-api.ts # Asset export (PNG/SVG/PDF/etc)
โ โ โโโ comments-api.ts # Threads, comments, resolution
โ โ โโโ team-api.ts # Team management, invitations
โ โ โโโ profile-api.ts # User profile, settings
โ โ โโโ library-api.ts # Shared libraries, linking
โ โ โโโ index.ts
โ โโโ tools/
โ โโโ tool-definitions.ts # MCP tool schemas (14 tools)
โ โโโ index.ts
โ โโโ orchestration/ # High-level orchestration tools
โ โโโ projects.ts # penpot_projects
โ โโโ files.ts # penpot_files
โ โโโ components.ts # penpot_components
โ โโโ tokens.ts # penpot_tokens
โ โโโ exports.ts # penpot_exports
โ โโโ comments.ts # penpot_comments
โ โโโ team.ts # penpot_team
โ โโโ profile.ts # penpot_profile
โ โโโ library.ts # penpot_library
โ โโโ search.ts # penpot_search
โ โโโ analyze.ts # penpot_analyze
โ โโโ navigate.ts # penpot_navigate (legacy)
โ โโโ inspect.ts # penpot_inspect (legacy)
โ โโโ assets.ts # penpot_assets (legacy)
โ โโโ types.ts
โ โโโ index.ts
โโโ package.json
โโโ tsconfig.json
โโโ README.md
Installation
npm install
npm run build
Configuration
Create a .env file:
# Required: Penpot credentials
[email protected]
PENPOT_PASSWORD=your-password
# Optional: Custom Penpot instance URL (defaults to design.penpot.app)
PENPOT_API_URL=https://design.penpot.app/api
# Optional: Default project scope
PENPOT_PROJECT_ID=your-project-id
# Optional: Logging level
LOG_LEVEL=info
Usage with Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"penpot": {
"command": "node",
"args": ["/path/to/penpot-mcp/dist/index.js"],
"env": {
"PENPOT_USERNAME": "[email protected]",
"PENPOT_PASSWORD": "your-password"
}
}
}
}
Available Tools (14 Total)
Core Tools
| Tool |
Description |
penpot_projects |
Project management: list, create, rename, delete, duplicate, move |
penpot_files |
File operations: CRUD, pages, objects, tree, search, history |
penpot_components |
Component library: list, search, instances, create, delete, annotations |
penpot_tokens |
Design tokens: colors, typography, CRUD, export to CSS/JSON/SCSS/Tailwind |
penpot_exports |
Asset export: PNG, SVG, PDF, JPEG, WebP with batch and multi-scale |
penpot_comments |
Comment management: threads, replies, resolve, reopen |
penpot_team |
Team management: members, invitations, roles, permissions |
penpot_profile |
User profile: settings, notifications, recent files |
penpot_library |
Shared libraries: link, unlink, publish, sync |
penpot_search |
Global search: files, objects, components, tokens |
penpot_analyze |
Design analysis: design system, accessibility, duplicates |
Legacy Tools (Backward Compatibility)
| Tool |
Description |
penpot_navigate |
Navigate projects, files, pages |
penpot_inspect |
Deep inspection of file structure |
penpot_assets |
Basic asset export |
Tool Actions Reference
penpot_projects
| Action |
Description |
Required Params |
list |
List all projects |
- |
get |
Get project details |
projectId |
create |
Create new project |
name |
rename |
Rename project |
projectId, name |
delete |
Delete project |
projectId |
duplicate |
Duplicate project |
projectId |
move |
Move to team |
projectId, targetTeamId |
files |
List project files |
projectId |
stats |
Project statistics |
projectId |
penpot_files
| Action |
Description |
Required Params |
get |
Get file details |
fileId |
create |
Create new file |
projectId, name |
rename |
Rename file |
fileId, name |
delete |
Delete file |
fileId |
duplicate |
Duplicate file |
fileId |
move |
Move to project |
fileId, projectId |
pages |
List file pages |
fileId |
page |
Get page objects |
fileId, pageId |
objects |
Get page objects |
fileId, pageId |
object |
Get specific object |
fileId, pageId, objectId |
tree |
Get object tree |
fileId, objectId |
search |
Search objects |
fileId, query |
analyze |
Analyze structure |
fileId |
history |
Version history |
fileId |
snapshot |
Create/restore |
fileId |
penpot_components
| Action |
Description |
Required Params |
list |
List components |
fileId |
get |
Get component |
fileId, componentId |
search |
Search components |
fileId, query |
instances |
Get instances |
fileId, componentId |
structure |
Get structure |
fileId, componentId |
create |
Create component |
fileId, objectId, name |
delete |
Delete component |
fileId, componentId |
rename |
Rename component |
fileId, componentId, name |
annotate |
Add annotation |
fileId, componentId, annotation |
stats |
Component stats |
fileId |
detach |
Detach instance |
fileId, instanceId |
reset |
Reset instance |
fileId, instanceId |
penpot_tokens
| Action |
Description |
Required Params |
colors |
List colors |
fileId |
color |
Get color |
fileId, colorId |
create_color |
Create color |
fileId, name, color |
update_color |
Update color |
fileId, colorId |
delete_color |
Delete color |
fileId, colorId |
typography |
List typography |
fileId |
typography_style |
Get style |
fileId, styleId |
create_typography |
Create style |
fileId, name |
update_typography |
Update style |
fileId, styleId |
delete_typography |
Delete style |
fileId, styleId |
all |
Get all tokens |
fileId |
search |
Search tokens |
fileId, query |
export_css |
Export as CSS |
fileId |
export_json |
Export as JSON |
fileId |
export_scss |
Export as SCSS |
fileId |
export_tailwind |
Export Tailwind |
fileId |
stats |
Token statistics |
fileId |
penpot_exports
| Action |
Description |
Required Params |
export |
Export object |
fileId, objectId, format |
batch |
Batch export |
fileId, objectIds |
page |
Export page |
fileId, pageId |
file_pdf |
Export as PDF |
fileId |
multi_scale |
Multi-scale export |
fileId, objectId, scales |
multi_format |
Multi-format export |
fileId, objectId, formats |
list |
List exportable |
fileId |
settings |
Export settings |
fileId, objectId |
download |
Download export |
exportId |
formats |
Supported formats |
- |
penpot_comments
| Action |
Description |
Required Params |
list |
List threads |
fileId |
thread |
Get thread |
threadId |
create_thread |
Create thread |
fileId, pageId, content |
add |
Add comment |
threadId, content |
update |
Update comment |
commentId, content |
delete |
Delete comment |
commentId |
delete_thread |
Delete thread |
threadId |
resolve |
Resolve thread |
threadId |
reopen |
Reopen thread |
threadId |
unread |
Unread count |
fileId |
penpot_team
| Action |
Description |
Required Params |
list |
List teams |
- |
get |
Get team |
teamId |
create |
Create team |
name |
rename |
Rename team |
teamId, name |
delete |
Delete team |
teamId |
members |
List members |
teamId |
invite |
Invite member |
teamId, email, role |
remove_member |
Remove member |
teamId, memberId |
update_role |
Update role |
teamId, memberId, role |
invitations |
Pending invites |
teamId |
cancel_invite |
Cancel invite |
invitationId |
leave |
Leave team |
teamId |
stats |
Team statistics |
teamId |
penpot_profile
| Action |
Description |
Required Params |
get |
Get profile |
- |
update |
Update profile |
- |
password |
Change password |
oldPassword, newPassword |
props |
Get properties |
- |
update_props |
Update props |
props |
email |
Request email change |
newEmail |
delete |
Delete account |
- |
recent |
Recent files |
- |
notifications |
Notifications |
- |
mark_read |
Mark as read |
notificationId |
penpot_library
| Action |
Description |
Required Params |
shared |
List shared |
teamId |
link |
Link library |
fileId, libraryId |
unlink |
Unlink library |
fileId, libraryId |
linked |
List linked |
fileId |
publish |
Publish library |
fileId |
unpublish |
Unpublish |
fileId |
summary |
Library summary |
fileId |
sync |
Sync library |
fileId, libraryId |
colors |
Library colors |
libraryId |
typography |
Library typography |
libraryId |
components |
Library components |
libraryId |
search |
Search libraries |
teamId, query |
penpot_search
| Action |
Description |
Required Params |
files |
Search files |
query |
objects |
Search objects |
fileId, query |
components |
Search components |
fileId |
colors |
Search colors |
fileId |
typography |
Search typography |
fileId |
recent |
Recent files |
- |
global |
Global search |
query |
penpot_analyze
| Action |
Description |
Required Params |
design_system |
Design system audit |
fileId |
accessibility |
Accessibility check |
fileId |
naming |
Naming conventions |
fileId |
structure |
File structure |
fileId |
colors |
Color analysis |
fileId |
typography |
Typography analysis |
fileId |
components |
Component usage |
fileId |
duplicates |
Find duplicates |
fileId |
Example Usage
List all projects
{
"tool": "penpot_projects",
"arguments": {
"action": "list"
}
}
Search for files
{
"tool": "penpot_search",
"arguments": {
"action": "files",
"query": "dashboard"
}
}
Export component as PNG
{
"tool": "penpot_exports",
"arguments": {
"action": "export",
"fileId": "file-uuid",
"objectId": "object-uuid",
"format": "png",
"scale": 2
}
}
Get design tokens as CSS
{
"tool": "penpot_tokens",
"arguments": {
"action": "export_css",
"fileId": "file-uuid"
}
}
Analyze design system
{
"tool": "penpot_analyze",
"arguments": {
"action": "design_system",
"fileId": "file-uuid"
}
}
Development
# Development mode with hot reload
npm run dev
# Build
npm run build
# Run tests
npm test
API Reference
This MCP server uses Penpot's RPC API with Transit+JSON encoding:
- UUIDs are encoded with
~u prefix
- Keywords are encoded with
~: prefix
- All requests go through
/rpc/command/{command-name}
License
MIT