Enrich a B2B lead sheet from an agent: CMS, mobile readiness and role emails, one MCP call per domain
You have a spreadsheet of company domains. Before anyone emails them you want to know, per row: is the site on WordPress or Wix, does it even have a mobile layout, does HTTPS work, and is there a published info@ / sales@
You have a spreadsheet of company domains. Before anyone emails them you want to know, per row: is the site on WordPress or Wix, does it even have a mobile layout, does HTTPS work, and is there a published info@ / sales@ address to write to. Doing that by hand is an afternoon; doing it with a scraper means writing and hosting one.
This post enriches the sheet with a single read-only MCP tool, site_info, from a remote server we run for our own outreach. No install, 10 free calls a day without a key, plain JSON-RPC over HTTPS.
What one call returns
curl -s -X POST https://weio.ai/mcp \
-H 'Content-Type: application/json' -H 'Accept: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
"params":{"name":"site_info","arguments":{"domain":"wordpress.org"}}}'
Result (the text content of the response, trimmed):
{"domain": "wordpress.org", "reachable": true, "final_url": "https://wordpress.org/",
"http_status": 200, "title": "Blog Tool, Publishing Platform, and CMS β WordPress.org",
"language": "en-US", "mobile_viewport": true, "cms": "wordpress",
"role_emails": [], "phones": [],
"social": {"x": "https://www.x.com/WordPress", "facebook": "https://www.facebook.com/WordPress/",
"linkedin": "https://www.linkedin.com/company/wordpress", "youtube": "https://www.youtube.com/wordpress"}}
A site with a broken certificate comes back with "certificate_error": true instead of a failure, so the row still enriches:
{"domain": "expired.badssl.com", "reachable": true, "certificate_error": true,
"http_status": 200, "mobile_viewport": true, "cms": null, "role_emails": []}
Fields: title, description, language, cms (WordPress, Wix, Squarespace, Shopify, Webflow, GoDaddy, Weebly, Joomla, Drupal, Duda, Ghost, or null), mobile_viewport (does the homepage declare width=device-width), role_emails, phones, social, contact_page, plus certificate_error when HTTPS is broken. One homepage fetch per call, redirects followed, 1.5 MB cap.
The enrichment script
Input: leads.csv with a domain column. Output: leads_enriched.csv with the new columns appended. Standard library only.
#!/usr/bin/env python3
import csv, json, sys, time, urllib.request
MCP = "https://weio.ai/mcp"
KEY = "" # optional: "wk_..." from https://weio.ai/services/site-check-api.html
def site_info(domain):
body = {"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": "site_info", "arguments": {"domain": domain}}}
headers = {"Content-Type": "application/json", "Accept": "application/json",
"User-Agent": "lead-enrich/1.0"}
if KEY:
headers["Authorization"] = "Bearer " + KEY
req = urllib.request.Request(MCP, data=json.dumps(body).encode(), headers=headers)
r = json.load(urllib.request.urlopen(req, timeout=60))
text = r["result"]["content"][0]["text"]
return json.loads(text.split("\n", 1)[0]) # first line is the JSON, rest is a footer
COLS = ["reachable", "certificate_error", "cms", "mobile_viewport", "role_emails", "phones", "contact_page"]
rows = list(csv.DictReader(open(sys.argv[1], newline="")))
with open(sys.argv[2], "w", newline="") as f:
w = csv.DictWriter(f, fieldnames=list(rows[0].keys()) + COLS)
w.writeheader()
for row in rows:
try:
info = site_info(row["domain"])
except Exception as e: # network error, daily quota exceeded, bad domain
info = {"reachable": f"error: {e}"}
for c in COLS:
v = info.get(c)
row[c] = ";".join(v) if isinstance(v, list) else v
w.writerow(row)
time.sleep(0.5)
Run: python3 enrich.py leads.csv leads_enriched.csv. Without a key the server answers 10 calls per day per client; the 11th returns an error the script writes into the reachable column, so you can see exactly where the free tier stopped and resume later. A key ($9 for 1,000 calls, 12 months) removes the daily cap.
What to do with the columns
-
mobile_viewportfalse: the site has no phone layout. That is the single most visible defect a small-business site can have, and a concrete, checkable reason to get in touch. -
certificate_errortrue: Chrome shows a full-page privacy warning to every visitor. Also concrete, also checkable by the recipient in five seconds. -
cms: decides what you can offer. A WordPress site can take a plugin or a speed fix; a Wix or Squarespace site cannot be touched from outside the builder. -
role_emailsempty: there is no published address. Use the contact form, or skip the row. Do not go looking for a named person's address elsewhere (see below).
What it deliberately does not return
-
No personal-name email addresses.
jane.doe@is dropped on the server side even when it is printed on the homepage; only role addresses (info@,sales@,office@,hello@and about fifty similar local parts) come back. For B2B outreach a role address is the one the business chose to publish for exactly this purpose, and it keeps you on the right side of CCPA and CAN-SPAM's spirit as well as its letter. - No page text. The tool extracts fields; it does not hand you the HTML or a text dump.
-
No crawling. One homepage fetch. If the business lists its email only on a contact page, you get
contact_pageand can decide yourself. - Public sites only. Private addresses, localhost and non-public hosts are refused.
Enrichment tells you what the business says about itself. Whether to email them, how often, and with what opt-out is still your job: real sender, physical postal address, an unsubscribe that is honored.
Using it from an agent instead of a script
Any MCP client that speaks streamable HTTP can add the server directly:
claude mcp add --transport http weio-site-check https://weio.ai/mcp
Then: "For each domain in this list, tell me the CMS, whether it has a mobile layout, and any role email." The tool is annotated readOnlyHint: true, so clients that gate side-effecting tools will not prompt for it. The companion tool check_https gives a fuller certificate diagnosis when certificate_error is true.
Weio is a small company in Santa Barbara, California where AI operators do most of the work and the owner is accountable. We built this for our own lead research and sell it because it was useful. Endpoint and terms: weio.ai/services/site-check-api.html. Listed in the official MCP registry as ai.weio/site-check.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β full credit and traffic to the original publisher.