Mneme Decision MCP
OfficialMneme Decision MCP lets MCP clients propose non-authoritative architectural decisions and query the decision index, without granting authority to change enforcement state.
Propose one candidate architectural decision as a non-authoritative proposal.
Propose multiple candidate decisions in batch, each independently reviewable.
Get a proposal or canonical decision by stable ID.
Search proposals and canonical decisions with text/metadata filters, returned separately.
Find proposals/canonical decisions whose scope hints or context overlap given paths/context (retrieval applicability only).
Trace deterministic lineage for a proposal or canonical decision (provenance, acceptance, rule, declared-evidence).
All read tools are read-only; no accept, reject, activate, supersede, exception, bypass, or trusted-evidence authority is exposed.
Runs Mneme as a deterministic CI gate in GitHub Actions, failing builds when proposed changes violate governed architectural decisions.
Runs Mneme as a deterministic CI gate in GitLab CI, blocking incompatible changes before merge.
Integrates with Google Antigravity to apply architectural governance within Antigravity coding workflows.
Mneme HQ
Mneme is an open decision and control layer for agentic software development.
It turns durable engineering decisions into agent context, deterministic enforcement, and inspectable enforcement results across AI coding agents, repositories, and CI workflows. Architecture is the first supported decision domain: Mneme prevents architectural drift by turning architectural decisions and ADRs into deterministic guardrails across coding agents, repository mutations, generated rules, and CI gates.
Where is your architecture actually enforced? Run the Architecture Audit to see which decisions are protected, which can become deterministic guardrails, and which still depend on someone remembering the rules. Try it →
Mneme is the decision layer behind that drift-prevention mechanism. It keeps recorded engineering decisions active as AI coding systems propose and modify code, instead of leaving ADRs as passive documentation.

Solid surfaces ship today; dashed surfaces are planned. Support levels per integration: integrations matrix.
Current phase: Layer 1 validation. Retrieval, enforcement, and benchmark semantics are governed by the accepted architecture and freeze record. See Current Phase before changing core behavior.
What Mneme does
Mneme separates architectural guidance from deterministic enforcement:
Records architectural decisions in a structured, auditable decision corpus.
Retrieves relevant decisions when an agent or model needs architectural guidance.
Enforces governed rules deterministically under explicit applicability semantics.
Integrates at the earliest reliable boundary exposed by each coding workflow.
Audits bypassable mutation paths where pre-change blocking is not technically available.
Runs in CI as a final deterministic gate before incompatible changes are accepted.
The same input and governed decision state produce the same enforcement result. Mneme does not depend on an LLM judge for its core allow/warn/fail decisions.
Mneme is not a general-purpose vector store, conversational memory system, autonomous coding agent, or deployment observability platform.
Related MCP server: mcp-memoria
Install
Requires Python 3.11+.
pip install mneme-hqVerify the CLI:
mneme --helpFor repository development:
git clone https://github.com/MnemeHQ/mneme.git
cd mneme
pip install -e ".[dev]"Decision MCP
Mneme exposes the Decision Index over a local MCP server so MCP-capable clients can propose candidate architectural decisions and query decision state without gaining authority to change that state.
Install the optional MCP dependency:
pip install "mneme-hq[mcp]"Start the local stdio server. Canonical reads come from the persisted Decision Index in .mneme/project_memory.json by default; the proposal store remains separate.
mneme decision-mcpUse --memory to select another project memory file. The file must contain a valid authoritative decision_index section; MCP fails closed rather than reconstructing authority from the compatibility decisions[] snapshot.
mneme decision-mcp --memory path/to/project_memory.json--adr-dir is now optional validation input only. Mneme still validates and precedence-resolves that corpus before startup, but ADRs do not become a second MCP authority source.
mneme decision-mcp --memory path/to/project_memory.json --adr-dir path/to/adrsThe MCP surface is intentionally frozen to six tools:
decision.proposedecision.propose_batchdecision.getdecision.searchdecision.applicable_todecision.trace
Proposal tools create non-authoritative proposals only. Read tools query proposal and canonical decision state. MCP deliberately exposes no accept, reject, activate, supersede, exception, bypass, or trusted-evidence authority.
Human authority remains explicit through mneme decision proposals | show | accept | reject. Accepting a proposal materializes a canonical decision; it does not activate protection or run the Architecture Audit.
See ADR-027 and the v0.9.0 release notes for the authority boundary and release contract.
Architecture Audit
See where your architecture is actually protected — and where it still depends on people remembering the rules.
Mneme audits your repository and shows which architectural decisions are:
Protected — already enforced mechanically
Mneme-ready — can be turned into a deterministic guardrail
Requires modelling — important, but not yet safe to automate
Guidance — useful context, but not something that should be enforced
Run an audit:
mneme audit --memory .mneme/project_memory.json --repo-root .For a Mneme-ready decision, validate the proposed protection before enabling it:
mneme protect validate <decision-id> --memory .mneme/project_memory.jsonThen explicitly activate it:
mneme protect activate <decision-id> --memory .mneme/project_memory.jsonMneme only reports a decision as Protected after it can verify that real enforcement is in place. The full activation contract is documented in Protection Activation.
60-second enforcement example
Initialize a project-local decision corpus:
mneme initRecord one architectural decision:
mneme add_decision \
--memory .mneme/project_memory.json \
--id config-format \
--decision "Use JSON for configuration files" \
--scope config \
--constraint "Use JSON only" \
--anti-pattern "Do not use YAML"Create a proposed input that violates it:
python -c "import pathlib; pathlib.Path('prompt.txt').write_text('Set up a new YAML config file', encoding='utf-8')"Run the deterministic check:
mneme check \
--memory .mneme/project_memory.json \
--input prompt.txt \
--query configurationIn strict mode, the prohibited YAML proposal returns a FAIL verdict and exit code 2. A compliant JSON proposal returns PASS and exit code 0.
The CLI is the common enforcement surface. Agent integrations translate their native events into the same Mneme decision and enforcement model.
Setup mode (no enforcement)
mneme setup initializes Mneme in a repository without changing how the team works: it creates or detects project memory, detects supported agent environments, and reports protection readiness — all without enabling any blocking enforcement. Setup never turns warn/observe behavior into blocking behavior; activation of preventive enforcement is always a separate, explicit decision.
mneme setupOptionally record an opaque Architecture Audit reference so the setup can be attributed back to a saved Audit baseline:
mneme setup --audit-ref <reference>Setup is idempotent: rerunning it against an existing Mneme project leaves valid configuration untouched.
How it works
Architectural decisions / ADRs
|
v
structured decision corpus
|
+-----+--------------------+
| |
v v
relevant guidance deterministic enforcement
retrieval + applicability checks
| |
+------------+-------------+
|
v
workflow-specific boundary
|
+------------+-------------+
| | |
pre-change post-change CI
hooks audit gateMneme applies governance at the earliest reliable boundary a workflow exposes:
Before generation when architectural context can be injected into the model call.
Before supported file mutations when an agent exposes a blocking pre-tool hook.
After bypassable mutations through bounded working-tree audits where shell/script writes cannot be inspected safely before execution.
Before merge through CLI-based CI gates.
These boundaries are complementary. An integration only claims the surfaces that have been implemented and validated for that harness.
Retrieval is not enforcement
Decision retrieval answers: which architectural decisions are useful as guidance for this task?
Enforcement answers: does the proposed change violate a governed rule that applies here?
Those concerns are intentionally separated. See ADR-017, ADR-019, and ADR-020.
Supported surfaces
The authoritative support matrix lives in docs/integrations/README.md. The labels below are evidence levels, not interchangeable marketing terms.
Support level | Surface |
Native integration | Claude Code |
Native integration | Claude Agent SDK |
Native integration | Google Antigravity |
Native integration | Codex CLI |
Native integration | Kiro CLI 3.0 / v3 |
Validated compatibility | Paperclip — CLI and ACP transports, no adapter required |
Rules export | Cursor |
CLI-based CI gate | GitHub Actions, GitLab CI |
Experimental | OpenCode |
Planned | Deep Agents middleware POC |
Each integration documents its actual blocking boundary, bypass paths, degraded behavior, and validation evidence. Start with the integration matrix, not assumptions based on another harness.
ADRs and project memory
Mneme can compile architecture decisions into structured governance records rather than treating ADRs as passive prose.
The repository governance source of truth is .mneme/project_memory.json. The ADR import path preserves explicit source provenance where available so typed rules can be inspected and enforced consistently.
See:
Architecture guarantees
Three principles govern the current mechanism:
Deterministic > clever. Enforcement behavior must be reproducible.
Auditable > autonomous. A verdict should be traceable to the decision, rule, applicability state, and evidence that produced it.
Prevention before review. When a reliable pre-change boundary exists, use it; when it does not, surface the limitation and audit later rather than pretending the path is blocked.
The current Layer 1 scope, frozen surfaces, accepted amendments, experimental work, and deferred Layer 2 work are maintained in docs/architecture/current-phase.md.
Do not infer architecture from this README when a linked ADR or architecture document is more specific.
Benchmark and validation
Mneme's benchmark is a regression and integrity instrument for retrieval and enforcement behavior. It is not a general model-quality benchmark.
The benchmark keeps retrieval and enforcement scoring distinct so changes cannot silently improve one surface while regressing another.
See:
Demos
More examples: mnemehq.com/demo
Contributing
Before changing retrieval, enforcement, applicability, conflict handling, or benchmark semantics, read the architecture and ADRs that govern that surface.
Core behavioral changes may require the repository's charter-amendment procedure. Documentation, tooling, integrations, and examples do not automatically authorize changes to frozen behavior.
License
MIT. See LICENSE.
Available Tools
6 toolsdecision.applicable_toGet retrieval/context applicabilityARead-onlyIdempotent
Return proposals and canonical decisions whose scope hints or context scope overlap the supplied context/paths. This is retrieval/context applicability only: proposal scope hints are NOT typed-rule applicability (ADR-020) and paths are never glob-evaluated. Read only: this tool never mutates any state and returns no rules or enforcement data. When both inputs are omitted or empty, both match lists are empty.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | No | Optional path strings treated as opaque retrieval context; no glob or typed-rule selector evaluation is performed. | |
| context | No | Optional opaque context strings. A scope hint matches when it is a case-insensitive substring of any supplied context or path. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds meaningful behavioral detail beyond that: the tool 'never mutates any state and returns no rules or enforcement data,' and it specifies the empty-input behavior ('When both inputs are omitted or empty, both match lists are empty'). It also clarifies that paths are not glob-evaluatedable, which is valuable non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the core purpose, key exclusions, safety behavior, and empty-input edge case with no redundancy. The main function is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, two-optional-parameter tool with a rich output schema and complete parameter descriptions, the description fully covers what an agent needs: purpose, safety, exclusions, and boundary behavior. The presence of an output schema means return-value details do not need to be repeated in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already well-described in the schema (paths as opaque retrieval context, context as opaque strings with case-insensitive substring matching). The description adds the empty-input result behavior and reinforces the non-glob semantics, but it does not substantially add parameter-level meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return proposals and canonical decisions whose scope hints or context scope overlap the supplied context/paths.' It clearly differentiates this from typed-rule applicability by explicitly noting it is 'retrieval/context applicability only' and not ADR-020. This distinguishes it from the sibling tools without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context and exclusions: it is for retrieval/context applicability, not typed-rule applicability, and paths are never glob-evaluated. It also clarifies that no rules or enforcement data are returned. However, it does not explicitly name sibling alternatives for when to use them instead, so it lacks the full when-to-use vs alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decision.getGet a proposal or canonical decisionARead-onlyIdempotent
Read one record by stable id. Returns record_type 'proposal', 'canonical_decision', or 'not_found'. Read only: this tool never mutates any state. Use decision.search when you do not already have a stable id.
| Name | Required | Description | Default |
|---|---|---|---|
| record_id | Yes | Stable proposal id or canonical decision id to retrieve exactly. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description reinforces this with 'Read only: this tool never mutates any state,' and adds behavioral context by specifying possible return record_type values, including 'not_found'. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse, front-loaded sentences cover the core action, return values, read-only behavior, and the key alternative. Every sentence earns its place and no filler exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter tool with an output schema and comprehensive annotations, the description covers everything an agent needs: what it does, what it returns, that it is safe, and when to use a sibling instead. There are no meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter record_id is fully described as 'Stable proposal id or canonical decision id to retrieve exactly.' The description adds little beyond saying 'stable id,' so it does not meaningfully improve on the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Read one record by stable id.' It also explicitly lists possible record_type values, which clarifies exactly what the tool returns. This clearly distinguishes it from siblings like decision.search and decision.propose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage condition: use this tool when you already have a stable id, and use decision.search when you do not. This directly routes the agent to the correct sibling tool, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decision.proposePropose a decision (non-authoritative)AIdempotent
Submit one candidate architectural decision. The proposal enters the Mneme decision index as a non-authoritative proposal with status 'proposed'. This grants NO authority: the proposal is never enforceable and can only become canonical through separate Mneme human authority (D2C), which this MCP does not expose. Repeated identical source/version/content submissions are idempotent. Use decision.propose_batch when submitting multiple candidates.
| Name | Required | Description | Default |
|---|---|---|---|
| candidate | Yes | One candidate with a non-empty title and statement plus source provenance; authoritative fields are rejected. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include idempotentHint=true and destructiveHint=false, but the description adds substantial non-obvious behavior: the proposal is non-authoritative, has status 'proposed', is never enforceable, and exists only in the index until separate Mneme human authority (D2C) acts. It also reiterates idempotency in a concrete way tied to source/version/content, going beyond the bare annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then delivers key caveats in order. It is slightly repetitive ('non-authoritative proposal' vs. 'grants NO authority... never enforceable'), but every sentence earns its place and flows logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with complete schema coverage, an output schema, and annotations covering idempotency and non-destructiveness, the description fills the main gaps: authority semantics, status effect, and the batch alternative. Nothing an agent needs to select and invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the nested schema already documents provenance, idempotent identity via source_version, and field constraints. The tool description adds no parameter-specific detail beyond restating that a single candidate is submitted; the idempotency note is already reflected in the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Submit') and resource ('one candidate architectural decision') and immediately distinguishes itself from the sibling by noting the proposal enters the index as a non-authoritative proposal. It names the batch alternative later, making it easy to tell apart from propose_batch even before reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly directs the agent to 'Use decision.propose_batch when submitting multiple candidates,' which is a clear when-to-use vs. alternative condition. It also explains what this tool does NOT do (never enforceable, cannot become canonical via this MCP), preventing off-label use for authoritative decisions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decision.propose_batchPropose decisions in batch (non-authoritative)AIdempotent
Submit multiple candidate architectural decisions from one producer output. Each candidate receives its own independent proposal identity and enters as a non-authoritative proposal with status 'proposed'. There are no batch acceptance semantics: batch submission grants NO authority, and every proposal remains independently reviewable. Use decision.propose for a single candidate.
| Name | Required | Description | Default |
|---|---|---|---|
| candidates | Yes | Candidate decisions to submit independently; output results preserve this input order. | |
| shared_provenance | No | Optional fallback provenance applied to every candidate. Candidate provenance takes precedence, and each candidate must have effective provenance from one or both inputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint, readOnlyHint, destructiveHint, and openWorldHint, but the description adds meaningful behavioral context beyond those: each candidate gets its own proposal identity, enters with status 'proposed', remains independently reviewable, and batch submission grants no authority. This directly addresses the most likely misconception about batch semantics. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler; the core action is front-loaded and the critical caveat about non-authoritative batch semantics is stated clearly. Every sentence adds necessary decision-making information, and the alternative tool is mentioned compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with a complete input schema and an output schema, gives an agent everything needed to invoke the tool correctly. It explains the key behavioral contract, distinguishes from the sibling tool, and the schema covers parameters and output ordering. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents candidates and shared_provenance, including provenance precedence. The tool description does not add parameter-level meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Submit multiple candidate architectural decisions from one producer output.' It also clarifies the key semantic, that each candidate becomes an independent non-authoritative 'proposed' proposal, and distinguishes itself from decision.propose by explicitly directing single-candidate use there. This is a clear, unambiguous purpose that separates it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative decision.propose for a single candidate, giving a clear when/when-not boundary. It also explains the intended context ('from one producer output') and warns that batch submission has no acceptance authority, so an agent knows when this tool is appropriate and when to use the single-proposal sibling instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decision.searchSearch proposals and canonical decisionsARead-onlyIdempotent
Deterministic text/exact-metadata search. Proposals (lifecycle proposed/accepted/rejected) and canonical decisions (lifecycle active/superseded/deprecated/inactive) are returned in separate lists and never merged. Read only: this tool never mutates any state. Search rank has no enforcement meaning. Use decision.get when you already have a stable id. Within each record domain, all applicable filters combine with AND semantics; proposal-only filters do not exclude canonical results, and vice versa.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Case-insensitive substring matched against supported proposal and canonical text fields. Empty matches all records. | |
| producer_name | No | Optional exact producer-name filter on proposal provenance; does not filter canonical decisions. | |
| proposal_status | No | Optional exact proposal lifecycle filter; applies only to the proposals result list. | |
| source_reference | No | Optional exact source-reference filter on proposal provenance; does not filter canonical decisions. | |
| origin_classification | No | Optional exact origin-classification filter on proposal provenance; does not filter canonical decisions. | |
| canonical_lifecycle_status | No | Optional exact canonical lifecycle filter; applies only to the canonical_decisions result list. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint, and the description adds non-redundant behavioral detail: deterministic results, no merging of result domains, no enforcement meaning for search rank, and AND semantics for combined filters. No statement contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core search behavior, and every sentence adds actionable information. There is no filler or repetition of the title/schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-domain search tool with six optional filters, the description covers identity, scope, result separation, read-only safety, filter semantics, rank behavior, and routing to the stable-id alternative. The presence of an output schema covers return-structure details that would otherwise be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds important parameter behavior beyond the schema: 'all applicable filters combine with AND semantics' and 'proposal-only filters do not exclude canonical results, and vice versa.' This materially changes how an agent should interpret the optional filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation (deterministic text/exact-metadata search) over two clearly defined record domains, proposals and canonical decisions, and explicitly notes they are returned in separate lists and never merged. This disambiguates the tool from siblings like decision.get and decision.propose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit routing rule: 'Use decision.get when you already have a stable id.' The read-only statement and filter-scoping semantics also imply when this tool is appropriate and clarify what it does not do.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
decision.traceTrace decision lineageARead-onlyIdempotent
Return the deterministic lineage actually known for a proposal id or canonical decision id. The result_type is explicit (proposal_trace / canonical_trace / trace_not_found); unresolved ids stay type-unknown. Read only: this tool never mutates any state. Canonical rule-lineage integrity failures fail closed as protocol errors and are never returned as partial traces. Use decision.get for the record alone; use decision.trace when you need provenance, acceptance, rule, or declared-evidence lineage.
| Name | Required | Description | Default |
|---|---|---|---|
| record_id | Yes | Stable proposal id or canonical decision id whose known lineage should be returned; unknown ids produce trace_not_found. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, which lowers the burden. The description adds valuable non-obvious behavior: unresolved ids 'stay type-unknown' and canonical rule-lineage failures 'fail closed as protocol errors and are never returned as partial traces.' This is behavior an agent could not predict from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core purpose, the second covers behavioral guarantees and result types, and the third gives usage routing. Every sentence earns its place with no filler or redundant fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, rich annotations, and a single well-documented parameter, the description provides all necessary operational context: when to call, what ids are valid, what failure behavior looks like, and safety guarantees. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The schema already documents that record_id is a stable proposal id or canonical decision id and that unknown ids produce trace_not_found. The description reinforces this but does not add meaningfully new parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Return the deterministic lineage actually known for a proposal id or canonical decision id.' It explicitly distinguishes the tool from decision.get by naming it, and clarifies the scope of what is returned (lineage, not the record alone). The result_type detail further removes ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives direct, explicit routing guidance: 'Use decision.get for the record alone; use decision.trace when you need provenance, acceptance, rule, or declared-evidence lineage.' This tells an agent exactly when to choose this tool over a sibling, with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.9.2- Changed
decision.applicable_to2 fields changed- added
Input schema / properties / context / descriptionAdded value: +"Optional opaque context strings. A scope hint matches when it is a case-insensitive substring of any supplied context or path." - added
Input schema / properties / paths / descriptionAdded value: +"Optional path strings treated as opaque retrieval context; no glob or typed-rule selector evaluation is performed."
- Changed
decision.get1 field changed- added
Input schema / properties / record_id / descriptionAdded value: +"Stable proposal id or canonical decision id to retrieve exactly."
- Changed
decision.propose15 fields changed- added
Input schema / $defs / CandidateInput / properties / architecture_context / descriptionAdded value: +"Optional string key/value context captured with the proposal." - added
Input schema / $defs / CandidateInput / properties / provenance / descriptionAdded value: +"Source provenance for this candidate. Required by decision.propose; in decision.propose_batch it may be omitted when shared_provenance is supplied." - added
Input schema / $defs / CandidateInput / properties / rationale / descriptionAdded value: +"Optional explanation of why the decision is being proposed." - added
Input schema / $defs / CandidateInput / properties / related_decision_ids / descriptionAdded value: +"Optional stable ids of related proposals or canonical decisions." - added
Input schema / $defs / CandidateInput / properties / scope_hints / descriptionAdded value: +"Optional opaque retrieval hints for contexts or paths; these are not typed-rule applicability selectors." - added
Input schema / $defs / CandidateInput / properties / statement / descriptionAdded value: +"Non-empty statement of the architectural decision being proposed." - added
Input schema / $defs / CandidateInput / properties / title / descriptionAdded value: +"Non-empty concise title for the candidate decision." - added
Input schema / $defs / SourceProvenanceInput / properties / external_source_id / descriptionAdded value: +"Optional stable identifier assigned by the source system." - added
Input schema / $defs / SourceProvenanceInput / properties / origin_classification / descriptionAdded value: +"Declared origin of the proposed content." - added
Input schema / $defs / SourceProvenanceInput / properties / producer_name / descriptionAdded value: +"Name of the agent, integration, or system proposing the decision." - added
Input schema / $defs / SourceProvenanceInput / properties / producer_type / descriptionAdded value: +"Type of producer, such as agent, integration, or import." - added
Input schema / $defs / SourceProvenanceInput / properties / repository_locator / descriptionAdded value: +"Optional repository path or locator associated with the source." - added
Input schema / $defs / SourceProvenanceInput / properties / source_reference / descriptionAdded value: +"Human-readable reference to the source output or artifact." - added
Input schema / $defs / SourceProvenanceInput / properties / source_version / descriptionAdded value: +"Optional source revision or version used for idempotent identity." - added
Input schema / properties / candidate / descriptionAdded value: +"One candidate with a non-empty title and statement plus source provenance; authoritative fields are rejected."
- Changed
decision.propose_batch16 fields changed- added
Input schema / $defs / CandidateInput / properties / architecture_context / descriptionAdded value: +"Optional string key/value context captured with the proposal." - added
Input schema / $defs / CandidateInput / properties / provenance / descriptionAdded value: +"Source provenance for this candidate. Required by decision.propose; in decision.propose_batch it may be omitted when shared_provenance is supplied." - added
Input schema / $defs / CandidateInput / properties / rationale / descriptionAdded value: +"Optional explanation of why the decision is being proposed." - added
Input schema / $defs / CandidateInput / properties / related_decision_ids / descriptionAdded value: +"Optional stable ids of related proposals or canonical decisions." - added
Input schema / $defs / CandidateInput / properties / scope_hints / descriptionAdded value: +"Optional opaque retrieval hints for contexts or paths; these are not typed-rule applicability selectors." - added
Input schema / $defs / CandidateInput / properties / statement / descriptionAdded value: +"Non-empty statement of the architectural decision being proposed." - added
Input schema / $defs / CandidateInput / properties / title / descriptionAdded value: +"Non-empty concise title for the candidate decision." - added
Input schema / $defs / SourceProvenanceInput / properties / external_source_id / descriptionAdded value: +"Optional stable identifier assigned by the source system." - added
Input schema / $defs / SourceProvenanceInput / properties / origin_classification / descriptionAdded value: +"Declared origin of the proposed content." - added
Input schema / $defs / SourceProvenanceInput / properties / producer_name / descriptionAdded value: +"Name of the agent, integration, or system proposing the decision." - added
Input schema / $defs / SourceProvenanceInput / properties / producer_type / descriptionAdded value: +"Type of producer, such as agent, integration, or import." - added
Input schema / $defs / SourceProvenanceInput / properties / repository_locator / descriptionAdded value: +"Optional repository path or locator associated with the source." - added
Input schema / $defs / SourceProvenanceInput / properties / source_reference / descriptionAdded value: +"Human-readable reference to the source output or artifact." - added
Input schema / $defs / SourceProvenanceInput / properties / source_version / descriptionAdded value: +"Optional source revision or version used for idempotent identity." - added
Input schema / properties / candidates / descriptionAdded value: +"Candidate decisions to submit independently; output results preserve this input order." - added
Input schema / properties / shared_provenance / descriptionAdded value: +"Optional fallback provenance applied to every candidate. Candidate provenance takes precedence, and each candidate must have effective provenance from one or both inputs."
- Changed
decision.search6 fields changed- added
Input schema / properties / canonical_lifecycle_status / descriptionAdded value: +"Optional exact canonical lifecycle filter; applies only to the canonical_decisions result list." - added
Input schema / properties / origin_classification / descriptionAdded value: +"Optional exact origin-classification filter on proposal provenance; does not filter canonical decisions." - added
Input schema / properties / producer_name / descriptionAdded value: +"Optional exact producer-name filter on proposal provenance; does not filter canonical decisions." - added
Input schema / properties / proposal_status / descriptionAdded value: +"Optional exact proposal lifecycle filter; applies only to the proposals result list." - added
Input schema / properties / query / descriptionAdded value: +"Case-insensitive substring matched against supported proposal and canonical text fields. Empty matches all records." - added
Input schema / properties / source_reference / descriptionAdded value: +"Optional exact source-reference filter on proposal provenance; does not filter canonical decisions."
- Changed
decision.trace1 field changed- added
Input schema / properties / record_id / descriptionAdded value: +"Stable proposal id or canonical decision id whose known lineage should be returned; unknown ids produce trace_not_found."
6 tool updates
v0.9.1- First observed
decision.applicable_to - First observed
decision.get - First observed
decision.propose - First observed
decision.propose_batch - First observed
decision.search - First observed
decision.trace
TDQS
Scored across 6 tools
Each tool targets a distinct action-resource pair: propose/propose_batch differ only in cardinality and cross-reference each other, while get/search/applicable_to/trace are clearly separated by input type (stable id vs text vs context/path vs provenance). No two tools would be confused for the same operation.
All tools share the decision.* namespace and use short, imperative verbs (propose, get, search, trace). The two compound names (propose_batch, applicable_to) use the same underscore convention, so the naming feels systematic and predictable.
Six tools is a tight, purposeful surface for a decision index: two write paths (single/batch), three read/retrieval paths (by id, text search, context overlap), and one provenance trace. Each tool has a distinct role and none feels redundant.
The core write-once proposal plus retrieval workflow is well covered, including batch submission and lineage tracing. However, there is no way to update, withdraw, or transition a proposal's status within the MCP; this is explicitly delegated to external human authority, but agents still cannot correct or retire a mistaken proposal.
Maintenance
Related MCP Connectors
Append-only decisions with provenance, supersession, retrieval, and audited MCP actions.
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
OAuth-protected, read-only-by-default MCP server for provenance-labeled QuillCaddie project memory.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables preserving, querying, and managing engineering decisions with reasoning and evidence through CLI, HTTP API, and MCP tools.16-
- FlicenseNot gradedqualityCmaintenanceShared project memory MCP server for storing and retrieving technical decisions, lessons learned, ADRs, and cross-links between projects.-
- FlicenseNot gradedqualityBmaintenanceEnables trustworthy AI memory operations including authoritative memory creation, hybrid recall with provenance, evidence tracking, and safe dry-run-first forget and rebuild operations through a stateless MCP endpoint.2-
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to read and update a repository's decision ledger, check which files a decision governs, find stale files after a decision reversal, and record or reverse decisions over MCP.511 npmApache 2.0