{
 "id": "classify-ua",
 "endpoint": "https://www.pathwren.workers.dev/tools/classify-ua",
 "title": "What is this user-agent?",
 "what": "Identify the crawler behind a raw User-Agent header: operator, category, robots.txt token and stance, how it can be verified, and what blocking it costs. An unmatched string is reported as unmatched, with a labelled substring heuristic and never an identification.",
 "auth": "none — no account, no key, no handshake, no session",
 "method": "GET",
 "cors": "*",
 "cache_seconds": 3600,
 "parameters": [
  {
   "name": "ua",
   "aliases": [
    "user_agent"
   ],
   "required": true,
   "repeatable": false,
   "what": "The raw User-Agent header value, URL-encoded.",
   "becomes": "user_agent"
  }
 ],
 "example": {
  "url": "https://www.pathwren.workers.dev/tools/classify-ua?ua=Mozilla%2F5.0%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko%3B%20compatible%3B%20GPTBot%2F1.2%3B%20%2Bhttps%3A%2F%2Fopenai.com%2Fgptbot)&s=client-dossiers",
  "curl": "curl -s 'https://www.pathwren.workers.dev/tools/classify-ua?ua=Mozilla%2F5.0%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko%3B%20compatible%3B%20GPTBot%2F1.2%3B%20%2Bhttps%3A%2F%2Fopenai.com%2Fgptbot)&s=client-dossiers'",
  "what_it_answers": "GPTBot, OpenAI, ai-training, robots token GPTBot, verification by published ranges — and the caveat that a user-agent is a claim."
 },
 "same_answer_over_mcp": {
  "server": "ai-crawler-index",
  "endpoint": "https://www.pathwren.workers.dev/mcp",
  "method": "tools/call",
  "tool": "classify_user_agent",
  "note": "The GET endpoint calls this tool in-process through the MCP server's own JSON-RPC envelope. One implementation, two doors."
 },
 "caveats": [
  "A user-agent is a claim, not proof. Pair it with /tools/verify-crawler, which is the address half of the same question."
 ],
 "docs": "https://www.pathwren.workers.dev/tools/classify-ua.html?s=client-dossiers",
 "catalogue": "https://www.pathwren.workers.dev/tools/index.json?s=client-dossiers",
 "license": "CC0-1.0",
 "independent": true
}