GitHits
OFFICIAL SERVERSearch, read and inspect public open-source packages and repositories from a coding agent
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
Opens the app, which asks before it adds the server.
claude mcp add openosint -- uvx --from openosint openosint-mcp{
"mcpServers": {
"openosint": {
"command": "uvx",
"args": [
"--from",
"openosint",
"openosint-mcp"
]
}
}
}{
"mcpServers": {
"openosint": {
"command": "uvx",
"args": [
"--from",
"openosint",
"openosint-mcp"
]
}
}
}{
"servers": {
"openosint": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"openosint",
"openosint-mcp"
]
}
}
}[mcp_servers.openosint]
command = "uvx"
args = ["--from", "openosint", "openosint-mcp"]gemini mcp add --scope user openosint uvx -- --from openosint openosint-mcpHIBP_API_KEY secret |
Optional: HaveIBeenPwned key for search_breach. |
|---|---|
SHODAN_API_KEY secret |
Optional: Shodan key for search_shodan. |
VIRUSTOTAL_API_KEY secret |
Optional: VirusTotal key for search_virustotal. |
ABUSEIPDB_API_KEY secret |
Optional: AbuseIPDB key for search_abuseipdb. |
IP2LOCATION_API_KEY secret |
Optional: IP2Location.io key for search_ip2location. |
GITHUB_TOKEN secret |
Optional: Raises search_github's limit from 60 to 5000 requests an hour. |
ANTHROPIC_API_KEY secret |
Optional: Anthropic key used by investigate_multi. |
OPENOSINT_ALLOW_ACTIVE |
Optional: Set to 1 to list the noisy and target-touching tools, same as --allow-active. |
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. |
CENSYS_SECRET secret |
Optional: Censys secret for search_censys, used with CENSYS_API_ID. |
| 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). |
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.
| Runtime | Python |
|---|---|
| Runs on | macOS, Windows, Linux |
| HaveIBeenPwned | Paid planKey for search_breach. |
| Shodan | Free tierKey for search_shodan. |
| VirusTotal | Free tierKey for search_virustotal. |
| Censys | Free tierAPI id and secret for search_censys. |
| AbuseIPDB | Free tierKey for search_abuseipdb. |
| IP2Location.io | Free tierKey for search_ip2location; proxy, VPN and Tor flags need its Security plan. |
| Bright Data | Paid planKey plus a SERP or Web Unlocker zone; every request is billed. |
| Anthropic | Paid planOnly for investigate_multi. |
| Also |
|
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.
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.
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.
23 only read, 2 change things. A ? marks an optional parameter.
search_breachemail: stringjson_output?: booleansearch_whoisdomain: stringjson_output?: booleansearch_rdapdomain: stringjson_output?: booleansearch_dnsdomain: stringjson_output?: booleansearch_ipip: stringjson_output?: booleansearch_ip2locationip: stringjson_output?: booleansearch_abuseipdbip: stringjson_output?: booleansearch_shodanquery: stringjson_output?: booleansearch_censystarget: stringjson_output?: booleansearch_virustotaltarget: stringjson_output?: booleansearch_githubquery: stringjson_output?: booleansearch_pastequery: stringjson_output?: booleansearch_gdelt_geoquery: stringtimespan?: integermaxpoints?: integerbbox?: arrayjson_output?: booleangenerate_dorkstarget: stringjson_output?: booleansearch_dorks_livetarget: stringjson_output?: booleansearch_footprinttarget: stringmax_queries?: integerjson_output?: booleangraph_exportexclude_datasets?: arrayjson_output?: booleangraph_neighborsentity_id: stringdepth?: integercross_layer?: booleanjson_output?: booleangraph_review_candidates changesaction: enumschema?: enummin_score?: numbermax_score?: numberdataset?: stringentity_id?: stringcanonical_id?: stringdecision?: enumreviewer_id?: stringjson_output?: booleaninvestigate_multi changestargets: arraysearch_emailemail: stringjson_output?: booleansearch_usernameusername: stringjson_output?: booleansearch_domaindomain: stringjson_output?: booleansearch_phonephone: stringjson_output?: booleanscrape_urlurl: stringjson_output?: boolean