[project] name = "mcpwright-census" version = "0.1.3" description = "MCP server for U.S. Census (ACS) data by ZIP code — income, age, housing, education — served from a local store. Needs a free Census API key." readme = "README.md" license = "MIT" license-files = ["LICENSE"] authors = [ { name = "Devender Gollapally" } ] requires-python = ">=3.12" keywords = [ "mcp", "model-context-protocol", "census", "acs", "zip-code", "demographics", "claude", "zcta", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3.12", "Topic :: Sociology", "Operating System :: OS Independent", ] dependencies = [ "httpx>=0.28.1", # Upper bound: mcp 2.0 removed `mcp.server.fastmcp`, which server.py imports. # Without this bound a fresh `uvx` resolve pulls 2.x and fails to start. "mcp[cli]>=1.27.2,<2", "mcpwright-core>=0.1.2,<0.2", "pydantic>=2.13.4", ] [project.urls] Homepage = "https://mcpwright.com/census" Repository = "https://github.com/mcpwright/census-mcp" Issues = "https://github.com/mcpwright/census-mcp/issues" [project.scripts] mcpwright-census = "census_mcp:main" [build-system] requires = ["uv_build>=0.11.17,<0.12.0"] build-backend = "uv_build" # Distribution is "mcpwright-census" but the import package stays "census_mcp". [tool.uv.build-backend] module-name = "census_mcp" [tool.ruff] line-length = 88 target-version = "py312" exclude = [".git", ".mypy_cache", ".ruff_cache", ".venv", "venv", "__pycache__", "build", "dist", "*.egg-info"] [tool.ruff.lint] select = ["E", "F", "I", "B", "UP", "C4", "SIM", "TC", "PTH"] ignore = ["E501", "B904"] fixable = ["ALL"] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401"] "tests/**/*.py" = ["S101", "S105", "S106"] # FastMCP resolves these annotations at runtime (get_type_hints) to build the # tool schemas, so the model imports must stay at module scope — don't let # flake8-type-checking push them under `if TYPE_CHECKING:`. "src/census_mcp/server.py" = ["TC"] [tool.ruff.lint.isort] known-first-party = ["census_mcp"] [tool.ruff.lint.mccabe] max-complexity = 10 [tool.mypy] python_version = "3.12" warn_return_any = true warn_unused_configs = true warn_redundant_casts = true warn_unused_ignores = true warn_no_return = true warn_unreachable = true strict_equality = true check_untyped_defs = true disallow_any_generics = false disallow_incomplete_defs = true disallow_untyped_calls = false disallow_untyped_defs = false no_implicit_optional = true no_implicit_reexport = true plugins = ["pydantic.mypy"] files = ["src/**/*.py"] [tool.pydantic-mypy] init_forbid_extra = true init_typed = true warn_required_dynamic_aliases = true warn_untyped_fields = true [tool.pytest.ini_options] minversion = "7.0" testpaths = ["tests"] asyncio_mode = "auto" addopts = ["-ra", "--strict-markers", "--strict-config", "--showlocals", "--tb=short"] [dependency-groups] dev = [ "pytest>=9.0.3", "pytest-asyncio>=1.4.0", "respx>=0.23.1", "ruff>=0.15.15", "mypy>=2.1.0", "pre-commit>=3.6.0", "detect-secrets>=1.4.0", ]