sitecheck-mcp
Integrates Google Safe Browsing v4 to check URLs against Google's phishing and malware lists as part of the site risk assessment.
Integrates VirusTotal v3 to retrieve engine verdicts, community votes, and WHOIS age for URLs and domains during reputation checks.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sitecheck-mcpis ausoutletstore.com a scam? I'm about to buy something there"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sitecheck-mcp
MCP server that answers "is this website legit or a scam?". It gathers evidence from registration data, TLS, DNS, certificate-transparency and archive history, crowd-sourced phishing/malware feeds, optional reputation APIs, brand look-alike analysis and the landing page itself, and returns a weighted verdict with the reasons behind it.
Verdicts: low_risk · caution · suspicious · likely_scam · dangerous
(any critical signal) · not_registered. low_risk means no evidence
found, not verified safe: fresh scam domains go unlisted for hours to days.
Tools
Tool | Parameters | What it does |
|
| Full assessment: verdict, 0-100 |
|
| Age, registrar, .au registrant + ABN/ACN, TLS (DV/OV/EV), DNS/mail, Tranco rank |
|
| Blocklists + reputation APIs only |
|
| Typosquats, homoglyph/IDN spoofs, brand-stuffed names |
|
| One guarded GET + content red flags |
|
| ABN/ACN checksum + Australian Business Register lookup |
|
| Which sources are configured; feed ages |
Related MCP server: websec-auditor
Evidence sources
Source | Key? | Signal |
RDAP (rdap.org) | no | registration date, registrar, status |
auDA WHOIS (port 43) | no | .au registrant entity + ABN/ACN (.au RDAP has no creation date) |
DNS (dnspython) | no | resolves, MX/SPF/DMARC |
TLS handshake | no | validity, issuer, DV/OV/EV, certificate organisation |
crt.sh | no | first certificate ever logged (age lower bound) |
Wayback CDX | no | first archive capture (age lower bound) |
Tranco top-1M | no | popularity rank (top 100k kept) |
Phishing.Database ACTIVE | no | crowd-sourced active phishing domains (~390k) |
OpenPhish community | no | live phishing URLs |
URLhaus online feed | no | live malware URLs |
ABN/ACN checksum | no | fake business numbers fail the check digits |
Google Safe Browsing v4 |
| Google's phishing/malware lists |
VirusTotal v3 |
| engine verdicts, community votes, WHOIS age |
urlscan.io search |
| community scans + verdicts |
URLhaus host API |
| host malware history |
ABN Lookup |
| entity name, status, registration date |
Trustpilot and ScamAdviser were evaluated and left out: both refuse non-browser clients (403), and working around bot protection is out of scope.
Feeds are cached in ~/.cache/sitecheck-mcp (SITECHECK_CACHE_DIR) and
refreshed on use (Tranco weekly, phishing feeds 6–12 h). A failed refresh
keeps serving the stale copy.
Safety design
No SSRF: every host is resolved and refused unless all its addresses are globally routable (no loopback, RFC1918, 100.64/10 tailnet, link-local). The page fetcher re-checks on every redirect hop.
Query strings stripped by default before any fetch or lookup: phishing links carry per-recipient tokens, and fetching one tells the sender the message was opened.
keep_query=trueopts in.Lookups only: nothing is submitted for scanning (VirusTotal/urlscan submissions are public).
One plain GET, no JavaScript, no cookies kept, 2 MB cap, 6 redirects max.
Logs record tool name, outcome and duration only, never arguments.
Scoring
An additive model from a baseline of 10: red flags add points, trust signals
subtract. Any critical signal forces dangerous (feed listing, Safe
Browsing, ≥3 VirusTotal engines, homoglyph of a brand, a brand domain as a
subdomain, a brand login page on the wrong domain). The weights are judgement
calls, not probabilities; see scoring.py. Feed hits are exact-host:
the phishing lists include shared platforms (sites.google.com), which are
downgraded to informational. The same goes for URLhaus's per-host count
(drive.google.com carries thousands of uploaded malware URLs). The platform
list (SHARED_PLATFORM_HOSTS in checker.py) holds exact hosts where many
users share one hostname. Per-user subdomains (x.netlify.app) are their own
site, and an exact-URL listing stays critical everywhere.
Whose reputation counts:
Rank, age and the registrant's ABN belong to the registered domain. They vouch for the host only if it resolves and isn't borrowing someone else's name. A dead hostname or a fake-.au host gets none of them (noted as
not credited).A live subdomain gets a scaled share of its parent's rank (
parent_popular): −30 under a top-1k parent, −15 under a top-10k one.Fake .au suffixes (
fake_au_suffix):x.au.com(au.com is KDDI's ordinary .com),x.comau.shop,-com-aulabels, and.com.au/.gov.auinside a subdomain (mygov.gov.au.verify.top). A real .com.au needs an ABN/ACN to register; these look the same and need nothing.Young ABNs earn no trust: an active registration under a year old gives no credit, and under 90 days is a mild flag. Scam operators register real Pty Ltds. The age comes from
AbnStatusEffectiveFrom, because the ABR JSON has no original-registration date.
Known limit: sites behind a JavaScript bot gate hide their storefront from
the fetch. A home-made gate ("verifying your browser") on a young, unranked
site is scored as a cloaking signal, and the content checks report
blocked by ... bot challenge.
Install
uvx sitecheck-mcp --stdio # or: pip install sitecheck-mcpClaude Desktop / Claude Code (stdio):
{"mcpServers": {"sitecheck": {"command": "uvx", "args": ["sitecheck-mcp", "--stdio"]}}}Every reputation API key is optional; source_status shows which sources are active.
Running
uv run --env-file .env sitecheck-mcp --stdio # stdio client
MCP_BEARER_TOKEN=... uv run sitecheck-mcp # HTTP :8333/mcp, bearer requiredTests
uv run --extra test pytest tests/ -q # unit + mocked (offline)
SITECHECK_LIVE=1 uv run --extra test pytest tests/test_integration.py -v # live, read-onlyThis server cannot be deployed
Maintenance
Related MCP Connectors
Is this website a scam? Dated, sourced fraud assessments of domains. Free, read-only, no key.
Score an IP, email, phone, domain or device for fraud in one call, with the signals behind it.
Inspects live IPv4/IPv6 DNS resolution, TLS certificate issuer/expiry, and HTTP security grade.
Inspects live IPv4/IPv6 DNS resolution, TLS certificate issuer/expiry, and HTTP security grade.
Related MCP Servers
- AlicenseAqualityFmaintenanceAI-powered threat verification across 6 channels: phone numbers, URLs, text messages, emails, documents, and QR codes. Analyzes threats against 10M+ intelligence records from FTC, FCC, URLhaus, ThreatFox, and community reports, returning risk scores, verdicts, and detailed signals.101MIT
- FlicenseNot gradedqualityBmaintenancePassive website security and trust auditor that checks for security, SEO, AI surface, email, and other exposures, producing a score and remediation plan.-
- AlicenseAqualityCmaintenancePerforms comprehensive website health audits including SSL, DNS, email authentication, performance, uptime, and broken link checks, all without requiring API keys. Returns a scored report with weighted metrics and actionable recommendations.743 npmMIT
- FlicenseNot gradedqualityDmaintenanceChecks URLs for phishing risks using URL, DNS, HTTP, HTML, and mobile rendering signals, and provides a 1024x1024 PNG visual summary of the page.-