Ranksta's Paradise (MCP)
Ranksta's Paradise is the source of truth for the Registry (the SEO plan: keywords mapped to target URLs with intent and rationale), the Search Console outcomes, and the keyword demand behind the plan. Answer SEO questions from its output; never query Google or scrape Search Console yourself.
Access it through its MCP tools. Each returns one JSON document.
Every tool takes a site argument: a configured site ID, not a URL. There is no default; always pass site.
| Site ID |
Property |
sleevy |
https://sleevy.app |
missingmounts |
https://www.missingmounts.com |
printfeest |
https://www.printfeest.nl |
shadertown |
https://www.shadertown.com |
Data is served from the hosted deployment, kept current by a daily server-side sync — you never fetch from Google yourself.
Question → tool
| Question |
Tool |
| What pages performed well? What needs optimizing? |
pages (optional window) — every page with window deltas, plan context, signals, and a verdict + reasons |
| Why is this page flagged? Deep dive |
page (path) — plan, rationale, daily series, top queries, baseline, and logged actions |
| Where are the opportunities? What should we make or improve? |
opportunities (optional kind: striking-distance|ctr|new-demand|cannibalization; optional limit, default 50) — opportunities come strongest-first, and totalSignals says how many matched beyond the limit |
| What is the plan? What was set out, and when? |
registry (targets, intents, phases, publish dates) and log (Actions and Notes) |
| Does the plan aim at searches that exist? |
registry_health — every planned Keyword with a demand verdict. The one report a site with no visibility yet can still act on |
| What else is worth targeting? |
keywords_proposed (free), then keywords_discover to find more (costs money — see below) |
| What queries are we seen for? |
queries (optional page, minImpressions, includeBrand, limit, window) |
| Are our pages indexed? |
registry or pages — each target carries indexed (indexed/not-indexed/unknown) |
| How much traffic over time? |
history (optional limit) — daily true site totals, with visits per day |
| What happened today? |
today — the only report that carries the day in progress, sales included |
| Who is on the site right now? |
live, live_events |
| What did visitors do? What did they buy? |
events, revenue |
| Is the data fresh? |
status |
The Market: check it before you believe a volume
Every keyword number a site reports is measured in one Market — a DataForSEO country and language. A Market is a property of the Site, not of a Keyword row, and it defaults to the United States in English. A site that does not sell into the US in English must say so, or its whole plan is measured against the wrong country and reads as no demand.
registry_health, registry, queries, opportunities and keywords_proposed all name the market their numbers describe. Read it first. A Dutch site reporting United States / en is misconfigured, not undemanded — a real case moved from 10 to 2,920 monthly searches on that one setting.
market.provider says labs or google-ads in advance. Google-Ads countries (49 of them) report no difficulty and no intent at all, so an absent difficulty there is the country, not an error.
- A wrong Market is a Site setting to correct, not a Registry row to patch. Say so and confirm with the user, then re-read
registry_health: the metrics store is keyed by market, so a corrected Market starts with an empty cache and every planned Keyword is re-asked at the vendor.
Two absences mean different things, and neither is a zero: no demand key means nothing was asked (no key, no sync, or a brand/operator query that is never worth paying for); a null searchVolume means DataForSEO was asked and reports the term as too rare, which is not the same as nobody searching it.
Reading the output
verdict and reasons are already judged by the tool's classifier — relay them; recompute nothing.
trueTotals is the real traffic (query-less daily totals). nonBrand/allQueries come from query rows, which Google strips of anonymized long-tail queries, so they undercount volume — use them for keyword progress and query analysis, trueTotals for "how much traffic".
totals.monthlyVolume is the size of the addressable market — every search, not a traffic forecast, and not the share a first-page ranking would win.
difficultyGap is a keyword's difficulty minus the site's Domain Rating. Two vendors' scales, so read it as a rough guide and never as a verdict.
- Never sum word-order variants. DataForSEO reports
traktatie 1 jaar and 1 jaar traktatie at the same volume because they are one clustered demand. Adding them up multiplies one audience. Dedupe to distinct concepts before you total anything.
indexed comes from Google's URL Inspection API, refreshed on each sync (inspectedAt says when). A not-indexed target explains zero visibility before any content diagnosis — check it first when a page shows no-visibility.
- Every response embeds its window bounds; quote dates when reporting numbers.
Finding new keywords (this one costs money)
keywords_discover expands one seed at DataForSEO. It bills about $0.0001 per row returned plus $0.01 per task, so limit is the price of the call — leave it at the default 200 unless a narrower run came back almost empty. It stores nothing.
You are the relevance judge. Every filter the tool applies is numeric or structural (minVolume, maxDifficulty, intents, the brand test, the already-known test), so none of them knows what the site is about. Read every row and keep only what is about this site's subject:
- A word with a second meaning is a word two audiences search, and the biggest numbers are often the worst rows. Check the seed's words for other meanings before you believe a volume.
- Watch for a second audience on the same noun: seeding
knijpfruit (a printable wrapper) returned mostly supermarket shopping demand for the fruit pouch itself — real volume, wrong customer.
- Drop what the site cannot legally or practically sell: licensed characters, physical goods for a printables site, and so on.
source: "related" is the noisiest for exactly the reason it is useful — its answers need not contain the seed.
Then keywords_propose stores the rows you kept as Proposals for a person to review. It is free and asks the vendor nothing, so one run is paid for however many rows you keep. Pass the rows back unchanged from the discover result — the numbers on a Proposal are the vendor's, frozen as they read at the run, which is why a Proposal may disagree with registry_health's current metric. Both are true.
- Plan discovery and proposal as one pass: a Proposal needs the full row, so re-reading a printed summary means paying for the seed twice.
- Read the drop counts before re-running a seed. An empty result with a high
droppedKnown means the seed is exhausted, not that the subject has no demand.
- A Proposal is not a Registry row.
registry_add accepts one; keywords_dismiss sets it aside, and a dismissed keyword stays dismissed so later runs on the same seed stay useful.
Logging work
Every entry in the log is either an Action or a Note. An Action is a concrete change to a page; the tool centres a before/after window on its date, so logging it is what lets a later readout show whether the change moved the numbers. A Note is a free-form observation — not a change — and gets no readout.
Call log_add with { site, path, kind, date?, note? }.
- Kind. Actions:
publish, content-update, title-change, internal-links, consolidation. Observation: note. Reach for note only when nothing on the page changed; otherwise pick the Action kind that matches the change.
- Path, not keyword. The log attaches to a target page by path, and many keyword rows can share one page — so log the page you changed, never a single keyword.
- Date. Defaults to today; pass
date with the day the change actually shipped so the readout's window lines up with it.
- Log an Action on your own initiative right after changing a page's title, content, or internal links — that is the whole reason later readouts can compare before and after.
Writing back
- New keyword mapping (e.g. acting on a
new-demand opportunity or an agreed Proposal): registry_add with { site, target, keyword, cluster, intent, priority, why } (omit keyword for an inventory-only page row).
- Edit existing rows with
registry_set — { site, target, keyword?, patch: { … } }. Patch fields: cluster, intent, priority, publishedAt, baselineDate, status, whyOpportunity, newTargetUrl. Without keyword every row of the target is patched; with it, only that row. newTargetUrl remaps rows to another page (consolidating cannibalized keywords). Fields must not contain commas; the tool validates and refuses duplicates.
- There is no
country on a Registry row. The market a row's numbers describe belongs to the Site — two rows of one site cannot be in different markets. Set the Site's Market instead.
- Confirm with the user before editing the registry — it is the plan of record.
1---2name: rankstas-paradise3description: Query and update the SEO plans, keyword demand, and Search Console results for Sleevy, Missingmounts, Printfeest, and Shadertown via the Ranksta's Paradise MCP. Use when the user asks how a site's pages or keywords are performing, which pages to optimize or create, whether pages are indexed, how much search volume a keyword has, what the SEO plan/registry contains, what was published or changed and when — and after changing a site's title, content, or internal links (log the Action).4---56# Ranksta's Paradise (MCP)78Ranksta's Paradise is the source of truth for the Registry (the SEO plan: keywords mapped to target URLs with intent and rationale), the Search Console outcomes, and the keyword demand behind the plan. Answer SEO questions from its output; never query Google or scrape Search Console yourself.910Access it through its **MCP tools**. Each returns one JSON document.1112Every tool takes a **`site`** argument: a configured site ID, not a URL. There is **no default; always pass `site`.**1314| Site ID | Property |15| --- | --- |16| `sleevy` | `https://sleevy.app` |17| `missingmounts` | `https://www.missingmounts.com` |18| `printfeest` | `https://www.printfeest.nl` |19| `shadertown` | `https://www.shadertown.com` |2021Data is served from the hosted deployment, kept current by a daily server-side sync — you never fetch from Google yourself.2223## Question → tool2425| Question | Tool |26| --- | --- |27| What pages performed well? What needs optimizing? | `pages` (optional `window`) — every page with window deltas, plan context, signals, and a `verdict` + `reasons` |28| Why is this page flagged? Deep dive | `page` (`path`) — plan, rationale, daily series, top queries, baseline, and logged actions |29| Where are the opportunities? What should we make or improve? | `opportunities` (optional `kind`: `striking-distance`\|`ctr`\|`new-demand`\|`cannibalization`; optional `limit`, default 50) — opportunities come strongest-first, and `totalSignals` says how many matched beyond the limit |30| What is the plan? What was set out, and when? | `registry` (targets, intents, phases, publish dates) and `log` (Actions and Notes) |31| Does the plan aim at searches that exist? | `registry_health` — every planned Keyword with a demand `verdict`. The one report a site with no visibility yet can still act on |32| What else is worth targeting? | `keywords_proposed` (free), then `keywords_discover` to find more (**costs money** — see below) |33| What queries are we seen for? | `queries` (optional `page`, `minImpressions`, `includeBrand`, `limit`, `window`) |34| Are our pages indexed? | `registry` or `pages` — each target carries `indexed` (`indexed`/`not-indexed`/`unknown`) |35| How much traffic over time? | `history` (optional `limit`) — daily true site totals, with visits per day |36| What happened today? | `today` — the only report that carries the day in progress, sales included |37| Who is on the site right now? | `live`, `live_events` |38| What did visitors do? What did they buy? | `events`, `revenue` |39| Is the data fresh? | `status` |4041## The Market: check it before you believe a volume4243Every keyword number a site reports is measured in one **Market** — a DataForSEO country and language. A Market is a property of the **Site**, not of a Keyword row, and it **defaults to the United States in English**. A site that does not sell into the US in English must say so, or its whole plan is measured against the wrong country and reads as no demand.4445- `registry_health`, `registry`, `queries`, `opportunities` and `keywords_proposed` all name the `market` their numbers describe. **Read it first.** A Dutch site reporting `United States / en` is misconfigured, not undemanded — a real case moved from 10 to 2,920 monthly searches on that one setting.46- `market.provider` says `labs` or `google-ads` **in advance**. Google-Ads countries (49 of them) report no `difficulty` and no `intent` at all, so an absent difficulty there is the country, not an error.47- A wrong Market is a **Site setting** to correct, not a Registry row to patch. Say so and confirm with the user, then re-read `registry_health`: the metrics store is keyed by market, so a corrected Market starts with an empty cache and every planned Keyword is re-asked at the vendor.4849Two absences mean different things, and neither is a zero: **no `demand` key** means nothing was asked (no key, no sync, or a brand/operator query that is never worth paying for); a **null `searchVolume`** means DataForSEO was asked and reports the term as too rare, which is not the same as nobody searching it.5051## Reading the output5253- `verdict` and `reasons` are already judged by the tool's classifier — relay them; recompute nothing.54- `trueTotals` is the real traffic (query-less daily totals). `nonBrand`/`allQueries` come from query rows, which Google strips of anonymized long-tail queries, so they undercount volume — use them for keyword progress and query analysis, `trueTotals` for "how much traffic".55- `totals.monthlyVolume` is the size of the addressable market — every search, **not** a traffic forecast, and not the share a first-page ranking would win.56- `difficultyGap` is a keyword's difficulty minus the site's Domain Rating. Two vendors' scales, so read it as a rough guide and never as a verdict.57- **Never sum word-order variants.** DataForSEO reports `traktatie 1 jaar` and `1 jaar traktatie` at the same volume because they are one clustered demand. Adding them up multiplies one audience. Dedupe to distinct concepts before you total anything.58- `indexed` comes from Google's URL Inspection API, refreshed on each sync (`inspectedAt` says when). A `not-indexed` target explains zero visibility before any content diagnosis — check it first when a page shows `no-visibility`.59- Every response embeds its window bounds; quote dates when reporting numbers.6061## Finding new keywords (this one costs money)6263`keywords_discover` expands one seed at DataForSEO. It bills about **$0.0001 per row returned plus $0.01 per task**, so `limit` is the price of the call — leave it at the default 200 unless a narrower run came back almost empty. It **stores nothing**.6465**You are the relevance judge.** Every filter the tool applies is numeric or structural (`minVolume`, `maxDifficulty`, `intents`, the brand test, the already-known test), so none of them knows what the site is about. Read every row and keep only what is about this site's subject:6667- A word with a second meaning is a word two audiences search, and the biggest numbers are often the worst rows. Check the seed's words for other meanings before you believe a volume.68- Watch for a **second audience on the same noun**: seeding `knijpfruit` (a printable wrapper) returned mostly supermarket shopping demand for the fruit pouch itself — real volume, wrong customer.69- Drop what the site cannot legally or practically sell: licensed characters, physical goods for a printables site, and so on.70- `source: "related"` is the noisiest for exactly the reason it is useful — its answers need not contain the seed.7172Then `keywords_propose` stores the rows you kept as **Proposals** for a person to review. It is **free** and asks the vendor nothing, so one run is paid for however many rows you keep. Pass the rows back **unchanged** from the discover result — the numbers on a Proposal are the vendor's, frozen as they read at the run, which is why a Proposal may disagree with `registry_health`'s current metric. Both are true.7374- Plan discovery and proposal as **one pass**: a Proposal needs the full row, so re-reading a printed summary means paying for the seed twice.75- Read the drop counts before re-running a seed. An empty result with a high `droppedKnown` means the seed is exhausted, not that the subject has no demand.76- A Proposal is **not** a Registry row. `registry_add` accepts one; `keywords_dismiss` sets it aside, and a dismissed keyword stays dismissed so later runs on the same seed stay useful.7778## Logging work7980Every entry in the log is either an **Action** or a **Note**. An Action is a concrete change to a page; the tool centres a before/after window on its date, so logging it is what lets a later readout show whether the change moved the numbers. A Note is a free-form observation — *not* a change — and gets no readout.8182Call `log_add` with `{ site, path, kind, date?, note? }`.8384- **Kind.** Actions: `publish`, `content-update`, `title-change`, `internal-links`, `consolidation`. Observation: `note`. Reach for `note` only when nothing on the page changed; otherwise pick the Action kind that matches the change.85- **Path, not keyword.** The log attaches to a target page by path, and many keyword rows can share one page — so log the page you changed, never a single keyword.86- **Date.** Defaults to today; pass `date` with the day the change actually shipped so the readout's window lines up with it.87- Log an Action on your own initiative right after changing a page's title, content, or internal links — that is the whole reason later readouts can compare before and after.8889## Writing back9091- New keyword mapping (e.g. acting on a `new-demand` opportunity or an agreed Proposal): `registry_add` with `{ site, target, keyword, cluster, intent, priority, why }` (omit `keyword` for an inventory-only page row).92- Edit existing rows with `registry_set` — `{ site, target, keyword?, patch: { … } }`. Patch fields: `cluster`, `intent`, `priority`, `publishedAt`, `baselineDate`, `status`, `whyOpportunity`, `newTargetUrl`. Without `keyword` every row of the target is patched; with it, only that row. `newTargetUrl` remaps rows to another page (consolidating cannibalized keywords). Fields must not contain commas; the tool validates and refuses duplicates.93- There is **no `country` on a Registry row.** The market a row's numbers describe belongs to the Site — two rows of one site cannot be in different markets. Set the Site's Market instead.94- **Confirm with the user before editing the registry** — it is the plan of record.