MCP server for Angolan malaria surveillance and short-horizon outbreak forecasting, with evaluation-backed guardrails
Five tools with complete schemas and strong descriptions (avg 180 chars). All parameters typed and described. Tool names follow verb_noun pattern (list_, get_, forecast_, detect_, compare_). Output documented as JSON with structured fields. Key strength: domain-specific guidance (e.g., 'Read malaria://model-card for validation details'). Weakness: no error handling guidance in descriptions, no parameter constraints (enums, ranges), no pagination support despite potential for large result sets.
Rank provinces by forecast incidence to support prioritisation. Args: horizon_weeks: Horizon to compare on, 1 to 8. top_n: How many provinces to return, highest forecast first. Use this to answer "where should we pre-position resources", then drill into a single province with `forecast_incidence` and `detect_outbreak_signals`.
Flag recent weeks running above the same-calendar-week seasonal baseline. Args: province: Province name, case-insensitive. lookback_weeks: How many recent weeks to screen. Defaults to 12. sigma: Standard deviations above the seasonal baseline required to flag. A flag means "high for this time of year", compared against the same week in prior years -- not merely "high in absolute terms".
Forecast weekly malaria incidence 1-8 weeks ahead, with 80% intervals. Args: province: Province name, case-insensitive. horizon_weeks: Forecast horizon, 1 to 8. Horizons beyond the validated range are refused rather than extrapolated. Every point carries an empirical 80% interval derived from rolling-origin backtest residuals. Read `malaria://model-card` for validation details and known failure modes before acting on these numbers.
Return weekly malaria incidence history for one province. Args: province: Province name, case-insensitive (e.g. "Luanda", "moxico"). start_week: Optional ISO date (YYYY-MM-DD) lower bound. end_week: Optional ISO date (YYYY-MM-DD) upper bound. max_weeks: Cap on returned rows, most recent first. Defaults to 52. Returns incidence per 1,000 population and the rainfall driver per week.
No parameter constraints (enums, ranges, patterns). horizon_weeks accepts 1-8 but no min/max validation declared; sigma is unbounded float; max_weeks could be negative. LLMs will pass invalid values.
Error handling returns JSON with 'error' field but no recovery guidance. 'horizon_out_of_range' error includes max_validated_horizon_weeks, but other errors (ValueError, InsufficientHistory) lack actionable next steps for the LLM.
No pagination support. get_incidence_history returns up to 52 weeks by default; compare_provinces returns top_n provinces. Large result sets could exhaust context. No next_cursor or total_count in responses.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 62 | 2026-07-28+ | v2 |
List Angolan provinces under surveillance with their epidemiological stratum. Strata come from K-means clustering of historical burden: 'high', 'moderate' or 'low'. Use this first to resolve province names before calling other tools.
Parameter descriptions include example values ('e.g. Luanda, moxico') which LLMs may reuse literally. Should use enums or format constraints instead.
Output schema not formally documented. Responses are JSON but structure (fields, types, nesting) not declared in tool definitions. LLMs must infer from examples.