
Ecommerce store metrics by domain: revenue, ad spend, traffic. Log in to search 600k+ stores.
Maintained bygetecommerceleads.com(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Add domains to a watchlist (merge, nothing is removed). THIS SPENDS CREDITS: 1 credit per domain that is new to the list. Before you call it, tell the user the cost of 1 credit per store and how many domains you will add, then ask the user to confirm. Never call it without the confirmation. If you have too few credits, the result shows the cost and your balance, and nothing is added. Paid plans only.
The list id from listWatchlists.
The store domains to add, for example example.com. At most 50 per call.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http ecommerce-leads https://getecommerceleads.com/api/mcp
Add domains to a watchlist (merge, nothing is removed). THIS SPENDS CREDITS: 1 credit per domain that is new to the list. Before you call it, tell the user the cost of 1 credit per store and how many domains you will add, then ask the user to confirm. Never call it without the confirmation. If you have too few credits, the result shows the cost and your balance, and nothing is added. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| listId* | integer | The list id from listWatchlists. |
| domains* | array | The store domains to add, for example example.com. At most 50 per call. |
{
"type": "object",
"required": [
"listId",
"domains"
],
"properties": {
"listId": {
"type": "integer",
"minimum": 1,
"description": "The list id from listWatchlists."
},
"domains": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "The store domains to add, for example example.com. At most 50 per call."
}
}
}Create an empty watchlist. You can have at most 10 lists, including the blacklist. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| name* | string | The list name. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"description": "The list name."
}
}
}Delete one of your signal sets. The set stops matching stores and disappears from listSignalSets and from the dashboard tabs. You cannot undo this. Ask the user to confirm before you call it. Say the name of the set in your question. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| setId* | integer | The set id from listSignalSets. |
{
"type": "object",
"required": [
"setId"
],
"properties": {
"setId": {
"type": "integer",
"minimum": 1,
"description": "The set id from listSignalSets."
}
}
}Delete one of your watchlists with all its domains. The blacklist cannot be deleted. Ask the user to confirm before you call it. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| listId* | integer | The list id from listWatchlists. |
{
"type": "object",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "integer",
"minimum": 1,
"description": "The list id from listWatchlists."
}
}
}Export revealed stores as CSV text. Stores you have not revealed are skipped. The result holds the header row and at most 200 data rows; it says when it cut the rows. For a larger export, narrow the selection or download the file in the dashboard. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| selection* | object | The stores to price. Pass either "ids", or "tab" with optional "filters" and "deselected". |
| visibleColumns | array | Optional. The column names to export. Leave it out for all columns. |
{
"type": "object",
"required": [
"selection"
],
"properties": {
"selection": {
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Store ids (the storeId field of a searchStores row)."
},
"tab": {
"type": "string",
"description": "all, revealed, set:{id} or watchlist:{id}. Prices every store in the tab after the filters."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"column",
"operator"
],
"properties": {
"value": {
"description": "The value to compare. A number for number columns, a YYYY-MM-DD date for isBefore and isAfter, a number of days for isWithinLast. Leave it out for isEmpty, isNotEmpty, exists and notExists."
},
"column": {
"type": "string",
"description": "A column key, for example \"Industry\" or \"Total Traffic\". Call searchStores with includeColumns true to see all keys."
},
"operator": {
"enum": [
"contains",
"notContains",
"is",
"isNot",
"isEmpty",
"isNotEmpty",
"exists",
"notExists",
"gt",
"gte",
"lt",
"lte",
"eq",
"isBefore",
"isAfter",
"isWithinLast",
"hasAny",
"notHas"
],
"type": "string",
"description": "Text columns: contains, notContains, is, isNot. Number columns: gt, gte, lt, lte, eq. Date columns: is, isBefore, isAfter, isWithinLast. Tag columns: hasAny, notHas. All types: isEmpty, isNotEmpty, exists, notExists."
}
}
},
"description": "Filters for the tab, in the searchStores format."
},
"deselected": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Store ids to leave out of a tab selection."
}
},
"description": "The stores to price. Pass either \"ids\", or \"tab\" with optional \"filters\" and \"deselected\"."
},
"visibleColumns": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional. The column names to export. Leave it out for all columns."
}
}
}Preview the credit cost of a reveal. Nothing is charged and nothing is revealed. Returns the cost of each action (details, ceo, marketing, ecommerce) for the selected stores.
| Argument | Type | Description |
|---|---|---|
| selection* | object | The stores to price. Pass either "ids", or "tab" with optional "filters" and "deselected". |
{
"type": "object",
"required": [
"selection"
],
"properties": {
"selection": {
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Store ids (the storeId field of a searchStores row)."
},
"tab": {
"type": "string",
"description": "all, revealed, set:{id} or watchlist:{id}. Prices every store in the tab after the filters."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"column",
"operator"
],
"properties": {
"value": {
"description": "The value to compare. A number for number columns, a YYYY-MM-DD date for isBefore and isAfter, a number of days for isWithinLast. Leave it out for isEmpty, isNotEmpty, exists and notExists."
},
"column": {
"type": "string",
"description": "A column key, for example \"Industry\" or \"Total Traffic\". Call searchStores with includeColumns true to see all keys."
},
"operator": {
"enum": [
"contains",
"notContains",
"is",
"isNot",
"isEmpty",
"isNotEmpty",
"exists",
"notExists",
"gt",
"gte",
"lt",
"lte",
"eq",
"isBefore",
"isAfter",
"isWithinLast",
"hasAny",
"notHas"
],
"type": "string",
"description": "Text columns: contains, notContains, is, isNot. Number columns: gt, gte, lt, lte, eq. Date columns: is, isBefore, isAfter, isWithinLast. Tag columns: hasAny, notHas. All types: isEmpty, isNotEmpty, exists, notExists."
}
}
},
"description": "Filters for the tab, in the searchStores format."
},
"deselected": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Store ids to leave out of a tab selection."
}
},
"description": "The stores to price. Pass either \"ids\", or \"tab\" with optional \"filters\" and \"deselected\"."
}
}
}Check the status of contact searches you started in the dashboard, and your credit balance. Read only.
| Argument | Type | Description |
|---|---|---|
| storeIds* | array | Store ids to check. |
{
"type": "object",
"required": [
"storeIds"
],
"properties": {
"storeIds": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"maxItems": 300,
"description": "Store ids to check."
}
}
}Get one of your signal sets, with its criteria. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| setId* | integer | The signal set id from listSignalSets. |
{
"type": "object",
"required": [
"setId"
],
"properties": {
"setId": {
"type": "integer",
"minimum": 1,
"description": "The signal set id from listSignalSets."
}
}
}Get the latest 24 points of one metric for a store, for a chart. Values use your currency.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The store domain, for example example.com. |
| metric* | string | The metric name. |
{
"type": "object",
"required": [
"domain",
"metric"
],
"properties": {
"domain": {
"type": "string",
"description": "The store domain, for example example.com."
},
"metric": {
"enum": [
"Est. Monthly Revenue (USD)",
"Total Traffic",
"Organic Traffic",
"Google Paid Traffic",
"Paid Social Traffic",
"Organic Social Traffic",
"Backlinks",
"Referring Domains",
"Page Speed Performance Score",
"Page Speed SEO Score",
"Estimated Google Ad Spend",
"Estimated Meta Ad Spend",
"Total Meta Ads",
"Active Meta Ads",
"Number of Video Ads",
"Total Instagram Followers",
"Total Instagram Posts",
"Instagram Engagement Rate",
"Average Instagram Likes",
"Average Instagram Comments",
"Average Instagram Posts per Week",
"Total Tiktok Followers",
"Total Tiktok Uploads",
"Average Tiktok Uploads per Week"
],
"type": "string",
"description": "The metric name."
}
}
}Get the domains of one watchlist or the blacklist, 100 per page. To see store data for a watchlist, call searchStores with tab "watchlist:{id}". Paid plans only.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number, starting at 1. |
| listId* | integer | The list id from listWatchlists. |
{
"type": "object",
"required": [
"listId"
],
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number, starting at 1."
},
"listId": {
"type": "integer",
"minimum": 1,
"description": "The list id from listWatchlists."
}
}
}List your signal sets, with the signal catalog and the ICP columns you can use in criteria. Paid plans only.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}List your watchlists and your blacklist, with the domain count of each. Paid plans only.
No arguments.
{
"type": "object",
"required": [],
"properties": {}
}Look up one ecommerce store by domain. The reply has company data, estimated revenue, marketing budget, traffic, Google and Meta ad spend, ad counts, a Conversion Rate Score, buying signals, the store phone number, and social and ad-library links. Decision-maker contact fields are not in the fields list. With OAuth access, the decisionMakers object shows the contacts that you revealed. When other active stores use the same base domain, the reply has sharedMetrics. Those stores show the same traffic and ad numbers, because the data belongs to the base domain. Limits: anonymous access, 20 lookups per hour per IP. OAuth access, 20 lookups per minute, and the call writes a lookup history row.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The store domain, for example example.com. A full URL also works. |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "The store domain, for example example.com. A full URL also works."
}
}
}Check whether candidate signal criteria match enough stores (80 or more). Returns {"enough": true|false}. It does not save anything. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| setId | integer | Optional. The id of a set you are editing. |
| criteria* | object | Either {"root": node} with a recursive tree, or the flat form {"signalIds": [...], "legacyCategories": [...], "icpFilters": [...]}. A node is {"type":"group","op":"AND"|"OR","children":[...]}, {"type":"not","child":node}, {"type":"signal","signalId":"..."}, {"type":"legacyCategory","category":"..."} or {"type":"icp","column":"...","operator":"...","value":"..."}. Use the catalog and ICP columns from listSignalSets. |
{
"type": "object",
"required": [
"criteria"
],
"properties": {
"setId": {
"type": "integer",
"minimum": 1,
"description": "Optional. The id of a set you are editing."
},
"criteria": {
"type": "object",
"description": "Either {\"root\": node} with a recursive tree, or the flat form {\"signalIds\": [...], \"legacyCategories\": [...], \"icpFilters\": [...]}. A node is {\"type\":\"group\",\"op\":\"AND\"|\"OR\",\"children\":[...]}, {\"type\":\"not\",\"child\":node}, {\"type\":\"signal\",\"signalId\":\"...\"}, {\"type\":\"legacyCategory\",\"category\":\"...\"} or {\"type\":\"icp\",\"column\":\"...\",\"operator\":\"...\",\"value\":\"...\"}. Use the catalog and ICP columns from listSignalSets."
}
}
}Remove one domain from a watchlist or from the blacklist. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The exact domain as getWatchlist shows it. |
| listId* | integer | The list id from listWatchlists. |
{
"type": "object",
"required": [
"listId",
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "The exact domain as getWatchlist shows it."
},
"listId": {
"type": "integer",
"minimum": 1,
"description": "The list id from listWatchlists."
}
}
}Rename one of your watchlists. The blacklist cannot be renamed. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| name* | string | The new name. |
| listId* | integer | The list id from listWatchlists. |
{
"type": "object",
"required": [
"listId",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"description": "The new name."
},
"listId": {
"type": "integer",
"minimum": 1,
"description": "The list id from listWatchlists."
}
}
}Reveal data for stores. THIS SPENDS CREDITS. Before you call it, call getRevealCost for the same selection and tell the user the cost, or state the cost of 1 credit per store, then ask the user to confirm. Never call it without the confirmation. details unlocks the profile links, buying signals and phone. ceo, marketing and ecommerce start a decision-maker contact search (1 credit per store, +1 for a store whose details are not revealed yet). A store you already revealed costs 0. If you have too few credits, the result shows the cost and your balance, and nothing is charged. Use getRevealStatus to follow a contact search.
| Argument | Type | Description |
|---|---|---|
| action* | string | What to reveal. |
| selection* | object | The stores to price. Pass either "ids", or "tab" with optional "filters" and "deselected". |
{
"type": "object",
"required": [
"action",
"selection"
],
"properties": {
"action": {
"enum": [
"details",
"ceo",
"marketing",
"ecommerce"
],
"type": "string",
"description": "What to reveal."
},
"selection": {
"type": "object",
"properties": {
"ids": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Store ids (the storeId field of a searchStores row)."
},
"tab": {
"type": "string",
"description": "all, revealed, set:{id} or watchlist:{id}. Prices every store in the tab after the filters."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"column",
"operator"
],
"properties": {
"value": {
"description": "The value to compare. A number for number columns, a YYYY-MM-DD date for isBefore and isAfter, a number of days for isWithinLast. Leave it out for isEmpty, isNotEmpty, exists and notExists."
},
"column": {
"type": "string",
"description": "A column key, for example \"Industry\" or \"Total Traffic\". Call searchStores with includeColumns true to see all keys."
},
"operator": {
"enum": [
"contains",
"notContains",
"is",
"isNot",
"isEmpty",
"isNotEmpty",
"exists",
"notExists",
"gt",
"gte",
"lt",
"lte",
"eq",
"isBefore",
"isAfter",
"isWithinLast",
"hasAny",
"notHas"
],
"type": "string",
"description": "Text columns: contains, notContains, is, isNot. Number columns: gt, gte, lt, lte, eq. Date columns: is, isBefore, isAfter, isWithinLast. Tag columns: hasAny, notHas. All types: isEmpty, isNotEmpty, exists, notExists."
}
}
},
"description": "Filters for the tab, in the searchStores format."
},
"deselected": {
"type": "array",
"items": {
"type": "integer",
"minimum": 1
},
"description": "Store ids to leave out of a tab selection."
}
},
"description": "The stores to price. Pass either \"ids\", or \"tab\" with optional \"filters\" and \"deselected\"."
}
}
}Create a signal set, or replace the criteria of an existing one. Without setId it creates a new set (the plan limit applies). With setId it updates that set and replaces all its signals, legacy categories and ICP filters with the new criteria. Conditions that you did not set (saved custom SQL conditions) stay on the set, joined with AND. Then the reply has preservedConditions, the number of these conditions. Use previewSignalSet first to check that the criteria match enough stores. Paid plans only.
| Argument | Type | Description |
|---|---|---|
| name | string | Optional. The name of a new set. |
| setId | integer | Optional. The id of the set to update. Leave it out to create a set. |
| criteria* | object | The criteria, in the same format as previewSignalSet. |
{
"type": "object",
"required": [
"criteria"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"description": "Optional. The name of a new set."
},
"setId": {
"type": "integer",
"minimum": 1,
"description": "Optional. The id of the set to update. Leave it out to create a set."
},
"criteria": {
"type": "object",
"description": "The criteria, in the same format as previewSignalSet."
}
}
}Search the store catalog like the Ecommerce Leads dashboard. Returns 30 rows per page. Stores you have not revealed show masked values for the hidden fields; revealed stores show the real values. By default, each row has storeId, 9 key columns (Industry, Country, revenue, Total Traffic, Google and Meta ad spend, Buying Signals, Buying Signals List, Status) and a short "reveal" object (revealed, contactTypes, pendingTypes). Use the columns argument to choose other columns, or ["*"] for all columns and the full reveal object. The result has the column list only when includeColumns is true. The result has the exact total. If the count fails, the result has totalAtLeast (a lower bound that grows on each page) and a note. Use hasMore to decide whether to fetch the next page, and do not report totalAtLeast as the number of matches. When other active stores use the same base domain, the row has sharedMetrics {basedomain, relatedStoreCount}. Those stores show the same traffic and ad numbers, because the data belongs to the base domain.
| Argument | Type | Description |
|---|---|---|
| tab | string | Which stores to search: all (default), revealed, set:{id} for a signal set, or watchlist:{id} for a watchlist. Free plans can use all and revealed only. |
| page | integer | Page number, starting at 1. |
| sort | object | |
| columns | array | The column keys to return in each row. Use ["*"] for all columns. If you omit it, the default set is returned. An unknown key gives an error that lists the valid keys. |
| filters | array | Column filters. All filters must match. |
| includeColumns | boolean | Set to true to get the column list (key, label, type) in the result. Default false. |
{
"type": "object",
"required": [],
"properties": {
"tab": {
"type": "string",
"description": "Which stores to search: all (default), revealed, set:{id} for a signal set, or watchlist:{id} for a watchlist. Free plans can use all and revealed only."
},
"page": {
"type": "integer",
"minimum": 1,
"description": "Page number, starting at 1."
},
"sort": {
"type": "object",
"required": [
"column"
],
"properties": {
"column": {
"type": "string",
"description": "A column key, for example \"Industry\" or \"Total Traffic\". Set includeColumns to true to see all keys."
},
"direction": {
"enum": [
"asc",
"desc"
],
"type": "string"
}
}
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The column keys to return in each row. Use [\"*\"] for all columns. If you omit it, the default set is returned. An unknown key gives an error that lists the valid keys."
},
"filters": {
"type": "array",
"items": {
"type": "object",
"required": [
"column",
"operator"
],
"properties": {
"value": {
"description": "The value to compare. A number for number columns, a YYYY-MM-DD date for isBefore and isAfter, a number of days for isWithinLast. Leave it out for isEmpty, isNotEmpty, exists and notExists."
},
"column": {
"type": "string",
"description": "A column key, for example \"Industry\" or \"Total Traffic\". Call searchStores with includeColumns true to see all keys."
},
"operator": {
"enum": [
"contains",
"notContains",
"is",
"isNot",
"isEmpty",
"isNotEmpty",
"exists",
"notExists",
"gt",
"gte",
"lt",
"lte",
"eq",
"isBefore",
"isAfter",
"isWithinLast",
"hasAny",
"notHas"
],
"type": "string",
"description": "Text columns: contains, notContains, is, isNot. Number columns: gt, gte, lt, lte, eq. Date columns: is, isBefore, isAfter, isWithinLast. Tag columns: hasAny, notHas. All types: isEmpty, isNotEmpty, exists, notExists."
}
}
},
"description": "Column filters. All filters must match."
},
"includeColumns": {
"type": "boolean",
"description": "Set to true to get the column list (key, label, type) in the result. Default false."
}
}
}Send a feedback message to the Ecommerce Leads team. Limit: 5 messages per hour.
| Argument | Type | Description |
|---|---|---|
| message* | string | The feedback text. |
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"maxLength": 3000,
"minLength": 3,
"description": "The feedback text."
}
}
}Set the outreach status of one store that you revealed. Use the storeId from a searchStores row. If you did not reveal the store, the tool returns an error. Use revealStores first. A store in a revealed group is accepted at no credit cost.
| Argument | Type | Description |
|---|---|---|
| status* | string | |
| storeId* | integer | The store id (the storeId field of a searchStores row). |
{
"type": "object",
"required": [
"storeId",
"status"
],
"properties": {
"status": {
"enum": [
"Not Contacted",
"Contacted",
"Not Interested",
"Interested",
"Won",
"Blacklisted"
],
"type": "string"
},
"storeId": {
"type": "integer",
"minimum": 1,
"description": "The store id (the storeId field of a searchStores row)."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 4, 2026.
What changed in this server's tools since we started watching, newest first. Each change is scanned again.