Skip to main content
Glama
SeoNaRu

Korean Company Information MCP Server

by SeoNaRu
README.md
# ๐Ÿข ํ•œ๊ตญ ๊ธฐ์—…์ •๋ณด ์กฐํšŒ MCP ์„œ๋ฒ„

**DART API**๋ฅผ ํ™œ์šฉํ•œ MCP (Model Context Protocol) ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

AI ์—์ด์ „ํŠธ(Claude Desktop, Cursor ๋“ฑ)๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•œ๊ตญ ์ƒ์žฅ๊ธฐ์—…์˜ ์žฌ๋ฌด์ œํ‘œ, ๊ณต์‹œ์ •๋ณด, ์ž„์›์ •๋ณด, ์ง€๋ถ„๊ตฌ์กฐ ๋“ฑ์„ ์กฐํšŒํ•˜๊ณ  ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

---

## โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

### ๐Ÿ“Š ๊ธฐ์—… ์ •๋ณด ์กฐํšŒ (DART API)

| ๊ธฐ๋Šฅ               | ์„ค๋ช…                                                |
| ------------------ | --------------------------------------------------- |
| **๊ธฐ์—… ๊ฒ€์ƒ‰**      | ํšŒ์‚ฌ๋ช…์œผ๋กœ ๊ธฐ์—… ๊ฒ€์ƒ‰ ๋ฐ ๊ธฐ๋ณธ์ •๋ณด ์กฐํšŒ               |
| **๊ธฐ์—… ๊ธฐ๋ณธ์ •๋ณด**  | ํšŒ์‚ฌ๋ช…, ๋Œ€ํ‘œ์ž๋ช…, ์„ค๋ฆฝ์ผ, ๋ณธ์‚ฌ์ฃผ์†Œ ๋“ฑ ๊ธฐ๋ณธ์ •๋ณด ์กฐํšŒ |
| **์žฌ๋ฌด์ œํ‘œ ์กฐํšŒ**  | ์†์ต๊ณ„์‚ฐ์„œ, ์žฌ๋ฌด์ƒํƒœํ‘œ, ํ˜„๊ธˆํ๋ฆ„ํ‘œ                  |
| **์žฌ๋ฌด ์ถ”์ด ๋ถ„์„** | ์ตœ๊ทผ 5-10๋…„ ์žฌ๋ฌด์ œํ‘œ ์ถ”์ด ๋ถ„์„                      |
| **๊ณต์‹œ์ •๋ณด ์กฐํšŒ**  | ์ตœ๊ทผ ๊ณต์‹œ ๋ชฉ๋ก ๋ฐ ์ƒ์„ธ ๋‚ด์šฉ                         |
| **์ž„์›์ •๋ณด ์กฐํšŒ**  | ์ž„์›๋ช…, ์ง์ฑ…, ๋ณด์ˆ˜ ๋“ฑ ์ž„์›์ •๋ณด ์กฐํšŒ                 |
| **์ง€๋ถ„๋ณด๊ณ ์„œ**     | ์ฃผ์ฃผ๋ช…, ๋ณด์œ ์ง€๋ถ„, ๋น„์œจ ๋“ฑ ์ง€๋ถ„๊ตฌ์กฐ ์กฐํšŒ             |

### ๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™”

- **์ „๋žต์  ์บ์‹ฑ**: ๊ธฐ์—…์ •๋ณด ๋ฐ์ดํ„ฐ๋ฅผ 24์‹œ๊ฐ„ ์บ์‹ฑํ•˜์—ฌ API ํ˜ธ์ถœ ์ตœ์†Œํ™”
- **๋น ๋ฅธ ์‘๋‹ต ์†๋„**: ์บ์‹œ ๊ธฐ๋ฐ˜ ์ฆ‰์‹œ ์‘๋‹ต
- **์•ˆ์ •์ ์ธ ์šด์˜**: ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋ฐ ๋กœ๊น… ์‹œ์Šคํ…œ
- **API ํ‚ค ์šฐ์„ ์ˆœ์œ„**: ๋ฉ”์ธ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ํ‚ค โ†’ .env ํŒŒ์ผ (๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ)

---

## ๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

- **MCP Framework**: FastMCP
- **Data Validation**: Pydantic
- **HTTP Client**: Requests
- **Caching**: cachetools (TTL ์บ์‹œ)
- **Async Processing**: asyncio
- **Environment**: Python-dotenv

---

## ๐Ÿ“ฆ ์„ค์น˜ ๋ฐ ์„ค์ •

### 1) ์˜์กด์„ฑ ์„ค์น˜

```bash
pip install -r requirements.txt
```

> ๐Ÿ’ก `uv`๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: `uv sync`

### 2) DART API ํ‚ค ๋ฐœ๊ธ‰ (๋ฌด๋ฃŒ, ์ฆ‰์‹œ)

1. [์ „์ž๊ณต์‹œ์‹œ์Šคํ…œ Open DART](https://opendart.fss.or.kr/) ๋ฐฉ๋ฌธ
2. ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ
3. **์ธ์ฆํ‚ค ์‹ ์ฒญ/๊ด€๋ฆฌ** ๋ฉ”๋‰ด์—์„œ ์ธ์ฆํ‚ค ๋ฐœ๊ธ‰
4. **์ฆ‰์‹œ ๋ฐœ๊ธ‰** (๋ฌด๋ฃŒ)

> ๐Ÿ’ก **๋ฌด๋ฃŒ**์ด๋ฉฐ, ์ผ์ผ API ํ˜ธ์ถœ ์ œํ•œ์ด ์ถฉ๋ถ„ํžˆ ๋„‰๋„‰ํ•ฉ๋‹ˆ๋‹ค!

### 3) ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— `.env` ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  API ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

```bash
cp env.example .env
```

`.env` ํŒŒ์ผ ๋‚ด์šฉ:

```env
DART_API_KEY=your_dart_api_key_here
LOG_LEVEL=INFO
PORT=8097
```

### 4) ์„œ๋ฒ„ ์‹คํ–‰

#### MCP ์„œ๋ฒ„ ๋ชจ๋“œ (stdio)

```bash
python -m src.main
```

#### HTTP ์„œ๋ฒ„ ๋ชจ๋“œ

```bash
HTTP_MODE=1 python -m src.main
```

HTTP ์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ `http://localhost:8097`์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

---

## ๐Ÿ”Œ MCP ํด๋ผ์ด์–ธํŠธ ์„ค์ •

### Claude Desktop

`claude_desktop_config.json` ํŒŒ์ผ์— ๋‹ค์Œ์„ ์ถ”๊ฐ€:

**์„ค์ • ํŒŒ์ผ ์œ„์น˜:**

- **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
- **Mac**: `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Linux**: `~/.config/Claude/claude_desktop_config.json`

**์„ค์ • ์˜ˆ์‹œ:**

```json
{
  "mcpServers": {
    "company-info": {
      "command": "python",
      "args": ["-m", "src.main"],
      "cwd": "/path/to/company-info-mcp",
      "env": {
        "DART_API_KEY": "your_dart_api_key_here"
      }
    }
  }
}
```

> โš ๏ธ **์ค‘์š”**: `cwd` ๊ฒฝ๋กœ๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•˜์„ธ์š”!

### Cursor

Cursor์˜ MCP ์„ค์ •์—์„œ ์œ„์™€ ๋™์ผํ•œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

---

## ๐Ÿงฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MCP ๋„๊ตฌ

### `search_company_tool`

ํšŒ์‚ฌ๋ช…์œผ๋กœ ๊ธฐ์—…์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `company_name` (ํ•„์ˆ˜): ๊ฒ€์ƒ‰ํ•  ํšŒ์‚ฌ๋ช…

### `get_company_overview_tool`

๊ธฐ์—…์˜ ๊ธฐ๋ณธ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `corp_code` (์„ ํƒ): ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ
- `company_name` (์„ ํƒ): ํšŒ์‚ฌ๋ช… (corp_code ๋˜๋Š” company_name ์ค‘ ํ•˜๋‚˜ ํ•„์ˆ˜)

### `get_financial_statement_tool`

๊ธฐ์—…์˜ ์žฌ๋ฌด์ œํ‘œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `corp_code` (์„ ํƒ): ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ
- `company_name` (์„ ํƒ): ํšŒ์‚ฌ๋ช…
- `bsns_year` (์„ ํƒ): ์‚ฌ์—…์—ฐ๋„ (YYYY ํ˜•์‹)
- `reprt_code` (์„ ํƒ): ๋ณด๊ณ ์„œ ์ฝ”๋“œ (๊ธฐ๋ณธ๊ฐ’: "11011")

### `analyze_financial_trend_tool`

๊ธฐ์—…์˜ ์žฌ๋ฌด ์ถ”์ด๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค (์ตœ๊ทผ N๋…„).

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `corp_code` (ํ•„์ˆ˜): ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ
- `years` (์„ ํƒ): ๋ถ„์„ํ•  ์—ฐ์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 5, ์ตœ๋Œ€: 10)

### `get_public_disclosure_tool`

๊ธฐ์—…์˜ ๊ณต์‹œ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `corp_code` (ํ•„์ˆ˜): ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ
- `bgn_de` (์„ ํƒ): ์‹œ์ž‘์ผ (YYYYMMDD ํ˜•์‹)
- `end_de` (์„ ํƒ): ์ข…๋ฃŒ์ผ (YYYYMMDD ํ˜•์‹)
- `page_no` (์„ ํƒ): ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ (๊ธฐ๋ณธ๊ฐ’: 1)
- `page_count` (์„ ํƒ): ํŽ˜์ด์ง€๋‹น ๊ฑด์ˆ˜ (๊ธฐ๋ณธ๊ฐ’: 10)

### `get_executives_tool`

๊ธฐ์—…์˜ ์ž„์›์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `corp_code` (์„ ํƒ): ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ
- `company_name` (์„ ํƒ): ํšŒ์‚ฌ๋ช…
- `bsns_year` (์„ ํƒ): ์‚ฌ์—…์—ฐ๋„ (YYYY ํ˜•์‹)
- `reprt_code` (์„ ํƒ): ๋ณด๊ณ ์„œ ์ฝ”๋“œ (๊ธฐ๋ณธ๊ฐ’: "11011")

### `get_shareholders_tool`

์ง€๋ถ„๋ณด๊ณ ์„œ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

**ํŒŒ๋ผ๋ฏธํ„ฐ:**

- `corp_code` (์„ ํƒ): ๊ธฐ์—… ๊ณ ์œ ๋ฒˆํ˜ธ
- `company_name` (์„ ํƒ): ํšŒ์‚ฌ๋ช…
- `bsns_year` (์„ ํƒ): ์‚ฌ์—…์—ฐ๋„ (YYYY ํ˜•์‹)
- `reprt_code` (์„ ํƒ): ๋ณด๊ณ ์„œ ์ฝ”๋“œ (๊ธฐ๋ณธ๊ฐ’: "11011")

---

## ๐Ÿ“ก HTTP API ์—”๋“œํฌ์ธํŠธ

HTTP ๋ชจ๋“œ๋กœ ์‹คํ–‰ ์‹œ ๋‹ค์Œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

### Health Check

```bash
GET /health
POST /health
```

### ๋„๊ตฌ ๋ชฉ๋ก ์กฐํšŒ

```bash
GET /tools
```

### ๋„๊ตฌ ์‹คํ–‰

```bash
POST /tools/{tool_name}
Content-Type: application/json

{
  "company_name": "์‚ผ์„ฑ์ „์ž",
  "env": {
    "DART_API_KEY": "your_api_key"
  }
}
```

---

## ๐Ÿณ Docker ์‹คํ–‰

```bash
# ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t company-info-mcp:latest .

# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker run --rm \
  -e DART_API_KEY=your_dart_api_key_here \
  -p 8097:8097 \
  company-info-mcp:latest
```

---

## ๐Ÿ”‘ API ํ‚ค ์šฐ์„ ์ˆœ์œ„

MCP ์„œ๋ฒ„๋Š” ๋‹ค์Œ ์ˆœ์„œ๋กœ API ํ‚ค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค:

1. **์šฐ์„ ์ˆœ์œ„ 1**: `arguments.env.DART_API_KEY` (๋ฉ”์ธ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ํ‚ค)
2. **์šฐ์„ ์ˆœ์œ„ 2**: `.env` ํŒŒ์ผ์˜ `DART_API_KEY` (๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ)
3. **๋‘˜ ๋‹ค ์—†์œผ๋ฉด**: Health ์ฒดํฌ์—์„œ "๋“ฑ๋ก๋œ ํ‚ค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค" ๋ฐ˜ํ™˜

์ด๋ฅผ ํ†ตํ•ด:

- **ํ”„๋กœ๋•์…˜**: ๋ฉ”์ธ ์„œ๋ฒ„์—์„œ ๊ฐ ์‚ฌ์šฉ์ž๋ณ„ ํ‚ค๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์‚ฌ์šฉ
- **๋กœ์ปฌ ๊ฐœ๋ฐœ**: `.env` ํŒŒ์ผ์— ํ‚ค๋ฅผ ์„ค์ •ํ•˜์—ฌ ๊ฐœ๋ฐœ

---

## ๐Ÿ› ๋ฌธ์ œ ํ•ด๊ฒฐ

### "API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜

**ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:**

1. `.env` ํŒŒ์ผ์— `DART_API_KEY`๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
2. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง์ ‘ ์„ค์ •: `export DART_API_KEY=your_key`

### MCP ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜

**ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:**

1. ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ
2. Python ๊ฒฝ๋กœ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
3. ์˜์กด์„ฑ์ด ๋ชจ๋‘ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ: `pip install -r requirements.txt`
4. `cwd` ๊ฒฝ๋กœ๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ
5. Claude Desktop ์™„์ „ ์ข…๋ฃŒ ํ›„ ์žฌ์‹œ์ž‘

---

## ๐Ÿ“„ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” DART API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, DART API์˜ ์ด์šฉ์•ฝ๊ด€์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.