<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Webskan</title>
    <description>The latest articles on DEV Community by Webskan (@webskan).</description>
    <link>https://dev.to/webskan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4232076%2F3ffc3a05-e898-41a5-97e9-a251b1ebadc2.png</url>
      <title>DEV Community: Webskan</title>
      <link>https://dev.to/webskan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/webskan"/>
    <language>en</language>
    <item>
      <title>Audit the website your coding agent just shipped (free remote MCP server)</title>
      <dc:creator>Webskan</dc:creator>
      <pubDate>Sat, 07 Nov 2026 13:59:56 +0000</pubDate>
      <link>https://dev.to/webskan/audit-the-website-your-coding-agent-just-shipped-free-remote-mcp-server-5c4m</link>
      <guid>https://dev.to/webskan/audit-the-website-your-coding-agent-just-shipped-free-remote-mcp-server-5c4m</guid>
      <description>&lt;p&gt;Claude Code, Cursor, Codex or Windsurf can take a brief and a repo and have a marketing site, a landing page or a small shop deployed in an afternoon. What the agent cannot do from inside the repo is see the site the way a visitor, a search engine or a scanner sees it: over the network, on a phone, after the CDN, with the real headers. That outside view is where agent-built sites fail – and it is also something the agent can check itself, if you give it a tool for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why agent-built sites break in the same places
&lt;/h2&gt;

&lt;p&gt;An agent optimises for the thing you asked for: the page renders, the build is green, the deploy succeeded. The failures below are not visible in any of those three signals. We see them when auditing sites in general, and they are exactly the ones a fast, repo-centric workflow tends to skip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Placeholder metadata.&lt;/strong&gt; The framework template’s title (“Create Next App”, “Vite + React”, “My Astro Site”) or one title and description copied to every page. Search engines index what is there; visitors see it in the tab and in the results.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A leftover &lt;code&gt;noindex&lt;/code&gt; or a blocking robots.txt.&lt;/strong&gt; Correct for the preview deployment, fatal when the same config ships to production. The site works perfectly and silently disappears from Google.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Links to pages that were renamed in the last refactor.&lt;/strong&gt; The agent moved &lt;code&gt;/pricing&lt;/code&gt; to &lt;code&gt;/plans&lt;/code&gt;, updated the nav, and left the old path in the footer, the FAQ and three blog posts. Nothing in the build complains about a 404.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Missing security headers.&lt;/strong&gt; Most hosting defaults set none of &lt;code&gt;Content-Security-Policy&lt;/code&gt;, &lt;code&gt;Strict-Transport-Security&lt;/code&gt;, &lt;code&gt;X-Content-Type-Options&lt;/code&gt;, &lt;code&gt;Referrer-Policy&lt;/code&gt; or &lt;code&gt;Permissions-Policy&lt;/code&gt;. Every scanner flags it, and some clients run scanners before they sign.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forms that look fine and are not usable.&lt;/strong&gt; Inputs without labels, a submit button that is a &lt;code&gt;div&lt;/code&gt;, a success state that never shows, a contact form that posts to an endpoint that only existed locally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mobile performance nobody measured.&lt;/strong&gt; A 4 MB hero image, a font loaded four times, a third-party script for a widget that was removed. It is fast on the laptop that built it; on a mid-range phone over 4G the largest paint arrives after four seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accessibility basics.&lt;/strong&gt; Images without alternative text, contrast below 4.5:1 on the “subtle” grey the agent picked, headings that skip levels, a mobile menu that cannot be opened with a keyboard. In the EU this is no longer only good manners – the &lt;a href="https://webskan.com/en/blog/european-accessibility-act-websites/" rel="noopener noreferrer"&gt;European Accessibility Act&lt;/a&gt; applies to shops and booking sites since June 2025.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Two live versions of the site.&lt;/strong&gt; &lt;code&gt;www&lt;/code&gt; and the bare domain both answer 200, or the &lt;code&gt;*.pages.dev&lt;/code&gt; / &lt;code&gt;*.vercel.app&lt;/code&gt; preview is indexable next to the real domain. Duplicate content, split ranking signals, and a certificate warning on whichever variant nobody configured.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is hard to fix. The problem is that nobody looks – the human trusted the agent, the agent trusted the green build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Close the loop: build → deploy → audit → fix → recheck
&lt;/h2&gt;

&lt;p&gt;The fix is not “be more careful”. It is to give the agent the same feedback loop it already has for tests: a tool that checks the deployed site from the outside and returns findings it can act on, and a second call that tells it which of those findings are now gone.&lt;/p&gt;

&lt;p&gt;That is what the Webskan MCP server does. It is a remote &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; server – nothing to install, no account for the free plan – that gives a coding agent four tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;scan_website&lt;/code&gt; – a quick check of one page: HTTPS and redirects, security headers, server version leaks, mobile Lighthouse. About 30 seconds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;audit_website&lt;/code&gt; – an audit of the whole deployed site, up to 30 pages: internal and external links with the pages they sit on, per-page SEO (title, description, H1, canonical, alt texts, Open Graph), Lighthouse mobile and desktop, WCAG checks with axe and CSS selectors, TLS and security headers, robots and sitemap, platform detection and the customer journeys (menu, search, forms, 404 page). Over 60 finding types, each with a concrete fix. Typically 1–5 minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;get_audit&lt;/code&gt; – fetch the result, filtered by severity if you want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;recheck_website&lt;/code&gt; – run the audit again and get a diff: fixed, still open, new.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is deterministic and read-only. There is no language model inside the audit – the agent on your side is the one that reasons about the findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting it up
&lt;/h2&gt;

&lt;p&gt;Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http webskan https://webskan.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cursor, Windsurf and most other clients take a standard &lt;code&gt;mcpServers&lt;/code&gt; entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"webskan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://webskan.com/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Codex uses TOML (&lt;code&gt;~/.codex/config.toml&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="k"&gt;.&lt;/span&gt;&lt;span class="n"&gt;webskan&lt;/span&gt;&lt;span class="k"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"https://webskan.com/mcp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://webskan.com/developers/" rel="noopener noreferrer"&gt;developer page&lt;/a&gt; has the VS Code variant, the Claude Code plugin and a curl example if you want to talk JSON-RPC to it directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the loop looks like in practice
&lt;/h2&gt;

&lt;p&gt;After the deploy, one prompt is enough:&lt;/p&gt;

&lt;p&gt;“The site is live at &lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt;. Run a whole-site Webskan audit, fix everything high and medium in the repo, deploy, then recheck and show me what is still open.”&lt;/p&gt;

&lt;p&gt;A typical first audit of a freshly shipped site comes back with a handful of medium findings and a longer tail of low ones. A finding looks like this (shortened):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seo.title.duplicate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Same &amp;lt;title&amp;gt; on 6 pages"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"seo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detail"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"“Example – Home” – search engines cannot tell which page to show. Give every page its own title."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/about"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/blog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/blog/hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/contact"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the ids are stable, the agent can map a finding to a change in the repo, and &lt;code&gt;recheck_website&lt;/code&gt; can say honestly which ids disappeared. Lighthouse scores vary a little between runs, so they are reported separately and never counted as “fixed” or “new” on their own. If a page could not be fetched during the recheck, the finding is listed as “could not verify”, not as fixed.&lt;/p&gt;

&lt;p&gt;Two things worth telling the agent explicitly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit the production URL, not the preview.&lt;/strong&gt; The headers, redirects and robots rules of a preview deployment are different – an audit of &lt;code&gt;*.vercel.app&lt;/code&gt; tells you little about &lt;code&gt;example.com&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fix the cause, not the symptom.&lt;/strong&gt; Six pages with the same title are one template bug, not six edits. Forty broken links to &lt;code&gt;/pricing&lt;/code&gt; are one redirect rule.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What you could do instead
&lt;/h2&gt;

&lt;p&gt;You do not need Webskan for any individual check. Lighthouse runs from the command line, &lt;a href="https://github.com/dequelabs/axe-core" rel="noopener noreferrer"&gt;axe-core&lt;/a&gt; covers accessibility, &lt;a href="https://github.com/JustinBeckwith/linkinator" rel="noopener noreferrer"&gt;linkinator&lt;/a&gt; finds broken links, and any security-headers checker will grade your headers. What a single tool over MCP adds is that the agent gets all of it in one call, with the pages crawled for it, the results in a shape it can act on, and a diff after the fix – without you installing a headless Chrome in the deploy pipeline or copying numbers between tabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and what we store
&lt;/h2&gt;

&lt;p&gt;The free plan needs no key: 2 whole-site audits per IP per day, 1 per host per day (a repeat call for the same host returns the existing audit), quick scans 10 per hour. We store the audited address and the result for 30 days (7 for quick scans) so &lt;code&gt;get_audit&lt;/code&gt; and &lt;code&gt;recheck_website&lt;/code&gt; work; a one-way hash of the client IP for 24 hours for the rate limit; nothing else. Private hosts, localhost and IP ranges are refused – only public websites. Details are in the &lt;a href="https://webskan.com/en/privacy/" rel="noopener noreferrer"&gt;privacy policy&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give your agent the outside view
&lt;/h2&gt;

&lt;p&gt;Add the server, deploy, and ask the agent to audit, fix and recheck. No account, no key, results the agent can act on.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http webskan https://webskan.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not using an agent? The &lt;a href="https://webskan.com/en/" rel="noopener noreferrer"&gt;free quick scan&lt;/a&gt; checks one page in your browser, and the &lt;a href="https://webskan.com/en/#pricing" rel="noopener noreferrer"&gt;in-depth audit&lt;/a&gt; ($69) delivers the full report as a PDF with a prioritised fix plan and a re-check after your fixes.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://webskan.com/en/blog/audit-the-site-your-agent-shipped/" rel="noopener noreferrer"&gt;Webskan blog&lt;/a&gt;. Questions and feedback on which findings are noise for you are welcome in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
