External genealogy source search MCP server - newspapers, WikiTree, Find A Grave, and European records
Research Sources MCP provides 6 genealogy research tools with moderate quality. All tools have descriptions and visible schemas in src/tools/ and src/index.ts. Naming is consistent (verb_noun pattern: search_*, get_*). However, descriptions are brief (30-80 chars, below baseline 194), most lack actionable context for LLM selection, parameter descriptions are present but terse, and output schemas are not formally documented. Error handling exists but is generic (catch blocks log only message, not classification or recovery guidance). The server correctly avoids secrets in parameters and uses Zod for validation, but composition could be improved, cross_reference_person duplicates logic from three other tools rather than delegating.
Search ALL external sources in parallel for a person (newspapers, WikiTree, Open Archives)
Get full OCR text and image for a specific newspaper page
Get detailed profile for a WikiTree person
Search Chronicling America (Library of Congress) historic newspapers (1789-1963)
Search Open Archives (Dutch, Belgian, French historical records)
Search WikiTree collaborative genealogy tree
Tool descriptions lack actionable context for LLM selection. Descriptions average 40-60 chars (baseline 194). Example: 'Search Chronicling America (Library of Congress) historic newspapers (1789-1963)' says WHAT but not WHEN to use it vs alternatives or prerequisites.
Output schemas not documented. Tools return JSON strings (see cross-reference-tools.ts:89 'JSON.stringify') but the response structure (fields, types, optional vs required) is not documented in descriptions or schemas. LLMs cannot plan downstream calls without knowing what fields to extract.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 53 | 2026-07-28+ | v2 |
Error handling is generic and not actionable. Cross-reference-tools.ts lines 48-51 and 64-67 catch errors and add {error: message} to results, but do not classify as retryable/user-fixable/fatal, do not offer recovery steps, and do not include the invalid value or constraint. LLMs cannot self-correct.
cross_reference_person duplicates search logic instead of delegating to search_newspapers, search_wikitree, search_open_archives. Lines 37-81 in cross-reference-tools.ts re-implement parallel search; this violates DRY and makes the tool brittle when individual search tools change.
Parameter descriptions are terse and lack format/range hints. Example: 'Birth year (YYYY)' in search_wikitree and search_open_archives does not clarify: is YYYY required? Is '1900' valid or must it be '1900-01-01'? Baseline is 72 chars average; most params here are 30-50 chars.
cross_reference_person has ambiguous name. The verb 'cross_reference' is not in the baseline verb set (get, list, create, search, update, delete, send, who). Does it search? Combine? Validate? 'search_person_all_sources' would be clearer.
Pagination documented for some tools but not consistently. search_newspapers accepts 'page' param (line in schema shows page: number default:1 minimum:1), but search_wikitree and search_open_archives accept 'limit' but no explicit page/offset. No total count or next_cursor returned to signal how many results exist. LLMs cannot know whether to fetch next page.
State extraction logic hardcoded. cross-reference-tools.ts line 83 calls extractState(args.birth_place) with a hardcoded list of 12 US states (lines 86-97, list is incomplete, missing states like Montana, Nevada, New York, etc.). This is fragile and does not scale. Should accept state as a separate parameter or use a maintained state database.