Plone MCP Server
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PLONE_BASE_URL | No | Base URL of the Plone site (e.g., https://demo.plone.org) | |
| PLONE_PASSWORD | No | Password for Plone authentication | |
| PLONE_USERNAME | No | Username for Plone authentication |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| plone_configureA | Establishes and authenticates the connection to a Plone CMS. Must be called once per session before other tools can be used. Configuration can be provided via arguments or environment variables (PLONE_BASE_URL, PLONE_USERNAME, PLONE_PASSWORD, PLONE_TOKEN). Arguments take precedence over environment variables. To use environment variables only, call with an empty object: plone_configure({}). Example with arguments: plone_configure({baseUrl: 'https://demo.plone.org', username: 'admin', password: 'secret'}). |
| plone_get_contentB | Retrieves the full JSON data for a single content item from Plone using its path. Example: plone_get_content({path: '/news/latest-update'}) |
| plone_create_contentA | Creates a new content item (e.g., a page or news article) in Plone. To add complex block-based content, first prepare the structure with |
| plone_update_contentA | Modifies an existing content item in Plone. Can update metadata (like title) and/or replace the entire block structure. Use |
| plone_delete_contentA | Permanently deletes a content item from Plone using its path. Example: plone_delete_content({path: '/old-content'}) |
| plone_searchB | Performs a detailed search for content items, allowing filters by text, content type, path, and workflow state. Example: plone_search({query: 'annual report', portal_type: ['Document'], review_state: ['published']}) |
| plone_get_site_infoA | Retrieves top-level information and metadata about the connected Plone site, such as available languages and Plone version. |
| plone_get_typesA | Lists all available content types that can be created in the Plone site (e.g., 'Document', 'Event'). |
| plone_get_type_schemaA | Gets the full JSON schema for a specific content type, including all fields, their types, required status, and validation rules. Use this to understand what fields are available when creating or updating content. Example: plone_get_type_schema({contentType: 'Document'}) |
| plone_get_vocabulariesA | Fetches the allowed values for a specific field, such as a list of categories or tags. Useful for finding valid inputs for content fields. Example: plone_get_vocabularies({vocabulary: 'plone.app.vocabularies.Keywords'}) |
| plone_get_workflow_infoA | Shows the current workflow state (e.g., 'Published', 'Private') and available transitions for a content item. Example: plone_get_workflow_info({path: '/my-document'}) |
| plone_transition_workflowA | Changes the workflow state of a content item by executing a specific transition, like 'publish' or 'submit'. Example: plone_transition_workflow({path: '/my-document', transition: 'publish'}) |
| plone_get_block_schemasA | Lists all available Volto block types (e.g., 'slate', 'teaser', 'button') and their required data schemas. If no block type specified, the tool returns all blocks schemas. Essential for understanding how to construct blocks. Example: plone_get_block_schemas({blockType: 'teaser'}) |
| plone_create_blocks_layoutA | Prepares a complete block structure in memory (valid for 60 seconds). This structure is then used by the next immediate call to |
| plone_add_single_blockA | Adds a single new block to an existing content item without replacing other blocks. Specify the block type, data, and optional position. Example: plone_add_single_block({path: '/my-page', blockType: 'text', blockData: {text: 'New paragraph'}}) |
| plone_update_single_blockA | Modifies the data of a single, existing block within a content item, identified by its block ID. Example: plone_update_single_block({path: '/my-page', blockId: 'abc123', blockData: {text: 'Updated text'}}) |
| plone_remove_single_blockA | Deletes a single block from a content item, identified by its block ID. Example: plone_remove_single_block({path: '/my-page', blockId: 'abc123'}) |
| plone_get_translationB | Retrieves all available translations for a content item , identified by its '@id' (URL). Example: plone_get_translation({path: '/en/my-page'}) |
| plone_link_translationB | Links an existing content item as a translation of another. Both items must already exist. Passing the '@id' (full URL) of the existing content item. Example: plone_link_translation({path: '/en/my-page', id: 'https://example.com/de/meine-seite'}) |
| plone_unlink_translationB | Removes the translation link between a content item and one of its translations, identified by language code. Example: plone_unlink_translation({path: '/en/my-page', language: 'de'}) |
| plone_create_userA | Creates a new user in the Plone site. Requires Manager role or self-registration to be enabled. Example: plone_create_user({username: 'jdoe', password: 'secret', email: 'jdoe@example.com', fullname: 'John Doe', roles: ['Contributor']}) |
| plone_update_userA | Updates an existing user's properties in Plone. Requires Manager role or the user updating their own account. Roles are specified as an object mapping role names to booleans to add or remove them. Example: plone_update_user({userid: 'jdoe', fullname: 'Jane Doe', roles: {Editor: true, Contributor: false}}) |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| create-page-workflow | A guided workflow to create a single web page with specific content and structure. |
| create-example-site-workflow | A guided workflow to create a small, multi-page example website with interconnected content. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| plone-site | Provides direct read-only access to the Plone site's root information object. |
| plone-types | Provides direct read-only access to the list of available content types. |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/plone/plone-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server