nworks 0.6.2 → 0.7.0
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.md +31 -2
- package/dist/index.js +340 -4
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +229 -0
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ nworks login \
|
|
|
26
26
|
--bot-id <BOT_ID>
|
|
27
27
|
|
|
28
28
|
# User OAuth 로그인 (캘린더, 드라이브 등 사용자 API용)
|
|
29
|
-
nworks login --user --scope "calendar,calendar.read,file,mail,task,user.read"
|
|
29
|
+
nworks login --user --scope "calendar,calendar.read,file,mail,task,board,user.read"
|
|
30
30
|
|
|
31
31
|
# 인증 확인
|
|
32
32
|
nworks whoami
|
|
@@ -60,6 +60,12 @@ nworks task list
|
|
|
60
60
|
|
|
61
61
|
# 할 일 생성
|
|
62
62
|
nworks task create --title "코드 리뷰" --body "PR #382 리뷰"
|
|
63
|
+
|
|
64
|
+
# 게시판 목록
|
|
65
|
+
nworks board list
|
|
66
|
+
|
|
67
|
+
# 게시판 글 작성
|
|
68
|
+
nworks board create --board <boardId> --title "공지사항" --body "내용"
|
|
63
69
|
```
|
|
64
70
|
|
|
65
71
|
## CLI Commands
|
|
@@ -217,6 +223,27 @@ nworks task delete --id <taskId>
|
|
|
217
223
|
|
|
218
224
|
> **Note**: 할 일 API는 User OAuth가 필요합니다. 먼저 `nworks login --user --scope "task user.read"`를 실행하세요. (`user.read`는 사용자 ID 조회에 필요) 읽기만 필요하면 `nworks login --user --scope "task.read user.read"`로 충분합니다.
|
|
219
225
|
|
|
226
|
+
### 게시판 (User OAuth 필요)
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
# 게시판 목록
|
|
230
|
+
nworks board list
|
|
231
|
+
|
|
232
|
+
# 게시판 글 목록
|
|
233
|
+
nworks board posts --board <boardId>
|
|
234
|
+
|
|
235
|
+
# 글 상세 조회
|
|
236
|
+
nworks board read --board <boardId> --post <postId>
|
|
237
|
+
|
|
238
|
+
# 글 작성
|
|
239
|
+
nworks board create --board <boardId> --title "공지사항" --body "내용"
|
|
240
|
+
|
|
241
|
+
# 알림 발송 + 댓글 비활성화
|
|
242
|
+
nworks board create --board <boardId> --title "공지" --body "내용" --notify --no-comment
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
> **Note**: 게시판 API는 User OAuth가 필요합니다. 먼저 `nworks login --user --scope board`를 실행하세요. 읽기만 필요하면 `board.read` scope로 충분합니다.
|
|
246
|
+
|
|
220
247
|
### MCP 서버
|
|
221
248
|
|
|
222
249
|
```bash
|
|
@@ -263,6 +290,8 @@ nworks mcp --list-tools # 등록된 tool 목록
|
|
|
263
290
|
| `mail.read` | 메일 읽기 전용 | User OAuth | `mail list/read` |
|
|
264
291
|
| `task` | 할 일 읽기/쓰기 | User OAuth | `task list/create/update/delete` (+ `user.read` 필요) |
|
|
265
292
|
| `task.read` | 할 일 읽기 전용 | User OAuth | `task list` (+ `user.read` 필요) |
|
|
293
|
+
| `board` | 게시판 읽기/쓰기 | User OAuth | `board list/posts/read/create` |
|
|
294
|
+
| `board.read` | 게시판 읽기 전용 | User OAuth | `board list/posts/read` |
|
|
266
295
|
|
|
267
296
|
> **Tip**: scope를 변경한 후에는 토큰을 재발급해야 합니다.
|
|
268
297
|
> ```bash
|
|
@@ -319,7 +348,7 @@ NWORKS_VERBOSE=1 # optional, 디버그 로깅
|
|
|
319
348
|
- ~~**v0.4** — 메일 (`nworks mail send/list/read`)~~
|
|
320
349
|
- ~~**v0.5** — 할 일 (`nworks task list/create/update/delete`)~~
|
|
321
350
|
- ~~**v0.6** — 캘린더 쓰기 (`nworks calendar create/update/delete`)~~
|
|
322
|
-
-
|
|
351
|
+
- ~~**v0.7** — 게시판 (`nworks board list/posts/read/create`)~~
|
|
323
352
|
|
|
324
353
|
## License
|
|
325
354
|
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ var __export = (target, all) => {
|
|
|
7
7
|
|
|
8
8
|
// src/index.ts
|
|
9
9
|
import { createRequire } from "module";
|
|
10
|
-
import { Command as
|
|
10
|
+
import { Command as Command12 } from "commander";
|
|
11
11
|
|
|
12
12
|
// src/commands/login.ts
|
|
13
13
|
import { Command } from "commander";
|
|
@@ -1756,9 +1756,223 @@ var deleteCommand2 = new Command9("delete").description("Delete a task (requires
|
|
|
1756
1756
|
});
|
|
1757
1757
|
var taskCommand = new Command9("task").description("Task operations (requires User OAuth with task scope)").addCommand(listCommand4).addCommand(createCommand2).addCommand(updateCommand2).addCommand(deleteCommand2);
|
|
1758
1758
|
|
|
1759
|
-
// src/commands/
|
|
1759
|
+
// src/commands/board.ts
|
|
1760
1760
|
import { Command as Command10 } from "commander";
|
|
1761
1761
|
|
|
1762
|
+
// src/api/board.ts
|
|
1763
|
+
var BASE_URL6 = "https://www.worksapis.com/v1.0";
|
|
1764
|
+
async function authedFetch5(url2, init, profile) {
|
|
1765
|
+
const token = await getValidUserToken(profile);
|
|
1766
|
+
const headers = new Headers(init.headers);
|
|
1767
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
1768
|
+
return fetch(url2, { ...init, headers });
|
|
1769
|
+
}
|
|
1770
|
+
async function handleError5(res) {
|
|
1771
|
+
if (res.status === 401) {
|
|
1772
|
+
throw new AuthError("User token expired. Run `nworks login --user --scope board` again.");
|
|
1773
|
+
}
|
|
1774
|
+
let code = "UNKNOWN";
|
|
1775
|
+
let description = `HTTP ${res.status}`;
|
|
1776
|
+
try {
|
|
1777
|
+
const body = await res.json();
|
|
1778
|
+
code = body.code ?? code;
|
|
1779
|
+
description = body.description ?? description;
|
|
1780
|
+
} catch {
|
|
1781
|
+
}
|
|
1782
|
+
throw new ApiError(code, description, res.status);
|
|
1783
|
+
}
|
|
1784
|
+
function safeParseJson(text) {
|
|
1785
|
+
const safe = text.replace(
|
|
1786
|
+
/"((?:board|post|domain|user)Id)"\s*:\s*(\d{16,})/g,
|
|
1787
|
+
'"$1":"$2"'
|
|
1788
|
+
);
|
|
1789
|
+
return JSON.parse(safe);
|
|
1790
|
+
}
|
|
1791
|
+
async function listBoards(count = 20, cursor, profile = "default") {
|
|
1792
|
+
const params = new URLSearchParams();
|
|
1793
|
+
params.set("count", String(count));
|
|
1794
|
+
if (cursor) params.set("cursor", cursor);
|
|
1795
|
+
const url2 = `${BASE_URL6}/boards?${params.toString()}`;
|
|
1796
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1797
|
+
console.error(`[nworks] GET ${url2}`);
|
|
1798
|
+
}
|
|
1799
|
+
const res = await authedFetch5(url2, { method: "GET" }, profile);
|
|
1800
|
+
if (!res.ok) return handleError5(res);
|
|
1801
|
+
const text = await res.text();
|
|
1802
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1803
|
+
console.error(`[nworks] Response: ${text}`);
|
|
1804
|
+
}
|
|
1805
|
+
const data = safeParseJson(text);
|
|
1806
|
+
return { boards: data.boards ?? [], responseMetaData: data.responseMetaData };
|
|
1807
|
+
}
|
|
1808
|
+
async function listPosts(boardId, count = 20, cursor, profile = "default") {
|
|
1809
|
+
const params = new URLSearchParams();
|
|
1810
|
+
params.set("count", String(count));
|
|
1811
|
+
if (cursor) params.set("cursor", cursor);
|
|
1812
|
+
const url2 = `${BASE_URL6}/boards/${boardId}/posts?${params.toString()}`;
|
|
1813
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1814
|
+
console.error(`[nworks] GET ${url2}`);
|
|
1815
|
+
}
|
|
1816
|
+
const res = await authedFetch5(url2, { method: "GET" }, profile);
|
|
1817
|
+
if (!res.ok) return handleError5(res);
|
|
1818
|
+
const text = await res.text();
|
|
1819
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1820
|
+
console.error(`[nworks] Response: ${text}`);
|
|
1821
|
+
}
|
|
1822
|
+
const data = safeParseJson(text);
|
|
1823
|
+
return { posts: data.posts ?? [], responseMetaData: data.responseMetaData };
|
|
1824
|
+
}
|
|
1825
|
+
async function readPost(boardId, postId, profile = "default") {
|
|
1826
|
+
const url2 = `${BASE_URL6}/boards/${boardId}/posts/${postId}`;
|
|
1827
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1828
|
+
console.error(`[nworks] GET ${url2}`);
|
|
1829
|
+
}
|
|
1830
|
+
const res = await authedFetch5(url2, { method: "GET" }, profile);
|
|
1831
|
+
if (!res.ok) return handleError5(res);
|
|
1832
|
+
const text = await res.text();
|
|
1833
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1834
|
+
console.error(`[nworks] Response: ${text}`);
|
|
1835
|
+
}
|
|
1836
|
+
return safeParseJson(text);
|
|
1837
|
+
}
|
|
1838
|
+
async function createPost(opts) {
|
|
1839
|
+
const profile = opts.profile ?? "default";
|
|
1840
|
+
const body = {
|
|
1841
|
+
title: opts.title,
|
|
1842
|
+
body: opts.body ?? ""
|
|
1843
|
+
};
|
|
1844
|
+
if (opts.enableComment !== void 0) body.enableComment = opts.enableComment;
|
|
1845
|
+
if (opts.sendNotifications !== void 0) body.sendNotifications = opts.sendNotifications;
|
|
1846
|
+
const url2 = `${BASE_URL6}/boards/${opts.boardId}/posts`;
|
|
1847
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1848
|
+
console.error(`[nworks] POST ${url2}`);
|
|
1849
|
+
console.error(`[nworks] Body: ${JSON.stringify(body, null, 2)}`);
|
|
1850
|
+
}
|
|
1851
|
+
const res = await authedFetch5(
|
|
1852
|
+
url2,
|
|
1853
|
+
{
|
|
1854
|
+
method: "POST",
|
|
1855
|
+
headers: { "Content-Type": "application/json" },
|
|
1856
|
+
body: JSON.stringify(body)
|
|
1857
|
+
},
|
|
1858
|
+
profile
|
|
1859
|
+
);
|
|
1860
|
+
if (res.status === 201 || res.ok) {
|
|
1861
|
+
const text = await res.text();
|
|
1862
|
+
if (process.env["NWORKS_VERBOSE"] === "1") {
|
|
1863
|
+
console.error(`[nworks] Response: ${text}`);
|
|
1864
|
+
}
|
|
1865
|
+
return safeParseJson(text);
|
|
1866
|
+
}
|
|
1867
|
+
return handleError5(res);
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
// src/commands/board.ts
|
|
1871
|
+
var listCommand5 = new Command10("list").description("List boards (requires User OAuth with board or board.read scope)").option("--count <n>", "Items per page (default: 20)", "20").option("--cursor <cursor>", "Pagination cursor").option("--profile <name>", "Profile name", "default").option("--json", "JSON output").action(async (opts) => {
|
|
1872
|
+
try {
|
|
1873
|
+
const result = await listBoards(
|
|
1874
|
+
parseInt(opts.count, 10),
|
|
1875
|
+
opts.cursor,
|
|
1876
|
+
opts.profile
|
|
1877
|
+
);
|
|
1878
|
+
const boards = result.boards.map((b) => ({
|
|
1879
|
+
boardId: b.boardId,
|
|
1880
|
+
boardName: b.boardName,
|
|
1881
|
+
description: b.description ?? ""
|
|
1882
|
+
}));
|
|
1883
|
+
output(
|
|
1884
|
+
{ boards, count: boards.length, nextCursor: result.responseMetaData?.nextCursor ?? null },
|
|
1885
|
+
opts
|
|
1886
|
+
);
|
|
1887
|
+
} catch (err) {
|
|
1888
|
+
const error48 = err;
|
|
1889
|
+
errorOutput({ code: error48.code, message: error48.message }, opts);
|
|
1890
|
+
process.exitCode = 1;
|
|
1891
|
+
}
|
|
1892
|
+
});
|
|
1893
|
+
var postsCommand = new Command10("posts").description("List posts in a board (requires User OAuth with board or board.read scope)").requiredOption("--board <boardId>", "Board ID").option("--count <n>", "Items per page (default: 20)", "20").option("--cursor <cursor>", "Pagination cursor").option("--profile <name>", "Profile name", "default").option("--json", "JSON output").action(async (opts) => {
|
|
1894
|
+
try {
|
|
1895
|
+
const result = await listPosts(
|
|
1896
|
+
opts.board,
|
|
1897
|
+
parseInt(opts.count, 10),
|
|
1898
|
+
opts.cursor,
|
|
1899
|
+
opts.profile
|
|
1900
|
+
);
|
|
1901
|
+
const posts = result.posts.map((p) => ({
|
|
1902
|
+
postId: p.postId,
|
|
1903
|
+
title: p.title,
|
|
1904
|
+
userName: p.userName ?? "",
|
|
1905
|
+
readCount: p.readCount ?? 0,
|
|
1906
|
+
commentCount: p.commentCount ?? 0,
|
|
1907
|
+
createdTime: p.createdTime ?? ""
|
|
1908
|
+
}));
|
|
1909
|
+
output(
|
|
1910
|
+
{ posts, count: posts.length, nextCursor: result.responseMetaData?.nextCursor ?? null },
|
|
1911
|
+
opts
|
|
1912
|
+
);
|
|
1913
|
+
} catch (err) {
|
|
1914
|
+
const error48 = err;
|
|
1915
|
+
errorOutput({ code: error48.code, message: error48.message }, opts);
|
|
1916
|
+
process.exitCode = 1;
|
|
1917
|
+
}
|
|
1918
|
+
});
|
|
1919
|
+
var readCommand2 = new Command10("read").description("Read a post detail (requires User OAuth with board or board.read scope)").requiredOption("--board <boardId>", "Board ID").requiredOption("--post <postId>", "Post ID").option("--profile <name>", "Profile name", "default").option("--json", "JSON output").action(async (opts) => {
|
|
1920
|
+
try {
|
|
1921
|
+
const post = await readPost(
|
|
1922
|
+
opts.board,
|
|
1923
|
+
opts.post,
|
|
1924
|
+
opts.profile
|
|
1925
|
+
);
|
|
1926
|
+
output(
|
|
1927
|
+
{
|
|
1928
|
+
postId: post.postId,
|
|
1929
|
+
boardId: post.boardId,
|
|
1930
|
+
title: post.title,
|
|
1931
|
+
body: post.body ?? "",
|
|
1932
|
+
userName: post.userName ?? "",
|
|
1933
|
+
readCount: post.readCount ?? 0,
|
|
1934
|
+
commentCount: post.commentCount ?? 0,
|
|
1935
|
+
createdTime: post.createdTime ?? "",
|
|
1936
|
+
updatedTime: post.updatedTime ?? ""
|
|
1937
|
+
},
|
|
1938
|
+
opts
|
|
1939
|
+
);
|
|
1940
|
+
} catch (err) {
|
|
1941
|
+
const error48 = err;
|
|
1942
|
+
errorOutput({ code: error48.code, message: error48.message }, opts);
|
|
1943
|
+
process.exitCode = 1;
|
|
1944
|
+
}
|
|
1945
|
+
});
|
|
1946
|
+
var createCommand3 = new Command10("create").description("Create a post in a board (requires User OAuth with board scope)").requiredOption("--board <boardId>", "Board ID").requiredOption("--title <title>", "Post title").option("--body <text>", "Post body").option("--no-comment", "Disable comments").option("--notify", "Send notification").option("--profile <name>", "Profile name", "default").option("--json", "JSON output").action(async (opts) => {
|
|
1947
|
+
try {
|
|
1948
|
+
const post = await createPost({
|
|
1949
|
+
boardId: opts.board,
|
|
1950
|
+
title: opts.title,
|
|
1951
|
+
body: opts.body,
|
|
1952
|
+
enableComment: opts.comment,
|
|
1953
|
+
sendNotifications: opts.notify ?? false,
|
|
1954
|
+
profile: opts.profile
|
|
1955
|
+
});
|
|
1956
|
+
output(
|
|
1957
|
+
{
|
|
1958
|
+
success: true,
|
|
1959
|
+
postId: post.postId,
|
|
1960
|
+
boardId: post.boardId,
|
|
1961
|
+
title: post.title
|
|
1962
|
+
},
|
|
1963
|
+
opts
|
|
1964
|
+
);
|
|
1965
|
+
} catch (err) {
|
|
1966
|
+
const error48 = err;
|
|
1967
|
+
errorOutput({ code: error48.code, message: error48.message }, opts);
|
|
1968
|
+
process.exitCode = 1;
|
|
1969
|
+
}
|
|
1970
|
+
});
|
|
1971
|
+
var boardCommand = new Command10("board").description("Board operations (requires User OAuth)").addCommand(listCommand5).addCommand(postsCommand).addCommand(readCommand2).addCommand(createCommand3);
|
|
1972
|
+
|
|
1973
|
+
// src/commands/mcp-cmd.ts
|
|
1974
|
+
import { Command as Command11 } from "commander";
|
|
1975
|
+
|
|
1762
1976
|
// src/mcp/server.ts
|
|
1763
1977
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
1764
1978
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -16136,6 +16350,127 @@ function registerTools(server) {
|
|
|
16136
16350
|
}
|
|
16137
16351
|
}
|
|
16138
16352
|
);
|
|
16353
|
+
server.tool(
|
|
16354
|
+
"nworks_board_list",
|
|
16355
|
+
"\uAC8C\uC2DC\uD310 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4 (User OAuth board \uB610\uB294 board.read scope \uD544\uC694)",
|
|
16356
|
+
{
|
|
16357
|
+
count: external_exports.number().optional().describe("\uD398\uC774\uC9C0\uB2F9 \uD56D\uBAA9 \uC218 (\uAE30\uBCF8: 20)"),
|
|
16358
|
+
cursor: external_exports.string().optional().describe("\uD398\uC774\uC9C0\uB124\uC774\uC158 \uCEE4\uC11C")
|
|
16359
|
+
},
|
|
16360
|
+
async ({ count, cursor }) => {
|
|
16361
|
+
try {
|
|
16362
|
+
const result = await listBoards(count ?? 20, cursor);
|
|
16363
|
+
const boards = result.boards.map((b) => ({
|
|
16364
|
+
boardId: b.boardId,
|
|
16365
|
+
boardName: b.boardName,
|
|
16366
|
+
description: b.description ?? ""
|
|
16367
|
+
}));
|
|
16368
|
+
return {
|
|
16369
|
+
content: [{ type: "text", text: JSON.stringify({ boards, count: boards.length, nextCursor: result.responseMetaData?.nextCursor ?? null }) }]
|
|
16370
|
+
};
|
|
16371
|
+
} catch (err) {
|
|
16372
|
+
const error48 = err;
|
|
16373
|
+
return {
|
|
16374
|
+
content: [{ type: "text", text: `Error: ${error48.message}` }],
|
|
16375
|
+
isError: true
|
|
16376
|
+
};
|
|
16377
|
+
}
|
|
16378
|
+
}
|
|
16379
|
+
);
|
|
16380
|
+
server.tool(
|
|
16381
|
+
"nworks_board_posts",
|
|
16382
|
+
"\uAC8C\uC2DC\uD310\uC758 \uAE00 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4 (User OAuth board \uB610\uB294 board.read scope \uD544\uC694)",
|
|
16383
|
+
{
|
|
16384
|
+
boardId: external_exports.string().describe("\uAC8C\uC2DC\uD310 ID"),
|
|
16385
|
+
count: external_exports.number().optional().describe("\uD398\uC774\uC9C0\uB2F9 \uD56D\uBAA9 \uC218 (\uAE30\uBCF8: 20, \uCD5C\uB300: 40)"),
|
|
16386
|
+
cursor: external_exports.string().optional().describe("\uD398\uC774\uC9C0\uB124\uC774\uC158 \uCEE4\uC11C")
|
|
16387
|
+
},
|
|
16388
|
+
async ({ boardId, count, cursor }) => {
|
|
16389
|
+
try {
|
|
16390
|
+
const result = await listPosts(boardId, count ?? 20, cursor);
|
|
16391
|
+
const posts = result.posts.map((p) => ({
|
|
16392
|
+
postId: p.postId,
|
|
16393
|
+
title: p.title,
|
|
16394
|
+
userName: p.userName ?? "",
|
|
16395
|
+
readCount: p.readCount ?? 0,
|
|
16396
|
+
commentCount: p.commentCount ?? 0,
|
|
16397
|
+
createdTime: p.createdTime ?? ""
|
|
16398
|
+
}));
|
|
16399
|
+
return {
|
|
16400
|
+
content: [{ type: "text", text: JSON.stringify({ posts, count: posts.length, nextCursor: result.responseMetaData?.nextCursor ?? null }) }]
|
|
16401
|
+
};
|
|
16402
|
+
} catch (err) {
|
|
16403
|
+
const error48 = err;
|
|
16404
|
+
return {
|
|
16405
|
+
content: [{ type: "text", text: `Error: ${error48.message}` }],
|
|
16406
|
+
isError: true
|
|
16407
|
+
};
|
|
16408
|
+
}
|
|
16409
|
+
}
|
|
16410
|
+
);
|
|
16411
|
+
server.tool(
|
|
16412
|
+
"nworks_board_read",
|
|
16413
|
+
"\uAC8C\uC2DC\uD310 \uAE00\uC758 \uC0C1\uC138 \uB0B4\uC6A9\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4 (User OAuth board \uB610\uB294 board.read scope \uD544\uC694)",
|
|
16414
|
+
{
|
|
16415
|
+
boardId: external_exports.string().describe("\uAC8C\uC2DC\uD310 ID"),
|
|
16416
|
+
postId: external_exports.string().describe("\uAE00 ID")
|
|
16417
|
+
},
|
|
16418
|
+
async ({ boardId, postId }) => {
|
|
16419
|
+
try {
|
|
16420
|
+
const post = await readPost(boardId, postId);
|
|
16421
|
+
return {
|
|
16422
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
16423
|
+
postId: post.postId,
|
|
16424
|
+
boardId: post.boardId,
|
|
16425
|
+
title: post.title,
|
|
16426
|
+
body: post.body ?? "",
|
|
16427
|
+
userName: post.userName ?? "",
|
|
16428
|
+
readCount: post.readCount ?? 0,
|
|
16429
|
+
commentCount: post.commentCount ?? 0,
|
|
16430
|
+
createdTime: post.createdTime ?? "",
|
|
16431
|
+
updatedTime: post.updatedTime ?? ""
|
|
16432
|
+
}) }]
|
|
16433
|
+
};
|
|
16434
|
+
} catch (err) {
|
|
16435
|
+
const error48 = err;
|
|
16436
|
+
return {
|
|
16437
|
+
content: [{ type: "text", text: `Error: ${error48.message}` }],
|
|
16438
|
+
isError: true
|
|
16439
|
+
};
|
|
16440
|
+
}
|
|
16441
|
+
}
|
|
16442
|
+
);
|
|
16443
|
+
server.tool(
|
|
16444
|
+
"nworks_board_create",
|
|
16445
|
+
"\uAC8C\uC2DC\uD310\uC5D0 \uAE00\uC744 \uC791\uC131\uD569\uB2C8\uB2E4 (User OAuth board scope \uD544\uC694)",
|
|
16446
|
+
{
|
|
16447
|
+
boardId: external_exports.string().describe("\uAC8C\uC2DC\uD310 ID"),
|
|
16448
|
+
title: external_exports.string().describe("\uAE00 \uC81C\uBAA9"),
|
|
16449
|
+
body: external_exports.string().optional().describe("\uAE00 \uBCF8\uBB38"),
|
|
16450
|
+
enableComment: external_exports.boolean().optional().describe("\uB313\uAE00 \uD5C8\uC6A9 (\uAE30\uBCF8: true)"),
|
|
16451
|
+
sendNotifications: external_exports.boolean().optional().describe("\uC54C\uB9BC \uBC1C\uC1A1 (\uAE30\uBCF8: false)")
|
|
16452
|
+
},
|
|
16453
|
+
async ({ boardId, title, body, enableComment, sendNotifications }) => {
|
|
16454
|
+
try {
|
|
16455
|
+
const post = await createPost({
|
|
16456
|
+
boardId,
|
|
16457
|
+
title,
|
|
16458
|
+
body,
|
|
16459
|
+
enableComment,
|
|
16460
|
+
sendNotifications
|
|
16461
|
+
});
|
|
16462
|
+
return {
|
|
16463
|
+
content: [{ type: "text", text: JSON.stringify({ success: true, postId: post.postId, boardId: post.boardId, title: post.title }) }]
|
|
16464
|
+
};
|
|
16465
|
+
} catch (err) {
|
|
16466
|
+
const error48 = err;
|
|
16467
|
+
return {
|
|
16468
|
+
content: [{ type: "text", text: `Error: ${error48.message}` }],
|
|
16469
|
+
isError: true
|
|
16470
|
+
};
|
|
16471
|
+
}
|
|
16472
|
+
}
|
|
16473
|
+
);
|
|
16139
16474
|
server.tool(
|
|
16140
16475
|
"nworks_whoami",
|
|
16141
16476
|
"\uD604\uC7AC \uC778\uC99D\uB41C NAVER WORKS \uACC4\uC815 \uC815\uBCF4\uB97C \uD655\uC778\uD569\uB2C8\uB2E4",
|
|
@@ -16177,7 +16512,7 @@ async function startMcpServer() {
|
|
|
16177
16512
|
}
|
|
16178
16513
|
|
|
16179
16514
|
// src/commands/mcp-cmd.ts
|
|
16180
|
-
var mcpCommand = new
|
|
16515
|
+
var mcpCommand = new Command11("mcp").description("Start MCP server (stdio transport)").option("--list-tools", "List available MCP tools").action(async (opts) => {
|
|
16181
16516
|
if (opts.listTools) {
|
|
16182
16517
|
console.log("nworks_message_send \u2014 Send message to user or channel");
|
|
16183
16518
|
console.log("nworks_message_members \u2014 List channel members");
|
|
@@ -16192,7 +16527,7 @@ var mcpCommand = new Command10("mcp").description("Start MCP server (stdio trans
|
|
|
16192
16527
|
// src/index.ts
|
|
16193
16528
|
var require2 = createRequire(import.meta.url);
|
|
16194
16529
|
var { version: version2 } = require2("../package.json");
|
|
16195
|
-
var program = new
|
|
16530
|
+
var program = new Command12().name("nworks").description("NAVER WORKS CLI \u2014 built for humans and AI agents").version(version2).option("--json", "Always output JSON").option("-v, --verbose", "Debug logging").option("--dry-run", "Print request without calling API").option("-p, --profile <name>", "Profile name", "default");
|
|
16196
16531
|
program.addCommand(loginCommand);
|
|
16197
16532
|
program.addCommand(logoutCommand);
|
|
16198
16533
|
program.addCommand(whoamiCommand);
|
|
@@ -16202,6 +16537,7 @@ program.addCommand(calendarCommand);
|
|
|
16202
16537
|
program.addCommand(driveCommand);
|
|
16203
16538
|
program.addCommand(mailCommand);
|
|
16204
16539
|
program.addCommand(taskCommand);
|
|
16540
|
+
program.addCommand(boardCommand);
|
|
16205
16541
|
program.addCommand(mcpCommand);
|
|
16206
16542
|
program.parse();
|
|
16207
16543
|
//# sourceMappingURL=index.js.map
|