Lists the websites this organization audits, oldest first (the first one is the site the app shows by default; an account normally has exactly one), paginated by cursor (limit up to 200). Each site carries its configuration (url, name, max_pages, schedule, notify_emails, exclude_patterns, exclude_mode, ignore_rules) and its state: next_due_at (the day, 00:00 UTC, the audit queue picks it up; null when manual, off or paused by the system), last_run_id / last_run_at / last_health_score (the latest finished audit), cloudflare_detected, and the failure count (consecutive_failures, last_failure_reason, disabled_by_system: the system pauses the schedule after 5 failures in a row). Requires view access to Site Audit.
Scope
seo_site_auditor:read
Permission
View the module
MCP tool
seo_site_auditor_sites_listOn the full surface; on the compact one, mb_execute_operation with id: "seo_site_auditor.sites.list".
Declared cost: up to 201 reads and 0 writes per call (they count against the daily quota).
Parameters
limitintegerqueryoptional
How many items this page brings at most (see the maximum and the default in the schema).
Default: 50
cursorstringqueryoptional
The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.
Returns one audited site with its configuration (url, name, max_pages, schedule, notify_emails, exclude_patterns, exclude_mode, ignore_rules with the reason of each) and its state (next_due_at, last_run_id, last_run_at, last_health_score with last_run_coverage, the pages the latest audit could read: a score over very few pages says little, low_coverage, cloudflare_detected, consecutive_failures, last_failure_reason, disabled_by_system). Read its audits with seo_site_auditor.runs.list (site_id). Not found (audit_site_not_found) if the site does not exist in this organization. Requires view access to Site Audit.
Scope
seo_site_auditor:read
Permission
View the module
MCP tool
seo_site_auditor_sites_getOn the full surface; on the compact one, mb_execute_operation with id: "seo_site_auditor.sites.get".
Declared cost: up to 1 reads and 0 writes per call (they count against the daily quota).
Parameters
site_idstringpathrequired
Audited site id (id from seo_site_auditor.sites.list).
Response
idstring
urlstring
namestring
max_pagesnumber
scheduleobject
next_due_atnumber | null
notify_emailsarray<string>
exclude_patternsarray<string>
exclude_modeenum
Values: skip-crawl, crawl-but-ignore
ignore_rulesarray<object>
last_run_idstring | null
The latest finished audit (seo_site_auditor.runs.get).
last_run_atnumber | null
last_health_scorenumber | null
Health score (0–100) of the latest finished audit; read it with last_run_coverage: it is computed only over the pages that could be read.
last_run_coverageobject | null
How much of the site the latest finished audit read; null without one.
cloudflare_detectedboolean | null
Whether the site answers from behind Cloudflare (detected in the background after creating it or changing its URL; null until then).
Adds the website this organization audits: url (https; a bare domain gets https://), and optionally name (default: the domain), max_pages (1–500, default 100), schedule (default, as in the app: weekly on Mondays and active, so the site enters MB Suite's audit queue at once and is crawled from Cloud Run every week; next_due_at in the answer says the day; send frequency manual to audit only on demand), notify_emails (up to 10 addresses that get the results by email after every audit), exclude_patterns and exclude_mode. It does NOT audit right away: the first audit runs on the next scheduled day, or start one with seo_site_auditor.runs.trigger. After answering, MB Suite checks once in the background whether the site is behind Cloudflare (one HTTP request to the site; cloudflare_detected). Each account audits one site: if the organization already has one it fails with audit_site_exists (409, with its site_id): change it with seo_site_auditor.sites.update. Fails with invalid_site_url (400) when the address is not a valid https domain or points inside a private network. Returns the new site. Requires edit access to Site Audit.
Scope
seo_site_auditor:write
Permission
Edit in the module
MCP tool
seo_site_auditor_sites_createOn the full surface; on the compact one, mb_execute_operation with id: "seo_site_auditor.sites.create".
Declared cost: up to 1 reads and 2 writes per call (they count against the daily quota).
Parameters
urlstringbodyrequired
The site's address, https only. A bare domain gets https:// (example.com → https://example.com); hosts that do not resolve to the public internet are rejected.
namestringbodyoptional
Display name (default: the domain).
max_pagesintegerbodyoptional
Pages crawled per audit, 1–500 (default 100; the app offers 10, 25, 50, 100 and 500).
Default: 100
scheduleobjectbodyoptional
When it is audited. Default, as in the app: weekly on Mondays and active, so the site enters MB Suite's audit queue right away (next_due_at in the answer says when; each audit crawls the site from Cloud Run and emails notify_emails). Send frequency manual (or enabled false) to audit it only on demand.
notify_emailsarray<string (email)>bodyoptional
Who gets the email with the results after every audit (up to 10 addresses; they need not be members).
Default: []
exclude_patternsarray<string>bodyoptional
URL patterns left out of the audit, e.g. /blog/* or *?page=* (up to 50).
exclude_modeenumbodyoptional
skip-crawl (default: excluded URLs are not even visited) or crawl-but-ignore (visited, but they raise no issues).
Values: skip-crawl, crawl-but-ignore
Response
idstring
urlstring
namestring
max_pagesnumber
scheduleobject
next_due_atnumber | null
notify_emailsarray<string>
exclude_patternsarray<string>
exclude_modeenum
Values: skip-crawl, crawl-but-ignore
ignore_rulesarray<object>
last_run_idstring | null
The latest finished audit (seo_site_auditor.runs.get).
last_run_atnumber | null
last_health_scorenumber | null
Health score (0–100) of the latest finished audit; read it with last_run_coverage: it is computed only over the pages that could be read.
last_run_coverageobject | null
How much of the site the latest finished audit read; null without one.
cloudflare_detectedboolean | null
Whether the site answers from behind Cloudflare (detected in the background after creating it or changing its URL; null until then).
Changes one or more settings of an audited site: url, name, max_pages (1–500), schedule (replaced whole: frequency manual/weekly/monthly, day_of_week or day_of_month, enabled), notify_emails (up to 10, replaced whole), exclude_patterns (up to 50, replaced whole; each starts with / or *) and exclude_mode. Only what actually changes is written: a new schedule moves next_due_at to its next day (and switching it on clears the failure count of a site the system paused); a new url forgets how the site was crawled last time and checks Cloudflare again. Changes apply from the next audit; past audits keep their results. Sending the current values changes nothing. Returns the site. Errors: audit_site_not_found (404), invalid_site_url (400). Requires edit access to Site Audit.
Scope
seo_site_auditor:write
Permission
Edit in the module
MCP tool
seo_site_auditor_sites_updateOn the full surface; on the compact one, mb_execute_operation with id: "seo_site_auditor.sites.update".
Declared cost: up to 1 reads and 2 writes per call (they count against the daily quota).
Parameters
site_idstringpathrequired
Audited site id (id from seo_site_auditor.sites.list).
urlstringbodyoptional
New address (https). Changing it forgets how the site was crawled last time.
namestringbodyoptional
New display name.
max_pagesintegerbodyoptional
Pages crawled per audit, 1–500.
scheduleobjectbodyoptional
Replaces the whole schedule. Turning it on again also clears the failure count of a site the system paused.
notify_emailsarray<string (email)>bodyoptional
Replaces the whole list (up to 10 addresses).
exclude_patternsarray<string>bodyoptional
Replaces the whole list (up to 50 patterns).
exclude_modeenumbodyoptional
skip-crawl (excluded URLs are not visited) or crawl-but-ignore (visited, but they raise no issues).
Values: skip-crawl, crawl-but-ignore
Response
idstring
urlstring
namestring
max_pagesnumber
scheduleobject
next_due_atnumber | null
notify_emailsarray<string>
exclude_patternsarray<string>
exclude_modeenum
Values: skip-crawl, crawl-but-ignore
ignore_rulesarray<object>
last_run_idstring | null
The latest finished audit (seo_site_auditor.runs.get).
last_run_atnumber | null
last_health_scorenumber | null
Health score (0–100) of the latest finished audit; read it with last_run_coverage: it is computed only over the pages that could be read.
last_run_coverageobject | null
How much of the site the latest finished audit read; null without one.
cloudflare_detectedboolean | null
Whether the site answers from behind Cloudflare (detected in the background after creating it or changing its URL; null until then).
Deletes an audited site together with ALL its audits (their issues and crawled pages). The site's configuration (url, schedule, notify emails, exclusions and intentional rules with their reasons) stays 30 days in the trash and can be restored, but the audit history does not come back: restoring brings the site back with no audits, its next scheduled audit computed from the restore day (409 audit_site_exists if the account has another site by then). Outside the screen it always needs a dry run (which counts the audits that go with it) and its confirm_token. A site with an audit still queued or running cannot be deleted (audit_in_progress, 409). Not found (audit_site_not_found) if it does not exist. Requires edit access to Site Audit and, for a credential, deletion enabled.
Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.
Scope
seo_site_auditor:writeand “Allow deletions” (seo_site_auditor:delete in OAuth)
Permission
Edit in the module
MCP tool
seo_site_auditor_sites_deleteOn the full surface; on the compact one, mb_execute_operation with id: "seo_site_auditor.sites.delete".
Declared cost: up to 100 reads and 250 writes per call (they count against the daily quota).
Parameters
site_idstringpathrequired
Audited site id (id from seo_site_auditor.sites.list).
Response
oktrue
runs_deletednumber
trash_item_idstring
The trash item this deletion left: the item_id of platform.trash.restore (POST /trash/{item_id}/restore). Missing if nothing went to the trash.
trash_item_idsarray<string>
Only when the deletion left more than one copy: all of them, the first being trash_item_id.
trash_expires_atnumber
When the copy leaves the trash for good (epoch ms): 30 days after the deletion.