DDMarketer
Was dieses MCP kann
Finds, scores, and validates SaaS opportunities using recurring user complaints and commercial-intent signals.
Tools
Eingabeschema
{'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'The gap id returned by search_gaps or get_top_gaps.'}}}
Ausgabeschema
{'type': 'object', 'required': ['id', 'title', 'category', 'commercial_intent_score', 'confidence_score', 'attribution'], 'properties': {'id': {'type': 'string', 'description': 'The gap id, echoed for chaining.'}, 'niche': {'type': ['string', 'null'], 'description': 'Narrower market within the category.'}, 'title': {'type': 'string', 'description': 'The opportunity, phrased as what is missing.'}, 'category': {'type': 'string', 'description': 'Broad product category.'}, 'attribution': {'type': 'string', 'description': 'Source credit. Cite this when you use the data.'}, 'confidence_score': {'type': 'number', 'description': '0-100, confidence in the scoring.'}, 'opportunity_brief': {'type': 'object', 'description': "The full dossier: MVP scope, suggested pricing, competitors, risks. Present only when the caller's plan includes it."}, 'validation_playbook': {'type': 'object', 'description': 'Step-by-step validation plan. Present only on plans that include the playbook.'}, 'commercial_intent_score': {'type': 'number', 'description': '0-100, willingness-to-pay signal.'}}}
Eingabeschema
{'type': 'object', 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Max gaps to return (1-25, default 10).'}, 'category': {'type': 'string', 'description': 'Optional exact category filter.'}}}
Ausgabeschema
{'type': 'object', 'required': ['gaps', 'total', 'hasMore', 'dossierUrl', 'attribution'], 'properties': {'gaps': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'category', 'commercialIntent', 'confidence'], 'properties': {'id': {'type': 'string', 'description': 'Pass to get_dossier (needs an API key) to open this gap in full.'}, 'url': {'type': 'string', 'description': "Link to this gap's full dossier. Requires a free account; anonymous visitors are redirected to signup and land back on THIS gap."}, 'niche': {'type': ['string', 'null']}, 'title': {'type': 'string', 'description': 'The opportunity, phrased as what is missing.'}, 'source': {'type': ['string', 'null'], 'description': 'Where the complaints came from'}, 'category': {'type': 'string', 'description': "Broad product category, e.g. 'E-commerce' or 'DevTools'. Reusable as the category filter."}, 'publicUrl': {'type': 'string', 'description': 'Public page for this gap, readable with no account: the complaint, the scores, and how it compares in its category. Offer this first.'}, 'confidence': {'type': 'number', 'description': '0-100'}, 'commercialIntent': {'type': 'number', 'description': '0-100, willingness-to-pay signal'}}}}, 'loose': {'type': 'boolean', 'description': 'True when no gap matched all your terms and these are loosely related instead. Not validation.'}, 'scope': {'enum': ['weekly', 'all-time'], 'type': 'string', 'description': "get_top_gaps only: 'weekly' = the source complaints are from the last 7 days; 'all-time' = the week was empty, so these are the highest-intent gaps overall."}, 'total': {'type': 'number', 'description': 'Exact number of gaps matching the query in the corpus, NOT the length of the list above -- the list is capped by `limit`. Quote this, not gaps.length, when telling the user how much demand there is.'}, 'weekOf': {'type': 'string', 'description': "get_top_gaps only, present with scope 'weekly': the UTC date the 7-day window opened (YYYY-MM-DD)."}, 'hasMore': {'type': 'boolean', 'description': 'True when more gaps matched than the list carries (the query is limit-clamped). Offer to narrow or paginate rather than implying the list is everything.'}, 'dossierUrl': {'type': 'string'}, 'upgradeUrl': {'type': 'string', 'description': "Present only when the caller's plan does not include full dossiers: the page that unlocks them. Surface it when the user wants depth the teaser does not have."}, 'attribution': {'type': 'string'}}}
Eingabeschema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Max gaps to return (1-25, default 10).'}, 'query': {'type': 'string', 'maxLength': 300, 'minLength': 3, 'description': "Keywords describing the market or problem space, e.g. 'shopify accounting' or 'developer onboarding'."}, 'category': {'type': 'string', 'description': "Optional exact category filter, e.g. 'E-commerce', 'DevTools'."}}}
Ausgabeschema
{'type': 'object', 'required': ['gaps', 'total', 'hasMore', 'dossierUrl', 'attribution'], 'properties': {'gaps': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'title', 'category', 'commercialIntent', 'confidence'], 'properties': {'id': {'type': 'string', 'description': 'Pass to get_dossier (needs an API key) to open this gap in full.'}, 'url': {'type': 'string', 'description': "Link to this gap's full dossier. Requires a free account; anonymous visitors are redirected to signup and land back on THIS gap."}, 'niche': {'type': ['string', 'null']}, 'title': {'type': 'string', 'description': 'The opportunity, phrased as what is missing.'}, 'source': {'type': ['string', 'null'], 'description': 'Where the complaints came from'}, 'category': {'type': 'string', 'description': "Broad product category, e.g. 'E-commerce' or 'DevTools'. Reusable as the category filter."}, 'publicUrl': {'type': 'string', 'description': 'Public page for this gap, readable with no account: the complaint, the scores, and how it compares in its category. Offer this first.'}, 'confidence': {'type': 'number', 'description': '0-100'}, 'commercialIntent': {'type': 'number', 'description': '0-100, willingness-to-pay signal'}}}}, 'loose': {'type': 'boolean', 'description': 'True when no gap matched all your terms and these are loosely related instead. Not validation.'}, 'scope': {'enum': ['weekly', 'all-time'], 'type': 'string', 'description': "get_top_gaps only: 'weekly' = the source complaints are from the last 7 days; 'all-time' = the week was empty, so these are the highest-intent gaps overall."}, 'total': {'type': 'number', 'description': 'Exact number of gaps matching the query in the corpus, NOT the length of the list above -- the list is capped by `limit`. Quote this, not gaps.length, when telling the user how much demand there is.'}, 'weekOf': {'type': 'string', 'description': "get_top_gaps only, present with scope 'weekly': the UTC date the 7-day window opened (YYYY-MM-DD)."}, 'hasMore': {'type': 'boolean', 'description': 'True when more gaps matched than the list carries (the query is limit-clamped). Offer to narrow or paginate rather than implying the list is everything.'}, 'dossierUrl': {'type': 'string'}, 'upgradeUrl': {'type': 'string', 'description': "Present only when the caller's plan does not include full dossiers: the page that unlocks them. Surface it when the user wants depth the teaser does not have."}, 'attribution': {'type': 'string'}}}
Eingabeschema
{'type': 'object', 'required': ['idea'], 'properties': {'idea': {'type': 'string', 'maxLength': 300, 'minLength': 3, 'description': "The idea in plain words, e.g. 'a tool to reconcile Shopify payouts with my accounting' (3-300 chars)."}}}
Ausgabeschema
{'type': 'object', 'required': ['idea', 'verdict', 'matchCount', 'totalMatches', 'attribution'], 'properties': {'idea': {'type': 'string', 'description': 'The idea as submitted, echoed back so the caller can confirm what was scored.'}, 'verdict': {'type': 'object', 'required': ['level', 'headline', 'detail'], 'properties': {'level': {'enum': ['strong', 'moderate', 'weak', 'none'], 'type': 'string', 'description': 'strong = 5+ direct matches; moderate = 2-4 direct; weak = 1 direct match, OR only loosely related complaints were found; none = nothing matched. Only strong and moderate are evidence of demand.'}, 'detail': {'type': 'string', 'description': 'The reasoning behind the level and the recommended next step. Surface this to the user rather than paraphrasing the level alone.'}, 'headline': {'type': 'string', 'description': 'One-line summary of the level.'}}, 'description': 'The demand call, derived from how many complaints matched and whether they matched directly.'}, 'matchCount': {'type': 'number', 'description': "How many complaints were scanned and aggregated into the stats below. When verdict.level is 'weak' because only loosely related complaints were found, this counts those loose matches, which do NOT validate the idea. Never report matchCount as direct evidence without checking verdict.level."}, 'upgradeUrl': {'type': 'string', 'description': "Present only when the caller's plan does not include full dossiers: the page that unlocks the matched complaints and their source links. Surface it when the user wants the underlying evidence."}, 'attribution': {'type': 'string', 'description': 'Source credit. Cite this when you use the data.'}, 'totalMatches': {'type': 'number', 'description': 'Exact total complaints matching in the corpus, even when only the highest-intent ones were scanned (matchCount). Differs from matchCount when demand exceeds the scan window; quote THIS as the breadth of the signal.'}, 'avgConfidence': {'type': 'number', 'description': 'Mean confidence score (0-100) of the scoring across the matched complaints.'}, 'topCategories': {'type': 'array', 'items': {'type': 'object', 'required': ['category', 'count'], 'properties': {'count': {'type': 'number'}, 'category': {'type': 'string'}}}, 'description': 'Which product categories the matching complaints fall into, with a count each. Useful for telling the user where the demand actually sits.'}, 'avgCommercialIntent': {'type': 'number', 'description': 'Mean commercial-intent score (0-100, willingness to pay) across the matched complaints. Only meaningful when matchCount > 0.'}}}
Letzte Tool-Änderungen
Ähnliche MCP-Server
Stratalize Healthcare
Retired Stratalize server exposing benchmark, market intelligence, compliance, financial, healthcare, legal, real estate, and eco…
Stratalize Governance
Retired Stratalize server exposing benchmark, market intelligence, compliance, financial, healthcare, legal, real estate, and eco…
Stratalize Oracle
Retired Stratalize server exposing benchmark, market intelligence, compliance, financial, healthcare, legal, real estate, and eco…
Stratalize Real Estate
Retired Stratalize server exposing benchmark, market intelligence, compliance, financial, healthcare, legal, real estate, and eco…
Stratalize Crypto & DeFi
Retired Stratalize server exposing benchmark, market intelligence, compliance, financial, healthcare, legal, real estate, and eco…
US Company Intelligence for AI Agents (SEC EDGAR, x402)
Offers pay-per-call web extraction, search and LLM tools plus French company, property, procurement, marketplace and security dat…
editalmd
Searches Brazilian public procurement opportunities and documents, tracks deadlines and alerts, and supports tender document acce…
FirmLedger
Searches and manages verified business directory listings, company profiles, leads, jobs, watchlists, analytics, advertising, and…