auditor-mcp: Instructions file for Codex

AGENTS.md

auditor-mcp AGENTS.md is an instructions file for Codex, OpenCode from sitelint/auditor-mcp. It costs 2,333 tokens per session, scanned A, original, MPL-2.0.

Project instructions for developing the SiteLint Auditor MCP server, a TypeScript service that uses browser automation to audit websites for accessibility, search visibility, performance, and security.

In plain words
What is it for?
Use it when changing the SiteLint Auditor MCP server, its agent plugins, marketplace metadata, or release setup.
Why use it?
It records project-specific build, formatting, naming, packaging, and configuration rules that are easy to miss.

Instructions file for CodexOpenCode

Written for Codex and OpenCode: the file is AGENTS.md. Also seen: mentions .claude-plugin; mentions Claude Code; mentions Codex.

This is sitelint/auditor-mcp's own configuration. It tells Codex and OpenCode how to work on auditor-mcp itself, so it is not a mod to install elsewhere. Copy it as a starting point and replace the rules that are about this project. Everything auditor-mcp configures →

Reuse

Borrowing it

Nothing to install: this file belongs to sitelint/auditor-mcp. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.

Copy the file
curl -O https://raw.githubusercontent.com/sitelint/auditor-mcp/main/AGENTS.md
Clone the repo
git clone --depth 1 https://github.com/sitelint/auditor-mcp

Made for: Codex, OpenCode.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for auditor-mcp AGENTS.md

README.md
[![agentmods](https://agentmods.dev/badge/instructions/sitelint/auditor-mcp/agents-md/github.svg)](https://agentmods.dev/instructions/sitelint/auditor-mcp/agents-md)
Your own site
<a href="https://agentmods.dev/instructions/sitelint/auditor-mcp/agents-md"><img src="https://agentmods.dev/badge/instructions/sitelint/auditor-mcp/agents-md/github.svg" alt="Measured on agentmods" height="20"></a>

Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.

agentmods 80×15 button for auditor-mcp AGENTS.md

Your own site · 80×15
<a href="https://agentmods.dev/instructions/sitelint/auditor-mcp/agents-md"><img src="https://agentmods.dev/badge/instructions/sitelint/auditor-mcp/agents-md.svg" alt="Reviewed on agentmods" width="80" height="20"></a>
Per session 2,333 This file is loaded in full into every session.
When invoked 2,333 The same file — it is already loaded in full.
Security scan A 0 findings. A grade says what 26 rules found in the file — not that it is safe.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5.1 $0.02333 $0.02333
Opus 5 $0.01167 $0.01167
Sonnet 5 $0.00467 $0.00467
Haiku 4.5 $0.00233 $0.00233

Measured today against content hash 958fcf146cc5, method: parsed. Prices are Anthropic first-party input rates as of 2026-09-17, from the pricing page.

Security

Grade A, and why

auditor-mcp AGENTS.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

AGENTS.md · 62 lines

How it starts

The opening of the file, as written. The whole thing — 62 lines — stays where its author put it; the contents beside it link to each section on GitHub.

AGENTS.MD

Project

SiteLint MCP server for the SiteLint Auditor engine - WCAG and SiteLint Best Practices audits for accessibility, SEO, performance, and security via LLM agents. TypeScript, ESM ("type": "module"), builds to dist/ with tsc. Distributed via npm (@sitelint/auditor-mcp); uses Puppeteer to drive Chrome/Chromium. MCP registry metadata lives in server.json (releases sync its version to package.json via scripts/sync-server-json-version.js). Agent plugins live in the repo root (Claude Code + Codex) with marketplace manifests at .claude-plugin/marketplace.json and .agents/plugins/marketplace.json; the sync script also keeps plugin versions in step with package.json.

Code style notes (supplementing ESLint)

  • no-process-env is an error – don't use process.env.
  • Prettier is configured for formatting but the repo does not have a format script – run eslint --fix instead.
  • No lockfilepackage-lock=false in .npmrc. Exact versions (save-exact=true).

Code style additional rules

  1. Meaningful names – avoid data, temp, foo.
  2. Empty lines between logical sections – add blank lines to separate logical blocks within functions (e.g., between variable declarations, conditionals, loops, and return statements). For example, put an empty line between an if block and a subsequent const declaration, or between a const and a return.
  3. Object properties sorted alphabetically.
  4. No implicit coercion – use strict === and !==. Avoid loose equality operators (==, !=).
  5. Negation for boolean toggling – the ! operator is allowed and encouraged for boolean assignment and toggling (e.g., flag = !isEnabled, item.hidden = !isVisible). For conditional checks, follow rule 12 (use if (!value) for false checks, not if (value === false)).
  6. Use const + arrow functions for callbacks/standalone functions.
  7. Optional chaining allowed, but not to change control flow silently. Prefer explicit checks when null/undefined is an error state.
  8. Callback functions – extract the inline callbacks into named const functions. One-liners are fine inline. No large anonymous functions inline.
  9. Context execution – use globalThis instead of window, global, or self unless explicitly justified.
  10. await must be wrapped in try-catch – every await call must be inside a try-catch block. No unhandled promise rejections. If you don't need the error, at minimum log it with console.error.
  11. Always use fully qualified global references – don't rely on implicit globals. Use globalThis.fetch not fetch, globalThis.setTimeout not setTimeout, etc. Exceptions: console and document may be used without globalThis.
  12. No negation in boolean conditions – when checking a boolean value in a conditional (e.g., if, while, ternary), use if (value) for true checks and if (value === false) for false checks. Do not use the logical NOT operator (!) for false checks (e.g., if (!value) is forbidden). This makes the condition explicit and avoids subtle bugs.
  13. No TypeScript typings in JavaScript files.js files should not contain type annotations. Keep types only in .ts files.
  14. Parentheses around arrow function arguments – always wrap arrow function arguments in parentheses, even for single parameters. Use (x) => x * 2 not x => x * 2.
  15. Prefer early returns over nested if blocks – avoid large if blocks by inverting conditions and returning early. Keep nesting to a minimum (max 2-3 levels deep).
  16. No async misuse at top-level – wrap top-level async logic in an immediately invoked function expression (IIFE) or use a named function that gets called. Never leave top-level await unhandled.
  17. Explicit type checking – don't check just for undefined. Always validate that the value matches the expected type. Watch for the null trap: typeof null === 'object'. Always explicitly exclude null when checking for objects. For example, use typeof value === 'object' && value !== null instead of just typeof value === 'object'. 17.1. Complete explicit types – include all relevant runtime states in explicit type annotations, including null and undefined when an API can return them. For example, use RegExpMatchArray | null for String.match(), not only RegExpMatchArray.
  18. Class member order – maintain the following order within classes:
    • Class properties: protected, private, public (alphabetically within each group)
    • Constructor
    • Methods: protected, private, public (alphabetically within each group)
    • Angular lifecycle methods (e.g., ngOnInit, ngOnDestroy) must come after all public methods
  19. Avoid hard-coded strings – extract string literals into named constants or enums. This ensures consistency, prevents typos, and makes refactoring easier. Use, for example, const ACTION_SAVE = 'save' instead of repeating 'save' throughout the codebase.
  20. Pass function references directly – when adding event listeners, pass the function reference directly instead of wrapping in an anonymous function. Use addEventListener('click', handler) not addEventListener('click', () => handler()). For class methods, use this.method.bind(this).
  21. Avoid self-explanatory comments – don't comment what the code does if the code itself is clear. Comments should explain "why" (business logic, edge cases, workarounds) not "what". Exception: complex algorithms, non-obvious performance optimizations, or temporary // TODO comments.
  22. Use += 1 for increments – avoid the ++ operator. Use i += 1 instead of i++ in loops and counters. This makes increment behavior explicit and avoids confusion between post-increment and pre-increment.
  23. Explicit array emptiness check – when checking if an array has elements, use Array.isArray(array) && array.length > 0. Don't rely on truthiness or optional chaining alone, as they can be ambiguous with null, undefined, or empty arrays.
  24. Multi-line object and array formatting – when an object or array has more than one property/element, format it vertically with line breaks after the opening bracket and before the closing bracket. Each property/element on its own line. Single-property objects or single-element arrays may remain on one line.
  25. Avoid as unknown as Type casting – casting through unknown bypasses type safety and hides type mismatches. If you must cast, prefer as Type with a runtime check. Use unknown casting only as an absolute last resort when interfacing with truly untyped data (e.g., JSON.parse), and always add a comment explaining why.
  26. No trailing commas – avoid trailing commas in objects, arrays, function arguments, or any other syntax. Trailing commas can cause issues in older JavaScript environments and create inconsistent git diffs.
  27. Indentation – use 2 spaces for indentation. No tabs.
  28. No underscore prefix for private members – don't use underscore prefix (e.g., _privateProperty). TypeScript's private keyword already indicates visibility. Use standard naming without underscores.
  29. Use template literals for string concatenation – avoid + for string concatenation. Use template literals (backticks) instead. For example, use ${pct}% not pct + '%', and use Hello ${name} not 'Hello ' + name.
  30. Class property initialization in constructor – all class properties must be initialized directly in the constructor. Do not initialize properties at declaration (e.g., private count = 0). The exceptions are @Input() properties (which are set by Angular), rule classes extending AbstractRule (where selector and ruleConfig are initialized at declaration), and properties using the ! definite assignment assertion (with a comment explaining why). This ensures clear initialization flow and avoids the "not definitely assigned" error.
  31. Use Number.parseInt instead of parseInt – always use Number.parseInt rather than the bare parseInt function. This makes the global namespace explicit and avoids ambiguity. Always include the radix parameter (e.g., Number.parseInt(value, 10)).
  32. Avoid long anonymous functions in new Promise – when creating a new Promise, keep the executor function short (2-3 lines max). If the logic is longer, extract it to a named const function. This improves readability and reusability.
  33. Use addEventListener instead of on-event properties – avoid assigning event handlers directly to DOM element properties like img.onload, button.onclick, or window.onload. Use addEventListener instead. This allows multiple listeners, better cleanup, and avoids accidental overrides.
  34. Use { once: true } for one-time event listeners – when an event listener is intended to run only once (e.g., load, error, click for a one‑time action), always pass the { once: true } option. This automatically removes the listener after execution, preventing memory leaks and unintended multiple calls.
  35. Interfaces prefixed with I (e.g., IAuditorReport). Enforced by @typescript-eslint/naming-convention.
  36. No implicit coercion with ! on non‑booleans – do not use the logical NOT operator (!) to coerce a non‑boolean value to a boolean (e.g., if (!obj), !!value). Instead, use explicit type‑specific checks that validate the expected shape or type of the data. For example, use typeof value === 'object' && value !== null for objects, Array.isArray(value) for arrays, value !== null && value !== undefined for optional values, etc. The ! operator is allowed only when the operand is already a boolean (e.g., toggling a flag: flag = !flag).

Read the full file on GitHub · 62 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. today Changed · -6 tokens per session 958fcf146cc5
  2. 2d ago First seen · 62 lines · 2,339 tokens per session scan A bae0237cc864

Subscribe to this mod's changes

auditor-mcp AGENTS.md is an instructions file published in the GitHub repository sitelint/auditor-mcp (0 stars, last pushed 2d ago), licensed MPL-2.0. It adds 2,333 tokens to every session, about $0.0117 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-15.

Related

Other instructions, from other repositories

vscode buildNext.instructions.md

Working notes and architecture documentation for the new esbuild-based build system in build/next. Use when making changes to the new build pipeline (transpile/bundle commands, NLS plugin, source-map handling, resource copying, or self-hosting watch tasks).

microsoft/vscode · 8,838 tokens

spec-kit AGENTS.md

AGENTS.md instructions for github/spec-kit, covering agents.md, about spec kit and specify, quickstart — add a new integration in 5 steps, integration architecture and integrationmanifest — file tracking.

github/spec-kit · 7,126 tokens

next.js AGENTS.md

AGENTS.md instructions for vercel/next.js, covering next.js development guide, codebase structure, monorepo overview, core package: packages/next and other important packages.

vercel/next.js · 7,296 tokens

codex AGENTS.md

AGENTS.md instructions for openai/codex, covering rust/codex-rs, the codex-core crate, code review rules, crate api surface and model visible context.

openai/codex · 5,153 tokens

langchain AGENTS.md

AGENTS.md instructions for langchain-ai/langchain, covering global development guidelines for the langchain monorepo, corridor security analysis, project architecture and context, monorepo structure and development tools & commands.

langchain-ai/langchain · 4,469 tokens

vscode oss-third-party-notices.instructions.md

Instructions for microsoft/vscode, covering vs code oss third-party-notices pipeline, architecture, pipeline flow in ci, applying the notice (cutover) and fallback chain (never fail the build).

microsoft/vscode · 5,001 tokens