Standards-grounded K-12 lesson tooling for Claude Code: a 7-tool MCP standards server built from openly-licensed data, plus a Teacher/Student edition document renderer.
Server defines 7 tools with complete input schemas and descriptions. Naming follows verb_noun pattern (find_*). Descriptions are detailed but verbose (200-400 chars, above the 10-200 char ideal). All parameters have type definitions and descriptions. Output schemas are documented in code comments but not formally exposed in tool definitions. Error handling is implicit (tools return empty/typed-empty on failure per docstring) but not surfaced in descriptions. No parameter enums despite constrained inputs (e.g., direction: BACKWARD|FORWARD). Security is sound (read-only operations, no secrets in params). Composition is clean, each tool has one responsibility and chains via UUID/code identifiers.
Published curriculum lessons aligned to a standard, most directly-taught first. Every row carries its own `license` and `attributionStatement`. That is not decoration: the export's attribution string varies by node type and provider, so anyone reproducing this owes the record's own string and not a general one. Dropping the fields here would make the obligation invisible to everything downstream.
Up to 5 sub-skill description strings, ordered by ordinal. Empty tolerated. Accepts a `code` in place of `caseIdentifierUUID`; the code resolves to the same-code node richest in components.
Materials (activities, assessments) belonging to a curriculum lesson, up to 25 per lesson. Every row carries its own `license` and `attributionStatement`.
Return `{student_behavior, teacher_move}` records. Empty is tolerated. Accepts a `code` in place of `caseIdentifierUUID`; the code resolves to the same-code node that actually holds misconceptions (they can live on a non-representative placement).
Prefix-code search (if `code` given) else keyword OR-search, with subStandards. Same-code duplicates collapse to the richest node per code, so grounding never lands on an empty placement when a rich sibling exists. Keyword hits drop blank-code container nodes and lead with the richest leaf. subStandards union the children across all same-code placements.
Descriptions are verbose (200-400 chars) and technical, exceeding the 10-200 char ideal for LLM parsing. Simplify to action-focused summaries: 'Search standards by code or keywords' instead of multi-sentence explanations of deduplication logic.
Constrained parameters lack enum declarations. 'direction' accepts only BACKWARD|FORWARD but is defined as free-form string. 'academicSubject' and 'jurisdiction' are unconstrained despite being faceted filters. Add enums to prevent hallucinated values.
Output schemas are documented in code comments and docstrings but not formally declared in tool definitions. LLMs cannot see the response structure (e.g., fields like 'statement_text', 'caseIdentifierUUID', 'subStandards'). Add explicit output schema declarations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2026-07-28+ | v2 |
Standards filtered by grade level and academic subject. Returns standards matching the specified criteria.
Follow the single primary prerequisite/next edge. Math-only by design. Accepts a `code` in place of `caseIdentifierUUID`; the code resolves to the same-code node that actually carries an edge in `direction` (a prerequisite and a next standard can live on different placements).
Error handling is implicit (docstring states 'returns empty/typed-empty on any miss') but not exposed in tool descriptions. LLMs cannot see what constitutes a miss or how to recover. Add explicit error guidance: 'Returns empty list if no matches found; try broader keywords or remove filters.'
Parameters 'code' and 'caseIdentifierUUID' are mutually exclusive in several tools but this is not documented in parameter descriptions. LLMs may pass both or neither, causing ambiguity. Add explicit mutual-exclusivity notes.