cascade-cms-rest-mcp
A local, read-only MCP server exposing a
Hannon Hill Cascade CMS server to MCP clients (Claude Desktop, Claude Code,
etc.), built on top of cascade-cms-rest.
Seven tools, all read-only — no tool in this server can perform a write operation, even indirectly:
| Tool | Purpose |
|---|---|
cascade_search |
Search a site for assets by text |
cascade_read_asset |
Read a single asset by id or by site+path |
cascade_query_asset |
A narrowed read of one part of any asset, by path query — works on any asset shape, not just data-bound ones |
cascade_get_data_structure |
A data-bound asset's field schema, resolved from its bound content type/data definition |
cascade_get_page_config |
A data-bound asset's page configuration names/regions |
cascade_root_container_id |
The root container id (e.g. Data Definitions folder) for an asset type on a site |
cascade_list_sites |
List every site on the server |
cascade_query_asset exists because cascade_read_asset's concise mode only
collapses top-level fields, and its only narrowing hints are two
page/content-type-specific field names (structuredData, pageConfigurations)
— every other shape (metadata sets in particular, whose nested layout varies
per metadata set definition) otherwise has no narrowed-read option short of
format="detailed" dumping the entire payload. cascade_query_asset takes a
small, safe path-query string — parsed via Python's ast module (never
eval'd) — such as metadata.dynamicFields[0].value,
metadata["dynamicFields"][0], a "*" wildcard over a list/dict, or
find("identifier") to search the whole asset for a key by name at any
depth — and returns only the matched sub-value(s), each tagged with its
resolved path for a follow-up query.
cascade_get_data_structure and cascade_get_page_config are
schema-authoritative: they resolve field/group/config names from the
asset's bound content type or data definition, not by sampling the one
asset instance you point them at — so the result is the full schema-valid
set, not just whatever happens to be populated on that instance.
This is a different, easily-confused thing from the library's
Asset.get_data_structure() method (used inside generated scripts, not by
this server) — that one is instance/leaf-only. See the skill's
references/asset_api.md for that distinction, and note that this server is
read-only by design: writing structured data still goes through the
skill's script-writing path (see its callback-structured-data-edit.py
template).
Known limitation
resolve_data_definition() (src/cascade_cms_rest_mcp/resolution.py)
resolves a data-bound asset's data definition two ways: via
contentTypeId → contentType.dataDefinitionId (confirmed against a real
payload), and via a direct dataDefinitionId field on the asset itself
(present in the code as a fallback, but not yet confirmed against any real
fixture — harmless no-op if the field is absent). If you hit a data-bound
asset where resolution fails unexpectedly, this direct-field path is the
first thing to check.
Configuration
Required environment variables (same names CascadeWrapperBase already
expects — no new credential-naming surface):
| Variable | Required | Purpose |
|---|---|---|
CASCADE_API_KEY |
Yes | Cascade API key |
CASCADE_URL |
Yes | e.g. https://your-cascade-host:8443 |
SERVER |
No | Cosmetic — log-file naming, defaults to default |
CASCADE_MCP_CACHE_DIR |
No | Overrides the default ~/.cache/cascade-cms-mcp response-cache location |
The server fails fast at startup (not on first tool call) if CASCADE_API_KEY
or CASCADE_URL is missing.
Client configuration
Install from PyPI (pip install cascade-cms-rest-mcp) or run it directly
with uvx — no local checkout needed — then point your MCP client at it:
{
"mcpServers": {
"cascade-cms": {
"command": "uvx",
"args": ["cascade-cms-rest-mcp"],
"env": {
"CASCADE_API_KEY": "...",
"CASCADE_URL": "https://your-cascade-host:8443"
}
}
}
}
To run against a local checkout of this repo instead of the published
package (e.g. testing an unreleased change), use uvx --from ./mcp cascade-cms-rest-mcp or point args at ["--from", "/path/to/cascade-cms-tools/mcp", "cascade-cms-rest-mcp"].
Development
pip install -e "./mcp[dev]" # from the repo root
pytest
ruff check .
mypy mcp/src/
tests/smoke_test.py is a manual, human-run script against a real dev
Cascade site (not collected by pytest) — see its own docstring.
Release files for cascade-cms-rest-mcp 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cascade_cms_rest_mcp-0.2.3.tar.gz | 33.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cascade_cms_rest_mcp-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 58.5 kB
Release files / cascade_cms_rest_mcp-0.2.3.tar.gz
| Download URL | cascade_cms_rest_mcp-0.2.3.tar.gz |
|---|---|
| Size | 33.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ccb94cf52f4f62ec3812ab31c9770de99d9201e5a432315447315b0007721cd6
|
|
BLAKE2b-256 checksum How to use checksums |
33f06803e7cc811fcd0846fedbf4013c6d2f56c288dd316c692026fea2fc67a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency logRelease files / cascade_cms_rest_mcp-0.2.3-py3-none-any.whl
| Download URL | cascade_cms_rest_mcp-0.2.3-py3-none-any.whl |
|---|---|
| Size | 25.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
537c9fceb7b2e63e05edb5a3549d9b2b4a0cb221f9a7f0fa26307c5812dab7ac
|
|
BLAKE2b-256 checksum How to use checksums |
09c528c9f9812bfc720c08e949da646ad9b9687ee5b4ae671381c3a39643bef0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.
Transparency log