Skip to main content
Glama
web-presence-audit

web-presence-audit

by AxRS37

web-presence-audit — lead-leak audit tools for AI agents

An MCP server that turns a proven, £0 lead-leak audit methodology for UK local service businesses into six tools your AI agent can call. No API keys, no accounts, no paid services — every data source is free to read.

This is the audit methodology behind real paid audits (built for B2B prospect research): it finds the fixable issues that measurably cost local businesses leads — untappable phone numbers, un-findable websites, mismatched phone numbers across directories, and forms on platforms where automated outreach simply cannot work.

  • Audience: agencies and web-audit sellers, local-SEO freelancers, lead-gen sellers, any agent doing prospect or client website research.

  • Cost: £0. Bing's public RSS search output + free UK directories (thomsonlocal, TrustATrader, 3BestRated) + the target site itself. No API keys, no signups, no cards.

  • Config-free: no environment variables, no accounts. Install and add to your MCP client — done.

What it does — the six tools

Tool

What it answers

check_form_platform(url)

Which platform a site's forms run on (WPForms, Contact Form 7, Wix, Squarespace, Jotform, Gravity Forms, HubSpot, Typeform, Drupal, or unknown) — and what that predicts for outreach: Wix forms fire no network traffic on automated submits (verified in live campaigns), so that prospect needs email or social instead. Also counts visible form fields (hidden honeypots excluded).

check_tap_to_call(url)

Is the phone number a clickable tel: link? Plain-text numbers lose mobile callers. Returns every tel: link, plain-text numbers found, and a verdict (ok / leak / no_phone_found).

check_nap_consistency(business, city, trade?, website_url?)

Is the phone number identical on the business's own site and the free directories (thomsonlocal, TrustATrader)? Mismatched numbers confuse Google and customers. Verdict: consistent / inconsistent / insufficient data.

audit_website(url)

Quick hygiene checks: reachable?, HTTPS?, mobile viewport tag?, page weight, load time, title + meta description.

find_website(business, city)

Find a business's own website via Bing's public RSS search — only a result with a distinguishing word counts (trade words like "plumbing" prove nothing).

run_full_audit(business, city, trade?, website_url?)

Everything at once: search presence, website hygiene, form platform, tap-to-call, NAP, plus the 3BestRated top-3 competitors. Returns a prioritized leak list.

Matching honesty (kept from the live-proven methodology): a directory listing or search result only counts as the business when it contains a distinguishing word (e.g. "driver" in "Driver Plumbing") plus 2+ name words — trade words and city names alone never count. Masked directory numbers (+447****5682) are excluded from NAP comparison.

Related MCP server: growth-mcp

5-minute setup

Requirements: Python 3.10+ and either uv or pip. Nothing else — no Node, no database, no API keys.

1. Install.

# with uv (fastest):
uv venv && uv pip install -e .
# or with plain pip:
python3 -m venv .venv && .venv/bin/pip install -e .

2. Test the install (30 seconds).

.venv/bin/python -m pytest tests/ -q

You'll see 63 passed — all tests are fully offline (canned pages + a localhost site; no live internet needed).

3. Wire it into your MCP client.

Example for Claude Desktop / Cursor / any MCP client with JSON config:

{
  "mcpServers": {
    "web-presence-audit": {
      "command": "/ABSOLUTE/PATH/TO/web-presence-audit/.venv/bin/python",
      "args": ["-m", "web_presence_audit"]
    }
  }
}

No env block needed — the server requires nothing but a working network at call time.

4. Try it. Ask your agent:

What form platform does example.co.uk run, and can I tap its phone number to call?

or

Run a full presence audit on "Driver Plumbing & Heating" in Leicester.

Example tool calls and responses

These are real outputs from this server's test suite (canned fixture pages; see tests/fake_pages.py — the shapes are exactly what the live tools return against real sites).

check_form_platform("https://example.co.uk") →

{
  "url": "https://example.co.uk",
  "platform": "wpforms",
  "outreach_note": "WordPress site with the WPForms plugin. Contact forms accept standard fill-and-submit automation cleanly; leave the honeypot field empty.",
  "evidence": "wpforms-container",
  "visible_form_fields": 3,
  "http_status": 200
}

check_tap_to_call("https://example.co.uk") → (a plain-text number)

{
  "verdict": "leak",
  "tel_links": [],
  "plain_phones": ["0116 264 5115"],
  "note": "LEAK — phone number 0116 264 5115 appears as plain text with no tel: link. Mobile visitors cannot tap to call; most will not retype it.",
  "url": "https://example.co.uk"
}

check_nap_consistency("Driver Plumbing & Heating", "Leicester") → (site and directory agree)

{
  "business": "Driver Plumbing & Heating",
  "city": "Leicester",
  "trade": "plumber",
  "website": "https://www.driverplumbing.co.uk/",
  "website_phone": "0116 264 5115",
  "directory_phones": [
    { "source": "thomsonlocal", "phone": "0116 264 5115" }
  ],
  "verdict": "consistent",
  "note": "Phone number identical across all sources found."
}

run_full_audit(...) returns all of the above plus search_presence, website hygiene, top3_competitors, a leaks list, and a score_note summarizing what to fix first.

How it's tested (and why you can trust the README)

63 tests in three layers — all offline (no live internet required to pass):

  1. Engine tests (tests/test_audit.py) — platform detection per signature, honeypot exclusion from field counts, tap-to-call verdicts, phone normalisation (+44 → 0), the matching-honesty rules, Bing RSS parsing, NAP consistency logic, hygiene checks, and the full pipeline end-to-end against canned pages.

  2. Tool layer tests (tests/test_server_tools.py) — each tool's output shape, URL scheme upgrading, error results (never crashes), all six tools registered with docstrings.

  3. Protocol tests (tests/test_protocol.py) — launch the real server as a subprocess, speak MCP JSON-RPC over stdio (initialize → tools/list → tools/call), and verify responses against a localhost fake site. The production fetch path runs for real; only the target is pretend.

Run them yourself:

.venv/bin/python -m pytest tests/ -v

A note on live sources: Bing RSS, thomsonlocal, TrustATrader and 3BestRated were all reachable and parseable from our build environment. Checkatrade is deliberately not queried — it returns HTTP 403 to datacenter IPs, so the methodology reports honestly rather than scraping it. (Checkatrade support confirmed no public API for non-customers.) Live directory pages can change markup; the parser tests protect the logic, and any site that blocks or changes is reported as an honest error, never fabricated data.

Works with both MCP SDK generations

The official Python SDK renamed its main class between versions: 1.x exposes mcp.server.fastmcp.FastMCP, 2.x renamed it to mcp.server.mcpserver.MCPServer. This server imports whichever is installed, so pip install mcp gives you either and it still runs. (Protocol-tested against 1.14.0 and 2.2.0.)

Who it's for

  • Agencies and web-audit sellers — run structured findings-first audits on any UK local business in minutes, with zero tooling cost.

  • Local-SEO freelancers — NAP consistency and presence checks without paid tools.

  • Lead-gen sellers — the form-platform check tells you which outreach channel can even work before you spend time on a prospect.

  • Any MCP client user doing UK B2B prospect research (pairs with our uk-company-check server for registry facts).

Licence

MIT (see LICENSE).

Available Tools

6 tools
audit_websiteB

Run the quick website hygiene checks: reachable?, HTTPS?, mobile viewport tag?, page weight, load time, title and meta description. Each missing item is a concrete fixable finding for an audit report.

Args: url: The website to check, e.g. "https://example.co.uk".

Inputs: url (required). Returns: object

check_form_platformA

Detect which form/website platform a site runs (WPForms, Contact Form 7, Wix, Squarespace, Jotform, Gravity Forms, HubSpot, Typeform, Drupal, or 'unknown'). The platform PREDICTS whether automated form outreach can work: WordPress/WPForms and CF7 accept standard fill-and-submit; Wix forms fire no network traffic on automated submits (verified in live campaigns) — use email or social there instead. Returns the platform, a plain-English outreach note, and the count of visible form fields (hidden honeypot fields excluded).

Args: url: The page to check, e.g. "https://example.co.uk" or "https://example.co.uk/contact".

Inputs: url (required). Returns: object

check_nap_consistencyA

Check the phone number (NAP: Name/Address/Phone consistency) between the business's own website and the free UK directories (thomsonlocal, TrustATrader), via Bing's public RSS search. A mismatched number confuses both Google and dialling customers. Returns the phone found on each source and a verdict: 'consistent', 'inconsistent', or 'insufficient data'.

Args: business: Business name, e.g. "Driver Plumbing & Heating". city: UK city, e.g. "Leicester". trade: Trade keyword (plumber, electrician...) — guessed from the business name if omitted. website_url: The business's website if you know it — skips the search step and makes the NAP comparison stronger.

Inputs: city (required), business (required), trade, website_url. Returns: object

check_tap_to_callA

Check whether the phone number on a page is a clickable tel: link (tap-to-call). On mobile, a plain-text number cannot be tapped — visitors must retype it, and most won't. Returns every tel: link found, any plain-text UK numbers, and a verdict ('ok', 'leak', or 'no_phone_found').

Args: url: The page to check, e.g. "https://example.co.uk".

Inputs: url (required). Returns: object

find_websiteA

Find a business's own website via Bing's public RSS search. Only a result that genuinely matches the business name (with a distinguishing word — not just trade words) and is not a directory or social site is returned. Returns the URL, or an honest 'not found' with the search URL so a human can double-check.

Args: business: Business name, e.g. "Driver Plumbing & Heating". city: UK city, e.g. "Leicester".

Inputs: city (required), business (required). Returns: object

run_full_auditA

Run the COMPLETE lead-leak audit on a UK local service business: search presence, website hygiene, form platform, tap-to-call, NAP consistency across free directories, and the 3BestRated top-3 competitors. Returns every finding plus a prioritized leak list. This is the full methodology used in real paid audits. Runs 6-10 free web requests; expect about 10-30 seconds.

Args: business: Business name, e.g. "Driver Plumbing & Heating". city: UK city, e.g. "Leicester". trade: Trade keyword — guessed from the name if omitted. website_url: Known website URL — skips discovery if provided.

Inputs: city (required), business (required), trade, website_url. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 6 tools

    Disambiguation4/5

    Each tool targets a distinct check: form platform, tap-to-call, NAP consistency, website hygiene, and website discovery are all clearly separated by purpose. The only overlap is run_full_audit, which intentionally composes the others; its description clearly frames it as the complete composite, so an agent can still choose correctly.

    Naming Consistency4/5

    All names are snake_case following a verb_noun pattern (check_form_platform, audit_website, find_website, run_full_audit). The verbs vary (check/audit/find/run) but the structural convention is consistent and readable.

    Tool Count5/5

    Six tools is well-scoped for a focused web-presence audit: five atomic checks plus one composite orchestrator. Each tool earns its place with no redundancy or padding.

    Completeness4/5

    The surface covers website discovery, hygiene, form platform, tap-to-call, and NAP consistency, plus a full audit — solid lifecycle coverage for the domain. Minor gap: competitor/review checks are only reachable through run_full_audit rather than a standalone tool, but agents can still access them.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      MCP server for GEO site audits, checking 31 signals across 6 pillars and returning a score, breakdowns, and actionable fix prompts.
      1
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Open-source MCP server that audits websites for AI search readiness, providing deterministic scoring (0-100) and prioritized fix lists for metrics like JSON-LD, llms.txt, heading hierarchy, and AI crawler access.
      1
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      MCP server exposing SuperAudit’s free website audit as a callable tool, enabling AI agents to audit any public URL and receive scores across SEO, security, legal, performance, and more. No API key required; respects rate limits and caches results.
      1
      MIT