Stock Research MCP Server (Python)
Production-grade MCP server for stock intelligence with:
- Alpha Vantage + Finnhub provider fallback
- Deterministic indicators/metrics/scoring
- Claude narrative analysis constrained to computed data
- Dual MCP transport modes:
stdio(Claude Desktop local) andhttpwith selectable SSE/streamable endpoints (Render)
File Tree
mcp_server/
├── main.py
├── tools/
│ └── stock_tools.py
├── providers/
│ ├── base.py
│ ├── alpha_vantage.py
│ ├── finnhub.py
│ └── router.py
├── scoring/
│ └── engine.py
├── indicators/
│ └── technical.py
├── analysis/
│ ├── metrics.py
│ ├── signal_engine.py
│ └── claude_engine.py
├── schemas/
│ └── models.py
├── config/
│ └── settings.py
└── utils/
├── logging.py
└── http.py
tests/
├── test_indicators.py
├── test_metrics.py
└── test_scoring.py
Requirements
- Python 3.11+
- API keys:
CLAUDE_API_KEYALPHA_VANTAGE_API_KEYFINNHUB_API_KEY
Setup
python -m venv .venv
. .venv/Scripts/activate
pip install -r requirements.txt
copy .env.example .env
Run (Claude Desktop local via stdio)
Set in .env:
TRANSPORT_MODE=stdio
Run:
python -m mcp_server.main
Run (Render remote via HTTP)
Set in .env:
TRANSPORT_MODE=http
HTTP_TRANSPORT=sse # or streamable
HOST=0.0.0.0
PORT=8000
Run:
python -m mcp_server.main
Tools
- Existing research/report tools:
stock_research_report(primary)analyze_stockget_priceget_ohlcvget_technicalsget_fundamentalsget_news_sentiment
- Trading-style tools:
get_stock_priceget_quoteget_company_profileget_candlesget_stock_newsget_rsiget_macdget_key_financials
Tests
pytest -q
Render Deployment
- Push repo to GitHub.
- Create a Render Web Service.
- Build command:
pip install -r requirements.txt
- Start command:
python -m mcp_server.main
- Environment variables:
TRANSPORT_MODE=httpHTTP_TRANSPORT=sse(orstreamable)HOST=0.0.0.0PORT=8000CLAUDE_API_KEY,ALPHA_VANTAGE_API_KEY,FINNHUB_API_KEY
- MCP endpoints:
- SSE mode (
HTTP_TRANSPORT=sse):https://<render-service-domain>/ssehttps://<render-service-domain>/messages/(POST)
- Streamable mode (
HTTP_TRANSPORT=streamable):https://<render-service-domain>/mcp
- SSE mode (
- Optional health check endpoint:
https://<render-service-domain>/health
Claude Desktop Config (local stdio)
Example MCP server entry:
{
"mcpServers": {
"stock-research": {
"command": "python",
"args": ["-m", "mcp_server.main"],
"env": {
"TRANSPORT_MODE": "stdio",
"CLAUDE_API_KEY": "YOUR_KEY",
"ALPHA_VANTAGE_API_KEY": "YOUR_KEY",
"FINNHUB_API_KEY": "YOUR_KEY"
}
}
}
}
Transport Notes
TRANSPORT_MODE=auto(default) auto-selects:httpwhen hosted (PORTorRENDERenv present)stdiolocally
HTTP_TRANSPORT=sseuses:GET /ssePOST /messages/
HTTP_TRANSPORT=streamableuses:POST /mcp