adrkit decision memory
概要
作者による説明(英語の原文)
Deterministic, offline, read-only ADR decision memory for coding agents. No model or network calls.
PopNx MCPの3つの柱
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
- 利用者の声iレビューはまだありませんレビューは今後のステップで、アカウント機能と一緒に始まります
- 私たちの基本チェックi2項目中2項目に合格公開情報からチェック。コードはまだスキャンしていません
- 利用状況i成長中↓ 1019/週 · ★ 24
できること
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
- 接続方法: パソコンで動く
- トランスポート: stdio
- カテゴリ: 開発者ツール
インストール
使っているAIアプリを選んで、設定をコピーしてください。
インストールの前に
- 基本チェック:2項目中2項目に合格
- あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
- 自分で入力するもの:
ADRKIT_MCP_CWD,ADRKIT_MCP_DIR
必要なもの
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"adrkit": {
"command": "npx",
"args": [
"-y",
"@adrkit/mcp"
],
"env": {
"ADRKIT_MCP_CWD": "your-value",
"ADRKIT_MCP_DIR": "your-value"
}
}
}
}ターミナルでこれを実行します
claude mcp add adrkit --env ADRKIT_MCP_CWD=your-value --env ADRKIT_MCP_DIR=your-value -- npx -y @adrkit/mcp動かす前に、空欄の値を入力してください。
または、設定を自分でコピーする
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"adrkit": {
"command": "npx",
"args": [
"-y",
"@adrkit/mcp"
],
"env": {
"ADRKIT_MCP_CWD": "your-value",
"ADRKIT_MCP_DIR": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
または、設定を自分でコピーする
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"adrkit": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@adrkit/mcp"
],
"env": {
"ADRKIT_MCP_CWD": "your-value",
"ADRKIT_MCP_DIR": "your-value"
}
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
自分で入力する値
ADRKIT_MCP_CWDenvRepository root; must contain a readable .git entry. Defaults to the process working directory.ADRKIT_MCP_DIRenvADR directory, resolved against the root and required to stay contained within it. Defaults to docs/adr.
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
使えるアプリ
このサーバーのつなぎ方と、各アプリの公式ドキュメントに基づきます。2026年11月10日に確認。
パソコン上で動かせるアプリ
ClaudeGooseLM StudioMsty StudioCherry StudioCursorVS Code + GitHub CopilotVisual StudioWindsurf (Devin Desktop)ZedKiroClineContinueJetBrains AI AssistantClaude CodeCodex CLIGemini CLIOpenCodenodecodeWarpLibreChatRaycast
できること
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
基本チェックi
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月10日にチェック
- ✓ 合格
作者とリポジトリが一致
レジストリ名はドメイン adrkit.dev で確認済みです(レジストリがドメインの所有を確認しています)
- ✓ 合格
今もメンテナンスされている
コードの最終更新:3 日前
- … 未チェック
ライセンスがある
このリポジトリはまだGitHubから読み取っていません
- – 対象外
エンドポイントが応答する
これはパソコンで動くため、インターネット上のエンドポイントはありません
- – 対象外
OAuthでサインイン
パソコンで動き、代わりにローカルの設定を使います
- … 未チェック
ツールの説明に隠れた指示がない
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
開発者ツールのほかのサーバーとの比較i
- このカテゴリのほかの5728件のうち93%よりスターが多い
- このカテゴリのほかの5728件のうち50%より最近レジストリに公開
- 基本チェックの結果が、このカテゴリのほかの5728件のうち100%と同じかそれ以上
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
よくある質問
adrkit decision memoryは安全ですか?
当てはまる基本チェック2項目のうち2項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
どんなキーやコードが必要ですか?
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
パソコンで動きますか、それともクラウドですか?
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
今もメンテナンスされていますか?
GitHubリポジトリの最終更新は3 日前、最新バージョン(0.20.0)がレジストリに届いたのは31 日前です。
どのアプリで使えますか?
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
代わりに使えるものは?
同じカテゴリには:REA, Netdata, Front-End Checklist
代わりの候補
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Netdata
Real-time infrastructure monitoring with metrics, logs, alerts, and ML-based anomaly detection.
Front-End Checklist
Review frontend code and live pages against 386 quality-gated web development rules.
作者のREADME
READMEを開く
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
@adrkit/mcp
Deterministic, offline, read-only decision memory for coding agents — including the decisions you already rejected.
A local Model Context Protocol server that lets an agent harness query one Git-backed ADR (Architecture Decision Record) corpus over stdio: *"has this been decided?"*, *"what governs these files?"*, and *"what replaced this?"* It surfaces superseded and rejected decisions specifically so agents stop re-proposing paths the team already ruled out.
No model calls. No network calls. No writes. The server reads Markdown files
from your repo and returns structured JSON. It never calls an LLM, never opens a
socket, and never mutates your corpus. Every tool is annotated
readOnlyHint: true,openWorldHint: false.
Part of adrkit. The corpus lives in git as one Markdown file per decision with typed YAML frontmatter (@adrkit/core); this server only reads it. Listed in the official MCP registry as `dev.adrkit/mcp` (this is the Node/npm @adrkit/mcp package — unrelated to the adr-kit Python package on PyPI).
Status
Published on npm for Node 22+ with a deliberately small, read-only stdio surface: four tools and no write path.
adrkit is still pre-1.0. If you need repeatable client installs, pin an explicit @adrkit/mcp version in your MCP config instead of floating latest.
Quick start
The published binary is `adrkit-mcp`. Run it with npx (no install):
npx -y @adrkit/mcp --cwd /path/to/your/repo --dir docs/adr
It speaks JSON-RPC over stdio, so you normally point an MCP client at it rather than running it by hand. Copy-pasteable client configs follow.
Claude Desktop
Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json). Claude launches servers from an arbitrary working directory, so set ADRKIT_MCP_CWD to your repo's absolute path:
{
"mcpServers": { "adrkit": { "command": "npx", "args": ["-y", "@adrkit/mcp"], "env": { "ADRKIT_MCP_CWD": "/absolute/path/to/your/repo", "ADRKIT_MCP_DIR": "docs/adr" } } } }
VS Code
Create .vscode/mcp.json in your workspace (VS Code uses the servers key and substitutes ${workspaceFolder}):
{
"servers": { "adrkit": { "type": "stdio", "command": "npx", "args": ["-y", "@adrkit/mcp", "--cwd", "${workspaceFolder}", "--dir", "docs/adr"] } } }
Cursor
Create .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": { "adrkit": { "command": "npx", "args": ["-y", "@adrkit/mcp"], "env": { "ADRKIT_MCP_CWD": "/absolute/path/to/your/repo", "ADRKIT_MCP_DIR": "docs/adr" } } } }
GitHub Copilot CLI
Add to ~/.copilot/mcp-config.json (user-level) or ./.copilot/mcp-config.json (per-repo). Copilot CLI runs servers from the trusted repo directory, so the default cwd usually resolves correctly:
{
"mcpServers": { "adrkit": { "type": "local", "command": "npx", "args": ["-y", "@adrkit/mcp", "--dir", "docs/adr"], "tools": ["*"] } } }
You can also add it interactively with /mcp add inside a copilot session.
Configuration reference
| Option | Env | Default | Meaning |
|---|---|---|---|
--cwd | ADRKIT_MCP_CWD | process.cwd() | Repository root; must canonicalize to a directory containing a readable .git entry (a normal clone or a linked-worktree .git file). |
--dir | ADRKIT_MCP_DIR | docs/adr | ADR directory, resolved against --cwd and required to stay contained within it (realpath-checked, so a symlink escape is rejected). |
Flags win over environment variables, which win over the defaults. An unusable configuration exits non-zero with a diagnostic on stderr (2 for an unparseable flag, 1 for an invalid root/directory) and never starts a transport. stdout is reserved for JSON-RPC protocol frames only.
Protocol revisions
The server speaks both MCP protocol eras on the same stdio connection, and the client picks. The opening exchange selects the era and pins it for the connection's lifetime:
| Client opens with | Server serves |
|---|---|
server/discover, or any request carrying a 2026 _meta envelope | `2026-07-28` — stateless, no handshake |
initialize / notifications/initialized | the 2025-era revision it negotiates |
On 2026-07-28 there is no initialize handshake and no session id: every request carries its own protocol version and client capabilities in _meta, and every result is self-describing (resultType, plus server identity in _meta). tools/list and server/discover are cacheable (SEP-2549) and are served with ttlMs: 300000, cacheScope: "public" because the 4-tool surface is fixed for the life of the process and carries no corpus content. Corpus reads are never cacheable: every tools/call loads a fresh projection.
Nothing else about the tools changes between eras — same names, same schemas, same annotations, same structured results. The server uses none of the features the 2026-07-28 revision deprecated (roots, sampling, logging) or removed (sessions, ping, resources/subscribe).
The four tools
Exactly four tools, all read-only. Each shares fixed annotations (readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false), returns a deterministic human-readable summary line in content[0].text, and carries a findings page with the corpus's own parse/validation findings. Every substantive response also includes a corpusHealth sibling: { fingerprint, recordCount, excludedCount }.
Shapes below are the real input/output contracts (see packages/mcp/src/tools). Each tool's structured output is { corpusHealth?, result }; the objects shown under "output" are the members of that discriminated result union (keyed on outcome). findings and every growing array are cursor-paginated (see Pagination); findings and repeated pagination fields are elided here for brevity.
search_decisions
Normalized literal substring search over id, title, tags, and body (the graveyard of superseded/rejected records is included by default). Filters are ANDed: status/scope match any-of; tags matches all-of.
// input
{ "query": "postgres", // required, 1–256 code units, non-empty after trim "status": ["accepted"], // optional, ≤6, any-of "tags": ["database"], // optional, ≤32 tags × ≤64 chars, all-of "scope": ["backend"] // optional, ≤3, any-of } // output → single "results" branch (empty results use the same branch) { "outcome": "results", "items": [ { "id": "0007", "title": "Adopt Postgres", "status": "accepted", "sourcePath": "docs/adr/0007-adopt-postgres.md", "matchedFields": ["title", "body"] // subset of id | title | tag | body } ], "cursor": null }
get_decision
The complete typed frontmatter + body for one ref.
// input
{ "ref": "0007" } // AdrRef, 1–128 chars (local id, or a "log:id" federated ref) // output → discriminated on "outcome" // found (the full record is nested under "decision"): { "outcome": "found", "decision": { "requestedRef": "0007", "id": "0007", "title": "Adopt Postgres", "status": "accepted", "sourcePath": "docs/adr/0007-adopt-postgres.md", "frontmatter": { /* typed YAML: status, tags, affects, relations, ... */ }, "body": "## Context\n..." } } // other outcomes: // { "outcome": "not-found", "requestedRef": "9999" } // { "outcome": "ambiguous-local-id", "requestedRef": "0007", "candidates": [ /* DecisionSummary[] */ ] } // { "outcome": "federated-log-unavailable", "requestedRef": "core:12", "log": "core", "id": "12" }
A log:id federated ref is recognized but never resolved or substituted — this server reads exactly one local corpus.
get_decision_context
Governing / active-proposal / historical decisions for repo-relative files[], via each record's own affects matchers. Paths are compared against patterns only — never opened.
// input
{ "files": ["src/db/pool.ts", "src/db/schema.sql"] // 1–256 entries; each POSIX, 1–1024 chars; no leading "/", no "..", no drive, no "\" } // output → single "matches" branch (all three arrays; empty is the same branch) { "outcome": "matches", "governing": [ { "id": "0007", "title": "Adopt Postgres", "status": "accepted", "sourcePath": "docs/adr/0007-adopt-postgres.md", "firedMatchers": [ { "type": "path", "pattern": "src/db/**" } ], "relations": { "supersedes": [], "supersededBy": null, "relatesTo": [], "conflictsWith": [] } } ], "activeProposals": [], "history": [] }
list_superseded
Every superseded record with its direct local replacement state — the tool that keeps agents from re-proposing rejected paths.
// input (pagination only)
{} // output → single "entries" branch { "outcome": "entries", "items": [ { "id": "0003", "title": "Use MySQL", "status": "superseded", "sourcePath": "docs/adr/0003-use-mysql.md", "supersededBy": { // one of four states: "resolved": true, "target": { "id": "0007", "title": "Adopt Postgres", "status": "accepted", "sourcePath": "docs/adr/0007-adopt-postgres.md" } } // unresolved states: // { "resolved": false, "targetRef": "0099", "reason": "dangling" } // { "resolved": false, "targetRef": "0007", "reason": "ambiguous", "candidateCount": 2 } // { "resolved": false, "targetRef": "core:1", "reason": "federated-unavailable", "log": "core", "id": "1" } } ], "cursor": null }
Relation refs (supersedes, supersededBy, relatesTo, conflictsWith) are surfaced verbatim and never expanded — follow them with a second get_decision call. Supersession is reported one hop deep; there is no transitive traversal.
Library surface
The package root exports only a sealed lifecycle factory. There is no way to reach the underlying SDK server, its registrations, or its transport:
import { createAdrkitMcpServer } from '@adrkit/mcp';
const server = createAdrkitMcpServer({ cwd: process.cwd(), dir: 'docs/adr' }); await server.start(); // validates the root, then serves one stdio connection // ... later: await server.close();
createAdrkitMcpServer(options?) performs no filesystem access at construction and returns a frozen, null-prototype handle with exactly start() and close().
Transport failures — a transport that fails to start, or a background stream error such as the EPIPE from a client that has gone away — are reported through the optional onError option, which defaults to a stderr diagnostic. The adrkit-mcp binary additionally exits non-zero. Nothing is written to stdout: that is reserved for protocol frames.
Closing stdin is the shutdown signal, as the MCP stdio binding specifies: the adrkit-mcp binary exits 0 with nothing on stderr. Requests still in flight when stdin closes are aborted and not answered, so a client (or a script piping requests in) must keep stdin open until it has read every response it wants.
Limits
query 1–256 code units (non-empty after trimming); ref 1–128; files[] 1–256 entries of 1–1024 POSIX-only chars (no leading /, no .., no drive letter, no backslash); status ≤6, scope ≤3, tags ≤32 × ≤64 chars; result and findings pages default 20, max 100; a per-record ADR sourc