# For agents — Aaron Chartier

This site is built to be read by machines as well as people. The tools are deterministic functions that run in your browser; what you type is never transmitted. Pass input in the URL fragment (after `#`) and it stays client-side — a `?query` is sent to the server like any URL and can be logged.

## Machine-readable surfaces

- https://aaronchartier.com/for-agents.md — the agent contract as markdown — machine surfaces, in-page tool API, URL invocation, WebMCP
- https://aaronchartier.com/llms.txt — site index for language models
- https://aaronchartier.com/index.md — this page as markdown
- https://aaronchartier.com/tools/index.json — machine manifest of the client-side tools
- https://aaronchartier.com/.well-known/agents.json — agent manifest of the site and its tools (jsonagents.org v0.1.0)
- https://aaronchartier.com/robots.txt — all crawlers welcome
- https://aaronchartier.com/sitemap-index.xml — sitemap

Every page also has a markdown mirror: `/about.md`, `/now.md`, `/blog/<slug>.md`, and this page at `/for-agents.md`.

## In-page tool API

Each tool page hydrates an island and exposes its API on `window.__tools[slug]`:

- `run(input)` — calls the underlying pure function and returns its result. `input` is a plain object; the accepted fields are documented per tool by `describe()`.
- `describe()` — returns `{ slug, params, returns }` so you can discover a tool's parameters and output shape at runtime.

Results also render into the element with `id="tool-output"` — a stable selector if you would rather read the rendered DOM than call the API.

```js
// on a live tool page, after hydration
window.__tools["base64"].describe();
const result = window.__tools["base64"].run({ input: "…" });
document.getElementById("tool-output").textContent;
```

## URL invocation

Documented parameters pre-fill a tool's inputs and run on load — a URL alone can drive a tool, no scripting required. Prefer the fragment (`#`); the browser never sends it to the server, so the input stays client-side. Each tool's parameters are listed in its `describe()` and its `/tools/<slug>.json` manifest.

```
https://aaronchartier.com/tools/base64#input=hello
```

A `?query` form also works for back-compat, but a query string is part of the request and can be logged at the origin — prefer the `#` form for anything sensitive.

## WebMCP

Where the browser exposes `navigator.modelContext` (the Web Model Context Protocol), every tool registers itself there automatically as its page loads — read-only, since the tools are deterministic and side-effect-free. Where the API is absent it is a no-op, and the tools remain reachable through the in-page API, URL parameters, and the manifests above.

---

Canonical: https://aaronchartier.com/for-agents · Markdown mirror of the agent contract · © 2026 Aaron Chartier
