{"name":"online.pageaudit/pageaudit","slug":"pageaudit","title":null,"description":"Technical SEO, passive security and page-delivery audits with evidence and suggested fixes.","url":"https://mcp.market/server/pageaudit","rating":null,"grade":"B","score":81,"certified":false,"status":"active","category":"seo","tags":["seo","security"],"presence":{"score":23,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-10-15T04:00:18.000Z","license":"MIT-0"},"uptime":{"percent":100,"checks":28,"ok":28,"last_checked_at":"2026-11-05T13:40:29.259Z","last_ok_at":"2026-11-05T13:40:29.259Z","latency_ms":596},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/wrpbr/pageaudit","website":"https://pageaudit.online","version":"1.0.1","remotes":[{"type":"streamable-http","url":"https://pageaudit.online/mcp"}],"packages":[],"tools":[{"name":"acknowledge_domain_event","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Acknowledge an expected event. Suppress its notice only if sending has not started. Preserve the event and its evidence. Preserve the event and observation. Acknowledgement does not erase a confirmed risk or retract a sent notice. Repetition is idempotent.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"number":{"type":"integer","minimum":1,"description":"Positive history event number."}},"required":["id","number"]}},{"name":"add_site","description":"Add a site to the account. No site count limit. An account holds up to 1,000 sites (409 site_limit). The existing guest audit workspace stays separate.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"Public HTTP(S) URL, without credentials."}},"required":["url"]}},{"name":"api_index","description":"Discovers the whole PageAudit API (self-describing index).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"apply_domain_alerts","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Apply the reviewed selection. Requires the preview from preview_domain_alerts. A stale preview changes nothing. Select up to 25 saved pages. Repeated registrable domains count once. The server checks the account, organization and current revisions again. A stale preview changes nothing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tabs":{"type":"array","minItems":1,"maxItems":25,"uniqueItems":true,"items":{"type":"string"},"description":"One to 25 owned tab IDs."},"lead_days":{"type":"integer","enum":[7,14,30],"description":"Days before domain expiry for renewal notices."},"preview":{"type":"string","pattern":"^[a-f0-9]{64}$","description":"Exact preview from the POST response for these tabs and lead_days."}},"required":["tabs","lead_days","preview"],"additionalProperties":false}},{"name":"audit_site","description":"Check the first 20 URLs of a site's sitemap: status, redirects, robots.txt, noindex, canonical, titles and descriptions. Free, without an account. The same site within one hour returns the stored sample. URLs of another host are counted, never requested. The free sample of the SEO audit. URLs of another host are counted, never requested. The same site within one hour returns the stored sample (`cached_at`) without requesting the site again and without spending the allowance.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"any address of the site"},"lang":{"type":"string","description":"optional: pt for the texts in Portuguese"},"guest_token":{"type":"string","description":"optional pa_…"}},"required":["url"]}},{"name":"audit_url","description":"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. The free alternative: a person signs in with an account to get the trial.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"url":{"type":"string","description":"absolute URL to audit"},"guest_token":{"type":"string","description":"optional pa_…"},"compare_with":{"type":"string","description":"optional ID of an earlier audit of the same owner; returns what appeared and disappeared"}},"required":["url"]}},{"name":"cancel_connection_review","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Cancel the current TLS review and preserve completed evidence. One review per account, organization, origin and UTC day. Starting requires current domain monitoring rights. The account has three starts per UTC day. Retries return the same review. The scanner samples one public IP, with three stages and a 170-second deadline. Partial results do not establish safety. GET never starts a scan. The shared realtime channel reports stage changes. Reports expire after 26 hours.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."}},"required":["id"],"additionalProperties":false}},{"name":"check_domain","description":"Refresh due registration, contacts, TLS, DNS, mail policies, certificate issuance and a limited DNS/TLS sample. Reuses fresh public data. Reuse fresh observations. A failed or partial query preserves the last complete observation and its date. Up to 100 cold page reads per owner and UTC day.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"guest_token":{"type":"string"}},"required":["id"]}},{"name":"configure_domain_dns","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Set up to three known DKIM selectors and choose whether IP rotation is expected. Expected rotation keeps history without notices; alias changes still notify. Does not discover selectors, enable monitoring or authenticate sent messages. Send manual_expires_on, dns, or both. Omitted settings are preserved. DNS requires both selectors and rotating_addresses. An identical retry is idempotent. A conflicting revision returns 409.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"revision":{"type":"integer","minimum":0,"description":"Current revision from the corresponding settings or monitor. Use zero for the first change."},"dns":{"type":"object","additionalProperties":false,"properties":{"dkim_selectors":{"type":"array","maxItems":3,"uniqueItems":true,"items":{"type":"string","maxLength":63,"pattern":"^[a-z0-9][a-z0-9._-]*$"}},"rotating_addresses":{"type":"boolean"}},"required":["dkim_selectors","rotating_addresses"],"description":"Known selectors and expected IP rotation. Selector discovery is not performed."}},"required":["id","revision","dns"],"additionalProperties":false}},{"name":"configure_domain_monitor","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Enable or stop domain monitoring, or pause notices for maintenance. Count a registry domain once per account, including its organization copies. Add only the tab's origin. HTTP receives DNS checks only. Maintenance pauses notices while collection continues. Confirm enabled, no suspension and next_check_at after saving.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"revision":{"type":"integer","minimum":0,"description":"Current revision from the corresponding settings or monitor. Use zero for the first change."},"enabled":{"type":"boolean","description":"True enables collection; false stops it."},"maintenance_until":{"type":["integer","null"],"description":"Future Unix milliseconds within 30 days, or null."}},"required":["id","revision","enabled","maintenance_until"]}},{"name":"connect_search_console","description":"Start read-only Google consent. The account owner must follow redirect in their browser. Follow redirect in the account's browser. Consent expires after five minutes. The callback is single-use and bound to the account and site. The property must match the site and Google must authorize it before the connection is saved.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Site ID from list_sites or add_site."},"property":{"type":"string","description":"Exact Search Console domain or URL-prefix property."},"language":{"type":"string","enum":["en","pt"],"description":"en (default) or pt. Browser consent returns in this language."}},"required":["id","property"]}},{"name":"connection_review","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Read today's private TLS review without starting a scan. One review per account, organization, origin and UTC day. Starting requires current domain monitoring rights. The account has three starts per UTC day. Retries return the same review. The scanner samples one public IP, with three stages and a 170-second deadline. Partial results do not establish safety. GET never starts a scan. The shared realtime channel reports stage changes. Reports expire after 26 hours.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."}},"required":["id"],"additionalProperties":false}},{"name":"contact","description":"Write to the people behind the product: a question, or a sponsorship/partnership/advertising proposal. One route for a question and for a sponsorship, partnership or ad proposal (`tipo`, with the placements of `GET /api/partners`). 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. For voice, send multipart/form-data: `dados` is this JSON (up to 32 KiB), and `audio` is one WebM, Ogg or M4A audio file (up to 2 MB). Audio can replace message. The browser records up to two minutes. Audio is attached to the owner's e-mail.","write_action":true,"price_micros":0,"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."},"whatsapp":{"type":"string","description":"Optional reply number with country code, such as +5561999999999."},"prefer_whatsapp":{"type":"boolean","description":"Request a WhatsApp reply. Requires whatsapp."},"tipo":{"type":"string","enum":["patrocinio","parceria","anuncio","consultoria"],"description":"Proposal: `patrocinio`, `parceria`, `anuncio` or `consultoria`. 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","ate_2000","2000_5000","5000_10000","10000_mais","nao_sei"],"description":"Advertising: `ate_100`, `100_500`, `500_2000`, `2000_mais` or `a_combinar`. Consulting, in US dollars: `ate_2000`, `2000_5000`, `5000_10000`, `10000_mais` or `nao_sei`."},"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"]},"projeto":{"type":"string","enum":["llm_privado","voz","dados_sensiveis","gpu","integracao","outro"],"description":"Consulting: the kind of project (`llm_privado`, `voz`, `dados_sensiveis`, `gpu`, `integracao` or `outro`)."},"prazo":{"type":"string","enum":["agora","1_mes","1_3_meses","explorando"],"description":"Consulting: when to start (`agora`, `1_mes`, `1_3_meses` or `explorando`)."},"formato":{"type":"string","enum":["projeto","mensal","assessoria"],"description":"Consulting: `projeto` (per scope), `mensal` (monthly) or `assessoria` (advisory)."},"pais":{"type":"string","description":"Consulting: the country of the person asking."},"fuso":{"type":"string","description":"Consulting: the IANA time zone, such as `America/New_York`."},"horarios":{"type":"array","items":{"type":"string"},"description":"Consulting: up to 3 times for the call, `YYYY-MM-DDTHH:MM` in that time zone."}},"required":["name","email","message"]}},{"name":"create_guest","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"create_tab","description":"Opens a saved URL. Set queue_audit=false to monitor a discovered origin without a page audit.","write_action":true,"price_micros":0,"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."},"queue_audit":{"type":"boolean","default":true,"description":"Defaults to true. Use false to save an idle page for domain monitoring without queuing a page audit. Existing pages keep their current state."}},"required":["guest_token","url"]}},{"name":"disconnect_search_console","description":"Remove the local Google credential and stop collection. Keep the last good sample. The last good sample stays available. An in-flight callback or collection cannot reconnect the site.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Site ID from list_sites or add_site."}},"required":["id"]}},{"name":"domain_history","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Read up to 50 private incidents with notice delivery. Send the last event number as before for the next page. A first observed risk is an initial incident, not evidence of an external change. The first DNS and certificate-issuance snapshots are silent baselines. DNS changes, incompatible server samples and connection failures need two distinct observations. Expected IP rotation is silent. Repeated observations do not duplicate a notice. Contact changes expose field states only. Issuance does not prove installation. DNS records do not prove authentication of sent mail.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"before":{"type":"integer","minimum":1,"description":"Return events with a number below this cursor."}},"required":["id"]}},{"name":"domain_portfolio","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Read cached domain monitoring and deadlines for selected saved pages. Does not start external collection or activate monitoring. Every tab must belong to the current account and organization. Repeat with the next group of IDs for a larger workspace.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tabs":{"type":"array","minItems":1,"maxItems":100,"uniqueItems":true,"items":{"type":"string"},"description":"One to 100 owned tab IDs."}},"required":["tabs"],"additionalProperties":false}},{"name":"domain_status","description":"Read registration, contact visibility, TLS, DNS, CAA, mail policies, certificate issuance and a limited server comparison. Read source dates and collection gaps. Private options require the account session. A discovered name never starts monitoring automatically. Pages share public observations by registry domain and HTTPS origin. Private settings and history stay with the account and organization. Missing data is not a healthy result.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"guest_token":{"type":"string"}},"required":["id"]}},{"name":"embed_snippet","description":"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.","write_action":false,"price_micros":0,"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"}}}},{"name":"get_audit","description":"Re-reads an audit already made, with `fixes` (the ready fix for each finding).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"guest_token":{"type":"string"},"id":{"type":"string","description":"Audit ID, from `Audit.id`."}},"required":["guest_token","id"]}},{"name":"get_badge","description":"Metadata and markdown of the SVG badge of a shared report.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"24-char public slug"}},"required":["slug"]}},{"name":"get_patch","description":"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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"guest_token":{"type":"string"},"id":{"type":"string","description":"Audit ID, from `Audit.id`."}},"required":["guest_token","id"]}},{"name":"get_site","description":"Read one site owned by the signed-in account.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Site ID from list_sites or add_site."}},"required":["id"]}},{"name":"get_tool","description":"Copy and checks of one micro-tool by slug (e.g. title-tag-checker).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"slug":{"type":"string","description":"tool slug"},"language":{"type":"string","enum":["en","pt"],"description":"Content language: pt (also pt-BR) for Portuguese; any other value or none returns English."}},"required":["slug"]}},{"name":"health","description":"Liveness and the commit deployed right now — it is how the smoke waits for its own deploy.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"journeys","description":"Read the owned site's installation, actions, paths and ordered conversion funnel for the last seven days. Requires the account's browser session. Only this site's owner can read it. Data updates through the shared realtime transport. No user identity, typed text or screen recording.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned Site.id."}},"required":["id"]}},{"name":"lab_result","description":"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.","write_action":false,"price_micros":0,"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"]}},{"name":"lab_test","description":"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.","write_action":false,"price_micros":0,"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"]}},{"name":"list_sites","description":"Read up to 50 sites owned by the signed-in account. Follow next_cursor.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"type":"string","description":"next_cursor from the preceding page."},"host":{"type":"string","description":"Exact lowercase domain without www. Returns at most one owned site, Search Console, Analytics and site-package state in the same response. Does not create a site."}}}},{"name":"list_tabs","description":"Lists the owner's saved pages (guest or session), with the active page's last report. Group pages by site to match the Projects table. One call loads the saved pages and the active page's last report. The UI groups pages by site in Projects and opens each site in a work tab. The introduction stays in Welcome. A signed-in account sends `X-Organization-Id`; a guest has one temporary workspace.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"guest_token":{"type":"string"}},"required":["guest_token"]}},{"name":"list_tools","description":"Lists the micro-tools (title, meta, canonical, OG, JSON-LD…).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"language":{"type":"string","enum":["en","pt"],"description":"Content language: pt (also pt-BR) for Portuguese; any other value or none returns English."}}}},{"name":"preview_domain_alerts","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Review the exact selected domains before changing renewal notices. Select up to 25 saved pages. Repeated registrable domains count once. The server checks the account, organization and current revisions again. A stale preview changes nothing.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tabs":{"type":"array","minItems":1,"maxItems":25,"uniqueItems":true,"items":{"type":"string"},"description":"One to 25 owned tab IDs."},"lead_days":{"type":"integer","enum":[7,14,30],"description":"Days before domain expiry for renewal notices."}},"required":["tabs","lead_days"],"additionalProperties":false}},{"name":"review_connection","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Start a TLS review of the saved HTTPS origin using current domain monitoring rights. At most three starts per account and UTC day, one per site. A repeated request reuses today's review. Do not claim complete safety from a partial result. One review per account, organization, origin and UTC day. Starting requires current domain monitoring rights. The account has three starts per UTC day. Retries return the same review. The scanner samples one public IP, with three stages and a 170-second deadline. Partial results do not establish safety. GET never starts a scan. The shared realtime channel reports stage changes. Reports expire after 26 hours.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."}},"required":["id"],"additionalProperties":false}},{"name":"run_tab","description":"Re-audits the tab's URL.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"guest_token":{"type":"string"},"id":{"type":"string","description":"ID of the tab to re-audit."}},"required":["guest_token","id"]}},{"name":"search_console","description":"Read the site's last good 28-day sample, partial coverage, dates and collection failure. The sample covers 28 days, at most 50 queries and 50 pages. Coverage is partial. It is not a traffic total or a ranking promise. Credentials and raw provider responses are not returned.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Site ID from list_sites or add_site."}},"required":["id"]}},{"name":"set_domain_expiry","description":"Requires the account session, current X-Organization-Id and CSRF for writes. Set or remove the private manual expiry. Send manual_expires_on, dns, or both. Omitted settings are preserved. DNS requires both selectors and rotating_addresses. An identical retry is idempotent. A conflicting revision returns 409.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Owned tab ID from list_tabs."},"revision":{"type":"integer","minimum":0,"description":"Current revision from the corresponding settings or monitor. Use zero for the first change."},"manual_expires_on":{"type":["string","null"],"description":"YYYY-MM-DD, or null to remove."}},"required":["id","revision","manual_expires_on"]}},{"name":"sync_search_console","description":"Collect a due sample. Repeated calls cannot bypass the daily reservation. The hourly schedule uses the same durable reservation. A failure preserves the last good sample and schedules the next attempt 24 hours later. This route cannot force an extra collection.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Site ID from list_sites or add_site."}},"required":["id"]}},{"name":"tab_history","description":"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.","write_action":false,"price_micros":0,"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"]}},{"name":"watch_tab","description":"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.","write_action":false,"price_micros":0,"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"]}}],"scan":{"score":81,"grade":"B","scanned_at":"2026-10-16T17:06:20.868Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-16T17:06:20.797Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1675ms"]},"poisoning":{"score":15,"max":15,"notes":["40 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 7 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 2 days ago"]},"identity":{"score":8,"max":10,"notes":["endpoint served from the registry-verified namespace domain"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://pageaudit.online/mcp","reachable":true,"authRequired":false,"latencyMs":1675,"serverInfo":{"name":"PageAudit","version":"6da682db"}}],"packages":[],"repo":{"found":true,"owner":"wrpbr","repo":"pageaudit","archived":false,"pushedAt":"2026-10-15T04:00:18Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/3261426?v=4","ownerCreatedAt":"2013-01-14T02:50:02Z","license":"MIT-0"},"icon":{"url":"https://pageaudit.online/icon.svg","source":"registry"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT-0","lastPushAt":"2026-10-15T04:00:18.000Z","score":23}}}},"grade_history":[{"kind":"restore","fromGrade":"C","toGrade":"B","reason":"score 81: Write-action tools reachable without authentication","createdAt":"2026-10-16T17:06:28.669Z"}],"reviews":[]}