- Purpose
- Submit one candidate architectural decision. Identical source, version, and content submissions are idempotent.
- Inputs
candidatewith required non-emptytitleandstatement; optional rationale, scope hints, architecture context, related decision IDs, and source provenance. A usable proposal requires provenance: producer name/type and source reference, with optional external ID, source version, repository locator, and origin classification.- Result
created,reused, and a proposal record containingproposal_id,proposal_status, candidate content, provenance, fingerprints, proposed time, and any accepted decision link.- Errors
- Malformed or missing provenance, empty required text, unknown fields, or forbidden authority fields return a tool error.
- Boundary
- Creates or reuses only a
proposedrecord. It cannot accept it, create a canonical decision, add rules, or change enforcement.
Decision context over MCP, with authority kept outside the protocol.
Use mneme decision-mcp to let an MCP host query Mneme's Decision Index or submit candidate architectural decisions. The server is local and stdio-only in 0.9.0.
Install and run
The MCP SDK is an optional dependency. Install the released package with the extra, then start the server from the repository whose decision state you want to expose.
pipx install "mneme-hq[mcp]==0.9.2"
mneme decision-mcp
The process communicates over standard input and standard output. Version 0.9.0 does not expose HTTP, SSE, a hosted endpoint, authentication, RBAC, or multi-tenant infrastructure.
| Option | Behavior in 0.9.0 |
|---|---|
| --proposals <path> | Use a specific decision-proposals JSON file. When omitted, the durable default is .mneme/decision_proposals.json. Passing an empty string explicitly selects an in-memory proposal store. |
| --adr-dir <path> | Compile that ADR directory into the server's canonical read index. There is no default. The directory must pass parse, corpus validation, and precedence resolution before startup. |
mneme decision-mcp \
--proposals .mneme/decision_proposals.json \
--adr-dir docs/adr
Strict startup: an --adr-dir folder that doesn’t exist, an empty-string --adr-dir, a malformed ADR, an invalid corpus, or unresolved precedence prevents the configured canonical server from starting. An existing but empty folder starts the server with no canonical decisions. Mneme does not silently serve an ambiguous canonical view.
Configure an MCP host
Version 0.9.0 ships the server command, not a client-specific installer or generated config. For an MCP host that supports launching a local stdio process, use this process definition in the host's own MCP configuration format:
{
"mcpServers": {
"mneme": {
"command": "mneme",
"args": [
"decision-mcp",
"--proposals", ".mneme/decision_proposals.json"
]
}
}
}
Add "--adr-dir", "docs/adr" only when that directory is a schema-valid Mneme ADR corpus. MCP host configuration formats differ; this is the process contract, not a claim of validated support for a named client.
Storage and canonical input
The proposal store is always composed. By default it is the local file .mneme/decision_proposals.json; writes are handled by Mneme's JSON proposal store. It is separate from .mneme/project_memory.json, which the MCP server never uses as proposal storage.
Canonical reads are optional. Supplying --adr-dir builds an in-memory canonical index through Mneme's existing ADR compiler. Omitting it starts a proposal-store-only server: proposal tools work, while no ADR-backed canonical decision corpus is loaded.
The frozen six-tool surface
The tool inventory is part of the authority boundary. Version 0.9.0 introduced exactly these six names and no aliases. The current released 0.9.2 runtime publishes parameter descriptions and JSON Schema through MCP tools/list.
Machine-readable contract: decision-tools.json is generated from the exact released mneme-hq[mcp]==0.9.2 runtime. It includes each tool's description, input and output schema, MCP annotations, and request examples that CI validates by actually calling the released tools. It is drift-checked against tools/list, not maintained as a second hand-authored API specification.
- Purpose
- Submit multiple independent candidates from one producer output while preserving input order.
- Inputs
- Non-empty
candidateslist and optionalshared_provenance. Candidate-level provenance takes precedence where supplied; every candidate must resolve to provenance. - Result
resultscontains one ordered propose result per candidate, each with its own proposal identity and created/reused outcome.- Errors
- Empty batches, unresolved provenance, malformed candidates, or forbidden fields fail the call.
- Boundary
- No batch acceptance exists. Every returned proposal remains independently reviewable and non-authoritative.
- Purpose
- Retrieve one proposal or loaded canonical decision by stable ID.
- Inputs
- Non-empty
record_id. - Result
- An explicit
record_typeofproposal,canonical_decision, ornot_found. Proposal and canonical lifecycle vocabularies remain separate. - Errors
- Malformed input is a tool error. An unknown ID is successful typed data, not an error.
- Boundary
- Never mutates proposal, canonical, rule, evidence, or enforcement state.
- Purpose
- Run deterministic text and exact-metadata search across proposals and the loaded canonical index.
- Inputs
- Optional text query; proposal status; canonical lifecycle status; producer name; source reference; and origin classification.
- Result
- Separate
proposalsandcanonical_decisionslists. Search ranking has no enforcement meaning. - Errors
- Invalid lifecycle or origin vocabularies and malformed fields return a tool error.
- Boundary
- Retrieval only. Search cannot decide applicability for a typed rule or grant authority.
- Purpose
- Find proposal scope hints and canonical context scopes that overlap supplied context or paths.
- Inputs
- Optional
contextandpathsstring lists. - Result
proposal_hint_matchesplus slimcanonical_scope_matchescontaining identity, statement, lifecycle, and context scope.- Errors
- Malformed argument types return a tool error.
- Boundary
- Scope hints are retrieval context, not rule applicability. Paths are not glob-evaluated, and the result contains no rules or enforcement state.
- Purpose
- Return the lineage actually known for a proposal or loaded canonical decision.
- Inputs
- Non-empty
record_id. - Result
- Explicit
result_type:proposal_trace,canonical_trace, ortrace_not_found. Missing links are named rather than invented. - Errors
- Malformed input is a tool error. Canonical rule-lineage integrity failure aborts the call with JSON-RPC internal error
-32603; no partial trace is returned. - Boundary
- Trace reports proposal, canonical, rule, and declared-evidence links where they exist. It cannot create or repair any link.
Errors and fail-closed behavior
- Unknown IDs are returned as typed
not_foundortrace_not_foundresults. - Invalid inputs return MCP tool errors so the caller can correct the request.
- Authority-shaped input such as producer-supplied status, proposal IDs, timestamps, canonical lifecycle, typed rules, trusted evidence, or enforcement state is rejected, not ignored.
- Canonical integrity failures abort the protocol call. Invalid canonical sources prevent server startup.
- Tool results do not serialize stack traces.
MCP is not the authority surface
MCP may submit a candidate and read the state Mneme exposes. It cannot accept, reject, activate, supersede, create an exception, install a typed rule, submit trusted evidence, or bypass review. Those operations are deliberately absent from the registered tool list.
Human authority stays in the CLI. Review proposals with mneme decision proposals and mneme decision show, then use mneme decision accept or mneme decision reject. See the decision proposal workflow.
Acceptance materializes a canonical decision into project memory. It still does not install deterministic protection or run the Architecture Audit. Retrieval, authority, Audit, and enforcement remain distinct.
Downstream governance consumers
A downstream system does not need to adopt Mneme's data model, storage, or workflow to use the Decision Index. A consumer that can launch the local mneme decision-mcp process calls decision.applicable_to for a proposed change, receives the governing decisions with provenance, and folds that into whatever review, risk-scoring, or triage logic it already runs. In 0.9.0 this requires local stdio access; there is no hosted endpoint a remote service could call.
Change proposed (PR, agent patch, generated diff)
|
v
Consumer calls decision.applicable_to(...)
|
v
Mneme returns applicable decisions + provenance
|
v
Consumer performs its own review, risk scoring,
prioritization, or workflow routing
This is the boundary the MCP server is built for: a stable protocol surface for exchanging decision context, not a shared implementation. See the integration overview for how this boundary is intended to compose with review and change-management tooling.
Known limitations in 0.9.0
Canonical-read unification: a decision accepted into .mneme/project_memory.json is available to existing runtime and Audit surfaces, but it is not automatically loaded into the MCP server's ADR-backed canonical-read index. Calling decision.get with that accepted decision ID may therefore return not_found.
Running-process freshness: a running MCP process loads its proposal state at construction. If a separate CLI process accepts or rejects a proposal, restart the MCP process before expecting MCP reads to reflect that transition.
These are bounded 0.9.0 behavior. The server does not watch files, refresh live state, or add a hidden project-memory canonical input.
For the wider protocol boundary, see Mneme's standards landscape. MCP provides interoperability; it does not define Mneme's governance semantics.
Why the protocol exists and how it fits with enforcement.
WorkflowReview and resolve proposalsThe public human authority commands in 0.9.0.
ReferenceFull CLI referenceAll Mneme commands, flags, and exit-code contracts.
Release proofmneme-hq 0.9.0Release notes for the published MCP and decision workflow.