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.
Six 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_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_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.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cascade_cms_rest_mcp-0.2.2.tar.gz.
File metadata
- Download URL: cascade_cms_rest_mcp-0.2.2.tar.gz
- Upload date:
- Size: 27.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aff9a87473286cd0cc459987c4a4041f734f7f1f97d29f1f904fe71a9e447fca
|
|
| MD5 |
7ecf4de78cbeaae1101df4381e40de62
|
|
| BLAKE2b-256 |
d33e98d5ff62eb188d587715e2c614eb955cff38e955df328ea683ae8dfb17cc
|
Provenance
The following attestation bundles were made for cascade_cms_rest_mcp-0.2.2.tar.gz:
Publisher:
release.yml on Sharkdroid/cascade-cms-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cascade_cms_rest_mcp-0.2.2.tar.gz -
Subject digest:
aff9a87473286cd0cc459987c4a4041f734f7f1f97d29f1f904fe71a9e447fca - Sigstore transparency entry: 2716507683
- Sigstore integration time:
-
Permalink:
Sharkdroid/cascade-cms-tools@34558ffb2086a3f24c8aca53839c8ea14e10eae0 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/Sharkdroid
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@34558ffb2086a3f24c8aca53839c8ea14e10eae0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cascade_cms_rest_mcp-0.2.2-py3-none-any.whl.
File metadata
- Download URL: cascade_cms_rest_mcp-0.2.2-py3-none-any.whl
- Upload date:
- Size: 20.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3528f5e37a635ab0750dc158cedfaebe27863543ebd2f91e115c882a51afe540
|
|
| MD5 |
2cb0152f1ed1a527d803902428b64c5c
|
|
| BLAKE2b-256 |
d953b00a45eda9d0d5703fbda67134c000d1b08cfe5c0d1e5785ed1fd49680f6
|
Provenance
The following attestation bundles were made for cascade_cms_rest_mcp-0.2.2-py3-none-any.whl:
Publisher:
release.yml on Sharkdroid/cascade-cms-tools
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cascade_cms_rest_mcp-0.2.2-py3-none-any.whl -
Subject digest:
3528f5e37a635ab0750dc158cedfaebe27863543ebd2f91e115c882a51afe540 - Sigstore transparency entry: 2716507716
- Sigstore integration time:
-
Permalink:
Sharkdroid/cascade-cms-tools@34558ffb2086a3f24c8aca53839c8ea14e10eae0 -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/Sharkdroid
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@34558ffb2086a3f24c8aca53839c8ea14e10eae0 -
Trigger Event:
push
-
Statement type: