[project] name = "kwork-mcp" dynamic = ["version"] description = "MCP-сервер для Kwork.ru и kwork.com: биржа, отклики, диалоги и заказы из Claude Code, Codex и Cursor. Отправка только после вашего подтверждения" license = "MIT" readme = "README.md" requires-python = ">=3.12,<3.15" authors = [ { name = "Simon Sudarushkin", email = "simonsudarushkin@gmail.com" }, ] keywords = ["mcp", "mcp-server", "model-context-protocol", "kwork", "kwork-ru", "кворк", "freelance", "фриланс", "claude", "claude-code", "codex", "cursor", "ai-agents"] classifiers = [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Operating System :: MacOS :: MacOS X", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Software Development :: Libraries", "Typing :: Typed", ] dependencies = [ "aiohttp==3.14.3", "aiohttp-socks==0.11.0", "fastmcp==4.0.10", "jsonschema==4.26.0", "kwork[proxy]==0.2.0", "loguru==0.7.3", "mcp==2.2.0", "pydantic==2.13.4", "pydantic-settings==2.14.2", "websockets==16.1.1", "yarl==1.24.5", ] [dependency-groups] dev = [ "check-wheel-contents==0.6.3", "coverage[toml]==7.15.2", "detect-secrets==1.5.0", "mypy==2.3.0", "pip-audit==2.10.1", "pytest==9.1.1", "pytest-asyncio==1.4.0", "pytest-cov==7.1.0", "pytest-timeout==2.4.0", "ruff==0.16.0", "twine==7.0.0", "types-jsonschema==4.26.0.20260518", ] [project.scripts] kwork-mcp = "kwork_mcp:main" kwork-mcp-bootstrap = "kwork_mcp.bootstrap:main" [project.urls] Homepage = "https://github.com/simonether/kwork-mcp" Repository = "https://github.com/simonether/kwork-mcp" Issues = "https://github.com/simonether/kwork-mcp/issues" [build-system] requires = ["hatchling==1.31.0"] build-backend = "hatchling.build" [tool.hatch.version] path = "src/kwork_mcp/version.py" [tool.hatch.build.targets.wheel] packages = ["src/kwork_mcp"] [tool.hatch.build.targets.sdist] exclude = [ "/AGENTS.md", "/CLAUDE.md", "/.coverage*", "/coverage.xml", "/htmlcov", "/site", ] [tool.ruff] target-version = "py312" line-length = 120 src = ["src", "tests"] [tool.ruff.lint] select = ["E", "W", "F", "I", "N", "UP", "B", "SIM", "T20", "RUF", "ASYNC"] ignore = ["RUF001", "RUF002", "E501"] [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" asyncio_default_test_loop_scope = "function" testpaths = ["tests"] addopts = "--strict-config --strict-markers" timeout = 30 [tool.uv] required-version = ">=0.11.6" [tool.coverage.run] branch = true source = ["kwork_mcp"] [tool.coverage.report] fail_under = 92 show_missing = true skip_covered = true exclude_also = [ "if TYPE_CHECKING:", "if __name__ == .__main__.:", "raise NotImplementedError", ] [tool.mypy] python_version = "3.12" strict = true pretty = true show_error_codes = true warn_unreachable = true packages = ["kwork_mcp"] [[tool.mypy.overrides]] module = ["kwork.*"] follow_untyped_imports = true