[build-system]
requires = ["setuptools>=77.0.0"]
build-backend = "setuptools.build_meta"
[project]
name = "dm20-protocol"
version = "0.2.0"
description = "A comprehensive MCP server for AI-assisted D&D campaign management. 50+ tools for campaigns, characters, combat, quests, PDF rulebooks, and more."
authors = [{name = "Polloinfilzato"}]
license = "MIT"
urls = {Homepage = "https://github.com/Polloinfilzato/dm20-protocol"}
license-files = ["LICENSE.md"]
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
"fastmcp>=2.9.0",
"httpx>=0.24.0",
"pydantic>=2.0.0",
"pymupdf>=1.23.0",
"python-dotenv>=1.1.1",
"pyyaml>=6.0",
"shortuuid>=1.0.13",
"typing-extensions>=4.0.0",
]
[project.optional-dependencies]
rag = [
"chromadb>=0.4.0",
"sentence-transformers>=2.2.0",
]
dev = [
"pytest>=7.0.0",
"ruff>=0.1.0",
"mypy>=1.0.0",
"pre-commit>=3.0.0",
]
[project.scripts]
dm20-protocol = "dm20_protocol.main:main"
[tool.setuptools.packages.find]
where = ["src"]
[tool.setuptools.package-dir]
"" = "src"
[tool.ruff]
target-version = "py312"
line-length = 100
select = ["E", "F", "I", "N", "W"]
ignore = [
"E501",
"F403",
]
[tool.mypy]
python_version = "3.12"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
strict_equality = true
[[tool.mypy.overrides]]
module = "mcp.*"
ignore_missing_imports = true
[[tool.mypy.overrides]]
module = "pydantic.*"
ignore_missing_imports = true
[tool.pytest.ini_options]
markers = [
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
]
[dependency-groups]
dev = [
"pytest>=8.4.1",
]