Back to Browse

OpenOSINT MCP Server

Developer ToolsUse Caution3.2MCP RegistryLocal
Free

Server data from the Official MCP Registry

AI-powered OSINT agent & MCP server. 16 tools: email, breach, IP, WHOIS, DNS, Shodan, GitHub & more.

About

AI-powered OSINT agent & MCP server. 16 tools: email, breach, IP, WHOIS, DNS, Shodan, GitHub & more.

Security Report

3.2
Use Caution3.2High Risk

OpenOSINT is a legitimate OSINT tool with appropriate permissions for its stated purpose, but has several security concerns that users should be aware of. The codebase appropriately uses environment variables for API keys and includes authorization disclaimers, but lacks input validation on tool parameters, has broad exception handling that could mask errors, and streams results to external APIs without explicit user consent warnings. The web server's CORS policy is overly permissive (allow_origins=["*"]), and there are no rate limiting or abuse prevention mechanisms despite tool outputs being accessible via HTTP. The architecture itself is sound, but defensive programming practices are insufficient for a tool intended for security research. Supply chain analysis found 13 known vulnerabilities in dependencies (0 critical, 3 high severity). Package verification found 1 issue.

3 files analyzed · 22 issues found

Security scores are indicators to help you make informed decisions, not guarantees. Always review permissions before connecting any MCP server.

Permissions Required

This plugin requests these system permissions. Most are normal for its category.

env_vars

Check that this permission is expected for this type of plugin.

HTTP Network Access

Connects to external APIs or services over the internet.

File System Read

Reads files on your machine. Normal for tools that analyze or process local data.

File System Write

Writes or modifies files on your machine. Check that this is expected for the tool.

process_spawn

Check that this permission is expected for this type of plugin.

system_info

Check that this permission is expected for this type of plugin.

What You'll Need

Set these up before or after installing:

Anthropic API key — required for the AI agent REPLRequired

Environment variable: ANTHROPIC_API_KEY

HaveIBeenPwned API key for breach detection (search_breach tool)Required

Environment variable: HIBP_API_KEY

ipinfo.io token for higher IP lookup rate limits (search_ip tool)Required

Environment variable: IPINFO_TOKEN

IP2Location API key for enhanced IP intelligence (search_ip2location tool)Required

Environment variable: IP2LOCATION_API_KEY

AbuseIPDB API key for IP abuse reputation checks (search_abuseipdb tool)Required

Environment variable: ABUSEIPDB_API_KEY

How to Install

Add this to your MCP configuration file:

{
  "mcpServers": {
    "io-github-sonotommy-openosint": {
      "env": {
        "HIBP_API_KEY": "your-hibp-api-key-here",
        "IPINFO_TOKEN": "your-ipinfo-token-here",
        "ABUSEIPDB_API_KEY": "your-abuseipdb-api-key-here",
        "ANTHROPIC_API_KEY": "your-anthropic-api-key-here",
        "IP2LOCATION_API_KEY": "your-ip2location-api-key-here"
      },
      "args": [
        "openosint"
      ],
      "command": "uvx"
    }
  }
}

Documentation

View on GitHub

From the project's GitHub README.

mcp-name: io.github.OpenOSINT/openosint

Release PyPI PyPI downloads License MIT MCP MCP Registry Sponsored by IP2Location Sponsored by TestMu AI

Hosted version — OpenOSINT Monitor. Weekly external checks of your domain's email authentication (SPF/DKIM/DMARC), TLS, security headers and lookalike domains. Ownership-verified; free for one domain. Prefer to run it yourself? Everything below is free and MIT-licensed.

Self-host (free, MIT)

pip install openosint
# Interactive AI REPL (default)
openosint

# Web interface
openosint web

# Direct tool (no AI)
openosint email target@example.com

Try the live demo → — bring your own Anthropic / OpenRouter / Ollama key, no signup.

Usage

Start the REPL and investigate any target — the agent decides which tools to run and chains them on findings:

openosint > investigate target@example.com

  -> generate_dorks('target@example.com')
  -> search_breach('target@example.com')
  Found in 2 breaches: LinkedIn (2016), Adobe (2013)

  -> search_github('johndoe99')   <- pivoted from breach findings
  Found: profile, 14 repos, commit-discovered emails

  Report saved -> reports/2026-05-11_14-32-11_report.md

Features

CapabilityDetails
AI tool chainingThe agent selects and chains tools based on findings; describe the target in plain language
21 modular toolsEmail, username, breach, WHOIS, RDAP, IP, subdomain, dorks, paste, phone, Shodan, VirusTotal, Censys, IP2Location, AbuseIPDB, GitHub, DNS, GDELT news geo, live dork search, URL scraping, SERP footprint
Three AI backendsAnthropic Claude (default), local Ollama, or any OpenAI-compatible endpoint (LiteLLM, vLLM, LM Studio, ...)
Native MCP serverPassive tools (20) exposed by default, all 25 with --allow-active (Passive by default); runs with uvx, no separate install
Parallel execution--parallel runs complementary tools concurrently via asyncio.gather()
ReportsPDF + Markdown auto-saved after every investigation (reportlab optional)
Session historyAll REPL sessions saved to ~/.openosint/history/; browse with openosint history
Web UIBrowser-based AI chat with streaming output, tool cards, light/dark theme

OpenOSINT globe view: an agent investigation triggered from a chat prompt lands as a point on an interactive 3D globe, clicking the point pivots into a follow-up investigation, and the new entity appears in the entity graph Investigation results land live on the globe — click a point to pivot. Watch the sharper MP4.

Legal Disclaimer: OpenOSINT is intended for legal and authorized use only. Users are solely responsible for ensuring their use complies with all applicable laws and regulations. The authors accept no liability for misuse. See DISCLAIMER.md.

Tools

ToolPowered byWhat it investigates
search_emailholeheSocial accounts linked to an email address (noisy, off by default)
search_usernamesherlockUsername presence across 400+ platforms (noisy, off by default)
search_breachHaveIBeenPwned v3 APIData breach exposure
search_whoispython-whoisDomain registrant and DNS info
search_ipipinfo.ioGeolocation, ASN, hostname
search_domainsublist3rSubdomain enumeration (noisy, off by default)
generate_dorksbuilt-in12 targeted Google dork URLs (no network calls)
search_pastepsbdmp.wsPastebin dump mentions
search_phonephoneinfogaCarrier, country, line type (unverified network behavior, off by default)
search_shodanShodan APIOpen ports, banners, CVEs
search_virustotalVirusTotal API v3Verdict from 70+ antivirus engines
search_ip2locationIP2Location.io APIEnhanced IP intel: VPN/Proxy/Tor/datacenter flags (sponsored)
search_censysCensys Search APIInternet-facing infrastructure, certificates
search_abuseipdbAbuseIPDB v2 APIIP abuse reputation: confidence score, reports, country, ISP
search_githubGitHub REST APIProfile, repos, commit-discovered emails, username/keyword search
search_dnsdnspython (built-in)A/AAAA/MX/NS/TXT/CNAME/SOA records; SPF, DMARC, DKIM analysis
search_rdapRDAP (IANA bootstrap, keyless)Registrar, registration/expiry dates, name servers, status; registrant contacts redacted by policy
search_gdelt_geoGDELT 15-minute GKG feed (keyless)Recent worldwide news placed on a map: headline, link, place; GeoJSON output
search_dorks_liveBright Data SERP APILive Google search results for dork queries (title, URL, snippet)
scrape_urlBright Data Web UnlockerFetch any URL bypassing Cloudflare/CAPTCHA — returns clean Markdown (touches the target, off by default)
search_footprintBright Data SERP APIEntity-type-aware public search-engine footprint: detects email/username/domain/phone/name and returns structured results + Entity Correlation Graph nodes/edges

Full per-tool documentation, CLI flags, and output formats: openosint.tech.

Passive by default

OpenOSINT starts in passive mode: agents and MCP clients are only offered tools that query third-party data sources or compute locally. Tools that touch the target's infrastructure, or that send many requests about the target from your IP, are off until you opt in. They are not just refused when called; they are not offered to the model at all, and an MCP client does not see them in tools/list.

LevelMeaning
passiveQueries third-party data sources or computes locally; sends no request from your machine to the target's own infrastructure. Standard DNS lookups are the one indirect exception: they reach the target's nameservers through your resolver (see search_dns).
touches targetMakes requests the target's infrastructure can see (their web server, DNS probes, or a service fetching their URL for you).
noisyHigh request volume, or requests to many third-party services about the target; expect rate limits, WAF blocks, and possible alerts.
unverifiedNetwork behavior not yet verified with a traffic capture; treated as non-passive.
inheritsA fan-out tool; it only runs what the current mode allows.

Passive is not private. Every third-party service you query sees what you searched for, and usually your API key or IP. Treat queries to Shodan, HIBP, VirusTotal, Bright Data and similar services as visible to those providers.

Enable active tools explicitly (each is labeled with its noise level):

WhereHow
CLI / REPLopenosint --allow-active …
Any processOPENOSINT_ALLOW_ACTIVE=1
Web UISettings → "Enable active tools" (loopback only)
MCP serveruvx --from openosint openosint-mcp --allow-active (or openosint-mcp --allow-active if installed), or set OPENOSINT_ALLOW_ACTIVE=1 in the client's env block

A publicly reachable or demo instance can never enable active tools, whatever the settings. If a disabled tool is requested anyway it returns a structured disabled_in_passive_mode result that says how to enable it.

Tool-call cap. Each user request is limited by OPENOSINT_MAX_TOOL_CALLS (default: 15 calls; each new message resets it). investigate_multi shares one cap across all targets (OPENOSINT_MAX_TOOL_CALLS_MULTI, default 30). When the cap is reached the investigation stops with an explicit message. An MCP client that drives the tools itself is not capped by the server; only investigate_multi is.

ToolLevelDefaultWhat it actually sends, and where
generate_dorkspassiveonBuilds Google search URLs locally; sends nothing.
graph_exportpassiveonReads the local graph database only.
graph_neighborspassiveonReads the local graph database only.
graph_review_candidatespassiveonReads the local graph database only.
investigate_graphinheritsonChains tools from a seed; in passive mode it routes only to passive tools.
investigate_multiinheritsonRuns one agent per target under a shared tool-call cap; passive unless active is enabled.
scrape_urltouches targetoffBright Data fetches the URL, so the target's server logs a request (from Bright Data's IP, not yours).
search_abuseipdbpassiveonOne request to api.abuseipdb.com.
search_breachpassiveonOne request to haveibeenpwned.com.
search_censyspassiveonCensys API; returns data Censys already holds.
search_dnspassiveonRecord lookups go through your DNS resolver; the target's nameservers see the resolver, not you. Active part: DKIM selector probes (enumeration) run only with active tools enabled.
search_domainnoisyoffsublist3r scrapes several search engines and aggregators from your IP; expect captchas and blocks.
search_dorks_livepassiveonGoogle results via Bright Data; the target is sent to those two services.
search_emailnoisyoffholehe probes many sites' sign-up/reset flows with the email from your IP; may notify the account owner or trigger security alerts.
search_footprintpassiveonUp to 3 Google queries via Bright Data; the target is sent to those two services.
search_gdelt_geopassiveonDownloads GDELT's public news feed and filters it locally; your search term never leaves your machine.
search_githubpassiveonA few requests to api.github.com.
search_ippassiveonOne request to ipinfo.io.
search_ip2locationpassiveonOne request to api.ip2location.io.
search_pastepassiveonOne request to psbdmp.ws.
search_phoneunverifiedoffRuns phoneinfoga; what it sends over the network has not been verified with a traffic capture.
search_rdappassiveonQueries IANA and the registry's RDAP server, not the target.
search_shodanpassiveonShodan API; reads Shodan's existing index, requests no new scan.
search_usernamenoisyoffsherlock sends requests from your IP to hundreds of sites; expect rate limits and WAF blocks.
search_virustotalpassiveonIP, domain and hash lookups read VirusTotal's existing data. URL submission is a separate active mode, off by default: it makes VirusTotal fetch the URL and makes it visible to the VirusTotal community.
search_virustotal (URL submission)touches targetoffVirusTotal fetches the submitted URL, and the URL becomes visible to the VirusTotal community, which can reveal your investigation.
search_whoispassiveonQueries the registry/registrar WHOIS server, not the target.

The Apify Actors in actors/ are separate products with their own documented behavior (they are not governed by passive mode); see each Actor's README.

This table says what each tool does according to its code. It is not a guarantee about what a remote service, or a third-party binary such as holehe, sherlock, sublist3r or phoneinfoga, does with a request.

search_email

Enumerates online services linked to an email address using holehe.

openosint email target@example.com
[+] Spotify        https://open.spotify.com/user/target
[+] WordPress      https://wordpress.com/target
[+] Gravatar       https://gravatar.com/target
[+] Office365      email used

search_username

Searches for a username across 400+ platforms using sherlock.

openosint username johndoe99
[+] GitHub         https://github.com/johndoe99
[+] Twitter        https://twitter.com/johndoe99
[+] Reddit         https://reddit.com/user/johndoe99

search_breach

Checks data breach exposure via HaveIBeenPwned v3 API. Requires HIBP_API_KEY.

[+] LinkedIn (2016-05-05) — leaked: Email addresses, Passwords
[+] Adobe (2013-10-04) — leaked: Email addresses, Password hints

search_whois

Retrieves WHOIS data using python-whois.

[+] Registrar: ICANN
[+] Created: 1995-08-14
[+] Expires: 2024-08-13
[+] Name Servers: A.IANA-SERVERS.NET

search_ip

Retrieves geolocation and ASN data via ipinfo.io. Free tier: 50k/month.

[+] Hostname: dns.google
[+] Org: AS15169 Google LLC
[+] City: Mountain View, CA, US

search_domain

Enumerates subdomains using sublist3r.

[+] mail.example.com
[+] dev.example.com
[+] api.example.com

generate_dorks

Generates 12 targeted Google dork URLs for any target. No network calls.

[+] "johndoe" site:linkedin.com
    https://www.google.com/search?q=%22johndoe%22+site%3Alinkedin.com
[+] "johndoe" leaked OR breach OR dump
    https://www.google.com/search?q=%22johndoe%22+leaked+OR+breach+OR+dump

search_paste

Searches Pastebin dumps via psbdmp.ws.

[+] https://pastebin.com/aB1cD2eF (2023-04-12)
[+] https://pastebin.com/xY3zA4bC (2022-11-08)

search_phone

Gathers phone intelligence using phoneinfoga. Use E.164 format.

[+] Country: United States
[+] Carrier: AT&T
[+] Line type: Mobile

search_shodan

IPv4 input → host lookup (open ports, org, CVEs). Any other query → banner/keyword search. Requires SHODAN_API_KEY.

openosint shodan 8.8.8.8
openosint shodan "apache port:80 country:DE"
[+] Org: Google LLC  |  Open ports: 53, 443

search_virustotal

Checks an IP, domain, URL, or file hash against VirusTotal's 70+ engines. Auto-detects input type. Requires VIRUSTOTAL_API_KEY.

openosint virustotal 8.8.8.8
openosint virustotal example.com
openosint virustotal 44d88612fea8a8f36de82e1278abb02f
[VirusTotal] Malicious: 0 / Harmless: 72

search_ip2location

Queries IP2Location.io for enhanced IP intelligence: geolocation, ISP, ASN, and — on the Security Plan — VPN/Proxy/Tor/datacenter detection. Sponsored integration. Requires IP2LOCATION_API_KEY.

openosint ip2location 8.8.8.8
[IP2Location] City: Mountain View, CA, US  |  ISP: Google LLC
[IP2Location] VPN: No  |  Proxy: No  |  TOR: No  |  Datacenter: Yes

search_censys

IPv4 → host view (open ports, services, ASN). Domain → certificate search (SANs, issuer). Requires CENSYS_API_ID and CENSYS_SECRET.

openosint censys 8.8.8.8
openosint censys example.com
[Censys] Open Ports: 53, 443, 853  |  ASN: AS15169 Google LLC

search_abuseipdb

Checks an IP against AbuseIPDB v2. Returns abuse confidence score, total reports, country, ISP, and last reported timestamp. Requires ABUSEIPDB_API_KEY.

openosint abuseipdb 198.51.100.1
[AbuseIPDB] Abuse Confidence Score: 87%  |  Total Reports: 143
⚠️  HIGH ABUSE CONFIDENCE — flagged by AbuseIPDB

Warning appears when abuseConfidenceScore exceeds 50%.

search_github

Queries GitHub REST API. Username → profile, repos, commit-discovered emails. Keyword → user/repo search. Optional GITHUB_TOKEN raises rate limit from 60 to 5000 req/h.

openosint github johndoe99
[GitHub] Repos: 42  |  Followers: 128
[GitHub] Commit email: johndoe@example.com

search_dns

Queries A/AAAA/MX/NS/TXT/CNAME/SOA records and analyzes SPF, DMARC, and DKIM configuration using dnspython (no external API).

openosint dns example.com
[DNS] A: 93.184.216.34
[DNS] MX: mail.example.com (priority 10)
[DNS] SPF: v=spf1 include:_spf.google.com ~all

search_rdap

Looks up a domain's registrar, registration and expiry dates, name servers and status codes over RDAP, the machine-readable successor to WHOIS. Keyless: it asks the IANA bootstrap registry which server owns the TLD, then queries that server. Registrant contact details are redacted by registry policy and are never returned.

[+] Registrar: RESERVED-Internet Assigned Numbers Authority
[+] Registered: 1995-08-14T04:00:00Z
[+] Name servers: elliott.ns.cloudflare.com, hera.ns.cloudflare.com

search_gdelt_geo

Recent, geolocated worldwide news. The old GDELT GEO 2.0 API was retired (it answers HTTP 404), so this tool reads GDELT's 15-minute GKG article feed (data.gdeltproject.org, keyless, no account) and keeps the last 6 hours of articles in memory. Each article carries its headline, link and the places it mentions; the query is matched against headlines and URLs (quoted phrases and OR work; * means everything), and results are grouped by place for the globe. Country-level mentions are dropped so dots mark cities and regions, not the middle of a country.

Nothing is downloaded until the tool is first used, so a local install that never opens the globe never fetches a GDELT file. The first search loads only the newest 15-minute file and answers from it; older files load in the background, and the result (and the globe) says how far back it covers, for example News: last 15 min — older articles still loading. After that, upstream traffic is one small file per 15 minutes however many searches you run.

GDELT geolocated news for 'ukraine': 53 location(s), 471 article mention(s). Coverage: the last 6 h.

[+] Kyiv, Kyyiv, Ukraine (50.4333, 30.5167) — 38 article(s)

Select an area on the globe (Shift+drag) to search only inside it. Failures (feed down, oversized or corrupt file) return one [service_unavailable] search_gdelt_geo result, and the globe shows a notice instead of an empty layer.

VariableDefaultPurpose
OPENOSINT_GDELT_WINDOW_HOURS6How far back articles are kept (1–24). A full 6-hour window holds roughly 23,000 articles and adds about 65 MB of memory.
OPENOSINT_GDELT_MAX_ARTICLES30000Hard cap on stored articles; the oldest are dropped first.
OPENOSINT_GDELT_USE_PROXYoffRoute GDELT downloads through OPENOSINT_PROXY_URL (bypassed by default: the feed is public).

Attribution and terms. News data: The GDELT Project. GDELT's terms of use say: "all datasets released by the GDELT Project are available for unlimited and unrestricted use for any academic, commercial, or governmental use of any kind without fee." and "any use or redistribution of the data must include a citation to the GDELT Project and a link to this website (https://www.gdeltproject.org/)." (quoted 2026-10-06). The globe keeps the GDELT credit in its map attribution. Headlines and links come from third-party news sites and are shown as plain text.

search_dorks_live

Executes live Google dork queries through the Bright Data SERP API¹, returning structured results (title, URL, snippet). Defaults to 5 dorks per run; each is a separate billable API call. Requires BRIGHTDATA_API_KEY and BRIGHTDATA_SERP_ZONE.

openosint search-dorks-live "john doe" --max-dorks 3
[+] Dork: "john doe" site:linkedin.com
    Title:   John Doe | LinkedIn
    URL:     https://www.linkedin.com/in/john-doe-12345

scrape_url

Fetches any public URL through Bright Data Web Unlocker¹, bypassing Cloudflare/CAPTCHA. Returns clean Markdown. Requires BRIGHTDATA_API_KEY and BRIGHTDATA_UNLOCKER_ZONE.

openosint scrape https://example.com
[Web Unlocker] Remote status: 200
# Example Domain
This domain is for use in illustrative examples in documents.

search_footprint

Collects a target's public search-engine footprint via Bright Data SERP API¹. Detects entity type (email, username, domain, phone, or full name) and runs entity-type-aware Google queries, returning structured results plus Entity Correlation Graph nodes/edges for discovered domains and profiles. Requires BRIGHTDATA_API_KEY and BRIGHTDATA_SERP_ZONE.

openosint footprint johndoe99

Graph module (optional)

An additive FollowTheMoney entity graph — statement-level provenance, an append-only store, non-destructive same_as deduplication, and a human review queue — sits alongside the tools above without changing anything about them. The store, the /graph page, the /api/graph/* routes and the graph_neighbors / graph_review_candidates MCP tools work in a plain uvx openosint web install, with no compiler and no extra. The graph extra (pip install "openosint[graph]", builds PyICU) adds the real FollowTheMoney library: graph_export and .ftm export. The graph-dedup extra (Python 3.11+) adds same_as scoring. Without the extra, ids are produced by a vendored copy that a CI test proves byte-identical to FollowTheMoney's, so a graph.db is readable either way. Nothing in the web UI or the agent writes to this store: it is filled through the Python API (see docs/graph.md for the full guide and a worked example); the GRAPH tab in the main UI is a separate, client-side view of the current chat.

The same workflow is shown end to end — including the .ftm export that passes ftm validate — in the terminal demo in docs/graph.md; the web UI walkthrough is the demo at the top of this README.


External exposure report (beta)

openosint exposure checks one domain from the outside and gives it an A-F grade. It is passive and point-in-time: organisation-level checks of email authentication, TLS, domain registration and security headers, plus optional lookalike domains. No AI provider or API key is needed.

openosint exposure example.com                       # terminal summary and grade
openosint exposure example.com --json                # structured JSON
openosint exposure example.com --report out.html --lang it   # self-contained HTML report (it or en)
openosint exposure example.com --lookalikes          # also look for registered typo/homoglyph/TLD-swap domains
openosint exposure example.com --resolver 1.1.1.1    # recursive resolver for lookups outside the domain's own nameservers
openosint exposure example.com --checks email,registration   # passive checks only: never contacts the target

--checks takes any of email, registration, tls, http_headers (default: all four). A selection is not graded: the report has no letter and no score, because a grade from some of the checks would read like a full result. In Python: run_exposure("example.com", checks=PASSIVE_CHECKS) (both names import from openosint.exposure.api); the report's not_run lists what was left out.

CheckNoise levelWhat it contacts
Email authentication (SPF, DMARC, DKIM, MX)passiveDNS only
Domain registration (age, expiry, DNSSEC)passiveRDAP registry, not the target
Lookalike domains (--lookalikes)passiveDNS only; no lookalike web server is ever contacted
TLS certificate and protocoltouches targetA TLS handshake with the target on port 443 (the domain and www)
Security headerstouches targetOne HTTPS GET to https://DOMAIN/ (redirects are followed)

It does not scan ports, log in to anything, or collect personal data. The grade is not a certification and not proof of NIS2 or any other compliance. Lookalikes are found by DNS only and are never part of the grade.

This feature is beta: checks, scoring and the report format may change between releases. The HTML report footer shows its report_version.


Interfaces

Web UI

uvx openosint web
# or: pip install openosint && openosint web
# Opens http://localhost:8080 automatically

Browser-based AI chat with streaming tool output, inline result cards, light/dark theme toggle. Supports local inference via Ollama or any OpenAI-compatible endpoint — no Anthropic API key required.

Which hosts and sites may talk to the server. On a loopback bind the server only answers requests whose Host is 127.0.0.1, localhost or ::1. Every /api/* request from a browser must come from the UI's own origin; cross-site requests are refused (scripts and curl, which send no Origin, are unaffected).

VariableUse it when
OPENOSINT_ALLOWED_HOSTSYou reach the UI by another name (LAN name, Docker hostname, reverse proxy), e.g. OPENOSINT_ALLOWED_HOSTS=osint.lan,localhost. Comma-separated; host or host:port. On a non-loopback bind (--allow-remote, Docker) the Host check only runs when this is set, so set it there.
OPENOSINT_ALLOWED_ORIGINSA separate front end on another origin calls the API, e.g. OPENOSINT_ALLOWED_ORIGINS=http://localhost:3000. Comma-separated.
# Fully local (no API key) — requires Ollama runtime: https://ollama.com
ollama pull llama3.2
openosint web
# Settings -> Ollama (local) -> model: llama3.2

# OpenAI-compatible endpoint (LiteLLM, vLLM, LM Studio, ...)
export OPENAI_BASE_URL="http://localhost:4000/v1"
openosint web
# Settings -> OpenAI API

Breaking change (v2.28+): key usage now follows bind address, not an env var. Bound to 127.0.0.1/localhost (the default) — no change: keys in your .env work as before. Bound to any other interface (--host 0.0.0.0, which already requires --allow-remote) — the web UI never uses a key from your environment to serve a request; every caller must supply their own, and breach lookups (search_breach) are disabled outright. This applies regardless of any env var, including OPENOSINT_DEMO_MODE, which can only add restriction, never remove it. If you were exposing the web UI on a LAN with your own keys and no per-caller auth in front of it, that access pattern no longer works.

Running behind a reverse proxy? A loopback bind (127.0.0.1) only means the OS accepted the connection from this machine — it says nothing about who can reach it if something in front (nginx, Caddy, a Docker/K8s sidecar, a tunnel) forwards requests to it from elsewhere. By default, a request that carries proxy-forwarding headers (X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Host, Forwarded, CF-Connecting-IP) is treated exactly like a non-loopback bind: your local keys are never used, breach lookups are blocked, and the caller is told why. If you deliberately serve this through a reverse proxy and want it to behave like a normal local instance for requests relayed by that proxy, set OPENOSINT_TRUSTED_PROXY=true. This is a separate variable from the existing TRUSTED_PROXY (which only affects which IP a rate-limit bucket is attributed to — a low-stakes, already-loosely-scoped setting some self-hosters already have on). Reusing that flag here would have silently upgraded an existing rate-limit-only configuration into one that also permits credentialed access, without asking. OPENOSINT_TRUSTED_PROXY gets its own explicit opt-in for that reason. Setting it does not blindly trust the forwarded headers' content — internally inconsistent values (e.g. two disagreeing X-Forwarded-Proto values on one request) are still treated as public regardless. Setting OPENOSINT_TRUSTED_PROXY=true means you are choosing to serve credentialed lookups to whoever your reverse proxy relays to this instance — you are the controller for their queries, the same way OpenOSINT Cloud is for its customers. Put real authentication in front of it if "whoever the proxy relays" is broader than you intend.

Interactive REPL

Run openosint with no arguments to start the AI-powered REPL:

REPL commands:

CommandDescription
<target>Investigate any target — email, username, domain, IP, name
clearReset conversation memory
saveSave last report to reports/
toolsList available tools and their status
configShow current configuration
historyBrowse saved sessions
helpShow all commands
exit / Ctrl-DExit

All sessions are auto-saved to ~/.openosint/history/. Browse with openosint history.

For the REPL/CLI with an OpenAI-compatible backend:

pip install "openosint[openai]"
openosint --provider openai \
  --openai-base-url http://localhost:4000/v1 \
  --openai-model gpt-4o-mini

Live Documentation

Full per-tool reference, CLI flags, and configuration options at openosint.tech.

MCP Server

Expose OpenOSINT to any MCP-compatible AI client with no separate install step. uv must be installed; uvx then fetches and runs openosint on demand. The server offers the 20 passive tools by default and 25 with --allow-active (see Passive by default).

The command every client runs is the same:

uvx --from openosint openosint-mcp   # passive tools only (20 listed)

GUI clients (Claude Desktop, Cursor) often launch with a minimal PATH that does not include uvx. If the server fails to start, replace "uvx" with the absolute path from which uvx (macOS/Linux) or where uvx (Windows).

Claude Code:

claude mcp add openosint -- uvx --from openosint openosint-mcp
claude mcp list

Add API keys (-e flags go before the --):

claude mcp add openosint -e SHODAN_API_KEY=your-key -e HIBP_API_KEY=your-key -- uvx --from openosint openosint-mcp

Optional, enables active tools: append --allow-active after openosint-mcp, or add -e OPENOSINT_ALLOW_ACTIVE=1. This exposes the noisy and target-touching tools (25 listed instead of 20); see the noise table first.

Claude Desktop — edit claude_desktop_config.json, then restart the app:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "openosint": {
      "command": "uvx",
      "args": ["--from", "openosint", "openosint-mcp"],
      "env": {
        "SHODAN_API_KEY": "your-key",
        "HIBP_API_KEY": "your-key"
      }
    }
  }
}

Optional, enables active tools: add "--allow-active" to args, or add "OPENOSINT_ALLOW_ACTIVE": "1" to env. This exposes the noisy and target-touching tools (25 listed instead of 20); see the noise table first.

Cursor — add the same block to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per project); the optional active-tools change above applies here too:

{
  "mcpServers": {
    "openosint": {
      "command": "uvx",
      "args": ["--from", "openosint", "openosint-mcp"],
      "env": { "SHODAN_API_KEY": "your-key" }
    }
  }
}

API keys go in the client's env block. MCP hosts launch the server with a cwd unrelated to your project, so a .env file is not picked up reliably; to use one, set "OPENOSINT_ENV_FILE": "/absolute/path/to/.env" in the same env block.

By default the server lists passive tools only, so a client LLM cannot see the noisy ones. Each tool description carries its noise label. Pin a release with --from openosint==2.36.0. Running from a source checkout instead: "command": "python", "args": ["-m", "openosint.mcp_server"].

Agentic use via Claude Code:

$ claude
> Investigate target@example.com. Trace any username found
  across other platforms and compile a full report.

Installation

Quickstart — web UI in one command

Install uv once. It runs OpenOSINT in its own isolated environment, so there is no Python setup:

# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Then start OpenOSINT (open a new terminal first if uvx is not found):

uvx openosint web

You should see:

[*] OpenOSINT x.y.z web server
[*] App  → http://127.0.0.1:8080/
[*] Data → /home/you/.openosint

Your browser opens automatically; if it doesn't, open http://127.0.0.1:8080/. No .env file and no API keys are needed to start — keyless tools work immediately, and AI chat needs a provider key (ANTHROPIC_API_KEY) or a local Ollama.

Want to…Do this
Use another portuvx openosint web --port 8081 (if 8080 is busy, OpenOSINT exits and tells you this)
Keep the browser closeduvx openosint web --no-browser
Find your dataGraph database and session history live in ~/.openosint/ (%USERPROFILE%\.openosint on Windows). Move it with OPENOSINT_HOME=/path; OPENOSINT_GRAPH_DB still overrides just graph.db.
Find reportsCLI and REPL reports are written to ./reports/ in the directory you ran openosint from. The web UI writes none.
Use the entity graph storeWorks with plain uvx openosint web, no compiler needed: the /graph page, /api/graph/*, and the graph_neighbors / graph_review_candidates MCP tools. graph_export (.ftm) needs the graph extra, which builds PyICU and so needs libicu and a C++ compiler first (Ubuntu: sudo apt install libicu-dev pkg-config g++; macOS: brew install icu4c pkg-config and export PKG_CONFIG_PATH="$(brew --prefix icu4c)/lib/pkgconfig"), then uvx --from "openosint[graph]" openosint web; or use Docker, which includes it. The store starts empty: it is filled through the Python API, not by the UI.

Alternatives

# pip (Python 3.10+)
pip install openosint
openosint web

# Updating
pip install --upgrade openosint

# From source
git clone https://github.com/OpenOSINT/OpenOSINT.git
cd OpenOSINT
pip install -e .

External binaries (must be in PATH):

BinaryPurposeInstall
holeheEmail account enumerationpip install holehe
sherlockUsername enumeration (400+ platforms)pip install sherlock-project
sublist3rSubdomain enumerationpip install sublist3r
phoneinfogaPhone number intelligenceDownload binary

If a binary is absent, the corresponding tool returns a descriptive error. All other tools remain operational.

Optional Python packages:

PackagePurposeInstall
ollamaLocal LLM backend (no API key)pip install "openosint[ollama]" (also requires Ollama runtime)
openaiOpenAI-compatible backendpip install "openosint[openai]"
shodanShodan API clientpip install "openosint[shodan]"
reportlabPDF report exportpip install "openosint[pdf]"
censysCensys API clientpip install "openosint[censys]"

Configuration

Documentation truncated — see the full README on GitHub.

Reviews

No reviews yet

Be the first to review this server!