Connect an AI assistant

This library is available as an MCP server. MCP (Model Context Protocol) is the standard way AI assistants such as Claude, ChatGPT, Cursor and others look things up in outside sources. Add the address below to your assistant and it can search the original papers and websites behind every benchmark. There is nothing to install, no account and no key.

The address

https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/mcp

Add it to your assistant

  1. Open your assistant's settings and look for Connectors, Integrations or MCP servers.
  2. Choose the option to add a custom connector or remote server.
  3. Paste the address above. If it asks for a name, use AI Benchmark Sources. Leave any login or key fields empty.
  4. Start a new conversation and ask about a benchmark by name, for example “Using the benchmark sources, what does HellaSwag measure?”

Asking good questions

For developers

Three public endpoints are served by Cloudflare AI Search from the benchrisk namespace (instance benchmarks). They need no authentication and are rate limited to 1000 requests per 5 minutes.

Endpoints
EndpointAddress
MCP (Streamable HTTP, JSON-RPC 2.0)https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/mcp
Search (ranked chunks with metadata)https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/search
Chat completions (OpenAI-compatible, grounded in the index)https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/chat/completions

The search tool and metadata filters

The MCP server exposes one tool, search, with a free-text query. Every indexed chunk carries these metadata fields, all usable in ai_search_options.retrieval.filters, plus the built-in folder (always <tag>/), filename and timestamp. Operators: $eq (the default for a bare value), $ne, $in, $nin, $lt, $lte, $gt, $gte; several keys are combined with AND.

Metadata fields
FieldMeaning
benchmarkUnique tag for the benchmark, e.g. mmlu or ailuminate-1.0 (listed on the Benchmarks page)
benchmark_nameThe benchmark's name in BenchRisk, e.g. MMLU or AILuminate10
doc_typepaper, website or repository
source_urlWhere the document was downloaded from
benchrisk_urlThe BenchRisk entry the document was chosen from

MCP over HTTP

curl -s https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search",
    "arguments": {
      "query": "How is the benchmark scored?",
      "ai_search_options": {
        "retrieval": {
          "filters": {
            "benchmark": "mmlu"
          },
          "max_num_results": 5
        }
      }
    }
  }
}'

Claude API (Python SDK, MCP connector)

import anthropic

client = anthropic.Anthropic()
response = client.beta.messages.create(
    model="claude-opus-5-5",
    max_tokens=16000,
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[{"type": "url", "url": "https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/mcp", "name": "benchrisk-evals"}],
    tools=[{"type": "mcp_toolset", "mcp_server_name": "benchrisk-evals"}],
    messages=[{"role": "user", "content": "Using the benchrisk-evals search tool with the filter benchmark=truthfulqa, how are TruthfulQA questions constructed?"}],
)
for block in response.content:
    if block.type == "text":
        print(block.text)

REST

/search filtered to one benchmark and one document type:

curl -s https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/search \
  -H "Content-Type: application/json" \
  -d '{
  "messages": [
    {
      "role": "user",
      "content": "Which hazard categories does the benchmark cover?"
    }
  ],
  "ai_search_options": {
    "retrieval": {
      "filters": {
        "benchmark": "ailuminate-1.0",
        "doc_type": "paper"
      },
      "max_num_results": 5
    }
  }
}'

/chat/completions (add "stream": true for server-sent events):

curl -s https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
  "messages": [
    {
      "role": "user",
      "content": "What does GSM8K test and how were the problems written?"
    }
  ],
  "ai_search_options": {
    "retrieval": {
      "filters": {
        "benchmark": "gsm8k"
      }
    }
  }
}'

Python without an SDK:

import requests

r = requests.post("https://ns-f1fc49e3-9bca-4aa2-b5a1-ef5dbc18588f.search.ai.cloudflare.com/search", json={
    "messages": [{"role": "user", "content": "What is the pass@k metric?"}],
    "ai_search_options": {"retrieval": {"filters": {"benchmark": "humaneval"}, "max_num_results": 5}},
}, timeout=60)
for chunk in r.json()["result"]["chunks"]:
    print(chunk["score"], chunk["item"]["key"], chunk["text"][:120])

Machine-readable listing

benchmarks.json is the manifest this site is built from: every benchmark with its tag, description, reference, BenchRisk entry and the exact item keys indexed in Cloudflare. llms.txt is the same in plain text.