MCP server providing full access to the Epstein Exposed public API — search persons, get person detail, search documents, search flight logs, and cross-type search across documents and emails.
Five tools with complete schemas and descriptions. All tools are read-only search/retrieval operations with proper pagination support. Naming follows verb_noun convention (search_*, get_*). Descriptions are adequate (100-200 chars) but lack actionable context for LLM selection. Parameter descriptions are present but generic, no constraints on enum values (e.g., 'category' accepts free-form strings instead of declared enums). Output schemas documented via docstrings but not formally in JSON Schema. No error handling guidance, no recovery paths, no examples of invalid input behavior.
Search across documents AND emails simultaneously using full-text search. Args: query: Search query (required). type: Limit to "documents" or "emails". Omit to search both. limit: Max results per type, max 100 (default 20). Returns: JSON with separate result arrays for documents and emails.
Get full detail for a specific person by their URL slug. Returns biographical info, aliases, black book entry status, and aggregate stats (flights, documents, connections, emails). Args: slug: The person's URL slug (e.g. "bill-clinton", "ghislaine-maxwell"). Returns: JSON with full person detail.
Search Epstein case documents using full-text search (FTS5). Args: query: Full-text search query (e.g. "little st james", "flight log"). source: Filter by document source (court-filing, doj-release, fbi, efta). category: Filter by document category (deposition, testimony, correspondence). page: Page number (default 1). per_page: Results per page, max 100 (default 20). Returns: JSON with matching documents including title, date, source, summary, tags.
Search Epstein's flight logs (~1997-2006) across all known aircraft. Args: passenger: Filter by passenger name. year: Filter by year (e.g. 2002). origin: Filter by departure location (e.g. "TIST", "Palm Beach"). destination: Filter by arrival location (e.g. "Teterboro", "CYUL"). page: Page number (default 1). per_page: Results per page, max 100 (default 20). Returns: JSON with flight records including date, route, aircraft, pilot, and passengers.
Enum parameters lack formal constraints. 'category' in search_persons accepts free-form strings instead of declared enum values (politician|business|royalty|celebrity|associate|legal|academic|socialite|military-intelligence|other). LLMs will hallucinate invalid values.
Parameter descriptions lack format/constraint guidance. 'year' in search_flights has no range (1997-2006?). 'page' and 'per_page' lack explicit bounds. LLMs cannot validate inputs without this detail.
No error handling or recovery guidance. Tools return JSON but lack documentation of failure modes (e.g., 'no results found', 'invalid filter', 'rate limited'). LLMs cannot self-correct without actionable error messages.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Search the Epstein files for persons of interest. Args: name: Full or partial name to search for. category: Filter by category (politician, business, royalty, celebrity, associate, legal, academic, socialite, military-intelligence, other). page: Page number (default 1). per_page: Results per page, max 100 (default 20). Returns: JSON with matching person records including stats (flights, documents, etc.).
Output schemas documented only in docstrings, not in formal JSON Schema. Clients cannot parse response structure programmatically. Pagination metadata structure (status, data, meta) is implicit.
Tool descriptions lack context for LLM selection. No guidance on when to use search_persons vs get_person, or search_documents vs cross_search. Descriptions state WHAT but not WHEN or WHY.