[build-system] requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "bunkerweb-mcp" dynamic = ["version"] description = "MCP server that exposes BunkerWeb's API to large language models" readme = "README.md" requires-python = ">=3.11" license = "MIT" authors = [ {name = "Bunkerity", email = "contact@bunkerity.com"} ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", ] dependencies = [ "fastapi>=0.109.0", "uvicorn[standard]>=0.31.1", "httpx[http2]>=0.27.1", "pydantic>=2.11.0", "pydantic-settings>=2.5.2", "python-dotenv>=1.0.0", "tenacity>=8.2.2", "pyyaml>=6", "mcp==2.3.0", "slowapi>=0.1.9", "limits>=3", "aiocache>=0.12.2", "prometheus-client>=0.19.0", "opentelemetry-api>=1.21.0", "opentelemetry-sdk>=1.21.0", "opentelemetry-instrumentation-fastapi>=0.42b0", "opentelemetry-instrumentation-httpx>=0.42b0", "opentelemetry-exporter-otlp-proto-grpc>=1.21.0", ] [project.optional-dependencies] dev = [ "pytest>=7.4.0", "pytest-asyncio>=0.21.0", "pytest-cov>=4.1.0", "asgiref>=3.8.0", "ruff>=0.1.0", "mypy>=1.7.0", "bandit>=1.7.5", "locust>=2.15.0", "pre-commit>=4", ] [project.scripts] bunkerweb-mcp = "bunkerweb_mcp.cli:main" [project.urls] Homepage = "https://www.bunkerweb.io" Documentation = "https://docs.bunkerweb.io" Repository = "https://github.com/bunkerity/bunkerweb-mcp" Issues = "https://github.com/bunkerity/bunkerweb-mcp/issues" [tool.setuptools.dynamic] version = {attr = "bunkerweb_mcp.__version__"} [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] bunkerweb_mcp = ["data/*.json", "data/skills/**/*"] [tool.pytest.ini_options] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] asyncio_mode = "strict" pythonpath = ["src"] addopts = [ "--cov=src/bunkerweb_mcp", "--cov-report=term-missing", "--cov-report=html", "--cov-report=xml", "--cov-fail-under=80", ] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "N", # pep8-naming "UP", # pyupgrade "B", # flake8-bugbear "C4", # flake8-comprehensions "SIM", # flake8-simplify ] ignore = [ "E501", # line too long (handled by formatter) "B008", # function call in argument defaults (FastAPI Depends pattern) ] [tool.ruff.lint.per-file-ignores] "tests/*" = ["S101"] # Allow assert in tests [tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_any_generics = true check_untyped_defs = true no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true [[tool.mypy.overrides]] module = "tests.*" disallow_untyped_defs = false [[tool.mypy.overrides]] module = [ "mcp.*", "prometheus_client.*", "opentelemetry.*", "aiocache.*", ] ignore_missing_imports = true [[tool.mypy.overrides]] module = "bunkerweb_mcp.cli" warn_unused_ignores = false