# ๐ข ํ๊ตญ ๊ธฐ์
์ ๋ณด ์กฐํ 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์ ์ด์ฉ์ฝ๊ด์ ์ค์ํฉ๋๋ค.