{
  "schema": "mneme.mcp-tool-catalog/v1",
  "generatedFrom": {
    "distribution": "mneme-hq",
    "version": "0.10.0",
    "serverName": "mneme-decision-index",
    "serverVersion": "0.1.0",
    "transport": "stdio",
    "protocolSource": "MCP tools/list"
  },
  "authorityBoundary": {
    "proposalToolsAreNonAuthoritative": true,
    "acceptRejectActivateSupersedeViaMcp": false,
    "enforcementViaMcp": false,
    "humanAuthoritySurface": "Mneme CLI"
  },
  "tools": [
    {
      "name": "decision.propose",
      "title": "Propose a decision (non-authoritative)",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "$defs": {
          "CandidateInput": {
            "additionalProperties": false,
            "description": "One candidate decision.\n\nThe field set is exactly the producer-controlled subset of\n``DecisionProposalCandidate``. ``extra='forbid'`` means an\nauthority field (``status``, ``proposal_id``, ``accepted_decision_id``,\n``proposed_at``, ``rules``, ``trusted_evidence``, ...) is a hard\nvalidation error, never silently discarded.",
            "properties": {
              "title": {
                "description": "Non-empty concise title for the candidate decision.",
                "minLength": 1,
                "title": "Title",
                "type": "string"
              },
              "statement": {
                "description": "Non-empty statement of the architectural decision being proposed.",
                "minLength": 1,
                "title": "Statement",
                "type": "string"
              },
              "rationale": {
                "default": "",
                "description": "Optional explanation of why the decision is being proposed.",
                "title": "Rationale",
                "type": "string"
              },
              "provenance": {
                "anyOf": [
                  {
                    "$ref": "#/$defs/SourceProvenanceInput"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Source provenance for this candidate. Required by decision.propose; in decision.propose_batch it may be omitted when shared_provenance is supplied."
              },
              "scope_hints": {
                "description": "Optional opaque retrieval hints for contexts or paths; these are not typed-rule applicability selectors.",
                "items": {
                  "type": "string"
                },
                "title": "Scope Hints",
                "type": "array"
              },
              "architecture_context": {
                "additionalProperties": {
                  "type": "string"
                },
                "description": "Optional string key/value context captured with the proposal.",
                "title": "Architecture Context",
                "type": "object"
              },
              "related_decision_ids": {
                "description": "Optional stable ids of related proposals or canonical decisions.",
                "items": {
                  "type": "string"
                },
                "title": "Related Decision Ids",
                "type": "array"
              }
            },
            "required": [
              "title",
              "statement"
            ],
            "title": "CandidateInput",
            "type": "object"
          },
          "SourceProvenanceInput": {
            "additionalProperties": false,
            "description": "Producer/source provenance exactly as the service model defines it.",
            "properties": {
              "producer_name": {
                "description": "Name of the agent, integration, or system proposing the decision.",
                "minLength": 1,
                "title": "Producer Name",
                "type": "string"
              },
              "producer_type": {
                "description": "Type of producer, such as agent, integration, or import.",
                "minLength": 1,
                "title": "Producer Type",
                "type": "string"
              },
              "source_reference": {
                "description": "Human-readable reference to the source output or artifact.",
                "minLength": 1,
                "title": "Source Reference",
                "type": "string"
              },
              "external_source_id": {
                "default": "",
                "description": "Optional stable identifier assigned by the source system.",
                "title": "External Source Id",
                "type": "string"
              },
              "source_version": {
                "default": "",
                "description": "Optional source revision or version used for idempotent identity.",
                "title": "Source Version",
                "type": "string"
              },
              "repository_locator": {
                "default": "",
                "description": "Optional repository path or locator associated with the source.",
                "title": "Repository Locator",
                "type": "string"
              },
              "origin_classification": {
                "default": "imported_unknown",
                "description": "Declared origin of the proposed content.",
                "enum": [
                  "ai_generated",
                  "human_authored",
                  "imported_unknown"
                ],
                "title": "Origin Classification",
                "type": "string"
              }
            },
            "required": [
              "producer_name",
              "producer_type",
              "source_reference"
            ],
            "title": "SourceProvenanceInput",
            "type": "object"
          }
        },
        "properties": {
          "candidate": {
            "$ref": "#/$defs/CandidateInput",
            "description": "One candidate with a non-empty title and statement plus source provenance; authoritative fields are rejected."
          }
        },
        "required": [
          "candidate"
        ],
        "title": "decision_proposeArguments"
      },
      "outputSchema": {
        "additionalProperties": true,
        "title": "decision_proposeDictOutput",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "exampleArguments": {
        "candidate": {
          "title": "Keep service storage behind the repository boundary",
          "statement": "Application services must access persistence through the repository layer.",
          "rationale": "Preserve the approved storage boundary across agent-generated changes.",
          "provenance": {
            "producer_name": "example-agent",
            "producer_type": "agent",
            "source_reference": "example-session-001",
            "source_version": "1",
            "repository_locator": "src/service.py",
            "origin_classification": "ai_generated"
          },
          "scope_hints": [
            "service",
            "storage"
          ],
          "architecture_context": {
            "component": "service"
          },
          "related_decision_ids": []
        }
      }
    },
    {
      "name": "decision.propose_batch",
      "title": "Propose decisions in batch (non-authoritative)",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "$defs": {
          "CandidateInput": {
            "additionalProperties": false,
            "description": "One candidate decision.\n\nThe field set is exactly the producer-controlled subset of\n``DecisionProposalCandidate``. ``extra='forbid'`` means an\nauthority field (``status``, ``proposal_id``, ``accepted_decision_id``,\n``proposed_at``, ``rules``, ``trusted_evidence``, ...) is a hard\nvalidation error, never silently discarded.",
            "properties": {
              "title": {
                "description": "Non-empty concise title for the candidate decision.",
                "minLength": 1,
                "title": "Title",
                "type": "string"
              },
              "statement": {
                "description": "Non-empty statement of the architectural decision being proposed.",
                "minLength": 1,
                "title": "Statement",
                "type": "string"
              },
              "rationale": {
                "default": "",
                "description": "Optional explanation of why the decision is being proposed.",
                "title": "Rationale",
                "type": "string"
              },
              "provenance": {
                "anyOf": [
                  {
                    "$ref": "#/$defs/SourceProvenanceInput"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "Source provenance for this candidate. Required by decision.propose; in decision.propose_batch it may be omitted when shared_provenance is supplied."
              },
              "scope_hints": {
                "description": "Optional opaque retrieval hints for contexts or paths; these are not typed-rule applicability selectors.",
                "items": {
                  "type": "string"
                },
                "title": "Scope Hints",
                "type": "array"
              },
              "architecture_context": {
                "additionalProperties": {
                  "type": "string"
                },
                "description": "Optional string key/value context captured with the proposal.",
                "title": "Architecture Context",
                "type": "object"
              },
              "related_decision_ids": {
                "description": "Optional stable ids of related proposals or canonical decisions.",
                "items": {
                  "type": "string"
                },
                "title": "Related Decision Ids",
                "type": "array"
              }
            },
            "required": [
              "title",
              "statement"
            ],
            "title": "CandidateInput",
            "type": "object"
          },
          "SourceProvenanceInput": {
            "additionalProperties": false,
            "description": "Producer/source provenance exactly as the service model defines it.",
            "properties": {
              "producer_name": {
                "description": "Name of the agent, integration, or system proposing the decision.",
                "minLength": 1,
                "title": "Producer Name",
                "type": "string"
              },
              "producer_type": {
                "description": "Type of producer, such as agent, integration, or import.",
                "minLength": 1,
                "title": "Producer Type",
                "type": "string"
              },
              "source_reference": {
                "description": "Human-readable reference to the source output or artifact.",
                "minLength": 1,
                "title": "Source Reference",
                "type": "string"
              },
              "external_source_id": {
                "default": "",
                "description": "Optional stable identifier assigned by the source system.",
                "title": "External Source Id",
                "type": "string"
              },
              "source_version": {
                "default": "",
                "description": "Optional source revision or version used for idempotent identity.",
                "title": "Source Version",
                "type": "string"
              },
              "repository_locator": {
                "default": "",
                "description": "Optional repository path or locator associated with the source.",
                "title": "Repository Locator",
                "type": "string"
              },
              "origin_classification": {
                "default": "imported_unknown",
                "description": "Declared origin of the proposed content.",
                "enum": [
                  "ai_generated",
                  "human_authored",
                  "imported_unknown"
                ],
                "title": "Origin Classification",
                "type": "string"
              }
            },
            "required": [
              "producer_name",
              "producer_type",
              "source_reference"
            ],
            "title": "SourceProvenanceInput",
            "type": "object"
          }
        },
        "properties": {
          "candidates": {
            "description": "Candidate decisions to submit independently; output results preserve this input order.",
            "items": {
              "$ref": "#/$defs/CandidateInput"
            },
            "title": "Candidates",
            "type": "array"
          },
          "shared_provenance": {
            "anyOf": [
              {
                "$ref": "#/$defs/SourceProvenanceInput"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional fallback provenance applied to every candidate. Candidate provenance takes precedence, and each candidate must have effective provenance from one or both inputs."
          }
        },
        "required": [
          "candidates"
        ],
        "title": "decision_propose_batchArguments"
      },
      "outputSchema": {
        "additionalProperties": true,
        "title": "decision_propose_batchDictOutput",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "exampleArguments": {
        "candidates": [
          {
            "title": "Keep API handlers thin",
            "statement": "API handlers delegate domain work to application services.",
            "rationale": "Preserve separation between transport and domain behavior.",
            "scope_hints": [
              "api"
            ],
            "architecture_context": {
              "component": "api"
            },
            "related_decision_ids": []
          },
          {
            "title": "Keep persistence behind repositories",
            "statement": "Domain services do not call database clients directly.",
            "rationale": "Preserve the repository boundary.",
            "scope_hints": [
              "storage"
            ],
            "architecture_context": {
              "component": "domain"
            },
            "related_decision_ids": []
          }
        ],
        "shared_provenance": {
          "producer_name": "example-agent",
          "producer_type": "agent",
          "source_reference": "example-session-002",
          "source_version": "1",
          "repository_locator": "src/",
          "origin_classification": "ai_generated"
        }
      }
    },
    {
      "name": "decision.get",
      "title": "Get a proposal or canonical decision",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "record_id": {
            "description": "Stable proposal id or canonical decision id to retrieve exactly.",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id"
        ],
        "title": "decision_getArguments"
      },
      "outputSchema": {
        "additionalProperties": true,
        "title": "decision_getDictOutput",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "exampleArguments": {
        "record_id": "ADR-001"
      }
    },
    {
      "name": "decision.search",
      "title": "Search proposals and canonical decisions",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "default": "",
            "description": "Case-insensitive substring matched against supported proposal and canonical text fields. Empty matches all records.",
            "title": "Query",
            "type": "string"
          },
          "proposal_status": {
            "anyOf": [
              {
                "enum": [
                  "proposed",
                  "accepted",
                  "rejected"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional exact proposal lifecycle filter; applies only to the proposals result list.",
            "title": "Proposal Status"
          },
          "canonical_lifecycle_status": {
            "anyOf": [
              {
                "enum": [
                  "active",
                  "superseded",
                  "deprecated",
                  "inactive"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional exact canonical lifecycle filter; applies only to the canonical_decisions result list.",
            "title": "Canonical Lifecycle Status"
          },
          "producer_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional exact producer-name filter on proposal provenance; does not filter canonical decisions.",
            "title": "Producer Name"
          },
          "source_reference": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional exact source-reference filter on proposal provenance; does not filter canonical decisions.",
            "title": "Source Reference"
          },
          "origin_classification": {
            "anyOf": [
              {
                "enum": [
                  "ai_generated",
                  "human_authored",
                  "imported_unknown"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional exact origin-classification filter on proposal provenance; does not filter canonical decisions.",
            "title": "Origin Classification"
          }
        },
        "title": "decision_searchArguments"
      },
      "outputSchema": {
        "additionalProperties": true,
        "title": "decision_searchDictOutput",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "exampleArguments": {
        "query": "storage",
        "canonical_lifecycle_status": "active"
      }
    },
    {
      "name": "decision.applicable_to",
      "title": "Get retrieval/context applicability",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "context": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional opaque context strings. A scope hint matches when it is a case-insensitive substring of any supplied context or path.",
            "title": "Context"
          },
          "paths": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional path strings treated as opaque retrieval context; no glob or typed-rule selector evaluation is performed.",
            "title": "Paths"
          }
        },
        "title": "decision_applicable_toArguments"
      },
      "outputSchema": {
        "additionalProperties": true,
        "title": "decision_applicable_toDictOutput",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "exampleArguments": {
        "context": [
          "storage",
          "service"
        ],
        "paths": [
          "src/service.py"
        ]
      }
    },
    {
      "name": "decision.trace",
      "title": "Trace decision lineage",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "record_id": {
            "description": "Stable proposal id or canonical decision id whose known lineage should be returned; unknown ids produce trace_not_found.",
            "title": "Record Id",
            "type": "string"
          }
        },
        "required": [
          "record_id"
        ],
        "title": "decision_traceArguments"
      },
      "outputSchema": {
        "additionalProperties": true,
        "title": "decision_traceDictOutput",
        "type": "object"
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "exampleArguments": {
        "record_id": "ADR-001"
      }
    }
  ]
}
