Replay real AI-agent requests against any URL. See what Claude Code, Cursor, and Codex actually get back, with pass/fail lights for Vary, 406, and q-values.
Pick an agent and enter a URL to test.
text/markdown or text/plain. Vary: Accept, so caches won't mix HTML and markdown responses. | Agent | Accept | User-Agent | MD |
|---|---|---|---|
| Claude Code | text/markdown, text/html, */* | Claude-User/1.0 | |
| Cursor | text/markdown, text/plain;q=0.9, */*;q=0.8 | Cursor/1.0 | |
| Codex CLI | text/html, */* | codex/1.0 | |
| ChatGPT | */* | ChatGPT-User/1.0 | |
| Perplexity | */* | PerplexityBot/1.0 | |
| Gemini | */* | Google-Extended |
Content negotiation is an HTTP mechanism where the client (browser, AI agent) advertises which response formats it understands via the Accept header. The server picks the best match and serves it with a matching Content-Type. For AI agents, Accept: text/markdown signals that the client prefers clean markdown over rendered HTML.
Markdown is 40–80% smaller than the equivalent HTML, strips noise (nav, scripts, styles), and maps directly to the token-efficient format LLMs internally convert to anyway. Serving markdown on Accept negotiation is faster, cheaper, and gives agents better answers.
As of 2026, only Claude Code and Cursor advertise text/markdown in their Accept header. OpenAI Codex CLI follows <link rel="alternate" type="text/markdown"> hints in HTML instead. ChatGPT, Perplexity, and Gemini fetchers still send */* and parse whatever comes back.
406 Not Acceptable is the spec-compliant response when the client explicitly only wants a format the server cannot produce. Correctly returning 406 for Accept: application/vnd.pandoc is a sign of a well-implemented content negotiation layer.