> ## Documentation Index
> Fetch the complete documentation index at: https://docs.promptingcompany.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Which Query bank keywords should I work on next?

> Ask your agent which searches AI engines run for your prompts, which to write for next, and whether the pages you targeted are working.

Ask your agent this, with `<product-name>` replaced by your product's name:

```text theme={null}
Which of my Query bank keywords should I work on next for <product-name>?
```

The agent reads your Query bank, which holds the searches Gemini, Claude, and ChatGPT run while answering your prompts, grouped into keywords. It tells you which keywords to work on and how the pages you already targeted are doing. These tools only read. They never change your Query bank.

## Before you ask

* Connect the server and sign in. See [Connect the MCP server](https://docs.promptingcompany.com/mcp/connect.md).
* If you belong to more than one organization, put your organization slug in the same message. See [Find your organization slug](https://docs.promptingcompany.com/mcp/connect.md#find-your-organization-slug).
* Use the product name as it appears in TPC.
* Your product needs a Query bank. If the keyword list comes back empty, TPC has not prepared one for your product yet.
* To follow results, mark keywords as targeted on the **Query bank** page in TPC first. See [Find the searches behind your prompts](https://docs.promptingcompany.com/guides/quickstart-guide.md#step-2-find-the-searches-behind-your-prompts).
* Name a date range if you want one, as a start and end date, no more than 180 days back and not in the future. Without one, the agent uses the default range, which starts at the keyword's own target date for one keyword, or at the earliest target date for results.

## What the agent does

The agent chooses its own calls. A typical run follows these steps.

**1. Find the product**

`list_organizations` finds your organization slug if you did not give it. `list_products` returns the product's slug and ID.

**2. List the keywords**

`list_query_bank_keywords` returns your keywords, the ones that cover the most prompts first. Each row has the keyword's ID and label, how many prompts and searches it covers, and its target, which is the page you are writing for it and since when, or `null` when you have not targeted it. The result also lists the domains checked for indexing, taken from the latest full Google check that checked at least one search, and totals.

**3. Look at one keyword**

`get_query_bank_keyword` takes a keyword ID from the list. Its date range defaults to the keyword's own target date through today, at most 180 days back. It returns the keyword's prompts, its target, its rank history, and a recommendation. The rank history is grouped by engine (Google, then Bing, then Brave), newest first within each engine, up to 20 checks per engine. For a targeted keyword it also returns `pageStatus`, which says how the target page is doing with search engines and AI engines, and `searchPerformance`, which says how Google showed the target page, from Search Console. `pageStatus` is `null` when the keyword is not targeted, and `searchPerformance` is left out.

**4. Check whether targeting paid off**

`get_query_bank_results` compares share of voice before and after targeting, for targeted prompts against other prompts. Targeted prompts are those with at least two Gemini searches in one targeted keyword. Other prompts have at least one Gemini search and none of them belong to a targeted keyword. Every remaining prompt is in neither group, such as one with a targeted search but fewer than two in each targeted keyword, or one with no Gemini searches. The comparison period is the date range, by default from the earliest target date (at most 180 days back) to today, against an equally long period just before it. It also lists each targeted keyword with its page status and Google rank before and now. The result is `{ comparison }`, and `comparison` is `null` when no keyword is targeted yet, or when a custom range ends before the first target date.

> [!TIP]
>
> Rankings and share of voice usually take a few weeks to move after a page goes live. Ask the agent to judge targeting over weeks, not days.

## Recommendations

When a keyword has a recommendation, it has one of three kinds.

| Kind | What it means |
| - | - |
| `improve` | Improve the named page rather than writing another. Its `source` says where the page came from: `target` is your targeted page, `ranking` is a page of yours that already ranks in a Google check, and `search_console` is a page of yours that Google showed for the keyword's searches in the 28 days to `page.windowEnd` (a `YYYY-MM-DD` date a few days before today, because Search Console data lags), with `page.impressions` the number of times and `page.rank` `null`. It needs a connected Search Console property, and is only used when the keyword has no target and none of your pages ranks. |
| `covered` | TPC already published pages for these prompts. Improve one and merge the rest into it. |
| `write` | Nothing covers this keyword yet. Write a new page. |

## Page statuses

A targeted keyword's page has one of these statuses.

| Status | What it means |
| - | - |
| `no_page` | You targeted the keyword but have not added a page address yet. |
| `not_checked` | No check has run yet, or no engine could confirm the page (see `indexInconclusive` below). |
| `not_indexed` | Search engines cannot find the page yet. Fix that before you write more. This is only given when a page lookup confirmed it. |
| `indexed` | Search engines have the page. Write for these searches and link to the page from your own site. |
| `ranking` | The page ranks. Keep improving it. |
| `cited` | An AI engine cited or read the page in the date range when answering one of the keyword's prompts. Claude, Sonar, and Perplexity only read pages, while other engines cite them. |

## Reading the numbers

* For each engine on a keyword's page status, `indexed` is `true`, `false`, or `null`. `indexInconclusive` is `true` when the lookup ran but couldn't confirm: it returned a full page of results, or the engine reported more results than it returned, and none was this exact page, because other pages under the same address can fill it. Then `indexed` is `null`, and the engine counts as unchecked, so it never makes the page `not_indexed`. `indexed` of `null` with `indexInconclusive` of `false` means there is no lookup result yet, or the engine has no page lookup (`indexSupported` is `false`).
* `indexSource` says where an engine's `indexed` came from: `search_console` when Google's URL Inspection in your connected Search Console property answered, `search` when a search for the page answered, or `null` when it hasn't been checked. When Search Console can't answer for a page, the check falls back to a search. For Google, `indexReason` is Google's reason when Search Console says the page is not indexed, and `null` otherwise. `lastCrawledAt` is when Google last crawled the page, and `googleCanonical` is the address Google treats as the main version of the page, given only when it differs from the target page. Both are `null` unless Search Console answered. Brave gives `search` once checked; Bing has no page lookup, so its `indexSource` is always `null`.
* `searchConsole` on a keyword's page status is `connected`, `needs_reconnect`, or `not_connected` for the target page's domain, with the connected `property`. With `needs_reconnect`, Google checks use a search until you reconnect Search Console in TPC. It is `not_connected` when the keyword has no page.
* `searchPerformance` is how Google showed the target page over the date range, read from Search Console. Its `state` is one of the following.

  * `ok` has `impressions`, `clicks`, `position` (the average position, weighted by impressions), and `searches`, the page's top 10 searches by impressions. Each search has `keywordSearch` set to `true` when it is one of this keyword's searches, and `keywordSearchCount` is how many of this keyword's searches showed the page. `searches` is empty when Google doesn't list the searches that only a few people made, even though `impressions` is above 0.
  * `no_impressions` means the domain is connected but Google showed the page no times in the range.
  * `not_connected` means the page's domain is not connected to Search Console.
  * `needs_reconnect` means you must reconnect Search Console in TPC.
  * `no_target_page` means the keyword has no page address.
  * `error` means the Search Console lookup failed. It does not fail the rest of the keyword.

  `asOf` is the latest day Search Console has data for. It usually runs 2 to 3 days behind today, so the last days of the range can be missing.
* `citedAvailable` is `false` when citations couldn't be loaded or the lookup hit its row cap. A keyword whose status isn't `cited` may then still be cited, and the counts in `cited` may be too low.
* Share of voice values are fractions, so `0.12` means 12%. Before and after run from 0 to 1. A change is the value after minus the value before. It runs from -1 to 1 and is negative when that group's share of voice fell. The difference between targeted and other prompts is the targeted change minus the other change. It runs from -2 to 2 and is negative when targeted prompts' share of voice moved less than other prompts', even if both rose.
* In a keyword's rank before and now, `null` means no Google check covered the keyword by then, or the check that did has no search results for the keyword's searches. A rank of `null` inside a check means it was checked and none of your pages is in the top 10. A rank is the best position of any of your pages for the keyword's searches, not only the target page.

## What you get back

* The keywords the agent suggests working on, with the recommendation behind each
* For each targeted keyword, the page status and Google rank before and now
* Share of voice for targeted prompts compared with your other prompts

To get the same data in a terminal, see the [`tpc query-bank` command](https://docs.promptingcompany.com/cli/commands/query-bank).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.