Keytomic
Server Details
Remote MCP server for Keytomic, the AI SEO agent: SEO audits, Search Console and GA4 data, keyword research, articles, CMS publishing, indexing, backlinks, Reddit and AI visibility. You sign in with your Keytomic account (OAuth).
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
TDQS
Scored across 52 tools
Most tools target a clearly distinct resource+action (audits, drafts, Reddit, backlinks, indexing), but the set contains real overlap: nine separate question tools (top_rankings, improving, declining, low_hanging_fruits, underperforming, cannibalization, zombie_pages, question_queries, new_rankings) duplicate what get_search_insight does via its 'kind' input, and add_keywords_to_calendar vs create_calendar_topic both create calendar topics. get_search_performance vs search_analytics_query vs get_search_insight also require reading long descriptions to pick correctly.
The bulk of the surface follows a clean snake_case verb_noun pattern (get_*, list_*, update_*, start_*, generate_*, publish_draft, watch_audit). However, a block of nine bare noun-phrase tools (top_rankings, improving, zombie_pages, cannibalization, etc.) breaks that convention entirely and looks like it leaked sub-kinds of get_search_insight into the tool list. The mixture is readable but not uniform.
52 tools is well above the 25+ threshold and far beyond what an agent can scan reliably in one context, even for a broad SEO/content platform. Several of the analytics insight variants should be folded into get_search_insight's 'kind' parameter, which alone would cut the surface substantially.
Coverage is genuinely broad across the domain: sites, brand profile, calendar topics, drafts, publishing, audits with findings/rows/links/pages, Search Console queries and insights, GA4, backlinks, indexing, AI visibility and Reddit. Minor gaps exist — no tool to delete a calendar topic or draft, no create-project/site, and no explicit audit cancellation — but core lifecycles are covered.
Available Tools
52 toolsadd_keywords_to_calendarAdd keywords to calendarAInspect
Adds keywords from search_keywords to a site’s content calendar as topics, the same as adding keywords in the Calendar: one topic for each keyword, in the order sent, one a day on the site’s automation days (enabledDays in the settings section of get_project) from startDay. Up to 5 keywords. Send each keyword with its searchVolume, difficulty and searchTrend from search_keywords, unchanged, so the topic shows its search demand chart. AI writes each topic’s intent, outline, secondary keywords and article type (blogType), and AI checks the keywords against the site’s current topics and pages, unless allowCannibalization is true. If a keyword collides, nothing is added and the result lists the collisions (status collision): show them to the user, and if the user still wants the keywords, call again with allowCannibalization true. The call uses no keyword search and no articles: the daily automation writes each article on its day, and then it counts. But the site must have enough articles left this month, or Article Credits, for the new topics. A repeated call adds the topics again. The site needs a content calendar run, saved Image Studio settings and at least one automation day first. Returns the added topics; when the workspace can open only some topics for now, returns only those, with lockedTopicCount for the others.
Inputs: keywords (required), startDay (required), projectId (required), allowCannibalization.
add_visibility_promptsAdd AI visibility promptsAInspect
Makes prompts Active for a site, the same as confirming the prompts on the AI Visibility page: the Suggested prompts of selectedPromptIds (from the suggestions section of get_visibility) and the prompts the user writes in customPrompts, each with its topic. A custom text that matches an Archived prompt makes that prompt Active again. Refusals: active_prompt_limit_reached (the Active prompts pass the plan’s Active limit), setup_branded_limit_exceeded (the call adds more than one prompt that names the brand, or one when the market already tracks one), prompt_not_found (a selectedPromptId that is not a selectable Suggested prompt of the market), saved_prompt_limit_reached (the market has its most saved prompts) and check_running (a check runs now). The result gives every Active prompt of the market and the custom prompts the tool skipped, with the reason (already_active, paused, or edit: a Suggested prompt that a prompt edit made, which only update_visibility_prompt can change). It starts no check and reserves no observations. Pass at least one prompt.
Inputs: projectId (required), customPrompts, selectedPromptIds.
create_calendar_topicCreate calendar topicAInspect
Creates one topic in a site’s content calendar from a title, the same as Add topic in the Calendar with a title the user writes. AI picks the topic’s keywords, intent, outline and article type (blogType), Keytomic checks the keywords’ search volume with DataForSEO, and AI checks the topic against the site’s current topics and pages, unless allowCannibalization is true. A created topic uses 1 of the site’s monthly keyword searches (the keywordSearches section of get_project shows them). If the topic collides, nothing is created and the result lists the collisions (status collision): a collision found from the title alone uses no keyword search, and a collision found after AI picked the keywords uses 1. Show the collisions to the user, and if the user still wants the topic, call again with allowCannibalization true; a call on the same day does not use a second keyword search for this title. Creating a topic uses no articles: the daily automation writes the article on its scheduled day, and then it counts. But the site must have an article left this month, or an Article Credit. A repeated call creates the topic again. The site needs a content calendar run and saved Image Studio settings first. Returns the created topic; when the workspace cannot open it for now, returns lockedTopicCount instead.
Inputs: title (required), projectId (required), scheduledDay, authorProfileId, +2 more.
delete_author_profileDelete author profileADestructiveInspect
Deletes an author profile from a site, the same as in Keytomic. When it was the default, the newest other author becomes the default; when no author remains, authors turn off. When Article Settings named it, that setting is cleared. The result says which of these happened. Ask the user before calling it. Spends no credits.
Inputs: projectId (required), authorProfileId (required).
generate_articleGenerate articleAInspect
Writes the article of one content calendar topic of a site, the same as Generate in the Calendar and the daily automation. Without confirm, returns the plan and starts nothing (status plan): the articles used and left this month and today, the Article Credits, and whether the article uses an Article Credit because the month limit is reached. Show the plan to the user, and call again with confirm: true only after the user agrees; when the plan uses an Article Credit, add useArticleCredit: true. With confirm: true, reads the plan again and starts the article (status generating). When the plan read again uses an Article Credit and the call has no useArticleCredit: true, it returns the plan (status plan) and starts nothing. Keytomic writes it in a few minutes: follow it with list_calendar_topics with topicId (generationStatus), and read it with get_draft when it is ready. The article counts when Keytomic saves the draft. When the topic cannot get an article now, both calls answer a tool error and use nothing: a topic with an article (topic_has_article), a topic whose article Keytomic writes now (topic_generation_in_progress), a topic the workspace cannot open (topic_not_in_plan), or a usage limit. The site needs saved Image Studio settings.
Inputs: topicId (required), projectId (required), confirm, useArticleCredit.
generate_hero_imageGenerate hero imageADestructiveInspect
Generates a new hero image for the article of one content calendar topic of a site with Image Studio, and replaces the article’s hero image with it. Keytomic uses the article, the site’s Image Studio settings and its default brand assets; creativeDirection and exclusions guide the image. Each image uses 1 Blog Hero Credit. Without confirm, returns the plan and starts nothing (status plan): the article title and the Blog Hero Credits left. Show the plan to the user, and call again with confirm: true only after the user agrees. With confirm: true, reads the plan again, generates the image and attaches it to the article (status attached). When Keytomic generates the image but cannot attach it, the result says so (status generated_not_attached): the image is in the Image Studio Media Library, the credit is used, and the user can attach it in Content Studio. If the call with confirm: true times out, read the article with get_draft (or the topic with list_calendar_topics with topicId) before you call this tool again: the image can still finish and attach on the server, and a second call uses a second Blog Hero Credit. When the site cannot generate an image now, both calls answer a tool error and use nothing: a topic without an article (draft_not_found), a topic the workspace cannot open (topic_not_in_plan), missing Image Studio settings, a Spend Lock, or no Blog Hero Credits left.
Inputs: topicId (required), projectId (required), confirm, exclusions, +1 more.
generate_reddit_replyGenerate Reddit replyAInspect
Writes a new Reply Draft for one open Reddit thread of a site, the same as "Write a reply for me" on the Reddit Opportunities page, in the Agent Mode of the site and within the Brand Mention Safety of the thread. Each call makes one AI call and adds a new draft, which becomes the draft the thread shows. Nothing posts to Reddit: the user copies the draft from the Reddit Opportunities page and posts it. Returns the draft and the Brand Mention Safety of the thread (null when the thread left the open list). A thread that is not open gives opportunity_not_found and no AI call. When the AI reply breaks the brand rules of the thread, the result is reply_failed and no draft is saved.
Inputs: projectId (required), opportunityId (required).
get_analytics_performanceGet analytics performanceARead-onlyInspect
Returns the Google Analytics 4 numbers of the Analytics page for the site’s connected property: active users, sessions, new users, bounce rate and the number of traffic sources, with the change against the previous period of the same length; a daily series; the 25 top traffic sources and their daily series; the 25 top pages by views; and the 25 top countries. bounceRate and share are fractions from 0 to 1. Keytomic keeps each result for up to 6 hours, so generatedAt says when GA4 was read. For the events of the site, use list_analytics_events.
Inputs: projectId (required), device, country, endDate, +3 more.
get_auditGet SEO AuditARead-onlyInspect
Reads one SEO Audit of a site, by default the latest, as a report per category: status, stage, crawl progress, each category’s state and a seoAuditUrl that opens the site’s SEO Audit page in Keytomic. A finished category adds its finding and limitation counts and, for audits from crawlers with live category summaries, its issue, advisory and check counts and top findings; older audits leave these null. A category fails only for a high-severity issue, warns for any other issue, a limitation or a check that warns or fails, and passes otherwise; advisories alone leave it passing. Check counts count checks, not findings. While the audit is queued or running, follow it with watch_audit. Once it is completed or partial, it includes the summary: per category its status, finding and check counts and its 0–100 Category Health score with band; the 0–100 Website Health score with band; reportAreas; the Start Page’s metrics; PageSpeed scores per strategy (null when the strategy did not run); average and median time to first byte; the top 20 findings (key, title, severity, affected count), coverage and limitations. reportAreas has one entry per Report Area of the run’s mapping version, in display order, with the crawler’s label. Each entry has its 0–100 Area Health score with band and its passed, warning, failed and notApplicable check counts. notApplicable counts the area’s not applicable checks, which are not assessed; it is null on audits stored before the crawler counted them. For Performance, strategy names the PageSpeed strategy behind the score. An area has no weight and feeds no other score. The deductions behind the score are left out. An area without a score gives a reason: not_scored (stored before Report Areas), not_executed, unavailable, undeclared_finding_code, no_pagespeed_score (Performance only) or no_checks_assessed. Scores are null with a reason when there is none, and audits from older crawlers leave the newer fields null. It leaves out evidence: read it with list_audit_findings and list_audit_rows. Pass category to read only that category’s report from a finished audit: its status, every check with its status and row count, its findings and limitations; read a check’s rows with list_audit_rows. A failed or cancelled audit includes the crawler’s error. To compare audits, read each one by runId.
Inputs: projectId (required), runId, category.
get_backlinksGet backlinksARead-onlyInspect
Returns the saved backlink report of a site, the same data as the Backlinks page: the backlinks that point to the site, with the referring page, anchor text, authority (rank, 0 to 100), dofollow, spam score and whether the link is broken or new, and the backlink gaps: pages that link to a competitor but not to the site, with an outreach draft for each. It reads saved data only and never reads new data from DataForSEO. fetchedAt says when the data was read; the Backlinks page reads new data on its first view after nextSyncAt. The gaps come only from competitors whose backlinks are saved; competitorDomains lists the competitors of the gap list. When no report is saved, the result says so and gives backlinksUrl, where the user opens the Backlinks page to read the data. Spends no credits.
Inputs: projectId (required), limit.
get_content_calendar_progressGet content calendar progressARead-onlyInspect
Returns the progress of a site’s content calendar run: its status, each stage with its status and summary, the number of topics it plans, its times and, when it stopped, the message Keytomic shows. Without runId, reads the run in progress; when none is in progress, the result says so. Makes no external calls.
Inputs: projectId (required), runId.
get_draftGet draftARead-onlyInspect
Returns the article Keytomic wrote for a content calendar topic of a site: the newest draft of the topic, with its title, slug, summary, SEO title and description, the full text as Markdown, the hero image, the word count, the publication status with the published URL, the topic’s primary keyword and scheduled day, the author saved on the article, whether this connection can edit the article, the SERP Snapshot: the top Google results for the topic’s keyword and market when the brief was written (keyword, market, check time, and each result’s rank, title, URL, domain, and whether it is on the site’s own domain), or null when none was saved, and structuredData: the structured data (JSON-LD) of the article, as Content Studio shows it. structuredData has the owner’s Structured Data Edit (edit, or null), the JSON-LD that a publish sends (sent: Keytomic’s, with the edit on top), Keytomic’s JSON-LD with no edit (keytomic), the publishing destination of the read, and liveUpdate: when a structured data save with update_draft reaches the live post. on_save: the save sends it to the live WordPress post. next_publish: the next publish of the article sends it. other_article: a newer article, such as a content refresh, publishes the post, so the edit does not reach it. seoPluginCanOverride is true for a WordPress post that Keytomic imported: when the site runs Yoast SEO, Rank Math, All in One SEO, SEOPress or The SEO Framework, the page shows that plugin’s schema instead of the structured data that Keytomic sends, so never tell the user that the live page has it. Name destinationId from the destinations section of get_project; without it, the read uses the site’s only active destination, else none, and then destination and liveUpdate are null. structuredData is null when the article cannot be published yet, for example when its text is empty. To change it, send the whole edit with update_draft just after this read: the last save wins. Only WordPress gets structured data from Keytomic. A topic without an article answers draft_not_found. When the workspace can open only some topics for now, only those can be read (see list_calendar_topics); others answer topic_not_in_plan. Makes no external calls.
Inputs: topicId (required), projectId (required), destinationId.
get_indexing_statusGet indexing statusARead-onlyInspect
Returns the saved indexing status of each post that Keytomic published for the site, on Google and on Bing, with one combined status: indexed (Google indexes it), needs_attention (Google gives an error or the last Bing submit failed), pending (an engine has the URL and no engine gives a problem), or not_checked (no engine has data). The summary gives the published, indexed and pending numbers of the Indexing page (the indexed and pending numbers are null without Google data), the count of each engine status and each combined status, the connection of each engine and the oldest check. Bing gives crawl dates only, so a Bing status is crawled or not_indexed, never indexed. It reads only what Keytomic saved and makes no Google or Bing call: Refresh on the Indexing page updates it, and inspect_urls checks URLs live. Pass url or topicId to read one post with its saved Google diagnostic report. An engine whose data this connection may not read is scope_missing.
Inputs: projectId (required), url, page, filter, +1 more.
get_projectGet projectARead-onlyInspect
Returns what an agent needs to know about a site before content or SEO work, in sections. Pass sections to pick them; without it, the tool returns profile, settings and integrations. The result has one key for each section. profile: the site’s name and domain, its brand profile (metadata such as the main keyword, market and country, the audience, Brand Voice, Content Guardrails, Offer Positioning, competitors and sitemap counts), whether the owner has completed the brand profile review, the setup checklist and the stored Domain Rating. Content generation uses the brand profile only after the review is complete; the owner completes it in Keytomic at profileUrl, never through this server. legacyCustomInstructions is a legacy free-text field kept for older generation paths: read it, but put new rules in Content Guardrails, Brand Voice or Offer Positioning with update_brand_profile. A site whose brand profile is not generated yet has brandProfile null; brandProfileGenerationFailed true means the last generation failed; the owner cannot start it again and should contact Keytomic support. sitemapInventory.collectionPending true means the sitemap counts are not final yet. settings: Article Settings (length, tone, voice instructions, internal links, inline images, YouTube and the author override), indexing settings (the URL prefix of the site’s posts), the automatic blog schedule (days, whether drafts publish automatically and to how many destinations, and whether article snapshots are on) and the author profiles with the default author. The automatic blog schedule is read only here; the owner changes it in Keytomic. Edit the rest with update_project_settings, save_author_profile and delete_author_profile. usage: for this site, each Usage Limit with a cap: what was used in its window (day, week, month or all time), the limit and what is left. A metered action with no cap is not listed. Read it before work that spends credits. integrations: Google Search Console, Google Analytics, Bing Webmaster and each Shopify store. Each entry has a name (the property, site or store; null when not connected) and a status: connected, needs_attention (the owner must reconnect or fix it) or not_connected. Entries that are not connected have a connectUrl, where the owner connects or fixes the integration in Keytomic. destinations: the CMS, webhook and API destinations the site can publish articles to (Shopify stores too), its own and the workspace-wide ones. Each has a destinationId for publish_draft, the provider, a name, a status (connected, or needs_attention with a fixUrl), draftMode (kept_as_draft: a draft publish stays a draft on the destination; receiver_decides: Keytomic sends the mode and the receiver decides; not_supported: the destination has no draft mode), autoPublish (whether automatic publishing sends new articles to it) and workspaceWide. A site without a destination has an empty list with a connectUrl, where the owner connects one in Keytomic. property: the site’s connected Search Console property (propertyId, propertyUrl) and the connected Google account’s permission level on it (permissionLevel, null when Google gives none). It is read live from Google. keywordSearches: how many calendar keyword searches the site has left this month, how many were made on it today, and whether a search can run now (canSearch, with blockedBy when it cannot). Keytomic counts keyword searches per site: the searches of all members of the site count together. profile, settings, usage and integrations need workspace:read; destinations and keywordSearches need content:read; property needs gsc:read. A section this connection may not read has error scope_missing, and a section that fails has an error code and a message: a usage refusal with its own code; a Search Console error in property, with its own code, retryable, and connectUrl or retryAfterSeconds when they apply; or internal_error. A scope_missing message names the sections this connection can read. The other sections still return; when every section has an error, the call is a tool error: the section’s error when one section was requested, otherwise sections_failed with each section’s error under its name.
Inputs: projectId (required), sections.
get_publication_statusGet publication statusARead-onlyInspect
Returns where the article of a content calendar topic was published: the latest publication for each mode (draft or publish) of each publishing destination of the site that has a publication of the article. Destinations without a publication are not listed. Each publication has its status (pending, succeeded or failed), the public URL on the destination (null for a draft-mode publication, which has no public URL), when it started and completed, and the destination’s destinationId, name and provider. A failed publication has a failureMessage and a fixUrl, where the owner checks the destination in Keytomic. A topic without an article answers draft_not_found. When the workspace can open only some topics for now, only those can be read (see list_calendar_topics); others answer topic_not_in_plan. Makes no external calls.
Inputs: topicId (required), projectId (required).
get_reddit_settingsGet Reddit settingsARead-onlyInspect
Returns the Reddit Opportunities settings of a site, the same as the Reddit Opportunities page: the search topics, the subreddit filter (empty: all subreddits), the Agent Mode (founder or user, the voice of the replies), when the last scan started and completed and how many new threads it kept, nextCheckAt (the next daily scan), checkNowAvailableAt (when the user can start a scan again on the page; null when now), topicLimit (most topics) and maxAgeHours (how long a thread stays on the open list). The topics are empty until the first scan makes them from the brand profile. It reads saved data only: it starts no scan and calls no AI model. Spends no credits.
Inputs: projectId (required).
get_search_insightGet search insightARead-onlyInspect
Answers one common Search Console question, chosen with kind, with tested thresholds, and says how in a method block. Google keeps and returns rows ranked by clicks, up to a daily row limit, so on large sites low-click rows can be missing even when the result is not truncated, and such a row can then show as new, lost or a zombie. Data comes from the site’s connected Google Search Console property, web search only. By default the period is the last 28 days that have final data, which usually ends 2 to 3 days ago. Search Console does not separate AI Overviews or AI Mode traffic from web search. new_rankings, improving, and declining compare the period with the 28 days before it by default. The default period does not apply to zombie_pages, which has its own fixed period. Every kind takes projectId, cursor and pageSize; an input the kind does not take gives invalid_arguments. Page through with cursor and nextCursor.
top_rankings: Which pages or queries have the strongest Google visibility? The most clicks, or the most impressions with sortBy "impressions", with at least 50 impressions by default. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, dimension, minImpressions, sortBy.
new_rankings: Which pages or queries started to appear in Google Search? At least 50 impressions in the period by default and no row in the comparison period. Most impressions first. Nothing is listed as new when the comparison read hits the row cap. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, compareWith, dimension, minImpressions.
improving: Which pages or queries are gaining? Average position up by 1 or more, or clicks or impressions up against the property. A change in clicks or impressions counts when it beats or trails the whole property’s change by at least 20 percentage points by default, so a site-wide drop does not flag every row. Rows that moved both ways are counted in mixedRows and listed in neither. Rows need 50 impressions in both periods by default. Biggest click gain first. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, compareWith, dimension, minImpressions, relativeDeltaPoints.
declining: Which pages or queries are losing traffic or rankings? Average position down by 1 or more, or clicks or impressions down against the property, plus rows with enough impressions before and none now (status "lost", left out when the current read hits the row cap). A change in clicks or impressions counts when it beats or trails the whole property’s change by at least 20 percentage points by default, so a site-wide drop does not flag every row. Rows that moved both ways are counted in mixedRows and listed in neither. Declined rows need 50 impressions in both periods by default, and lost rows in the comparison period. Each declined page carries a likely cause: position_loss (position worse by 2 or more), demand_loss (position stable, impressions fell against the property), ctr_loss (position and impressions stable, CTR fell) or unclear. Biggest click loss first. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, compareWith, dimension, minImpressions, relativeDeltaPoints.
low_hanging_fruits: Which pages or queries rank just below the top results and are easiest to improve? An average position from 11 up to, not including, 21, with at least 50 impressions by default. Most impressions first. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, dimension, minImpressions.
underperforming: Which pages or queries get fewer clicks than their position should give? At least 100 impressions by default and a CTR below 50% of the expected CTR of their position band. The bands are average positions 1, 2, 3, 4 to 5, 6 to 10, 11 to 20; a band from a to b holds positions from a up to, not including, b + 1. Expected CTR is the property's median CTR over the band's rows with 50 or more impressions; a band under 1,000 impressions, or with no such row, uses an approximate industry CTR, and method.bands gives each source. A band whose median CTR is 0 lists no rows. Most missed clicks first. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, dimension, minImpressions.
cannibalization: Which search queries have 2 or more pages of the site competing? Groups are signals with no search intent or page-role check. Queries group by exact and close match (English rules): case, accents, punctuation (. and - split words, & is and), a possessive 's, word order, stop words, and a regular plural when the singular is also in the data; other symbols stay part of a word, as in c++. A group needs 100 impressions by default and 2 or more pages that each get 10% or more of its page impressions; Google counts an impression for each page a search shows. brandTerms leaves out every group with a brand query. Most impressions first. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap, brandTerms, minImpressions.
zombie_pages: Which pages in the submitted sitemaps got no Google impressions in the last 90 days of final data? Its period is fixed. A sitemap URL whose canonical URL is another one has no data of its own, so it shows as a zombie. Sitemap indexes are read one level deep, up to 50 sitemaps and 50,000 URLs. Pages with a sitemap lastmod in the last 30 days count as recent, not zombie; a page with no lastmod is never skipped. URLs match without scheme, www, host case, trailing slash or fragment. Rows are the zombie pages, then sitemap entries Search Console cannot report (status unmatched). counts, unreadSitemaps and pageRowsRead give the rest. The sitemaps are downloaded from the site, so they can differ from what Google last read. Inputs: none of its own.
question_queries: Which search queries are questions or long and conversational, and so show what people ask? Queries that start with an English question word (who, what, when, where, why, how, which, can, does, do, is, are, should, will) or have 6 or more words; each row says which rule it met. Words are whole words, so a query never matches because a word contains "ai". This tool does not detect AI search traffic. Most impressions first. Inputs: startDate, endDate, includeSearchOperatorQueries, rowCap.
Inputs: kind (required), projectId (required), cursor, rowCap, +10 more.
get_search_performanceGet search performanceARead-onlyInspect
A short Search Console performance overview: clicks, impressions, CTR and average position for a period and its comparison period, the change in each, a daily series for both, and the top queries and pages by clicks. Data comes from the site’s connected Google Search Console property, web search only. By default the period is the last 28 days that have final data, which usually ends 2 to 3 days ago, and it is compared with the 28 days before it. Search Console does not separate AI Overviews or AI Mode traffic from web search. Totals come from the whole property with no filter, so anonymized queries are counted; the top query list leaves out search-operator queries by default. Position has no change when either period had no impressions.
Inputs: projectId (required), rowCap, endDate, topLimit, +3 more.
get_visibilityGet AI visibilityARead-onlyInspect
Returns the AI Search Visibility of a site, the same data as the AI Visibility page, in sections. Pass sections to pick them; without it, the tool returns overview only. The result has one key for each section and visibilityUrl, where the user opens the AI Visibility page. It starts nothing: no check, no setup and no observations. overview: whether the brand profile review is complete, the market (locale), the settings (AI platforms and UTC run days), the limits of the plan (Active and saved prompts, AI platforms, run days), the server schedule, the setup status, and nextRunAt, the next scheduled check. check (on request): the check overview: the observations a check needs, used and left this month, the available AI platforms, canStart and blockedReason, firstCheckNeeded and latestCheck. It can read the Google AI Mode locations and languages from DataForSEO. prompts (on request): the prompts of the site’s market with their promptId, text, topic, intent, type, state and revision. Without promptState it leaves out Archived prompts; pass promptState for the prompts of one state. suggestions (on request): the Suggested prompts of the setup, best first, with activeSlotsLeft, the Active prompts the plan allows and the Active prompts now. promptState needs the prompts section; an input the requested sections do not use gives invalid_arguments. When AI Visibility is off in this deployment, the call gives feature_disabled.
Inputs: projectId (required), sections, promptState.
get_visibility_reportGet AI visibility reportARead-onlyInspect
Returns the AI Search Visibility report of a site for a date range, the same data and filters as the AI Visibility page: the metrics, the visibility trend, the AI platform scorecards, the competitor share, the sources and every AI answer of the range. With promptId, it returns one prompt with its brand counts and its runs (the AI answers) for the date range instead; the other report filters then give invalid_arguments. It reads saved check results only and starts nothing. The result has no paging and can be large. Get promptIds from the prompts section of get_visibility. When AI Visibility is off in this deployment, the call gives feature_disabled.
Inputs: projectId (required), topics, endDate, intents, +7 more.
inspect_urlsInspect URLsARead-onlyInspect
Checks up to 50 URLs of the site live on every connected engine, in one call. Google: verdict, coverage, Google and user canonical and last crawl for each URL; a URL that fails has its own error, and after Google rate limits, the remaining URLs return gsc_quota_exceeded. Each URL counts toward Google’s limit of about 2,000 inspections per property per day. Bing allows only a few calls a minute, so only the first 8 URLs of the Bing site are checked live; a Bing call that fails gives the status error, and the other URLs get Keytomic's saved Bing result, or unknown with reason rate_limited when there is none. A URL off the Bing site is unknown with reason site_mismatch. An engine the site has not connected is not_connected, and an engine whose data this connection may not read is scope_missing. A Google failure, also one for the whole call such as a connection that needs a reconnect, is a Google entry with status error and detail.error: the code, the message, retryAfterSeconds when a retry can clear it, and connectUrl when the user must fix the connection. The other engines still answer. Keytomic does not save the results. A call with one URL also gives the full Google URL Inspection result (robots.txt and fetch state, mobile usability, rich results and AMP) in detail.inspection.
Inputs: urls (required), projectId (required), languageCode.
list_analytics_eventsList analytics eventsARead-onlyInspect
Returns the Google Analytics 4 events of the site’s connected property in a period, most frequent first: for each event name, eventCount, totalUsers (the users who triggered it), eventCountPerUser and keyEvents. isKeyEvent is true when the event counted as a key event in the period. GA4 counts key events only from the day the owner marked the event as a key event, so keyEvents can be lower than eventCount. totalEventNames says how many event names GA4 has for the query, also those past limit; it is not a count of events. Each call reads GA4 directly.
Inputs: projectId (required), limit, device, country, +4 more.
list_audit_findingsList SEO Audit findingsARead-onlyInspect
Lists every finding of a finished SEO Audit: issues and advisories with severity, the number and type of affected items, why it matters and the next step (whyItMatters, recommendedFix), and a sample of their evidence. When evidence.truncated is true, list_audit_rows with subject finding and the finding’s key pages all evidence.rowCount rows. get_audit already includes the top findings. Page with cursor and nextCursor.
Inputs: runId (required), projectId (required), limit, cursor.
list_audit_linksList SEO Audit linksARead-onlyInspect
Lists the links a finished SEO Audit found: source page, target URL, internal or external, anchor text, rel, HTTP status and whether the link works. Page with cursor and nextCursor.
Inputs: runId (required), projectId (required), limit, cursor.
list_audit_pagesList SEO Audit pagesARead-onlyInspect
Lists the URLs a finished SEO Audit discovered, each with its crawl state (fetched, blocked, inconclusive, failed or pending). A fetched URL also has its HTTP status, title, description, H1, word and image counts, response time and depth. Page with cursor and nextCursor.
Inputs: runId (required), projectId (required), limit, cursor.
list_audit_rowsList SEO Audit rowsARead-onlyInspect
Lists all rows of one target of a finished SEO Audit. Pass exactly one target: category and check for the rows of one check, such as every page a check flagged (check names come from get_audit with category), or subject and key for the evidence rows of one finding or limitation, such as every page or image it affects (keys come from get_audit or list_audit_findings). Page with cursor and nextCursor.
Inputs: runId (required), projectId (required), key, check, +4 more.
list_auditsList SEO AuditsARead-onlyInspect
Lists a site’s SEO Audits, newest first: runId, when it was started, how (manual, scheduled or api) and the URL it audited. Read one with get_audit. Page with cursor and nextCursor.
Inputs: projectId (required), limit, cursor.
list_calendar_topicsList calendar topicsARead-onlyInspect
Lists a site’s content calendar topics, ordered by scheduled day: title, scheduled day, review status, article generation and publishing state, the primary keyword with its search volume, difficulty and demand trend, and the planning fields (intent, funnel stage, audience, angles, author override). The scheduled day controls when the daily automation writes the article and, with automatic publishing on, publishes it. Without from and to, returns every topic; give both to read only the topics scheduled on those days (UTC, both included), such as one month. Topics without a scheduled day are only in the full list. Returns up to rowLimit topics a call: page through the rest with startRow and nextStartRow. Pass topicId to read only that topic, without from, to, startRow and rowLimit. When the workspace can open only some topics for now, returns only those, with lockedTopicCount for the others: the first 10 topics scheduled in the workspace’s first month until one of them has an article, then only that topic; another topicId answers topic_not_in_plan. Makes no external calls.
Inputs: projectId (required), to, from, topicId, +2 more.
list_reddit_threadsList Reddit threadsARead-onlyInspect
Lists the Reddit threads the daily scans found for a site, the same as the Reddit Opportunities page. view "open": the open threads, newest first, each with its AI relevance score (0 to 100), why it fits, its Brand Mention Safety and its newest Reply Draft (null before one); a thread leaves the open list after maxAgeHours (get_reddit_settings). view "history": one page of the threads that left the open list, with their outcome (replied, done, hidden or not_answered), the reply the user copied, whether set_reddit_opportunity_status can restore them, outcomeCounts and foundByDay; outcomeCounts and foundByDay count UTC calendar days, so they can differ from the page, which counts the days of the browser time zone. Filter with outcome and search, and page with cursor and nextCursor. outcome, search and cursor are only for view "history"; with view "open" they give invalid_arguments. It reads saved data only: it starts no scan and calls no AI model. Nothing posts to Reddit: the user copies a reply and posts it. Spends no credits.
Inputs: view (required), projectId (required), cursor, search, +1 more.
list_sitemapsList sitemapsARead-onlyInspect
Lists the sitemaps submitted for the site’s Search Console property with errors, warnings, pending state and submitted URL counts by content type. The Search Console API does not list sitemap URLs or report how many are indexed; use list_sitemap_urls for the URLs and inspect_urls for their index status. Pass sitemapIndex to list a sitemap index’s children. Pass sitemapUrl to read only that submitted sitemap, with its last submitted and downloaded times.
Inputs: projectId (required), sitemapUrl, sitemapIndex.
list_sitemap_urlsList sitemap URLsARead-onlyInspect
Downloads a sitemap from the site itself and lists its page URLs with lastmod, or its child sitemaps when it is a sitemap index. Use it to compare the sitemap with search_analytics_query pages or to choose URLs for inspect_urls. This is the live file, which can differ from what Google last downloaded. Page through large sitemaps with startRow and nextStartRow. Gzipped sitemaps are not supported.
Inputs: projectId (required), sitemapUrl (required), rowLimit, startRow.
list_sitesList sitesARead-onlyInspect
Lists the websites (projects) in the connected Keytomic workspace, with each one’s Google Search Console connection status and property when this Connected App may read Search Console data. Use the projectId with other Keytomic tools.
Inputs: no named parameters. Returns: sites
publish_draftPublish draftADestructiveInspect
Publishes the article of one content calendar topic to one publishing destination of the site, from the destinations section of get_project (request it with sections ['destinations']). mode draft (the default) sends the article as a draft; mode publish makes it live. Draft mode runs on the first call without confirm only on a destination that finds posts only by a stored id (GoHighLevel) and has no publication of the article yet, but it still writes to the destination: ask the user before you call it. Publish mode, a draft to a destination that can find posts by slug (WordPress, Framer, Shopify, Webflow, and Contentful when it has no stored id; a post with the same slug, also one Keytomic did not make, can be set back to a draft), a draft to a destination that already has a publication of the article, in any mode and also a failed or unfinished one (when its post is live, the destination can turn it back into a draft), a draft of a content refresh, and each call to a webhook (draftMode receiver_decides) first return the plan and sends nothing (status plan): the destination, the mode, the expected URL (or that the URL is known after the publish), whether it adds a new post or updates the post of an earlier publish, and whether it uses a daily publish, with the publishes left today. Show the plan to the user, and call again with confirm: true only after the user agrees; that call reads the plan again and publishes. A destination whose draftMode is not_supported takes only mode publish (draft_mode_not_supported). The first send of the article to a destination in a mode uses 1 daily publish; a repeat after a succeeded publish uses none. Returns the status (sent_as_draft, published, or sent_to_receiver for a webhook, whose receiver decides the mode), the public URL (null in draft mode, because a draft has no public URL), whether the publish updated an earlier post and whether it used a daily publish. If a call that publishes times out or answers internal_error, call get_publication_status before you call this tool again: the publish can still finish on the server. When an earlier publish of the article to the same destination in the same mode succeeded, a repeat updates the same post and uses no new daily publish, but a webhook gets a new event on each call. When none succeeded and none is still pending, a repeat uses a new daily publish, and it can add a second post when a failed publish reached the destination. When the destination does not confirm the publish, the call answers publish_failed with a fixUrl, where the owner checks the destination: the article may or may not have reached it.
Inputs: topicId (required), projectId (required), destinationId (required), mode, +1 more.
save_author_profileSave author profileADestructiveInspect
Creates or replaces an author profile of a site, the same as in Keytomic. Articles can name an author and use their bio, credentials and writing voice. Without authorProfileId it creates an author from every author field; calling it twice creates two authors. A site has at most 3 authors, and the first author becomes the default and turns authors on. With authorProfileId and the author fields it replaces that author, so send every field; the settings section of get_project returns the current values. makeDefault makes the saved author the site’s default author and turns authors on; articles without their own author use the default. With only authorProfileId and makeDefault it only sets the default. Spends no credits.
Inputs: projectId (required), bio, fullName, photoUrl, +6 more.
scan_redditScan RedditAInspect
Starts a manual Reddit scan of a site now, the same as "Check now" on the Reddit Opportunities page. The app permits one manual scan each UTC day; the daily scan still runs at nextCheckAt. Keytomic pays for the scan. The scan runs in the background: the result gives startedAt and nextCheckAt (null when it could not be read), and the new threads come later; read them with list_reddit_threads view "open". When the site already used its manual scan today, the result is manual_check_used with checkNowAvailableAt. Nothing posts to Reddit.
Inputs: projectId (required).
search_analytics_queryQuery search analyticsARead-onlyInspect
Runs a Google Search Console Search Analytics query on the site’s connected property: clicks, impressions, CTR and average position, grouped by any dimensions and filtered like the Search Console API. Rows are Google’s raw data. To compare periods, query each period and compare the rows. To leave out site: and other search-operator queries by the rule the insight tools use, add a query filter with excludingRegex "(?i)(?:^|\s)-?(?:site|inurl|allinurl|intitle|allintitle|intext|allintext|related|cache|filetype|ext|before|after):\S". Page through large results with startRow and nextStartRow. When dataState is omitted only final data is returned, which usually leaves out the latest days. With dataState "all" or "hourly_all", metadata.firstIncompleteDate or firstIncompleteHour marks where data is not final yet; metadata is null otherwise.
Inputs: projectId (required), type, endDate, rowLimit, +6 more.
search_keywordsSearch keywordsAInspect
Researches keywords for a site, the same as the Calendar keyword search: returns the seed keyword and up to 25 related keywords with search volume, difficulty, competition, CPC and the monthly trend, from DataForSEO. Each call uses 1 of the site’s monthly keyword searches, which all members of the site share (the keywordSearches section of get_project shows them); the result says what is left. Keywords with no search volume are listed for reference and cannot be added to the calendar.
Inputs: projectId (required), seedKeyword (required).
set_backlink_competitorsSet backlink competitorsADestructiveIdempotentInspect
Replaces the competitor domains of a site’s backlink gap list, the same as saving the competitors on the Backlinks page. Send every domain the list must have; an empty list clears it. Keytomic saves each domain as a hostname without www, removes duplicates and the site’s own domain, and refuses more than 10 domains. get_backlinks returns the current list. The next view of the Backlinks page reads the backlinks of new domains from DataForSEO; until then get_backlinks has no gaps for them. Spends no credits.
Inputs: domains (required), projectId (required).
set_reddit_opportunity_statusSet Reddit thread statusADestructiveIdempotentInspect
Changes the status of one Reddit thread, the same as the buttons on the Reddit Opportunities page. "done": the user handled the thread; it leaves the open list. "dismissed": the user does not want it; it is hidden from the open list. "restored": a done or hidden thread goes back on the open list, only while it is younger than maxAgeHours from get_reddit_settings (restorable in the History of list_reddit_threads). Spends no credits.
Inputs: status (required), projectId (required), opportunityId (required).
start_auditStart SEO AuditAInspect
Starts an SEO Audit of a site’s saved domain, the same as “Run audit” in Keytomic, with desktop PageSpeed. Set includeMobile to add mobile PageSpeed. If an audit is already running, it returns that audit with created false instead of starting another. Follow it with watch_audit, which streams its progress until it ends.
Inputs: projectId (required), includeMobile.
start_content_calendarStart content calendarAInspect
Starts a content calendar run for a site, the same as Generate in the Calendar. Without confirm, returns the plan of a run started now and starts nothing (status plan): the automation days, the first and last day (UTC, to the end of the billing cycle), the topic count, whether the run starts the article of today’s topic, and the calendar runs left. Show the plan to the user, and call again with confirm: true only after the user agrees. With confirm: true, reads the plan again and starts the run (status started) with a runId: follow it with get_content_calendar_progress. The run uses 1 of the site’s calendar runs for this billing cycle, researches keywords with DataForSEO and plans the topics with AI; when it plans a topic today, it starts that article, which uses 1 article. When the site cannot start a run now, both calls answer a tool error and use nothing. When the plan allows more than one run in a billing cycle, a later run adds topics and removes none, so one day can get two topics; the daily automation writes one topic a day. The site needs saved Image Studio settings, a reviewed brand profile and at least one automation day.
Inputs: projectId (required), confirm.
start_visibility_checkStart AI visibility checkAInspect
Starts an AI Visibility check of a site, the same as Run check on the AI Visibility page: Keytomic asks each available AI platform every Active prompt. The check uses one observation for each Active prompt on each platform. Without confirm, returns the plan and starts nothing (status plan): the observations the check needs, the observations left this month, availablePlatforms, and canStart with blockedReason. While the schedule runs the checks, a user can start only the first check of a site; the plan then says so (userStartAllowed false, canStart false and blockedReason manual_check_not_allowed) and gives nextRunAt, the next scheduled check. Show the plan to the user, and call again with confirm: true only after the user agrees. With confirm: true, starts the check and returns its checkId and the AI Visibility page link; read the result with get_visibility and get_visibility_report. When the check cannot start, the call with confirm: true gives a tool error and uses nothing, such as manual_check_not_allowed, insufficient_capacity or check_running. When AI Visibility is off in this deployment, the call gives feature_disabled.
Inputs: projectId (required), confirm.
start_visibility_setupStart AI visibility setupAInspect
Starts the AI Visibility setup of a site, the same as the AI Visibility page: Keytomic researches the site and saves the questions buyers ask AI as Suggested prompts. It saves only Suggested prompts: it makes no prompt Active and starts no check. Keytomic pays for the setup, so it uses nothing of the plan. A completed setup is used again, with no new research. It returns the setup status from before this start; follow the progress with get_visibility (the setup status of the overview section, and the suggestions section). When AI Visibility is off in this deployment, the call gives feature_disabled.
Inputs: projectId (required).
submit_for_indexingSubmit for indexingAInspect
Submits URLs or sitemaps of the site to every connected engine and returns one entry for each engine: status accepted, skipped or failed, with reason and detail: the counts (each URL and sitemap is submitted, skipped or failed), sentSitemapUrls and skippedSitemapUrls, failures with the code and reason of each refused URL or sitemap, and for Bing the URL quota left. Google takes sitemaps only: with urls, Google gets the preferred sitemap of the site, as the Indexing page sends it, and is skipped with reason no_sitemap when the site has none. With sitemapUrls, every engine gets those sitemaps, and Google gets no other sitemap. With neither, every engine gets the known sitemaps of the site: the sitemaps found during setup, or /sitemap.xml of its domain. Google needs a connected account with Owner or Full permission. A Google failure is the Google entry, not a tool error: failed with detail.error, retryAfterSeconds when a retry can clear it and connectUrl when the user must fix the connection. A sitemap off the property is not sent; when no sitemap is on the property, Google is skipped with reason site_mismatch. Bing takes URLs and sitemaps. Each URL submit uses the Bing URL quota and a sitemap submit uses none. A URL or sitemap off the Bing site is not sent; when nothing is on the site, Bing is skipped with reason site_mismatch. After a Bing refusal that would repeat (bing_unauthorized, bing_throttled, bing_unavailable, bing_not_connected), Keytomic sends no more sitemaps to Bing and the reason is stopped (not_connected for bing_not_connected); after another refusal it continues. When no quota is left, Bing is skipped with reason quota_exhausted. An engine the site has not connected is skipped with reason not_connected. A failure of one engine does not stop the other. Spends no credits. Google and Bing read a submit later, so inspect_urls shows no change at once.
Inputs: projectId (required), urls, sitemapUrls.
update_brand_profileUpdate brand profileADestructiveIdempotentInspect
Saves edits to a site’s brand profile, the same as editing the Profile page. Only what the edit names changes. metadata, overview (summary, strengths, weaknesses) and offerPositioning take single fields; metadata.brandColors takes all four colors. brandVoice, audienceProfile and contentGuardrails replace the whole section, so send every field of the section; get_project returns the current values. An audienceProfile edit also sets targetAudience to its primaryAudience, a brandVoice edit sets the overview tone, and an industry edit clears the industry slug so it follows the new name, as the Profile page and setup do. Competitors, the sitemap inventory, screenshots and the Domain Rating are not editable here. An edit must name at least one field. Edits do not change whether the brand profile review is complete. Spends no credits.
Inputs: projectId (required), metadata, overview, brandVoice, +3 more.
update_calendar_topicUpdate calendar topicADestructiveIdempotentInspect
Saves edits to one content calendar topic of a site, the same as editing it in the Calendar. Send only the fields to change; the others keep their values. The scheduled day controls when the daily automation writes the article and, with automatic publishing on, when Keytomic publishes it. The automation writes articles only on the site’s automation days (the settings section of get_project lists them), one topic without an article a day, so a topic on another day gets no article. The review status is a label and does not change the automation. A topic that has an article, or whose article is being written, cannot be edited (topic_has_article). When the workspace can open only some topics for now, only those can be edited (topic_not_in_plan). The primary keyword, the keyword metrics and the article stay as they are. Returns the updated topic. Spends no credits.
Inputs: topicId (required), projectId (required), slug, title, +13 more.
update_draftUpdate draftADestructiveIdempotentInspect
Saves edits to the article of a content calendar topic (its newest draft), the same as saving it in Content Studio. Send only the fields to change: title, slug, seoTitle, seoDescription, contentMarkdown or structuredDataEdit; the others keep their values. contentMarkdown replaces the whole text: read the article with get_draft just before you send it, because the last save wins, and a save made in Content Studio between the two calls is lost. When the text starts with a # heading, that heading is the title: the first heading follows the title on each save (the new title, else the current one), and text without a leading heading stays as it is. Keep each [[youtube:ID]] token and each image URL that stays in the article; an image whose URL is no longer in the text is removed from the article. A slug that another article of the site uses is refused (article_slug_taken). The summary and the hero image cannot be edited here. A text edit of a published article does not change the live page: it keeps the old text until the article is published again. structuredDataEdit replaces the owner’s whole Structured Data Edit, the changes to Keytomic’s structured data (JSON-LD); read it with get_draft just before you send it, because the last save wins. When get_draft gives liveUpdate on_save for the destination, the save also sends the structured data alone to the live WordPress post: the text, the URL and the dates of the post do not change. That send needs the content:publish scope and the user’s publish permission; without them the edit saves, and structuredDataSave.liveError says why the live post did not change. Name destinationId as in get_draft. Returns the updated article, the same as get_draft, and structuredDataSave (liveUpdate, sent, liveError) when the call saved structured data. Spends no credits.
Inputs: topicId (required), projectId (required), slug, title, +5 more.
update_project_settingsUpdate project settingsADestructiveIdempotentInspect
Saves edits to a site’s settings, the same as the Settings page. articleSettings edits the Article Settings: length preset and target word count (a named preset sets its word count; send targetWordCount with lengthPreset custom for an exact count), tone preset, voice instructions, the internal link setting (internalLinks: auto, or off for no internal links), the inline image count, YouTube embeds and the author override. Only the Article Settings the edit names change, YouTube fields included. An author override must be one of the site’s authors while authors are on; otherwise Keytomic clears it and the result says so. indexing.urlPrefix saves the URL prefix of the site’s posts, such as https://acme.com/blog, which Keytomic uses to find the site’s posts for indexing checks; null clears it. The settings section of get_project returns the current values. An edit must name at least one setting. Spends no credits.
Inputs: projectId (required), indexing, articleSettings.
update_reddit_settingsUpdate Reddit settingsADestructiveIdempotentInspect
Saves the Reddit Opportunities settings of a site, the same as "Change topics" on the Reddit Opportunities page: the search topics (1 to topicLimit, from get_reddit_settings), the subreddit filter (empty: all subreddits) and the Agent Mode. Send every value the settings must have; the save replaces them. The next daily scan uses them; this tool starts no scan. A save with topics that are new to the site makes one AI call to write their search phrasings, as in the app. Read the current settings with get_reddit_settings first.
Inputs: topics (required), agentMode (required), projectId (required), subreddits.
update_visibility_promptUpdate AI visibility promptADestructiveIdempotentInspect
Changes one AI Visibility prompt of a site, the same as the prompt edit on the AI Visibility page. Pass text with expectedRevision (the revision from get_visibility) to edit the text, or state (active, paused or archived) to change the state, never both. Keytomic keeps or sets the topic and sets the prompt type of an edited text. A text edit of an Active prompt that changes the text or the prompt type makes a new prompt with a new promptId and archives the old one, which keeps its answers: use the promptId of the result in later calls. A text edit of a prompt that is not Archived and that changes neither, and a state change to the state the prompt already has (archived to archived too), change nothing and succeed. An Archived prompt cannot change otherwise. Refusals: prompt_revision_conflict (a change of an Archived prompt, or a text edit with an old expectedRevision that changes the text or the prompt type), active_prompt_limit_reached (making a prompt Active past the plan’s Active limit), prompt_duplicate (the new text is already saved for the market), saved_prompt_limit_reached, prompt_not_found (no such prompt in the market) and check_running (a check runs now). It starts no check.
Inputs: promptId (required), projectId (required), text, state, +1 more.
update_visibility_settingsUpdate AI visibility settingsADestructiveIdempotentInspect
Saves the AI Visibility settings of a site, the same as the settings on the AI Visibility page: the AI platforms to check and the UTC run days. Send every value the settings must have; the save replaces them. Both must fit the limits of the plan (the overview section of get_visibility), else the call gives tier_limit_exceeded. The save also makes sure the site has its check schedule. It starts no check.
Inputs: runDays (required), projectId (required), enabledPlatforms (required).
watch_auditWatch SEO AuditARead-onlyInspect
Follows an SEO Audit of a site, by default the latest, and streams each change as a progress message: crawl milestones, the end of the crawl, each category as it starts and finishes with what it found, and a heartbeat that says what is still running. It returns within seconds of a real change (the crawl finished, a stage changed or a category finished), when the audit ends, or after maxWaitSeconds. While the audit runs, the result is only what changed in this call: updates (the lines to tell the user), changedCategories and the run state. Once it ends, the text holds the full picture (each finished category with its checks and top issues, then the final summary), and the structured result holds the categories and the summary, as get_audit returns it: with the Website Health score, each category’s Category Health score and each Report Area’s Area Health score (score, band and the reason when there is none; for an area also the PageSpeed strategy behind the Performance score and its check counts), without the deductions, policy or coverage behind them. An area has no weight and feeds no other score. Tell the user what changed, then call watch_audit again with the since value from this result until the status is completed, partial, failed or cancelled. Use it after start_audit.
Inputs: projectId (required), runId, since, maxWaitSeconds.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityCmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs112 npm29 PyPIMIT
- AlicenseAqualityDmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.169 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityCmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.