{
  "slug": "exa",
  "name": "Exa",
  "author": "exa.ai",
  "category": "Search and web",
  "tier": "checkable",
  "kind": "remote",
  "endpointUrl": "https://mcp.exa.ai/mcp",
  "sourceUrl": "https://registry.modelcontextprotocol.io/v0/servers/ai.exa%2Fexa/versions/latest",
  "repoUrl": "https://github.com/exa-labs/exa-mcp-server",
  "enrichment": {},
  "current": {
    "verdict": "alive",
    "reason": "all_passed",
    "failedChecks": [],
    "untestedTools": 0,
    "checkedAt": "2026-10-29T06:52:56.869Z",
    "methodologyVersion": "1.0.0",
    "serverVersion": "3.5.0",
    "checks": [
      {
        "id": "L0.reachable",
        "detail": "http 200",
        "status": "pass",
        "durationMs": 113
      },
      {
        "id": "L0.tls",
        "status": "pass"
      },
      {
        "id": "L0.initialize",
        "status": "pass",
        "evidence": {
          "raw": "event: message\ndata: {\"result\":{\"protocolVersion\":\"2025-11-25\",\"capabilities\":{\"tools\":{\"listChanged\":true},\"prompts\":{\"listChanged\":true},\"resources\":{\"listChanged\":true}},\"serverInfo\":{\"name\":\"exa-search-server\",\"title\":\"Exa\",\"version\":\"3.5.0\",\"description\":\"Exa web search, page fetching and research-agent tools for AI agents over MCP.\",\"websiteUrl\":\"https://exa.ai\",\"icons\":[{\"src\":\"https://exa.ai/images/logo/exa-logomark-blue.svg\",\"mimeType\":\"image/svg+xml\",\"sizes\":[\"any\"]},{\"src\":\"https://exa.ai/images/favicon-32x32.png\",\"mimeType\":\"image/png\",\"sizes\":[\"32x32\"]}]},\"instructions\":\"Only use tools returned by tools/list. If web_search_exa is listed, use it to find relevant pages and current information by describing the page you want to find. If web_fetch_exa is listed, use it to read known URLs when search highlights are insufficient or you already have a URL. If agent_run is listed, use it for multi-step research, list-building, or enrichment. If a run is still running, continue with its runId rather than starting a duplicate run.\"},\"jsonrpc\":\"2.0\",\"id\":1}\n\n",
          "httpStatus": 200,
          "contentType": "text/event-stream"
        },
        "durationMs": 113
      },
      {
        "id": "L0.protocol_version",
        "detail": "server reported \"2025-11-25\"; published versions: 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25",
        "status": "pass"
      },
      {
        "id": "L0.capabilities",
        "detail": "tools, prompts, resources",
        "status": "pass"
      },
      {
        "id": "L1.server_info",
        "detail": "exa-search-server 3.5.0",
        "status": "pass"
      },
      {
        "id": "L1.tools_list",
        "detail": "2 tools",
        "status": "pass"
      },
      {
        "id": "L1.tool_schemas",
        "detail": "2 schemas valid",
        "status": "pass"
      },
      {
        "id": "L1.resources_list",
        "detail": "1 entries",
        "status": "pass"
      },
      {
        "id": "L1.prompts_list",
        "detail": "1 entries",
        "status": "pass"
      },
      {
        "id": "L1.unknown_method",
        "status": "pass",
        "evidence": {
          "raw": "event: message\ndata: {\"jsonrpc\":\"2.0\",\"id\":5,\"error\":{\"code\":-32601,\"message\":\"Method not found\"}}\n\n",
          "httpStatus": 200
        },
        "durationMs": 95
      },
      {
        "id": "L1.envelope",
        "detail": "5 replies valid",
        "status": "pass"
      },
      {
        "id": "L2.call_ok",
        "tool": "web_fetch_exa",
        "status": "pass",
        "evidence": {
          "raw": "event: message\ndata: {\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"web_fetch_exa error (400): Invalid request body | Validation error: Too small: expected array to have >=1 items at \\\"urls\\\"\\nTimestamp: 2026-10-29T06:52:55.433Z\"}],\"isError\":true},\"jsonrpc\":\"2.0\",\"id\":6}\n\n",
          "arguments": {
            "urls": []
          },
          "httpStatus": 200
        },
        "durationMs": 123
      },
      {
        "id": "L2.bad_input",
        "tool": "web_fetch_exa",
        "status": "pass",
        "evidence": {
          "raw": "event: message\ndata: {\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"MCP error -32602: Input validation error: Invalid arguments for tool web_fetch_exa: Required at urls\"}],\"isError\":true},\"jsonrpc\":\"2.0\",\"id\":7}\n\n",
          "arguments": {}
        },
        "durationMs": 111
      },
      {
        "id": "L2.call_ok",
        "tool": "web_search_exa",
        "status": "pass",
        "evidence": {
          "raw": "event: message\ndata: {\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Title: ZKNOT™ Verify — Public Attestation Lookup\\nURL: https://verifyknot.io/\\nPublished: N/A\\nAuthor: N/A\\nHighlights:\\nZKNOT™ Verify — Public Attestation Lookup\\n\\n# Verify an attestation record\\n\\nEnter a short code or artifact ID to retrieve the full chain entry. No account. No login. No trust required.\\n\\nverifyknot.io\\n\\n… CHECKING IN YOUR BROWSER… #00000000\\n\\n📄\\n\\n—\\n\\n✓ VERIFIED\\n\\nSHA-256 — Stamped — Chain — Signature — Signer — Time basis — Time anchor —\\n\\n—\\n\\n⬢\\n\\nAttested build-in-public post\\n\\nVALID\\n\\nPublishing witness — Signed (UTC) — Content SHA-256 — Version — Post —\\n\\n—\\n\\nShort Code —\\n\\nArtifact Type —\\n\\nDevice ID —\\n\\nSession ID —\\n\\nSigned At —\\n\\nChain Position —\\n\\nPrev Hash —\\n\\nArtifact Hash —\\n\\nIdentity —\\n\\nSigner —\\n\\nProves —\\n\\nDoes not prove —\\n\\nAnchor —\\n\\nPresence binding —\\n\\nContent binding —\\n\\nWhat was checked (each line ran on your machine)\\n\\nNo account required\\n\\nChain integrity verified\\n\\nIndependent of ZKNOT™\\n\\nMath is the testimony\\n\\n---\\n\\nTitle: N/A\\nURL: https://qodex.ai/docs/pr-review-verification-probes\\nPublished: N/A\\nAuthor: N/A\\nHighlights:\\n# Verification probes\\n\\nHow Qodex safely checks whether a PR finding is reproducible on a preview deployment. Learn what runs, what is safe, and what can fail.\\n\\nVerification probes\\n\\nVerification probes are safe requests Qodex runs against a PR preview deployment to check whether a finding is reproducible. They help Qodex move beyond static diff review. If a preview URL exists and the issue can be checked safely, Qodex can run the code and attach request and response evidence.\\n\\nHow probes work\\n\\nThe agent adds a probe to a finding only when the bug can be checked with one safe GET request against the preview build. Qodex discovers the preview URL through the GitHub Deployments API, checks the URL against safety rules and the repo allowlist, runs the probe, and attaches the result to the inline comment. If the response matches the expected signal, the finding is `verified`. If the probe runs but does not match, the finding is `unverified`. If Qodex cannot run a probe, the finding is `skipped` or `failed` depending on why. Only verified findings can block a merge when merge gating is enabled.\\n\\n...\\n\\nPath\\n\\nThe path must resolve against the discovered preview URL on the same origin. Qodex refuses paths that try to break the origin, including `//`, `http://`, `javascript:`, `..` outside the origin, or control characters.\\n\\nExpected signal\\n\\nThe expected signal describes what the bug produces, not what the correct behavior produces. A match means the bug is reproducible.\\n\\n| Type | Match condition |\\n| --- | --- |\\n| `status_code` | `response.status === value` |\\n| `status_range` | `response.status` between `min` and `max` inclusive |\\n| `body_contains` | `response.body.includes(value)` |\\n| `header_present` | `response.headers` has a key matching `name` (case-insensitive) |\\n| `header_value` | `response.headers[name] === value` (case-insensitive key) |\\n\\n...\\n\\nSecurity guards\\n\\nThe probe is agent-controlled, and the agent reads PR content, so Qodex treats every probe as untrusted. Qodex refuses probes that target unsafe or private destinations: HTTP, `localhost`, private or reserved IP ranges, IPv6 literals, and obfuscated IP encodings are all rejected before any request is made.\\n\\n...\\n\\nProbe execution\\n\\nOnce a probe URL is resolved and origin-checked:\\n\\n- Headers are Qodex-controlled only. Any headers suggested by the agent are dropped.\\n- Body is empty. Any body suggested by the agent is ignored.\\n- Redirects are not followed.\\n- Timeout is 8 seconds.\\n- Response body is captured up to 8 KB and then truncated.\\n\\nThe response body is escaped before it is embedded in the inline comment so hostile payloads cannot break out of the markdown fence.\\n\\n...\\n\\nProbe results\\n\\nEach finding gets one probe status.\\n\\n| Status | When |\\n| --- | --- …[truncated]",
          "arguments": {
            "query": "knot-verified-probe",
            "objective": "knot-verified-probe"
          },
          "httpStatus": 200
        },
        "durationMs": 1185
      },
      {
        "id": "L2.bad_input",
        "tool": "web_search_exa",
        "status": "pass",
        "evidence": {
          "raw": "event: message\ndata: {\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"MCP error -32602: Input validation error: Invalid arguments for tool web_search_exa: Required at query\"}],\"isError\":true},\"jsonrpc\":\"2.0\",\"id\":9}\n\n",
          "arguments": {}
        },
        "durationMs": 134
      },
      {
        "id": "L2.timeout",
        "detail": "2 calls answered within 30000 ms",
        "status": "pass"
      }
    ],
    "metrics": {
      "callMs": [
        123,
        111,
        1185,
        134
      ],
      "toolsListMs": 102,
      "initializeMs": 113
    },
    "facts": {
      "tls": {
        "validTo": "Dec 28 08:24:05 2026 GMT",
        "protocol": "TLSv1.3",
        "daysToExpiry": 60
      },
      "authModel": "none",
      "transport": "streamable-http",
      "capabilities": [
        "prompts",
        "resources",
        "tools"
      ],
      "toolAnnotations": {
        "readOnly": 2,
        "unmarked": 0,
        "destructive": 0
      },
      "credentialsInUrl": false
    }
  },
  "l3": {
    "uptime": {
      "24h": null,
      "7d": 1,
      "30d": 1
    },
    "sampleSize": {
      "24h": 0,
      "7d": 1,
      "30d": 1
    },
    "latency": {
      "initialize": {
        "p50": 113,
        "p95": 113
      },
      "calls": {
        "p50": 123,
        "p95": 1185
      }
    },
    "flakiness": null,
    "versionDrift": []
  },
  "history": [
    {
      "startedAt": "2026-10-29T06:52:54.599Z",
      "runKind": "full",
      "l0Ok": true,
      "verdict": "alive"
    }
  ]
}