- 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.
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.10.0"
mneme decision-mcp
Before you start: the server reads decisions from project memory and will not start unless that file has an authoritative decision_index section. Projects created with mneme init or mneme setup on 0.10.0 already have one. For memory written by 0.9.x, preview the migration, review what it reports, then apply it:
mneme decision-index migrate --memory .mneme/project_memory.json
mneme decision-index migrate --memory .mneme/project_memory.json --apply
Upgrade every process that writes this file to 0.10.0 before you apply, including CI jobs, hooks, and teammates’ installs. Migrated memory must not be written by 0.9.2 or earlier; see version compatibility and the migrate reference.
The process communicates over standard input and standard output. It does not expose HTTP, SSE, a hosted endpoint, authentication, RBAC, or multi-tenant infrastructure.
| Option | Behavior in 0.10.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. |
| --memory <path> | The project memory file whose decision_index section the server reads. Defaults to .mneme/project_memory.json. Every canonical read comes from this file. |
| --adr-dir <path> | Optional. Validate that ADR directory before startup: it must pass parse, corpus validation, and precedence resolution. There is no default. ADRs stay validation and import sources; the server never reads decisions from them. |
mneme decision-mcp \
--proposals .mneme/decision_proposals.json \
--memory .mneme/project_memory.json \
--adr-dir docs/adr
Strict startup: the server exits with code 2 if the memory file doesn’t exist; if it has no decision_index section, in which case it prints the two mneme decision-index migrate commands to run; or if the section is invalid, for example after a 0.9.2 write (ERROR: the canonical Decision Index in … is invalid). With --adr-dir, a folder that doesn’t exist, an empty-string value, a malformed ADR, an invalid corpus, or unresolved precedence also stops startup. An existing but empty folder passes validation. Mneme does not silently serve an ambiguous canonical view.
Configure an MCP host
Mneme 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",
"--memory", ".mneme/project_memory.json"
]
}
}
}
Add "--adr-dir", "docs/adr" only when you want startup to validate that directory as 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
Canonical decisions come from the Decision Index: the decision_index section of the project memory file passed with --memory. The server validates it once at startup, then reloads it for every canonical read, so a decision accepted with mneme decision accept is visible without restarting the server. Canonical records carry the identity of the decision version they come from: version_id, decision_version_id, and content_digest.
The proposal store is separate. By default it is the local file .mneme/decision_proposals.json, written by Mneme’s JSON proposal store and re-read before each read, so a proposal that a separate CLI process accepts or rejects shows its new status without a restart. An empty-string --proposals selects an in-memory store that only this process can see. The server never stores proposals in project memory.
--adr-dir never changes what the server reads. To bring ADR changes into the Decision Index, run mneme adr import.
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, and 0.10.0 keeps them with unchanged input schemas. The current released 0.10.0 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.10.0 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 one canonical decision from the Decision Index, by stable ID.
- Inputs
- Non-empty
record_id. - Result
- An explicit
record_typeofproposal,canonical_decision, ornot_found. Proposal and canonical lifecycle vocabularies remain separate. A canonical decision is returned whatever its lifecycle, including superseded and deprecated ones, with itslifecycle_status. - 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 Decision 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 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. A missing or unmigrated Decision Index, or an invalid
--adr-dircorpus, prevents 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 writes a new canonical decision version into the Decision Index in 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. 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.
Version compatibility
Mixed versions: once memory is migrated, every process that writes it must run 0.10.0 or later. A 0.9.2 or earlier writer, such as add_decision in an old CI image, succeeds without an error. The next 0.10.0 mneme check or test_query on that file then fails with DecisionIndexPersistenceError, because the decisions[] compatibility snapshot no longer matches the Decision Index. The MCP server then refuses to start, and decision-index migrate won’t repair the file: restore it from version control and redo the change with 0.10.0.
Memory that can’t migrate: migration is lossless or it refuses, and it writes nothing when it refuses. A decision whose source is a free-text note, or points at something other than an ADR file (such as an EventCatalog import), has no representation in the index. Memory that contains one stays unmigrated, and the MCP server can’t start on it. To keep the decision, write it as an ADR file, remove its row from decisions[], migrate, then import the ADR; adr import --apply itself needs migrated memory.
The server does not watch files. It re-reads the Decision Index and the proposal file when a tool reads them.
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.
How-toGive agents the decisions for a taskQuery applicable decisions from the CLI or the local MCP server.
WorkflowReview and resolve proposalsThe human authority commands.
ReferenceFull CLI referenceAll Mneme commands, flags, and exit-code contracts.
Release proofmneme-hq 0.10.0Release notes for the persisted Decision Index and migration.