Skip to main content
Glama
claudiomedina17

CardioTriage MCP Server

README.md
# CardioTriage MCP — Phenotype-aware Cardiovascular Triage

Prompt Opinion MCP superpower for phenotype-aware emergency cardiovascular
triage with FHIR R5 context, missing-data checks, structured bilingual
handoff, and Chagas-compatible cardiomyopathy differential surfacing backed by
ECGFounder bridge phenotype detection.

> NOT FOR CLINICAL USE. Hackathon demonstration only. Synthetic FHIR metadata
> plus public de-identified ECG samples. Foundation model outputs are
> uncalibrated demo scores -- they SURFACE differentials for clinical workup,
> never DIAGNOSE conditions.

## We do not propose AI-ECG as a replacement for serology.
## We propose it as a low-cost triage layer.

## Quick Links

- Live MCP endpoint: `https://claudiomedina17--mcp.modal.run/mcp`
- Live health endpoint: `https://claudiomedina17--mcp.modal.run/health`
- Marketplace listing evidence: [`docs/MARKETPLACE_VERIFICATION.md`](docs/MARKETPLACE_VERIFICATION.md)
- Demo video: `TBD - Phase 2`
- Devpost submission: `TBD - Phase 2`
- Repository: `TBD public repo URL` (local prototype workspace)
- Data provenance: [`docs/DATA_PROVENANCE.md`](docs/DATA_PROVENANCE.md)
- BYO Agent system prompt: [`docs/BYO_AGENT_SYSTEM_PROMPT.md`](docs/BYO_AGENT_SYSTEM_PROMPT.md)

## Elevator Pitch

CardioTriage gives any Prompt Opinion agent a governed phenotype-aware
cardiovascular triage toolkit instead of a free-text-only workflow.

It exposes six MCP tools that discover cases, retrieve FHIR R5 bundles, check
critical missing data, run ECGFounder-backed phenotype inference, summarize
risk signals, and render an SBAR handoff note.

The ECG tool uses ECGFounder (PKUDigitalHealth, MIT; NEJM AI 2025) embeddings
and signal features to return transparent uncalibrated demo scores.

The demo is anchored on chest-pain triage, STEMI pattern recognition, and a
Latam Chagas-compatible cardiomyopathy workup scenario.

The MCP server is the primary submission; the Prompt Opinion BYO Agent is the
demo wrapper that proves the tools are invokable inside the platform.

## Architecture Summary

CardioTriage uses a five-layer architecture:

1. Domain logic: synthetic FHIR R5 case bundles, HEART-style risk signals,
   missing-data review, and deterministic SBAR handoff scaffolding.
2. AI-ECG layer: ECG signal preprocessing plus ECGFounder 1024-d embeddings,
   centroid cosine similarity, and neurokit2-derived signal features.
3. MCP server: FastMCP tools exposed over Streamable HTTP for Prompt Opinion.
4. BYO Agent wrapper: a Prompt Opinion demo agent orchestrates the six tools
   with concise clinical rationale before each call.
5. Submission polish: provenance docs, Marketplace evidence, cache skeletons,
   disclaimers, and a reproducible local test suite.

## Six MCP Tools

| # | Tool | Purpose |
|---|------|---------|
| 1 | `list_synthetic_cases` | Discover the available demo case IDs A, B, and C. |
| 2 | `get_fhir_case_bundle` | Return the FHIR R5-style bundle for the selected case. |
| 3 | `analyze_missing_critical_data` | Flag missing or pending triage data such as troponin, echo, Chagas serology, or contraindications. |
| 4 | `summarize_cardiovascular_risk_signals` | Summarize deterministic cardiovascular risk signals for STEMI, HF/Chagas, or low-risk patterns. |
| 5 | `generate_structured_handoff_note` | Generate an SBAR-style handoff note in `en`, `es`, or `pt`. |
| 6 | `interpret_12_lead_ecg` | AI-ECG inference (lite + live), uncalibrated demo scores. Bridge phenotype detection backed by ECGFounder; surfaces Chagas-compatible cardiomyopathy pattern when context warrants serology workup. NOT a diagnostic tool. |

Tool #6 scores are evidence signals for the hackathon demo. They surface
phenotype-aware differentials for workup; they are not calibrated clinical
probabilities.

## Local Development

```bash
uv sync
uv run pytest tests/ -q
uv run python -m server.main
```

The default transport is stdio. For local Streamable HTTP:

```powershell
$env:CARDIOTRIAGE_MCP_TRANSPORT = "streamable-http"
$env:CARDIOTRIAGE_MCP_HOST = "127.0.0.1"
$env:CARDIOTRIAGE_MCP_PORT = "8000"
$env:CARDIOTRIAGE_MCP_PATH = "/mcp"
uv run python -m server.main
```

Health smoke:

```powershell
curl.exe http://127.0.0.1:8000/health
```

## Marketplace Publish Steps

Phase 0 Gate 0 found that CardioTriage is usable in Prompt Opinion as a
WORKSPACE-ONLY listing. Public Marketplace publishing may require subscription
publishing enablement.

1. Open Prompt Opinion.
2. Go to Configuration -> MCP Servers -> Add.
3. Friendly name: `CardioTriage MCP Server`.
4. Endpoint: `https://claudiomedina17--mcp.modal.run/mcp`.
5. Transport: Streamable HTTP.
6. Authentication: No authentication / open.
7. Save and verify that the server appears in the workspace MCP server list.
8. Confirm `/health`, `initialize`, and `tools/list` expose six tools.
9. Use screenshots from the workspace Manage view as Marketplace evidence if
   public listing remains unavailable.

See [`docs/MARKETPLACE_VERIFICATION.md`](docs/MARKETPLACE_VERIFICATION.md).

## BYO Agent Demo

Open or create the Prompt Opinion BYO Agent named `CardioTriage Demo`.

1. Tools tab: attach `CardioTriage MCP Server`.
2. System Prompt tab: paste [`docs/BYO_AGENT_SYSTEM_PROMPT.md`](docs/BYO_AGENT_SYSTEM_PROMPT.md).
3. Save.
4. Run: `Triage Case B end-to-end. Use Spanish for the handoff.`
5. Expected trace: all six tools in order, including `interpret_12_lead_ecg`,
   with `chagas_suspect_demo_score` around `0.925` and
   `calibration_status="uncalibrated_demo"`.

Offline deterministic cache skeletons live in
`cardiotriage_core/demo_cache/run_case_{a,b,c}.json`; rationale and final PO
handoff text remain `TODO_LIVE_CAPTURE` until Claudio captures real UI runs.

## License

MIT. See [`LICENSE`](LICENSE).

## Acknowledgements

- ECGFounder by PKUDigitalHealth (MIT license), used for ECG foundation-model
  embeddings.
- CODE-15 / Ribeiro et al., Zenodo 4916206, CC-BY 4.0, for public
  de-identified ECG demo samples.
- SaMi-Trop / PhysioNet Challenge 2025 for the Chagas-cohort public
  de-identified ECG demo sample.
- Bern et al., CDC 2007, for Chagas disease clinical grounding.
- Nunes et al., JACC 2013, for Chagas cardiomyopathy clinical grounding.
- Anthropic Claude Haiku for the planned Prompt Opinion BYO Agent narrative
  layer; this repository does not run live LLM API calls during deterministic
  cache generation.

## Disclaimer

> NOT FOR CLINICAL USE. This software is a hackathon demonstration. Demo data
> only: synthetic FHIR metadata plus public de-identified ECG samples. Scores
> are uncalibrated demo scores, not clinical probabilities. A licensed
> clinician must validate all findings and actions.

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct aspect of the workflow: listing cases, retrieving data, analyzing ECG, summarizing risk, checking missing data, and generating a handoff note. No two tools have overlapping purposes.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., list_synthetic_cases, interpret_12_lead_ecg), using snake_case throughout. No mixing of conventions or vague verbs.

Tool Count5/5

Six tools is well-scoped for a synthetic triage demo, covering discovery, data retrieval, multiple analysis types, and output generation. Neither too few nor too many for the purpose.

Completeness5/5

The tool set covers the complete triage workflow: case selection, data retrieval, ECG interpretation, risk signal extraction, missing data check, and handoff note generation. No obvious gaps for a synthetic demo.

Maintenance

ActivityInactive
ResponsivenessNo issues