Offendersearch

Search all 58 US sex-offender registries in one call — scored matches with official record citations.

Documentation

Offendersearch MCP Server

Search all 58 US sex-offender registries — every US state, DC and the territories — from any MCP client: Claude Desktop, Claude Code, or any agent runtime that speaks the Model Context Protocol.

One tool call returns scored, de-duplicated, provenance-tagged records from a continuously updated national dataset with 100% US coverage. Built on the official Python mcp SDK (FastMCP).

Tools

ToolWhat it does
search_offendersSearch every registry for one person/location — name, DOB, age, city/state/ZIP, street address, GIS radius, or free text. Returns scored matches with per-registry outcome (sourceStatus) and plain-language warnings.
batch_searchUp to 1,000 lookups in one call, row-in/row-out, each through the same engine as a single search.
get_registry_coverageThe public coverage catalog: every registry code, scope, legal status and health. No API key needed.

Results carry matchConfidence, matchBasis (why it matched), DOB verification state, aliases, addresses, offense detail, and a per-source citation with lastCheckedAt — so an agent can cite exactly which registry said what.

Auth — an API key, free to get

Create a key at offendersearch.app — it works immediately: 25 free searches, no card required.

  • Local (stdio): set OFFENDERSEARCH_API_KEY.
  • Remote (streamable-HTTP): each request forwards its own X-API-Key header — multi-tenant by design.

Quick start (Claude Desktop, local stdio)

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

claude_desktop_config.json:

{
  "mcpServers": {
    "offendersearch": {
      "command": "python",
      "args": ["/path/to/services/mcp-server/server.py"],
      "env": { "OFFENDERSEARCH_API_KEY": "os_live_..." }
    }
  }
}

Remote / self-hosted (streamable-HTTP)

MCP_TRANSPORT=streamable-http OFFENDERSEARCH_API_KEY="os_live_..." python server.py
# or: uvicorn server:http_app  (see Dockerfile)

Client config for a hosted instance (per-request key, no env secret):

{
  "mcpServers": {
    "offendersearch": {
      "url": "https://<your-host>/mcp",
      "headers": { "X-API-Key": "os_live_..." }
    }
  }
}

Example exchange

User: Is a John Doe, born 1980-04-12, on any registry in New Jersey?

Agentsearch_offenders(first_name="John", last_name="Doe", dob="1980-04-12", state="NJ")

Agent: One candidate matched with a full date-of-birth confirmation (dobVerification: dob_match, confidence 1.0): John A. Doe, registered in NJ, with the official registry record linked. All 58 registries were searched to completion (sourcesIncomplete: 0).

Reading results responsibly

  • If counts.sourcesIncomplete > 0, the records are a lower bound — relay warnings[0] rather than reporting a clean "no match".
  • A match is a candidate, not an identification — verify DOB and photograph.
  • Results are public-record data and not a consumer report; do not use them for FCRA-covered decisions without appropriate process.

More

Offendersearch resources