A solid wrapper around the VirusTotal API that brings security analysis directly into Claude Desktop and other MCP clients. You get the standard quartet of URL, file hash, IP, and domain lookups, plus relationship queries for digging into connected threats, dropped files, network connections, and behavioral data. The automatic relationship fetching is handy since it pulls relevant context data alongside basic reports without extra API calls. Supports pagination for deep analysis and includes both stdio and HTTP streaming transports. Grab a VirusTotal API key, drop it in your config, and you're analyzing suspicious URLs and file hashes through natural language queries.
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-virustotal
codex mcp add virustotal --env VIRUSTOTAL_API_KEY=your-key -- npx -y @burtthecoder/mcp-virustotal
gemini mcp add -e VIRUSTOTAL_API_KEY=your-key virustotal npx -y @burtthecoder/mcp-virustotal
To install VirusTotal Server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @burtthecoder/mcp-virustotal --client claude
npm 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
Create or update your VS Code MCP configuration file at:
~/.vscode/mcp.json%USERPROFILE%\.vscode\mcp.jsonAdd the following configuration:
{
"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-virustotal
The 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 query
limit (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 query
limit (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 query
limit (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 query
limit (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 include
If 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 dev
Run the formatter test suite (no API key, no network):
npm test
Exercise all 11 tools end-to-end against the real VirusTotal API:
VIRUSTOTAL_API_KEY=your-key npm run smoke
The 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.
VIRUSTOTAL_API_KEY*secretYour VirusTotal API key
com.exploit-intel/eip-mcp
dmontgomery40/pentest-mcp
pantheon-security/notebooklm-mcp-secure
cyanheads/pentest-mcp-server
io.github.akhilucky/ai-firewall-mcp