Stock MCP Server
# ๐ Stock MCP Server
ํ๊ตญ/๋ฏธ๊ตญ ์ฃผ์์ ๊ธฐ์ ์ ๋ถ์๊ณผ ์ ๋ต ๊ธฐ๋ฐ ์คํฌ๋ฆฌ๋์ ์ ๊ณตํ๋ **Model Context Protocol (MCP) ์๋ฒ**์
๋๋ค.
Claude Desktop, Claude Code ๋ฑ MCP ํธํ ํด๋ผ์ด์ธํธ์์ ์์ฐ์ด๋ก ์ฐจํธ ๋ถ์ยท์ข
๋ชฉ ์คํฌ๋ฆฌ๋์ ํ ์ ์์ต๋๋ค.
## โจ Features
- ๐ฐ๐ท **ํ๊ตญ ์ฃผ์ ๋ถ์** โ `pykrx` ๊ธฐ๋ฐ KOSPI/KOSDAQ ์ ์ข
๋ชฉ OHLCV + ๊ธฐ์ ์ ์งํ
- ๐บ๐ธ **๋ฏธ๊ตญ ์ฃผ์ ๋ถ์** โ `yfinance` ๊ธฐ๋ฐ NYSE/NASDAQ ์ข
๋ชฉ + ์๊ฐ์ด์ก/PER/52์ฃผ ๊ณ ์ ๊ฐ
- ๐ **์ข
๋ชฉ ๊ฒ์** โ ์ข
๋ชฉ๋ช
์ผ๋ก ์ข
๋ชฉ์ฝ๋ ์ฐพ๊ธฐ (ํ๊ตญ ์ข
๋ชฉ)
- ๐ **10๊ฐ์ง Momentum ์ ๋ต + 7๊ฐ์ง Breakout ์ ๋ต** โ ๊ณจ๋ ํฌ๋ก์ค๋ถํฐ VCP๊น์ง
- ๐ฏ **๋ ๊ฐ์ง ์คํฌ๋ฆฌ๋ ์ฒ ํ** โ ๐ ๋ฌ๋ฆฌ๋ ๋ง ์ก์ํ๊ธฐ vs ๐ฑ ๊ณง ๋ฌ๋ฆด ๋ง ์ฐพ๊ธฐ
- ๐ **๋ค๋จ ์ฌ์ ํํฐ** โ ๊ฑฐ๋๋ ๊ธ์ฆยทTrend TemplateยทRSยท52์ฃผ ๋ฐด๋ ๋ฑ
## ๐ ๏ธ Tools
| Tool | ์ค๋ช
| ์
๋ ฅ ์์ |
|------|------|-----------|
| `get_stock_analysis` | ํ๊ตญ ์ข
๋ชฉ ๊ธฐ์ ์ ๋ถ์ | `ticker="005930"` (์ผ์ฑ์ ์) |
| `get_us_stock_analysis` | ๋ฏธ๊ตญ ์ข
๋ชฉ ๊ธฐ์ ์ ๋ถ์ | `symbol="NVDA"` |
| `search_stock` | ์ข
๋ชฉ๋ช
โ ์ข
๋ชฉ์ฝ๋ ๊ฒ์ | `keyword="์์ฒด๋ผ"` |
| `screen_kr_momentum` | ๐ ํ๊ตญ **๋ฌ๋ฆฌ๋ ๋ง ์ก์ํ๊ธฐ** (Stage 2 ์ถ์ธ) | `market="ALL"` |
| `screen_us_momentum` | ๐ ๋ฏธ๊ตญ **๋ฌ๋ฆฌ๋ ๋ง ์ก์ํ๊ธฐ** | `symbols=None` (Yahoo ์๋ ์๋) |
| `screen_kr_breakout` | ๐ฑ ํ๊ตญ **๊ณง ๋ฌ๋ฆด ๋ง ์ฐพ๊ธฐ** (VCPยท๋งค์งยทStage 1 ๋ง๊ธฐ) | `market="ALL"` |
| `screen_us_breakout` | ๐ฑ ๋ฏธ๊ตญ **๊ณง ๋ฌ๋ฆด ๋ง ์ฐพ๊ธฐ** | `symbols=None` |
| `diagnose_stock` | ํน์ ์ข
๋ชฉ ์ ๋ต ์ง๋จ | `ticker="005930", market="KR"` |
## ๐ฏ Screening: ๋ ๊ฐ์ง ์ฒ ํ
### ๐ Momentum โ ๋ฌ๋ฆฌ๋ ๋ง ์ก์ํ๊ธฐ
์ด๋ฏธ ์์น ์ถ์ธ์ ์ง์
ํ ์ข
๋ชฉ์ **์ถ์ธ ์ง์(Stage 2 continuation)** ์ ํฌ์ฐฉํฉ๋๋ค.
O'Neil์ CANSLIM, Minervini์ Trend Template ์ด๋ก ๊ธฐ๋ฐ.
**ํ์ดํ๋ผ์ธ**
```
์๋ (๋ค์ด๋ฒ ๊ฑฐ๋๋/์์น๋ฅ /๊ธ๋ฑ | Yahoo most_actives/day_gainers/small_cap_gainers)
โ
โ min_trade_value โ ์ ๋์ฑ
โก ๋น์ผ ๊ณผ์ด ์ ์ธ +10% ์ด์ โ ์ถ๊ฒฉ๋งค์ ๋ฐฉ์ง
โข 20์ผ ๋ด ๊ฑฐ๋๋ ๊ธ์ฆ โฅ 3x โ ์๊ธ ์ ์
์๊ทธ๋
โฃ Minervini Trend Template โ Stage 2 6์กฐ๊ฑด (ON)
โค 52์ฃผ ๊ณ ์ ๊ทผ์ โ OFF (Trend Template๊ณผ ์ค๋ณต)
โฅ RS vs ์ง์ โ OFF (opt-in, ๊ฐํ ์ข
๋ชฉ๋ง ๋ณด๊ณ ์ถ์ ๋)
โ
10๊ฐ์ง Momentum ์ ๋ต ์ ์ฉ
```
**์ ์ฉ ์ ๋ต (10)**
- ๊ธฐ์กด 4: ๊ณจ๋ ํฌ๋ก์ค+๊ฑฐ๋๋, ๋๋ฆผ๋ชฉ ๋งค์, ๋ชจ๋ฉํ
๋ํ, ๊ฑฐ๋๋ ํญ๋ฐ
- ์ ๊ท 6: RSI ๋ค์ด๋ฒ์ ์ค, MACD ๋ค์ด๋ฒ์ ์ค, ์คํ ์บ์คํฑ, BB ์คํด์ฆ, ์ผ๋ชฉ๊ท ํํ ๋ํ, 3์ ์ ๋ฐฐ์ด
### ๐ฑ Breakout โ ๊ณง ๋ฌ๋ฆด ๋ง ์ฐพ๊ธฐ
์์ง ํฌ๊ฒ ์์ง์ด์ง ์์ **๋งค์ง ๋จ๊ณ / ๋ํ ์ง์ ** ์ข
๋ชฉ์ ํฌ์ฐฉํฉ๋๋ค.
Mark Minervini์ VCP ํจํด, Wyckoff ๋งค์ง ์ด๋ก ๊ธฐ๋ฐ.
**ํ์ดํ๋ผ์ธ**
```
์๋ (Momentum๊ณผ ๋์ผ โ ๋งค์ง๋ ๊ฑฐ๋๋์ ๋ฐ์๋จ)
โ
โ min_trade_value
โก ๋น์ผ ๊ณผ์ด ์ ์ธ +10% ์ด์
โข ๋์ ์์น ํ๋: ์ต๊ทผ 30์ผ +30% ์ด์ ์ ์ธ โ Breakout ์ ์ฉ
โฃ 52์ฃผ ๋ฐด๋: ๊ณ ์ ร 0.85 ์ดํ AND ์ ์ ร 1.20 ์ด์ โ ์ ์ฉ (์ค๊ฐ๊ถ๋ง)
โค 20์ผ ๋ด ๊ฑฐ๋๋ ๊ธ์ฆ โฅ 2x (momentum์ 3x๋ณด๋ค ์ํ)
โ
Breakout 7์ ๋ต ์ ์ฉ (Trend Template / 52w ๊ทผ์ / RS ๋ชจ๋ off)
```
**์ ์ฉ ์ ๋ต (7)**
- ์ฌ์ฌ์ฉ 4: ๋๋ฆผ๋ชฉ ๋งค์, ๊ฑฐ๋๋ ํญ๋ฐ, MACD ๋ค์ด๋ฒ์ ์ค, BB ์คํด์ฆ
- ์ ๊ท 3: **VCP ๋ณ๋์ฑ ์์ถ**, **์กฐ์ฉํ ๋งค์ง**, **Stage 1 ๋ง๊ธฐ ์ ํ**
## ๐งช ๋ ๋ชจ๋ ๋น๊ต
| | ๐ Momentum | ๐ฑ Breakout |
|---|---|---|
| **์ฒ ํ** | ์ถ์ธ ์ง์ | ๋งค์ง โ ๋ํ ์ด๊ธฐ |
| **๋์ ์์น๋ฅ ** | ์ ํ ์์ | **30์ผ +30% ์ด์ ์ ์ธ** |
| **52์ฃผ ์์น** | ๊ณ ์ ๊ทผ์ ๊ถ์ฅ | **๊ณ ์ 85% ์ดํ + ์ ์ 120% ์ด์ ๋ฐด๋** |
| **Trend Template** | ON (MA ์ ๋ฐฐ์ด ์๊ตฌ) | OFF |
| **๊ฑฐ๋๋ ๊ธ์ฆ** | 3.0x | **2.0x** (๋งค์ง์ ๋ ํญ๋ฐ์ ) |
| **์ ๋ต ๊ฐ์** | 10๊ฐ | 7๊ฐ (์ ๊ท 3 ํฌํจ) |
| **์ ํฉํ ํ์ด๋ฐ** | ์์ฅ ๊ฐ์ธ๊ธฐ, ์ถ์ธ ์ถ์ข
| ์กฐ์ ๊ธฐ ํ ์ฌ์ง์
, ๋ฐ๋ฅ ๋ฐ์ |
### ์ค์ ๊ฒฐ๊ณผ ๋น๊ต ์์
๋์ผ ์์ฅ(KOSPI) ๊ธฐ์ค:
- **Momentum**: ํผ์คํ
(6์ ๋ต ์ถฉ์กฑ) โ ์ด๋ฏธ ๋ฌ๋ฆฌ๊ณ ์๋ ์ข
๋ชฉ
- **Breakout**: ๋์์ ์ 30์ผ **-20.32%**, 52์ฃผ๊ณ ์ 72% ์ง์ ์์ ๋๋ฆผ๋ชฉ+VCP โ ๋งค์ง ์ ํ
## ๐ ์ ๊ท Breakout ์ ๋ต ์ค๋ช
### VCP (Volatility Contraction Pattern)
์ต๊ทผ 15์ผ์ 5์ผ์ฉ 3๊ตฌ๊ฐ์ผ๋ก ๋๋ ๊ฐ ๊ตฌ๊ฐ์ ๊ณ ์ ๋ฒ์(%)๊ฐ **์์ฐจ ์ถ์**๋๋์ง ํ์ .
์ฝ์ผ๋ง ์คํ๋ง ํํ โ ๋ํ ์๋ฐ. (Mark Minervini)
### ์กฐ์ฉํ ๋งค์ง (Silent Accumulation)
์ต๊ทผ 20์ผ ๊ฑฐ๋๋ ํ๊ท ์ด ์ด์ 20์ผ ๋๋น **์ฆ๊ฐ**ํ๊ณ ๊ธ์ฆ์ผ๋ ์์ง๋ง,
๊ฐ์ 20์ผ ๊ฐ๊ฒฉ ๋ณ๋ํญ์ **ยฑ8% ์ด๋ด** โ ์์ฅ์ ๋๋ฌ๋์ง ์์ ์ธ๋ ฅ ๋งค์ง.
### Stage 1 ๋ง๊ธฐ ์ ํ
๋ฐ๋ฅ ๋ฐ์ค๊ถ(Stage 1)์์ ์๋งํ ์์น(Stage 2 ์ด์
)์ผ๋ก ๋์ด๊ฐ๋ ๊ตฌ๊ฐ.
- MA60 ๊ธฐ์ธ๊ธฐ 1๊ฐ์ ์ ๋๋น ์์น
- MA20 > MA60 (๋จ๊ธฐ ์ํฅ ์ ํ)
- ์ข
๊ฐ > MA60 (์ง์ง ํ๋ณด)
- BBํญ โค 20์ผ ํ๊ท (์์ง ๋ณ๋์ฑ ๋ฏธํ์ฅ)
## ๐ ์ฌ์ ํํฐ ํ๋ผ๋ฏธํฐ ์นํธ์ํธ
### Momentum ์คํฌ๋ฆฌ๋ ๊ณตํต
| ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ | ์ฉ๋ |
|---------|------|------|
| `exclude_if_up_pct` | 10.0 | ์ค๋ +10% ์ด์ ์ ์ธ. `None`์ด๋ฉด ๋ฏธ์ ์ฉ |
| `spike_threshold` | 3.0 | ๊ฑฐ๋๋ ๊ธ์ฆ ๋ฐฐ์จ |
| `enable_trend_template` | True | Minervini Trend Template |
| `enable_rs_filter` | False | RS ํํฐ (๊ฐํ ์ข
๋ชฉ๋ง ๋ณด๊ณ ์ถ์ ๋ on) |
| `min_rs_outperformance` | 0.0 | ๋ฒค์น๋งํฌ ์ด๊ณผ์์ต(pp) ์๊ณ๊ฐ |
### Breakout ์คํฌ๋ฆฌ๋ ๊ณตํต
| ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ | ์ฉ๋ |
|---------|------|------|
| `max_cumulative_return_pct` | 30.0 | ์ต๊ทผ N์ผ ๋์ ์์น๋ฅ ์ํ(%) |
| `cumulative_return_days` | 30 | ๋์ ๊ณ์ฐ ๊ตฌ๊ฐ |
| `high_ceiling` | 0.85 | 52์ฃผ ๊ณ ์ ร ์ด ๊ฐ ์ดํ๋ง ํต๊ณผ |
| `low_floor` | 1.20 | 52์ฃผ ์ ์ ร ์ด ๊ฐ ์ด์๋ง ํต๊ณผ |
| `spike_threshold` | 2.0 | ๊ฑฐ๋๋ ๊ธ์ฆ (๋งค์ง์ ์ํ๋ ๋ฐฐ์จ) |
## ๐ฆ Installation
### Prerequisites
- Python 3.13+
- [uv](https://github.com/astral-sh/uv) (๊ถ์ฅ)
### Setup
```bash
git clone https://github.com/Juuuuuuni/stock-mcp-server.git
cd stock-mcp-server
uv sync
```
## ๐ Usage
### Claude Desktop ์ฐ๋
`~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
๋๋ `%APPDATA%\Claude\claude_desktop_config.json` (Windows)์ ๋ค์์ ์ถ๊ฐ:
```json
{
"mcpServers": {
"stock-analyzer": {
"command": "uv",
"args": [
"--directory",
"/์ ๋/๊ฒฝ๋ก/stock-mcp-server",
"run",
"python",
"server.py"
]
}
}
}
```
### ์ง์ ์คํ
```bash
uv run python server.py
```
## ๐ฌ ๋ํ ์์
### ๊ฐ๋ณ ์ข
๋ชฉ ๋ถ์
```
๐ค ์ผ์ฑ์ ์ ์ต๊ทผ ๋ถ์ํด์ค
๐ค [get_stock_analysis("005930")] โ ํ์ฌ๊ฐ / RSI / MACD / ์ถ์ธ ํด์
๐ค NVDA ํ ๋ฌ ์ฐจํธ ๋ถ์
๐ค [get_us_stock_analysis("NVDA", days=30)]
๐ค ์์ฒด๋ผ ์ข
๋ชฉ์ฝ๋๊ฐ ๋ญ์ผ?
๐ค [search_stock("์์ฒด๋ผ")] โ 347860
```
### ์คํฌ๋ฆฌ๋ (๋ฌ๋ฆฌ๋ ๋ง)
```
๐ค ์ง๊ธ ์ฝ์คํผ์์ ๋จ๋ ์ข
๋ชฉ ์ฐพ์์ค
๐ค [screen_kr_momentum(market="KOSPI")]
โ Stage 2 ์ถ์ธ + ๊ฑฐ๋๋ ๊ธ์ฆ ์ข
๋ชฉ. ํผ์คํ
(6์ ๋ต), ๋์ฐ๊ฑด์ค(3์ ๋ต) โฆ
๐ค ๋ฏธ๊ตญ ์ฃผ์์์ ๊ฐ์ธ ์ข
๋ชฉ๋ง (RS 10pp ์ด์)
๐ค [screen_us_momentum(enable_rs_filter=True, min_rs_outperformance=10.0)]
```
### ์คํฌ๋ฆฌ๋ (๊ณง ๋ฌ๋ฆด ๋ง)
```
๐ค ์ฝ์ค๋ฅ์์ ๋งค์ง ๋จ๊ณ ์ข
๋ชฉ ์คํฌ๋ฆฌ๋
๐ค [screen_kr_breakout(market="KOSDAQ")]
โ ๋์ ์์น 30% ๋ฏธ๋ง + 52์ฃผ ์ค๊ฐ๊ถ + VCP/๋งค์ง ํจํด
๐ค ์์ง ์ ์ค๋ฅธ ๋ฐ๋ฅ ์ข
๋ชฉ๋ง (์ต๊ทผ 30์ผ +10% ์ด๋ด)
๐ค [screen_kr_breakout(max_cumulative_return_pct=10.0)]
```
### ๊ฐ๋ณ ์ข
๋ชฉ ์ ๋ต ์ง๋จ
```
๐ค ์์ฒด๋ผ ์ง๊ธ ์ด๋ค ๋จ๊ณ์ผ?
๐ค [diagnose_stock(ticker="347860", market="KR")]
โ 10์ ๋ต ์ค ์ด๋ ์กฐ๊ฑด ํต๊ณผํ๋์ง ์์ธ ์ง๋จ
```
## ๐ ์ถ๋ ฅ ์์
### Momentum ์คํฌ๋ฆฌ๋ ๊ฒฐ๊ณผ (์์ฝ)
```json
{
"์คํฌ๋ฆฌ๋์ผ": "20260413",
"๋์์์ฅ": "KOSPI",
"์๋ํ๋ณด์": 80,
"ํํฐ๋ง_๋จ๊ณ๋ณ_ํต๊ณผ": {
"๋น์ผ๊ณผ์ด์ ์ธ": 64,
"๊ฑฐ๋๋๊ธ์ฆ": 31,
"Trend_Template": 8,
"52์ฃผ๊ณ ์ ๊ทผ์ ": 0,
"RS": 0
},
"ํํฐ๋ง๊ฒฐ๊ณผ์": 26,
"๊ฒฐ๊ณผ": [
{
"์ข
๋ชฉ์ฝ๋": "010820",
"์ข
๋ชฉ๋ช
": "ํผ์คํ
",
"์ ๋ต": "๋ชจ๋ฉํ
๋ํ",
"์ ์": "5/5",
"ํ์ฌ๊ฐ": 2340,
"๋ฑ๋ฝ๋ฅ ": "+4.23%",
"RSI": 68.4,
"๊ฑฐ๋๋๋น": "2.1x",
"20์ผ๋ด_์ต๋๊ฑฐ๋๋๋ฐฐ์จ": "8.7x",
"๋ณต์์ ๋ต": true
}
]
}
```
### Breakout ์คํฌ๋ฆฌ๋ ๊ฒฐ๊ณผ (์์ฝ)
```json
{
"์คํฌ๋ฆฌ๋์ผ": "20260413",
"๋ชจ๋": "Breakout (๊ณง ๋ฌ๋ฆด ๋ง)",
"๋์์์ฅ": "KOSPI",
"์๋ํ๋ณด์": 80,
"ํํฐ๋ง_๋จ๊ณ๋ณ_ํต๊ณผ": {
"๋น์ผ๊ณผ์ด์ ์ธ": 64,
"๋์ ์์นํ๋": 55,
"52์ฃผ๋ฐด๋": 22,
"๊ฑฐ๋๋๊ธ์ฆ": 12
},
"ํํฐ๋ง๊ฒฐ๊ณผ์": 28,
"๊ฒฐ๊ณผ": [
{
"์ข
๋ชฉ์ฝ๋": "006340",
"์ข
๋ชฉ๋ช
": "๋์์ ์ ",
"์ ๋ต": "๋๋ฆผ๋ชฉ ๋งค์",
"์ ์": "5/5",
"ํ์ฌ๊ฐ": 1245,
"30์ผ๋์ ": "-20.32%",
"52์ฃผ๊ณ ์ ๋๋น": "72.2%",
"52์ฃผ์ ์ ๋๋น": "128.4%",
"๋ณต์์ ๋ต": true
}
]
}
```
## ๐งฉ Tech Stack
- **[FastMCP](https://github.com/modelcontextprotocol/python-sdk)** โ MCP ์๋ฒ ํ๋ ์์ํฌ
- **[pykrx](https://github.com/sharebook-kr/pykrx)** โ ํ๊ตญ๊ฑฐ๋์ ๋ฐ์ดํฐ
- **[yfinance](https://github.com/ranaroussi/yfinance)** โ Yahoo Finance ๋ฐ์ดํฐ
- **[ta](https://github.com/bukosabino/ta)** โ ๊ธฐ์ ์ ๋ถ์ ์งํ
- **BeautifulSoup + lxml** โ ๋ค์ด๋ฒ ๊ธ์ต / Yahoo ์คํฌ๋ฆฌ๋ HTML ํ์ฑ
- **pandas** โ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
## ๐ References
- William J. O'Neil โ *How to Make Money in Stocks* (CANSLIM)
- Mark Minervini โ *Trade Like a Stock Market Wizard* (Trend Template, VCP)
- Richard Wyckoff โ ๊ฐ๊ฒฉ-๊ฑฐ๋๋ ๋งค์ง/๋ถ์ฐ ์ด๋ก
- Stan Weinstein โ *Secrets for Profiting in Bull and Bear Markets* (Stage Analysis)
## ๐ License
MIT
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: diagnosis, analysis (KR/US), screening by strategy and market, and ticker search. There is no overlap between tools; even the screening tools are differentiated by market and strategy type.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., diagnose_stock, get_stock_analysis, screen_kr_breakout). The naming scheme is predictable and uniform across all tools.
With 8 tools, the server is well-scoped for stock analysis and screening. It covers core functionalities without being overly numerous or too sparse, providing a focused yet comprehensive set.
The tool set covers analysis, diagnosis, screening for both markets, and ticker search. Minor gaps exist, such as the absence of a dedicated quote tool, but the analysis tools include OHLCV. Overall, the surface is thorough for its domain.