Koskamo

Duo Leads Keyword MCP

Provides keyword research data including Google search volume, CPC, competition, difficulty, and search intent for up to 100 keywords per call, along with keyword ideas and Google Trends data. It uses a pay-per-call model via x402 with USDC on Base, requiring no account or API key.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Duo Leads Keyword MCP logo, by Duo LeadsVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Duo Leads
You need:no account, no API key, no subscriptionPaid per call over x402 with USDC on Base
MCP endpoint (Streamable HTTP)
https://keywords.duoleads.com/mcp
Vendor documentation

What you can do with it

  • Retrieve search volume and CPC for a list of keywords
  • Generate keyword ideas based on a seed keyword
  • Get Google Trends interest over time for a keyword
  • Find related queries and interest by region for a keyword

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
Keyword Search Volume and CPC 1.0.0
MCP protocol
2025-06-18
Tools
6 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Keyword research data for agents: Google search volume, CPC, competition, keyword difficulty and intent, keyword ideas (Google Ads keyword data), and Google Trends. tools/list is free; each tools/call costs $0.03-$0.045 in USDC on Base, paid with x402 v2. Call a tool without payment to get its PaymentRequired, then repeat the call with the signed payment in _meta["x402/payment"] (any x402 MCP client such as @x402/mcp does this); bad arguments are answered free.

Tools

6 advertised

keyword_overview — Keyword overview (up to 100 keywords)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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"].

keyword_overview input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "keywords"
  ],
  "properties": {
    "country": {
      "type": "string",
      "maxLength": 64,
      "description": "ISO 3166-1 alpha-2 code or country name, used when locationCode is absent (uk = gb)."
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320
      },
      "maxItems": 100,
      "minItems": 1,
      "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)."
    },
    "languageCode": {
      "type": "string",
      "maxLength": 16,
      "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."
    },
    "locationCode": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Google Ads location code (geo target ID). Default 2840 (United States); an unsupported code falls back to 2840 (United States)."
    },
    "includeMonthly": {
      "type": "boolean",
      "description": "Add each keyword's monthly search volumes."
    }
  }
}
keyword_overview annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
keyword_search_volume — Search volume (GET, up to 20 keywords)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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"].

keyword_search_volume input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "keywords"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "maxLength": 16,
      "description": "Language code offered for the country (en, es, de, ...). Default en when offered."
    },
    "country": {
      "type": "string",
      "maxLength": 8,
      "description": "ISO 3166-1 alpha-2 country code of a supported location (us, gb, de, ...; uk = gb). Default us."
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 320
      },
      "maxItems": 20,
      "minItems": 1,
      "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."
    },
    "includeMonthly": {
      "type": "boolean",
      "description": "Add each keyword's monthly search volumes."
    }
  }
}
keyword_search_volume annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
keyword_ideas — Keyword ideas (up to 100 per seed)
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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"].

keyword_ideas input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "keyword"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Maximum ideas to return (1-100). Default 20."
    },
    "country": {
      "type": "string",
      "maxLength": 64,
      "description": "ISO 3166-1 alpha-2 code or country name, used when locationCode is absent."
    },
    "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)."
    },
    "languageCode": {
      "type": "string",
      "maxLength": 16,
      "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."
    },
    "locationCode": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": -9007199254740991,
      "description": "Google Ads location code (geo target ID). Default 2840 (United States); an unsupported code falls back to 2840 (United States)."
    },
    "includeMonthly": {
      "type": "boolean",
      "description": "Add each idea's monthly search volumes."
    }
  }
}
keyword_ideas annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
google_trends — Google Trends interest over time
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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. Too little Google data gives an empty answer, which is still charged. Price: $0.045 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

google_trends input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "keyword"
  ],
  "properties": {
    "country": {
      "type": "string",
      "maxLength": 8,
      "description": "ISO 3166-1 alpha-2 country code (us, gb, de, ...; uk = gb). Omit for worldwide."
    },
    "keyword": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "One keyword or phrase (2-100 characters, no commas)."
    },
    "timeframe": {
      "enum": [
        "past_7_days",
        "past_30_days",
        "past_90_days",
        "past_12_months",
        "past_5_years"
      ],
      "type": "string",
      "description": "Time window. Default past_12_months."
    }
  }
}
google_trends annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
google_trends_related_queries — Google Trends related queries
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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. Too little Google data gives an empty answer, which is still charged. Price: $0.03 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

google_trends_related_queries input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "keyword"
  ],
  "properties": {
    "country": {
      "type": "string",
      "maxLength": 8,
      "description": "ISO 3166-1 alpha-2 country code (us, gb, de, ...; uk = gb). Omit for worldwide."
    },
    "keyword": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1,
      "description": "One keyword or phrase (2-100 characters, no commas)."
    },
    "timeframe": {
      "enum": [
        "past_7_days",
        "past_30_days",
        "past_90_days",
        "past_12_months",
        "past_5_years"
      ],
      "type": "string",
      "description": "Time window. Default past_12_months."
    }
  }
}
google_trends_related_queries annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
google_trends_by_region — Google Trends interest by region
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

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. Too little Google data gives an empty answer, which is still charged. Price: $0.03 per successful call, paid over x402 (USDC on Base); pass the payment in _meta["x402/payment"].

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

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
294 ms
95th percentile latency
294 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 294 ms · metadata changed · 6 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http duo-leads-keyword-mcp https://keywords.duoleads.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add duo-leads-keyword-mcp --url https://keywords.duoleads.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable duo-leads-keyword-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "duo-leads-keyword-mcp": {
      "url": "https://keywords.duoleads.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "duo-leads-keyword-mcp": {
      "type": "streamableHttp",
      "url": "https://keywords.duoleads.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start duo-leads-keyword-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "duo-leads-keyword-mcp": {
      "type": "http",
      "url": "https://keywords.duoleads.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http duo-leads-keyword-mcp https://keywords.duoleads.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "duo-leads-keyword-mcp": {
      "url": "https://keywords.duoleads.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "duo-leads-keyword-mcp": {
      "serverUrl": "https://keywords.duoleads.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Duo Leads Keyword MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Duo Leads Keyword MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing