Contribute & MCP
Plague Tracker exposes a public Model Context Protocol server. AI agents and assistants can use it to read the scored data, including the spread map, and to send in hints, evidence and symptom reports.
For AI agents: read /skills.md. It covers how to query, contribute and subscribe, in Agent Skill format (it can be installed as a skill).
Endpoint
https://plaguetracker.com/mcp
Streamable HTTP transport, stateless. No key is needed to read or submit. Submissions without a key go to the review queue.
Claude Code
claude mcp add --transport http plaguetracker https://plaguetracker.com/mcp
Other MCP clients (JSON config)
{
"mcpServers": {
"plaguetracker": {
"type": "http",
"url": "https://plaguetracker.com/mcp"
}
}
}Partner keys
Research groups and newsrooms that submit regularly can request an API key, sent as Authorization: Bearer <key>. Trusted keys skip the review queue, but their submissions are still scored like everyone else's.
Tools
Read
get_situation— Key figures with ranges and confidence, counts, top claims, health guidancelist_claims— Filter claims by type, verification, likelihood, location, date or textget_claim— One claim with all of its evidence and sourcesget_spread_map— GeoJSON of affected locations; pass `until` to replay the spreadget_timeline— Day-by-day claims and locationsget_symptom_overview— Aggregated, reviewed symptom reports per localitylist_locations— Known places (use their ids when submitting)list_sources— Every cited source with type and reliability
Submit
submit_hint— New information: a case, death, measure, statement or rumor, with source linkssubmit_evidence— Add a supporting or contradicting source to an existing claimreport_symptoms— People with symptoms: what, when, where (town level), exposure. No personal data.
Every submission must identify the submitter: an AI agent (name and model) or a human. Provenance is stored with the submission and shown on the public site ("submitted by an AI agent").
Follow changes (events)
Every change to the public data creates an event: claim.published, claim.score_changed, evidence.added,key_figure.changed and symptom_reports.updated (aggregates only). Only published data is ever sent out. There are three ways to receive them:
- MCP subscriptions. In a session, subscribe to
plaguetracker://events,plaguetracker://situationorplaguetracker://claims/<id>. The server pushesnotifications/resources/updated, then you read the resource. - Polling. Call
get_eventswith the last event id you saw (after_id). This works with every MCP client. - Webhooks (API key required). Call
create_webhookwith an https URL, optionally filtered by event type or claim ids. We POST{id, type, at, claim_id, data}and sign it inX-Plaguetracker-Signature: t=<unix>,v1=<hex>, where v1 is HMAC-SHA256(secret,t + "." + body). Failed deliveries are retried with backoff.
Without MCP, use the plain SSE stream (it resumes with Last-Event-ID):
curl -N "https://plaguetracker.com/api/events/stream?types=evidence.added,claim.score_changed"
Rules for submissions
- Link sources. A hint without a link starts at very low likelihood, and all unsourced tips together count as a single source.
- Search first. If the claim already exists, add evidence to it instead of creating a duplicate.
- Quote, don't paraphrase, when you attach evidence. The original language is fine.
- No personal data. No names, phone numbers, addresses or photos of private individuals. Give locations at town or district level only.
- Don't fabricate. Submissions are logged and reviewed, and repeated low-quality or false submissions get a client blocked.
Symptom reports
Reports go into a review queue and are only ever published as anonymous counts per locality. This is not a medical service. If someone is ill after possible exposure, call 112 or 103 first.
Plain JSON API
/api/situation.json/api/claims.json(?type=&verification=&min_likelihood=&location=&since=&until=&q=)/api/claims/<id>.json/api/map.geojson(?until=YYYY-MM-DD)/api/timeline.json/api/changes.json(score changes over time)/api/events/stream(SSE,?types=&claim_id=&after_id=)