pyproject.toml•4.4 kB
[project]
name = "maverick_mcp"
version = "0.1.0"
description = "Personal-use MCP server for Claude Desktop providing professional-grade stock analysis and technical indicators"
readme = "README.md"
requires-python = ">=3.12,<3.13"
dependencies = [
# Core MCP and server dependencies
"fastmcp>=2.7.0",
"mcp>=1.9.3",
"fastapi>=0.115.12",
"uvicorn>=0.35.0",
"gunicorn>=23.0.0",
"python-multipart>=0.0.20",
"aiofiles>=24.1.0",
"httpx>=0.28.1",
"python-dotenv>=1.0.1",
# LangChain and AI dependencies
"langchain>=0.3.25",
"langchain-anthropic>=0.3.15",
"langchain-community>=0.3.24",
"langchain-openai>=0.3.19",
"langchain-mcp-adapters>=0.1.6",
"langgraph>=0.4.8",
"langgraph-supervisor>=0.0.18",
"anthropic>=0.52.2",
"openai>=1.84.0",
"tiktoken>=0.6.0",
# Deep research dependencies
"exa-py>=1.0.19",
# Database and caching
"sqlalchemy>=2.0.40",
"alembic>=1.16.1",
"psycopg2-binary>=2.9.10",
"aiosqlite>=0.20.0",
"asyncpg>=0.30.0",
"greenlet>=3.0.0",
"redis>=6.2.0",
"hiredis>=3.2.1",
"msgpack>=1.0.7",
"certifi>=2024.2.2",
# Financial data and analysis (core)
"numpy>=1.26.4",
"pandas>=2.2.3",
"yfinance>=0.2.63",
"finvizfinance>=1.1.0",
"pandas-ta>=0.3.14b0",
"ta-lib>=0.6.3",
# Backtesting
"vectorbt>=0.26.0",
"numba>=0.60.0",
"scikit-learn>=1.6.1",
"scipy>=1.15.3",
"pytz>=2024.1",
# Security (basic cryptography for data security)
"cryptography>=42.0.0",
# System monitoring (basic)
"psutil>=6.0.0",
"sentry-sdk[fastapi]>=2.22.0",
# Prometheus metrics
"prometheus-client>=0.21.1",
# Trading
"fredapi>=0.5.2",
"pandas-datareader>=0.10.0",
"pandas-market-calendars>=5.1.0",
"tiingo>=0.16.1",
# Visualization (essential only)
"matplotlib>=3.10.3",
"plotly>=5.0.0",
"seaborn>=0.13.2",
"kaleido>=0.2.1", # Required for Plotly image export
# Development tools
"watchdog>=6.0.0",
"ty>=0.0.1a19",
"pytest>=8.4.0",
"pytest-asyncio>=1.1.0",
"pytest-cov>=6.2.1",
"vcrpy>=7.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=8.3.5",
"pytest-asyncio>=0.24.0",
"pytest-cov>=4.1.0",
"pytest-xdist>=3.6.0",
"testcontainers[postgres,redis]>=4.5.0",
"vcrpy>=6.0.1",
"aiosqlite>=0.20.0",
"greenlet>=3.0.0",
"asyncpg>=0.30.0",
"ruff>=0.11.10",
"bandit>=1.7.5",
"safety>=3.0.0",
"types-requests>=2.31.0",
"types-pytz>=2024.1.0",
"ty>=0.0.1a19",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
include = ["*.py"]
[tool.pytest.ini_options]
minversion = "8.0"
testpaths = ["tests"]
python_files = ["test_*.py", "*_test.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
# Markers for test categories
markers = [
"unit: marks tests as unit tests (deselect with '-m \"not unit\"')",
"integration: marks tests as integration tests (deselect with '-m \"not integration\"')",
"slow: marks tests as slow (deselect with '-m \"not slow\"')",
"external: marks tests that require external APIs",
"database: marks tests that require database access",
"redis: marks tests that require Redis access",
]
# Default to running only unit tests
addopts = [
"-v",
"--strict-markers",
"--tb=short",
"-m", "not integration and not slow and not external",
"--durations=10", # Show 10 slowest tests
]
# Async configuration
asyncio_mode = "auto"
asyncio_default_fixture_loop_scope = "function"
[tool.ruff]
line-length = 88
target-version = "py312"
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"UP", # pyupgrade
]
ignore = [
"E501", # line too long (handled by formatter)
"B008", # do not perform function calls in argument defaults
"B904", # raise without from inside except
"W191", # indentation contains tabs
]
[tool.ruff.lint.per-file-ignores]
"tests/*" = ["F403", "F405"] # star imports allowed in tests
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
skip-magic-trailing-comma = false
line-ending = "auto"
[dependency-groups]
dev = [
"testcontainers[postgres]>=4.10.0",
]