CAU e-class MCP
by legendwon
README.md
# ๐ CAU e-class MCP
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
**๋ธ๋ผ์ฐ์ ์์ด Claude์์ ๋ฐ๋ก ์ค์๋ e-class๋ฅผ ํ์ธํ์ธ์!**
๊ณต์ง์ฌํญ, ๊ณผ์ , ๊ฐ์์๋ฃ๋ฅผ Claude์ ๋ํํ๋ฉด์ ํ์ธํ ์ ์๋ MCP ์๋ฒ์
๋๋ค.
> โ ๏ธ ํ์์ด ๋ง๋ **๋น๊ณต์** ๋๊ตฌ์
๋๋ค. ์ค์๋ํ๊ต์ ๋ฌด๊ดํ๋ฉฐ, ์ฌ์ฉ์ ๋ฐ๋ฅธ ์ฑ
์์ ๋ณธ์ธ์๊ฒ ์์ต๋๋ค.
---
## โจ ์ด๋ฐ ๊ฑธ ํ ์ ์์ด์
| ๊ธฐ๋ฅ | ์ค๋ช
|
|---|---|
| ๐ **๋์๋ณด๋** | ์๊ฐ ์ค์ธ ์ ์ฒด ๊ณผ๋ชฉ ํ๋์ ๋ณด๊ธฐ |
| ๐
**๋ฐ์ผ๋ฆฌ ๋ธ๋ฆฌํ** | ์ค๋ ํ ์ผ, ์ชฝ์ง, ๊ณต์ง์ฌํญ์ ํ ๋ฒ์ ์์ฝ |
| ๐ **ํตํฉ ์์ธ ์กฐํ** | ๊ณผ๋ชฉ๋ณ ๊ฐ์(์ถ์ ํฌํจ), ๊ณผ์ , ์๋ฃ์ค ์ ๋ณด ์กฐํ |
| ๐ฅ **VOD ์ง๋งํฌ** | ๋์์ ๊ฐ์์ ์ค์ ์คํธ๋ฆฌ๋ฐ ์ฃผ์ ์ถ์ถ |
| ๐ **์ง๋ฅํ ๋ค์ด๋ก๋** | ํ์ผ๋ช
๋ณ๊ฒฝ ๋ฐ ๊ณผ๋ชฉ๋ณ ํด๋ ์๋ ๊ด๋ฆฌ ๋ค์ด๋ก๋ |
| ๐ **Web UI** | ๋ธ๋ผ์ฐ์ ์์ ์ธ์ฆ ์ค์ + ์๋ฒ ๋ชจ๋ํฐ๋ง |
---
## ๐ ์์ํ๊ธฐ
### ํ์ํ ๊ฒ
- **Python 3.10** ์ด์
- **์ค์๋ ํฌํ ๊ณ์ ** (ํ๋ฒ + ๋น๋ฐ๋ฒํธ)
- **Claude Code** ([์ค์น ๋งํฌ](https://claude.com/code))
### Step 1: ์ค์น
**๋ฐฉ๋ฒ A) GitHub์์ ๋ฐ๋ก ์ค์น** (๊ฐ์ฅ ๊ฐ๋จ)
```bash
pip install git+https://github.com/legendwon/cau-eclass-mcp.git
```
**๋ฐฉ๋ฒ B) ์ง์ ํด๋ก ํด์ ์ค์น** (๊ฐ๋ฐ์ฉ)
```bash
git clone https://github.com/legendwon/cau-eclass-mcp.git
cd cau-eclass-mcp
pip install -e .
```
> ๐ก **venv๋ฅผ ์ฐ๊ณ ์๋ค๋ฉด?** ๋ฐ๋์ ํด๋น venv์ pip์ผ๋ก ์ค์นํ์ธ์:
> ```bash
> # Windows
> .\venv\Scripts\pip.exe install -e .
>
> # macOS/Linux
> ./venv/bin/pip install -e .
> ```
### Step 2: ์ธ์ฆ ์ค์
์ต์ด 1ํ๋ง ํ๋ฉด ๋ฉ๋๋ค. 3๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํธํ ๊ฑธ ๊ณจ๋ผ์ฃผ์ธ์:
#### ๐ ๋ฐฉ๋ฒ 1: OS ํค๋ง์ ์ ์ฅ (์ถ์ฒ)
๊ฐ์ฅ ์์ ํฉ๋๋ค. ๋น๋ฐ๋ฒํธ๊ฐ ์ด์์ฒด์ ์ ๋ณด์ ์ ์ฅ์์ ์ํธํ๋์ด ์ ์ฅ๋ผ์.
```bash
python -c "from cau_eclass_mcp.utils.credentials import CredentialManager; m = CredentialManager(); m.prompt_for_credentials()"
```
ํ๋ฒ๊ณผ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด ๋!
- Windows โ ์๊ฒฉ ์ฆ๋ช
๊ด๋ฆฌ์
- macOS โ ํค์ฒด์ธ
- Linux โ GNOME Keyring / KWallet
#### ๐ ๋ฐฉ๋ฒ 2: Web UI์์ ์ค์
ํฐ๋ฏธ๋์ด ๋ถํธํ๋ค๋ฉด ์น ๋ธ๋ผ์ฐ์ ์์๋ ์ค์ ํ ์ ์์ด์:
```bash
python -m cau_eclass_mcp --sse
```
๋ธ๋ผ์ฐ์ ์์ http://localhost:8000 ์ ์ด๊ณ , ํ๋ฒ/๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ๋ฉด ๋ฉ๋๋ค.
#### โก ๋ฐฉ๋ฒ 3: ํ๊ฒฝ๋ณ์
์์๋ก ์ฐ๊ฑฐ๋ CI/CD์์ ์ ์ฉํฉ๋๋ค:
```bash
# Windows (PowerShell)
$env:CAU_USERNAME="ํ๋ฒ"
$env:CAU_PASSWORD="๋น๋ฐ๋ฒํธ"
# macOS/Linux
export CAU_USERNAME="ํ๋ฒ"
export CAU_PASSWORD="๋น๋ฐ๋ฒํธ"
```
#### ๐คท ๋ฐฉ๋ฒ 4: ๊ทธ๋ฅ ์คํํ๊ธฐ
์๋ฌด ์ค์ ์ ํด๋ ์ฒซ ์คํ ์ ์๋์ผ๋ก ๋ฌผ์ด๋ด
๋๋ค!
### Step 3: Claude Code์ ์ฐ๊ฒฐ
Claude Code๊ฐ ์ด MCP ์๋ฒ๋ฅผ ์ธ์ํ๋๋ก ์ค์ ํ์ผ์ ์ถ๊ฐํด์ฃผ์ธ์.
**๋ชจ๋ ํ๋ก์ ํธ์์ ์ฐ๊ณ ์ถ๋ค๋ฉด** โ `~/.claude/claude.json` ํธ์ง:
```json
{
"mcpServers": {
"cau-eclass": {
"command": "python",
"args": ["-m", "cau_eclass_mcp"]
}
}
}
```
> Windows ๊ฒฝ๋ก: `C:\Users\์ฌ์ฉ์์ด๋ฆ\.claude\claude.json`
**ํน์ ํ๋ก์ ํธ์์๋ง ์ฐ๊ณ ์ถ๋ค๋ฉด** โ ํ๋ก์ ํธ ๋ฃจํธ์ `.mcp.json` ์์ฑ:
```json
{
"mcpServers": {
"cau-eclass": {
"type": "stdio",
"command": "python",
"args": ["-m", "cau_eclass_mcp"]
}
}
}
```
> ๐ก **venv๋ฅผ ์ฐ๊ณ ์๋ค๋ฉด?** `"command"`๋ฅผ venv์ python ๊ฒฝ๋ก๋ก ๋ฐ๊ฟ์ฃผ์ธ์:
> ```json
> {
> "mcpServers": {
> "cau-eclass": {
> "type": "stdio",
> "command": "D:\\๊ฒฝ๋ก\\cau-eclass-mcp\\venv\\Scripts\\python.exe",
> "args": ["-m", "cau_eclass_mcp"],
> "cwd": "D:\\๊ฒฝ๋ก\\cau-eclass-mcp",
> "env": {
> "PYTHONPATH": "D:\\๊ฒฝ๋ก\\cau-eclass-mcp\\src"
> }
> }
> }
> }
> ```
์ค์ ํ **Claude Code๋ฅผ ์ฌ์์**ํ๋ฉด ๋!
---
## ๐ฌ ์ฌ์ฉ๋ฒ
Claude Code์์ ์์ฐ์ค๋ฝ๊ฒ ๋งํ๋ฉด ๋ฉ๋๋ค:
```
๋: "e-class ์ค๋ ๋ฌด์จ ์ผ ์์ด?"
Claude: [์ค๋ ๋ง๊ฐ์ธ ๊ณผ์ , ์ฝ์ง ์์ ์ชฝ์ง, ์ต์ ๊ณต์ง์ฌํญ ์์ฝ ํ์]
๋: "์ด์ฒด๋ณด ์ด๋ฒ ์ฃผ ๊ฐ์ ๋ชฉ๋ก ๋ณด์ฌ์ค"
Claude: [์ฃผ์ฐจ๋ณ ๊ฐ์ ๋ชฉ๋ก + ๋์์ ์์ฒญ ์๋ฃ ์ฌ๋ถ ํ์]
๋: "์ธ๊ณต์ง๋ฅ ๊ณผ์ ํ์ธํด์ค"
Claude: [๊ณผ์ ๋ชฉ๋ก + ๋ง๊ฐ์ผ + ์ ์ถ ์ํ ํ์]
๋: "1์ฃผ์ฐจ ๊ฐ์์ ๋ค์ด๋ก๋ํด์ค"
Claude: [ํ์ผ๋ช
์ '1์ฃผ์ฐจ_๊ฐ์์.pdf'๋ก ๋ฐ๊พธ๊ณ '์ด์ฒด๋ณด' ํด๋์ ์ ์ฅ]
๋: "๊ฐ์ ์์ ๋งํฌ ์ถ์ถํด์ค"
Claude: [๋์์ ์ง๋งํฌ์ ํ์ง๋ณ URL ์ ๊ณต]
```
---
## ๐ Web UI ๋ชจ๋ (SSE)
ํฐ๋ฏธ๋ ๋์ ๋ธ๋ผ์ฐ์ ์์ ์ฐ๊ณ ์ถ๋ค๋ฉด SSE ๋ชจ๋๋ก ์คํํ์ธ์:
```bash
# ๊ธฐ๋ณธ ์คํ (http://localhost:8000)
python -m cau_eclass_mcp --sse
# ํฌํธ ๋ณ๊ฒฝ
python -m cau_eclass_mcp --sse --port 9000
```
๋ธ๋ผ์ฐ์ ์์ http://localhost:8000 ์ ์ด๋ฉด:
- **์ธ์ฆ ์ค์ ** โ ํ๋ฒ/๋น๋ฐ๋ฒํธ ๋ฑ๋ก, ํ์ธ, ์ญ์
- **์๋ฒ ์ํ** โ ์ค์๊ฐ ๋ชจ๋ํฐ๋ง, ์ธ์ฆ ์ํ, ๊ฐ๋ ์๊ฐ
- **API ๋ฌธ์** โ http://localhost:8000/docs ์์ Swagger UI ํ์ธ
์ข
๋ฃํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ `Ctrl+C`
---
## ๐ง MCP ๋๊ตฌ ๋ชฉ๋ก
Claude Code์์ ์๋์ผ๋ก ์ฌ์ฉ๋๋ ๋๊ตฌ๋ค์
๋๋ค:
| ๋๊ตฌ | ์ค๋ช
| ํ๋ผ๋ฏธํฐ |
|---|---|---|
| `get_dashboard` | ์ ์ฒด ์๊ฐ ๊ณผ๋ชฉ ์กฐํ | ์์ |
| `get_daily_briefing` | **(์ถ์ฒ)** ํตํฉ ๋ฐ์ผ๋ฆฌ ๋ธ๋ฆฌํ | ์์ |
| `get_course_details` | ๊ฐ์/๊ณผ์ /์๋ฃ์ค ์์ธ ์กฐํ | `course_id`, `content_type` ('weekly', 'assignments', 'files') |
| `download_file` | ์ค๋งํธ ํ์ผ ๋ค์ด๋ก๋ | `course_id`, `file_id`, `save_path` |
| `get_vod_info` | ๋์์ ์คํธ๋ฆฌ๋ฐ ๋งํฌ ์ถ์ถ | `content_id` |
---
## ๐๏ธ ๊ธฐ์ ๊ตฌ์กฐ
### CAU-ON & LearningX ํตํฉ
์ค์๋๋ Canvas ๊ธฐ๋ฐ์ **CAU-ON**๊ณผ ๋์์/์ถ์ ๊ด๋ฆฌ๋ฅผ ์ํ **LearningX**๋ฅผ ํผํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๋ณธ MCP ์๋ฒ๋ ์ด ๋ ์์คํ
์ ๋ฐ์ดํฐ๋ฅผ ํตํฉํ์ฌ ์ ๊ณตํฉ๋๋ค.
1. CAU SSO ํฌํ์์ RSA ์ํธํ๋ก ๋ก๊ทธ์ธ
2. API๊ฐ ํ์ฑํ๋ ์ธ์
์ฟ ํค ๋ฐ JWT ํ ํฐ ํ๋
3. Canvas API ๋ฐ LearningX API (`xn_api_token`) ํตํฉ ์์ฒญ
4. OCS XML ํ์ฑ์ ํตํ VOD ์คํธ๋ฆฌ๋ฐ ์ฃผ์ ์ถ์ถ
### ์ธ์ฆ ํ๋ฆ
```
ํ๋ฒ/๋น๋ฐ๋ฒํธ ์
๋ ฅ โ SSO ๋ก๊ทธ์ธ โ RSA ๋น๋ฐ๋ฒํธ ์ํธํ โ Canvas ์ธ์
โ API ํ์ฑ ์ฟ ํค ํ๋ โ CAU-ON API ์์ฒญ
```
- ์๋ฒ๊ฐ ์ ๊ณตํ๋ RSA ๊ฐ์ธํค๋ก ํด๋ผ์ด์ธํธ ์ธก ์ํธํ (ํน์ดํ ๊ตฌ์กฐ!)
- PKCS1v15 ํจ๋ฉ
- HTTP/2 ํ์
- `Referer` ํค๋๊ฐ ์ธ์
์
๊ทธ๋ ์ด๋์ ํ์
- ์ธ์
์ฟ ํค: 208์ (๊ธฐ๋ณธ) โ 421์ (API ํ์ฑ)
---
## โ ๋ฌธ์ ํด๊ฒฐ
### "Failed to authenticate with CAU SSO"
- ํ๋ฒ/๋น๋ฐ๋ฒํธ๊ฐ ๋ง๋์ง ํ์ธ
- Web UI์์ ๋ค์ ์ค์ : http://localhost:8000 (SSE ๋ชจ๋)
- ๋๋ ๊ธฐ์กด ์ธ์ฆ ์ ๋ณด ์ญ์ ํ ์ฌ๋ฑ๋ก:
```bash
python -c "from cau_eclass_mcp.utils.credentials import CredentialManager; m = CredentialManager(); m.delete_credentials()"
```
### "Keyring not available"
ํค๋ง์ด ์ ๋๋ฉด ํ๊ฒฝ๋ณ์๋ฅผ ์ฌ์ฉํ์ธ์:
```bash
$env:CAU_USERNAME="ํ๋ฒ"
$env:CAU_PASSWORD="๋น๋ฐ๋ฒํธ"
```
### MCP ์๋ฒ๊ฐ ์๋ตํ์ง ์์ ๋
1. ์ง์ ์คํํด์ ์๋ฌ ํ์ธ:
```bash
python -m cau_eclass_mcp # stdio ๋ชจ๋
python -m cau_eclass_mcp --sse # SSE ๋ชจ๋
```
2. Claude Code ๋ก๊ทธ ํ์ธ
3. `.mcp.json` ๋๋ `claude.json` ์ค์ ํ์ธ
### ์ธ์
๋ง๋ฃ ์๋ฌ
์ธ์
์ 30๋ถ ๋์ ์บ์๋๋ฉฐ, ๋ง๋ฃ ์ ์๋์ผ๋ก ์ฌ๋ก๊ทธ์ธ๋ฉ๋๋ค. ๊ทธ๋๋ ์๋ฌ๊ฐ ๋๋ฉด Claude Code๋ฅผ ์ฌ์์ํ์ธ์.
---
## ๐ ๏ธ ๊ฐ๋ฐ ์ฐธ์ฌ
### ํ
์คํธ ์คํ
```bash
pip install -e .[dev]
pytest tests/ -v
```
### ์ฝ๋ ํฌ๋งทํ
```bash
black src/ tests/
ruff check src/ tests/
```
### ๊ธฐ์ฌํ๊ธฐ
1. ์ด repository๋ฅผ Fork
2. ๊ธฐ๋ฅ ๋ธ๋์น ์์ฑ (`git checkout -b feature/๋ฉ์ง๊ธฐ๋ฅ`)
3. ์ปค๋ฐ (`git commit -m '๋ฉ์ง ๊ธฐ๋ฅ ์ถ๊ฐ'`)
4. ํธ์ (`git push origin feature/๋ฉ์ง๊ธฐ๋ฅ`)
5. Pull Request ์์ฑ
---
## ๐ ๋ณด์
- ๋น๋ฐ๋ฒํธ๋ OS ํค๋ง์ ์ํธํ ์ ์ฅ
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ Git์ ์ปค๋ฐํ์ง ๋ง์ธ์
- ๋ณด์ ์ด์ ๋ฐ๊ฒฌ ์ [GitHub Issues](https://github.com/legendwon/cau-eclass-mcp/issues)๋ก ์๋ ค์ฃผ์ธ์
## ๐ ๋ผ์ด์ ์ค
MIT License โ [LICENSE](LICENSE) ํ์ผ ์ฐธ๊ณ
## ๐ ๊ฐ์ฌ
- [Model Context Protocol (MCP)](https://modelcontextprotocol.io/)
- [Claude Code](https://claude.com/code)
- 13์๊ฐ์ CAU-ON API ๋๋ฒ๊น
์์ ํ์ ๐
---
**๊ถ๊ธํ ์ ์ด๋ ๋ฒ๊ทธ๋?** โ [GitHub Issues](https://github.com/legendwon/cau-eclass-mcp/issues)์ ๋จ๊ฒจ์ฃผ์ธ์!
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues