epsteinexposed-mcp
Search the Epstein Exposed public database through MCP tools.
search_persons: Find persons of interest by name and category, with pagination and stats.
get_person: Get full biographical details, aliases, black book status, and aggregate stats by slug.
search_documents: Full-text search across case documents with filters by source and category.
search_flights: Search flight logs by passenger, year, origin, or destination.
cross_search: Simultaneously full-text search documents and emails with optional type limiting.
epsteinexposed-mcp
Model Context Protocol server exposing the Epstein Exposed public API as AI-agent tool calls.
Plug directly into any MCP-compatible client (Claude Desktop, Cursor, SmolAgents, etc.) to search persons, documents, flight logs, and emails from the Epstein case files.

Disclaimer: Inclusion in the Epstein Exposed database does not imply guilt or wrongdoing. All data is derived from publicly released government records.
Tools
Tool | Description |
| Search/filter persons of interest by name and category |
| Get full detail for a person by slug (bio, aliases, stats) |
| FTS5 full-text search across case documents |
| Search flight logs by passenger, year, origin, destination |
| Search across documents and emails simultaneously |
Related MCP server: @cyanheads/secedgar-mcp-server
Quick Start
# Install
pip install -e ".[dev]"
# Run via stdio (for MCP clients)
python -m src.server
# Or via the MCP CLI
mcp run src/server.pyMCP Client Configuration
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"epstein-files": {
"command": "epsteinexposed-mcp",
"args": []
}
}
}Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"epstein-files": {
"command": "epsteinexposed-mcp",
"args": []
}
}
}Architecture
MCP Client (Claude, Cursor, SmolAgents)
│
│ JSON-RPC 2.0 (stdio / SSE)
▼
epsteinexposed-mcp (FastMCP)
│
│ AsyncEpsteinExposed (curl_cffi)
▼
epsteinexposed.com/api/v1Powered by the epsteinexposed Python package.
Development
git clone https://github.com/releasetheepsteinfiles/epsteinexposed-mcp.git
cd epsteinexposed-mcp
pip install -e ".[dev]"
pytest -vDocumentation
Full docs available at the docs site (VitePress).
The toolchain
This repository is one of four that share a data source and a design system:
Repo | Role |
Python client for the public API | |
MCP server — structured search (this repo) | |
MCP server — semantic search (in development) | |
Natural-language chat app |
A 20-second overview of how the four fit together:

Design system
All four repositories share the "Declassified" visual language — a dark
archival palette with a single ember accent, monospace structure and Inter
prose. The canonical tokens live in brand/tokens.css
and the rationale in brand/DESIGN.md; both files are
byte-identical across the four repos.
The VitePress theme maps --vp-* onto that palette in
docs/.vitepress/theme/custom.css.
License
MIT
Available Tools
5 toolscross_searchA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| type | No | ||
| limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses key behavioral traits: it's a search operation (implied read-only), returns separate result arrays, and mentions the limit constraint (max 100). However, it doesn't cover important aspects like authentication requirements, rate limits, pagination, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is perfectly structured and front-loaded: purpose statement first, then parameter explanations, then return format. Every sentence earns its place with zero wasted words. The bullet-point style for Args and Returns enhances readability without sacrificing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 parameters with 0% schema coverage and no annotations, the description does an excellent job explaining parameters and return format. The existence of an output schema reduces the need to detail return values. However, for a search tool with no annotations, it could benefit from mentioning performance characteristics or result ordering.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well by explaining all three parameters: 'query' (required search query), 'type' (limit to documents/emails or both), and 'limit' (max results per type with default and maximum). It adds meaningful context beyond the bare schema, though it doesn't specify the exact format for the 'type' parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with specific verb ('Search') and resources ('documents AND emails simultaneously'), distinguishing it from siblings like 'search_documents' (documents only) and 'search_persons' (different resource). It explicitly mentions full-text search capability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool (searching across both documents and emails) and includes guidance on the 'type' parameter to limit to specific resource types. However, it doesn't explicitly state when NOT to use it versus alternatives like 'search_documents' or 'search_persons'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_personA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool retrieves data (implied read-only behavior) and lists the types of information returned, which adds useful context. However, it lacks details on error handling, rate limits, or authentication needs, leaving some behavioral aspects unclear for a tool with no annotation support.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded with the core purpose, followed by details on returns and parameters. Every sentence adds value: the first states the action and key input, the second lists output details, and the third clarifies parameter usage with examples. There is no wasted text, making it highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (1 parameter, no nested objects) and the presence of an output schema, the description is largely complete. It covers the purpose, parameter semantics, and output content adequately. However, with no annotations, it could benefit from more behavioral context like error cases or data freshness, slightly reducing completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, so the description must compensate fully. It clearly explains the 'slug' parameter as 'the person's URL slug' and provides concrete examples ('bill-clinton', 'ghislaine-maxwell'), adding essential meaning beyond the bare schema. This effectively documents the single parameter's purpose and format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Get full detail for a specific person'), identifies the resource ('person'), and distinguishes it from siblings by focusing on individual retrieval rather than search operations like 'search_persons' or 'cross_search'. It explicitly mentions what information is returned, making the purpose distinct and comprehensive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: when you need detailed information about a specific person identified by their URL slug. It implies an alternative by mentioning sibling tools like 'search_persons' for broader searches, but does not explicitly state when not to use it or compare directly with all alternatives, keeping it at a 4.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| source | No | ||
| category | No | ||
| page | No | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and does well by specifying full-text search (FTS5), pagination behavior (defaults and max), and return format. It doesn't mention rate limits or authentication needs but covers core behavioral aspects adequately.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with purpose statement followed by organized parameter and return sections. Every sentence adds value with no wasted words, and key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is quite complete for a search tool with 5 parameters and no annotations. It explains parameters thoroughly and mentions the return format. With an output schema present, it doesn't need to detail return values further. Minor gap: no explicit mention of authentication or error handling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description fully compensates by explaining all 5 parameters with clear semantics, examples, defaults, and constraints. It adds substantial value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches Epstein case documents using full-text search (FTS5), specifying both the action (search) and resource (Epstein case documents). It distinguishes from siblings like search_flights and search_persons by focusing specifically on documents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for searching Epstein case documents but doesn't explicitly state when to use this tool versus alternatives like cross_search. It provides filtering parameters but no guidance on tool selection context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_flightsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| passenger | No | ||
| year | No | ||
| origin | No | ||
| destination | No | ||
| page | No | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions pagination behavior (page, per_page with max 100) and the return format, but doesn't cover important aspects like rate limits, authentication requirements, error conditions, or whether this is a read-only operation. Significant gaps remain for a tool with 6 parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for purpose, arguments, and returns. Every sentence adds value: the first establishes scope, the args section documents all parameters with useful examples, and the returns section clarifies output format. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 6 parameters and no annotations, the description does an excellent job covering parameters and return format. The presence of an output schema reduces the need to explain return values in detail. Minor gaps remain in behavioral aspects like rate limits or error handling, but overall it's quite complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides comprehensive parameter documentation with clear examples (e.g., '2002', 'TIST', 'Palm Beach'), default values, and constraints (max 100 for per_page). With 0% schema description coverage, the description fully compensates by explaining all 6 parameters in detail beyond what the bare schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches flight logs from 1997-2006 across all known aircraft, with a specific verb ('search') and resource ('flight logs'). It distinguishes itself from siblings like search_documents or search_persons by focusing exclusively on flight data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for flight log searches within the 1997-2006 timeframe but doesn't explicitly state when to use this tool versus alternatives like cross_search or get_person. No exclusions or specific contexts are provided beyond the date range.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_personsA
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.).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| category | No | ||
| page | No | ||
| per_page | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions pagination behavior (defaults and max) and the return format (JSON with specific fields), which is helpful. However, it doesn't cover important aspects like rate limits, authentication requirements, error conditions, or whether this is a read-only operation (though 'search' implies it).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (purpose, args, returns) and uses bullet-like formatting. Every sentence adds value, though the category enum list is somewhat lengthy but necessary for completeness. It could be slightly more concise in the opening statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 parameters, no annotations, but with output schema), the description does a good job. It explains parameters thoroughly and mentions the return format, though it doesn't fully describe behavioral aspects like error handling. The output schema existence reduces the need to detail return values, but more behavioral context would help.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It provides complete documentation for all 4 parameters: name (full/partial search), category (with explicit enum values), page (default), and per_page (default and max). This adds substantial meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action ('Search') and target resource ('Epstein files for persons of interest'), distinguishing it from sibling tools like search_documents or search_flights that search different data types. The verb+resource combination is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_person (for retrieving a specific person) or cross_search (purpose unknown). The description only states what the tool does, not when it's appropriate relative to other available tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
cross_search - First observed
get_person - First observed
search_documents - First observed
search_flights - First observed
search_persons
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose targeting different data types: cross_search covers both documents and emails, get_person retrieves detailed person info, search_documents focuses on documents, search_flights handles flight logs, and search_persons finds person records. There is no overlap in functionality, making tool selection straightforward for an agent.
All tool names follow a consistent verb_noun pattern using snake_case: cross_search, get_person, search_documents, search_flights, and search_persons. The naming is predictable and readable, with no deviations in style or convention.
With 5 tools, the server is well-scoped for its purpose of exploring Epstein-related data. Each tool serves a specific and necessary function (searching across data types, retrieving person details, and searching documents, flights, and persons), with no redundant or missing tools for the domain.
The tool surface provides complete coverage for the domain of investigating Epstein case data. It includes search capabilities across all key data types (documents, emails, flights, persons) and detailed retrieval for persons, enabling comprehensive exploration without obvious gaps or dead ends.
Maintenance
Related MCP Connectors
Browse and query the EIA API v2 — electricity, petroleum, natural gas, coal, forecasts via MCP.
Podcast Index MCP — wraps the Podcast Index API (podcastindex.org)
Market Data App MCP — wraps the Market Data App API (marketdata.app)
EPA Emissions MCP — wraps EPA Envirofacts REST API (free, no auth)
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceInteract with the Cooper Hewitt API with MCP.2MIT
- AlicenseNot gradedqualityAmaintenanceQuery SEC EDGAR filings, XBRL financials, and company data through MCP.685 npm10Apache 2.0
- AlicenseNot gradedqualityAmaintenanceAccess FEC campaign finance data through MCP. Query data about candidates, money trails, and election filings. STDIO & Streamable HTTP.81 npm2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceExposes the FBI Crime Data Explorer API — crime estimates, agency offense rates, and LEOKA officer safety data via MCP. Supports STDIO or Streamable HTTP transport.47 npm1Apache 2.0