Plone Dynamic Pages MCP Server
According to the provided schema (legacy v1 standalone), you can authenticate with token/cookie, manage Plone content, and build dynamic pages via URL-based tools.
Session & credentials:
check_credentials_status,set_session_context(token, cookie,api_url).Dynamic page structure:
get_site_definitions,get_dynamic_page_content(rows + featured items).Generic content CRUD/search:
create_content,patch_content,delete_content(requiresconfirmed),search_content.Dynamic page layout:
create_dynamic_page_row,create_dynamic_page_row_featured,move_dynamic_page_row.File uploads:
upload_file(Base64) andupload_local_asset(local filesystem path).Auth model: token or cookie passed per call/session; tools use full API/content/row URLs rather than the v2
plone_configure+ site-relative paths model.
Click on "Deploy 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 Dynamic Pages MCP ServerGet the dynamic page layout for the homepage"
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 Dynamic Pages MCP Server
An MCP server that extends the official @plone/mcp server with seven additional tools for managing Plone sites built with the cs_dynamicpages product. Call plone_configure once per session, then use the full official toolset plus the dynamic-layout tools.
🚀 Key Features
Official toolset included: All
@plone/mcptools (blocks, workflow, translations, users, navigation tree, vocabularies, search) are available as-is.Dynamic Layout Management: Analyze full page structures, including rows and featured items.
Full CRUD Operations: Create, patch, move, and delete Plone content and layout components.
Universal Content Support: Generic
plone_create_contenttool for any Plone content type (Folder, Document, Link, etc.).Local File Integration:
plone_upload_local_assetuploads files straight from your filesystem.
Related MCP server: Plone MCP Server
🛠️ Dynamic Pages Tools (added on top of @plone/mcp)
Tool | Description |
| Fetches site-specific definitions (Schemas and Row Types) from Plone. |
| Returns the full JSON structure of a DynamicPage (Rows + Featured Items). Handles up to 1000 items. |
| Creates a new layout section ( |
| Creates a featured item ( |
| Reorders layout rows (top, bottom, or a specific position). |
| Uploads images or files using Base64 data. |
| Reads a file from the local filesystem and uploads it to Plone. |
Everything else comes from the official package: plone_configure, plone_create_content, plone_update_content, plone_delete_content, plone_search, plone_get_navigation_tree, plone_get_block_schemas, workflow and translations tools, etc.
📚 MCP Resources
Besides tools, the server exposes read-only MCP resources, discoverable by any MCP client:
Resource | URI | Content |
Architecture |
| Markdown reference: hierarchy, row types, common fields and migration mapping. |
Migration protocol |
| Markdown "Skeleton + Mapping" workflow for replicating pages. |
Row types |
| JSON list of available row types, from the site registry. |
DynamicPageRow schema |
| JSON schema of |
DynamicPageRowFeatured schema |
| JSON schema of |
The two documentation resources work without a Plone connection. The other three require plone_configure; until then they return a short message explaining how to configure the connection instead of failing.
The official @plone/mcp resources (plone://site, plone://types, plone://content{+path}) remain available.
⚠️ Differences from the standalone v1 server
Earlier versions of this server shipped their own set_session_context / check_credentials_status / create_dynamic_page_row tools and authenticated with a __ac cookie. As of v2 the server delegates to @plone/mcp:
Connect with
plone_configure({ baseUrl, token })orplone_configure({})usingPLONE_BASE_URL/PLONE_TOKEN(or username/password). The client does not support cookie auth; use a token or basic auth.Tool arguments use site-relative paths (e.g.
/rows,/en/home). Full++api++URLs are also accepted and normalized to site-relative paths automatically.create_content/search_content/patch_content/delete_contentmap toplone_create_content/plone_search/plone_update_content/plone_delete_content.
💻 Installation & Usage
The server runs over STDIO (no Plone-side changes required) and can be launched either directly from the GitHub repository via npx or from a local clone of this repo.
Quick Start: run via npx from GitHub (no cloning required)
Add the following configuration to your Opencode (opencode.json):
{
"mcp": {
"cs-dynamicpages-mcp": {
"type": "local",
"command": ["npx", "-y", "github:codesyntax/cs-dynamicpages-mcp"],
"enabled": true
}
}
}npx fetches the repository from GitHub and launches the committed build automatically; nothing else needs to be installed. github: resolves to git+ssh, so it requires an SSH key for GitHub; without one, use the HTTPS form: npx -y git+https://github.com/codesyntax/cs-dynamicpages-mcp.git.
Authentication is provided through the server's environment block — see Credentials & environment variables. A .env file is not read.
Running from a local clone
Clone the repository and install its dependencies:
git clone https://github.com/codesyntax/cs-dynamicpages-mcp
cd cs-dynamicpages-mcp
npm installThen point your MCP client at the local entry point instead of the GitHub package:
{
"mcp": {
"cs-dynamicpages-mcp": {
"type": "local",
"command": ["npx", "tsx", "src/local.ts"],
"cwd": "/absolute/path/to/cs-dynamicpages-mcp",
"enabled": true
}
}
}The cwd is required because MCP clients launch the command from an arbitrary
directory; without it the relative src/local.ts will not resolve. You can also
run the server directly from the clone with npm start (after npm run bundle).
Running from a local clone without tsx
The compiled entry point (dist/local.js) is committed to the repository, so it is
available without building:
{
"mcp": {
"cs-dynamicpages-mcp": {
"type": "local",
"command": ["node", "/absolute/path/to/cs-dynamicpages-mcp/dist/local.js"],
"enabled": true
}
}
}Credentials & environment variables
@plone/mcp reads its configuration from the process environment. Supported variables:
Variable | Description |
| Base URL of your Plone site (fallback for |
| Bearer token for authentication (alternative to username/password). |
| Basic auth credentials. |
| Optional comma-separated allow-list of tool names; applies to both the official tools and the dynamic pages tools. |
| Session TTL in milliseconds (from |
| Prepared-blocks TTL in milliseconds (from |
Provide them through the MCP server's environment block in opencode.json:
{
"mcp": {
"cs-dynamicpages-mcp": {
"type": "local",
"command": ["npx", "-y", "github:codesyntax/cs-dynamicpages-mcp"],
"environment": {
"PLONE_BASE_URL": "https://your-plone",
"PLONE_TOKEN": "eyJhbGciOi..."
},
"enabled": true,
"timeout": 60000
}
}
}Or with basic auth instead of a token:
"environment": {
"PLONE_BASE_URL": "https://your-plone",
"PLONE_USERNAME": "admin",
"PLONE_PASSWORD": "secret"
}Then call plone_configure({}) once per session. The credentials live in the server process environment; the model never needs to read them.
⚠️ A
.envfile is not loaded into the MCP server. Verified with OpenCode: with a variable defined only in.env, the server process receivedundefined, and{env:VAR}resolved to an empty string (OpenCode runs a long-lived background service, so the MCP process inherits the service environment, not the environment of the shell that runs a single command).
If you prefer not to store secrets in opencode.json, use substitution ("PLONE_TOKEN": "{env:PLONE_TOKEN}") and make sure the variable is present in the environment that starts the OpenCode service (then restart it, e.g. opencode service restart). Exporting it only in the shell of a one-off command does not reach the server.
Note: credentials can also be passed at runtime with plone_configure({ baseUrl, token }) (or username/password).
Requires a Node.js version supported by @plone/mcp: ^20.19.0 || >=22.12.0 (Node.js 22+ recommended).
🏗️ Project Structure
src/local.ts: Entry point for localstdioexecution (the extended server).src/extended-server.ts: Creates the@plone/mcpserver and registers the dynamic pages tools.src/plone-mcp.ts: Single adapter re-exporting the@plone/mcpinternals the wrapper relies on.src/tools/: One file per dynamic pages tool (plone_*.ts), plusshared.ts(helpers and schemas) andindex.ts(thedynamicPagesToolslist andregisterDynamicPagesTools), mirroring the@plone/mcplayout.src/dynamicPages/: Pure helpers (payload builders, ordering computation, hierarchy reassembly) shared by the tools.scripts/build.mjs: esbuild bundling ofsrc/local.tsintodist/local.js.
🧪 Development
npm install # .npmrc sets legacy-peer-deps for npm 10 + vitest
npm run bundle # rebuild dist/local.js (esbuild) — run before committing
npm test # vitest unit + handler seam tests
npm run typecheck # tsc --noEmit
npm start # run the compiled stdio server (node dist/local.js)
npm run dev # run from source with tsx (src/local.ts)dist/local.js is intentionally committed: git installs (npx github:…) must not
run a build, because that would install devDependencies and npm 10.9.x crashes on
vitest's peer set. Remember to run npm run bundle and commit dist/ after
changing the source.
The build script is named
bundle(notbuild) on purpose: npm/pacote treat abuildscript as a git-dependency preparation trigger, which would reinstall devDependencies onnpx github:….
This project pins @plone/mcp to the published 1.0.0-alpha.2 package. To track
unreleased changes from the official repository instead, point the dependency at
the branch (git+https://github.com/plone/plone-mcp.git#main). Note that a git
dependency requires npm >= 11 (or legacy-peer-deps on npm 10), because
@plone/mcp compiles itself on install.
🔒 Security
This server handles credentials strictly within your local environment. The @plone/mcp code runs from node_modules on your machine, and your API tokens are only ever sent to the Plone site you configure. Ensure you trust the source before providing sensitive API tokens.
Available Tools
13 toolscheck_credentials_statusA
Checks if Plone credentials (token or cookie) are provided in the arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It states that the tool inspects arguments ('provided in the arguments'), which is a useful scoping detail. However, it does not disclose return value format, error behavior, or that it performs no network call. This is a minimal but non-misleading disclosure, adequate for a simple check.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that contains no filler words. Every word contributes to the meaning, making it highly efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter check with no output schema, the description is fairly complete. It identifies the tool's purpose and parameters. It does not explicitly mention return values or usage context, but given the low complexity, the information provided is sufficient for an agent to select the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It names both parameters (token, cookie) and clarifies they are Plone credentials, adding meaning beyond the raw schema. It does not explain format or precedence, but the essential semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: checking whether Plone credentials (token or cookie) are provided. It uses a specific verb ('checks') and resource ('Plone credentials'), and the parameter names make it easily distinguishable from sibling tools, which focus on content and file operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage: to verify credential presence before making authenticated requests. No explicit alternatives are given, but no sibling tool performs a similar check, so differentiation is inherent. The context is clear, though it could be stronger with an explicit when-to-use recommendation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contentC
Creates any content type in Plone.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| token | No | ||
| cookie | No | ||
| api_url | No | ||
| content_type | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden for behavioral disclosure, but it only states 'Creates any content type'. It does not disclose the mutation side effects, authentication requirements (token/cookie), validation behavior, or response format. This is a significant gap for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is concise in length, but it is under-specified rather than effectively concise. It does not provide enough information to be useful, and the brevity is not a virtue given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 5 parameters, a nested data object, and no annotations or output schema. The description provides almost no context about how to structure requests, what data format is expected, or what happens after creation. It is completely inadequate for an agent to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema coverage is 0%, and the description adds no meaning to the parameters. It mentions 'content_type' indirectly but does not explain the 'data' object, 'api_url', or auth credentials. The description fails entirely to compensate for the lack of parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the primary action ('Creates') and the resource ('any content type in Plone'). It differentiates from sibling tools like patch_content (update) and delete_content (delete), but the scope of 'any content type' is broad and not precise about which content types are supported.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. There are sibling creation tools like create_dynamic_page_row and create_dynamic_page_row_featured, and the description does not explain when to choose create_content over them or mention any prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dynamic_page_rowC
Creates a DynamicPageRow in Plone.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| api_url | Yes | URL of the rows folder | |
| row_data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states that the tool creates a row, but does not disclose authentication requirements, side effects, idempotency, or any other behavioral traits beyond 'create'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one sentence and front-loaded, with no wasteful wording. However, it is under-specified for a complex create operation, so it is not appropriately sized for the tool's needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity (4 params, nested object) and lack of annotations and output schema, this description is severely incomplete. It provides almost no contextual information about what a DynamicPageRow is, how row_data should be structured, or what the response will be.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, and the description adds no information about token, cookie, api_url, or row_data. It does not compensate for the largely undocumented parameters, leaving the agent without semantic guidance for invoking the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Creates a DynamicPageRow in Plone' clearly states the verb and resource. It distinguishes the action but does not differentiate from the sibling tool create_dynamic_page_row_featured, so it lacks explicit differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives like create_dynamic_page_row_featured, nor any context about prerequisites or intended scenarios. The description provides no usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_dynamic_page_row_featuredC
Creates a DynamicPageRowFeatured in Plone.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| api_url | Yes | URL of the parent row | |
| feat_data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for disclosing behavioral traits. It merely restates that it 'creates' the object, which is inherent in the name, and omits any side effects, authentication needs, expected parent relationship, or response behavior. This provides no additional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief but this is under-specification, not effective conciseness. It conveys no information beyond the tool name, so it does not earn its place as a useful description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool handles authentication tokens, a parent row URL, and a nested feat_data object, and there is no output schema. The description provides no operational context, expected behavior, or relationship to sibling tools, making it severely incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, with api_url the only described parameter. The description itself does not mention any parameters, leaving feat_data (a complex nested object), token, and cookie entirely unexplained. It fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a DynamicPageRowFeatured in Plone, using a specific verb and resource. However, it does not differentiate from the sibling tool create_dynamic_page_row, leaving ambiguity about what 'featured' specifically means.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like create_dynamic_page_row or create_content. It lacks any context on prerequisites, scenarios, or exclusions, so the agent must rely on the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_contentA
Deletes a Plone object. Confirmation required.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| confirmed | Yes | ||
| content_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It only mentions that confirmation is required, but fails to state that deletion is irreversible, any cascading effects, authentication needs, or return behavior. The destructive nature is implied by the name but not elaborated, leaving a significant gap for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences, with every word adding value. 'Deletes a Plone object' states the action, and 'Confirmation required' conveys a critical prerequisite, with no redundancy or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a destructive operation with 4 parameters, no annotations, and no output schema, yet the description only provides the basic action and confirmation flag. It omits authentication context, error handling, and post-deletion behavior, making it incomplete for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate by explaining parameter meaning. It only hints at the 'confirmed' parameter by stating confirmation is required, but gives no meaning for content_url, token, or cookie. This is insufficient for a 4-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Deletes' plus the resource 'Plone object' clearly states the tool's function. It is distinct from siblings like create_content and patch_content, and the confirmation requirement adds specific scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies use when a Plone object needs to be removed, which distinguishes it from the create and patch siblings. However, it does not explicitly state when not to use it or mention any alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dynamic_page_contentB
Fetches the full JSON structure of a DynamicPage including rows and featured items.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| page_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavioral traits. It states the tool fetches data (implying read-only) and specifies the return content, but it does not mention authentication requirements (despite token/cookie params) or any other side effects or limitations. The description adds some context but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no unnecessary words. It is front-loaded and easy to parse, but its brevity contributes to incomplete information. It earns a slightly higher score for succinctness, though not top marks because it omits key details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 3 parameters (including token and cookie for authentication), no output schema, and no annotations. The description only covers the basic purpose and return content, leaving out critical context such as authentication requirements, parameter meanings, and the structure of the returned JSON. The description is inadequate for a tool with this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% (no parameter descriptions), and the description fails to compensate by explaining any parameters. The description does not indicate that page_url identifies the DynamicPage, nor does it clarify the roles of token and cookie. This leaves the agent without essential information for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetches the full JSON structure of a DynamicPage including rows and featured items,' using a specific verb ('fetches') and resource ('DynamicPage'), and explicitly mentions the content included. This distinguishes it from sibling tools like search_content or get_site_definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (when the full JSON structure of a DynamicPage is needed), but it does not explicitly mention alternatives or when not to use it. Given siblings like search_content, some guidance on alternatives would improve clarity, but the context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_site_definitionsC
Fetches site-specific definitions (Schemas and Row Types) from Plone.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| api_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure, but it only says 'Fetches' (implying a read operation). It does not mention authentication requirements, return format, error behavior, or any side effects, which is a significant gap for a tool with no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, which is efficient, but it is under-specified. It lacks essential context about parameters, usage, and output, so while it is short, it does not earn its place as a complete guide.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has three parameters, no output schema, and no annotations, yet the description provides only the basic action. It does not explain return values, authentication context, or when this tool should be preferred, making it incomplete for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description adds no explanation of the three parameters (token, cookie, api_url). The description does not compensate for the missing schema descriptions, leaving the agent without sufficient guidance on how to invoke the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetches') and identifies the resource ('site-specific definitions (Schemas and Row Types) from Plone'), making it clear what the tool returns. It does not explicitly name alternatives among siblings, but the resource type distinguishes it from content-fetching tools like get_dynamic_page_content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives such as get_dynamic_page_content or search_content. The description only states what it fetches, leaving the appropriate usage context unstated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_dynamic_page_rowC
Moves a row to a new position.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| row_id | Yes | ||
| position | Yes | ||
| folder_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states 'Moves a row to a new position,' which conveys the core mutation but omits any side effects, constraints, or return behavior. It does not mention whether it preserves other row data, how out-of-bound positions are handled, or if any permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, so it avoids waste. However, it is underspecified to the point of minimal information, which is not effective conciseness. It could be improved with a bit more context without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, no annotations, and 0% schema parameter coverage. The description is a bare statement of action and does not explain return values, error handling, or the meaning of 'position' in context. For a mutation tool with several parameters, this is severely incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate for the 5 parameters. It provides no explanation of row_id, position, folder_url, token, or cookie. The parameter names offer some hints, but the description does not clarify key semantics like the format or range of 'position' or the role of 'folder_url'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the action clearly ('Moves a row') and implies the target resource is a row in a dynamic page, especially given the tool name. It distinguishes from siblings because no other sibling tool is a move operation, but it lacks explicit context that it operates on a 'dynamic page row' and what 'position' means in that context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It does not mention prerequisites, whether it can be used across dynamic pages, or scenarios where create/patch would be more appropriate. There is no explicit 'when to use' or 'when not to use' context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patch_contentC
Updates an existing Plone object (PATCH).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | ||
| token | No | ||
| cookie | No | ||
| content_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full transparency burden. It only states the mutation and the HTTP method, but doesn't disclose side effects, authorization requirements, or behavior for non-existent objects or partial updates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler words, presenting the core purpose directly. It is perfectly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested data object, no output schema, no annotations), the description is too minimal. It only covers the basic function and leaves out return values, parameter semantics, and edge cases, making it incomplete for safe invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description provides no explanation of the four parameters (data, token, cookie, content_url). The agent receives no guidance on how to construct the request, making the description inadequate for parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool updates an existing Plone object and notes the HTTP method (PATCH), making the purpose obvious. However, it doesn't explicitly differentiate from siblings like move_dynamic_page_row, which also modifies content.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an existing object needs modification, but it doesn't state when to prefer this over create_content or delete_content, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contentC
Searches for content in the Plone site.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| query | No | ||
| token | No | ||
| cookie | No | ||
| api_url | Yes | ||
| portal_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral disclosure, but it only states 'searches.' It does not mention whether the operation is read-only, authentication requirements, result format, pagination, or any side effects, which is a significant gap for a search tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence with no redundancy, which is appropriate in length. However, it is under-specified for a six-parameter tool, so it earns a middle score for conciseness but not for substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's six parameters, absence of annotations, and lack of an output schema, the one-sentence description is critically incomplete. It offers no information about return values, parameter usage, prerequisites, or the overall context for invocation, making it inadequate for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has six parameters with 0% description coverage, and the description does not explain any of them. The agent is left to guess the meaning of 'path', 'query', 'token', 'cookie', and 'portal_type', and the tool description provides no compensation for this lack of schema clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Searches' and identifies the resource 'content in the Plone site,' which distinguishes it from sibling content creation/deletion tools. However, it lacks specificity about search scope or capabilities, so it is clear but not maximally distinguished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. There is no mention of search-specific use cases, exclusions, or comparisons to sibling tools like get_dynamic_page_content, leaving the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_session_contextC
Sets the default site URL and credentials for the current session.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| api_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that it sets session context but does not explain whether this overwrites existing credentials, whether it validates the credentials, how long the session lasts, or any side effects. This is a significant gap for a state-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence and front-loads the primary action, but it is under-specified. It earns its place but leaves out crucial operational details, so conciseness comes at the cost of clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This tool is a session setup operation with no output schema and no annotations. The description fails to explain when to call it, which parameters are needed, how it interacts with sibling tools like check_credentials_status, and what side effects occur. It is inadequate for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage for all three parameters (token, cookie, api_url), and the description does not explain their roles beyond loosely mentioning 'credentials' and 'site URL'. The agent cannot determine which parameter is required, how they relate, or valid formats from this description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Sets') and names the resource ('default site URL and credentials for the current session'). It clearly distinguishes this tool from siblings by indicating it establishes session-level context, which no other sibling tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no mention of ordering relative to other calls. It only implies that it configures the session, leaving the agent to infer that it should be called before other authenticated operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_fileC
Uploads a file to Plone.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| token | No | ||
| cookie | No | ||
| api_url | Yes | ||
| filename | Yes | ||
| file_data | Yes | Base64 encoded data | |
| content_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries full responsibility for behavioral disclosure. It only states 'Uploads a file to Plone' with no mention of authentication requirements (token/cookie parameters), the need for base64 encoding, or any other behavioral traits. The agent is left completely uninformed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is concise, but it is under-specified for a tool with 7 parameters and no annotations. It lacks essential structural elements like prerequisites or parameter guidance, making it more of an under-specification than genuinely concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, no output schema, no annotations), the description is wholly inadequate. It does not explain the upload context, success/failure behavior, or how it relates to similar tools. The description appears complete only for a trivial tool, which this is not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 14% (only file_data has a description). The description adds zero parameter information, failing to explain the meaning or usage of the other 6 parameters (token, cookie, api_url, etc.). With such low schema coverage, the description was expected to compensate but did not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Uploads a file to Plone' clearly states the action (upload) and the target resource (a file to Plone). It is specific enough to understand the basic purpose, but it does not distinguish this tool from the sibling 'upload_local_asset', which may also upload files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no information about when to use this tool versus alternatives, no prerequisites, and no exclusions. Given the sibling tool 'upload_local_asset', the intended usage distinction is entirely absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_local_assetB
Reads a file from the local filesystem and uploads it to Plone.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| cookie | No | ||
| api_url | Yes | ||
| local_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavioral traits. It only mentions reading and uploading, but omits important details such as authentication requirements (token/cookie), side effects (e.g., creating or overwriting content), and error behavior. This is insufficient for a mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, direct sentence with no redundant words. It is front-loaded and immediately conveys the core action, making it an excellent example of conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations, no output schema, and 4 parameters, this 9-word description is too sparse. It does not explain how to invoke the tool successfully, what the response looks like, or any caveats. The description covers only the surface functionality, leaving the agent to guess on critical usage details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It implicitly explains local_path (local file) and api_url (Plone endpoint), but completely fails to clarify the meaning or purpose of token and cookie parameters, which are likely authentication credentials. The description adds minimal value over the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads a local file and uploads it to Plone. It specifies both the source (local filesystem) and destination (Plone), distinguishing it from sibling tools like upload_file, which likely handles other upload scenarios.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided about when to use this tool versus alternatives like upload_file, or what prerequisites (e.g., session context, authentication) might be needed. The description solely states the action without contextual or exclusionary information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v2.0.0- First observed
check_credentials_status - First observed
create_content - First observed
create_dynamic_page_row - First observed
create_dynamic_page_row_featured - First observed
delete_content - First observed
get_dynamic_page_content - First observed
get_site_definitions - First observed
move_dynamic_page_row - First observed
patch_content - First observed
search_content - First observed
set_session_context - First observed
upload_file - First observed
upload_local_asset
TDQS
Scored across 13 tools
Most tools have clear, distinct purposes (e.g., get_site_definitions vs. get_dynamic_page_content). However, overlap exists between create_content and the specialized row creation tools, and between upload_file and upload_local_asset, which could lead to confusion about which to use.
All tool names follow a consistent verb_noun pattern using lowercase with underscores (e.g., create_content, patch_content, search_content). The naming is uniform and predictable, with no mixing of conventions.
The server has 13 tools, which is within the ideal 3-15 range. Each tool serves a distinct functional need—configuration, CRUD, dynamic page operations, and file uploads—without being excessive or sparse.
The tool set covers the core domain of Dynamic Page management, including creation, retrieval, update, delete, search, and specialized row operations. A notable gap is the lack of a generic get_content tool for non-DynamicPage objects, but search_content can serve that purpose, so the gap is minor.
Maintenance
Related MCP Connectors
Create, edit, preview, publish, and manage web pages from MCP-capable AI clients.
Manage WordPress blogs and WooCommerce shops from Claude, ChatGPT, Cursor and other MCP apps.
Every page-admin command of the Happenings CLI for your AI, limited to the pages you choose.
1- PixelesqOAuthcom.pixelesq
Build and manage Pixelesq websites from a conversation: pages, sections, content, SEO, analytics.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Optimizely CMS via its GraphQL and Content Management APIs, supporting dynamic content discovery, retrieval, and management.8 npm6MIT

Plone MCP Serverofficial
AlicenseAqualityCmaintenanceEnables AI assistants to manage Plone CMS content, search, workflows, and Volto blocks via REST API.2221 npm7MIT- AlicenseCqualityAmaintenanceEnables interaction with Concrete CMS sites through the Concrete CMS REST API, allowing content management, user operations, and file uploads via natural language.377MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI assistants to manage components and pages on the Journey/SameUp CMS through the CMS REST API, including listing, retrieving, and creating components with automatic authentication.-