Skip to main content
Glama

epsteinexposed-mcp

CI Codacy Badge codecov Python MCP License: MIT

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.

epsteinexposed-mcp

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_persons

Search/filter persons of interest by name and category

get_person

Get full detail for a person by slug (bio, aliases, stats)

search_documents

FTS5 full-text search across case documents

search_flights

Search flight logs by passenger, year, origin, destination

cross_search

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.py

MCP 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/v1

Powered by the epsteinexposed Python package.

Development

git clone https://github.com/releasetheepsteinfiles/epsteinexposed-mcp.git
cd epsteinexposed-mcp
pip install -e ".[dev]"
pytest -v

Documentation

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

epsteinexposed

Python client for the public API

epsteinexposed-mcp

MCP server — structured search (this repo)

epstein-files-rag-mcp

MCP server — semantic search (in development)

epsteinexplorer

Natural-language chat app

A 20-second overview of how the four fit together:

Epstein Files toolchain

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 tools
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.
ParametersJSON Schema
NameRequiredDescriptionDefault
slugYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo
sourceNo
categoryNo
pageNo
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.
ParametersJSON Schema
NameRequiredDescriptionDefault
passengerNo
yearNo
originNo
destinationNo
pageNo
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.).
ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
categoryNo
pageNo
per_pageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 5 tool updatesv0.1.0
    • First observedcross_search
    • First observedget_person
    • First observedsearch_documents
    • First observedsearch_flights
    • First observedsearch_persons

TDQS

A4.3/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers