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.
https://vaers.leafnlp.org/api/mcpThe 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.
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.
Add the server to ~/.cursor/mcp.json (global) or .cursor/mcp.json (per-project):
{
"mcpServers": {
"vaers": {
"url": "https://vaers.leafnlp.org/api/mcp"
}
}
}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.
Six read-only tools are available. Every result includes a short summary plus structured JSON.
count_reportsCount reports matching filters. Use for "how many" questions.
search_reportsReturn a sample of matching reports (demographics, vaccines, symptoms, outcome, narrative snippet).
breakdownAggregate reports by a categorical dimension. Good for "top / most common / break down by".
reports_over_timeTrend of matching reports over time, bucketed by received date.
age_distributionHistogram of patient ages for matching reports.
get_reportFetch a single VAERS report by its VAERS_ID.
* required argument.
Most tools accept an optional filters object. Keyword values (states, sex, vaccine types/manufacturers, symptoms) must be UPPERCASE.
| Field | Type | Notes |
|---|---|---|
| query | string | Free-text across narrative, symptoms, and vaccine names. |
| vaccineTypes | string[] | UPPERCASE, e.g. "COVID19", "FLU4". |
| vaccineManufacturers | string[] | UPPERCASE, e.g. "PFIZER\BIONTECH", "MODERNA". |
| vaccineNames | string[] | Exact vaccine names. |
| symptoms | string[] | MedDRA terms, UPPERCASE, e.g. "HEADACHE". |
| states | string[] | US 2-letter codes, UPPERCASE, e.g. "CA". |
| sex | ("M"|"F"|"U")[] | Patient sex. |
| recovered | ("Y"|"N"|"U")[] | Recovered flag. |
| years | number[] | Calendar years of the received date. |
| ageMin / ageMax | number | Inclusive patient age bounds (years). |
| died | boolean | Only reports where the patient died. |
| hospitalized | boolean | Only reports involving hospitalization. |
| lifeThreatening | boolean | Only life-threatening reports. |
| disabled | boolean | Only reports involving disability. |
| serious | boolean | Only serious reports. |
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.
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"}'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"
}
}
}