get_page_fix
get_page_fix MCP tool: read the latest fix of a page. Issues sorted by severity with how to fix each, JSON-LD blocks ready to paste, internal links to add and what an AI understands of the page.
Updated 2026-10-08
get_page_fix returns the latest fix of one page, started with run_page_fix. Once COMPLETED, it is the page's to-do list: every issue sorted by severity with how to fix it, the JSON-LD blocks ready to paste, the internal links to add, what disappears without JavaScript, and what an AI understands of the page.
When to use
Poll it right after run_page_fix, with the same pageUrl, until status is COMPLETED or FAILED. Most fixes take under a minute. Call it again later to reread the last result of a page without starting a new fix: it is a read tool and changes nothing.
Input
| Field | Type | Default | Description |
|---|---|---|---|
projectId |
string (CUID) | required | Project scope. |
pageUrl |
string (URL) | required | URL of the page, the same as for run_page_fix. Matched as crawled, like run_page_fix. |
include.raw |
boolean | false |
Add the raw reads: robots.txt per bot, HTTP statuses, published JSON-LD, inbound links. |
Response
While the fix runs
{
"success": true,
"fixId": "cmg8k2x1p0004l70f9d3h2a1b",
"pageUrl": "https://example.com/services/seo-audit",
"status": "RUNNING",
"createdAt": "2026-10-08T09:12:04.000Z",
"completedAt": null
}
status goes PENDING, then RUNNING, then COMPLETED or FAILED. A FAILED fix carries an error string: run run_page_fix again. A COMPLETED fix made by an earlier version of the tool carries only a message asking to run it again.
Completed
{
"success": true,
"fixId": "cmg8k2x1p0004l70f9d3h2a1b",
"pageUrl": "https://example.com/services/seo-audit",
"status": "COMPLETED",
"createdAt": "2026-10-08T09:12:04.000Z",
"completedAt": "2026-10-08T09:12:41.000Z",
"pageType": "SERVICE",
"understanding": {
"who": "Example, a technical SEO agency",
"what": "Technical SEO audits",
"forWhom": "B2B SaaS companies",
"where": null
},
"issues": [
{
"check": "robots-page-blocked",
"level": "BLOCKING",
"title": "AI robots blocked from this page by robots.txt",
"howToFix": "Find the Disallow rule that matches this path in robots.txt and remove it, or add an Allow rule for these robots.",
"details": { "bots": ["OAI-SearchBot", "ChatGPT-User"] }
},
{
"check": "jsonld-missing",
"level": "AI_IMPACT",
"title": "No structured data for this kind of page",
"howToFix": "Add the suggested JSON-LD block below to the page, inside the <head> or before </body>, then fill in the fields listed as missing.",
"details": { "type": "Service" }
},
{
"check": "ai-facts-missing",
"level": "AI_IMPACT",
"title": "Facts about your business an AI cannot find here",
"howToFix": "State these facts plainly on the page: in the text, a short list or a table. How you phrase them is up to you.",
"details": { "facts": [{ "dimension": "area", "quote": "remote audits for clients across Europe" }] }
},
{
"check": "ai-topics-missing",
"level": "AI_IMPACT",
"title": "What engines search for that the page does not cover",
"howToFix": "Give this information on the page. We do not suggest wording: only what is missing.",
"details": {
"editorial": false,
"topics": [{ "label": "prices", "queries": ["technical seo audit cost saas"] }]
}
},
{
"check": "not-in-sitemap",
"level": "SEO_HYGIENE",
"title": "Missing from the sitemap",
"howToFix": "Add the page to your XML sitemap (most CMS do it once the page is published and indexable).",
"details": null
}
],
"jsonLdToAdd": [
{
"type": "Service",
"code": "{\n \"@context\": \"https://schema.org\",\n \"@type\": \"Service\",\n \"name\": \"Technical SEO audit for B2B SaaS\",\n \"description\": \"A full technical SEO audit of your SaaS site, delivered in two weeks.\",\n \"provider\": {\n \"@type\": \"Organization\",\n \"name\": \"Example\",\n \"url\": \"https://example.com\"\n },\n \"areaServed\": \"…\"\n}",
"toComplete": ["areaServed"]
},
{
"type": "BreadcrumbList",
"code": "{\n \"@context\": \"https://schema.org\",\n \"@type\": \"BreadcrumbList\",\n \"itemListElement\": [\n {\n \"@type\": \"ListItem\",\n \"position\": 1,\n \"name\": \"Example\",\n \"item\": \"https://example.com/\"\n },\n {\n \"@type\": \"ListItem\",\n \"position\": 2,\n \"name\": \"Technical SEO audit for B2B SaaS\",\n \"item\": \"https://example.com/services/seo-audit\"\n }\n ]\n}",
"toComplete": []
}
],
"linksToAdd": [
{ "from": "https://example.com/blog/technical-seo-checklist", "anchor": "Technical SEO audit for B2B SaaS" }
],
"missingWithoutJs": { "headings": ["Pricing"], "prices": ["€1,200"], "jsonLdTypes": [] }
}
Fields of a completed fix:
pageType: the kind of page (HOME,ARTICLE,PRODUCT,SERVICE,CATEGORY,LOCAL,HELP,UTILITY,OTHER). It decides the expected JSON-LD type and whether freshness is checked.understanding: what an AI understands from the page alone. Each field isnullwhen the page does not say it.nullas a whole for utility pages.issues: sorted bylevel, the most serious first:BLOCKING(engines cannot read or index the page),AI_IMPACT,CONSISTENCY,SEO_HYGIENE(Google only).checkis a stable machine code,titleandhowToFixare in English,detailsholds the facts of the issue (blocked bots, missing fields, duplicate URLs, searches) ornull. On a title or meta description issue (title-*,meta-*),details.suggestionoffers a new tag ready to paste, in the page's language and at the right length, drawn from what the page already says.jsonLdToAdd: JSON-LD blocks ready to paste.codeis the full block. « … » marks a value neither the page nor the project gives: the field names are listed intoCompleteand must be filled by hand before publishing.linksToAdd: related pages of the site that do not link to this one yet, with the anchor to use. Empty for the home page.missingWithoutJs: what a visitor sees but a robot reading the raw HTML does not: headings, prices, JSON-LD types.nullwhen the page could not be rendered.googleSearch(every status): the page in Google Search over the last 28 days, from Search Console.clicks,impressions,position,previousClicks(the 28 days before) andclickShare(% of the site's Google clicks), plus signals:push(positions 4 to 20 with volume, or a click-through rate far below its position),declining(clicks down 30% or more),protect(the page brings real traffic: fix it, never rework it) andcannibalized(non-brand queries where other pages of the site split the impressions,{ query, urls }).nullwhen Search Console is not connected or the page has no data.verification:nullunless this fix re-checks an earlier one. Mentionable re-checks every fix not fully applied after each site crawl:
{
"verification": {
"applied": "PARTIAL",
"fixedPoints": ["title-long", "jsonld-missing", "link:https://example.com/blog/technical-seo-checklist"],
"totalPoints": 5
}
}
fixedPoints are the points of the previous fix now fixed: a check code, or link: followed by the page a link was suggested from. applied is FULL (all fixed), PARTIAL or NONE. Every fixed point is logged in the action log on its own: no need to call create_action_log for it.
effect(every status):nulluntil the page is fixed (marked done in the plan, or a fix seen applied, even partly, at a recrawl). Then the answers of the prompts linked to the page, 4 weeks before the fix against the weeks since (up to 4), compared with the project's other prompts over the same dates. Citations and mentions change a lot from one month to the next on their own:effectis the page's change minus the change of the other prompts.
{
"effect": {
"fixedAt": "2026-09-02T00:00:00.000Z",
"daysSinceFix": 28,
"windowDays": 28,
"scans": { "before": 28, "after": 28 },
"ready": true,
"prompts": 4,
"otherPrompts": 31,
"mentionRate": { "before": 18.5, "after": 41.2, "change": 22.7, "others": 3.1, "effect": 19.6 },
"pageCitationRate": { "before": 6.0, "after": 19.4, "change": 13.4, "others": 0.8, "effect": 12.6 },
"byEngine": [
{
"llm": "PERPLEXITY",
"mentionRate": { "before": 25.0, "after": 60.7, "change": 35.7, "others": 2.0, "effect": 33.7 },
"pageCitationRate": { "before": 10.7, "after": 39.3, "change": 28.6, "others": 1.1, "effect": 27.5 },
"usualDelayDays": [1, 7]
}
],
"googleSearch": { "days": 26, "before": { "impressions": 1840, "clicks": 52 }, "after": { "impressions": 2410, "clicks": 71 } }
}
}
mentionRate is the share of answers naming the brand, pageCitationRate the share citing this exact page, both in % (0 to 100). change is the page's change in points, others the change of the other prompts (null when there are none), effect = change − others. after, change, others and effect stay null until the project has been scanned on at least 3 days on each side of the fix (ready: false, counts in scans): too early to read anything. windowDays is the measurement window on each side: 28 days, longer when scans are spaced out (45 days for scans every two weeks, 90 for monthly scans). prompts: 0 means no prompt is linked to the page. usualDelayDays is how long the engine usually takes to pick up a change (null when unknown): Perplexity within days, ChatGPT 1 to 3 weeks, Google AI Overviews 4 to 8 weeks. googleSearch compares Search Console impressions and clicks over the same number of days before and after, null without Search Console or under 7 days of data.
With include.raw: true, a raw object is added:
{
"raw": {
"access": {
"robots": [
{ "bot": "OAI-SearchBot", "allowed": false },
{ "bot": "PerplexityBot", "allowed": true }
],
"browserStatus": 200,
"botStatus": 200,
"xRobotsTag": null
},
"publishedJsonLd": [{ "@type": "Organization", "name": "Example" }],
"inboundLinks": [
{ "url": "https://example.com/services", "anchor": "SEO audit", "position": "Content" }
]
}
}
botStatus is the answer the page gave to a request made as an AI search robot. A 403 or 503 there while browserStatus is 200 points to a firewall.
Errors
error |
Meaning |
|---|---|
fix_not_found |
No fix exists for this page yet. Start one with run_page_fix. |
Access errors are raised like on every other tool: Project not found when the project is not in your workspace or your membership, Project not in API key scope when the key is restricted to other projects.
Tips and patterns
- Fix in order. A
BLOCKINGissue makes everything below it useless: an engine that cannot read the page will not see its structured data. - Fill the « … » first. Never publish a block with a placeholder left in it. Ask the user for the values listed in
toComplete. - Facts, not copy.
ai-facts-missingandai-topics-missingsay what is missing, never how to word it. On a business page, give the information plainly; on an editorial page, cover each topic in its own section. - Keep the default payload. Add
include.rawonly to debug an access issue: it is the heaviest part of the result.
Related tools
- run_page_fix: start a fix.
- get_recommendation: the plan of a prompt and its pages to fix.
- list_ai_crawler_pages: pages AI robots read without citing them.
- create_action_log: log other changes. Fixes detected by a verification are logged automatically.