Skip to main content
Glama
Mrbaeksang

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*

[![CI](https://github.com/Mrbaeksang/korea-stock-analyzer-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/Mrbaeksang/korea-stock-analyzer-mcp/actions)
[![Python](https://img.shields.io/badge/python-3.12+-blue?logo=python&logoColor=white)](https://www.python.org)
[![FastMCP](https://img.shields.io/badge/built%20with-FastMCP%203-6e56cf)](https://gofastmcp.com)
[![MCP](https://img.shields.io/badge/MCP-remote%20server-000)](https://modelcontextprotocol.io)
[![License](https://img.shields.io/github/license/Mrbaeksang/korea-stock-analyzer-mcp.svg)](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)

Maintenance

ActivitySlowing
ResponsivenessResponsive