Panda Web Security Tools
Panda Web Security Tools
Site, email and agent safety: SPF/DKIM/DMARC audits, AI/SEO readiness, website change monitoring, hidden AI instructions scanner.
Focused MCP server (4 tools) from the Panda Federation public-data toolkit. Prefer this over the 23-tool mega-server for better Tool Definition Quality Score (TDQS) / Glama coherence.
Install / Use
Needs a free Apify API token and uv.
uvx --from panda-federation-tools panda-web-security-toolsSame entry point from this repo:
uvx --from git+https://github.com/pandadad0214/panda-web-security-tools panda-web-security-toolsCursor / Claude / VS Code: command uvx, args ["--from", "panda-federation-tools", "panda-web-security-tools"], env APIFY_TOKEN.
Related MCP server: intodns-mcp
Tools (4)
email_domain_security_checkerai_search_seo_auditwebsite_change_monitorhidden_ai_instructions_scanner
Each tool runs one Apify Actor on your account. Empty runs are not charged per result; every call is capped by run_max_charge_usd. Full schemas and prices: umbrella README.
Sibling domain servers
panda-research-tools— Scholarly integrity and papers: citation checks, literature and PubMed search, academic experts, PDF tables.panda-public-funding-tools— US federal money and filings: grants, contracts, SBIR/STTR topics, SEC financials, clinical trials.panda-leads-tools— Public leads and enrichment: NPI providers, podcasts, local businesses, hiring signals, website enrichment, team pages, topic trends, trucking carriers.
Index / compatibility mega-server: panda-federation-tools (use only when you truly need every tool).
TDQS standard
New tools join this domain only while the count stays in the 3–15 band. Descriptions follow the checklist in the umbrella repo. See tdqs-standard / project docs.
Built by Panda Federation. MIT licensed.
Available Tools
4 toolsai_search_seo_auditAI Search & SEO Audit: GEO, llms.txt & Schema CheckerARead-only
Audit web pages for classic SEO and for AI-search readiness (ChatGPT, Perplexity, Claude, Google AI Overviews): titles, meta, schema/FAQ markup, author/date signals, blocked AI crawlers, llms.txt and ranked fixes, with an SEO score and an AI-readiness score per page. Unlike website_change_monitor (diffs pages over time) and hidden_ai_instructions_scanner (finds concealed prompt-injection text), this grades how discoverable and citable a page is. Use when you need an on-page SEO/GEO audit or an llms.txt draft. Do not use for change tracking (use website_change_monitor) or security scanning (use hidden_ai_instructions_scanner or email_domain_security_checker). Parameters: crawlInternalLinks multiplies pages: each URL can add up to that many same-site pages, and every page is billed, so maxPages/run_max_items is the real cost cap. generateLlmsTxt drafts one llms.txt per site lacking it at no extra charge. Pages that block our crawler are returned unbilled. Returns per item: agentSummary, url, seoScore, aiReadinessScore, title, metaDescription, h1, wordCount, schemaTypes, faqSchema, aiSearchBotsBlocked, aiTrainingBotsBlocked, llmsTxt, sitemapFound, canonical, noindex, crawlerBlocked, fixes.
Behavior: read-only; runs the Apify Actor pandadad0214/ai-search-seo-audit (https://apify.com/pandadad0214/ai-search-seo-audit) on your own Apify account. Price: $0.004 per page audited. Runs that find nothing are not charged per result, and spending is capped per call by run_max_charge_usd (default $0.50). run_max_items (default 50) limits items returned and fills maxPages when you leave it unset, so it also limits what is billed; setting maxPages higher can bill more than is returned. Most calls finish in 5-15 s for a few inputs; large inputs or crawls can take minutes, so raise run_timeout_secs (max 300) or shrink the input after a timeout error. Returns JSON {actor, count, items}; long text output is trimmed to whole items, with all items in structuredContent.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Page URLs. Pages to audit, one per line. https:// is added if missing (example.com/pricing works). Leave empty for a 2-page demo. | |
| maxPages | No | Maximum pages. You pay per audited page, so this also caps the cost. Whole number, 1 to 2,000; default 50. | |
| run_max_items | No | Optional. Most results to return from this call (default from PANDA_MAX_ITEMS, 50). Also limits how many results the Actor produces and charges for, unless you set its own max field. | |
| generateLlmsTxt | No | Draft an llms.txt for sites without one. On by default: for each site with no /llms.txt, writes a ready-to-edit draft (from the audited pages and homepage links) into the LLMS_TXT_DRAFTS record and the Sites sheet. No extra charge. | |
| run_timeout_secs | No | Optional. Seconds to wait for results (default from PANDA_TIMEOUT_SECS, 120; max 300). | |
| crawlInternalLinks | No | Also audit internal pages (per URL). 0 = audit only the URLs above. 1 to 100 = also audit up to this many same-site pages linked from each URL (good for a quick whole-site check from the homepage). | |
| run_max_charge_usd | No | Optional. Hard spending cap for this call in USD (default from PANDA_MAX_CHARGE_USD, 0.50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read-only/open-world semantics, while the description adds the operationally decisive facts: per-page pricing at $0.004, spending caps via run_max_charge_usd, unbilled crawler-blocked pages, typical 5-15s runtime with a 300s ceiling, and the runtime backend. That is substantial context an agent cannot get from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then differentiation, then parameters, then return shape — a sensible order, and nearly every sentence carries information. It is on the long side, and the parameter section partially restates schema text rather than only adding the multiplier/cap interactions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates every returned field plus the JSON envelope, and it covers cost, timeouts, and billing edge cases. An agent has everything needed to invoke it and interpret the result without further probing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuinely new semantics: crawlInternalLinks multiplies billed pages, run_max_items fills maxPages when unset, and raising maxPages can bill more than is returned. These interaction effects are not derivable from the individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Audit web pages for classic SEO and for AI-search readiness') and enumerates the concrete checks (titles, meta, schema/FAQ markup, llms.txt, crawler blocking) so the agent knows exactly what the output grades. It also explicitly distinguishes itself from both siblings by naming what each of them does instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit positive trigger ('Use when you need an on-page SEO/GEO audit or an llms.txt draft') and explicit exclusions with named alternatives for change tracking and security scanning. Nothing about routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_domain_security_checkerSPF, DKIM & DMARC Checker: Bulk Email Domain Security AuditARead-only
Audit email authentication for a list of domains: SPF, DKIM (about 40 common selectors), DMARC, MX provider, MTA-STS, TLS-RPT and BIMI, graded A-F with spoofing risk and plain-English fixes. Unlike company_website_enricher (firmographics, tech stack, contacts), this only grades mail security posture from public DNS. Use when you need deliverability or spoofing checks, a security prospect list, or a vendor review. Do not use for website SEO or AI-readiness (use ai_search_seo_audit) or for page-level prompt injection (use hidden_ai_instructions_scanner). Parameters: domains accept bare domains, emails or URLs and are normalized and de-duplicated. DKIM is only confirmed when a selector matches; add dkimSelectors you know are in use, otherwise a missing DKIM may be a false negative. Nonexistent or unresolvable domains are returned with a status and not charged. Returns per item: agentSummary, domain, grade, score (0-100), spoofable, mailProvider, spfRecord, spfAll, spfLookups, dmarcRecord, dmarcPolicy, dmarcReporting, dkimSelectorsFound, mtaSts, tlsRpt, bimi, mxHosts, fixes (prioritized), status.
Behavior: read-only; runs the Apify Actor pandadad0214/email-domain-security-checker (https://apify.com/pandadad0214/email-domain-security-checker) on your own Apify account. Price: $0.002 per domain checked. Runs that find nothing are not charged per result, and spending is capped per call by run_max_charge_usd (default $0.50). run_max_items (default 50) limits items returned and fills maxDomains when you leave it unset, so it also limits what is billed; setting maxDomains higher can bill more than is returned. Most calls finish in 5-15 s for a few inputs; large inputs or crawls can take minutes, so raise run_timeout_secs (max 300) or shrink the input after a timeout error. Returns JSON {actor, count, items}; long text output is trimmed to whole items, with all items in structuredContent.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | No | Domains, emails or URLs. One per line: example.com, name@example.com or https://www.example.com/page all work (the domain is extracted, www. removed, duplicates dropped). Leave empty for a 3-domain demo. | |
| maxDomains | No | Maximum domains. You pay per checked domain, so this also caps the cost. Whole number, 1 to 10,000; default 1,000. | |
| dkimSelectors | No | Extra DKIM selectors. Optional. About 40 common selectors (google, selector1, selector2, k1, s1, s2, default…) are always tried. Add your own if you sign with a custom one, e.g. 20230601 or mailo. | |
| run_max_items | No | Optional. Most results to return from this call (default from PANDA_MAX_ITEMS, 50). Also limits how many results the Actor produces and charges for, unless you set its own max field. | |
| run_timeout_secs | No | Optional. Seconds to wait for results (default from PANDA_TIMEOUT_SECS, 120; max 300). | |
| run_max_charge_usd | No | Optional. Hard spending cap for this call in USD (default from PANDA_MAX_CHARGE_USD, 0.50). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/open-world, but the description adds pricing ($0.002 per domain), the spending cap, timeout behavior and remediation advice (raise run_timeout_secs to 300, or shrink input). It also discloses the non-obvious billing quirk that run_max_items fills maxDomains and therefore limits what is charged, and warns that a missing DKIM result may be a false negative.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and differentiation before the mechanics, and the return-field list is a compact enumeration rather than prose. It is dense — the behavior paragraph packs pricing, billing interaction, timeouts and output shape into one block — but nearly every sentence carries information an agent needs to call it correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing the per-item return fields (grade, score, spoofable, spfRecord, dmarcPolicy, fixes, status) and the response envelope {actor, count, items}. Cost, timeout, failure handling for unresolvable domains and the no-charge-for-empty-runs rule are all covered, leaving nothing material an agent would need to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so most parameter meaning is supplied structurally, but the description still adds value: it ties dkimSelectors to the false-negative risk, explains that domains are normalized and de-duplicated across bare domains/emails/URLs, and spells out the cross-parameter interaction between maxDomains and run_max_items that the schema alone does not convey. The remaining parameters are restated rather than deepened.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (audit email authentication for a list of domains) and enumerates exactly what is checked: SPF, DKIM, DMARC, MX provider, MTA-STS, TLS-RPT and BIMI, graded A-F. It then explicitly separates itself from company_website_enricher, ai_search_seo_audit and hidden_ai_instructions_scanner, so an agent can pick it out of the sibling set without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete triggers (deliverability or spoofing checks, a security prospect list, a vendor review) and explicit exclusions that route to named alternatives: SEO/AI-readiness goes to ai_search_seo_audit, page-level prompt injection goes to hidden_ai_instructions_scanner. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website_change_monitorWebsite Change Monitor: Page Diffs, Price & Keyword AlertsARead-only
Check a watch list of web pages against snapshots saved by your previous run and report added and removed text, change percent, price changes and keyword appear/disappear alerts, with an optional webhook when something changes. Unlike ai_search_seo_audit (one-time quality audit) and hidden_ai_instructions_scanner (concealed AI-directed text), this is stateful diffing over time. Use when you need to track competitor pricing, terms, product or careers pages on a schedule. Do not use for a one-off page read or audit (use ai_search_seo_audit), or for pages behind a login. Parameters: the first run per monitorName only saves baselines (status 'baseline saved'); reuse the same monitorName for every later run, and use a new name for a separate watch list. cssSelector, ignorePatterns and ignoreNumbersAndDates cut false alarms from banners, counters and timestamps. Below minChangePercent the old snapshot is kept, so small edits accumulate. onlyReportChanges shrinks output but every page checked is still billed; unreachable pages are free. webhookUrl posts outside the Apify run; only set it if you control that endpoint. Returns per item: agentSummary, url, label, status, changed, changePercent, addedCount, removedCount, addedLines, removedLines, prices, priceChanges, keywordsPresent, keywordsAppeared, keywordsDisappeared, titleBefore, titleAfter, previousCheckAt.
Behavior: read-only; runs the Apify Actor pandadad0214/website-change-monitor (https://apify.com/pandadad0214/website-change-monitor) on your own Apify account. Price: $0.0015 per page checked. Runs that find nothing are not charged per result, and spending is capped per call by run_max_charge_usd (default $0.50). run_max_items (default 50) limits items returned and fills maxPages when you leave it unset, so it also limits what is billed; setting maxPages higher can bill more than is returned. Most calls finish in 5-15 s for a few inputs; large inputs or crawls can take minutes, so raise run_timeout_secs (max 300) or shrink the input after a timeout error. Returns JSON {actor, count, items}; long text output is trimmed to whole items, with all items in structuredContent.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | No | Pages to watch. One URL per line. Optional label after ' | ' (e.g. https://acme.com/pricing | Acme pricing). Leave empty for a 2-page demo. | |
| maxPages | No | Maximum pages. You pay per page checked, so this also caps the cost. | |
| webhookUrl | No | Webhook URL for changes (optional). Optional https URL (Slack/Zapier/Make/n8n webhook). Gets a JSON POST listing changed pages, only when something changed. | |
| cssSelector | No | Only watch this part (CSS selector). Optional. Compare only the matching elements, e.g. main or #pricing. Ignores headers, footers and banners. | |
| monitorName | No | Monitor name. Snapshots are saved in your account under this name (key-value store panda-change-monitor-). Use different names for separate watch lists; each run compares with the last run of the same name. | default |
| run_max_items | No | Optional. Most results to return from this call (default from PANDA_MAX_ITEMS, 50). Also limits how many results the Actor produces and charges for, unless you set its own max field. | |
| watchKeywords | No | Alert keywords. Optional. Reports when any of these words appear on or disappear from a page. | |
| ignorePatterns | No | Ignore text matching (regex). Optional regular expressions removed before comparing (counters, timestamps, rotating promos). | |
| minChangePercent | No | Minimum change to report (%). Changes smaller than this are reported as 'unchanged (below threshold)' and the old snapshot is kept, so small edits add up. | |
| run_timeout_secs | No | Optional. Seconds to wait for results (default from PANDA_TIMEOUT_SECS, 120; max 300). | |
| onlyReportChanges | No | Dataset: changed pages only. Skip unchanged pages in the dataset (handy for alerts and integrations). Every page checked is still billed; failed pages never are. | |
| run_max_charge_usd | No | Optional. Hard spending cap for this call in USD (default from PANDA_MAX_CHARGE_USD, 0.50). | |
| ignoreNumbersAndDates | No | Ignore dates and times. Strip dates and clock times before comparing, to avoid noise from 'updated today' widgets. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-idempotent, but the description adds substantial context beyond them: the first-run-only-saves-baselines state machine, that the webhook posts outside the Apify run and only when something changed, that unreachable pages are free while unchanged pages are still billed at $0.0015/page, the run_max_charge_usd cap, and the 5-15 s / 300 s timeout envelope. It even reconciles with annotations by asserting 'read-only' while disclosing the persistent key-value snapshot store.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical framing (what it is, what it is not, when to use) is front-loaded in the first three sentences, and the return-field list and billing paragraphs are placed after the decision-relevant content. It is long and some parameter prose duplicates the schema verbatim, but for a 13-parameter stateful tool with non-obvious cost semantics the density is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description enumerates the returned fields (agentSummary, status, addedLines, priceChanges, keywordsAppeared, titleBefore/After, previousCheckAt) and the envelope shape {actor, count, items}. It also covers cost model, spend cap, timeout remediation, and webhook side effects, leaving no material gap for calling the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline is 3; the description goes further by explaining cross-parameter interactions the schema only states locally, notably that the first run per monitorName only saves a baseline and must be reused for later runs, and that run_max_items fills maxPages when left unset and therefore also bounds billing. It restates some parameters (webhookUrl, onlyReportChanges, ignorePatterns) that the schema already documents well, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check a watch list of web pages against snapshots saved by your previous run') and enumerates the concrete outputs: added/removed text, change percent, price changes, keyword alerts. It explicitly names the two sibling tools it is not (ai_search_seo_audit, hidden_ai_instructions_scanner) and characterizes itself as 'stateful diffing over time', so an agent can discriminate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('track competitor pricing, terms, product or careers pages on a schedule') and explicit when-not ('Do not use for a one-off page read or audit (use ai_search_seo_audit), or for pages behind a login'), naming the alternative to select instead. Exclusions cover both the wrong task shape and an unsupported page class.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
ai_search_seo_audit - First observed
email_domain_security_checker - First observed
hidden_ai_instructions_scanner - First observed
website_change_monitor
Related MCP Connectors
Security, SEO and AI-visibility scanner for web apps · free scans and focused checks via MCP.
Remote MCP server: 19 domain-hygiene and email-auth tools (DNS, SPF, DMARC, DKIM, TLS).
AI-operated. Free SPF (RFC 7208 count), DMARC, MTA-STS, DMARC rua/ruf readers. Paid audit $29.
Inspect any domain: tech stack, SPF/DKIM/DMARC/MX email health and security posture, for AI agents
1
Related MCP Servers
- AlicenseAqualityCmaintenanceEmail-deliverability tools for AI agents — 12 MCP tools across email verification, DNSBL across 50 zones, SPF/DKIM/DMARC analysis, spam-trap scoring, domain intelligence, and email finder. Free tier with no credit card.1239 npm1MIT
- AlicenseAqualityAmaintenanceMCP server for IntoDNS.ai providing 36 free tools for DNS, DMARC, SPF, DKIM, BIMI, DNSSEC, MTA-STS, FCrDNS, blacklist and email security checks. Citation-grade report snapshots with content hashes. No API key required.45300 npm2MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for Technical SEO DNS record auditing, SOA expiry health checks, SSL/TLS inspection, and HTTP security header analysis. Enables comprehensive security audits and scoring via 10 tools.MIT
- AlicenseNot gradedqualityBmaintenanceProvides live infrastructure monitoring for AI agents, including domain health checks, MCP server security posture, email blacklists, broken-link scans, and cloud vendor status. No signup or API key needed for public tools.MIT