Concrete CMS MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CONCRETE_API_SCOPE | Yes | The scopes to request. Example: 'account:read system:info:read' | |
| CONCRETE_API_CLIENT_ID | Yes | The client ID of a registered API integration. | |
| CONCRETE_CANONICAL_URL | Yes | The URL of your Concrete CMS installation. | |
| CONCRETE_API_CLIENT_SECRET | Yes | The client secret of a registered API integration. |
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 |
|---|---|
| get-accountC | Make a GET request to /ccm/api/1.0/account |
| add-block-to-page-areaD | Adds a block to a page area. |
| update-block-in-page-areaC | Updates a block within a page area. |
| delete-block-from-page-areaC | Deletes a block from a page area. |
| get-block-by-idC | Find a block by its ID |
| delete-block-by-idC | Delete a block by its ID |
| get-file-by-idC | Find a file by its ID |
| update-file-by-idD | Update a file by its ID |
| delete-file-by-idC | Delete a file by its ID |
| get-filesB | Returns a list of file objects, sorted by last updated descending. The most recent file objects appear first. |
| add-fileD | Adds a file object. |
| move-file-to-locationC | Move a file to a new location |
| get-group-by-idB | Find a user group by its ID |
| get-groupsB | Returns a list of Group objects, sorted by ID ascending. |
| add-groupC | Adds a Group object. |
| get-page-by-idC | Find a page by its ID |
| update-page-by-idC | Update a page by its ID |
| delete-page-by-idC | Delete a page by its ID |
| get-pagesB | Returns a list of page objects, sorted by last updated descending. The most recent Page objects appear first. |
| add-pageC | Adds a page object. |
| get-child-pagesA | Allows the traversal of the sitemap by showing child pages of a particular page. |
| get-site-by-idC | Find a site by its ID |
| get-sitesB | Returns a list of site objects, sorted by date added ascending. |
| get-default-siteB | Retrieve the default site for your Concrete installation |
| get-system-infoC | Make a GET request to /ccm/api/1.0/system/info |
| get-user-by-idC | Find a user by its ID |
| update-user-by-idC | Update a user by its ID |
| delete-user-by-idC | Delete a user by its ID |
| get-usersB | Returns a list of user objects, sorted by date added descending. The most recent user objects appear first. |
| add-userD | Adds a user object. |
| change-user-passwordC | Change a user's password |
| get-page-version-by-page-id-and-version-idC | Find a page version by its ID and the ID of its page. |
| update-page-version-by-page-id-and-version-idD | Update a page version |
| delete-page-version-by-page-id-and-version-idC | Delete a page version. |
| get-page-versions-by-page-idA | Returns a list of page version objects for a given page ID, sorted by date created descending. |
| get_page_contentA | 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_contentA | 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. |
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 37 tools
Most tools map cleanly to a single resource+action (file, page, user, group, site, block, page version), and the content tools explicitly warn against using get-page-by-id for reading copy. However, there are two block delete tools (delete-block-from-page-area vs delete-block-by-id) with no guidance on which to use, and update-page-by-id vs update_page_content overlap in intent, as do get-page-by-id (with content includes) and get_page_content.
The dominant convention is kebab-case verb_noun (add-file, get-users, delete-page-by-id), which is readable and predictable. But two tools break it with snake_case (get_page_content, update_page_content), and a few tools lack the resource suffix pattern (get-account, get-system-info), so the set is mixed.
37 tools is heavy for a single CMS surface and well above the comfortable 3-15 range. While the resources are real, the page/block/page-version cluster in particular has accumulated many near-adjacent operations that inflate the surface.
Files, pages, users, blocks, and page versions all have solid create/read/update/delete lifecycles, including content read/write and sitemap traversal. Gaps remain: groups have add/get/list but no update or delete, and sites are entirely read-only (get-sites, get-site-by-id, get-default-site with no create/update/delete).