A Search Console MCP server your agent can actually use

QueryInbox serves Google Search Console over MCP at a single URL, so Claude, Cursor, Codex or your own scripts can read your search performance directly. It is read-only, it is hosted, and there is nothing to install.

QueryInbox is free while in public beta, and it asks for read-only Google access only. Sign in with Google to mint a key, or read the full setup guide first.

Read-only, by construction#

A QueryInbox key carries exactly the two Google scopes you granted when you signed in: read-only Search Console and read-only Google Analytics. The key cannot publish, edit or delete anything in your Google account, and the agent never sees your Google password or refresh token. It sees only the key.

The exposed surface is the read API those scopes allow, minus the endpoints that create state. Writes, account configuration and the exports that create a long-running job (audience exports, report tasks) are deliberately absent and the API says so with a specific error rather than failing halfway.

Revoking access#

Keys do not expire on their own. Revoke one in Settings → Agent access and it stops working immediately; the row stays in the list so you can still see what it did. Disconnect Google is the wider switch: it removes the stored Google authorization and every key at once.

Why Search Console needs a server#

Search Console's API is not a set of tidy endpoints. Almost everything you want lives behind one method, searchanalytics.query, whose shape depends on how you group and filter: ask for query and you get queries, ask for page and you get pages, ask for hour and you must also remember to set dataState: "hourly_all" and type: "web" or you get nothing back. An agent that has to reconstruct those rules from memory gets them wrong.

A server in front of it changes the question. Instead of the agent guessing at a request body, it calls a tool with a method name and the fields that method takes, and QueryInbox fills in the rest, including resolving "example.com" to the exact property URL you have access to.

The limits you will meet#

Four of them shape almost every answer the agent gives, and an agent that does not know them will confidently report the wrong thing:

  • Data lags 2–3 days, and the newest day is still filling in ("About Search Console data"). A query for "today" is not an empty result, it is an incomplete one.

  • Performance data goes back 16 months ("Search performance report: dimensions and data groupings"). Anything older is gone from the API, so a year-over-year comparison is the longest one available.

  • Very rare queries are withheld to protect privacy ("A deep dive into Search Console performance data filtering and limits"), so the long tail is shorter than the page-view equivalent. Totals are still correct; individual rows may be missing.

  • URL inspection is capped at 2,000 inspections per day and 600 per minute per property ("URL Inspection API"). It is the one GSC method with a quota tight enough to hit in normal use.

The endpoint#

One URL, one header, and the method name in the body. This request returns clicks and impressions grouped by query:

bash
curl -s https://queryinbox.com/api/agent/gsc \
  -H "Authorization: Bearer $QUERYINBOX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method":"searchanalytics.query","site":"example.com",
       "startDate":"2026-09-01","endDate":"2026-09-28",
       "dimensions":["query"],"rowLimit":20}'

What the agent can ask#

Because the agent reads the same API the Search Console interface reads, the useful questions are the ones you would otherwise click through property by property. With several sites selected in your account, one question can span all of them.

  • "Which queries brought clicks last month, and which are new?" That is searchanalytics.query grouped by query.

  • "Which pages lost the most clicks compared to the previous period?" The same method grouped by page, with two date ranges.

  • "What is ranking between positions 5 and 15?" A dimensionFilterGroups filter on position, which is where most of the recoverable traffic sits.

  • "Is this URL indexed, and why not?" urlInspection.index.inspect returns the coverage state and the canonical Google chose.

  • "Did my sitemap get read, and did it error?" sitemaps.list and sitemaps.get.

Reading Analytics next? The Google Analytics MCP server page covers GA4.

Connect your agent#

Mint a key in Settings → Agent access, then point your client at the hosted server. Claude Code is the shortest path:

bash
claude mcp add --transport http queryinbox https://queryinbox.com/mcp \
  --header "Authorization: Bearer qi_..."

Every other client (Codex, Cursor, opencode, pi, and anything else that accepts a URL and headers) is documented with a copyable command in the setup guide.

When a call fails#

The API answers with a code rather than prose, so an agent can act on it without parsing a sentence.

HTTPCodeWhat it means
401invalid_api_keyThe key is wrong or was revoked. Create a new one in Settings.
409reauth_requiredThe key is fine, but the Google authorization behind it expired. The response carries a reauthUrl; sign in there and the same key keeps working.
429rate_limitedMore than 120 requests in a minute from one key. Back off.
429google_quota_exceededGoogle's own quota rather than QueryInbox's. Back off, honoring retryAfter when the response includes it.
502google_errorGoogle rejected the request or failed. The message says why.

Questions#

What does it cost?

It is free while QueryInbox is in public beta. When the beta ends a paid plan arrives, and beta accounts get a heads-up before anything changes.

Do I need a Google Cloud project or a service account?

No. You sign in to QueryInbox with Google once, and the key you mint carries the same read-only scopes you granted. There is no service account to create, no JSON key file to store, and no client ID to configure.

Can the agent write to Search Console or change my site?

No. The key carries read-only scopes, and the endpoints that create state are excluded from the surface. A write attempt is refused with a specific error code rather than partially applied.

Which Search Console methods are exposed?

The read-only set: sites.list, sites.get, sitemaps.list, sitemaps.get, searchanalytics.query and urlInspection.index.inspect. The setup guide lists them with their parameters, and the API reference returns the same list to the agent on demand.

Does it work with more than one property?

Yes, and that is the point. One key reads every property your Google account can access, so a question like "which of my sites dropped this week" is a single request rather than one per site.

Try it with your own properties

Sign in with Google, pick the sites and properties you want, and mint a key. No card, and nothing is stored beyond your site list.