contact-check
Contact Check validates and normalises contact data — phone numbers, email addresses and postal addresses — with production-grade rules and no API key.
Validate phone numbers (
check_phones): up to 100 numbers via Google's libphonenumber data, offline; returns valid/invalid with reason, number type (mobile, fixed line, toll free, VoIP), and E.164, international and national forms; accepts a default ISO country code for numbers written without+; flags fictional 555-range numbers.Validate email addresses (
check_emails): up to 100 addresses, without sending mail; checks syntax, whether the domain exists and accepts mail (MX, null MX, none), disposable providers, role accounts (info@,support@) and likely typos of big providers (gmial.com), with a reason when invalid.Validate postal addresses (
check_addresses): up to 50 addresses against each country's rules from Google's address data; checks required fields, postcode pattern and state/province by code or name, and returns the address formatted as that country writes it; without street and city it returns the country's rules and regions.Safe and simple to run: read-only, idempotent tools requiring no account or key; phone checks are offline, email checks only query DNS-over-HTTPS about the domain (never the address or mail), and results are compact JSON matching the output schemas.
Queries Cloudflare's 1.1.1.1 DNS-over-HTTPS service to resolve mail-related DNS records (MX) when validating email addresses, so domain deliverability can be checked without sending any mail.
Uses Cloudflare's DNS-over-HTTPS resolver to look up MX records for email domains, determining whether a domain accepts mail, has a null MX (refuses all mail), or does not exist — without ever sending mail or transmitting the address itself.
Checks phone numbers and postal addresses using Google's data: libphonenumber metadata (validity, number type, E.164/international/national formatting) and Google's libaddressinput address data (required fields, postcode patterns, states/provinces, and country-specific address formatting) as served for Chrome and Android forms.
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., "@contact-check Validate these phone numbers and emails"
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.
Contact Check
Agents fill forms, clean CRM exports and write shipping labels, and they check contact data by
eye: a UK number written without its country code, jane@gmial.com, a ZIP code with four digits,
a German address "missing" the state it does not need. Contact Check validates and normalises
contact data with the rules that production systems use:
Phone numbers with Google's libphonenumber data (offline): valid for their country or why not, the type (mobile, fixed line, toll free, VoIP...), E.164, international and national forms. North American numbers in the range reserved for fiction are noted.
Email addresses without sending anything: syntax, whether the domain accepts mail (MX records, a null MX that refuses all mail, or none at all), disposable providers, role accounts, and likely typos of the big providers (gmial.com, outlook.con).
Postal addresses against each country's rules from Google's address data (what Chrome and Android forms use): required fields, postcode pattern, states and provinces by code or name, and the address written as the country formats it.
Up to 100 phone numbers or emails, or 50 addresses, per call. No key needed.
Built and maintained by Arhan Canli.
Install
Needs Node.js 20 or newer. No account or key.
Claude Code
claude mcp add contact-check -- npx -y contact-check-mcpClaude Desktop: download contact-check-mcp-<version>.mcpb from the latest release and open it. The bundle is signed; verify it with gh attestation verify <file> --repo arhancanli/contact-check-mcp.
Any other client (Windsurf, Zed, Cline, Continue and others), in its MCP config file:
{
"mcpServers": {
"contact-check": {
"command": "npx",
"args": [
"-y",
"contact-check-mcp"
]
}
}
}Docker
docker build -t contact-check-mcp https://github.com/arhancanli/contact-check-mcp.git && docker run -i --rm contact-check-mcpHosted (Streamable HTTP): node src/server.mjs --http serves stateless MCP at POST /mcp (port from PORT, default 3000).
Related MCP server: contact-verification-mcp
Example
An agent calls check_phones with:
{
"numbers": [
"+44 20 7946 0958",
"020 7946 0958",
"+1 202-555-0143",
"+971 50 123 4567",
"+1 800 555 0199",
"12345",
"+44 20 794"
],
"country": "GB"
}and gets back (recorded from the live server on 2026-09-26):
{
"valid": 5,
"results": [
{
"input": "+44 20 7946 0958",
"valid": true,
"e164": "+442079460958",
"international": "+44 20 7946 0958",
"national": "020 7946 0958",
"country": "GB",
"calling_code": "+44",
"type": "fixed_line"
},
{
"input": "020 7946 0958",
"valid": true,
"e164": "+442079460958",
"international": "+44 20 7946 0958",
"national": "020 7946 0958",
"country": "GB",
"calling_code": "+44",
"type": "fixed_line"
},
{
"input": "+1 202-555-0143",
"valid": true,
"e164": "+12025550143",
"international": "+1 202 555 0143",
"national": "(202) 555-0143",
"country": "US",
"calling_code": "+1",
"type": "fixed_line_or_mobile",
"note": "a number reserved for fiction (555-0100 to 555-0199)"
},
{
"input": "+971 50 123 4567",
"valid": true,
"e164": "+971501234567",
"international": "+971 50 123 4567",
"national": "050 123 4567",
"country": "AE",
"calling_code": "+971",
"type": "mobile"
},
{
"input": "+1 800 555 0199",
"valid": true,
"e164": "+18005550199",
"international": "+1 800 555 0199",
"national": "(800) 555-0199",
"country": "US",
"calling_code": "+1",
"type": "toll_free",
"note": "a number reserved for fiction (555-0100 to 555-0199)"
},
{
"input": "12345",
"valid": false,
"reason": "too short for its country",
"country": "GB"
... (8 more lines)Tools
Tool | What it does |
| Checks up to 50 postal addresses against each country's rules (Google's address data): required fields, postcode pattern, state or province, and writes each as the country formats it. Without street and city, returns the country's rules and regions. |
| Checks up to 100 email addresses without sending mail: syntax, whether the domain exists and accepts mail (MX), disposable providers, role accounts (info@, support@), and likely typos of big providers (gmial.com). Gives the reason when invalid. |
| Validates up to 100 phone numbers with Google's libphonenumber data: valid for their country or why not, type (mobile, fixed line, toll free, VoIP...), and E.164, international and national forms. country (ISO code) for numbers written without +. |
How it behaves
Read-only: no tool changes anything outside this process.
Network: HTTPS only, to the hosts listed in
package.jsonunderfactory.allowHosts, with a deadline, a size cap and bounded retries. Nothing else is contacted, and nothing is logged except unexpected failures (to stderr, without your inputs).Phone checks run offline. Email checks ask Cloudflare's DNS-over-HTTPS resolver about the domain only (the address itself is never sent anywhere, and no mail is sent). Address rules come from Google's address data service, one small file per country, cached for 30 minutes.
A valid email means the domain accepts mail; whether the mailbox exists cannot be known without sending, which this server never does.
Results are compact JSON with a matching output schema.
Benchmark
Measured 2026-09-26 with gpt-5.4-mini, 10 fixed tasks graded by fixed checks (bench/tasks.json, raw results in bench/results/).
Server | Correct | Input tokens | Output tokens | Tool calls | Median time |
This server | 10/10 | 10735 | 285 | 8 | 2.3 s |
mcp-server-fetch (no open contact-validation server exists; this is what agents use today) | 9/10 | 10584 | 310 | 7 | 2.0 s |
Performance
Measured 2026-09-26 from Dubai, home connection against the live upstream, Node 24.19.0 (bench/perf.json, scripts/perf.mjs in the factory).
Call | First call | Repeat | Result size |
check_phones: 7 numbers (UK, US, UAE, toll free, fictional, too short) | 5 ms | 0.5 ms | 1,216 chars |
check_emails: 9 addresses (typos, disposable, role, null MX, no domain) | 1090 ms | 0.6 ms | 1,730 chars |
check_addresses: 5 addresses (US, UK, bad state and ZIP, UAE, rules only) | 281 ms | 0.6 ms | 681 chars |
First call: a fresh server process, including the TLS connection and the upstream's own time. Repeat: the same call again, answered from the in-process cache, so it shows this server's own overhead.
Tool definitions the model reads on every turn (name, description, input schema): 1,920 characters, against 1,105 for mcp-server-fetch (no open contact-validation server exists; this is what agents use today). The full tool list, with the output schemas and annotations clients use to validate results, is 3,109 characters (1,104 for the alternative).
Data sources
libphonenumber-js (MIT), Google's libphonenumber metadata.
Google address data (Apache 2.0), as served for Chrome's autofill.
disposable-email-domains (CC0).
DNS over HTTPS from Cloudflare.
More MCP servers by Arhan Canli
Actions Check: Checks GitHub Actions workflows: outdated actions, old Node runtimes, retired runners, injection.
Citation Check: Verifies citations: finds fabricated or mismatched references and retractions, returns clean BibTeX.
Config Check: Validates config files against their official schemas: tsconfig, compose, workflows, 1,400+ more.
Cron Check: Explains cron expressions, lists next run times in any time zone, converts between cron dialects.
Dockerfile Check: Checks Dockerfiles: build-breaking mistakes, base image tags that exist, digests, platforms, EOL.
Domain Health: Email and domain checks: SPF lookup limits, DKIM keys, DMARC, DNS records, registration expiry.
Drug Label: FDA drug label answers with section citations, RxNorm name resolution, recalls and shortages.
End of Life: Is this version still supported? EOL dates, latest patch and upgrade target for 470+ products.
The whole collection, 12 more
License
MIT, Copyright (c) 2026 Arhan Canli.
Available Tools
3 toolscheck_addressesValidate postal addressesARead-onlyIdempotent
Checks up to 50 postal addresses against each country's rules (Google's address data): required fields, postcode pattern, state or province, and writes each as the country formats it. Without street and city, returns the country's rules and regions.
Inputs: addresses (required). Returns: results
check_emailsValidate email addressesARead-onlyIdempotent
Checks up to 100 email addresses without sending mail: syntax, whether the domain exists and accepts mail (MX), disposable providers, role accounts (info@, support@), and likely typos of big providers (gmial.com). Gives the reason when invalid.
Inputs: emails (required). Returns: valid, results
check_phonesValidate phone numbersARead-onlyIdempotent
Validates up to 100 phone numbers with Google's libphonenumber data: valid for their country or why not, type (mobile, fixed line, toll free, VoIP...), and E.164, international and national forms. country (ISO code) for numbers written without +.
Inputs: numbers (required), country. Returns: valid, results
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 3 tools
Each tool targets a completely distinct contact channel: addresses, emails, and phone numbers. There is no overlap in purpose or output, so an agent can reliably select the right tool based on the input type.
All three tool names follow the exact same check_<plural noun> pattern using snake_case. The naming is uniform and predictable, making the set easy to navigate.
Three tools is well-scoped for a contact-checking server. Each tool covers one major contact method without unnecessary bloat or redundancy.
The server covers the three core contact data types—address, email, and phone—with validation and formatting details. Minor gaps exist, such as lacking a batch/combined contact check or support for other contact identifiers, but the surface is coherent and practical for its stated purpose.
Maintenance
Related MCP Connectors
Verify addresses, email addresses, and phone numbers with confidence scores.
Validate emails (MX, disposable, role, typo) and phone numbers, singly or in batches, for AI agents.
Verify emails, validate phone numbers, look up carriers and score IP addresses.
Address validation & geocoding for AI agents: 240+ countries, UK PAF, free US/CA enrichment
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI-driven data quality operations such as validation, enrichment, and deduplication for customer data fields including email, address, phone, and LinkedIn profiles through natural language interactions.2MIT
- FlicenseAqualityCmaintenanceEnables agents to verify postal addresses, email addresses, and phone numbers against Melissa's Global Verification APIs before acting on the data, including batch verification and a per-session call budget to prevent runaway costs.4-
- FlicenseNot gradedqualityBmaintenanceEnables AI agents to verify email addresses in real-time, checking syntax, DNS, MX records, and SMTP handshake, returning verdicts and deliverability scores without sending actual emails.-
- AlicenseNot gradedqualityCmaintenanceEnables validating and enriching phone numbers, returning validity, international/national formats, carrier, line type, and country/location data.116 npmMIT