VAERS Explorer
Model Context Protocol

VAERS MCP Server

Give any MCP-compatible AI client — Claude, Cursor, and others — live, structured access to the public VAERS dataset. Count, search, break down, and chart adverse-event reports directly from your assistant.

Endpointhttps://vaers.leafnlp.org/api/mcp
Streamable HTTPMCP 2026-07-28Open access60 req/min

Overview

The Model Context Protocol (MCP) is an open standard that lets AI applications call external tools. This server exposes read-only VAERS analytics as MCP tools over Streamable HTTP, so a connected client can answer data questions with grounded, queryable results instead of guessing.

Everything is powered by the same Elasticsearch layer as the VAERS Explorer web app, with allow-listed filters and capped result sizes — there is no way to run arbitrary queries.

Connect a client

Claude (claude.ai / Desktop)

Open Settings → Connectors → Add custom connector, give it a name (e.g. VAERS), and paste the endpoint URL above. Claude will discover the tools automatically.

Cursor

Add the server to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project):

{
  "mcpServers": {
    "vaers": {
      "url": "https://vaers.leafnlp.org/api/mcp"
    }
  }
}

Other clients

Any client that supports remote MCP over Streamable HTTP can use the endpoint directly. For stdio-only clients, bridge with mcp-remote: npx mcp-remote https://vaers.leafnlp.org/api/mcp.

Tools

Six read-only tools are available. Every result includes a short summary plus structured JSON.

count_reports

Count reports matching filters. Use for "how many" questions.

filtersFilters
Optional. Any combination of the filters below.
search_reports

Return a sample of matching reports (demographics, vaccines, symptoms, outcome, narrative snippet).

filtersFilters
sizenumber
1–10, default 5.
sortenum
relevance | recvdate_desc | recvdate_asc | age_desc | age_asc.
breakdown

Aggregate reports by a categorical dimension. Good for "top / most common / break down by".

filtersFilters
dimension *enum
vaccineTypes | manufacturers | topSymptoms | states | sex | years | outcomes.
reports_over_time

Trend of matching reports over time, bucketed by received date.

filtersFilters
intervalenum
year | quarter | month, default year.
age_distribution

Histogram of patient ages for matching reports.

filtersFilters
bucketYearsnumber
1–20, default 10.
get_report

Fetch a single VAERS report by its VAERS_ID.

vaers_id *string
e.g. "1234567".

* required argument.

Filters

Most tools accept an optional filters object. Keyword values (states, sex, vaccine types/manufacturers, symptoms) must be UPPERCASE.

FieldTypeNotes
querystringFree-text across narrative, symptoms, and vaccine names.
vaccineTypesstring[]UPPERCASE, e.g. "COVID19", "FLU4".
vaccineManufacturersstring[]UPPERCASE, e.g. "PFIZER\BIONTECH", "MODERNA".
vaccineNamesstring[]Exact vaccine names.
symptomsstring[]MedDRA terms, UPPERCASE, e.g. "HEADACHE".
statesstring[]US 2-letter codes, UPPERCASE, e.g. "CA".
sex("M"|"F"|"U")[]Patient sex.
recovered("Y"|"N"|"U")[]Recovered flag.
yearsnumber[]Calendar years of the received date.
ageMin / ageMaxnumberInclusive patient age bounds (years).
diedbooleanOnly reports where the patient died.
hospitalizedbooleanOnly reports involving hospitalization.
lifeThreateningbooleanOnly life-threatening reports.
disabledbooleanOnly reports involving disability.
seriousbooleanOnly serious reports.

Authentication & rate limits

This server is currently open — no token required, since VAERS is public data. Requests are rate limited and audited. You can still create a key under Account → API keys to identify your traffic.

  • Rate limit: 60 requests/minute per client (by IP, and by key when authenticated). Exceeding it returns HTTP 429 with a Retry-After header.
  • Read-only: no tool can modify data; filters are allow-listed and result sizes are capped.
  • Health check: GET https://vaers.leafnlp.org/api/mcp/health.

Examples

List available tools

curl -X POST https://vaers.leafnlp.org/api/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Call a tool (JSON-RPC body)

Break down COVID19 reports where the patient died, by manufacturer. Send this as the POST body to a tools/call request:

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "breakdown",
    "arguments": {
      "filters": { "vaccineTypes": ["COVID19"], "died": true },
      "dimension": "manufacturers"
    }
  }
}
VAERS reports are unverified, self-reported, and do not by themselves establish that a vaccine caused an event. Counts and breakdowns cannot be used to determine whether a vaccine caused an adverse event.