MCP server for the NSIP Search API providing livestock breeding intelligence tools including animal search, lineage, progeny, analytics, and flock management
NSIP MCP server demonstrates solid foundational quality with well-organized tools covering a coherent livestock genomics domain. All 13 tools have explicit names, descriptions, and input schemas. However, the server lacks output schema documentation, has minimal parameter descriptions in several tools, and misses critical features like tool annotations and structured error guidance. The codebase is professionally maintained (Rust, rmcp framework, RFC 9457 error handling), but the MCP tool definitions do not fully leverage modern agentic patterns for result clarity and LLM guidance.
List all available breed groups in the NSIP database
Compare two or more animals side-by-side with optional trait filtering
Get the date when the NSIP database was last updated
Get detailed information about a specific animal by LPN ID or registration number
Get summary statistics for a flock with optional breed filtering
Calculate inbreeding coefficient for a potential mating between two animals
Get lineage (ancestry) information for a specific animal
Output schemas are completely undocumented. LLMs cannot plan downstream tool calls or extract specific fields without knowing what the response structure is. This violates the critical pattern:tool requirement and increases hallucination risk.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) present. All tools are read-only and should declare readOnlyHint=true per current spec (2026-07-28). Tool annotations help LLMs understand safety and plan retry strategies.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 36 | 2024-11-05+ | v1 |
Get mating recommendations for an animal based on target traits
Get full profile (details + lineage + progeny) for an animal
Get progeny (offspring) information for a specific animal
Rank animals by weighted trait scores within a breed
Search for animals in the NSIP database with filters for breed, gender, status, date range, flock, and sorting
Get trait ranges and statistics for a specific breed
Parameter descriptions are minimal or missing context. Examples: 'lpn_id' across details/lineage/progeny/profile is described only as 'LPN ID of the animal' with no guidance on format or discovery method. 'weights' in rank tool has a complex structure (object with trait keys and float values) but description does not explain the schema or valid trait keys. LLMs cannot validate inputs or infer proper formatting.
Several enumerated parameters lack enum constraints in schema. Examples: 'status' in search (accepts 'CURRENT, SOLD, DEAD' but no enum validation shown), 'gender' (accepts 'Male, Female, Both' but unclear if these are the only valid values). Free-form strings invite hallucinated values.
No error recovery guidance. Tools have no descriptions of what happens on failure (e.g., 'animal not found', 'invalid breed_id', 'API timeout'). LLMs have no way to know whether to retry, call a discovery tool, or escalate to the user.
Pagination guidance is sparse. 'search' and 'progeny' accept 'page' and 'page_size' but descriptions do not specify: what is the maximum page_size? Is page 0-indexed or 1-indexed? How is the total count returned? What happens if page exceeds available results? LLMs must guess, leading to wasted calls.
Complex parameters lack sufficient explanation. 'rank' tool accepts a 'weights' object (mapping trait abbreviations to floats) and a 'top_n' parameter (default 10, but no min/max stated). LLMs cannot discover valid trait names or understand weight semantics without calling breed_groups + trait_ranges first.
Tool relationships and multi-step patterns are undocumented. Example: to use 'rank', the LLM probably needs to first call 'breed_groups' to discover breed IDs and 'trait_ranges' to learn trait abbreviations. Tool descriptions should hint at this dependency chain.