Penpot MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PENPOT_API_URL | No | The URL of the Penpot instance (self-hosted or public). | https://design.penpot.app |
| PENPOT_ACCESS_TOKEN | Yes | Your Penpot access token for authentication. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_filesA | List all files in a project |
| get_fileC | Get detailed information about a file |
| create_fileC | Create a new file in a project |
| rename_fileC | Rename a file |
| delete_fileC | Delete a file |
| list_pagesB | List all pages in a file |
| add_pageB | Add a new page to a file |
| get_page_shapesA | Get all shapes on a specific page |
| query_shapesA | Query and filter shapes with multiple criteria (like grep for shapes). Useful for bulk operations like changing color themes, alignment, or filtering by area/type. Returns only the requested fields. |
| update_shapeB | Update shape properties including position, size, colors, gradients, images, borders, shadows, blur, blend modes, text alignment, and visual effects |
| get_shape_propertiesA | Get detailed properties of a specific shape including colors, text properties, fonts, dimensions, effects, and all other attributes |
| delete_shapeB | Delete a shape from the page |
| create_rectangleB | Create a rectangle shape with colors, gradients, images, borders, rounded corners, shadows, blur, and blend modes |
| create_circleB | Create a circle shape with colors, gradients, images, borders, shadows, blur, and blend modes |
| create_textB | Create a text shape with color, styling, alignment, shadows, blur effects, and blend modes |
| create_frameB | Create a frame shape (container for other shapes) with colors, gradients, images, borders, shadows, blur, and blend modes |
| create_componentB | Create a component from a shape |
| list_componentsB | List all components in a file |
| list_teamsA | List all teams the user has access to |
| list_projectsA | List all projects in a team |
| create_teamC | Create a new team |
| create_projectC | Create a new project in a team |
| get_teamA | Get detailed information about a specific team (provide either teamId or fileId) |
| get_team_statsB | Get statistics for a team (projects, files, members count) |
| update_teamC | Update team information (name) |
| delete_teamB | Delete a team (requires owner permissions) |
| get_team_membersB | Get list of all members in a team |
| update_team_member_roleB | Update a team member's role (viewer, editor, admin, owner) |
| delete_team_memberC | Remove a member from a team |
| leave_teamB | Leave a team (current user leaves the team) |
| get_team_invitationsA | Get list of pending invitations for a team |
| create_team_invitationsB | Create invitations for one or more email addresses to join a team |
| delete_team_invitationB | Delete a pending team invitation by email |
| update_team_invitation_roleA | Update the role of a pending team invitation by email |
| get_team_shared_filesB | Get all files shared with a team |
| get_team_recent_filesB | Get recently modified files in a team |
| create_share_linkC | Create a shareable link for a file |
| delete_share_linkB | Delete a share link |
| create_comment_threadB | Create a new comment thread on a page |
| list_comment_threadsA | List all comment threads in a file or team (provide either fileId or teamId) |
| get_comment_threadB | Get details of a specific comment thread |
| get_commentsA | Get all comments in a thread |
| create_commentB | Add a comment to an existing thread |
| update_commentC | Update a comment content |
| delete_commentB | Delete a comment |
| update_comment_thread_statusB | Mark a comment thread as resolved or unresolved |
| update_comment_thread_positionA | Move a comment thread to a new position |
| delete_comment_threadC | Delete a comment thread |
| get_unread_comment_threadsA | Get all unread comment threads for a team |
| create_media_from_urlC | Create a media object from a URL |
| clone_media_objectC | Clone an existing media object |
| list_file_mediaA | List all media objects in a file |
| list_font_variantsA | List all custom font variants for a team, file, or project |
| create_font_variantA | Create a new font variant (requires font data). Font weights: 100-900 in increments of 100. |
| update_fontB | Update a font's name |
| delete_fontA | Delete a custom font (removes all variants) |
| delete_font_variantB | Delete a specific font variant (e.g., Bold, Italic) |
| list_webhooksA | List all webhooks for a team |
| create_webhookA | Create a new webhook for team event notifications |
| update_webhookB | Update an existing webhook (URL, type, or active status) |
| delete_webhookB | Delete a webhook |
| search_shapesB | Search for shapes in a file by name |
| search_filesB | Search for files by name |
| get_profileB | Get current user profile |
| list_file_snapshotsB | List all snapshots (versions) of a file |
| create_file_snapshotA | Create a new snapshot (version) of a file for backup/versioning |
| update_file_snapshotB | Update a snapshot's label/description |
| delete_file_snapshotB | Delete a file snapshot (version) |
| restore_file_snapshotA | Restore a file to a previous snapshot (version). This will replace the current file content with the snapshot content. |
| lock_file_snapshotA | Lock a snapshot to prevent it from being deleted (protect important versions) |
| unlock_file_snapshotA | Unlock a snapshot to allow deletion |
| get_file_librariesB | Get all component libraries used by a file |
| has_file_librariesA | Check if a file uses any component libraries (returns boolean) |
| link_file_to_libraryA | Link a file to a component library to use its components. Returns recursive list of libraries used by that library. |
| unlink_file_from_libraryC | Unlink a file from a component library |
| get_library_usageA | Get the number of files that use this library |
| get_library_file_referencesB | Get all file references that use this library |
| update_file_library_sync_statusC | Update the synchronization status of a file->library link |
| ignore_file_library_sync_statusC | Ignore library synchronization status for a file at a specific date/time |
| align_shapesC | Align multiple shapes relative to each other or to a selection bounds |
| distribute_shapesB | Distribute multiple shapes evenly with equal spacing |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 81 tools
Many tools have distinct purposes, but there is notable overlap among shape querying tools (get_page_shapes, query_shapes, search_shapes) and file listing tools (list_files, search_files). Descriptions help differentiate them, but the boundaries are not always crisp.
Most tools follow a consistent verb_noun pattern (list_, get_, create_, update_, delete_). Minor deviations like 'add_page' instead of 'create_page' and 'query_shapes' vs 'search_shapes' are present but not chaotic.
With 81 tools, the server is extremely overloaded. The scope spans files, shapes, teams, comments, media, fonts, snapshots, libraries, webhooks, and profile, which could be split into separate servers or consolidated. This makes the tool surface overwhelming.
The domain is broad but has significant gaps: project management lacks get/update/delete operations, and page management lacks update/delete. Shape operations are missing copy/duplicate/group. These gaps will cause agent failures when trying to perform common design workflows.