Detect website technology stack (free)
web_tech_stackDetect a webpage's technology stack from its HTML and HTTP headers—frameworks, CMS, hosting/CDN, analytics—to support lead enrichment and competitor research.
Instructions
Detect technologies used by one page from its HTML and HTTP headers: frameworks (Next.js, Nuxt, React, ...), CMS (WordPress, Shopify, Webflow, ...), hosting/CDN (Vercel, Cloudflare, Netlify, ...), analytics/tag managers, and more, each with category and evidence. WHEN TO USE: lead enrichment ("what stack does this company use?"), competitor research. Signature-based on one response, so client-injected tools may be missed. For many sites use web_batch_audit. Fetching: GETs from this server with User-Agent "FairqueryBot ... Fairquery-MCP", 15 s timeout per request, body capped (1.5 MB HTML), max 5 redirects, no JavaScript rendering; URLs resolving to private/loopback/link-local addresses are refused (SSRF guard). RETURNS: paged "technology" rows, each with the evidence that matched; meta.final_url is the page actually analysed. Errors (isError=true, JSON {error, message, retryable}): INVALID_URL, BLOCKED_PRIVATE_ADDRESS, DNS_FAILED, FETCH_FAILED, TIMEOUT, TOO_MANY_REDIRECTS. WHEN NOT TO USE: for SEO metadata use web_seo_audit; for security headers use web_security_headers. COST: free - runs locally in this MCP server (direct HTTP GETs), no APIFY_TOKEN, no Apify billing. PARAMETERS: url: exactly that page is fetched (one request after redirects), so a marketing homepage and an app/shop subpage can show different stacks; meta.final_url shows what was analysed. category is a case-insensitive substring filter on the category name, applied before paging: existing categories are CMS, Headless CMS, Site builder, E-commerce, Payments, JS framework, JS library, Framework, CSS framework, Static site generator, Hosting, CDN, Web server, Security, Analytics, Tag manager, Advertising, Marketing automation, Consent, Live chat, Support, Docs, Fonts, Language - e.g. "cms" also matches "Headless CMS" and "framework" matches JS/CSS framework. An unmatched category returns an empty page (count 0), not an error. limit/offset page the filtered list; total = number of matching technologies. EXAMPLE: {"url":"vercel.com","category":"hosting"} -> {count:1, items:[{type:"technology", name:"Vercel", category:"hosting", evidence:"..."}], ...}
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Required. One public domain or http(s) URL (non-empty string), e.g. "vercel.com" or "https://www.python.org/about/". Bare domains are fetched over https; other schemes, credentials in the URL, dot-less hosts and private/loopback addresses are refused. | |
| limit | No | Optional page size: number of items to return, integer 1-200 (default 50). Example: 20 | |
| offset | No | Optional zero-based offset into the full result list, integer >= 0 (default 0); use nextOffset from the previous page, e.g. 50 | |
| category | No | Optional, default omitted = all categories. Case-insensitive substring of the category name (e.g. "analytics", "cms", "cdn", "hosting", "e-commerce"). Example: "analytics" |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| meta | No | Tool-specific context (company, source_url, ...) | |
| count | Yes | Number of items in this page | |
| items | Yes | Result rows for this page | |
| total | Yes | Total items matching the filters (before paging) | |
| offset | Yes | Offset of the first item in this page | |
| hasMore | Yes | True if more items exist after this page | |
| nextOffset | Yes | Offset to pass for the next page, or null |