Supabase MCP Server

[build-system] requires = ["hatchling", "hatch-vcs"] build-backend = "hatchling.build" [project] name = "supabase-mcp-server" version = "0.1.0" # dynamic = ["version"] description = "Unofficial Supabase MCP server that enables Cursor and Windsurf to manage your database and execute SQL queries" readme = "README.md" requires-python = ">=3.13" dependencies = [ "mcp[cli]>=1.2.1", "psycopg2>=2.9.10", "supabase>=2.13.0", "tenacity>=9.0.0", ] authors = [ {name = "Alexander Zuev", email = "azuev@outlook.com"} ] keywords = ["supabase", "mcp", "cursor", "windsurf"] license = "Apache-2.0" classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Database :: Database Engines/Servers", ] [project.urls] Homepage = "https://github.com/Nopsled/supabase-mcp-server" Repository = "https://github.com/Nopsled/supabase-mcp-server.git" Changelog = "https://github.com/Nopsled/supabase-mcp-server/blob/main/CHANGELOG.MD" Documentation = "https://github.com/Nopsled/supabase-mcp-server#readme" [tool.hatch.build.targets.wheel] packages = ["supabase_mcp"] [tool.uv] package = true [tool.hatch.version] source = "vcs" raw-options = { version_scheme = "no-guess-dev" } [tool.hatch.build.hooks.vcs] version-file = "supabase_mcp/_version.py" [project.scripts] supabase-mcp-server = "supabase_mcp.main:run" supabase-mcp-inspector = "supabase_mcp.main:inspector" # Configure PyPI publishing [[tool.uv.index]] name = "pypi" url = "https://pypi.org/simple/" publish-url = "https://upload.pypi.org/legacy/" [tool.ruff] target-version = "py313" line-length = 120 select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade ] ignore = [] [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" [tool.mypy] python_version = "3.13" strict = true ignore_missing_imports = 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_return_any = true warn_unreachable = true [tool.pytest] testpaths = ["tests"] python_files = ["test_*.py"] python_classes = ["Test*"] python_functions = ["test_*"] addopts = "-v -ra -q" asyncio_mode = "strict" [tool.pytest.ini_options] asyncio_default_fixture_loop_scope = "function" markers = [ "unit: marks a test as a unit test", "integration: marks a test as an integration test that requires database access" ] [dependency-groups] dev = [ "pytest>=8.3.4", "pytest-asyncio>=0.25.3", "pytest-mock>=3.14.0", ]