Model Context Protocol server for Concrete CMS integration, enabling AI agents to manage pages, blocks, and content through the Concrete CMS API
Server implements 2 tools with clear naming and mostly good schema definitions. Naming follows verb_noun pattern (get_page_content, update_page_content). Descriptions are present and informative (143-181 chars), covering WHAT the tool does and WHEN to use it. Input schemas are properly structured with types and descriptions. However, there are notable gaps: output schemas are not documented (only return types are implied by handler code), error handling lacks recovery guidance, and parameter validation is minimal (e.g., no range validation on pageID). Tool annotations are present (readOnlyHint, destructiveHint implied by naming), which is a modern pattern. The update_page_content tool is complex and could benefit from more explicit error handling and confirmation patterns for destructive operations.
Review a Concrete CMS page as a document. Returns sanitized HTML, raw HTML, and plain text. Prefer this over getPageById with includes=content when summarizing or reading page copy. Does not return areas/blocks.
Update page block content safely. Creates a new editable page version (PUT page), remaps block IDs, then updates each block (PUT area). Provide blockID values from the version you inspected. Does not approve the new version.
Output schemas not documented. Tool implementations return JSON via jsonResult() but no explicit return type schema is exposed in tool definitions. LLMs cannot plan downstream calls or extract nested fields reliably.
Error handling lacks recovery guidance. errorResult() returns bare error messages (e.g. 'pageID must be a positive integer'). No guidance on retryability, alternative tools, or next steps for the LLM.
update_page_content is destructive but lacks confirmation/dry-run pattern. Tool creates a new page version and modifies blocks with no dry-run mode or explicit confirmation step. Agents could accidentally modify live content.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 68 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 9 | - | v1 |
Parameter pageID lacks range validation in description. Schema shows type 'number' but description doesn't state 'must be a positive integer' or provide bounds. Validation is enforced in code (requirePageId check) but not declared in schema or description.
update_page_content.blocks[].value parameter is vaguely typed as 'object'. Description says 'same shape as the Concrete block editing form' but provides no inline schema or field guidance. LLMs cannot determine valid structure without external documentation.
No pagination or result limiting documented. While current tools don't return lists, if future tools add get_pages or search_pages, responses could grow unbounded. No mention of page/limit parameters or total counts.