adm-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@adm-mcpwhat decisions and constraints apply to adding payment retries?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
agent-decision-memory (adm)
Persistent decision and constraint memory for coding agents: a local stdio MCP server and CLI that store ADR-style decisions as git-friendly markdown, linked to SpecGate requirement ids, tests and commits.
Quickstart
Install (Node.js ≥ 20):
npm install -g agent-decision-memory # provides `adm` and `adm-mcp`Claude Code
claude mcp add decision-memory -- npx -y -p agent-decision-memory@0.1.0 adm-mcpCursor — add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project). The same snippet works for Claude Desktop, VS Code and Windsurf:
{ "mcpServers": { "decision-memory": { "command": "npx", "args": ["-y", "-p", "agent-decision-memory@0.1.0", "adm-mcp"] } } }Restart the client and the tools appear. Full details below.
Coding agents forget what was decided between sessions. They bring back the library you removed last month, undo a trade-off nobody wrote down, and edit generated code. adm gives them a decision memory: a local stdio MCP server and a CLI that store ADR-style decisions and machine-checkable constraints as plain markdown in your repo's .decisions/ folder. Each record can be linked to SpecGate requirement ids, test files and commits.
Git-friendly storage. One markdown file per record, with JSON-valued frontmatter (valid YAML). Review it in PRs and edit it by hand.
No native dependencies. Search uses a pure-JS BM25 index, cached in
.decisions/.index.json(gitignored). The only runtime deps are@modelcontextprotocol/sdkandzod.Cross-platform. Node ≥ 20 on Windows, macOS and Linux. Paths are normalized, so
src\db\x.tsandsrc/db/x.tsmatch the same globs. No symlinks.
Related MCP server: Nauro
Install (Windows PowerShell)
cd C:\path\to\agent-decision-memory
npm ci # uses the committed package-lock.json
npm run build # syntax check + import check
npm test
npm link # optional: puts `adm` and `adm-mcp` on PATHmacOS/Linux: run the same commands.
Register with Claude Code
claude mcp add decision-memory -- node C:\path\to\agent-decision-memory\bin\adm-mcp.jsThe server uses the current directory to find the repo: the nearest ancestor that has .decisions/ or .git/. To pin a repo, pass --root C:\repo or set $env:ADM_ROOT = "C:\repo". A generic MCP client config looks like this:
{ "mcpServers": { "decision-memory": { "command": "node", "args": ["C:/path/to/agent-decision-memory/bin/adm-mcp.js", "--root", "C:/repo"] } } }Install the skill
Copy the skill folder into your project (or into $HOME\.claude\skills to use it everywhere):
New-Item -ItemType Directory -Force .claude\skills | Out-Null
Copy-Item -Recurse C:\path\to\agent-decision-memory\skills\agent-decision-memory .claude\skills\The skill tells the agent to call get_context_for_task before it starts, check_conflicts before it commits, and record_decision, supersede_decision or link_requirement after the work. See the Claude Code skills docs: https://code.claude.com/docs/en/skills.
MCP surface
Tool | Purpose |
| Record a decision (or |
| BM25 search. Returns active records only unless |
| For task text and/or file paths: in-scope active constraints, the top decisions (file-scope matches boosted) and their requirement ids |
| Write a replacement record. The old one becomes |
| Active constraints, optionally filtered to those whose scope covers a path |
| Check a proposed change (text or diff plus files) against constraint rules. |
| Attach SpecGate ids, test files and commit SHAs. Ids are checked against |
Resources: adm://constraints/active (markdown) and adm://decisions/{id} (JSON).
Constraint rules
forbid: axios (whole word, case-insensitive), forbid: /eval\(/ (regex), require: @req (the change text must contain it), and forbid-path: src/generated/** (glob on the touched files). A constraint applies only to its files scope; with no scope it covers the whole repo. A proposed constraint produces warnings. An accepted one produces errors.
CLI
adm init
adm record --title "Use date-fns" --decision "parseISO/format, ISO strings" --alternative "Moment.js: deprecated" --file "src/todos/**" --req todos/due-date
adm record --type constraint --title "No moment.js" --decision "bundle size" --rule "forbid: moment" --file "src/**"
adm context --task "validate due date" --file src/todos/create.ts
adm check --change-file .\my.diff --file src/todos/create.ts # exit code 1 on a violation (CI-friendly)
adm supersede D-0001 --title "Use Fastify" --decision "..."
adm link D-0002 --req todos/due-date#invalid-date-rejected --commit 1a2b3c4 --test test/todos.test.ts
adm search "http server" --all
adm import --dir docs/adr # Nygard (adr-tools) and MADR formats; idempotent
adm export --format json --out decisions.json # or markdown
adm serve # same as adm-mcpEvery command also takes --json and --root <dir>. Run npm run demo to see an end-to-end run: it records with the CLI and queries through a real MCP client over stdio.
Record format
---
id: "D-0002"
type: "decision"
title: "Use date-fns for dates"
status: "accepted"
date: "2026-10-15"
tags: ["dates"]
requirements: ["todos/due-date"]
files: ["src/todos/**"]
tests: []
commits: []
---
# D-0002: Use date-fns for dates
## Context
## Decision
## Alternatives
## ConsequencesStatuses: proposed, accepted, superseded, deprecated and rejected. Only proposed and accepted count as active. Supersession adds supersedes and superseded_by links.
SpecGate links
Requirement ids use the SpecGate 0.3 format: ### Requirement: Due date in openspec/specs/todos/spec.md becomes todos/due-date, and scenarios become todos/due-date#invalid-date-rejected. link_requirement reads openspec/specs/*/spec.md and openspec/changes/*/specs/*/spec.md. An unknown id is still linked, but you get a warning.
How it compares
Project | What it stores | Difference |
Knowledge graph of code structure | Indexes code, not the reasons behind it | |
Issue/task graph for agents | Tracks work items, not decisions or constraints | |
General AI memory (graph + vectors) | General-purpose, and needs a heavier stack | |
Temporal knowledge graphs | Needs a graph DB. Raw facts, no ADR structure | |
Entity/relation notes in a JSON file | Unstructured notes, no rules or conflict checks | |
User/agent memories | Personalization memory, not repo decisions | |
ADR markdown | Human-facing. No agent API, search or rule checks. |
Limitations
Conflict detection uses keyword, regex and glob rules. It does not understand meaning, so a rule like
forbid: momentwill not catch a paraphrase, and the rejected-alternative warning is a heuristic based on the alternative's name.BM25 is lexical (with light stemming). There are no embeddings, so synonyms are not matched.
IDs are allocated per machine (
max + 1). If two branches each record a decision, both can get the same number. Rename one by hand when you merge.The index is rebuilt in memory whenever any file's size or mtime changes. That is fine for hundreds of records but not tuned for tens of thousands.
License
MIT © 2026 Kurt Francisco
Contributing
Issues and pull requests are welcome at https://github.com/fpavia111-creator/agent-decision-memory. See CONTRIBUTING.md.
Available Tools
7 toolscheck_conflictsCheck conflictsA
Check a proposed change (diff, plan or description, plus touched files) against active constraint rules. ok=false means an accepted constraint is violated.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | ||
| change | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses return semantics (ok=false means a violation) despite there being no output schema, but says nothing about permissions, whether it is strictly read-only, or what it does when no rules exist.
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?
Two tight sentences with no waste; the core action is front-loaded and the result interpretation follows immediately.
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 two-parameter read-style tool with no annotations and no output schema, the description covers the action, inputs, and the key return signal. Minor gaps remain around the ok=true case and file path expectations.
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 0%, so the description must carry both parameters, and it does: 'change' is explained as a diff, plan or description, and 'files' as touched files. It lacks format details (e.g., repo-relative paths) but meaningfully covers both inputs.
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 (check) and resource (a proposed change) and names the comparison target (active constraint rules). It is clear what the tool does, though it does not explicitly distinguish itself from siblings like list_constraints or record_decision.
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?
Usage is implied: you check a proposed change before applying it. There is no explicit when/when-not guidance and no named alternative (e.g., 'list_constraints first to see the rules'), so the agent must infer the workflow context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_context_for_taskGet context for taskA
Call BEFORE starting work. Returns active constraints in scope and the most relevant decisions for a task description and/or file paths.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| task | No | ||
| limit | No | ||
| paths | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does disclose that the tool is a retrieval returning active constraints and relevant decisions, and that it should be invoked before work begins, but it says nothing about read-only semantics, scope of 'in scope', or the limit/pagination behavior governing results.
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?
Two sentences, zero filler, and the critical timing instruction is front-loaded before the return-value clause. 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?
With no annotations, no output schema, and 4 undocumented parameters, the description covers the core intent and call timing but leaves real gaps: the path/paths relationship, the limit cap, and what 'active constraints in scope' concretely means in the response.
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 0% across 4 parameters. The description implies the task and file-path inputs ('task description and/or file paths') but never clarifies the path vs paths duplication, nor mentions the limit parameter or its 1–50 range. It only partially compensates for the coverage gap.
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+resource: returns active constraints in scope plus the most relevant decisions for a given task/path. An agent can tell it retrieves curated context rather than merely listing constraints or searching decisions. It does not explicitly contrast itself with siblings like list_constraints or search_decisions, keeping it at 4 rather than 5.
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 opening imperative 'Call BEFORE starting work' gives explicit timing guidance, which is exactly the usage context an agent needs for a pre-work context fetch. It stops short of naming alternatives or exclusions (e.g., when to prefer search_decisions instead), so it is clear context without routing rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
link_requirementLink requirement/tests/commitsC
Link a decision to SpecGate requirement ids (capability/requirement[#scenario]), test files and/or commits.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| files | No | ||
| tests | No | ||
| commits | No | ||
| validate | No | ||
| requirement | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and falls short: it does not say whether links are additive or idempotent, whether a link can be removed, what the 'validate' flag changes, or what permissions are required. The mutation semantics of 'Link' are implied but never detailed.
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?
A single front-loaded sentence with no padding; the verb and target domain come first. It is efficient, though the compressed 'files and/or commits' phrasing sacrifices some clarity for brevity.
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 6-parameter mutation tool with no annotations, no output schema, and 0% parameter coverage, the single sentence is not enough. An agent cannot tell what 'validate' does, what the required 'id' identifies, or what a successful link produces.
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 0% across 6 parameters, so the description must compensate and largely doesn't. It usefully documents the requirement-id format (capability/requirement[#scenario]) and the kinds of targets (tests, files, commits), but leaves 'id' (the required key), 'validate', and 'files' unexplained.
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+resource: it links a decision to requirement ids, tests, and commits. The 'SpecGate requirement ids (capability/requirement[#scenario])' phrasing makes the target domain concrete. It does not, however, distinguish itself from siblings like record_decision or supersede_decision.
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?
There is no explicit when-to-use guidance, no prerequisites, and no named alternative among siblings (record_decision, search_decisions, etc.). Usage is only implied by 'Link a decision to...' with no statement of at what point in a workflow this should be invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_constraintsList constraintsC
List active constraints, optionally only those whose scope covers a path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| include_inactive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does not state permissions, return format, pagination, or whether listing mutates anything, and 'list active constraints' sits awkwardly against an include_inactive flag that implies inactive ones are retrievable too.
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?
A single tight sentence, front-loaded with the verb and resource. No wasted words, though the brevity comes at the cost of the missing details noted above.
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 two-parameter tool with no output schema and zero schema description coverage, the description leaves include_inactive and the return shape entirely undefined, so an agent cannot confidently invoke the filter options.
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 0%, so the description must compensate. It loosely explains the path parameter's scope-filtering meaning but says nothing about include_inactive, leaving half the parameters undocumented anywhere.
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 clear verb+resource ('List constraints') with a scope qualifier ('active'). It distinguishes the tool reasonably from decision-centric siblings like record_decision and search_decisions, though it doesn't explicitly name an alternative listing tool.
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 phrase 'optionally only those whose scope covers a path' hints at when the path filter applies, but there is no guidance on when to use this versus check_conflicts or search_decisions, and no explanation of include_inactive's role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_decisionRecord decision or constraintB
Record an ADR-style decision (or a constraint with type="constraint") into .decisions/. Call after making a non-obvious choice.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| type | No | ||
| files | No | Paths or globs this applies to | |
| rules | No | Constraint rules: "forbid: term", "forbid: /regex/", "require: term", "forbid-path: glob" | |
| tests | No | ||
| title | Yes | Short title of the decision or constraint | |
| status | No | ||
| commits | No | ||
| context | No | ||
| decision | No | What was decided / the constraint statement | |
| supersedes | No | ||
| alternatives | No | Options considered and rejected | |
| consequences | No | ||
| requirements | No | SpecGate ids: capability/requirement[#scenario] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden but only discloses the write destination (.decisions/) and ADR framing. It omits whether existing decisions are overwritten, permission/auth needs, reversibility, or side effects from constraint rules – all material for a mutation tool.
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?
Two tightly-packed sentences with the action and destination front-loaded and zero filler. Nothing needs trimming and the constraint/decision distinction is stated up front.
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 14-parameter mutation tool with no annotations and no output schema, the description is far too thin. It gives no guidance on the ADR field set, the constraint rules syntax, or how this relates to supersede_decision, so an agent cannot fully populate or route the call from the description alone.
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 43%, below the 50% threshold, so the description should compensate but instead only references the type enum and implicitly title. It adds no meaning for the other twelve parameters (context, decision, alternatives, consequences, rules, requirements, status, tags, supersedes, etc.), leaving constraint-specific fields unexplained.
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?
Names a specific verb (Record), resource (ADR-style decision / constraint), and destination (.decisions/), and distinguishes the two modes via type="constraint". It stops short of differentiating from siblings like supersede_decision or list_constraints, so an agent must infer the boundary.
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?
"Call after making a non-obvious choice" gives a clear triggering condition, which is more than nothing. However, it offers no exclusions and no routing to alternatives such as supersede_decision (for replacing an existing ADR) or link_requirement, which are likely relevant given the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_decisionsSearch decisionsA
BM25 search across decisions and constraints. Active (accepted/proposed) only unless include_inactive or status is set.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| query | Yes | ||
| status | No | ||
| include_inactive | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses the default active-only filtering and how include_inactive/status override it, which is real behavioral context. It says nothing about ranking behavior, result caps, or permissions, leaving significant gaps for a read tool.
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?
Two short sentences, no filler, and the search mechanism plus the default-scope caveat are both front-loaded before any agent needs to open the 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?
With no annotations, no output schema, and 0% schema description coverage on five parameters, the description should do more. It adequately covers default filtering and two of the five parameters but omits limit behavior, ranking/pagination, and any return-shape expectations.
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 0% across five parameters, so the description must compensate and only partly does: it explains include_inactive and status semantics and implicitly maps 'decisions and constraints' to the type enum. The limit cap and the required query parameter's expected syntax are left undocumented.
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 (BM25 search) over a specific resource (decisions and constraints), which clearly separates it from write siblings like record_decision and supersede_decision and from the plain list_constraints enumerator. It does not explicitly name an alternative, so it stops short of a 5.
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 default filter clause ('Active (accepted/proposed) only unless include_inactive or status is set') tells the agent the conditions that broaden results, which is useful implied guidance. However, there is no explicit statement of when to search versus when to use list_constraints or get_context_for_task, so usage is only partially covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
supersede_decisionSupersede decisionB
Replace an existing decision/constraint with a new one. The old record is marked superseded and both are cross-linked.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| tags | No | ||
| files | No | Paths or globs this applies to | |
| rules | No | Constraint rules: "forbid: term", "forbid: /regex/", "require: term", "forbid-path: glob" | |
| tests | No | ||
| title | Yes | Short title of the decision or constraint | |
| status | No | ||
| commits | No | ||
| context | No | ||
| decision | No | What was decided / the constraint statement | |
| alternatives | No | Options considered and rejected | |
| consequences | No | ||
| requirements | No | SpecGate ids: capability/requirement[#scenario] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose real behavior: the old record is marked superseded and the two records are cross-linked, which is genuinely useful. It omits whether the operation is reversible, what permissions are needed, and what happens to the old record's tags/files/rules.
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?
Two short sentences, front-loaded with the action and immediately followed by the state change. Every clause carries information and there is no filler.
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 13-parameter mutation with no output schema and no annotations, the description explains the core write semantics but leaves parameter usage, permission requirements, and post-call state largely uncovered. It is minimally adequate rather than complete.
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 only 46% across 13 parameters, so the description is expected to compensate, and it does not mention a single parameter. The agent learns nothing from the description about how 'id' targets the old record versus how the many decision-body fields (rules, requirements, tests, alternatives) are supplied for the new one.
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 ('Replace') plus resource ('an existing decision/constraint') and the outcome ('new one'), so the agent understands this is a supersession writer rather than a plain create. It implicitly separates itself from record_decision, but never names it, so differentiation relies on inference.
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 phrase 'existing decision/constraint' implies you should call this only when an older decision needs replacing, which is enough to distinguish it loosely from record_decision. There is no explicit when-to-use, when-not-to-use, or prerequisite statement, and no mention of first needing an id from search_decisions.
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.
7 tool updates
v0.1.0- First observed
check_conflicts - First observed
get_context_for_task - First observed
link_requirement - First observed
list_constraints - First observed
record_decision - First observed
search_decisions - First observed
supersede_decision
TDQS
Scored across 7 tools
Most tools have clearly distinct purposes: record vs. supersede, search vs. conflict checking, and linking requirements. Minor overlap exists because list_constraints covers a subset of what search_decisions can return, and get_context_for_task also surfaces constraints, so an agent may occasionally hesitate between lookup and context tools.
All seven tools use consistent snake_case and are verb-first (record_decision, search_decisions, get_context_for_task, list_constraints, supersede_decision, check_conflicts, link_requirement). The pattern is predictable and none of the names are misleading.
Seven tools is well within the ideal 3–15 range for a decision and constraint management server. Each tool maps to a distinct operation, and none feels padded or redundant.
The surface covers the core ADR/constraint lifecycle: record, search, context retrieval, supersede, conflict checking, and requirement linking. Minor gaps exist, such as no direct get-by-id or delete/unlink operation, but supersede and search largely compensate for these.
Maintenance
Related MCP Connectors
Your coding agent asks the business logic of your repository and checks commits before they land
Give your AI agent persistent, governed memory for every project. At task start it recalls the approved decisions, conventions, risks and architecture (semantic search, ranked by importance); at close it proposes what was learned as typed memories that you review and approve — governance, not a notes dump. Agents propose, humans govern: edits go back to pending and deletion is human-only by design. Connect Claude Code, Cursor, Claude Desktop or any MCP client in two minutes with just your API key — hosted (nothing to install) or locally via `uvx solucortex-mcp`. Built by SoluAI and dogfooded daily: SoluCortex is developed using its own living memory.
Pre-execution governance for AI agents. Deterministic PASS/FAIL/REVIEW verdicts, replayable proof.
Git-backed platform for skills, tools, and context for AI agents
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables preserving, querying, and managing engineering decisions with reasoning and evidence through CLI, HTTP API, and MCP tools.16-
- AlicenseNot gradedqualityAmaintenanceThe decision system for agentic engineering: keeps your project's decisions, rationale, and rejected paths in plain files and surfaces them to AI coding agents before they plan or change code.11Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to store and retrieve design decisions as Markdown in git repositories, and check new proposals against historical decisions via MCP.MIT
- AlicenseNot gradedqualityBmaintenanceProvides AI coding agents with git-native persistent memory and a dependency-aware task graph, letting them record and fuzzy-recall architectural decisions, lessons, and gotchas while creating, claiming, and completing tasks that auto-unblock downstream work. Stores everything as plain JSON and Markdown committed inside the repository, so context stays branch-aware, team-shared, and reviewable in pull requests.6 npmMIT