MCP server for the attrition.sh pack catalog — browse, resolve, install production patterns from Claude Code / Cursor / Codex.
Strong tool definitions with clear naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and well-structured input schemas. All 8 tools have explicit type definitions and parameter descriptions. Output schemas are documented in descriptions. Key gaps: no tool annotations (readOnlyHint/destructiveHint), limited error recovery guidance, and no pagination metadata (next_cursor/total_count) in search tools despite accepting limit parameters. Composition is sound, tools chain well (resolve_pack_id → get_pack → get_pack_section). Security posture is good (read-only operations, no secrets in params).
Merge `comparesWith` axes from two packs. Optionally filter to a single axis (cost, latency, complexity, accuracy, a11y, maintainability). Returns both pack objects plus a normalized comparison block.
Fetch a full Pack JSON object by slug. Returns the canonical Pack shape (identity, trust, contract, layers, body content, telemetry, relationships).
Fetch a single H2 section from a pack's raw markdown. Use this to stream just the piece you need (e.g. `contract`, `layers`, `evaluation-checklist`) instead of paying for the whole pack. Payload target: under 3k tokens.
Fetch a single row from a trace plus resolved cross-references (referenced packs + related rows in other traces). Bounds-checked rowIndex. Payload target <3k tokens.
Fetch a full ChangeTrace JSON object by id. Id must match `ct_YYYY-MM-DD[_<suffix>]`. Returns `{ trace }` envelope with rows, tags, and packsReferenced cross-references into Pillar 1.
Fuzzy-match a free-text query against pack names, taglines, and tags. Returns up to 5 candidate packs ranked by substring-hit score (Verified tier wins ties). Mirrors the Context7 resolve-library-id UX for pack discovery.
Search tools (search_packs, search_change_traces) accept limit but lack pagination metadata in response schema. No next_cursor, total_count, or has_more field documented. LLMs cannot determine if results are truncated or fetch subsequent pages.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. All 8 tools are read-only, but this is not explicitly signaled in the schema. Agents cannot infer safety/retry semantics without annotations.
Error handling lacks recovery guidance. No documented error responses or actionable next steps. E.g., if get_pack(slug='invalid') fails, the description does not suggest calling search_packs() to discover valid slugs.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Search the change-trace catalog (Pillar 2). Full-text over scenario / changes / why, filterable by project, symbol, sinceDate. Returns ranked snippets + matching-row indexes so agents can pull just the rows they need. Payload <2k tokens for top 20 matches. Limit capped at 50.
Typed directory query. Filter by packType, canonicalPattern, trust tier, or free-text query. Limit capped at 50.
compare_packs axis parameter is optional but behavior when omitted is not documented. Does it return all axes or a default? Ambiguity forces LLM to guess or make extra calls.
get_row rowIndex parameter lacks bounds documentation. Description says 'bounds-checked' but does not specify what happens if rowIndex exceeds trace length. Error message guidance missing.