site-kit
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@site-kitMake me a website about the chess lessons I teach. Then review it and explain what is wrong."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
codex-site-kit
An MCP server for Codex. It builds small websites with no framework and no build step, and it criticises them the way a coach annotates a game.
Every finding carries four things and never fewer: what was found, with the measurement · why it is worse than the alternative · who says so, by name, with a confidence tag · and the better move. Nothing comes back as a bare pass or fail, because a pass/fail teaches you nothing and this tool is trying to teach you something.
Findings are annotated in chess notation, which is not decoration — severity needs a vocabulary, and if you read one already this is the one:
Means | |
| A blunder. Somebody with no design vocabulary at all spots it in five seconds, on a phone. |
| A mistake. Felt rather than named, and decisive. |
| An inaccuracy. A habit worth dropping; rarely fatal on its own. |
| The trap tier. Reads as sophisticated today and will not next year. Reported as a question, not a verdict. |
| A good move. Something the page already does right, and why. |
Installing it on a Mac
Three commands. You do not need Homebrew, you do not need to know what a terminal is, and nothing below asks you to fix anything.
Open Terminal first. Press ⌘ Space, type Terminal, press Return. A window appears with
some text and a blinking cursor. Everything below is typed into that window, one line at a
time, pressing Return after each.
1. Install Codex
curl -fsSL https://chatgpt.com/codex/install.sh | shWhat you should see: a few lines of progress, then a line telling you Codex has been installed and, usually, where. It finishes in under a minute.
Then close the Terminal window and open a new one. The installer puts codex somewhere your
current window does not know about yet; a new window picks it up. Check it took:
codex --versionWhat you should see: a version number, such as codex-cli 0.5.0. If you instead see
command not found: codex, close Terminal completely (⌘ Q) and open it again.
2. Install Node
Codex does not need Node. This kit does — it is written in JavaScript and Node is what runs it.
Go to https://nodejs.org and click the button offering the LTS version. It downloads a
file ending in .pkg. Double-click it and click Continue until it says Install. That is the
whole installation.
Not Homebrew. You will find instructions telling you to install Homebrew first and then use it to install Node. Do not. Homebrew is a package manager that has to be installed and maintained itself, and it is a second thing to go wrong before you have made your first web page. The
.pkgfrom nodejs.org is the same software with none of that.
Back in Terminal (a new window again, after installing):
node --versionWhat you should see: a version number starting with v20, v22 or higher — anything at
v18.17 or above works.
3. Add this kit to Codex
codex mcp add site-kit -- npx -y github:Javendean/codex-site-kitWhat you should see: a short confirmation that the server site-kit was added. Nothing
downloads yet; that happens the first time Codex starts it.
Check it is registered:
codex mcp listWhat you should see: a list with site-kit in it, and next to it the command
npx -y github:Javendean/codex-site-kit.
4. Use it
codexThen type, in ordinary English:
Make me a website about the chess lessons I teach. Then review it and explain what is wrong.
The first run takes about half a minute while npx fetches the package. After that it is
instant. There is no build step, nothing to compile, and no configuration file to edit.
Related MCP server: Web Validator by DigestSEO
If something goes wrong
One command diagnoses everything:
npx -y github:Javendean/codex-site-kit doctorIt checks your Node version, whether the package loads, whether every tool registers, and
whether the optional browser for check_responsive is present — and for anything that fails it
prints the exact command that fixes it. It never prints a stack trace.
The two failures worth knowing in advance:
command not found: codex— you have not opened a new Terminal window since installing. Press⌘ Qto quit Terminal completely, then open it again.Codex says the server failed to start — almost always Node missing or too old. Run
node --version. If it prints nothing, go back to step 2.
Where the config lives, if you ever want to look
codex mcp add writes to ~/.codex/config.toml. The entry it makes looks like this, and you
can also write it by hand:
[mcp_servers.site-kit]
command = "npx"
args = ["-y", "github:Javendean/codex-site-kit"]
[mcp_servers.site-kit.env]
# nothing neededWhat it will not do
Stated plainly, because a tool that hides its limits is worse than one that has fewer of them.
No telemetry, ever. Nothing about you, your machine or your sites leaves the computer.
No network calls. Not one tool fetches anything. The rulebook is a set of files in this package, and it is read off disk.
No secrets, no accounts, no API keys. There is nothing to configure.
It does not render your page. Most rules read the source text, which is enough for most of them and not enough for a few. Sideways scroll on a phone, a button label wrapping to two lines, the real contrast of a colour after the cascade resolves: those need a browser, and
check_responsivemeasures them. When it cannot, it reports skipped and the command that installs the browser. A skipped check is never reported as a pass.It cannot tell you whether a page looks dated. Technical age is parseable and is covered. Aesthetic age needs a screenshot and a vision model. No amount of text parsing substitutes, and the tool says so rather than letting a clean report imply otherwise.
The only optional extra is a browser for check_responsive, and only when you want it:
npx playwright install chromiumThe twelve tools
Tool | What it is for |
| The route from never having made a website to understanding one. Ten stops, generated from the rulebook. Start here. |
| Scaffold a complete working site. No framework, no build step; double-clicking |
| Read the real colours off a photograph of the subject, with a WCAG contrast matrix. |
| Derive a palette when there is no photograph yet. |
| The whole rulebook, as an annotated critique. The one worth knowing about. |
| The full teaching note behind any finding: the threshold, the reasoning, the sources, the confidence. |
| Just the words, so you can edit the writing without the page in front of you. |
| Loads real pages in a real browser and reports actual pixel numbers. |
| Invented testimonials, ratings, counts, and quotations carrying names nobody checked. |
| Every file the site points at, and whether it exists. |
| Values written down in more than one place. A price in two files is two prices. |
| What is wrong with this machine, and the command that fixes it. |
Why the rules are what they are
Every rule in this kit names its source, and the kit refuses to load a rule that does not —
provenance is a startup error here, not a habit. RULES.md is the index; run
explain_rule on any id for the full note.
Each source carries the confidence tag the research gave it:
Tag | Meaning |
DEMONSTRATED | The source ships runnable code, a live comparator, production library CSS, or a counted sample. Verifiable without trusting anyone. |
MEASURED | Produced by inspecting real files, reproducibly. |
ASSERTED | Expert opinion, blog prose, or forum anecdote. May be right; is not evidence. |
This distinction is load-bearing. Where the research says ASSERTED, the tool reports the finding as a question about your page rather than as a gate it failed, and says so in the output. A hypothesis laundered into a hard gate is exactly the failure the kit exists to avoid. Where a source has a caveat — a self-reported false-positive rate, a commercial interest, an unverifiable revenue claim — the caveat is printed with the citation.
Named sources include the practitioners the research ranked: Emil Kowalski on motion (and the shipped Sonner and Vaul CSS where you can check he follows his own numbers), Josh W. Comeau on transitions, shadows and reduced motion, Gesso Build's deterministic anti-slop detectors, Adrian Krebs's empirical scoring of 1,590 landing pages, Nutlope's Hallmark catalogue, Rauno Freiberg's 90/10 novelty rule, CodeStitch's audited local-business practice, the GOV.UK type scale, and WCAG 2.2 AA. It also credits the Impeccable design plugin (v4.3.1) where a rule overlaps with its craft floor, and deliberately does not restate what that plugin's editor hook already enforces while you type.
One thing the rulebook refuses to let onto a page: the claim that "94% of first impressions are design-related — Stanford". It is a documented misattribution, it is the first statistic anyone reaches for, and there is a rule that catches it. The real figures are Lindgaard et al. 2006 on 50-millisecond first impressions, or the Stanford Web Credibility Project's actual 46.1%.
Learning it
LEARNING-PATH.md — ten stops, from "I have never made a website" to "I understand why that gradient was wrong."
It is generated from the rulebook, not written alongside it. Every stop names the rule ids that
carry its reasoning, and npm run docs:check fails if a stop names a rule that no longer
exists. A course maintained separately from the linter drifts away from it within a month, and
then it teaches rules the tool does not run — which teaches you to distrust the tool.
The order is deliberately not the rulebook's order. review_site sorts by how fast a
visitor notices a fault, which is right for a critique and wrong for learning. The path sorts by
what you need first: make it work, then make it not look broken, then make it not look generic,
then make it honest, then understand why the escape routes keep closing.
Ask Codex for it in words — "walk me through the learning path" — or one stop at a time.
Working on the kit itself
git clone https://github.com/Javendean/codex-site-kit
cd codex-site-kit
npm install
npm test # the full suite
npm run handshake # speak MCP to the server over stdio and print what it says
npm run docs # regenerate LEARNING-PATH.md and RULES.md from the rulebook
npm run docs:check # fail if they are stale
npm run doctor # what this machine is missingThere is deliberately no build step and no prepack script, and a test enforces it: adding
one would make npx -y github:... do work at install time, which is the difference between an
install that works on a beginner's machine and one that does not.
Licence
MIT.
Available Tools
12 toolscheck_assetsCheck that every file the site points at existsARead-onlyIdempotent
Follows every image, stylesheet, script, icon and internal link in the site and confirms the file is really there. Reports file:line for anything that is not.
Catches the case-sensitivity trap specifically: a file that resolves on a Mac because macOS ignores capitalisation, and 404s the moment the site is published to a Linux host. That one cannot be found by looking at the site in a browser on the machine that built it.
Also audits the stylesheet theme contract, because var(--token) is a reference too. A custom property defined only inside @media (prefers-color-scheme: dark) has no value in the state most visitors are in.
| Name | Required | Description | Default |
|---|---|---|---|
| ignore | No | Folder or file names to skip. Defaults cover node_modules, .git, dist, build and friends. | |
| directory | Yes | Full path to the site folder, for example /Users/brian/Sites/chess-lessons. | |
| check_links | No | Also follow internal <a href> links to other pages. Default true. | |
| check_theme | No | Also audit the CSS theme contract. Default true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| theme | No | |
| counts | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| problems | No | |
| directory | No | |
| error_code | No | Set only when status is "error". |
| files_scanned | No | |
| references_checked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description goes well beyond them by revealing specific behaviors: it reports file:line for missing assets, deliberately catches macOS-vs-Linux case-sensitivity failures, and treats CSS custom properties as references. This is exactly the kind of non-obvious behavioral context that helps an agent predict side effects and limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core behavior in the first sentence, then adds two high-value edge cases. Every sentence earns its place: none restate the tool name or repeat schema details, and the length is appropriate for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, full parameter documentation, and read-only annotations, the description closes the important gaps: asset scope, reporting format, the platform-specific failure mode, and the theme-contract nuance. An agent has everything needed to decide to invoke it and what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning to the check_theme parameter by explaining that var(--token) is a reference and that a custom property defined only inside a dark-mode media query has no value in the default state. It also clarifies the internal-link scope covered by check_links.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Follows every image, stylesheet, script, icon and internal link... and confirms the file is really there.' It also states the concrete output ('Reports file:line'), which clearly differentiates it from the sibling check tools like check_copy or check_responsive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for when this tool matters, especially the case-sensitivity trap that cannot be caught on the building Mac. It does not explicitly name sibling alternatives or say 'use this instead of X', but the scope is specific enough that an agent can recognize it as the asset-existence check among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_copyCheck the wordsARead-onlyIdempotent
Run the copy and honesty rules over a folder, or over a block of text pasted straight in.
Benefit-speak, the "not just X, it's Y" cadence, em dashes in short interface copy, fabricated precision, invented proof, unverified attributions, and claims that cannot be true or false.
Pass either directory or text. Everything it finds carries the same four answers as a
full review: what, why, who says so, and the better move.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | A block of copy to check directly, without saving it anywhere first. | |
| ignore | No | Folder or file names to skip. Defaults cover node_modules, .git, dist, build and friends. | |
| directory | No | Folder to read. Every .html file in it is checked. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| counts | No | |
| source | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| findings | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| rules_run | No | |
| error_code | No | Set only when status is "error". |
| files_read | No | |
| not_checked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare read-only and idempotent behavior, the description adds useful behavioral context: the specific issue categories it checks and the output contract of 'what, why, who says so, and the better move.' No contradiction with the annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core action first, then the rule list, then the parameter/output contract. It is slightly redundant because 'Run ... over a folder, or over a block of text' is restated in 'Pass either directory or text,' which prevents a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and sufficient annotations present, the description covers the important operational aspects: input modes, the rule set, and the result format. The main gap is the implicit relationship to sibling tools like check_honesty and review_site, which affects complete context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters with full coverage, so the baseline is a 3. The description adds meaning beyond the schema by stating 'Pass either directory or text,' which conveys that these are alternative input modes rather than interchangeable or combinable fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific action and resource: 'Run the copy and honesty rules over a folder, or over a block of text pasted straight in.' It also lists concrete examples of what the rules catch. However, it does not differentiate check_copy from the sibling check_honesty, which overlaps with the 'honesty rules' wording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool by describing the folder/pasted-text modes and the rule categories, but it never names alternatives or says when not to use it. Given the sibling list includes check_honesty)Skip, an explicit contrast would have made the guidance stronger.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_honestyCheck the site for invented contentARead-onlyIdempotent
Scans a site for content that claims something nobody earned: testimonials, star ratings, "as seen in", customer counts, lorem ipsum, placeholder brand names and contact details, and quotations that carry an attribution.
The attribution check is the one a generic linter misses. A name set on its own line under a quotation is an attribution even with no "said" and no dash, and a misattributed quote is a false statement about a real person. Report it, find a source, and record the source in .honesty.json to silence it. An entry with no source silences nothing.
Reports file:line for everything. status is "fail" only when there are errors; warnings are things to verify, not things that are definitely wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| ignore | No | Folder or file names to skip. Defaults cover node_modules, .git, dist, build and friends. | |
| ledger | No | Path to the verified-quotations ledger. Default: <directory>/.honesty.json | |
| strict | No | Treat warnings as failures too. Default false. | |
| directory | Yes | Full path to the site folder, for example /Users/brian/Sites/chess-lessons. | |
| extensions | No | File extensions to scan. Default: .html .htm .md .markdown .txt .jsx .tsx .vue .svelte .astro |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| counts | No | |
| ledger | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| findings | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| directory | No | |
| error_code | No | Set only when status is "error". |
| files_scanned | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description adds meaningful behavior: it reports file:line, defines the 'fail' status as error-only, explains warnings as items to verify, and describes how entries in .honesty.json silence findings. This gives the agent a clear model of tool behavior without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three purposeful paragraphs: what is scanned, the attribution nuance, and the reporting/status behavior. Every sentence adds relevant information, and the most important scoping details are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Together with the fully described schema, annotations, and output schema, the description covers the scan scope, the subtle attribution heuristic, the ledger workflow, and the output status semantics. Nothing essential for invoking the tool correctly is missing, apart from sibling routing, which is captured separately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all five parameters with descriptions, so the schema already carries the parameter meaning. The description references the ledger and directory behavior but does not need to add per-parameter detail. The baseline of 3 applies because the description does not materially enrich parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it scans a site for content claiming something nobody earned, with concrete examples like testimonials, star ratings, 'as seen in', and attributed quotations. This is clear and not tautological, but it does not explicitly distinguish itself from sibling tools such as check_copy or check_single_source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no explicit guidance about when to use this tool versus alternatives. The closest is the claim that the attribution check is one a generic linter misses, which implies a comparative advantage but does not state when to choose this tool over sibling tools or what to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_responsiveMeasure every page for sideways scrollARead-only
Loads each page in a real headless Chromium at a set of widths and asserts that document.documentElement.scrollWidth does not exceed window.innerWidth. Reports the actual numbers at every width, pass or fail, and names the specific elements whose edge crosses the line.
Requires Playwright, which is NOT installed with this kit. If it is missing this tool returns status "skipped" with the one command that installs it. It never reports a pass it did not measure.
| Name | Required | Description | Default |
|---|---|---|---|
| pages | No | Specific .html files to test, relative to the site folder. Default: every .html file found. | |
| height | No | Viewport height. Default 900. | |
| ignore | No | Folder or file names to skip. Defaults cover node_modules, .git, dist, build and friends. | |
| widths | No | Viewport widths in CSS pixels. Default: 320, 390, 768, 1024, 1280, 1440 | |
| directory | Yes | Full path to the site folder, for example /Users/brian/Sites/chess-lessons. | |
| timeout_ms | No | Per-page load timeout. Default 20000. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| widths | No | |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| directory | No | |
| error_code | No | Set only when status is "error". |
| page_errors | No | |
| browser_from | No | |
| measurements | No | |
| pages_tested | No | |
| overflow_count | No | |
| install_command | No | |
| browser_available | No | |
| measurements_taken | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint and openWorldHint; the description adds substantial behavioral context: real Chromium, exact assertion, per-width reporting, named offending elements, the skipped status when Playwright is missing, and a guarantee that it never reports an unmeasured pass. This far exceeds the annotation baseline without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and dense: one sentence states the core behavior and reporting, and a short dependency note covers setup and failure mode. Every sentence earns its place, with the most important assertion front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and safety annotations, the description covers the remaining decision-relevant context: exact criterion, output behavior, dependency requirement, and skip semantics. Nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with defaults and bounds documented for all six parameters, so the description does not need to repeat parameter details. The description contributes only a generic reference to 'a set of widths,' which does not add semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete, specific behavior: load each page in headless Chromium and assert that scrollWidth does not exceed innerWidth. This precise scope clearly distinguishes it from the sibling check_* tools, all of which target different concerns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the tool's context clear from its operation, but it never explicitly says when to prefer this tool over alternatives or when not to use it. No sibling comparison or exclusion is given, so usage guidance is mostly implied by the title and behavior rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_single_sourceFind values that are written down in more than one placeARead-onlyIdempotent
Scans for values that look like a fact a visitor can act on — prices, email addresses, phone numbers, times, product codes — and reports every one that appears in more than one file.
A second copy of a value is a second value. It has not disagreed yet. The storefront this kit was built from advertised one price and charged another, because the number was typed into three files and only one of them was updated.
Pass source_of_truth to enforce the strict form: the value may appear in that one file, and anywhere else is a copy.
Preset patterns: price, email, phone, sku, time, percentage, dimension. Anything else is treated as a regular expression.
| Name | Required | Description | Default |
|---|---|---|---|
| ignore | No | Folder or file names to skip. Defaults cover node_modules, .git, dist, build and friends. | |
| patterns | No | Preset names (price, email, phone, sku, time, percentage, dimension) or regular expressions. Default: price, email, phone | |
| directory | Yes | Full path to the site folder, for example /Users/brian/Sites/chess-lessons. | |
| min_files | No | How many distinct files a value must appear in before it is reported. Default 2. | |
| extensions | No | File extensions to scan. | |
| source_of_truth | No | Path, relative to the site folder, of the one file allowed to hold these values. Every match elsewhere becomes a problem. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| patterns | No | |
| directory | No | |
| inventory | No | |
| duplicates | No | |
| error_code | No | Set only when status is "error". |
| files_scanned | No | |
| source_of_truth | No | |
| copies_outside_source | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, and closed-world behavior. The description adds value beyond these by explaining a key nuance: a second copy is treated as a second value even if it has not yet disagreed with the original. It also discloses how patterns work (presets vs. regex) and that anything outside presets becomes a regular expression. This extra context about interpretation and pattern handling goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear lead sentence, an illustrative rationale, and parameter guidance. It is slightly verbose, but each sentence contributes value—explaining the tool's purpose, the reasoning behind it, and the behavior of key parameters. It front-loads the core function before diving into nuances, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with six parameters, the description covers the essential behavioral aspects: what it does, how it handles duplicates, how to restrict to a single source, default patterns, and the regex fallback. Since an output schema exists, the absence of return-format details is acceptable. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters have basic descriptions. The description adds meaningful nuance: it enumerates the preset pattern names, explains that non-preset strings are regular expressions, and clarifies the intended use of source_of_truth (the one file allowed to hold values). This goes beyond the schema's terse descriptions, enriching the semantics for pattern-related and source_of_truth parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool scans for values appearing in more than one file and reports them. The verb 'Scans' and 'reports' are specific, and the resource (values that are repeated across files) is well-defined. It even sets itself apart from sibling check tools (copy, honesty, assets) by focusing on duplication across files, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides implicit usage guidance: it explains when to enforce the strict form via source_of_truth, and gives a real-world example to illustrate the problem it solves. However, it does not explicitly name alternative tools or state when not to use it, so it lacks explicit exclusions. The context is clear enough for an agent to infer its primary use case, but not explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
doctorCheck this machine and print exactly what to fixARead-onlyIdempotent
Checks Node, the optional headless browser, and whether Codex has this server registered.
For anything missing it prints the literal command to paste. Nothing here is a suggestion to "check your configuration": every failure comes with the line that fixes it.
Run this first whenever something does not work.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| ready | No | |
| checks | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| error_code | No | Set only when status is "error". |
| blocking_failures | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description discloses that failures produce copy-pasteable fix commands and that no vague configuration suggestions are given. This sets accurate expectations for the tool's output and behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, each adding distinct value: what is checked, what is printed, and when to run. The most important information is front-loaded, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple zero-parameter diagnostic; annotations cover safety, the output schema covers return shape, and the description covers invocation timing and output style. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters with 100% description coverage, so no parameter explanation is needed. The baseline of 4 applies because there is nothing for the description to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb ('Checks') and names exact subjects: Node, the optional headless browser, and Codex server registration. This clearly differentiates it from sibling site-audit tools like check_responsive and check_copy, which inspect site content rather than the local environment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs 'Run this first whenever something does not work,' giving a clear when-to-use directive. It does not enumerate alternatives, but the run-first framing provides sufficient context for selecting this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_ruleRead the full teaching note for one ruleARead-onlyIdempotent
Given a rule id from a review — the part in square brackets — return the whole note: the exact trigger condition and where that number came from, why it matters, what it is teaching, the better move with its code, every source with its own caveat, and what the rule measured across the corpus the rulebook was built from.
Call it with no id to list the rulebook. Pass a tier, a category, or a search term to narrow it.
| Name | Required | Description | Default |
|---|---|---|---|
| rule | No | A rule id, for example "T2-EDGE-STRIPE". Leave it out to list the rulebook. | |
| tier | No | List one tier: 1, 2, 3, "floor", "honesty", "structure", "craft", "trap" or "ledger". | |
| search | No | List rules whose title or description contains this text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| rule | No | |
| tool | Yes | Which tool produced this. |
| rules | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| rulebook | No | |
| error_code | No | Set only when status is "error". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and idempotent behavior; the description adds useful behavioral context by explaining that omitting the id lists the rulebook and that filters narrow results. It does not mention pagination or freshness behavior, but the output schema and read-only annotation cover the main safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs with the main action front-loaded. The enumerated note contents are long but each item adds meaning, and there is no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no required parameters and an output schema, the description covers the main lookup mode, the list mode, and possible filters. The only real gap is the unresolved 'category' filter mention, and it could clarify how to choose among the optional arguments, but these are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the rule, tier, and search parameters. The description adds a useful 'part in square brackets' cue, but much of the no-id/list behavior is already present in the schema. The mention of 'category' as a possible filter does not match a schema property, so the description does not substantially exceed schema semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a concrete verb and resource: given a rule id, return the whole teaching note, and it enumerates what the note contains. It also clearly distinguishes the no-id rulebook-listing mode, so an agent can tell this lookup from the check/review sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit invocation contexts: with a rule id from a review, with no id to list the rulebook, and with tier/search/narrowing filters. It does not explicitly name alternatives or exclusions, but the rule-id-from-review cue and unique resource make when-to-use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
init_siteScaffold a site that passes the rulebookB
Write index.html, styles.css and NOTES.md into a folder.
The page is built to come back clean from review_site: three theme states, neutrals that carry a trace of the anchor hue, press feedback with a hover guard, 48px touch targets, 16px inputs, minmax(0, 1fr) grid tracks, overflow-x: clip, no animation above the fold, no eyebrow, no emoji icons, no side stripes, no backdrop blur.
The structure is chosen from a local ledger of what was scaffolded last, so two consecutive sites differ in their SECTIONS, not only in their colours. That is the axis the research ranks highest and recolouring the axis it ranks lowest.
Every unwritten field is a visible, labelled hole rather than filler. Nothing is invented: no testimonials, no ratings, no counts, no press.
| Name | Required | Description | Default |
|---|---|---|---|
| hue | No | Force an anchor hue in OKLCH degrees, if you already know the colour. | |
| name | No | The name to put in the header. Defaults to a title-cased version of the subject. | |
| force | No | Overwrite files that are already there. Default false. | |
| record | No | Record the choices in the local variety ledger. Default true. Turning it off means the next scaffold may repeat this shape. | |
| subject | Yes | What the site is about, in a few words. For example: "chess lessons for club players, Brooklyn". | |
| directory | Yes | Folder to write into. It is created if it does not exist, and must be empty or contain only files this tool wrote. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| next | No | |
| tool | Yes | Which tool produced this. |
| ledger | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| choices | No | |
| palette | No | |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| directory | No | |
| anchor_hue | No | |
| error_code | No | Set only when status is "error". |
| files_written | No | |
| previous_choices | No | |
| differs_from_previous | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no safety hints (all false), so the description must carry the burden. It discloses that it writes three files and that content is not invented, but it omits key side effects: it does not mention that it may overwrite existing files when force=true, that it refuses to write into a non-empty directory unless the files were tool-written, or that it writes to a local ledger by default. These behaviors are only in the parameter schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then lists many specific design constraints. While the list is long, each item is a concrete rule an agent needs to know to scaffold a compliant site. It is structured into two coherent paragraphs with minimal fluff, though it could be tightened by moving some design details to a reference.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain return values. It covers the main purpose and the design rules thoroughly, but it omits edge-case behavior (e.g., failure when directory is not empty, overwrite semantics) that are relevant to calling the tool correctly. For a scaffold tool with six parameters, a bit more operational context would help, but it is not severely incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific meaning beyond the schema—it never mentions 'hue', 'name', 'force', 'record', or 'directory' semantics. It does reference the ledger concept, but that maps to the 'record' parameter without naming it. No added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Write index.html, styles.css and NOTES.md into a folder.' The title 'Scaffold a site that passes the rulebook' reinforces the purpose. It clearly distinguishes from sibling tools like review_site or palette_from_subject, which are checks or helpers, not creators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the tool to use when you need a new site that will pass review_site ('The page is built to come back clean from review_site'). However, it never explicitly states when to use it vs alternatives, nor does it mention prerequisites or workflow ordering (e.g., 'use palette_from_subject first to choose a hue'). The context is implied, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
learning_pathThe route from never having made a website to understanding oneARead-only
Ten stops, in the order a beginner needs them — which is NOT the order the critique uses. review_site sorts by how fast a visitor notices a fault. That is right for a critique and wrong for learning. This sorts by what you need first: make it work, then make it not look broken, then make it not look generic, then make it honest, then understand why the escape routes keep closing.
Every stop is built from the rulebook itself and names the rule ids that carry its reasoning, so it cannot drift away from what the tool actually checks. Pass a stop number to read one at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| stop | No | Read one stop on its own, 1 to 10. Leave it out for the whole route. | |
| depth | No | "route" is the ten stops and what to do at each. "full" (the default) adds each rule's own reasoning and the better move underneath the stop that teaches it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| stops | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| error_code | No | Set only when status is "error". |
| rules_total | No | |
| rules_uncovered | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, and the description adds useful behavioral context: stops are derived from the rulebook, cite rule ids, and are deliberately ordered for learning rather than fault detection. This goes beyond the safety hints and clarifies what the agent can expect from the content.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, with every sentence serving a purpose: defining the route, distinguishing it from review_site, explaining provenance, and giving usage guidance. It front-loads the core concept and avoids filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, a read-only annotation, and only two optional parameters fully documented in the schema, the description supplies all necessary context for correct use. It explains the ordering rationale, the relationship to review_site, and the stop-by-stop access pattern.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented. The description adds a small clarification about passing a stop number, but it does not meaningfully extend the schema's explanation of the depth parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly defines the tool as a ten-stop learning path ordered by what a beginner needs first, and differentiates it from review_site's critique-oriented order. This gives a clear verb-resource relationship and makes sibling distinction immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly contrasts with review_site, stating that review_site's ordering is right for a critique and wrong for learning, which tells the agent when to use this tool versus that sibling. It also gives a direct usage instruction: pass a stop number to read one stop at a time.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_from_imageDerive a palette from a photographARead-onlyIdempotent
Quantises an image with median cut or k-means and returns a small, considered palette: the colours the subject is actually made of, with how much of the image each one covers.
Returns a full WCAG 2.1 contrast matrix alongside the colours, computed from relative luminance, so an unreadable pair cannot be chosen by accident. Also returns a ready-made token set for both theme states, which can be passed straight to init_site.
Reads PNG and JPEG (.png, .jpg, .jpeg). Everything is done locally; nothing is uploaded.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | How many colours to extract. Default 6. | |
| image | Yes | Full path to a PNG or JPEG file. | |
| algorithm | No | median-cut (default) splits the colour space at medians, then refines with Lloyd iterations so each colour returned is one the image really contains. k-means seeds with k-means++ instead, and is sometimes better on photographs with soft gradients. | |
| merge_similar | No | Drop colours that are nearly identical to one already found. Default true. | |
| sample_budget | No | How many pixels to sample. Default 20000, which is plenty and keeps this instant. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| image | No | |
| format | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| swatches | No | |
| algorithm | No | |
| dimensions | No | |
| error_code | No | Set only when status is "error". |
| corpus_audit | No | |
| pixels_sampled | No | |
| readable_pairs | No | |
| contrast_matrix | No | |
| suggested_tokens | No | |
| banned_hexes_checked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotent hints, and the description adds valuable behavioral detail: quantization approach, output contents, WCAG contrast computation, and explicitly that nothing is uploaded. This goes well beyond the annotations and gives an agent confidence about privacy and side-effect-free execution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight paragraphs with a clear progression: what it does, what it returns, and practical constraints (formats, privacy). Every sentence adds information, and the most important output characteristics are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters and an output schema, the description fully covers formats, algorithm behavior, output artifacts, and integration with init_site. Nothing an agent needs to decide whether to call this tool is missing, and the output schema handles return-value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents count, image, algorithm, merge_similar, and sample_budget. The description adds some connecting context (median cut vs k-means, coverage information) but does not materially enrich parameter meaning beyond what the schema already provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (quantises), a clear resource (image), and the exact output (palette with coverage, WCAG contrast matrix, token set). It is unambiguous about what the tool does and is easily distinguishable from siblings like palette_from_subject by the emphasis on photograph-derived palettes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is appropriate: extracting a palette from a photograph, with supported formats and a local-processing guarantee. It also offers algorithm-selection guidance (k-means for soft gradients) but does not explicitly state when to prefer this over palette_from_subject or other palette-related alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
palette_from_subjectDerive a palette from a subject, when there is no photograph yetARead-onlyIdempotent
Builds a complete two-state palette from one anchor hue, in OKLCH, and emits hex.
It cannot return one of the ten banned Tailwind indigos or the emerald that replaced them, cannot return pure black or pure white, holds every neutral at 0.005-0.015 chroma of the anchor hue so the greys belong to the same page as the accent, never shifts the hue between light and dark, and returns a WCAG contrast matrix for every pair a page actually puts together — so an unreadable pair cannot be chosen by accident.
It also tells you where the hue came from. If the subject names something real, it names the object. If it does not, it says the hue came from a hash of the words — which is not the same thing, and palette_from_image on a photograph is the stronger move.
| Name | Required | Description | Default |
|---|---|---|---|
| hue | No | Force an anchor hue in OKLCH degrees, 0-360, if you already know the colour you want. | |
| subject | Yes | What the site is about, in a few words. For example: "chess lessons, Brooklyn". | |
| accent_chroma | No | How loud the accent is. The corpus band is 0.12-0.22; the default is 0.16. |
Output Schema
| Name | Required | Description |
|---|---|---|
| css | No | |
| fix | No | |
| why | No | |
| dark | No | |
| tool | Yes | Which tool produced this. |
| audit | No | |
| light | No | |
| notes | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| subject | No | |
| contrast | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| accent_hue | No | |
| anchor_hue | No | |
| error_code | No | Set only when status is "error". |
| hue_source | No | |
| derived_from_something_real | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and idempotentHint=true, so the safety and determinism are covered. The description adds extensive behavioral context beyond that: the specific color exclusions (banned indigos, no pure black/white), the neutral chroma band (0.005-0.015), hue stability between light/dark, the WCAG contrast matrix guarantee, and the provenance reporting (object vs hash). These are valuable behavioral traits not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but front-loaded with the core action and constraints. Each paragraph adds a distinct piece of information: the build process and color guarantees, the contrast matrix, and the provenance/alternative tool. It could be slightly tighter but avoids redundancy and every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the output schema (present but not shown) and annotations cover safety and determinism. The description covers everything an agent needs to decide when to use it and what to expect: the output (hex, contrast matrix, provenance), the constraints on colors and hue, and the explicit alternative. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description mentions 'anchor hue' and 'accent_chroma' but does not add meaning beyond what the schema already provides (e.g., the accent_chroma corpus band of 0.12-0.22 and default 0.16 are already in the schema description). No new parameter semantics are introduced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('builds a complete two-state palette') and resource ('from one anchor hue, in OKLCH, and emits hex'), and explicitly differentiates itself from the sibling palette_from_image by noting that the image-based tool is 'the stronger move' when a photograph exists. It also details what it cannot return, leaving no ambiguity about its function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The title and description both specify the condition for use ('when there is no photograph yet'), and the description explicitly names the alternative (palette_from_image) and advises using it when a photograph exists. It also explains the provenance behavior (object vs hash) and why image-based is better, giving clear when-to and when-not-to guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_siteReview a site against the whole rulebookARead-onlyIdempotent
Read every page and stylesheet in a folder and return an annotated critique.
Each finding carries: WHAT was found with the evidence, WHY it matters, what it is teaching, WHO says so with a confidence tag and that source's caveat, WHERE the line is drawn, and the better MOVE. Findings are ordered by how fast a visitor would notice them and annotated the way a chess game is: ?? clocked in five seconds, ? felt but not named, ?! a habit worth dropping.
Rules that could not run are listed as prominently as the ones that failed, with the reason each one could not run. They are never counted as passes.
Use explain_rule with any rule id from the output to read the full teaching note, every source, every caveat, and what that rule measured across the corpus it was built from.
| Name | Required | Description | Default |
|---|---|---|---|
| skip | No | Rule ids to leave out of this run. | |
| tier | No | Only one tier: 1, 2, 3, "floor", "honesty", "structure", "craft", "trap" or "ledger". | |
| focus | No | Only run these rule ids. Leave empty to run the whole rulebook. | |
| ignore | No | Folder or file names to skip. Defaults cover node_modules, .git, dist, build and friends. | |
| directory | Yes | Full path to the site folder, for example /Users/brian/Sites/chess-lessons. | |
| concept_site | No | Declare this an unsolicited concept page rather than a live site. A few rules are right on a real site and wrong on a concept one; they suppress themselves rather than firing wrongly. | |
| max_per_rule | No | How many times one rule may report before the rest are summarised. Default 4. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fix | No | |
| why | No | |
| tool | Yes | Which tool produced this. |
| clean | No | |
| pages | No | |
| counts | No | |
| status | Yes | pass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run. |
| problem | No | |
| findings | No | |
| headline | Yes | One sentence verdict, safe to show a non-technical user. |
| directory | No | |
| rules_run | No | |
| error_code | No | Set only when status is "error". |
| files_read | No | |
| not_checked | No | |
| stylesheets | No | |
| rules_available | No | |
| missing_stylesheets | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnly/idempotent annotations: it details the exact structure of each finding, the visitor-notice ordering, the chess-style annotation meaning, and the prominent handling of rules that could not run. It also states these are never counted as passes, which is a behavioral subtlety an agent must know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than the ideal minimal definition, but every sentence carries distinct information about output structure, ordering, failed-rule behavior, or follow-up guidance. The main purpose is front-loaded in the first sentence, and the rest is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is thorough: it explains the output format, ordering principles, failure handling, and how to get deeper explanations. With a rich output schema, 100% parameter coverage, and clear annotations, nothing an agent needs to invoke review_site correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description does not add any parameter-specific meaning beyond what the schema already provides. The reference to using explain_rule with rule ids is the only parameter-related context, but that is a follow-up action rather than a semantic clarification of skip or focus.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence uses a specific verb-resource pair ('Read every page and stylesheet in a folder and return an annotated critique') and immediately scopes the action to the whole rulebook. This clearly distinguishes it from the sibling check-specific tools like check_copy or check_responsive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The title and description make clear this is the comprehensive whole-rulebook review, so the context for using it over per-check siblings is evident. It does not explicitly state when not to use it or name alternatives, but the 'whole rulebook' framing and the mention of using explain_rule as a follow-up provide solid situational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v2.0.0- First observed
check_assets - First observed
check_copy - First observed
check_honesty - First observed
check_responsive - First observed
check_single_source - First observed
doctor - First observed
explain_rule - First observed
init_site - First observed
learning_path - First observed
palette_from_image - First observed
palette_from_subject - First observed
review_site
TDQS
Scored across 12 tools
The tool families are well separated by target, and each checker addresses a distinct concern. The only real overlap is between check_copy and check_honesty, both of which claim some honesty/attribution territory, and review_site naturally overlaps with the individual checkers. The detailed descriptions make selection feasible, so this is not a serious weakness.
There is a strong check_* family and a clear palette_from_* pair, but the set mixes verb-first names like review_site and explain_rule, noun phrases like learning_path and palette_from_subject, and a single bare verb in doctor. The names are all lowercase and readable, but the overall convention is mixed rather than uniform.
12 tools is squarely in the well-scoped range for a site review and scaffolding kit. Each checker targets a separate concern, and the supporting tools for explanation, learning, scaffolding, palette generation, and diagnostics all earn their place.
The set covers the full workflow: scaffold a site, generate palettes, run a full critique, run targeted checks, explain findings, and diagnose the environment. There are no obvious dead ends or missing operations that would block an agent from completing a meaningful task.
Maintenance
Related MCP Connectors
Build, version, review, and export websites, web apps, and games from a conversation.
Serves your design system and coding standards to coding agents, so they stop guessing.
Scan a web page for accessibility, security, privacy, quality and SEO issues, with fixes.
Audit public webpages and supplied markup for HTML, CSS, SEO, JSON-LD, and link issues.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables auditing web pages for WCAG violations, applying deterministic fixes and PRs, all through MCP clients like Claude Desktop.7MIT
- AlicenseAqualityAmaintenanceEnables AI coding assistants to validate HTML/CSS markup using W3C APIs, perform technical SEO audits, check broken links, and validate JSON-LD schemas directly in local workspaces.2816 npm7MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI coding agents to plan, build, and review websites and product interfaces with a persistent, user-led process, including design direction, component contracts, and implementation review.-
- AlicenseAqualityBmaintenanceEnables AI agents to audit web surfaces for conformance and generate findability and delivery metadata, including meta tags, JSON-LD, sitemaps, robots.txt, image markup, and contrast-checked palettes, with provenance-stamped results.118 npmApache 2.0