[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "llm-fusion-mcp" version = "1.0.0" description = "Universal Multi-LLM MCP Server - Unified access to Gemini, OpenAI, Anthropic & Grok" readme = "README.md" requires-python = ">=3.10" authors = [ { name = "rpm", email = "rpm@example.com" } ] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] dependencies = [ "anthropic>=0.66.0", "fastapi>=0.116.1", "fastmcp>=2.11.3", "google-generativeai>=0.8.5", "httpx>=0.28.1", "openai>=1.54.0", "pydantic>=2.11.7", "python-dotenv>=1.0.0", "pyyaml>=6.0.2", "uvicorn>=0.35.0", ] [project.optional-dependencies] dev = [ "ruff>=0.7.0", "mypy>=1.8.0", "pytest>=8.0.0", "pytest-asyncio>=0.24.0", ] [project.scripts] llm-fusion-mcp = "llm_fusion_mcp.server:main" [tool.ruff] line-length = 88 target-version = "py310" extend-select = ["I", "N", "UP", "RUF"] fixable = ["ALL"] [tool.ruff.format] quote-style = "double" indent-style = "space" docstring-code-format = true [tool.ruff.lint] select = ["E", "F", "W", "I", "N", "UP", "RUF", "B", "C4", "PIE", "SIM", "TCH"] ignore = ["E501"] # Line length handled by formatter [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] [tool.mypy] python_version = "3.10" strict = true 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 [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py", "*_test.py"]