# faers.mobi — Claude Desktop / Cursor / Perplexity MCP Paste-ready install. No API key. No pay gate. Hosted (Streamable HTTP): https://faers.mobi/mcp Stdio server: https://faers.mobi/mcp/server.py Config: https://faers.mobi/mcp/claude_desktop.example.json Human API: https://faers.mobi/API.md FAERS disproportionality is a **hypothesis**, not causation. Stdlib Python 3. Talks to live `GET https://faers.mobi/signals`. No new statistics. ## Hosted (preferred) Add the URL. No local Python. ```json { "mcpServers": { "faers-mobi": { "url": "https://faers.mobi/mcp" } } } ``` Same tools as stdio. POST JSON-RPC (`initialize`, `tools/list`, `tools/call`). `get_pipeline` asks https://globalpatientsafety.com/pipeline for one sponsor. The rows are ClinicalTrials.gov registry facts, not a FAERS signal. Omit status for ongoing studies. Omit role for lead sponsor only. `role=any` includes collaborator-only trials. Example: get_pipeline with sponsor Sanofi. `get_vaers` asks https://vaers.globalpatientsafety.com/signals for a vaccine, an event, or both. The rows are VAERS reporting signals, not a FAERS signal. Counts are reporting, not incidence. Example: get_vaers with vaccine COVID19 and event Myocarditis. `vaers_search_vaccine` lists pairs for one vaccine (optional event). `vaers_get_signal` is one vaccine and one event, and returns the same `n`, `eb05`, `eb05_peak_pre2021`, and `peak_in_covid_era` as GET /signals. `vaers_get_profile` is format=profile for one vaccine. All four call that same URL. `n_unique` is not in the VAERS extract. This server does not add a second VAERS worker. ## Perplexity Perplexity's web browsing finds the homepage but does not call `GET /signals`. Add the hosted server as a custom connector instead: 1. Settings → Connectors → Add custom connector 2. URL: `https://faers.mobi/mcp` 3. Transport: Streamable HTTP 4. Auth: none 5. Enable the connector in a new chat Example ask: "Retrieve the FAERS brief for tzield × Nausea. State the data-through quarter. Hypothesis, not causation." Custom connectors may need a paid Perplexity plan — check your plan. ## Local stdio 1. Save https://faers.mobi/mcp/server.py (stdlib only) 2. Merge https://faers.mobi/mcp/claude_desktop.example.json into Claude Desktop / Cursor MCP config 3. Set `args` to the absolute path of the file you saved 4. Leave `FAERS_MOBI_API` as `https://faers.mobi` (auth: none) ```json { "mcpServers": { "faers-mobi": { "command": "python3", "args": ["/path/to/server.py"], "env": { "FAERS_MOBI_API": "https://faers.mobi" } } } } ``` Smoke: ``` python3 server.py --call get_signal drug=tzield event=Nausea python3 server.py --call rwe_brief drug=tzield event=Nausea curl -sS -X POST https://faers.mobi/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_signal","arguments":{"drug":"tzield","event":"Nausea"}}}' ``` ## Tools (when to use) - `search_drug` / `search_event` / `get_signal` — isolated pair lists (rows carry `indication` / `low_info`; pass `indication="hide"`, `low_info="hide"` for ranking asks) - `get_signal_history` — quarterly n / EB05 / EWMA (`format=series`; needs drug AND event) - `get_profile` — compact snapshot (`format=profile`; needs drug or event) - `compare_class` — ATC4 peers (`format=class`; needs drug) - `rwe_brief` — copyable markdown (`format=brief`; needs drug or event; drug+event adds class + series + explain). PDF is HTTP `format=pdf` (drug or event), not an MCP tool. - `get_label_status` — cached FDA-label Novel status (`format=label`; needs drug AND event; no OpenFDA scrape) - `explain_signal` / `find_novel_signals` — templates / filters; no new numbers - `get_vaers` — VAERS vaccine × event pairs (`https://vaers.globalpatientsafety.com/signals`). Not a FAERS signal. `format` is json, series, profile, or class. - `vaers_search_vaccine` — VAERS pairs for one vaccine. Optional event, min_eb05, min_n. - `vaers_get_signal` — one VAERS vaccine and one event. Same n, eb05, eb05_peak_pre2021, and peak_in_covid_era as GET /signals. n_unique is not in the extract. - `vaers_get_profile` — VAERS format=profile for one vaccine. Always treat output as a statistical hypothesis from spontaneous reports, not evidence that a drug causes an event. Read n, eb05, and trend. Ingredient grouping, product type and medication errors (2026-09-27) - Every /signals row carries reported_drug (the raw FAERS string), ingredient (the active it resolves to), product_type (single | combination | trial_uncertain) and medication_error (true for use/supply PTs). - product_type=single keeps only single-ingredient rows; medication_error=hide drops medication-error and product-issue rows. Both are opt-in VIEWS, never merges: unfiltered output is unchanged and every row carries its flags. - Novelty is looked up on the ingredient, not the raw string. - n and EB05 are per reported string and are NEVER summed or averaged across strings. Ingredient-level recomputation is a separate offline step. - format=brief and format=pdf name every filter applied and the rows omitted by reason. format=class counts distinct ingredients, excluding the focal drug's own brands.