OpenOSINT

Open-source intelligence lookups on emails, domains, IPs and usernames, run from an MCP client

By OpenOSINT Python Local · stdio SecurityWeb search

72 popularity score ★ 1.9k ↓ 2.7k/mo

Connect your client

Local (PyPI)

Add in one click

Opens the app, which asks before it adds the server.

Or add it by command or config

Claude CodeTerminal
claude mcp add openosint -- uvx --from openosint openosint-mcp
Claude Desktopclaude_desktop_config.json
{
  "mcpServers": {
    "openosint": {
      "command": "uvx",
      "args": [
        "--from",
        "openosint",
        "openosint-mcp"
      ]
    }
  }
}
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "openosint": {
      "command": "uvx",
      "args": [
        "--from",
        "openosint",
        "openosint-mcp"
      ]
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "openosint": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "--from",
        "openosint",
        "openosint-mcp"
      ]
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.openosint]
command = "uvx"
args = ["--from", "openosint", "openosint-mcp"]
Gemini CLITerminal
gemini mcp add --scope user openosint uvx -- --from openosint openosint-mcp

Settings 12

HIBP_API_KEY secret Optional: HaveIBeenPwned key for search_breach. For search_breach.
SHODAN_API_KEY secret Optional: Shodan key for search_shodan. For search_shodan.
VIRUSTOTAL_API_KEY secret Optional: VirusTotal key for search_virustotal. For search_virustotal.
ABUSEIPDB_API_KEY secret Optional: AbuseIPDB key for search_abuseipdb. For search_abuseipdb.
IP2LOCATION_API_KEY secret Optional: IP2Location.io key for search_ip2location. For search_ip2location.
GITHUB_TOKEN secret Optional: Raises search_github's limit from 60 to 5000 requests an hour. For search_github.
ANTHROPIC_API_KEY secret Optional: Anthropic key used by investigate_multi. For investigate_multi.
OPENOSINT_ALLOW_ACTIVE Optional: Set to 1 to list the noisy and target-touching tools, same as --allow-active. For active tools.
OPENOSINT_ENV_FILE Optional: Absolute path to a .env file holding keys, since the client starts the server in an unrelated folder. A bad path stops the server at start.
Set together: censys
CENSYS_API_ID secret Optional: Censys API id for search_censys, used with CENSYS_SECRET. For search_censys.
CENSYS_SECRET secret Optional: Censys secret for search_censys, used with CENSYS_API_ID. For search_censys.
Set together: brightdata
BRIGHTDATA_API_KEY secret Optional: Bright Data key for search_dorks_live and search_footprint (with BRIGHTDATA_SERP_ZONE) and scrape_url (with BRIGHTDATA_UNLOCKER_ZONE). For search_dorks_live, search_footprint, scrape_url.

What it does

OpenOSINT is a Python package for open-source intelligence work: it bundles lookups against breach databases, WHOIS and RDAP, DNS, IP reputation and geolocation services, Shodan, Censys, VirusTotal, GitHub, paste-site dumps, GDELT news and Google results fetched through Bright Data. The same package is a command-line tool, an interactive agent, a web UI and a stdio MCP server (`openosint-mcp`). This page covers the MCP server, which hands each lookup to the client as a separate tool so the client's own model decides what to run and in which order.

The server is built around a passive mode. By default it only lists tools that ask a third-party data source or compute locally. The tools that send many requests from your IP (holehe, sherlock, sublist3r), that run the unverified phoneinfoga binary, or that make a service fetch the target's URL stay hidden from the client until you pass `--allow-active` or set `OPENOSINT_ALLOW_ACTIVE=1`. Every tool description carries its noise level, and a hidden tool called anyway returns a `disabled_in_passive_mode` error.

When the headline says 21 tools, it means lookups. Count what the 2.36.1 code registers and you get 25 (mcp_server.py at v2.36.1). A client in passive mode sees 20 of them: 16 passive lookups, three tools over a local FollowTheMoney entity graph and `investigate_multi`. You can export that graph, walk out from one entity, or accept and reject suggested matches in a review queue. `investigate_multi` is different from the rest. It runs a whole Claude-driven investigation on up to 10 targets and saves a report for each.

Most lookups want a key for the service behind them. DNS, WHOIS, RDAP, GDELT, paste search and dork building need none. Neither do the IP and GitHub lookups, at a low rate limit.

What it needs

RuntimePython
Runs onmacOS, Windows, Linux
HaveIBeenPwnedPaid planKey for search_breach.
ShodanFree tierKey for search_shodan.
VirusTotalFree tierKey for search_virustotal.
CensysFree tierAPI id and secret for search_censys.
AbuseIPDBFree tierKey for search_abuseipdb.
IP2Location.ioFree tierKey for search_ip2location; proxy, VPN and Tor flags need its Security plan.
Bright DataPaid planKey plus a SERP or Web Unlocker zone; every request is billed.
AnthropicPaid planOnly for investigate_multi.
Also
  • uv, so that uvx can run the package
  • holehe, sherlock, sublist3r or phoneinfoga on PATH for the active tools

Install uv so that `uvx` can fetch and run the package, or use `pip install openosint`. Each paid lookup needs its own key from that service. `graph_export` needs `pip install "openosint[graph]"`, which builds PyICU and so needs libicu and a C++ compiler.

Limits

  • Not covered Each lookup without its key returns an error instead of data, and a missing external binary breaks only its own tool.
  • Rate limit investigate_multi takes at most 10 targets under one shared 30-call cap (OPENOSINT_MAX_TOOL_CALLS_MULTI). Tools the client calls directly are not capped.
  • Cost Bright Data bills each request: search_dorks_live runs 5 dorks by default, search_footprint 3 queries unless max_queries is set.
  • Limit Timeouts are set in the server code: 180 seconds for sherlock, 120 for holehe and sublist3r, 60 for phoneinfoga and scrape_url, 10 to 30 for the API lookups.
  • Not covered The A-F external exposure report, whose TLS and header checks connect to the target on port 443, is a CLI command (openosint exposure) and not one of the MCP tools.
  • Limit The registry entry marks ANTHROPIC_API_KEY as required, but the MCP server starts without it and only investigate_multi uses it.
  • Limit GUI clients may not find uvx on PATH. Its docs say to give the absolute path.
  • Limit Its makers state it is for legal, authorized use only.

Tools with no key return an error rather than data; a missing external binary makes only its tool fail. `investigate_multi` takes at most 10 targets and shares a 30-call cap (`OPENOSINT_MAX_TOOL_CALLS_MULTI`); single tools called by the client are not capped by the server. Bright Data calls are billed per request: `search_dorks_live` runs 5 dorks by default and `search_footprint` up to 3 queries (max_queries). The registry entry marks ANTHROPIC_API_KEY as required, but the MCP server starts without it and only `investigate_multi` uses it. GUI clients may not find `uvx` on PATH; the docs say to give its absolute path. Its makers state it is for legal, authorized use only.

Who it suits

Security researchers, threat-intel analysts and pentesters on an authorized engagement who want an MCP client to pivot across breach, DNS, registry, IP-reputation and code-host data without wiring each API by hand. Passive mode by default makes it a reasonable fit where touching the target must be avoided, but passive is not private: every queried provider sees the search. It runs locally, not as a hosted service, and needs your own keys for most paid sources; someone who only wants one service, such as Shodan alone, may prefer a server for that service. Not a fit for monitoring your own domain on a schedule: its makers point to their separate hosted OpenOSINT Monitor for that.

Tools 25

23 only read, 2 change things. A ? marks an optional parameter.

search_breach
Check an email address against HaveIBeenPwned breach data (needs HIBP_API_KEY).email: stringjson_output?: boolean
search_whois
Look up a domain's WHOIS registrant and registrar details.domain: stringjson_output?: boolean
search_rdap
Fetch registrar, dates, name servers and status for a domain over RDAP, no key needed.domain: stringjson_output?: boolean
search_dns
Read A, AAAA, MX, NS, TXT, CNAME and SOA records and grade SPF, DMARC and DKIM; DKIM selector probing only in active mode.domain: stringjson_output?: boolean
search_ip
Geolocate an IP and return its ASN and hostname via ipinfo.io.ip: stringjson_output?: boolean
search_ip2location
Get IP2Location.io data for an IP, including proxy, VPN and Tor flags on the matching plan.ip: stringjson_output?: boolean
search_abuseipdb
Get an IP's abuse confidence score and report history from AbuseIPDB.ip: stringjson_output?: boolean
search_shodan
Read Shodan's index for an IP's open ports, banners and CVEs, or run a keyword search.query: stringjson_output?: boolean
search_censys
Query Censys for an IP's exposed services or a domain's certificates.target: stringjson_output?: boolean
search_virustotal
Get VirusTotal verdicts for an IP, domain, URL or file hash; URL submission only in active mode.target: stringjson_output?: boolean
search_github
Look up a GitHub user's profile, repositories and emails seen in commits, or search users and repos.query: stringjson_output?: boolean
search_paste
Search psbdmp.ws for paste dumps that mention a term.query: stringjson_output?: boolean
search_gdelt_geo
Filter recent GDELT news locally and return matching stories with places as GeoJSON.query: stringtimespan?: integermaxpoints?: integerbbox?: arrayjson_output?: boolean
generate_dorks
Build a set of Google dork search URLs for a target without any network call.target: stringjson_output?: boolean
search_dorks_live
Run dork queries through Bright Data's SERP API and return titles, links and snippets.target: stringjson_output?: boolean
search_footprint
Detect the kind of target and run a few Google searches through Bright Data to map its public footprint.target: stringmax_queries?: integerjson_output?: boolean
graph_export
Export the local entity graph as FollowTheMoney JSON lines, optionally leaving out datasets.exclude_datasets?: arrayjson_output?: boolean
graph_neighbors
Walk the local entity graph out from one entity and return linked entities with provenance.entity_id: stringdepth?: integercross_layer?: booleanjson_output?: boolean
graph_review_candidates changes
List suggested same-entity matches in the local graph, or record an accept or reject decision on one.action: enumschema?: enummin_score?: numbermax_score?: numberdataset?: stringentity_id?: stringcanonical_id?: stringdecision?: enumreviewer_id?: stringjson_output?: boolean
investigate_multi changes
Run a Claude-driven investigation on up to 10 targets and write a report for each (needs ANTHROPIC_API_KEY).targets: array
search_email
Active mode only: probe many sites with holehe for accounts tied to an email address.email: stringjson_output?: boolean
search_username
Active mode only: check hundreds of sites with sherlock for a username.username: stringjson_output?: boolean
search_domain
Active mode only: enumerate subdomains with sublist3r.domain: stringjson_output?: boolean
search_phone
Active mode only: run phoneinfoga for a phone number's carrier, country and line type.phone: stringjson_output?: boolean
scrape_url
Active mode only: fetch a page through Bright Data Web Unlocker and return it as Markdown.url: stringjson_output?: boolean

Similar servers