HELGE SVERREAll-stack Developer
Bergen, Norwayv13.0
est. 2012  |  197 repos  |  12.8k+ contributions
Tools  |   Theme:
Introducing ardvark: A Crawler for ARD Catalogs
July 15, 2026

ardvark, eater of ARD catalogs

I built ardvark, a crawler that finds ARD catalogs on the web.

ARD (Agentic Resource Discovery) is a new spec that lets a website say what AI agents, MCP servers, and skills it offers, in an ai-catalog.json file at /.well-known/. Think robots.txt or sitemap.xml, but for agents. The spec is new and there's no index of who publishes these files, so I wrote a crawler that goes and checks.

Finding Catalogs

The spec defines three ways to publish a catalog: the /.well-known/ai-catalog.json file itself, an Agentmap: directive in robots.txt, or a <link rel="ai-catalog"> tag in the HTML. ardvark checks all three on every host. When it finds a catalog it keeps going: into nested catalogs, into the agent cards and MCP server cards that entries point to, and into registries, which it queries through their search API. Because nobody links to .well-known files, you can't find them by following links. Instead, ardvark fills its queue from Certificate Transparency logs (a public feed of freshly-certified domains), from crt.sh, or from the Tranco top list.

Verifying the Catalogs

Each catalog is validated against the official JSON Schema, plus seven extra checks the schema can't cover: URN grammar, unique identifiers, whether the publisher in the URN matches the domain serving the file, and so on. Every check is recorded as pass or fail, and the catalog gets an overall verdict of valid, valid_with_warnings, or invalid. Broken catalogs are kept in the database and flagged, not thrown away. You can also run the verifier by itself against your own catalog before you publish it; it exits 1 if something is wrong, so it works in CI too.

Everything is stored in SQLite (or MySQL/Postgres if you change one config key), along with a JSONL event log. Raw documents are saved as-is, so you can re-process the data later without crawling again. The queue also lives in the database, so you can stop a crawl and pick it up later.

# Homebrew
brew install helgesverre/tap/ardvark

# or Go
go install github.com/helgesverre/ardvark/cmd/ardvark@latest

Then seed it with some domains and start crawling:

ardvark seed ct --count 1000
ardvark crawl
ardvark stats
ardvark verify https://example.com/.well-known/ai-catalog.json

It's written in Go, MIT licensed, rate-limits itself, and respects robots.txt. The code is at github.com/HelgeSverre/ardvark.




<!-- generated with nested tables and zero regrets -->