Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "get_editorial_velocity"
⟨343 unchanged words⟩ and `ci95` is not an upper bound). Editorial subdomains (newsroom, blog, news and the like, 3 at most, linked from the home page or answering at newsroom. or blog.) are read too and counted in `total` (`scope.hosts` lists the hosts read, the main host first): `publications.byHost` splits the articles counted by host, main host included, and `publications.mainHostOnly` gives `total`, `perMonth`, `perWeek`, `ci95` and `monthly` without the subdomains (null when no subdomain has a counted article). In `publications.bySection`, the sections of a subdomain are prefixed by its host (`newsroom.example.com/press-releases`). A subdomain that blocked the reading is named in `scope.hostsFailed`: its articles could not be looked for, so a `total` of 0 is then not a proven zero. `updates` counts the articles updated more than one ⟨140 unchanged words⟩
Changed the definition of "get_editorial_velocity" and "get_guides"
⟨277 unchanged words⟩ publication, or dates changed in bulk). `method.discovery` says what the news pages linked from the home page and the RSS or Atom feeds added to the sitemap; its `articlesCounted` is the part of `total` that comes from addresses absent from the sitemap. When `method.discovery.truncated` is true, the discovery stopped before the end and `total` is a minimum (a 0 is then not a proven zero, and `ci95` is not an upper bound). `updates` counts the articles updated more than one ⟨140 unchanged words⟩
⟨54 unchanged words⟩ interpreted as regex syntax, and an invalidregex returnsexpression
Changed the definition of "create_editorial_velocity" and "get_editorial_velocity"
⟨53 unchanged words⟩ Works with any CMS. **What is counted.** Onlypagesarticles,typeddatedasby the publication date the site itself shows, read in this order: structured data (JSON-LD `datePublished`), meta tags, an `itemprop` attribute, a labelled date in the visible text such as "Published on" or "Publié le", the first line of a press release ("City, March 12, 2026"), then the first `<time>` element ("Updated on" is never a publication date). A page is an article when it is typed as one (JSON-LD Article, BlogPosting, NewsArticle andsimilar types, or an`article:published_time` meta tag),
Changed the definition of "create_editorial_velocity" and "get_editorial_velocity"
⟨197 unchanged words⟩ in the window is read. Above it, pages are sampled section by section (`method.strata` sections, arandomsectionsamplebeing the first path segment): a few pages of1500each section are read first, a section whose pages show no publication date isreadleft out and listed in `method.undatedSections`,countsand the rest of the 1500 pages is shared among the dated sections. Counts are
Added "create_editorial_velocity_comparison" and "get_editorial_velocity_comparison" (35 tools before, 37 now)
create_editorial_velocity_comparison — Compare the editorial velocity of competitors, paid in tokens (account only) Measures how many articles each site publishes per month, for a list of sites or for the sites ranking in the Google top 10 of a keyword, then returns the median of the competitors and a recommendation for your own site. Each site is an editorial velocity analysis (same engine as createEditorialVelocity). **Paid, ONLY WITH THE USER'S EXPLICIT AGREEMENT.** 20 tokens per site analysed. With `sites`, the price is 20 tokens times the number of distinct sites, your site included. With `keyword`, the number of sites is o…
get_editorial_velocity_comparison — Read a comparison of editorial velocities, poll until it is done Returns the comparison started by `POST /api/v1/tools/editorial-velocity/comparisons`. While `status` is `pending` or `running`, call again every 15 seconds. Each site has its own `state` (queued, running, done, failed); its numbers are null until it is done, never zero by default. `analysisId` links to the full analysis of the site (GET /api/v1/tools/editorial-velocity?analysisId=...). `summary.median` and `summary.max` are computed on the competitors measured (`summary.measuredCompetitors`), never on your own site; `summary.…
Added "create_editorial_velocity" and "get_editorial_velocity" (33 tools before, 35 now)
create_editorial_velocity — Measure how many articles a website publishes per month and per week (free tool) Reads the sitemap of one website and the date shown on each of its pages, then counts the articles published over the last 12 full months (UTC), per month, per section, per language, and how many articles were updated. Works with any CMS. **What is counted.** Only pages typed as an article (JSON-LD Article, BlogPosting, NewsArticle and similar types, or an `article:published_time` meta tag), dated by the publication date the site itself shows (JSON-LD `datePublished`, then meta tags, then the first `<time>` ele…
get_editorial_velocity — Read an editorial velocity analysis, poll until it is done Returns the analysis started by `POST /api/v1/tools/editorial-velocity`. While `status` is `pending` or `running`, call again every 5 seconds; `progress` gives the current stage (robots, sitemap, pages, summary) and `pagesRead` out of `pagesTotal`. When `status` is `failed`, `failureCode` says why (BLOCKED, the site refuses to be read; NO_SITEMAP; NO_DATES, pages read but none dated; UNREACHABLE; TIMEOUT; INTERNAL) and `publications` is null. A failed analysis is never a zero. When `status` is `done`, `publications.total` articles w…
Changed the definition of "get_usage"
⟨27 unchanged words⟩ renewal date. Aligned on the Stripe subscription billingcycle.cycle, or on the calendar month (UTC) for a Conqueror account without a subscription. Does not consume credits. `enforced` tells whether the ⟨31 unchanged words⟩ When `false` (any plan other than Conqueror,orawindowbilling cycle that started before the refusal went live, or a Conqueror subscription in payment recovery, counted over the last 30 days with no reset date), the figures are informational only and nothing ⟨21 unchanged words⟩ of the 402), absent when the add-oniscannot raise the quota (already at its highestvolume.
Changed the definition of "get_guide"
⟨68 unchanged words⟩ ) and guide.progressStatus (raw reason, message, terminal, kind, and failureFacts when the figures are known, which is only possible for sources whose web pages we read, that is a search engine or a `_CITATIONS` source, never a source in answer mode). Stop polling in that case.
Changed the definition of "get_usage"
⟨6 unchanged words⟩ status Returns the current period's API guide usage (guides created through the API or MCP), quota limit, remaining count and the renewal date. Aligned on the Stripe subscription billing cycle. Does not consume credits. `enforced` tells whether the quota is enforced on the current window: when `true`, a guide creation through the API or MCP that would exceed the limit is refused with HTTP 402 (see `POST /api/v1/guides`). When `false` (any plan other than Conqueror, or a window that started before the refusal went live), the figures are informational only and nothing is refused on quota grounds. `upgrade_url` is the absolute link to the "Priority and API volume" add-on (the same as `details.upgrade_url` of the 402), absent when the add-on is already at its highest volume.
Added "create_citation_check" and "get_citation_check" (31 tools before, 33 now)
create_citation_check — Test whether ChatGPT, Perplexity and Google AI Overview cite a website for one question (free tool) Asks one question to three AI answer engines (ChatGPT with web search, Perplexity, Google AI Overview) in the chosen market, and reports for each engine whether your domain is cited as a source (`cited`, a citation on your registrable domain or one of its subdomains), whether your brand is named in the answer (`mentioned`, which is NOT a citation), which of your pages are cited, an excerpt of the answer, its sources, and the domains cited instead of yours. **One answer, on one day.** This is …
get_citation_check — Read an AI citation test, poll until it is done Returns the test started by `POST /api/v1/tools/citation-check`. While `status` is `pending` or `running`, call again every 3 seconds: each engine fills in as soon as it has answered. When `status` is `done`, at least one engine answered; `summary.citedBy` engines cite your domain out of `summary.enginesAnswered` engines that answered. When `status` is `failed`, `failureCode` says why (NO_ENGINE_ANSWERED, TIMEOUT, INTERNAL). Per engine: `cited` is true when a source of the answer is on your registrable domain or one of its subdomains, and `cit…
Changed the definition of "create_score"
⟨56 unchanged words⟩ default applies.\n","type":"boolean"},"pageUrl":{"description":"Optional. Read only for a visitor of a guide shared in read-only mode: the URL of one of the guide's SERP pages, whose stored content is then analysed instead of the guide's text. Ignored for the owner and for a guide shared in edit mode. Unknown URL: the guide's text is analysed.\n","type":"string"},"saveToGuide":{"description":"Whether to save the ⟨51 unchanged words⟩
Changed the definition of "create_persona_brief"
⟨129 unchanged words⟩ pages, 2 min 30 s for 10pages, 4 min for 30pages. MCP clients must call the `get_persona_brief` tool again until the status is terminal. **Identical requests are reused for 72 hours.** The same set of URLs, in any order, with the same `outputLanguage` and the same `brandName`, returns the brief already computed instead of computing it again: HTTP 200 with `reused` true, `status` already `done`, the original `briefId` and `reusedCreatedAt`, the date of the brief it reuses. Nothing is created, and your daily quota is given back, so a reused answer costs you nothing. The pages of a reused brief are listed in the order of the original request, not in the order you just sent. Send `force` true to skip the lookup and compute a new brief, which answers 202 and consumes quota. **Addresses.** Duplicate URLs, compared once normalized, are ⟨37 unchanged words⟩ could be read). **Tiers, per UTC day.** Every tier is capped at 10 URLs per brief since 21 September 2026. - Without an API key, free anonymous ⟨20 unchanged words⟩ without API access: 10 briefs per day,2010 URLs per brief. - API key of an ⟨6 unchanged words⟩
Changed the definition of "create_guides"
⟨324 unchanged words⟩ guide per source value on the same query. IMPORTANT, HOW TO READ THE RESPONSE OF THIS ENDPOINT, WHICH SPENDS CREDITS. Queries listed in `guidesFailed` are PROVEN not to have produced a guide and their credit was given back (unless the account has unlimited credits, where nothing was reserved): re-sending them is free and correct. Queries listed in `guidesUnknown` have an UNDECIDABLE outcome and their credit is deliberately KEPT, because the guide was most likely written: DO NOT re-send them, you would pay for the same guide twice. Look them up in `GET /api/v1/guides` after a few minutes instead, and contact support if nothing shows up. Finally, a `200` is NOT a promise that every query produced a guide: compare `guides.length` with the number of queries you sent, never read `success` alone, and never re-send a query just because it is missing from `guides`.
Changed the definition of "create_score"
⟨8 unchanged words⟩ of the provided content for a specific guide MCP channel defaults: this tool sends scoreProgressive=false, includeEmbedding=false when you leave them out. That is specific to this channel and overrides the default documented on those parameters, which describes the REST API. What it changes in the response: with scoreProgressive=false, contentAnalysis.progressiveScores comes back empty ({}); with includeEmbedding=false, contentAnalysis.embeddingAnalysis is omitted from the response. Set a flag to true in your arguments to get its content back; any value you do pass is sent unchanged, including false. The whole response is handed to the model, and this is where most of its size goes, so it is opt-in on this channel: ask only for what you are going to read.
Changed the definition of "create_score"
⟨17 unchanged words⟩ to analyze","type":"string"},"includeEmbedding":{"description":"Whether to compute the semantic embedding analysis, i.e. proximity and PCA (default: true). When false, the embeddingAnalysis key is omitted from the response. Null is treated as \"not provided\", so the default applies.\n","type":"boolean"},"saveToGuide":{"description":"Whether to save the ⟨5 unchanged words⟩ back to the guide (default: true)\n","type":"boolean"},"scoreProgressive":{"description":"Whether to compute the progressive score build-up curve (default: true). When false, progressiveScores is returned empty. Null is treated as \"not provided\", so the default applies.\n","type":"boolean"}},"required": ⟨4 unchanged words⟩
Changed the definition of "get_eeat"
Get E-E-A-T analysis results Retrieves the result of an E-E-A-T analysis. `guideId`Eitherispass**always required**: access is granted on the guide, so a request without it is answered with `404 Guide not found`. `eeatId`(returnedisbyanPOSToptional/api/v1/eeat)filter on top of it: pass it to fetchaone specific analysis,or
Added "create_persona_brief", "discover_persona_brief_pages" and "get_persona_brief"; changed the definition of "delete_guide" (28 tools before, 31 now)
Delete a guide Deletes a specific guide. Deliberately NOT blocked by the 180-day expiry: an expired guide can no longer be read, but it can always be deleted, so that you can still clean up your account.
create_persona_brief — Generate an AI persona and brand voice brief from the pages of a website (free tool) Reads public pages of a website and produces an editorial persona and writing style brief: who writes, for whom, tone on 6 axes, vocabulary, structure, do and don't lists, verified quotes from the pages, style metrics measured on the text, and a ready-to-paste writing prompt for any AI writing tool (`brief.writingPrompt`, plus `brief.writingPromptCompact` of at most 1500 characters). **Asynchronous, poll the result.** This call only starts the job and answers HTTP 202 with a `briefId` and a `pollUrl`. Call …
Certificate changed, valid to 2026-12-16
Certificate recorded, valid to 2026-10-18
Authorization not required
First tool surface recorded: 28 tools (server version 0.1.0)
Showing the latest 21 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨55 unchanged words⟩ read; NO_SITEMAP; NO_DATES, pages read but nonedated;shows a readable publication date, neither structured data, nor a date tag, nor a "Published on" mention; UNREACHABLE; TIMEOUT; INTERNAL) and `publications` is null. A ⟨94 unchanged words⟩ its dated sections when `method.undatedSections` is not empty. A 0 with `publications.otherDatedPages` above 0 means that dated pages were read, but nothing shows that they are articles (product pages, event calendars): it adds to the meaning of the 0 above, it never replaces it. `method.inferredSections` names the sections without article markup counted from the dates read in their pages (`itemprop` attribute or `<time>` element). `method.sameDaySections` names the sections where at least 80% of the pages counted share the same day: those pages are counted, the list is only a hint to check the website (grouped publication, or dates changed in bulk). `updates` counts the articles updated more than one ⟨140 unchanged words⟩
⟨106 unchanged words⟩ the analysis was sampled (`method.sampled`). Atotal`total` of 0iswithonly`ci95`returnedpresentwhencomes from a sample: itisdoesprovennot(prove that the websitesitemappublisheddatesnothing,atandleastneither90does%aof0 with `method.undecidedSections` not empty (sections whoseitsreadingURLsstoppedandbeforenonea verdict, counted nowhere). Otherwise, a 0 covers what wasmodifiedread in full: thewindow).whole site, or only its dated sections when `method.undatedSections` is not empty. `updates` counts the articles updated more than one ⟨140 unchanged words⟩
⟨15 unchanged words⟩ the brief.","type":"string"},"force":{"description":"True to compute a new brief even when an identical one exists, which answers 202 and consumes quota. Any value that is not a boolean returns 400 INVALID_BODY.","type":"boolean"},"outputLanguage":{"description":"Language in which the ⟨32 unchanged words⟩ articles give the best brief. At most 10,20 or 30URLsdepending,onwhatever the tier, each of at most 2048 ⟨10 unchanged words⟩
⟨3 unchanged words⟩ ,"properties":{"eeatId":{"description":"Optional filter, ID ofaone specific analysis of that guide (returned by POST /api/v1/eeat).EitherOmit`eeatId`itorto`guideId`getmustthebelatestprovided.analysis of `guideId`.","type":"string"},"guideId":{"description":"ID of the guidewhose latestthe analysisshould bebelongsreturned.to.EitherRequired,`eeatId`andoraccess`guideId`ismustcheckedbeonprovided.it.","type":"string"}},"required":["guideId"],"type":"object"}
discover_persona_brief_pages — Find the representative pages of a website from its sitemaps, before generating a persona brief (free tool) Reads the sitemaps of a website (declared in robots.txt, otherwise /sitemap.xml, /sitemap_index.xml and /wp-sitemap.xml) and returns up to 200 URLs of the same host, editorial pages first. The first URLs, as many as the URL limit of your tier, are flagged `suggested`: send them in `urls` to `POST /api/v1/tools/persona-brief`. Same tiers as the creation call, with their own daily counter per UTC day: 20 discoveries per day per IP address without an API key, 50 for a signed-in account, …
get_persona_brief — Read an AI persona and brand voice brief, poll until it is done Returns the brief started by `POST /api/v1/tools/persona-brief`. While `status` is `pending`, `fetching`, `analyzing` or `synthesizing`, call again every 3 seconds: `progress` and `pages` show what has been read so far. When `status` is `done`, `brief` holds the structured brief, `brief.writingPrompt` the ready-to-paste prompt and `markdown` the full document. When `status` is `failed`, `failureReason` says why (NO_USABLE_PAGE, LLM_UNAVAILABLE, TIMEOUT, INTERNAL). A page with a `failureReason` did not contribute to the brief. A…