[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "medvision-mcp"
version = "0.0.1"
description = "MedVision MCP - Medical Vision AI Tools via Model Context Protocol"
authors = [
{name = "u9401066", email = "u9401066@gap.kmu.edu.tw"},
]
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.12"
dependencies = [
# MCP Server
"mcp>=1.0.0",
"fastmcp>=0.1.0",
# Database
"sqlalchemy>=2.0.0",
"aiosqlite>=0.19.0",
# Web/API
"fastapi>=0.110.0",
"uvicorn>=0.27.0",
"websockets>=12.0",
"httpx>=0.23.0",
# Core
"pydantic>=2.0.0",
"python-dotenv>=1.0.0",
"numpy<2",
"Pillow>=10.0.0",
# AI/ML Core
"torch>=2.2.0",
"torchvision>=0.10.0",
"transformers>=4.44.0",
"huggingface-hub>=0.20.0",
# Medical Imaging
"torchxrayvision>=0.0.37",
"pydicom>=2.3.0",
"scikit-image>=0.18.0",
"opencv-python>=4.8.0",
# Visual RAG
"faiss-cpu>=1.7.0",
# Agent Framework (for Phase 3+)
"langchain-core>=0.1.0",
"langgraph>=0.0.10",
# Utilities
"requests>=2.25.0",
"pandas>=1.3.0",
"einops>=0.3.0",
"timm>=0.5.0",
# UI
"gradio>=5.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"pytest-cov>=4.0.0",
"pytest-asyncio>=0.21.0",
"black>=23.0.0",
"isort>=5.0.0",
"ruff>=0.1.0",
"pre-commit>=3.0.0",
"mypy>=1.0.0",
]
test = [
"pytest>=7.0.0",
"pytest-cov>=4.0.0",
"pytest-asyncio>=0.21.0",
"httpx>=0.23.0",
]
vllm = [
"vllm>=0.4.0",
]
ollama = [
"ollama>=0.2.0",
]
ui = [
"gradio>=5.0.0",
]
full = [
"medvision-mcp[vllm,ollama,ui]",
# Legacy dependencies
"accelerate>=0.12.0",
"peft>=0.2.0",
"bitsandbytes>=0.35.0",
"diffusers>=0.20.0",
"sentencepiece>=0.1.95",
"tokenizers>=0.10.0",
"albumentations>=1.0.0",
]
[project.scripts]
medvision-mcp = "medvision_mcp.server:main"
medvision-ui = "medvision_mcp.ui.app:launch"
[dependency-groups]
dev = [
"pytest>=7.0.0",
"pytest-cov>=4.0.0",
"black>=23.0.0",
"isort>=5.0.0",
"flake8>=6.0.0",
"pre-commit>=3.0.0",
"ruff>=0.1.0",
]
[tool.ruff]
target-version = "py312"
line-length = 100
select = ["E", "F", "W", "I", "N", "UP", "YTT", "ANN", "S", "BLE", "FBT", "B", "A", "COM", "C4", "DTZ", "T10", "EM", "EXE", "FA", "ISC", "ICN", "G", "INP", "PIE", "T20", "PYI", "PT", "Q", "RSE", "RET", "SLF", "SIM", "TID", "TCH", "ARG", "THR", "PTH", "ERA", "PGH", "PL", "TRY", "FLY", "NPY", "PERF", "RUF"]
ignore = ["ANN101", "ANN102", "S101", "S104", "S105", "S106"]
[tool.ruff.per-file-ignores]
"__init__.py" = ["F401"]
"tests/*" = ["S101", "S105", "S106"]
[tool.black]
line-length = 100
target-version = ['py312']
[tool.isort]
profile = "black"
line_length = 100
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-ra -q --strict-markers"
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"integration: marks tests as integration tests",
"unit: marks tests as unit tests",
]