Gives Claude 16 tools to analyze URLs across redirect chains, brand impersonation, domain age, SSL/TLS, parked detection, URL structure, and DNS records. Returns structured signals with configurable risk scores (0-100) instead of binary verdicts. You get 20 free checks, then pay per unknown domain while known domains and cached results stay free. Useful for batch lead list verification, link health audits, vendor vetting, or any workflow where you need domain intelligence at scale. Works as local MCP (stdio), hosted remote server, or REST API. Ships with a companion skill that teaches Claude to proactively check URLs before following them.
Public tool metadata for what this MCP can expose to an agent.
signupCreate a new Unphurl account. Returns an API key (shown once, store it securely). After signup, the user must check their email and click the verification link. The API key won't work for URL checks until the email is verified. Verification link expires after 24 hours. If the...3 paramsCreate a new Unphurl account. Returns an API key (shown once, store it securely). After signup, the user must check their email and click the verification link. The API key won't work for URL checks until the email is verified. Verification link expires after 24 hours. If the...
emailstringcompanystringfirst_namestringresend_verificationResend the email verification link for an existing Unphurl account. Use this when a user signed up but their verification link expired (links are valid for 24 hours) and they need a new one. The user's API key won't work until their email is verified. For security, the respons...1 paramsResend the email verification link for an existing Unphurl account. Use this when a user signed up but their verification link expired (links are valid for 24 hours) and they need a new one. The user's API key won't work until their email is verified. For security, the respons...
emailstringcheck_urlCheck a single URL for security and data quality signals. Returns a risk score (0-100), detailed signal breakdown, and metadata. Unphurl analyses URLs across seven dimensions: redirect behaviour, brand impersonation, domain intelligence (age, registrar, expiration, status code...2 paramsCheck a single URL for security and data quality signals. Returns a risk score (0-100), detailed signal breakdown, and metadata. Unphurl analyses URLs across seven dimensions: redirect behaviour, brand impersonation, domain intelligence (age, registrar, expiration, status code...
urlstringprofilestringcheck_urlsCheck multiple URLs in a single batch. Returns results for all URLs, handling async processing automatically. Each URL is analysed across seven dimensions: redirect behaviour, brand impersonation, domain intelligence (age, registrar, expiration, status codes, nameservers via R...2 paramsCheck multiple URLs in a single batch. Returns results for all URLs, handling async processing automatically. Each URL is analysed across seven dimensions: redirect behaviour, brand impersonation, domain intelligence (age, registrar, expiration, status codes, nameservers via R...
urlsarrayprofilestringlist_profilesList all custom scoring profiles on this account. Returns profile names and their custom weight overrides. Profiles are named weight sets that change how Unphurl scores URLs. Different use cases need different scoring. A cold email agent cares about dead domains. A security bo...List all custom scoring profiles on this account. Returns profile names and their custom weight overrides. Profiles are named weight sets that change how Unphurl scores URLs. Different use cases need different scoring. A cold email agent cares about dead domains. A security bo...
No parameter schema in public metadata yet.
create_profileCreate or update a custom scoring profile. Profiles are sparse overrides: only specify the weights you want to change. Everything else keeps its default value. If a profile with this name already exists, it is updated with the new weights (full replacement, not merge). Weights...2 paramsCreate or update a custom scoring profile. Profiles are sparse overrides: only specify the weights you want to change. Everything else keeps its default value. If a profile with this name already exists, it is updated with the new weights (full replacement, not merge). Weights...
namestringweightsobjectdelete_profileDelete a custom scoring profile. This is permanent. Any future check requests using this profile name will fall back to default weights. Use list_profiles to see your current profiles before deleting.1 paramsDelete a custom scoring profile. This is permanent. Any future check requests using this profile name will fall back to default weights. Use list_profiles to see your current profiles before deleting.
namestringshow_defaultsShow all 23 scoring signals with their default weights and descriptions. This is the baseline scoring that applies when no custom profile is specified. Use this to understand what each signal means and how much it contributes to the score before creating custom profiles. Profi...Show all 23 scoring signals with their default weights and descriptions. This is the baseline scoring that applies when no custom profile is specified. Use this to understand what each signal means and how much it contributes to the score before creating custom profiles. Profi...
No parameter schema in public metadata yet.
get_balanceCheck your pipeline check credit balance. Shows credits remaining, total purchased, total used, and lifetime free lookups count. Credits are consumed only when unknown domains run through the full analysis pipeline. Known domains (Tranco Top 100K) and cached domains (previousl...Check your pipeline check credit balance. Shows credits remaining, total purchased, total used, and lifetime free lookups count. Credits are consumed only when unknown domains run through the full analysis pipeline. Known domains (Tranco Top 100K) and cached domains (previousl...
No parameter schema in public metadata yet.
get_pricingShow available pipeline check credit packages and pricing. Returns all packages with credit counts and prices. Packages (one-time purchase, no subscription): - Starter: 100 credits for $9 ($0.09 each) - Standard: 500 credits for $39 ($0.078 each) - Pro: 2,000 credits for $99 (...Show available pipeline check credit packages and pricing. Returns all packages with credit counts and prices. Packages (one-time purchase, no subscription): - Starter: 100 credits for $9 ($0.09 each) - Standard: 500 credits for $39 ($0.078 each) - Pro: 2,000 credits for $99 (...
No parameter schema in public metadata yet.
purchasePurchase pipeline check credits. Returns a Stripe Checkout URL that the user must open in a browser to complete payment. The AI cannot complete the payment. Tell the user to open the URL in their browser, complete the Stripe checkout, and then confirm they've paid. Credits are...1 paramsPurchase pipeline check credits. Returns a Stripe Checkout URL that the user must open in a browser to complete payment. The AI cannot complete the payment. Tell the user to open the URL in their browser, complete the Stripe checkout, and then confirm they've paid. Credits are...
packagestringpkg_100 · pkg_500 · pkg_2000 · pkg_10000check_historyView recent URL check history. Shows what URLs have been checked, their scores, phishing status, and whether each check was free or used a pipeline credit. Results are paginated. Use page and limit parameters to navigate. Default is 20 results per page, maximum 100. History is...2 paramsView recent URL check history. Shows what URLs have been checked, their scores, phishing status, and whether each check was free or used a pipeline credit. Results are paginated. Use page and limit parameters to navigate. Default is 20 results per page, maximum 100. History is...
pageintegerlimitintegerget_statsView your account usage statistics. Shows total URLs submitted, breakdown by gate (Tranco lookups, cache lookups, pipeline checks), free rate percentage, score threshold counts, and credit balance. Use this to understand your usage patterns: how many of your checks resolved fr...View your account usage statistics. Shows total URLs submitted, breakdown by gate (Tranco lookups, cache lookups, pipeline checks), free rate percentage, score threshold counts, and credit balance. Use this to understand your usage patterns: how many of your checks resolved fr...
No parameter schema in public metadata yet.
list_allowlistList all domains on this account's trusted allowlist. Allowlisted domains suppress the compound signal and brand impersonation floor in scoring. The full pipeline still runs — all signals remain visible for monitoring. Use this to see which domains are currently trusted. Retur...List all domains on this account's trusted allowlist. Allowlisted domains suppress the compound signal and brand impersonation floor in scoring. The full pipeline still runs — all signals remain visible for monitoring. Use this to see which domains are currently trusted. Retur...
No parameter schema in public metadata yet.
add_to_allowlistAdd one or more domains to this account's trusted allowlist. Allowlisted domains suppress the compound signal and brand impersonation floor in scoring. The full pipeline still runs — all signals remain visible so you can monitor trusted domains for SSL expiry, parking, or othe...1 paramsAdd one or more domains to this account's trusted allowlist. Allowlisted domains suppress the compound signal and brand impersonation floor in scoring. The full pipeline still runs — all signals remain visible so you can monitor trusted domains for SSL expiry, parking, or othe...
domainsarrayremove_from_allowlistRemove one or more domains from this account's trusted allowlist. Once removed, those domains resume normal scoring on the next check. Use list_allowlist to see what is currently on the list before removing.1 paramsRemove one or more domains from this account's trusted allowlist. Once removed, those domains resume normal scoring on the next check. Use list_allowlist to see what is currently on the list before removing.
domainsarray _ _ _ _ ____ _ _ _ _ ____ _
| | | | \ | | _ \| | | | | | | _ \| |
| | | | \| | |_) | |_| | | | | |_) | |
| |_| | |\ | __/| _ | |_| | _ <| |___
\___/|_| \_|_| |_| |_|\___/|_| \_\_____|
URL intelligence for AI agents and developers. 16 MCP tools. 25 signals. 7 dimensions.
Give your AI agent eyes for URLs. Unphurl analyses any URL across 7 dimensions (redirect behaviour, brand impersonation, domain age, SSL/TLS, parked detection, URL structure, DNS enrichment) and returns structured signals with a configurable 0-100 risk score. Signals, not verdicts. Your agent decides what to do with them.
Works with Claude Code, Claude Desktop, Claude Cowork, ChatGPT desktop, Cursor, Windsurf, and any MCP-compatible tool.
Every new account gets 20 free pipeline check credits. Most lookups are free. Known domains (Tranco Top 100K) and previously analysed domains return cached results at no cost. You only pay when an unknown domain runs through the full pipeline.
| Package | Credits | Price | Per check |
|---|---|---|---|
| Starter | 100 | $9 | $0.090 |
| Standard | 500 | $39 | $0.078 |
| Pro | 2,000 | $99 | $0.050 |
| Scale | 10,000 | $399 | $0.040 |
One-time purchases, no subscriptions. In typical use, 95-99% of URLs resolve free.
Add to your .mcp.json (Claude Code, Claude Desktop, Claude Cowork, ChatGPT desktop, Cursor, Windsurf, or any MCP-compatible tool):
{
"mcpServers": {
"unphurl": {
"command": "npx",
"args": ["-y", "@unphurl/mcp-server"],
"env": {
"UNPHURL_API_KEY": "uph_your_key_here"
}
}
}
}
The AI can create one for you. Just ask: "Sign up for Unphurl." The signup tool works without an API key. After signup, add the key to your MCP configuration and restart.
Just talk to your AI:
"Check https://suspicious-domain.xyz"
"Batch check all URLs in this spreadsheet"
"Create a scoring profile called 'lead-qual' that weights parked domains at 30 and no MX record at 20"
"Check my credit balance"
No commands to memorize. No syntax to learn. Your AI handles the tool calls.
Every check returns signals across 7 dimensions:
| Dimension | What it tells you |
|---|---|
| Redirect behaviour | Full chain (up to 10 hops), shortener detection, stopped reasons |
| Brand impersonation | Levenshtein + homoglyph analysis against 150+ brands |
| Domain intelligence | Age, registrar, expiration, status codes, nameservers (via RDAP) |
| SSL/TLS | Real handshake validation from Cloudflare's edge |
| Parked detection | 4-layer check: registrar pages, for-sale, empty content, parking services |
| URL structure | Length, path depth, subdomain count, entropy, IP detection, encoded chars |
| DNS enrichment | MX record existence (can the domain receive email?) |
Every signal is business intelligence. Domain age tells you how established a company is. No MX record means they can't receive email. Expiring domains mean a business might be shutting down. Combined with your AI's ability to process in bulk and output to spreadsheets, it becomes a lightweight due diligence engine.
| Tool | What it does | Auth |
|---|---|---|
signup | Create a new account, get an API key | No |
resend_verification | Resend verification email (3/hour limit) | Yes |
check_url | Check a single URL across all 7 dimensions | Yes |
check_urls | Batch check up to 500 URLs (handles async polling automatically) | Yes |
list_profiles | List your custom scoring profiles | Yes |
create_profile | Create or update a scoring profile with custom weights | Yes |
delete_profile | Delete a scoring profile | Yes |
show_defaults | Show all 25 scoring signals with default weights | No |
get_balance | Check your pipeline check credit balance | Yes |
get_stats | View usage statistics and score threshold counts | Yes |
get_pricing | Show available credit packages and pricing | No |
purchase | Purchase credits (returns Stripe Checkout URL) | Yes |
check_history | View recent URL check history | Yes |
list_allowlist | List trusted domains that suppress scoring amplifiers | Yes |
add_to_allowlist | Add domains to your trusted allowlist (up to 100 per request) | Yes |
remove_from_allowlist | Remove domains from your trusted allowlist | Yes |
"Check these 500 URLs. Give me two lists: the clean ones (score under 25) and the flagged ones (score 50 or higher). Export both as CSV."
Your AI gets the batch results, filters by score, and outputs the lists. No code, no scripting.
Different jobs need different weights. A security bot cares about brand impersonation. A cold email tool cares about parked domains and missing MX records.
"Create a profile called 'cold-email' that weights parked at 30, no_mx_record at 20, and domain_age_7 at 25. Then batch check my lead list using that profile."
Unphurl inside an AI chat combines with everything else your agent has access to:
The check-url-safety skill teaches your AI to proactively check URLs before following or recommending them, without being asked.
Claude Cowork or Claude Desktop: Just ask: "Install the Unphurl URL safety skill."
Claude Code, Cursor, or other dev tools:
# Global (all projects)
cp node_modules/@unphurl/mcp-server/skills/check-url-safety.md ~/.claude/skills/
# Or for a specific project
cp node_modules/@unphurl/mcp-server/skills/check-url-safety.md .claude/skills/
Unphurl costs you $0.04-$0.09 per check. A website link audit takes 15 minutes and uses 50-100 credits. Charge $150-$500 per audit.
Service ideas: link health audits, lead list verification, SEO backlink audits, newsletter link monitoring, vendor vetting reports, brand protection monitoring, influencer vetting.
npx unphurl (npm)MIT
UNPHURL_API_KEY*secretYour Unphurl API key (get one at unphurl.com or via the signup tool)