cma-mcp
The Model Context Protocol layer for cma, an executable compound practice loop: capture failures, surface them at the moment of action, track decisions and rejections, and check whether warnings actually prevented repeats.
cma-mcp wraps the canonical cma command-line tool and exposes its
seven primitives to MCP-compatible AI clients. It does not reimplement
the loop; it shells out to the cma binary, so it never diverges from
the reference implementation.
Status
pip install cma-mcp installs the latest release from PyPI. The
release history is in CHANGELOG.md.
What this is
Most MCP servers expose new capability. cma-mcp exposes an existing capability (bash cma's seven primitives) to a wider set of environments: Claude Desktop, Cursor, Cline, Continue.dev, and any other MCP-compatible client. The contribution is reach. Drift is the named enemy: cma-mcp invokes the canonical bash cma binary as a subprocess for every captured action, so cma-mcp picks up cma's evolution automatically and never diverges from the 1.0 reference implementation.
Quickstart
cma-mcp shells out to the cma command-line tool, so that binary must
be installed and on your PATH first. Confirm it:
cma --help
Then install cma-mcp:
pip install cma-mcp
The cma-mcp console script lands on PATH after install. Confirm:
cma-mcp --version
Point your MCP client at the installed entry point. For Claude
Desktop, add to claude_desktop_config.json:
{
"mcpServers": {
"cma": {
"command": "cma-mcp"
}
}
}
Restart the client. Then in any conversation: "Record a miss: I claimed verified without testing the cross-tenant write path", or "What active rejections do I have?", or "What does cma stats show for prevention/miss ratio over the last 30 days?"
For Cursor, Cline, Continue.dev, and other MCP-compatible clients,
the same pattern applies (point the client at the cma-mcp
command; the stdio handshake runs).
What it exposes
Seven tools mirroring bash cma's seven primitives:
| Tool | Wraps | When the agent invokes it |
|---|---|---|
cma_miss |
cma miss |
A failure happened that may recur |
cma_decision |
cma decision |
A non-trivial architectural choice was made |
cma_reject |
cma reject |
An option was eliminated and should not be silently rebuilt |
cma_prevented |
cma prevented |
A surfaced warning actually changed behavior |
cma_distill |
cma distill (modes: default / retire / review) |
Promote, retire, or preview a distilled learning |
cma_surface |
cma surface |
Pull relevant prior captures before acting (logs surface event for leak detection) |
cma_stats |
cma stats (views: default / leaks / recurrence / preventions / rejections / behavior) |
Inspect loop-closing evidence |
Four resources for read-only context:
| URI | Reads |
|---|---|
cma://decisions |
Active decisions in the last 180 days |
cma://rejections |
Active rejections in the last 30 days |
cma://core |
Active core learnings (retired filtered) |
cma://stats |
Default stats summary |
Protocol
cma-mcp speaks the current Model Context Protocol and negotiates the
revision with each client: it echoes the revision the client requests
when it supports it (2025-11-25, 2025-06-18, 2025-03-26,
2024-11-05) and otherwise offers its newest. Transport is stdio.
Three-section payload
Every tool response and resource read returns a JSON payload with three top-level sections:
{
"analysis": { ... data and stdout },
"agent_guidance": { what to tell the user, how to cite },
"provenance": { server_version, protocol_version, license, cost_usd: 0.0, ... }
}
Tool calls also return this payload as structuredContent (validated
against each tool's outputSchema) for MCP clients on protocol
2025-06-18 or newer, alongside the text form older clients read.
The agent_guidance and provenance sections exist because an
agent passing cma-mcp output to a user without attribution would
strip the reproducibility that makes the loop's evidence worth
citing. Surfacing "how to cite faithfully" inside the payload is
the structure that carries that integrity forward. Adversarial tests
in tests/test_payload_determinism.py pin the structure.
Approach
Subprocess over reimplementation. cma-mcp invokes bash cma as a subprocess for every captured action. cma-mcp does not reimplement cma's seven primitives in Python; that is a deliberate subprocess-over-reimplementation decision.
Methodology-agnostic substrate. cma stores --fm (failure
mode) as an opaque string. cma-mcp does not bundle any
methodology's failure-mode catalog. You tag captures with your
methodology's own vocabulary by passing the tag through; for
autoclassification, set CMA_FM_CLASSIFIER per cma's plugin
convention.
No external runtime dependencies. cma-mcp implements MCP directly in-repo using JSON-RPC 2.0 over stdio. No third-party MCP SDK; no pip-installed runtime requirements beyond the Python standard library. (Test-time deps: pytest.)
Platform support
Linux and macOS native. On Windows, run cma-mcp under WSL because cma-mcp shells out to the bash cma binary. Routing every tool call through the same canonical binary on every platform is how cma-mcp avoids drift; a parallel Python implementation would require keeping two surface definitions in sync forever. If you run an MCP-compatible AI client on Windows, you likely already have WSL available.
Install fingerprint
cma-mcp --version
Emits a one-line JSON fingerprint with server_version,
protocol_version, git_sha (with +dirty flag if the working
tree has uncommitted changes), cma_binary_version (probed from
cma --version), python version, and script path. Lets you
confirm the cma-mcp install configured in your MCP
client is the expected one.
Offline sanity check
cma-mcp --test
Prints the full three-section payload for a cma_stats (default
view) call against your ~/.cma/ data. Useful to verify
pipeline wiring and that the cma binary is reachable.
Documentation
In the repository:
CHANGELOG.md: cma-mcp release historydocs/MCP_SERVER.md: protocol referencedocs/ARCHITECTURE.md: module layout, data flow, contractsdocs/FAQ.md: conceptual questions, install gotchas, cross-client configdocs/TROUBLESHOOTING.md: symptoms and fixes
The installed wheel carries LICENSE and NOTICE in its dist-info
metadata (Apache-2.0 attribution); the docs above live in the source
repository.
Running tests
From this directory:
pip install -e .[test]
python3 -m pytest -q
The suite covers MCP protocol conformance, three-section payload
determinism, JSONL parsing tolerance, and subprocess-wrapper
isolation (argv-array discipline, timeout discipline). Tests that
require the bash cma binary skip when it is not on PATH.
Issues
Bug reports, feature requests, and security reports: hello@clarethium.com.
Release files for cma-mcp 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cma_mcp-0.1.5.tar.gz | 46.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cma_mcp-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 85.5 kB
Release files / cma_mcp-0.1.5.tar.gz
| Download URL | cma_mcp-0.1.5.tar.gz |
|---|---|
| Size | 46.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c0df6fcbc14c44785fcd45a58b885df61543a0bbee6cffbe59f30628d2b53f41
|
|
BLAKE2b-256 checksum How to use checksums |
afb56977bca812efe789324c14a9f537880d09a8c3846e295aedfc59904dace6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / cma_mcp-0.1.5-py3-none-any.whl
| Download URL | cma_mcp-0.1.5-py3-none-any.whl |
|---|---|
| Size | 39.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d80bd97f8aaf0aff6d07ec9ba0b05a82c02a65c5b889e864c0e0423c3150961
|
|
BLAKE2b-256 checksum How to use checksums |
5a1b6dbf88d91662bddb5205e85fabfbb16cd80b2ff46df352daf282504c872b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency log