mcp server
medical-calc-mcp
๐ฅ MCP Server with 121 validated medical calculators for AI agents. DDD architecture, evidence-based formulas with PMID citations. Supports Claude, GPT, and other LLM integrations.
Set up
Runs on your computer. Pick your agent and operating system.
Before you start
- uv (`curl -LsSf https://astral.sh/uv/install.sh | sh`)
{
"mcpServers": {
"medical-calc-mcp": {
"command": "uvx",
"args": [
"medical-calc-mcp"
]
}
}
}same format Cursor, GitHub Copilot CLI, Junie, JetBrains AI Assistant, Augment (Auggie CLI), Factory Droid, Kiro, Devin CLI +12
Values in angle brackets are placeholders. Restart Claude Desktop after editing its config.Claude Desktop docs
README
synced Oct 14, 2026Medical Calculator MCP Server ๐ฅ
A DDD-architected medical calculator service providing clinical scoring tools for AI Agent integration via MCP (Model Context Protocol).
็น้ซไธญๆ็ (Traditional Chinese)
๐ Table of Contents
- Features
- Why This Project?
- Research Framework
- Architecture
- Quick Start
- OpenClaw Compatibility
- OpenClaw Registry Guide
- Deployment Modes
- Agent Integration
- Docker Deployment
- HTTPS Deployment
- REST API
- Security
- Tool Discovery
- Available Tools
- Usage Examples
- Benchmark Guide
- References
- Development
- Deployment Guide
- Clinical Guidelines Review
- Roadmap
๐ฏ Features
- ๐ MCP Native Integration: Built with FastMCP SDK for seamless AI agent integration
- ๐ Intelligent Tool Discovery: Two-level key system + Tool Relation Graph (Hypergraph) for smart tool selection
- ๐ก๏ธ Smart Parameter Matching: Alias support, fuzzy matching, and typo tolerance
- โ ๏ธ Boundary Validation: Literature-backed clinical range checking with automatic warnings
- ๐๏ธ Clean DDD Architecture: Onion architecture with clear separation of concerns
- ๐ Evidence-Based: All 152 calculators cite peer-reviewed research (100% coverage, Vancouver style)
- ๐ Type Safe: Full Python type hints with dataclass entities
- ๐ Bilingual: Chinese/English documentation and tool descriptions
๐ค Why This Project?
The Problem
When AI agents (like Claude, GPT) need to perform medical calculations, they face challenges:
- Hallucination Risk: LLMs may generate incorrect formulas or values
- Version Confusion: Multiple versions of same calculator (e.g., MELD vs MELD-Na vs MELD 3.0)
- No Discovery Mechanism: How does an agent know which tool to use for "cardiac risk assessment"?
The Solution
This project provides:
| Feature | Description |
|---|---|
| Validated Calculators | Peer-reviewed, tested formulas |
| Tool Discovery | AI can search by specialty, condition, or clinical question |
| MCP Protocol | Standard protocol for AI-tool communication |
| Paper References | Every calculator cites original research |
๐งช Development Methodology
We employ a human-in-the-loop, AI-augmented workflow to ensure clinical accuracy:
- Domain Specification: Human experts define the target medical specialty or clinical domain.
- AI-Driven Search: AI agents perform comprehensive searches for the latest clinical guidelines and consensus.
- Guideline Extraction: Systematically identify recommended scoring systems and calculations mentioned in those guidelines.
- Source Validation: Trace back to original peer-reviewed primary papers to verify exact formulas and coefficients.
- Implementation: Develop validated calculation tools with precise parameters and evidence-based interpretations.
๐ฌ Research Framework
This project implements a Neuro-Symbolic Framework for reliable medical calculation, combining LLM understanding with validated symbolic computation.
Academic Positioning
| Challenge | Traditional LLM | Our Solution |
|---|---|---|
| Calculation Accuracy | ~50% (MedCalc-Bench) | >95% via validated formulas |
| Parameter Extraction | Vocabulary mismatch | ParamMatcher (60+ aliases) |
| Safety Guardrails | No clinical constraints | BoundaryValidator (PMID-backed) |
| Tool Discovery | Keyword/RAG only | Two-Level Key + Hypergraph |
Strategic Next Step
- Agent Clinical Decision Support Gap & Breakthrough Plan
- Agent Decision Support End-to-End Benchmark
- Benchmark Usage Guide
Three-Module Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ NEURO-SYMBOLIC MEDICAL REASONING โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
โ โ Discovery Engine โ โ โ Reasoning Interfaceโ โ โ Safety Layer โ โ
โ โ (Tool Selection) โ โ (Param Matching) โ โ (Validation) โ โ
โ โ โ โ โ โ โ โ
โ โ โข High/Low Keys โ โ โข Alias Matching โ โ โข Range Check โ โ
โ โ โข Hypergraph โ โ โข Fuzzy Match โ โ โข PMID Citation โ โ
โ โ โข Context-Aware โ โ โข Multi-lingual โ โ โข Error Messages โ โ
โ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Core Contributions
-
Semantic Parameter Mapping (ParamMatcher): Resolves vocabulary mismatch between clinical text and calculator parameters through alias tables, fuzzy matching, and suffix normalization.
-
Literature-Based Guardrails (BoundaryValidator): Validates input values against clinically impossible ranges derived from peer-reviewed literature (17+ parameters with PMID citations).
-
Context-Aware Tool Discovery: Two-level key system + Clinical Knowledge Graph for intelligent tool recommendation based on clinical context.
๐ Levels of Academic Value
| Level | Contribution | Scholarly Focus |
|---|---|---|
| L1 | Validated Symbolic Engine | Extends LLM with deterministic precision |
| L2 | Hierarchical Tool Discovery | Solves RAG precision in high-stakes domains |
| L3 | Robust Semantic Extraction | Resolves the "Vocabulary Mismatch" problem |
| L4 | Knowledge-Gated Safety Layer | Unique: Literature-derived constraint verification |
| L5 | Clinical Hypergraph Agent | Cross-specialty workflow reasoning |
๐ For detailed research roadmap and benchmark strategy, see ROADMAP.md
๐๏ธ Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ infrastructure/mcp/ โ
โ (MCP Server, Handlers, Resources) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ MedicalCalculatorServer โ โ
โ โ โโโ handlers/DiscoveryHandler (discover, list...) โ โ
โ โ โโโ handlers/CalculatorHandler (calculate_*) โ โ
โ โ โโโ resources/CalculatorResourceHandler โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ uses
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ application/ โ
โ (Use Cases, DTOs, Validation) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ DiscoveryUseCase, CalculateUseCase โ โ
โ โ DiscoveryRequest/Response, CalculateRequest/Responseโ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ depends on
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ domain/ โ
โ (Entities, Services, Value Objects) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ BaseCalculator, ToolMetadata, ScoreResult โ โ
โ โ LowLevelKey, HighLevelKey, ToolRegistry โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ ใCore, Zero Dependenciesใ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Key Design Decisions
| Decision | Rationale |
|---|---|
| DDD Onion | Domain logic isolated from infrastructure |
| FastMCP | Native Python MCP SDK, simple decorator-based API |
| Dataclasses | Immutable, type-safe entities |
| Two-Level Keys | Enable both precise lookup and exploratory discovery |
| Layered Validation | 3-layer validation (MCP/Application/Domain) |
Validation Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 1: MCP (Infrastructure) โ
โ โโโ Pydantic + JSON Schema: Type validation โ
โ (Automatic from Annotated[type, Field(description)]) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Layer 2: Application (Use Case) โ
โ โโโ ParamMatcher: Intelligent parameter matching โ
โ โ (Alias, fuzzy, suffix matching with typo tolerance) โ
โ โโโ BoundaryValidator: Clinical range validation โ
โ (Literature-backed warnings for extreme values) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Layer 3: Domain (Calculator) โ
โ โโโ ParameterValidator: Medical logic validation โ
โ (22 parameter specs with valid ranges) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Domain validation module (src/domain/validation/):
rules.py: Base classes (RangeRule, EnumRule, TypeRule, CustomRule)parameter_specs.py: 22 medical parameter specificationsvalidators.py: ParameterValidator withvalidate_params()functionboundaries.py: BoundarySpec with literature-backed clinical ranges
Parameter Matching (src/domain/services/param_matcher.py):
- Alias matching:
crโserum_creatinine,hrโheart_rate - Fuzzy matching:
creatnineโcreatinine(typo tolerance) - Suffix stripping:
creatinine_mg_dlโcreatinine
๐ Quick Start
Prerequisites
- Python 3.11+ (required by MCP SDK)
- uv package manager (recommended) - Install uv
Installation
# Clone repository
git clone https://github.com/u9401066/medical-calc-mcp.git
cd medical-calc-mcp
# Install uv (if not already installed)
# macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
# Sync dependencies (creates .venv automatically)
uv sync
Run MCP Server
# Start MCP server (stdio transport)
uv run python -m src.main
# Or with MCP development inspector
uv run mcp dev src/main.py
OpenClaw Compatibility
This repository is intentionally structured so OpenClaw-style crawlers, MCP registries, and autonomous coding agents can discover it, install it, and operate it safely with minimal guessing.
Discovery Keywords
- MCP server
- medical calculator MCP
- FastMCP
- stdio MCP server
- SSE MCP server
- evidence-based medical scoring
- AI agent clinical tools
- schema-first calculation
- safe retry guidance
Why This Repo Is OpenClaw-Friendly
- Clear canonical workflow:
discover(...) -> get_tool_schema(tool_id) -> calculate(tool_id, params) - Start-here guidance is exposed in multiple MCP surfaces:
- Prompt:
tool_usage_playbook() - Resource:
guide://tool-usage-playbook - Index:
calculator://list
- Prompt:
- Smart resolver handles fuzzy tool ids and specialty names across tools and resources
- Failed calls return retry-friendly fields such as
guidance,suggestions,resolved_value, andparam_template - Supports local
stdioand hostedsse/httptransports
Minimal Install
git clone https://github.com/u9401066/medical-calc-mcp.git
cd medical-calc-mcp
uv sync
uv run python -m src.main
Recommended First Actions for OpenClaw
1. Read resource: guide://tool-usage-playbook
2. Read resource: calculator://list
3. Call tool: discover(by="keyword", value="clinical problem")
4. Call tool: get_tool_schema("tool_id")
5. Call tool: calculate("tool_id", {...})
Example MCP Client Config
{
"mcpServers": {
"medical-calc": {
"command": "uv",
"args": ["run", "python", "-m", "src.main"],
"cwd": "/path/to/medical-calc-mcp"
}
}
}
Hosted Mode for Remote Crawlers / Agents
uv run python -m src.main --mode sse
# or
uv run python -m src.main --mode http
If your OpenClaw deployment ranks repositories by install clarity and MCP readiness, this repo now exposes a direct install path, explicit transport modes, and a schema-first SOP designed to reduce agent misuse.
Configure with VS Code Copilot โญ NEW
The project includes a .vscode/mcp.json configuration file for seamless VS Code Copilot integration.
Automatic Setup:
Simply open this project in VS Code - the MCP server will be auto-discovered!
// .vscode/mcp.json (included in repo)
{
"servers": {
"medical-calc-mcp": {
"type": "stdio",
"command": "uv",
"args": ["run", "python", "-m", "src.main"]
}
}
}
Enable MCP in VS Code:
- Open VS Code Settings (Ctrl+,)
- Search for
chat.mcp - Enable
Chat: Mcp Discovery Enabled - Restart VS Code
Usage:
In GitHub Copilot Chat, use @medical-calc-mcp to access calculators:
@medical-calc-mcp Calculate SOFA score with PaO2/FiO2=200, platelets=80...
Configure with Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"medical-calc": {
"command": "uv",
"args": ["run", "python", "-m", "src.main"],
"cwd": "/path/to/medical-calc-mcp"
}
}
}
๐ Deployment Modes โญ NEW
This project supports multiple deployment modes for different use cases:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Deployment Options โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ REST API โ MCP SSE โ MCP stdio โ
โ (Port 8080) โ (Port 8000) โ (Local) โ
โโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
Any HTTP โ โ
MCP Clients โ โ
Claude Desktop โ
โ client โ (remote) โ โ
VS Code Copilot โ
โ โ
Custom Agent โ โ
Docker/Cloud โ โ
MCP Inspector โ
โ โ
Web Apps โ โ โ
โ โ
Python/JS โ โ โ
โโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Mode | Command | Port | Best For |
|---|---|---|---|
| api | uv run python src/main.py --mode api | 8080 | Custom agents, web apps, scripts |
| sse | uv run python src/main.py --mode sse | 8000 | Remote MCP clients, Docker |
| stdio | uv run python src/main.py --mode stdio | - | Local Claude Desktop, VS Code |
๐ For detailed deployment instructions, see docs/DEPLOYMENT.md
๐ค Agent Integration โญ NEW
Python Agent Example
import requests
class MedicalCalculatorClient:
def __init__(self, base_url: str = "http://localhost:8080"):
self.api_url = f"{base_url}/api/v1"
def search(self, query: str) -> list:
r = requests.get(f"{self.api_url}/search", params={"q": query})
return r.json()
def calculate(self, tool_id: str, params: dict) -> dict:
r = requests.post(f"{self.api_url}/calculate/{tool_id}", json={"params": params})
return r.json()
# Usage
client = MedicalCalculatorClient()
# Search for sepsis calculators
results = client.search("sepsis")
# Calculate SOFA score
result = client.calculate("sofa", {
"pao2_fio2_ratio": 200,
"platelets": 100,
"bilirubin": 2.0,
"gcs_score": 13,
"creatinine": 2.5
})
print(f"SOFA Score: {result['result']['value']}")
LangChain / OpenAI Function Calling
See docs/DEPLOYMENT.md for LangChain and OpenAI integration examples.
Quick API Test
# Start API server
uv run python src/main.py --mode api --port 8080
# Test endpoints
curl http://localhost:8080/health
curl "http://localhost:8080/api/v1/search?q=sepsis"
curl -X POST "http://localhost:8080/api/v1/calculate/gcs" \
-H "Content-Type: application/json" \
-d '{"params": {"eye_response": 4, "verbal_response": 5, "motor_response": 6}}'
๐ณ Docker Deployment โญ NEW
The MCP server can run as a remote SSE (Server-Sent Events) server via Docker, enabling:
- ๐ Remote access from any MCP-compatible client
- โ๏ธ Cloud deployment (AWS, GCP, Azure, etc.)
- ๐ Easy scaling with Docker Compose or Kubernetes
Quick Start with Docker
# Build and run
docker-compose up -d
# Or build manually
docker build -t medical-calc-mcp .
docker run -p 8000:8000 medical-calc-mcp
# Check service is running
curl -sf http://localhost:8000/sse -o /dev/null && echo "OK"
Transport Modes
| Mode | Use Case | Port | Command |
|---|---|---|---|
stdio | Local Claude Desktop | - | uv run python -m src.main |
sse | Remote MCP (Docker/Cloud) | 8000 | uv run python -m src.main --mode sse |
http | Streamable HTTP transport | 8000 | uv run python -m src.main --mode http |
โ ๏ธ Important: SSE/HTTP modes bind to
0.0.0.0by default for remote access.
Quick Start Commands
# 1. STDIO Mode - For Claude Desktop (local)
uv run python -m src.main
# 2. SSE Mode - For remote agents (Docker/Cloud)
uv run python -m src.main --mode sse
uv run python -m src.main --mode sse --host 0.0.0.0 --port 9000 # Custom port
# 3. HTTP Mode - Streamable HTTP transport
uv run python -m src.main --mode http
Remote MCP Client Configuration
Claude Desktop (Remote SSE):
{
"mcpServers": {
"medical-calc": {
"url": "http://localhost:8000/sse"
}
}
}
For cloud deployment, replace localhost with your server address:
{
"mcpServers": {
"medical-calc": {
"url": "https://your-server.example.com/sse"
}
}
}
API Endpoints
โ ๏ธ FastMCP SSE mode only provides these endpoints:
| Endpoint | Method | Description |
|---|---|---|
/sse | GET | SSE connection endpoint |
/messages/ | POST | MCP message endpoint |
Environment Variables
| Variable | Default | Description |
|---|---|---|
MCP_MODE | stdio | Transport mode (stdio, sse, http) |
MCP_HOST | 0.0.0.0 | Host to bind |
MCP_PORT | 8000 | Port to bind |
LOG_LEVEL | INFO | Logging level |
DEBUG | false | Enable debug mode |
Docker Compose Example
version: '3.8'
services:
# MCP Server (SSE mode)
medical-calc-mcp:
build: .
ports:
- "8000:8000"
environment:
- MCP_MODE=sse
# REST API Server (FastAPI)
medical-calc-api:
build: .
ports:
- "8080:8080"
command: ["python", "src/main.py", "--mode", "api", "--port", "8080"]
๐ HTTPS Deployment โญ NEW
Enable HTTPS for secure communication in production environments with flexible certificate configuration.
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTPS Deployment โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโโโโ โ
โ โ Client โ โ
โ โ (Browser/ โ โ
โ โ AI Agent) โ โ
โ โโโโโโโโฌโโโโโโโ โ
โ โ HTTPS (TLS 1.2/1.3) โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Nginx Reverse Proxy โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ โข TLS Termination (SSL Certificates) โ โ โ
โ โ โ โข Rate Limiting (30/60 req/s) โ โ โ
โ โ โ โข Security Headers (XSS, CSRF protection) โ โ โ
โ โ โ โข SSE Optimization (long-lived connections) โ โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ โ
โ โ HTTP (internal) โ HTTP (internal) โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ MCP SSE Server โ โ REST API Server โ โ
โ โ (Port 8000) โ โ (Port 8080) โ โ
โ โ โ โ โ โ
โ โ โข /sse โ โ โข /api/v1/* โ โ
โ โ โข /messages โ โ โข /docs (Swagger) โ โ
โ โ โข /health โ โ โข /health โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
External Endpoints (HTTPS):
โโโ https://localhost/ โ MCP SSE (via Nginx :443)
โโโ https://localhost/sse โ SSE Connection
โโโ https://localhost:8443/ โ REST API (via Nginx :8443)
โโโ https://localhost:8443/docs โ Swagger UI
Internal (HTTP, Docker network only):
โโโ http://medical-calc-mcp:8000 โ MCP Server
โโโ http://medical-calc-api:8080 โ API Server
SSL Environment Variables
| Variable | Default | Description |
|---|---|---|
SSL_ENABLED | false | Enable SSL/TLS (true/false) |
SSL_KEYFILE | - | Path to SSL private key file |
SSL_CERTFILE | - | Path to SSL certificate file |
SSL_CA_CERTS | - | Path to CA certificates (optional) |
SSL_DIR | ./nginx/ssl | SSL cert directory (Docker only) |
Option 1: Docker Deployment (Recommended)
Best for production and team environments.
# Step 1: Generate SSL certificates
chmod +x scripts/generate-ssl-certs.sh
./scripts/generate-ssl-certs.sh
# Step 2: Start HTTPS services
./scripts/start-https-docker.sh up
# Other commands
./scripts/start-https-docker.sh down # Stop services
./scripts/start-https-docker.sh logs # View logs
./scripts/start-https-docker.sh restart # Restart
./scripts/start-https-docker.sh status # Check status
Custom Certificates (Docker):
# Use custom certificate directory
SSL_DIR=/path/to/your/certs docker-compose -f docker-compose.https.yml up -d
# Use Let's Encrypt certificates
SSL_DIR=/etc/letsencrypt/live/example.com docker-compose -f docker-compose.https.yml up -d
Endpoints:
| Service | URL | Description |
|---|---|---|
| MCP SSE | https://localhost/ | MCP Server-Sent Events |
| MCP SSE | https://localhost/sse | SSE connection |
| REST API | https://localhost:8443/ | REST API root |
| Swagger UI | https://localhost:8443/docs | API documentation |
| Health | https://localhost/health | MCP health check |
| Health | https://localhost:8443/health | API health check |
Option 2: Local Development (No Docker)
Uses Python/Uvicorn native SSL support for quick local testing.
# Step 1: Generate SSL certificates (or use your own)
./scripts/generate-ssl-certs.sh
# Step 2: Start HTTPS services
./scripts/start-https-local.sh # Start both MCP and API
./scripts/start-https-local.sh sse # Start MCP SSE only
./scripts/start-https-local.sh api # Start REST API only
Custom Certificates (Local):
# Use custom certificate paths via environment variables
SSL_KEYFILE=/path/to/server.key \
SSL_CERTFILE=/path/to/server.crt \
./scripts/start-https-local.sh
# Custom ports
SSL_KEYFILE=/certs/key.pem SSL_CERTFILE=/certs/cert.pem \
MCP_PORT=9000 API_PORT=9001 \
./scripts/start-https-local.sh
# Direct command with CLI arguments
python -m src.main --mode sse --port 8443 \
--ssl-keyfile /path/to/server.key \
--ssl-certfile /path/to/server.crt
Endpoints:
| Service | URL | Description |
|---|---|---|
| MCP SSE | https://localhost:8443/ | MCP Server-Sent Events |
| REST API | https://localhost:9443/ | REST API |
| Swagger UI | https://localhost:9443/docs | API documentation |
Option 3: Production with Let's Encrypt
For real domain names with free trusted certificates.
# 1. Edit nginx/nginx.conf, uncomment these lines:
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# 2. Use certbot to obtain certificates:
sudo certbot certonly --webroot -w /var/www/certbot \
-d your-domain.com -d api.your-domain.com
# 3. Start services with Let's Encrypt certs
SSL_DIR=/etc/letsencrypt/live/your-domain.com \
docker-compose -f docker-compose.https.yml up -d
Trust Self-Signed Certificates
To avoid browser warnings during development:
Linux (Ubuntu/Debian):
sudo cp nginx/ssl/ca.crt /usr/local/share/ca-certificates/medical-calc-dev.crt
sudo update-ca-certificates
macOS:
sudo security add-trusted-cert -d -r trustRoot \
-k /Library/Keychains/System.keychain nginx/ssl/ca.crt
Windows:
1. Double-click nginx/ssl/ca.crt
2. Install Certificate โ Local Machine
3. Place in "Trusted Root Certification Authorities"
Claude Desktop Configuration (HTTPS)
{
"mcpServers": {
"medical-calc": {
"url": "https://localhost/sse"
}
}
}
For production with a real domain:
{
"mcpServers": {
"medical-calc": {
"url": "https://mcp.your-domain.com/sse"
}
}
}
Files Overview
| File | Description |
|---|---|
nginx/nginx.conf | Nginx configuration with TLS, rate limiting, SSE optimization |
docker-compose.https.yml | Docker Compose for HTTPS deployment |
scripts/generate-ssl-certs.sh | Generate self-signed SSL certificates |
scripts/start-https-docker.sh | Start/stop Docker HTTPS services |
scripts/start-https-local.sh | Start local HTTPS (supports custom certs) |
src/infrastructure/mcp/config.py | SslConfig class for SSL configuration |
SSL Configuration Reference
| Scenario | Cert Location | Configuration Method |
|---|---|---|
| Docker (default) | nginx/ssl/ | No config needed |
| Docker (custom) | Custom path | SSL_DIR env var or volumes |
| Docker (Let's Encrypt) | /etc/letsencrypt/... | Modify nginx/nginx.conf |
| Local (default) | nginx/ssl/ | No config needed |
| Local (custom) | Custom path | SSL_KEYFILE + SSL_CERTFILE env vars |
| CLI direct | Custom path | --ssl-keyfile + --ssl-certfile args |
Troubleshooting
Certificate not trusted:
# Regenerate certificates
rm -rf nginx/ssl/*
./scripts/generate-ssl-certs.sh
# Then re-add to system trust store (see above)
Port already in use:
# Check what's using the port
sudo lsof -i :443
sudo lsof -i :8443
# Kill the process or use different ports
Docker container not starting:
# Check logs
docker-compose -f docker-compose.https.yml logs nginx
docker-compose -f docker-compose.https.yml logs medical-calc-mcp
# Rebuild
docker-compose -f docker-compose.https.yml up -d --build
SSE connection timeout:
# Nginx is configured for 24h timeout, but if issues persist:
# Check nginx/nginx.conf has these settings:
proxy_read_timeout 24h;
proxy_send_timeout 24h;
proxy_buffering off;
๐ REST API โญ NEW
Besides MCP protocol, the server also provides a standalone REST API for direct HTTP access.
Quick Start
# Start API server
uv run python src/main.py --mode api --port 8080
# With uvicorn (production)
uv run uvicorn src.infrastructure.api.server:app --host 0.0.0.0 --port 8080
API Documentation
Once running, visit:
- Swagger UI: http://localhost:8080/docs
- ReDoc: http://localhost:8080/redoc
- OpenAPI JSON: http://localhost:8080/openapi.json
REST API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/health | GET | Health check |
/api/v1/calculators | GET | List all calculators |
/api/v1/calculators/{tool_id} | GET | Get calculator info |
/api/v1/search?q={keyword} | GET | Search calculators |
/api/v1/specialties | GET | List specialties |
/api/v1/specialties/{specialty} | GET | List by specialty |
/api/v1/calculate/{tool_id} | POST | Execute calculation |
Example: Calculate CKD-EPI
# Using curl
curl -X POST "http://localhost:8080/api/v1/calculate/ckd_epi_2021" \
-H "Content-Type: application/json" \
-d '{"params": {"serum_creatinine": 1.2, "age": 65, "sex": "female"}}'
Response:
{
"success": true,
"calculator": "ckd_epi_2021",
"result": {
"score_name": "CKD-EPI 2021",
"value": 49.2,
"unit": "mL/min/1.73mยฒ",
"interpretation": {
"summary": "G3a: Mildly to moderately decreased",
"severity": "moderate"
}
}
}
Quick Calculate Endpoints
Some calculators have dedicated endpoints with query parameters:
# CKD-EPI (Query parameters)
curl "http://localhost:8080/api/v1/ckd-epi?serum_creatinine=1.2&age=65&sex=female"
# SOFA Score
curl -X POST "http://localhost:8080/api/v1/sofa?pao2_fio2_ratio=200&platelets=100&bilirubin=2.0&cardiovascular=dopamine_lte_5&gcs_score=13&creatinine=2.5"
๐ Security โญ NEW
Security Features
This project implements multiple security layers:
| Layer | Feature | Description |
|---|---|---|
| HTTPS | TLS 1.2/1.3 encryption | All traffic encrypted via Nginx |
| Input Validation | 3-layer validation | Pydantic โ ParameterValidator โ Domain rules |
| CORS | Configurable origins | Environment variable controlled |
| Rate Limiting | Nginx + Application level | Dual-layer protection (optional) |
| API Authentication | Optional API Key | Disabled by default, enable via env |
| Security Headers | XSS/CSRF protection | X-Frame-Options, X-Content-Type-Options |
| Dependencies | Vulnerability scanning | pip-audit integrated |
| No Database | In-memory only | No SQL injection risk |
| No Secrets | Stateless | No credentials stored |
๐ For detailed HTTPS deployment instructions, see HTTPS Deployment.
๐ Optional Security Features
All optional security features are DISABLED by default. Enable via environment variables:
Rate Limiting (Application Level)
# Enable rate limiting
SECURITY_RATE_LIMIT_ENABLED=true # Default: false
SECURITY_RATE_LIMIT_RPM=60 # Requests per minute (default: 60)
SECURITY_RATE_LIMIT_BURST=10 # Burst size (default: 10)
SECURITY_RATE_LIMIT_BY_IP=true # Per-IP rate limiting (default: true)
API Key Authentication
# Enable API authentication
SECURITY_AUTH_ENABLED=true # Default: false
SECURITY_API_KEYS=key1,key2,key3 # Comma-separated API keys (min 8 chars each)
SECURITY_AUTH_HEADER=X-API-Key # Header name (default: X-API-Key)
SECURITY_AUTH_PARAM=api_key # Query param name (default: api_key)
Usage Example:
# With header
curl -H "X-API-Key: your-api-key" http://localhost:8000/sse
# With query parameter
curl "http://localhost:8000/sse?api_key=your-api-key"
# With Bearer token
curl -H "Authorization: Bearer your-api-key" http://localhost:8000/sse
Security Scenarios
| Scenario | Rate Limit | Auth | Configuration |
|---|---|---|---|
| Local Development | โ Off | โ Off | Default (no env vars) |
| Internal Network | โ On | โ Off | SECURITY_RATE_LIMIT_ENABLED=true |
| Public API | โ On | โ On | Both enabled + API keys |
Configuration
CORS Configuration:
# Development (default) - Allow all origins
CORS_ORIGINS="*"
# Production - Restrict to specific domains
CORS_ORIGINS="https://your-app.com,https://api.your-app.com"
Other Security Settings:
# API Server
API_HOST=0.0.0.0 # Use 127.0.0.1 for local only
API_PORT=8080
# MCP Server
MCP_HOST=0.0.0.0 # Use 127.0.0.1 for local only
MCP_PORT=8000
Production Recommendations
| Item | Recommendation |
|---|---|
| HTTPS | โ Use provided Nginx + SSL config |
| CORS | Set specific CORS_ORIGINS |
| Rate Limiting | โ Enable application-level rate limiting |
| Authentication | โ Enable API key authentication |
| Network | Run in private network/VPC |
| Certificates | Use Let's Encrypt for production |
| Monitoring | Enable access logging |
Dependency Security
# Check for known vulnerabilities
uv run pip-audit --strict
# Upgrade all packages
uv sync --upgrade
# Lock dependencies
uv lock
Security Audit Results (2025-06)
โ Passed Checks:
- No SQL/Command injection vulnerabilities
- No hardcoded secrets or credentials
- No sensitive data exposure in error messages
- Input validation at all layers
- Dependencies updated (no known CVEs)
โ ๏ธ Notes:
- Default CORS is permissive (
*) - configure for production - No built-in authentication - add at infrastructure layer if needed
- Medical calculations are for reference only - not for clinical decisions
๐ Tool Discovery
The Two-Level Key System combined with Tool Relation Graph is the core innovation of this project:
Discovery Philosophy
When an AI agent needs a medical calculator, it uses Unified Discovery:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ discover() - Unified Entry Point (v3.0) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Path A: Explore All Categories โ
โ โ discover() โ {specialties: [...], contexts: [...]} โ
โ โก discover(by="specialty", value="critical_care") โ
โ โข get_tool_schema("sofa_score") โ params, references โ
โ โฃ calculate("sofa_score", {...params}) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Path B: Context-based โ
โ โ discover(by="context", value="preoperative_assessment") โ
โ โก get_tool_schema("rcri") โ params, param_sources โ
โ โข calculate("rcri", {...params}) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Path C: Keyword Search โ
โ โ discover(by="keyword", value="sepsis") โ
โ โก get_tool_schema("qsofa_score") โ
โ โข calculate("qsofa_score", {...params}) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Path D: Graph-based Discovery โ
โ โ get_related_tools("sofa_score") โ [qsofa, apache_ii...] โ
โ โก find_tools_by_params(["creatinine", "age"]) โ [tools...] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Every step returns next_step hints, so the Agent never gets lost!
Tool Relation Graph (Hypergraph)
The ToolRelationGraph connects tools based on:
| Relation Type | Weight | Example |
|---|---|---|
SHARED_PARAM | 0.2 | SOFA โ APACHE II (both use creatinine) |
SAME_SPECIALTY | 0.3 | SOFA โ qSOFA (both Critical Care) |
SAME_CONTEXT | 0.2 | RCRI โ ASA (both Preoperative Assessment) |
# Find related tools via graph traversal
get_related_tools("sofa_score")
# โ [{"tool_id": "qsofa_score", "similarity": 0.85},
# {"tool_id": "apache_ii", "similarity": 0.72}, ...]
# Reverse lookup: "I have these values, what can I calculate?"
find_tools_by_params(["creatinine", "bilirubin", "inr"])
# โ [meld_score, child_pugh, ...]
Unified Calculate Interface (v2.0)
Instead of 75+ individual calculator tools, we provide a single unified calculate() tool:
# Old approach (deprecated):
# calculate_sofa(pao2_fio2=300, platelets=150, ...)
# New approach (v2.0):
calculate(
tool_id="sofa_score",
params={
"pao2_fio2_ratio": 300,
"platelets": 150,
"bilirubin": 1.2,
# ... other params
}
)
Benefits:
- ๐ฏ Token Efficient: Only 6 tools instead of 75+ in context
- ๐ Discovery First: Use discover() to find the right calculator
- ๐ Self-Documenting:
get_tool_schema()shows exact params needed
Low Level Key (Precise Selection)
For precise tool selection when you know exactly what you need:
LowLevelKey(
tool_id="ckd_epi_2021", # Unique identifier
name="CKD-EPI 2021", # Human-readable name
purpose="Calculate eGFR", # What it does
input_params=["age", "sex", "creatinine"], # Required inputs
output_type="eGFR with CKD staging" # Output format
)
High Level Key (Intelligent Discovery)
For intelligent discovery when exploring options:
HighLevelKey(
specialties=(Specialty.NEPHROLOGY, Specialty.INTERNAL_MEDICINE),
conditions=("chronic kidney disease", "CKD", "renal impairment"),
clinical_contexts=(ClinicalContext.STAGING, ClinicalContext.DRUG_DOSING),
clinical_questions=(
"What is the patient's kidney function?",
"Should I adjust drug dosage for renal function?",
),
icd10_codes=("N18", "N19"),
keywords=("eGFR", "GFR", "creatinine", "kidney function")
)
๐ Key Feature: Multi-Specialty Tools
One tool can belong to multiple High Level categories!
Example: SOFA Score belongs to:
| Category | Values |
|---|---|
| Specialties | Critical Care, Emergency Medicine, Internal Medicine, Pulmonology |
| Conditions | Sepsis, Septic Shock, Organ Dysfunction, MODS |
| Contexts | Severity Assessment, Prognosis, ICU Management, Diagnosis |
This means:
- Search "sepsis" โ Returns SOFA, qSOFA, NEWS, ...
- Search "critical care" โ Returns SOFA, APACHE II, RASS, GCS, CAM-ICU, ...
- Search "organ dysfunction" โ Returns SOFA, ...
Consolidated MCP Tools (v3.0)
| Layer | Tool | Purpose |
|---|---|---|
| High-Level | discover(by, value, limit) | Unified discovery (specialty/context/keyword/all) |
| High-Level | get_related_tools(tool_id) | Graph-based related tool discovery |
| High-Level | find_tools_by_params(params) | Reverse lookup by available parameters |
| Low-Level | get_tool_schema(tool_id) | Full metadata + param schemas + references |
| Low-Level | calculate(tool_id, params) | Execute single calculation |
| Low-Level | calculate_batch(calculations) | Batch calculations with cross-analysis |
Total: 6 tools (consolidated from 12 in v2.0)
Example: AI Agent Workflow
User: "I need to assess this patient's cardiac risk before surgery"
# Step 1: Agent uses hierarchical navigation
Agent: list_contexts()
โ Returns: [..., "preoperative_assessment", ...]
โ next_step: "list_by_context('preoperative_assessment')"
# Step 2: Filter by context
Agent: list_by_context("preoperative_assessment")
โ Returns: [rcri, asa_physical_status, mallampati_score, ...]
โ next_step: "get_calculator_info('rcri')"
# Step 3: Get tool details
Agent: get_calculator_info("rcri")
โ Returns: Full metadata with input params, references
โ next_step: "calculate_rcri(...)"
# Step 4: Calculate
Agent: calculate_rcri(high_risk_surgery=True, ischemic_heart_disease=True, ...)
โ Returns: Score, risk percentage, recommendations
Example: ICU Sepsis Workup
User: "Evaluate this ICU patient for sepsis"
Agent: search_calculators("sepsis")
โ Returns: SOFA, qSOFA, NEWS2, APACHE II
# Per Sepsis-3 guidelines:
Agent: calculate_qsofa(respiratory_rate=24, systolic_bp=95, altered_mentation=True)
โ qSOFA = 3 (High risk, prompt evaluation needed)
Agent: calculate_sofa(pao2_fio2_ratio=200, platelets=80, bilirubin=2.5, ...)
โ SOFA = 8 (Sepsis confirmed if infection suspected, โฅ2 point increase)
๐ง Available Tools
Quality Snapshot: 2095 collected tests | 287 PMIDs | 245 DOIs | 100% citation coverage
๐ Quick Navigation
This README no longer carries a hand-maintained calculator inventory. The same generated source now feeds repository docs and MkDocs pages.
Registry Snapshot: 152 calculators across 31 specialties
- Full calculator catalog
- Traditional Chinese catalog
- Website calculator catalog
- ็ถฒ็ซ็็นไธญ็ธฝ่ฆฝ
- Regenerate locally with
uv run python scripts/generate_tool_catalog_docs.py
| Specialty | Tools |
|---|---|
| Critical Care | 18 |
| Geriatrics | 13 |
| Cardiology | 11 |
| Anesthesiology | 9 |
| Emergency Medicine | 9 |
| Psychiatry | 9 |
You can still inspect the live registry via python scripts/count_tools.py, calculator://list, or list_calculators() from your MCP client.
Generated calculator catalog
The full tool inventory and specialty summary are generated directly from the registry to remove README drift risk.
- Full calculator catalog
- Traditional Chinese catalog
- Regenerate locally with
uv run python scripts/generate_tool_catalog_docs.py
๐ Discovery Tools
Step 1: Entry Points
| Tool | Description |
|---|---|
list_specialties() | ๐ List available specialties (returns next_step) |
list_contexts() | ๐ List available clinical contexts (returns next_step) |
list_calculators() | ๐ List all registered calculators |
Step 2: Filter by Category
| Tool | Description |
|---|---|
list_by_specialty(specialty) | Filter tools by medical specialty |
list_by_context(context) | Filter tools by clinical context |
search_calculators(keyword) | ๐ Quick keyword search |
Step 3: Get Details
| Tool | Description |
|---|---|
get_calculator_info(tool_id) | ๐ Get params, references, examples |
Step 4: Execute Calculation
| Tool | Description |
|---|---|
calculate(tool_id, params) | ๐งฎ Unified calculator (supports all 75+ calculators) |
๐ฆ Resources
| Resource URI | Description |
|---|---|
calculator://list | Markdown list of all calculators |
calculator://{tool_id}/references | Paper references for a calculator |
calculator://{tool_id}/parameters | Input parameter definitions |
calculator://{tool_id}/info | Full calculator metadata |
๐ Prompts
Prompts provide guided multi-tool workflows for common clinical scenarios:
| Prompt | Description |
|---|---|
sepsis_evaluation | qSOFA โ SOFA โ RASS โ CAM-ICU workflow |
preoperative_risk_assessment | ASA โ RCRI โ Mallampati workflow |
icu_daily_assessment | RASS โ CAM-ICU โ GCS โ SOFA daily rounds |
pediatric_drug_dosing | Weight-based dosing + MABL + transfusion |
acute_kidney_injury_assessment | CKD-EPI + AKI staging workflow |
Usage:
# In MCP client, request a prompt:
prompt: sepsis_evaluation
โ Returns structured workflow with step-by-step guidance
๐ Usage Examples
Python Examples โญ NEW
The project includes ready-to-run example scripts in the examples/ folder:
# Basic usage examples
uv run python examples/basic_usage.py
# Clinical workflow examples
uv run python examples/clinical_workflows.py
Available Examples:
| File | Description |
|---|---|
basic_usage.py | Individual calculator usage (CKD-EPI, SOFA, RCRI, CHAโDSโ-VASc, Wells PE) |
clinical_workflows.py | Multi-calculator clinical scenarios (Sepsis, Preop, Chest Pain, AF) |
Example 1: CKD-EPI 2021 (eGFR)
Input:
{
"serum_creatinine": 1.2,
"age": 65,
"sex": "female"
}
Output:
{
"score_name": "CKD-EPI 2021",
"result": 67.1,
"unit": "mL/min/1.73mยฒ",
"interpretation": {
"summary": "Mildly decreased kidney function (G2)",
"stage": "G2",
"recommendation": "Monitor kidney function annually; adjust renally-excreted drugs"
},
"references": [{
"citation": "Inker LA, et al. N Engl J Med. 2021;385(19):1737-1749.",
"doi": "10.1056/NEJMoa2102953"
}]
}
Example 2: Tool Discovery
Query: search_calculators("airway")
Output:
{
"keyword": "airway",
"count": 1,
"tools": [{
"tool_id": "mallampati_score",
"name": "Modified Mallampati Classification",
"purpose": "Predict difficult intubation based on oropharyngeal visualization",
"specialties": ["anesthesiology", "emergency_medicine"],
"input_params": ["mallampati_class"]
}]
}
Example 3: RCRI Cardiac Risk
Input:
{
"high_risk_surgery": true,
"ischemic_heart_disease": true,
"heart_failure": false,
"cerebrovascular_disease": false,
"insulin_diabetes": true,
"creatinine_above_2": false
}
Output:
{
"score_name": "Revised Cardiac Risk Index",
"result": 3,
"interpretation": {
"summary": "RCRI Class III - Elevated cardiac risk",
"risk_percentage": "6.6%",
"recommendation": "Consider cardiology consultation; optimize medical therapy"
}
}
๐ References
All calculators cite original peer-reviewed research. See references/README.md for complete citations.
๐ Guideline Mapping
We systematically map our calculators to clinical guidelines:
We systematically map our calculators to major clinical guideline reviews, and this overview is generated from the same source used by the docs and website.
Tracked coverage: 65/65 recommended tools across 16 domains.
- Generated guideline coverage summary
- Website guideline coverage page
- 2023-2025 detailed guideline review
- 2020-2025 historical guideline review
| Domain | Implemented | Total | Coverage |
|---|---|---|---|
| Sepsis / Critical Care | 9 | 9 | 100% |
| Cardiovascular | 9 | 9 | 100% |
| GI Bleeding | 3 | 3 | 100% |
| Liver Disease | 6 | 6 | 100% |
| Kidney Disease | 2 | 2 | 100% |
| Respiratory / Pneumonia | 5 | 5 | 100% |
| Thromboembolism | 4 | 4 | 100% |
| Neurology | 7 | 7 | 100% |
| Anesthesiology | 6 | 6 | 100% |
| Trauma | 4 | 4 | 100% |
| Burns | 2 | 2 | 100% |
| Pediatrics | 2 | 2 | 100% |
| Oncology | 2 | 2 | 100% |
| Nutrition | 2 | 2 | 100% |
| Rheumatology | 1 | 1 | 100% |
| Osteoporosis | 1 | 1 | 100% |
Citation Format
We use Vancouver style citations:
Inker LA, Eneanya ND, Coresh J, et al. New Creatinine- and Cystatin C-Based
Equations to Estimate GFR without Race. N Engl J Med. 2021;385(19):1737-1749.
doi:10.1056/NEJMoa2102953
๐จโ๐ป Development
Project Status
| Phase | Status | Description |
|---|---|---|
| Modernization | โ Complete | Migrated to uv, 100% mypy --strict coverage, ruff integration |
| Phase 1-8 | โ Complete | Foundation, 78 Calculators, MCP Integration, Validation Layer |
| Phase 13 | โ Complete | Additional Clinical Tools (ABCD2, mRS, TIMI STEMI, Rockall, FIB-4) |
| Phase 17-18 | โ Complete | Obstetrics (Bishop, Ballard), Trauma (ISS, TBSA, Parkland) |
Quick Start (Developer)
# 1. Install uv (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. Setup environment and install dependencies
uv sync
# CI-parity install using the lock file
uv sync --frozen --extra dev --group dev
# 3. Run tests
uv run pytest
# 4. Run MCP server in dev mode
uv run mcp dev src/main.py
๐งช Testing
Testing Strategy
We maintain a high-quality codebase with 2,019 collected tests and automated coverage reporting in CI.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Testing Pyramid โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ E2E Tests (MCP Protocol) โ
โ (700+ tests covering all tools) โ
โ โฑ โฒ โ
โ Integration Tests MCP Inspector โ
โ (Use Cases + Registry) (Manual Testing) โ
โ โฑ โฒ โ
โ Unit Tests (Domain) Validation Tests โ
โ (940+ tests for logic) (Parameter constraints) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Running Tests
# Run all tests
uv run pytest
# Run with coverage
uv run pytest --cov=src --cov-report=html
# Run specific layer tests
uv run pytest tests/test_acid_base.py -v
# Run with verbose output
uv run pytest -v --tb=short
Type Safety
The project enforces strict type checking across the entire codebase.
# Run strict type check
uv run mypy --no-incremental --strict src tests
# Run linter
uv run ruff check src tests
# Auto-fix linting issues
uv run ruff check --fix src tests
API Contract
The REST API OpenAPI contract is tracked as a generated artifact so schema drift is caught in CI before downstream clients break.
# Refresh the generated OpenAPI snapshot
uv run python scripts/generate_openapi_spec.py
# Refresh the generated REST API reference
uv run python scripts/generate_rest_api_docs.py
# Verify generated docs and API contract are current
uv run python scripts/check_project_consistency.py --check-tests
Dependency upgrade policy is documented in docs/DEPENDENCY_UPGRADE_PLAYBOOK.md.
CI/CD Pipeline
The project uses GitHub Actions for continuous integration with the following features:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Push to develop โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ auto-fix: โ
โ โข ruff check --fix (auto-fix linting) โ
โ โข ruff format (auto-format code) โ
โ โข uv lock (update dependency lock) โ
โ โข Auto-commit back to develop [skip ci] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ test (3.11, 3.12, 3.13) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข ruff check (lint) โ
โ โข ruff format --check (format check) โ
โ โข mypy (type check) โ
โ โข pytest (tests + coverage โฅ90%) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ (main only)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ docker + release โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โข Build & test Docker image (/health endpoint) โ
โ โข Auto-create GitHub Release when version changes โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| Feature | Description |
|---|---|
| Auto-fix on develop | Automatically fix linting/formatting issues |
| Multi-Python testing | Tests on Python 3.11, 3.12, 3.13 |
| Docker health check | Uses /health endpoint for liveness probes |
| Auto-release | Creates GitHub Release when pyproject.toml version changes |
| Concurrency control | Cancels in-progress runs for same branch |
๐ ๏ธ Requirements
- Python 3.11+
- uv - Fast Python package manager (required)
- MCP SDK (FastMCP) - Installed automatically via
uv sync
Roadmap
๐ See Full Roadmap โ for detailed implementation plans
2025 Q4 (Current) 2026 Q1 2026 Q2
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Phase 8: โ
Complete Phase 9-10: Acid-Base/Cardio Phase 11-14: Complete
โโโ โ
HAS-BLED (2024 ESC) โโโ Anion Gap, Delta Ratio โโโ Resp/Oxygenation
โโโ โ
Child-Pugh โโโ Corrected QT, Shock Index โโโ Neuro/Sedation
โโโ โ
KDIGO AKI โโโ A-a Gradient, IBW โโโ Infectious Disease
โโโ Common Utilities
Phase 9: โ
Complete
โโโ โ
Anion Gap
โโโ โ
Delta Ratio
โโโ โ
Corrected Sodium
โโโ โ
Winter's Formula
โโโ โ
Osmolar Gap
โโโ โ
Free Water Deficit
Recently Added Calculators (Phase 13 Complete โ )
| Priority | Tool ID | Name | Status | Reference |
|---|---|---|---|---|
| โ Done | abcd2 | ABCD2 Score | Complete | Johnston 2007 |
| โ Done | modified_rankin_scale | Modified Rankin Scale (mRS) | Complete | van Swieten 1988 |
| โ Done | timi_stemi | TIMI STEMI Risk Score | Complete | Morrow 2000 |
| โ Done | rockall_score | Rockall Score | Complete | Rockall 1996 |
| โ Done | fib4_index | FIB-4 Index | Complete | Sterling 2006 |
๐ License
Apache 2.0 - See LICENSE
๐ Acknowledgments
- Model Context Protocol - Anthropic's open protocol for AI-tool communication
- FastMCP - Python SDK for MCP
- Original authors of all cited medical calculators and scoring systems