[project]
name = "lunatask-mcp"
version = "0.2.1"
description = "An unofficial MCP server providing a standardized bridge between AI models and the LunaTask API"
license = {file = "LICENSE"}
readme = "README.md"
authors = [
{ name = "Tiago Freitas", email = "freitas.mib@gmail.com" }
]
requires-python = ">=3.12,<3.13"
dependencies = ["fastmcp==2.11.3", "httpx>=0.28.1", "pydantic>=2.11.7"]
[project.urls]
Homepage = "https://github.com/tensorfreitas/lunatask-mcp"
Repository = "https://github.com/tensorfreitas/lunatask-mcp.git"
Issues = "https://github.com/tensorfreitas/lunatask-mcp/issues"
[project.scripts]
lunatask-mcp = "lunatask_mcp.main:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.rye]
managed = true
[tool.ruff]
line-length = 100
target-version = "py312"
include = ["src/**/*.py", "tests/**/*.py"]
[tool.ruff.lint]
select = ["E", "F", "W", "C", "I", "N", "UP", "ANN", "S", "B", "A", "COM", "C4", "DTZ", "T10", "EXE", "ISC", "ICN", "G", "INP", "PIE", "T20", "PYI", "PT", "Q", "RSE", "RET", "SLF", "SIM", "TID", "ARG", "PTH", "ERA", "PD", "PGH", "PL", "TRY", "NPY", "PERF", "FURB", "LOG", "RUF"]
# Disable COM812 to avoid conflicts with the Ruff formatter's handling of trailing commas.
# The formatter is authoritative for this rule.
ignore = ["COM812"]
[tool.ruff.lint.per-file-ignores]
"tests/*" = [
"S101", # Allow assert statements in tests
"S106", # Allow hardcoded passwords in tests (test tokens)
"SLF001" # Allow private member access in tests (testing internal state)
]
[tool.pytest.ini_options]
# Enable automatic asyncio mode for better async test handling
# This provides automatic event loop management and reduces boilerplate
asyncio_mode = "auto"
filterwarnings = [
# Convert RuntimeWarnings to test failures to catch unawaited coroutines
# and other async resource leaks early in development
"error::RuntimeWarning",
# Suppress pytest-asyncio internal warnings that can occur during garbage collection
# when properly managing async resources with mocks
"ignore::pytest.PytestUnraisableExceptionWarning"
]
# Register markers to avoid unknown-marker warnings
markers = [
"integration: marks tests as integration tests",
"e2e: marks tests as end-to-end tests"
]
# Coverage configuration
addopts = "--cov=src/lunatask_mcp --cov-report=term-missing --cov-fail-under=95"
[tool.pyright]
include = ["src", "tests"]
exclude = ["**/__pycache__", ".venv", "build", "dist"]
reportMissingImports = true
reportMissingTypeStubs = false
pythonVersion = "3.12"
pythonPlatform = "All"
typeCheckingMode = "strict"
venvPath = "."
venv = ".venv"
[dependency-groups]
dev = [
"commitizen>=4.8.3",
"pre-commit>=4.3.0",
"pyright>=1.1.405",
"pytest>=8.4.1",
"pytest-asyncio>=1.1.0",
"pytest-cov>=6.2.1",
"pytest-mock>=3.14.1",
"ruff>=0.13.1",
]