[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "verified-googledocs-mcp" version = "0.2.0" description = "MCP server for Google Docs with verified writes" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.12" authors = [{ name = "Michael Sutton" }] keywords = ["mcp", "model-context-protocol", "google-docs", "llm", "agents"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Office/Business", "Topic :: Software Development :: Libraries", ] dependencies = [ # The major-version ceiling is deliberate: FastMCP 4 moves the protocol types # from `mcp.types` to a standalone `mcp_types` package, which breaks the # `import mcp.types` in middleware.py at startup. See #57. "fastmcp>=3.0,<4", "google-api-python-client>=2.0", "google-auth-oauthlib>=1.0", "google-auth-httplib2>=0.2", "markdown-it-py>=3.0", # Direct dependency, not just a fastmcp transitive: middleware.py imports # mcp.types for CallToolRequestParams. "mcp>=1.27,<2", ] [project.urls] Homepage = "https://github.com/michaelrobertsutton/verified-googledocs-mcp" Repository = "https://github.com/michaelrobertsutton/verified-googledocs-mcp" Issues = "https://github.com/michaelrobertsutton/verified-googledocs-mcp/issues" [project.optional-dependencies] dev = [ "pytest>=8.0", "pytest-asyncio>=0.23", "pytest-cov>=5.0", "mypy>=1.10", "ruff>=0.4", ] [project.scripts] verified-googledocs-mcp = "verified_googledocs_mcp.server:main" [tool.hatch.build.targets.wheel] packages = ["src/verified_googledocs_mcp"] # Explicit allowlist, not a denylist: anything not named here stays out of the # tarball, so a tool directory added tomorrow is excluded by default rather # than shipped by accident. # # This matters because local-only tooling is excluded from git via # .git/info/exclude, which hatchling does not read — it packs whatever is on # disk and not in .gitignore. CI publishes from a clean checkout that never # had those files, so nothing has ever leaked; this makes the sdist identical # no matter who runs the build. [tool.hatch.build.targets.sdist] include = [ "/src", "/tests", "/docs", "/scripts", "/README.md", "/CHANGELOG.md", "/CONTRIBUTING.md", "/LICENSE", "/pyproject.toml", "/server.json", "/uv.lock", ] [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] # Coverage runs on every invocation for a quick local signal; the hard floor # (--cov-fail-under) is applied in CI so partial local runs don't fail. addopts = "--cov=verified_googledocs_mcp --cov-report=term-missing" markers = [ "live: live acceptance tests against the real Google APIs; skipped unless --run-live is passed and OAuth credentials are present (never runs in CI). See tests/live/.", ] [tool.ruff] target-version = "py312" line-length = 100 [tool.mypy] python_version = "3.12" files = ["src"] ignore_missing_imports = true