FAERS MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FAERS_MCP_HOST | No | Sets the default host for HTTP transport. Example: '10.0.0.5'. | 127.0.0.1 |
| FAERS_MCP_PORT | No | Sets the default port for HTTP transport. Example: '8010'. | |
| FAERS_CACHE_DIR | No | Set FAERS_CACHE_DIR to relocate the cache directory; it defaults to ~/.faers_mcp_cache. | ~/.faers_mcp_cache |
| OPENFDA_API_KEY | No | openFDA API key. Without a key: 1,000 requests/day and a count limit ceiling of 999. With a key: 120,000 requests/day and limit up to 1,000. Read from OPENFDA_API_KEY and sent as an HTTP Basic auth header, never in the query string. | |
| FAERS_MCP_TRANSPORT | No | Sets the default transport. Example: 'http'. | stdio |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| faers_search_casesA | Search FAERS for individual case safety reports (ICSRs). Returns compact triage cards by default: report id, dates, seriousness flags, suspect drugs, reactions and outcomes. Pass full=true for complete records. |
| faers_case_countsA | Total, serious and fatal case counts for a drug, optionally by event. All counts are issued concurrently as a single round trip. |
| faers_disproportionalityA | Build the 2x2 contingency table and compute ROR, PRR and chi-square. Any date window or raw_filter is applied to all four marginals including the grand total N, so the table stays internally consistent. Screening criteria are reported individually by name rather than collapsed into a verdict. |
| faers_count_by_fieldB | Aggregate FAERS reports for a drug by any field (SQL GROUP BY equivalent). |
| faers_top_eventsA | Top MedDRA preferred terms reported with a drug. Convenience form of faers_count_by_field with the reaction field preset. |
| faers_get_reportA | Retrieve one complete ICSR by Safety Report ID. The only tool that returns an unprojected record; a single ICSR averages ~72 KB. |
| faers_demographic_profileA | Sex, age, reporter qualification and country breakdown for a drug. Age is reported two ways: the coded patientagegroup (populated on ~18% of reports) and bands derived from patientonsetage in years (~55%), the same bands the stratifiers use. Each carries its own coverage against the total. |
| faers_outcome_breakdownB | Reaction outcomes and seriousness criteria for a drug, in one concurrent round trip. |
| faers_time_trendA | Yearly reporting trend for a drug, aggregated from receivedate. count=receivedate returns a complete date histogram irrespective of limit, so the yearly rollup is exact. Date buckets arrive keyed "time", not "term". |
| faers_coreported_drugsA | Substances most often appearing on the same reports as an index drug. Co-REPORTED at any role, not co-suspect: openFDA cannot restrict a count to substances carried as suspect, so the list is dominated by concomitant medication. |
| faers_signal_screenA | Screen a drug against all its reported events, or an event against all its drugs. ROR, PRR and chi-square for every term with named criteria. The database-wide marginals come from a single cached count call rather than one call per term, so a 200-term screen costs ~13 calls cold and ~10 warm. Any date window or raw_filter is applied to every marginal. |
| faers_raw_searchA | Escape hatch: run an arbitrary Lucene query against the FAERS endpoint. The query is checked for balanced quotes and parentheses and for the "+AND+" mistake before being sent; the same compact projection and ceilings apply. |
| faers_describe_fieldsA | Searchable FAERS field paths with coded values and traps, plus the available stratifiers. Consult before writing a raw_filter or count_field rather than guessing a path. |
| faers_ebgmA | Empirical Bayes signal scores (EBGM with EB05/EB95) via the Gamma-Poisson Shrinker. EBGM shrinks the observed-to-expected ratio toward 1 in proportion to how little evidence supports it. EB05 is the conventional screening statistic; EB05 > 2 is the usual threshold. The prior is fitted across a drug x event background table, so the FIRST call for a FAERS release builds and caches that table (~100 s, 3 + background_drugs calls). Call faers_warm_cache first, or raise the client timeout. Later calls take a few seconds. |
| faers_warm_cacheA | Build the EBGM background table and fit the prior ahead of time. The first faers_ebgm call for a FAERS release takes ~100 s and 100+ API calls, which exceeds many MCP client timeouts. Calling this tool first moves that cost to a turn that expects it; subsequent faers_ebgm calls take a few seconds. Reports whether each cache was already warm. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| faers_signal_workup | Structured signal work-up for one drug, or one drug-event pair. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 15 tools
Most tools have clearly distinct purposes, but there is notable overlap among counting/aggregation tools (faers_case_counts, faers_count_by_field, faers_top_events) and signal detection tools (faers_signal_screen vs faers_disproportionality). The detailed descriptions clarify scope (e.g., top_events is a convenience form, signal_screen screens all terms), so an agent can usually tell them apart, but a few could still be confused.
All tools use a consistent faers_ prefix and snake_case, which is predictable. However, the naming pattern is not strictly verb_noun throughout; it mixes verb phrases (search_cases, get_report) with noun phrases (case_counts, demographic_profile) and acronyms (ebgm). This is a minor deviation from the ideal verb_noun consistency.
15 tools is appropriate for a comprehensive FAERS analysis server, covering search, retrieval, aggregation, signal detection, and specialized metrics. Each tool appears to earn its place, with only minor redundancy (e.g., top_events as a convenience wrapper). The count is at the upper end of the ideal 3-15 range but well-scoped.
The tool set covers the full lifecycle of FAERS analysis: search (structured and raw), retrieval, counts, disproportionality, EBGM, demographics, outcomes, trends, and co-reported drugs. Field description and cache warming are also included. No obvious gaps for typical signal detection workflows.