Skip to main content
Glama
OpenOSINT

openosint

Official
by OpenOSINT

mcp-name: io.github.OpenOSINT/openosint

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

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

Self-host (free, MIT)

pip install openosint
# Interactive AI REPL (default)
openosint

# Web interface
openosint web

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

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

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.md

Features

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 --allow-active (Passive by default); runs with uvx, no separate install

Parallel execution

--parallel runs complementary tools concurrently via asyncio.gather()

Reports

PDF + Markdown auto-saved after every investigation (reportlab optional)

Session history

All REPL sessions saved to ~/.openosint/history/; browse with openosint history

Web UI

Browser-based AI chat with streaming output, tool cards, light/dark theme

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

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

Tools

Tool

Powered by

What it investigates

search_email

holehe

Social accounts linked to an email address (noisy, off by default)

search_username

sherlock

Username presence across 400+ platforms (noisy, off by default)

search_breach

HaveIBeenPwned v3 API

Data breach exposure

search_whois

python-whois

Domain registrant and DNS info

search_ip

ipinfo.io

Geolocation, ASN, hostname

search_domain

sublist3r

Subdomain enumeration (noisy, off by default)

generate_dorks

built-in

12 targeted Google dork URLs (no network calls)

search_paste

psbdmp.ws

Pastebin dump mentions

search_phone

phoneinfoga

Carrier, country, line type (unverified network behavior, off by default)

search_shodan

Shodan API

Open ports, banners, CVEs

search_virustotal

VirusTotal API v3

Verdict from 70+ antivirus engines

search_ip2location

IP2Location.io API

Enhanced IP intel: VPN/Proxy/Tor/datacenter flags (sponsored)

search_censys

Censys Search API

Internet-facing infrastructure, certificates

search_abuseipdb

AbuseIPDB v2 API

IP abuse reputation: confidence score, reports, country, ISP

search_github

GitHub REST API

Profile, repos, commit-discovered emails, username/keyword search

search_dns

dnspython (built-in)

A/AAAA/MX/NS/TXT/CNAME/SOA records; SPF, DMARC, DKIM analysis

search_rdap

RDAP (IANA bootstrap, keyless)

Registrar, registration/expiry dates, name servers, status; registrant contacts redacted by policy

search_gdelt_geo

GDELT 15-minute GKG feed (keyless)

Recent worldwide news placed on a map: headline, link, place; GeoJSON output

search_dorks_live

Bright Data SERP API

Live Google search results for dork queries (title, URL, snippet)

scrape_url

Bright Data Web Unlocker

Fetch any URL bypassing Cloudflare/CAPTCHA — returns clean Markdown (touches the target, off by default)

search_footprint

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 search_dns).

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

openosint --allow-active …

Any process

OPENOSINT_ALLOW_ACTIVE=1

Web UI

Settings → "Enable active tools" (loopback only)

MCP server

uvx --from openosint openosint-mcp --allow-active (or openosint-mcp --allow-active if installed), or set OPENOSINT_ALLOW_ACTIVE=1 in the client's env block

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

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

Tool

Level

Default

What it actually sends, and where

generate_dorks

passive

on

Builds Google search URLs locally; sends nothing.

graph_export

passive

on

Reads the local graph database only.

graph_neighbors

passive

on

Reads the local graph database only.

graph_review_candidates

passive

on

Reads the local graph database only.

investigate_graph

inherits

on

Chains tools from a seed; in passive mode it routes only to passive tools.

investigate_multi

inherits

on

Runs one agent per target under a shared tool-call cap; passive unless active is enabled.

scrape_url

touches target

off

Bright Data fetches the URL, so the target's server logs a request (from Bright Data's IP, not yours).

search_abuseipdb

passive

on

One request to api.abuseipdb.com.

search_breach

passive

on

One request to haveibeenpwned.com.

search_censys

passive

on

Censys API; returns data Censys already holds.

search_dns

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.

search_domain

noisy

off

sublist3r scrapes several search engines and aggregators from your IP; expect captchas and blocks.

search_dorks_live

passive

on

Google results via Bright Data; the target is sent to those two services.

search_email

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.

search_footprint

passive

on

Up to 3 Google queries via Bright Data; the target is sent to those two services.

search_gdelt_geo

passive

on

Downloads GDELT's public news feed and filters it locally; your search term never leaves your machine.

search_github

passive

on

A few requests to api.github.com.

search_ip

passive

on

One request to ipinfo.io.

search_ip2location

passive

on

One request to api.ip2location.io.

search_paste

passive

on

One request to psbdmp.ws.

search_phone

unverified

off

Runs phoneinfoga; what it sends over the network has not been verified with a traffic capture.

search_rdap

passive

on

Queries IANA and the registry's RDAP server, not the target.

search_shodan

passive

on

Shodan API; reads Shodan's existing index, requests no new scan.

search_username

noisy

off

sherlock sends requests from your IP to hundreds of sites; expect rate limits and WAF blocks.

search_virustotal

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.

search_virustotal (URL submission)

touches target

off

VirusTotal fetches the submitted URL, and the URL becomes visible to the VirusTotal community, which can reveal your investigation.

search_whois

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 used

search_username

Searches for a username across 400+ platforms using sherlock.

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

search_breach

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

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

search_whois

Retrieves WHOIS data using python-whois.

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

search_ip

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

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

search_domain

Enumerates subdomains using sublist3r.

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

generate_dorks

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

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

search_paste

Searches Pastebin dumps via psbdmp.ws.

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

search_phone

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

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

search_shodan

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

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

search_virustotal

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

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

search_ip2location

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

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

search_censys

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

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

search_abuseipdb

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

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

Warning appears when abuseConfidenceScore exceeds 50%.

search_github

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

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

search_dns

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

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

search_rdap

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

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

search_gdelt_geo

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

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

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

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

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

Variable

Default

Purpose

OPENOSINT_GDELT_WINDOW_HOURS

6

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.

OPENOSINT_GDELT_MAX_ARTICLES

30000

Hard cap on stored articles; the oldest are dropped first.

OPENOSINT_GDELT_USE_PROXY

off

Route GDELT downloads through OPENOSINT_PROXY_URL (bypassed by default: the feed is public).

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

search_dorks_live

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

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

scrape_url

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

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

search_footprint

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

openosint footprint johndoe99

Graph module (optional)

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

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


External exposure report (beta)

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

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

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

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 (--lookalikes)

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 www)

Security headers

touches target

One HTTPS GET to https://DOMAIN/ (redirects are followed)

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

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


Interfaces

Web UI

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

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

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

Variable

Use it when

OPENOSINT_ALLOWED_HOSTS

You reach the UI by another name (LAN name, Docker hostname, reverse proxy), e.g. OPENOSINT_ALLOWED_HOSTS=osint.lan,localhost. Comma-separated; host or host:port. On a non-loopback bind (--allow-remote, Docker) the Host check only runs when this is set, so set it there.

OPENOSINT_ALLOWED_ORIGINS

A separate front end on another origin calls the API, e.g. OPENOSINT_ALLOWED_ORIGINS=http://localhost:3000. Comma-separated.

# Fully local (no API key) — requires Ollama runtime: https://ollama.com
ollama pull llama3.2
openosint web
# Settings -> Ollama (local) -> model: llama3.2

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

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

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

Interactive REPL

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

REPL commands:

Command

Description

<target>

Investigate any target — email, username, domain, IP, name

clear

Reset conversation memory

save

Save last report to reports/

tools

List available tools and their status

config

Show current configuration

history

Browse saved sessions

help

Show all commands

exit / Ctrl-D

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-mini

Live Documentation

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

MCP Server

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

The command every client runs is the same:

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

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

Claude Code:

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

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

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

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

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

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

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

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

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

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

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

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

Agentic use via Claude Code:

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

Installation

Quickstart — web UI in one command

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

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

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

uvx openosint web

You should see:

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

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

Want to…

Do this

Use another port

uvx openosint web --port 8081 (if 8080 is busy, OpenOSINT exits and tells you this)

Keep the browser closed

uvx openosint web --no-browser

Find your data

Graph database and session history live in ~/.openosint/ (%USERPROFILE%\.openosint on Windows). Move it with OPENOSINT_HOME=/path; OPENOSINT_GRAPH_DB still overrides just graph.db.

Find reports

CLI and REPL reports are written to ./reports/ in the directory you ran openosint from. The web UI writes none.

Use the entity graph store

Works with plain uvx openosint web, no compiler needed: the /graph page, /api/graph/*, and the graph_neighbors / graph_review_candidates MCP tools. graph_export (.ftm) needs the graph extra, which builds PyICU and so needs libicu and a C++ compiler first (Ubuntu: sudo apt install libicu-dev pkg-config g++; macOS: brew install icu4c pkg-config and export PKG_CONFIG_PATH="$(brew --prefix icu4c)/lib/pkgconfig"), then uvx --from "openosint[graph]" openosint web; or use Docker, which includes it. The store starts empty: it is filled through the Python API, not by the UI.

Alternatives

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

# Updating
pip install --upgrade openosint

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

External binaries (must be in PATH):

Binary

Purpose

Install

holehe

Email account enumeration

pip install holehe

sherlock

Username enumeration (400+ platforms)

pip install sherlock-project

sublist3r

Subdomain enumeration

pip install sublist3r

phoneinfoga

Phone number intelligence

Download binary

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

Optional Python packages:

Package

Purpose

Install

ollama

Local LLM backend (no API key)

pip install "openosint[ollama]" (also requires Ollama runtime)

openai

OpenAI-compatible backend

pip install "openosint[openai]"

shodan

Shodan API client

pip install "openosint[shodan]"

reportlab

PDF report export

pip install "openosint[pdf]"

censys

Censys API client

pip install "openosint[censys]"

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:

  1. real environment variables (a saved value cannot override one; the UI says so)

  2. config.env in the data directory

  3. a 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

ANTHROPIC_API_KEY

AI agent (REPL/Web UI)

Yes, unless using Ollama or an OpenAI-compatible endpoint

Anthropic API key

ANTHROPIC_MODEL

AI agent

Optional

Model name to request (default: claude-sonnet-5). Replaces the deprecated OPENOSINT_MODEL.

OPENAI_BASE_URL

AI agent

Optional

Base URL of an OpenAI-compatible endpoint (e.g. http://localhost:4000/v1)

OPENAI_API_KEY

AI agent

Optional

API key for the endpoint (local servers may ignore it)

OPENAI_MODEL

AI agent

Optional

Model name to request (default: gpt-4o-mini)

OPENOSINT_GDELT_WINDOW_HOURS

search_gdelt_geo

Optional

Hours of news kept in memory (default 6, max 24). See search_gdelt_geo.

OPENOSINT_GDELT_MAX_ARTICLES

search_gdelt_geo

Optional

Hard cap on stored articles (default 30000; oldest dropped first)

OPENOSINT_ENV_FILE

All

Optional

Explicit path to a .env file, overriding the directory search above

OPENOSINT_SETUP_TOKEN

Web UI

Optional

Lets the browser save keys when it is not on loopback (Docker). Send as X-Setup-Token; the UI has a field for it. Unset = saving from a non-loopback browser is off. Failed attempts are throttled.

HIBP_API_KEY

search_breach

Required for this tool

HaveIBeenPwned v3 — get one

IPINFO_TOKEN

search_ip

Optional

Works without it; raises ipinfo.io rate limits

SHODAN_API_KEY

search_shodan

Required for this tool

Shodan API — get one

VIRUSTOTAL_API_KEY

search_virustotal

Required for this tool

VirusTotal API v3 — get one

IP2LOCATION_API_KEY

search_ip2location

Required for this tool

IP2Location.io — get one (sponsored)

CENSYS_API_ID + CENSYS_SECRET

search_censys

Required for this tool

Censys — get one

ABUSEIPDB_API_KEY

search_abuseipdb

Required for this tool

AbuseIPDB v2 — get one

GITHUB_TOKEN

search_github

Optional

Works without it (60 req/h); raises the limit to 5000 req/h — get one

BRIGHTDATA_API_KEY

search_dorks_live, scrape_url, search_footprint

Required for these tools

Bright Data — get one¹ (free tier: 5,000 req/month)

BRIGHTDATA_SERP_ZONE

search_dorks_live, search_footprint

Required for these tools

Your Bright Data SERP zone name (e.g. serp_api1)

BRIGHTDATA_UNLOCKER_ZONE

scrape_url

Required for this tool

Your Bright Data Web Unlocker zone name (e.g. web_unlocker1)

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

openosint

Interactive AI REPL (default)

openosint web [--port N] [--no-browser]

Launch browser UI

openosint email ADDRESS [-t N]

Direct email scan

openosint username HANDLE [-t N]

Direct username scan

openosint shodan QUERY [-t N]

Shodan lookup

openosint virustotal TARGET [-t N]

VirusTotal lookup

openosint censys TARGET [-t N]

Censys lookup

openosint ip2location IP [-t N]

IP2Location lookup

openosint abuseipdb IP [-t N]

AbuseIPDB reputation check

openosint github QUERY [-t N]

GitHub profile/repo/email discovery

openosint dns DOMAIN [-t N]

DNS records + email security analysis

openosint search-dorks-live TARGET [--max-dorks N] [-t N]

Live Google dork results via Bright Data

openosint scrape URL [-t N]

Fetch a URL via Bright Data Web Unlocker

openosint footprint TARGET [--max-queries N] [-t N]

SERP footprint via Bright Data

openosint multi TARGETS

Parallel multi-target investigation (max 10)

openosint exposure DOMAIN [--lookalikes] [--report FILE.html] [--lang it|en] [--resolver IP]

External exposure report graded A-F (beta)

openosint playbook RECIPE TARGET

Run a deterministic investigation playbook (no AI)

openosint history [--all] [open N] [clear]

View/manage REPL session history

openosint proxy-test

Verify the configured upstream proxy

openosint sponsors

List current sponsors and featured integrations

openosint prompts

Show info about the AI OSINT Prompt Pack

openosint shell

Explicit alias for the default REPL

--allow-active

Enable active tools (noisy or touch the target). Off by default; same as OPENOSINT_ALLOW_ACTIVE=1

-v, --verbose

Enable debug logging to stderr

-t, --timeout N

Override subprocess timeout (seconds)

--api-key KEY

Anthropic API key (overrides env var)

--parallel

Run complementary tools concurrently

--json

Output results as structured JSON

--provider {anthropic,ollama,openai}

AI provider (default: anthropic)

--ollama-model MODEL

Ollama model name (default: llama3.2)

--ollama-host URL

Ollama server URL (default: http://localhost:11434)

--openai-base-url URL

OpenAI-compatible endpoint base URL (env: OPENAI_BASE_URL)

--openai-model MODEL

Model to request from the endpoint (default: gpt-4o-mini; env: OPENAI_MODEL)

--openai-api-key KEY

API key for the endpoint (env: OPENAI_API_KEY)

--no-pdf

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.yml sets this to the same value as OPENOSINT_BIND to 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's 0.0.0.0 bind 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

https://www.ip2location.io

search_ip2location

Featured (sponsored)

API key — free tier

AbuseIPDB

https://www.abuseipdb.com

search_abuseipdb

Community

API key — free tier

Censys

https://censys.io

search_censys

Community

API key — free tier

GitHub

https://github.com

search_github

Community

Token optional

HaveIBeenPwned

https://haveibeenpwned.com

search_breach

Community

API key — paid

holehe

https://github.com/megadose/holehe

search_email

Community

None — local binary

ipinfo.io

https://ipinfo.io

search_ip

Community

Token optional

phoneinfoga

https://github.com/sundowndev/phoneinfoga

search_phone

Community

None — local binary

psbdmp.ws

https://psbdmp.ws

search_paste

Community

None

sherlock

https://github.com/sherlock-project/sherlock

search_username

Community

None — local binary

Shodan

https://shodan.io

search_shodan

Community

API key — free tier

sublist3r

https://github.com/aboul3la/Sublist3r

search_domain

Community

None — local binary

VirusTotal

https://www.virustotal.com

search_virustotal

Community

API key — free tier

WHOIS (IANA)

https://www.iana.org/whois

search_whois

Community

None

DNS (system resolver)

—

search_dns

Community

None

Google Search

https://www.google.com

generate_dorks

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, and phoneinfoga run 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_as links 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.

IP2Location.io — powers search_ip2location · Integration guide

Enhanced IP geolocation, ISP, VPN/Proxy/Tor, and datacenter detection

TestMu AI

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

Contributors

Contributor

Contribution

@consocio

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

Star History Chart

Available Tools

20 tools
generate_dorksA

Generate targeted Google dork URLs for any target (name, email, username, domain). [passive] Builds Google search URLs locally; sends nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
json_outputNoReturn result as structured JSON.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
json_outputNoReturn result as structured JSON.
exclude_datasetsNoDataset names to omit entirely, e.g. ['openosint:hibp'].

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoHops to traverse (default 1, capped at 5).
entity_idYes
cross_layerNoInclude bridge links into the raw infra graph.
json_outputNoReturn result as structured JSON.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
schemaNolist filter: restrict to one FtM schema.
datasetNolist filter: either entity must carry a statement from this dataset.
decisionNo
entity_idNodecide: first entity of the pair.
max_scoreNolist filter: maximum score.
min_scoreNolist filter: minimum score.
json_outputNoReturn result as structured JSON.
reviewer_idNodecide: reviewer identifier, recorded if given.
canonical_idNodecide: second entity of the pair.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetsYesList of OSINT targets (emails, usernames, domains, IPs). Max 10.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYes
json_outputNoReturn result as structured JSON.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYes
json_outputNoReturn result as structured JSON.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
json_outputNoReturn result as structured JSON.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYes
json_outputNoReturn result as structured JSON.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
json_outputNoReturn result as structured JSON.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
json_outputNoReturn result as structured JSON.
max_queriesNoMax SERP queries (default 3, each is billable).

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bboxNo[min_lon, min_lat, max_lon, max_lat]
queryYesKeywords (quoted phrases, OR groups) or "*" for all.
timespanNoLookback in minutes (15-1440, capped at the loaded window). Default 60.
maxpointsNoMax point features to return (1-500). Default 250.
json_outputNoReturn result as structured JSON.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
json_outputNoReturn result as structured JSON.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYes
json_outputNoReturn result as structured JSON.

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipYes
json_outputNoReturn result as structured JSON.

TDQS

B3.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
json_outputNoReturn result as structured JSON.

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYes
json_outputNoReturn result as structured JSON.

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
json_outputNoReturn result as structured JSON.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
json_outputNoReturn result as structured JSON.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYes
json_outputNoReturn result as structured JSON.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 6 tool updatesv2.35.0
    • Removedscrape_url
    • Removedsearch_domain
    • Removedsearch_email
    • Changedsearch_gdelt_geo2 fields changed
      • addedInput schema / properties / query / description
        Added value: +"Keywords (quoted phrases, OR groups) or \"*\" for all."
      • changedInput schema / properties / timespan / description
        Previous value: -"Lookback window in minutes (15-1440). Default 60."New value: +"Lookback in minutes (15-1440, capped at the loaded window). Default 60."
    • Removedsearch_phone
    • Removedsearch_username
  2. 1 tool updatev2.31.0
    • Addedsearch_rdap
  3. 1 tool updatev2.28.0
    • Addedsearch_gdelt_geo
  4. 3 tool updatesv2.27.0
    • Addedgraph_export
    • Addedgraph_neighbors
    • Addedgraph_review_candidates
  5. 3 tool updatesv2.23.0
    • Addedscrape_url
    • Addedsearch_dorks_live
    • Addedsearch_footprint
  6. 17 tool updatesv2.16.2
    • First observedgenerate_dorks
    • First observedinvestigate_multi
    • First observedsearch_abuseipdb
    • First observedsearch_breach
    • First observedsearch_censys
    • First observedsearch_dns
    • First observedsearch_domain
    • First observedsearch_email
    • First observedsearch_github
    • First observedsearch_ip
    • First observedsearch_ip2location
    • First observedsearch_paste
    • First observedsearch_phone
    • First observedsearch_shodan
    • First observedsearch_username
    • First observedsearch_virustotal
    • First observedsearch_whois

TDQS

A3.7/5.0

Scored across 20 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count3/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    An 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.
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    244
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP 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