# AGENTS.md: jwatte.com

Operator briefing for AI agents and AI coding tools (Cursor, Claude Code, Codex, Copilot, Gemini CLI, etc.) consuming this site.

Spec: https://agents.md/

## What this site is

J.A. Watte's author hub + 359 free browser-side audit / generator tools. Static Eleventy site on Netlify. Public, read-only. No accounts, no API keys, no tracking pixels beyond GA4 + Clarity.

## Agent-callable surface

Tools at `/tools/<slug>/` that have a URL field accept an optional `?url=<target>` query param that fills it in; add `&autorun=1` to start the run as well. Examples:

- `https://jwatte.com/tools/agent-ready-audit/?url=https%3A%2F%2Fexample.com&autorun=1`
- `https://jwatte.com/tools/mega-analyzer/?url=https%3A%2F%2Fexample.com&autorun=1`
- `https://jwatte.com/tools/wcag-accessibility-audit/?url=https%3A%2F%2Fexample.com&autorun=1`

Tool catalog: `https://jwatte.com/tools/` (visible) or `/.well-known/agent-skills/index.json` (machine-readable v0.2.0 index) or `/.well-known/api-catalog` (RFC 9727 linkset).

## Discovery resources

| Resource | Path |
|---|---|
| llms.txt | `/llms.txt` |
| llms-full.txt | `/llms-full.txt` |
| Markdown homepage | `/index.md` |
| Per-post markdown | `/blog/<slug>.md` |
| JSON Feed v1.1 | `/feed.json` |
| Sitemap | `/sitemap.xml` |
| AI catalog (ARD manifest: lists the MCP server card, the A2A agent card and the agent skills; also at `/.well-known/ai-catalog.json`, linked from robots.txt `Agentmap` and the home page `rel="ard"` Link header) | `/.well-known/ard.json` |
| API Catalog (RFC 9727) | `/.well-known/api-catalog` |
| MCP Server Card (read-only MCP server at `/mcp`; also served at `/mcp/server-card` and `/.well-known/mcp.json`) | `/.well-known/mcp/server-card.json` |
| Agent Skills (v0.2.0) | `/.well-known/agent-skills/index.json` |
| A2A Agent Card (read-only site guide agent; JSON-RPC, A2A 1.0 and 0.3) | `/.well-known/agent-card.json` |
| ai-plugin manifest | `/.well-known/ai-plugin.json` |
| Robots policy | `/robots.txt` (Content-Signal: search=yes, ai-input=yes, ai-train=yes) |
| AI training policy | `/ai.txt` |
| Security contact | `/.well-known/security.txt` |

## MCP server

A public, read-only Model Context Protocol server answers at `https://jwatte.com/mcp` (Streamable HTTP, JSON-RPC over POST; protocol 2026-07-28 and the 2025 revisions). No account, key or payment; rate limited to 60 requests a minute per IP. Server Card: `/.well-known/mcp/server-card.json`. Tools, named like the WebMCP ones below:

- `find_tool` (`need`): the best few free tools for a plain-language need, with links.
- `list_audit_tools` (`category`, `search`, `limit`, `offset`): the tool catalog, a page at a time.
- `audit_url` (`tool`, `url`): the `?url=...&autorun=1` link that runs a tool on a public http(s) site in the browser that opens it. The MCP server itself never fetches the site. For page audits such as Mega Analyzer, the opened tool page sends the address to jwatte.com's fetch function, which fetches the target site and may use configured proxies. The MCP server refuses localhost, private, link-local and CGNAT addresses, internal names, credentials and non-standard ports.
- `search_blog` (`query`, `limit`): articles by keyword, with title, date and link.
- `get_book_info` (`slug`) and `recommend_book` (`topic`): the six books, which are sold on Amazon.

Nothing on the server buys, submits, stores or changes anything.

## Forms: an assistant may fill, never send

The contact form (on every page, and at `/contact/`) and the newsletter signup are sent by the person. An assistant may fill in the contact form for a person, but only the person sends it: they check it, add their own name and email, and press Send. No tool here, on `/mcp` or in WebMCP, sends a form or a message. Never tell a person a message was sent for them.

## Reviews: only readers write them

Readers review the books on Goodreads (https://www.goodreads.com/author/show/69337253.J_A_Watte) and Amazon. Only readers write and post reviews of the books, in their own words. An assistant may give a reader the link, but never writes a review or posts one for a reader, and never offers anything for one.

## Content negotiation

`Accept: text/markdown` requests on `/` return a markdown variant. Per-page `.md` companions exist at `/blog/<slug>.md` for every blog post. `Vary: Accept` is set on those responses so CDNs don't collapse markdown and HTML cache entries.

## WebMCP

Every page registers tools imperatively with `document.modelContext.registerTool()`, one call per tool (`navigator.modelContext` is accepted as an alias). `provideContext()` is used only as a fallback on older browser builds; the WebMCP draft removed it on 2026-03-05. `/js/webmcp-init.js` registers `list_audit_tools`, `audit_url`, `search_blog`, `get_book_info` and `recommend_book`. A small inline block in the page layout also registers `get_site_info`. On an older build that only has `provideContext()`, the external file's call replaces the whole set, so only the five tools from `/js/webmcp-init.js` remain. Every tool is marked `readOnlyHint: true`: each one only returns data or a link.

## Conventions for agent-edited content

If you are editing any content here on behalf of the operator (Josh Watte / J.A. Watte):

- Don't introduce new dependencies. The site is plain Eleventy + Nunjucks + vanilla JS. No React, no TypeScript, no bundlers.
- Follow the blog frontmatter shape: `layout`, `title`, `date`, `pageTitle`, `pageDescription`, `heroImage`, `tags: post`.
- `heroImage` slug must match the markdown filename slug exactly: `blog-foo-bar.md` → `/images/blog-foo-bar.webp`.
- Posts dated `>= 2026-04-20` automatically carry an editorial-note aside via the layout, so don't add one manually.
- AI-crawler allow-list, not deny-list (see `/robots.txt`).
- Tool watermarks are stable: don't regenerate the `jw-watermark-token-8f3a1d7c9e` token in any tool page.

## What NOT to do

- Don't post-process the response from `/.netlify/functions/fetch-page` server-side; it's a thin proxy with an Origin allow-list and per-IP rate limit.
- Don't scrape `/llms-full.txt` for training without an explicit user request. The site allows AI training in `Content-Signal` but per-bot policy in `ai.txt` is more nuanced.
- Don't crawl `/private`, `/admin`, or anything under `/tools/*/results/`. Those paths are reserved.

## Out-of-scope here

This file describes the agent-facing surface. For human contributors: see `/about/` for the author bio and `/disclaimer/` for terms.
