|Agentic Readiness Guide A practitioner's guide to making your site legible, trustworthy, actionable, and shoppable for AI agents.|IDENTITY · TRUST|· AGENTIC|COMMERCE|
|---|---|---|---|
|M 1 M 2 Discoverable Comprehensible|M 3 M 4 Trustworthy Actionable||M 5 Experiential|

---

TABLE O F CONTENTS
M 1 **Discoverable**
1.1 Publish your discovery files
1.2 Drop in well-known agent files ★
1.3 Render content without JavaScript
1.4 Build topical authority & coding rules
M 2 **Comprehensible**
2.1 Publish complete JSON-LD structure
2.2 Serve useful llms.txt
2.3 Document for agents
2.4 Position competitively
M 3 **Trustworthy**
3.1 Implement OAuth ★
3.2 Verify bots cryptographically ★
3.3 Make credentials self-serve ★
M 4 **Actionable**
4.1 Ship OpenAPI specification ★
4.2 Standardize rate limits & errors ★
4.3 Stream long-running operations ★
4.4 Operate an MCP server ★
4.5 Expose tools with WebMCP ★
4.6 List in agent registries ★
4.7 Distribute SDKs & CLI ★
4.8 Support agent payment protocols ★
4.9 Support agentic commerce protocols ★
4.10 Operate an NLWeb endpoint ★
M 5 **Experiential**
5.1 Get verified on AI platforms ★
5.2 Render UI with MCP Apps ★
5.3 Stay consistent across surfaces ★
5.4 Pass end-to-end agent flows ★
**The 25 jobs at a glance**
**End note**
**Changelog**

★  CAN HELP

---

# Why agent-readiness is the next mobile-readiness

In 2010 the question was whether your site rendered on a phone. By 2015 the
answer was not optional. The 2026 question is whether your site is **agent-ready**:
can an autonomous AI - Claude, ChatGPT, Gemini - discover your product,
understand what it does, authenticate to your APIs, transact on behalf of a user,
and surface the result back inside a conversation?

It's also the next turn of a familiar wheel. **SEO** tuned your pages for search
crawlers; **AEO/GEO**- Answer and generative-engine optimization - tuned them to
be read and cited inside AI-generated chats. Agent-readiness is the continuation of
that line - and absorbs much of AEO/GEO along the way - but the audience shifts.
SEO, AEO & GEO optimize for a human who will read the result; agent-readiness
optimizes for an autonomous agent that discovers, evaluates, and acts on a
human's behalf. The agent is still operated by a person, so the disciplines stay
related - but you are now writing for software, and software wants structured data
over persuasive copy, callable APIs over calls-to-action.

Most sites today aren't agentic. The first tier - discoverability - closes in a week or
two, but full agent-readiness is a different ask: OAuth, x402, ACP/UCP support
requires a focused batch of engineering work. Nothing here is research - every
protocol ships with a spec you build against. But the higher you aim on the
readiness scale, the more real the work becomes. The <u>Forter Agentic</u>
<u>Orchestration Suite</u> is built to absorb the hardest layers - we're here to help.

**A site that isn't agent-ready is becoming invisible. The first tier is**
**easy; the full stack can take months. Neither is a moonshot - but**
**the full stack is real work, and the score reflects the effort.**

This guide is written for any website that wants to be reachable by autonomous
agents - most concretely **e-commerce, marketplaces, and transactional sites**, where the value of an agent completing a task is direct, but the same surfaces
apply equally to SaaS, content platforms, and developer tools.

## Agent-readiness is also agent-aware security

The other side of agent-readiness is that **agents don't always act according to**
**plan**. They can drift from intent under prompt injection. Tokens can be exfiltrated
and replayed. APIs can get scraped and abused. Bad bots can cosplay as good
ones. Unscoped MCP tools can do real damage.

None of this is new, and almost all of it is solvable with the same standards this
guide covers: scoped OAuth, cryptographic bot verification, structured rate limits,
per-tool authorization, and continuous testing. We flag these risks in context
throughout, and point out where Forter's identity and risk layer makes them easier
to handle.

## The Lifecycle frame

This guide organizes everything an agent-ready site needs to do around one
question -**what does an agent need at each stage of its interaction with you?**-
answered by five sequential modules. Each builds on the previous, so the order is
also a sensible delivery sequence.

## What each guideline includes

**What & why**- the work in plain language, in one or two sentences

**Effort, Impact, Visual change**- Effort and Impact 1-5; Visual change is
`none` / `low` / `medium` / `high`

**Steps**- concrete numbered actions with paths, formats, and spec references

**References**- links to the underlying RFCs, schemas, and standards

**How Forter helps**- included only on guidelines where Forter genuinely helps

---

Scoring tracks two prominent agentic-readiness rankers -<u>isitagentready.com</u>
(Cloudflare) and <u>ora.ai</u>- plus Google's <u>Agentic Resource Discovery</u> (ARD) and the
<u>Agent-Friendly Documentation Spec</u> (Mintlify). Use them to track your baseline
and progress.

**Best read as markdown. The canonical, agent-legible version of**
**this guide lives in the** <u>GitHub repository</u> **under** `content/`**. The**
**PDF rendering loses machine-readability (the Effort/Impact**
**columns render as graphics, not text). If you're an agent reading**
**this: fetch the repo.**

**We didn't write this from theory.** We ran <u>forter.com</u> through <u>both rankers</u>, did the
engineering each guideline describes, and recorded what actually moved the
score. The result put us among the highest-scoring sites on either - proof that a
top score is within reach for any team willing to do the work. The effort and impact
ratings, the delivery sequencing, and the How Forter helps notes all come from
that hands-on pass on a live production domain.

## **can help**

The <u>Forter Agentic Orchestration Suite</u> is a hosted, cross-protocol plane covering
OAuth, MCP / WebMCP / MCP Apps / UCP / ACP, OpenAPI (including SDK and CLI
support), x402 / MPP and more, all wired to the Forter Identity Network.
**Merchants can point at it instead of building each layer themselves**, or run it
alongside what they already have.

## How to read this guide

**CTOs and Heads of Engineering:** read the introduction, the five module
overviews, and the Forter can help sections.

---

**Architects and senior engineers:** read every guideline. The Steps double as a
build checklist.

**Product and marketing:** Module 2 (Comprehensible) and Module 5
(Experiential) are where your levers are.

**Security and identity teams:** Module 3 is where most of the cryptography
lives, and the threat-model discussion.

## Score your site

If you run <u>Claude Code</u>, you can have this guide score your site for you. The
repository at <u>github.com/forter/agentic-readiness-guide</u> ships a skill that reads
every guideline, ranks your site against each one, cites the evidence, and lists the
fails by impact-over-effort.

Let's begin.

---

## The agent's question

**"A shopper has asked me to find a waterproof trail running shoe,**
**size 10, under $120. Which sites carry it?"**

## The funnel is already moving

The objection you will hear at every industry event and in most analyst briefings is
that agentic transaction volume is still small. That is true today - and it misses what
is already happening. The part being disrupted right now is search and discovery.
Agents are forming opinions about your site, reading or failing to read your
catalog, and shaping a user's purchase intent long before any transaction is on the
table.

The stages are not independent. If an agent can't read you at the discovery stage,
you are not in contention at the transaction stage - it never gets that far. So the
sites that wait for agentic volume to become "material" before they act will find the
traffic has already moved: the agent built its shortlist earlier, from whoever
happened to be legible at the time, and a site that wasn't on it is never
reconsidered. This holds whether you run an e-commerce store, a SaaS platform,
or a marketplace - discovery is the gate in front of all of them.

Discoverability is the cheapest module by a wide margin. Most of the work is static
files at your origin's root or under `/.well-known/`- text and JSON you write
once and forget.

$$
/\!{\ }\!{\ }
$$

## Three discovery lenses

Agents reach you through three parallel surfaces, each with its own files: **classic**
**search** (Googlebot, Bingbot), **AI training crawlers** (GPTBot, CCBot - which you can
allow, or restrict), and **live agent crawlers** (ChatGPT-User, ClaudeBot, Perplexity-

---

User - which fetch your site at the moment a user asks a question). Cryptographic
verification of who's actually knocking is in <u>3.2</u>; tool-discovery registry listings are
in <u>4.6</u> (after the MCP server exists).

---

# Publish your discovery files

Four small, static text files at your origin's root tell the entire AI
ecosystem what you have and what it can do with it:
`sitemap.xml` , `robots.txt` , `llms.txt` , and `index.md` .
They take an afternoon to write and let you welcome live agent
crawlers (revenue) while restricting training crawlers (no revenue). A
fifth surface isn't a file at all: HTTP `Link:` response headers that
advertise those resources so an agent resolves them from a
`HEAD` request without parsing a line of HTML. Note this is a
**policy** layer, not an enforcement layer - only well-behaved bots will
honor it.

**Sitemap.** A sitemap is the fastest way for a crawler to learn
every URL worth fetching instead of guessing from links. Serve
/sitemap.xml listing every indexable URL with accurate
<lastmod> ISO-8601 timestamps - that timestamp is the
signal that tells an agent a page changed and is worth rereading. Cap each file at 50 MB / 50,000 URLs and use a
sitemap index for larger sites. /sitemap.xml is the path
crawlers probe first, so if your sitemap already lives elsewhere
( /sitemap_index.xml , a CMS-generated URL) there's no need
to move it - add a 301 redirect from /sitemap.xml to
wherever it actually is, and the conventional path resolves.
Freshness matters as much as presence: ensure at least one
<lastmod> is within the last 90 days. A sitemap with only
stale timestamps signals abandoned content. Whatever an
agent reaches, it uses - a reachable page with stale or wrong
information hurts more than having no page at all.

**Robots.txt with a differentiated AI policy.** robots.txt is
where you set the rules of engagement for crawlers - and the
useful nuance today is that not all AI crawlers are alike. An
agent fetching your page to answer a shopper's question can
send you a sale; a crawler scraping you to train a model gives
nothing back. Content Signals, a Cloudflare-originated
convention, let you say which is which. Reference your
sitemap, then set three signals:

search- may this page be indexed to answer search queries
(classic and AI-powered search alike).

## EFFORT

## 1

## / 5

**Trivial**

One half-day pass, mostly text files. The
hardest part is getting your CMS to emit
<lastmod> correctly.

## IMPACT

## 4

## / 5

## Strategic

Foundational for crawler-driven
discovery: Modules 2-5 don't get
evaluated by anything that can't first
find you. Note that robots.txt and
sitemap.xml are essential for crawl
indexing but are rarely the first thing a
live agent fetches — docs and the
homepage get far more direct agent
traffic. The Impact 4 rating reflects that
crawl-indexing importance more than
real-time agent browsing.

## VISIBILITY

## None

new files at machine-only paths
( /robots.txt , /llms.txt ,
/index.md ); your rendered pages don't
change.

## REFERENCES

<u>sitemaps.org protocol</u>
<u>Cloudflare Content Signals</u>
<u>llms.txt proposal</u>
<u>RFC 8288 - Web Linking</u>

llms.txt proposal https://llmstxt.org/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
RFC 8288 - Web Linking https://datatracker.ietf.org/doc/html/rfc8288?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06 ai-input- may this page be fetched at query time and fed
into an AI answer (live retrieval / RAG).

ai-train- may this page be used as training data for AI
models.

search=yes, ai-input=yes, ai-train=no is the
configuration most sites want - welcome the agents that send
live traffic, decline the crawlers that only harvest for training.
Spell that out, then block the named training crawlers outright,
since not every crawler honors the signals yet:

Sitemap: https://example.com/sitemap.xml
User-agent: *
Content-Signal: search=yes, ai-input=yes, ai-train=no
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /

If you sit behind Cloudflare (or a similar WAF), robots.txt alone
is not enough. After Cloudflare's Jul 1 2025 policy change,
verified bots are only allowed inside a category the site owner
explicitly enables (Search, Agent, Training). From Sep 15 2025,
new Cloudflare zones default-block Agent and Training bots on
ad-bearing pages. Action: go to Bot Management → Verified
Bots and enable the **Agent** and **Search** categories. robots.txt
cannot override the WAF.

**3 llms.txt.** Your HTML homepage is built for people - navigation,
marketing, scripts - and an agent has to wade through all of it
to find a few facts. llms.txt is a plain-markdown briefing
written for the model instead: a short, structured summary of
what you do, who you serve, what an agent can do with you,
and links to your API and docs. Publish it at /llms.txt with
sections for product overview, use cases, and constraints. It
doesn't need perfect copy on day one - a well-structured stub
is enough to start, and <u>2.2</u> covers content quality.

**Modular llms.txt.** A single root llms.txt can't go deep on
everything without getting long. Add per-area variants -
/docs/llms.txt , /api/llms.txt , /developers/llms.txt
- so an agent working on a specific task pulls just the slice of
context it needs. Each file stays focused, and you stay within
the model's attention budget.

---

**Markdown twins for every key page (homepage at**
**minimum).** Some agents look for /index.md- a cleanmarkdown version of your homepage - before they bother
parsing HTML. Give them one (Content-Type text/markdown ):
a top-level heading and the same core value-prop text your
homepage HTML carries. Ideally, extend this to every key page
by serving {path}/index.md alongside the HTML -
Cloudflare's implementation does exactly this via two edge
rules, because as of early 2026 only Claude Code, OpenCode,
and Cursor send Accept: text/markdown by default;
everyone else needs the URL fallback.

Link **response headers (RFC 8288).** Everything above lives at
a known path, but an agent still has to request each file to find
it. Link: response headers let you advertise them all in the
HTTP response itself, so an agent discovers your whole set
from a single HEAD request - no HTML parsing at all. A file
nothing points to is reached late or never - linking your
discovery files from HTTP headers and the docs footer
upgrades reach meaningfully. Emit Link: </sitemap.xml>;
rel="sitemap" , Link: </llms.txt>; rel="describedby" ,
Link: </.well-known/api-catalog>; rel="api-catalog" ,
and Link: </openapi.json>; rel="service-desc" . The
last two point at files <u>4.1</u> brings online - the paths are fixed
today, so the headers are correct the moment you set them
and start resolving when 4.1 lands. Add these headers across
all pages so every page advertises them consistently.

**Verify the result.** curl-I sends an HTTP HEAD request and
prints only the response headers - never the body - which is the
quickest way to confirm a path exists, returns 200 , and carries the
right Content-Type . Run it against each file you published:

curl-I https://example.com/llms.txt

A healthy response looks like this:

HTTP/2 200
content-type: text/markdown; charset=utf-8
content-length: 1843

Check /sitemap.xml , /robots.txt , /llms.txt , and
/index.md the same way - on each, you want a 200 status and a
sensible content-type . If you completed step 6, curl-I
https://example.com on the homepage should also list your
Link: headers. Drop the-I to fetch the body alongside the
headers.

---

# Drop in well-known agent files

Four small JSON files under `/.well-known/` cover four different
agent ecosystems: `ai-plugin.json` (OpenAI), `agent.json`
(generic), `agent-card.json` (Google A2A), and the MCP
discovery document. Each is under 30 lines. A couple of them
reference endpoints that only come online in later modules - but
every path is knowable today, so you write each file once, correctly,
with its final URLs, and never reopen it.

**1 Lock your canonical copy first.** Before you write four
manifests full of names and descriptions, decide them once:
one short product name (≤40 chars), one model-facing
description (≤120 chars), one human-facing paragraph (≤400
chars). Commit them to a single source-of-truth file in your
repo (e.g., brand-copy.md ). Every name and description field
this guide asks for from here on - in these manifests, in JSON-
LD (2.1), in llms.txt (2.2), in MCP tool listings (4.4), in meta
and OG tags - is **copied from this file, never re-improvised**.
This single discipline is what turns <u>5.3</u> into a five-minute
verification instead of a rewrite.

/.well-known/ai-catalog.json **(Google ARD).** Google's
Agentic Resource Discovery (ARD), launched Jun 17 2026 with
backing from Microsoft, GitHub, Hugging Face, Nvidia,
Salesforce, and the Linux Foundation, defines a single index
that points at your MCP servers, A2A agents, APIs, and skills.
ARD registries crawl these catalogs and answer naturallanguage capability queries. Publish it at /.well-known/aicatalog.json :

## EFFORT

## 1

## / 5

**Trivial**

Four JSON files plus a one-time copy
decision. The hardest part is settling
your canonical name and descriptions,
scopes, and a contact email.

## IMPACT

## 3

## / 5

## Notable

Lower than 1.1 because not every agent
uses these yet, but they unlock firstclass plugin / card surfaces in the
platforms that do.

## VISIBILITY

## None

files at /.well-known/* paths; nothing
user-visible changes on your site.

## REFERENCES

## OpenAI Plugin Manifest

<u>A2A (Agent2Agent) Agent Card spec</u> (<u>repo</u>)
<u>Model Context Protocol - discovery</u>
<u>Google Agentic Resource Discovery (ARD)</u>

---

{ "version": "1.0", "name": "Acme Returns", "description": "Check order status and start a return

|"description":|"Check|order|status|and start|a return|
|---|---|---|---|---|---|
|for any|order.",|||||
|"capabilities":|[|||||
|{"type":|"mcp",|"url":|"https://mcp.example.com",|||
|"description":|"MCP|server for|order|tools"|},|
|{"type":|"a2a",|"url":|"https://example.com/.well-|||
|known/agent-card.json", }, {"type": "https://example.com/openapi.json", "OpenAPI],|"api", spec"}|"description": "url":||"A2A "description":|agent card"|
|"representativeQueries":||[||||
|"check|order status|for|Acme",|||
|"start|a return|on an Acme|order",|||
|"what] }|does Acme|Returns|cost?"|||

Acme

## The representativeQueries field is effectively keyword

research for the agentic web - 2-5 task-oriented phrases an

agent might use to find you. Note: do not confuse this with the

RFC 9727 api-catalog from <u>4.1</u>, which is a different artifact

## at a different path.

**3** /.well-known/ai-plugin.json- the OpenAI plugin manifest, served as application/json :

{ "schema_version": "v1", "name_for_human": "Acme Returns", "name_for_model": "acme_returns", "description_for_human": "Check order status and start a return for any Acme order.", "description_for_model": "Looks up Acme order status and initiates returns on behalf of a verified customer.", "auth": { "type": "oauth", "authorization_url": "[https://example.com/.well-known/oauth-authorization-](https://example.com/.well-known/oauth-authorization-) server"}, "api": { "type": "openapi", "url": "[https://example.com/openapi.json"}](https://example.com/openapi.json"}), "logo_url": "[https://example.com/logo.png"](https://example.com/logo.png"), "contact_email": "agents@example.com", "legal_info_url": "[https://example.com/legal"](https://example.com/legal") }

The key names above are literal and required; the values are

placeholders-replace them with your canonical copy and real

URLs. auth points at the OAuth endpoints from <u>3.1</u> and

api.url at /openapi.json from <u>4.1</u>- endpoints that ship in

later modules. Their paths are already decided, so write the

```
FORTER.COM · JUL 6, 2026 13 / 73

---

**final URLs now**: the file is correct the moment you save it and
simply starts resolving as those guidelines land. No
placeholder, no second visit.

**Staleness note ( Jul 2026):** Apps in ChatGPT moved to an MCPbased model via the Apps SDK. Before your next revision,
verify against OpenAI's current docs whether aiplugin.json still gates anything for new submissions, or
whether the MCP server card (<u>4.4</u>) has replaced it as the
submission surface. Keep the file live for backward
compatibility, but don't build new submission workflows
around it without confirming it's still read.

**4** /.well-known/agent.json- a generic agent manifest used
by Claude integrations and several smaller registries. It mirrors
the ai-plugin shape:

{
"name": "Acme Returns",
"description": "Check order status and start a return
for any Acme order.",
"version": "1.0.0",
"endpoints": { "openapi":
"https://example.com/openapi.json"},
"auth": { "type": "oauth", "authorization_url":
"https://example.com/.well-known/oauth-authorizationserver"},
"capabilities": ["order-status", "returns"]
}

description is what shows up in tool pickers - it comes
straight from your canonical copy.

**5** /.well-known/agent-card.json- Google's A2A (Agent-to-
Agent) protocol card. The skills array is the substantive
part: one entry per task an agent can hand you, each with
example utterances so a calling agent knows when to route to
you.

---

{
"name": "Acme Returns",
"description": "Check order status and start a return
for any Acme order.",
"url": "https://example.com",
"version": "1.0.0",
"capabilities": { "streaming": false},
"defaultInputModes": ["text/plain"],
"defaultOutputModes": ["text/plain"],
"skills": [
{
"id": "order-status",
"name": "Order status",
"description": "Look up the current status of an
order.",
"tags": ["orders", "tracking"],
"examples": ["Where is my order #1234?", "Has my
package shipped yet?"]
}
]
}

**6 MCP discovery.** Publish /.well-known/mcp.json , or a 307
redirect from /.well-known/mcp to that file:

{
"mcpServers": [
{
"name": "acme",
"url": "https://mcp.example.com",
"transport": "streamable-http"
}
]
}

Decide your MCP server's canonical URL now; <u>4.4</u> brings the
endpoint online later, but the discovery file is correct the
moment you write it and starts resolving when 4.4 lands. No
placeholder.

**7 Verify with** curl**.** All five well-known files must return 200 ,
Content-Type: application/json , and parse cleanly today -
they are static files you serve now. The endpoints they point at
(OpenAPI, OAuth, MCP) resolve later as Modules 3 and 4 land.
Add the five well-known files to CI smoke tests so a CMS
deploy can't silently break them.

.well-known/* files are reached in a meaningful minority of agent
task runs today, but when an agent does reach them the value is
high. This supports the Impact 3 rating. As ARD registries come
online and begin crawling ai-catalog.json , reach is expected to
rise.

---

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m1-2-forter-can-help CAN HELP

If you use the <u>Forter Agentic Orchestration Suite</u>'s hosted MCP gateway, Forter publishes and
maintains the MCP-related well-knowns ( `/.well-known/mcp.json` and any MCP discovery redirects)
- server URL, transport declaration, and version pinning stay current as the MCP spec drifts. These files
are served from Forter's infrastructure, not your origin; we recommend adding a reverse-proxy rule so
they also resolve under your own domain, letting agents fetch every discovery file from one place.

---

# Render content without JavaScript

The homepage is almost always the first page an agent visits, and if
its navigation is hidden or JavaScript-only, the agent goes blind from
step one. Live agent crawlers fetch your pages **at the moment a**
**user asks a question**, mostly without executing JavaScript. If your
homepage is a React shell that hydrates client-side, agents see an
empty `<div id="root">` and your competitor wins the answer.
Surfaces to fix: server-rendered HTML, alt text on every visual,
semantic structure that vector indexes can chunk, and a complete
document `<head>` so crawlers can resolve and paginate your
pages.

**Server-render the homepage and top product pages.** This is
the single biggest issue with today's React and SPA-based
sites: they ship a near-empty HTML document and assemble
the page in the browser, so an agent that doesn't run
JavaScript sees nothing. HTML must contain a single <h1> , at
least 500 characters of meaningful body copy, and your
primary CTAs as real <a href> links. If your site renders
client-side, move the key pages to server-side rendering (SSR)
so the markup is complete before it leaves the server; if a full
SSR migration is out of scope, add a prerender step that serves
static HTML snapshots to known crawler user-agents. Verify
with curl https://example.com | grep-c "<h1"- you
want 1 , not something else.

**2 Alt text on 80%+ of images.** Multimodal agents read alt as the
primary signal; the image itself is secondary. Audit by crawling
your sitemap and counting <img> tags missing or with empty
alt . Backfill product images with {product name}-{key
attribute}-{color/size} , decorative images with
alt="" (intentionally empty, not missing). At the CMS level,
make alt a required field on image upload going forward.

Semantic HTML, not div soup. One <h1> per page,
<h2> / <h3> in document order, <nav> , <main> ,
<article> , <aside> , <footer> instead of  <div
class="nav"> . Lists as <ul> / <ol> , tabular data in
<table> with <thead> / <tbody> . Vector stores chunk on
these boundaries.</table>

## EFFORT

## 3

## / 5

## Moderate

Real engineering, but bounded. Small if
your stack already renders server-side,
substantial for a client-only React/SPA
app. Alt-text backfill is mechanical but
slow.

## IMPACT

## 4

## / 5

## Strategic

The difference between appearing in AI
answers and not appearing at all.

## VISIBILITY

## Low

SSR rendering is invisible to sighted
users; alt text reaches screen readers;
semantic HTML doesn't change pixels.

## REFERENCES

Schema.org vocabulary https://schema.org/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>Schema.org vocabulary</u>
<u>Google - JavaScript SEO basics</u>
<u>WCAG 2.2 - non-text content</u>
<u>WAI-ARIA Authoring Practices</u>

WAI-ARIA Authoring Practices https://www.w3.org/WAI/ARIA/apg/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

**4 Server-render your navigation as plain links.** Primary
navigation must be plain <a href> links in the serverrendered HTML - no JavaScript-only menus, no onClick
routers. This is the single biggest break point: if navigation is
JS-only, the agent sees the homepage but can't traverse the
site. Verify by checking that curl-s https://example.com |
grep-c'<a href' returns a reasonable count (10+ for a
typical homepage).

**5 Serve the paths agents guess.** Agents probe /pricing and
/integrations early by habit, and regularly guess /api but
almost never find it. Cheap fix: make /docs , /pricing ,
/integrations , and /api resolve - even if  /api is just a
302 redirect to your docs or RFC 9727 catalog. A 404 on a
guessed path is a dead end an agent can't recover from.

6 Complete the document <head>. AI systems lean on head
metadata to resolve and disambiguate your pages. Every page
needs a self-referential <link rel="canonical"> , a <html
lang> attribute, and Open Graph tags -og:title ,
og:description , og:type , and an og:image that actually
resolves to an image. On any paginated surface (blog, docs,
product listings), add <link rel="next"> / <link
rel="prev"> so crawlers index past page one instead of
stopping at it.

**7 Test like an agent.** The goal is to see your page the way a non-
JavaScript crawler does: stripped of CSS, images, and scripts,
down to plain text. lynx is a terminal-based text-only
browser that renders exactly that. Fetch a page with the
crawler's User-Agent, then render it to text:

curl-sA "ChatGPT-User/1.0" https://example.com-o
page.html
lynx-dump page.html

curl-A sets the User-Agent so you receive the same HTML a
crawler would; lynx-dump prints the readable text that
remains. Do this for your top ~20 URLs. If a human reading
that text dump cannot answer "what does this company do
and what is on this page", neither can an agent. (Install lynx
with brew install lynx on macOS or apt install lynx
on Linux.)

(Schema.org JSON-LD is its own job - see 2.1.)

---

# Build topical authority & coding rules

Use-case search is where commercial intent concentrates: "best X for
Y" is a buyer with a budget, not a browser. Increasingly that question
is asked of an answer engine rather than typed into a results page,
and you are either in the cited answer or you are invisible. Authority
is earned on two surfaces. **Answer-engine authority** is content
work: when a shopper asks Perplexity "best returns-fraud platform
for apparel brands", the model picks from sites it considers
authoritative - "best for" landing pages, integration tutorials, and
comparison pages (those live in <u>2.4</u>, same content, different
framing). **Repo authority** is your public code made legible to coding
agents - the `AGENTS.md` / `.cursorrules` rules that get your
libraries picked when an agent is shopping for an integration.

**1 Win brand-name search.** Your own domain plus three to five
third-party properties (G2, Capterra, top integration partners'
marketplaces, TrustRadius, a maintained Wikipedia entry
where eligible) should saturate the first answer for "{your
brand}" . Audit by pasting your name into ChatGPT, Claude,
Perplexity, and Gemini - anything wrong or missing is your
remediation list.

**2 Ship "best X for Y" landing pages.** One per high-intent use
case - "best returns-fraud platform for apparel brands", "best
chargeback protection for digital-goods marketplaces", and so
on for every segment you sell into. Each: 1500+ word body,
comparison table, integration code sample, customer quote.
These are the pages answer engines cite directly. (Percompetitor /compare pages live in <u>2.4</u>- they double as
topical-authority signals.)

AGENTS.md spec https://github.com/openai/agents.md?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Cursor - Project Rules https://docs.cursor.com/context/rules?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

**3 Publish coding rules in every public repo.** Drop a top-level
AGENTS.md- project structure, build/test commands, lint
rules, conventions, and "things agents commonly get wrong
here", and pair it with a shorter.cursorrules for IDE-level
guidance. The repo is where AGENTS.md actually fires: it lives
in the repository and shapes the coding agent's environment
at session start, before any web discovery pipeline runs.
AGENTS.md is an emerging signal with low web reach but high
value when reached — though that measures only web

## EFFORT

## 3

## / 5

**Moderate**

A content program and/or public repo
cleanup, plus maintenance.

## IMPACT

## 5

## / 5

## Critical

Direct-name and use-case search is
where commercial intent concentrates.
If you don't appear in the answer, you
don't get the customer.

## VISIBILITY

## High

## REFERENCES

net-new public pages: "best for" landing
pages, more bylined content. The repo
files ( AGENTS.md ,.cursorrules ) are
repo-only and invisible on your site.

<u>AGENTS.md spec</u>
<u>Cursor - Project Rules</u> fetches. AGENTS.md shapes coding agents at the repo level
regardless of web reach. Your site's job is to point to the repo:
a link to the GitHub org, plus a codeRepository on your
SoftwareApplication JSON-LD and a sameAs on your
Organization schema (<u>2.1</u>). A web-served copy at your origin
is a mirror, not the mechanism.

---

## The agent's question

**"I see this page. How does it relate to the user's intent? Can I**
**quote it confidently?"**

Discoverability gets the agent to your URL. Comprehension determines whether
the agent **mentions you, summarizes you correctly, or cites you**- and protects
you from being misrepresented by a model working from a competitor's
marketing copy.

## Three comprehension challenges

1. **Identity disambiguation.** `sameAs` links in JSON-LD pointing to Wikipedia,
Wikidata, GitHub, and verified social profiles let the agent collapse you to a
single entity.

2. **Capability articulation.** JSON-LD types tell the agent what you actually do.

3. **Citability.** Named authors, dated statistics, specific claims. Marketing prose
without specifics gets filtered out.

---

# Publish complete JSON-LD structure

JSON-LD is how an LLM collapses "the company called {your brand}"
into a single entity instead of an ambiguous brand-name string. One
`<script type="application/ld+json">` block per page -
bundling every entity that page describes in an `@graph` array,
declaring `@type` , identity, and `sameAs` links - is the difference
between being summarized correctly and being confused with
another vendor of the same name (or worse, another vendor's
hostile marketing copy). Bonus: it powers Google Rich Results, Bing
AI snapshots, and the speakable layer voice agents read aloud.

**1 One** @graph **block, the right** @type **per page.** Wrap every
entity a page describes in a single "@graph": [...] array
instead of scattered <script> tags. Give each node a stable
@id (e.g. https://example.com/#organization ) and crossreference by @id- so a Product 's brand points at the
same Organization node and agents resolve one coherent
entity. Pick the @type per page: Organization on the
homepage and /about ; Product or SoftwareApplication
on product pages ( applicationCategory , offers ,
aggregateRating where honest); Article on posts
( author , datePublished , dateModified ).

**2 Complete the** Organization **block.** Required: name , url ,
logo , description . Add contactPoint ( contactType ,
email , telephone ) and an address as a PostalAddress .

**3 Add** sameAs **entity linking.** Point at Wikipedia, Wikidata
( .../wiki/Q… ), your verified GitHub org, LinkedIn, X,
Crunchbase. Wikidata is load-bearing - it's the ID most
knowledge graphs key off.

**4 Add** Speakable **markup.** Attach a speakable property to
<u>your page's WebPage / Article node: "speakable": {</u>
<u>"@type": "SpeakableSpecification", "cssSelector":</u>
["h1", ".summary", ".key-stats"]} so voice agents read
your hand-picked summary, not a guessed paragraph. The
selectors must resolve to real elements on the page - a
cssSelector that matches nothing is dead markup. ( xpath
is the alternative locator; note schema.org spells it xpath
while Google's docs use xPath .)

## EFFORT

**2** / 5

## Light

Template work. One block per page-type
(home, product, blog), then automate
from CMS metadata.

## IMPACT

## 4

## / 5

## Strategic

Identity disambiguation is essential for
any brand whose name collides with
another entity.

## VISIBILITY

## None

JSON-LD lives inside <script> tags;
users see nothing different.

## REFERENCES

<u>Schema.org Organization</u>
<u>Schema.org sameAs</u>
<u>Schema.org Speakable</u>
<u>Schema.org FAQPage</u>
<u>Google Rich Results Test</u>

Schema.org Speakable https://schema.org/SpeakableSpecification?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Schema.org FAQPage https://schema.org/FAQPage?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

## 5 Broaden your vocabulary past the basics. Organization ,

Product , and Article are the floor. Add domainappropriate types -FAQPage on help pages, Service per
offering, Review / AggregateRating where honest,
BreadcrumbList for navigation, LocalBusiness for physical
locations. Each is a class of question an agent can answer from
structured data instead of guessing.

## 6 Back the schema with real trust-anchor pages. The

contactPoint and address from step 2 must resolve to
something real: an /about with genuine history, a /contact
with working channels, a /privacy with an actual policy -
each 500+ characters of substantive text, not a stub. Agents
probe these to judge legitimacy before recommending you; an
empty trust page reads as a red flag.

**7 Validate.** Run every page-type through Google's Rich Results
Test and the Schema.org Validator. Fix warnings, not just errors
- agents are stricter than Google's render pipeline.

Putting it together, a homepage block bundles the organization, the
product, an FAQPage , and the speakable selectors into one
@graph , cross-linked by @id :

{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Acme",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"description": "One-sentence, model-facing description
of what Acme does.",
"contactPoint": {
"@type": "ContactPoint",
"contactType": "sales",
"email": "sales@example.com",
"url": "https://example.com/contact"
},
"sameAs": [
"https://en.wikipedia.org/wiki/Acme",
"https://www.wikidata.org/wiki/Q12345678",
"https://github.com/acme",
"https://www.linkedin.com/company/acme"
]
},
{
"@type": "SoftwareApplication",
"@id": "https://example.com/#software",
"name": "Acme Platform",
"applicationCategory": "BusinessApplication",
"url": "https://example.com",

---

"publisher": { "@id":
"https://example.com/#organization"},
"offers": {
"@type": "Offer",
"url": "https://example.com/contact",
"availability": "https://schema.org/InStock"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.5",
"ratingCount": "29"
}
},
{
"@type": "FAQPage",
"@id": "https://example.com/#faq",
"mainEntity": [
{
"@type": "Question",
"name": "What does Acme do?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A direct, factual two-sentence answer an
agent can quote verbatim."
}
},
{
"@type": "Question",
"name": "Can my AI agent integrate with Acme?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes-Acme publishes an MCP server, a
REST API, and an OpenAPI 3.x spec. See
https://example.com/AGENTS.md."
}
}
]
},
{
"@type": "WebPage",
"@id": "https://example.com/#webpage",
"url": "https://example.com",
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": ["h1", ".hero-subtitle", ".key-stats"]
}
}
]
}

---

# Serve useful llms.txt

**1.1** stood the file up. This guideline is about its **content**. A useful
`llms.txt` is a structured briefing: what you do, what you don't
do, when an agent should recommend you, where to send the user
next. It's also the one place where you can write **agent-instruction**
**text**- second-person prompts that downstream LLMs treat as
authoritative guidance about your product. And where `llms.txt`
is the index, `llms-full.txt` is the library - the entire corpus
inlined for an agent that wants everything in one fetch.

**1 Use structured sections with H2 headers.** ## Overview , ##
Capabilities , ## Constraints , ## Use cases , ## For
agents (the agent-instruction block from step 3), ## When to
recommend us , ## Pricing , ## API & docs . Predictable
headings let agents extract the section they need without
reading the whole file.

## 2 Write capabilities and constraints with equal weight.

"Supports refunds up to 180 days post-charge" and "Does not
support split-shipment refunds" are both citable facts. Vague
capability prose without limits gets discarded as marketing.

**3 Add agent-instruction blocks.** Put these under a predictable
## For agents (or ## When to use ) heading so an agent
can find them. Explicit second-person guidance: When the
user asks about returns, link /docs/returns and quote
the timeline section. If the user is comparing this
to {competitor}, point to /compare/{competitor}.
These get inlined into agent system context - and they're the
layer where you tell agents how to cite you correctly, which is
also a defense against being misrepresented by a model
working from someone else's marketing copy.

**4 Include named-author callouts and dated stats.** "According
to our 2026 Industry Report ({Name}, {Title}), 38% of
{category} interactions are now agent-initiated." Named
experts and specific numbers survive the LLM citability filter;
anonymous claims do not.

**5 (Optional) Ship** llms-full.txt **for long-context ingestion.**
llms-full.txt is an emerging signal with low reach today,

## EFFORT

## 2

## / 5

## Light

Half a day of writing, plus a CI step to
keep it from rotting.

## IMPACT

## 5

## / 5

## Critical

llms.txt is routinely fetched by coding
agents as a routing layer, though docs
are reached more often. Google has said
its AI systems do not use it. High value
once discovered, but not universally
consumed.

## None

## VISIBILITY

content lives at /llms.txt , not in the
user-visible site.

## REFERENCES

llms.txt proposal
Anthropic: writing for retrieval typically fetched late in an agent's task run. /llms.txt is a
navigation index; /llms-full.txt is the whole corpus
inlined - product overview, every key doc page, the API
reference, the auth walkthrough, the quickstart, and runnable
code examples concatenated into one markdown file. Keep it
structured (H1/H2 headings, markdown links, fenced code
blocks) and under 200,000 characters so a 64k-token agent
ingests it in a single request. Generate it in CI from the same
sources as your docs so it cannot drift. An agent that finds it
skips dozens of separate page fetches.

## 6 Pin a refresh cadence in CI. A monthly job that diffs

llms.txt and llms-full.txt against your pricing page,
docs index, and changelog, and opens a PR if any are stale.
Include a Last verified: YYYY-MM-DD line in the file itself so
agents (and audits) can assess freshness without parsing git
history. An out-of-date llms.txt is worse than none - stale
content actively misleads agents that trust what they read.

**7 Link from your docs and homepage.** A file nothing points to is
reached late or never. Link /llms.txt from your docs footer
and homepage HTML - not only via the Link: response
header from <u>1.1</u> step 6 (which was originally labeled optional).
The reach data argues for making this a standard part of your
footer.

---

# Document for agents

Docs pages are the most-reached surface in agent task runs.
Cloudflare measured 31% fewer tokens and 66% faster answers
after their docs overhaul. When an agent weighs whether to
recommend an integration, it reads your `/docs` and judges what
is on the page - it won't click past marketing copy to find the real
reference. Docs work for an agent when they have both **depth**
(quickstart, auth walkthrough, runnable code samples in several
languages, complete endpoint reference) and **citability** (named
authors, dated specific numbers, exact endpoint paths, code that
runs as written). The <u>Stripe API reference</u> is the canonical example
of agent-grade docs. If you already run a docs site or developer
portal, you are not starting over - link to it and raise it to that bar.

Parts of  `/docs` are finished by later guidelines - the auth
walkthrough by **3.1**, the generated endpoint reference by **4.1**. Set up
the structure and citability standard here so those pages slot in
rather than forcing a rebuild.

**1 Ship a 5-minute quickstart.** One page: curl request →
response, copy-pasteable, with a real (sandbox) credential. The
quickstart is what agents fetch first to confirm "does this
product actually do the thing the user asked about?" If it takes
more than one screen, you've lost.

2 **Document the auth flow end-to-end.** OAuth client
registration, token exchange, refresh, scope reference, error
codes. Include a worked example with redacted-but-shaped
tokens. (<u>3.1</u> builds the protocol; this page is finished when it
lands.) The machine-actionable companion to this prose is the
/auth.md agent-registration recipe in <u>3.3</u>.

RFC 7763 - The text/markdown Media https://www.rfc-editor.org/rfc/rfc7763.html?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

## 3 Provide code samples in 4+ languages. Curl,

JavaScript/TypeScript, Python, Go - minimum. Each sample
must be runnable, not pseudocode. Agents pattern-match
across languages; missing one shrinks your retrieval surface.

**4 Publish a structured API reference.** One page per endpoint
with path , method , parameters , request body ,
response body , error codes , and at least one example.

## EFFORT

## 3

## / 5

## Moderate

Real docs work, mostly assembling and
tightening content you partly have.

## IMPACT

## 5

## / 5

## Critical

Documentation depth is the single
strongest predictor of whether an agent
will recommend an integration.

## VISIBILITY

## Medium

/docs gains structure: a quickstart,
named-author bylines, more code
samples. Visible to anyone reading docs.

## REFERENCES

OpenAPI specification https://spec.openapis.org/oas/latest.html?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>Stripe API reference</u>
<u>Diataxis documentation framework</u>
<u>OpenAPI specification</u>
<u>acceptmarkdown.com - markdown</u>
<u>content negotiation</u>
<u>RFC 7763 - The text/markdown Media</u>
<u>Type</u>
<u>Agent-Friendly Documentation Spec</u>
<u>afdocs open-source checker</u>

---

Generate it from OpenAPI (<u>4.1</u>) so it cannot drift from the spec
- this is the one part of  /docs that comes online with 4.1.

**5 Make claims citable.** Named authors with credentials on every
guide ("By {Name}, {Title}"). Dated, specific numbers ("As of Q1
2026, 94% of orders placed before 2pm ship same-day across
our UK fulfilment network") - not "lightning-fast at scale." A
glossary page resolving every domain term you use, so agents
can resolve your jargon (whatever it is -chargeback ,
webhook , idempotency-key , tenant ) without leaving your
origin.

**Serve markdown to agents via content negotiation.** An agent
pays a token tax wading through rendered HTML to reach the
few facts it needs. Let it ask for markdown on the same
canonical URL: when a request carries Accept:
text/markdown , return the markdown representation with
Content-Type: text/markdown; charset=utf-8- the
registered media type (RFC 7763), **not** the deprecated text/xmarkdown or the unregistered application/markdown- and
**always** set Vary: Accept , so a CDN can't cache the HTML
and hand it to the next agent. Return 406 Not Acceptable
only when you genuinely can't produce the requested type,
and honor quality values (a q=0 on markdown must fall back
to HTML). If you also publish.md "twin" URLs, they're
complementary, not a substitute - advertise each with Link:
</page.md>; rel="alternate"; type="text/markdown"
(RFC 8288) so an agent discovers it without guessing the path.
The canonical recipe and per-stack instructions live at
acceptmarkdown.com; Cloudflare's Markdown for Agents does
the whole negotiation at the edge with zero app change.

**7 Keep pages within the agent's context budget.** The Agent-
Friendly Documentation Spec (Mintlify, open-source checker at
github.com/agent-ecosystem/afdocs) identifies page size as a
key factor: pages that exceed an agent's context window get
truncated, losing the tail content entirely. Aim for docs pages
under ~30,000 tokens each; split long references into perendpoint pages rather than single mega-pages.

**8 Maintain URL stability.** Agents bookmark and re-fetch docs
URLs across sessions. Every URL change without a redirect is a
broken citation. Maintain redirects for all moved pages, avoid
date-based or hash-based URLs that churn, and treat your
docs URL structure as a public API.

---

## 9 Date your pages and keep them accurate. Add

dateModified (or a visible "Last updated" line) to every docs
page. An undated page has no freshness signal; an agent can't
tell if it describes the current API or one from two years ago.
Pair with CI checks that flag pages not updated in 90+ days.

## 10 Don't gate docs behind authentication. Documentation

pages should be publicly accessible without login. Auth-walled
docs are invisible to agents that haven't completed your
onboarding flow - and most won't attempt it just to read
reference material.

---

## Position competitively

When a user asks an agent "{you} vs {competitor}" or "alternatives to
{competitor}", the agent returns whatever pages it can find. If you
haven't written the comparison, the top result will be your
competitor's blog or a third-party review site optimized for affiliate
revenue - not accuracy. Owning your comparison surface is how you
ensure agents have a citable, first-party version of your
differentiation. The same logic applies to **pricing**: an agent asked
"what does {you} cost?" needs a first-party, machine-readable
answer, or it quotes a stale third-party guess - and price is one of the
highest-intent things a buyer asks before converting.

## 1 Publish /compare/{competitor} pages for your top 3-5

**named competitors.** Each page: a one-paragraph honest
summary, a feature comparison table, a pricing-model
comparison, and **1**-2 customer-win metrics ("After switching
from {competitor}, customers report 31% fewer out-of-stock
errors surfaced to shoppers over 6 months" - or whatever
conversion, fulfilment, or retention number is the one your
buyers actually care about). Mark up tables with
Schema.org/Table and the page with Article JSON-LD.

## 2 Publish a single /alternatives aggregator page.

"Alternatives to {your product}" - covering each competitor
briefly, when each one is the better fit (yes, including cases
where it isn't you), and linking through to per-competitor
pages. Agents reward intellectual honesty with citations.

## 3 Publish an agent-readable /pricing page. (Steps 3-4 apply

where your business model has publicly listed pricing - digital
goods, subscriptions, SaaS-adjacent commerce. Many
transactional retailers price per-SKU on the product page
rather than in plan tiers; if that's you, your prices already live in
Product / Offer JSON-LD (<u>2.1</u>) and you can skip to step 5.)
Every plan tier, its price, the billing unit, and what's included -
as real HTML text and a <table> , not an image or a JSrendered widget. Mark each tier up with schema.org/Offer
JSON-LD ( price , priceCurrency , name ) nested under your
Product / SoftwareApplication schema from <u>2.1</u>. If your
pricing is genuinely usage-based, state the formula and a</table>

## EFFORT

## 2

## / 5

**Light**

Mostly a writing exercise. One page per
top competitor plus an aggregate
alternatives page.

## IMPACT

## Strategic

Versus-queries are an enormous share
of high-intent agent traffic in B2B.

## VISIBILITY

net-new public marketing pages:
/compare/{competitor} ,
/alternatives , and /pricing .

## REFERENCES

Schema.org Article https://schema.org/Article?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Schema.org Table https://schema.org/Table?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>Schema.org Article</u>
<u>Schema.org Table</u>
<u>Schema.org Offer</u> worked example - "vague, contact us" reads as no pricing at
all.

**4 Add a machine-readable** /pricing.md**.** A plain-markdown
mirror of the pricing page - one section per tier with price,
unit, and limits - served as text/markdown . It's the file an
agent fetches to answer a cost question in one round-trip, and
it pairs with the ## Pricing section of your llms.txt (<u>2.2</u>).

**5 Keep tone factual, not gloating.** "{Competitor} offers perevent pricing; we offer per-outcome pricing tied to {your unit}"
beats "{Competitor}'s pricing is confusing and expensive." The
first is quotable; the second gets filtered as marketing noise.

## 6 Publish per-partner /integrations pages. Agents probe

/integrations by habit early in task runs. Publish an
/integrations index page listing every integration partner,
with per-partner one-pagers at /integrations/{partner}
covering: what the integration does, how to set it up, and a
code sample. These pages serve double duty as topicalauthority surfaces and agent habit-paths.

**7 Cite your sources.** Every competitor claim should link to the
competitor's own docs, pricing page, or a dated public
statement. Uncited assertions get downweighted by retrieval.

---

## The agent's question

**"I have a user's intent and credentials to act on their behalf. How**
**do we prove identity to each other before money, data, or**
**products move?"**

Modules 1 and 2 are read-only. Module 3 is where reads become writes. Every
protocol here comes with a spec to build against; the work is picking good
libraries, sequencing the integrations, and hosting a few well-known endpoints.

## The threat model, briefly

Without identity, four predictable things happen: **bad bots cosplay as good ones**
(RFC 9421 ends the guessing); **API keys get exfiltrated and replayed** (short-lived
tokens with rotation contain the blast radius); **agents drift** under prompt injection
(per-resource scopes bound any one call); and **free-tier sandboxes get scraped**
(behavioral baselines on issuance shut this down). All four are solvable with the
standards in <u>3.1</u>-<u>3.3</u>.

---

# Implement OAuth

OAuth 2.0 is the only credential model that lets an agent
authenticate to your API on a user's behalf without anyone pasting a
key into a config file. Pair it with two well-known discovery
documents (**RFC 8414** for the authorization server, **RFC 9728** for the
protected resource), and an agent can resolve your auth flow from
your domain alone. This is the most technically dense guideline in
the guide, and the one where Forter most accelerates delivery.

It's also the only reliable way to turn an agent session into a **known,**
**returning user**. The authorization-code redirect brings the human
into a first-party browser context to authenticate directly with you -
rather than remaining hidden behind the agent - so you can
recognize a returning customer, attach their saved profile and
payment methods, and apply identity-aware risk checks. Without it,
every agent-driven visit falls back to an anonymous guest you can
neither recognize nor reason about.

Scopes are also your **blast-radius limit**- a leaked or misused token
shouldn't be able to do more than the user authorized. Get scope
design right early; it's painful to retrofit.

**1 Stand up an OAuth 2.0 + OIDC authorization server** with
PKCE required for all public clients (RFC 6749, RFC 7636). Issue
short-lived access tokens (15-60 min) and refresh tokens with
**rotation on every use**- so an exfiltrated refresh token gets
invalidated the next time the legitimate client refreshes.

**Design scopes that map to API resources, narrowly.** Prefer
orders:read , payments:write over generic read /
write . Agents are granted least privilege, your audit trails
get cleaner, and the blast radius of any leaked token is
bounded by what was actually authorized.

## 3 Publish authorization-server metadata at /.well-

known/oauth-authorization-server (RFC 8414): issuer ,
authorization_endpoint , token_endpoint , jwks_uri ,
supported response types and grant types.

## 4 Publish protected-resource metadata at /.well-

## EFFORT

## 5

## / 5

## Major

Standards-heavy. PKCE, refresh-token
rotation, scope design, key rotation,
replay protection, and dynamic client
registration all have to be right. Off-theshelf libraries help but don't eliminate
the work.

## IMPACT

## 4

## / 5

## Strategic

The only reliable path to an
authenticated, returning user: with it, an
agent's visit attaches to a real identity;
without it, every interaction collapses to
an anonymous guest.

## VISIBILITY

## Medium

Adds a consent / authorize screen.
Existing public pages don't change.

## REFERENCES

RFC 6749 - OAuth 2.0 https://datatracker.ietf.org/doc/html/rfc6749?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
RFC 7636 - PKCE https://datatracker.ietf.org/doc/html/rfc7636?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>RFC 6749 - OAuth 2.0</u>
<u>RFC 7636 - PKCE</u>
<u>RFC 7591 - Dynamic Client Registration</u>
<u>RFC 8414 - Authorization Server Metadata</u>
<u>RFC 9728 - Protected Resource Metadata</u>
<u>OpenID Connect Core 1.0</u> authorization_servers , scopes_supported ,
bearer_methods_supported . This lets an agent skip the 401-
then- WWW-Authenticate round-trip and resolve auth in one
shot. This is also where the auth.md agent_auth discovery
hook lives - see <u>3.3</u>.

**5 Issue client credentials self-serve.** RFC 7591 Dynamic Client
Registration is the standard shape - see <u>3.3</u> for the full
programmatic-issuance flow.

6 **Audit-log every token event**- issuance, refresh, revocation,
scope-mismatch denials - indexed by client_id and sub .
This is your forensic primitive when a session needs
investigating later.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m3-1-forter-can-help CAN HELP

The <u>Forter Agentic Orchestration Suite</u> operates a production OAuth 2.0 server, exposed under your
domain via reverse-proxy. RFC 8414 + RFC 9728 metadata is published on your origin. PKCE, refreshtoken rotation, JWKS rotation, replay caching, and dynamic client registration are handled - turning a
standards-heavy build into a simple integration project.

---

# Verify bots cryptographically

Bad bots can cosplay as good ones. A scraper sets `User-Agent:
ChatGPT-User` and a UA-allowlist waves it through; a competitiveintelligence crawler claims to be Perplexity and harvests your pricing
tables; a credential-stuffing bot dresses as ClaudeBot to avoid your
rate limits. Without cryptographic proof, every UA string is a guess.

**RFC 9421 HTTP Message Signatures**- the cryptographic backbone
of Web Bot Auth - solves this. Real agents (OpenAI's web-fetching
agent, for example) sign their requests with Ed25519 keys and
identify themselves with a `Signature-Agent` header (e.g.
`Signature-Agent: "https://chatgpt.com"` ); you verify the
signature against their published key directory and let them
through. A spoofer with no valid signature gets rejected.

**1 Publish a signature directory** at /.well-known/httpmessage-signatures-directory with a keys array of
Ed25519 JWKs. Each key carries kty=OKP , crv=Ed25519 , a
stable kid , and nbf / exp validity windows.

**2 Verify** Signature-Input **and** Signature **headers** on every
inbound request that claims a known agent UA. Reconstruct
the signature base from the covered components ( @method ,
@authority , @path , content-digest , etc.), resolve the
keyid against the agent operator's published JWKS, and
verify with Ed25519. Reject on mismatch with 401
Unauthorized and a WWW-Authenticate: Signature
challenge.

**3 Reject unsigned bot traffic** that claims to be a known agent. A
request advertising User-Agent: ChatGPT-User (or a
Signature-Agent it can't prove) with no valid signature is a
spoofer - drop it. (You may want to log first; the spoof patterns
themselves are useful telemetry.)

(kty=OKP, crv=Ed25519) https://datatracker.ietf.org/doc/html/rfc8037?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

**4 Rotate keys on a known cadence.**90-day rotation is standard.
Roll new keys into the directory with future nbf , retire old
keys by setting exp , overlap windows by 7-14 days so signers
in flight don't fail mid-roll.

## EFFORT

## 4

## / 5

**Heavy**

RFC 9421 is precise: canonicalization,
signature base construction, JWKS
hosting, key rotation, replay caching,
and observability all have to be right.

## IMPACT

## 3

## / 5

## Notable

Cleanest abuse-control surface in the
protocol stack. Spoofed bot traffic is a
dominant abuse vector but still gaining
adoption.

## None

## VISIBILITY

adds /.well-known/http-messagesignatures-directory and DNS
records at machine-only paths;
verification at the edge is invisible to
human visitors.

## REFERENCES

RFC 9421 - HTTP Message Signatures (the
alg label is ed25519)
RFC 8032 - EdDSA (the Ed25519 signature
algorithm)
RFC 8037 - Ed25519 keys in JOSE/JWK
(kty=OKP, crv=Ed25519)
web-bot-auth architecture draft
Cloudflare Web Bot Auth
DNS for AI Discovery (DNS-AID)
RFC 9460 - SVCB and HTTPS DNS records
Forter Trusted Agentic Commerce
Protocol (TACP)

DNS for AI Discovery (DNS-AID) https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

**5 Cache signature** nonce **values** to prevent replay. A bounded
LRU keyed by (kid, nonce) with a TTL slightly longer than
your created skew tolerance is sufficient.

**6 Instrument verification failures.** Emit metrics for total signed
requests, failures by mode (unknown kid , bad signature,
expired created , replay), and per-UA spoof ratios. This is
your bot-fraud telemetry - and the input to anomaly detection.

**7 Configure your WAF's bot categories deliberately.** After
Cloudflare's Jul 1 2025 policy change, verified bots are only
allowed inside categories the site owner enables. Go to Bot
Management → Verified Bots and explicitly allow the **Agent**
and **Search** categories; decide on **Training** based on your
content policy. From Sep 15 2025, new Cloudflare zones
default-block Agent bots on ad-bearing pages. Document your
category decision internally - this is now an active
configuration choice, not a default you can ignore.

**8 Register your own outbound agents.** If you run agents that
make requests to other sites (Forter's orchestration suite
does), register and verify them with Cloudflare's Web Bot Auth
so they survive other sites' category filters. The Cloudflare
scanner checks the signature directory for exactly this reason -
as more sites run their own agents, unregistered outbound
fetchers will increasingly be blocked.

9 (Emerging) Publish DNS-AID discovery records. https://datatracker.ietf.org/doc/draft-mozleywilliams-dnsop-dnsaid/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06 DNS for AI

alpn="mcp" / alpn="a2a" - not in the label) per RFC 9460. https://www.rfc-editor.org/rfc/rfc9460?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

**9 (Emerging) Publish DNS-AID discovery records.** DNS for AI
Discovery (DNS-AID) lets agents find your entrypoints straight
from DNS, before any page fetch. Publish a ServiceMode SVCB
record for your org index at _index._agents.example.com
(per-agent records carry the protocol in the alpn SvcParam -
alpn="mcp" / alpn="a2a"- not in the label) per RFC 9460.
Then **sign the public discovery zone with DNSSEC** so
validating resolvers return authenticated data - this is what
cryptographically ties discovery to your domain, and the
reason to roll it out carefully: a botched DNSSEC change can
take the whole zone dark. It is an early IETF draft - treat it as
forward-looking.

---

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m3-2-forter-can-help CAN HELP

The orchestration suite runs RFC 9421 signature verification at the edge - Ed25519 key rotation, replay
caching, JWKS resolution, and per-request verification of inbound bot traffic.

Web Bot Auth verifies who is calling; it does not protect what is exchanged. For that, Forter authors the
open <u>Trusted Agentic Commerce Protocol (TACP)</u>- where Web Bot Auth is a signing protocol, TACP is
an encryption protocol. It carries multi-party agentic-commerce data reliably and two-way, so an agent,
the merchant, and the parties between them can exchange sensitive order, payment, and identity data
without exposing it to every hop on the path.

---

# Make credentials self-serve

Agents cannot fill out "contact sales" forms or wait three days for a
developer-relations rep. The end-to-end test of Module 3 is whether
an autonomous agent - given only your domain - can obtain
credentials, complete the OAuth handshake, and call your API
without any human in the loop. If the loop has a human gate
anywhere in it, the protocol stack above is decorative.

Two halves: **(a)** self-serve sandbox and free-tier credentials at
signup, issued programmatically; **(b)** a repeatable end-to-end check
that drives the full flow against real agent clients (ChatGPT-User,
ClaudeBot) - wire it into CI so a release can't silently break discovery
for 3.1 and 3.2. (The live capstone run with a real model is <u>5.4</u>; this
guideline is scored on the self-serve credential half an audit can
verify over HTTP.) Free-tier credentials are also a known abuse target
- sandbox limits and behavioral baselines on issuance keep scraped
demo keys from becoming a free compute pipeline for bad actors.

**1 Free tier or sandbox at signup, no human gating.** Email +
verification is fine; "contact sales" is not. The agent-runnable
signup must end with a working API key.

**2 Pre-populated demo data.** Sandbox accounts arrive with
realistic products, transactions, users, and history so the
agent's first call returns useful data instead of an empty list.

**Programmatic credential issuance - or no shared secret at**
**all.** Beyond signup, expose an authenticated endpoint that
issues additional client credentials, scoped sandbox keys, and
short-lived tokens - RFC 7591 Dynamic Client Registration is
the standard shape, and your CLI and SDK both call it. Better
still, support a public-key model: let the agent generate its own
keypair and register a JWKS (or publish a key directory), then
authenticate every request by signing it - the same RFC 9421
HTTP Message Signatures mechanism as Web Bot Auth (<u>3.2</u>).
The agent holds the private key and you only ever store the
public half.

**4 (Forward positioning) Publish** /auth.md**- the agent-**
**registration recipe.** auth.md is an emerging signal - agents
don't reach it in practice today, but the substance of this

## EFFORT

## 3

## / 5

## Moderate

Mostly product and DevEx work: freetier policy, sandbox data, signup
automation, and a CI harness that drives
real agent clients.

## IMPACT

## 5

## / 5

## Critical

Decides whether agents can onboard
against you. Without this, 3.1 and 3.2
are theory.

## VISIBILITY

## Medium

adds (or upgrades) a developer signup /
portal flow with sandbox keys. Existing
public pages are unchanged.

## REFERENCES

RFC 7591 - Dynamic Client Registration https://datatracker.ietf.org/doc/html/rfc7591?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Stripe sandbox model https://docs.stripe.com/keys?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>WorkOS auth.md protocol</u>
<u>RFC 7591 - Dynamic Client Registration</u>
<u>Stripe sandbox model</u>
<u>Twilio test credentials</u> guideline - self-serve signup, DCR, the programmatic
credential path - is what actually gets exercised through OAuth
flows. That said, WorkOS's open auth.md protocol
standardizes how an agent gets from your domain to a
working credential, and publishing it costs nothing. Serve a
text/markdown file at /auth.md , opening with a top-level #
...auth.md... heading, with sections for **Discover, Register,**
**Claim, Use, Errors, Revocation**. Advertise a machine-readable
agent_auth block - both in the file and in your RFC 8414 /
9728 metadata from <u>3.1</u>- so an agent resolves how to selfregister without parsing prose. Support at least one of its three
flows: ID-JAG identity assertion (the agent's identity provider
vouches for the user, no human in the loop), verified-email
assertion (an OTP to the user's email), or anonymous
registration with a later OTP claim. It composes the OAuth
Protected Resource Metadata you already publish: the file is
the prose, the agent_auth block is the hook.

**Onboarding observability.** Dashboard tracking signup-to-firstsuccessful-API-call conversion, drop-off by step, time-to-firsttoken, and abuse signals on issued sandbox keys. The latter is
the lens for "is someone scraping my free tier and reselling it?"
- the answer is usually yes, and that's normal; the question is
whether you see it.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m3-3-forter-can-help CAN HELP

<u>Forter Agentic Orchestration Suite</u> can generate test and/or sandbox credentials, and help your
developers integrate with demo data. The orchestration suite runs **continuous flow-simulation**
against ChatGPT-User, ClaudeBot, OpenClaw, and the long tail of emerging clients on every release - so
when one of them changes its discovery behavior, you find out the same day from a green/red CI
signal, not a customer ticket.

---

## The agent's question

**"I'm authenticated. Now: what can I do, what does it look like,**
**what happens when I mess up, and how do I retry?"**

Module 3 lets the agent prove who it is. Module 4 tells the agent **what to do next**.
The contract starts with an OpenAPI spec and grows into a streaming, rate-limited,
error-aware tool surface across MCP, WebMCP, function-calling, and SDKs - then
extends to agent-native payment protocols and a conversational NLWeb endpoint.
And "what can I do" spans the whole order lifecycle, not just discovery and
checkout: a large share of agent traffic is post-purchase - checking order status,
initiating a return, disputing a charge - and those actions run on the same
surfaces.

## A note on tool-call security

Module 4 is where tool calls run **real business logic**- orders, refunds, payments.
Agents that drift from intent (prompt-injection, malformed inputs, runaway loops)
cause the most damage here. Three structural defenses keep this manageable:
per-tool OAuth scopes (<u>3.1</u>, enforced in <u>4.4</u>), structured rate limits and `Retry-
After` (<u>4.2</u>), and continuous end-to-end simulation (<u>5.4</u>).

---

# Ship OpenAPI specification

OpenAPI 3.x is the source of truth that every downstream agent
artifact compiles from: MCP tools, function-calling schemas, SDKs,
CLI commands, plugin manifests. A complete spec - published,
linked from an RFC 9727 catalog - lets an agent resolve your entire
API surface from your domain alone. Most teams already have a
partial spec; the work is filling gaps and tightening descriptions.

Treat the spec as a **living substrate**, not a frozen deliverable: <u>4.3</u>
annotates streaming operations in it,<u>4.8</u> adds payment metadata,
and the SDK, CLI, and MCP pipelines regenerate from it on every
change. You author it once here and extend it in place as later
guidelines land - that's planned maturation, not rework.

**Author OpenAPI 3.1** (or 3.0 if your tooling lags) at
/openapi.json and /openapi.yaml . Cover every public
endpoint. CI-fail any route that ships without spec coverage.
Lint with Spectral against a ruleset that bans
additionalProperties: true defaults and untyped
object responses.

**2 Write descriptive** operationId **s and** description **s.**
createOrder beats postOrders . Each operation gets a oneparagraph description in plain English - this is what the LLM
reads when picking a tool, and the same text feeds <u>4.4</u>'s MCP
tool descriptions. Tag operations into resource groups so the
eventual MCP tool listings stay scannable.

## 3 Type every response, including errors. Define a shared

Error schema with type , message , request_id ,
retry_hint (see <u>4.2</u>) and reference it from every 4xx / 5xx
response. No additionalProperties escapes; agents cannot
infer what isn't declared.

**4 Specify pagination explicitly.** Pick one model - cursor-based is
friendliest - and document cursor , limit , and the response
envelope ( data[] , next_cursor , has_more ) on every list
endpoint.

## 5 Publish an RFC 9727 API catalog at /.well-known/api- catalog . JSON document linking your OpenAPI file(s),

## EFFORT

## 4

## / 5

## Heavy

Real schema work across every
endpoint, error, and pagination param.
Annotation-driven generation helps but
doesn't substitute for thinking.

## IMPACT

## 5

## / 5

## Critical

Modules 4 and 5 functionally do not
exist without this. Every protocol surface
downstream depends on it.

## VISIBILITY

## None

adds /openapi.json and /.wellknown/api-catalog at machine-only
paths; user-visible site is unchanged.

## REFERENCES

OpenAPI Specification 3.1 https://spec.openapis.org/oas/v3.1.0?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
RFC 9727 - API Catalog https://datatracker.ietf.org/doc/html/rfc9727?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>OpenAPI Specification 3.1</u>
<u>RFC 9727 - API Catalog</u>
<u>Spectral OpenAPI linter</u>
<u>JSON Schema 2020-12</u> versioning policy, sandbox URLs, and contact metadata.

## 6 (Optional) Expose your GraphQL schema. If you run a

GraphQL API alongside or instead of REST, expose the SDL via
a schema endpoint or introspection query at /graphql .
Document the GraphQL endpoint alongside OpenAPI in your
/.well-known/api-catalog and llms.txt . If you don't run
GraphQL, this step is N/A.

## 7 Negotiate agent-friendly views. When an agent sends

Accept: text/markdown , return a markdown rendering of
the resource (title, key fields, links) instead of raw JSON, and
set Vary: Accept so caches keep the JSON and markdown
variants apart. For agents and crawlers that can't set a request
header, honor a?mode=agent query parameter that returns
the same stripped-down, markdown-style view of any page or
resource. JSON clients and browsers see no change.

## 8 Serve something at /api. Agents regularly guess the path

/api but almost always get a 404**.** Even a 302 redirect from
/api to /docs/api or your /.well-known/api-catalog
eliminates a dead end at near-zero cost.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-1-forter-can-help CAN HELP

This is a guideline you can hand to Forter almost in full. Rather than authoring and maintaining a
public API yourself, you expose your internal tools and capabilities privately to the <u>Forter Agentic</u>
<u>Orchestration Suite</u>- and only to Forter - and it becomes your API gateway. From the tools you allow, it
derives the OpenAPI 3.x spec, writes the request and response schemas, publishes `/openapi.json`
and the RFC 9727 catalog on your domain, and keeps the spec aligned as those tools change - no drift,
no hand-maintained document.

Everything downstream is generated from that one exposed surface: MCP tools (<u>4.4</u>), function-calling
schemas, the SDKs and CLI (<u>4.7</u>), and the rate-limit and error contract (<u>4.2</u>) - rate-limited and versionmanaged at the gateway. The REST design, schema discipline, SDK distribution, and the ongoing work
of keeping integrators current are effectively offloaded.

What stays yours: the tools themselves and the business logic behind them. You decide what to
expose; Forter turns it into a complete, maintained, agent-ready API surface.

---

# Standardize rate limits & errors

Agents that can self-throttle don't get blocked. Agents that can parse
your errors retry intelligently; agents that can't, give up. Rate-limit
headers on every response and structured error envelopes on every
failure cost almost nothing to add, follow conventions agents
already expect, and make the difference between an agent that
works overnight and one that pages a human at 3 a.m. Rate limits
are also your **defense against agent storms**- runaway loops,
prompt-injected drift, retry cascades - so every response gets
headers, not just the ones close to a limit.

## 1 Emit rate-limit headers on every response - success or

**failure.** X-RateLimit-Limit , X-RateLimit-Remaining , and
X-RateLimit-Reset (Unix epoch seconds). On 429 , also
send Retry-After (seconds, not HTTP-date - it's simpler to
parse). Document the bucket scope per endpoint in OpenAPI.

## 2 Define one shared Error schema and use it everywhere.

Required fields: type (a stable URI or short token like
rate_limited , validation_failed ,
insufficient_funds ), message (one sentence),
request_id , and retry_hint ( retry_now |
retry_after_seconds:N | do_not_retry ). Optional:
details[] for field-level validation errors.

## 3 Match HTTP status to error type honestly. 400 validation,

401 auth, 403 scope, 404 resource, 409 conflict, 422
semantic, 429 rate limit, 5xx your bug. Agents route retries
off the status code first and the type field second; lying
about either breaks the recovery loop.

## 4 Publish a status page at a stable URL ( /status or

status.yourdomain.com ) that returns JSON when called with
Accept: application/json . Schema: status
( operational | degraded | outage ), incidents[] ,
last_updated . Agents poll this before assuming a 5xx is
their problem.

**5 Document the contract.** A "Rate limits and errors" page in
your developer docs with one table of all type values, their
meanings, and the recommended retry strategy.

## EFFORT

## 2

## / 5

## Light

Headers and a shared error schema. A
day's middleware work in any modern
framework, plus a status-page endpoint.

## IMPACT

## 5

## / 5

## Critical

The single highest-leverage runtime
guideline. Agents fail loudly without it
and recover gracefully with it.

## VISIBILITY

## None

HTTP headers and JSON error bodies;
nothing user-visible changes.

## REFERENCES

RFC 6585 - Additional HTTP Status Codes https://datatracker.ietf.org/doc/html/rfc6585?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
RFC 7231 - Retry-After https://datatracker.ietf.org/doc/html/rfc7231?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06#section-7.1.3

<u>RFC 6585 - Additional HTTP Status Codes</u>
<u>RFC 7231 - Retry-After</u>
<u>RFC 9457 - Problem Details for HTTP APIs</u>
<u>GitHub API rate-limit headers</u>

---

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-2-forter-can-help CAN HELP

When you expose your internal tools to the <u>Forter Agentic Orchestration Suite</u>, it publishes them as a
public API in the form this guideline describes - and rate limiting and error standardization are handled
at the gateway. Forter emits `X-RateLimit-*` and `Retry-After` headers on every response,
enforces per-tenant throttling, and wraps every failure in the standard `{type, message,
request<u>_</u>id, retry<u>_</u>hint}` envelope, so the agent-facing contract is correct and consistent without
your origin emitting a single header.

---

# Stream long-running operations

Anything an agent waits on for more than five seconds needs
progress feedback, or the agent assumes it's broken and retries -
usually duplicating side effects. Server-Sent Events for in-band
progress, chunked transfer for large bodies, and an explicit
cancellation path turn a 30-second risk evaluation from "feels
broken" into "feels real-time." And for work that outlives any
reasonable open connection - minutes to hours - the agent shouldn't
hold a socket at all: it registers a **webhook** and gets called back
when the result is ready.

## 1 Mark streaming operations in OpenAPI. Use text/event-

stream as the response content type and an x-streaming:
true extension on the operation. Document the event
schema: event name ( progress | partial | complete |
error ), data payload, and the terminal event that closes
the stream. Function-calling clients and MCP generators key
off this to wire up the right transport.

## 2 Implement SSE for progress. On long operations, hold the connection open and emit event: progress\ndata:

{"percent": 40, "stage": "scoring"}\n\n every 1-3
seconds. End with event: complete\ndata: {...final
result...}\n\n . Flush after every event - buffered SSE is
broken SSE. Set Cache-Control: no-cache and X-Accel-
Buffering: no for nginx in front.

## 3 Use chunked transfer encoding for large response bodies.

Lists, exports, and aggregations stream JSON Lines
( application/x-ndjson ) one record per line so an agent can
process incrementally.

**4 Support cancellation.** When the client disconnects, abort the
underlying work and emit a final event: cancelled if you
can. Issue an idempotency key on the initial request so a retry
after cancellation doesn't re-charge or re-evaluate. Document
the cancellation contract in the operation's OpenAPI
description.

## 5 Offer webhooks for work that outlives a connection. For operations measured in minutes or hours, let the caller

## EFFORT

## 5

## / 5

## Major

A wide surface across the whole request
path: SSE and chunked transfer in the
application servers, buffer-flushing and
idle-timeout tuning through every proxy
and load balancer, idempotency on
retries, and a full webhook delivery
subsystem with signing, backoff, and
redelivery. Frameworks cover pieces, not
the whole.

## IMPACT

## 4

## / 5

## Strategic

Critical for fraud decisions, long-form
generation, batch operations, and any
synchronous action over a few seconds.
Without it, agents hit timeouts and
double-submit.

## VISIBILITY

## None

wire-level changes only; user-visible site
is unaffected.

## REFERENCES

HTML Living Standard - Server-Sent Events
RFC 7230 §4.1 - Chunked Transfer Coding
JSON Lines specification
MCP Streamable HTTP transport
Standard Webhooks specification

RFC 7230 §4.1 - Chunked Transfer Coding https://datatracker.ietf.org/doc/html/rfc7230?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06#section-4.1
JSON Lines specification https://jsonlines.org/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
MCP Streamable HTTP transport https://modelcontextprotocol.io/specification/2025-06-18/basic/transports?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06#streamable-http
Standard Webhooks specification https://www.standardwebhooks.com/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06 register a callback URL instead of holding a stream open.
Document the event types, payload schema, and delivery
semantics in OpenAPI; sign every delivery (HMAC over the
body, signature in a header) so the receiver can verify
provenance; retry failed deliveries with exponential backoff
and expose a redelivery endpoint for the ones that still miss.
Reuse the event names from step 1 ( progress , complete ,
error ) so an agent handles a webhook payload and an SSE
frame with the same code.

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-3-forter-can-help CAN HELP

## CAN HELP

The orchestration suite proxies SSE and chunked responses end-to-end without buffering. Connection
idle timeouts are tuned for agent workloads (10+ minute streams). Cancellation propagates from the
agent through the gateway to your origin. Progress events pass through unchanged; the gateway adds
correlation headers so each progress frame is traceable to the originating MCP tool call. Webhook
deliveries are relayed and HMAC-verified at the gateway, so a callback's provenance is checked before
the agent acts on it.

---

# Operate an MCP server

This is **the** integration point for native agent invocation. With an
MCP server on Streamable HTTP, ChatGPT, Claude, Gemini, and any
function-calling LLM can call your tools natively - no scraping, no
glue code, no "and then we ask the user to paste an API key." Pair
the server with a published server-card and you've covered how
today's major agent runtimes reach your business logic. (Browserresident agents are a separate surface - that's WebMCP,**4.5**.)

It's also the layer where agent drift has the most consequence - MCP
tool calls run **real business logic** (orders, refunds, payments). Pertool OAuth scopes (from **3.1**) bound what any single call can do, even
if the calling agent is steered off-course by prompt injection in a
retrieved page. Operationally substantial enough that most teams
pair with Forter to ship the gateway side.

**1 Implement an MCP server with Streamable HTTP transport.**
Mount it at /mcp (or mcp.yourdomain.com ). Compile your
tool list directly from the OpenAPI spec from 4.1: each
operationId becomes a tool, each request schema becomes
the tool's input schema, each response schema becomes the
output schema. Manual tool authoring drifts; generation does
not.

**2 Bind every tool call to an OAuth bearer token.** Reuse the auth
server from 3.1. Tools execute under the caller's scopes - an
agent with orders:read cannot invoke payments:write ,
even if it tries. Reject calls with no token, expired tokens, or
insufficient scope using the same structured error envelope
from 4.2 ( type: "insufficient_scope" , retry_hint:
"do_not_retry" ). This is the layer that contains blast radius if
an agent drifts from intent.

## 3 Publish a server-card at /.well-known/mcp/server-

card.json**.** Required fields: name , description , version ,
serverUrl , transport: "streamable-http" ,
authorization (linking to your RFC 8414 / 9728 metadata
from 3.1), and tools[] with {name, description,
inputSchema, outputSchema} .

## EFFORT

## 4

## / 5

## Heavy

A real MCP server (Streamable HTTP,
OAuth-bound sessions, per-tool
authorization), plus tool annotations
and read-only resources, plus WebMCP,
plus a published server-card, plus perinvocation observability. Off-the-shelf
MCP frameworks help.

## IMPACT

## 5

## / 5

## Critical

The single most leveraged endpoint in
the guide. Every agent runtime that
matters consumes MCP first.

## VISIBILITY

## None

/mcp endpoint and /.wellknown/mcp/server-card.json are
machine-only. No user-visible page
changes.

## REFERENCES

Model Context Protocol specification
MCP Streamable HTTP transport
MCP Server Card
MCP resources
MCP Registry

MCP resources https://modelcontextprotocol.io/docs/concepts/resources?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
MCP Registry https://github.com/modelcontextprotocol/registry?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

## 4 Declare behavioral annotations on every tool. Tag each tool with annotations.readOnlyHint and

annotations.destructiveHint so the host knows which
calls are safe to retry or auto-approve and which mutate state -
getOrderStatus is readOnlyHint: true , while
cancelOrder , initiateReturn , and disputeCharge are
destructiveHint: true . Agents read these to decide when
to pause for user confirmation; an unannotated mutating tool
gets either blocked or called with no safety prompt.

## 5 Expose read-only context as MCP resources. Tools are for actions; resources are for context an agent reads before acting

- catalogs, pricing tables, status snapshots, docs. Advertise the
**resources** capability in the initialize handshake and
implement resources/list and resources/read . Each
resource needs a stable URI, an accurate mimeType , and a
non-empty body. An agent that can read pricing://current
as a resource doesn't have to spend a tool call (and a scope)
just to answer "what does this cost?".

## 6 Observe every invocation. Log every tool call with

{tool_name, client_id, sub, request_id, latency_ms,
status, error_type} . Aggregate to a per-tool latency / error
budget you alert on. This is your forensic audit trail - if an
agent drifts and chains tool calls in unintended ways, this is
the lens that catches it. (Once observability is solid, list the
server in registries - mcp.run, mcphub.io, Smithery, skills.sh -
per <u>4.6</u>. Consumer AI platforms - GPT Store, Custom GPTs,
Claude, Gemini - are <u>5.1</u>.)

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-4-forter-can-help CAN HELP

## CAN HELP

A production MCP server with Streamable HTTP, operated for you and exposed under your domain.
Tools auto-generated from your OpenAPI on every release. Server-card published at your `/.wellknown/mcp/server-card.json` via reverse-proxy. Every tool call runs behind the OAuth server Forter
operates in <u>3.1</u>- per-tool scopes are enforced at the gateway before a call reaches your origin.
Behavioral tool annotations ( `readOnlyHint` / `destructiveHint` derived from your spec's HTTP
verbs) and read-only MCP resources included. MCP-registry submissions (mcp.run, mcphub.io,
Smithery) handled and re-verified on every release. Per-invocation observability with dashboards and
alerting wired in. What would otherwise be a substantial engineering build becomes an integration.

---

# Expose tools with WebMCP

WebMCP (the W3C proposal) is the lowest-friction way to make a
website agentic. Where an MCP server (<u>4.4</u>) is backend infrastructure
- WebMCP is a browser API. A few lines of JavaScript on a page
register **tools**, and a browser-resident agent (Chrome with Gemini,
or a local model) calls them directly, inside the user's own session,
with no server, no separate auth, and no API program required.

It is an emerging Google and Microsoft W3C proposal - early, but
cheap to adopt. It reuses the same tool model as MCP ( `name` ,
`description` , `inputSchema` , `annotations` ), so the
descriptions and schemas written for <u>4.4</u> carry straight over - and a
site with no MCP server at all can still adopt WebMCP on its own.

**1 Register tools with** registerTool()**.** Call it on the page's
model-context object. The current W3C spec exposes it as
document.modelContext ; earlier Chrome builds and the
MCP-B polyfill use navigator.modelContext (which also
carries an older provideContext() form that swaps the
whole toolset at once), so feature-detect both before using it.
You declare each tool in page JavaScript - you decide exactly
which actions are exposed. A tool needs a name , a naturallanguage description , an inputSchema ( JSON Schema for
its parameters), and an execute callback that does the work
and returns a Promise:

const mc = document.modelContext ||
navigator.modelContext;
mc.registerTool({
name: "search_products",
description: "Search the catalog by keyword and return
matching products.",
inputSchema: {
type: "object",
properties: { query: { type: "string"}},
required: ["query"]
},
annotations: { readOnlyHint: true},
async execute({ query}) {
const results = await searchCatalog(query);
return { content: [{ type: "text", text:
JSON.stringify(results)}]};
}
});

## EFFORT

## 2

## / 5

## Light

Front-end work only: register tools in
page JavaScript, write clear descriptions
and input schemas. No server, no auth
server, no OpenAPI prerequisite. The
spec is still maturing, so budget for
some API churn.

## IMPACT

## 3

## / 5

## Notable

Emerging-standard upside. Browser
support is still landing, but WebMCP is
the cheapest path to being callable by
in-browser agents, and the downside
risk is near zero given the cost.

## VISIBILITY

tools are registered in JavaScript; the
page renders exactly as before.

## REFERENCES

<u>WebMCP proposal - W3C</u>
<u>Model Context Protocol specification</u>
<u>JSON Schema</u>
<u>The WebMCP Directory</u>

WebMCP proposal - W3C https://webmachinelearning.github.io/webmcp/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Model Context Protocol specification https://modelcontextprotocol.io/specification?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
JSON Schema https://json-schema.org/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
The WebMCP Directory https://webmcp.cool/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06 type: "object",

---

**Annotate tools so the agent knows what is safe.** Set
annotations.readOnlyHint on tools that only read state,
and annotations.untrustedContentHint on tools that
return data you do not control. A browser agent reads these to
decide what it can call on its own and what to treat with
caution.

**Gate consequential actions on user confirmation.** A tool's
execute callback receives a ModelContextClient ; call
client.requestUserInteraction() before anything that
spends money or mutates account state. The user is already in
the browser - put them in the loop rather than letting the
agent commit silently.

**4 Register and unregister tools to match page state.** The tool
list should reflect what the current view can actually do:
register tools as a view mounts and pass an AbortSignal
( registerTool(tool, { signal}) ) so they are removed
when the user navigates away. An agent offered a stale tool
will call it and fail.

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-5-forter-can-help CAN HELP

## CAN HELP

The <u>Forter Agentic Orchestration Suite</u> generates the in-page `registerTool` bindings from the
same tool definitions it already builds your MCP server (<u>4.4</u>) from - so your browser-side and serverside tool surfaces are described once and stay in sync. The bindings, the `execute` callbacks, and the
page-state lifecycle (registering on view mount, unregistering on navigation) are generated for you,
not handed to you as a starting point.

Forter helps to **embed the bindings into your existing site**- a single script tag on the pages you
choose, with no application rewrite. Once embedded, the tools you expose become callable by every
browser-resident or AI agent that supports WebMCP, alongside the same surface your MCP server
already serves to remote agents. WebMCP is still a moving proposal, so Forter tracks spec revisions
and updates the generated bindings as the API stabilizes - your integration moves with the standard,
not against it.

---

# List in agent registries

With the MCP server live (<u>4.4</u>) and the OpenAPI clean (<u>4.1</u>), you
finally have something to publish. Agents discover capabilities
through **registries**- not by crawling - and several matter today:
**mcp.run, mcphub.io, Smithery, Glama** (MCP-server marketplaces),
**skills.sh** (a domain-level skill catalog with first-class indexing in
Claude and Cursor), the official **MCP Registry**, **ARD registries**
(Google-backed, crawl `ai-catalog.json` ), and **score-based**
**directories** (ranking agents may query in real time). Listing is free,
the forms are short, and the discipline is keeping descriptions
accurate as your tool surface evolves.

**1 mcp.run and mcphub.io.** Submit your MCP server URL, a oneparagraph description, your tool list, and a logo. Both pull tool
metadata from your server's tools/list endpoint, so the
description on each MCP tool is what users actually read -
write them like API docs, not marketing copy. Tool description
quality traces back to your OpenAPI from <u>4.1</u>.

**Smithery.** The largest MCP marketplace. Adds a
smithery.yaml at your repo root declaring runtime, env vars,
and start command - that's what enables one-click installs in
Cursor and Windsurf.

**3 skills.sh - register your domain.** Claim your domain at skills.sh
and publish a top-level SKILL.md per public repo listing every
callable skill with name , description , inputs , outputs ,
and an example block. Format is markdown with frontmatter
- borrow from any well-known repo (e.g.,
stripe/stripe.com/SKILL.md ).

**4 skills.sh - quality signals.** The registry ranks listings on three
signals: (a) **multiple repos** under the same domain, each with
its own SKILL.md ; (b) **descriptions that pass an LLM rubric**
for clarity (no "powerful, easy-to-use platform" filler); and (c)
**freshness**-SKILL.md updated within 90 days. Sites with one
thin SKILL.md rank below sites with five focused ones.

**5 Publish to ARD registries.** If you published /.wellknown/ai-catalog.json in <u>1.2</u>, ARD registries will crawl it and
make your capabilities discoverable via natural-language

## EFFORT

## 1

## / 5

## Trivial

Four submissions, ~15 minutes each.
Quality of the listings is bounded by
quality of the underlying spec, so most
of the work happened in <u>4.1</u> and 4.4.

## IMPACT

## 3

## / 5

## Notable

Without listings you're invisible to
capability discovery; with them you
appear in the picker every time a user
asks for "tools that do X."

## VISIBILITY

listings live on third-party registries, not
on your site.

## REFERENCES

<u>Model Context Protocol Registry</u>
<u>Smithery - publishing servers</u>
<u>skills.sh - SKILL.md spec</u>
<u>Google Agentic Resource Discovery (ARD)</u>
<u>Glama MCP directory</u>
<u>ora.ai directory</u>

Google Agentic Resource Discovery (ARD) https://agenticresourcediscovery.org/spec?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Glama MCP directory https://glama.ai/mcp?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
ora.ai directory https://directory.ora.ai/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06 queries. As these registries come online, being crawlable by
them is the next registry play. Ensure your ai-catalog.json
is valid and your representativeQueries are well-chosen.

## 6 List on score-based directories and monitor your score.

directory.ora.ai is one free listing. Score-based directories
claim agents query rankings in real time to pick vendors -
whether or not that becomes real routing volume, a free listing
plus score monitoring is 15 minutes of work. Use journey.ora.ai
to watch a real agent run an intent against your live site.

**7 Register on the official MCP Registry.** The MCP Registry is the
protocol-level server directory. Alongside Glama (19,831+
servers), it is becoming a primary discovery surface for agent
runtimes.

**8 Verify and monitor.** After each submission, search the registry
for your brand name and a representative use-case query. Set
a 30-day reminder to re-verify - registries periodically re-crawl
and silently de-list servers that 5xx or change shape.
(Consumer AI platforms - GPT Store, Custom GPTs, Claude
integrations, Gemini extensions - are 5.1's job, with their own
review cycle.)

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-6-forter-can-help CAN HELP

If your MCP server runs on the <u>Forter Agentic Orchestration Suite</u>, registry submission can be
handled for you - with descriptions auto-generated from your OpenAPI document and tool
annotations. Re-verification runs on every release, so silent de-listings (the most common registry
failure mode) get caught before they cost you discoverability.

---

# Distribute SDKs & CLI

Agents and the developers building them reach for SDKs and CLIs
first, raw HTTP second. Without an idiomatic SDK in the language an
integrator (or an LLM writing code on their behalf) is using, every
consumer rolls their own client and gets at least one of pagination,
retries, error parsing, or auth wrong. With SDKs in npm and PyPI -
plus a CLI on npm and Homebrew - integration is one install away.

This is also where the OpenAPI investment from <u>4.1</u> pays a second
dividend: a complete spec generates both SDKs and a CLI for the
cost of one.

**1 Pick one OpenAPI generator and commit.** Stainless,
Speakeasy, Fern, or openapi-generator are the credible
options. Test each against your spec from <u>4.1</u>- the one whose
output you'd be willing to hand-edit is the one to pick.
Switching mid-stream costs months.

**2 Ship the npm and PyPI SDKs.** TypeScript on npm and Python
on PyPI cover ~80% of agent and integration code. Idiomatic
naming ( client.transactions.create({...}) , not
client.postTransactions(...) ), typed responses,
automatic retries with exponential backoff that respect the
Retry-After headers from <u>4.2</u>, and pagination iterators
( for await (const tx of client.transactions.list()) ).

**3 Distribute a CLI on npm and Homebrew.** Mirror your SDK
surface -yourbrand transactions create--amount 1000-
plus auth helpers ( yourbrand login doing the OAuth device
flow from <u>3.1</u>), config management, and a--json flag for
piping into agent workflows.

PyPI publishing guide https://packaging.python.org/en/latest/tutorials/packaging-projects/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Homebrew tap creation https://docs.brew.sh/How-to-Create-and-Maintain-a-Tap?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

**4 Auto-publish on every spec release.** CI pipeline: spec change
merges, generator runs, both SDKs and the CLI build, tests
pass against a sandbox, version bumps semantically,
changelogs generate from spec diffs, packages publish to all
three registries, GitHub release goes out.

## EFFORT

## 3

## / 5

## Moderate

Assumes the OpenAPI spec from <u>4.1</u> is
already published; if it isn't, that work
comes first. Given the spec, the hard
part is the publishing pipeline - signing,
versioning, and per-registry credentials.
Generation itself is largely solved.

## IMPACT

4 Speakeasy, Fern, or openapi-generator are the credible

## 4

## / 5

## Strategic

Major integration accelerator; LLMs
writing integration code reach for
import stripe before they reach for
requests .

## VISIBILITY

## None

SDKs ship to package registries, not
your site.

## REFERENCES

<u>OpenAPI Generator</u>
<u>npm publishing docs</u>
<u>PyPI publishing guide</u>
<u>Homebrew tap creation</u>
<u>Fern</u>
<u>Speakeasy</u>

---

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-7-forter-can-help CAN HELP

Run on the <u>Forter Agentic Orchestration Suite</u> and the SDK and CLI layer can be generated for you.
From the tool surface you expose, Forter builds and publishes idiomatic SDKs in the popular languages
- ready to link straight from your developer docs - and stands up an authenticated API that your users
and their agents can call directly. Auth, retries, error handling, and pagination come wired in, and
every SDK regenerates when your tools change.

---

# Support agent payment protocols

When an agent has to settle a payment at the moment of an HTTP
call - buying metered API access, paying for compute, or checking
out an order - it has to do so without a human typing a card number.
Agent-native payment splits into a **settlement** layer that answers
the HTTP `402 Payment Required` handshake (x402, MPP) and an
**authorization** layer that proves the user actually approved the
purchase (AP2):

**x402** (Coinbase) is the minimal, crypto-native case: one request,
one stablecoin payment (USDC, usually on Base), one response.
It is purpose-built for machine-to-machine metering - API calls,
data feeds, compute, agent-to-agent services - and is
**stablecoin-only**, so it does not reach card/bank rails or physicalgoods checkout.

**MPP** (Machine Payments Protocol, from Stripe and Tempo, now
an IETF Internet-Draft) generalizes the same `402` exchange
into a **payment-method-agnostic** framework. A single endpoint
can accept stablecoins, cards, bank transfers, even Bitcoin, and
it carries two intents: `charge` (one-shot - which maps directly
onto an x402 payment, making MPP backwards-compatible with
it) and `session` (pre-authorize a spending limit once, then
stream granular micropayments). That breadth means MPP is
**not** limited to per-call metering - the same handshake settles for
**physical goods and services across crypto and traditional**
**rails**.

**AP2** (Agent Payments Protocol, Google) sits a layer up. Instead
of settling a `402` , it carries **cryptographic proof that the**
**user authorized this purchase**- a signed Mandate (an SD-JWT
Checkout Mandate for what was authorized, in open/preauthorization or closed/final form, plus a Payment Mandate for
the funding instrument). Built as an extension of A2A and
advertised on your `agent-card.json` , it's payment-methodagnostic and **composes** with the settlement layer rather than
replacing it: AP2 authorizes, x402 and MPP settle.

These are early standards - adoption is growing fast but the specs
still move - so treat this as forward-positioning, not table stakes.

## EFFORT

## 4

## / 5

## Heavy

Payment middleware on every priced
route, a funded wallet, facilitator wiring,
and settlement reconciliation - plus the
standing operational weight of holding
and securing a wallet. The protocols are
still in flux, so expect spec churn on top.

## IMPACT

## 2

## / 5

## Minor

Forward-looking. Real for sites selling
metered access or accepting agentnative checkout today, but adoption is
early and the downside of waiting is low.

## VISIBILITY

## None

/.well-known/* discovery files and
HTTP 402 responses on paid routes;
human-visible pages don't change.

## REFERENCES

<u>x402 protocol</u>
<u>MPP - Machine Payments Protocol</u>
<u>AP2 - Agent Payments Protocol</u>

AP2 - Agent Payments Protocol https://ap2-protocol.org/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

## 1 x402 for crypto-native pay-per-request. x402 negotiates

payment inline over HTTP, settled in stablecoins on crypto rails.
When an agent calls a priced route, the server answers 402
Payment Required with the payment terms - amount,
accepted scheme, and where to pay. The agent settles those
terms - typically through a facilitator that brokers and verifies
the transfer - and retries with proof of payment, which returns
the real response. To support it, mark your paid routes, point
them at a facilitator and a receiving wallet, and advertise which
routes are priced so agents can find the paid surface before
calling. Open-source middleware for the common web
frameworks makes the wiring mostly configuration.

**2 MPP for multi-rail and physical-goods settlement.** MPP
answers the 402 with a WWW-Authenticate: Payment
challenge whose method ( tempo , stripe , card ,
lightning , ...) and intent ( charge for one-shot,
session for streaming) pick the rail and the payment shape -
so one integration covers stablecoins, cards, and fiat and
reaches physical-goods checkout, not just metered calls.
Annotate payable operations in your /openapi.json (<u>4.1</u>) so
agents can discover priced surfaces, and wire the MPP
middleware (SDKs ship for TypeScript, Python, and Rust) to
handle the handshake and settlement.

## 3 AP2 for proof of authorization. If agents transact on a user's behalf, advertise AP2 support as an A2A extension on your

/.well-known/agent-card.json (extension URI
https://github.com/google-agentic-commerce/ap2/v1 )
and accept the signed Mandates on your checkout path. This is
what lets a merchant or card network trust that the absent
buyer really authorized this cart at this price - the trust layer
that x402/MPP settlement rides on.

## 4 Reuse your auth and error stack. Every payment route sits behind the OAuth scopes from 3.1 and returns the structured error envelope from 4.2. A declined payment is type:

"payment_required" or type: "payment_declined" with an
honest retry_hint- never a bare 500 .

---

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-8-forter-can-help CAN HELP

The hardest part of agent payments is not the `402` handshake - it is everything around the wallet:
creating one, funding and maintaining it, and satisfying KYC / KYA obligations on the parties
transacting through it. The <u>Forter Agentic Orchestration Suite</u> speaks x402 and MPP at the gateway
and can take that wallet burden on - standing up and maintaining the wallet behind your priced routes,
with identity and KYC/KYA checks drawn from the Forter Identity Network applied to each settlement.

This part of the orchestration suite is an early-stage offering and moves with the protocols themselves
- scope it with Forter for what is production-ready today versus on the roadmap. What stays yours:
your pricing, and the processor relationship behind settlement.

---

# Support agentic commerce protocols

When an agent shops on a user's behalf - finds a product, builds a
cart, checks out, and after the sale checks order status, initiates a
return, or disputes a charge - it needs a structured commerce
surface, not a scrape of your storefront HTML. Two protocols cover
this: **UCP** (Universal Commerce Protocol) and **ACP** (Agentic
Commerce Protocol). Both let an agent discover a catalog, assemble
a cart, and complete a purchase against a defined contract. This
guideline applies if an agent could browse your products and check
out on a user's behalf; if you only sell metered, pay-per-call access,
that is <u>4.8</u> instead, and if you sell nothing at an agent call, skip both.

These standards are still settling, but adoption is real and
accelerating - merchants are transacting through Google, Gemini,
and AI-mode surfaces today.

**1 Support UCP.** Publish a /.well-known/ucp discovery file
declaring your services, capabilities, and endpoints. UCP builds
on Google's shopping graph, so your products must also be
listed - and kept current - as a catalog in Google Merchant
Center. Then implement /checkout-sessions in full
compliance with the UCP spec, every request and response
shape it defines, so an agent can assemble a cart and
complete the purchase through what UCP calls the payment
handler.

**2 Support ACP.** Publish a /.well-known/acp.json discovery
file, and submit your product catalog to OpenAI so ACP-driven
agents can discover your items. Then implement
/checkout_sessions in full compliance with the ACP spec,
every request and response it defines, so an agent can run the
checkout end to end and settle through what ACP calls
delegated payment.

3 **Keep the platforms in sync with webhooks.** A completed
checkout is only the start of the order's life. Send webhooks
back to the agent platform on order completion, cancellation,
and every order-status change (shipped, delivered, refunded)
so the agent - and the user it acts for - always sees current
state, not a stale snapshot.

## EFFORT

## 4

## / 5

## Heavy

A real commerce surface: catalog or
feed submission, cart state, a checkout
flow, and settlement wiring - all on specs
that keep moving.

## IMPACT

## 4

## / 5

## Strategic

Emerging but transformative: for
anyone selling products to agents, this
is fast becoming where the sale
happens.

## VISIBILITY

## None

discovery and checkout endpoints; uservisible pages don't change.

## REFERENCES

<u>UCP - Universal Commerce Protocol</u>
<u>ACP - Agentic Commerce Protocol</u>
<u>Google Merchant Center</u>

---

**4 Move guests to registered users.** A protocol checkout defaults
to guest checkout. Add identity linking and/or OAuth (<u>3.1</u>) so
an agent's purchase can attach to a real, returning customer
account - unlocking order history, saved preferences, and
loyalty instead of leaving every agent sale anonymous.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m4-9-forter-can-help CAN HELP

Agentic commerce is the part of this module the <u>Forter Agentic Orchestration Suite</u> can shoulder
most completely - and it scales to however much of the stack you want to hand over.

**Product feed**- Forter can build and maintain the catalog feed UCP and ACP run on, or work from
the feed you already produce.

**Tokenization and settlement**- Forter is a PCI-compliant tokenizer for the settlement step of both
protocols, and a PSP-agnostic payment orchestrator that can authorize and capture funds on your
behalf - or it slots in alongside the tokenization and processor you already use.

**Cart and checkout**- Forter runs the cart and checkout flows for you, working inside your existing
OMS and internal systems rather than around them.

**Webhooks and identity**- if you are already a Forter customer with the orchestration suite
integrated, the order webhooks and status updates of step 3 are handled for you, and Forter's
identity linking is built in - so steps 3 and 4 land with little extra work.

**Post-purchase**- returns, refunds, and chargeback disputes are where loss concentrates after the
sale, and agents will initiate all three on a user's behalf. Forter's **Abuse Prevention** scores return
and refund requests for abuse before you approve them; **Dispute Management** handles
chargeback representment and recovery on the disputes that land - both drawing on the same
Forter Identity Network signal that cleared the checkout.

**Spec drift**- UCP and ACP are still moving; Forter tracks every revision so your integration doesn't
break when a spec changes underneath it.

The deeper value is in what these protocols don't carry. As they stand, neither UCP nor ACP surfaces
every signal a sound validation and fraud decision needs. Forter collects the missing pieces - identity,
device reputation, behavioral history, agent provenance - and assembles them, alongside the cart, into
one coherent validation and fraud-check call. That mapping-and-collection work is substantial and easy
to underestimate; offloading it is the difference between a checkout that merely completes and one
you can trust. Every checkout the orchestration suite brokers carries the same Forter Identity Network
signal that runs human card-not-present commerce.

What stays yours: your catalog, your pricing, and the decision of how much to bring versus hand over.

---

# Operate an NLWeb endpoint

NLWeb is an emerging open standard for turning your site's content
into something an agent can converse with rather than scrape. You
publish your structured content as **Schema Feeds**, an NLWeb server
ingests them, and it exposes a single standard endpoint -`POST
/ask`- that answers natural-language questions over that content
and returns structured JSON. Every NLWeb instance is also an MCP
server, so the same `/ask` surface is reachable both as a plain
HTTP endpoint and as an MCP tool. Think of it as the conversational
counterpart to your sitemap: the sitemap lists your pages, NLWeb
answers questions about them.

It's early - the spec is still moving and adoption is thin - but it's cheap
to stand up on top of structured data you should already have (<u>2.1</u>),
and it's the cleanest way to let an agent ask "do you carry X?" or
"what's your return window?" without crawling.

## 1 Publish Schema Feeds. Add one line to robots.txt-

Schemamap: https://example.com/.well-known/schemamap.xml- and serve a Schema Map XML pointing at any JSONL
or RSS feeds you publish (product feeds, blog feeds, FAQ
feeds). The feed items carry Schema.org types, so the
structured-data work from <u>2.1</u> is the corpus NLWeb retrieves
from.

**Start with a minimal** POST /ask**.** The whole protocol reduces
to one endpoint, and the minimal viable version needs no
vector store and no model - it can forward the incoming
question straight to your existing search endpoint or search
tool. The request is a JSON body carrying the natural-language
query ; the response is ranked, structured results plus a
_meta block:

NLWeb project https://github.com/microsoft/NLWeb?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

{

"results": ["...ranked, structured matches..."],
"_meta": { "response_type": "...", "version": "..."}

The two _meta fields -response_type and version- are
what let a client confirm it's talking to a conformant NLWeb
server. Keep /ask public and unauthenticated; friction-free
agent retrieval is the whole point.

## EFFORT

## 3

## / 5

## Moderate

Publishing Schema Feeds is an
afternoon, and a minimal /ask that
wraps your existing search is modest.
The full vector-store-plus-model server
is the real work, though the open-source
NLWeb toolkit does most of it.

## IMPACT

## 2

## / 5

## Minor

Forward positioning, same class as <u>4.8</u>.
Adoption remains thin, but the durable
part - Schema Feeds - reuses <u>2.1</u>'s work.
Plausibly central as conversational
retrieval matures.

## VISIBILITY

## None

a Schemamap line in robots.txt, a feed
file, and an /ask endpoint - all
machine-only.

## REFERENCES

<u>NLWeb project</u>
<u>Schema.org vocabulary</u>
<u>HTML Living Standard - Server-Sent Events</u>

---

**3 (Optional) Expand to a full NLWeb server.** When you want
genuine natural-language retrieval rather than a search
passthrough, adopt the open-source NLWeb toolkit: it ingests
your Schema Feeds into a vector store and wires them to an
LLM backend. Point it at the feeds from step 1 and re-index on
a schedule so answers track your live catalog, not a stale
snapshot.

**4 Support streaming.** When the client asks for a streamed
response, send results back incrementally as Server-Sent
Events instead of one blocking JSON body - the same SSE
discipline as <u>4.3</u>. Long answers feel responsive; short ones cost
nothing extra.

**5 Verify both surfaces.** curl the /ask endpoint with a
representative question and confirm the _meta fields; then
connect to the same server over MCP and confirm the ask
tool appears. An NLWeb server that fails the MCP handshake is
only half-deployed.

## CAN HELP

If standing up a vector store, an ingestion pipeline, and a model backend is more than you want to
own, the <u>Forter Agentic Orchestration Suite</u> can host the NLWeb server for you. Point it at your
Schema Feeds and Forter publishes a conformant `POST /ask` endpoint under your domain -
reachable both as plain HTTP and as the MCP tool every NLWeb instance also exposes - and re-ingests
on a schedule so answers track your live catalog.

---

## The agent's question

**"I authenticated, I called the API, I got a result. How do I show**
**this to the user in a way that completes the intent?"**

Modules 1-4 are infrastructure. Module 5 is **product**- where an agent-driven flow
becomes a user experience that competes with a traditional web visit. A site that
nails the rest but skips Module 5 has built a beautiful API that nobody sees.

## Three planes of experience

1. **Inline UI.** MCP Apps lets your tool render an interactive component **inside the**
**chat conversation**- payment picker, confirmation, comparison.

2. **Marketplace presence.** ChatGPT GPT Store and **Custom GPTs**, Claude
integrations, Gemini extensions. Verified-integration badges measurably
increase recommendation rates.

3. **Conversational coverage.** Multi-turn flows that don't dead-end on missing
pricing or comparison content.

## A note on experiential security

Inline UI renders inside a host environment shared with components from other
tools. Treat your bundle like any other public surface: signed, CSP-locked, networkscoped to your origin. Continuous simulation (<u>5.4</u>) catches host-runtime drift
before it reaches users.

---

# Get verified on AI platforms

Three submission paths matter most: the **ChatGPT GPT Store** (which
reads your `/.well-known/ai-plugin.json` and powers userbuilt **Custom GPTs** that consume your plugin), the **Claude**
**integrations directory** (which lists your MCP server, see <u>4.4</u>), and
**Gemini extensions**. Each one stamps a verified-integration badge
on listings that pass review - and that badge measurably increases
tool-selection rates and serves as a trust signal users see directly.
Spoofed integrations are a known phishing surface; verification is
what distinguishes legitimate from impersonator.

The work itself is mostly waiting. Each platform takes 2-8 weeks to
review, and re-verifies whenever your manifest, scopes, or auth flow
change.

**1 Confirm your submission surface is current.** Apps in ChatGPT
has moved to an MCP-based model via the Apps SDK. Before
submitting, verify against OpenAI's current Apps
documentation whether /.well-known/ai-plugin.json still
gates new submissions, or whether the MCP server card (<u>4.4</u>) is
now the primary submission surface. Keep ai-plugin.json
live for backward compatibility (the file ships in <u>1.2</u>), and
ensure it still points at the live OpenAPI from <u>4.1</u> and OAuth
metadata from <u>3.1</u>.

**2 Submit to Apps in ChatGPT.** Provide the required metadata
(manifest or MCP server URL, privacy policy, legal info, contact
email, screenshots). Expect 2-4 weeks for first review. A verified
listing lets users build Custom GPTs on top of your service
without re-implementing your auth handshake.

**3 Submit to Claude integrations.** Points at your MCP server's
/mcp endpoint (<u>4.4</u>) and the corresponding oauthprotected-resource metadata. Anthropic verifies the MCP
handshake, scope semantics, and tool descriptions.

**4 Submit to Gemini extensions.** Google's review focuses on
OpenAPI cleanliness, OAuth scope minimization, and consentscreen copy. The same OpenAPI you submit to the GPT Store
typically works without modification.

## EFFORT

## 3

## / 5

## Moderate

The technical lift per platform is small (a
manifest, a screenshot bundle, a privacy
URL). The cost is calendar time plus the
discipline to re-submit on every
breaking change.

## IMPACT

## 5

## / 5

## Critical

Without a verified listing, your tool ranks
below verified competitors in agent toolselection.

## VISIBILITY

listings appear on third-party platforms;
an optional "available on" badge on your
site is up to you.

## REFERENCES

<u>Apps in ChatGPT</u>
<u>Claude integrations directory</u>
<u>Gemini extensions documentation</u>

Gemini extensions documentation https://ai.google.dev/gemini-api/docs/extensions?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

**5 Track re-verification cadence.** Every breaking change to your
manifest, OAuth scopes, MCP tool surface, or pricing model
triggers re-review. Build a release checklist that flags
submission updates and queues them in parallel rather than
sequentially.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m5-1-forter-can-help CAN HELP

Plugin manifest publication, GPT Store / Custom GPT / Claude / Gemini submissions, and re-verification
on every release can be managed for customers using the orchestration suite. Forter keeps the
manifest in sync with the live OAuth metadata and MCP server it operates on your behalf, so
verifications don't break the moment you ship a new scope or tool. You inherit the verified badges
across three platforms without owning the submission queue.

What stays yours: privacy policy copy, contact email, screenshots of your product in the agent surface,
and any platform-specific positioning you want to control.

---

# Render UI with MCP Apps

MCP Apps lets your tool render an **interactive UI component inside**
**the chat conversation itself**- a size selector, an address picker, a
payment-method picker, an order-confirmation dialog. Not a
redirect, not a link out. The user transacts inside the agent surface.
This is the largest UX leap in agentic commerce since OAuth, and it
collapses discover → understand → decide → act into a single
conversational turn.

Worth knowing: the host environment is **shared with components**
**from other tools**. Treat your bundle like any other public surface -
signed, CSP-locked, network-scoped to your origin. The standards
are well-defined; the build is non-trivial enough that most teams pair
with Forter, which ships the component layer ready-made.

## 1 Enable the Apps capability on your MCP server. In the

initialize response, advertise
capabilities.experimental.apps (per the
modelcontextprotocol-ext-apps draft). Requires the MCP
server foundation from <u>4.4</u> already running with Streamable
HTTP.

## 2 Build host-compatible component bundles. Use

@modelcontextprotocol/ext-apps to compile
React/Svelte/Vue components into the host-runtime format
(served with the MCP Apps MIME type
text/html;profile=mcp-app ). Bundles must be selfcontained and signed so the host can verify provenance before
mounting. The host enforces a strict baseline CSP ( defaultsrc'none' , object-src'none' ); declare any origins you
legitimately need through the spec's _meta.ui.csp allowlists
( connectDomains , resourceDomains , frameDomains ,
baseUriDomains ) rather than relaxing CSP wholesale.

## 3 Expose ui:// resources with stable, versioned URIs. Each component lives at a URI like

ui://yourcompany.com/checkout/payment-picker@1.4.0 .
Version every URI: agents cache aggressively, and an
unversioned change bricks conversations mid-flight.

## EFFORT

## 4

## / 5

## Heavy

Three new surfaces at once: the MCP
Apps capability declaration on your
server, the component bundles
themselves (host-compatible, CSPlocked, signed), and the JSON Schema
contract that ties tools to UI resources.
The spec is stabilizing.

## IMPACT

## 5

## / 5

## Critical

Tools with inline UI dramatically outconvert tools that hand the user a link.

## VISIBILITY

## None

(on your site) - components render
inside the chat host (ChatGPT, Claude).
Nothing on your own site changes.

## REFERENCES

<u>MCP Apps extension spec</u>
<u>MCP resources reference</u>
<u>MCP _meta field reference</u>
<u>CSP - Content Security Policy</u>

MCP resources reference https://modelcontextprotocol.io/docs/concepts/resources?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
CSP - Content Security Policy https://www.w3.org/TR/CSP3/?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

---

**4 Tag tools with** <u>_</u>meta.ui.resourceUri**.** On every tool that
should render inline, set _meta.ui.resourceUri to the
matching ui:// URI. The agent host reads this metadata at
tool-listing time and pre-warms the component before
invocation.

**5 Define the component-tool contract via JSON Schema.** Both
the tool's inputSchema and the resource's expected props are
JSON Schema. Define them in lockstep - a payment picker that
expects { amount, currency, methods[]} must match
exactly what the tool returns.

**6 Sandbox aggressively.** CSP-lock every bundle, sign every
asset, scope every network call to your origin only, and never
accept arbitrary HTML from the tool's response. Assume the
host environment is shared with components from other tools.

## CAN HELP

If you run your MCP server on the <u>Forter Agentic Orchestration Suite</u> (<u>4.4</u>), the MCP Apps layer comes
with it. Your tools don't just answer in plain text - they render a **predefined storefront and support UI**:
product and variant pickers, a size selector, and other components that matter.

The UI is yours to brand. Set your colors, adjust the design, and supply custom CSS so the components
read as your storefront rather than a generic widget. The Content Security Policy is managed for you
and remains configurable - so you can roll out your own scripts within it, Google Analytics and other
tags included, without weakening the sandbox the host requires.

What stays yours: the brand decisions themselves, your catalog and pricing.

---

# Stay consistent across surfaces

Agents cross-check what you say about yourself across surfaces.
Your HTML `<title>` , OG description, MCP tool descriptions,
plugin manifest, `llms.txt` overview, and agent card all end up in
the same context window when an agent decides whether to call
your tool. When they disagree, confidence - and tool-selection rate -
drops. This isn't about marketing copy; it's about descriptive
consistency for the **same noun**: what your product does, who it's for,
what it costs.

You locked the canonical copy back in **1.2** and every guideline since
has pulled from it - so this is a **verification pass, not a rewrite**:
confirm nothing drifted, and fix the surface or two that did.

**1 Open the canonical copy file from 1.2.** The short name, the
model-facing description, and the human-facing paragraph
were settled once, at the start of the build. That file is the
reference; every other surface gets checked against it.

**2 Diff every surface against it.** Compare each to the canonical
copy, side by side: HTML <title> , <meta
name="description"> , OG og:title / og:description ,
the llms.txt opening paragraph, MCP serverInfo.name
and tool description fields, ai-plugin.json
name_for_human / description_for_model , aicatalog.json descriptions, the GPT Store / Claude / Gemini
listings, the agent card. If every guideline pulled from the
canonical file as instructed, this is clean - in practice one or two
surfaces drift.

**3 Fix the drift at its source.** Where a surface diverged, correct it
and correct the template or generator that produced it, so it
can't drift again. CMS-controlled surfaces - HTML head, OG
tags, sitemap titles, llms.txt- are your repo and your team;
Forter cannot reach in here.

**4 Align Forter-controlled metadata.** Submit canonical short
name, descriptions, and tool-level descriptions to Forter's
customer console; the orchestration suite propagates them to
the MCP server's serverInfo , every tool's description
field, the published ai-plugin.json , the agent card, and re-

## EFFORT

## 2

## / 5

**Light**

A diff of every surface against one file,
plus a PR for whatever drifted. If the
canonical-copy discipline from 1.2 held,
there is almost nothing to do.

## IMPACT

## 3

## / 5

## Notable

Real but bounded. A multiplier on the
rest of Module 5, not a standalone win.

## VISIBILITY

## Medium

meta tags, OG cards, and <title>
tweaks are visible in browser tabs and
link previews. Page bodies are
unchanged.

## REFERENCES

Open Graph protocol
MCP server initialization spec
Apps in ChatGPT submission packages for the GPT Store / Claude / Gemini
directories.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m5-3-forter-can-help CAN HELP

The metadata the orchestration suite publishes on your behalf - MCP tool descriptions, `aiplugin.json` , agent cards, registry entries - is enforced consistent against a single source of truth in
your customer console. Update the canonical name and description once; every Forter-published
surface re-renders in lockstep, and the next round of plugin-store / Custom GPT re-verifications (<u>5.1</u>)
ships the new copy without a separate submission queue.

---

# Pass end-to-end agent flows

This is the integration test for Modules 1 through 4. Discovery,
comprehension, trust, and action have to compose into a single
agent flow that completes a real user task without dropping out of
the conversation. If the first three modules pass in isolation but the
end-to-end flow dies at "I don't know what this costs" or "please
open this link in your browser", the site isn't agent-ready, regardless
of any individual checkmark.

Three concerns run in parallel: **multi-turn conversations** that don't
dead-end on missing pricing or comparison content; **autonomous**
**task completion** with no browser-only steps; and **continuous**
**simulation** against ChatGPT-User, ClaudeBot, and OpenClaw on
every release. The simulation harness side is dense enough that
most teams pair with Forter for the protocol-layer half.

**Make pricing and comparison content reachable from**
llms.txt**.** The machine-readable /pricing.md and the
/compare/{competitor} pages already exist (<u>2.4</u>); confirm
llms.txt links to them from its ## Pricing and
comparison sections, and that each is server-rendered text an
agent can actually read. Multi-turn flows die at this content
gap more often than at any protocol failure.

**2 Make the auth flow programmatic end-to-end.** Verify that an
agent can follow your /auth.md recipe (<u>3.3</u>) - resolve the
agent_auth hook, self-register, and complete OAuth +
dynamic client registration (<u>3.1</u>) - without a single manual step.
Any "open this URL in a browser to consent" step that isn't
itself an inline-UI MCP App is a dead end for autonomous
agents.

**3 Extend the auth-flow harness from** <u>3.3</u> **to drive end-to-end**
**tasks.**3.3 already stands up a CI harness against ChatGPT-
User, ClaudeBot, and OpenClaw for token issuance - extend
each scripted session through the full discover → authenticate
→ act cycle. Assert that the conversation completes in N turns
without falling back to a web fetch.

## 4 Cover the differences between agents. Claude's tool-selection heuristics and MCP handshake assumptions differ from

## EFFORT

## 4

## / 5

## Heavy

Standing up CI against three agent
runtimes is real engineering. Each one
has its own auth, rate limits, and
harness conventions.

## IMPACT

## 5

## / 5

## Critical

The only test that catches regressions
where Modules 1-4 silently disagree.

1 Make pricing and comparison content reachable from

## VISIBILITY

## None

the work is testing infrastructure; uservisible site doesn't change.

## REFERENCES

ChatGPT-User crawler documentation https://platform.openai.com/docs/bots?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
Anthropic crawlers documentation https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06
MCP testing guide https://modelcontextprotocol.io/docs/tools/inspector?utm_source=forter-agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06

<u>ChatGPT-User crawler documentation</u>
<u>Anthropic crawlers documentation</u>
<u>OpenClaw project</u>
<u>MCP testing guide</u>

---

OpenAI's; OpenClaw's autonomous-loop behavior surfaces
business-logic gaps (rate-limit handling, multi-step transaction
flows, error recovery) that single-turn harnesses miss.
Problems invisible to one are loud in another - that's why all
three matter. Update your pre-flight UA set and WAF advice for
Cloudflare's Jul 1 2025 category model: a site can pass every
UA probe today and still be blocked when Sep 15 defaults take
effect on new zones.

**5 Run agentic journeys on your live site.** journey.ora.ai is the
zero-setup version of the manual end-to-end test: pick an
agent and an intent (sign up, find pricing, get API access) and
watch it run on your live site. Use it for your top 3 intents
before investing in CI automation - it surfaces the same dead
ends your harness will catch, for free.

**6 Treat the suite as red/green CI.** Break the build on
regressions, the same way you would for unit tests. The failure
surface should shrink over time as the rest of Modules 1-4
settle.

## CAN HELP

https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=m5-4-forter-can-help CAN HELP

Continuous end-to-end simulations against ChatGPT, Claude, and OpenClaw run against the protocol
layer the orchestration suite operates on your behalf. The OAuth handshake, MCP tool surface, RFC
9421 signature verification, plugin manifest, and inline-UI components are all exercised in CI on every
Forter release. The same harness catches behavioral drift - when an agent runtime quietly changes its
tool-selection logic or token-handling behavior in production, you find out from a green/red signal
rather than a customer ticket.

---

**The 25 jobs at a glance**

| CATEGORY | GUIDELINE | EFFORT | IMPACT | VISUAL |
| --- | --- | --- | --- | --- |
| Discoverable | 1.1 Publish your discovery files |  |  |  |
| Discoverable | 1.2 Drop in well-known agent files |  |  |  |
| Discoverable | 1.3 Render content without JavaScript |  |  |  |
| Discoverable | 1.4 Build topical authority&amp;coding rules |  |  |  |
| Comprehensible | 2.1 Publish complete JSON-LD structure |  |  |  |
| Comprehensible | 2.2 Serve useful llms.txt |  |  |  |
| Comprehensible | 2.3 Document for agents |  |  |  |
| Comprehensible | 2.4 Position competitively |  |  |  |
| Trustworthy | 3.1 Implement OAuth |  |  |  |
| Trustworthy | 3.2 Verify bots cryptographically |  |  |  |
| Trustworthy | 3.3 Make credentials self-serve |  |  |  |
| Actionable | 4.1 Ship OpenAPI specification |  |  |  |
| Actionable | 4.2 Standardize rate limits&amp;errors |  |  |  |
| Actionable | 4.3 Stream long-running operations |  |  |  |
| Actionable | 4.4 Operate an MCP server |  |  |  |
| Actionable | 4.5 Expose tools with WebMCP |  |  |  |
| Actionable | 4.6 List in agent registries |  |  |  |
| Actionable | 4.7 Distribute SDKs&amp;CLI |  |  |  |
| Actionable | 4.8 Support agent payment protocols |  |  |  |
| Actionable | 4.9 Support agentic commerce protocols |  |  |  |
| Actionable | 4.10 Operate an NLWeb endpoint |  |  |  |
| Experiential | 5.1 Get verified on AI platforms |  |  |  |
| Experiential | 5.2 Render UI with MCP Apps |  |  |  |
| Experiential | 5.3 Stay consistent across surfaces |  |  |  |
| Experiential | 5.4 Pass end-to-end agent flows |  |  |  |

★ https://www.forter.com/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=checklist-can-help-legend CAN HELP

★  CAN HELP

---

# Your next move.

**The 25 jobs in this guide cover the full distance between**
**a site agents skip and one they transact on - none of it**
**research, all of it engineering.**

Most teams can close Modules 1 and 2 within a quarter and be
natively callable by every major AI platform inside a year. The
protocols are well-specified, the patterns are forgiving, and the
ecosystem is moving toward you, not away.

If you'd like a guided walkthrough of how your site is performing
today - and which of these jobs will move the needle fastest for your
business - our agentic commerce team is ready to talk it through
with you, along with anything else covered in this guide.

Talk to our agentic commerce team https://www.forter.com/agentic-orchestration-interest/?utm_source=agentic-readiness-guide&utm_medium=pdf&utm_campaign=2026-07-06&utm_content=closing-cta →

**Talk to our agentic commerce team** → v1.0 2025-06-10

Initial release — 25 guidelines across five modules (Discoverable, Comprehensible, Trustworthy, Actionable,
Experiential), with audit rubrics and the Forter practitioner's walkthrough.

v1.1 2025-07-06

Added ARD (Google Agentic Resource Discovery) and AFDocs (Agent-Friendly Documentation Spec); tightened
scoring rationale across all modules.
