[project] name = "mcp-snowflake-server-nsp" version = "0.14.4" description = "A Snowflake MCP server — SQL queries, schema exploration, and data insights for AI assistants" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.13,<3.14" authors = [{ name = "nsphung", email = "nsphung@users.noreply.github.com" }] dependencies = [ "mcp==1.30.0", "snowflake-connector-python[pandas]==4.8.1", "pandas>=2.3.3,<3.0.0", # python_version >= '3.13' / restriction from snowflake-connector-python[pandas] "python-dotenv==1.2.3", "sqlparse==0.6.0", "snowflake-snowpark-python==1.50.0", ] keywords = ["mcp", "snowflake", "llm", "ai", "model-context-protocol", "sql"] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.13", "Topic :: Database", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Software Development :: Libraries :: Python Modules", ] [project.urls] Homepage = "https://github.com/nsphung/mcp-snowflake-server" Repository = "https://github.com/nsphung/mcp-snowflake-server" Issues = "https://github.com/nsphung/mcp-snowflake-server/issues" Changelog = "https://github.com/nsphung/mcp-snowflake-server/blob/main/CHANGELOG.md" [build-system] requires = ["hatchling", "wheel>=0.46.2"] build-backend = "hatchling.build" # Security overrides: force minimum safe versions of transitive dependencies # flagged by Dependabot without polluting the package's direct dependency list. [tool.uv] constraint-dependencies = [ "python-multipart>=0.0.31", "urllib3>=2.8.0", "protobuf>=5.29.6", "starlette>=1.3.1", "PyJWT>=2.15.0", "requests>=2.33.0", "wheel>=0.46.2", "idna>=3.15", "cryptography>=50.0.0", "pyarrow>=23.0.1", "setuptools>=84.1.0", "anyio>=4.14.2", "certifi>=2026.10.23", "filelock>=4.2.1", ] [dependency-groups] dev = [ "mypy==2.3.1", "ruff==0.15.22", "types-pyyaml>=6.0.12.20260408", "pytest>=8.3", "pytest-asyncio>=0.26", "pytest-cov>=6.0", "snowflake-snowpark-python[localtest]==1.50.0", "prek==0.4.14", ] [project.scripts] mcp_snowflake_server = "mcp_snowflake_server:main" [tool.hatch.build.targets.wheel] packages = ["src/mcp_snowflake_server"] [tool.pytest.ini_options] addopts = "-ra" testpaths = ["tests"] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" [tool.ruff] line-length = 100 target-version = "py313" fix = true lint.select = [ # pycodestyle E "E4", "E7", "E9", # Pyflakes "F", # pycodestyle W "W", # isort "I", # mccabe "C90", # pyupgrade "UP", # flake8-2020 "YTT", # pylint "PL", # flake8-bugbear "B006", ] lint.ignore = [ ### TODO: Enable gradually # Temp "PLR0913", ] [tool.ruff.lint.isort] combine-as-imports = true lines-after-imports = 2 [tool.ruff.format] docstring-code-format = true [tool.mypy] python_version = '3.13' check_untyped_defs = true disallow_incomplete_defs = true disallow_untyped_calls = true disallow_untyped_defs = true follow_imports = 'skip' ignore_missing_imports = true show_column_numbers = true show_error_codes = true warn_unused_ignores = true warn_return_any = true [tool.coverage.run] branch = true source = ["src/mcp_snowflake_server"] omit = ["tests/*"] [tool.coverage.report] show_missing = true skip_covered = false precision = 1 exclude_also = [ "if TYPE_CHECKING:", "raise NotImplementedError", "if __name__ == .__main__.:", "@(abc\\.)?abstractmethod", ]