openosint
OfficialSummary: This MCP server exposes OpenOSINT's passive OSINT investigation tools — lookups for emails, domains, IPs, usernames, news, and infrastructure — plus a FollowTheMoney entity graph and a multi-target agent orchestrator.
Breach & credential checks:
search_breach(HaveIBeenPwned),search_paste(Pastebin dumps),generate_dorks(local Google dork URL generation).Domain & DNS intel:
search_whois,search_rdap(structured registration data),search_dns(A/AAAA/MX/NS/TXT/CNAME/SOA plus SPF/DMARC/DKIM analysis).IP & infrastructure reputation:
search_ip(geolocation/ASN),search_ip2location(VPN/proxy/Tor/datacenter flags),search_abuseipdb(abuse score),search_shodan(ports, banners, CVEs),search_censys(services and certificates),search_virustotal(70+ AV engines; hash/domain/IP/URL lookups only).Identity & social footprinting:
search_github(profile, repos, commit-emails, keyword search),search_footprint(entity-type-aware SERP results plus graph nodes/edges),search_dorks_live(live Google dork results via Bright Data).News & geolocation:
search_gdelt_geo— recent geolocated worldwide news matched from GDELT's 15-minute feed, with bbox/timespan/maxpoints filtering and GeoJSON output.Entity graph (local store):
graph_neighbors(traverse entities/edges with provenance, optional cross-layer bridge links),graph_export(newline-delimited FtM JSON, optionally excluding datasets),graph_review_candidates(list and decide on suggestedsame_asmerges).Agent orchestration:
investigate_multi— runs the full tool chain on up to 10 targets in parallel, producing per-target and summary reports.Operational notes: all listed tools are passive (third-party or local data, no target contact); results commonly support a
json_outputflag; several tools require API keys (HIBP, Shodan, VirusTotal, Censys, AbuseIPDB, IP2Location, Bright Data) while WHOIS, RDAP, DNS, GitHub, paste, dorks, and GDELT work without keys.
Provides tools for searching GitHub profiles, repositories, and emails via the GitHub REST API.
Provides tools for checking files and domains against VirusTotal's database for security analysis.
mcp-name: io.github.OpenOSINT/openosint
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.comTry the live demo → — bring your own Anthropic / OpenRouter / Ollama key, no signup.
Related MCP server: OSINT Tools MCP Server
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.mdFeatures
Capability | Details |
AI tool chaining | The agent selects and chains tools based on findings; describe the target in plain language |
21 modular tools | Email, 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 backends | Anthropic Claude (default), local Ollama, or any OpenAI-compatible endpoint (LiteLLM, vLLM, LM Studio, ...) |
Native MCP server | Passive tools (20) exposed by default, all 25 with |
Parallel execution |
|
Reports | PDF + Markdown auto-saved after every investigation ( |
Session history | All REPL sessions saved to |
Web UI | Browser-based AI chat with streaming output, tool cards, light/dark theme |
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
Tool | Powered by | What it investigates |
| holehe | Social accounts linked to an email address (noisy, off by default) |
| sherlock | Username presence across 400+ platforms (noisy, off by default) |
| HaveIBeenPwned v3 API | Data breach exposure |
| python-whois | Domain registrant and DNS info |
| ipinfo.io | Geolocation, ASN, hostname |
| sublist3r | Subdomain enumeration (noisy, off by default) |
| built-in | 12 targeted Google dork URLs (no network calls) |
| psbdmp.ws | Pastebin dump mentions |
| phoneinfoga | Carrier, country, line type (unverified network behavior, off by default) |
| Shodan API | Open ports, banners, CVEs |
| VirusTotal API v3 | Verdict from 70+ antivirus engines |
| IP2Location.io API | Enhanced IP intel: VPN/Proxy/Tor/datacenter flags (sponsored) |
| Censys Search API | Internet-facing infrastructure, certificates |
| AbuseIPDB v2 API | IP abuse reputation: confidence score, reports, country, ISP |
| GitHub REST API | Profile, repos, commit-discovered emails, username/keyword search |
| dnspython (built-in) | A/AAAA/MX/NS/TXT/CNAME/SOA records; SPF, DMARC, DKIM analysis |
| RDAP (IANA bootstrap, keyless) | Registrar, registration/expiry dates, name servers, status; registrant contacts redacted by policy |
| GDELT 15-minute GKG feed (keyless) | Recent worldwide news placed on a map: headline, link, place; GeoJSON output |
| Bright Data SERP API | Live Google search results for dork queries (title, URL, snippet) |
| Bright Data Web Unlocker | Fetch any URL bypassing Cloudflare/CAPTCHA — returns clean Markdown (touches the target, off by default) |
| Bright Data SERP API | Entity-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.
Level | Meaning |
passive | Queries 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 |
touches target | Makes requests the target's infrastructure can see (their web server, DNS probes, or a service fetching their URL for you). |
noisy | High request volume, or requests to many third-party services about the target; expect rate limits, WAF blocks, and possible alerts. |
unverified | Network behavior not yet verified with a traffic capture; treated as non-passive. |
inherits | A 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):
Where | How |
CLI / REPL |
|
Any process |
|
Web UI | Settings → "Enable active tools" (loopback only) |
MCP server |
|
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.
Tool | Level | Default | What it actually sends, and where |
| passive | on | Builds Google search URLs locally; sends nothing. |
| passive | on | Reads the local graph database only. |
| passive | on | Reads the local graph database only. |
| passive | on | Reads the local graph database only. |
| inherits | on | Chains tools from a seed; in passive mode it routes only to passive tools. |
| inherits | on | Runs one agent per target under a shared tool-call cap; passive unless active is enabled. |
| touches target | off | Bright Data fetches the URL, so the target's server logs a request (from Bright Data's IP, not yours). |
| passive | on | One request to api.abuseipdb.com. |
| passive | on | One request to haveibeenpwned.com. |
| passive | on | Censys API; returns data Censys already holds. |
| passive | on | Record 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. |
| noisy | off | sublist3r scrapes several search engines and aggregators from your IP; expect captchas and blocks. |
| passive | on | Google results via Bright Data; the target is sent to those two services. |
| noisy | off | holehe probes many sites' sign-up/reset flows with the email from your IP; may notify the account owner or trigger security alerts. |
| passive | on | Up to 3 Google queries via Bright Data; the target is sent to those two services. |
| passive | on | Downloads GDELT's public news feed and filters it locally; your search term never leaves your machine. |
| passive | on | A few requests to api.github.com. |
| passive | on | One request to ipinfo.io. |
| passive | on | One request to api.ip2location.io. |
| passive | on | One request to psbdmp.ws. |
| unverified | off | Runs phoneinfoga; what it sends over the network has not been verified with a traffic capture. |
| passive | on | Queries IANA and the registry's RDAP server, not the target. |
| passive | on | Shodan API; reads Shodan's existing index, requests no new scan. |
| noisy | off | sherlock sends requests from your IP to hundreds of sites; expect rate limits and WAF blocks. |
| passive | on | IP, 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. |
| touches target | off | VirusTotal fetches the submitted URL, and the URL becomes visible to the VirusTotal community, which can reveal your investigation. |
| passive | on | Queries 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 usedsearch_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/johndoe99search_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 hintssearch_whois
Retrieves WHOIS data using python-whois.
[+] Registrar: ICANN
[+] Created: 1995-08-14
[+] Expires: 2024-08-13
[+] Name Servers: A.IANA-SERVERS.NETsearch_ip
Retrieves geolocation and ASN data via ipinfo.io. Free tier: 50k/month.
[+] Hostname: dns.google
[+] Org: AS15169 Google LLC
[+] City: Mountain View, CA, USsearch_domain
Enumerates subdomains using sublist3r.
[+] mail.example.com
[+] dev.example.com
[+] api.example.comgenerate_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+dumpsearch_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: Mobilesearch_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, 443search_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: 72search_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: Yessearch_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 LLCsearch_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 AbuseIPDBWarning 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.comsearch_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 ~allsearch_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.comsearch_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.
Variable | Default | Purpose |
|
| How far back articles are kept (1–24). A full 6-hour window holds roughly 23,000 articles and adds about 65 MB of memory. |
|
| Hard cap on stored articles; the oldest are dropped first. |
| off | Route GDELT downloads through |
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-12345scrape_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 johndoe99Graph 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.
Check | Noise level | What it contacts |
Email authentication (SPF, DMARC, DKIM, MX) | passive | DNS only |
Domain registration (age, expiry, DNSSEC) | passive | RDAP registry, not the target |
Lookalike domains ( | passive | DNS only; no lookalike web server is ever contacted |
TLS certificate and protocol | touches target | A TLS handshake with the target on port 443 (the domain and |
Security headers | touches target | One HTTPS GET to |
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 automaticallyBrowser-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).
Variable | Use it when |
| You reach the UI by another name (LAN name, Docker hostname, reverse proxy), e.g. |
| A separate front end on another origin calls the API, e.g. |
# 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 APIBreaking 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.envwork 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, includingOPENOSINT_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, setOPENOSINT_TRUSTED_PROXY=true. This is a separate variable from the existingTRUSTED_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_PROXYgets its own explicit opt-in for that reason. Setting it does not blindly trust the forwarded headers' content — internally inconsistent values (e.g. two disagreeingX-Forwarded-Protovalues on one request) are still treated as public regardless. SettingOPENOSINT_TRUSTED_PROXY=truemeans 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:
Command | Description |
| Investigate any target — email, username, domain, IP, name |
| Reset conversation memory |
| Save last report to |
| List available tools and their status |
| Show current configuration |
| Browse saved sessions |
| Show all commands |
| Exit |
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-miniLive 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 listAdd 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-mcpOptional, enables active tools: append
--allow-activeafteropenosint-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.jsonWindows:
%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"toargs, or add"OPENOSINT_ALLOW_ACTIVE": "1"toenv. 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 webYou should see:
[*] OpenOSINT x.y.z web server
[*] App → http://127.0.0.1:8080/
[*] Data → /home/you/.openosintYour 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 port |
|
Keep the browser closed |
|
Find your data | Graph database and session history live in |
Find reports | CLI and REPL reports are written to |
Use the entity graph store | Works with plain |
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):
Binary | Purpose | Install |
| Email account enumeration |
|
| Username enumeration (400+ platforms) |
|
| Subdomain enumeration |
|
| Phone number intelligence |
If a binary is absent, the corresponding tool returns a descriptive error. All other tools remain operational.
Optional Python packages:
Package | Purpose | Install |
| Local LLM backend (no API key) |
|
| OpenAI-compatible backend |
|
| Shodan API client |
|
| PDF report export |
|
| Censys API client |
|
Configuration
Easiest: open the web UI. On a local install, Settings saves your keys on this
computer by default ("Save on this computer"), as does the first-run panel; "Use only
for this browser session" is a secondary option that keeps a key in the tab only. On the
public demo, keys stay in the browser. Keys are written to config.env in the data directory
(~/.openosint/config.env, or $OPENOSINT_HOME/config.env), never inside the
installed package, with user-only permissions (0600) where the OS supports it.
Values are never logged or sent back to the browser; the UI only shows which keys
are configured and where each value came from.
Precedence, highest first:
real environment variables (a saved value cannot override one; the UI says so)
config.envin the data directorya legacy
.env(the locations below)
An existing .env keeps working. If the file at the package root (a source
checkout or Docker image) is the one that would be loaded, its known settings
are copied into config.env once, with a notice on stderr that names keys but
never values; the old file is left in place and now has lower priority.
For a file you manage yourself, copy .env.example to .env and fill in your keys. .env is read from the
directory you run openosint from (searched upward, like git finds
.git) — it does not need to be at any particular "project root", and a
regular pip install works the same way as running from a source checkout.
Set OPENOSINT_ENV_FILE=/path/to/.env to point at an explicit file instead
(useful for the MCP server, which is launched by its host with an arbitrary
working directory). A real environment variable always takes priority over
a value in .env.
Required below means required for that specific tool to run, not for openosint
itself — the app starts and every key-less tool works with zero configuration.
Variable | Tool | Required | Purpose |
| AI agent (REPL/Web UI) | Yes, unless using Ollama or an OpenAI-compatible endpoint | Anthropic API key |
| AI agent | Optional | Model name to request (default: |
| AI agent | Optional | Base URL of an OpenAI-compatible endpoint (e.g. |
| AI agent | Optional | API key for the endpoint (local servers may ignore it) |
| AI agent | Optional | Model name to request (default: |
|
| Optional | Hours of news kept in memory (default |
|
| Optional | Hard cap on stored articles (default |
| All | Optional | Explicit path to a |
| Web UI | Optional | Lets the browser save keys when it is not on loopback (Docker). Send as |
|
| Required for this tool | HaveIBeenPwned v3 — get one |
|
| Optional | Works without it; raises ipinfo.io rate limits |
|
| Required for this tool | Shodan API — get one |
|
| Required for this tool | VirusTotal API v3 — get one |
|
| Required for this tool | IP2Location.io — get one (sponsored) |
|
| Required for this tool | Censys — get one |
|
| Required for this tool | AbuseIPDB v2 — get one |
|
| Optional | Works without it (60 req/h); raises the limit to 5000 req/h — get one |
|
| Required for these tools | Bright Data — get one¹ (free tier: 5,000 req/month) |
|
| Required for these tools | Your Bright Data SERP zone name (e.g. |
|
| Required for this tool | Your Bright Data Web Unlocker zone name (e.g. |
On a fresh install with no keys at all, these still work: generate_dorks,
search_dns, search_whois, search_domain, search_email, search_username,
search_paste, search_phone, search_ip (rate-limited), search_github
(rate-limited), and search_gdelt_geo.
CLI Reference
Flag / Subcommand | Description |
| Interactive AI REPL (default) |
| Launch browser UI |
| Direct email scan |
| Direct username scan |
| Shodan lookup |
| VirusTotal lookup |
| Censys lookup |
| IP2Location lookup |
| AbuseIPDB reputation check |
| GitHub profile/repo/email discovery |
| DNS records + email security analysis |
| Live Google dork results via Bright Data |
| Fetch a URL via Bright Data Web Unlocker |
| SERP footprint via Bright Data |
| Parallel multi-target investigation (max 10) |
| External exposure report graded A-F (beta) |
| Run a deterministic investigation playbook (no AI) |
| View/manage REPL session history |
| Verify the configured upstream proxy |
| List current sponsors and featured integrations |
| Show info about the AI OSINT Prompt Pack |
| Explicit alias for the default REPL |
| Enable active tools (noisy or touch the target). Off by default; same as |
| Enable debug logging to stderr |
| Override subprocess timeout (seconds) |
| Anthropic API key (overrides env var) |
| Run complementary tools concurrently |
| Output results as structured JSON |
| AI provider (default: |
| Ollama model name (default: |
| Ollama server URL (default: |
| OpenAI-compatible endpoint base URL (env: |
| Model to request from the endpoint (default: |
| API key for the endpoint (env: |
| Disable automatic PDF generation |
Docker
# Build and run
docker compose up --build
# One-off command
docker compose run --rm openosint email target@example.com --json.env is optional: with no keys the web UI still starts at http://localhost:8080. To provide keys today, list them under environment: in docker-compose.yml (or in a .env next to it), or put a .env in the data volume (/data/.env). Reports are persisted to ./reports/; the graph database and session history live in the openosint-data volume (/data in the container, via OPENOSINT_HOME). The image includes the graph view.
Saving keys from the browser in Docker. The browser reaches the container over the Docker network, not loopback, so the UI cannot save keys by default and says so (it shows the reason instead of failing silently). Either set the keys in your compose environment or .env, or set a token and enter it in the UI's Save keys to server panel: OPENOSINT_SETUP_TOKEN=choose-a-long-random-string docker compose up. Saved keys go to /data/config.env in the openosint-data volume and survive restarts. Wrong tokens are throttled.
The port is published on 127.0.0.1 only, and the Host check is on (OPENOSINT_ALLOWED_HOSTS defaults to localhost,127.0.0.1 in the compose file; extend it if you reach the UI by another name). To reach it from other machines on purpose, run OPENOSINT_BIND=0.0.0.0 docker compose up: the instance then runs in restricted mode (it never spends keys held on the server). Security note: the UI's setup endpoint accepts and stores API keys, so only do this on a network and behind a firewall or reverse proxy you trust.
Warning:
OPENOSINT_PUBLISHED_BIND.docker-compose.ymlsets this to the same value asOPENOSINT_BINDto tell the server which address the port is published on; an exact loopback value (127.0.0.1,localhost,::1) lifts the restriction that a container's0.0.0.0bind otherwise gets. Never set it to a loopback value yourself, or edit the compose port mapping away from it, when the port is published on any other interface.
Integrations
Service | URL | Tool | Tier | Auth |
IP2Location.io |
| Featured (sponsored) | API key — free tier | |
AbuseIPDB |
| Community | API key — free tier | |
Censys |
| Community | API key — free tier | |
GitHub |
| Community | Token optional | |
HaveIBeenPwned |
| Community | API key — paid | |
holehe |
| Community | None — local binary | |
ipinfo.io |
| Community | Token optional | |
phoneinfoga |
| Community | None — local binary | |
psbdmp.ws |
| Community | None | |
sherlock |
| Community | None — local binary | |
Shodan |
| Community | API key — free tier | |
sublist3r |
| Community | None — local binary | |
VirusTotal |
| Community | API key — free tier | |
WHOIS (IANA) |
| Community | None | |
DNS (system resolver) | — |
| Community | None |
Google Search |
| Community | None |
Limitations
Authorized use only. OpenOSINT queries public and semi-public sources. It does not bypass authentication, exploit systems, or access anything you aren't already entitled to see. You are responsible for complying with the law and the terms of service of every source you query. See DISCLAIMER.md.
No aggregation guarantees. Each tool reports what its upstream source currently returns. A negative result (no breach found, no accounts found) means the source didn't report a match — not that no exposure exists.
Most tools depend on third-party services you don't control. Nine of the 21 tools hard-require an API key and are subject to that provider's uptime, rate limits, and pricing (Shodan, VirusTotal, Censys, AbuseIPDB, IP2Location, HaveIBeenPwned, and the three Bright Data–backed tools). Free tiers are small; heavy use requires a paid plan with the provider, not with OpenOSINT.
Local binaries are unsandboxed subprocesses.
holehe,sherlock,sublist3r, andphoneinfogarun as external processes on your machine. Keep them updated yourself; OpenOSINT does not patch or vet them.The entity graph module (
openosint[graph]) is additive, not authoritative.same_aslinks are scored candidates for human review, not verified identity matches — see docs/graph.md.AI output is a lead, not proof. The agent can only call the tools above (and, by default, only the passive ones). Tool results come from real executions and are shown with the tool call that produced them, but the model can still misread, misattribute or over-weight a result, and its tool selection can be wrong or incomplete for a given target. Check the raw tool output before acting on a conclusion.
Support & commercial
OpenOSINT is free and MIT-licensed. These are optional ways to support it or buy a hosted or contracted version.
Hosted monitoring: OpenOSINT Monitor, free for one domain.
Pay-per-use, no install (Apify Actors, also usable as MCP tools in Claude, Cursor and Windsurf): Email Recon (from $0.015/run) · Username Recon ($0.04/username) · Domain Recon ($0.02/domain). MCP endpoint:
https://mcp.apify.com?tools=complete_analogy/openosint-email-recon,complete_analogy/openosint-username-recon,complete_analogy/openosint-domain-recon. Cloud usage funds the self-hosted project.Newsletter: Agents & OSINT, one AI-OSINT workflow plus a roundup, weekly.
Guides: free 5-prompt starter set · AI OSINT Complete Kit, $55. Purchases fund development.
Sponsor: Open Collective · tiers and media kit in SPONSORSHIP.md · commercial@openosint.tech. Current sponsors are listed below.
Affiliate program: 30-45% commission on the guides above. Details & terms.
Commercial license & support: vendor contract, warranty, indemnification, SLA or priority support for procurement, from €300/year. The software itself needs no purchase. See COMMERCIAL.md or commercial@openosint.tech.
Featured Integrations
IP2Location.io — powers search_ip2location · Integration guide
Enhanced IP geolocation, ISP, VPN/Proxy/Tor, and datacenter detection
TestMu AI (formerly LambdaTest) is an AI-native testing cloud platform built for modern engineering teams. It covers everything from autonomous test creation and fast execution to testing AI agents, chatbots and voice assistants.
Open: Breach / Compromised-Credential Data · Email / Identity Lookup · Residential Proxies — see SPONSORSHIP.md.
Contributing
Issues and pull requests are welcome. See CONTRIBUTING.md for the development workflow, integration registration checklist, and coding conventions. Please read DISCLAIMER.md before contributing.
Regenerating the demo GIF/MP4
export OPENOSINT_DEMO_KEY=sk-ant-... # your Anthropic key — never committed
openosint web & # start the web server on :8080
make demo # record -> encode -> write docs/assets/demo-web-graph.*
git add docs/assets/demo-web-graph.*See scripts/record-demo/README.md for full prerequisites and pipeline details.
Maintainer
Tommaso Bertocchi
X (personal): https://x.com/SonoTommy_
X (OpenOSINT): https://x.com/openosint_oss
Email: commercial@openosint.tech
Contributors
Contributor | Contribution |
venv/uv-tool binary resolution fix — co-installed tools are now found without a separate activation step (#6) |
License
OpenOSINT is open source under the MIT License — free for any use, including personal, commercial, academic, and closed-source.
¹ Bright Data links in this README are affiliate/referral links — OpenOSINT earns a commission if you sign up through them, at no extra cost to you.
For authorized security research only. See DISCLAIMER.md.
OpenOSINT v2.36.0 — October 2026
Star History
Available Tools
20 toolsgenerate_dorksA
Generate targeted Google dork URLs for any target (name, email, username, domain). [passive] Builds Google search URLs locally; sends nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does disclose the most operationally important trait: URLs are built locally and nothing is transmitted, making the call safe and repeatable. It omits secondary traits such as how many dorks are produced, deduplication, or whether any file is written.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the purpose is front-loaded and the safety posture is appended compactly as "[passive] ... sends nothing." Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter URL generator with no output schema and no annotations, the description covers what it produces (dork URLs), the accepted inputs, and the local/no-network behavior. Minor gaps remain around output shape (list vs single URL) and result volume, but nothing critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: json_output is documented in the schema, but target is a bare string with no schema description. The description compensates by enumerating the accepted target forms (name, email, username, domain), which is exactly the missing semantics an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Generate targeted Google dork URLs") and enumerates the accepted target types (name, email, username, domain), so the agent knows exactly what the tool produces. It does not name the obvious sibling search_dorks_live, though the "[passive] ... sends nothing" note implicitly distinguishes local generation from a live query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by "for any target (name, email, username, domain)" and by the passive/local framing, which hints this is the safe pre-step before a live search. However, no explicit when-to-use condition or named alternative (e.g., search_dorks_live) is given, so the agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_exportA
Export the additive FollowTheMoney entity graph (openosint.graph) as newline-delimited JSON, one FtM entity per line (.ftm-compatible). Optionally exclude whole datasets, e.g. exclude_datasets=['openosint:hibp'] to omit every breach-derived fact. Requires the 'graph' extra: pip install 'openosint[graph]'. [passive] Reads the local graph database only.
| Name | Required | Description | Default |
|---|---|---|---|
| json_output | No | Return result as structured JSON. | |
| exclude_datasets | No | Dataset names to omit entirely, e.g. ['openosint:hibp']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely succeeds: it declares [passive], states it reads the local graph database only, specifies the install dependency, and explains what exclusion does (omit every breach-derived fact). It is silent on scale/streaming behavior for a potentially huge graph, which keeps it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and output format are front-loaded, and each subsequent sentence adds distinct value (exclusion semantics, dependency requirement, read-only scope). No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without annotations or an output schema, the description must supply the behavioral and output contract, and it does describe the line format and .ftm compatibility. Remaining gaps are secondary details like error behavior when the extra is missing or handling of very large graphs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description adds real meaning by giving a worked example for exclude_datasets ('openosint:hibp') and clarifying that whole datasets are omitted, including derived facts. json_output is left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export), a specific resource (the additive FollowTheMoney entity graph / openosint.graph), and the exact output format (newline-delimited JSON, one FtM entity per line). This is clearly distinguishable from the search_* and graph_neighbors siblings, which query rather than bulk-export.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Conveys usage context (bulk export for downstream .ftm tooling, reads the local DB only, needs the 'graph' extra) and a concrete exclusion example, but never states when to prefer this over graph_neighbors or graph_review_candidates, nor any when-not conditions. Usage is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_neighborsA
Traverse the FollowTheMoney entity graph from one entity id out to a given depth, returning entities, edges, and per-edge provenance (collection method, confidence, run id). Set cross_layer=true to also surface bridge links into the raw infra correlation graph (IPs, domains, hashes). Requires the 'graph' extra: pip install 'openosint[graph]'. [passive] Reads the local graph database only.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | Hops to traverse (default 1, capped at 5). | |
| entity_id | Yes | ||
| cross_layer | No | Include bridge links into the raw infra graph. | |
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and largely meets it: it marks the operation as passive, states it reads the local graph database only (no network), discloses the install-time dependency, and enumerates the return shape. It stops short of stating result-size limits, pagination, or what happens when the entity id is absent from the graph.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core traversal behavior before the cross_layer option, dependency note, and safety marker. Every clause carries information, though the closing '[passive]' fragment is terse to the point of being cryptic.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must cover returns, and it does by naming entities, edges, and the per-edge provenance fields. Combined with the dependency note and the cross_layer explanation, an agent has enough to invoke it correctly; only cardinality/limits are unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and entity_id has no schema description, so the description meaningfully compensates by identifying it as a FollowTheMoney entity id. It also enriches cross_layer beyond the schema's one-liner by naming what the bridge links actually are (IPs, domains, hashes), while depth's cap is already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (traverse), the exact resource (FollowTheMoney entity graph), the entry point (one entity id), the scope (to a given depth), and what comes back (entities, edges, per-edge provenance). This is clearly distinguishable from the search_* siblings, which are external lookups, and from graph_export/graph_review_candidates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one explicit conditional: set cross_layer=true to reach the raw infra correlation graph, and it notes the 'graph' extra prerequisite. However, it never routes the agent among the sibling graph tools (graph_export, graph_review_candidates) or explains when a neighbor traversal beats a fresh external search, leaving the core when-to-use decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_review_candidatesA
Human review queue for suggested same_as entity matches produced by graph-dedup cross-referencing. action='list' shows pending candidates (score, identifying properties, human-readable match explanation), filterable by schema/score range/dataset. action='decide' records a human verdict on one pair: decision='accept' merges it (judgement='positive'), decision='reject' permanently excludes it from future suggestions (judgement='negative'). Nothing in this project ever auto-merges — only this action can write judgement='positive'. [passive] Reads the local graph database only.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| schema | No | list filter: restrict to one FtM schema. | |
| dataset | No | list filter: either entity must carry a statement from this dataset. | |
| decision | No | ||
| entity_id | No | decide: first entity of the pair. | |
| max_score | No | list filter: maximum score. | |
| min_score | No | list filter: minimum score. | |
| json_output | No | Return result as structured JSON. | |
| reviewer_id | No | decide: reviewer identifier, recorded if given. | |
| canonical_id | No | decide: second entity of the pair. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does much of it: it discloses that 'accept' merges the pair, that 'reject' permanently excludes it from future suggestions (an irreversible side effect), and that nothing auto-merges. The trailing '[passive] Reads the local graph database only' tag sits awkwardly against the merge-write behavior of 'decide', and permissions/auth requirements and pagination are not covered, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by a tight action-by-action breakdown and a critical constraint sentence. It is dense but every sentence adds a fact an agent needs, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema and no annotations, the description covers actions, filters, verdict semantics and the no-auto-merge constraint well. Minor gaps remain: return shape is only sketched for 'list', and there is no mention of permissions, pagination, or the ambiguous '[passive]' classification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 80%, so the baseline is 3; the description adds real meaning on top by mapping filters (schema, score range, dataset) to the 'list' action and mapping entity_id/canonical_id/decision/reviewer_id to the 'decide' action. It also explains that decision='accept' means merge and 'reject' means permanent exclusion, which the bare enum values do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and role: a 'human review queue for suggested same_as entity matches' produced by graph-dedup. This clearly distinguishes it from the sibling search_* tools and from graph_export/graph_neighbors, so an agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description splits the tool by action and gives the condition for each: action='list' to browse pending candidates with filters, action='decide' to record a verdict. It also states the key selection fact that only this action can write judgement='positive'. It stops short of naming sibling alternatives to avoid (e.g. graph_neighbors for pure exploration), so it is strong but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
investigate_multiA
Investigate multiple targets in parallel using the full OSINT tool chain. Each target gets its own report file. A summary report is also generated. Maximum 10 targets. Uses ANTHROPIC_API_KEY env var. [inherits] Runs one agent per target under a shared tool-call cap; passive unless active is enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| targets | Yes | List of OSINT targets (emails, usernames, domains, IPs). Max 10. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses parallel execution, per-target report files plus a summary report, the 10-target cap, the ANTHROPIC_API_KEY requirement, a shared tool-call cap per agent, and passive-by-default behavior unless active is enabled. Gaps remain around failure handling and cost, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and packs behavioral detail into a compact block. The stray '[inherits]' token and the dense final sentence slightly reduce readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parallel orchestrator with no output schema, the description adequately covers outputs (per-target reports plus a summary), execution model, limits, and auth. Only error/failure behavior for individual targets is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single targets parameter, and the description's 'Maximum 10 targets' merely restates the schema's 'Max 10.' No additional syntax or format meaning is added, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (investigate), resource (multiple targets), and mode (parallel, full OSINT tool chain), which cleanly separates it from the single-target search_* and graph_* siblings. An agent can tell this is the batch orchestrator without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Maximum 10 targets' constraint implies batch usage, but the description never states when to prefer this over the granular search_* siblings or when not to use it (e.g., single-target cases). Usage is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_abuseipdbA
Check an IP address against the AbuseIPDB v2 API for abuse reputation. Returns abuse confidence score (0–100%), total reports, country, ISP, domain, and last reported timestamp. Shows a warning when score exceeds 50%. Uses ABUSEIPDB_API_KEY env var. [passive] One request to api.abuseipdb.com.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the auth requirement (ABUSEIPDB_API_KEY env var), the external call and its footprint ('[passive] One request to api.abuseipdb.com'), and a behavioral quirk (warning emitted when score exceeds 50%). It stops short of error/rate-limit behavior or what happens on an unknown IP.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the verb and source, then return values, then auth/footprint caveats. Nothing is padding; the bracketed tags are terse and information-dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly enumerates the returned fields and the warning threshold, and it covers the credential requirement and request footprint. Remaining gaps are minor (error cases, rate limits, IP format) for a single-parameter read-only lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50% (json_output documented, ip bare), so the description must compensate and largely does not. It never states the expected IP format (IPv4/IPv6/CIDR) or what json_output changes beyond the schema's own one-liner. 'Check an IP address' only weakly maps to the ip parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check an IP address') plus the exact data source ('AbuseIPDB v2 API for abuse reputation'), which is what separates it from the many other IP-oriented siblings (search_ip, search_virustotal, search_shodan, search_censys). An agent can tell which enrichment source it is getting without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the described return values (abuse score, reports, country, ISP), so an agent can infer this is the abuse-reputation lookup. However, it never states when to prefer this over search_virustotal or search_ip, nor any exclusions or prerequisites beyond the env var. The '[passive]' tag hints at OPSEC suitability but does not define a selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_breachA
Check if an email appears in data breaches via HaveIBeenPwned. Uses HIBP_API_KEY env var. [passive] One request to haveibeenpwned.com.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does add real behavioral context: it discloses the HIBP_API_KEY env var requirement, flags the operation as '[passive]', and notes it makes one request to haveibeenpwned.com. It stops short of describing error handling for unknown addresses or rate-limit behavior, but the auth and opsec disclosures are meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short fragments, front-loaded with the core purpose, then implementation constraints. Every clause earns its place; the bracketed '[passive]' and provider note are terse but load-bearing. Slightly telegraphic but efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description should say more about what a result looks like — breach names, counts, or a bare boolean — and about behavior on a miss. The auth and network context is covered, but the return shape is left entirely unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: json_output is documented in the schema while email is bare. The description implies the email is the lookup key but adds no format or validation guidance, and says nothing about json_output. Adequate baseline, not compensating for the gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check if an email appears in data breaches') and names the data source (HaveIBeenPwned), which cleanly separates it from siblings like search_paste or search_ip. An agent can tell immediately this is an email-breach lookup, not a generic search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose implies when it applies (you have an email and want breach exposure), but there is no explicit when-to-use guidance, no exclusions, and no mention of alternatives such as search_paste or investigate_multi for broader email pivoting. Usage is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_censysA
Search Censys for internet-facing infrastructure data. IP address → open ports, services, ASN, country. Domain → certificate history, SANs, issuer, first/last seen. Uses CENSYS_API_ID and CENSYS_SECRET env vars. [passive] Censys API; returns data Censys already holds.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does supply real behavioral context: it names the required credentials (CENSYS_API_ID and CENSYS_SECRET env vars), declares the operation passive ('[passive] ... returns data Censys already holds'), and thus signals a non-invasive read against cached third-party data. It omits rate limits, pagination behavior, and error/failure modes for missing credentials.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense, front-loaded fragments using arrow notation carry purpose, per-input outputs, auth requirements, and the passive caveat with zero filler. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description still tells the agent the input types, the returned fields, and the credential prerequisite, which is enough to invoke it correctly. It stops short of pagination/rate-limit/completeness caveats, which would be needed for a fully autonomous call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (the required 'target' parameter has no schema description), so the description must compensate — and it does: the 'IP address →' and 'Domain →' clauses establish that 'target' accepts an IP or domain and what each yields. The json_output flag is already documented in the schema, so no extra credit there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (Censys internet-facing infrastructure data), then enumerates exactly what is returned per input type ('IP address → open ports, services, ASN, country'; 'Domain → certificate history, SANs, issuer, first/last seen'). This is well above a generic 'search' description. It does not, however, distinguish itself from the sibling search_shodan, which likely covers overlapping internet-facing infrastructure data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the returned-field breakdowns (use it when you have an IP or domain and want infrastructure/certificate data) and by the '[passive]' tag. There is no explicit when-to-use/when-not statement and no pointer to alternatives like search_shodan, so the agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_dnsA
Comprehensive DNS record enumeration (A, AAAA, MX, NS, TXT, CNAME, SOA). Highlights email security misconfigurations: missing SPF, weak SPF policy, missing or unenforced DMARC, and absent DKIM across common selectors. No external API or credentials required. [passive; DKIM selector probes (enumeration) run only with active tools enabled.] Record lookups go through your DNS resolver; the target's nameservers see the resolver, not you.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does it well: it discloses that no external API or credentials are needed, that lookups go through the resolver so the target sees the resolver rather than the caller, and that DKIM selector probing is conditional on active tools. It stops short of rate-limit or failure behavior, but the operational profile is unusually well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the enumeration scope and then the email-security value, followed by the passive-mode caveat. The bracketed active-tools note is dense but earns its place; nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with no output schema and no annotations, the description covers what is enumerated, the specific misconfigurations it detects, and the passive/probing behavior. Only the shape of returned findings and the domain-parameter expectations are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Two parameters at 50% coverage: json_output is documented in the schema while domain is not. The description implies a domain target and JSON result framing but adds no syntax, TLD, or selector-format detail beyond the schema, so it neither compensates for nor improves on the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (enumerate) and resource (DNS records), then enumerates the exact record types it returns (A, AAAA, MX, NS, TXT, CNAME, SOA) and adds the email-security angle. This is unambiguous and clearly distinct from the IP/WHOIS/RDAP siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the enumeration scope and the note that DKIM selector probes only run with active tools enabled, but there is no explicit guidance on when to reach for this versus search_whois, search_rdap, or search_ip. The agent must infer when DNS enumeration is the right first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_dorks_liveA
Execute Google dork queries for a target via the Bright Data SERP API, returning live structured results (title, URL, snippet). Runs up to 5 dorks by default — each is a billable API call. Uses BRIGHTDATA_API_KEY and BRIGHTDATA_SERP_ZONE env vars. [passive] Google results via Bright Data; the target is sent to those two services.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so well: it flags billable API calls, names the required env vars (BRIGHTDATA_API_KEY, BRIGHTDATA_SERP_ZONE), and discloses that the target leaves the boundary to Google/Bright Data via the [passive] tag. It stops short of rate limits, failure modes, or what happens when the default dork set is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler: action and return shape first, cost/credential constraints second, data-flow disclosure last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations and no output schema, the description does the heavy lifting — cost model, credentials, external data flow, and return fields are all covered. The remaining hole is the meaning/format of the required 'target' parameter, which leaves an agent slightly under-informed before calling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the undocumented parameter is the single required one — 'target' — whose expected format (domain, IP, email, query string) is never stated, only mentioned obliquely as 'for a target.' The description adds nothing to 'json_output' beyond the schema, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (execute Google dork queries) plus the data source (Bright Data SERP API) and return shape (title, URL, snippet), so the agent knows exactly what happens. It implicitly separates itself from the sibling generate_dorks by emphasizing 'live,' but never names or contrasts that sibling explicitly, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It discloses that up to 5 dorks run by default and that each is billable, which implies a cost-sensitive use context, but there is no explicit when-to-use versus generate_dorks (does the agent generate dorks first, or not?) and no prerequisite or exclusion guidance. Usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_footprintA
Collect a target's public search-engine footprint via the Bright Data SERP API. Detects entity type (email, username, domain, phone, or full name) and runs entity-type-aware Google queries, returning structured results and Entity Correlation Graph nodes/edges for discovered domains and profiles. Uses BRIGHTDATA_API_KEY and BRIGHTDATA_SERP_ZONE env vars. [passive] Up to 3 Google queries via Bright Data; the target is sent to those two services.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| json_output | No | Return result as structured JSON. | |
| max_queries | No | Max SERP queries (default 3, each is billable). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose key behaviors: it is passive, requires BRIGHTDATA_API_KEY and BRIGHTDATA_SERP_ZONE, is capped at up to 3 Google queries, and warns that the target is sent to external services. It falls short of 5 only by not covering failure modes, error handling, or how partial results are surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and output are front-loaded, and the bracketed [passive] and env-var/billing details are dense but each earns its place. Slightly information-heavy for a single sentence, but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly explains what comes back (structured SERP results plus graph nodes/edges), and with no annotations it covers auth, cost, and passivity. It is nearly complete; only the 'target' semantics and error behavior could be made more explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema leaves 'target' entirely undescribed, and the description compensates by enumerating accepted entity types (email, username, domain, phone, full name). It also ties max_queries' 'up to 3' to actual Google query behavior, though json_output is not addressed. This adds real meaning beyond the 67% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Collect a target's public search-engine footprint via the Bright Data SERP API') and details entity-type detection plus SERP and graph-node output. It is clearly distinguishable in substance, but never names or contrasts against the closely related siblings (search_dorks_live, generate_dorks), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the purpose ('to footprint a target'). There is no explicit when-to-use, no when-not-to-use, and no routing to the adjacent tools (search_dorks_live, generate_dorks) that also issue Google queries, leaving the agent to infer which tool fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_gdelt_geoA
Search recent, geolocated worldwide news from GDELT's 15-minute article feed (headlines/URLs matched against the query). No API key required. Returns a text summary plus a GeoJSON FeatureCollection, and says how far back it covers (the first call may cover only the last 15 minutes while older articles load). Optionally scope to a bounding box; query "*" lists everything inside it. [passive] Downloads GDELT's public news feed and filters it locally; your search term never leaves your machine.
| Name | Required | Description | Default |
|---|---|---|---|
| bbox | No | [min_lon, min_lat, max_lon, max_lat] | |
| query | Yes | Keywords (quoted phrases, OR groups) or "*" for all. | |
| timespan | No | Lookback in minutes (15-1440, capped at the loaded window). Default 60. | |
| maxpoints | No | Max point features to return (1-500). Default 250. | |
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses that the tool downloads GDELT's public feed and filters locally, that the search term never leaves the machine, and that the accessible window grows as older articles load. It also documents return format (text summary + GeoJSON FeatureCollection).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, return value, and freshness caveat before the passive/privacy note. Slightly dense and the bracketed '[passive]' tag interrupts the flow, but every sentence contributes distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the return payload (text summary plus GeoJSON FeatureCollection) and the coverage window caveat. For a 5-parameter search tool with no annotations, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful semantics beyond the schema: the bbox is optional scoping and the interplay of query "*" with a bounding box ('lists everything inside it'). It does not add new syntax for timespan or maxpoints, so it stays just above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Search recent, geolocated worldwide news from GDELT's 15-minute article feed'), states the matching semantics (headlines/URLs matched against the query), and the return shape. This is unmistakably distinct from the sibling search_shodan/search_rdap/search_dns tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (no API key, optional bbox scoping, query "*" lists everything inside the box) and an important operational caveat about the first call covering only the last 15 minutes while older articles load. It does not explicitly name when to choose a different sibling tool, but with such disparate siblings the trigger condition is effectively self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_githubA
Search GitHub for a username, email, or keyword. For exact username matches: returns full profile, recent repos, and emails discovered from commit history. For other queries: top 5 matching accounts. Optional GITHUB_TOKEN env var raises rate limit from 60 to 5000 req/h. [passive] A few requests to api.github.com.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses rate-limit behavior, the passive nature of the requests, and the exact return shape for both query modes. It stops short of explicitly confirming read-only/side-effect-free operation or error/pagination behavior, keeping it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information: purpose, branching return behavior, rate-limit option, and request profile. The purpose is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description adequately explains return values for both query modes, rate limits, and passive request behavior. It is nearly complete for a 2-parameter search tool, though minor details like error handling or json_output interaction are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, with json_output documented in the schema but query left bare. The description compensates by explaining exactly what values the query parameter accepts (username, email, keyword) and how results differ per type, adding meaningful semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (GitHub) plus the accepted query types (username, email, keyword). It does not explicitly contrast itself with any of the many sibling search_* tools, so it falls short of a 5 despite being immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes what each query type returns and mentions the optional token for rate limits. However, it gives no guidance on when to choose this tool over sibling searches like search_dorks_live or search_paste, leaving selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ipB
Retrieve geolocation and ASN data for an IP address via ipinfo.io. [passive] One request to ipinfo.io.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden, and it does disclose some useful traits: the operation is passive and makes exactly one external request to ipinfo.io. It omits auth/API-key requirements, rate limits, failure behavior, and the shape of the returned data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely tight and front-loaded: purpose first, then behavioral tags. The ipinfo.io source is mentioned twice (once as source, once as request target), a slight redundancy, but the second mention conveys request-count information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations and no output schema, the description should do more work. It covers the passive/single-request profile but leaves return fields, auth needs, and error handling unexplained, which is a meaningful gap given the absent structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% and the description adds no parameter meaning at all. The 'ip' parameter is self-evident as a string, and json_output is documented in the schema, but the description does nothing to compensate for the undocumented half.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (retrieve) plus resource (geolocation and ASN data for an IP) and names the data source (ipinfo.io). This clearly distinguishes the tool's function, though it does not differentiate itself from the close sibling search_ip2location, which likely covers similar geolocation data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The [passive] tag implies a non-intrusive reconnaissance context and 'One request to ipinfo.io' hints at cost, giving implied usage guidance. However, no explicit when-to-use or when-not-to-use guidance is provided relative to alternatives like search_ip2location, search_abuseipdb, or search_whois.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_ip2locationB
Enhanced IP intelligence using IP2Location Security Plan. Returns geolocation, ISP, ASN, and detects VPN, proxy, Tor exit nodes, and datacenter hosting. Sponsored integration. Uses IP2LOCATION_API_KEY env var. [passive] One request to api.ip2location.io.
| Name | Required | Description | Default |
|---|---|---|---|
| ip | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the API-key auth requirement (IP2LOCATION_API_KEY), characterizes the operation as passive, and quantifies network footprint ('one request'). It omits failure behavior (e.g., missing key) and response shape specifics, but the auth and passivity disclosures are concrete value beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the capability and return fields, then terse operational notes (env var, passive, one request). Every fragment carries some signal, though the 'Sponsored integration' note is tangential to invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe returns – and it does, listing geolocation, ISP, ASN, and threat-category flags. Auth, passivity, and request count are also covered. The main gap is parameter format and error handling for a two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%:_output is documented in the schema but ip (the sole required parameter, format unspecified) is not. The description says nothing about the ip parameter's expected format or how json_output affects the result, so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (IP intelligence lookup via IP2Location) and enumerates exactly what it returns: geolocation, ISP, ASN, VPN/proxy/Tor/datacenter detection. This distinguishes it from generic siblings like search_ip or search_whois by output content. However, it never names an alternative tool or states the condition that selects it over those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternative tool is mentioned despite heavy sibling overlap (search_abuseipdb, search_virustotal, search_censys, search_ip). The '[passive]' tag hints at a non-intrusive lookup style, but the agent must infer the selection context on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pasteB
Search Pastebin dumps for an email or username via psbdmp.ws. [passive] One request to psbdmp.ws.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It adds real context: the '[passive]' collection tag and 'One request to psbdmp.ws' implying a cheap, low-noise external lookup. It still omits auth requirements, rate limits, failure modes, and result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, front-loaded sentences with the action and scope up front. Minor redundancy: 'psbdmp.ws' appears in both sentences, so one sentence does not fully earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema and no annotations, so the description must cover return values and behavior; it does not say what a hit looks like (paste IDs, dates, counts) or how results are ranked. For a simple 2-param read tool this is adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: json_output is documented, but 'query' has no schema description. The description compensates by stating the query is an email or username, which is meaningful. It does not cover query syntax, matching behavior, or result format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (Search), a specific resource (Pastebin dumps), the target entities (email or username), and the upstream source (psbdmp.ws). It is distinguishable from siblings by resource, but it never explicitly contrasts itself with adjacent tools like search_breach or search_dorks_live.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not, or alternative routing is provided. The 'email or username' phrasing implies the investigative scenario, but an agent gets no guidance on choosing this over the many other search_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_rdapA
Structured domain registration lookup via RDAP (the machine-readable successor to WHOIS): registrar, registration and expiry dates, name servers and status codes. Registrant contact details are redacted by policy. No API key required. [passive] Queries IANA and the registry's RDAP server, not the target.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does useful work: it discloses that registrant contacts are redacted by policy, that no API key is required, and (via '[passive]' plus the query-source note) that it contacts IANA/the registry rather than the target. It omits rate limits and failure behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and returned fields, then terse supporting notes about redaction, auth, and reach. Dense but every sentence carries information; the prose could be slightly tightened but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with no output schema and no annotations, the description supplies the important gaps: what fields come back, that contacts are redacted, that no key is needed, and the passive lookup source. Only the 'domain' parameter's format and any return-shape nuance are left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% – 'domain' is undocumented in the schema and the description never explains its expected format (bare domain vs. URL, TLD handling). 'json_output' is covered by the schema, so the description adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Structured domain registration lookup via RDAP') and enumerates the returned fields (registrar, dates, name servers, status codes). It contrasts itself with WHOIS ('machine-readable successor'), which implicitly distinguishes it from the sibling search_whois, though it never names that tool directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: by framing RDAP as the machine-readable successor to WHOIS, the description hints it is the preferred structured alternative, but it gives no explicit when-to-use/when-not guidance and never names search_whois as the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_shodanA
Query Shodan for host intelligence or banner search. IP address → host lookup (open ports, org, CVEs). Any other string → keyword/service search. Uses SHODAN_API_KEY env var. [passive] Shodan API; reads Shodan's existing index, requests no new scan.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does unusually well: it discloses the required SHODAN_API_KEY env var and, importantly, that it is [passive] — reading Shodan's existing index and requesting no new scan, which matters for operational security. It stops short of covering rate limits, quota consumption, or what happens on an invalid/empty query, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact fragments, front-loaded with the core purpose and then the routing rule, credential requirement, and passivity note. Every clause adds information; there is no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, annotation-free, output-schema-free tool, the description supplies the essentials an agent needs: what it queries, how the input maps to behavior, the auth requirement, and the non-intrusive nature. The main remaining gap is the shape of the returned data (host fields vs. banner results), which is only sketched rather than described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, but the description compensates well for the undocumented 'query' parameter by explaining its two input-dependent semantics (IP → host lookup, other string → keyword/service search), which is meaning the schema does not provide. json_output is already documented in the schema, so no extra credit is needed there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Query) and resource (Shodan) and immediately explains two distinct modes: IP address triggers a host lookup, any other string triggers keyword/service search. It is clear what the tool does, though it never explicitly contrasts itself with the closely related sibling search_censys, so sibling differentiation is left implicit in the product name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful routing guidance (use an IP for host lookup, use anything else for banner/keyword search), so the agent knows how to shape the query. However, it offers no guidance on when to pick this tool over overlapping siblings such as search_censys, search_dns, or search_ip2location, and no exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_virustotalA
Check IP, domain, URL, or file hash against VirusTotal's 70+ antivirus engines and threat intelligence. Auto-detects input type. Uses VIRUSTOTAL_API_KEY env var. [passive] IP, 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.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the required VIRUSTOTAL_API_KEY env var, the side effect of URL submission (VirusTotal fetches the URL and exposes it to the community), and that this active mode is off by default. Rate limits and quota behavior are not mentioned, and no output/return format is described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with purpose and the input-type list, then the environment prerequisite, then the passive/active distinction. Every sentence adds information; nothing is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter lookup tool with no output schema and no annotations, the description covers auth, accepted inputs, and the important active-mode side effect. The main omission is any hint of what a result contains or how large/expensive a query can be, which matters given an external API quota.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: json_output is documented in the schema, but target is bare. The description compensates by enumerating the accepted input types (IP, domain, URL, file hash) and noting that the type is auto-detected, so an agent knows what to pass without guessing a format prefix.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check/scan) and resource (IP, domain, URL, file hash) against a named service, and the '70+ antivirus engines and threat intelligence' phrasing distinguishes it from geolocation/DNS/WHOIS siblings in the same search_* family.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains that input type is auto-detected and clearly separates the default passive lookup from the opt-in active URL submission mode, which is genuine when-to-use guidance. It does not, however, route the agent to alternatives like search_abuseipdb or search_shodan for overlapping IP/domain reputation needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_whoisA
Retrieve WHOIS registration data for a domain. [passive] Queries the registry/registrar WHOIS server, not the target.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | ||
| json_output | No | Return result as structured JSON. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and '[passive] Queries the registry/registrar WHOIS server, not the target' is a genuine behavioral disclosure (no direct contact with the target, so no target-side logging). That is valuable, but it stops short of disclosing rate limits, auth requirements, or error behavior for unavailable domains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two terse sentences with zero filler, and the core purpose is front-loaded before the qualifier. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema and no annotations, so the description bears responsibility for return format and safety profile, yet it says nothing about output shape or whether the lookup is cached/rate-limited. The passive-mode note partially compensates, but a 2-parameter lookup tool with 50% schema coverage and no annotations warrants more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50% (json_output is documented in the schema, domain is not), so the description should compensate but adds no parameter detail. The domain input is largely self-evident, but the description never states expected format (bare domain vs. URL vs. IP) or whether the json_output flag can apply to batch lookups.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('retrieve') plus resource ('WHOIS registration data') and an explicit target ('for a domain'), so the agent knows exactly what it returns. It does not distinguish itself from the sibling search_rdap, which is the closest alternative (RDAP being the WHOIS successor), so sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The '[passive]' tag implies the operational context (stealth/OSINT where the target must not be contacted directly), which is useful implied guidance. However, there is no explicit statement of when to prefer this over search_rdap or the other search_* siblings, so the agent must infer the choice.
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.
6 tool updates
v2.35.0- Removed
scrape_url - Removed
search_domain - Removed
search_email - Changed
search_gdelt_geo2 fields changed- added
Input schema / properties / query / descriptionAdded value: +"Keywords (quoted phrases, OR groups) or \"*\" for all." - changed
Input schema / properties / timespan / descriptionPrevious value: -"Lookback window in minutes (15-1440). Default 60."New value: +"Lookback in minutes (15-1440, capped at the loaded window). Default 60."
- Removed
search_phone - Removed
search_username
1 tool update
v2.31.0- Added
search_rdap
1 tool update
v2.28.0- Added
search_gdelt_geo
3 tool updates
v2.27.0- Added
graph_export - Added
graph_neighbors - Added
graph_review_candidates
3 tool updates
v2.23.0- Added
scrape_url - Added
search_dorks_live - Added
search_footprint
17 tool updates
v2.16.2- First observed
generate_dorks - First observed
investigate_multi - First observed
search_abuseipdb - First observed
search_breach - First observed
search_censys - First observed
search_dns - First observed
search_domain - First observed
search_email - First observed
search_github - First observed
search_ip - First observed
search_ip2location - First observed
search_paste - First observed
search_phone - First observed
search_shodan - First observed
search_username - First observed
search_virustotal - First observed
search_whois
TDQS
Scored across 20 tools
Most tools target distinct data sources and actions, but IP geolocation tools (search_ip, search_ip2location, and partly search_abuseipdb) and domain-registration tools (search_rdap, search_whois) have overlapping purposes. Descriptions help, but an agent may still deliberate over which source to pick.
All names use snake_case with consistent category prefixes: search_* for data lookups, graph_* for graph operations, generate_* for local generation, and investigate_* for orchestration. Minor variation in whether the suffix is a source name (abuseipdb) or data type (dns) is acceptable.
20 tools is heavy for a single MCP server; while many integrations are genuinely distinct, tools like search_ip and search_ip2location or search_rdap and search_whois could be consolidated or grouped. Each tool has a plausible role, but the count sits in the borderline-heavy range.
The surface covers a wide passive OSINT lifecycle: collection from many sources, DNS/domain/IP enrichment, breach and paste checks, graph correlation, export, human review, and multi-target orchestration. Gaps remain for phone/social-media-specific lookups and some non-GitHub username enumeration, but core OSINT workflows are well supported.
Maintenance
Related MCP Connectors
Hyperion — MCP tool marketplace for AI agents: web, OSINT, security, research via one key.
AI Visibility and Content Intelligence tools for Claude and MCP-compatible agents.
37 paid x402 MCP tools for OSINT, prediction markets, web intel, and agent security on Base USDC.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceAn MCP server that exposes a 60+ tool security and threat-intel stack to AI agents, enabling secret scanning, Sigma rule generation, ransomware lookup, OSINT, and deep research.1MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server that exposes multiple OSINT tools to AI assistants like Claude, enabling sophisticated reconnaissance and information gathering tasks using industry-standard OSINT tools.244MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that exposes 108+ omega-cli OSINT tools for reconnaissance, web analysis, threat intelligence, and reporting, enabling AI assistants to perform comprehensive open-source intelligence tasks.MIT
- AlicenseNot gradedqualityCmaintenanceAI-driven penetration testing MCP server that equips Claude with 13 tools for automated reconnaissance, analysis, vulnerability validation, and exploitation.4GPL 3.0