← AdCopilot by AtromxCONTENT HISTORY

Update to AdCopilot by Atromx

Snapshot Nov 13, 2026 · 18:11 UTC · version 1.0.2

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save AdCopilot by Atromx and check future changes in Following.

Up to 3 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Answer questions about the customer's organic search presence through Google Search Console — why pages are not indexed or not ranking, what people search to find them, which pages earn clicks, whether a sitemap is being read, and whether a page has been crawled recently. Use when the user asks about their own site's Search Console data, indexing, indexed pages, crawling, sitemaps, rankings, keywords they rank for, organic or SEO traffic, why their site does not show up in Google, or how the searches they pay for compare with what they already rank for.",
  "included_files": [],
  "name": "adcopilot-seo",
  "skill_md_contents": "---\nname: adcopilot-seo\ndescription: Answer questions about the customer's organic search presence through Google Search Console — why pages are not indexed or not ranking, what people search to find them, which pages earn clicks, whether a sitemap is being read, and whether a page has been crawled recently. Use when the user asks about their own site's Search Console data, indexing, indexed pages, crawling, sitemaps, rankings, keywords they rank for, organic or SEO traffic, why their site does not show up in Google, or how the searches they pay for compare with what they already rank for.\n---\n\n# AdCopilot organic review\n\nThe customer wants to know how Google search sees their site. Answer it through\nthe AdCopilot connector at `https://mcp.adcopilot.cloud/mcp`.\n\nCall `get_org_context` first, before any other tool, and take from its answer\nalone which Google products are connected. `next_step` and `playbook` describe\nthe account's situation, not necessarily this request: do this request as\nwritten here, pass on what it says about today's operations, and offer its step\nafterwards unless this request already covered it. If it asks you to offer a\nplan, a purchase, a scheduled task or a routine, or to install something in\nanother app, leave that part out: none of that is part of this skill. If Search\nConsole is not connected, say what connecting it would show and stop; the\nconnect step is the `adcopilot-connect` skill's, and the address to connect it\nis the one the server's answer gives. If the server reports Search Console as\nconnected but needing to be signed in again, it cannot be read yet: say so and\nsend them to re-approve it at the address the server's answer gives. If it\nreports it as connected but out of this connection's reach, the AdCopilot\nconnection in this client has to be removed and added again so that it asks for\nthe missing access; say so in the server's words and read nothing from it until\nthen. Invent nothing about a site you cannot read.\n\n**One thing to get right about `cross_reads`.** It names the reads made OUTSIDE\nGoogle Ads *in service of an ads answer* — on a live account it often says\n\"make no cross-product read\" and names no Search Console read. That is not a\nrefusal of this skill. When the customer's question IS organic search, Search\nConsole is the answer and the reads below are the work.\n`cross_reads.ads_reads_max` is how many Google Ads reads an ads answer starts\nwith, and no cap on the Search Console reads below. Follow `next_step` and\nthe `playbook` as usual, and read `cross_reads` for what it is: guidance for\nthe other direction.\n\n## Six tools, and what they cannot do\n\n`gsc_list_sites`, `gsc_list_sitemaps`, `gsc_search_analytics`,\n`gsc_inspect_url` read. `gsc_submit_sitemap` and `gsc_request_indexing` write —\nneither deletes anything, but both are proposed first (the exact site and the\nexact address) and sent only after the customer says yes in this conversation,\nlike every other write. Submitting a sitemap is the right call when none is\nlisted at all. Resubmitting one is **not** the fix for a URL Google has merely\ndiscovered: it already has the URL.\n\nThat is the whole surface, and the gaps matter more than the tools:\n\n- **There is no SITE-WIDE coverage list — but there is a per-URL verdict.** You\n  cannot ask for every page Google has not indexed, or a count. For any single\n  URL, `gsc_inspect_url` returns exactly why: `coverageState` in Google's own\n  words (\"Submitted and indexed\", \"Discovered - currently not indexed\",\n  \"Crawled - currently not indexed\", \"Excluded by 'noindex' tag\"), plus\n  `robotsTxtState`, `indexingState`, `pageFetchState`, both canonicals and\n  `lastCrawlTime`. Read the whole block, not just the crawl date. For a\n  site-wide count, ask the customer to open Search Console → Indexing → Pages\n  and use **Export**, then read the CSV they send you — and until they do, say\n  you have checked N pages rather than implying you know the site.\n- **There is no manual-actions or security-issues read.** You cannot tell\n  whether a site has a Google penalty or is flagged as hacked. Never say a site\n  has no penalty — say you cannot see penalties and that the customer should\n  look under Security & Manual Actions themselves.\n- **`gsc_request_indexing` almost never does what its name suggests.** It calls\n  Google's Indexing API, which Google documents as crawling only pages carrying\n  JobPosting markup, or BroadcastEvent markup inside a VideoObject. For an\n  ordinary page Google accepts the request and does nothing. It returns a\n  success either way, so do not report it as \"indexing requested\" and do not\n  offer it as the fix for a page that is not indexed. It is the right call only\n  for a page that carries that markup, and then only as a proposal that waits\n  for their yes. The real remedies for an ordinary page are below.\n\n## Five readings that mislead\n\nEach of these is easy to read wrongly. Do not repeat them.\n\n1. **The sitemap's \"indexed\" count is dead.** `gsc_list_sitemaps` returns\n   `\"indexed\": \"0\"` for every site; Google stopped filling that field years\n   ago. It is never evidence of an indexing problem. Only the Pages export, or\n   `gsc_inspect_url`, says whether something is indexed.\n2. **\"Average position\" is not a rank.** It is averaged across every country,\n   device and query where the page appeared at all. A site can show average\n   position 3.6 for its own brand name and appear nowhere in the first thirty\n   results in its own market. When the customer asks \"where do we rank?\", do not\n   read the average out — narrow it: call `gsc_search_analytics` again with\n   `dimensions: [\"query\", \"country\"]` (or `[\"page\", \"country\"]`) and report the\n   row for the market that matters to them. That is still their average position\n   in that country rather than a live rank, so say which it is; a true rank\n   needs a search from that country, which AdCopilot does not do.\n3. **Impressions are not demand.** A page can take half a site's impressions on\n   queries with no measurable search volume, at position 40-90, earning nothing.\n   Before calling any page a performer, look at its clicks and its position, not\n   its impressions.\n4. **One URL inspection is not coverage.** Inspecting a page that happens to be\n   indexed tells you nothing about the rest. Sample across page families — a\n   product page, a blog post, a docs page, a newer page — or say you only\n   checked one.\n5. **The data is two to three days behind.** Search Console has not finished\n   counting the last few days, and the missing days come back as absent rows,\n   not zeros. So a seven-day window is really four or five days of data, and\n   \"clicks fell off a cliff this week\" is usually the lag. Pass dates as\n   YYYY-MM-DD, end the window three days before today, and say which dates you\n   actually read.\n\n## The sequence\n\nWork in this order. When the server refuses a read at the daily limit: say\nwhat ran and what it showed, then the server's own line about the limit, word\nfor word, every time, once however many reads it refused.\n\n1. **Which property.** `gsc_list_sites`, then use the exact `siteUrl` it\n   returns. A domain property and a URL-prefix property are different sites.\n2. **Is the sitemap being read.** `gsc_list_sitemaps`: how many URLs are\n   submitted, when Google last downloaded it, and whether it reports errors.\n   Ignore the indexed column.\n3. **Which pages earn anything.** `gsc_search_analytics` with\n   `dimensions: [\"page\"]` over 28 days, and pass `row_limit` explicitly — the\n   default is 1,000 and the tool cannot paginate, so a bigger site comes back\n   silently cut. If the row count equals the limit you asked for, say the list\n   is truncated and that the ratio is a floor, not the figure. Compare the pages\n   that got a single impression against the number submitted; that ratio is\n   usually the story.\n4. **What people typed.** The same call with `dimensions: [\"query\"]`. Read it\n   for two things: the queries worth winning, and the queries the site is\n   attracting but cannot serve.\n5. **Whether Google has looked recently.** `gsc_inspect_url` on the pages that\n   matter — the home page and two or three pages the business earns from.\n   `lastCrawlTime` is the figure to read out: a page last crawled weeks ago is\n   being served to searchers as it was then, whatever the site says now.\n\n## Reading the coverage export, when they send it\n\nTwo rows decide the diagnosis, and they mean opposite things.\n\n- **\"Discovered – currently not indexed\"** — never fetched. Google's own words:\n  \"The page was found by Google, but not crawled yet. Typically, Google wanted\n  to crawl the URL but this was expected to overload the site; therefore Google\n  rescheduled the crawl.\" So the first cause to consider is the SITE's capacity,\n  not the page's quality — how fast the host answers, and how much Google thinks\n  it can take. Do not tell a customer their content was judged and found\n  wanting; nothing has been read.\n- **\"Crawled – currently not indexed\"** — Google fetched the page and decided\n  against indexing it. That one is about the page.\n\nSo say which it is before proposing anything, and quote Google's wording rather\nthan paraphrasing a cause.\n\nFor *Discovered*, in this order: how quickly the host answers and whether it is\nunder load (Google's own stated reason for rescheduling); then fewer thin URLs\ncompeting for the same crawl, since a site asking Google to fetch hundreds of\nnear-empty pages gets less of what matters fetched; then links to the page from\npages Google already crawls often; then `lastmod` in the sitemap so a changed\npage announces itself. Submitting the sitemap again changes nothing — Google\nalready has the URL, which is what \"discovered\" means. For one page the customer\ncares about, they can also press **Request indexing** in Search Console's URL\nInspection screen themselves; Google limits how many they can send a day.\n\nFor *Crawled*, Google adds \"no need to resubmit this URL for crawling\" — it has\nbeen read and not chosen, so the page itself has to become worth indexing.\n\n## Does the page say what people typed\n\nFor any page ranking far down on a query it should own: **does the page contain\nthe query?** AdCopilot cannot fetch a page. If the page's text is already in this\nconversation — the customer pasted it, or you can already read the page — read\nit; otherwise ask the customer for the title, the main heading and the opening\nsentence. Never describe a page's wording you have not read. Then look for the\nphrase people actually typed. A page can be long, well-built and entirely about\nthe subject while never once writing the sentence the searcher wrote, and\nposition 60-80 is exactly where Google puts a page it finds topically close but\nnot an answer. No amount of linking fixes a phrase the page never says, and it is\nusually a one-line edit.\n\n## The answer\n\nUse the names Google prints on its own screens (Indexing, Pages, Performance),\nnot tool or field names.\n\n**One headline line.** Clicks, impressions and click-through over the period,\nand how many pages earned anything out of how many submitted.\n\n**Then at most three findings, biggest first,** each with its numbers: the page\nor query, the position, the clicks. Say plainly what each means — \"impressions\"\nare how often it appeared, \"position\" is where in the list on average.\n\n**Then one recommendation**, as a proposal they say yes or no to, with what it\ntakes to do and what leaving it risks. Name the page and the change.\n\n**Then what you could not see:** coverage, penalties, security. Ask for the\nPages export if coverage is the question they actually asked.\n\n## When they also run ads\n\nIf Google Ads is connected as well, the comparison worth making is which terms\nthey pay for and already rank for. Three buckets: paying and ranking well, where\nthe paid click may be buying a visit the site already earns without it; paying\nwith no organic presence, where paid is the only route; ranking well without\nbidding, which is often the cheapest visit on the list.\n\nRun it with `paid_vs_organic`. It sets the account's Google Ads search terms\nbeside one Search Console site's queries over the same dates. Pass the account's\n`customer_id` from `get_org_context` (ask which account if several are switched\non and the customer named none), `site_url` as the exact Search Console site\n(if several are switched on and none is named, it asks which — put that question\nto the customer), and `days` (7 to 90; it defaults to 28). It groups the terms\nas: paid and ranked in the top three; paid and ranked lower; no Google Ads search\nterm found for a query the site ranks top three on; the same for a query it ranks\n4 to 20 on, which are the candidates to test an ad; and paid with no Search\nConsole row. Say which bucket each term is in, and name any paid term where the\nsite ranks in the top three. Read its limits out with the answer:\n\n- Only identical wording is matched, so \"shoe\" and \"shoes\" are different terms.\n- \"Paid, no Search Console row\" means no row was found, not that the site has no\n  page for it: Search Console withholds rare queries and lags about three days.\n  If the Search Console reply was cut at the most rows the look-up reads, the\n  tool says so and withholds that count; do not make one up.\n- \"No Google Ads search term found\" means none in the search-term report, which\n  hides low-volume terms and does not show Performance Max terms, so the query\n  may already have an ad.\n- A term containing the site's own name is marked as brand and set aside.\n  Whether to pay for one's own name is a different decision from the rest of the\n  list, and it can be worth paying for.\n- Position is an average, not a rank (reading 2 above).\n\nIf you quote what a term costs, mind the money: the tool's cost figures are\nalready in the account's currency (`get_org_context` says which one), and its\n`cost_micros` fields are millionths of it, so never print a micros number as\nmoney. A raw `search` returns `metrics.cost_micros` the same way: divide by\n1,000,000 once and name the currency. The spend and results of each *keyword*\n(as against each search term) stay a raw `search` read over `keyword_view`,\nbecause no lens returns them. `analyze_search_terms` and `analyze_waste` show\nonly the paid search terms and campaigns that spent with no conversions, which is\nthe \"paying but no result\" bucket.\n\nWhen a `search` on `campaign` or `search_term_view`, or `analyze_waste` or\n`analyze_search_terms`, ends with `related_reads`, run the ones that bear on the\ncomparison, at most three, then answer from all you hold; never repeat a read you\nhold, and offer, do not chase, the `related_reads` those reads bring back. They\nare reads only: a change is still only proposed.\n\n## What breaks\n\nReporting average position as a rank. Turning the rows into a verdict — \"Google\nshows you at the top\", \"your name wins\" — when a row exists only for a search where\nthe site was shown, so the data cannot say where people searched and did not see you.\nCalling a high-impression page a good page.\nTelling a customer their pages are indexed on the strength of one inspection, or\nnot indexed on the strength of the sitemap's dead column. Offering to request\nindexing as though it worked. Promising a site has no penalty when you cannot\nsee penalties. Every one of these reads as a confident answer and sends the\ncustomer the wrong way.\n\n## What is next\n\nOffer, in this order: the one-line page edit you found; the links that would get\nthe uncrawled pages crawled; and the Pages export, so the next review can say\nwhat is actually indexed.\n\nOnce they say the edit is live, invite them to ask again in a few days and\ninspect that page then: `lastCrawlTime` says whether Google has fetched the new\nversion, and the coverage verdict whether it changed anything. That second look\nis how they learn whether the edit worked.\n\nIf Google Ads is connected and this reply has not already compared paid and\norganic, offer it as a question: which of the searches they pay for already\nbring them organic clicks, how many, and what those paid clicks cost — the\ncomparison in \"When they also run ads\". Propose a change from it only where\nthe Ads numbers for those searches show no results, with the money both ways,\npausing rather than removing, and applied only on their yes.\n"
}

SHA-256 of public snapshot: 0aea10b4633470e9b7a882d83cbf82bd08e62c1545f0d243e2c820829c1d2eca