What AI-Readiness Means
What signals show a company is serious about AI?
A company is serious about AI when it ships backend infrastructure you can fingerprint from outside: a model provider (Anthropic, OpenAI), a vector store, an orchestration framework, LLM observability, and machine-facing endpoints like MCP or a technical llms.txt. Marketing copy is not a signal; loaded client code and named API calls are. Bassethound rolls those into an ai_readiness score and a shipping/experimenting/none verdict in one keyless call.
Best move: measure what a company’s stack loads and exposes to machines, not what its homepage claims.
Why it works: serious AI is backend infrastructure. To run it, an application loads named clients, calls named APIs, and sometimes publishes an endpoint for agents. Those signatures survive minification.
Key takeaways
- Serious AI is backend infrastructure you can fingerprint from outside; slogans on the homepage do not count as a signal.
- Bassethound counts the distinct signal groups that fire: model providers, AI SDKs, orchestration frameworks, vector stores, LLM observability, MCP endpoints, .well-known AI files, and llms.txt.
- The ai_readiness score divides the count of firing signal groups by six and caps at 1.0, so three groups read 0.5 and six or more read 1.0.
- The shipping verdict fires when a machine-facing endpoint (an MCP endpoint, a .well-known AI file, or a technical llms.txt) is present, or when three or more signal groups fire.
- A static crawl plus optional JavaScript rendering means server-side or proxied components can stay invisible, and Bassethound reports those gaps rather than guessing.
Which signals count, and which are noise?
Several signal groups carry weight, because each one costs engineering effort to stand up. Model providers (Anthropic, OpenAI, Gemini, Cohere, Mistral) show a company calls a real LLM. AI SDKs (the Anthropic SDK, the OpenAI SDK, the Vercel AI SDK) show it wrote code against one. Orchestration frameworks (LangChain, LlamaIndex, Haystack, CrewAI) show multi-step reasoning, not a single prompt. Vector stores (Pinecone, Weaviate, Qdrant, Chroma, Milvus) show retrieval and memory. LLM observability (Helicone, LangSmith, Langfuse) shows the team runs the system in production and watches it. Machine-facing endpoints (an MCP endpoint, a .well-known AI file, an llms.txt) show a company built for agents to read the site directly. Bassethound also fingerprints AI support widgets (Intercom Fin, Sierra) as a customer-facing tell.
Noise looks different. A press release, a careers page hiring “AI engineers,” an “AI-powered” badge, and a scripted chatbot that never touches a model all read as intent, not infrastructure. Bassethound ignores them. It counts the signal groups that fire from loaded client code, package names, and named API hostnames. One group is a lead. Three is a pattern you can trust. The homepage narrative never enters the score.
What separates shipping from experimenting?
The verdict rests on two thresholds. Shipping fires when a machine-facing endpoint is present (an MCP endpoint, a .well-known AI file, or a technical llms.txt), or when three or more signal groups fire. Experimenting fires when at least one group fires but the shipping bar is not met. None means nothing detectable surfaced.
The logic is deliberate. A company running a vector store, an orchestration framework, and an observability tool has moved past the demo stage; the three together imply retrieval, reasoning, and production monitoring. So does a single machine-facing endpoint, because you do not publish one by accident. One model-provider call on its own is a lab, not a product, so it lands in experimenting.
Alongside the verdict, Bassethound computes an ai_readiness score: the count of firing signal groups divided by six, capped at 1.0. Three groups gives 0.5. The score is a gradient; the verdict is a decision. Read them together. A domain that fires an MCP endpoint plus one other signal scores 0.33 and still reads shipping, because a machine-facing endpoint clears the bar on its own.
Why is a machine-facing endpoint the strongest single tell?
Because a company only builds one on purpose. An MCP endpoint, a .well-known AI file, or a technical llms.txt exists so agents and models can consume the site directly. Nobody ships that to look good in a pitch deck. It is a bet that machine traffic matters, and it takes real work to stand up.
Bassethound classifies llms.txt into two kinds. A standard llms.txt is a curated index for human-guided reading. A technical llms.txt exposes structured, agent-facing detail, and that variant counts toward shipping. The distinction matters: a basic index is a low-cost gesture, while a technical file signals the team designed for programmatic consumers.
This is why a single machine-facing endpoint is enough on its own. A homepage can load a model SDK and still be a prototype. A company that stood up an MCP server has decided agents are a channel, and it built for that. Absent an endpoint, a domain needs three signal groups to reach shipping. When you separate the serious from the aspirational, the endpoint is the cleanest line. See modelcontextprotocol.io and llmstxt.org for the specs behind these files.
How does readiness become an ICP signal?
Bassethound emits an icp_signal of hot, warm, or cold on top of the score and verdict. It exists for one job: telling a seller whether a domain fits an AI-forward ideal customer profile before anyone spends a call on it.
Hot means the stack is live and dense: a shipping verdict, often with a vector store or a machine-facing endpoint in the mix. These teams already build with AI, so a pitch that assumes fluency lands. Warm means experimentation is underway; one or two groups fired, and the buyer is early but real. Cold means nothing surfaced, and the account either runs everything server-side or has not started.
Use it to route, not to disqualify. A cold reading is a detection outcome, not a verdict on the company. Pair it with the layer detail so you know why it is cold: no signals at all reads differently from a fully proxied backend. The icp_signal compresses the dossier into a triage decision you can sort a list by.
What does outside-in detection miss?
Plenty, and pretending otherwise would make the score worthless. Bassethound runs a static crawl plus optional JavaScript rendering. It reads what the front end loads and calls. Anything that never reaches the browser stays dark.
A company can route every model call through its own backend, terminate the AI stack behind an API gateway, and proxy provider traffic under its own hostname. In that setup, a real, heavy AI investment shows zero signals. A none verdict means “not detectable from outside,” not “no AI here.” Those are different claims, and Bassethound never conflates them.
This is why the dossier reports gaps as first-class output. When rendering could not reach a component, or when a layer returned nothing, you see that stated plainly rather than dressed up as a confident negative. The honest read beats the inflated one: a seller who knows a cold account might be fully proxied will verify before writing it off. Detection tells you what a site exposes. It does not tell you what a team hides, and it says so.
Bassethound perspective
Most AI-readiness tools score the homepage. They count how many times a site says “AI,” scrape job listings, or check for a chatbot bubble. That rewards marketing budgets and punishes quiet engineering teams. We think it is backwards.
Our conviction: a domain with no AI copy and a live MCP endpoint is more serious about AI than a domain with a glossy “AI-powered platform” page and zero detectable infrastructure. The endpoint is a decision. The copy is a hope. A competitor who sells readiness scores off keyword density will dispute this, because their product depends on the homepage being the signal. It is not.
Infrastructure is expensive to stand up and pointless to fake. A vector store, an orchestration framework, an observability tool, a technical llms.txt: each one costs a team something, so each one means something. We read those, and we weight the machine-facing endpoint highest, because a company builds it so agents can consume the site. Follow the stack, not the story. When the stack is invisible to us, we say so instead of guessing.
Sources
- Model Context Protocol specification: https://modelcontextprotocol.io
- llms.txt proposal: https://llmstxt.org
- Anthropic documentation: https://docs.anthropic.com
- Pinecone documentation: https://docs.pinecone.io
- LangSmith documentation: https://docs.smith.langchain.com
Frequently asked questions
Is an 'AI-powered' badge on the homepage a real signal?
No. A badge, a press release, or a careers page hiring 'AI engineers' reads as intent, not infrastructure. Bassethound scores loaded client code, package names, and named API hostnames, and ignores the copy.
Can a company score 'shipping' with just one signal?
Yes, if that signal is a machine-facing endpoint (an MCP endpoint, a .well-known AI file, or a technical llms.txt). Without one, it needs three or more signal groups to clear the shipping bar.
What is the ai_readiness score out of?
It is the count of distinct signal groups hit, divided by six and capped at 1.0. Three groups firing gives 0.5; six or more caps at 1.0.
Does a 'none' verdict mean the company uses no AI?
No. It means nothing surfaced from outside. A fully server-side or proxied AI stack stays invisible to a crawler, and Bassethound flags that gap instead of calling it a confident negative.
What is the icp_signal for?
It compresses the dossier into a triage decision for sellers: hot, warm, or cold, telling you whether a domain fits an AI-forward ideal customer profile before you spend a call on it.