Korea Stock Analyzer MCP Server
by Mrbaeksang
README.md
<div align="center">
# ๐ korea-stock-mcp
**ํ๊ตญ ์ฃผ์์ ์ํ ๋ณด์์ ยท๋ฐ์ดํฐ ์ ์ง ์๊ฒฉ MCP ์๋ฒ**<br>
*Conservative, data-honest Korean equity analysis for Claude, Cursor and any MCP client*
[](https://github.com/Mrbaeksang/korea-stock-analyzer-mcp/actions)
[](https://www.python.org)
[](https://gofastmcp.com)
[](https://modelcontextprotocol.io)
[](LICENSE)
</div>
---
> DART ์ ์๊ณต์์ **์ค์ธก ์ฌ๋ฌด์ ํ**์ KRX ์์ธ๋ง์ผ๋ก ํ๊ตญ ์์ฅ์ฌ๋ฅผ ๋ถ์ํ๋ค.
> ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์๋ค๊ณ ๋ตํ๊ณ , ๋ชฉํ ์ฃผ๊ฐ ๋์ ๊ฐ์ ์ด ๋ช
์๋ **๋ฒ์**๋ฅผ ์ ์ํ๋ฉฐ, ๋งค์ยท๋งค๋ ๊ถ๊ณ ๋ฅผ ํ์ง ์๋๋ค.
## โจ Features
- **๋ ์กฐ ์ ๋ก** โ ๋ชจ๋ ์์น๋ DART ๊ณต์ยทKRX ์์ธ ์ค์ธก์น. ๊ฒฐ์ธก์ `null` + ์ฌ์ ๋ก ๋ช
์, ๊ธฐ๋ณธ๊ฐ ์ฃผ์
์์
- **์ค์ธก ์ฌ๋ฌด์ ํ** โ ์ฌ์
๋ณด๊ณ ์ ๊ธฐ๋ฐ ๋งค์ถยท์์
์ด์ตยทํ๊ธํ๋ฆ 3~10๊ฐ๋
, ์ฐ๊ฒฐ(CFS) ์ฐ์ /๋ณ๋(OFS) ํด๋ฐฑ ํ์
- **๋ณด์์ ๋ฐธ๋ฅ์์ด์
** โ ๋จ์ผ ์ ์ ๊ฐ ๋์ 3์๋๋ฆฌ์ค(๋น๊ด/์ค๋ฆฝ/๋๊ด) ๋ฒ์, ์ฑ์ฅ๋ฅ ยท๋ฉํฐํ ๊ฐ์ ์ ๋ถ ์๋ต์ ํฌํจ
- **๋ฆฌ์คํฌ ์ฐ์ ** โ ์ฌ๋ฌด ์ ์ ํธ 6์ข
์๋ ๊ฒ์ฌ + ๊ณต์ ์ํ ํค์๋ ํ์ด๋ผ์ดํธ, ๊ฒ์ฌ ๋ถ๊ฐ ํญ๋ชฉ๋ ๊ตฌ๋ถ ๋ณด๊ณ
- **๊ต์ฐจ ๊ฒ์ฆ** โ ์๊ฐ์ด์ก ์ ํฉ์ฑ ๊ฒ์ฌ(์ฃผ๊ฐร์ฃผ์์ vs ๋ณด๊ณ ์์ด) ๋ฑ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๊ฒ์ฆ ๋ด์ฅ
- **์ด์ ๊ธฐ๋ณธ๊ธฐ** โ ๊ธ๋ก๋ฒ ๋ ์ดํธ ๋ฆฌ๋ฐ, DART ์ฟผํฐ ๋ณดํธ ์บ์ฑ, KRX IP ์ฐจ๋จ ๋ฐฉ์ง ์ง๋ ฌํ, ๊ตฌ์กฐํ ์๋ฌ ๋ฉ์์ง
## ๐๏ธ Architecture
```mermaid
graph LR
C1[Claude / claude.ai] -->|Streamable HTTP| S
C2[Claude Desktop / Cursor] -->|Streamable HTTP| S
subgraph Railway
S[FastMCP 3 ยท stateless] --> T[tools/ ๋ฑ๋ก ๊ณ์ธต]
T --> A[analysis/ ์์ ๊ณ์ฐ<br>ratios ยท valuation ยท risk]
T --> SV[services/ ๋ฐ์ดํฐ ํด๋ผ์ด์ธํธ]
SV --> CA[(TTL cache)]
end
SV -->|์ฌ๋ฌด์ ํ ยท ๊ณต์| DART[DART OpenAPI]
SV -->|์์ธ ยท ์์ฅ๋ชฉ๋ก| KRX[KRX via FinanceDataReader]
```
๊ณ์ธต ์์น: `tools/`๋ ๋ฑ๋ก๋ง(์๊ฒ) โ `services/`๋ ์ธ๋ถ API + ์บ์ฑ โ `analysis/`๋ ์์ํจ์(๊ฐ์ฅ ๋๊บผ์ด ํ
์คํธ). LLM๋ ์๋ฒ๋ ์์น๋ฅผ "์์ฐ"ํ์ง ์๋๋ค โ ๋ชจ๋ ๊ณ์ฐ์ ๊ฒฐ์ ๋ก ์ ํจ์๋ค.
## ๐ Quickstart
๋ฐฐํฌ๋ ์๋ฒ URL ํ๋๋ฉด ๋๋ค. API ํค ๋ถํ์(๊ณต๊ฐ ๋ฐ์ดํฐ๋ง ์ ๊ณต).
**claude.ai** โ ์ค์ โ ์ปค๋ฅํฐ โ ์ปค์คํ
์ปค๋ฅํฐ ์ถ๊ฐ:
```
https://korea-stock-analyzer-mcp-production.up.railway.app/mcp
```
**Claude Code**:
```bash
claude mcp add --transport http korea-stock https://korea-stock-analyzer-mcp-production.up.railway.app/mcp
```
<details>
<summary><strong>Claude Desktop / Cursor</strong> (mcp.json)</summary>
```json
{
"mcpServers": {
"korea-stock": {
"type": "http",
"url": "https://korea-stock-analyzer-mcp-production.up.railway.app/mcp"
}
}
}
```
</details>
์ฐ๊ฒฐ ํ ์ด๋ ๊ฒ ๋ฌผ์ด๋ณด๋ฉด ๋๋ค:
> "์ผ์ฑ์ ์ ์ต๊ทผ 5๋
์ฌ๋ฌด์ ํ ํ๋ฆ์ด๋ ๋ฆฌ์คํฌ ์์ธ ์ง์ด์ค"
## ๐ ๏ธ Tools
| ๋๊ตฌ | ์ค๋ช
| ์ฃผ์ ํ๋ผ๋ฏธํฐ |
|---|---|---|
| `search_company` | ์ข
๋ชฉ๋ช
/์ฝ๋๋ก ์์ฅ์ฌ ๊ฒ์ (KOSPIยทKOSDAQ) | `query` |
| `get_quote` | ์์ธยท์๊ฐ์ด์กยท52์ฃผ ๊ณ ์ ยท๊ฑฐ๋๋ + ์์ด ์ ํฉ์ฑ ๊ฒ์ฌ | `ticker` |
| `get_financials` | ์ค์ธก ์ฐ๊ฐ ์ฌ๋ฌด์ ํ + ์์ต์ฑยท์์ ์ฑยท์ฑ์ฅ์ฑยทํ๊ธํ๋ฆ ๋น์จ | `ticker`, `years` (2โ10) |
| `get_valuation` | PER/PBR ๋ฉํฐํ + 3์๋๋ฆฌ์ค ๊ฐ์น ๋ฒ์ (๊ฐ์ ๋ช
์) | `ticker` |
| `get_risk_flags` | ์ฌ๋ฌด ์ ์ ํธ 6์ข
+ ์ต๊ทผ ๊ณต์ ์ํ ํค์๋ | `ticker`, `disclosure_days` |
๋ชจ๋ ์๋ต์ ๋ฐ์ดํฐ ๊ธฐ์ค์ผ(`as_of`)๊ณผ ์ถ์ฒ(`data_source`)๊ฐ ๋ถ๋๋ค.
## โ๏ธ Deploy Your Own
Railway ๊ธฐ์ค (Dockerfile ์๋ ๊ฐ์ง):
1. ์ด ๋ ํฌ๋ฅผ ํฌํฌ โ Railway์์ GitHub ๋ ํฌ ์ฐ๊ฒฐ
2. ํ๊ฒฝ๋ณ์:
| ๋ณ์ | ํ์ | ์ค๋ช
|
|---|---|---|
| `DART_API_KEY` | โ
| [opendart.fss.or.kr](https://opendart.fss.or.kr) ๋ฌด๋ฃ ๋ฐ๊ธ (์ผ 20,000๊ฑด) |
| `FASTMCP_HTTP_ALLOWED_HOSTS` | โ
| `["<์๋น์ค>.up.railway.app","healthcheck.railway.app"]` |
| `RATE_LIMIT_RPS` / `RATE_LIMIT_BURST` | โ | ๊ธฐ๋ณธ 5 / 15 |
์
์ฑ ์ฌ์ฉ์ ์ฐจ๋จ์ ๋ณ๋ ํ๊ฒฝ๋ณ์ ์์ด ์๋ ์ ์ฉ๋๋ค. Railway ์์ฒญ์ ์๋์ผ๋ก
์ธ์ํด IP๋ณ ๋ถ๋น 30ํ, ๋ฐ๋ณต ์ด๊ณผ 3ํ ์ 1์๊ฐ ์ฐจ๋จํ๋ฉฐ, `/health`๋ ๋ถ๋น
120ํ๋ก ์ ํํด ์ฐํ ๊ฒฝ๋ก๋ฅผ ๋ง๋๋ค.
3. Serverless(App Sleeping) **๋นํ์ฑ** ๊ถ์ฅ โ ์ฝ๋ ์คํํธ ์ ์ปค๋ฅํฐ ์ฐ๊ฒฐ ์คํจ ๋ฐฉ์ง
๋ก์ปฌ ์คํ:
```bash
uv sync
DART_API_KEY=<key> uv run uvicorn app.main:app --app-dir src --port 8000
```
ํ
์คํธ:
```bash
uv run pytest # ๋จ์ยท๊ฒฝ๊ณ ํ
์คํธ (์ธ๋ถ API ์์)
uv run pytest -m live -o addopts="" # ์ค์ KRX/DART ๊ฒ์ฆ (ํค ํ์)
```
## ๐ ๋ฐ์ดํฐ ์ถ์ฒ์ ํ๊ณ
| ๋ฐ์ดํฐ | ์ถ์ฒ | ํ๊ณ |
|---|---|---|
| ์ฌ๋ฌด์ ํ | DART OpenAPI (์ฌ์
๋ณด๊ณ ์ XBRL) | ์ฐ๊ฐ๋ง, ๋ถ๊ธฐ ๋ฏธ์ ๊ณต |
| ์์ธยท์์ด | KRX (FinanceDataReader) | ์ผ๋ณ ์ค๋
์ท, ์ค์๊ฐ ์๋ |
| ๊ณต์ ๋ชฉ๋ก | DART OpenAPI | ์ต๊ทผ 7~365์ผ |
| FCF | ์์
CF โ ์ ํ์์ฐ ์ทจ๋ | **๊ทผ์ฌ์น** โ ๋ฌดํ์์ฐยท๋ฆฌ์ค ํฌ์ ๋ฏธํฌํจ |
## ๐ Disclaimer
๋ณธ ์๋ฒ์ ์ถ๋ ฅ์ ๊ณต์ยท์์ธ ๋ฐ์ดํฐ์ ์ฐ์ ๊ฐ๊ณต ๊ฒฐ๊ณผ์ด๋ฉฐ **ํฌ์ ์๋ฌธ์ด ์๋๋ค**. ์๋๋ฆฌ์ค ๊ฐ์ ๋ช
์๋ ๊ฐ์ ์ ๊ณ์ฐ ๊ฒฐ๊ณผ์ผ ๋ฟ ๋ชฉํ ์ฃผ๊ฐ๊ฐ ์๋๋ค. ์๋ฒ๋ ๋งค์ยท๋งค๋ยท๋น์ค ํ๋จ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ, ํฌ์ ํ๋จ๊ณผ ์ฑ
์์ ์ ์ ์ผ๋ก ์ด์ฉ์์๊ฒ ์๋ค.
## ๐ค Contributing
์ด์ยทPR ํ์. ์์น ํ๋๋ง ์ง์ผ๋ฌ๋ผ: **๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์๋ค๊ณ ๋ตํ๋ค.** ์ถ์ ์น ์ฃผ์
ยทํ๋์ฝ๋ฉ ํด๋ฐฑ์ด ๋ค์ด๊ฐ PR์ ๋ฐ์ง ์๋๋ค. ํ
์คํธ๋ `uv run pytest` ํต๊ณผ ํ์.
## ๐ License
[Apache-2.0](LICENSE)
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessResponsive