[project] name = "mcpwright-fred" version = "0.1.1" description = "MCP server for FRED® economic data — search and read 800k+ time series, releases, and ALFRED vintage data: what the numbers said before revisions." readme = "README.md" license = "MIT" license-files = ["LICENSE"] authors = [ { name = "Devender Gollapally" } ] requires-python = ">=3.12" keywords = [ "mcp", "model-context-protocol", "fred", "alfred", "economics", "claude", "federal-reserve", "time-series", "macroeconomics", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Intended Audience :: Financial and Insurance Industry", "Programming Language :: Python :: 3.12", "Topic :: Office/Business :: Financial :: Investment", "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/fred" Repository = "https://github.com/mcpwright/fred-mcp" Issues = "https://github.com/mcpwright/fred-mcp/issues" [project.scripts] mcpwright-fred = "fred_mcp:main" [build-system] requires = ["uv_build>=0.11.17,<0.12.0"] build-backend = "uv_build" # Distribution is "mcpwright-fred" but the import package stays "fred_mcp". [tool.uv.build-backend] module-name = "fred_mcp" # ============================================================================ # Ruff — lint + format # ============================================================================ [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", # pycodestyle errors "F", # Pyflakes "I", # isort "B", # flake8-bugbear "UP", # pyupgrade "C4", # flake8-comprehensions "SIM", # flake8-simplify "TC", # flake8-type-checking "PTH", # flake8-use-pathlib ] ignore = [ "E501", # line length (the formatter handles wrapping) "B904", # raise ... from err ] fixable = ["ALL"] unfixable = [] [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/fred_mcp/server.py" = ["TC"] [tool.ruff.lint.isort] known-first-party = ["fred_mcp"] section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] [tool.ruff.lint.mccabe] max-complexity = 10 # ============================================================================ # MyPy # ============================================================================ [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 # ============================================================================ # Pytest # ============================================================================ [tool.pytest.ini_options] minversion = "7.0" testpaths = ["tests"] asyncio_mode = "auto" addopts = [ "-ra", "--strict-markers", "--strict-config", "--showlocals", "--tb=short", ] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests as integration tests", "unit: marks tests as unit tests", ] [dependency-groups] dev = [ "mypy>=2.1.0", "pytest>=9.0.3", "pytest-asyncio>=1.4.0", "respx>=0.23.1", "ruff>=0.15.15", "pre-commit>=3.6.0", "detect-secrets>=1.5.0", ]