# nworks
[](https://www.npmjs.com/package/nworks)
[](LICENSE)
[](https://www.npmjs.com/package/nworks)
[](https://glama.ai/mcp/servers/yjcho9317/nworks)
Featured in [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)
[๐บ๐ธ English](README.md) | ๐ฐ๐ท ํ๊ตญ์ด | [๐ฏ๐ต ๆฅๆฌ่ช](README.ja.md)
NAVER WORKS (LINE WORKS) ์ต์ด์ MCP ์๋ฒ.
๋ฉ์์ง, ์บ๋ฆฐ๋, ๋๋ผ์ด๋ธ, ๋ฉ์ผ, ํ ์ผ, ๊ฒ์ํ โ 26๊ฐ ๋๊ตฌ๋ฅผ CLI์ AI ์์ด์ ํธ์์ ์ธ ์ ์์ต๋๋ค.
## Quickstart
```bash
npm install -g nworks
nworks login --user
nworks calendar list
```
### AI ์์ด์ ํธ๊ฐ ์ค์ ๋ก ์ด๋ ๊ฒ ์๋๋ค
```
User: ์ค๋ ์ผ์ ์๋ ค์ค
Claude โ nworks_calendar_list
โ 3๊ฑด: ์คํ ๋์
(10:00), ์ ์ฌ๋ฏธํ
(12:00), ์ฝ๋๋ฆฌ๋ทฐ(15:00)
User: ํ ์ฑ๋์ ๋ฐฐํฌ ์๋ฃ ๋ฉ์์ง ๋ณด๋ด์ค
Claude โ nworks_message_send
{ "channel": "C001", "text": "v1.2.0 ๋ฐฐํฌ ์๋ฃ" }
โ ๋ฉ์์ง๊ฐ ์ ์ก๋์์ต๋๋ค
User: ์ฝ์ง ์์ ๋ฉ์ผ ํ์ธํ๊ณ ์์ฝํด์ค
Claude โ nworks_mail_list (unread)
โ ์ฝ์ง ์์ ๋ฉ์ผ 3ํต
Claude โ nworks_mail_read (๊ฐ๊ฐ)
โ "3ํต: 1) CTO ๋ฐฐํฌ ์น์ธ, 2) ๊ธ์์ผ ํ์ ์ด๋, 3) ์ฃผ๊ฐ ๋ณด๊ณ ๋ฆฌ๋ง์ธ๋"
```
## Install
```bash
npx nworks # ๋ฐ๋ก ์คํ
npm install -g nworks # ๊ธ๋ก๋ฒ ์ค์น
```
## ๋ก๊ทธ์ธ
```bash
# User OAuth (์บ๋ฆฐ๋, ๋๋ผ์ด๋ธ, ๋ฉ์ผ, ํ ์ผ, ๊ฒ์ํ)
nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
# ๋ด ๋ฉ์์ง ์ ์ก์ด ํ์ํ ๊ฒฝ์ฐ (Service Account)
nworks login
# ์ธ์ฆ ํ์ธ
nworks whoami
# ๋ก๊ทธ์์
nworks logout
```
> `nworks login --user`๋ CLIENT_ID + CLIENT_SECRET๋ง ์์ผ๋ฉด ๋ฉ๋๋ค. ํ๊ฒฝ๋ณ์๋ ๊ธฐ์กด ์ค์ ์ ์ด๋ฏธ ์๋ ๊ฐ์ ๋ค์ ๋ฌผ์ด๋ณด์ง ์์ต๋๋ค.
> **Developer Console ์ค์ **: User OAuth๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด [Developer Console](https://dev.worksmobile.com)์์ Redirect URL์ `http://localhost:9876/callback`์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
---
## AI ์์ด์ ํธ ์ฐ๋ (MCP ์๋ฒ)
Claude Desktop, Cursor ๋ฑ MCP ํธํ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
### ์ค์
๋จผ์ ๋ก๊ทธ์ธํฉ๋๋ค:
```bash
nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
```
๊ทธ๋ฆฌ๊ณ MCP ์ค์ ์ ์ถ๊ฐํฉ๋๋ค (`~/.config/claude/claude_desktop_config.json`):
```json
{
"mcpServers": {
"nworks": {
"command": "nworks",
"args": ["mcp"]
}
}
}
```
๋ก๊ทธ์ธ ํ ๋ฒ์ด๋ฉด 26๊ฐ ๋๊ตฌ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ. ๋ณ๋ env ์ค์ ๋ถํ์.
> **MCP์์ AI ์์ด์ ํธ๊ฐ ์ง์ ์ค์ ํ๊ธฐ**: CLI ๋ก๊ทธ์ธ ์์ด๋ AI ์์ด์ ํธ๊ฐ `nworks_setup` โ `nworks_login_user` ์์๋ก ํธ์ถํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ๋ง์ผ๋ก ์ ์ฒด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Client Secret๊ณผ Private Key ๊ฒฝ๋ก๋ MCP ์ค์ ์ `env` ํ๋ ๋๋ ์์คํ
ํ๊ฒฝ๋ณ์๋ก ๋ฏธ๋ฆฌ ์ค์ ํด์ผ ํฉ๋๋ค.
### MCP ๋๊ตฌ ๋ชฉ๋ก (26๊ฐ)
| ๋๊ตฌ | ์ค๋ช
| ํ์ ์ธ์ฆ |
|------|------|----------|
| **์ค์ /์ธ์ฆ** | | |
| `nworks_setup` | API ์ธ์ฆ ์ ๋ณด ์ค์ (Client ID ๋ฑ). Client Secret์ ํ๊ฒฝ๋ณ์๋ก ์ค์ | โ |
| `nworks_login_user` | User OAuth ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ (์ ์ฒด scope ์๋ ํฌํจ) | โ |
| `nworks_logout` | ์ธ์ฆ ์ ๋ณด ๋ฐ ํ ํฐ ์ญ์ | โ |
| `nworks_whoami` | ์ธ์ฆ ์ํ ํ์ธ | โ |
| `nworks_doctor` | ์ฐ๊ฒฐ ์ํ ์ง๋จ (์ธ์ฆ, ํ ํฐ, API ์ ๊ฒ) | โ |
| **๋ฉ์์ง** | | |
| `nworks_message_send` | ์ฌ์ฉ์/์ฑ๋์ ๋ฉ์์ง ์ ์ก | Service Account |
| `nworks_message_members` | ์ฑ๋ ๊ตฌ์ฑ์ ์กฐํ | Service Account |
| `nworks_directory_members` | ์กฐ์ง ๊ตฌ์ฑ์ ์กฐํ | Service Account |
| **์บ๋ฆฐ๋** | | |
| `nworks_calendar_list` | ์บ๋ฆฐ๋ ์ผ์ ์กฐํ | User OAuth (calendar.read) |
| `nworks_calendar_create` | ์บ๋ฆฐ๋ ์ผ์ ์์ฑ | User OAuth (calendar + calendar.read) |
| `nworks_calendar_update` | ์บ๋ฆฐ๋ ์ผ์ ์์ | User OAuth (calendar + calendar.read) |
| `nworks_calendar_delete` | ์บ๋ฆฐ๋ ์ผ์ ์ญ์ | User OAuth (calendar + calendar.read) |
| **๋๋ผ์ด๋ธ** | | |
| `nworks_drive_list` | ๋๋ผ์ด๋ธ ํ์ผ/ํด๋ ๋ชฉ๋ก | User OAuth (file.read) |
| `nworks_drive_upload` | ๋๋ผ์ด๋ธ ํ์ผ ์
๋ก๋ | User OAuth (file) |
| `nworks_drive_download` | ๋๋ผ์ด๋ธ ํ์ผ ๋ค์ด๋ก๋ (5MB ์ด๊ณผ ์ ๋ก์ปฌ ์ ์ฅ) | User OAuth (file.read) |
| **๋ฉ์ผ** | | |
| `nworks_mail_send` | ๋ฉ์ผ ์ ์ก | User OAuth (mail) |
| `nworks_mail_list` | ๋ฉ์ผ ๋ชฉ๋ก ์กฐํ | User OAuth (mail.read) |
| `nworks_mail_read` | ๋ฉ์ผ ์์ธ ์กฐํ | User OAuth (mail.read) |
| **ํ ์ผ** | | |
| `nworks_task_list` | ํ ์ผ ๋ชฉ๋ก ์กฐํ | User OAuth (task.read) |
| `nworks_task_create` | ํ ์ผ ์์ฑ | User OAuth (task + user.read) |
| `nworks_task_update` | ํ ์ผ ์์ /์๋ฃ | User OAuth (task + user.read) |
| `nworks_task_delete` | ํ ์ผ ์ญ์ | User OAuth (task + user.read) |
| **๊ฒ์ํ** | | |
| `nworks_board_list` | ๊ฒ์ํ ๋ชฉ๋ก ์กฐํ | User OAuth (board.read) |
| `nworks_board_posts` | ๊ฒ์ํ ๊ธ ๋ชฉ๋ก ์กฐํ | User OAuth (board.read) |
| `nworks_board_read` | ๊ฒ์ํ ๊ธ ์์ธ ์กฐํ | User OAuth (board.read) |
| `nworks_board_create` | ๊ฒ์ํ ๊ธ ์์ฑ | User OAuth (board) |
### AI ์์ด์ ํธ ์ฌ์ฉ ์์
```
User: ๋ด์ผ ์คํ 2์์ ํ์ ์ก๊ณ , ํ ์ฑ๋์ ์๋ ค์ค
Claude โ nworks_calendar_create
{ "summary": "ํ์", "start": "2026-03-15T14:00:00", "end": "2026-03-15T15:00:00" }
โ ์ผ์ ์ด ์์ฑ๋์์ต๋๋ค
Claude โ nworks_message_send
{ "channel": "C001", "text": "๋ด์ผ 14:00 ํ์๊ฐ ์กํ์ต๋๋ค" }
โ ๋ฉ์์ง๊ฐ ์ ์ก๋์์ต๋๋ค
User: ์ฝ์ง ์์ ๋ฉ์ผ ํ์ธํ๊ณ ์์ฝํด์ค
Claude โ nworks_mail_list (unread)
โ ์ฝ์ง ์์ ๋ฉ์ผ 3ํต
Claude โ nworks_mail_read (๊ฐ๊ฐ)
โ "3ํต: 1) CTO ๋ฐฐํฌ ์น์ธ, 2) ๊ธ์์ผ ํ์ ์ด๋, 3) ์ฃผ๊ฐ ๋ณด๊ณ ๋ฆฌ๋ง์ธ๋"
```
---
## CLI ์ฌ์ฉ๋ฒ
> ๋ชจ๋ ๋ช
๋ น์ด์ `--json` ์ง์ (ํ์ดํ, ์คํฌ๋ฆฝํธ, ์์ด์ ํธ ํ์ฑ ์ฉ์ด). `message send`, `mail send`, `drive upload`๋ `--dry-run`์ผ๋ก ์ค์ ์ ์ก ์์ด ํ
์คํธ ๊ฐ๋ฅ.
### ๋ฉ์์ง (Bot API)
```bash
# ์ฌ์ฉ์์๊ฒ ํ
์คํธ ๋ฉ์์ง
nworks message send --to --text "๋ฉ์์ง"
# ์ฑ๋์ ํ
์คํธ ๋ฉ์์ง
nworks message send --channel --text "๋ฉ์์ง"
# ๋ฒํผ ๋ฉ์์ง
nworks message send --to --type button --text "PR ๋ฆฌ๋ทฐ ์์ฒญ" \
--actions '[{"type":"message","label":"์น์ธ","postback":"approve"}]'
# ๋ฆฌ์คํธ ๋ฉ์์ง
nworks message send --to --type list --text "์ค๋์ ํ ์ผ" \
--elements '[{"title":"์ฝ๋ ๋ฆฌ๋ทฐ","subtitle":"#382 PR"}]'
# ์ฑ๋ ๊ตฌ์ฑ์ ์กฐํ
nworks message members --channel
```
### ์กฐ์ง (Directory API)
```bash
nworks directory members # ์กฐ์ง ๊ตฌ์ฑ์ ๋ชฉ๋ก
```
### ์บ๋ฆฐ๋ (User OAuth)
```bash
# ์ค๋ ์ผ์ ์กฐํ
nworks calendar list
# ๊ธฐ๊ฐ ์ง์
nworks calendar list --from "2026-03-14T00:00:00+09:00" --until "2026-03-14T23:59:59+09:00"
# ์ผ์ ์์ฑ
nworks calendar create --title "ํ์" --start "2026-03-14T14:00+09:00" --end "2026-03-14T15:00+09:00"
# ์ฅ์/์ค๋ช
ํฌํจ
nworks calendar create --title "์ ์ฌ ๋ฏธํ
" --start "2026-03-14T12:00+09:00" --end "2026-03-14T13:00+09:00" \
--location "๊ฐ๋จ ์๋น" --description "๋ถ๊ธฐ ๋ฆฌ๋ทฐ"
# ์ฐธ์์ ์ง์ + ์๋ฆผ
nworks calendar create --title "ํ ํ์" --start "2026-03-14T10:00+09:00" --end "2026-03-14T11:00+09:00" \
--attendees "user1@example.com,user2@example.com" --notify
# ์ผ์ ์์
nworks calendar update --id --title "๋ณ๊ฒฝ๋ ์ ๋ชฉ"
# ์ผ์ ์ญ์
nworks calendar delete --id
```
### ๋๋ผ์ด๋ธ (User OAuth)
```bash
# ํ์ผ/ํด๋ ๋ชฉ๋ก
nworks drive list
# ํ์ผ ์
๋ก๋
nworks drive upload --file ./report.pdf
# ํน์ ํด๋์ ์
๋ก๋
nworks drive upload --file ./report.pdf --folder
# ํ์ผ ๋ค์ด๋ก๋
nworks drive download --file-id
# ๋ค์ด๋ก๋ ๊ฒฝ๋ก/ํ์ผ๋ช
์ง์
nworks drive download --file-id --out ./downloads --name report.pdf
```
### ๋ฉ์ผ (User OAuth)
```bash
# ๋ฉ์ผ ์ ์ก
nworks mail send --to "user@example.com" --subject "์ ๋ชฉ" --body "๋ด์ฉ"
# CC/BCC ํฌํจ
nworks mail send --to "user@example.com" --cc "cc@example.com" --subject "์ ๋ชฉ" --body "๋ด์ฉ"
# ๋ฐ์ํธ์งํจ ๋ชฉ๋ก
nworks mail list
# ์ฝ์ง ์์ ๋ฉ์ผ๋ง
nworks mail list --unread
# ๋ฉ์ผ ์์ธ ์กฐํ
nworks mail read --id
```
### ํ ์ผ (User OAuth)
```bash
# ํ ์ผ ๋ชฉ๋ก
nworks task list
# ๋ฏธ์๋ฃ๋ง ์กฐํ
nworks task list --status TODO
# ํ ์ผ ์์ฑ
nworks task create --title "์ฝ๋ ๋ฆฌ๋ทฐ" --body "PR #382 ๋ฆฌ๋ทฐ"
# ๋ง๊ฐ์ผ ์ง์
nworks task create --title "๋ฐฐํฌ" --due 2026-03-20
# ํ ์ผ ์๋ฃ ์ฒ๋ฆฌ
nworks task update --id --status done
# ํ ์ผ ์ญ์
nworks task delete --id
```
### ๊ฒ์ํ (User OAuth)
```bash
# ๊ฒ์ํ ๋ชฉ๋ก
nworks board list
# ๊ฒ์ํ ๊ธ ๋ชฉ๋ก
nworks board posts --board
# ๊ธ ์์ธ ์กฐํ
nworks board read --board --post
# ๊ธ ์์ฑ
nworks board create --board --title "๊ณต์ง์ฌํญ" --body "๋ด์ฉ"
# ์๋ฆผ ๋ฐ์ก + ๋๊ธ ๋นํ์ฑํ
nworks board create --board --title "๊ณต์ง" --body "๋ด์ฉ" --notify --no-comment
```
### CI/CD ๋ฐฐํฌ ์๋ฆผ
```bash
# GitHub Actions์์ ๋ฐฐํฌ ์๋ฃ ํ ํ ์ฑ๋์ ์๋ฆผ
nworks message send --channel $CHANNEL_ID --text "v${VERSION} ๋ฐฐํฌ ์๋ฃ"
```
### ํ ์๋ํ ์คํฌ๋ฆฝํธ
```bash
# ๋งค์ผ ์์นจ ํ์์๊ฒ ๋ฆฌ๋ง์ธ๋ ์ ์ก
for userId in $(nworks directory members --json | jq -r '.users[].userId'); do
nworks message send --to "$userId" --text "์ค๋์ ์คํ ๋์
10์์
๋๋ค"
done
```
---
## OAuth Scope ์ค์
[NAVER WORKS Developer Console](https://dev.worksmobile.com)์์ ์ฑ์ OAuth Scope๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
| Scope | ์ฉ๋ | ์ธ์ฆ ๋ฐฉ์ | ํ์ํ ๋ช
๋ น์ด |
|-------|------|----------|--------------|
| `bot` | Bot ๋ฉ์์ง ์ ์ก | Service Account | `message send` |
| `bot.read` | Bot ์ฑ๋/๊ตฌ์ฑ์ ์กฐํ | Service Account | `message members` |
| `calendar` | ์บ๋ฆฐ๋ ์ฐ๊ธฐ | User OAuth | `calendar create/update/delete` (calendar.read๋ ํจ๊ป ํ์) |
| `calendar.read` | ์บ๋ฆฐ๋ ์ฝ๊ธฐ | User OAuth | `calendar list`, `calendar create/update/delete`์ ์์กด์ฑ |
| `file` | ๋๋ผ์ด๋ธ ์ฝ๊ธฐ/์ฐ๊ธฐ | User OAuth | `drive list/upload/download` |
| `file.read` | ๋๋ผ์ด๋ธ ์ฝ๊ธฐ ์ ์ฉ | User OAuth | `drive list/download` |
| `mail` | ๋ฉ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ | User OAuth | `mail send/list/read` |
| `mail.read` | ๋ฉ์ผ ์ฝ๊ธฐ ์ ์ฉ | User OAuth | `mail list/read` |
| `task` | ํ ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ | User OAuth | `task create/update/delete` (user.read๋ ํจ๊ป ํ์) |
| `task.read` | ํ ์ผ ์ฝ๊ธฐ ์ ์ฉ | User OAuth | `task list` |
| `user.read` | ์ฌ์ฉ์ ์ ๋ณด ์กฐํ | Service Account / User OAuth | `directory members`, `task create/update/delete`์ ์์กด์ฑ |
| `board` | ๊ฒ์ํ ์ฝ๊ธฐ/์ฐ๊ธฐ | User OAuth | `board list/posts/read/create` |
| `board.read` | ๊ฒ์ํ ์ฝ๊ธฐ ์ ์ฉ | User OAuth | `board list/posts/read` |
> **Tip**: scope๋ฅผ ๋ณ๊ฒฝํ ํ์๋ ํ ํฐ์ ์ฌ๋ฐ๊ธํด์ผ ํฉ๋๋ค.
> ```bash
> nworks logout && nworks login --user --scope "..."
> ```
---
## ํ๊ฒฝ ๋ณ์
ํ๊ฒฝ๋ณ์๋ก ์ธ์ฆ ์ ๋ณด๋ฅผ ์ค์ ํ๋ฉด `nworks login` ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค (CI/์์ด์ ํธ์ฉ).
```bash
# ๊ณตํต (ํ์)
NWORKS_CLIENT_ID=
NWORKS_CLIENT_SECRET=
# ๋ด ๋ฉ์์ง ์ ์ก ์์๋ง ํ์ (User OAuth๋ง ์ฐ๋ฉด ๋ถํ์)
NWORKS_SERVICE_ACCOUNT=
NWORKS_PRIVATE_KEY_PATH=
NWORKS_BOT_ID=
# ์ ํ
NWORKS_DOMAIN_ID=
NWORKS_SCOPE= # ๊ธฐ๋ณธ: bot bot.read user.read
NWORKS_VERBOSE=1 # ๋๋ฒ๊ทธ ๋ก๊น
```
### MCP ์๋ฒ์ ํ๊ฒฝ ๋ณ์ ์ง์ ์ค์
๋ฏผ๊ฐ ์ ๋ณด(Client Secret, Private Key ๊ฒฝ๋ก)๋ MCP ์ค์ ์ `env` ํ๋๋ก ์ค์ ํฉ๋๋ค. Client ID ๋ฑ ๋ฏผ๊ฐํ์ง ์์ ๊ฐ์ AI ์์ด์ ํธ๊ฐ `nworks_setup` tool๋ก ์ง์ ์ค์ ํ ์ ์์ต๋๋ค.
```json
{
"mcpServers": {
"nworks": {
"command": "npx",
"args": ["-y", "nworks", "mcp"],
"env": {
"NWORKS_CLIENT_SECRET": "",
"NWORKS_PRIVATE_KEY_PATH": ""
}
}
}
}
```
---
## License
Apache-2.0