Unphurl

io.github.123ErgoPublished by GitHub account 123Ergov0.2.3Updated Oct 24, 2026

URL intelligence for AI agents and developers. 16 tools, 25 signal weights, 20 free checks.

Overview

AI-generated overview

Unphurl gives an AI assistant URL risk intelligence: it checks single or batched URLs across seven signal dimensions and returns a configurable 0-100 risk…

What you can do
  • Check single URLs or batches of up to 500 for risk scores, signal breakdowns and metadata
  • Estimate credit cost before a batch and review past checks, usage stats and credit balance
  • Create, list and delete custom scoring profiles, and inspect the 25 default signal weights
  • Manage a trusted domain allowlist that suppresses scoring amplifiers
  • Create an account, resend email verification, view pricing and start a credit purchase
  • Generate a branded PDF audit report with a 24-hour download link
When to use it
Useful when an assistant needs to vet links before following or recommending them, screen lead lists or CRM exports for dead, parked or impersonating domains, or run bulk link audits and due diligence inside a chat.
Requirements
A remote endpoint at mcp.unphurl.com or the local npm package run via npx with Node.js. An Unphurl API key in the UNPHURL_API_KEY environment variable is required for checks; the signup tool works without one, but the key only works after the account email is verified. A positive credit balance is needed for all checks, even free lookups.
Before you install
The signup tool creates a real account and returns an API key shown once, which must be stored securely. Checks consume paid credits for unknown domains, and the purchase tool returns a Stripe Checkout link for real money; the assistant cannot complete payment. Profiles and allowlist changes are written to the account, and deleting a profile is permanent. Submitted URLs and account data go to a third-party service.

Installation

In SourceWeft

  1. Open Unphurl in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.123Ergo%2Funphurl/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "unphurl": {
      "type": "http",
      "url": "https://mcp.unphurl.com/mcp"
    }
  }
}

README

 _   _ _   _ ____  _   _ _   _ ____  _| | | | \ | |  _ \| | | | | | |  _ \| || | | |  \| | |_) | |_| | | | | |_) | || |_| | |\  |  __/|  _  | |_| |  _ <| |___ \___/|_| \_|_|   |_| |_|\___/|_| \_\_____|

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.

What it costs

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.

PackageCreditsPricePer check
Starter100$9$0.090
Standard500$39$0.078
Pro2,000$99$0.050
Scale10,000$399$0.040

One-time purchases, no subscriptions. In typical use, 95-99% of URLs resolve free.

Quick start

1. Add to your MCP configuration

Add to your .mcp.json (Claude Code, Claude Desktop, Claude Cowork, ChatGPT desktop, Cursor, Windsurf, or any MCP-compatible tool):

json
{  "mcpServers": {    "unphurl": {      "command": "npx",      "args": ["-y", "@unphurl/mcp-server"],      "env": {        "UNPHURL_API_KEY": "uph_your_key_here"      }    }  }}

2. No account yet?

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.

3. Start checking URLs

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.

What you get back

Every check returns signals across 7 dimensions:

DimensionWhat it tells you
Redirect behaviourFull chain (up to 10 hops), shortener detection, stopped reasons
Brand impersonationLevenshtein + homoglyph analysis against 150+ brands
Domain intelligenceAge, registrar, expiration, status codes, nameservers (via RDAP)
SSL/TLSReal handshake validation from Cloudflare's edge
Parked detection4-layer check: registrar pages, for-sale, empty content, parking services
URL structureLength, path depth, subdomain count, entropy, IP detection, encoded chars
DNS enrichmentMX 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.

16 Tools

ToolWhat it doesAuth
signupCreate a new account, get an API keyNo
resend_verificationResend verification email (3/hour limit)Yes
check_urlCheck a single URL across all 7 dimensionsYes
check_urlsBatch check up to 500 URLs (handles async polling automatically)Yes
list_profilesList your custom scoring profilesYes
create_profileCreate or update a scoring profile with custom weightsYes
delete_profileDelete a scoring profileYes
show_defaultsShow all 25 scoring signals with default weightsNo
get_balanceCheck your pipeline check credit balanceYes
get_statsView usage statistics and score threshold countsYes
get_pricingShow available credit packages and pricingNo
purchasePurchase credits (returns Stripe Checkout URL)Yes
check_historyView recent URL check historyYes
list_allowlistList trusted domains that suppress scoring amplifiersYes
add_to_allowlistAdd domains to your trusted allowlist (up to 100 per request)Yes
remove_from_allowlistRemove domains from your trusted allowlistYes

Power moves

Batch check + filter

"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.

Custom scoring profiles

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."

Combine with other tools

Unphurl inside an AI chat combines with everything else your agent has access to:

  • Spreadsheets: Read a CRM export, batch-check every URL, write results back with risk scores
  • Web scraping: Scrape a competitor's partner page, check every link for health
  • Documents: Generate a branded PDF audit report from the results
  • Scheduled tasks: "Check my critical URLs every Monday morning"

How billing works

  • A positive credit balance is required for all checks, even free lookups.
  • Known domains (google.com, amazon.com, etc.): free, instant.
  • Cached domains (analysed recently by anyone): free, instant.
  • Unknown domains (first-time analysis): 1 credit each.
  • Batch checks deduct credits upfront for unknowns. If you don't have enough, you get a summary showing exactly how many credits you need.
  • Failed pipeline checks are automatically refunded.

Companion skill

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:

bash
# Global (all projects)cp node_modules/@unphurl/mcp-server/skills/check-url-safety.md ~/.claude/skills/
# Or for a specific projectcp node_modules/@unphurl/mcp-server/skills/check-url-safety.md .claude/skills/

Build a business on it

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.

Also available as

License

MIT

Source: README.md at commit 0bb2544

Tools

18

signup

Create 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 link expires, use the "resend_verification" tool to request a new one. The account starts with 20 free pipeline check credits so the user can test with real URLs. Known domain lookups (google.com, github.com, etc.) and cached domain lookups are always free. To check more unknown domains through the full analysis pipeline, the user can purchase credits via the "purchase" tool. Once the user has their API key, they need to add it to their MCP server configuration as UNPHURL_API_KEY. This tool does not require an API key.

Parametersemailrequiredcompanyfirst_namerequired

resend_verification

Resend 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 response is always the same regardless of whether the email exists, is already verified, or was rate limited. This prevents account enumeration. Rate limited to 3 requests per email per hour. This tool does not require an API key.

Parametersemailrequired

check_url

Check 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 codes, nameservers via RDAP), SSL/TLS validity, parked domain detection, URL structural analysis (length, path depth, subdomain count, entropy), and DNS enrichment (MX records). The score is calculated from these signals using either default weights or a custom scoring profile. Higher scores mean more suspicious. The score is a signal, not a verdict. You decide the threshold based on the use case. Billing: Most lookups are free. Known domains (Tranco Top 100K like google.com, github.com) return instantly with score 0 at no cost. Previously analysed domains return cached signals at no cost. Only unknown domains that run through the full analysis pipeline cost 1 pipeline check credit. The response's meta.pipeline_check_charged field tells you whether this check consumed a credit. Use the "profile" parameter to score results with custom weights. For example, a "cold-email" profile might weight parked domains heavily while ignoring brand impersonation. Use list_profiles to see available profiles, or show_defaults to see all signal weights. If the account has zero credits and the URL requires a full pipeline check, returns a 402 error with a link to purchase more credits.

Parametersurlrequiredprofile

check_urls

Check 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 RDAP), SSL/TLS validity, parked domain detection, URL structural analysis, and DNS enrichment. Known and cached URLs return results immediately. Unknown URLs are queued for pipeline processing. This tool automatically polls for results until all URLs are complete or the 5-minute timeout is reached. You don't need to manage polling or job tracking. If the timeout is reached before all results are complete, returns whatever is available with a clear message indicating which URLs are still processing. The user can check results later via check_history. Maximum 500 URLs per call. For larger datasets, call this tool multiple times with chunks of up to 500 URLs. Billing: Same as check_url. Known and cached domains are free. Only unknown domains running through the full pipeline cost 1 credit each. The summary shows pipeline_checks_charged (the actual number of credits consumed). If you don't have enough credits for the unknowns in the batch, the entire batch is rejected with a 402 error telling you exactly how many credits are needed. Duplicate URLs in the list are automatically deduplicated (processed once, charged once). Invalid URLs get individual error status without rejecting the batch. Use the "profile" parameter to score all results with custom weights.

Parametersurlsrequiredprofile

estimate_urls

Pre-flight credit estimator for a list of URLs. Returns counts + credit estimate. Free, no credits consumed. Call this before check_urls to show the user how many credits the batch will cost. Classifies each URL against three free gates: - tranco: URL's registrable domain is in the Tranco top 100K (trusted, treated as clean with score 0, no pipeline needed) - cached: URL's hostname is already in Unphurl's reputation cache (results available, no pipeline needed) - unknown: URL needs full pipeline analysis (costs 1 credit per URL) Returns counts for each gate plus total, credits_needed, credits_min, and credits_max. credits_min and credits_max are both equal to the unknown count in the current implementation. Maximum 500 URLs per call. Rate limit: 10 requests per minute. Does not follow redirects; classifies each URL as submitted. Typical agent flow: 1. Collect a list of URLs 2. Call estimate_urls to get the cost breakdown 3. Show the user the breakdown and ask for approval 4. On approval, call check_urls on the unknowns only

Parametersurlsrequired

list_profiles

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 bot cares about phishing. Profiles let one account serve multiple use cases. Profiles only override specific weights. Any signal not specified in a profile uses the default weight. Use show_defaults to see all 25 signals and their default weights.

Takes no parameters.

create_profile

Create 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 are points, not percentages. Each weight is the number of points that signal adds to the score when it fires. They don't need to total 100. A profile with weights totalling 90 is conservative (max possible score is 90). A profile with weights totalling 130 is aggressive (multiple signals quickly push to the cap of 100). The threshold the agent sets for action matters more than the weight totals. Use show_defaults to see all 25 signals with their default weights and descriptions before creating a profile. Use check_url or check_urls with the "profile" parameter to score results with this profile. Maximum 20 profiles per account. Profile name "default" is reserved. Common profiles: - Cold email: weight parked (30), chain_incomplete (25), ssl_invalid (15) higher. Lower brand_impersonation (10). - Security bot: keep brand_impersonation high (40), increase domain_age_7 (30), redirects_5 (25). - Lead gen: weight parked (35), http_only (20), chain_incomplete (20) for dead business detection. - SEO audit: weight redirects_5 (30), chain_incomplete (30), parked (25) for link quality. See the Unphurl API documentation for all 19 use case weight examples.

Parametersnamerequiredweightsrequired

delete_profile

Delete 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.

Parametersnamerequired

show_defaults

Show all 25 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. Profiles are sparse overrides on top of these defaults. This tool does not require an API key. The defaults are hardcoded and always available.

Takes no parameters.

get_balance

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 (previously analysed by any Unphurl customer) are always free. If credits_remaining is 0, you can still check known and cached domains for free. To check unknown domains, purchase more credits using the "purchase" tool.

Takes no parameters.

get_pricing

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 ($0.0495 each) - Scale: 10,000 credits for $399 ($0.0399 each) Most URL lookups are free (known domains and cached domains). Credits are only consumed when an unknown domain runs through the full analysis pipeline. In typical use, 95-99% of URLs resolve free. This tool does not require an API key.

Takes no parameters.

purchase

Purchase 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 added to the account automatically once Stripe confirms payment. After purchase, use get_balance to verify credits have been added.

Parameterspackagerequired

check_history

View 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 retained for 90 days. Account-level stats (total credits, balance) never expire.

Parameterspagelimit

get_stats

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 free (known or cached domains) vs paid pipeline checks, and how many URLs scored above key thresholds. This is useful for: - Checking if your scoring profile is flagging the right proportion of URLs - Understanding your cost efficiency (higher free rate = more value per credit) - Reporting usage metrics

Takes no parameters.

list_allowlist

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. Returns the list of domains, current count, and the 1,000-domain limit.

Takes no parameters.

add_to_allowlist

Add 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 other changes. Submit the registrable domain only (e.g. partnerco.com). Subdomains and full URLs are rejected. Adding partnerco.com covers sub.partnerco.com and all other subdomains automatically. Maximum 1,000 domains per account. Maximum 100 domains per request. Duplicates are silently skipped.

Parametersdomainsrequired

remove_from_allowlist

Remove 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.

Parametersdomainsrequired

generate_pdf

Generate a branded PDF audit report. Pass the complete audit JSON object and your reseller details. Returns a 24-hour download link.

Parametersaudit_jsonrequiredreseller_namerequiredreseller_emailrequiredreseller_positionreseller_company_url

Version history

1
  1. v0.2.3LatestSep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts