pageaudit

Technical SEO audit with the ready-made fix for each finding. Pay per call via x402 or credit.

Should I use this

Quality & Safety

B
Description quality
94%
Schema completeness
75%
Naming quality
90%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (4)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'get_patch' description contains placeholder textin get_patch
  • LOWTool 'get_badge' description lacks action verbin get_badge
  • INFOTool description contains placeholder or incomplete textin get_patch

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,011Tokens (tool definitions)
~594 BTypical response size
Significant attention impact (2.35% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "pageaudit": {
      "url": "https://pageaudit.online/mcp"
    }
  }
}

Remote endpoints

https://pageaudit.online/mcpstreamable-http

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢api_index

Discovers the whole PageAudit API (self-describing index).

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢health

Liveness and the commit deployed right now — it is how the smoke waits for its own deploy.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢list_tools

Lists the micro-tools (title, meta, canonical, OG, JSON-LD…).

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢get_tool(slug)

Copy and checks of one micro-tool by slug (e.g. title-tag-checker).

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "tool slug"
    }
  },
  "required": [
    "slug"
  ]
}
🟢audit_url(url, guest_token)

Check a web page's search metadata, crawl access, structured data and selected discovery files. Return evidence, limits and suggested changes without creating a saved tab. A blocked target returns HTTP 502 with target_blocked. The report does not certify security or accessibility. This is the product for agents. Past the IP's daily allowance the response is **402 with `accepts[]`** and `code: allowance_spent` — pay and repeat the same call. There is no captcha: people and agents pay the same way. The free alternative: a person signs in with an account to get the trial.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "absolute URL to audit"
    },
    "guest_token": {
      "type": "string",
      "description": "optional pa_…"
    }
  },
  "required": [
    "url"
  ]
}
🟡create_guest

Creates a guest token pa_… for the tab workspace. Keep the token: it is the identity of the tabs and of the audits tied to them.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟢list_tabs(guest_token)

Lists the owner's tabs (guest or session). One call draws the whole screen: tabs, the focused tab, its last report, remaining allowance and prices.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    }
  },
  "required": [
    "guest_token"
  ]
}
🟡create_tab(guest_token, url, alias)

Opens a tab for a URL in the workspace. Past the free tab allowance it answers 402 with `accepts[]`: pay and repeat.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "description": "The URL the tab will follow."
    },
    "alias": {
      "type": "string",
      "description": "Label to recognise the tab in the list."
    }
  },
  "required": [
    "guest_token",
    "url"
  ]
}
⚪run_tab(guest_token, id)

Re-audits the tab's URL. Consumes the same daily allowance as `POST /api/audit` — past it, 402 with `accepts[]`.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "ID of the tab to re-audit."
    }
  },
  "required": [
    "guest_token",
    "id"
  ]
}
🟢tab_history(guest_token, id, limit)

The tab's previous runs and what changed between each one and the one before it (score delta, findings that appeared and that disappeared). Every run has always been kept; this is where you read the series. Each entry carries the score, the counts and a `change` with the point delta and the findings that appeared (`broke`) or disappeared (`fixed`) since the previous run — compared by finding code, never by message. Runs older than the watch feature are matched by URL.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "ID of the tab whose runs you want."
    },
    "limit": {
      "type": "number",
      "description": "how many runs, newest first (default 20, max 100)"
    }
  },
  "required": [
    "guest_token",
    "id"
  ]
}
🔴watch_tab(guest_token, id, monitor, monitor_email)

Turns the daily watch on or off for a tab: it re-audits the page once a day and e-mails when the score drops or a new error/warning appears. Needs the signed-in account (its browser session cookie); a guest token gets 403 `account_required`. With `monitor: true` the page is re-audited once a day and an e-mail goes out when the score drops or a new error/warning appears — never on an improvement. Watching needs an account (the alert has to reach someone) and each account watches a limited number of pages.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string",
      "description": "guest pa_… — refused: a guest has no e-mail to warn"
    },
    "id": {
      "type": "string",
      "description": "ID of the tab to change."
    },
    "monitor": {
      "type": "boolean",
      "description": "true watches, false stops watching"
    },
    "monitor_email": {
      "type": "string",
      "description": "where the alert goes; empty = account e-mail"
    }
  },
  "required": [
    "guest_token",
    "id",
    "monitor"
  ]
}
🟡lab_test(guest_token, id, strategy)

Starts a lab test of an audit's page: Lighthouse run by Google PageSpeed Insights (performance, accessibility, best practices, SEO). Answers 202 at once; the test takes ~25 s to 2+ minutes — then read it with lab_result. Does not change the audit score. Answers **202** at once; the test runs for ~25 s to over 2 minutes and its summary is stored in the audit (`summary.lab.<strategy>`), so it comes back in `GET /api/audits/:id`, in the tab and in the shared report. It does not change the audit score. Calling again while the same strategy is running does not start a second test. Limits: 4 tests at a time on the server, 6 per network per hour and 500 per day for the whole product. Free: no x402 charge.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "audit id"
    },
    "strategy": {
      "type": "string",
      "description": "mobile (default) or desktop"
    }
  },
  "required": [
    "guest_token",
    "id"
  ]
}
🟢lab_result(guest_token, id, wait)

The lab tests of an audit (mobile and desktop): running, finished with scores, metrics and biggest savings, or failed. With wait (up to 25) it answers as soon as a running test finishes. Long-poll: with `wait` the answer comes as soon as a running test finishes, or after `wait` seconds with `status: running`. Repeat until it is not running.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "audit id"
    },
    "wait": {
      "type": "number",
      "description": "seconds to wait for a running test, 0–25"
    }
  },
  "required": [
    "guest_token",
    "id"
  ]
}
🟢get_audit(guest_token, id)

Re-reads an audit already made, with `fixes` (the ready fix for each finding). Re-reading costs nothing and does not count against the allowance — the page's HTML is not kept, but the report is.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "Audit ID, from `Audit.id`."
    }
  },
  "required": [
    "guest_token",
    "id"
  ]
}
🟢get_patch(guest_token, id)

The consolidated patch of an audit: <head> block to paste, files to create and templates with placeholders. No model — only facts from the page. Each finding becomes a fix in one of three classes: `deterministico` (comes whole from what the page declares: final URL, title, description, OG), `molde` (a tag with a marked placeholder, like `{{TITULO}}`, and the suggested source) or `sem_patch` (a decision or infrastructure, with the instruction). Nothing is invented by a model.

Input Schema

{
  "type": "object",
  "properties": {
    "guest_token": {
      "type": "string"
    },
    "id": {
      "type": "string",
      "description": "Audit ID, from `Audit.id`."
    }
  },
  "required": [
    "guest_token",
    "id"
  ]
}
🟢get_badge(slug)

Metadata and markdown of the SVG badge of a shared report.

Input Schema

{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "24-char public slug"
    }
  },
  "required": [
    "slug"
  ]
}
🟢embed_snippet(brand, color, theme, url)

The embeddable widget's snippet, already assembled with the site's name and colour — one script tag, no account, no lead capture. One script tag puts the audit form on your own site, with your name and colour, and no account or key. Send the same query you would send to `/embed` and the answer comes back with `snippet` already assembled. The widget never asks the visitor for an e-mail.

Input Schema

{
  "type": "object",
  "properties": {
    "brand": {
      "type": "string",
      "description": "site name shown above the form"
    },
    "color": {
      "type": "string",
      "description": "accent colour in hex"
    },
    "theme": {
      "type": "string",
      "description": "auto, light or dark"
    },
    "url": {
      "type": "string",
      "description": "optional URL to pre-fill"
    }
  }
}
🟢billing

Read free allowances, options with billing off, reference prices and the account's 90-day period. Audits remain free beyond the daily baseline while their billing is off. Hourly limits still apply.

Input Schema

{
  "type": "object",
  "properties": {}
}
🟡contact(name, email, message, tipo, empresa, ...)

Write to the people behind the product: a question, or a sponsorship/partnership/advertising proposal. Free, no captcha and no payment; one message every 10 s per network (one that arrives sooner waits its turn). One route for a question and for a sponsorship, partnership or ad proposal (`tipo`, with the placements of `GET /api/partners`). No captcha, no account, no payment. One message every 10 seconds per network: one that arrives sooner waits its turn and then goes out — no error. The message reaches the team by e-mail, with `email` as the reply address.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "What to call the person writing."
    },
    "email": {
      "type": "string",
      "description": "Where to reply."
    },
    "message": {
      "type": "string",
      "description": "What you want to say."
    },
    "tipo": {
      "type": "string",
      "enum": [
        "patrocinio",
        "parceria",
        "anuncio"
      ],
      "description": "Proposal: `patrocinio`, `parceria` or `anuncio`. Turns on the fields below."
    },
    "empresa": {
      "type": "string",
      "description": "Who is proposing, when it is a company."
    },
    "site": {
      "type": "string",
      "description": "Website of who is proposing."
    },
    "orcamento": {
      "type": "string",
      "enum": [
        "ate_100",
        "100_500",
        "500_2000",
        "2000_mais",
        "a_combinar"
      ],
      "description": "`ate_100`, `100_500`, `500_2000`, `2000_mais` or `a_combinar`."
    },
    "espaco": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Placement ids from `GET /api/partners`, up to 6."
    },
    "duracao": {
      "type": "string",
      "enum": [
        "30",
        "90",
        "365"
      ],
      "description": "Exposure in days: `30`, `90` or `365`."
    },
    "pagamento": {
      "type": "string",
      "enum": [
        "usdc",
        "deposito",
        "a_combinar"
      ],
      "description": "`usdc`, `deposito` or `a_combinar`."
    }
  },
  "required": [
    "name",
    "email",
    "message"
  ]
}
🟢pricing

Current public prices and free allowances; no charge.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Recommended Prompts

retrieve_data
Get details about [item] from pageaudit
Expected tools: get_tool
fetch_info
Fetch [information type] using pageaudit
Expected tools: get_tool
list_items
List all [items] available in pageaudit
Expected tools: list_tools
browse_collection
Show me the [collection] from pageaudit
Expected tools: list_tools
explore_workflow
List available [items], then get details for each one using pageaudit
Expected tools: list_toolsget_tool

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools
verifiedversion not recorded20 tools
verifiedversion not recorded18 tools