Modular API for medical calculations and scores developed with FastAPI, originally designed for Nobra, our AI research agent for medical doctors.
π Try it now at: https://calculator.nobra.app.br/docs
- Free tier: 10 requests per second
- Commercial use: Contact us at daniel@nobregamedtech.com.br for higher limits
- Self-hosted: Deploy locally using the instructions below
Nobra Calculator is a scalable REST API that allows the calculation of various medical scores and indices. Originally developed as part of the Nobra ecosystem at Nobrega MedTech, we've decided to open-source this powerful tool to benefit the global medical community.
Our company specializes in AI solutions for healthcare, focusing on academic support and medical decision-making tools. This calculator represents our commitment to advancing evidence-based medicine through technology.
- Modular: Specialty-organized structure for easy addition of new medical scores
- Scalable: Clean architecture designed for growth
- Documented: Automatic documentation with Swagger/OpenAPI
- Validated: Robust parameter validation with Pydantic
- Interpreted: Returns not only the result but also the clinical interpretation
- Python 3.8+
- pip
- Clone the repository:
git clone https://github.com/danielxmed/nobra_calculator.git
cd nobra_calculator- Create a virtual environment:
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate- Install dependencies:
pip install -r requirements.txt- Run the API:
python main.pyThe API will be available at http://localhost:8000
- Swagger UI: https://calculator.nobra.app.br/docs
- ReDoc: https://calculator.nobra.app.br/redoc
- Health Check: https://calculator.nobra.app.br/health
- Swagger UI:
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc - Health Check:
http://localhost:8000/health
GET /api/scores- Lists all available scoresGET /api/scores/{score_id}- Metadata for a specific scoreGET /api/categories- Lists medical categoriesPOST /api/reload- Reloads scores and calculators
Each score also has its dedicated endpoint:
POST /ckd_epi_2021- CKD-EPI 2021POST /cha2ds2_vasc- CHAβDSβ-VASc ...
GET /health- API health checkGET /- API information
nobra_calculator/
βββ app/
β βββ models/
β β βββ shared.py # Common models and enums
β β βββ scores/ # Score models by specialty
β β βββ cardiology/
β β βββ nephrology/
β β βββ pulmonology/
β β βββ ...
β βββ routers/
β β βββ scores.py # Main router with common endpoints
β β βββ scores/ # Score endpoints by specialty
β β βββ cardiology/
β β βββ nephrology/
β β βββ ...
β βββ services/ # Business Logic
βββ calculators/ # Calculation Modules
βββ scores/ # Score Metadata (JSON)
βββ main.py # Main application
βββ requirements.txt # Dependencies
To add a new score:
Create /scores/{score_id}.json with the score metadata:
{
"id": "new_score",
"title": "Score Title",
"description": "Detailed description",
"category": "medical_specialty",
"parameters": [...],
"result": {...},
"interpretation": {...}
}Create /calculators/{score_id}.py:
def calculate_new_score(param1, param2):
# Calculation logic
result = ...
return {
"result": result,
"unit": "unit",
"interpretation": "interpretation"
}Create /app/models/scores/{specialty}/{score_id}.py:
from pydantic import BaseModel, Field
class NewScoreRequest(BaseModel):
"""Request model for New Score"""
param1: str = Field(..., description="Parameter 1")
param2: float = Field(..., description="Parameter 2")
class NewScoreResponse(BaseModel):
"""Response model for New Score"""
result: float = Field(..., description="Calculation result")
unit: str = Field(..., description="Result unit")
interpretation: str = Field(..., description="Clinical interpretation")Create /app/routers/scores/{specialty}/{score_id}.py:
from fastapi import APIRouter, HTTPException
from app.models.scores.{specialty}.{score_id} import NewScoreRequest, NewScoreResponse
from app.services.calculator_service import calculator_service
router = APIRouter()
@router.post("/new_score", response_model=NewScoreResponse)
async def calculate_new_score(request: NewScoreRequest):
"""Calculate New Score"""
try:
result = calculator_service.calculate_score("new_score", request.dict())
return NewScoreResponse(**result)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))- Add imports to
/app/models/scores/{specialty}/__init__.py - Add router to
/app/routers/scores/{specialty}/__init__.py
curl -X POST http://localhost:8000/api/reload# Health check
curl http://localhost:8000/health
# List scores
curl http://localhost:8000/api/scores
# Calculate CKD-EPI 2021 (Live API)
curl -X POST https://calculator.nobra.app.br/ckd_epi_2021 \
-H "Content-Type: application/json" \
-d '{"sex": "female", "age": 65, "serum_creatinine": 1.2}'
# Calculate CKD-EPI 2021 (Local)
curl -X POST http://localhost:8000/ckd_epi_2021 \
-H "Content-Type: application/json" \
-d '{"sex": "female", "age": 65, "serum_creatinine": 1.2}'We welcome contributions from the medical and developer communities! This project is part of our mission to democratize access to evidence-based medical tools.
- Fork the project on GitHub
- Create a feature branch (
git checkout -b feature/amazing-new-score) - Add your medical calculator following our implementation guide
- Test thoroughly - medical calculations require precision
- Include proper references - all scores must cite original publications
- Commit your changes (
git commit -am 'Add APACHE II score') - Push to your branch (
git push origin feature/amazing-new-score) - Open a Pull Request with a detailed description
- New medical scores and calculators from any medical specialty
- Bug fixes and improvements to existing calculations
- Documentation enhancements and translations
- Performance optimizations and code quality improvements
- Test coverage improvements
- Follow our established patterns for new calculators
- Include comprehensive input validation
- Provide clinical interpretations for all results
- Cite original research using Vancouver style references
- Test with edge cases and boundary values
This project is licensed under Apache 2.0. See the LICENSE file for details.
Daniel Nobrega Medeiros
- Email: daniel@nobregamedtech.com.br
- GitHub: @danielxmed
- Repository: https://github.com/danielxmed/nobra_calculator.git
Nobrega MedTech - AI Solutions for Healthcare
- Specializing in academic support tools for medical education
- Developing AI-powered medical decision support systems
- Building the Nobra ecosystem - AI research agents for medical professionals
- Committed to evidence-based medicine and open-source healthcare tools
This calculator was originally developed as a component of Nobra, our comprehensive AI research agent designed to assist medical doctors with:
- Evidence-based clinical decision making
- Medical literature research and synthesis
- Educational support for medical training
- Real-time access to medical calculators and scores
By open-sourcing this calculator API, we're contributing to the global effort to make medical knowledge more accessible and standardized.
- β Star this repository if you find it useful
- π Report bugs and suggest improvements
- π Contribute new calculators from your medical specialty
- π’ Share with colleagues in the medical community
- πΌ Contact us for enterprise solutions and custom development
The Nobra Calculator API includes built-in MCP server support, allowing AI assistants and other MCP-compatible clients to interact with all medical calculators as native tools.
- MCP Endpoint:
https://calculator.nobra.app.br/mcp - Protocol: Connect via URL using the MCP client of your choice
- Authentication: Same as the main API (rate limits apply)
- Select specific tools you need in your MCP client interface
- Avoid loading all tools at once - this will exceed most LLM context windows
- Use tool filtering to choose only the medical specialties or specific calculators relevant to your use case
- Cardiology scores (CHA2DS2-VASc, HAS-BLED, etc.)
- Nephrology calculators (CKD-EPI, MDRD, etc.)
- Pulmonology tools (CURB-65, PSI, etc.)
- Emergency medicine scores
- And many more across 15+ medical specialties
When configuring your MCP client, consider:
- Setting up tool filters by specialty or score name
- Implementing pagination or lazy loading for tool discovery
- Caching frequently used calculator tools
- Managing context window usage efficiently
For more information about MCP integration, refer to the MCP documentation.
IMPORTANT: This API is intended for educational and research purposes only. It should not be used as a substitute for professional clinical judgment. All medical calculations should be verified independently, and clinical decisions should always involve qualified healthcare professionals.
- Always validate results with original references
- Consider patient-specific factors not captured in scores
- Use as a supplement to, not replacement for, clinical expertise
- Verify calculations independently for critical decisions