# What this site publishes for AI agents

An agent does not see the design. It reads the accessibility tree, the HTML underneath it, and whatever machine-readable files it can find. This page is the list of what is actually here.

Google's own guidance for agent-friendly sites makes the point plainly: an agent navigates the accessibility tree, so semantic HTML and named controls are the interface. Everything below is a property of this site you can verify from a URL — not a promise.

## The accessibility tree is the interface

All 250 indexable pages on this site carry the same structural skeleton: a skip link, exactly one first-level heading, and one main landmark. Navigation and breadcrumbs are named landmarks, and every user-facing form control has an accessible name — including the ones inside a wrapped label.

None of that is decoration. It is what makes a page traversable when there is no screen involved.

- **One main landmark** — every page opens its content in <main id="main">, so an agent can skip the chrome in one step

- **One first-level heading** — exactly one <h1> per page, with the section headings below it in document order

- **Named navigation** — the primary nav and the breadcrumb trail are <nav> elements with their own accessible names

- **Real controls** — buttons are <button>, links are <a>, and every form field has a label or an accessible name

- **Skip link first** — the first focusable element on every page jumps straight to the main landmark

## Nothing here needs JavaScript to read

Every page is static HTML, written to disk before it is served. JavaScript on this site is enhancement only — turn it off and the content, the navigation and the prices are all still there.

Two places where that is easy to test: the city finder on the service-areas hub is a real form that submits as a plain GET with no script running, and the price ranges in the estimator are in the static HTML before any script recomputes them.

This also means there is no client-side routing to defeat: fetching a URL returns that page's content, first request.

## A plain-markdown twin of every page worth reading

A plain-markdown twin sits at 30 URLs on this site, each at its own address with '.md' appended — the homepage, the about page, all four service pages, the services hub, every case study, the remote page, this page and every guide. No navigation, no chrome, no styling: the page's actual content as text.

The twins are extracted from the built HTML rather than written separately, so they cannot describe a page that no longer exists.

- **Convention** — append .md to the page URL with its trailing slash removed; the site root is the one exception and keeps /index.md

- **Index** — llms.txt lists every twin with its description, grouped by section

- **Everything at once** — llms-full.txt is the whole set concatenated into one file

## One entity graph, not one per page

The Organization and Person nodes are emitted from a single function, so no two pages can describe this business differently. A build guard fails the deploy if any two pages define the same @id with different content — agreement between pages is asserted, not assumed.

On top of that each page carries what it actually is: a Service or ProfessionalService, a Place for a city page, a BreadcrumbList, and an FAQPage wherever there is a visible FAQ.

Every FAQPage question and answer on this site also appears as visible text on the page it belongs to. That is checked on every build, because structured data a reader cannot find is the easiest kind to get wrong by accident.

## Three read-only JSON endpoints, and a manifest that describes them

If you would rather not parse a page at all, the same facts are published as JSON. Plain HTTP GET, no authentication, no write operations, and each file is generated from the same source the visible pages render from — so the JSON cannot disagree with the site.

- **services** — All services and their pricing (fixed / from / tiered / quote).

- **service-area** — Cities with a dedicated local page, plus the coverage model.

- **process** — How an engagement works: steps, ownership, and payment model.

- **discovery** — /.well-known/ai-tools.json describes all three, with an output schema for each. It is a custom shape, not the agents.json spec — it says so in the file.

The service-area file covers the 197 cities with their own page. Absence from it is not a statement that the area is unserved, and the file's own coverage note says exactly that.

## WebMCP is here, and it is an experiment with an end date

The site registers three read-only WebMCP tools that call the JSON endpoints above — nothing more. There are no write or action tools, so an agent cannot spend money or send anything through this layer.

Be clear about what that is worth today: WebMCP is available only in Chrome, only under an origin trial, and this site's trial token expires on 2026-11-17. After that the browser API is off unless it ships properly, and the script becomes a no-op. No polyfill is shipped, because loading one for every visitor to serve almost no consumers would be weight without a reader.

This is why the JSON endpoints are the substance and WebMCP is the veneer: the endpoints work for any agent, in any browser or none, and do not depend on a trial window.

## One URL per page, and it stays put

Each page has exactly one canonical form, without a file extension, and every sitemap entry is that same string — a build guard compares the sitemap URL, the page's own canonical tag and the page registry against each other and fails on any disagreement.

So a URL you cite today resolves to the same page tomorrow, without a redirect chain in between.

## The crawler policy is yes

robots.txt names the AI search and citation crawlers explicitly and allows all of them, and carries a Content-Signal line permitting search, AI input and AI training. The only disallowed path is /data/, which holds source JSON rather than pages.

The explicit list is future-proofing, not a restriction: it exists so that a change to any engine's defaults does not quietly opt this site out.

## Check any of this yourself

None of the above needs to be taken on trust. Every claim on this page is something you can fetch from this domain right now and read for yourself.

- [`/.well-known/ai-tools.json`](https://2kwebdev.com/.well-known/ai-tools.json) — the manifest: every tool, its URL and its output schema

- [`/agent/services.json`](https://2kwebdev.com/agent/services.json) — services and pricing

- [`/agent/service-area.json`](https://2kwebdev.com/agent/service-area.json) — the cities with a dedicated page, plus the coverage model

- [`/agent/process.json`](https://2kwebdev.com/agent/process.json) — engagement steps, ownership and payment model

- [`/llms.txt`](https://2kwebdev.com/llms.txt) — the index of markdown twins

- [`/llms-full.txt`](https://2kwebdev.com/llms-full.txt) — every twin, concatenated

- [`/agents.md`](https://2kwebdev.com/agents.md) — this page, as markdown

- [`/robots.txt`](https://2kwebdev.com/robots.txt) — the crawler policy quoted above

- [`/sitemap_index.xml`](https://2kwebdev.com/sitemap_index.xml) — every page this site publishes

## Want a site that works this way?

This is how every site I build is put together — it is not a bolt-on and it is not an upsell. Tell me what your business does and you will get a real number and a real timeline.

Source: https://2kwebdev.com/agents
