Keyword Search Volume, CPC, Keyword Ideas and Google Trends API

Google keyword search volume, CPC, difficulty, keyword ideas and Google Trends. Pay per call (x402)

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,283Tokens (tool definitions)
~2.6 KBTypical response size
Moderate attention impact (1.78% 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": {
    "keyword-search-volume-google-trends": {
      "url": "https://keywords.duoleads.com/mcp"
    }
  }
}

Remote endpoints

https://keywords.duoleads.com/mcpstreamable-http

What it can do

Tool inventory

Tools (6)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢keyword_overview(keywords, locationCode, languageCode, country, includeMonthly)

Search volume, CPC, competition, keyword difficulty and search intent for up to 100 keywords in one $0.04 call (Google Ads data). Use when you already have a keyword list to prioritise. volume = avg monthly searches, cpc in USD, competition 0-1, difficulty 0-100. Keywords without data are left out of results and listed in missing (still charged). Bad input is free; upstream errors are not charged. Price: $0.04 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

Input Schema

{
  "type": "object",
  "properties": {
    "keywords": {
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320
      },
      "description": "Keywords to look up (1-100; each at most 80 characters). Whitespace and control characters are normalised to single spaces and keywords to lower case; a keyword that is then empty, over 10 words or over 80 characters is not looked up and is listed in missing, and a request with no keyword left to look up is a free 400 (the one exception to openverbs schema compatibility)."
    },
    "locationCode": {
      "description": "Google Ads location code (geo target ID). Default 2840 (United States); an unsupported code falls back to 2840 (United States).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "languageCode": {
      "description": "Language code (2-letter). Default en. An unsupported location falls back to 2840 (United States) with en (or the requested language if the United States offers it); a supported location with a language it does not offer uses that location's default language (en if offered). Either way market.fallback is true and market.warnings says what was used.",
      "type": "string",
      "maxLength": 16
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 code or country name, used when locationCode is absent (uk = gb).",
      "type": "string",
      "maxLength": 64
    },
    "includeMonthly": {
      "description": "Add each keyword's monthly search volumes.",
      "type": "boolean"
    }
  },
  "required": [
    "keywords"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢keyword_search_volume(keywords, country, lang, includeMonthly)

Google search volume, CPC, competition, keyword difficulty and intent for up to 20 comma-separated keywords in one $0.04 GET (Google Ads data). Use when you need monthly search volume for a few keywords in a country. volume = avg monthly searches, cpc in USD, competition 0-1, difficulty 0-100. Up to 100 keywords for the same $0.04: POST /v1/keyword-overview. Keywords without data are listed in missing (still charged). Bad input is free; upstream errors are not charged. Price: $0.04 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

Input Schema

{
  "type": "object",
  "properties": {
    "keywords": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320
      },
      "description": "1-20 keywords (no commas inside a keyword; each at most 80 characters). Whitespace and control characters are normalised to single spaces and keywords to lower case; a keyword that is then empty, over 10 words or over 80 characters is not looked up and is listed in missing; none left to look up is a free 400."
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 country code of a supported location (us, gb, de, ...; uk = gb). Default us.",
      "type": "string",
      "maxLength": 8
    },
    "lang": {
      "description": "Language code offered for the country (en, es, de, ...). Default en when offered.",
      "type": "string",
      "maxLength": 16
    },
    "includeMonthly": {
      "description": "Add each keyword's monthly search volumes.",
      "type": "boolean"
    }
  },
  "required": [
    "keywords"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢keyword_ideas(keyword, limit, locationCode, languageCode, country, ...)

Keyword ideas for a seed keyword, each with Google search volume, CPC, competition, keyword difficulty and search intent; up to 100 ideas in one $0.04 call (Google Ads data). Use when you need related keywords to target. volume = avg monthly searches, cpc in USD, competition 0-1, difficulty 0-100. No ideas returns empty results (still charged). Bad input is free; upstream errors are not charged. Price: $0.04 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

Input Schema

{
  "type": "object",
  "properties": {
    "keyword": {
      "type": "string",
      "maxLength": 320,
      "description": "Seed keyword to expand (at most 80 characters; whitespace, control characters and case are normalised; a seed then empty, over 10 words or over 80 characters is a free 400)."
    },
    "limit": {
      "description": "Maximum ideas to return (1-100). Default 20.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "locationCode": {
      "description": "Google Ads location code (geo target ID). Default 2840 (United States); an unsupported code falls back to 2840 (United States).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "languageCode": {
      "description": "Language code (2-letter). Default en. An unsupported location falls back to 2840 (United States) with en (or the requested language if the United States offers it); a supported location with a language it does not offer uses that location's default language (en if offered). Either way market.fallback is true and market.warnings says what was used.",
      "type": "string",
      "maxLength": 16
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 code or country name, used when locationCode is absent.",
      "type": "string",
      "maxLength": 64
    },
    "includeMonthly": {
      "description": "Add each idea's monthly search volumes.",
      "type": "boolean"
    }
  },
  "required": [
    "keyword"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢google_trends(keyword, country, timeframe)

Google Trends interest over time for one keyword: a dated 0-100 series for a country or worldwide, past 7 days to 5 years, in one $0.045 GET. Use when you need search-interest trends, seasonality or demand direction for a keyword. Daily points for short windows, weekly for 12 months. A live call takes up to about 30 s. Bad input is free; upstream errors are not charged. Price: $0.045 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

Input Schema

{
  "type": "object",
  "properties": {
    "keyword": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "One keyword or phrase (2-100 characters, no commas)."
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 country code (us, gb, de, ...; uk = gb). Omit for worldwide.",
      "type": "string",
      "maxLength": 8
    },
    "timeframe": {
      "description": "Time window. Default past_12_months.",
      "type": "string",
      "enum": [
        "past_7_days",
        "past_30_days",
        "past_90_days",
        "past_12_months",
        "past_5_years"
      ]
    }
  },
  "required": [
    "keyword"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢google_trends_related_queries(keyword, country, timeframe)

Google Trends related queries for one keyword: the top related searches (0-100) and the rising ones (% growth), for a country or worldwide, past 7 days to 5 years, in one $0.03 GET. Use when you need query expansion, content ideas or emerging searches around a keyword. A live call takes up to about 30 s. Bad input is free; upstream errors are not charged. Price: $0.03 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

Input Schema

{
  "type": "object",
  "properties": {
    "keyword": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "One keyword or phrase (2-100 characters, no commas)."
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 country code (us, gb, de, ...; uk = gb). Omit for worldwide.",
      "type": "string",
      "maxLength": 8
    },
    "timeframe": {
      "description": "Time window. Default past_12_months.",
      "type": "string",
      "enum": [
        "past_7_days",
        "past_30_days",
        "past_90_days",
        "past_12_months",
        "past_5_years"
      ]
    }
  },
  "required": [
    "keyword"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢google_trends_by_region(keyword, country, timeframe)

Google Trends interest by region for one keyword: 0-100 interest per subregion of a country (or per country worldwide), past 7 days to 5 years, in one $0.03 GET. Use when you need where a keyword is searched most, for geo-targeting or local market research. A live call takes up to about 30 s. Bad input is free; upstream errors are not charged. Price: $0.03 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

Input Schema

{
  "type": "object",
  "properties": {
    "keyword": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "description": "One keyword or phrase (2-100 characters, no commas)."
    },
    "country": {
      "description": "ISO 3166-1 alpha-2 country code (us, gb, de, ...; uk = gb). Omit for worldwide.",
      "type": "string",
      "maxLength": 8
    },
    "timeframe": {
      "description": "Time window. Default past_12_months.",
      "type": "string",
      "enum": [
        "past_7_days",
        "past_30_days",
        "past_90_days",
        "past_12_months",
        "past_5_years"
      ]
    }
  },
  "required": [
    "keyword"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools