Skip to main content
Glama

agent-decision-memory (adm)

CI npm License: MIT MCP Registry

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-mcp

Cursor — 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/sdk and zod.

  • Cross-platform. Node ≥ 20 on Windows, macOS and Linux. Paths are normalized, so src\db\x.ts and src/db/x.ts match 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 PATH

macOS/Linux: run the same commands.

Register with Claude Code

claude mcp add decision-memory -- node C:\path\to\agent-decision-memory\bin\adm-mcp.js

The 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_decision

Record a decision (or type: "constraint") with context, decision, alternatives, consequences, status, files, tests, commits, requirements, rules and supersedes

search_decisions

BM25 search. Returns active records only unless include_inactive or status is set

get_context_for_task

For task text and/or file paths: in-scope active constraints, the top decisions (file-scope matches boosted) and their requirement ids

supersede_decision

Write a replacement record. The old one becomes superseded and the two are cross-linked

list_constraints

Active constraints, optionally filtered to those whose scope covers a path

check_conflicts

Check a proposed change (text or diff plus files) against constraint rules. ok:false means an accepted constraint is violated. It also warns when the change picks an alternative that an active decision rejected

link_requirement

Attach SpecGate ids, test files and commit SHAs. Ids are checked against openspec/specs when present

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-mcp

Every 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
## Consequences

Statuses: proposed, accepted, superseded, deprecated and rejected. Only proposed and accepted count as active. Supersession adds supersedes and superseded_by 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

codebase-memory-mcp

Knowledge graph of code structure

Indexes code, not the reasons behind it

Beads

Issue/task graph for agents

Tracks work items, not decisions or constraints

Cognee

General AI memory (graph + vectors)

General-purpose, and needs a heavier stack

Graphiti

Temporal knowledge graphs

Needs a graph DB. Raw facts, no ADR structure

MCP memory server

Entity/relation notes in a JSON file

Unstructured notes, no rules or conflict checks

Mem0

User/agent memories

Personalization memory, not repo decisions

adr-tools, MADR

ADR markdown

Human-facing. No agent API, search or rule checks. adm import reads both formats

Limitations

  • Conflict detection uses keyword, regex and glob rules. It does not understand meaning, so a rule like forbid: moment will 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 tools
check_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesNo
changeYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
taskNo
limitNo
pathsNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

list_constraintsList constraintsC

List active constraints, optionally only those whose scope covers a path.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
include_inactiveNo

TDQS

C2.7/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNo
typeNo
filesNoPaths or globs this applies to
rulesNoConstraint rules: "forbid: term", "forbid: /regex/", "require: term", "forbid-path: glob"
testsNo
titleYesShort title of the decision or constraint
statusNo
commitsNo
contextNo
decisionNoWhat was decided / the constraint statement
supersedesNo
alternativesNoOptions considered and rejected
consequencesNo
requirementsNoSpecGate ids: capability/requirement[#scenario]

TDQS

B3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNo
limitNo
queryYes
statusNo
include_inactiveNo

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
tagsNo
filesNoPaths or globs this applies to
rulesNoConstraint rules: "forbid: term", "forbid: /regex/", "require: term", "forbid-path: glob"
testsNo
titleYesShort title of the decision or constraint
statusNo
commitsNo
contextNo
decisionNoWhat was decided / the constraint statement
alternativesNoOptions considered and rejected
consequencesNo
requirementsNoSpecGate ids: capability/requirement[#scenario]

TDQS

B3.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 7 tool updatesv0.1.0
    • First observedcheck_conflicts
    • First observedget_context_for_task
    • First observedlink_requirement
    • First observedlist_constraints
    • First observedrecord_decision
    • First observedsearch_decisions
    • First observedsupersede_decision

TDQS

B3.4/5.0

Scored across 7 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    The 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.
    11
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides 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 npm
    MIT