OpenSEO Keyword Clustering
Goal
Group keywords into page-level clusters and decide which existing or new page should target each cluster. This is a keyword mapping workflow, not just a semantic grouping exercise.
Required inputs
projectId
- A keyword list, saved keyword tag, seed topic, or target domain
- Optional existing URLs/pages to map against
If keywords are not provided, use list_saved_keywords for saved sets, research_keywords for seed discovery, or get_ranked_keywords when the user starts from a target domain.
OpenSEO MCP tools
list_saved_keywords: fetch an existing keyword set, optionally filtered by tags.
research_keywords: expand a seed when the user starts from a topic.
get_ranked_keywords: gather exact ranking keywords and URLs when the user starts from a domain or page.
get_search_console_performance: when Search Console is connected, pull real queries with dimensions: ["query","page"] to map terms to the pages already earning impressions and to surface cannibalization (one query splitting clicks across multiple URLs).
get_serp_results: validate whether keywords belong on the same page by checking SERP overlap and intent.
get_local_serp_results: use for local SEO clusters when Maps/local-pack intent should affect page mapping.
save_keywords: optionally tag final clusters after user confirmation.
Workflow
- Gather the candidate keyword set.
- Use
get_search_console_performance (dimensions ["query","page"]) when Search Console is connected to start from real queries and the pages already ranking for them.
- Use
get_ranked_keywords for domain/page-driven clustering.
- Use
search_local_businesses and get_local_serp_results when proximity, local packs, or Google Business results determine whether terms belong on location pages.
- Remove duplicates, irrelevant terms, and terms that clearly require a different product or audience.
- Build clusters around intent and page type:
- Same SERP intent and similar ranking pages belong together.
- Different intent, buyer stage, or SERP format should be split.
- Similar words do not guarantee the same cluster.
- For important borderline terms, use a small
get_serp_results batch to check overlap.
- Assign each cluster to:
- Existing URL, if supplied and appropriate
- New page recommendation, if no existing page fits
- Do-not-target / later bucket, if weak or off-strategy
- Identify cannibalization risk when multiple pages would target the same intent. When Search Console is connected, confirm it from real data with
get_search_console_performance (dimensions: ["query","page"]) — the same query sending impressions to multiple URLs.
- Ask before applying cluster tags with
save_keywords.
Output format
Start with a short mapping summary:
- Number of clusters
- Pages to create
- Existing pages to update
- Cannibalization or consolidation issues
Then include:
| Cluster |
Primary keyword |
Secondary keywords |
Intent |
Target page |
Priority |
Notes |
For each cluster, include a recommended page brief:
- Page type
- Searcher problem
- Required sections
- Internal-link opportunities
- Save/tag suggestion
Guardrails
- Do not over-cluster tiny keyword sets. If there are fewer than 10 usable terms, produce a simple map.
- Do not rely on lexical similarity alone. SERP intent wins.
- Do not replace tags broadly without explicit confirmation.
- If existing URL data is missing, label target pages as proposed.
1---2name: keyword-clustering3description: Cluster keywords by intent and map them to existing or proposed pages.4---56# OpenSEO Keyword Clustering78## Goal910Group keywords into page-level clusters and decide which existing or new page should target each cluster. This is a keyword mapping workflow, not just a semantic grouping exercise.1112## Required inputs1314- `projectId`15- A keyword list, saved keyword tag, seed topic, or target domain16- Optional existing URLs/pages to map against1718If keywords are not provided, use `list_saved_keywords` for saved sets, `research_keywords` for seed discovery, or `get_ranked_keywords` when the user starts from a target domain.1920## OpenSEO MCP tools2122- `list_saved_keywords`: fetch an existing keyword set, optionally filtered by tags.23- `research_keywords`: expand a seed when the user starts from a topic.24- `get_ranked_keywords`: gather exact ranking keywords and URLs when the user starts from a domain or page.25- `get_search_console_performance`: when Search Console is connected, pull real queries with `dimensions: ["query","page"]` to map terms to the pages already earning impressions and to surface cannibalization (one query splitting clicks across multiple URLs).26- `get_serp_results`: validate whether keywords belong on the same page by checking SERP overlap and intent.27- `get_local_serp_results`: use for local SEO clusters when Maps/local-pack intent should affect page mapping.28- `save_keywords`: optionally tag final clusters after user confirmation.2930## Workflow31321. Gather the candidate keyword set.33 - Use `get_search_console_performance` (dimensions `["query","page"]`) when Search Console is connected to start from real queries and the pages already ranking for them.34 - Use `get_ranked_keywords` for domain/page-driven clustering.35 - Use `search_local_businesses` and `get_local_serp_results` when proximity, local packs, or Google Business results determine whether terms belong on location pages.362. Remove duplicates, irrelevant terms, and terms that clearly require a different product or audience.373. Build clusters around intent and page type:38 - Same SERP intent and similar ranking pages belong together.39 - Different intent, buyer stage, or SERP format should be split.40 - Similar words do not guarantee the same cluster.414. For important borderline terms, use a small `get_serp_results` batch to check overlap.425. Assign each cluster to:43 - Existing URL, if supplied and appropriate44 - New page recommendation, if no existing page fits45 - Do-not-target / later bucket, if weak or off-strategy466. Identify cannibalization risk when multiple pages would target the same intent. When Search Console is connected, confirm it from real data with `get_search_console_performance` (`dimensions: ["query","page"]`) — the same query sending impressions to multiple URLs.477. Ask before applying cluster tags with `save_keywords`.4849## Output format5051Start with a short mapping summary:5253- Number of clusters54- Pages to create55- Existing pages to update56- Cannibalization or consolidation issues5758Then include:5960| Cluster | Primary keyword | Secondary keywords | Intent | Target page | Priority | Notes |61| ------- | --------------- | ------------------ | ------ | ----------- | -------- | ----- |6263For each cluster, include a recommended page brief:6465- Page type66- Searcher problem67- Required sections68- Internal-link opportunities69- Save/tag suggestion7071## Guardrails7273- Do not over-cluster tiny keyword sets. If there are fewer than 10 usable terms, produce a simple map.74- Do not rely on lexical similarity alone. SERP intent wins.75- Do not replace tags broadly without explicit confirmation.76- If existing URL data is missing, label target pages as proposed.