
PopHIVE
STDIOMCP server providing access to PopHIVE public health surveillance data from Yale with comprehensive analysis tools
MCP server providing access to PopHIVE public health surveillance data from Yale with comprehensive analysis tools
Featured on Claude, try it out here: https://claude.ai/directory/ant.dir.gh.cicatriiz.pophive
A Model Context Protocol (MCP) server that provides access to PopHIVE (Population Health Information Visual Explorer) public health data from Yale School of Public Health. This server exposes comprehensive health surveillance data including immunizations, respiratory diseases, and chronic diseases through standardized MCP tools, resources, and prompts.
🎯 Production-Ready: All critical bugs fixed, enhanced error handling, and comprehensive dataset metadata included.
📦 Desktop Extension Ready: Fully compliant with Anthropic's Desktop Extension (DXT) specification for one-click installation in Claude Desktop and other MCP-enabled applications.
PopHIVE (Population Health Information Visual Explorer) is Yale's comprehensive platform that aggregates near real-time public health data from authoritative sources including CDC surveillance systems, Epic Cosmos EHR networks, and Google Health Trends. It's an invaluable resource for epidemiologists, researchers, and public health professionals.
👉 Explore PopHIVE: https://www.pophive.org/
Implemented scrapers for three new datasets:
Hospital Capacity: Fetches state-level hospital utilization data from HealthData.gov.
Injury & Overdose: Fetches national-level injury and overdose death data from data.cdc.gov.
Youth Mental Health ED Visits: Fetches national-level data on youth mental health-related emergency department visits from data.cdc.gov.
Implemented a parallel, batched initial fetch for the hospital capacity dataset to significantly speed up the first-time data download.
Added incremental update logic to all scrapers to only fetch new data, reducing subsequent load times.
Corrected date parsing logic in the analysis tools to robustly handle various date formats across all datasets.
Fixed an issue where the hospital capacity scraper was not fetching all records.
PopHIVE aggregates near real-time health data from multiple authoritative sources:
For Claude Desktop users:
.dxt
file from the releases pageFor other MCP-enabled applications:
.dxt
file with any application supporting Desktop ExtensionsPrerequisites:
Setup:
git clone <repository-url> cd pophive-mcp-server npm install
# Create .env file for custom configuration echo "DATA_CACHE_DIR=./data" > .env echo "UPDATE_FREQUENCY=daily" >> .env
npm test
npm start
Create a Desktop Extension from source:
npm install -g @anthropic-ai/dxt
git clone <repository-url> cd pophive-mcp-server npm install
dxt pack
.dxt
file in Claude Desktop or other MCP applicationsVariable | Default | Description |
---|---|---|
DATA_CACHE_DIR | ./data | Directory for cached data files |
UPDATE_FREQUENCY | daily | Data refresh frequency (hourly , daily , weekly ) |
NODE_ENV | development | Environment mode |
Add to your MCP client configuration (e.g., Claude Desktop):
{ "mcpServers": { "pophive": { "command": "node", "args": ["server/index.js"], "cwd": "/path/to/pophive-mcp-server" } } }
Choose the right dataset for your analysis:
Dataset | Geographic Level | Best Use Cases | Date Range | Update Frequency | Key Limitations |
---|---|---|---|---|---|
immunizations_nis | National + State | National vaccination trends, state comparisons | 2019-2024 | Annual | Survey data, limited demographics |
immunizations_epic | National + State | Real-world vaccination patterns, insurance analysis | 2020-2024 | Monthly | EHR network bias |
respiratory_ed | National + State | Emergency department surveillance, outbreak detection | 2020-2024 | Weekly | Healthcare utilization only |
respiratory_lab | National only | Clinical test positivity, laboratory surveillance | 2020-2024 | Weekly | National aggregates only |
respiratory_wastewater | Regional | Environmental surveillance, early warning | 2022-2024 | Weekly | Limited geographic coverage |
respiratory_trends | National + State | Population behavior, symptom searches | 2020-2024 | Weekly | Behavioral proxy, not clinical |
chronic_obesity | National + State | Obesity prevalence, chronic disease tracking | 2020-2024 | Quarterly | Clinical populations only |
chronic_diabetes | National + State | Diabetes management, glycemic control | 2020-2024 | Quarterly | Clinical populations only |
hospital_capacity | State | Hospital utilization, bed capacity, staffing shortages | 2020-2024 | Daily | COVID-era focus |
injury_overdose | National | Drug overdoses, homicides, suicides | 2019-2025 | Monthly/Quarterly | National aggregates only |
youth_ed_mental_health | National | Youth mental health ED visits, demographic trends | 2019-2025 | Monthly | National aggregates only |
For national trends: Use immunizations_nis
, respiratory_lab
, or any dataset with geography="national"
For state comparisons: Use respiratory_ed
, chronic_obesity
, chronic_diabetes
, or immunizations_nis
For real-time surveillance: Use respiratory_ed
, respiratory_wastewater
, or respiratory_trends
For clinical outcomes: Use immunizations_epic
, chronic_obesity
, or chronic_diabetes
// ✅ WORKING: Filter immunization data for California { "tool": "filter_data", "arguments": { "dataset": "immunizations_nis", "state": "CA" } } // ✅ WORKING: Filter national immunization data { "tool": "filter_data", "arguments": { "dataset": "immunizations_nis", "state": "US" } } // ❌ AVOID: This will return 0 results { "tool": "filter_data", "arguments": { "dataset": "respiratory_lab", "state": "CA" // respiratory_lab only has national data } }
// ✅ WORKING: Compare obesity rates across states { "tool": "compare_states", "arguments": { "dataset": "chronic_obesity", "states": ["CA", "TX", "FL", "NY"], "metric": "prevalence_rate", "time_period": "latest" } } // ✅ WORKING: Compare vaccination coverage { "tool": "compare_states", "arguments": { "dataset": "immunizations_nis", "states": ["California", "Texas", "New York"], // Full names work too "metric": "coverage_rate" } }
// ✅ WORKING: Analyze national respiratory trends { "tool": "time_series_analysis", "arguments": { "dataset": "respiratory_ed", "metric": "ed_visits_per_100k", "geography": "national", // Use "national" for US-level data "aggregation": "weekly" } } // ✅ WORKING: Analyze state-level trends { "tool": "time_series_analysis", "arguments": { "dataset": "respiratory_ed", "metric": "ed_visits_per_100k", "geography": "CA", "start_date": "2024-01-01", "end_date": "2024-12-01" } }
// ✅ WORKING: Search with national geography { "tool": "search_health_data", "arguments": { "query": "RSV", "geography": "national" // Fixed: Use "national" instead of "US" } } // ✅ WORKING: Search specific datasets { "tool": "search_health_data", "arguments": { "query": "vaccination coverage", "datasets": ["immunizations_nis", "immunizations_epic"] } }
// ✅ WORKING: Generate immunization gap analysis { "prompt": "immunization_gaps", "arguments": { "state": "Texas", "demographic_focus": "insurance" } } // ✅ WORKING: Detect respiratory surges { "prompt": "respiratory_surge_detection", "arguments": { "region": "California", "virus_type": "RSV", "time_period": "last_4_weeks" } }
Cause: Geographic mismatch or dataset limitations
Solutions:
get_available_datasets
to see supported geographies"geography": "national"
(not "US")// ❌ Problem: Wrong geography for national data { "tool": "search_health_data", "arguments": { "query": "influenza", "geography": "US" // Should be "national" } } // ✅ Solution: Use correct geography { "tool": "search_health_data", "arguments": { "query": "influenza", "geography": "national" } }
Cause: Dataset only contains national-level data
Solutions:
get_available_datasets
respiratory_ed
, chronic_obesity
, chronic_diabetes
, immunizations_nis
respiratory_lab
Cause: Incorrect metric name or dataset mismatch
Solutions:
coverage_rate
, sample_size
ed_visits_per_100k
, positivity_rate
prevalence_rate
, patient_count
get_available_datasets
with include_sample: true
// National vaccination trends { "tool": "time_series_analysis", "arguments": { "dataset": "immunizations_nis", "metric": "coverage_rate", "geography": "national" } } // State vaccination comparison { "tool": "compare_states", "arguments": { "dataset": "immunizations_nis", "states": ["CA", "TX", "NY", "FL"], "metric": "coverage_rate" } }
// Emergency department trends { "tool": "filter_data", "arguments": { "dataset": "respiratory_ed", "state": "CA", "condition": "RSV" } } // National lab surveillance { "tool": "time_series_analysis", "arguments": { "dataset": "respiratory_lab", "metric": "positivity_rate", "geography": "national" } }
// Obesity prevalence by state { "tool": "filter_data", "arguments": { "dataset": "chronic_obesity", "state": "TX", "age_group": "18-64" } } // Diabetes trends { "tool": "time_series_analysis", "arguments": { "dataset": "chronic_diabetes", "metric": "prevalence_rate", "geography": "CA" } }
Filter datasets by various criteria.
Parameters:
dataset
(required): Dataset identifierstate
(optional): State code or namestart_date
(optional): Start date (YYYY-MM-DD)end_date
(optional): End date (YYYY-MM-DD)age_group
(optional): Age group filtercondition
(optional): Condition/metric filterCompare health metrics across multiple states.
Parameters:
dataset
(required): Dataset identifierstates
(required): Array of state codes/namesmetric
(required): Metric to comparetime_period
(optional): Time period for comparisonAnalyze trends over time.
Parameters:
dataset
(required): Dataset identifiermetric
(required): Metric to analyzegeography
(optional): Geographic focusstart_date
(optional): Analysis start dateend_date
(optional): Analysis end dateaggregation
(optional): Time aggregation (weekly
, monthly
, quarterly
, yearly
)All resources return JSON data with standardized schemas:
// Example immunization record { "geography": "CA", "year": 2024, "vaccine": "MMR", "age_group": "19-35 months", "coverage_rate": 96.1, "sample_size": 1876, "source": "CDC NIS" } // Example respiratory surveillance record { "geography": "US", "date": "2024-12-01", "week": "2024-48", "virus": "RSV", "ed_visits_per_100k": 3.8, "percent_change": 15.2, "source": "Epic Cosmos" }
pophive-mcp-server/
├── server/
│ ├── index.js # Main MCP server
│ ├── utils/
│ │ └── data-loader.js # Data loading and caching
│ ├── tools/
│ │ └── analysis-tools.js # MCP tool implementations
│ ├── prompts/
│ │ └── prompt-templates.js # MCP prompt templates
│ └── scrapers/
│ ├── immunizations.js # Immunization data scraper
│ ├── respiratory.js # Respiratory data scraper
│ └── chronic-diseases.js # Chronic disease data scraper
├── data/ # Cached data files
├── package.json
├── manifest.json # MCP server manifest
└── README.md
server/scrapers/
# Run all tests npm test # Test specific components npm run test:tools npm run test:scrapers npm run test:integration
The server automatically refreshes data based on the UPDATE_FREQUENCY
setting. Manual refresh:
npm run refresh-data
Server won't start:
npm install
No data returned:
MCP client connection issues:
Server logs are written to stderr and include:
Enable verbose logging:
DEBUG=pophive:* npm start
MIT License - see LICENSE file for details.