A practical guide to the 7 signals AI agents use to discover, understand, and call your site — with copy-paste examples you can ship today. Score yourself anytime at /score.
The web was designed for humans pointing browsers at HTML. AI agents — coding copilots, research assistants, autonomous shoppers — need a different surface: machine-readable manifests, typed API contracts, and live tool endpoints they can call without a DOM.
An agent-ready site shows up when an agent searches for its category. A site without these signals is invisible to the fastest-growing slice of inbound traffic on the web. The 7 signals below are what NHS scores against, and they map 1:1 to what every major agent runtime (Claude, ChatGPT, Cursor, etc.) actually looks for.
The single highest-value signal. llms.txt is a markdown file at the root of your site that tells AI agents what your service does, where the docs are, and which URLs matter most. Think of it as robots.txt, but written for understanding instead of crawling permission.
# Acme Payments
> Stripe-compatible payment API. Charge cards, issue refunds, manage subscriptions.
## Docs
- [API reference](https://acme.com/docs/api): all endpoints with parameters
- [Webhooks guide](https://acme.com/docs/webhooks): event payloads
- [SDKs](https://acme.com/sdks): official Node, Python, Go libraries
## Endpoints
- [OpenAPI spec](https://acme.com/openapi.yaml)
- [MCP server](https://acme.com/mcp)
## Optional
- [Pricing](https://acme.com/pricing)
- [Status page](https://status.acme.com)
https://yoursite.com/llms.txt and serve it as text/plain. That’s the entire spec. The well-known/ path also works as a fallback.The original ChatGPT-plugin manifest. Even though plugins were sunset in their original form, the manifest is now broadly recognized by agent runtimes as a canonical “here’s how to call me” document. It’s a small JSON file that points at your OpenAPI spec and gives agents a description, contact info, and auth model.
{
"schema_version": "v1",
"name_for_human": "Acme Payments",
"name_for_model": "acme_payments",
"description_for_human": "Charge cards and manage subscriptions.",
"description_for_model": "Use this to charge cards, refund payments, and manage subscriptions via the Acme API.",
"auth": { "type": "user_http", "authorization_type": "bearer" },
"api": {
"type": "openapi",
"url": "https://acme.com/openapi.yaml"
},
"logo_url": "https://acme.com/static/logo.png",
"contact_email": "support@acme.com",
"legal_info_url": "https://acme.com/legal"
}
The machine-readable contract for your API. Agents use OpenAPI to know which endpoints exist, what parameters they take, and what they return — without scraping HTML docs or guessing.
If your API is built with FastAPI, NestJS, Hono, ASP.NET, or anything modern, you almost certainly already have an OpenAPI document being generated — you just need to publish it at a stable URL. For hand-written APIs, generate one with swagger-codegen or write it directly.
openapi: 3.0.3
info:
title: Acme Payments API
version: "1.0"
servers:
- url: https://api.acme.com/v1
paths:
/charges:
post:
summary: Create a charge
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
amount: { type: integer, description: "Amount in cents" }
currency: { type: string, example: "usd" }
source: { type: string, description: "Card token" }
responses:
"200":
description: Charge succeeded
NHS gives 15 points just for having a discoverable, browseable API surface — even without OpenAPI. The crawler verifies content (3+ structural indicators like JSON responses, route docs, version paths) before crediting this signal. A docs page with embedded code examples qualifies; a marketing page that just mentions “we have an API” does not.
If you have an OpenAPI spec, you almost always pick up this signal automatically. If not: stand up a /api/v1/ route that returns a JSON index of available endpoints.
The Model Context Protocol is the open standard agent runtimes use to invoke remote tools at runtime. Where OpenAPI describes your API at build time, MCP is the live socket agents call when they need to do something. Shipping an MCP server is the difference between “agents can read about your API” and “agents can use your API right now.”
NHS itself runs an MCP server at /mcp. Wire it up in Claude Code with:
claude mcp add --transport http nothumansearch https://nothumansearch.ai/mcp
Use the official SDK in your stack (TypeScript, Python, Go, etc.). At minimum you expose tools/list and tools/call over JSON-RPC 2.0. Once live, register at the official MCP registry for cross-runtime discovery.
You probably already have a robots.txt. NHS gives 5 points if it explicitly addresses the major AI crawler user-agents — even just to allow them. The signal is “this site has thought about AI traffic,” whether you opt in or out.
User-agent: GPTBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: anthropic-ai
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: CCBot
Allow: /
JSON-LD blocks on your homepage that describe your organization, product, or service in a typed vocabulary. Schema.org markup is the oldest agent-ready signal — search engines have used it for over a decade — and modern agents still parse it for entity disambiguation.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme Payments",
"url": "https://acme.com",
"logo": "https://acme.com/static/logo.png",
"sameAs": [
"https://github.com/acme",
"https://twitter.com/acme"
]
}
</script>
Once you’ve shipped at least one hard signal (OpenAPI, MCP, ai-plugin, or a structured API), submit your site to NHS:
curl -X POST https://nothumansearch.ai/api/v1/submit \
-H "Content-Type: application/json" \
-d '{"url":"https://yoursite.com"}'
Or paste your URL on the homepage. The crawler runs immediately, scores all 7 signals, and your site appears in the index within seconds. Re-submitting after fixing signals re-scores in place.
You can also embed your live score badge anywhere with <img src="https://nothumansearch.ai/badge/yoursite.com.svg">.
The /score tool runs the full 7-signal check live — no submission required.
Run a free check →