Skip to content

Audit CMS content with AI

The content auditor sends the website’s CMS document to a fast LLM (Anthropic Haiku via OpenRouter) and returns a structured rubric across 8 dimensions plus a weighted overall score. Findings come back with severity, score, one-line summary, and a concrete fix the operator can act on.

  • A Website with SEO enabled (POST /websites/:id/seo set to any tier above essentials)
  • A published content document at content/settings/site.json on the per-client repo (anything you can edit through vantage content edit or the Content tab in the portal)
TierAudits / month
Essentials0 (not available)
Growth4
Premium12
Premium+30

essentials returns 403 from the API. growth and up consume one slot per uncached audit — see the cache section below.

DimensionWhat the LLM scores
titleSite title clarity. Penalizes defaults like “Your Business”.
taglineOne-line value prop — what the business does and for whom.
aboutAbout section depth. 2+ sentences with concrete history/values.
servicesService list count + per-item descriptions.
faq3+ Q&As that AI search engines could cite. Empty = error.
businessNAP profile (name/address/phone) + hours + service area.
contactEmail + phone presence.
localPagesPer-city landing pages. Optional, but a strong local-SEO signal.

Each finding lands in one of four severity bands derived from the 0–100 score: 0-29error, 30-59warn, 60-84info, 85-100info.

The overall score is a weighted average — about, services, faq, and business count double (they carry the GEO load), title, tagline, contact count single, and localPages counts half.

Cost-management is baked in. The auditor canonicalizes the siteContent body (stable-stringify with sorted keys, deep) and sha256s it. A repeat audit on byte-identical content returns the prior result with cached: true and does not consume a quota slot. Operators can poke the audit button as much as they like; quota only tracks calls where the LLM had new work to do.

Cache survives forever (until the content changes) — it’s stored on the SEO row’s metadata.lastContentAudit alongside the hash. The cached response includes cachedAt so the UI can render a “last audited X minutes ago” badge.

Open a website’s Content editor, click Quality check in the settings rail. The panel runs the audit, sorts findings by severity, and exposes a Fix → button on each row that jumps the editor to the relevant section.

Terminal window
vantage seo ai-content-audit [<websiteId>] [--json]

Defaults to the site you’re cwd’d into. Pretty-prints findings by default; pass --json to pipe.

import { VantageClient } from "@vantageconnections/sdk";
const vc = new VantageClient({ token, baseUrl });
const { content } = await vc.content.get(websiteId);
const res = await vc.seo.contentAudit(websiteId, { siteContent: content });
// res.findings: SeoContentAuditFinding[]
// res.overallScore: number (0-100)
// res.cached: boolean
// res.cachedAt?: string
// res.used, res.limit: monthly counters

For Claude Desktop / Claude Code with the Melbora MCP server connected:

vantage_seo_ai_content_audit
websiteId: ws_…
siteContent: <the parsed content document>

A typical flow: call vantage_content_get first to retrieve the document, then pass .content straight into siteContent.

{
"overallScore": 72,
"findings": [
{
"dimension": "faq",
"severity": "warn",
"score": 45,
"summary": "Only 2 FAQs — below the 3+ AI search engines like to cite.",
"suggestion": "Add Q&As about pricing, scheduling, and what's included so AI assistants have answer material."
}
],
"used": 1,
"limit": 4,
"cached": false
}

When cached: true, cachedAt (ISO timestamp) is also present.

  • It does not rewrite content for you. Each finding’s suggestion is a one-line action — the operator (or the client) still does the writing. Use vantage seo ai-blog-draft or vantage seo ai-local-page for AI-authored content.
  • It does not crawl the live site. The audit is purely against the CMS document, so unpublished edits aren’t reflected until the operator saves them.
  • It does not persist findings as historical timeseries. Each audit overwrites the prior lastContentAudit on the SEO row; there’s no audit log per site.