Mcp Virustotal — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Virustotal (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A Model Context Protocol (MCP) server for querying the VirusTotal API. This server provides comprehensive security analysis tools with automatic relationship data fetching. It integrates seamlessly with MCP-compatible applications like Claude Desktop.
claude mcp add --transport stdio --env VIRUSTOTAL_API_KEY=your-key virustotal -- npx -y @burtthecoder/mcp-virustotalcodex mcp add virustotal --env VIRUSTOTAL_API_KEY=your-key -- npx -y @burtthecoder/mcp-virustotalgemini mcp add -e VIRUSTOTAL_API_KEY=your-key virustotal npx -y @burtthecoder/mcp-virustotalTo install VirusTotal Server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @burtthecoder/mcp-virustotal --client claudenpm install -g @burtthecoder/mcp-virustotal{
"mcpServers": {
"virustotal": {
"command": "mcp-virustotal",
"env": {
"VIRUSTOTAL_API_KEY": "your-virustotal-api-key"
}
}
}
}Configuration file location:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.jsonTo use this MCP server in VS Code with GitHub Copilot:
npm install -g @burtthecoder/mcp-virustotal~/.vscode/mcp.json%USERPROFILE%\.vscode\mcp.json{
"servers": {
"virustotal": {
"command": "mcp-virustotal",
"env": {
"VIRUSTOTAL_API_KEY": "your-virustotal-api-key"
}
}
}
}You can then use the VirusTotal tools through GitHub Copilot in VS Code by referencing the available tools in your prompts.
If you prefer to run from source or need to modify the code:
git clone <repository_url>
cd mcp-virustotal
npm install
npm run build{
"mcpServers": {
"virustotal": {
"command": "node",
"args": ["/absolute/path/to/mcp-virustotal/build/index.js"],
"env": {
"VIRUSTOTAL_API_KEY": "your-virustotal-api-key"
}
}
}
}The server supports HTTP streaming transport in addition to the default stdio transport. This is useful for running the server as a standalone HTTP service that multiple clients can connect to.
Set the MCP_TRANSPORT environment variable to httpStream:
MCP_TRANSPORT=httpStream MCP_PORT=3000 VIRUSTOTAL_API_KEY=your-key node build/index.js| Variable | Default | Description |
|---|---|---|
VIRUSTOTAL_API_KEY | (required) | Your VirusTotal API key |
MCP_TRANSPORT | stdio | Transport mode: stdio or httpStream |
MCP_PORT | 3000 | HTTP server port (only for httpStream) |
MCP_ENDPOINT | /mcp | HTTP endpoint path (only for httpStream) |
docker build -t mcp-virustotal .
docker run -p 3000:3000 \
-e VIRUSTOTAL_API_KEY=your-key \
-e MCP_TRANSPORT=httpStream \
mcp-virustotalThe server exposes a health check endpoint at /health when running in HTTP streaming mode.
?relationships= query, batched to minimize API callstype:peexe positives:5+)get_url_reporturl (required): The URL to analyzeget_file_reporthash (required): MD5, SHA-1 or SHA-256 hash of the fileget_ip_reportip (required): IP address to analyzeget_domain_reportdomain (required): Domain name to analyzerelationships (optional): Array of specific relationships to include in the reportget_url_relationshipurl (required): The URL to get relationships forrelationship (required): Type of relationship to querylimit (optional, default: 10): Maximum number of related objects to retrieve (1-40)cursor (optional): Continuation cursor for paginationget_file_relationshiphash (required): MD5, SHA-1 or SHA-256 hash of the filerelationship (required): Type of relationship to querylimit (optional, default: 10): Maximum number of related objects to retrieve (1-40)cursor (optional): Continuation cursor for paginationget_ip_relationshipip (required): IP address to analyzerelationship (required): Type of relationship to querylimit (optional, default: 10): Maximum number of related objects to retrieve (1-40)cursor (optional): Continuation cursor for paginationget_domain_relationshipdomain (required): Domain name to analyzerelationship (required): Type of relationship to querylimit (optional, default: 10): Maximum number of related objects to retrieve (1-40)cursor (optional): Continuation cursor for paginationsearch_vtquery (required): Search query. Examples: a SHA-256 hash, evil.com, 8.8.8.8, type:peexe size:90kb+ tag:signed positives:5+limit (optional, default: 20): Maximum number of results (1-300)cursor (optional): Continuation cursor for paginationget_file_behaviour_summaryhash (required): MD5, SHA-1 or SHA-256 hash of the fileget_collectionrelated_threat_actors and collections relationships on other tools. Optionally include relationships to fetch member IOCs in the same callid (required): Collection ID (e.g. threat-actor--<uuid>, malware-family--<id>)relationships (optional): Array of relationship names to includeIf you see "Wrong API key" errors:
/tmp/mcp-virustotal-server.log (on macOS) for API key statusTo run in development mode with hot reloading:
npm run devRun the formatter test suite (no API key, no network):
npm testExercise all 11 tools end-to-end against the real VirusTotal API:
VIRUSTOTAL_API_KEY=your-key npm run smokeThe smoke test paces calls at 20 s to stay under the 4-requests-per-minute public-tier rate limit. It is not compatible with heavily reduced free tiers (e.g. 1 lookup/day) — for those, run a single tool by editing scripts/smoke-test.mjs and pick the one you want to verify.
The server includes comprehensive error handling for:
search_vt, get_file_behaviour_summary, get_collection, and get_domain_relationship tools; synced relationship lists with current VirusTotal v3 docs (drops removed clues, adds collections/votes/user_votes/embedded_js_files/urls_related_by_tracker_id where applicable); get_url_report now returns the cached report when available instead of re-scanning on every call; report tools use batched ?relationships= queries for dramatically fewer API callsgit checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)This project is licensed under the MIT License - see the LICENSE file for details.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.