Skip to main content
Glama

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 | sh

What 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 --version

What 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 .pkg from nodejs.org is the same software with none of that.

Back in Terminal (a new window again, after installing):

node --version

What 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-kit

What 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 list

What 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

codex

Then 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 doctor

It 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 ⌘ Q to 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 needed

What 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_responsive measures 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 chromium

The twelve tools

Tool

What it is for

learning_path

The route from never having made a website to understanding one. Ten stops, generated from the rulebook. Start here.

init_site

Scaffold a complete working site. No framework, no build step; double-clicking index.html opens a finished page.

palette_from_image

Read the real colours off a photograph of the subject, with a WCAG contrast matrix.

palette_from_subject

Derive a palette when there is no photograph yet.

review_site

The whole rulebook, as an annotated critique. The one worth knowing about.

explain_rule

The full teaching note behind any finding: the threshold, the reasoning, the sources, the confidence.

check_copy

Just the words, so you can edit the writing without the page in front of you.

check_responsive

Loads real pages in a real browser and reports actual pixel numbers.

check_honesty

Invented testimonials, ratings, counts, and quotations carrying names nobody checked.

check_assets

Every file the site points at, and whether it exists.

check_single_source

Values written down in more than one place. A price in two files is two prices.

doctor

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 missing

There 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 tools
check_assetsCheck that every file the site points at existsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ignoreNoFolder or file names to skip. Defaults cover node_modules, .git, dist, build and friends.
directoryYesFull path to the site folder, for example /Users/brian/Sites/chess-lessons.
check_linksNoAlso follow internal <a href> links to other pages. Default true.
check_themeNoAlso audit the CSS theme contract. Default true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
themeNo
countsNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
problemsNo
directoryNo
error_codeNoSet only when status is "error".
files_scannedNo
references_checkedNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 wordsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoA block of copy to check directly, without saving it anywhere first.
ignoreNoFolder or file names to skip. Defaults cover node_modules, .git, dist, build and friends.
directoryNoFolder to read. Every .html file in it is checked.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
countsNo
sourceNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
findingsNo
headlineYesOne sentence verdict, safe to show a non-technical user.
rules_runNo
error_codeNoSet only when status is "error".
files_readNo
not_checkedNo

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 contentA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ignoreNoFolder or file names to skip. Defaults cover node_modules, .git, dist, build and friends.
ledgerNoPath to the verified-quotations ledger. Default: <directory>/.honesty.json
strictNoTreat warnings as failures too. Default false.
directoryYesFull path to the site folder, for example /Users/brian/Sites/chess-lessons.
extensionsNoFile extensions to scan. Default: .html .htm .md .markdown .txt .jsx .tsx .vue .svelte .astro

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
countsNo
ledgerNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
findingsNo
headlineYesOne sentence verdict, safe to show a non-technical user.
directoryNo
error_codeNoSet only when status is "error".
files_scannedNo

TDQS

A3.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 scrollA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pagesNoSpecific .html files to test, relative to the site folder. Default: every .html file found.
heightNoViewport height. Default 900.
ignoreNoFolder or file names to skip. Defaults cover node_modules, .git, dist, build and friends.
widthsNoViewport widths in CSS pixels. Default: 320, 390, 768, 1024, 1280, 1440
directoryYesFull path to the site folder, for example /Users/brian/Sites/chess-lessons.
timeout_msNoPer-page load timeout. Default 20000.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
widthsNo
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
directoryNo
error_codeNoSet only when status is "error".
page_errorsNo
browser_fromNo
measurementsNo
pages_testedNo
overflow_countNo
install_commandNo
browser_availableNo
measurements_takenNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 placeA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ignoreNoFolder or file names to skip. Defaults cover node_modules, .git, dist, build and friends.
patternsNoPreset names (price, email, phone, sku, time, percentage, dimension) or regular expressions. Default: price, email, phone
directoryYesFull path to the site folder, for example /Users/brian/Sites/chess-lessons.
min_filesNoHow many distinct files a value must appear in before it is reported. Default 2.
extensionsNoFile extensions to scan.
source_of_truthNoPath, relative to the site folder, of the one file allowed to hold these values. Every match elsewhere becomes a problem.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
patternsNo
directoryNo
inventoryNo
duplicatesNo
error_codeNoSet only when status is "error".
files_scannedNo
source_of_truthNo
copies_outside_sourceNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 fixA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
readyNo
checksNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
error_codeNoSet only when status is "error".
blocking_failuresNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ruleA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ruleNoA rule id, for example "T2-EDGE-STRIPE". Leave it out to list the rulebook.
tierNoList one tier: 1, 2, 3, "floor", "honesty", "structure", "craft", "trap" or "ledger".
searchNoList rules whose title or description contains this text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
ruleNo
toolYesWhich tool produced this.
rulesNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
rulebookNo
error_codeNoSet only when status is "error".

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hueNoForce an anchor hue in OKLCH degrees, if you already know the colour.
nameNoThe name to put in the header. Defaults to a title-cased version of the subject.
forceNoOverwrite files that are already there. Default false.
recordNoRecord the choices in the local variety ledger. Default true. Turning it off means the next scaffold may repeat this shape.
subjectYesWhat the site is about, in a few words. For example: "chess lessons for club players, Brooklyn".
directoryYesFolder to write into. It is created if it does not exist, and must be empty or contain only files this tool wrote.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
nextNo
toolYesWhich tool produced this.
ledgerNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
choicesNo
paletteNo
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
directoryNo
anchor_hueNo
error_codeNoSet only when status is "error".
files_writtenNo
previous_choicesNo
differs_from_previousNo

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 oneA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
stopNoRead one stop on its own, 1 to 10. Leave it out for the whole route.
depthNo"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

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
stopsNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
error_codeNoSet only when status is "error".
rules_totalNo
rules_uncoveredNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 photographA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoHow many colours to extract. Default 6.
imageYesFull path to a PNG or JPEG file.
algorithmNomedian-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_similarNoDrop colours that are nearly identical to one already found. Default true.
sample_budgetNoHow many pixels to sample. Default 20000, which is plenty and keeps this instant.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
imageNo
formatNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
headlineYesOne sentence verdict, safe to show a non-technical user.
swatchesNo
algorithmNo
dimensionsNo
error_codeNoSet only when status is "error".
corpus_auditNo
pixels_sampledNo
readable_pairsNo
contrast_matrixNo
suggested_tokensNo
banned_hexes_checkedNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 yetA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
hueNoForce an anchor hue in OKLCH degrees, 0-360, if you already know the colour you want.
subjectYesWhat the site is about, in a few words. For example: "chess lessons, Brooklyn".
accent_chromaNoHow loud the accent is. The corpus band is 0.12-0.22; the default is 0.16.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cssNo
fixNo
whyNo
darkNo
toolYesWhich tool produced this.
auditNo
lightNo
notesNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
subjectNo
contrastNo
headlineYesOne sentence verdict, safe to show a non-technical user.
accent_hueNo
anchor_hueNo
error_codeNoSet only when status is "error".
hue_sourceNo
derived_from_something_realNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 rulebookA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoRule ids to leave out of this run.
tierNoOnly one tier: 1, 2, 3, "floor", "honesty", "structure", "craft", "trap" or "ledger".
focusNoOnly run these rule ids. Leave empty to run the whole rulebook.
ignoreNoFolder or file names to skip. Defaults cover node_modules, .git, dist, build and friends.
directoryYesFull path to the site folder, for example /Users/brian/Sites/chess-lessons.
concept_siteNoDeclare 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_ruleNoHow many times one rule may report before the rest are summarised. Default 4.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixNo
whyNo
toolYesWhich tool produced this.
cleanNo
pagesNo
countsNo
statusYespass = checked and clean. fail = checked and found problems. skipped = nothing was measured. error = the tool could not run.
problemNo
findingsNo
headlineYesOne sentence verdict, safe to show a non-technical user.
directoryNo
rules_runNo
error_codeNoSet only when status is "error".
files_readNo
not_checkedNo
stylesheetsNo
rules_availableNo
missing_stylesheetsNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 12 tool updatesv2.0.0
    • First observedcheck_assets
    • First observedcheck_copy
    • First observedcheck_honesty
    • First observedcheck_responsive
    • First observedcheck_single_source
    • First observeddoctor
    • First observedexplain_rule
    • First observedinit_site
    • First observedlearning_path
    • First observedpalette_from_image
    • First observedpalette_from_subject
    • First observedreview_site

TDQS

A4/5.0

Scored across 12 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers