[build-system] requires = ["hatchling==1.31.0", "uv-dynamic-versioning==0.14.0"] build-backend = "hatchling.build" [project] name = "altr-mcp" dynamic = ["version"] description = "MCP server for ALTR data security — tag-based masking, access governance, and classification, with structured responses, middleware, and multi-transport support" readme = "README.md" requires-python = ">=3.11" license = "GPL-3.0-or-later" license-files = ["LICENSE.md"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Topic :: Scientific/Engineering :: Artificial Intelligence", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "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 = [ "fastmcp>=2.14,<4.0", "httpx>=0.28.1", "pydantic-settings>=2.7.0", "python-dotenv>=1.0.0", "structlog>=25.5.0", "tenacity>=9.1.0", ] [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=1.3.0", "pytest-cov>=5.0", "pytest-httpx>=0.36.0", "pyyaml>=6.0", ] [project.urls] Homepage = "https://github.com/altrsoftware/altr-mcp-server" Repository = "https://github.com/altrsoftware/altr-mcp-server" "Bug Tracker" = "https://github.com/altrsoftware/altr-mcp-server/issues" Changelog = "https://github.com/altrsoftware/altr-mcp-server/blob/master/CHANGELOG.md" [project.scripts] altr-mcp = "altr_mcp.server:main" [tool.hatch.build.targets.sdist] exclude = [".planning/", ".bun-build*", ".env", ".env.*", "!.env.example"] [tool.hatch.build.targets.wheel] packages = ["altr_mcp"] [tool.hatch.version] source = "uv-dynamic-versioning" [tool.uv-dynamic-versioning] # Applies whenever the version cannot be read from VCS: no .git (source zips, # Docker contexts), no git binary, a dubious-ownership refusal, or any failing # git command. The `+unknown` local segment makes the result unpublishable — # PyPI refuses any version carrying one — so a detection failure inside the # release job cannot burn a junk version. Local installs and source-zip builds # still work, which is what the fallback is for. fallback-version = "0.0.0+unknown" [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] [tool.coverage.run] source = ["altr_mcp"] branch = true omit = [ "altr_mcp/__init__.py", "altr_mcp/tools/__init__.py", "altr_mcp/utils/__init__.py", ] [tool.coverage.report] show_missing = true skip_covered = false precision = 1 exclude_lines = [ "pragma: no cover", "raise NotImplementedError", "if __name__ == .__main__.:", ]