[build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "mcpbridge-wrapper" version = "0.4.5" description = "Python wrapper for xcrun mcpbridge that adds structuredContent to MCP responses" readme = "README.md" requires-python = ">=3.9" license = "MIT" license-files = ["LICENSE"] authors = [ {name = "mcpbridge-wrapper"}, ] keywords = ["mcp", "xcode", "cursor", "mcpbridge", "wrapper"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Topic :: Software Development :: Build Tools", "Topic :: Utilities", ] dependencies = [ "pydantic>=2.0.0", ] [project.optional-dependencies] dev = [ "pytest>=7.0", "pytest-cov>=4.0", "pytest-asyncio>=0.21", "ruff==0.15.2", "mypy>=1.0", ] webui = [ "fastapi>=0.100.0", "uvicorn>=0.23.0", "websockets>=11.0", "httpx>=0.27.0", "python-multipart>=0.0.6", "pydantic>=2.0.0", ] [project.scripts] mcpbridge-wrapper = "mcpbridge_wrapper.cli:main" [project.urls] Homepage = "https://github.com/SoundBlaster/XcodeMCPWrapper" Repository = "https://github.com/SoundBlaster/XcodeMCPWrapper" [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-dir] "" = "src" [tool.setuptools] include-package-data = true [tool.setuptools.package-data] "mcpbridge_wrapper.webui" = [ "static/*.html", "static/*.css", "static/*.js", ] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["src"] python_files = ["test_*.py", "*_test.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = [ "-v", "--tb=short", "--strict-markers", ] asyncio_mode = "strict" markers = [ "unit: Unit tests", "integration: Integration tests", "slow: Slow tests", "asyncio: Mark tests as asyncio (registered by pytest-asyncio)", ] [tool.coverage.run] source = ["src"] branch = true omit = [ "*/tests/*", "*/test_*", "conftest.py", "*/webui/*", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "raise AssertionError", "raise NotImplementedError", "if __name__ == .__main__.:", ] precision = 1 fail_under = 90 [tool.ruff] target-version = "py37" line-length = 100 [tool.ruff.lint] select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "N", # pep8-naming "D", # pydocstyle "UP", # pyupgrade "B", # flake8-bugbear "C4", # flake8-comprehensions "SIM", # flake8-simplify ] ignore = [ "D100", # Missing docstring in public module "D104", # Missing docstring in public package "D203", # 1 blank line required before class docstring "D212", # Multi-line docstring summary should start at the first line ] [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.ruff.lint.per-file-ignores] "tests/*" = ["D", "S"] "__init__.py" = ["D104"] [tool.mypy] python_version = "3.9" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true disallow_untyped_decorators = false no_implicit_optional = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true warn_unreachable = true strict_equality = true show_error_codes = true show_column_numbers = true ignore_missing_imports = true