StackScope

What new websites are built with. Track adopters of your product, export with published contacts.

Should I use this

Quality & Safety

A
Description quality
98%
Schema completeness
83%
Naming quality
91%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,946Tokens (tool definitions)
~4.2 KBTypical response size
Significant attention impact (3.86% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "stackscope": {
      "url": "https://mcp.stackscope.dev"
    }
  }
}

Remote endpoints

https://mcp.stackscope.devstreamable-http

What it can do

Tool inventory

Tools (11)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢stack_breakdown(technology, keywords, category, country, minCountryConfidence, ...)

Counts and shares, not a list: for the sites matching a filter, how many use each technology, grouped by kind (payments, analytics, hosting, cms...). Answers any question of the form 'how many', 'what share', or 'which X do sites using Y use' in one call, for example 'what payment providers do Ghost sites use'. Use this BEFORE find_sites or export_sites for those questions; exporting rows and counting them costs hundreds of lookups for the same answer. Same filters as find_sites. Counts one Explore slice and no site allowance.

Input Schema

{
  "type": "object",
  "properties": {
    "technology": {
      "description": "Technology name, exactly as returned by list_technologies, e.g. ghost. The sites using it are the population; it is left out of its own breakdown.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "keywords": {
      "description": "Whole words to look for in a site's name, title or description, e.g. photogrammetry. Matches ANY of them; a multi-word entry is a phrase. Three characters or more, up to ten words. Combines with every other filter, so 'Stripe sites that mention photogrammetry' is technology plus keywords. The same rule create_watch uses, so a word that filters here is the word a watch would fire on.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "category": {
      "description": "Product category of the SITES, e.g. ecommerce. Not a kind of technology; for that see technologyCategory.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "country": {
      "description": "Country as an ISO 3166-1 alpha-2 code, e.g. GB. Names are accepted too. Country is an ESTIMATE with a confidence score, so see minCountryConfidence.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "minCountryConfidence": {
      "description": "Least country confidence to accept, 0 to 1. Pass 0.6 when the country needs to be right rather than merely likely.",
      "type": [
        "number",
        "null"
      ],
      "default": null
    },
    "since": {
      "description": "Earliest LAUNCH date, YYYY-MM-DD.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "until": {
      "description": "Latest LAUNCH date, YYYY-MM-DD. Inclusive of the whole day.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "observedSince": {
      "description": "Earliest date we first recorded the site, YYYY-MM-DD.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "technologyCategory": {
      "description": "One kind of technology to report on, e.g. payments, analytics, cms, hosting. Leave unset for every kind. list_technologies shows each technology's kind under 'category'.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "near": {
      "description": "Only sites near a place: a town or city, a postcode, or 'lat,lng', e.g. Bristol. Use with radius. Sites we could not place are left out.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "radius": {
      "description": "How far from near, e.g. 30mi or 50km (a bare number is km). From 5 to 248 miles (8 to 400 km).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "regions": {
      "description": "Only sites in these states, provinces or other regions, e.g. [\"Texas\", \"Oklahoma\"]. Each a name, a name and country such as 'Georgia, US', or an id such as US-TX. A site matches if it is in ANY of them. Sites we could not place are left out.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    }
  }
}
🟢technology_sites(technology, since, until, limit, offset, ...)

Sites detected using one specific technology, newest first. Use find_sites instead when combining a technology with a country, category or contact filter. For counts, shares or 'which X do these sites use', call stack_breakdown instead; it answers in one call. Counts one site from the monthly allowance for each site not already returned to you this period.

Input Schema

{
  "type": "object",
  "properties": {
    "technology": {
      "description": "Technology name, exactly as returned by list_technologies.",
      "type": "string"
    },
    "since": {
      "description": "Earliest launch date, YYYY-MM-DD.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "until": {
      "description": "Latest launch date, YYYY-MM-DD. Inclusive of the whole day.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "limit": {
      "description": "How many sites to return, 1-100. Default 50.",
      "type": "integer",
      "default": 50
    },
    "offset": {
      "description": "How many to skip, for paging.",
      "type": "integer",
      "default": 0
    },
    "includeQuality": {
      "description": "Include quality bands for each site.",
      "type": "boolean",
      "default": false
    },
    "confirm": {
      "description": "Set true to skip the cost confirmation and return the data immediately.",
      "type": "boolean",
      "default": false
    },
    "near": {
      "description": "Only sites near a place: a town or city, a postcode, or 'lat,lng', e.g. Bristol. Use with radius. Sites we could not place are left out.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "radius": {
      "description": "How far from near, e.g. 30mi or 50km (a bare number is km). From 5 to 248 miles (8 to 400 km).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "regions": {
      "description": "Only sites in these states, provinces or other regions, e.g. [\"Texas\", \"Oklahoma\"]. Each a name, a name and country such as 'Georgia, US', or an id such as US-TX. A site matches if it is in ANY of them. Sites we could not place are left out.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    }
  },
  "required": [
    "technology"
  ]
}
🟢export_sites(technology, keywords, category, country, near, ...)

A bulk export of matching sites, up to 5,000 at once, for building a list or loading into a spreadsheet. Same filters as find_sites. Ask for csv output if the result is going into a file. For counts, shares or 'which X do these sites use', call stack_breakdown instead; it answers in one call and needs no export. Counts one site from the monthly allowance for each site not already returned to you this period, so this is the call most likely to ask you to confirm first.

Input Schema

{
  "type": "object",
  "properties": {
    "technology": {
      "description": "Technology name, exactly as returned by list_technologies.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "keywords": {
      "description": "Whole words to look for in a site's name, title or description, e.g. photogrammetry. Matches ANY of them; a multi-word entry is a phrase. Three characters or more, up to ten words. Combines with every other filter, so 'Stripe sites that mention photogrammetry' is technology plus keywords. The same rule create_watch uses, so a word that filters here is the word a watch would fire on.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "category": {
      "description": "Product category, e.g. ecommerce.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "country": {
      "description": "Country as an ISO 3166-1 alpha-2 code, e.g. GB. Names are accepted too.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "near": {
      "description": "Only sites near a place: a town or city, a postcode, or 'lat,lng', e.g. Bristol. Use with radius. Sites we could not place are left out.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "radius": {
      "description": "How far from near, e.g. 30mi or 50km (a bare number is km). From 5 to 248 miles (8 to 400 km).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "regions": {
      "description": "Only sites in these states, provinces or other regions, e.g. [\"Texas\", \"Oklahoma\"]. Each a name, a name and country such as 'Georgia, US', or an id such as US-TX. A site matches if it is in ANY of them. Sites we could not place are left out.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "since": {
      "description": "Earliest launch date, YYYY-MM-DD.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "until": {
      "description": "Latest launch date, YYYY-MM-DD. Inclusive of the whole day.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "observedSince": {
      "description": "Earliest date we first recorded the site, YYYY-MM-DD. Use this rather than 'since' when building an incremental export on a schedule.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "hasContactEmail": {
      "description": "Only sites that have a published contact email. Needs the 'contacts' permission.",
      "type": [
        "boolean",
        "null"
      ],
      "default": null
    },
    "hasContactPage": {
      "description": "Only sites that have a published contact page. Needs the 'contacts' permission.",
      "type": [
        "boolean",
        "null"
      ],
      "default": null
    },
    "includeQuality": {
      "description": "Include quality bands for each site.",
      "type": "boolean",
      "default": false
    },
    "limit": {
      "description": "How many sites to export, 1-5000. Default 1000.",
      "type": "integer",
      "default": 1000
    },
    "csv": {
      "description": "Also return the rows as CSV text, ready to save as a file.",
      "type": "boolean",
      "default": false
    },
    "confirm": {
      "description": "Set true to skip the cost confirmation and return the data immediately.",
      "type": "boolean",
      "default": false
    }
  }
}
🟢list_watches

The customer's watches, including inactive watches and their current status. A watch can deliver new matching sites by email, Slack or webhook as they are discovered, or keep matches in the account portal. Free.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢technology_trend(technology)

Weekly adoption of one technology over the whole period we have data for, counted across every site in the corpus, with notes marking anything that changed how it is measured. Same population as list_technologies, so the two can be compared. Counts no site allowance.

Input Schema

{
  "type": "object",
  "properties": {
    "technology": {
      "description": "Technology name, exactly as returned by list_technologies.",
      "type": "string"
    }
  },
  "required": [
    "technology"
  ]
}
🟢find_sites(technology, keywords, category, country, minCountryConfidence, ...)

Find newly launched sites matching any combination of technology, category, country, region (a state or province), distance from a place, date range and contact availability. This is the main search tool. For example: sites in the UK built with WordPress that launched this week and have a contact email, Shopify shops within 30 miles of Bristol, or new sites in Texas. Each site carries its town and region, and its distance when near is given. For counts, shares or 'which X do these sites use', call stack_breakdown instead; it answers in one call. Counts one site from the monthly allowance for each site not already returned to you this period; you may be asked to confirm before a large result is returned.

Input Schema

{
  "type": "object",
  "properties": {
    "technology": {
      "description": "Technology name, exactly as returned by list_technologies, e.g. wordpress.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "keywords": {
      "description": "Whole words to look for in a site's name, title or description, e.g. photogrammetry. Matches ANY of them; a multi-word entry is a phrase. Three characters or more, up to ten words. Combines with every other filter, so 'Stripe sites that mention photogrammetry' is technology plus keywords. The same rule create_watch uses, so a word that filters here is the word a watch would fire on.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "category": {
      "description": "Product category, e.g. ecommerce.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "country": {
      "description": "Country as an ISO 3166-1 alpha-2 code, e.g. GB for the United Kingdom, US, DE. Country names such as 'United Kingdom' are also accepted. Country is an ESTIMATE with a confidence score, so see minCountryConfidence.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "minCountryConfidence": {
      "description": "Least country confidence to accept, 0 to 1. Country is estimated from the site, and scores near the 0.45 floor are weak guesses: a site whose own title says it is in Bangladesh can score 0.48 for the UK. Genuine matches usually score 0.6 or better, so pass 0.6 when the country needs to be right rather than merely likely. Every row carries its own countryConfidence too.",
      "type": [
        "number",
        "null"
      ],
      "default": null
    },
    "near": {
      "description": "Only sites near a place: a town or city, a postcode, or 'lat,lng', e.g. Bristol. Use with radius. Sites we could not place are left out.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "radius": {
      "description": "How far from near, e.g. 30mi or 50km (a bare number is km). From 5 to 248 miles (8 to 400 km).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "regions": {
      "description": "Only sites in these states, provinces or other regions, e.g. [\"Texas\", \"Oklahoma\"]. Each a name, a name and country such as 'Georgia, US', or an id such as US-TX. A site matches if it is in ANY of them. Sites we could not place are left out.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "since": {
      "description": "Earliest LAUNCH date, YYYY-MM-DD. Use this for questions about when products launched, e.g. 'launched this week'.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "until": {
      "description": "Latest LAUNCH date, YYYY-MM-DD. Inclusive: the whole of that day is included, so since and until set to the same date returns that one day.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "observedSince": {
      "description": "Earliest date we first recorded the site, YYYY-MM-DD. Use this instead of 'since' when polling for new rows on a schedule: sites are discovered a median of 2 days (and up to about a week) after they launch, so a poller tracking 'since' never learns about them.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "hasContactEmail": {
      "description": "Only sites that have a published contact email. Needs the 'contacts' permission.",
      "type": [
        "boolean",
        "null"
      ],
      "default": null
    },
    "hasContactPage": {
      "description": "Only sites that have a published contact page. Needs the 'contacts' permission.",
      "type": [
        "boolean",
        "null"
      ],
      "default": null
    },
    "includeQuality": {
      "description": "Include quality bands for each site.",
      "type": "boolean",
      "default": false
    },
    "limit": {
      "description": "How many sites to return, 1-100. Default 50.",
      "type": "integer",
      "default": 50
    },
    "cursor": {
      "description": "Paging token from a previous call's nextCursor. Repeat every other filter exactly as it was when the token was issued.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "confirm": {
      "description": "Set true to skip the cost confirmation and return the data immediately.",
      "type": "boolean",
      "default": false
    }
  }
}
🟢list_technologies(limit, from, to)

The catalogue of technologies we track, with how many sites use each. Use this to find the exact technology name to pass to the other tools. Counts no site allowance.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "How many to return, 1-500. Default 100, busiest first.",
      "type": "integer",
      "default": 100
    },
    "from": {
      "description": "Only count sites that launched on or after this date (YYYY-MM-DD).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "to": {
      "description": "Only count sites that launched on or before this date (YYYY-MM-DD).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    }
  }
}
⚪lookup_site(domain, includeContact, includeInfrastructure, includeQuality)

Everything known about one website: when it launched, what it is, and the technologies detected on it. Give a domain such as example.com (a full URL works too). Returns found: false if the site is not in the corpus. When found, counts one site from the monthly allowance.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "description": "Domain to look up, e.g. example.com",
      "type": "string"
    },
    "includeContact": {
      "description": "Include the site's published contact route (role mailbox and/or contact page) when available. Needs the 'contacts' permission.",
      "type": "boolean",
      "default": false
    },
    "includeInfrastructure": {
      "description": "Include hosting, DNS and email-security details.",
      "type": "boolean",
      "default": false
    },
    "includeQuality": {
      "description": "Include quality bands and whether the site is green hosted.",
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "domain"
  ]
}
🔴delete_watch(id)

Delete one of the customer's watches by id, from list_watches. Deliveries stop immediately. Free.

Input Schema

{
  "type": "object",
  "properties": {
    "id": {
      "description": "The watch id, from list_watches.",
      "type": "integer"
    }
  },
  "required": [
    "id"
  ]
}
🟡create_watch(technologies, technologiesAll, technologiesExcluding, keywords, category, ...)

Set up a standing watch that delivers newly discovered matching sites on a schedule. Narrow it by technology, keyword, category, country, region (a state or province), distance from a place or whether the site publishes a contact route; a completely unfiltered watch needs a plan that allows the every-site stream. Free to create, but delivered sites count against the monthly site allowance, and plans limit how many watches, technologies and keywords you may have. A webhook watch returns its signing secret exactly once when it is created.

Input Schema

{
  "type": "object",
  "properties": {
    "technologies": {
      "description": "Technologies to watch, by name. A site matches if it uses ANY of them.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "technologiesAll": {
      "description": "Also require ALL of these technologies.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "technologiesExcluding": {
      "description": "Exclude sites using any of these technologies.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "keywords": {
      "description": "Whole words to look for in a site's name, title or description, e.g. photogrammetry. Matches ANY of them; a multi-word entry is a phrase. Three characters or more. A common word is refused as too broad, with an estimate of what it would deliver. Combines with a technology: 'Stripe and photogrammetry' fits on every plan.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "category": {
      "description": "Restrict to a product category. For several, use categories.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "categories": {
      "description": "Restrict to several product categories. A site matches if it is in ANY of them.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "country": {
      "description": "Restrict to a country, ISO 3166-1 alpha-2 or a name. For several, use countries.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "countries": {
      "description": "Restrict to several countries, each an ISO 3166-1 alpha-2 code or a name, e.g. [\"GB\", \"Ireland\"]. A site matches if it is in ANY of them.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    },
    "hasContactEmail": {
      "description": "Only sites that have a published contact email (true), or only those that do not (false). Omit for no filter. Needs the 'contacts' permission.",
      "type": [
        "boolean",
        "null"
      ],
      "default": null
    },
    "hasContactPage": {
      "description": "Only sites that have a published contact page (true), or only those that do not (false). Omit for no filter; set both to require both. Needs the 'contacts' permission.",
      "type": [
        "boolean",
        "null"
      ],
      "default": null
    },
    "channel": {
      "description": "Delivery channel: email, webhook, slack, or portal for no outbound delivery. Default email.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "webhookUrl": {
      "description": "Full HTTPS delivery URL, required for webhook or slack. It is stored encrypted; list_watches later returns only its host, never its path or query.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "cadence": {
      "description": "How often to deliver: instant, hourly, daily or weekly. Email takes daily or weekly (default daily). Slack takes all four (default instant); hourly, daily and weekly post one grouped message per slot, and instant groups several matches arriving together. Webhook is always instant; portal stores the value but does not deliver.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "near": {
      "description": "Only sites near a place: a town or city, a postcode, or 'lat,lng', e.g. Bristol. Use with radius. Sites we could not place never match.",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "radius": {
      "description": "How far from near, e.g. 30mi or 50km (a bare number is km). From 5 to 248 miles (8 to 400 km).",
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "regions": {
      "description": "Only sites in these states, provinces or other regions, e.g. [\"Texas\", \"Oklahoma\"]. Each a name, a name and country such as 'Georgia, US', or an id such as US-TX. A site matches if it is in ANY of them. Sites we could not place never match.",
      "type": [
        "array",
        "null"
      ],
      "items": {
        "type": [
          "string",
          "null"
        ]
      },
      "default": null
    }
  }
}
🟢account_status

What this connection can do and how much allowance is left: the plan, the permissions granted, and how many more distinct sites may be returned before the monthly allowance is used up. Calls themselves are not capped. Free. Worth calling before a large query.

Input Schema

{
  "type": "object",
  "properties": {}
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded11 tools
verifiedversion not recorded11 tools
auth requiredversion not recorded—
auth requiredversion not recorded—
auth requiredversion not recorded—
auth requiredversion not recorded—