[project] name = "hitl-finance-mcp" version = "0.3.1" description = "MCP server for market data, macro calendar, SEC filings and risk tooling, with human-approved order execution" readme = "README.md" license = { file = "LICENSE" } keywords = ["mcp", "model-context-protocol", "finance", "trading", "market-data", "sec-edgar"] requires-python = ">=3.10" dependencies = [ "pandas", "numpy", "fastmcp", "yfinance", "tabulate", "lxml", "html5lib", "webull-openapi-python-sdk", ] [project.optional-dependencies] dev = ["pytest", "hypothesis"] # The floor is the release that introduced `width=`. The dashboard used # `use_container_width=`, which Streamlit documented for removal after # 2025-12-31 -- a date already past -- against an unpinned dependency, so a # fresh install was one Streamlit release away from a dashboard that would not # render. dashboard = ["streamlit>=1.49", "plotly"] # Console commands, so an installed copy is launchable without knowing where # pip put it. `finance-mcp` is what an MCP client runs. [project.scripts] finance-mcp = "dashboard.cli:serve" finance-mcp-dashboard = "dashboard.cli:dashboard" finance-mcp-config = "dashboard.cli:where" [project.urls] Homepage = "https://github.com/Blahaj-gif/Finance-mcp" Repository = "https://github.com/Blahaj-gif/Finance-mcp" Issues = "https://github.com/Blahaj-gif/Finance-mcp/issues" # Flat layout: name the packages explicitly so auto-discovery does not sweep # `tests` into the distribution. # Subpackages are NOT implied by naming the parent. `packages = ["dashboard"]` # shipped a wheel with dashboard/brokers/ missing entirely, so the installed # server died on `import dashboard.brokers` -- a break that a source checkout # cannot reproduce, because there the directory is simply there. Found by # installing the wheel into a clean venv and starting it; find_packages keeps # it from recurring as more subpackages appear. [tool.setuptools.packages.find] include = ["dashboard*"] exclude = ["tests*", "docs*"] [tool.setuptools] py-modules = ["finance_mcp"] # Off, deliberately. It defaults to *true* for a pyproject config, which means # setuptools sweeps files it finds beside the code -- including the runtime # state the dashboard writes into its own package directory, and including # whatever a stale egg-info SOURCES.txt happens to remember from an earlier # build. Removing the package-data glob alone did not stop it; this does. include-package-data = false # No package data. There was a `dashboard = ["*.json"]` glob here, added to # ship "the Streamlit theme and the golden vectors" -- but the theme lives in # dashboard/theme.py as Python and the vectors live in tests/fixtures/, which # this package excludes. It shipped neither. # # What it did ship was every runtime state file the dashboard writes beside its # own code: order_drafts.json, portfolio_history.json, live_consent.json, # iv_history.json. Those are gitignored, so nothing in the repository showed # it; setuptools globs the filesystem rather than the index, and the build ran # from a working tree where the author had used the tool. Four published # versions carried a real account id, a portfolio's positions and value day by # day, and a live order with the broker's own order id. # # It was also a correctness bug: a fresh install started with somebody else's # drafts already in the approval queue. # # If an asset ever genuinely needs to ship, name the file. Never a glob over a # directory that the program also writes to. [tool.pytest.ini_options] testpaths = ["tests"] filterwarnings = ["ignore::DeprecationWarning"]