nworks 1.2.0 โ†’ 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -1,393 +1,393 @@
1
- # nworks
2
-
3
- [![npm version](https://img.shields.io/npm/v/nworks.svg)](https://www.npmjs.com/package/nworks)
4
- [![license](https://img.shields.io/npm/l/nworks.svg)](LICENSE)
5
- [![npm downloads](https://img.shields.io/npm/dm/nworks.svg)](https://www.npmjs.com/package/nworks)
6
- [![nworks MCP server](https://glama.ai/mcp/servers/yjcho9317/nworks/badges/score.svg)](https://glama.ai/mcp/servers/yjcho9317/nworks)
7
-
8
- Featured in [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)
9
-
10
- [๐Ÿ‡บ๐Ÿ‡ธ English](README.md) | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด | [๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž](README.ja.md)
11
-
12
- <p align="center">
13
- <img src="assets/demo.gif" width="600" alt="nworks demo">
14
- </p>
15
-
16
- NAVER WORKS (LINE WORKS) ์ตœ์ดˆ์˜ MCP ์„œ๋ฒ„.
17
- ๋ฉ”์‹œ์ง€, ์บ˜๋ฆฐ๋”, ๋“œ๋ผ์ด๋ธŒ, ๋ฉ”์ผ, ํ•  ์ผ, ๊ฒŒ์‹œํŒ โ€” 26๊ฐœ ๋„๊ตฌ๋ฅผ CLI์™€ AI ์—์ด์ „ํŠธ์—์„œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
18
-
19
- ## Quickstart
20
-
21
- ```bash
22
- npm install -g nworks
23
- nworks login --user
24
- nworks calendar list
25
- ```
26
-
27
- ### AI ์—์ด์ „ํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ์”๋‹ˆ๋‹ค
28
-
29
- ```
30
- User: ์˜ค๋Š˜ ์ผ์ • ์•Œ๋ ค์ค˜
31
-
32
- Claude โ†’ nworks_calendar_list
33
- โ†’ 3๊ฑด: ์Šคํƒ ๋“œ์—…(10:00), ์ ์‹ฌ๋ฏธํŒ…(12:00), ์ฝ”๋“œ๋ฆฌ๋ทฐ(15:00)
34
-
35
- User: ํŒ€ ์ฑ„๋„์— ๋ฐฐํฌ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด์ค˜
36
-
37
- Claude โ†’ nworks_message_send
38
- { "channel": "C001", "text": "v1.2.0 ๋ฐฐํฌ ์™„๋ฃŒ" }
39
- โ†’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค
40
-
41
- User: ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด์ค˜
42
-
43
- Claude โ†’ nworks_mail_list (unread)
44
- โ†’ ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ 3ํ†ต
45
- Claude โ†’ nworks_mail_read (๊ฐ๊ฐ)
46
- โ†’ "3ํ†ต: 1) CTO ๋ฐฐํฌ ์Šน์ธ, 2) ๊ธˆ์š”์ผ ํšŒ์˜ ์ดˆ๋Œ€, 3) ์ฃผ๊ฐ„ ๋ณด๊ณ  ๋ฆฌ๋งˆ์ธ๋”"
47
- ```
48
-
49
- ## Install
50
-
51
- ```bash
52
- npx nworks # ๋ฐ”๋กœ ์‹คํ–‰
53
- npm install -g nworks # ๊ธ€๋กœ๋ฒŒ ์„ค์น˜
54
- ```
55
-
56
- ## ๋กœ๊ทธ์ธ
57
-
58
- ```bash
59
- # User OAuth (์บ˜๋ฆฐ๋”, ๋“œ๋ผ์ด๋ธŒ, ๋ฉ”์ผ, ํ•  ์ผ, ๊ฒŒ์‹œํŒ)
60
- nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
61
-
62
- # ๋ด‡ ๋ฉ”์‹œ์ง€ ์ „์†ก์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ (Service Account)
63
- nworks login
64
-
65
- # ์ธ์ฆ ํ™•์ธ
66
- nworks whoami
67
-
68
- # ๋กœ๊ทธ์•„์›ƒ
69
- nworks logout
70
- ```
71
-
72
- > `nworks login --user`๋Š” CLIENT_ID + CLIENT_SECRET๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ ๊ธฐ์กด ์„ค์ •์— ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’์€ ๋‹ค์‹œ ๋ฌผ์–ด๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
73
-
74
- > **Developer Console ์„ค์ •**: User OAuth๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด [Developer Console](https://dev.worksmobile.com)์—์„œ Redirect URL์— `http://localhost:9876/callback`์„ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
75
-
76
- ---
77
-
78
- ## AI ์—์ด์ „ํŠธ ์—ฐ๋™ (MCP ์„œ๋ฒ„)
79
-
80
- Claude Desktop, Cursor ๋“ฑ MCP ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
81
-
82
- ### ์„ค์ •
83
-
84
- ๋จผ์ € ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค:
85
-
86
- ```bash
87
- nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
88
- ```
89
-
90
- ๊ทธ๋ฆฌ๊ณ  MCP ์„ค์ •์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (`~/.config/claude/claude_desktop_config.json`):
91
-
92
- ```json
93
- {
94
- "mcpServers": {
95
- "nworks": {
96
- "command": "nworks",
97
- "args": ["mcp"]
98
- }
99
- }
100
- }
101
- ```
102
-
103
- ๋กœ๊ทธ์ธ ํ•œ ๋ฒˆ์ด๋ฉด 26๊ฐœ ๋„๊ตฌ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ๋ณ„๋„ env ์„ค์ • ๋ถˆํ•„์š”.
104
-
105
- > **MCP์—์„œ AI ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•˜๊ธฐ**: CLI ๋กœ๊ทธ์ธ ์—†์ด๋„ AI ์—์ด์ „ํŠธ๊ฐ€ `nworks_setup` โ†’ `nworks_login_user` ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ๋งŒ์œผ๋กœ ์ „์ฒด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Client Secret๊ณผ Private Key ๊ฒฝ๋กœ๋Š” MCP ์„ค์ •์˜ `env` ํ•„๋“œ ๋˜๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
106
-
107
- ### MCP ๋„๊ตฌ ๋ชฉ๋ก (26๊ฐœ)
108
-
109
- | ๋„๊ตฌ | ์„ค๋ช… | ํ•„์š” ์ธ์ฆ |
110
- |------|------|----------|
111
- | **์„ค์ •/์ธ์ฆ** | | |
112
- | `nworks_setup` | API ์ธ์ฆ ์ •๋ณด ์„ค์ • (Client ID ๋“ฑ). Client Secret์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„ค์ • | โ€” |
113
- | `nworks_login_user` | User OAuth ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ (์ „์ฒด scope ์ž๋™ ํฌํ•จ) | โ€” |
114
- | `nworks_logout` | ์ธ์ฆ ์ •๋ณด ๋ฐ ํ† ํฐ ์‚ญ์ œ | โ€” |
115
- | `nworks_whoami` | ์ธ์ฆ ์ƒํƒœ ํ™•์ธ | โ€” |
116
- | `nworks_doctor` | ์—ฐ๊ฒฐ ์ƒํƒœ ์ง„๋‹จ (์ธ์ฆ, ํ† ํฐ, API ์ ๊ฒ€) | โ€” |
117
- | **๋ฉ”์‹œ์ง€** | | |
118
- | `nworks_message_send` | ์‚ฌ์šฉ์ž/์ฑ„๋„์— ๋ฉ”์‹œ์ง€ ์ „์†ก | Service Account |
119
- | `nworks_message_members` | ์ฑ„๋„ ๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account |
120
- | `nworks_directory_members` | ์กฐ์ง ๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account |
121
- | **์บ˜๋ฆฐ๋”** | | |
122
- | `nworks_calendar_list` | ์บ˜๋ฆฐ๋” ์ผ์ • ์กฐํšŒ | User OAuth (calendar.read) |
123
- | `nworks_calendar_create` | ์บ˜๋ฆฐ๋” ์ผ์ • ์ƒ์„ฑ | User OAuth (calendar + calendar.read) |
124
- | `nworks_calendar_update` | ์บ˜๋ฆฐ๋” ์ผ์ • ์ˆ˜์ • | User OAuth (calendar + calendar.read) |
125
- | `nworks_calendar_delete` | ์บ˜๋ฆฐ๋” ์ผ์ • ์‚ญ์ œ | User OAuth (calendar + calendar.read) |
126
- | **๋“œ๋ผ์ด๋ธŒ** | | |
127
- | `nworks_drive_list` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก | User OAuth (file.read) |
128
- | `nworks_drive_upload` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ์—…๋กœ๋“œ | User OAuth (file) |
129
- | `nworks_drive_download` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (5MB ์ดˆ๊ณผ ์‹œ ๋กœ์ปฌ ์ €์žฅ) | User OAuth (file.read) |
130
- | **๋ฉ”์ผ** | | |
131
- | `nworks_mail_send` | ๋ฉ”์ผ ์ „์†ก | User OAuth (mail) |
132
- | `nworks_mail_list` | ๋ฉ”์ผ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (mail.read) |
133
- | `nworks_mail_read` | ๋ฉ”์ผ ์ƒ์„ธ ์กฐํšŒ | User OAuth (mail.read) |
134
- | **ํ•  ์ผ** | | |
135
- | `nworks_task_list` | ํ•  ์ผ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (task.read) |
136
- | `nworks_task_create` | ํ•  ์ผ ์ƒ์„ฑ | User OAuth (task + user.read) |
137
- | `nworks_task_update` | ํ•  ์ผ ์ˆ˜์ •/์™„๋ฃŒ | User OAuth (task + user.read) |
138
- | `nworks_task_delete` | ํ•  ์ผ ์‚ญ์ œ | User OAuth (task + user.read) |
139
- | **๊ฒŒ์‹œํŒ** | | |
140
- | `nworks_board_list` | ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (board.read) |
141
- | `nworks_board_posts` | ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (board.read) |
142
- | `nworks_board_read` | ๊ฒŒ์‹œํŒ ๊ธ€ ์ƒ์„ธ ์กฐํšŒ | User OAuth (board.read) |
143
- | `nworks_board_create` | ๊ฒŒ์‹œํŒ ๊ธ€ ์ž‘์„ฑ | User OAuth (board) |
144
-
145
- ### AI ์—์ด์ „ํŠธ ์‚ฌ์šฉ ์˜ˆ์‹œ
146
-
147
- ```
148
- User: ๋‚ด์ผ ์˜คํ›„ 2์‹œ์— ํšŒ์˜ ์žก๊ณ , ํŒ€ ์ฑ„๋„์— ์•Œ๋ ค์ค˜
149
-
150
- Claude โ†’ nworks_calendar_create
151
- { "summary": "ํšŒ์˜", "start": "2026-03-15T14:00:00", "end": "2026-03-15T15:00:00" }
152
- โ†’ ์ผ์ •์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
153
-
154
- Claude โ†’ nworks_message_send
155
- { "channel": "C001", "text": "๋‚ด์ผ 14:00 ํšŒ์˜๊ฐ€ ์žกํ˜”์Šต๋‹ˆ๋‹ค" }
156
- โ†’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค
157
-
158
- User: ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด์ค˜
159
-
160
- Claude โ†’ nworks_mail_list (unread)
161
- โ†’ ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ 3ํ†ต
162
- Claude โ†’ nworks_mail_read (๊ฐ๊ฐ)
163
- โ†’ "3ํ†ต: 1) CTO ๋ฐฐํฌ ์Šน์ธ, 2) ๊ธˆ์š”์ผ ํšŒ์˜ ์ดˆ๋Œ€, 3) ์ฃผ๊ฐ„ ๋ณด๊ณ  ๋ฆฌ๋งˆ์ธ๋”"
164
- ```
165
-
166
- ---
167
-
168
- ## CLI ์‚ฌ์šฉ๋ฒ•
169
-
170
- > ๋ชจ๋“  ๋ช…๋ น์–ด์— `--json` ์ง€์› (ํŒŒ์ดํ”„, ์Šคํฌ๋ฆฝํŠธ, ์—์ด์ „ํŠธ ํŒŒ์‹ฑ ์šฉ์ด). `message send`, `mail send`, `drive upload`๋Š” `--dry-run`์œผ๋กœ ์‹ค์ œ ์ „์†ก ์—†์ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ.
171
-
172
- ### ๋ฉ”์‹œ์ง€ (Bot API)
173
-
174
- ```bash
175
- # ์‚ฌ์šฉ์ž์—๊ฒŒ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€
176
- nworks message send --to <userId> --text "๋ฉ”์‹œ์ง€"
177
-
178
- # ์ฑ„๋„์— ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€
179
- nworks message send --channel <channelId> --text "๋ฉ”์‹œ์ง€"
180
-
181
- # ๋ฒ„ํŠผ ๋ฉ”์‹œ์ง€
182
- nworks message send --to <userId> --type button --text "PR ๋ฆฌ๋ทฐ ์š”์ฒญ" \
183
- --actions '[{"type":"message","label":"์Šน์ธ","postback":"approve"}]'
184
-
185
- # ๋ฆฌ์ŠคํŠธ ๋ฉ”์‹œ์ง€
186
- nworks message send --to <userId> --type list --text "์˜ค๋Š˜์˜ ํ•  ์ผ" \
187
- --elements '[{"title":"์ฝ”๋“œ ๋ฆฌ๋ทฐ","subtitle":"#382 PR"}]'
188
-
189
- # ์ฑ„๋„ ๊ตฌ์„ฑ์› ์กฐํšŒ
190
- nworks message members --channel <channelId>
191
- ```
192
-
193
- ### ์กฐ์ง (Directory API)
194
-
195
- ```bash
196
- nworks directory members # ์กฐ์ง ๊ตฌ์„ฑ์› ๋ชฉ๋ก
197
- ```
198
-
199
- ### ์บ˜๋ฆฐ๋” (User OAuth)
200
-
201
- ```bash
202
- # ์˜ค๋Š˜ ์ผ์ • ์กฐํšŒ
203
- nworks calendar list
204
-
205
- # ๊ธฐ๊ฐ„ ์ง€์ •
206
- nworks calendar list --from "2026-03-14T00:00:00+09:00" --until "2026-03-14T23:59:59+09:00"
207
-
208
- # ์ผ์ • ์ƒ์„ฑ
209
- nworks calendar create --title "ํšŒ์˜" --start "2026-03-14T14:00+09:00" --end "2026-03-14T15:00+09:00"
210
-
211
- # ์žฅ์†Œ/์„ค๋ช… ํฌํ•จ
212
- nworks calendar create --title "์ ์‹ฌ ๋ฏธํŒ…" --start "2026-03-14T12:00+09:00" --end "2026-03-14T13:00+09:00" \
213
- --location "๊ฐ•๋‚จ ์‹๋‹น" --description "๋ถ„๊ธฐ ๋ฆฌ๋ทฐ"
214
-
215
- # ์ฐธ์„์ž ์ง€์ • + ์•Œ๋ฆผ
216
- nworks calendar create --title "ํŒ€ ํšŒ์˜" --start "2026-03-14T10:00+09:00" --end "2026-03-14T11:00+09:00" \
217
- --attendees "user1@example.com,user2@example.com" --notify
218
-
219
- # ์ผ์ • ์ˆ˜์ •
220
- nworks calendar update --id <eventId> --title "๋ณ€๊ฒฝ๋œ ์ œ๋ชฉ"
221
-
222
- # ์ผ์ • ์‚ญ์ œ
223
- nworks calendar delete --id <eventId>
224
- ```
225
-
226
- ### ๋“œ๋ผ์ด๋ธŒ (User OAuth)
227
-
228
- ```bash
229
- # ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก
230
- nworks drive list
231
-
232
- # ํŒŒ์ผ ์—…๋กœ๋“œ
233
- nworks drive upload --file ./report.pdf
234
-
235
- # ํŠน์ • ํด๋”์— ์—…๋กœ๋“œ
236
- nworks drive upload --file ./report.pdf --folder <folderId>
237
-
238
- # ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
239
- nworks drive download --file-id <fileId>
240
-
241
- # ๋‹ค์šด๋กœ๋“œ ๊ฒฝ๋กœ/ํŒŒ์ผ๋ช… ์ง€์ •
242
- nworks drive download --file-id <fileId> --out ./downloads --name report.pdf
243
- ```
244
-
245
- ### ๋ฉ”์ผ (User OAuth)
246
-
247
- ```bash
248
- # ๋ฉ”์ผ ์ „์†ก
249
- nworks mail send --to "user@example.com" --subject "์ œ๋ชฉ" --body "๋‚ด์šฉ"
250
-
251
- # CC/BCC ํฌํ•จ
252
- nworks mail send --to "user@example.com" --cc "cc@example.com" --subject "์ œ๋ชฉ" --body "๋‚ด์šฉ"
253
-
254
- # ๋ฐ›์€ํŽธ์ง€ํ•จ ๋ชฉ๋ก
255
- nworks mail list
256
-
257
- # ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ๋งŒ
258
- nworks mail list --unread
259
-
260
- # ๋ฉ”์ผ ์ƒ์„ธ ์กฐํšŒ
261
- nworks mail read --id <mailId>
262
- ```
263
-
264
- ### ํ•  ์ผ (User OAuth)
265
-
266
- ```bash
267
- # ํ•  ์ผ ๋ชฉ๋ก
268
- nworks task list
269
-
270
- # ๋ฏธ์™„๋ฃŒ๋งŒ ์กฐํšŒ
271
- nworks task list --status TODO
272
-
273
- # ํ•  ์ผ ์ƒ์„ฑ
274
- nworks task create --title "์ฝ”๋“œ ๋ฆฌ๋ทฐ" --body "PR #382 ๋ฆฌ๋ทฐ"
275
-
276
- # ๋งˆ๊ฐ์ผ ์ง€์ •
277
- nworks task create --title "๋ฐฐํฌ" --due 2026-03-20
278
-
279
- # ํ•  ์ผ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
280
- nworks task update --id <taskId> --status done
281
-
282
- # ํ•  ์ผ ์‚ญ์ œ
283
- nworks task delete --id <taskId>
284
- ```
285
-
286
- ### ๊ฒŒ์‹œํŒ (User OAuth)
287
-
288
- ```bash
289
- # ๊ฒŒ์‹œํŒ ๋ชฉ๋ก
290
- nworks board list
291
-
292
- # ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก
293
- nworks board posts --board <boardId>
294
-
295
- # ๊ธ€ ์ƒ์„ธ ์กฐํšŒ
296
- nworks board read --board <boardId> --post <postId>
297
-
298
- # ๊ธ€ ์ž‘์„ฑ
299
- nworks board create --board <boardId> --title "๊ณต์ง€์‚ฌํ•ญ" --body "๋‚ด์šฉ"
300
-
301
- # ์•Œ๋ฆผ ๋ฐœ์†ก + ๋Œ“๊ธ€ ๋น„ํ™œ์„ฑํ™”
302
- nworks board create --board <boardId> --title "๊ณต์ง€" --body "๋‚ด์šฉ" --notify --no-comment
303
- ```
304
-
305
- ### CI/CD ๋ฐฐํฌ ์•Œ๋ฆผ
306
-
307
- ```bash
308
- # GitHub Actions์—์„œ ๋ฐฐํฌ ์™„๋ฃŒ ํ›„ ํŒ€ ์ฑ„๋„์— ์•Œ๋ฆผ
309
- nworks message send --channel $CHANNEL_ID --text "v${VERSION} ๋ฐฐํฌ ์™„๋ฃŒ"
310
- ```
311
-
312
- ### ํŒ€ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ
313
-
314
- ```bash
315
- # ๋งค์ผ ์•„์นจ ํŒ€์›์—๊ฒŒ ๋ฆฌ๋งˆ์ธ๋” ์ „์†ก
316
- for userId in $(nworks directory members --json | jq -r '.users[].userId'); do
317
- nworks message send --to "$userId" --text "์˜ค๋Š˜์˜ ์Šคํƒ ๋“œ์—… 10์‹œ์ž…๋‹ˆ๋‹ค"
318
- done
319
- ```
320
-
321
- ---
322
-
323
- ## OAuth Scope ์„ค์ •
324
-
325
- [NAVER WORKS Developer Console](https://dev.worksmobile.com)์—์„œ ์•ฑ์˜ OAuth Scope๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
326
-
327
- | Scope | ์šฉ๋„ | ์ธ์ฆ ๋ฐฉ์‹ | ํ•„์š”ํ•œ ๋ช…๋ น์–ด |
328
- |-------|------|----------|--------------|
329
- | `bot` | Bot ๋ฉ”์‹œ์ง€ ์ „์†ก | Service Account | `message send` |
330
- | `bot.read` | Bot ์ฑ„๋„/๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account | `message members` |
331
- | `calendar` | ์บ˜๋ฆฐ๋” ์“ฐ๊ธฐ | User OAuth | `calendar create/update/delete` (calendar.read๋„ ํ•จ๊ป˜ ํ•„์š”) |
332
- | `calendar.read` | ์บ˜๋ฆฐ๋” ์ฝ๊ธฐ | User OAuth | `calendar list`, `calendar create/update/delete`์˜ ์˜์กด์„ฑ |
333
- | `file` | ๋“œ๋ผ์ด๋ธŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `drive list/upload/download` |
334
- | `file.read` | ๋“œ๋ผ์ด๋ธŒ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `drive list/download` |
335
- | `mail` | ๋ฉ”์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `mail send/list/read` |
336
- | `mail.read` | ๋ฉ”์ผ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `mail list/read` |
337
- | `task` | ํ•  ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `task create/update/delete` (user.read๋„ ํ•จ๊ป˜ ํ•„์š”) |
338
- | `task.read` | ํ•  ์ผ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `task list` |
339
- | `user.read` | ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ | Service Account / User OAuth | `directory members`, `task create/update/delete`์˜ ์˜์กด์„ฑ |
340
- | `board` | ๊ฒŒ์‹œํŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `board list/posts/read/create` |
341
- | `board.read` | ๊ฒŒ์‹œํŒ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `board list/posts/read` |
342
-
343
- > **Tip**: scope๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
344
- > ```bash
345
- > nworks logout && nworks login --user --scope "..."
346
- > ```
347
-
348
- ---
349
-
350
- ## ํ™˜๊ฒฝ ๋ณ€์ˆ˜
351
-
352
- ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๋ฉด `nworks login` ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (CI/์—์ด์ „ํŠธ์šฉ).
353
-
354
- ```bash
355
- # ๊ณตํ†ต (ํ•„์ˆ˜)
356
- NWORKS_CLIENT_ID=
357
- NWORKS_CLIENT_SECRET=
358
-
359
- # ๋ด‡ ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹œ์—๋งŒ ํ•„์š” (User OAuth๋งŒ ์“ฐ๋ฉด ๋ถˆํ•„์š”)
360
- NWORKS_SERVICE_ACCOUNT=
361
- NWORKS_PRIVATE_KEY_PATH=
362
- NWORKS_BOT_ID=
363
-
364
- # ์„ ํƒ
365
- NWORKS_DOMAIN_ID=
366
- NWORKS_SCOPE= # ๊ธฐ๋ณธ: bot bot.read user.read
367
- NWORKS_VERBOSE=1 # ๋””๋ฒ„๊ทธ ๋กœ๊น…
368
- ```
369
-
370
- ### MCP ์„œ๋ฒ„์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ง์ ‘ ์„ค์ •
371
-
372
- ๋ฏผ๊ฐ ์ •๋ณด(Client Secret, Private Key ๊ฒฝ๋กœ)๋Š” MCP ์„ค์ •์˜ `env` ํ•„๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Client ID ๋“ฑ ๋ฏผ๊ฐํ•˜์ง€ ์•Š์€ ๊ฐ’์€ AI ์—์ด์ „ํŠธ๊ฐ€ `nworks_setup` tool๋กœ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
373
-
374
- ```json
375
- {
376
- "mcpServers": {
377
- "nworks": {
378
- "command": "npx",
379
- "args": ["-y", "nworks", "mcp"],
380
- "env": {
381
- "NWORKS_CLIENT_SECRET": "<Client Secret>",
382
- "NWORKS_PRIVATE_KEY_PATH": "<Private Key ํŒŒ์ผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ (Service Account ์‚ฌ์šฉ ์‹œ)>"
383
- }
384
- }
385
- }
386
- }
387
- ```
388
-
389
- ---
390
-
391
- ## License
392
-
393
- Apache-2.0
1
+ # nworks
2
+
3
+ [![npm version](https://img.shields.io/npm/v/nworks.svg)](https://www.npmjs.com/package/nworks)
4
+ [![license](https://img.shields.io/npm/l/nworks.svg)](LICENSE)
5
+ [![npm downloads](https://img.shields.io/npm/dm/nworks.svg)](https://www.npmjs.com/package/nworks)
6
+ [![nworks MCP server](https://glama.ai/mcp/servers/yjcho9317/nworks/badges/score.svg)](https://glama.ai/mcp/servers/yjcho9317/nworks)
7
+
8
+ Featured in [awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers)
9
+
10
+ [๐Ÿ‡บ๐Ÿ‡ธ English](README.md) | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด | [๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž](README.ja.md)
11
+
12
+ <p align="center">
13
+ <img src="assets/demo.gif" width="600" alt="nworks demo">
14
+ </p>
15
+
16
+ NAVER WORKS (LINE WORKS) ์ตœ์ดˆ์˜ MCP ์„œ๋ฒ„.
17
+ ๋ฉ”์‹œ์ง€, ์บ˜๋ฆฐ๋”, ๋“œ๋ผ์ด๋ธŒ, ๋ฉ”์ผ, ํ•  ์ผ, ๊ฒŒ์‹œํŒ โ€” 26๊ฐœ ๋„๊ตฌ๋ฅผ CLI์™€ AI ์—์ด์ „ํŠธ์—์„œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
18
+
19
+ ## Quickstart
20
+
21
+ ```bash
22
+ npm install -g nworks
23
+ nworks login --user
24
+ nworks calendar list
25
+ ```
26
+
27
+ ### AI ์—์ด์ „ํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ์”๋‹ˆ๋‹ค
28
+
29
+ ```
30
+ User: ์˜ค๋Š˜ ์ผ์ • ์•Œ๋ ค์ค˜
31
+
32
+ Claude โ†’ nworks_calendar_list
33
+ โ†’ 3๊ฑด: ์Šคํƒ ๋“œ์—…(10:00), ์ ์‹ฌ๋ฏธํŒ…(12:00), ์ฝ”๋“œ๋ฆฌ๋ทฐ(15:00)
34
+
35
+ User: ํŒ€ ์ฑ„๋„์— ๋ฐฐํฌ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด์ค˜
36
+
37
+ Claude โ†’ nworks_message_send
38
+ { "channel": "C001", "text": "v1.2.0 ๋ฐฐํฌ ์™„๋ฃŒ" }
39
+ โ†’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค
40
+
41
+ User: ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด์ค˜
42
+
43
+ Claude โ†’ nworks_mail_list (unread)
44
+ โ†’ ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ 3ํ†ต
45
+ Claude โ†’ nworks_mail_read (๊ฐ๊ฐ)
46
+ โ†’ "3ํ†ต: 1) CTO ๋ฐฐํฌ ์Šน์ธ, 2) ๊ธˆ์š”์ผ ํšŒ์˜ ์ดˆ๋Œ€, 3) ์ฃผ๊ฐ„ ๋ณด๊ณ  ๋ฆฌ๋งˆ์ธ๋”"
47
+ ```
48
+
49
+ ## Install
50
+
51
+ ```bash
52
+ npx nworks # ๋ฐ”๋กœ ์‹คํ–‰
53
+ npm install -g nworks # ๊ธ€๋กœ๋ฒŒ ์„ค์น˜
54
+ ```
55
+
56
+ ## ๋กœ๊ทธ์ธ
57
+
58
+ ```bash
59
+ # User OAuth (์บ˜๋ฆฐ๋”, ๋“œ๋ผ์ด๋ธŒ, ๋ฉ”์ผ, ํ•  ์ผ, ๊ฒŒ์‹œํŒ)
60
+ nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
61
+
62
+ # ๋ด‡ ๋ฉ”์‹œ์ง€ ์ „์†ก์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ (Service Account)
63
+ nworks login
64
+
65
+ # ์ธ์ฆ ํ™•์ธ
66
+ nworks whoami
67
+
68
+ # ๋กœ๊ทธ์•„์›ƒ
69
+ nworks logout
70
+ ```
71
+
72
+ > `nworks login --user`๋Š” CLIENT_ID + CLIENT_SECRET๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ ๊ธฐ์กด ์„ค์ •์— ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’์€ ๋‹ค์‹œ ๋ฌผ์–ด๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
73
+
74
+ > **Developer Console ์„ค์ •**: User OAuth๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด [Developer Console](https://dev.worksmobile.com)์—์„œ Redirect URL์— `http://localhost:9876/callback`์„ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
75
+
76
+ ---
77
+
78
+ ## AI ์—์ด์ „ํŠธ ์—ฐ๋™ (MCP ์„œ๋ฒ„)
79
+
80
+ Claude Desktop, Cursor ๋“ฑ MCP ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
81
+
82
+ ### ์„ค์ •
83
+
84
+ ๋จผ์ € ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค:
85
+
86
+ ```bash
87
+ nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
88
+ ```
89
+
90
+ ๊ทธ๋ฆฌ๊ณ  MCP ์„ค์ •์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (`~/.config/claude/claude_desktop_config.json`):
91
+
92
+ ```json
93
+ {
94
+ "mcpServers": {
95
+ "nworks": {
96
+ "command": "nworks",
97
+ "args": ["mcp"]
98
+ }
99
+ }
100
+ }
101
+ ```
102
+
103
+ ๋กœ๊ทธ์ธ ํ•œ ๋ฒˆ์ด๋ฉด 26๊ฐœ ๋„๊ตฌ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ๋ณ„๋„ env ์„ค์ • ๋ถˆํ•„์š”.
104
+
105
+ > **MCP์—์„œ AI ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•˜๊ธฐ**: CLI ๋กœ๊ทธ์ธ ์—†์ด๋„ AI ์—์ด์ „ํŠธ๊ฐ€ `nworks_setup` โ†’ `nworks_login_user` ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ๋งŒ์œผ๋กœ ์ „์ฒด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Client Secret๊ณผ Private Key ๊ฒฝ๋กœ๋Š” MCP ์„ค์ •์˜ `env` ํ•„๋“œ ๋˜๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
106
+
107
+ ### MCP ๋„๊ตฌ ๋ชฉ๋ก (26๊ฐœ)
108
+
109
+ | ๋„๊ตฌ | ์„ค๋ช… | ํ•„์š” ์ธ์ฆ |
110
+ |------|------|----------|
111
+ | **์„ค์ •/์ธ์ฆ** | | |
112
+ | `nworks_setup` | API ์ธ์ฆ ์ •๋ณด ์„ค์ • (Client ID ๋“ฑ). Client Secret์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„ค์ • | โ€” |
113
+ | `nworks_login_user` | User OAuth ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ (์ „์ฒด scope ์ž๋™ ํฌํ•จ) | โ€” |
114
+ | `nworks_logout` | ์ธ์ฆ ์ •๋ณด ๋ฐ ํ† ํฐ ์‚ญ์ œ | โ€” |
115
+ | `nworks_whoami` | ์ธ์ฆ ์ƒํƒœ ํ™•์ธ | โ€” |
116
+ | `nworks_doctor` | ์—ฐ๊ฒฐ ์ƒํƒœ ์ง„๋‹จ (์ธ์ฆ, ํ† ํฐ, API ์ ๊ฒ€) | โ€” |
117
+ | **๋ฉ”์‹œ์ง€** | | |
118
+ | `nworks_message_send` | ์‚ฌ์šฉ์ž/์ฑ„๋„์— ๋ฉ”์‹œ์ง€ ์ „์†ก | Service Account |
119
+ | `nworks_message_members` | ์ฑ„๋„ ๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account |
120
+ | `nworks_directory_members` | ์กฐ์ง ๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account |
121
+ | **์บ˜๋ฆฐ๋”** | | |
122
+ | `nworks_calendar_list` | ์บ˜๋ฆฐ๋” ์ผ์ • ์กฐํšŒ | User OAuth (calendar.read) |
123
+ | `nworks_calendar_create` | ์บ˜๋ฆฐ๋” ์ผ์ • ์ƒ์„ฑ | User OAuth (calendar + calendar.read) |
124
+ | `nworks_calendar_update` | ์บ˜๋ฆฐ๋” ์ผ์ • ์ˆ˜์ • | User OAuth (calendar + calendar.read) |
125
+ | `nworks_calendar_delete` | ์บ˜๋ฆฐ๋” ์ผ์ • ์‚ญ์ œ | User OAuth (calendar + calendar.read) |
126
+ | **๋“œ๋ผ์ด๋ธŒ** | | |
127
+ | `nworks_drive_list` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก | User OAuth (file.read) |
128
+ | `nworks_drive_upload` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ์—…๋กœ๋“œ | User OAuth (file) |
129
+ | `nworks_drive_download` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (5MB ์ดˆ๊ณผ ์‹œ ๋กœ์ปฌ ์ €์žฅ) | User OAuth (file.read) |
130
+ | **๋ฉ”์ผ** | | |
131
+ | `nworks_mail_send` | ๋ฉ”์ผ ์ „์†ก | User OAuth (mail) |
132
+ | `nworks_mail_list` | ๋ฉ”์ผ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (mail.read) |
133
+ | `nworks_mail_read` | ๋ฉ”์ผ ์ƒ์„ธ ์กฐํšŒ | User OAuth (mail.read) |
134
+ | **ํ•  ์ผ** | | |
135
+ | `nworks_task_list` | ํ•  ์ผ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (task.read) |
136
+ | `nworks_task_create` | ํ•  ์ผ ์ƒ์„ฑ | User OAuth (task + user.read) |
137
+ | `nworks_task_update` | ํ•  ์ผ ์ˆ˜์ •/์™„๋ฃŒ | User OAuth (task + user.read) |
138
+ | `nworks_task_delete` | ํ•  ์ผ ์‚ญ์ œ | User OAuth (task + user.read) |
139
+ | **๊ฒŒ์‹œํŒ** | | |
140
+ | `nworks_board_list` | ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (board.read) |
141
+ | `nworks_board_posts` | ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (board.read) |
142
+ | `nworks_board_read` | ๊ฒŒ์‹œํŒ ๊ธ€ ์ƒ์„ธ ์กฐํšŒ | User OAuth (board.read) |
143
+ | `nworks_board_create` | ๊ฒŒ์‹œํŒ ๊ธ€ ์ž‘์„ฑ | User OAuth (board) |
144
+
145
+ ### AI ์—์ด์ „ํŠธ ์‚ฌ์šฉ ์˜ˆ์‹œ
146
+
147
+ ```
148
+ User: ๋‚ด์ผ ์˜คํ›„ 2์‹œ์— ํšŒ์˜ ์žก๊ณ , ํŒ€ ์ฑ„๋„์— ์•Œ๋ ค์ค˜
149
+
150
+ Claude โ†’ nworks_calendar_create
151
+ { "summary": "ํšŒ์˜", "start": "2026-03-15T14:00:00", "end": "2026-03-15T15:00:00" }
152
+ โ†’ ์ผ์ •์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
153
+
154
+ Claude โ†’ nworks_message_send
155
+ { "channel": "C001", "text": "๋‚ด์ผ 14:00 ํšŒ์˜๊ฐ€ ์žกํ˜”์Šต๋‹ˆ๋‹ค" }
156
+ โ†’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค
157
+
158
+ User: ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด์ค˜
159
+
160
+ Claude โ†’ nworks_mail_list (unread)
161
+ โ†’ ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ 3ํ†ต
162
+ Claude โ†’ nworks_mail_read (๊ฐ๊ฐ)
163
+ โ†’ "3ํ†ต: 1) CTO ๋ฐฐํฌ ์Šน์ธ, 2) ๊ธˆ์š”์ผ ํšŒ์˜ ์ดˆ๋Œ€, 3) ์ฃผ๊ฐ„ ๋ณด๊ณ  ๋ฆฌ๋งˆ์ธ๋”"
164
+ ```
165
+
166
+ ---
167
+
168
+ ## CLI ์‚ฌ์šฉ๋ฒ•
169
+
170
+ > ๋ชจ๋“  ๋ช…๋ น์–ด์— `--json` ์ง€์› (ํŒŒ์ดํ”„, ์Šคํฌ๋ฆฝํŠธ, ์—์ด์ „ํŠธ ํŒŒ์‹ฑ ์šฉ์ด). `message send`, `mail send`, `drive upload`๋Š” `--dry-run`์œผ๋กœ ์‹ค์ œ ์ „์†ก ์—†์ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ.
171
+
172
+ ### ๋ฉ”์‹œ์ง€ (Bot API)
173
+
174
+ ```bash
175
+ # ์‚ฌ์šฉ์ž์—๊ฒŒ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€
176
+ nworks message send --to <userId> --text "๋ฉ”์‹œ์ง€"
177
+
178
+ # ์ฑ„๋„์— ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€
179
+ nworks message send --channel <channelId> --text "๋ฉ”์‹œ์ง€"
180
+
181
+ # ๋ฒ„ํŠผ ๋ฉ”์‹œ์ง€
182
+ nworks message send --to <userId> --type button --text "PR ๋ฆฌ๋ทฐ ์š”์ฒญ" \
183
+ --actions '[{"type":"message","label":"์Šน์ธ","postback":"approve"}]'
184
+
185
+ # ๋ฆฌ์ŠคํŠธ ๋ฉ”์‹œ์ง€
186
+ nworks message send --to <userId> --type list --text "์˜ค๋Š˜์˜ ํ•  ์ผ" \
187
+ --elements '[{"title":"์ฝ”๋“œ ๋ฆฌ๋ทฐ","subtitle":"#382 PR"}]'
188
+
189
+ # ์ฑ„๋„ ๊ตฌ์„ฑ์› ์กฐํšŒ
190
+ nworks message members --channel <channelId>
191
+ ```
192
+
193
+ ### ์กฐ์ง (Directory API)
194
+
195
+ ```bash
196
+ nworks directory members # ์กฐ์ง ๊ตฌ์„ฑ์› ๋ชฉ๋ก
197
+ ```
198
+
199
+ ### ์บ˜๋ฆฐ๋” (User OAuth)
200
+
201
+ ```bash
202
+ # ์˜ค๋Š˜ ์ผ์ • ์กฐํšŒ
203
+ nworks calendar list
204
+
205
+ # ๊ธฐ๊ฐ„ ์ง€์ •
206
+ nworks calendar list --from "2026-03-14T00:00:00+09:00" --until "2026-03-14T23:59:59+09:00"
207
+
208
+ # ์ผ์ • ์ƒ์„ฑ
209
+ nworks calendar create --title "ํšŒ์˜" --start "2026-03-14T14:00+09:00" --end "2026-03-14T15:00+09:00"
210
+
211
+ # ์žฅ์†Œ/์„ค๋ช… ํฌํ•จ
212
+ nworks calendar create --title "์ ์‹ฌ ๋ฏธํŒ…" --start "2026-03-14T12:00+09:00" --end "2026-03-14T13:00+09:00" \
213
+ --location "๊ฐ•๋‚จ ์‹๋‹น" --description "๋ถ„๊ธฐ ๋ฆฌ๋ทฐ"
214
+
215
+ # ์ฐธ์„์ž ์ง€์ • + ์•Œ๋ฆผ
216
+ nworks calendar create --title "ํŒ€ ํšŒ์˜" --start "2026-03-14T10:00+09:00" --end "2026-03-14T11:00+09:00" \
217
+ --attendees "user1@example.com,user2@example.com" --notify
218
+
219
+ # ์ผ์ • ์ˆ˜์ •
220
+ nworks calendar update --id <eventId> --title "๋ณ€๊ฒฝ๋œ ์ œ๋ชฉ"
221
+
222
+ # ์ผ์ • ์‚ญ์ œ
223
+ nworks calendar delete --id <eventId>
224
+ ```
225
+
226
+ ### ๋“œ๋ผ์ด๋ธŒ (User OAuth)
227
+
228
+ ```bash
229
+ # ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก
230
+ nworks drive list
231
+
232
+ # ํŒŒ์ผ ์—…๋กœ๋“œ
233
+ nworks drive upload --file ./report.pdf
234
+
235
+ # ํŠน์ • ํด๋”์— ์—…๋กœ๋“œ
236
+ nworks drive upload --file ./report.pdf --folder <folderId>
237
+
238
+ # ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
239
+ nworks drive download --file-id <fileId>
240
+
241
+ # ๋‹ค์šด๋กœ๋“œ ๊ฒฝ๋กœ/ํŒŒ์ผ๋ช… ์ง€์ •
242
+ nworks drive download --file-id <fileId> --out ./downloads --name report.pdf
243
+ ```
244
+
245
+ ### ๋ฉ”์ผ (User OAuth)
246
+
247
+ ```bash
248
+ # ๋ฉ”์ผ ์ „์†ก
249
+ nworks mail send --to "user@example.com" --subject "์ œ๋ชฉ" --body "๋‚ด์šฉ"
250
+
251
+ # CC/BCC ํฌํ•จ
252
+ nworks mail send --to "user@example.com" --cc "cc@example.com" --subject "์ œ๋ชฉ" --body "๋‚ด์šฉ"
253
+
254
+ # ๋ฐ›์€ํŽธ์ง€ํ•จ ๋ชฉ๋ก
255
+ nworks mail list
256
+
257
+ # ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ๋งŒ
258
+ nworks mail list --unread
259
+
260
+ # ๋ฉ”์ผ ์ƒ์„ธ ์กฐํšŒ
261
+ nworks mail read --id <mailId>
262
+ ```
263
+
264
+ ### ํ•  ์ผ (User OAuth)
265
+
266
+ ```bash
267
+ # ํ•  ์ผ ๋ชฉ๋ก
268
+ nworks task list
269
+
270
+ # ๋ฏธ์™„๋ฃŒ๋งŒ ์กฐํšŒ
271
+ nworks task list --status TODO
272
+
273
+ # ํ•  ์ผ ์ƒ์„ฑ
274
+ nworks task create --title "์ฝ”๋“œ ๋ฆฌ๋ทฐ" --body "PR #382 ๋ฆฌ๋ทฐ"
275
+
276
+ # ๋งˆ๊ฐ์ผ ์ง€์ •
277
+ nworks task create --title "๋ฐฐํฌ" --due 2026-03-20
278
+
279
+ # ํ•  ์ผ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
280
+ nworks task update --id <taskId> --status done
281
+
282
+ # ํ•  ์ผ ์‚ญ์ œ
283
+ nworks task delete --id <taskId>
284
+ ```
285
+
286
+ ### ๊ฒŒ์‹œํŒ (User OAuth)
287
+
288
+ ```bash
289
+ # ๊ฒŒ์‹œํŒ ๋ชฉ๋ก
290
+ nworks board list
291
+
292
+ # ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก
293
+ nworks board posts --board <boardId>
294
+
295
+ # ๊ธ€ ์ƒ์„ธ ์กฐํšŒ
296
+ nworks board read --board <boardId> --post <postId>
297
+
298
+ # ๊ธ€ ์ž‘์„ฑ
299
+ nworks board create --board <boardId> --title "๊ณต์ง€์‚ฌํ•ญ" --body "๋‚ด์šฉ"
300
+
301
+ # ์•Œ๋ฆผ ๋ฐœ์†ก + ๋Œ“๊ธ€ ๋น„ํ™œ์„ฑํ™”
302
+ nworks board create --board <boardId> --title "๊ณต์ง€" --body "๋‚ด์šฉ" --notify --no-comment
303
+ ```
304
+
305
+ ### CI/CD ๋ฐฐํฌ ์•Œ๋ฆผ
306
+
307
+ ```bash
308
+ # GitHub Actions์—์„œ ๋ฐฐํฌ ์™„๋ฃŒ ํ›„ ํŒ€ ์ฑ„๋„์— ์•Œ๋ฆผ
309
+ nworks message send --channel $CHANNEL_ID --text "v${VERSION} ๋ฐฐํฌ ์™„๋ฃŒ"
310
+ ```
311
+
312
+ ### ํŒ€ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ
313
+
314
+ ```bash
315
+ # ๋งค์ผ ์•„์นจ ํŒ€์›์—๊ฒŒ ๋ฆฌ๋งˆ์ธ๋” ์ „์†ก
316
+ for userId in $(nworks directory members --json | jq -r '.users[].userId'); do
317
+ nworks message send --to "$userId" --text "์˜ค๋Š˜์˜ ์Šคํƒ ๋“œ์—… 10์‹œ์ž…๋‹ˆ๋‹ค"
318
+ done
319
+ ```
320
+
321
+ ---
322
+
323
+ ## OAuth Scope ์„ค์ •
324
+
325
+ [NAVER WORKS Developer Console](https://dev.worksmobile.com)์—์„œ ์•ฑ์˜ OAuth Scope๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
326
+
327
+ | Scope | ์šฉ๋„ | ์ธ์ฆ ๋ฐฉ์‹ | ํ•„์š”ํ•œ ๋ช…๋ น์–ด |
328
+ |-------|------|----------|--------------|
329
+ | `bot` | Bot ๋ฉ”์‹œ์ง€ ์ „์†ก | Service Account | `message send` |
330
+ | `bot.read` | Bot ์ฑ„๋„/๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account | `message members` |
331
+ | `calendar` | ์บ˜๋ฆฐ๋” ์“ฐ๊ธฐ | User OAuth | `calendar create/update/delete` (calendar.read๋„ ํ•จ๊ป˜ ํ•„์š”) |
332
+ | `calendar.read` | ์บ˜๋ฆฐ๋” ์ฝ๊ธฐ | User OAuth | `calendar list`, `calendar create/update/delete`์˜ ์˜์กด์„ฑ |
333
+ | `file` | ๋“œ๋ผ์ด๋ธŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `drive list/upload/download` |
334
+ | `file.read` | ๋“œ๋ผ์ด๋ธŒ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `drive list/download` |
335
+ | `mail` | ๋ฉ”์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `mail send/list/read` |
336
+ | `mail.read` | ๋ฉ”์ผ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `mail list/read` |
337
+ | `task` | ํ•  ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `task create/update/delete` (user.read๋„ ํ•จ๊ป˜ ํ•„์š”) |
338
+ | `task.read` | ํ•  ์ผ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `task list` |
339
+ | `user.read` | ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ | Service Account / User OAuth | `directory members`, `task create/update/delete`์˜ ์˜์กด์„ฑ |
340
+ | `board` | ๊ฒŒ์‹œํŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `board list/posts/read/create` |
341
+ | `board.read` | ๊ฒŒ์‹œํŒ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `board list/posts/read` |
342
+
343
+ > **Tip**: scope๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„์—๋Š” ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
344
+ > ```bash
345
+ > nworks logout && nworks login --user --scope "..."
346
+ > ```
347
+
348
+ ---
349
+
350
+ ## ํ™˜๊ฒฝ ๋ณ€์ˆ˜
351
+
352
+ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๋ฉด `nworks login` ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (CI/์—์ด์ „ํŠธ์šฉ).
353
+
354
+ ```bash
355
+ # ๊ณตํ†ต (ํ•„์ˆ˜)
356
+ NWORKS_CLIENT_ID=
357
+ NWORKS_CLIENT_SECRET=
358
+
359
+ # ๋ด‡ ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹œ์—๋งŒ ํ•„์š” (User OAuth๋งŒ ์“ฐ๋ฉด ๋ถˆํ•„์š”)
360
+ NWORKS_SERVICE_ACCOUNT=
361
+ NWORKS_PRIVATE_KEY_PATH=
362
+ NWORKS_BOT_ID=
363
+
364
+ # ์„ ํƒ
365
+ NWORKS_DOMAIN_ID=
366
+ NWORKS_SCOPE= # ๊ธฐ๋ณธ: bot bot.read user.read
367
+ NWORKS_VERBOSE=1 # ๋””๋ฒ„๊ทธ ๋กœ๊น…
368
+ ```
369
+
370
+ ### MCP ์„œ๋ฒ„์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ง์ ‘ ์„ค์ •
371
+
372
+ ๋ฏผ๊ฐ ์ •๋ณด(Client Secret, Private Key ๊ฒฝ๋กœ)๋Š” MCP ์„ค์ •์˜ `env` ํ•„๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Client ID ๋“ฑ ๋ฏผ๊ฐํ•˜์ง€ ์•Š์€ ๊ฐ’์€ AI ์—์ด์ „ํŠธ๊ฐ€ `nworks_setup` tool๋กœ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
373
+
374
+ ```json
375
+ {
376
+ "mcpServers": {
377
+ "nworks": {
378
+ "command": "npx",
379
+ "args": ["-y", "nworks", "mcp"],
380
+ "env": {
381
+ "NWORKS_CLIENT_SECRET": "<Client Secret>",
382
+ "NWORKS_PRIVATE_KEY_PATH": "<Private Key ํŒŒ์ผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ (Service Account ์‚ฌ์šฉ ์‹œ)>"
383
+ }
384
+ }
385
+ }
386
+ }
387
+ ```
388
+
389
+ ---
390
+
391
+ ## License
392
+
393
+ Apache-2.0