nworks 1.2.2 โ†’ 1.3.1

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,459 @@
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
+ ๋ฉ”์‹œ์ง€, ์บ˜๋ฆฐ๋”, ๋“œ๋ผ์ด๋ธŒ, ๋ฉ”์ผ, ํ•  ์ผ, ๊ฒŒ์‹œํŒ โ€” 36๊ฐœ ๋„๊ตฌ๋ฅผ CLI์™€ AI ์—์ด์ „ํŠธ์—์„œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
18
+
19
+ nworks๋Š” **์™ธ๋ถ€** AI ์—์ด์ „ํŠธ(Claude, Cursor)์™€ ํ„ฐ๋ฏธ๋„์—์„œ LINE WORKS๋ฅผ *๋‹ค๋ฃจ๊ธฐ* ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. LINE WORKS ์ž์ฒด์˜ ์‚ฌ๋‚ด์šฉ AI(AiStudio, WORKS AI)์™€ ๊ฒน์น˜์ง€ ์•Š๊ณ  ์ƒํ˜ธ ๋ณด์™„ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ณต์‹ยท์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ์ ํŠธ์ด๋ฉฐ LINE WORKS / NAVER WORKS์™€ ์ œํœด ๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
20
+
21
+ ## Quickstart
22
+
23
+ ```bash
24
+ npm install -g nworks
25
+ nworks login --user
26
+ nworks calendar list
27
+ ```
28
+
29
+ > **์ฒ˜์Œ์ด์‹ ๊ฐ€์š”?** ๋จผ์ € Developer Console ์•ฑ(Client ID/Secret), redirect URL ๋“ฑ๋ก, ๊ทธ๋ฆฌ๊ณ  ๋ด‡ ๋ฉ”์‹œ์ง€์˜ ๊ฒฝ์šฐ ๊ด€๋ฆฌ์ž ์Šน์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. [์˜จ๋ณด๋”ฉ & ๊ด€๋ฆฌ์ž ์„ค์ • ๊ฐ€์ด๋“œ](ONBOARDING.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
30
+
31
+ ### AI ์—์ด์ „ํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ ์”๋‹ˆ๋‹ค
32
+
33
+ ```
34
+ User: ์˜ค๋Š˜ ์ผ์ • ์•Œ๋ ค์ค˜
35
+
36
+ Claude โ†’ nworks_calendar_list
37
+ โ†’ 3๊ฑด: ์Šคํƒ ๋“œ์—…(10:00), ์ ์‹ฌ๋ฏธํŒ…(12:00), ์ฝ”๋“œ๋ฆฌ๋ทฐ(15:00)
38
+
39
+ User: ํŒ€ ์ฑ„๋„์— ๋ฐฐํฌ ์™„๋ฃŒ ๋ฉ”์‹œ์ง€ ๋ณด๋‚ด์ค˜
40
+
41
+ Claude โ†’ nworks_message_send
42
+ { "channel": "C001", "text": "v1.2.0 ๋ฐฐํฌ ์™„๋ฃŒ" }
43
+ โ†’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค
44
+
45
+ User: ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด์ค˜
46
+
47
+ Claude โ†’ nworks_mail_list (unread)
48
+ โ†’ ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ 3ํ†ต
49
+ Claude โ†’ nworks_mail_read (๊ฐ๊ฐ)
50
+ โ†’ "3ํ†ต: 1) CTO ๋ฐฐํฌ ์Šน์ธ, 2) ๊ธˆ์š”์ผ ํšŒ์˜ ์ดˆ๋Œ€, 3) ์ฃผ๊ฐ„ ๋ณด๊ณ  ๋ฆฌ๋งˆ์ธ๋”"
51
+ ```
52
+
53
+ ## Install
54
+
55
+ ```bash
56
+ npx nworks # ๋ฐ”๋กœ ์‹คํ–‰
57
+ npm install -g nworks # ๊ธ€๋กœ๋ฒŒ ์„ค์น˜
58
+ ```
59
+
60
+ ## ๋กœ๊ทธ์ธ
61
+
62
+ ```bash
63
+ # User OAuth (์บ˜๋ฆฐ๋”, ๋“œ๋ผ์ด๋ธŒ, ๋ฉ”์ผ, ํ•  ์ผ, ๊ฒŒ์‹œํŒ)
64
+ nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
65
+
66
+ # ๋ด‡ ๋ฉ”์‹œ์ง€ ์ „์†ก์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ (Service Account)
67
+ nworks login
68
+
69
+ # ์ธ์ฆ ํ™•์ธ
70
+ nworks whoami
71
+
72
+ # ๋กœ๊ทธ์•„์›ƒ
73
+ nworks logout
74
+ ```
75
+
76
+ > `nworks login --user`๋Š” CLIENT_ID + CLIENT_SECRET๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ ๊ธฐ์กด ์„ค์ •์— ์ด๋ฏธ ์žˆ๋Š” ๊ฐ’์€ ๋‹ค์‹œ ๋ฌผ์–ด๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
77
+
78
+ > **Developer Console ์„ค์ •**: User OAuth๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด [Developer Console](https://dev.worksmobile.com)์—์„œ Redirect URL์— `http://localhost:9876/callback`์„ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
79
+
80
+ ---
81
+
82
+ ## AI ์—์ด์ „ํŠธ ์—ฐ๋™ (MCP ์„œ๋ฒ„)
83
+
84
+ Claude Desktop, Cursor ๋“ฑ MCP ํ˜ธํ™˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
85
+
86
+ ### ์„ค์ •
87
+
88
+ ๋จผ์ € ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค:
89
+
90
+ ```bash
91
+ nworks login --user --scope "calendar calendar.read file file.read mail mail.read task task.read board board.read user.read"
92
+ ```
93
+
94
+ ๊ทธ๋ฆฌ๊ณ  MCP ์„ค์ •์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (`~/.config/claude/claude_desktop_config.json`):
95
+
96
+ ```json
97
+ {
98
+ "mcpServers": {
99
+ "nworks": {
100
+ "command": "nworks",
101
+ "args": ["mcp"]
102
+ }
103
+ }
104
+ }
105
+ ```
106
+
107
+ ๋กœ๊ทธ์ธ ํ•œ ๋ฒˆ์ด๋ฉด 36๊ฐœ ๋„๊ตฌ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ๋ณ„๋„ env ์„ค์ • ๋ถˆํ•„์š”.
108
+
109
+ > **MCP์—์„œ AI ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•˜๊ธฐ**: CLI ๋กœ๊ทธ์ธ ์—†์ด๋„ AI ์—์ด์ „ํŠธ๊ฐ€ `nworks_setup` โ†’ `nworks_login_user` ์ˆœ์„œ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ๋งŒ์œผ๋กœ ์ „์ฒด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Client Secret๊ณผ Private Key ๊ฒฝ๋กœ๋Š” MCP ์„ค์ •์˜ `env` ํ•„๋“œ ๋˜๋Š” ์‹œ์Šคํ…œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
110
+
111
+ ### MCP ๋„๊ตฌ ๋ชฉ๋ก (32๊ฐœ)
112
+
113
+ | ๋„๊ตฌ | ์„ค๋ช… | ํ•„์š” ์ธ์ฆ |
114
+ |------|------|----------|
115
+ | **์„ค์ •/์ธ์ฆ** | | |
116
+ | `nworks_setup` | API ์ธ์ฆ ์ •๋ณด ์„ค์ • (Client ID ๋“ฑ). Client Secret์€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„ค์ • | โ€” |
117
+ | `nworks_login_user` | User OAuth ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ (์ „์ฒด scope ์ž๋™ ํฌํ•จ) | โ€” |
118
+ | `nworks_logout` | ์ธ์ฆ ์ •๋ณด ๋ฐ ํ† ํฐ ์‚ญ์ œ | โ€” |
119
+ | `nworks_whoami` | ์ธ์ฆ ์ƒํƒœ ํ™•์ธ | โ€” |
120
+ | `nworks_doctor` | ์—ฐ๊ฒฐ ์ƒํƒœ ์ง„๋‹จ (์ธ์ฆ, ํ† ํฐ, API ์ ๊ฒ€) | โ€” |
121
+ | **๋ฉ”์‹œ์ง€** | | |
122
+ | `nworks_message_send` | ์‚ฌ์šฉ์ž/์ฑ„๋„์— ๋ฉ”์‹œ์ง€ ์ „์†ก | Service Account |
123
+ | `nworks_message_members` | ์ฑ„๋„ ๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account |
124
+ | `nworks_directory_members` | ์กฐ์ง ๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account |
125
+ | **์บ˜๋ฆฐ๋”** | | |
126
+ | `nworks_calendar_list` | ์บ˜๋ฆฐ๋” ์ผ์ • ์กฐํšŒ | User OAuth (calendar.read) |
127
+ | `nworks_calendar_create` | ์บ˜๋ฆฐ๋” ์ผ์ • ์ƒ์„ฑ | User OAuth (calendar + calendar.read) |
128
+ | `nworks_calendar_update` | ์บ˜๋ฆฐ๋” ์ผ์ • ์ˆ˜์ • | User OAuth (calendar + calendar.read) |
129
+ | `nworks_calendar_delete` | ์บ˜๋ฆฐ๋” ์ผ์ • ์‚ญ์ œ | User OAuth (calendar + calendar.read) |
130
+ | **๋“œ๋ผ์ด๋ธŒ** | | |
131
+ | `nworks_drive_list` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก | User OAuth (file.read) |
132
+ | `nworks_drive_upload` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ์—…๋กœ๋“œ | User OAuth (file) |
133
+ | `nworks_drive_download` | ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (5MB ์ดˆ๊ณผ ์‹œ ๋กœ์ปฌ ์ €์žฅ) | User OAuth (file.read) |
134
+ | `nworks_sharedrive_list` | ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (file.read) |
135
+ | `nworks_sharedrive_files` | ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก ์กฐํšŒ | User OAuth (file.read) |
136
+ | `nworks_sharedrive_download` | ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (5MB ์ดˆ๊ณผ ์‹œ ๋กœ์ปฌ ์ €์žฅ) | User OAuth (file.read) |
137
+ | **๋ฉ”์ผ** | | |
138
+ | `nworks_mail_send` | ๋ฉ”์ผ ์ „์†ก | User OAuth (mail) |
139
+ | `nworks_mail_list` | ๋ฉ”์ผ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (mail.read) |
140
+ | `nworks_mail_read` | ๋ฉ”์ผ ์ƒ์„ธ ์กฐํšŒ | User OAuth (mail.read) |
141
+ | `nworks_mail_download_attachment` | ๋ฉ”์ผ ์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (5MB ์ดˆ๊ณผ ์‹œ ๋กœ์ปฌ ์ €์žฅ) | User OAuth (mail.read) |
142
+ | **ํ•  ์ผ** | | |
143
+ | `nworks_task_list` | ํ•  ์ผ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (task.read) |
144
+ | `nworks_task_create` | ํ•  ์ผ ์ƒ์„ฑ | User OAuth (task + user.read) |
145
+ | `nworks_task_update` | ํ•  ์ผ ์ˆ˜์ •/์™„๋ฃŒ | User OAuth (task + user.read) |
146
+ | `nworks_task_delete` | ํ•  ์ผ ์‚ญ์ œ | User OAuth (task + user.read) |
147
+ | **๊ฒŒ์‹œํŒ** | | |
148
+ | `nworks_board_list` | ๊ฒŒ์‹œํŒ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (board.read) |
149
+ | `nworks_board_posts` | ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (board.read) |
150
+ | `nworks_board_read` | ๊ฒŒ์‹œํŒ ๊ธ€ ์ƒ์„ธ ์กฐํšŒ | User OAuth (board.read) |
151
+ | `nworks_board_create` | ๊ฒŒ์‹œํŒ ๊ธ€ ์ž‘์„ฑ | User OAuth (board) |
152
+ | **์—ฐ๋ฝ์ฒ˜** | | |
153
+ | `nworks_contact_list` | ์—ฐ๋ฝ์ฒ˜ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (contact.read) |
154
+ | `nworks_contact_get` | ์—ฐ๋ฝ์ฒ˜ ์ƒ์„ธ ์กฐํšŒ | User OAuth (contact.read) |
155
+ | `nworks_contact_create` | ์—ฐ๋ฝ์ฒ˜ ์ƒ์„ฑ | User OAuth (contact) |
156
+ | `nworks_contact_update` | ์—ฐ๋ฝ์ฒ˜ ์ˆ˜์ • | User OAuth (contact) |
157
+ | `nworks_contact_delete` | ์—ฐ๋ฝ์ฒ˜ ์‚ญ์ œ | User OAuth (contact) |
158
+ | `nworks_contact_list_tags` | ์—ฐ๋ฝ์ฒ˜ ํƒœ๊ทธ ๋ชฉ๋ก ์กฐํšŒ | User OAuth (contact.read) |
159
+
160
+ ### AI ์—์ด์ „ํŠธ ์‚ฌ์šฉ ์˜ˆ์‹œ
161
+
162
+ ```
163
+ User: ๋‚ด์ผ ์˜คํ›„ 2์‹œ์— ํšŒ์˜ ์žก๊ณ , ํŒ€ ์ฑ„๋„์— ์•Œ๋ ค์ค˜
164
+
165
+ Claude โ†’ nworks_calendar_create
166
+ { "summary": "ํšŒ์˜", "start": "2026-03-15T14:00:00", "end": "2026-03-15T15:00:00" }
167
+ โ†’ ์ผ์ •์ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
168
+
169
+ Claude โ†’ nworks_message_send
170
+ { "channel": "C001", "text": "๋‚ด์ผ 14:00 ํšŒ์˜๊ฐ€ ์žกํ˜”์Šต๋‹ˆ๋‹ค" }
171
+ โ†’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค
172
+
173
+ User: ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ ํ™•์ธํ•˜๊ณ  ์š”์•ฝํ•ด์ค˜
174
+
175
+ Claude โ†’ nworks_mail_list (unread)
176
+ โ†’ ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ 3ํ†ต
177
+ Claude โ†’ nworks_mail_read (๊ฐ๊ฐ)
178
+ โ†’ "3ํ†ต: 1) CTO ๋ฐฐํฌ ์Šน์ธ, 2) ๊ธˆ์š”์ผ ํšŒ์˜ ์ดˆ๋Œ€, 3) ์ฃผ๊ฐ„ ๋ณด๊ณ  ๋ฆฌ๋งˆ์ธ๋”"
179
+ ```
180
+
181
+ ---
182
+
183
+ ## CLI ์‚ฌ์šฉ๋ฒ•
184
+
185
+ > ๋ชจ๋“  ๋ช…๋ น์–ด์— `--json` ์ง€์› (ํŒŒ์ดํ”„, ์Šคํฌ๋ฆฝํŠธ, ์—์ด์ „ํŠธ ํŒŒ์‹ฑ ์šฉ์ด). `message send`, `mail send`, `drive upload`๋Š” `--dry-run`์œผ๋กœ ์‹ค์ œ ์ „์†ก ์—†์ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ.
186
+
187
+ ### ๋ฉ”์‹œ์ง€ (Bot API)
188
+
189
+ ```bash
190
+ # ์‚ฌ์šฉ์ž์—๊ฒŒ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€
191
+ nworks message send --to <userId> --text "๋ฉ”์‹œ์ง€"
192
+
193
+ # ์ฑ„๋„์— ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€
194
+ nworks message send --channel <channelId> --text "๋ฉ”์‹œ์ง€"
195
+
196
+ # ๋ฒ„ํŠผ ๋ฉ”์‹œ์ง€
197
+ nworks message send --to <userId> --type button --text "PR ๋ฆฌ๋ทฐ ์š”์ฒญ" \
198
+ --actions '[{"type":"message","label":"์Šน์ธ","postback":"approve"}]'
199
+
200
+ # ๋ฆฌ์ŠคํŠธ ๋ฉ”์‹œ์ง€
201
+ nworks message send --to <userId> --type list --text "์˜ค๋Š˜์˜ ํ•  ์ผ" \
202
+ --elements '[{"title":"์ฝ”๋“œ ๋ฆฌ๋ทฐ","subtitle":"#382 PR"}]'
203
+
204
+ # ์ฑ„๋„ ๊ตฌ์„ฑ์› ์กฐํšŒ
205
+ nworks message members --channel <channelId>
206
+ ```
207
+
208
+ ### ์กฐ์ง (Directory API)
209
+
210
+ ```bash
211
+ nworks directory members # ์กฐ์ง ๊ตฌ์„ฑ์› ๋ชฉ๋ก
212
+ ```
213
+
214
+ ### ์บ˜๋ฆฐ๋” (User OAuth)
215
+
216
+ ```bash
217
+ # ์˜ค๋Š˜ ์ผ์ • ์กฐํšŒ
218
+ nworks calendar list
219
+
220
+ # ๊ธฐ๊ฐ„ ์ง€์ •
221
+ nworks calendar list --from "2026-03-14T00:00:00+09:00" --until "2026-03-14T23:59:59+09:00"
222
+
223
+ # ์ผ์ • ์ƒ์„ฑ
224
+ nworks calendar create --title "ํšŒ์˜" --start "2026-03-14T14:00+09:00" --end "2026-03-14T15:00+09:00"
225
+
226
+ # ์žฅ์†Œ/์„ค๋ช… ํฌํ•จ
227
+ nworks calendar create --title "์ ์‹ฌ ๋ฏธํŒ…" --start "2026-03-14T12:00+09:00" --end "2026-03-14T13:00+09:00" \
228
+ --location "๊ฐ•๋‚จ ์‹๋‹น" --description "๋ถ„๊ธฐ ๋ฆฌ๋ทฐ"
229
+
230
+ # ์ฐธ์„์ž ์ง€์ • + ์•Œ๋ฆผ
231
+ nworks calendar create --title "ํŒ€ ํšŒ์˜" --start "2026-03-14T10:00+09:00" --end "2026-03-14T11:00+09:00" \
232
+ --attendees "user1@example.com,user2@example.com" --notify
233
+
234
+ # ์ผ์ • ์ˆ˜์ •
235
+ nworks calendar update --id <eventId> --title "๋ณ€๊ฒฝ๋œ ์ œ๋ชฉ"
236
+
237
+ # ์ผ์ • ์‚ญ์ œ
238
+ nworks calendar delete --id <eventId>
239
+ ```
240
+
241
+ ### ๋“œ๋ผ์ด๋ธŒ (User OAuth)
242
+
243
+ ```bash
244
+ # ํŒŒ์ผ/ํด๋” ๋ชฉ๋ก
245
+ nworks drive list
246
+
247
+ # ํŒŒ์ผ ์—…๋กœ๋“œ
248
+ nworks drive upload --file ./report.pdf
249
+
250
+ # ํŠน์ • ํด๋”์— ์—…๋กœ๋“œ
251
+ nworks drive upload --file ./report.pdf --folder <folderId>
252
+
253
+ # ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
254
+ nworks drive download --file-id <fileId>
255
+
256
+ # ๋‹ค์šด๋กœ๋“œ ๊ฒฝ๋กœ/ํŒŒ์ผ๋ช… ์ง€์ •
257
+ nworks drive download --file-id <fileId> --out ./downloads --name report.pdf
258
+
259
+ # ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ๋ชฉ๋ก
260
+ nworks drive sharedrive-list
261
+
262
+ # ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ๋ชฉ๋ก (๋ฃจํŠธ)
263
+ nworks drive sharedrive-files --sharedrive <sharedriveId>
264
+
265
+ # ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ํด๋” ๋‚ด ํŒŒ์ผ ๋ชฉ๋ก
266
+ nworks drive sharedrive-files --sharedrive <sharedriveId> --folder <fileId>
267
+
268
+ # ๊ณต์œ  ๋“œ๋ผ์ด๋ธŒ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
269
+ nworks drive sharedrive-download --sharedrive <sharedriveId> --file-id <fileId>
270
+ ```
271
+
272
+ ### ๋ฉ”์ผ (User OAuth)
273
+
274
+ ```bash
275
+ # ๋ฉ”์ผ ์ „์†ก
276
+ nworks mail send --to "user@example.com" --subject "์ œ๋ชฉ" --body "๋‚ด์šฉ"
277
+
278
+ # CC/BCC ํฌํ•จ
279
+ nworks mail send --to "user@example.com" --cc "cc@example.com" --subject "์ œ๋ชฉ" --body "๋‚ด์šฉ"
280
+
281
+ # ๋ฐ›์€ํŽธ์ง€ํ•จ ๋ชฉ๋ก
282
+ nworks mail list
283
+
284
+ # ์ฝ์ง€ ์•Š์€ ๋ฉ”์ผ๋งŒ
285
+ nworks mail list --unread
286
+
287
+ # ๋ฉ”์ผ ์ƒ์„ธ ์กฐํšŒ
288
+ nworks mail read --id <mailId>
289
+
290
+ # ๋ฉ”์ผ ์ฒจ๋ถ€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
291
+ nworks mail download-attachment --id <mailId> --attachment-id <attachmentId>
292
+
293
+ # ์ €์žฅ ๊ฒฝ๋กœ/ํŒŒ์ผ๋ช… ์ง€์ •
294
+ nworks mail download-attachment --id <mailId> --attachment-id <attachmentId> --out ./downloads --name invoice.pdf
295
+ ```
296
+
297
+ ### ํ•  ์ผ (User OAuth)
298
+
299
+ ```bash
300
+ # ํ•  ์ผ ๋ชฉ๋ก
301
+ nworks task list
302
+
303
+ # ๋ฏธ์™„๋ฃŒ๋งŒ ์กฐํšŒ
304
+ nworks task list --status TODO
305
+
306
+ # ํ•  ์ผ ์ƒ์„ฑ
307
+ nworks task create --title "์ฝ”๋“œ ๋ฆฌ๋ทฐ" --body "PR #382 ๋ฆฌ๋ทฐ"
308
+
309
+ # ๋งˆ๊ฐ์ผ ์ง€์ •
310
+ nworks task create --title "๋ฐฐํฌ" --due 2026-03-20
311
+
312
+ # ํ•  ์ผ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
313
+ nworks task update --id <taskId> --status done
314
+
315
+ # ํ•  ์ผ ์‚ญ์ œ
316
+ nworks task delete --id <taskId>
317
+ ```
318
+
319
+ ### ๊ฒŒ์‹œํŒ (User OAuth)
320
+
321
+ ```bash
322
+ # ๊ฒŒ์‹œํŒ ๋ชฉ๋ก
323
+ nworks board list
324
+
325
+ # ๊ฒŒ์‹œํŒ ๊ธ€ ๋ชฉ๋ก
326
+ nworks board posts --board <boardId>
327
+
328
+ # ๊ธ€ ์ƒ์„ธ ์กฐํšŒ
329
+ nworks board read --board <boardId> --post <postId>
330
+
331
+ # ๊ธ€ ์ž‘์„ฑ
332
+ nworks board create --board <boardId> --title "๊ณต์ง€์‚ฌํ•ญ" --body "๋‚ด์šฉ"
333
+
334
+ # ์•Œ๋ฆผ ๋ฐœ์†ก + ๋Œ“๊ธ€ ๋น„ํ™œ์„ฑํ™”
335
+ nworks board create --board <boardId> --title "๊ณต์ง€" --body "๋‚ด์šฉ" --notify --no-comment
336
+ ```
337
+
338
+ ### ์—ฐ๋ฝ์ฒ˜ (User OAuth)
339
+
340
+ ```bash
341
+ # ์—ฐ๋ฝ์ฒ˜ ๋ชฉ๋ก
342
+ nworks contact list
343
+
344
+ # ํƒœ๊ทธ๋กœ ํ•„ํ„ฐ๋ง
345
+ nworks contact list --tag <contactTagId>
346
+
347
+ # ์—ฐ๋ฝ์ฒ˜ ์ƒ์„ธ ์กฐํšŒ
348
+ nworks contact get --id <contactId>
349
+
350
+ # ์—ฐ๋ฝ์ฒ˜ ์ƒ์„ฑ
351
+ nworks contact create --payload '{"contactName":{"lastName":"๊น€","firstName":"์ฒ ์ˆ˜"},"emails":[{"email":"chulsoo@example.com","primary":true}],"permission":{"accessibleRange":"MEMBER","isCoEditing":false,"accessibleMembers":[{"id":"<๋‚ด userId>","type":"USER"}]}}'
352
+
353
+ # ์—ฐ๋ฝ์ฒ˜ ์ˆ˜์ •
354
+ nworks contact update --id <contactId> --payload '{"telephones":[{"type":"CELLPHONE","telephone":"010-1234-5678","primary":true}]}'
355
+
356
+ # ์—ฐ๋ฝ์ฒ˜ ์‚ญ์ œ
357
+ nworks contact delete --id <contactId>
358
+
359
+ # ์—ฐ๋ฝ์ฒ˜ ํƒœ๊ทธ ๋ชฉ๋ก
360
+ nworks contact list-tags
361
+ ```
362
+
363
+ > `contact create`๋Š” `contactName`๊ณผ `permission`์ด ํ•„์ˆ˜์ด๋ฉฐ, `permission.accessibleMembers`์— ์ตœ์†Œ 1๋ช…(๋ณดํ†ต ๋ณธ์ธ)์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์ธ userId๋Š” `nworks whoami`๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
364
+
365
+
366
+ ### CI/CD ๋ฐฐํฌ ์•Œ๋ฆผ
367
+
368
+ ```bash
369
+ # GitHub Actions์—์„œ ๋ฐฐํฌ ์™„๋ฃŒ ํ›„ ํŒ€ ์ฑ„๋„์— ์•Œ๋ฆผ
370
+ nworks message send --channel $CHANNEL_ID --text "v${VERSION} ๋ฐฐํฌ ์™„๋ฃŒ"
371
+ ```
372
+
373
+ ### ํŒ€ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ
374
+
375
+ ```bash
376
+ # ๋งค์ผ ์•„์นจ ํŒ€์›์—๊ฒŒ ๋ฆฌ๋งˆ์ธ๋” ์ „์†ก
377
+ for userId in $(nworks directory members --json | jq -r '.users[].userId'); do
378
+ nworks message send --to "$userId" --text "์˜ค๋Š˜์˜ ์Šคํƒ ๋“œ์—… 10์‹œ์ž…๋‹ˆ๋‹ค"
379
+ done
380
+ ```
381
+
382
+ ---
383
+
384
+ ## OAuth Scope ์„ค์ •
385
+
386
+ [NAVER WORKS Developer Console](https://dev.worksmobile.com)์—์„œ ์•ฑ์˜ OAuth Scope๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
387
+
388
+ | Scope | ์šฉ๋„ | ์ธ์ฆ ๋ฐฉ์‹ | ํ•„์š”ํ•œ ๋ช…๋ น์–ด |
389
+ |-------|------|----------|--------------|
390
+ | `bot` | Bot ๋ฉ”์‹œ์ง€ ์ „์†ก | Service Account | `message send` |
391
+ | `bot.read` | Bot ์ฑ„๋„/๊ตฌ์„ฑ์› ์กฐํšŒ | Service Account | `message members` |
392
+ | `calendar` | ์บ˜๋ฆฐ๋” ์“ฐ๊ธฐ | User OAuth | `calendar create/update/delete` (calendar.read๋„ ํ•จ๊ป˜ ํ•„์š”) |
393
+ | `calendar.read` | ์บ˜๋ฆฐ๋” ์ฝ๊ธฐ | User OAuth | `calendar list`, `calendar create/update/delete`์˜ ์˜์กด์„ฑ |
394
+ | `file` | ๋“œ๋ผ์ด๋ธŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `drive list/upload/download` |
395
+ | `file.read` | ๋“œ๋ผ์ด๋ธŒ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `drive list/download` |
396
+ | `mail` | ๋ฉ”์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `mail send/list/read` |
397
+ | `mail.read` | ๋ฉ”์ผ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `mail list/read` |
398
+ | `task` | ํ•  ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `task create/update/delete` (user.read๋„ ํ•จ๊ป˜ ํ•„์š”) |
399
+ | `task.read` | ํ•  ์ผ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `task list` |
400
+ | `user.read` | ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ | Service Account / User OAuth | `directory members`, `task create/update/delete`์˜ ์˜์กด์„ฑ |
401
+ | `board` | ๊ฒŒ์‹œํŒ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `board list/posts/read/create` |
402
+ | `board.read` | ๊ฒŒ์‹œํŒ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `board list/posts/read` |
403
+ | `contact` | ์—ฐ๋ฝ์ฒ˜ ์ฝ๊ธฐ/์“ฐ๊ธฐ | User OAuth | `contact create/update/delete` (contact.read ํ•„์š”) |
404
+ | `contact.read` | ์—ฐ๋ฝ์ฒ˜ ์ฝ๊ธฐ ์ „์šฉ | User OAuth | `contact list/get/list-tags` |
405
+
406
+ > **ํ”„๋ฆฌ์…‹**์ด scope๋ฅผ ์ผ์ผ์ด ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:
407
+ > ```bash
408
+ > nworks login --user --preset all # ๊ธฐ๋ณธ๊ฐ’: ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธ์œผ๋กœ ์ „์ฒด ๊ธฐ๋Šฅ
409
+ > nworks login --user --preset readonly # ์ฝ๊ธฐ ์ „์šฉ scope
410
+ > ```
411
+ > `default`๋Š” `all`์˜ ๋ณ„์นญ์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€ ์ „์†ก์€ Service Account(๋ด‡)๋ฅผ ์“ฐ๋ฏ€๋กœ ํ”„๋ฆฌ์…‹๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
412
+ > ์žฌ๋กœ๊ทธ์ธํ•ด๋„ ๊ถŒํ•œ์€ ์ค„์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ ์š”์ฒญํ•œ scope๊ฐ€ ๊ธฐ์กด ํ† ํฐ๊ณผ ํ•ฉ์ณ์ง€๋ฏ€๋กœ, ํ”„๋ฆฌ์…‹์„ ๋ฐ”๊ฟ”๋„ ๊ถŒํ•œ์ด ์ถ”๊ฐ€๋˜๊ธฐ๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๊ณ ๋ฅธ ์กฐํ•ฉ์€ `--scope "calendar calendar.read"`๋กœ ์ง€์ •ํ•˜์„ธ์š”.
413
+
414
+ ---
415
+
416
+ ## ํ™˜๊ฒฝ ๋ณ€์ˆ˜
417
+
418
+ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜๋ฉด `nworks login` ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (CI/์—์ด์ „ํŠธ์šฉ).
419
+
420
+ ```bash
421
+ # ๊ณตํ†ต (ํ•„์ˆ˜)
422
+ NWORKS_CLIENT_ID=
423
+ NWORKS_CLIENT_SECRET=
424
+
425
+ # ๋ด‡ ๋ฉ”์‹œ์ง€ ์ „์†ก ์‹œ์—๋งŒ ํ•„์š” (User OAuth๋งŒ ์“ฐ๋ฉด ๋ถˆํ•„์š”)
426
+ NWORKS_SERVICE_ACCOUNT=
427
+ NWORKS_PRIVATE_KEY_PATH=
428
+ NWORKS_BOT_ID=
429
+
430
+ # ์„ ํƒ
431
+ NWORKS_DOMAIN_ID=
432
+ NWORKS_SCOPE= # ๊ธฐ๋ณธ: bot bot.read user.read
433
+ NWORKS_VERBOSE=1 # ๋””๋ฒ„๊ทธ ๋กœ๊น…
434
+ ```
435
+
436
+ ### MCP ์„œ๋ฒ„์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ง์ ‘ ์„ค์ •
437
+
438
+ ๋ฏผ๊ฐ ์ •๋ณด(Client Secret, Private Key ๊ฒฝ๋กœ)๋Š” MCP ์„ค์ •์˜ `env` ํ•„๋“œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Client ID ๋“ฑ ๋ฏผ๊ฐํ•˜์ง€ ์•Š์€ ๊ฐ’์€ AI ์—์ด์ „ํŠธ๊ฐ€ `nworks_setup` tool๋กœ ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
439
+
440
+ ```json
441
+ {
442
+ "mcpServers": {
443
+ "nworks": {
444
+ "command": "npx",
445
+ "args": ["-y", "nworks", "mcp"],
446
+ "env": {
447
+ "NWORKS_CLIENT_SECRET": "<Client Secret>",
448
+ "NWORKS_PRIVATE_KEY_PATH": "<Private Key ํŒŒ์ผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ (Service Account ์‚ฌ์šฉ ์‹œ)>"
449
+ }
450
+ }
451
+ }
452
+ }
453
+ ```
454
+
455
+ ---
456
+
457
+ ## License
458
+
459
+ Apache-2.0