Cituna MCP Server
OfficialThis server connects an AI agent to your Cituna AI-visibility workspace: it reads daily tracking across six AI engines, audit results, the fix queue, keywords and Google Search Console, and on Pro plans can write (run scans, update gaps, queue articles, mark pages published).
Confirm the connection and plan with
whoami: account, workspace, role, plan, and per-tool usage meters (it does not report Search Console state).See your brand's latest daily AI visibility grid with
get_visibility: per-prompt × per-engine citation status, positions, engine mode, and visibility score.Pull the receipts with
get_engine_answers: the actual answer text each engine gave for one prompt (capped ~4,000 chars), brands cited, and source URLs.Inspect audits with
list_audits(recent scans, scores, open-gap counts,scoring_epoch) andget_audit(full per-engine scores, the query × engine citation matrix, competitors, top gaps, check counts).Work the fix queue with
list_gaps(gapKey, status, impact, effort, concrete fix) and, on Pro,set_gap_statusto move a gap to todo/doing/done.Find content opportunities with
list_keywords(Google position, volume, competition, and whether a page exists) andlist_content_queue(topics and articles in flight).Queue and publish content on Pro:
queue_articleto have AutoSEO draft a keyword, andmark_article_publishedto record a live page so no competing article is suggested.Run a fresh audit with
run_scan(Pro; ~1 minute, consumes one scan from the quota, and may add a new domain as a tracked brand).Join AI data with Google Search Console: check
gsc_statusfor connected accounts/properties, thengsc_overviewfor headline totals, top queries/pages, country/device splits and a daily series, orgsc_queryfor any custom Search Analytics query with dimensions, filters, date ranges and paging.Discover what's available with
list_brands: the brands/domains tracked in your workspace, which feed the audit andgsc_*tools.
Provides read-only access to Google Search Console data, including connected account status, overview metrics, and query-level impressions and positions for verified properties.
Tracks how Perplexity mentions and cites your brand in AI answer engine responses, providing visibility data and citation analysis.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Cituna MCP Servershow the latest visibility for acme.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Cituna MCP: the AI visibility MCP server
Cituna MCP is the official MCP server for Cituna, the AI visibility tool: your AI agent reads how seven AI engines answer, mention and cite your brand every day, next to your Google Search Console data, and acts on it with 31 tools.
The seven engines are ChatGPT, Perplexity, Gemini, Claude, Grok, Google AI Overviews and Google AI Mode, and every tracked prompt is asked on all of them daily. Connect the server to Claude, ChatGPT, Cursor, VS Code or any other MCP client and you can ask which buyer questions you are losing, what each engine actually answered, which pages it read, and what to fix first, then have the agent fix it.
It is hosted, speaks Streamable HTTP, and signs you in with OAuth in your browser. One URL, nothing to install:
https://mcp.cituna.com/mcpRunning it yourself instead, for scripts, CI or a client without OAuth? The same server is on npm. It takes a personal API key and needs Node 20 or later:
npx -y cituna-mcpProduct page and full docs: cituna.com/mcp.
At a glance | |
Hosted URL |
|
Local package |
|
Engines | ChatGPT, Perplexity, Gemini, Claude, Grok, Google AI Overviews and Google AI Mode, checked daily |
Also joins | Google Search Console (read-only), AutoSEO articles, your fix queue |
Tools | 31 in all: 22 read tools and 9 write tools |
Built-in workflows | 5 MCP prompts (diagnosis, AEO gap, competitor teardown, weekly review, fix ranking) |
Plans | Read tools from Starter ($49/mo); write tools and |
Registry name |
|
Works in | claude.ai, Claude Desktop, Claude Code, ChatGPT, Cursor, VS Code, Windsurf, Codex CLI and any MCP client |
License | MIT for this server; Cituna itself is a paid service |
Contents
Quick start: claude.ai, Claude Desktop, Claude Code, ChatGPT, Cursor, VS Code, Windsurf, Codex CLI, Gemini CLI, any other client
Related MCP server: Google Search Console MCP Server
What your agent can do
Most AI visibility tools hand you a dashboard and leave the thinking to you. Cituna puts the measurements where you already reason: ask your agent why an engine never mentions you, and it pulls the answer receipts, checks them against what Google already sends you, and queues the page that fixes it, without you opening a tab.
Read the daily tracking grid. Which of your tracked prompts each engine cited you for today, at what position, and your current visibility score (
get_visibility).Pull the receipts. What an engine actually answered for one prompt, the brands it named and the URLs it cited (
get_engine_answers).Find where the answers come from. The third-party pages the engines cite for your prompts, how often, which rivals each one names, and whether you are on the page, read from the page itself rather than guessed (
list_citation_sources).Spot new rivals. Brands the engines name in answers to your own buyer questions, and vendor names people search before reaching you, that you are not tracking yet (
competitor_discovery).Join AI answers with Google. Search Console totals, any Search Analytics query, and six ready-made analyses: queries just off page one, pages seen and not clicked, demand by intent, pages never shown, your own pages competing, and searches worded like AI prompts (
gsc_*).Work the fix queue. Every gap from your latest audit with its impact, effort and the concrete fix, and its status as you go (
list_gaps,set_gap_status).Plan and ship content. Keywords with real demand and nothing written for them, the AutoSEO queue and every article it wrote, then queue, edit, refresh or skip from the chat (
list_keywords,queue_article,update_article,enrich_article).Change what is measured. Add, disable or rewrite the buyer questions the seven engines are asked every day, with a before-and-after diff (
set_prompts).Run a fresh scan when you have shipped a fix and want to look now (
run_scan).Keep an outreach list. Mark a cited source as planned, pitched, placed or declined, so the list survives between sessions (
set_outreach_status).
Try asking
Once connected, ask in plain English. The server tells your agent which tools and workflow answer which kind of question, so you do not have to name them.
Visibility and receipts
"How is acme.com doing in AI search today? Which prompts and engines cite us?"
"What did Perplexity answer for best CRM for dentists, and who did it cite instead of us?"
"What changed in my AI visibility this week, and which engines dropped us?"
"Why don't AI engines mention us? Use the not-cited diagnosis."
Sources and competitors
"Which sites does each engine read for our prompts that don't mention us yet? Rank them as a pitch list."
"Which of our own pages do the engines already cite?"
"Who comes up instead of us, and which rivals aren't we tracking?"
"Mark the G2 category page as pitched." (Pro)
Search Console, joined up
"Which queries are just off page one, and which page ranks for each?"
"Which pages get impressions and no clicks, and why?"
"Where do Google impressions exist but AI never cites us? That is my AEO target list."
"Do two of our pages compete for the same query?"
"How many of our searches look like AI prompts?"
Fixes and content
"List the open gaps for acme.com, ranked by the Search Console impressions each one touches."
"Which keywords have demand and no page behind them? Queue the top three." (Pro)
"Which AutoSEO articles are due a refresh? Refresh them." (Pro)
"Add the three questions we lost this week to our tracked prompts, and disable the ones nobody searches." (Pro)
"Run a fresh scan for acme.com and summarise the top 3 gaps." (Pro, uses one scan)
Quick start
You need a Cituna account on Starter or a higher plan, with at least one tracked brand. The 3-day free trial is app-only: MCP access starts when your plan does. A brand-new workspace has nothing to read yet, so add your brand in the app first (cituna.com).
There are two ways to connect, and both expose exactly the same tools:
Hosted connector (recommended) | Local npm package | |
Address |
|
|
Transport | Streamable HTTP | stdio |
Sign-in | OAuth in your browser, or an API key header |
|
Needs locally | Nothing | Node 20 or later |
Works in | Every client below, including claude.ai on the web and mobile | Desktop and terminal clients |
claude.ai (web and mobile)
In Claude, open Customize → Connectors, click Add, then Add custom connector.
Name it Cituna and paste the URL:
https://mcp.cituna.com/mcpClaude sends you to Cituna to sign in, then shows a consent screen. Leave Also allow changes ticked to let Claude run scans and work your queue (Pro and Max), or untick it for a read-only connection.
In a chat, turn Cituna on from the + menu and ask your first question.
On Team and Enterprise plans an owner adds the connector once under Organization settings → Connectors, then each member connects it from Customize → Connectors and signs in with their own Cituna account. A connector added on claude.ai is also available in Claude Desktop and the mobile apps signed in to the same account.
Claude Desktop
The connector above is the quickest route: Customize → Connectors → Add → Add custom connector, paste https://mcp.cituna.com/mcp, and approve in the browser.
To run the npm package locally instead, generate an API key (below) and edit claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"cituna": {
"command": "npx",
"args": ["-y", "cituna-mcp"],
"env": {
"CITUNA_API_KEY": "cituna_sk_your_generated_key"
}
}
}
}On Windows, if the server does not start, run npx through cmd: "command": "cmd" and "args": ["/c", "npx", "-y", "cituna-mcp"]. Restart Claude Desktop. The tools appear under the + button in the chat box.
Claude Code
Hosted, with browser sign-in:
claude mcp add --transport http cituna https://mcp.cituna.com/mcpThen run /mcp inside Claude Code, pick cituna and choose Authenticate. To use an API key instead of OAuth:
claude mcp add --transport http cituna https://mcp.cituna.com/mcp \
--header "Authorization: Bearer cituna_sk_your_generated_key"Or run the npm package locally, available in every project:
claude mcp add cituna --scope user \
--env CITUNA_API_KEY=cituna_sk_your_generated_key \
-- npx -y cituna-mcpRun /mcp to confirm it is connected, then ask "what changed in my AI visibility this week?"
ChatGPT
ChatGPT connects to the same hosted URL. Yes, you can ask ChatGPT how ChatGPT cites you.
In ChatGPT on the web, open Settings → Security and login and turn on Developer mode. It comes with Plus, Pro, Business, Enterprise and Edu.
Open Plugins, click +, then Create MCP App.
Name it Cituna, paste
https://mcp.cituna.com/mcp, choose OAuth, and create it.Sign in to Cituna and approve with Also allow changes ticked if you want writes. Then add Cituna to a chat from the + menu.
ChatGPT asks before each change. Reading works on Starter; scans and edits need Pro or Max. Approved ChatGPT connections are listed under Integrations in the Cituna app, where you can disconnect them.
Cursor
Or add it to ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project):
{
"mcpServers": {
"cituna": {
"url": "https://mcp.cituna.com/mcp"
}
}
}Cursor lists the server under its MCP settings with a sign-in button; click it, sign in to Cituna and approve. To skip OAuth, send your API key as a header:
{
"mcpServers": {
"cituna": {
"url": "https://mcp.cituna.com/mcp",
"headers": { "Authorization": "Bearer cituna_sk_your_generated_key" }
}
}
}Or run it locally with "command": "npx", "args": ["-y", "cituna-mcp"] and "env": { "CITUNA_API_KEY": "cituna_sk_..." }. Use the tools from Cursor's agent chat.
VS Code (GitHub Copilot)
Or from the command line:
code --add-mcp '{"name":"cituna","type":"http","url":"https://mcp.cituna.com/mcp"}'Or in .vscode/mcp.json for one workspace (run MCP: Open User Configuration from the Command Palette for all of them):
{
"servers": {
"cituna": {
"type": "http",
"url": "https://mcp.cituna.com/mcp"
}
}
}VS Code opens the Cituna sign-in the first time a tool runs. To use an API key, let VS Code prompt for it once and keep it out of the file:
{
"inputs": [
{ "type": "promptString", "id": "cituna-key", "description": "Cituna API key (cituna_sk_...)", "password": true }
],
"servers": {
"cituna": {
"type": "http",
"url": "https://mcp.cituna.com/mcp",
"headers": { "Authorization": "Bearer ${input:cituna-key}" }
}
}
}Open Copilot Chat in Agent mode and the Cituna tools appear in the tools picker.
Windsurf
In ~/.codeium/windsurf/mcp_config.json (or Windsurf's MCP settings, which open the same file):
{
"mcpServers": {
"cituna": {
"serverUrl": "https://mcp.cituna.com/mcp"
}
}
}If your Windsurf version does not open a browser sign-in, add "headers": { "Authorization": "Bearer cituna_sk_your_generated_key" } next to serverUrl.
Codex CLI
Run the npm package with your API key:
codex mcp add cituna --env CITUNA_API_KEY=cituna_sk_your_generated_key -- npx -y cituna-mcpThat writes the equivalent of this to ~/.codex/config.toml:
[mcp_servers.cituna]
command = "npx"
args = ["-y", "cituna-mcp"]
env = { CITUNA_API_KEY = "cituna_sk_your_generated_key" }Gemini CLI
gemini mcp add --transport http cituna https://mcp.cituna.com/mcpThen run /mcp auth cituna to sign in. Or in ~/.gemini/settings.json, with an API key instead of OAuth:
{
"mcpServers": {
"cituna": {
"httpUrl": "https://mcp.cituna.com/mcp",
"headers": { "Authorization": "Bearer cituna_sk_your_generated_key" }
}
}
}Any other MCP client
Supports remote servers: point it at
https://mcp.cituna.com/mcpover Streamable HTTP. If it supports OAuth it discovers the sign-in on its own from the401challenge; if not, sendAuthorization: Bearer cituna_sk_...(orX-API-Key: cituna_sk_...).Supports stdio only: run
npx -y cituna-mcpwithCITUNA_API_KEYin its environment.
From source, for development:
git clone https://github.com/cituna/cituna-mcp && cd cituna-mcp
npm install && npm run build # then: node dist/index.jsGetting an API key
The hosted connector does not need a key. The npm package and the header options do:
In the Cituna app, open Integrations → Claude / MCP access and click Generate token.
Copy the
cituna_sk_...value. It is shown once.Paste it into your client's config as above.
Keys do not expire on their own, are not your password, and can be revoked in the app at any time. The same key works for the Looker Studio connector and the REST API. Each person should use their own key: a key acts as one workspace, and nothing else.
Tools
31 tools: 22 read tools and 9 write tools. Reads work from Starter with one exception, list_keywords, which reads the keyword dataset that is part of Pro. The nine write tools need Pro or higher, and a connection approved without Also allow changes cannot call them on any plan. Every tool carries MCP annotations (readOnlyHint, destructiveHint, idempotentHint), so a client can auto-approve reads and ask before a write; set_prompts, update_article and enrich_article are marked destructive because they can delete or overwrite.
Start here
Tool | Plan | Inputs | What it does |
| Starter | none | The signed-in account (email, workspace, role), backend URL, plan, and every usage meter: per-tool used and limit, brand and prompt-pool counts. Call it first. Search Console state is |
| Starter | none | The brands and domains your workspace tracks, which are the inputs for every other tool. |
| Starter | none | Whether Google Search Console is connected, the Google accounts connected (a workspace can connect several) and the verified properties each one can read. |
Daily AI visibility tracking
Tool | Plan | Inputs | What it does |
| Starter |
| The latest daily grid for a brand: for every tracked prompt and each of the seven engines, cited or not, position, the engine mode that ran, and the cell status, plus the current visibility score and the UTC day it was measured. An |
| Starter |
| The receipts: the answer text each engine gave for one prompt on the latest day (up to about 4,000 characters, with a |
| Pro, write |
| Edit the buyer questions the seven engines are asked every day, with a before-and-after diff. |
Audits and the fix queue
Tool | Plan | Inputs | What it does |
| Starter |
| Recent audits, newest first: scan id, domain, date, AI-citation score, SEO, GEO and authority scores, open-gap count and |
| Starter |
| One audit in full: overall and per-engine scores, the query by engine citation matrix with every cell |
| Pro, write |
| Run a new audit and return the finished result in about a minute. Uses one scan from the monthly allowance, and a new domain becomes a tracked brand. Reading an existing audit with |
| Starter |
| The fix queue: each gap's |
| Pro, write |
| Move one gap to todo, doing or done. |
Citation sources and competitors
Tool | Plan | Inputs | What it does |
| Starter |
| The third-party pages the engines cite for your prompts, rolled up by host: how often each is cited, the rivals it names, which prompts it answers, and |
| Pro, write |
| Record where outreach to one source host stands: planned, pitched, placed or declined ( |
| Starter |
| Rivals you are not tracking yet: brands the engines named while answering your prompts, and vendor names people searched before reaching you, ranked by evidence. |
Google Search Console
Tool | Plan | Inputs | What it does |
| Starter |
| Clicks, impressions, CTR and average position over the last N days, with top queries and pages, country and device splits, and a daily series. |
| Starter |
| Any Search Analytics query: by query, page, country, device, search appearance or date, with filters, search type and paging. |
| Starter |
| Queries just off page one (positions 11 to 60 by default), ordered by how much a realistic move would unlock, each with the page that ranks. |
| Starter |
| Pages Google shows and nobody clicks, split by cause (branded, snippet, page two or ranking), because each cause needs a different fix. |
| Starter |
| The demand a domain earns, grouped by intent (brand, competitor alternative, persona, commercial, tool, how-to, category), with impressions, clicks and position per group. |
| Starter |
| Sitemap pages Google has never shown anyone, grouped by URL prefix, so a dead section stands out. Fetches the sitemap from the site itself. |
| Starter |
| Queries where two or more of your own pages compete, with each page's position and impressions and the one Google favours. |
| Starter |
| Searches worded like AI prompts (follow-ups, chat replies, instructions, pasted text), as a floor on AI use. Search Console has no AI Overviews or AI Mode filter, so these are not Google's AI numbers. |
Keywords and AutoSEO articles
Tool | Plan | Inputs | What it does |
| Pro, read |
| Every tracked keyword with its Google position, monthly volume, competition and the stage of the page behind it. |
| Starter |
| What AutoSEO has in flight: topics waiting to be written and articles generated or published, with the keyword or prompt behind each, so nothing is queued twice. |
| Starter |
| One row per AutoSEO article, newest first: id, title, live URL, status, keyword, when it was published, last sent to the site, edited and refreshed, its own Search Console numbers, and whether a refresh is due ( |
| Starter |
| One article's stored text (title, meta title and description, dek, sections, FAQs, tags), what the publishing checks flagged, and the last refresh's before and after. |
| Pro, write |
| Queue a keyword so AutoSEO drafts it on the next run. Nothing is queued when the keyword already has a topic or article, the site already has a page for it (the result names that page), or the queue is full; |
| Pro, write |
| Tell Cituna a page for a keyword is live, one you wrote yourself or published from your own CMS. Without it Cituna keeps the keyword as unwritten and offers to write a competing page. |
| Pro, write |
| Overwrite fields of an article's stored text. A page already on the site changes when the article is sent again from the Cituna app. |
| Pro, write |
| Refresh a live article's SEO title, meta description and up to two FAQ answers from its own Search Console queries, on the site it was published to, and return the before and after. Only for an article |
| Pro, write |
| Take up to 50 topics out of the AutoSEO queue so they are never written. Queueing the same text again brings one back. |
Plans and access
The MCP server comes with every paid Cituna plan. There is no separate add-on and no free MCP tier: the 3-day free trial is app-only, and an ended trial with no plan cannot call the server.
Starter ($49/mo) | Pro ($119/mo) | Max ($399/mo) | |
MCP access | Read only | Read and write | Read and write |
Read tools (22) | 21: every read except | All 22 | All 22 |
Write tools (9) | None (do it in the app) | All 9 | All 9 |
MCP calls a month | 5,000 | 10,000 | 30,000 |
Prompts checked daily on all seven engines | 10 | 30 | 90 |
Brands tracked | 1 | 3 | 10 |
Re-scans a month ( | 10, run in the app | 15 | 20 |
How the gates behave:
A write tool on Starter returns a plan message naming Pro, and changes nothing. On Starter you still run scans and work the queue in the app, just not from the agent.
Writes need the scope as well as the plan. If you untick Also allow changes on the consent screen, the connection is read-only even on Pro or Max. To add writes later, disconnect it under Integrations and connect again with the box ticked.
The monthly MCP-call allowance counts every call. A used-up allowance comes back as a plan-limit message (HTTP 402); upgrade or wait for the period to reset. HTTP 429 is a separate burst limit: wait the seconds it names and retry.
run_scanspends a scan from the monthly allowance, and scanning a domain you do not track adds it as a brand against your plan's brand cap. Everything else reads data Cituna already collected.enrich_articleuses one generation from the monthly allowance and changes a live page on your site.
A custom Enterprise plan lifts the limits further, with invoiced billing. Full limits per plan: cituna.com/pricing.
Built-in workflows
The server ships five analysis workflows through the MCP prompts API. In Claude they show up in the prompt picker; in any client, the server's instructions tell the agent which workflow answers which question, so plain English routes itself. Each one joins Search Console data with the engines' actual answer text, which a generic SEO tool cannot do.
Prompt | Arguments | What it does |
|
| Sorts every uncited prompt into invisible everywhere, Google-visible but AI-invisible, or partly cited, with evidence from the engine answers and Search Console. |
|
| Queries with real Google impressions where AI never cites you: the ranked AEO target list. |
|
| Tallies who the engines actually cite from the answer text, and compares it with your configured competitor list. |
|
| Wins, regressions and this week's 3 actions from audits, Search Console and the gap queue. Reads only. |
|
| Re-ranks the fix queue by the Search Console impressions and uncited prompts each gap touches. |
None of them starts a paid scan on its own.
What a session looks like
An example first conversation, once the server is connected (acme.com stands in for your brand):
You: We sell scheduling software. Why does ChatGPT never mention us?
Claude: (whoami → Pro, 4 of 15 scans used · list_brands → acme.com · gsc_status → connected) Running the not-cited diagnosis on acme.com.
(get_visibility) You are cited in 3 of 18 prompt×engine cells. ChatGPT answers all six of your category prompts and cites you in none of them.
(get_engine_answers on the 3 biggest) For "best scheduling software for clinics" ChatGPT cites Calendly, Acuity and a Capterra roundup. Every citation is a third-party list. Not one is a vendor's own site, including your rivals'.
(gsc_query) Google already sends you 1,240 impressions for that intent at average position 8.4. So this is not an indexation problem.
The finding: you are Google-visible and AI-invisible. ChatGPT builds that answer out of roundups you are absent from, so no amount of on-site work moves it. The lever is getting into those lists.
(list_keywords stage:"none") "scheduling software for clinics" has demand and no page behind it. Want me to queue it? (queue_article)
Nothing above spends a scan: it is all reads over data Cituna already collected.
Connecting Google Search Console
The gsc_* tools need a one-time connect in the Cituna app, not in your MCP client. There is no Google OAuth in this server, by design: the browser consent happens in the app, and the refresh token is stored server-side only.
In the app, open Integrations and click Connect Google Search Console (paid plans).
Google asks to grant Cituna read-only Search Console access (
webmasters.readonly). Cituna never gets write access to anything at Google.Pick the Google account where your domain is a verified Search Console property. This is the step people miss: if that account has never verified the domain, everything connects and every query still comes back empty, because Google has nothing to show it.
Back in your agent, run
gsc_status. It lists each connected account and every property it can query. If your domain is not there, verify the property in Search Console, not in Cituna.
A workspace can connect several Google accounts, and a domain is readable when any of them holds a property for it. Disconnecting in the app (Integrations, Disconnect) cuts off this server at once.
Authentication and security
The server is a thin client over the Cituna API. It holds no Google credentials and no database: it sends your Cituna credential to the backend, which looks up your workspace's stored Search Console refresh token, mints a short-lived Google access token, and queries Google for you.
OAuth (the hosted connector). The server is an OAuth 2.1 protected resource and the Cituna API is the authorization server. A client walks the chain itself:
POST /mcp (no credential)
→ 401 + WWW-Authenticate: Bearer resource_metadata="…"
→ GET https://mcp.cituna.com/.well-known/oauth-protected-resource
→ names https://api.cituna.com as the authorization server
→ GET /.well-known/oauth-authorization-server
→ POST /oauth/register (dynamic client registration, RFC 7591)
→ GET /oauth/authorize (browser: sign in, then consent)
→ POST /oauth/token (PKCE S256 required)Clients can also sign in with a published client identity (client ID metadata documents), which is how Claude and ChatGPT connect. Access tokens last 24 hours. Refresh tokens rotate on every use, and a rotated-out refresh token presented again ends the whole connection, so a stolen copy cannot quietly outlive the real client. There are two scopes, cituna:read and cituna:write, and a write tool needs the scope and the plan.
API keys. A cituna_sk_... key goes in CITUNA_API_KEY for the npm package, or in an Authorization: Bearer (or X-API-Key) header for the hosted URL. A key authenticates as one workspace only, and the hosted server is stateless per request, so keys never mix. Do not wire a gateway to send one shared key for all of its users: every one of them would act as that single workspace.
What a connection cannot do. It can call the MCP tools and nothing else. It cannot create API keys, change your password, reach billing, invite teammates, or approve another app; those need you signed in to the app. Tokens are only issued for Cituna's own MCP server (RFC 8707 resource), so another server that names Cituna as its authorization server cannot collect one.
Third-party content. Answer text, cited titles, URLs and Search Console queries are quoted from AI engines, the pages they read and the people who search. The server tells your agent to treat them as data and never to follow instructions found in them, or call a write tool because tool output asked it to.
Approved apps are listed under Integrations in the app, each marked read-only or able to make changes, and can be disconnected there.
Self-hosting the remote server
The hosted URL is the same code as this repository. Both transports are built from one tool layer (src/tools.ts), so the tool list, descriptions and schemas are literally the same objects, and npm run test:transports fails the build if they ever diverge.
stdio ( | remote ( | |
Runs | on your machine, launched by the client | as a service, reached by URL |
Needs | Node 20+ locally | nothing local |
Credential |
|
|
Ships as | the | a container ( |
The stdio server reads CITUNA_API_URL (backend base URL, default https://cituna.com) plus one credential, checked in this order: CITUNA_API_KEY (recommended), CITUNA_TOKEN (a session token from the app, which expires after about 30 days), or CITUNA_EMAIL with CITUNA_PASSWORD (the server logs in and refreshes on expiry).
Run the remote server:
npm run build && npm run start:http # or: npm run dev:httpEnv | Default | Purpose |
|
| Listen port. |
|
| Backend base URL. |
| (unset) | Comma-separated |
There is no CITUNA_API_KEY here, deliberately: the remote server holds no credential of its own. Every request carries its own, a fresh client and MCP server are built for it, and both are torn down when the response ends, so one user's key can never be captured into another user's session. A request with no credential gets 401 and cannot even list the tools. Deploy with the included Dockerfile (multi-stage; the runtime image carries one production dependency). If you self-host on a domain outside cituna.com, add its origin to OAUTH_ALLOWED_RESOURCES on the API so it can be issued tokens (loopback addresses are always allowed).
Endpoints on the remote server:
Path | What it is |
| The MCP endpoint (Streamable HTTP). |
| Liveness and the version it runs. |
| A short description of the service. |
| The OAuth metadata clients discover from the |
| The API-key path, so a config-aware client (for example Smithery) can show a "paste your key" form instead of the OAuth button. |
Directories and gateways. The official MCP Registry entry (server.json, com.cituna/cituna-mcp) carries a remotes entry that tells registry-driven clients, and directories that mirror the registry such as PulseMCP and Glama, to connect directly to https://mcp.cituna.com/mcp and prompt for a personal API key. Nothing is routed through the directory.
Versions. The hosted URL always runs the newest release, and npx -y cituna-mcp fetches the newest one from npm. Pin a version with npx -y cituna-mcp@<version>; the npm badge above shows the current one, and GET /healthz reports what the hosted server runs.
Troubleshooting
Symptom | Fix |
The first call returns 401 | That is the OAuth handshake: your client should open a browser to sign in. If it does not, the client lacks remote OAuth support. Send an API key header, or run |
| The request reached |
404 with "The MCP endpoint is /mcp" | The URL is missing the path. Use |
| The token or key no longer works. A client that supports OAuth refreshes or reopens the sign-in on its own; otherwise reconnect, or create a new key. |
| Only |
| No credential set. Generate a key (Integrations → Claude / MCP access) and set |
| Keys never expire on their own: the key was revoked or mistyped, or the account lost access. Mint a new key. If the key is current, check |
A write tool says it needs Pro | You are on Starter, where the MCP is read-only. Do it in the app, or upgrade at cituna.com/pricing. |
Write tools refused on Pro or Max | The connection was approved without Also allow changes. Disconnect it under Integrations and connect again with the box ticked. |
| The trial and ended plans have no MCP access. Pick a plan at cituna.com/pricing. |
| Search Console is not connected, or no connected account holds a property for that domain. Follow the message, then check |
| The burst ceiling, not your monthly allowance. Wait the seconds it names and retry. A used-up monthly allowance is a plan-limit message (HTTP 402). |
| The client asked for a token for a server that is not Cituna's. Self-hosting on your own domain: add its origin to |
| Keys, password, billing and team changes need you signed in to the app in your browser. |
Tools do not appear (npm package) | Check Node is 20 or later, and on Windows run |
An engine shows | That engine gave no answer on that run. It is not a miss, it is not counted against you, and it is checked again automatically. |
FAQ
What is the Cituna MCP server? A Model Context Protocol server that connects your Cituna workspace to an AI agent. It reads your daily AI visibility tracking, the engine answers behind it, the pages engines cite, your audits, fix queue, keywords, AutoSEO articles and live Search Console data, and on Pro it can act: run a scan, change the prompts you track, move a fix along, queue, edit or refresh an article, and log outreach.
Which AI engines does it cover? Seven, all checked daily: ChatGPT, Perplexity, Gemini, Claude, Grok, Google AI Overviews and Google AI Mode. Google AI Overviews and Google AI Mode are tracked separately because they give different answers to the same query. Microsoft Copilot is not tracked.
Does it work with ChatGPT? Yes. Turn on Developer mode, create an MCP app with the hosted URL and choose OAuth (steps above). Developer mode comes with ChatGPT Plus, Pro, Business, Enterprise and Edu, on the web.
Do I need to install anything? No. The hosted connector is a URL and a browser sign-in. Node 20 or later is only needed for the optional npm package.
Is there a free plan? No free MCP. The server comes with every paid plan from Starter ($49/mo), read-only there; write tools come with Pro. The 3-day free trial is app-only.
Can the agent change my data? Only on Pro or Max, only if you ticked Also allow changes when you approved it, and only through the nine write tools listed above. Clients that respect MCP annotations ask before each write, and ChatGPT always does.
Is my Google data safe? The server never sees your Google credentials. Cituna holds a read-only Search Console grant server-side and queries Google for you; disconnecting in the app cuts off the MCP at once.
Is Cituna the only AI visibility tool with an MCP server? No. Several AI visibility tools ship one, with different tools, plans and read or write access. Cituna's pairs daily tracking on seven engines with your Search Console data and AutoSEO writes, from $49. See the dated comparison at cituna.com/learn/ai-visibility-tools-with-mcp-server.
Is there a REST API too? Yes. The same data is available over HTTPS with a bearer token for your own dashboards, agents and CI. See cituna.com/developers.
Links
Product page and docs: cituna.com/mcp
Pricing and plan limits: cituna.com/pricing
Connect, keys and approved apps (in the app): cituna.com/integrations
REST API: cituna.com/developers
AI visibility tools with an MCP server, compared: cituna.com/learn/ai-visibility-tools-with-mcp-server
AEO and AI visibility tools compared, by buyer question: github.com/Cituna/best-ai-visibility-tools
npm package: cituna-mcp
Official MCP Registry:
com.cituna/cituna-mcpSource mirror: github.com/cituna/cituna-mcp
Bugs and requests: GitHub issues
Looker Studio connector
This repository also carries looker-connector/, a Google Apps Script community connector for Looker Studio dashboards on your Cituna visibility data. Deploy Code.gs as a community connector, paste your cituna_sk_... key on the KEY auth screen, and build dashboards. Full setup: looker-connector/README.md.
About this repository
This is a published mirror, not the working tree. Both integrations are developed in Cituna's private monorepo and released here automatically on tag, so the tool surface and the connector's engine list stay pinned to what the API actually serves.
Pull requests against this repo cannot be merged directly, but issues are read and acted on, so please do open them.
License
MIT licensed. Bugs and requests: https://github.com/cituna/cituna-mcp/issues
Available Tools
16 toolsget_auditAInspect
Get one AI-visibility audit in detail by scanId (from list_audits): overall AI-citation score + SEO/GEO/authority scores, per-engine citation summary (ChatGPT/Perplexity/Gemini/Claude/Grok/Google AI Overviews), the query×engine citation matrix, competitors cited, the top prioritised gaps (title, category, impact, effort), and pass/warn/fail audit check counts. In the citation matrix every engine appears explicitly per query with one of three states: "cited" (the engine's answer cited the brand), "not_cited" (the engine answered but did not cite the brand), or "not_run" (the engine produced no measured answer for that query — it sat the query out or errored; NOT a miss). Bulky raw fields (page HTML, full engine answers) are omitted. Requires a signed-in account.
| Name | Required | Description | Default |
|---|---|---|---|
| scanId | Yes | The audit/scan id from list_audits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the full burden. It does disclose meaningful behavior: bulky raw fields are omitted, and it clarifies the three-state semantics of the citation matrix ('not_run' does not mean a miss). It also states the signed-in requirement. Lacks disclosure about pagination, performance, or what happens with invalid/expired scanIds.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and well-organized, front-loading the purpose. However, it is somewhat long and lists many field categories in one long sentence, which slightly reduces scannability. Still efficient overall with no wasted filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description thoroughly enumerates the return contents (scores, per-engine summary, matrix, competitors, gaps, check counts) making return expectations clear. It compensates for missing schema by detailing the citation matrix states. Could add pagination or error behavior, but the core information is well covered for a single-item detailed fetch tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (scanId), and schema coverage is 100% with a clear description. The description reinforces the source of the id (from list_audits) in the prose, adding workflow value beyond the schema. With a single well-documented param, the baseline 3 applies; description adds provenance clarity, supporting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Get one audit in detail by scanId'). Clearly distinguishes from sibling list_audits by stating it retrieves a single detailed audit. Rich detail on what is included (scores, citation summary per engine, matrix, competitors, gaps, check counts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly ties usage to scanId from list_audits, establishing a clear workflow context. It states the audit is for AI-visibility and notes the requirement of a signed-in account. However, it doesn't explicitly contrast with siblings like get_visibility or get_engine_answers regarding when to choose one over another, though the distinct purpose is strongly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_engine_answersAInspect
The RECEIPTS behind the tracking grid. For a brand (id or domain) and one tracked prompt — optionally a single engine — returns the actual stored answer text each engine gave on the most recent day, the brands it cited, the source URLs, and whether your brand was cited and at what position. Answer text is capped (~4000 chars per engine) with a truncated flag. Copy the exact prompt text from get_visibility's prompts[].prompt; a prompt that isn't found returns availablePrompts to pick from. Requires a signed-in account; works on Starter and up (the free trial has no MCP access).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | The brand — a brand id (from list_brands) OR its bare domain, e.g. 'acme.com'. | |
| engine | No | Optional — limit to a single engine. One of: ChatGPT, Perplexity, Gemini, Claude, Grok, or Google AI Overviews (pass the key `aioverviews` for that last one; the others are their lowercase name, e.g. `chatgpt`). | |
| prompt | Yes | The exact tracked prompt text to pull answers for — copy it from get_visibility (prompts[].prompt). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides several useful behavioral details: answer text is capped at ~4000 chars per engine with a truncated flag, a not-found prompt returns availablePrompts, and there's an account/auth requirement (works on Starter and up, free trial has no MCP access). With no annotations provided, the description carries the full transparency burden and does disclose observable behaviors well. However, it doesn't describe the return structure or cite-position format beyond what's stated, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the core purpose ('THE RECEIPTS behind the tracking grid') and packs in engine-scoping, output contents, truncation, prompt-sourcing, and access constraints. It's information-dense but coherent; every sentence earns its place. A lighter structural breakdown would improve readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param tool with 100% schema coverage and no output schema, the description is thorough: it explains what's returned (answer text, brands cited, source URLs, citation position), the truncation cap, the prompt-matching fallback, and access-tier requirements. It maps cleanly onto siblings (get_visibility) and the input schema. The main gap is the absence of a sample output shape, which the description compensates for reasonably.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% — brand, engine, and prompt each have descriptive help text in the schema, including engine key aliases and the prompt-sourcing hint. The description adds context by naming get_visibility's prompts[].prompt as the copy source and explaining the availablePrompts fallback. Both layers reinforce rather than repeat, keeping this dimension at baseline-plus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Purpose is stated with a specific verb and resource: it returns the stored answers/evidence ('REceipts') for a brand and one tracked prompt on the most recent day, including citation position. It clearly differentiates from get_visibility (tracking grid) by positioning itself as the underlying receipts/evidence layer. The scope (per prompt, optional per engine, most recent day) is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells you when to use it (to get receipts behind the tracking grid, pulling actual answer text per engine) and how to prepare input (copy exact prompt text from get_visibility's prompts[].prompt). It also names the sibling tool the data comes from and clarifies access constraints (Starter+ required, free trial excluded). While it doesn't explicitly enumerate when NOT to use it, the alternative source (get_visibility) is referenced and the use-case context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_visibilityAInspect
Your brand's LATEST DAILY TRACKING GRID — the core Cituna deliverable. For a brand (a brand id from list_brands, OR its bare domain), returns the most recent day's per-prompt × per-engine grid: for every tracked prompt and each of the six engines (ChatGPT/Perplexity/Gemini/Claude/Grok/Google AI Overviews) whether your brand was cited, its position when cited, the engine mode that ran (live/value/lite/off), plus per-cell status (cited / answered / empty / error / notrun). Also the brand's current visibility score, its label, and the UTC day it was measured. Compact JSON, designed to be read directly. Use get_engine_answers to see what an engine actually said for a prompt. Requires a signed-in account; works on Starter and up (the free trial has no MCP access).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | The brand to report on — a brand id (from list_brands) OR its bare domain, e.g. 'acme.com'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses auth requirements, plan restrictions, and the fact that it returns only the most recent day (not a history). It also states the output format (compact JSON) and that it's designed to be read directly. For a read tool with no annotations, this is solid coverage, though it doesn't detail all response fields exhaustively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the highest-value identifier ('LATEST DAILY TRACKING GRID'). Densely informative throughout — each sentence adds value covering engines, per-cell status, visibility score, target audience, plan constraints. Slightly long but every segment earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only reporting tool with a single documented parameter and no output schema, the description provides comprehensive coverage: input format, engines tracked, per-cell semantics, companion tool, auth/plan requirements. Could add pagination or date-range behavior, but for a single-brand daily snapshot it's largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description reiterates the 'brand id OR bare domain' format with an example ('acme.com'), which matches the schema description. The description adds the context that the brand id comes from list_brands, slightly enriching beyond schema. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly describes the specific verb+resource: returns a daily per-prompt × per-engine tracking grid for a brand. Explicitly distinguishes from siblings by naming get_engine_answers as the tool for viewing what engines actually said. Strong differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States it requires a signed-in account and works on Starter and up, with the free trial having no MCP access — useful constraints. Explains when it applies (latest daily grid) and directs users to get_engine_answers for engine-level detail. Lacks explicit 'when not to use' phrasing but provides clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_overviewAInspect
Live Google Search Console SUMMARY for a domain over the last N days: headline totals (clicks, impressions, CTR, average position) plus top queries, top pages, country and device splits, and a day-by-day time series. Windows are UTC and end ~2 days ago (GSC reporting lag). Best default for 'how is my search traffic doing?'. Requires a paid plan (Starter+). Returns {configured:false, message} if GSC isn't connected or no property matches the domain.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing window in days (1–90). Default 28. Data lags ~2–3 days, so the window ends ~2 days ago. | |
| domain | Yes | Bare domain to report on, e.g. 'example.com' (no scheme/path). Must match a connected GSC property. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently discloses key behaviors: Live summary semantics, UTC windows ending ~2 days ago due to reporting lag, the paid plan requirement (Starter+), and the {configured:false, message} fallback when GSC isn't connected. No annotations exist, so the description carries the full burden and does so well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and bundles headline totals, splits, and time series. The two-sentence functional part is tight and dense with no waste. The trailing condition about the fallback response adds genuine value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite a rich multi-part output (headline totals, top queries, top pages, country/device splits, day-by-day series) and no output schema, the description enumerates each return component explicitly. It also covers parameter semantics (window ending ~2 days ago) and failure modes, making it materially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters already have descriptions. The description adds marginal extra context (the ~2-day lag aligns with the schema's 'ends ~2 days ago' note) but doesn't add new meaning beyond what the input schema documents. Baseline 3 is appropriate given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('SUMMARY for a domain over the last N days') and enumerates the exact data returned (headline totals, top queries, pages, country/device splits, time series). It also delivers a clear 'Best default for...' positioning statement, distinguishing it from siblings like gsc_query and gsc_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when to use it ('Best default for how is my search traffic doing?') and implicitly contrasts with more granular siblings (gsc_query, gsc_status). It also states the paid-plan prerequisite and the failure condition, giving clear usage context. It doesn't explicitly name alternative tools but the 'Best default' framing plus sibling presence provides guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_queryAInspect
Run an arbitrary Google Search Console Search Analytics query — the raw, flexible tool. Choose any dimensions (query, page, country, device, searchAppearance, date), an explicit date range OR a trailing days window, a row limit, and optional filters. Use dimensions:['date'] for day-by-day trends; ['country'] or ['device'] for splits; add filters to focus on a specific query or page. Windows are UTC and end ~2 days ago (GSC lag). Returns rows with keys[] plus clicks/impressions/ctr/position. Default rowLimit 100 — page with startRow when capped. Requires a paid plan (Starter+).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing window in days (1–480) when startDate/endDate are omitted. Default 28. Window ends ~2 days ago (GSC lag). | |
| type | No | Search type. Default 'web'. | |
| domain | No | Bare domain, e.g. 'example.com'. Resolved to a connected GSC property. Provide this OR siteUrl. | |
| endDate | No | YYYY-MM-DD. Overrides `days`. Must be paired with startDate. | |
| filters | No | Optional filters, combined with AND. Each: {dimension, operator, expression}. e.g. {dimension:'query', operator:'contains', expression:'pricing'} or {dimension:'country', operator:'equals', expression:'usa'} (3-letter ISO) or {dimension:'device', operator:'equals', expression:'MOBILE'}. | |
| siteUrl | No | Exact GSC property instead of a domain, e.g. 'sc-domain:example.com' or 'https://example.com/'. Optional. | |
| rowLimit | No | Max rows to return (1–25000). Default 100. | |
| startRow | No | Zero-based offset for pagination. Default 0. | |
| dataState | No | 'final' (default, stable) or 'all' (includes the freshest partial data for the last ~2 days). | |
| startDate | No | YYYY-MM-DD. Overrides `days`. Must be paired with endDate. | |
| dimensions | No | Dimensions to group by. Default ['query']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full transparency burden. It discloses the GSC 2-day data lag explicitly, explains the UTC window behavior, notes the paid-plan requirement, mentions output shape (rows with keys[] plus clicks/impressions/ctr/position), and states pagination behavior when capped. The only gap is lack of detail on what happens with oversized result sets beyond startRow pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Comprehensive but compact — three sentences packed with high-value information (dimension list, use cases, lag disclosure, pagination, plan requirement, return shape). Every sentence earns its place, nothing redundant with the schema. Front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, highly flexible tool with no annotations and no output schema, the description is remarkably complete. It covers the key decision (dimension selection for different analytical goals), the datetime handling (days vs date range, UTC, lag), filtering patterns, pagination, access requirements, and return format. This addresses essentially every practical question an agent would face in selecting and invoking this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all 11 parameters are described in the schema itself, giving a baseline of 3. The description adds value above that: it explains the mutual exclusivity/priority between days window vs explicit date range, gives a concrete filter example pattern, and demonstrates dimension combinations. It doesn't fully document the interplay between type/enum values and dimensions, but builds meaningfully on the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it runs arbitrary GSC Search Analytics queries with specific verb+resource ('raw, flexible tool'). It names all six dimensions, explicitly enumerates use cases (['date'] for trends, ['country']/['device'] for splits, filters for focusing), and distinguishes itself as the raw flexible option versus sibling gsc_overview which is more curated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance with concrete dimension recipes (day-by-day trends, splits, query/page focus) and operational details: trailing window ends ~2 days ago due to GSC lag, default rowLimit 100 with pagination note, paid plan requirement (Starter+). Though it doesn't name alternative tools explicitly, it positions itself as the flexible counterpart to overview tools, giving clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gsc_statusAInspect
The authoritative Google Search Console connection check for this workspace: whether GSC OAuth is configured server-side, whether THIS workspace has connected (connected), the connected Google account email, and the list of verified GSC properties (site URLs / sc-domain: properties) available to query. whoami does not report GSC state — this tool is the truthful signal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does well by disclosing that this is a read-only status/connection check, explicitly stating what it reports (OAuth config, connected flag, email, verified properties), and reassuring the agent it is the 'truthful signal' vs whoami. It does not mention error behavior, auth failures, or rate limits, but for a status-query tool these are less critical. It frames itself as authoritative without overstating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured paragraph, front-loaded with the core purpose and then enumerating the specific data returned. The final sentence about whoami is valuable differentiation. It's slightly longer than strictly necessary and the last sentence could arguably be folded into the sibling-differentiation, but every clause adds operational value — no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description is thorough: it enumerates exactly what fields the agent can expect (connected flag, email, verified property list). It could be improved by noting the possible absence of values (e.g., what happens when not connected — does `connected` default to false or is the field omitted?), but given the tool's simplicity and the lack of output schema, this is a solidly complete description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are 0 parameters and schema description coverage is 100%, so per the rubric the baseline is 4 and no parameter documentation is needed. The description compensates naturally by explaining what the tool RETURNS rather than its inputs. Nothing is missing regarding parameter semantics since there are no parameters to describe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is very specific: it names the verb (GSC connection check), the resource (Google Search Console for this workspace), and precisely enumerates what it returns (OAuth config state, `connected` flag, account email, verified properties list). It explicitly distinguishes from the sibling `whoami` tool by stating 'whoami does not report GSC state — this tool is the truthful signal.' This is excellent sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates when to use it (to check GSC connection state for the workspace) and explicitly contrasts with `whoami`, telling the agent that whoami is NOT the right tool for GSC status. It doesn't name a specific alternative tool to use instead for verifying GSC properties, but the exclusion of whoami plus the contextual framing (`authoritative`, `truthful signal`) provides strong usage guidance. Could add more explicit when/why vs. `gsc_overview` and `gsc_query`, which are related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_auditsAInspect
List recent AI-visibility audits (scans) for your workspace, newest first: scanId, domain, date, AI-citation score, on-page SEO / GEO / authority scores, open-gap count, and each audit's scoring_epoch (the score-formula version that produced it). Only compare scores between audits with the SAME scoring_epoch — across epochs the scores are re-based, so compare citation counts instead. Pass a scanId to get_audit for the full breakdown. Requires a signed-in account.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Optional client-side filter — only return audits for this bare domain, e.g. 'acme.com'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers: ordering (newest first), exact returned fields (scanId, domain, date, scores, open-gap count), a crucial caveat about scoring_epoch score comparability, and an auth requirement (signed-in account). This is more than most tool descriptions provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, zero fluff. The first sentence front-loads the action and output fields; the second delivers the critical epoch caveat; the third ties to get_audit and auth. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description lists the return fields and the critical epoch warning. It also covers auth and points to get_audit for detail. For a simple one-parameter list tool, nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of the single parameter (domain) with a clear description. The tool description adds no additional meaning about the domain filter, so it doesn't exceed the baseline. It does mention workspace scope, but that's not parameter-specific.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List recent AI-visibility audits (scans) for your workspace, newest first'—a specific action and resource. It distinguishes from sibling get_audit by noting 'Pass a scanId to get_audit for the full breakdown,' making the list-vs-detail boundary explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells users when to use get_audit instead ('Pass a scanId to get_audit for the full breakdown') and warns about comparing scores across epochs. It doesn't explicitly exclude other siblings like run_scan or list_gaps, but the context makes the tool's role clear. Lacks an explicit 'use this when...' statement but the guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_brandsAInspect
List the brands/domains tracked in this Cituna workspace. Handy for discovering which domains you can pass to the audit and gsc_* tools.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but this is a simple, non-destructive list operation with zero parameters. The description clearly frames it as a discovery/list operation without side effects. It doesn't describe output format or pagination, but with no params and no annotations, the behavioral surface is minimal and adequately communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both earning their place. The first states the purpose; the second explains downstream utility. Zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, side-effect-free listing tool, the description is complete. It states what's listed (brands/domains), the scope (workspace), and downstream consumption. No output schema means some ambiguity about return format, but the simple nature of the tool makes this acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters exist, so the schema imposes no burden. The baseline for 0-param tools is 4. The description adds context about the return value (brands/domains usable by other tools), which is more than sufficient for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'List the brands/domains tracked in this Cituna workspace.' Distinguishes from siblings by specifying it lists brands/domains, which none of the sibling names (list_gaps, list_keywords, list_content_queue) claim to do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'Handy for discovering which domains you can pass to the audit and gsc_* tools.' This gives actionable guidance on how the returned data is consumed downstream, effectively explaining when to reach for this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_content_queueAInspect
The AutoSEO content pipeline for a domain: topics waiting to be written, and the articles already generated or published, with the keyword or prompt that produced each one. Use it to see what is in flight before queueing more. Free, reads stored data. Requires a signed-in account.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Bare domain, e.g. 'acme.com'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose that the operation is free and 'reads stored data,' implying non-mutating behavior. It also states 'Requires a signed-in account,' which is a real authentication requirement. However, it doesn't describe return format, ordering, pagination, or what happens with an empty queue. Decent but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and front-loads the core purpose (what the pipeline shows) before giving usage guidance. No wasted words. It earns a 4 rather than 5 because it interleaves multiple concerns (what it lists, when to use, auth) into a somewhat dense first sentence rather than cleanly separating them, though nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a single-parameter read tool with a complete schema and no output schema, so the bar is moderate. The description covers purpose, scope, usage context, and auth. Missing: what return values look like (since there's no output schema, the description could reasonably mention the shape of returned data) and behavior with an empty pipeline. Adequate but could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single domain parameter already described as 'Bare domain, e.g. acme.com.' The description reinforces it's domain-scoped ('for a domain') but doesn't add meaning beyond the schema. Baseline 3 is appropriate since the schema fully documents the parameter. The description adds no format or edge-case detail beyond the schema's example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: lists the AutoSEO content pipeline for a domain, showing topics waiting to be written and articles already generated/published with their source keyword/prompt. This is a specific verb (list) + resource (content queue/pipeline) + scope (per domain). It distinguishes from siblings like list_gaps and list_keywords by describing the pipeline state rather than gaps or keywords.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use it to see what is in flight before queueing more,' which provides clear when-to-use guidance. It also gives an implicit when-not-to-use by contrasting with queueing actions (queue_article sibling). The phrase 'before queueing more' sets up a clear workflow sequence that an agent can follow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gapsAInspect
The fix/action queue for a domain: each AI-visibility gap with its stable gapKey, current status (todo / doing / done), title, category, impact, effort, and the concrete fix. Pass a scanId (exact audit) OR a domain (uses that domain's newest audit). Use set_gap_status to update a gap. Requires a signed-in account.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Bare domain, e.g. 'acme.com' — uses its most recent audit. Optional if `scanId` is given. | |
| scanId | No | Audit id (from list_audits) to read gaps from. Optional if `domain` is given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose the auth requirement (signed-in account) and explains the resolution semantics for domain vs scanId. However, it doesn't describe the return format (no output schema exists), pagination, or ordering of gaps, which would strengthen transparency for the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences and delivers substantial information in a compact form. It front-loads the core purpose before moving to usage details. Slightly dense but no wasted words; could arguably be considered concise for the amount of behavioral information conveyed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema and both parameters fully documented, the description does a good job: it specifies required auth, both invocation modes, and hints at the sibling tool for mutation. The main gap is not describing what the response looks like given there's no output schema, though the enumerated fields in the first sentence partially compensate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters at 100% (domain and scanId both get descriptions), so the baseline is 3. The description adds value by clarifying the disjunction ('pass a scanId OR a domain'), the fallback behavior (domain uses its newest audit), and the source of scanId (from list_audits). This meaningfully supplements the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: lists the fix/action queue for a domain, enumerating exactly what fields each gap contains (gapKey, status, title, category, impact, effort, concrete fix). It's specific about verb+resource, and it distinguishes itself from siblings like set_gap_status (which updates) and list_audits (which returns audits).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the two invocation modes (scanId OR domain) and how each resolves, tells the reader to use set_gap_status for updates (naming an alternative), and requires a signed-in account. This is strong when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_keywordsAInspect
The keyword board for a domain: every tracked keyword with its Google position (or 'not ranking'), monthly search volume, competition, the verdict on what to do about it, and — the part that makes this actionable — whether an article for it is already queued, drafted or published. This is the join you want before writing anything: it tells you which keywords still have no page behind them. Free, reads stored data, spends no quota. Requires a signed-in account.
| Name | Required | Description | Default |
|---|---|---|---|
| stage | No | Optional filter on content state. 'none' is the useful one: keywords with nothing written for them yet. | |
| domain | Yes | Bare domain, e.g. 'acme.com'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly discloses it's free, reads stored data, spends no quota, and requires a signed-in account. This is thorough behavioral disclosure for a read-only tool, though it doesn't specify response format or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat wordy — the parenthetical 'the part that makes this actionable' and 'or not ranking' add color but could be trimmed. However, it's front-loaded with the purpose and the actionable guidance is woven efficiently into one paragraph. Mostly tight with minor verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with good schema coverage and no output schema, the description is quite complete. It lists all the fields returned, explains the join value, and covers auth requirements and cost. Slightly more detail on what happens with no results or edge cases would push it to 5, but this is strong.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are documented. The description adds value by explaining the 'stage' filter semantics ('none' is 'the useful one: keywords with nothing written for them yet') and gives a concrete domain example ('acme.com'), going beyond what the schema prose provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: it returns the keyword board for a domain with Google position, search volume, competition, verdict, and content state. It explicitly differentiates from siblings by framing this as 'the join you want before writing anything.' Strong verb+resource specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use it ('before writing anything' to see which keywords still have no page behind them). It also names related concepts and distinguishes by noting it's 'free, reads stored data, spends no quota,' which implicitly sets expectations vs scan tools like run_scan or gsc_query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_article_publishedAInspect
Tell Cituna a page for this keyword is LIVE on the site — one you wrote yourself, published from your own CMS, or produced by driving this MCP. Cituna then stops suggesting the topic, shows the keyword as published on the Keywords board, and stops offering to write a competing page for it. Use it right after you publish; pass the keyword exactly as list_keywords shows it and the page's full https URL. WRITE ACTION — requires a Pro plan or higher.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Full https URL of the published page. | |
| title | No | Optional page title. Defaults to the keyword. | |
| domain | Yes | Bare domain the page belongs to, e.g. 'acme.com'. | |
| keyword | Yes | The keyword this page targets, as listed by list_keywords. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly discloses this is a WRITE ACTION, requires a Pro plan or higher, and describes the side effects (stops suggestions, marks published, prevents competing pages). This gives strong behavioral context beyond mere 'marks published', including persistence of state changes and side effects on content generation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact, front-loaded block that begins with the core purpose. It's fairly dense and information-packed; could arguably be tightened, but each sentence contributes meaning (purpose, side effects, timing, action-type flag, plan requirement). Reasonably sized for a mutating tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers the key operational details: when to call, what values to pass, exactness requirement, side effects, and access-level requirement. Slightly under-specified on what the tool returns or how to confirm success, but complete enough for reliable invocation in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with 4 params, so baseline is 3. The description adds value beyond schema by emphasizing keyword must match exactly what list_keywords shows, and URL must be full https. It also clarifies the 'title' default behavior implicitly through the schema description. The key constraint about keyword-exactness is added in prose, elevating it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the verb+resource: telling Cituna a page for a keyword is LIVE. It thoroughly explains the specific functional purpose (stop suggesting the topic, show as published on Keywords board, stop offering competing pages). Distinguishes well from siblings, which are read/query tools like list_keywords and gsc_overview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use ('right after you publish') and provides concrete invocation guidance (pass keyword exactly as list_keywords shows it, full https URL). Explicitly names list_keywords as source for the keyword value. Lacks an explicit when-NOT-to-use statement, but the clear trigger context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queue_articleAInspect
Queue an article for a keyword so AutoSEO drafts it on the next run. Pass the keyword exactly as it appears in list_keywords, plus its numbers when you have them (they are kept as provenance and used to prioritise the queue). Queueing a keyword that already has a topic or article returns a duplicate notice rather than a second copy. WRITE ACTION — requires a Pro plan or higher; on Starter/trial the MCP is read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Bare domain the keyword belongs to, e.g. 'acme.com'. | |
| volume | No | Optional monthly search volume, for queue priority. | |
| keyword | Yes | The keyword to write about, exactly as listed by list_keywords. | |
| position | No | Optional current Google position, if the site ranks at all. | |
| competition | No | Optional competition, 0-1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly flags 'WRITE ACTION' and the plan-tier requirement, which is critical for an agent to know before invoking. It also discloses the duplicate-notice return behavior. It doesn't describe side effects on existing queue entries or confirm what a successful call returns, but the disclosed mutation nature and plan gating are strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose/effect, input format, duplicate behavior, and access restriction. Slightly dense but front-loaded with the core action first. No fluff or repeated schema content, though the paragraph is a bit long without breaks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 5 params, is a mutating write action with no output schema, and zero annotations. The description covers the write nature, plan gating, duplicate handling, input formatting, and a cross-reference to list_keywords. The main gap is not describing what a successful response looks like, but given no output schema exists, the description compensates reasonably well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema: it explains that keyword must match list_keywords exactly, that numbers serve dual roles (provenance and prioritisation), and that volume/position/competition are optional priority signals. This elevates the score above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Queue' and resource 'an article for a keyword', and explains the downstream effect (AutoSEO drafts it on the next run). It distinguishes itself from siblings by being the only queue-writing tool, and even references list_keywords for correct keyword entry. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs how to format input ('Pass the keyword exactly as it appears in list_keywords'), explains when to include extra numbers ('when you have them... to prioritise the queue'), and describes the duplicate-notice behavior when a topic/article already exists. It also states planning restrictions (Pro+ vs Starter/trial read-only). This is comprehensive guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_scanAInspect
Run an AI-visibility audit for a website and return the completed result (scores, citation matrix, competitors, top gaps). A fresh scan takes about a minute and CONSUMES ONE SCAN from your monthly quota. Two honest caveats: (1) for a domain the workspace does not already track (and with no competitors passed), the backend may answer from a recent shared measurement up to 7 days old — that replay consumes no quota and adds NO entry to list_audits; (2) a successful scan of a new domain also adds it as a tracked brand, which counts against the plan's brand cap. Optionally pass competitors to steer the comparison (this forces a fresh run). Prefer list_audits/get_audit to read an existing audit for free; use run_scan only when fresh data is needed. WRITE ACTION — requires a Pro plan or higher; on Starter/trial the MCP is read-only (run scans in the app instead).
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Site to scan — bare domain 'acme.com' or full URL 'https://acme.com'. | |
| competitors | No | Optional competitor domains to compare against (up to 8). Steers the comparison instead of relying only on auto-detection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full disclosure burden. It explicitly discloses that it's a WRITE ACTION, consumes one scan from quota, adds tracked brands to brand cap, may replay a shared measurement, and adds no entry to list_audits in the replay case. This is exemplary transparency for a resource-consuming mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and informative, front-loaded with purpose then caveats then alternatives then plan requirements. Every sentence carries distinct information with no filler. Slightly longer than strictly necessary but every clause earns its place given the multiple behavioral caveats needing disclosure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write action with no output schema and no annotations, the description covers purpose, quota/brand implications, replay behavior, when-not-to-use, plan tier requirements, and param-level nuance. Despite no output schema, the description mentions the returned result shape (scores, citation matrix, competitors, top gaps), making this highly complete for the complexity involved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both url and competitors have adequate schema docs. The description adds moderate value beyond schema: it clarifies url accepts bare domain or full URL, states competitors count limit (up to 8), and notes that passing competitors forces a fresh run. This exceeds baseline 3 slightly but the schema already handles param details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb+resource (Run an AI-visibility audit) and specifies the output (scores, citation matrix, competitors, top gaps). It distinguishes this from sibling tools by naming get_audit/list_audits as read alternatives for existing audits, situating run_scan as the fresh-data option.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance on when to use vs alternatives: 'Prefer list_audits/get_audit to read an existing audit for free; use run_scan only when fresh data is needed.' Also explains caveats (7-day replay for untracked domains, brand-cap impact) and plan-tier requirements (Pro or higher, read-only on Starter/trial) that tell the agent when this tool is not usable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_gap_statusAInspect
Update one gap's status in the action queue (todo / doing / done). Use the gapKey and domain from list_gaps. e.g. mark the schema gap for acme.com done. WRITE ACTION — requires a Pro plan or higher; on Starter/trial the MCP is read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Bare domain the gap belongs to, e.g. 'acme.com'. | |
| gapKey | Yes | The stable gapKey from list_gaps. | |
| status | Yes | New status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it does a good job flagging that this is a WRITE ACTION requiring a Pro plan. However, it doesn't disclose what happens on failure, whether changes are reversible, or what the response looks like on success. It hints at WRITE ACTION but provides no evidence destination or side-effect details beyond the status change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Each sentence earns its place: the first establishes purpose and parameter provenance with an example, the second delivers the critical plan-level constraint. Danger cue 'WRITE ACTION' is front-loaded for safety.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param, all-required, enum-driven tool with no output schema and no nested objects, the description covers purpose, parameter sourcing, an example, and the plan prerequisite. The only minor gap is lack of success/error response semantics, but given the tool's simplicity and the 100% schema coverage, the description is appropriately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds complementary value rather than redundancy. It ties gapKey and domain to list_gaps as their provenance source ('Use the gapKey and domain from list_gaps'), giving the agent concrete operational knowledge about where to obtain these values — this exceeds what the schema alone provides. The description does not restate the enum values or definitions already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource pair ('Update one gap's status in the action queue') with explicit enumerable status values (todo / doing / done). It clearly distinguishes from siblings like list_gaps (read) and queue_article (different resource), and names the working context (action queue for gaps).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the source of required parameters ('Use the gapKey and domain from list_gaps') and provides a concrete example ('e.g. mark the schema gap for acme.com done'). It also names a prerequisite — the Pro plan requirement — and explicitly excludes Starter/trial use, which clearly directs when this tool should NOT be invoked.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiAInspect
Return the authenticated Cituna account (email, workspaceId, role), the backend URL, your plan (Starter/Pro/Max), and — when available — the full usage meters: per-tool used/limit (scans, MCP calls, GSC reads, …) plus brand and prompt-pool counts. Use this first to confirm the connection works. Does NOT report Search Console state — call gsc_status for that. Fails with an actionable message if the API key is missing, invalid, or revoked.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does well: it describes the data returned (account, backend URL, plan, usage meters), discloses a limitation ('when available' for usage meters), notes failure behavior ('Fails with an actionable message if the API key is missing, invalid, or revoked'), and clarifies what it does NOT report. The only minor gap is not describing the exact error/response format, but the disclosure is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the most important facts (identity, URL, plan, usage). It covers substantial ground in three sentences with zero fluff. Minor deduction because it packs many data points into one long first sentence, making it slightly dense rather than optimally scannable, though still efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description is complete: it specifies exactly what data is returned, when to use it, what it does NOT cover (Search Console, with pointer to gsc_status), and failure behavior. There is no under-specification given the tool's simplicity. The description fully addresses its purpose with no gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and schema coverage is 100% (empty object schema). Per the rubric, 0 params earns a baseline of 4. The description appropriately focuses on what the tool returns rather than parameters, which is correct for a no-parameter auth/connection check tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns authenticated account identity (email, workspaceId, role), backend URL, plan, and usage meters, with a specific verb ('Return'). It distinguishes itself from siblings by explicitly noting it does NOT report Search Console state and directing users to gsc_status for that, providing clear sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this first to confirm the connection works', giving a clear when-to-use instruction. It also explicitly excludes a use case ('Does NOT report Search Console state — call gsc_status for that'), naming the alternative tool. This is explicit guidance with a named alternative, meeting the top tier.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
16 tool updates
v1.0.1- First observed
get_audit - First observed
get_engine_answers - First observed
get_visibility - First observed
gsc_overview - First observed
gsc_query - First observed
gsc_status - First observed
list_audits - First observed
list_brands - First observed
list_content_queue - First observed
list_gaps - First observed
list_keywords - First observed
mark_article_published - First observed
queue_article - First observed
run_scan - First observed
set_gap_status - First observed
whoami
TDQS
Scored across 16 tools
Each tool targets a distinct resource/action, and the closest pairs are cleanly separated by collection-vs-detail or summary-vs-raw distinctions. Descriptions make selection unambiguous.
Most tools follow verb_noun (get_*, list_*, queue_article, run_scan), but gsc_* tools drop the verb prefix and whoami is an outlier. The prefixes still group related tools clearly, so the pattern is readable and predictable.
16 tools is slightly above the typical well-scoped range, but the count matches the server's broad multi-area purpose: audits, visibility tracking, GSC, content queue, and account. No tools feel redundant.
Core workflows are covered: audits can be listed, read, and run; gaps can be listed and updated; keywords can be viewed and queued; articles can be marked published; and GSC data is available at both overview and raw levels. Minor gaps exist, such as brand editing or prompt management, but agents can complete primary tasks without dead ends.
Maintenance
Related MCP Connectors
Google Search Console, Bing, GA4 and SEO reports for Claude, ChatGPT and any MCP client
SEO research, Search Console, GA4 and PPC tools for Claude and ChatGPT.
Live Google Ads, GA4, Search Console, Meta Ads and GBP data in Claude, ChatGPT and any MCP client
Read-only Google Ads, GA4 and Search Console data for Claude, with no Google Cloud setup.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceConnects Google Search Console with Claude AI to analyze SEO data through natural language, enabling search analytics reporting, URL inspection, indexing status checks, sitemap management, and data visualization for SEO professionals.MIT
- AlicenseAqualityAmaintenanceLets you ask Claude questions about your Google Search Console data and get real analysis, not raw API rows. Provides 20 tools for analysis, indexing, and safety.292,350 npm175Apache 2.0

OQVA Marketing MCPofficial
AlicenseAqualityCmaintenanceConnect Claude to your marketing data from Google and Meta, enabling read and write operations on Search Console, Analytics, Tag Manager, Business Profile, and Meta platforms.351Apache 2.0- AlicenseAqualityBmaintenanceEnables Claude and other MCP clients to read Google Search Console and Bing Webmaster Tools data, analyze query/page performance, compare periods, inspect indexing and canonical status, and retrieve sitemap and keyword statistics.2359 npmMIT