[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "librenms-mcp" version = "1.12.1" description = "MCP server for LibreNMS management" readme = "README.md" requires-python = ">=3.11,<3.16" license = {file = "LICENSE"} authors = [ {name = "Mateusz Hajder"}, ] keywords = ["librenms", "mcp", "network", "management", "server", "automation"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: System Administrators", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Programming Language :: Python :: 3.15", "Topic :: System :: Networking", "Topic :: System :: Networking :: Monitoring", "Topic :: System :: Systems Administration", "Topic :: Utilities", ] dependencies = [ "fastmcp>=4.0.0,<5", "httpx2>=2.12.0", "pydantic>=2.12.0", "python-dotenv>=1.0.0", ] [project.optional-dependencies] sentry = [ "sentry-sdk>=2.43.0", ] [dependency-groups] dev = [ "commitizen>=4.13.7", "prek>=0.3.3", "pytest>=9.0.2", "pytest-asyncio>=1.3.0", "pytest-cov>=7.0.0", "ruff>=0.14.14", "ty>=0.0.17", "typos>=1.48.0", ] [project.scripts] librenms-mcp = "librenms_mcp.server:main" [tool.hatch.build.targets.wheel] packages = ["src/librenms_mcp"] [project.urls] Homepage = "https://github.com/mhajder/librenms-mcp" Repository = "https://github.com/mhajder/librenms-mcp" Documentation = "https://github.com/mhajder/librenms-mcp#readme" Issues = "https://github.com/mhajder/librenms-mcp/issues" LibreNMS_Documentation = "https://docs.librenms.org/API/" [tool.ruff] # Same as Black. line-length = 88 indent-width = 4 # Assume Python 3.11+. target-version = "py311" [tool.ruff.lint] # Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. # Unlike Flake8, Ruff doesn't enable pycodestyle warnings (`W`) or # McCabe complexity (`C901`) by default. select = [ "ARG", # flake8-unused-arguments "B", # flake8-bugbear "C4", # flake8-comprehensions "DTZ", # flake8-datetimez "E", # pycodestyle errors "F", # pyflakes "FURB", # refurb "I", # isort "LOG", # flake8-logging "N", # pep8-naming "PERF", # Perflint "PT", # flake8-pytest-style "PTH", # flake8-use-pathlib "RUF", # Ruff-specific rules "S", # flake8-bandit "SIM", # flake8-simplify "T20", # flake8-print "UP", # pyupgrade "W", # pycodestyle warnings ] ignore = [ "E501", # Line too long, handled by formatter ] # Allow fix for all enabled rules (when `--fix`) is provided. fixable = ["ALL"] unfixable = [] [tool.ruff.format] # Like Black, use double quotes for strings. quote-style = "double" # Like Black, indent with spaces, rather than tabs. indent-style = "space" # Like Black, respect magic trailing commas. skip-magic-trailing-comma = false # Like Black, automatically detect the appropriate line ending. line-ending = "auto" # Enable auto-formatting of code examples in docstrings. Markdown, # reStructuredText code/literal blocks and doctests are all supported. docstring-code-format = false # Set the line length limit used when formatting code snippets in # docstrings. docstring-code-line-length = "dynamic" [tool.ruff.lint.per-file-ignores] "tests/*" = ["S101", "S106", "S107"] # Allow assert and hardcoded passwords in tests [tool.ruff.lint.isort] known-first-party = ["librenms_mcp"] force-single-line = true [tool.typos.default.extend-identifiers] TrUe = "TrUe" [tool.typos.default.extend-words] certifi = "certifi" [tool.commitizen] name = "cz_conventional_commits" tag_format = "v$version" version_scheme = "pep440" version_provider = "uv" version_files = ["server.json"] update_changelog_on_bump = true major_version_zero = true