Docs / Bring your own agent
Wavefront MCP tool catalog
251 tools across 15 modules. External (bring-your-own-agent) clients see the essential profile by default: the 40 tools marked "essential" below, covering the core loop (orient -> plan -> brief -> draft -> validate -> images -> publish -> measure). Append ?tools=all to the MCP endpoint URL to list the full external catalog (up to 223 tools). Either way, internal modules are hidden from tools/list and each caller only sees tools at or below their role (viewer < writer < admin). Hidden tools remain callable when the role allows; tools/call always enforces the role, never the profile.
Deliberately NOT exposed as tools: markdown-to-richtext conversion and CMS asset upload. Both run inside the publish_draft workflow (QC gate -> image upload -> richtext -> entry upsert -> publish) so agents cannot produce half-published entries.
Legend: role is the minimum org capability; access is the MCP readOnlyHint; essential tools are in the default external profile; internal modules are agent-runner plumbing invisible to external clients.
Read & search (read, 31 tools)
Workspace context, rules, calendar, briefs, drafts, keywords, published content, and settings reads.
get_agent_context(viewer · read-only · essential)
Bootstrap context for a fresh agent: the master workflow (CLAUDE.md), key constants, and how to use this server. Call this first.
- (no parameters)
get_generation_rules(viewer · read-only · essential)
Return the enabled prompt instructions an agent must follow before writing, optionally filtered by content/resource type.
resourceType(string) — e.g. Guides, Industries, Insights
list_rules(viewer · read-only)
List all enabled rules (voice/SEO/formatting/etc.) with their prompt + validation config.
- (no parameters)
get_rule(viewer · read-only)
Get a single rule with its current definition by rule id.
ruleId(string, required)
list_strategy_docs(viewer · read-only)
List strategy/playbook documents (and other doc types via filter).
docType(string) — strategy|playbook|config|calendar_doc|keyword_doclimit(number)
get_strategy_doc(viewer · read-only)
Get a strategy/playbook document by id (full markdown).
id(string, required)
get_document(viewer · read-only)
Get any document by id (strategy, rule source, brief, draft, calendar/keyword doc, config).
id(string)documentId(string) — alias for id
search_knowledge(viewer · read-only · essential)
Full-text search across strategy docs, briefs, drafts, and rules.
query(string, required)docType(string)limit(number)
get_calendar(viewer · read-only · essential)
Get editorial calendar entries with filters (stream, status, phase, date range).
stream(string) — editorial|stat-snapshot|wavemaker|waverunnerstatus(string)phase(string)fromDate(string) — YYYY-MM-DDtoDate(string) — YYYY-MM-DDlimit(number)offset(number)
get_calendar_entry(viewer · read-only)
Get a single calendar entry by id.
id(string, required)
get_next_unwritten(viewer · read-only · essential)
Get the next planned, unwritten calendar item (the 'next to write').
stream(string)
list_briefs(viewer · read-only · essential)
List content briefs.
limit(number)offset(number)
get_brief(viewer · read-only · essential)
Get a brief by document id (full markdown).
id(string, required)
list_drafts(viewer · read-only · essential)
List drafts with status and validation score.
status(string)limit(number)offset(number)
get_draft(viewer · read-only · essential)
Get a draft (markdown + frontmatter + image manifest).
id(string)documentId(string) — alias for id
get_draft_versions(viewer · read-only)
List version history for a draft/document.
documentId(string, required)
diff_draft_versions(viewer · read-only)
Diff two document versions (by version id).
fromVersionId(string, required)toVersionId(string, required)
list_keywords(viewer · read-only)
List/search tracked keywords by status, phase, or text.
q(string)status(string)phase(string)limit(number)
check_keyword(viewer · read-only · essential)
Cannibalization gate: is a keyword/topic already targeted or reserved?
keyword(string, required)
check_outrank_boundary(viewer · read-only)
Classify a topic as Adwave (paid advertising) vs Outrank (organic/owned) ownership.
topic(string, required)
list_authors(viewer · read-only)
List authors (Contentful Person entries) with target shares.
- (no parameters)
check_slug(viewer · read-only · essential)
Check whether a slug is available in the DB and in Contentful.
slug(string, required)
get_sitemap(viewer · read-only)
Get the cached site URL list (for internal link verification).
- (no parameters)
verify_internal_links(viewer · read-only · essential)
Check a markdown body's internal links against the cached sitemap and forbidden patterns.
markdown(string, required)
validate_against_content_model(viewer · read-only)
Validate resourceType/industryType/subindustryType against the live Contentful enums.
resourceType(string)industryType(string)subindustryType(string)
get_published_entry(viewer · read-only)
Fetch a published Contentful resource entry by slug (production).
slug(string, required)
get_published_markdown(viewer · read-only)
Fetch a live published entry by slug and convert its body to markdown (for diffing against the local draft). CMS credentials stay on this worker.
slug(string, required)
list_published_by_type(viewer · read-only)
List published content entries (from the synced DB mirror) by resource type.
resourceType(string)limit(number)
search_published_entries(viewer · read-only)
Search published content entries by slug substring (DB mirror).
q(string, required)limit(number)
get_settings(viewer · read-only · essential)
Get per-org settings (current year, brand colors, etc.).
- (no parameters)
list_audit_log(viewer · read-only)
List recent audit log entries (who did what).
limit(number)targetId(string)
Write & edit (write, 23 tools)
Create/update strategy docs, rules, calendar entries, keywords, briefs, drafts, and workspace documents (versioned, conflict-checked).
create_strategy_doc(writer · write)
Create a strategy/playbook document.
path(string, required)title(string, required)bodyMarkdown(string, required)
update_strategy_doc(writer · write)
Update a strategy/playbook document (re-versioned; pass baseVersionId for safe concurrency).
documentId(string, required)bodyMarkdown(string)title(string)baseVersionId(string)changeSummary(string)
create_rule(admin · write)
Create a content rule (prompt instruction and/or validation).
category(string, required)name(string, required)type(string, required) — prompt_instruction|validation_check|bothpriority(number)promptInstruction(string)validationType(string)validationConfig(object)validationMessage(string)appliesTo(string)
update_rule(admin · write)
Update a rule (re-versions; changes generation + validation atomically). Edit prompts here. type switches the rule between prompt_instruction / validation_check / both.
ruleId(string, required)type(string) — prompt_instruction|validation_check|bothpromptInstruction(string)validationType(string)validationConfig(object)validationMessage(string)priority(number)enabled(boolean)changeSummary(string)
create_calendar_entry(writer · write)
Add an editorial calendar entry.
title(string, required)plannedDate(string)slug(string)resourceType(string)phase(string)funnelStage(string)strategy(string)strategyId(string)stream(string)status(string)notes(string)
update_calendar_entry(writer · write)
Update a calendar entry by id.
id(string, required)title(string)status(string)plannedDate(string)slug(string)resourceType(string)phase(string)notes(string)
move_calendar_entry(writer · write)
Reschedule a calendar entry to a new date.
id(string, required)plannedDate(string, required)
add_keyword(writer · write)
Add a keyword to tracking.
keyword(string, required)phase(string)status(string)cluster(string)owner(string)notes(string)
reserve_keyword(writer · write)
Reserve a keyword (e.g. planned/Outrank cluster).
keyword(string, required)documentId(string)
mark_keyword_targeted(writer · write)
Mark a keyword as targeted by a specific draft/article.
keyword(string, required)documentId(string)
create_brief(writer · write · essential)
Create a content brief.
title(string, required)slug(string, required)bodyMarkdown(string, required)
update_brief(writer · write)
Update a brief by document id.
documentId(string, required)bodyMarkdown(string)title(string)baseVersionId(string)
create_draft(writer · write · essential)
Create a new draft article (markdown + frontmatter).
title(string, required)slug(string, required)bodyMarkdown(string, required)resourceType(string)seoDescription(string)shortDescription(string)primaryKeyword(string)
update_draft(writer · write · essential)
Update a draft. Pass baseVersionId for optimistic concurrency; on conflict returns a diff. Respects edit locks. frontmatter is a MERGE patch: keys are merged into the existing frontmatter, and a null value deletes the key.
documentId(string, required)bodyMarkdown(string)title(string)status(string)baseVersionId(string)changeSummary(string)frontmatter(object)
archive_draft(writer · write)
Archive a draft (soft delete).
documentId(string, required)
revert_draft(writer · write)
Revert a document to a previous version id.
documentId(string, required)toVersionId(string, required)
lock_draft(writer · write)
Acquire an edit lock on a draft (advisory, TTL ~15min).
documentId(string, required)ttlMs(number)
unlock_draft(writer · write)
Release an edit lock on a draft.
documentId(string, required)
create_document(writer · write)
Create a workspace document. Prefer docType 'playbook' (a Knowledge doc: reference material the assistant reads on demand) or 'config' (workspace instructions, always loaded; admin only). Legacy types strategy/brief/calendar_doc/keyword_doc are still accepted and render under Knowledge. Path is auto-generated from the title when omitted and de-duplicated.
docType(string, required)title(string, required)bodyMarkdown(string, required)path(string)
update_document(writer · write)
Update any workspace document (title and/or body; re-versioned). Pass baseVersionId for safe concurrency. Editing config documents requires the admin role.
documentId(string, required)title(string)bodyMarkdown(string)baseVersionId(string)changeSummary(string)
archive_document(writer · write)
Archive any workspace document (soft delete).
documentId(string, required)
revert_document(writer · write)
Restore a workspace document to a previous version (creates a new version with that content).
documentId(string, required)toVersionId(string, required)
update_settings(admin · write)
Update a per-org setting (e.g. currentYear, brandColors).
key(string, required)value(any, required)
Content pipeline (pipeline, 21 tools)
Image generation/upload, draft generation, validation, authorship, tables, and publishing workflows.
generate_image_prompt(viewer · read-only)
Build a brand-compliant image prompt (scrapbook style, palette, hook text rules).
scene(string, required)overlays(string)hookText(string)resourceType(string)
generate_image(writer · write · essential)
Generate a new image with Gemini, store it in R2, and attach it to a draft.
prompt(string, required)documentId(string)filename(string, required) — e.g. hero.png, body1.pngrole(string) — hero|body|chart|seo
generate_image_async(writer · write)
Generate an image via the durable image workflow (retriable). Returns a run id; poll with get_publish_status.
prompt(string, required)documentId(string)filename(string, required)role(string)
edit_image(writer · write)
Edit an existing image asset with Gemini and save as a new asset.
assetId(string, required)prompt(string, required)filename(string)
upload_image(writer · write · essential)
Upload your own image (e.g. a real product screenshot) as an asset and optionally attach it to a draft. Provide either base64+mimeType or a public https url to fetch (private/loopback hosts are rejected). Allowed types: png, jpeg, webp, gif; max 5MB. Re-uploading identical bytes to the same draft returns the existing asset (idempotent). Uploads do not count against the image-generation quota.
base64(string) — base64-encoded image bytes (no data: prefix)mimeType(string) — required with base64, e.g. image/pngurl(string) — https URL to fetch the image from (alternative to base64)documentId(string) — draft to attach the asset tofilename(string, required) — e.g. dashboard-screenshot.pngrole(string) — hero|body|chart|seo (default body)altText(string) — alt text for the image
set_image_alt(writer · write)
Set alt text on an image asset.
assetId(string, required)altText(string, required)
list_draft_images(viewer · read-only · essential)
List images attached to a draft.
documentId(string, required)
remove_image(writer · write)
Detach/remove an image asset (DB row; R2 object retained for safety).
assetId(string, required)
generate_draft(writer · write · essential)
Write a full article draft with the platform LLM from a topic (or brief) and save it as a draft. Returns the documentId + suggested image scenes. Add images (generate_image) and validate before publishing, or use generate_article for the full autonomous pipeline.
topic(string, required)resourceType(string)briefId(string)primaryKeyword(string)
generate_article(writer · write)
Autonomously write a full article via the agent runner: draft -> QC validate -> (optional) publish when validation passes. Dispatches a background agent run; track it via list_agent_runs / get_agent_run.
topic(string)resourceType(string)calendarEntryId(string)briefId(string)primaryKeyword(string)autoPublish(boolean)target(string) — staging|production
validate_draft(writer · write · essential)
Run the full QC rules engine on a draft; persists score + violations. Call before publish.
documentId(string, required)
assign_author(writer · write)
Choose an author for a draft (deterministic mapping + recent-history balancing).
documentId(string, required)
set_author(writer · write)
Manually set a draft's author by Contentful Person entry id (override).
documentId(string, required)personEntryId(string, required)
attach_image_to_draft(writer · write)
Attach an existing image asset to a draft (sets its document_id and role).
assetId(string, required)documentId(string, required)role(string)
create_table_entry(writer · write)
Create + publish a Contentful table entry from markdown.
title(string, required)tableMarkdown(string, required)target(string) — staging|production
repair_draft(writer · write)
Dispatch an agent run that fixes a draft's failing QC checks in place (one draft only, no publish). The run edits the draft, the platform re-validates it, and the result lands as a reviewable changeset. Returns queued:true; track via list_agent_runs.
documentId(string, required)
publish_draft(writer · write · essential)
Publish a draft via the durable publish workflow (QC validate gate -> images -> richtext -> tables -> upsert entry -> author -> publish). Blocks on QC failures unless force=true. Returns a run id; poll get_publish_status.
documentId(string, required)target(string) — staging|productionforce(boolean) — skip the QC gate
get_publish_status(viewer · read-only · essential)
Get the status of a publish (or other) workflow run.
runId(string, required)
promote_to_production(admin · write)
Publish a draft directly to the production Contentful environment.
documentId(string, required)
update_published_entry(writer · write · essential)
Re-publish a draft's changes to an existing live entry. Detects direct human edits in Contentful first.
documentId(string, required)slug(string, required)force(boolean)
import_published_to_draft(writer · write)
Reconstruct an editable draft (markdown + frontmatter) from a live Contentful entry id, so existing articles can be edited via MCP.
entryId(string, required)createDraft(boolean)
Maintenance & research (maintenance, 12 tools)
Sitemap refresh, link/meta audits, scraping, web search, and social post generation/publishing.
refresh_sitemap(writer · write)
Re-fetch the site's sitemap into the cache (for internal-link verification).
- (no parameters)
find_duplicates(viewer · read-only)
Find duplicate slugs in published content entries (cannibalization guardrail).
- (no parameters)
audit_internal_links(viewer · read-only)
Audit a draft's internal links (or all drafts) against the cached sitemap.
documentId(string)
audit_stats_sourcing(viewer · read-only)
Flag statistics (numbers/percentages) in a draft that lack a nearby source link.
documentId(string, required)
generate_h1(viewer · read-only)
Generate H1 candidates for a draft from its title + resource type.
documentId(string, required)
audit_meta_descriptions(viewer · read-only)
Find drafts missing or with duplicate seoDescription.
- (no parameters)
update_resource_date(writer · write)
Update a draft's resourceDate in frontmatter.
documentId(string, required)resourceDate(string, required) — YYYY-MM-DD
scrape_url(viewer · read-only · essential)
Scrape a URL to markdown (Firecrawl) for research/sourcing. Metered (credits + monthly scrape quota).
url(string, required)
web_search(viewer · read-only · essential)
Web search via Firecrawl (for sourcing statistics). Metered (credits + monthly scrape quota).
query(string, required)limit(number)
generate_social_posts(viewer · read-only)
Generate platform social posts + image prompts from a draft.
documentId(string, required)
get_social_status(viewer · read-only)
Social publishing (Ayrshare) status for this workspace: whether the credential is set, which optional pieces it includes (profile key, X BYO keys), and — with probe=true — a live check against Ayrshare returning the linked social networks, messaging enablement, and post quota. Never returns secret material.
probe(boolean) — call Ayrshare's /user endpoint for live account status
publish_social(writer · write)
Publish (or schedule) social posts for a document via Ayrshare. DRY RUN BY DEFAULT: without live=true it returns the exact payloads and calls no API. posts maps platform (facebook|instagram|linkedin|twitter; "x" is accepted as an alias for twitter) to post text (use generate_social_posts for copy). Idempotent: each post carries a <slug>-<platform> key so re-running live cannot double-post (allowRepost=true for an intentional repost). Requires the org's ayrshare credential (set_org_credential, JSON: {apiKey, profileKey?, xApiKey?, xApiSecret?}); posting to twitter additionally requires the BYO X keys in that credential.
documentId(string, required) — draft or imported doc; its slug prefixes the idempotency keysposts(object, required) — platform -> post text, e.g. {"linkedin": "...", "twitter": "..."}assetIds(array) — image assets to attach; minted as public URLs (requires APP_BASE_URL)live(boolean) — actually publish (default false = dry run)scheduleDate(string) — UTC YYYY-MM-DDThh:mm:ssZ to schedule instead of posting nowallowRepost(boolean) — omit idempotency keys for an intentional repost
Workspace admin (admin, 37 tools)
Credentials, CMS connections, members, brand kit, Google connections, billing, templates, autopilot, and token management.
set_org_credential(admin · write)
Store an encrypted per-org credential (multi-tenant). kind = contentful|gemini|firecrawl|ayrshare. ayrshare is a JSON blob {apiKey, profileKey?, xApiKey?, xApiSecret?} used by publish_social. The LLM is platform-hosted (metered in credits), so there is no per-org LLM key. Requires CREDENTIALS_MASTER_KEY.
kind(string, required)value(string, required)
list_cms_connections(viewer · read-only)
List the org's configured CMS publishing targets (Contentful, WordPress, Webflow, Ghost, Shopify, HubSpot, Sanity, Strapi, webhook, markdown/git).
- (no parameters)
set_cms_connection(admin · write)
Create/update a CMS publishing target. provider = contentful|wordpress|webflow|webhook|markdown_git|ghost|shopify|hubspot|sanity|strapi. config holds provider fields (URLs/tokens; friendly key names are normalized) and is stored encrypted. The connection is live-tested on save; the test result is returned. Requires CREDENTIALS_MASTER_KEY.
name(string, required)provider(string, required)config(object, required)isDefault(boolean)
delete_cms_connection(admin · write)
Delete a CMS publishing target. Published entries keep their provenance (connection_id) but can no longer be re-published or unpublished through this connection.
connectionId(string, required)
test_cms_connection(admin · read-only)
Live-test a CMS connection (auth + permission probe against the real target). Pass connectionId for a saved connection, or provider+config to test before saving.
connectionId(string)provider(string)config(object)
publish_to_cms(writer · write)
Publish a draft to the org's configured CMS target via the adapter pipeline (canonical markdown cleanup, public image URLs, provider upsert). Use for non-Contentful targets. target = staging|production.
documentId(string, required)target(string) — staging|productionconnectionId(string)force(boolean) — skip the QC gate
unpublish_content(writer · write)
Take a published entry offline in its CMS (revert to draft / unpublish in the provider it was published with), mark it archived here, and emit content.unpublished to webhook subscribers.
slug(string, required)target(string) — staging|production (default production)
list_members(viewer · read-only)
List the members of the current org and their roles.
- (no parameters)
list_invitations(admin · read-only)
List pending/accepted invitations for the current org.
- (no parameters)
invite_member(admin · write)
Invite a teammate to the current org by email with a role (owner|admin|member|billing|viewer). Emails the invite link if Resend is configured.
email(string, required)role(string)
set_member_role(admin · write)
Change a member's role in the current org. Cannot remove the last owner.
email(string, required)role(string, required)
remove_member(admin · write)
Remove a member from the current org (revokes access). Cannot remove the last owner.
email(string, required)
revoke_invitation(admin · write)
Revoke a PENDING invitation by id (from list_invitations / the Members page): the emailed link stops working immediately. Accepted invitations cannot be revoked; remove the member instead.
invitationId(string, required)
upsert_author(admin · write)
Add or update a roster author (upsert by key; on update, OMITTED optional fields keep their stored values and explicit null clears). Authors drive automatic byline assignment: deterministic content-type rules first, then balancing against targetShare (0-1; authors without a share split the remainder). personEntryId is the CMS Person entry published articles link to.
key(string, required) — stable roster key, e.g. janeDoename(string, required)personEntryId(string, required) — CMS Person entry idroleTitle(string)targetShare(number) — 0-1
remove_author(admin · write)
Remove a roster author by key. Published entries keep their historical byline; only future assignment stops considering this author.
key(string, required)
delete_workspace(admin · write)
PERMANENTLY delete this entire workspace: all documents, drafts, keywords, calendar, published-entry records, settings, members, and Link Network participation (partner escrow is settled first). Irreversible. Requires the caller to be an org owner/admin AND confirm must equal the workspace slug. Export first via Settings -> Advanced.
confirm(string, required) — the workspace slug, exactly
get_brand_profile(viewer · read-only · essential)
Get the org's brand kit (voice, banned competitors, palette, image style, word counts, product name).
- (no parameters)
set_brand_profile(admin · write)
Update the org's brand kit. profile is a partial BrandProfile (e.g. productName, brandColors, bannedCompetitors, aiTelltaleWords, wordCountTargets, imageStyle); omitted fields keep their current value.
profile(object, required)
learn_brand_from_url(admin · write)
Infer brand basics (product name, palette) from a website and merge them into the org's brand kit. Only fills fields still at their generic defaults - it never overwrites a customized product name or palette (pass overwrite=true to replace them). Returns the inferred fields for review.
url(string, required)apply(boolean) — save the inferred fields (default true)overwrite(boolean) — replace already-customized fields (default false)
get_site_base_url(viewer · read-only)
Get the org's primary site URL (the public site this workspace writes for), or null when unset. This is the org's own value; the platform default is never returned.
- (no parameters)
set_site_base_url(admin · write)
Set the org's primary site URL. Powers sitemap/internal-link checks and rank tracking. One domain per workspace (use a separate workspace for a second site). Must be a public https URL; it is normalized to its origin (path/query dropped). Pass an empty string to clear the domain. Audited.
url(string, required) — e.g. https://example.com (empty string clears)
set_google_connection(admin · write)
Store the org's Google connection (offline refresh token + selected Search Console property and/or GA4 property) for SEO + traffic data ingestion. Stored encrypted. Requires CREDENTIALS_MASTER_KEY.
refreshToken(string, required)propertyUrl(string)gaPropertyId(string) — GA4 property, e.g. properties/123456789
start_google_connect(admin · write)
Build the Google consent URL for connecting Search Console + Analytics (offline access + webmasters.readonly + analytics.readonly). Returns { url } to redirect the user to.
redirectUri(string, required)state(string, required)
finish_google_connect(admin · write)
Exchange a Google OAuth code, auto-select a verified Search Console property and the first GA4 property, store the connection (encrypted), and backfill recent history (last ~90 days of Search Console + GA4) so dashboards are useful immediately. Used by the dashboard connect flow.
code(string, required)redirectUri(string, required)
get_billing(viewer · read-only · essential)
Current plan, subscription status, and this month's usage vs limits for the org.
- (no parameters)
list_mcp_tokens(admin · read-only)
List the org's active external MCP (bring-your-own-agent) access tokens: which user/client connected, when, and when they expire. Tokens themselves are never returned.
- (no parameters)
revoke_mcp_token(admin · write)
Revoke an external MCP access token by its token_id prefix (from list_mcp_tokens). Also revokes its refresh token.
tokenId(string, required) — 8-char token_id prefix
list_content_templates(viewer · read-only)
List this org's content templates: the editorial contract per resource type (word counts, image/link minimums, QC checklist, structure, linked-entry recipes, brief scaffold). Read the matching template before writing content.
- (no parameters)
get_content_template(viewer · read-only)
Get the content template governing a resource type (or null).
resourceType(string, required)
set_content_template(admin · write)
Create/update a content template (upsert by resourceType+name). qcChecklist/structure are string arrays; linkedEntryRecipes configures target-native entries (e.g. the stat-snapshot statisticGroup).
resourceType(string, required)name(string, required)description(string)wordCountMin(number)wordCountMax(number)minImages(number)minInternalLinks(number)yearDated(boolean)qcChecklist(array)structure(array)linkedEntryRecipes(object)briefTemplate(string)
propose_content_templates(admin · read-only)
Draft an editorial contract for every resource type in use without a content template, grounded in the brand profile and sample titles from the calendar/entries. Returns proposals only (recommend create|skip + full template fields); apply accepted ones with set_content_template, dismiss junk with ignore_resource_type.
- (no parameters)
ignore_resource_type(admin · write)
Mark a resource type as not-a-content-type (e.g. 'PDF' imported from a calendar column) so it stops appearing in missing-contract nudges. ignored=false un-ignores it. Returns the remaining uncovered types.
resourceType(string, required)ignored(boolean) — Default true.
set_credit_ceiling(admin · write)
Set the org's runaway spend ceiling as a multiple of its included monthly credits (paid plans; default 5x). Owner/admin only.
multiplier(number, required)
get_autopilot(viewer · read-only)
Get the org's autopilot settings (enabled, cadence, auto-publish vs review, target).
- (no parameters)
set_autopilot(admin · write)
Configure autopilot: when enabled, the hourly scheduler writes due calendar entries automatically. autoPublish=false routes drafts to review. target = staging|production.
enabled(boolean)postsPerRun(number)autoPublish(boolean)target(string) — staging|productionconnectionId(string)
rotate_feed_token(admin · write)
Generate (or rotate) the org's distribution token gating the public RSS/JSON feeds and the read-only content API. Rotating revokes the previous token immediately.
- (no parameters)
get_metering(admin · read-only)
Usage metering for the org (publishes + images generated) over recent workflow runs.
days(number)
Planning workflow (workflow, 3 tools)
Topic suggestion, article pre-flight planning, and calendar scheduling.
suggest_topics(viewer · read-only · essential)
Come up with new posts: returns calendar items scheduled but not yet drafted, plus available (untargeted) keywords worth writing.
limit(number)phase(string)
plan_article(viewer · read-only · essential)
Pre-flight a new article in one call: cannibalization check, Outrank boundary, slug availability (DB + Contentful), word-count target, year-dating, suggested author, matching briefs, and a go/caution/stop verdict. Call this before create_draft.
topic(string, required)resourceType(string)slug(string)
schedule_article(writer · write · essential)
Schedule a draft on the editorial calendar: links the draft to a calendar slot (creating or updating it) with a planned date and status. Publishing later auto-marks the slot published.
documentId(string, required)plannedDate(string) — YYYY-MM-DDstatus(string)
SEO & analytics (seo, 17 tools)
Search Console/GA4 performance, keyword intelligence, GEO audits, AI visibility, and rank snapshots.
get_site_performance(viewer · read-only · essential)
Owned-site search performance from Google Search Console: top queries by clicks over the last N days (default 28).
days(number)limit(number)
get_striking_distance(viewer · read-only · essential)
Queries ranking just off page one (default positions 5-20) with real impressions: the highest-leverage optimization targets.
days(number)minPosition(number)maxPosition(number)limit(number)
get_content_decay(viewer · read-only)
Pages whose clicks dropped between the prior and recent windows (default 56-day window split at the midpoint). Refresh candidates.
days(number)limit(number)
get_top_pages(viewer · read-only)
Owned-site traffic from Google Analytics (GA4): top pages by sessions, with conversions (key events) and users, over the last N days (default 28). Shows what content actually drives traffic, not just rankings.
days(number)limit(number)
list_keyword_clusters(viewer · read-only)
List the org's keyword clusters/pillars (from the SEO strategy).
- (no parameters)
get_rank_snapshots(viewer · read-only)
The org's rank snapshot history, oldest-first (default last 12): trailing-28-day Search Console aggregate (impression-weighted avg position, clicks, impressions, ranked queries) plus the AI-visibility probe score (0-100; share of brand-category questions where the utility LLM mentioned the brand - a model-panel proxy, not production ChatGPT behavior). Snapshots are taken every Monday and via run_rank_snapshot.
limit(number) — default 12, max 104
list_keyword_opportunities(viewer · read-only · essential)
The keyword priority queue: available keywords ordered by opportunity score (striking distance + CTR gap + demand from the org's own Search Console data, plus vendor volume/difficulty when enriched), and GSC queries the site already ranks for that no tracked keyword covers (free discovery; track them with add_keyword). Scores refresh nightly.
limit(number) — default 25, max 100
enrich_keywords(writer · write)
Pull search volume, keyword difficulty, CPC, search intent, and SERP features (incl. AI Overview presence) from the platform's SEO data vendor onto the org's tracked keywords, then recompute opportunity scores. Skips keywords refreshed in the last ~25 days. Paid-plan feature; spend is metered in credits.
limit(number) — max keywords to refresh (default 2000)
discover_keywords(writer · write)
Expand a seed keyword into related keywords via the platform's SEO data vendor, cannibalization-check each candidate against the registry, and return the survivors (with conflict labels on the rest). Track winners with add_keyword. Paid-plan feature; spend is metered in credits.
seed(string, required) — seed keyword to expandlimit(number) — default 25, max 100
run_geo_audit(writer · write)
GEO technical audit ('retrieval before citation'): checks robots.txt for AI-crawler blocks (OAI-SearchBot, GPTBot, PerplexityBot, ClaudeBot, Google-Extended), fetches a sample published page with RAW fetch (no JS rendering) to verify content is server-rendered, and checks for Article/FAQPage/Organization JSON-LD, author bylines, and dates. Reports llms.txt presence honestly (optional infrastructure, not a citation lever). Result is persisted for the dashboard.
sampleUrl(string) — specific page to audit (defaults to the latest published entry)
get_geo_audit(viewer · read-only)
The most recent GEO technical audit result (run_geo_audit to refresh), or null when never run.
- (no parameters)
generate_llms_txt(viewer · read-only)
Generate an llms.txt file from the org's published content catalog (site summary + links grouped by resource type), ready to host at /llms.txt. Honest framing: AI retrieval bots rarely read this file and it does NOT affect AI-search citations; it's cheap infrastructure for coding agents and tool consumers.
description(string) — one-line site description for the file header
get_ai_prompts(viewer · read-only)
The org's KEYWORD golden prompts (buyer questions scanned weekly across AI engines). Auto-seeded from the highest-opportunity + targeted keywords until a custom set is saved with set_ai_prompts. The typed brand/comparison/best-for battery is separate: list_battery_prompts / set_battery_prompt. Both run in every scan, battery first.
- (no parameters)
set_ai_prompts(writer · write)
Save a custom AI-visibility prompt set (max 30). Each prompt: {keyword, question, intent: recommendation|comparison|problem}. Pass an empty array to revert to auto-seeding from keywords.
prompts(array, required) — [{keyword, question, intent}]
run_ai_visibility_scan(writer · write)
Run the AI-visibility scan now (also runs weekly): the typed prompt battery first (brand/comparison/best-for/category probes with hedging-aware recommendation classification and, for brand prompts, the wrong-vs-missing diagnosis against the canonical description), then the keyword golden prompts in the remaining budget. Records mentioned/cited/recommended, competitor share-of-voice, sentiment, hedge excerpts, and fires business-critical regression alerts when an endorsed prompt stays non-endorsed for two consecutive scans. engine 'proxy-llm' (default) is a model-panel proxy on metered platform-LLM credits; engine 'perplexity' performs live web retrieval with real citation URLs (paid plans; metered per request).
engine(string) — proxy-llm (default) | perplexity
get_ai_visibility(viewer · read-only · essential)
Keyword-level AI-visibility results (latest first) with the scan-over-scan trend per engine and deterministic guidance (e.g. mentioned-but-never-cited = extractability gap). Per keyword and engine: mentioned, cited, recommended, competitor mentions, sentiment. Filter by keyword or engine.
keyword(string)engine(string)limit(number) — default 200
run_rank_snapshot(writer · write)
Take a rank snapshot now: trailing-28-day Search Console aggregate plus the AI-visibility probe (up to 8 utility-LLM questions built from top queries/targeted keywords). Upserts today's row (idempotent with the Monday cron). The Search Console half runs even without an LLM; the probe needs the platform LLM and available credits.
- (no parameters)
Growth strategy (strategy, 7 tools)
SEO strategy generation, content plans, growth review, and proposal QC.
generate_seo_strategy(writer · write)
Generate an SEO strategy with the strategy-tier LLM (frontier reasoning model; falls back to the utility LLM): keyword clusters/pillars + a prioritized topic list, grounded in brand context and owned-site Search Console performance. Persists the clusters and returns topics to review (use propose_content_plan to schedule them).
goal(string)maxTopics(number)days(number)strategyId(string)
propose_content_plan(writer · write)
Turn strategy topics into a dated content calendar for review (entries created with status 'idea'). Approve with approve_content_plan to make them autopilot-ready.
topics(array, required)startDate(string) — YYYY-MM-DDcadenceDays(number)strategyId(string)
run_growth_review(writer · write · essential)
Run the Growth Review now with the strategy-tier LLM: turn Search Console findings (striking-distance queries, decaying pages), GA4 findings (traffic-but-no-conversion pages), and the quarterly stat-refresh queue into capped, deduped proposals in the review queue (calendar status 'idea', evidence in notes). Runs automatically every Monday. Implement a proposal with implement_proposal (immediate agent run) or approve_content_plan (scheduled autopilot).
maxProposals(number) — cap, default 5, max 10
list_growth_proposals(viewer · read-only · essential)
List review-queue proposals (calendar entries with status 'idea'), each with its growth-review rationale, evidence line, refresh slug (when it updates an existing article), and QC verdict. Use before implement_proposal / approve_content_plan.
limit(number) — default 20, max 100
implement_proposal(writer · write · essential)
One-click implement a review-queue proposal: claims the calendar entry and immediately dispatches an agent run that writes (or refreshes) the article, carrying the proposal's evidence. The run lands as a reviewable changeset; track it via list_agent_runs. Use approve_content_plan instead to leave it for scheduled autopilot.
entryId(string, required)autoPublish(boolean) — publish automatically if validation passestarget(string) — staging|production
run_proposal_qc(writer · write)
Run automated QC on review-queue proposals (calendar entries with status 'idea'): deterministic checks (cannibalization, duplicate titles, title hygiene, year-dating, banned competitors, content boundary, evidence) plus AI checks (copy quality, strategy alignment, audience fit). Upserts a pass/warn/fail verdict per entry that the review queue shows next to Approve. Pass entryIds to QC specific proposals; omit to QC all pending.
entryIds(array)limit(number) — max entries per run, default 25, max 50
approve_content_plan(writer · write)
Approve proposed calendar entries (status idea -> planned) so the autopilot scheduler will write them. Pass the entry ids to approve.
entryIds(array, required)
Strategy containers (strategies, 4 tools)
Content strategy container CRUD (stream, cadence, CMS target).
list_strategies(viewer · read-only)
List the org's content strategies (the first-class containers that own calendar entries, keywords, and clusters). Use this to find a strategy id before reading or editing it.
- (no parameters)
get_strategy(viewer · read-only)
Get one strategy with its health overview: status counts (idea/planned/published/etc.), cluster + keyword counts.
id(string, required) — strategy id
create_strategy(writer · write)
Create a new content strategy. A strategy holds a goal, a markdown narrative, a cadence, and a default CMS target, and owns one stream (editorial|stat-snapshot|wavemaker|waverunner).
name(string, required)goal(string) — one-line objectivenarrative(string) — markdown describing the strategystream(string) — editorial|stat-snapshot|wavemaker|waverunnercadenceDays(number) — days between postscmsConnectionId(string) — default publish target connection iddefaultResourceTypes(array)
update_strategy(writer · write)
Update a strategy's goal, narrative, cadence, status, default CMS target, default resource types, or autopilot override ({autopilot:{autoPublish,target}} in settings). This is how the assistant articulates and refines the strategy the user sees.
id(string, required)name(string)goal(string)narrative(string)status(string) — active|paused|archivedcadenceDays(number)cmsConnectionId(string)defaultResourceTypes(array)settings(object) — Merged into strategy settings; e.g. {autopilot:{autoPublish:true,target:'production'}}
Agent runner (internal) (agent, 28 tools)
Workspace snapshots, changesets, run lifecycle, leases, approvals, and session/conversation stores driven by the hosted agent runner.
Internal module: hidden from external clients' tools/list.
export_workspace(viewer · read-only · internal)
Export this org's documents as a materializable file list (path, docType, title, version, content). The agent runner writes these to a working directory.
- (no parameters)
export_workspace_paths(viewer · read-only · internal)
Export only the given document paths (warm-cache delta fetch).
paths(array, required)
list_workspace_versions(viewer · read-only · internal)
List path -> current version id for all documents (cheap; for warm-cache reconcile).
- (no parameters)
get_workspace_snapshot_blob(viewer · read-only · internal)
Read the org's cached workspace snapshot blob (gzipped) from R2, base64-encoded, or null.
- (no parameters)
put_workspace_snapshot_blob(writer · write · internal)
Store the org's workspace snapshot blob (base64 of gzipped state) in R2 + update the pointer.
blobBase64(string, required)docCount(number)
get_agent_auth(writer · read-only · internal)
Resolve the Anthropic model auth for this org's agent runs. Platform-hosted: always returns apiKey null so the runner uses the shared platform key; usage is metered + billed in credits.
- (no parameters)
start_agent_run(writer · write · internal)
Begin an agent run (enforces the monthly agent_runs quota and acquires the per-org lease). Returns the run id used to apply a changeset.
conversationId(string)kind(string) — interactive|autopilotprompt(string)sdkSessionId(string)calendarEntryId(string) — calendar entry this run fulfils (autopilot claim; links the created draft + releases the claim on failure)holder(string) — lease holder id; defaults to the run idleaseTtlMs(number)
apply_workspace_changeset(writer · write · internal)
Apply a set of file changes (create/update/delete) back to the document store under a run id as one versioned, fully-revertable changeset. Never throws per file; returns per-file results (create|update|archive|skip|conflict).
runId(string, required)summary(string)changes(array, required)baseline(object) — path -> version id observed at export (conflict detection)
complete_agent_run(writer · write · internal)
Finalize a run: record status, summary, per-draft validation outcomes, token usage (metered), and optionally bind the SDK session id to the conversation for resume.
runId(string, required)status(string, required) — completed|failedsummary(string)validation(array) — [{path, score, passed, findings}] per changed draftsdkSessionId(string)conversationId(string)inputTokens(number)outputTokens(number)costUsd(number)error(string)holder(string) — lease holder to release; defaults to runId
list_agent_runs(viewer · read-only · internal)
List recent agent runs (most recent first).
limit(number)conversationId(string)
get_agent_run(viewer · read-only · internal)
Get an agent run plus its per-file changeset items (for the diff-review UI).
runId(string, required)
revert_agent_run(writer · write · internal)
Revert an entire agent run: updated/archived docs return to their pre-run version; created docs are archived.
runId(string, required)
approval_create(writer · write · internal)
Create a pending human approval for an agent run (durable; survives runner restarts). The runner polls approval_get for the decision.
runId(string, required)id(string, required) — approval key, unique within the runtool(string, required)input(object)ttlMs(number)
approval_get(viewer · read-only · internal)
Get the current status of an approval (pending | allow | deny).
runId(string, required)id(string, required)
approval_answer(writer · write · internal)
Record a human decision (allow | deny) for a pending approval.
runId(string, required)id(string, required)decision(string, required) — allow|deny
list_pending_approvals(viewer · read-only · internal)
List this org's pending, unexpired agent-run approvals.
- (no parameters)
acquire_agent_lease(writer · write · internal)
Acquire (or renew, if same holder) the per-org agent lease.
holder(string, required)ttlMs(number)
refresh_agent_lease(writer · write · internal)
Extend the per-org agent lease (holder must still hold it).
holder(string, required)ttlMs(number)
release_agent_lease(writer · write · internal)
Release the per-org agent lease.
holder(string, required)
get_agent_lease(viewer · read-only · internal)
Get the current per-org agent lease (if any).
- (no parameters)
session_put(writer · write · internal)
Store a Claude Agent SDK session transcript chunk (SessionStore backing).
sessionId(string, required)subkey(string, required)value(string, required)
session_get(viewer · read-only · internal)
Read a session transcript chunk.
sessionId(string, required)subkey(string, required)
session_list_subkeys(viewer · read-only · internal)
List the subkeys stored for a session.
sessionId(string, required)
session_delete(writer · write · internal)
Delete all transcript chunks for a session.
sessionId(string, required)
conversation_create(writer · write · internal)
Create an agent conversation (chat thread) and return its id.
title(string)
conversation_append_message(writer · write · internal)
Append a message (user|assistant|tool|event) to a conversation.
conversationId(string, required)role(string, required)content(string, required)meta(object)
list_conversations(viewer · read-only · internal)
List recent agent conversations.
limit(number)
get_conversation(viewer · read-only · internal)
Get a conversation plus its messages.
conversationId(string, required)
Webhooks (webhooks, 5 tools)
Outbound webhook subscriptions and delivery management.
list_webhook_subscriptions(viewer · read-only)
List the org's outbound webhook subscriptions (endpoints notified about content lifecycle events). Secrets are never returned.
- (no parameters)
set_webhook_subscription(admin · write)
Create/update an outbound webhook subscription (upsert by name or id). events is the list of subscribed event names (empty = all; omit to keep the current list). secret (optional) enables HMAC-SHA256 signing; stored encrypted. Omit active to keep the current state. URL must be public https.
id(string)name(string, required)url(string, required)secret(string) — HMAC signing secret (optional; omit to keep the current one)events(array) — Subset of: content.published, content.updated, content.unpublished, draft.ready_for_review, network.placement.proposed, network.placement.live, network.placement.verified, network.placement.broken, network.placement.removed, visibility.audit.completed, visibility.regressionactive(boolean)
delete_webhook_subscription(admin · write)
Delete an outbound webhook subscription and its delivery history.
subscriptionId(string, required)
list_webhook_deliveries(viewer · read-only)
Recent webhook delivery attempts (status, response code, error, retry schedule). Filter by subscriptionId.
subscriptionId(string)limit(number)
redeliver_webhook(admin · write)
Re-send a webhook delivery (resets its attempt counter and dispatches immediately). Works for delivered, pending, and failed rows.
deliveryId(string, required)
Library hygiene (library, 3 tools)
Document classification, library tidy reports, and description backfill.
classify_document(viewer · read-only)
Propose the structured home for a free-form document: instructions | guidelines | content_type | strategy | calendar | keywords | brief | knowledge. Read-only: returns a proposal + rationale, applies nothing. Fails safe to 'knowledge' when unsure.
title(string, required)bodyMarkdown(string, required)
tidy_library(viewer · read-only)
Library health report: missing/multiple/oversized workspace instructions, near-duplicate documents, content types in use without an editorial contract, missing descriptions, legacy rule-source files, and (with classify=true) reclassification proposals for free-form docs. Read-only; nothing is applied.
classify(boolean)
generate_descriptions(writer · write)
Backfill missing one-line Library descriptions for reference documents (bounded per run; default 20). Descriptions are display metadata only — document bodies are never changed.
limit(number)
Link network (network, 19 tools)
AI-SEO citation exchange: membership, targets, placements, ledger, and visibility lift.
network_status(viewer · read-only)
Link Network membership status for this workspace: site profile (domain, categories, rank, mode), credit balance, monthly receive cap, today's hosted-settlement count, and placement counts by status/direction. Returns { member: false } when the workspace has not opted in.
- (no parameters)
network_list_placements(viewer · read-only)
Placements for this workspace. direction: hosted (links we host in our articles) | received (links pointing at our site). Optional status filter (proposed|approved|embedded|live|verified|rejected|canceled|broken|removed|expired). Partners appear as domains only.
direction(string) — hosted | receivedstatus(string)documentId(string)limit(number)
network_list_targets(viewer · read-only)
This workspace's link targets: the pages other members' articles may link to or mention, with topics (used for matching) and anchor preferences (used for weaving).
activeOnly(boolean)
network_ledger(viewer · read-only)
Credit ledger for this workspace, newest first: signup bonus, escrow holds/releases, hosted earnings, and clawbacks. Balance = sum of all rows.
limit(number)
network_visibility_lift(viewer · read-only)
AI-visibility before/after analysis around this workspace's first VERIFIED received placements, per placement-type cohort and per keyword (28-day windows over the weekly AI-visibility scans). Correlation, not causation — thinData flags windows with too few scans to read anything into.
- (no parameters)
network_request_placements(writer · write)
Match this draft against the network and propose outbound placements (the draft HOSTS links to other members; hosting earns credits once live links verify). In approval mode proposals wait in the approvals inbox; in auto mode they are approved, escrowed, and woven into the draft immediately. placementType defaults to link (mention | citation | listicle_inclusion for AI-SEO placements). Returns proposed/embedded counts and a skippedReason when nothing matched.
documentId(string, required) — draft document idplacementType(string)
network_approve_placement(writer · write)
Approve HOSTING a proposed placement in this workspace's draft (host side of the exchange). Approval escrows the partner's credits atomically, then weaves the link into the draft. Calling it again on an already-approved placement retries just the weave (recovery path when a previous weave failed). A partner that can no longer pay expires the proposal instead.
placementId(string, required)
network_reject_placement(writer · write)
Reject a proposed placement this workspace would have hosted (host side only).
placementId(string, required)reason(string)
network_cancel_placement(writer · write)
Cancel a placement pre-embed. Either party may cancel: the receiving workspace to veto an unwanted inbound link/anchor, the hosting workspace to back out after approving. Escrowed credits are released.
placementId(string, required)reason(string)
network_add_link_target(writer · write)
Add or update a link target: a page on this workspace's verified domain that partner articles may reference. topics drive matching; anchorPreferences seed anchor generation; placementTypes limits how the page may be referenced (link | mention | citation | listicle_inclusion).
url(string, required) — https URL on the verified network domaintitle(string)topics(array)placementTypes(array)anchorPreferences(array)priority(number)active(boolean)
network_remove_link_target(writer · write)
Remove a link target. Existing placements pointing at it are unaffected.
targetId(string, required)
network_opt_in(admin · write)
Join the Link Network (paid plans, 5+ published articles). Registers the site profile and returns the verification token. IMPORTANT: automated link exchange is flagged by Google's link spam policies — placements default to per-placement approval, and the network can be paused at any time. Valid categories: Healthcare, Home Services, Automotive, Professional Services, Food & Beverage, Retail, Beauty & Wellness, Fitness & Recreation, Education & Enrichment, Events & Entertainment, Real Estate, Pet Services, Travel & Hospitality, E-commerce, Creators & Influencers, Community & Nonprofit, Financial, Legal, Political, Marketing & Advertising, Software & SaaS, Technology, Media & Publishing, Manufacturing & Industrial, Careers & HR, Other.
description(string, required) — one-paragraph description of the site (shown to matching)categories(array, required)domain(string) — defaults to the workspace Site URL hostlanguage(string) — BCP-47 primary language, default en
network_verify_domain(admin · write)
Verify domain ownership for the network site. Auto-passes when this workspace already publishes to the domain through the platform; otherwise checks /.well-known/wavefront-verify.txt and the wavefront-site-verification homepage meta tag. On success the site enters platform review.
- (no parameters)
network_update_settings(admin · write)
Update network settings: mode (approval | auto), maxLinksPerArticle (1-2), minPartnerRank, blockedDomains, blockedTopics, acceptedPlacementTypes. Approval mode reviews every hosted placement by hand; auto mode weaves matched placements without review.
mode(string) — approval | automaxLinksPerArticle(number)minPartnerRank(number)blockedDomains(array)blockedTopics(array)acceptedPlacementTypes(array)
network_pause(admin · write)
Kill switch: stop all new placement proposals in both directions immediately. Live placements keep verifying and keep their settled credits. Resume with network_resume.
- (no parameters)
network_resume(admin · write)
Resume a paused network membership.
- (no parameters)
network_leave(admin · write)
Leave the Link Network: open placements are closed out first (pre-live and unverified hosted placements expire with escrow refunded; settled hosted placements are removed with clawback — an unmonitored link is not what partners paid for), then the site profile and link targets are deleted. Ledger history remains.
- (no parameters)
network_admin_list_sites(admin · read-only)
PLATFORM ADMIN ONLY: list network sites across all workspaces, optionally by status (pending_verification | pending_review | active | paused | banned). The review queue is status=pending_review.
status(string)limit(number)
network_admin_review_site(admin · write)
PLATFORM ADMIN ONLY: activate a verified site under review (grants the signup credit bonus) or ban a site (spam/abuse; banned workspaces cannot rejoin themselves).
siteId(string, required)decision(string, required) — activate | banreason(string)
Visibility OS (visibility, 35 tools)
Brand Visibility Audit: DCAT layer scores, evidence-carrying findings, inbox routing, and layer ownership.
run_visibility_audit(writer · write · essential)
Run the Brand Visibility Audit: scores the workspace 0-100 across the five layers (Discoverability, Clarity, Authority, Trust, Agentic readiness), emits evidence-carrying findings, and routes content-fixable ones into the Review Inbox. Uses existing signals (GEO audit, AI-visibility scans, publish freshness); components without data say so and are excluded from the score honestly. mode=lite reuses stored signals (cheaper); mode=full re-measures the site. Only one audit can run at a time per workspace.
mode(string) — full (default: re-measures the site) | lite (reuses stored signals)
get_visibility_report(viewer · read-only · essential)
The latest Brand Visibility Audit: overall + per-layer scores with full component breakdowns (including which components have no data yet and why), the previous audit for deltas, the smoothed trailing-2 overall, open findings, and layer ownership. Null audit = never run (run_visibility_audit).
- (no parameters)
list_findings(viewer · read-only)
Visibility findings (the audit's work items), newest + most severe first. Each carries its layer, stable check id, severity (fail|warn|info), evidence grade (best_practice|bet|watch), fix route (content|surface|technical|outreach|product), evidence JSON, and its Review Inbox proposal link when routed.
layer(string) — filter: discoverability|clarity|authority|trust|agenticstatus(string) — comma-separated statuses (default: open,proposed; also resolved|dismissed)limit(number) — max rows (default 100)
dismiss_finding(writer · write)
Dismiss a visibility finding (not applicable / accepted risk). Dismissed findings are never auto-reopened by later audits.
findingId(string, required)
generate_visibility_roadmap(writer · write)
Generate/refresh the live 90-day AI-visibility roadmap as a Library playbook: open findings phased 30/60/90 by severity, per-layer ownership, and auto-ticked resolved items (re-audits close what they no longer detect). The living alternative to a deck that's stale the week after it's presented.
- (no parameters)
export_exec_overview(writer · write)
Export the CMO-ready executive overview: 'The Shift' framing, the layer scorecard with owners, top findings, the competitor citation gap, and a methodology appendix. Saves a frozen Library snapshot and returns a REVOCABLE public share link (unguessable token, /share/visibility/<token>).
- (no parameters)
list_visibility_reports(viewer · read-only)
Exported visibility reports with their share-link status (live or revoked).
- (no parameters)
revoke_report_share(admin · write)
Revoke a visibility report's public share link (the report itself stays in the Library).
reportId(string, required)
set_layer_owner(admin · write)
Assign ownership of a visibility layer (the DCAT cross-functional model: Clarity usually belongs to product marketing, Authority to PR, Trust to customer success). Pass userId for a workspace member, or externalName/externalEmail for someone not in the workspace yet. Passing none clears the assignment fields.
layer(string, required) — discoverability|clarity|authority|trust|agenticuserId(string) — workspace member user idexternalName(string) — owner outside the workspaceexternalEmail(string)
draft_canonical_brand(writer · write)
Draft the canonical brand description (the Clarity layer's signable source of truth: description, category, value proposition, target customer, verticals, differentiators, and the 'what you are NOT' misclassification list) from the org's website. Returns a DRAFT for human confirmation: nothing is judged against it until it's saved via set_brand_profile {canonical}. Edit until you'd sign it.
url(string) — page to derive from (defaults to the org's primary domain)
generate_semantic_neighborhood(writer · write)
Draft the brand's semantic neighborhood (Clarity layer): the 15-25 buyer-language terms the content should co-occur with (problems solved, category names, audience descriptors). Saved to the brand profile for editing; coverage over the published catalog is then measured deterministically and uncovered terms feed topic suggestions. Retrieval is vector-based: brand-only language sits far from real buyer queries.
- (no parameters)
generate_org_schema(viewer · read-only)
Build the Organization JSON-LD block for the homepage: canonical description as description, every registered surface as sameAs, plus name/url. Copy-paste install; the GEO audit then verifies installation (incl. sameAs completeness), closing the loop. Requires a confirmed canonical description.
- (no parameters)
list_battery_prompts(viewer · read-only)
The typed visibility prompt battery (brand / comparison / best_for / category probes, seeded from the AI Search OS course templates). Distinct from get_ai_prompts (the keyword golden prompts): both run in every scan, battery first.
- (no parameters)
seed_battery_prompts(writer · write)
(Re)seed the prompt battery from the brand profile: brand probes (incl. the complaints, disambiguation, and book/buy/sign-up probes), comparison prompts per competitor (business-critical by default), and best-for prompts per use case. Idempotent: existing prompts are never touched.
- (no parameters)
set_battery_prompt(writer · write)
Add or update a battery prompt. businessCritical prompts fire a visibility.regression webhook + digest alert when they stay non-endorsed for two consecutive scans after an endorsed one.
type(string, required) — brand | comparison | best_for | categoryprompt(string, required)competitor(string)useCase(string)businessCritical(boolean)enabled(boolean)
remove_battery_prompt(writer · write)
Delete a battery prompt (its historical scan rows are kept).
id(string, required)
get_battery_answers(viewer · read-only)
The latest battery scan answers per engine: what AI actually says. Brand prompts carry the wrong-vs-missing description verdict (against the canonical description); comparison/best-for prompts carry the recommendation state (endorsed | hedged | not_recommended | absent) with verbatim hedge excerpts.
type(string) — brand | comparison | best_for | categorylimit(number)
list_surfaces(viewer · read-only)
The owned-surface registry (homepage, about, LinkedIn, Crunchbase, review profiles, ...) with each surface's latest drift verdict (aligned | drifted | unreachable | manual) and notes (incl. the copy-ready corrected paragraph on drift, and rating/review counts for review surfaces).
- (no parameters)
set_surface(writer · write)
Register or update an owned surface for drift scanning. scannable=false marks a login-walled surface (Google Business Profile, gated directories): those take a manual 'I verified this matches' attest instead, re-nagged every 90 days.
kind(string, required) — one of: homepage, about, product, linkedin, crunchbase, review, gbp, social, press, community, otherlabel(string)url(string, required)scannable(boolean)
remove_surface(writer · write)
Remove a surface from the registry.
id(string, required)
attest_surface(writer · write)
Manually confirm a login-walled surface matches the canonical brand description ('I verified this matches'). Valid for 90 days.
id(string, required)
run_surface_scan(writer · write)
Scan the registered surfaces against the canonical brand description (drift detection with a copy-ready corrected paragraph per drifted surface; review surfaces get deterministic rating/count extraction from JSON-LD). Requires a confirmed canonical description; scrapes are metered (surface_scan credits). Runs monthly automatically.
- (no parameters)
get_crawler_matrix(viewer · read-only)
The AI crawler function matrix: which user-agent belongs to which vendor and FUNCTION (training vs search-index vs live-retrieval), what blocking each actually does, the deprecated strings that silently do nothing, and the org's declared policy vs what its robots.txt actually says (from the last GEO audit).
- (no parameters)
set_crawler_policy(admin · write)
Declare the org's deliberate AI-crawler policy (training / search-index / live-retrieval: allow or block each) and get the exact robots.txt block implementing it. Wavefront can't edit your robots.txt; you paste the snippet. Blocking search or retrieval removes you from AI answers: the matrix explains each trade-off. Googlebot is never auto-blocked (it's also web search).
training(string) — allow | block | undecidedsearch(string) — allow | block | undecided (blocking removes you from AI answers)retrieval(string) — allow | block | undecided (blocking prevents live quoting)
map_query_fanout(writer · write)
Map one keyword's AI query fan-out: the 6-12 sub-queries an engine silently expands it into (informational/comparative/transactional/experiential/local/seasonal) and which ones your catalog already covers. Gaps are content nobody's keyword tool can see (95% of fan-out queries have zero search volume). Cached per keyword for a quarter; plan_article runs this automatically for new topics.
keyword(string, required)force(boolean) — re-map even when cached
get_fanout_coverage(viewer · read-only)
The org's query fan-out coverage: aggregate covered/partial/gap counts plus the cached per-keyword maps. Use to answer 'what sub-queries are we missing?' with evidence; map_query_fanout adds keywords.
keyword(string) — return one keyword's cached map instead of the aggregate
mark_reviewed(writer · write)
Record a freshness review on a published document without changing its content: sets frontmatter lastReviewed to today, which resets the freshness clock (the audit counts reviews as touches, and publish surfaces lastReviewed as dateModified). Use after verifying an article is still accurate.
documentId(string, required)
build_citation_core(writer · write)
Roll up the trailing quarter's engine-attested citations into the Citation Core: the small set of third-party domains AI actually cites in your category, with category, reachability, cross-engine consistency, the frequency x reachability priority grid (1 = quick win, 4 = ignore), competitor overlap, and Link Network cross-reference. Needs live-retrieval scan data (Perplexity, paid plans); the proxy panel writes no citations. Rebuilt quarterly automatically.
- (no parameters)
get_citation_core(viewer · read-only)
The latest Citation Core (per-domain: category, prompt share, engines, is_core, cites you/competitors, reachability, priority 1-4, Link Network membership) plus quarter-over-quarter share movement. Empty until build_citation_core has run on a quarter of live-engine data.
quarter(string) — e.g. 2026-Q3 (defaults to latest built)
suggest_original_assets(writer · write)
Propose original-information assets AI would cite because no competitor can substitute them (proprietary usage data, annual industry surveys, calculators, teardown series). Grounded in the org's category, catalog, and citation-core gaps; each suggestion lands in the Review Inbox as a proposal with rationale. The most-cited sources own content nobody else has.
- (no parameters)
generate_review_kit(writer · write)
Generate the org's review-request kit as a Library playbook: ask copy timed to customer wins plus the context-prompting questions (who they are, what they used it for, what outcome they got) that make reviews quotable by AI. Ask timing is a conversion best practice; the AI-citation upside is honestly labeled a bet.
- (no parameters)
run_agent_readiness_audit(writer · write)
Run the 14-check agent-readiness audit: can an AI agent complete a task with this brand? HTTPS, agent-bot access, descriptive link anchors, actionable conversion points, form labels, structured data, contact/policy/pricing discoverability, copyright hygiene, llms.txt, sitemap, and the catalog's task-intent mix. Deterministic raw-fetch checks (no JS rendering); result feeds the Agentic layer score. Full visibility audits refresh this automatically.
- (no parameters)
classify_content_intent(writer · write)
Classify published entries' primary search intent (informational | navigational | commercial | transactional | task) in batches of up to 50. Feeds the agent-readiness intent-mix check and the Agentic tab. The nightly cron backfills 20/night; call this to backfill faster. Unclassifiable rows stay unclassified, never guessed.
limit(number) — batch size (default 20, max 50)
generate_agent_card(writer · write)
Generate a machine-readable agent card (JSON: identity from the canonical brand description, offerings, conversion actions, contact and policy URLs) plus hosting instructions, saved as a Library playbook. Honest framing: agent-card discovery is emerging infrastructure (a bet), cheap to publish, aligned with where WebMCP/NLWeb are heading.
- (no parameters)
get_protocol_readiness(writer · write)
The agentic-protocol readiness checklist: what MCP, ACP, UCP, AP2, A2A, WebMCP, and NLWeb are, whether each applies to this org, and its current status. Also seeds the visibility experiment tracker playbook on first call. Honest framing throughout: most protocols are 'watch' unless the org transacts online.
- (no parameters)
Belief ledger (beliefs, 6 tools)
What answer engines believe about the brand (derived from scans), positioning targets, and the computed gaps between them.
list_beliefs(viewer · read-only)
The belief ledger: latest-state claims each answer engine holds about the brand, per scope (question/keyword or the brand itself). Derived from AI-visibility scans; run derive_beliefs after a scan to refresh.
kind(string) — positioning|descriptionlimit(number)
derive_beliefs(writer · write)
Rebuild the belief ledger from recent AI-visibility scan results (deterministic; no LLM spend). The weekly scan cron runs this automatically; call it after an on-demand scan.
- (no parameters)
list_belief_targets(viewer · read-only)
Positioning targets: the questions/keywords where the brand wants to be mentioned or recommended.
- (no parameters)
set_belief_target(writer · write)
Set (or update) a positioning target for a scope. scopeKey is a normalized keyword or a battery prompt id; desired is 'mentioned' or 'recommended'; priority 1 (high) to 3 (low).
scopeKey(string, required)desired(string, required) — mentioned|recommendedlabel(string)priority(number)
remove_belief_target(writer · write)
Remove a positioning target by scopeKey.
scopeKey(string, required)
list_belief_gaps(viewer · read-only)
Computed gaps between targets and the belief ledger, most actionable first: wrong (engine asserts incorrect claims, listed verbatim), missing (no observation), below (standing under the desired stance), stale (not re-observed in 21 days), achieved. Brand-description accuracy is always checked, no target needed.
- (no parameters)