{
  "markdown": "# Cituna — MCP server & Looker Studio connector\n\n[![npm](https://img.shields.io/npm/v/cituna-mcp)](https://www.npmjs.com/package/cituna-mcp)\n[![license](https://img.shields.io/badge/license-MIT-blue)](./LICENSE)\n\n**The AI visibility tool you use from inside the AI.** Every other tool in this\ncategory hands you a dashboard and leaves the thinking to you. Cituna puts the\nmeasurements where you already do the reasoning: ask Claude why ChatGPT never\nmentions you, and it can pull the answer receipts, cross-check them against what\nGoogle already sends you, and queue the page that fixes it, without you opening\na tab.\n\n**Links:** [npm package](https://www.npmjs.com/package/cituna-mcp) ·\n[MCP registry listing](https://registry.modelcontextprotocol.io/v0/servers?search=cituna)\n(`com.cituna/cituna-mcp`) · [docs and pricing](https://cituna.com/mcp)\n\nTwo client integrations for [Cituna](https://cituna.com), which tracks how AI answer\nengines — ChatGPT, Perplexity, Gemini, Claude, Grok and Google AI Overviews — mention\nand cite your brand.\n\nBoth are thin clients over the Cituna REST API. They hold no secrets: you paste a\npersonal API key, and everything else (Google OAuth refresh tokens, the database, the\nscan pipeline) stays server-side.\n\n| | What it is |\n|---|---|\n| **`cituna-mcp`** (this package) | An MCP server, so Claude can query your visibility data, gaps and Search Console directly |\n| **[`looker-connector/`](./looker-connector)** | A Google Apps Script community connector for Looker Studio dashboards |\n\n---\n\n## MCP server\n\n### Install\n\n```bash\nnpx cituna-mcp\n```\n\nOr wire it into Claude Desktop / Claude Code:\n\n```json\n{\n  \"mcpServers\": {\n    \"cituna\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"cituna-mcp\"],\n      \"env\": { \"CITUNA_API_KEY\": \"cituna_sk_...\" }\n    }\n  }\n}\n```\n\nGenerate a key in the app under **Integrations → Claude / MCP access**. It is shown\nonce. The same key works for the Looker connector.\n\n### Configuration\n\n| Variable | Required | Default | Notes |\n|---|---|---|---|\n| `CITUNA_API_KEY` | yes | — | Personal API key, `cituna_sk_…` |\n| `CITUNA_API_URL` | no | `https://cituna.com` | Point at a local backend for development |\n\n### Tools\n\nTwelve read tools work on Starter and above (one exception: `list_keywords`\nreads the keyword dataset that is part of Pro). The four write tools —\n`run_scan`, `set_gap_status`, `queue_article` and `mark_article_published` —\nrequire Pro. The 3-day trial is app-only and has no MCP access.\n\n| Tool | Does |\n|---|---|\n| `whoami` | Confirm the connection, plan and usage meters. Start here. For Search Console state use `gsc_status`. |\n| `list_brands` | Brands/domains tracked in your workspace |\n| `get_visibility` | The daily prompt × engine grid: cited or not, position, per-cell status |\n| `get_engine_answers` | What an engine actually said for a prompt, and who it cited instead |\n| `list_audits` / `get_audit` | Scan history and a single scan's scores |\n| `list_gaps` / `set_gap_status` | The fix queue, and moving items through todo → doing → done |\n| `list_keywords` | Keywords with real demand, each with the stage of the page behind it. Filter `stage: \"none\"` for demand nothing has been written for yet. Needs Pro (the keyword dataset is a Pro feature) |\n| `list_content_queue` | What AutoSEO already has in flight, so you never queue a topic twice |\n| `queue_article` | Queue a keyword so AutoSEO drafts it on the next run |\n| `mark_article_published` | Tell Cituna a page is live, so it stops suggesting the topic and never writes a competing page |\n| `gsc_status` / `gsc_overview` / `gsc_query` | Google Search Console, if connected |\n| `run_scan` | Trigger a fresh scan |\n\n### Connecting Google Search Console\n\nThe `gsc_*` tools need a one-time connect **in the Cituna app** (Integrations →\nConnect Google Search Console, paid plans). Google asks for **read-only**\nSearch Console access; pick the Google account where your domain is a **verified\nproperty**, or every query will come back empty. Verify with `gsc_status`, which\nlists the connected account and its queryable properties. Disconnecting in the\napp revokes this server's access instantly. There is no Google OAuth in this\nserver itself: consent happens in the app and the refresh token stays\nserver-side.\n\n### What it looks like\n\nA real first conversation, once the key is set:\n\n> **You:** We sell scheduling software. Why does ChatGPT never mention us?\n>\n> **Claude:** *(whoami → Pro, 4 of 15 scans used · list_brands → acme.com ·\n> gsc_status → connected)* Running the not-cited diagnosis on acme.com.\n>\n> *(get_visibility)* You are cited in 3 of 18 prompt×engine cells. ChatGPT\n> answers all six of your category prompts and cites you in none of them.\n>\n> *(get_engine_answers on the 3 biggest)* For \"best scheduling software for\n> clinics\" ChatGPT cites Calendly, Acuity and a Capterra roundup. Every citation\n> is a third-party list. Not one is a vendor's own site, including your rivals'.\n>\n> *(gsc_query)* Google already sends you 1,240 impressions for that intent at\n> average position 8.4. So this is not an indexation problem.\n>\n> **The finding:** you are Google-visible and AI-invisible. ChatGPT builds that\n> answer out of roundups you are absent from, so no amount of on-site work moves\n> it. The lever is getting into those lists.\n>\n> *(list_keywords stage:\"none\")* \"scheduling software for clinics\" has demand and\n> no page behind it. Want me to queue it? *(queue_article)*\n\nNothing above spends a scan: it is all reads over data Cituna already collected.\n\n### Built-in prompts\n\nFive reusable analysis workflows, surfaced in Claude's prompt picker via the MCP\nprompts API. You do not have to pick one from the picker: the server tells Claude\nwhich workflow matches which kind of question, so plain English routes itself.\nEach encodes a join between Search Console data and the engines' actual answer\ntext:\n\n- **`why-am-i-not-cited`** — classifies every uncited prompt: invisible everywhere, Google-visible but AI-invisible, or partially cited, with evidence\n- **`gsc-to-ai-gap`** — queries with real Google impressions where AI never cites you\n- **`competitor-teardown`** — who the engines actually cite, diffed against your configured competitor list\n- **`weekly-review`** — wins, regressions, and the week's 3 actions; reads only\n- **`prioritize-fixes`** — re-ranks the fix queue by the impressions each gap touches\n\nNone of them triggers a paid scan on its own.\n\n### Troubleshooting\n\n**\"API key invalid, revoked, or the account no longer has access\"** — regenerate\nunder Integrations → Claude / MCP access (keys never expire on their own; this\nmeans the key was revoked or mistyped, or the account lost access). If the key is\ndefinitely current, check `CITUNA_API_URL` has no trailing path and is not an\norigin that redirects: a cross-origin redirect strips the `Authorization` header,\nwhich surfaces as this exact message.\n\n**Requires Node 18.17+.**\n\n---\n\n## Looker Studio connector\n\nSee [`looker-connector/README.md`](./looker-connector/README.md) for the full setup.\nSummary: deploy `Code.gs` as a Google Apps Script community connector, paste your\n`cituna_sk_…` key on the KEY auth screen, and build dashboards on your visibility\ndata.\n\n---\n\n## About this repository\n\nThis is a **published mirror**, not the working tree. Both integrations are developed\nin Cituna's private monorepo and released here automatically on tag, so the connector's\nengine list stays pinned to what the API actually serves.\n\nPull requests against this repo can't be merged directly — but issues are read and\nacted on, so please do open them.\n\nMIT licensed. Bugs and requests: <https://github.com/cituna/cituna-mcp/issues>\n",
  "bytes": 7681,
  "sha": "e0d3b08351d0bdf62f6e4500f6605d29d06c1313f6dd184bde7434a8fd79882b",
  "repo_slug": "cituna/cituna-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_cituna_cituna_mcp_d127458a/readme"
}