[project] name = "sec-intelligence-mcp" version = "0.1.1" description = "MCP server for SEC EDGAR filing intelligence (search, retrieval, evaluation)" readme = "README.md" authors = [ { name = "jahanvi", email = "jahanv01@users.noreply.github.com" } ] requires-python = ">=3.12" dependencies = [ "beautifulsoup4>=4.15.0", "datasets>=5.0.1", "duckdb>=1.5.5", "google-genai>=2.18.1", "httpx>=0.28.1", # ragas (as of 0.2.x through 0.4.x) still hard-imports # langchain_community.chat_models.vertexai, a module that only exists on the pre-1.0 # langchain-community/langchain-core line. Newer langchain-google-genai releases require # langchain-core>=1.0, which conflicts with that. This exact combo is the newest one that # resolves and actually imports/runs cleanly -- verified against a real Gemini call. # Do not `uv add --upgrade` these three without re-testing the ragas+Gemini import path. "langchain-community==0.3.27", "langchain-google-genai==2.1.9", "langfuse>=4.15.1", "mcp[cli]>=1.0,<2.0", "pdfplumber>=0.11.10", "pydantic>=2.13.4", "python-dotenv>=1.0", "qdrant-client>=1.19.0", "ragas==0.2.15", # pinned together with langchain-community/langchain-google-genai above "rank-bm25>=0.2.2", "sentence-transformers>=5.7.0", "tenacity>=9.1.4", "tiktoken>=0.13.0", "torch>=2.13.0", ] [project.scripts] sec-intelligence-mcp = "server:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] # Code under src/ imports flat (e.g. `from tools.analyze_filing import ...`, `import config`) # rather than through a src.* or sec_intelligence_mcp.* package prefix -- `sources` strips # the src/ prefix so the wheel installs tools/, edgar/, embeddings/, retrieval/, config.py, # server.py, llm.py, and ragas_judge.py directly as top-level packages/modules, matching # every existing import statement without changing any of them. sources = ["src"] include = ["src/**/*.py"] [tool.hatch.build.targets.wheel.force-include] # Ships as a sibling top-level directory in site-packages (not nested under any package) -- # promptutil.py's prompt_path() looks for it exactly there when running from an install. "prompts" = "prompts" [tool.uv] # copy instead of hardlink: avoids "cloud operation... incompatible hardlinks" errors # when the uv cache or project dir sits under a cloud-sync provider (OneDrive, etc.) link-mode = "copy" [[tool.uv.index]] name = "pytorch-cpu" url = "https://download.pytorch.org/whl/cpu" explicit = true [tool.uv.sources] torch = { index = "pytorch-cpu" } [dependency-groups] dev = [ "pytest>=9.1.1", "pytest-asyncio>=1.4.0", "ruff>=0.6", ] [tool.pytest.ini_options] pythonpath = ["src"] asyncio_mode = "auto" markers = [ "integration: end-to-end tests against real Qdrant/Gemini infra -- slow, excluded from CI's fast test job (run manually with `pytest -m integration` before release)", ]