Plone MCP Server
OfficialClick on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Plone MCP Servercreate a new document with blocks and publish it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Plone MCP Server
A Model Context Protocol (MCP) server for integrating MCP clients with Plone CMS via REST API. Enables content management, search, workflow operations, and Volto blocks management.
Prerequisites
Node.js 18+ - Required to run the server (install:
brew install nodeon macOS or from nodejs.org)pnpm 8+ - Package manager (install:
npm install -g pnpmorbrew install pnpmon macOS)Plone 6.0+ site with REST API - The CMS you'll be connecting to
Quick Start using Claude Desktop as an example
Install
git clone https://github.com/plone/plone-mcp.git
cd plone-mcp
pnpm install
pnpm run buildConfigure Claude Desktop
Add to Claude's configuration file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
With environment variables (optional):
{
"mcpServers": {
"plone": {
"command": "node",
"args": ["/absolute/path/to/plone-mcp/dist/index.js"],
"env": {
"PLONE_BASE_URL": "https://demo.plone.org",
"PLONE_USERNAME": "admin",
"PLONE_PASSWORD": "admin"
}
}
}
}Without environment variables:
{
"mcpServers": {
"plone": {
"command": "node",
"args": ["/absolute/path/to/plone-mcp/dist/index.js"]
}
}
}Restart Claude Desktop
Connect to Plone
Call plone_configure once per session:
// Using environment variables
plone_configure({})
// OR providing credentials/token directly to the LLM
plone_configure({
"baseUrl": "https://demo.plone.org",
"username": "admin",
"password": "admin"
})
plone_configure({
"baseUrl": "https://demo.plone.org",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
})Note: Arguments take precedence over environment variables.
Core Features
Content Management: CRUD operations on all Plone content types
Block System: Create and manage Volto blocks
Search: Full-text search with filtering and sorting
Workflow: Manage publication states and transitions
Site Info: Access content types, vocabularies, and site configuration
Essential Tools
Tool | Description | Example |
| Connect to Plone (call once per session) |
|
| Get content by path |
|
| Create new content |
|
| Update existing content |
|
| Delete content |
|
| Search content |
|
| Change workflow state |
|
Block Management
Creating Content with Blocks
// 1. Prepare blocks (60-second TTL - meant to be used inmediatly before content creation/editing)
plone_create_blocks_layout({
"blocks": [
{
"type": "text",
"data": {"text": "Welcome to our site!"}
},
{
"type": "teaser",
"data": {
"href": "/about",
"title": "Learn More",
"description": "Discover what we do"
}
}
]
})
// 2. Create content (within 60 seconds), the previously prepared blocks will automatically be included in the request
plone_create_content({
"parentPath": "/",
"type": "Document",
"title": "Homepage"
})Managing Individual Blocks
// Add a single block
plone_add_single_block({
"path": "/homepage",
"blockType": "text",
"blockData": {"text": "New paragraph"},
"position": 1
})
// Update a block
plone_update_single_block({
"path": "/homepage",
"blockId": "51176ead-7b59-402d-9412-baed46821b36", // Get ID from plone_get_content
"blockData": {"text": "Updated text"}
})
// Remove a block
plone_remove_single_block({
"path": "/homepage",
"blockId": "51176ead-7b59-402d-9412-baed46821b36"
})Available Block Types
text: Rich text content
teaser: Link preview card with image
__button: Call-to-action button
separator: Visual divider line
Use plone_get_block_schemas() to see all block types and their properties.
Common Workflows
Create and Publish a Page
// Configure connection
plone_configure({baseUrl: "https://mysite.com", username: "editor", password: "secret"})
// Create with blocks
plone_create_blocks_layout({
"blocks": [{"type": "text", "data": {"text": "Article content..."}}]
})
plone_create_content({
"parentPath": "/news",
"type": "News Item",
"title": "Breaking News"
})
// Publish
plone_transition_workflow({
"path": "/news/breaking-news",
"transition": "publish"
})Search and Filter
plone_search({
"query": "annual report",
"portal_type": ["Document", "File"],
"review_state": ["published"],
"sort_on": "modified",
"sort_order": "descending",
"b_size": 10
})Important Notes
⚠️ Prepared blocks expire after 60 seconds - Always call plone_create_blocks_layout immediately before creating/updating content.
⚠️ Configure once per session - Run plone_configure once at the start of each session before using other tools. Once configured, you can use all other tools without reconfiguring.
Development
# Development mode with hot reload
pnpm run dev
# Test with MCP Inspector
pnpm run inspector
# Build for production
pnpm run buildTroubleshooting
Issue | Solution |
"Plone client not configured" | Run |
"Block not found" | Use |
Connection errors | Verify Plone URL and credentials are correct |
Blocks not applied | Call |
TypeScript errors during build | Run |
Resources
License
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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