[project] name = "autoria-mcp" version = "0.2.2" description = "MCP server exposing the AUTO.RIA used-cars REST API to AI agents." readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [{ name = "Yevhen Kalyna", email = "yevhen.kalyna@gmail.com" }] keywords = ["mcp", "auto.ria", "autoria", "cars", "ukraine", "agents", "llm"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Internet :: WWW/HTTP", "Topic :: Software Development :: Libraries", "Typing :: Typed", ] dependencies = [ "mcp>=1.9.0", "httpx>=0.27", "pydantic>=2.7", "pydantic-settings>=2.3", ] [project.urls] Homepage = "https://github.com/yevhen-kalyna/autoria-mcp" Repository = "https://github.com/yevhen-kalyna/autoria-mcp" Issues = "https://github.com/yevhen-kalyna/autoria-mcp/issues" Changelog = "https://github.com/yevhen-kalyna/autoria-mcp/blob/main/CHANGELOG.md" [project.scripts] autoria-mcp = "autoria_mcp.server:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/autoria_mcp"] # TestPyPI publish target for the release workflow's dry-run path. # `uv publish --index testpypi` uploads here; the default `uv publish` goes to PyPI. # `explicit = true` keeps it from ever being used for resolution/installs. [[tool.uv.index]] name = "testpypi" url = "https://test.pypi.org/simple/" publish-url = "https://test.pypi.org/legacy/" explicit = true [dependency-groups] # Installed by `uv sync` by default (the "dev" group is on unless --no-dev). dev = [ "ruff>=0.6", "mypy>=1.11", "pytest>=8.2", "pytest-asyncio>=0.23", "respx>=0.21", ] # --------------------------------------------------------------------------- # Ruff (lint + format) # --------------------------------------------------------------------------- [tool.ruff] target-version = "py311" line-length = 100 src = ["src", "tests"] [tool.ruff.lint] select = [ "E", # pycodestyle errors "F", # pyflakes "I", # isort "N", # pep8-naming "UP", # pyupgrade "B", # flake8-bugbear "A", # flake8-builtins "C4", # flake8-comprehensions "SIM", # flake8-simplify "TID", # flake8-tidy-imports "RUF", # ruff-specific ] ignore = [ "A003", # class attribute shadowing a builtin (e.g. `id`) is fine for API models # AUTO.RIA is a Ukrainian marketplace: labels legitimately interleave Latin and # Cyrillic ("190 к.с.", "Гібрид (HEV)", "Газ метан / Бензин"), so the # confusable-character lints are all false positives in this codebase. "RUF001", # ambiguous char in a string "RUF002", # ambiguous char in a docstring "RUF003", # ambiguous char in a comment ] [tool.ruff.lint.per-file-ignores] "tests/**" = ["S101"] # asserts are expected in tests [tool.ruff.lint.isort] known-first-party = ["autoria_mcp"] # --------------------------------------------------------------------------- # mypy (strict) # --------------------------------------------------------------------------- [tool.mypy] python_version = "3.11" strict = true warn_unused_configs = true warn_redundant_casts = true warn_unused_ignores = true disallow_any_generics = true no_implicit_reexport = true show_error_codes = true files = ["src", "tests"] # --------------------------------------------------------------------------- # pytest # --------------------------------------------------------------------------- [tool.pytest.ini_options] minversion = "8.0" testpaths = ["tests"] addopts = "-ra --strict-markers --strict-config" asyncio_mode = "auto"