[project] name = "mcp-as-a-judge" version = "0.5.0" description = "MCP as a Judge: a behavioral MCP that strengthens AI coding assistants via explicit LLM evaluations" readme = "README.md" license = { text = "MIT" } authors = [ { name = "Zvi Fried" } ] maintainers = [ { name = "Zvi Fried" } ] keywords = ["mcp", "model-context-protocol", "code-review", "ai", "judge", "software-engineering", "best-practices", "automation"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Quality Assurance", "Topic :: Software Development :: Code Generators", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Operating System :: OS Independent", "Environment :: Console", "Typing :: Typed", ] requires-python = ">=3.12" dependencies = [ "mcp[cli]>=1.13.0", "pydantic>=2.0.0", "jinja2>=3.1.0", "litellm>=1.0.0", "sqlmodel>=0.0.24", "tenacity>=9.1.2", ] [project.urls] Homepage = "https://github.com/OtherVibes/mcp-as-a-judge" Repository = "https://github.com/OtherVibes/mcp-as-a-judge" Issues = "https://github.com/OtherVibes/mcp-as-a-judge/issues" Documentation = "https://github.com/OtherVibes/mcp-as-a-judge#readme" [project.scripts] mcp-as-a-judge = "mcp_as_a_judge.server:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mcp_as_a_judge"] [tool.uv] dev-dependencies = [ "pytest>=7.0.0", "pytest-asyncio>=0.21.0", "pytest-cov>=4.0.0", "ruff>=0.1.0", "mypy>=1.0.0", "types-requests>=2.31.0", "pre-commit>=3.0.0", "bandit>=1.8.6", "jinja2>=3.1.6", ] [tool.hatch.envs.default] dependencies = [ "pytest>=7.0.0", "pytest-asyncio>=0.21.0", "pytest-cov>=4.0.0", "ruff>=0.1.0", "mypy>=1.0.0", ] [tool.hatch.envs.default.scripts] test = "pytest {args:tests}" test-cov = "pytest --cov=src/mcp_as_a_judge {args:tests}" lint = "ruff check {args:src tests}" format = "ruff format {args:src tests}" format-check = "ruff format --check {args:src tests}" type-check = "mypy {args:src}" all-checks = ["format-check", "lint", "type-check", "test-cov"] [tool.ruff] target-version = "py312" line-length = 88 [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "N", # pep8-naming "S", # bandit "T20", # flake8-print "SIM", # flake8-simplify "RUF", # ruff-specific rules ] ignore = [ "E501", # line too long, handled by formatter "B008", # do not perform function calls in argument defaults "S101", # use of assert detected "T201", # print found "S110", # try-except-pass detected (intentional in fallback scenarios) ] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [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.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "--strict-markers", "--strict-config", "--verbose", ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", ]