[build-system] requires = ["hatchling>=1.24"] build-backend = "hatchling.build" [project] name = "twocaptcha-mcp" version = "0.6.1" description = "MCP server exposing the full 2Captcha API surface (~31 captcha types + management + pingback CRUD) to Claude Code" readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [{ name = "2Captcha MCP Contributors" }] keywords = ["mcp", "2captcha", "captcha", "claude-code", "ai-agent"] dependencies = [ "mcp>=1.2.0", "2captcha-python>=2.0,<3.0", "httpx>=0.27", "pydantic>=2.7", "pydantic-settings>=2.3", "python-dotenv>=1.0", ] [project.optional-dependencies] dev = [ "pytest>=8", "pytest-asyncio>=0.23", "respx>=0.21", "ruff>=0.5", "mypy>=1.10", "pytest-cov>=5", "build>=1.2", "pillow>=10.0", ] [project.scripts] twocaptcha-mcp = "twocaptcha_mcp.__main__:main" twocaptcha-mcp-webhook = "twocaptcha_mcp.webhook_receiver.__main__:main" [project.urls] Homepage = "https://github.com/aruxojuyu665/2Captcha-MCP" Repository = "https://github.com/aruxojuyu665/2Captcha-MCP" Issues = "https://github.com/aruxojuyu665/2Captcha-MCP/issues" Changelog = "https://github.com/aruxojuyu665/2Captcha-MCP/blob/main/CHANGELOG.md" [tool.hatch.build.targets.wheel] packages = ["twocaptcha_mcp"] [tool.hatch.build.targets.sdist] include = [ "twocaptcha_mcp", "tests", "README.md", "CHANGELOG.md", "CONTRIBUTING.md", "SECURITY.md", "TROUBLESHOOTING.md", "CLAUDE.md", "LICENSE", ".env.example", "docs/RELEASE.md", "docs/DEPLOY-WEBHOOK.md", "docs/release", ] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM", "RUF"] ignore = ["E501", "RUF012"] [tool.mypy] python_version = "3.11" strict = true warn_unused_ignores = true plugins = ["pydantic.mypy"] [[tool.mypy.overrides]] module = "twocaptcha_mcp.server" disable_error_code = ["misc", "no-untyped-call", "untyped-decorator"] [[tool.mypy.overrides]] module = "twocaptcha.*" ignore_missing_imports = true [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] addopts = "-ra --strict-markers" markers = [ "live: integration tests that hit the real 2Captcha API (skipped without --run-live)", "live_all_captchas: live tests across multiple captcha types (skipped without --live-all-captchas)", "e2e: end-to-end MCP protocol tests (skipped without --run-e2e)", ] [tool.coverage.run] source = ["twocaptcha_mcp"] branch = true