get_recent_scans
Get recent public scans (paginated).
Submit a URL for malware and phishing analysis, then read the verdict, the indicators behind it, and the certificate.
LABSCO SUMMARY
The whole flow is one loop — submit, wait, read the verdict — and the certificate detail is what turns a score into an explanation: a login page whose certificate names a different organisation is the kind of thing a number alone will not tell you.
A Python server over the public ScanMalware.com API. It submits a URL for scanning, follows the scan to completion, and returns the status, risk score and the indicators behind it, along with TLS and certificate detail, screenshots and previous scans.
submit_scan)Nothing for the public endpoints. The hosted endpoint is https://mcp.scanmalware.com/mcp over Streamable HTTP; a GET without the MCP accept headers returns 406, which is expected. To run it yourself, pip install . on Python or the Docker image, with MCP_TRANSPORT, MCP_HOST and MCP_PORT set — and MCP_AUTH_TOKEN if you want your own instance to demand a bearer token from connecting clients. SCANMALWARE_BEARER_TOKEN is only for the parts of the upstream API that ask for one. Two limits worth knowing: downloads are capped by SCANMALWARE_MAX_DOWNLOAD_BYTES at 10485760 bytes by default, and private network targets are refused unless SCANMALWARE_ALLOW_PRIVATE_TARGETS is turned on. A few upstream endpoints are disabled and left out of the tool list entirely.
Paste a URL — add the endpoint to your client
USE CASES
Submit the URL, wait for the scan to finish, and read the status, risk score and top indicators. The page gets loaded in their infrastructure rather than on the machine of whoever received the email.
A risk score on its own convinces nobody. Pull the AI analysis and the screenshot for a high-risk scan so the write-up shows what the page actually was.
Search past scans for your product name and read the results — identifier, status, risk score, URL. Look-alike login pages tend to appear in a public scan corpus before they appear in your inbox.
Fetch the TLS details and the certificate PEM for the scan, and read issuer, subject, validity dates and alternative names. A mismatch between the certificate's organisation and the brand on the page is the clearest phishing tell there is.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
get_recent_scansGet recent public scans (paginated).
submit_scanSubmit a URL for scanning.
get_scan_summaryGet compact scan summary by scan_id.
wait_for_scanPoll until a scan reaches a terminal status, returning the final summary.
get_scan_resultGet full scan result by scan_id.
search_scansSearch scans (q must be at least 3 characters).
get_ai_analysisGet AI analysis for a scan_id (if available).
get_scan_progressGet scan progress by scan_id.
get_scan_iocGet IOC matches for a scan_id.
get_tls_detailsGet TLS details for a scan_id.
get_tls_asn1Get TLS certificate ASN.1 data for a scan_id.
get_technologies_by_scanGet detected technologies for a scan_id.
get_bot_protectionGet bot-protection detection for a scan_id.
get_yara_matchesGet YARA matches for a scan_id.
get_jarm_signaturesGet JARM signatures for a scan_id.
get_analyzer_resultsGet analyzer results for a scan_id.
get_clipboard_eventsGet clipboard events for a scan_id.
get_js_fingerprintsGet JavaScript fingerprints for a scan_id.
get_scan_reportsGet available reports for a scan_id.
get_domain_scansGet recent scans for a domain.
get_domain_historyGet historical scans for a domain (paginated).
get_domain_statsGet summary statistics for a domain.
search_by_ipSearch scans by IP address (paginated).
get_ip_statsGet IP statistics (paginated).
search_by_asnSearch scans by ASN (paginated).
search_similar_scansSearch for scans similar to a scan_id (paginated).
search_semanticSemantic search over scans (paginated).
search_by_faviconSearch scans by favicon hash (paginated).
search_ai_high_riskSearch AI high-risk scans.
search_ai_scam_typeSearch AI scans by scam type.
search_ai_classificationSearch AI scans by classification.
get_analyzer_statsGet analyzer statistics overview.
search_analyzer_high_riskSearch analyzer high-risk scans (paginated).
get_faviconGet the favicon for a scan_id: size, hashes, and the image itself base64-encoded. Use the md5 with search_by_favicon to pivot.
get_favicon_statsGet favicon statistics.
get_screenshot_statsGet screenshot statistics.
search_similar_screenshotsSearch for similar screenshots by hash.
search_ocrSearch OCR text (paginated).
search_ocr_patternSearch OCR by pattern (paginated).
search_by_jarmSearch scans by JARM signature (paginated).
search_by_fuzzy_hashSearch scans by fuzzy hash (paginated).
search_by_screenshot_hashSearch scans by screenshot hash (paginated).
search_suspicious_clipboardSearch suspicious clipboard indicators (paginated).
get_recent_threatsGet recent malware threats.
get_recent_yara_threatsGet recent YARA threats.
get_ct_certificatesGet certificate transparency data for a domain.
get_ct_dns_recordsGet CT DNS records for a domain.
get_ct_domains_by_ipFind CT domains on an IP address.
get_ct_similar_domainsFind similar CT domains for a domain.
get_ct_timelineGet CT certificate timeline for a domain.
get_api_rootGet API root metadata.
get_healthGet API health status.
get_platform_statsGet platform statistics.
get_latest_capabilitiesGet latest capability stats.
get_capabilities_by_dateGet capability stats by date.
get_clipboard_statsGet clipboard statistics.
get_cpe_statsGet CPE statistics.
get_cpe_by_scanGet CPEs for a scan_id.
search_cpeSearch CPEs by pattern (paginated).
get_ids_alertsGet IDS alerts for a scan_id.
get_jarm_statsGet JARM statistics.
get_malware_statsGet malware stats.
get_malware_by_scanGet malware details for a scan_id.
get_yara_statsGet YARA stats.
get_yara_by_scanGet YARA results for a scan_id.
get_safe_browsing_statsGet safe browsing stats.
get_safe_browsingGet safe browsing threats for a scan_id.
get_top_tracking_keysGet top tracking keys.
search_tracking_keySearch by tracking key (paginated).
search_technologiesSearch technologies (paginated).
get_technology_combinationsGet technology combinations (paginated).
get_popular_technologiesGet popular technologies (paginated).
get_technology_statsGet technology stats.
search_by_nameserverSearch scans by nameserver.
get_rdapGet RDAP details for a scan_id.
search_by_registrarSearch scans by registrar (paginated).
submit_scan_reportSubmit a scan report.
get_ocr_statsGet OCR stats.
get_ocr_by_scanGet OCR data for a scan_id.
get_open_graphGet Open Graph data for a scan_id.
get_pastejackingGet pastejacking findings for a scan_id.
get_netlogDescribe the network log (Chrome NetLog) for a scan_id: whether one exists, its size, and its encoding. The log itself is not returned - these are routinely tens of megabytes gzipped.
get_pcap_metadataGet PCAP metadata for a scan_id.
search_favicon_mmh3Search favicon by mmh3 hash (paginated).
get_js_fingerprinter2Get JS Fingerprinter2 results for a scan_id.
get_js_fingerprinter2_statsGet JS Fingerprinter2 stats.
get_js_fingerprinter2_healthGet JS Fingerprinter2 health check.
get_js_fingerprinter2_coverageGet JS Fingerprinter2 fingerprint coverage.
search_js_obfuscationSearch JS obfuscation signals.
search_js_malware_familiesSearch JS malware families.
search_js_fingerprinter2_composite_hashSearch JS Fingerprinter2 by composite hash.
search_js_fingerprinter2_signatureSearch JS Fingerprinter2 by signature.
search_js_fingerprinter2_similarSearch JS Fingerprinter2 similar scans.
get_js_segments_by_scanGet JS segments for a scan_id.
search_js_segments_by_hashSearch JS segments by code hash.
search_js_segments_by_normalized_hashSearch JS segments by normalized hash.
get_js_segments_suspiciousGet suspicious JS segments for a scan_id.
get_js_segments_unknownGet unknown JS segments for a scan_id.
run_js_differential_analysisRun JS differential analysis for a scan_id.
get_js_library_inventoryGet JS fingerprint library inventory.
search_js_fingerprint_patternsSearch JS fingerprints by patterns.
search_js_fingerprint_obfuscatedSearch obfuscated JS fingerprints.
search_js_fingerprint_by_serverSearch JS fingerprints by server type.
search_js_fingerprint_by_bundlerSearch JS fingerprints by bundler type.
search_js_fingerprint_by_cdnSearch JS fingerprints by CDN.
search_js_fingerprint_by_librarySearch JS fingerprints by library name.
search_js_fingerprint_by_library_versionSearch JS fingerprints by library version.
search_js_fingerprint_by_fuzzy_hashSearch JS fingerprints by fuzzy hash.
search_js_fingerprint_by_md5Search JS fingerprints by MD5 hash.
search_js_fingerprint_by_normalized_hashSearch JS fingerprints by normalized hash.
search_js_fingerprint_by_sha1Search JS fingerprints by SHA1 hash.
search_js_fingerprint_by_sha256Search JS fingerprints by SHA256 hash.
find_js_fingerprint_similar_by_hashFind similar JS fingerprints by hash.
search_jsfingerprints_by_bundlerSearch JS fingerprints by bundler (paginated).
search_jsfingerprints_by_librarySearch JS fingerprints by library (paginated).
search_jsfingerprints_by_library_versionSearch JS fingerprints by library version (paginated).
search_jsfingerprints_by_fuzzy_hashSearch JS fingerprints by fuzzy hash (paginated).
search_jsfingerprints_by_md5Search JS fingerprints by MD5 (paginated).
search_jsfingerprints_by_normalized_hashSearch JS fingerprints by normalized hash (paginated).
search_jsfingerprints_by_sha1Search JS fingerprints by SHA1 (paginated).
search_jsfingerprints_by_sha256Search JS fingerprints by SHA256 (paginated).
get_jsfingerprintGet JS fingerprint by ID.
get_jsfingerprint_similarFind similar JS fingerprints.
get_jsfingerprint_similarity_countsGet JS fingerprint similarity counts.
get_jsfingerprint_sourceGet JS fingerprint source.
get_jsfingerprint_bundle_statsGet JS fingerprint bundle statistics.
get_jsfingerprint_library_statsGet JS fingerprint library statistics.
get_jsfingerprint_hash_prevalenceGet JS fingerprint hash prevalence for a scan_id.
BEFORE YOU INSTALL
128 tools when we connected.
CONTEXT COST
Rated by the size of the 128 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
Run it locally over Streamable HTTP: git clone https://github.com/scanmalware/mcp-server && cd mcp-server && python -m venv .venv && source .venv/bin/activate && pip install -U pip && pip install .
Start the server on 127.0.0.1:8000: export MCP_TRANSPORT=streamable-http && export MCP_HOST=127.0.0.1 && export MCP_PORT=8000 && scanmalware-mcp
Docker alternative: docker build -t scanmalware-mcp . then docker run --rm -p 127.0.0.1:8000:8000 -e MCP_TRANSPORT=streamable-http -e MCP_HOST=0.0.0.0 -e MCP_PORT=8000 scanmalware-mcp
Or skip local install entirely and point your client at the hosted endpoint https://mcp.scanmalware.com/mcp
https://mcp.scanmalware.com/mcpMCP_TRANSPORT=streamable-http MCP_HOST=127.0.0.1 MCP_PORT=8000 scanmalware-mcp