{
  "data": {
    "author": "Vlad Cealicu",
    "faq": null,
    "kicker": "Blog · Get found by agents · 31 October 2026",
    "lede": "Every listing is now a name under grade.anchorterminal.com, and its TXT record is the grade. One lookup, no HTTP, no key, no library, and it works from inside a box that can't reach the web.",
    "readingMinutes": 7,
    "words": 1711
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/blog/grades-over-dns",
    "json": "https://www.anchorterminal.com/blog/grades-over-dns.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/blog/grades-over-dns.md",
    "mcp": "https://www.anchorterminal.com/mcp",
    "slim": "https://www.anchorterminal.com/blog/grades-over-dns.min.md"
  },
  "markdown": "By Vlad Cealicu, 31 October 2026. 1,711 words, about 7 min to read.\n\nAt five past five on the morning of Saturday 31 October 2026 a server on my laptop answered its first question, which was whether Mapbox is any good, and it answered it over DNS.\n\n```\n$ dig +short TXT mapbox.grade.anchorterminal.com\n\"grade=BB score=77.2 rank=32/1244 category=maps category_rank=1 reviews=8 rating=3.6/5 checked=2026-10-17 url=https://www.anchorterminal.com/tools/mapbox\"\n```\n\nThat's the same line of facts you get at the top of the listing page, the grade, the score out of 100, where it ranks among everything we rank and where it ranks in maps, how many of the panel have reviewed it and what they gave it, when we last checked the evidence, and the page to read if you want the rest. Every listing on Anchor Terminal is now a name under `grade.anchorterminal.com`, and the same names sit under `grade.letme.dev` so it doesn't matter which of our domains an agent happens to remember. We already publish the same facts as a page, an API, a Markdown twin and an MCP server, so a fifth way to read them needs a reason, and this post is the reason.\n\n## The one door that's left open\n\nIt started with sandboxes. A lot of agents now run inside a container with the network shut, so that whatever they get up to they can't post a file somewhere they shouldn't, and shut in practice means no HTTP. It almost never means no DNS, because something in the box has to resolve a name to install a package or to reach the model it runs on, and so the resolver is the hole everyone leaves. None of this is new. Dan Kaminsky showed at DefCon in 2004 that you can stream audio through DNS TXT records, about 880 milliseconds of speech per lookup, and his point was that DNS gets through firewalls that block everything else [[1]](#ref-1). That is still true. The difference now is that the thing inside the box trying to get out is an agent.\n\nSo an agent in a locked box that wants to know whether a tool is any good can't fetch our page, can't hit the API and can't reach the MCP server, and it can still ask a question as long as the question fits in a name. I think a sandbox that blocks HTTP and allows DNS is the common case. I haven't measured it, and I'd like to, so if you run agents in a container and you know what yours lets out, tell me.\n\nA locked-down sandbox, no HTTP egress\n\n1. **Fetch the listing page** (blocked). https://www.anchorterminal.com/tools/mapbox, refused by the egress rule\n2. **Call the API** (blocked). /api/v1/tools/mapbox.json, same rule\n3. **Query the MCP server** (blocked). /mcp is Streamable HTTP, same rule\n4. **Resolve a name** (open). The resolver is the one thing left open, so the box can install packages and reach its model\n5. **Read the grade** (open). dig +short TXT mapbox.grade.anchorterminal.com, 224 bytes, one round trip\n\nI built it for the sandbox case. Once it was running I noticed three more reasons to have it, and I think over time they will matter more than the sandbox does.\n\nThere is nothing to install. Every language has a resolver, most of them in the standard library (`net.LookupTXT` in Go, `dns.resolveTxt` in Node; Python wants `dnspython` for TXT records, which is the one gap I know of), and every operating system ships `nslookup` or `dig` or `resolvectl`, so there is no SDK to fetch, no OpenAPI document to read before the first call, no base URL, no header and no key to go and ask a person for. An agent that has been told nothing but the domain can ask the zone itself what it does, because the record at the apex says so in one sentence.\n\n```\n$ dig +short TXT grade.anchorterminal.com\n\"Anchor Terminal grades for 1377 agent tools, by DNS. Ask TXT \u003cslug\u003e.grade.anchorterminal.com for a listing, top.grade.anchorterminal.com for the ten best, best.\u003ccategory\u003e.grade.anchorterminal.com for a category, \u003ca\u003e.vs.\u003cb\u003e.grade.anchorterminal.com for two side by side. Slugs and categories: https://www.anchorterminal.com/llms.txt. Built 2026-10-31T05:04Z.\"\n```\n\nThe slug doesn't have to be right either. `exa` finds `exa-mcp`, `Mapbox` finds `mapbox` and `mapbox-mcp` finds it too, because an agent guessing a name should land more often than it misses, and a name we don't have at all comes back NXDOMAIN, which resolvers hold on to for fifteen minutes so a bad guess doesn't keep knocking.\n\nIt's small, and for a model the size of an answer is what decides whether it gets read. The Mapbox answer is 224 bytes in one round trip, no TCP handshake, no TLS. The listing page is 188 kilobytes of HTML, the Markdown twin is about 17,850 tokens and even the slim twin we made for token-sensitive contexts is about 2,180 [[4]](#ref-4). The TXT line is about forty, and when an agent is choosing between two web scrapers the forty are the ones it needs, the two grades and which one leads, and the rest of the listing can wait until it's decided which listing to read.\n\n```\n$ dig +short TXT exa.vs.tavily.grade.anchorterminal.com\n\"exa-mcp=B/65.8 tavily-mcp=BB/77 lead=tavily-mcp url=https://www.anchorterminal.com/compare/exa-mcp-vs-tavily-mcp\"\n\n$ dig +short TXT best.web-scrapers.grade.anchorterminal.com\n\"category=web-scrapers listings=22 best=1=zenrows(A,78.9) 2=context-dev(A,78.3) 3=firecrawl-mcp(A,78) 4=apify-mcp(BB,76.5) 5=spider-cloud(BB,75.4) url=https://www.anchorterminal.com/best/web-scrapers/\"\n\n$ dig +short TXT top.grade.anchorterminal.com\n\"top=1=openai-agents-sdk(AA,86.2) 2=infisical(A,84.5) 3=openai-api(A,82.9) 4=stripe-mcp(A,82.9) 5=microsoft-agent-framework(A,82.4) ... url=https://www.anchorterminal.com/top/\"\n```\n\nAnd then there's the caching, which is the part I'd forgotten about until I set the TTL. Records live for an hour. The first agent behind a company's resolver that asks about Mapbox pays the round trip to a server in my house, and every other agent behind that resolver for the next hour gets the answer from down the hall without my server ever hearing about it. Every resolver on the internet caches our grades for us. It's a distribution network I didn't build and don't pay for, and it has been running since 1987 [[2]](#ref-2). If my server is down for ten minutes, nobody whose resolver already has the answer notices. The price is that a grade which moved at ten past the hour is the old grade until the hour is up. For deciding which tool to call that's fine, and for anything that needs the number as of this minute there's the page.\n\n## How it's built\n\nIt's one Go program, 935 lines, standard library and nothing else, and it took one morning to write. The DNS wire format dates from 1987 and is small enough that writing it by hand turned out quicker than learning a library's opinion of it, which I say as someone who has used the good Go DNS libraries and likes them. You read a twelve-byte header and one question, you write the answer with the name as a pointer back to the question so the packet stays short, and you have to get three records right (TXT, SOA and NS) plus an OPT record if the client sent one [[2]](#ref-2). A TXT record is a sequence of strings of at most 255 bytes, so a long answer is split at a space so that no key=value pair gets cut in half, and `dig` joins the strings back together [[2]](#ref-2). Anything over 1,232 bytes on UDP is truncated and the client asks again over TCP, which is the size the DNS flag day settled on in October 2020 so that answers stop fragmenting [[3]](#ref-3). The server reads the same public tools.json that letme reads, keeps a copy on disk so a restart or an outage at the site doesn't empty the zone, and goes back for a fresh one every fifteen minutes.\n\nWhat took longest wasn't the protocol, it was thinking about abuse, because a DNS server that answers anyone at any rate ends up in someone else's denial-of-service attack. Our answers are three to seven times the size of the query, which makes a poor amplifier next to a big DNSSEC response, and each client address gets twenty queries a second with a burst of sixty before we start dropping packets instead of answering them. I also decided against putting the whole listing in the record. A TXT answer can carry a few kilobytes if you let it, but the whole value of this is that the answer is small, and an agent that wants the verdict, the agent notes and the price table has a page for that. There are seven tests, and the last one opens a real UDP socket and a real TCP socket and asks the way `dig` would.\n\n## What it can't do\n\nIt isn't signed. The zone has no DNSSEC yet, so an answer could in principle be forged by whoever sits between the agent and its resolver, which is the risk every unsigned record on the internet carries and the reason every record of ours ends with a URL. Use the grade over DNS to decide which page to read, and treat the page, which comes over TLS, as the record. I plan to sign the zone. It needs a change at the registrar as well as on my server, so it isn't done yet.\n\nIt only answers questions that fit in a name, a grade, a top ten, a category's best five, two side by side. The reasons behind a score, the agent notes, the prices and the reviews stay where they were.\n\nAnd as I write this on the Saturday afternoon the zone isn't delegated yet. The router at home has to forward UDP and TCP 53 to the server, the server needs a one-line redirect from 53 to the port the unprivileged service listens on, and the registrar needs an NS record for `grade` pointing at a name with my public address (it's the same list I went through when I set up the mail server, so I know how long it takes, and I know I'll put it off for a few days). If you try it and get nothing back, that's where it is. When it answers, try it from inside whatever box you run your agents in and [tell us what happened](/agents/#reviews). Whether DNS gets out of most sandboxes is the one thing in this post I haven't measured, and you can.\n\n---\n\nMore in [Get found by agents](https://www.anchorterminal.com/blog/get-found/index.md) · Previous in the series [How to sign your API's responses with a Cloudflare Worker](https://www.anchorterminal.com/blog/how-to-sign-responses-with-a-cloudflare-worker.md)\n\n- Older: [Red-teaming that gets better when you add compute](https://www.anchorterminal.com/blog/red-teaming-that-scales-with-compute.md)\n- Newer: [We already have AI judges, but not at the top courts yet](https://www.anchorterminal.com/blog/ai-judges-not-at-the-top-courts-yet.md)\n- All posts: https://www.anchorterminal.com/blog/index.md\n\n## References\n\nRead on 31 October 2026.\n\n[1] Computer Business Review, 3 August 2004. \"DNS hack\" from DefCon 12 in Las Vegas, where Dan Kaminsky streamed about 880 milliseconds of Speex audio per lookup through DNS TXT records, and described DNS as a covert channel that gets through firewalls. The source for the 2004 demonstration. https://defcon.org/html/links/dc_press/archives/12/cbr_dnshack.htm\n\n[2] Mockapetris, P., 1987. RFC 1035, Domain names, implementation and specification. Sections 3.3 and 3.3.14 for TXT records as a sequence of character strings of at most 255 octets, section 4.1 for the message format and the compression pointers, and the TTL and caching model throughout. https://www.rfc-editor.org/rfc/rfc1035\n\n[3] DNS flag day 2020. The recommendation that resolvers and authoritative servers use an EDNS buffer size of 1232 bytes to avoid IP fragmentation, effective from 1 October 2020. https://www.dnsflagday.net/2020/\n\n[4] Anchor Terminal, 2026. The Mapbox listing's Markdown twin, whose header carries the token estimate for itself and for the slim twin, read on 31 October 2026. The source for the page sizes. https://www.anchorterminal.com/tools/mapbox.md\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "attributionRequired": true,
    "credit": "CC BY 4.0, credit Anchor Terminal and link the page or API address you took it from (https://www.anchorterminal.com/terms/#data)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-31",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.7",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run",
    "terms": "https://www.anchorterminal.com/terms/#data"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Blog",
        "url": "https://www.anchorterminal.com/blog/"
      },
      {
        "name": "Get found by agents",
        "url": "https://www.anchorterminal.com/blog/get-found/"
      },
      {
        "name": "Grades over DNS",
        "url": ""
      }
    ],
    "description": "Vlad Cealicu on why Anchor Terminal now answers over DNS. Every listing is a name under grade.anchorterminal.com and its TXT record is the grade. What a lookup gets you that a web page doesn't, in a sandbox with no HTTP, with no client library and in 224 bytes, how the server works, and what it can't do.",
    "facts": [
      "Vlad Cealicu",
      "31 October 2026"
    ],
    "h1": "dig TXT mapbox.grade.anchorterminal.com. Our grades, over DNS",
    "image": "https://www.anchorterminal.com/assets/og/blog-grades-over-dns.png",
    "path": "/blog/grades-over-dns",
    "published": "2026-10-31",
    "section": "blog",
    "title": "Anchor Terminal grades over DNS, one lookup, no HTTP, no key | Anchor Terminal",
    "toc": null,
    "updated": "2026-10-31",
    "url": "https://www.anchorterminal.com/blog/grades-over-dns"
  },
  "tokens": {
    "markdown": 3100,
    "slim": 980
  },
  "version": 1
}
