Emergency Medicine RL Training Environment with MCP tools for ED simulation, clinical decision support, and patient management
HealthCraft defines 11 tools with complete input schemas and descriptions, but quality is uneven. Tool names follow verb_noun convention (check_, calculate_, create_, update_, search_, get_) which is good. Descriptions range from 80-180 chars, meeting the 10-1024 baseline. However, parameter descriptions are sparse or missing context. For example, 'zone' in check_resource_availability lacks explanation of valid zones. The run_decision_rule tool accepts a free-form 'variables' object with no schema constraints, inviting hallucinated variable names. Output schemas are not documented anywhere in the source provided. Error handling is absent, no guidance on what happens when a rule lookup fails or a resource is unavailable. The server lacks tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk classifications (READ_ONLY vs WRITE). Composition is reasonable: tools chain logically (search_patients → get_encounter_details → create_clinical_order), but no pagination is visible on search tools despite 10-result limits. Overall, definitions are functional but lack the rigor expected of production tools.
Estimate transfer time to a named facility. Returns facility name, transport mode, estimated minutes, and notes about the transfer.
Check whether *count* resources of a given type are available. Returns availability status, count available, count requested, and matching resources.
Create a new clinical order and its associated clinical task. Validates medication orders against patient allergies. Returns the created order dict on success.
Return full encounter details including vitals, labs, imaging, meds. When dynamic state is enabled, the most recent vitals set is replaced with interpolated vitals at the current simulation time.
Apply a clinical decision rule and return the computed score. Looks up a decision_rule entity by name, sums the supplied variable values, and finds the matching score range.
Search ED resources by type, zone, or status. Returns up to 10 results.
run_decision_rule accepts 'variables' as free-form object with no schema constraints. LLMs will hallucinate variable names.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields (e.g., encounter_id from search_encounters). Must document return types and field names.
Search tools return 'up to 10 results' but lack pagination parameters (limit, offset, cursor). No total_count or next_cursor in documented output. Large result sets will blow context window.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Search clinical knowledge by query, category, or condition_id. Returns up to 10 results.
Search encounters with optional filters by patient_id, chief_complaint, esi_level, disposition. Returns up to 10 results.
Search patients by name substring, MRN, or DOB. Returns up to 10 results.
Search reference materials by keyword, type, category, or drug_name. Returns up to 10 results.
Update the status of an existing clinical task. Handles both frozen dataclass and plain dict task entities.
Parameter descriptions lack format/constraint details. 'zone' in check_resource_availability has no explanation of valid zones. 'transport_mode' in calculate_transfer_time lists enum values in description but not as formal enum constraint.
No error handling guidance. Tools lack recovery hints (e.g., 'If rule not found, call search_clinical_knowledge first'). No categorization of errors as retryable vs fatal.