content: [project]
  name = "mcp-example"
  version = "0.0.1"
  description = "MCP示例"
  readme = "README.md"
  requires-python = ">=3.12,<3.13"
  classifiers = [
      "Programming Language :: Python :: 3",
      "Programming Language :: Python :: 3.12",
  ]
  dependencies = [
      "fastapi[standard]>=0.115.12",
      "fastapi-mcp>=0.1.7",
      "uvicorn>=0.27.0",
      "ttt-video @ git+https://github.com/test-time-training/ttt-video-dit.git"
  ]
  
  [dependency-groups]
  dev = [
      "pytest>=7.2.0",
      "pre-commit>=2.20.0",
      "tox-uv>=1.11.3",
      "deptry>=0.22.0",
      "mypy>=0.991",
      "pytest-cov>=4.0.0",
      "ruff>=0.9.2",
      "fastapi-mcp>=0.2.0",
  ]
  
  [build-system]
  requires = ["setuptools"]
  build-backend = "setuptools.build_meta"
  
  [tool.setuptools.packages.find]
  
  [tool.mypy]
  check_untyped_defs = true
  no_implicit_optional = true
  warn_unused_configs = true
  plugins = ["pydantic.mypy"]
  exclude = [".venv*"]
  
  [tool.pytest.ini_options]
  log_cli = true
  asyncio_mode = "strict"
  asyncio_default_fixture_loop_scope = "function"
  testpaths = ["tests"]
  
  [tool.ruff]
  target-version = "py39"
  line-length = 120
  fix = true
  
  [tool.ruff.lint]
  select = [
      # flake8-2020
      "YTT",
      # flake8-bandit
      "S",
      # flake8-bugbear
      "B",
      # flake8-builtins
      "A",
      # flake8-comprehensions
      "C4",
      # flake8-debugger
      "T10",
      # flake8-simplify
      "SIM",
      # isort
      "I",
      # mccabe
      "C90",
      # pycodestyle
      "E",
      "W",
      # pyflakes
      "F",
      # pygrep-hooks
      "PGH",
      # pyupgrade
      "UP",
      # ruff
      "RUF",
      # tryceratops
      "TRY",
  ]
  ignore = [
      # LineTooLong
      "E501",
      # DoNotAssignLambda
      "E731",
      "UP035",
      "RUF001",
      "RUF002",
      "UP006",
      # TODO need add back
      "C901",
      "TRY003",
      "TRY301",
  ]
  
  [tool.ruff.lint.per-file-ignores]
  "tests/*" = ["S101"]
  
  [tool.ruff.format]
  preview = true
  
  [tool.coverage.report]
  skip_empty = true
  
  [tool.coverage.run]
  branch = true
  