MCP server for the Anatomy standard — validate, generate, show, migrate .anatomy files. Manage paired .anatomy-memory entries. Serve as Claude Code SessionStart hook and stdio MCP server with 9+ tools across section + memory access. Optional superpowers: ast-grep structural code search, git history (blame/log/show), and fff-mcp tool proxying.
Strong schema coverage and descriptions across 13 tools. All tools have explicit input schemas with typed parameters and descriptions. Tool names follow verb_noun convention (ast_grep_search, git_blame, anatomy_brief). Descriptions are detailed (100-300 chars typical), explaining WHAT the tool does and WHEN to use it. However, output schemas are not documented in the visible code, LLMs cannot see what fields to expect from responses. Error handling is minimal; tools lack recovery guidance. No tool annotations (readOnlyHint, destructiveHint) despite all being read-only operations. Parameter descriptions are strong but some lack explicit constraints (e.g., max_results has a hard ceiling of 500 but this is buried in prose rather than a JSON Schema maxItems constraint).
Primary discovery MCP tool. Returns rules, memory entries, and flows scoped to query/file_path/both in one envelope. Hybrid retrieval: BM25F lexical ranking reciprocal-rank-fused with dense embedding similarity when available. Filters apply as hard pre-filters before scoring. Includes vocabulary, invariants, anti-patterns, and prerequisites sections.
Returns environment fields (language_version, runtime, os, required_services, required_env).
Re-verify a memory entry against current source. Returns the entry plus, for each ref, the git diff since the entry's last endorsement (max of `at` and `last_verified_at`). Empty diff → `status: "unchanged"`, a strong signal the entry is still valid. Diff > 400 lines falls back to current file content (`truncated: true`). Other statuses: `new_since_endorsement` (ref postdates endorsement), `deleted`, `not_in_repo`. Read-only — the tool does not mutate the memory file. Compose with `anatomy memory verify <id>` or `anatomy memory deprecate <id>` to act on the result.
Search .anatomy-memory entries via hybrid retrieval: BM25F lexical ranking (per-field weights topic ×3, tags ×2, content ×1) reciprocal-rank-fused with dense embedding similarity. When the embedding dependency is unavailable this degrades to BM25F-only with identical scoring. Results in RRF mode include dense_score and rrf_score; in degraded mode only bm25_score. Tokenization is lowercase whitespace+punctuation split that preserves identifiers (paths, scoped packages, memory IDs). Each result's BM25 score is multiplied by a decay multiplier (fresh=1.0, aging=0.85, untouched=0.7, stale=0.6) computed from last_verified_at (or `at` for untouched entries). Filters (kind, topic, ref, tag) apply as hard pre-filters before scoring. Defaults: hide superseded/deprecated, limit 25. Each result includes bm25_score and decay_bucket. Empty query: returns entries ranked by decay × recency only.
Output schemas not documented. LLMs cannot see what fields responses contain, forcing them to guess downstream field names and risk broken tool chains. E.g., anatomy_brief returns 'rules', 'memory', 'flows' but this is not visible in the tool definition.
No tool annotations despite all 13 tools being read-only. Adding readOnlyHint: true to each tool's definition would signal to agents that these are safe to call without side effects, enabling more aggressive caching and retry strategies.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Returns the full detail of one memory entry plus its supersession chain.
Returns per-kind active/superseded/deprecated counts.
Returns identity + tagline only. Use only for high-level repo summary — prefer anatomy_brief for actual rules / memory / flows context.
Returns the structure.entries array of the resolved .anatomy.
Returns all .anatomy files discovered under path (default repo root). Lets agents see what sub-anatomies exist in a monorepo.
Structural code search via ast-grep. Find by AST shape, not text. Pattern syntax: https://ast-grep.github.io/guide/pattern-syntax.html. Pass `pattern` plus EITHER `lang` (explicit) OR `file_path` (glob — lang inferred from extension).
Show who last touched each line of a file. Returns one record per line in the requested range. Pass `lines: "10-25"` to scope; default returns the whole file (up to ANATOMY_GIT_MAX_BLAME_LINES, default 500). Set `follow: true` to track moves/renames across the file's history.
Find commits by content change (pickaxe), commit message (regex), or path filter. Returns commit metadata + filenames touched, capped at ANATOMY_GIT_MAX_LOG_COMMITS (default 100).
Metadata for one commit. By default returns commit, parents, author, date, full message, and file list with status + numstat. Set with_diff: true to include the patch body (truncated at ANATOMY_GIT_MAX_DIFF_BYTES, default 4096).
Numeric constraints (max_results, limit, rule_limit) are documented in prose but not enforced in JSON Schema. Use maxItems/maximum to make constraints machine-parseable and prevent LLMs from passing invalid values.
Error handling is minimal. Tools lack recovery guidance. E.g., if ast_grep_search finds no matches, the response should suggest 'Try a simpler pattern or broader file_path glob.' If git_blame fails on a deleted file, suggest 'Use git_log_search with path filter to find when it was deleted.'
Some parameter descriptions are vague. E.g., anatomy_memory_search 'query' param lacks guidance on whether it accepts regex, natural language, or exact match. git_log_search 'author' says 'substring' but does not clarify case sensitivity or whether it matches name, email, or both.