virustotal

v0.1.0Verified publisher
Report a problem

Looks up an IP, domain, URL or file hash in VirusTotal: engine verdicts, reputation, tags, owner, DNS records

Run

Through ot mcp, an agent calls run_tool with this; ot asks you before anything that goes online or touches a target. Set it up: ot mcp install claude (or cursor, vscode, codex, gemini).

{"tool":"osintverse-community/virustotal"}

Or just say: "Run osintverse-community/virustotal on … with OTInstaller." The registry's read-only MCP server at api.otinstaller.com/mcp can find tools without installing anything.

ot run osintverse-community/virustotal --format table
ot install osintverse-community/virustotal

Docker image in a read-only container · talks to www.virustotal.com · needs VIRUSTOTAL_API_KEY · up to 1 min. The first ot run installs the tool after asking once. Drop --format table for JSON.

Don't have ot? Install it in one line
curl -fsSL https://get.otinstaller.com/ot | sh
What this script does
  1. Downloads the latest ot release for your machine from GitHub Releases.
  2. Checks its SHA-256 against checksums.txt, and the Ed25519 signature on that file against the key built into the script.
  3. Puts ot in /usr/local/bin or ~/.local/bin. Nothing else is written. Read the script.
irm https://get.otinstaller.com/ot.ps1 | iex
What this script does
  1. Downloads the latest ot release for your machine from GitHub Releases.
  2. Checks its SHA-256 against checksums.txt, and the Ed25519 signature on that file against the key built into the script.
  3. Puts ot in %LOCALAPPDATA%\Programs\ot, and adds it to your PATH. Nothing else is written. Read the script.
  • Pinnedimage sha256:13a69a02…4cec57. The same bytes on every install; ot pulls by digest, never by tag.
  • Signedby https://github.com/osintverse-community/virustotal/.github/workflows/otinstaller-release.yml@refs/heads/main via token.actions.githubusercontent.com, verified by the registry on 24 Oct 2026. ot checks the same identity before every install and refuses another signer.
  • Scanned24 Oct 2026: 0 critical, 44 high, 63 medium, 62 low vulnerabilities; 0 embedded secrets, 0 malware heuristics; SBOM with 101 packages.
  • Workssmoke test passed on 24 Oct 2026 (exit 3 in 6.0 s, offline sandbox); the nightly health check has not run yet.
  • Backed upa copy of this image is on the registry's mirror. If the original registry refuses it, ot pulls the same digest from the mirror and checks the same signature.
  • Reviewedosintverse-community is a verified publisher: the registry confirmed who runs it, and a person reviewed its first release against the acceptable-use rules.

From the community

Issues →

Not health-checked yet; 0.1.0 came out today; nobody has said yet whether it works.

0.1.0 is in its first week. Nobody has said whether it works yet.

Used 0.1.0?It's broken for me

What you get back

Result envelope →
{
  "envelope": 1,
  "tool": "osintverse-community/virustotal@0.1.0",
  "runtime": "docker",
  "input": {},
  "started_at": "2026-10-21T09:00:00Z",
  "duration_ms": 4100,
  "exit_code": 0,
  "entities": [
    {
      "type": "ip",
      "value": "192.0.2.1"
    },
    {
      "type": "domain",
      "value": "example.com"
    },
    {
      "type": "url",
      "value": "https://example.com/page"
    }
  ],
  "warnings": []
}

Every tool returns this shape, shaped here from what this tool declares it finds. --format table to read it; ot extract and ot auto to continue.

virustotal

Looks up an IP address, domain, URL or file hash in VirusTotal and reports how many antivirus engines and URL scanners flag it, its community reputation and tags, and what VirusTotal knows around it: an IP's network owner and country, a domain's registrar and last DNS records, a URL's page title and final address, a file's names, type, size and threat label. Uses VirusTotal's official Python client, vt-py. It only reads existing reports and never submits anything, so the target is not contacted.

ot run osintverse-community/virustotal --domain example.com

Inputs

Give exactly one.

Input Required
ip one of these IP address
domain one of these Domain
url one of these URL
hash one of these MD5, SHA-1 or SHA-256 of a file

Keys

VIRUSTOTAL_API_KEY, set with ot keys set VIRUSTOTAL_API_KEY. A free account's public API key works, within 4 lookups a minute and 500 a day, for non-commercial use: get it at https://www.virustotal.com/gui/my-apikey. Without the key the tool exits with code 3.

Notes

A target VirusTotal has never seen gives no entities and a note on stderr. URLs are looked up exactly as given: VirusTotal treats http://example.com and https://example.com/ as different URLs.

Next steps

Check a domain's current DNS records with osintverse-community/dns-records, or look a file hash up in osintverse-community/malwarebazaar.

Development

pip install vt-py==0.22.0
python -m unittest
ot validate

Releases are built, signed and published by the otinstaller release workflow (Actions tab, with the version to release).

License

MIT

What next

virustotal finds ip, domain, url, document, organization, location, dns record. Tools that take those:

ip → 10 toolsdomain → 10 toolsurl → 10 toolsorganization → 6 toolsdns record → 10 toolsot auto, with a saved result

Other ip address tools

All ip address tools →

Alternatives to virustotal that also take an ip address; ot auto runs every installed one on the same value.

osintverse-community/ipwhois

Looks up who holds an IP address through RDAP: network, ASN, organisation and contacts

Takes ip address → finds organization, other
No key · Docker
Worked todayVerified publisher

osintverse-community/naabu

Lists an IP's open ports passively from Shodan InternetDB, without scanning it

Takes ip address → finds other
No key · Docker
Worked todayVerified publisher

osintverse-community/shodan-host

Shows what Shodan has seen on an IP: open ports, services, banners, vulnerabilities, location

Takes ip address → finds location, organization, other
Key required · Docker
Worked todayVerified publisher

osintverse-community/greynoise

Looks up an IP address in GreyNoise to see whether it is internet background noise or a known benign service

Takes ip address → finds ip, organization, other
Key required · Python wheel
Worked todayVerified publisher

osintverse-community/dnsanity

Checks whether DNS resolvers answer correctly by comparing them with trusted resolvers on a test template

Takes ip address → finds ip
No key · Docker
Worked todayVerified publisher
Esc

Try

↑ ↓ to move↵ to open