Skip to main content
Glama

Build

Concrete CMS MCP Server

Use an AI agent, like Claude Desktop, to work with your Concrete CMS site: ask it about your pages, files and users, or let it update your content.

AI agents cannot work with a Concrete CMS site by themselves: they need a connector. This project is that connector: it tells the AI agent what it can do in your site, and it does it on behalf of the agent, using the REST API of Concrete CMS.

You decide what the connector is allowed to do, and it always acts with the permissions of the Concrete CMS user who signed in.

In technical terms, the connector is a Model Context Protocol (MCP) server, built with TypeScript.

Screenshot of a chat with Claude Desktop and a Concrete CMS MCP Server

Installation

There are two ways to use this connector. In both cases your Concrete CMS site can be anywhere.

1. Local configuration only

The connector runs on your computer.

See Local configuration.

2. Remote server

The connector runs on a server: always on, and shared by several users.

See Remote server.

Related MCP server: WordPress MCP Server

Usage

Use your own OpenAPI specification

The MCP server is loading openapi.yml to know which endpoints are available in the Concrete CMS API. The bundled openapi.yml file is generated from the Concrete CMS default installation, but you can also use your own OpenAPI specification. If you added some Express Objects to your Concrete CMS installation and want to use them in your chat, you can generate a new OpenAPI specification from your installation and use it instead.

  1. Check "Include this entity in REST API integrations." in the Express Object settings.

  2. Open https://your-concrete.example/index.php/ccm/system/api/openapi.json in your browser, and copy the JSON output.

  3. Replace the openapi.yml file in the concretecms-mcp-server directory with your own OpenAPI specification.

Features

This MCP server is depended on the Concrete CMS API, so it supports all features that are available through the API. For example:

  • Get information about your Concrete CMS installation.

  • Get content from your Concrete CMS installation.

  • Update content in your Concrete CMS installation.

  • Upload files to your Concrete CMS installation.

  • Get a list of users in your Concrete CMS installation.

  • And more!

You can find a list of all available endpoints in Concrete CMS REST API - Endpoints

High-level page tools

In addition to OpenAPI-generated tools, the server exposes helpers for common page workflows:

  • get_page_content — read a page as a document (html, html_raw, and plain text) via includes=content

  • update_page_content — create an editable page version, remap block IDs, then update specific blocks (PUT page + PUT area)

Prefer these when reviewing or editing page copy. Use the raw OpenAPI tools (getPageById, updateBlockInPageArea, etc.) for lower-level control.

Required OAuth scopes for the update helper: pages:read, pages:update, pages:areas:update_blocks.

Connection check

The check_connection tool verifies that the connector can work with your Concrete CMS site, without signing in. To use it, ask your AI agent something like "check the connection to my Concrete CMS site".

It checks that:

  • the site is reachable

  • the pretty URLs and the API are enabled

  • the web server passes the Authorization header to Concrete CMS

  • the API integration accepts the Client ID, the Redirect URI and the scopes of the connector

For every failed check, it tells how to fix it. It does not check the Client Secret, which is verified when you sign in.

Documentation

For developers:

ToDos

  • Test with other MCP clients.

  • Add useful prompts.

  • Support another authentication method than OAuth2.

License

MIT

Available Tools

38 tools
add-block-to-page-areaD
Destructive

Adds a block to a page area.

Inputs: pageID (required), areaHandle (required), type, value.

add-fileD
Destructive

Adds a file object.

Inputs: file, folder.

add-groupC
Destructive

Adds a Group object.

Inputs: name.

add-pageC
Destructive

Adds a page object.

Inputs: name, type, parent, template, +2 more.

add-userD
Destructive

Adds a user object.

Inputs: email, language, password, username.

change-user-passwordC
Destructive

Change a user's password

Inputs: userID (required), password.

check_connectionA
Read-only

Check that this connector can work with the Concrete CMS site: site reachable, pretty URLs, API enabled, Authorization header, and the Client ID, Redirect URI and scopes of the API integration. It needs no sign-in. Use it when the user asks to check or troubleshoot the connection, or when the other tools fail with connection or authorization errors. Every failed check comes with how to fix it.

Inputs: no named parameters.

delete-block-by-idC
Destructive

Delete a block by its ID

Inputs: blockID (required).

delete-block-from-page-areaC
Destructive

Deletes a block from a page area.

Inputs: pageID (required), blockID (required), areaHandle (required).

delete-file-by-idC
Destructive

Delete a file by its ID

Inputs: no named parameters.

delete-page-by-idC
Destructive

Delete a page by its ID

Inputs: pageID (required).

delete-page-version-by-page-id-and-version-idC
Destructive

Delete a page version.

Inputs: pageID (required), versionID (required).

delete-user-by-idC
Destructive

Delete a user by its ID

Inputs: userID (required).

get-accountC
Read-only

Make a GET request to /ccm/api/1.0/account

Inputs: no named parameters.

get-block-by-idC
Read-only

Find a block by its ID

Inputs: blockID (required), includes.

get-child-pagesA
Read-only

Allows the traversal of the sitemap by showing child pages of a particular page.

Inputs: pageID (required), includes.

get-default-siteB
Read-only

Retrieve the default site for your Concrete installation

Inputs: includes.

get-file-by-idC
Read-only

Find a file by its ID

Inputs: includes.

get-filesB
Read-only

Returns a list of file objects, sorted by last updated descending. The most recent file objects appear first.

Inputs: limit, includes.

get-group-by-idB
Read-only

Find a user group by its ID

Inputs: groupID (required).

get-groupsB
Read-only

Returns a list of Group objects, sorted by ID ascending.

Inputs: after, limit.

get-page-by-idC
Read-only

Find a page by its ID

Inputs: pageID (required), version, includes.

get_page_contentA
Read-only

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.

Inputs: pageID (required), version.

get-pagesB
Read-only

Returns a list of page objects, sorted by last updated descending. The most recent Page objects appear first.

Inputs: after, limit, includes.

get-page-version-by-page-id-and-version-idC
Read-only

Find a page version by its ID and the ID of its page.

Inputs: pageID (required), versionID (required).

get-page-versions-by-page-idA
Read-only

Returns a list of page version objects for a given page ID, sorted by date created descending.

Inputs: pageID (required), limit, resultsPage.

get-site-by-idC
Read-only

Find a site by its ID

Inputs: siteID (required).

get-sitesB
Read-only

Returns a list of site objects, sorted by date added ascending.

Inputs: includes.

get-system-infoC
Read-only

Make a GET request to /ccm/api/1.0/system/info

Inputs: no named parameters.

get-user-by-idC
Read-only

Find a user by its ID

Inputs: userID (required), includes.

get-usersB
Read-only

Returns a list of user objects, sorted by date added descending. The most recent user objects appear first.

Inputs: after, limit, includes.

move-file-to-locationC
Destructive

Move a file to a new location

Inputs: folder.

update-block-in-page-areaC
Destructive

Updates a block within a page area.

Inputs: pageID (required), blockID (required), areaHandle (required), value.

update-file-by-idD
Destructive

Update a file by its ID

Inputs: tags, title, attributes, description.

update-page-by-idC
Destructive

Update a page by its ID

Inputs: pageID (required), name, type, template, +2 more.

update_page_contentA
Destructive

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.

Inputs: blocks (required), pageID (required), page.

update-page-version-by-page-id-and-version-idD
Destructive

Update a page version

Inputs: pageID (required), versionID (required), is_approved, publish_end_date.

update-user-by-idC
Destructive

Update a user by its ID

Inputs: userID (required), email, language, username, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.4/5.0

    Scored across 38 tools

    Disambiguation4/5

    Most tools target a distinct resource and action, and descriptions clarify subtle boundaries such as get_page_content vs get-page-by-id and update-page-by-id vs update_page_content. A few overlaps remain around page content, page versions, and block deletion, but the set is generally distinguishable.

    Naming Consistency3/5

    The tool set mixes kebab-case names such as get-page-by-id and update-user-by-id with snake_case names such as get_page_content and check_connection. The verb-first pattern is mostly readable, but the inconsistent casing/separator style prevents a higher score.

    Tool Count2/5

    With 38 tools, the surface is heavy for a CMS connector and includes many narrow CRUD variants. The count exceeds the typical 3-15 well-scoped range and pushes toward too many tools for the apparent purpose.

    Completeness3/5

    Core page, file, user, group, site, block, and version operations are represented, but important gaps remain: groups lack update/delete, sites lack create/update/delete, and page version approval/publishing is explicitly not covered. These are notable lifecycle omissions that could cause agent dead ends.

    Maintenance

    ActivityMaintained
    ResponsivenessUsually handled

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to interact with WordPress sites through the REST API. Supports multiple WordPress sites with secure authentication, enabling content management, post operations, and site configuration through natural language.
      34 npm
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI assistants to manage WordPress sites through natural conversation, supporting post creation, content updates, site queries, and draft-to-publish workflows via the WordPress REST API.
      9
      MIT
    • F
      license
      B
      quality
      D
      maintenance
      Enables interaction with Frappe and ERPNext sites through their REST API endpoints. It supports standard HTTP methods for performing CRUD operations and managing site data using natural language.
      1
      2
      -
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables interaction with WordPress sites through the WordPress REST API via natural language, supporting single and multi-site management, content and taxonomy operations, media uploads, and more.
      154 npm
      99
      GPL 3.0