yuque-ai-mcp 2.7.4

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.
Files changed (316) hide show
  1. package/dist/board/create-board.d.ts +7 -0
  2. package/dist/board/create-board.js +50 -0
  3. package/dist/board/create-board.js.map +1 -0
  4. package/dist/board/get-board.d.ts +7 -0
  5. package/dist/board/get-board.js +44 -0
  6. package/dist/board/get-board.js.map +1 -0
  7. package/dist/board/index.d.ts +5 -0
  8. package/dist/board/index.js +8 -0
  9. package/dist/board/index.js.map +1 -0
  10. package/dist/board/update-board.d.ts +7 -0
  11. package/dist/board/update-board.js +65 -0
  12. package/dist/board/update-board.js.map +1 -0
  13. package/dist/cli-http.d.ts +2 -0
  14. package/dist/cli-http.js +16 -0
  15. package/dist/cli-http.js.map +1 -0
  16. package/dist/cli.d.ts +2 -0
  17. package/dist/cli.js +15 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/common/api-client.d.ts +27 -0
  20. package/dist/common/api-client.js +198 -0
  21. package/dist/common/api-client.js.map +1 -0
  22. package/dist/common/config.d.ts +46 -0
  23. package/dist/common/config.js +86 -0
  24. package/dist/common/config.js.map +1 -0
  25. package/dist/common/copy-common.d.ts +8 -0
  26. package/dist/common/copy-common.js +13 -0
  27. package/dist/common/copy-common.js.map +1 -0
  28. package/dist/common/errors.d.ts +44 -0
  29. package/dist/common/errors.js +164 -0
  30. package/dist/common/errors.js.map +1 -0
  31. package/dist/common/export-common.d.ts +32 -0
  32. package/dist/common/export-common.js +125 -0
  33. package/dist/common/export-common.js.map +1 -0
  34. package/dist/common/format.d.ts +247 -0
  35. package/dist/common/format.js +199 -0
  36. package/dist/common/format.js.map +1 -0
  37. package/dist/common/register-tools.d.ts +29 -0
  38. package/dist/common/register-tools.js +89 -0
  39. package/dist/common/register-tools.js.map +1 -0
  40. package/dist/common/repo-capacity.d.ts +26 -0
  41. package/dist/common/repo-capacity.js +105 -0
  42. package/dist/common/repo-capacity.js.map +1 -0
  43. package/dist/common/schedule-common.d.ts +38 -0
  44. package/dist/common/schedule-common.js +111 -0
  45. package/dist/common/schedule-common.js.map +1 -0
  46. package/dist/common/text-utils.d.ts +11 -0
  47. package/dist/common/text-utils.js +29 -0
  48. package/dist/common/text-utils.js.map +1 -0
  49. package/dist/common/toc-cache.d.ts +30 -0
  50. package/dist/common/toc-cache.js +109 -0
  51. package/dist/common/toc-cache.js.map +1 -0
  52. package/dist/common/types.d.ts +17 -0
  53. package/dist/common/types.js +3 -0
  54. package/dist/common/types.js.map +1 -0
  55. package/dist/common/validate.d.ts +27 -0
  56. package/dist/common/validate.js +70 -0
  57. package/dist/common/validate.js.map +1 -0
  58. package/dist/common/web-request.d.ts +13 -0
  59. package/dist/common/web-request.js +53 -0
  60. package/dist/common/web-request.js.map +1 -0
  61. package/dist/crawler/extract.d.ts +19 -0
  62. package/dist/crawler/extract.js +220 -0
  63. package/dist/crawler/extract.js.map +1 -0
  64. package/dist/crawler/fetch.d.ts +8 -0
  65. package/dist/crawler/fetch.js +89 -0
  66. package/dist/crawler/fetch.js.map +1 -0
  67. package/dist/crawler/index.d.ts +6 -0
  68. package/dist/crawler/index.js +10 -0
  69. package/dist/crawler/index.js.map +1 -0
  70. package/dist/crawler/save.d.ts +11 -0
  71. package/dist/crawler/save.js +160 -0
  72. package/dist/crawler/save.js.map +1 -0
  73. package/dist/crawler/schedule.d.ts +12 -0
  74. package/dist/crawler/schedule.js +132 -0
  75. package/dist/crawler/schedule.js.map +1 -0
  76. package/dist/doc/batch-get-docs.d.ts +8 -0
  77. package/dist/doc/batch-get-docs.js +100 -0
  78. package/dist/doc/batch-get-docs.js.map +1 -0
  79. package/dist/doc/copy-doc.d.ts +10 -0
  80. package/dist/doc/copy-doc.js +238 -0
  81. package/dist/doc/copy-doc.js.map +1 -0
  82. package/dist/doc/create-doc.d.ts +11 -0
  83. package/dist/doc/create-doc.js +82 -0
  84. package/dist/doc/create-doc.js.map +1 -0
  85. package/dist/doc/delete-doc.d.ts +8 -0
  86. package/dist/doc/delete-doc.js +39 -0
  87. package/dist/doc/delete-doc.js.map +1 -0
  88. package/dist/doc/diff-doc.d.ts +8 -0
  89. package/dist/doc/diff-doc.js +190 -0
  90. package/dist/doc/diff-doc.js.map +1 -0
  91. package/dist/doc/embed-url.d.ts +10 -0
  92. package/dist/doc/embed-url.js +137 -0
  93. package/dist/doc/embed-url.js.map +1 -0
  94. package/dist/doc/export-doc.d.ts +10 -0
  95. package/dist/doc/export-doc.js +135 -0
  96. package/dist/doc/export-doc.js.map +1 -0
  97. package/dist/doc/get-doc.d.ts +8 -0
  98. package/dist/doc/get-doc.js +40 -0
  99. package/dist/doc/get-doc.js.map +1 -0
  100. package/dist/doc/import-file-utils.d.ts +37 -0
  101. package/dist/doc/import-file-utils.js +256 -0
  102. package/dist/doc/import-file-utils.js.map +1 -0
  103. package/dist/doc/import-file.d.ts +13 -0
  104. package/dist/doc/import-file.js +333 -0
  105. package/dist/doc/import-file.js.map +1 -0
  106. package/dist/doc/import-url.d.ts +7 -0
  107. package/dist/doc/import-url.js +245 -0
  108. package/dist/doc/import-url.js.map +1 -0
  109. package/dist/doc/index.d.ts +16 -0
  110. package/dist/doc/index.js +30 -0
  111. package/dist/doc/index.js.map +1 -0
  112. package/dist/doc/list-docs.d.ts +8 -0
  113. package/dist/doc/list-docs.js +44 -0
  114. package/dist/doc/list-docs.js.map +1 -0
  115. package/dist/doc/update-doc.d.ts +8 -0
  116. package/dist/doc/update-doc.js +50 -0
  117. package/dist/doc/update-doc.js.map +1 -0
  118. package/dist/doc/version-detail.d.ts +8 -0
  119. package/dist/doc/version-detail.js +34 -0
  120. package/dist/doc/version-detail.js.map +1 -0
  121. package/dist/doc/versions.d.ts +8 -0
  122. package/dist/doc/versions.js +34 -0
  123. package/dist/doc/versions.js.map +1 -0
  124. package/dist/group/delete-user.d.ts +8 -0
  125. package/dist/group/delete-user.js +39 -0
  126. package/dist/group/delete-user.js.map +1 -0
  127. package/dist/group/index.d.ts +5 -0
  128. package/dist/group/index.js +8 -0
  129. package/dist/group/index.js.map +1 -0
  130. package/dist/group/list-users.d.ts +8 -0
  131. package/dist/group/list-users.js +40 -0
  132. package/dist/group/list-users.js.map +1 -0
  133. package/dist/group/update-user.d.ts +8 -0
  134. package/dist/group/update-user.js +37 -0
  135. package/dist/group/update-user.js.map +1 -0
  136. package/dist/http.d.ts +1 -0
  137. package/dist/http.js +114 -0
  138. package/dist/http.js.map +1 -0
  139. package/dist/index.d.ts +1 -0
  140. package/dist/index.js +27 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/kv/common.d.ts +34 -0
  143. package/dist/kv/common.js +191 -0
  144. package/dist/kv/common.js.map +1 -0
  145. package/dist/kv/delete.d.ts +7 -0
  146. package/dist/kv/delete.js +52 -0
  147. package/dist/kv/delete.js.map +1 -0
  148. package/dist/kv/get.d.ts +7 -0
  149. package/dist/kv/get.js +52 -0
  150. package/dist/kv/get.js.map +1 -0
  151. package/dist/kv/index.d.ts +6 -0
  152. package/dist/kv/index.js +10 -0
  153. package/dist/kv/index.js.map +1 -0
  154. package/dist/kv/list.d.ts +5 -0
  155. package/dist/kv/list.js +42 -0
  156. package/dist/kv/list.js.map +1 -0
  157. package/dist/kv/set.d.ts +7 -0
  158. package/dist/kv/set.js +54 -0
  159. package/dist/kv/set.js.map +1 -0
  160. package/dist/mine/common.d.ts +4 -0
  161. package/dist/mine/common.js +5 -0
  162. package/dist/mine/common.js.map +1 -0
  163. package/dist/mine/editor-center.d.ts +9 -0
  164. package/dist/mine/editor-center.js +57 -0
  165. package/dist/mine/editor-center.js.map +1 -0
  166. package/dist/mine/get-book-stacks.d.ts +8 -0
  167. package/dist/mine/get-book-stacks.js +41 -0
  168. package/dist/mine/get-book-stacks.js.map +1 -0
  169. package/dist/mine/index.d.ts +4 -0
  170. package/dist/mine/index.js +6 -0
  171. package/dist/mine/index.js.map +1 -0
  172. package/dist/note/create-note.d.ts +8 -0
  173. package/dist/note/create-note.js +32 -0
  174. package/dist/note/create-note.js.map +1 -0
  175. package/dist/note/get-note.d.ts +8 -0
  176. package/dist/note/get-note.js +27 -0
  177. package/dist/note/get-note.js.map +1 -0
  178. package/dist/note/index.d.ts +6 -0
  179. package/dist/note/index.js +10 -0
  180. package/dist/note/index.js.map +1 -0
  181. package/dist/note/list-notes.d.ts +8 -0
  182. package/dist/note/list-notes.js +40 -0
  183. package/dist/note/list-notes.js.map +1 -0
  184. package/dist/note/update-note.d.ts +8 -0
  185. package/dist/note/update-note.js +53 -0
  186. package/dist/note/update-note.js.map +1 -0
  187. package/dist/recycle/common.d.ts +4 -0
  188. package/dist/recycle/common.js +5 -0
  189. package/dist/recycle/common.js.map +1 -0
  190. package/dist/recycle/destroy-recycle.d.ts +8 -0
  191. package/dist/recycle/destroy-recycle.js +38 -0
  192. package/dist/recycle/destroy-recycle.js.map +1 -0
  193. package/dist/recycle/index.d.ts +5 -0
  194. package/dist/recycle/index.js +8 -0
  195. package/dist/recycle/index.js.map +1 -0
  196. package/dist/recycle/list-recycles.d.ts +8 -0
  197. package/dist/recycle/list-recycles.js +57 -0
  198. package/dist/recycle/list-recycles.js.map +1 -0
  199. package/dist/recycle/restore-recycle.d.ts +7 -0
  200. package/dist/recycle/restore-recycle.js +32 -0
  201. package/dist/recycle/restore-recycle.js.map +1 -0
  202. package/dist/repo/batch-get-repos.d.ts +8 -0
  203. package/dist/repo/batch-get-repos.js +83 -0
  204. package/dist/repo/batch-get-repos.js.map +1 -0
  205. package/dist/repo/copy-repo.d.ts +7 -0
  206. package/dist/repo/copy-repo.js +137 -0
  207. package/dist/repo/copy-repo.js.map +1 -0
  208. package/dist/repo/create-repo.d.ts +8 -0
  209. package/dist/repo/create-repo.js +49 -0
  210. package/dist/repo/create-repo.js.map +1 -0
  211. package/dist/repo/delete-repo.d.ts +8 -0
  212. package/dist/repo/delete-repo.js +37 -0
  213. package/dist/repo/delete-repo.js.map +1 -0
  214. package/dist/repo/export-graph.d.ts +21 -0
  215. package/dist/repo/export-graph.js +73 -0
  216. package/dist/repo/export-graph.js.map +1 -0
  217. package/dist/repo/export-index.d.ts +26 -0
  218. package/dist/repo/export-index.js +72 -0
  219. package/dist/repo/export-index.js.map +1 -0
  220. package/dist/repo/export-repo.d.ts +14 -0
  221. package/dist/repo/export-repo.js +243 -0
  222. package/dist/repo/export-repo.js.map +1 -0
  223. package/dist/repo/export-toc.d.ts +17 -0
  224. package/dist/repo/export-toc.js +33 -0
  225. package/dist/repo/export-toc.js.map +1 -0
  226. package/dist/repo/get-repo.d.ts +8 -0
  227. package/dist/repo/get-repo.js +32 -0
  228. package/dist/repo/get-repo.js.map +1 -0
  229. package/dist/repo/index.d.ts +10 -0
  230. package/dist/repo/index.js +18 -0
  231. package/dist/repo/index.js.map +1 -0
  232. package/dist/repo/list-repos.d.ts +8 -0
  233. package/dist/repo/list-repos.js +48 -0
  234. package/dist/repo/list-repos.js.map +1 -0
  235. package/dist/repo/update-repo.d.ts +8 -0
  236. package/dist/repo/update-repo.js +48 -0
  237. package/dist/repo/update-repo.js.map +1 -0
  238. package/dist/rss/dedup.d.ts +9 -0
  239. package/dist/rss/dedup.js +21 -0
  240. package/dist/rss/dedup.js.map +1 -0
  241. package/dist/rss/fetch-feed.d.ts +8 -0
  242. package/dist/rss/fetch-feed.js +290 -0
  243. package/dist/rss/fetch-feed.js.map +1 -0
  244. package/dist/rss/index.d.ts +5 -0
  245. package/dist/rss/index.js +8 -0
  246. package/dist/rss/index.js.map +1 -0
  247. package/dist/rss/list-sources.d.ts +8 -0
  248. package/dist/rss/list-sources.js +39 -0
  249. package/dist/rss/list-sources.js.map +1 -0
  250. package/dist/rss/parser.d.ts +27 -0
  251. package/dist/rss/parser.js +87 -0
  252. package/dist/rss/parser.js.map +1 -0
  253. package/dist/rss/schedule.d.ts +14 -0
  254. package/dist/rss/schedule.js +171 -0
  255. package/dist/rss/schedule.js.map +1 -0
  256. package/dist/rss/sources.d.ts +26 -0
  257. package/dist/rss/sources.js +54 -0
  258. package/dist/rss/sources.js.map +1 -0
  259. package/dist/search/index.d.ts +4 -0
  260. package/dist/search/index.js +6 -0
  261. package/dist/search/index.js.map +1 -0
  262. package/dist/search/rag-search-utils.d.ts +28 -0
  263. package/dist/search/rag-search-utils.js +74 -0
  264. package/dist/search/rag-search-utils.js.map +1 -0
  265. package/dist/search/rag-search.d.ts +16 -0
  266. package/dist/search/rag-search.js +103 -0
  267. package/dist/search/rag-search.js.map +1 -0
  268. package/dist/search/search.d.ts +8 -0
  269. package/dist/search/search.js +43 -0
  270. package/dist/search/search.js.map +1 -0
  271. package/dist/statistic/book-statistics.d.ts +7 -0
  272. package/dist/statistic/book-statistics.js +49 -0
  273. package/dist/statistic/book-statistics.js.map +1 -0
  274. package/dist/statistic/doc-statistics.d.ts +7 -0
  275. package/dist/statistic/doc-statistics.js +53 -0
  276. package/dist/statistic/doc-statistics.js.map +1 -0
  277. package/dist/statistic/group-statistics.d.ts +8 -0
  278. package/dist/statistic/group-statistics.js +30 -0
  279. package/dist/statistic/group-statistics.js.map +1 -0
  280. package/dist/statistic/index.d.ts +6 -0
  281. package/dist/statistic/index.js +10 -0
  282. package/dist/statistic/index.js.map +1 -0
  283. package/dist/statistic/member-statistics.d.ts +7 -0
  284. package/dist/statistic/member-statistics.js +49 -0
  285. package/dist/statistic/member-statistics.js.map +1 -0
  286. package/dist/toc/batch-update.d.ts +11 -0
  287. package/dist/toc/batch-update.js +274 -0
  288. package/dist/toc/batch-update.js.map +1 -0
  289. package/dist/toc/get-toc.d.ts +8 -0
  290. package/dist/toc/get-toc.js +33 -0
  291. package/dist/toc/get-toc.js.map +1 -0
  292. package/dist/toc/index.d.ts +5 -0
  293. package/dist/toc/index.js +8 -0
  294. package/dist/toc/index.js.map +1 -0
  295. package/dist/toc/update-toc.d.ts +8 -0
  296. package/dist/toc/update-toc.js +74 -0
  297. package/dist/toc/update-toc.js.map +1 -0
  298. package/dist/upload/index.d.ts +3 -0
  299. package/dist/upload/index.js +4 -0
  300. package/dist/upload/index.js.map +1 -0
  301. package/dist/upload/upload-attachment.d.ts +11 -0
  302. package/dist/upload/upload-attachment.js +162 -0
  303. package/dist/upload/upload-attachment.js.map +1 -0
  304. package/dist/user/get-groups.d.ts +8 -0
  305. package/dist/user/get-groups.js +41 -0
  306. package/dist/user/get-groups.js.map +1 -0
  307. package/dist/user/get-user.d.ts +8 -0
  308. package/dist/user/get-user.js +24 -0
  309. package/dist/user/get-user.js.map +1 -0
  310. package/dist/user/hello.d.ts +8 -0
  311. package/dist/user/hello.js +17 -0
  312. package/dist/user/hello.js.map +1 -0
  313. package/dist/user/index.d.ts +5 -0
  314. package/dist/user/index.js +8 -0
  315. package/dist/user/index.js.map +1 -0
  316. package/package.json +49 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * board/create — 在文档中创建画板资源
3
+ *
4
+ * 端点:POST /api/v2/yfm/boards
5
+ */
6
+ import type { McpTool } from "../common/types.js";
7
+ export declare const boardCreate: McpTool;
@@ -0,0 +1,50 @@
1
+ /**
2
+ * board/create — 在文档中创建画板资源
3
+ *
4
+ * 端点:POST /api/v2/yfm/boards
5
+ */
6
+ import { apiPost } from "../common/api-client.js";
7
+ import { handleApiCall } from "../common/format.js";
8
+ import { requiredString } from "../common/validate.js";
9
+ export const boardCreate = {
10
+ name: "yuque_create_board",
11
+ description: "Create a board resource (mindmap/flowchart/architecture diagram) in a document. POST /yfm/boards. 详见 references/api/board_api.md",
12
+ inputSchema: {
13
+ type: "object",
14
+ properties: {
15
+ doc_id: { type: "number", description: "Document ID (mutually exclusive with url)" },
16
+ url: { type: "string", description: "Document URL (mutually exclusive with doc_id)" },
17
+ type: { type: "string", description: "Board type (required): mindmap, flowchart, architecturediagram" },
18
+ dsl: { type: "string", description: "Board DSL text content (required), format depends on type" },
19
+ insert_after_lake_id: { type: "string", description: "Insert after specified Lake node, appends to document end if omitted" },
20
+ },
21
+ required: ["type", "dsl"],
22
+ },
23
+ async handler(args) {
24
+ // @validate
25
+ const __v = requiredString(args?.dsl, "dsl");
26
+ if (__v)
27
+ return __v;
28
+ const docId = args?.doc_id;
29
+ const url = args?.url;
30
+ const type = args?.type;
31
+ const dsl = args?.dsl;
32
+ const insertAfter = args?.insert_after_lake_id;
33
+ if (!docId && !url) {
34
+ return {
35
+ content: [{ type: "text", text: JSON.stringify({ error: "请提供 doc_id 或 url / Provide doc_id or url" }, null, 2) }],
36
+ isError: true,
37
+ };
38
+ }
39
+ const payload = { resource_type: "board", type, dsl };
40
+ if (docId)
41
+ payload.doc_id = docId;
42
+ if (url)
43
+ payload.url = url;
44
+ if (insertAfter)
45
+ payload.insert_after_lake_id = insertAfter;
46
+ const data = await apiPost("/yfm/boards", payload, "Create board");
47
+ return handleApiCall(data, undefined);
48
+ },
49
+ };
50
+ //# sourceMappingURL=create-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-board.js","sourceRoot":"","sources":["../../src/board/create-board.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,kIAAkI;IAE/I,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACpF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACrF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gEAAgE,EAAE;YACvG,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE;YACjG,oBAAoB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sEAAsE,EAAE;SAC9H;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;KAC1B;IAED,KAAK,CAAC,OAAO,CAAC,IAAI;QAChB,YAAY;QACZ,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,EAAE,MAA4B,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,EAAE,GAAyB,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,EAAE,IAAc,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,EAAE,GAAa,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,EAAE,oBAA0C,CAAC;QAErE,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1H,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAA4B,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC/E,IAAI,KAAK;YAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;QAClC,IAAI,GAAG;YAAE,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;QAC3B,IAAI,WAAW;YAAE,OAAO,CAAC,oBAAoB,GAAG,WAAW,CAAC;QAE5D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACnE,OAAO,aAAa,CAAC,IAAI,EAAE,SAAgB,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * board/get — 获取文档中的画板资源
3
+ *
4
+ * 端点:GET /api/v2/yfm/boards
5
+ */
6
+ import type { McpTool } from "../common/types.js";
7
+ export declare const boardGet: McpTool;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * board/get — 获取文档中的画板资源
3
+ *
4
+ * 端点:GET /api/v2/yfm/boards
5
+ */
6
+ import { apiGet } from "../common/api-client.js";
7
+ import { handleApiCall } from "../common/format.js";
8
+ import { requiredString } from "../common/validate.js";
9
+ export const boardGet = {
10
+ name: "yuque_get_board",
11
+ description: "Get board resource JSON DSL and summary stats from a document. GET /yfm/boards. 详见 references/api/board_api.md",
12
+ inputSchema: {
13
+ type: "object",
14
+ properties: {
15
+ doc_id: { type: "number", description: "Document ID (mutually exclusive with url)" },
16
+ url: { type: "string", description: "Document URL (mutually exclusive with doc_id)" },
17
+ resource_id: { type: "string", description: "Board resource ID (required, extract the ID part from board://<resource_id>)" },
18
+ },
19
+ required: ["resource_id"],
20
+ },
21
+ async handler(args) {
22
+ // @validate
23
+ const __v = requiredString(args?.resource_id, "resource_id");
24
+ if (__v)
25
+ return __v;
26
+ const docId = args?.doc_id;
27
+ const url = args?.url;
28
+ const resourceId = args?.resource_id;
29
+ if (!docId && !url) {
30
+ return {
31
+ content: [{ type: "text", text: JSON.stringify({ error: "请提供 doc_id 或 url / Provide doc_id or url" }, null, 2) }],
32
+ isError: true,
33
+ };
34
+ }
35
+ const params = { resource_type: "board", src: resourceId };
36
+ if (docId)
37
+ params.doc_id = String(docId);
38
+ if (url)
39
+ params.url = url;
40
+ const data = await apiGet("/yfm/boards", params, "Get board");
41
+ return handleApiCall(data, undefined);
42
+ },
43
+ };
44
+ //# sourceMappingURL=get-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-board.js","sourceRoot":"","sources":["../../src/board/get-board.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,QAAQ,GAAY;IAC/B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,gHAAgH;IAE7H,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACpF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACrF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8EAA8E,EAAE;SAC7H;QACD,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;IAED,KAAK,CAAC,OAAO,CAAC,IAAI;QAChB,YAAY;QACZ,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7D,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,EAAE,MAA4B,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,EAAE,GAAyB,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,EAAE,WAAqB,CAAC;QAE/C,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1H,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAA2B,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACnF,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;QAE1B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9D,OAAO,aAAa,CAAC,IAAI,EAAE,SAAgB,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { boardGet } from "./get-board.js";
2
+ export { boardCreate } from "./create-board.js";
3
+ export { boardUpdate } from "./update-board.js";
4
+ import type { McpTool } from "../common/types.js";
5
+ export declare const boardTools: McpTool[];
@@ -0,0 +1,8 @@
1
+ export { boardGet } from "./get-board.js";
2
+ export { boardCreate } from "./create-board.js";
3
+ export { boardUpdate } from "./update-board.js";
4
+ import { boardGet } from "./get-board.js";
5
+ import { boardCreate } from "./create-board.js";
6
+ import { boardUpdate } from "./update-board.js";
7
+ export const boardTools = [boardGet, boardCreate, boardUpdate];
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/board/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,CAAC,MAAM,UAAU,GAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * board/update — 更新文档中的画板资源
3
+ *
4
+ * 端点:PUT /api/v2/yfm/boards
5
+ */
6
+ import type { McpTool } from "../common/types.js";
7
+ export declare const boardUpdate: McpTool;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * board/update — 更新文档中的画板资源
3
+ *
4
+ * 端点:PUT /api/v2/yfm/boards
5
+ */
6
+ import { apiPut } from "../common/api-client.js";
7
+ import { handleApiCall } from "../common/format.js";
8
+ import { requiredString } from "../common/validate.js";
9
+ export const boardUpdate = {
10
+ name: "yuque_update_board",
11
+ description: "Update a board resource (text or dsl, choose one). PUT /yfm/boards. 详见 references/api/board_api.md",
12
+ inputSchema: {
13
+ type: "object",
14
+ properties: {
15
+ doc_id: { type: "number", description: "Document ID (mutually exclusive with url)" },
16
+ url: { type: "string", description: "Document URL (mutually exclusive with doc_id)" },
17
+ resource_id: { type: "string", description: "Board resource ID (required, extract from board://<resource_id>)" },
18
+ text: { type: "string", description: "New textual DSL content (mutually exclusive with dsl)" },
19
+ dsl: { type: "string", description: "New JSON DSL object (mutually exclusive with text), sent as JSON" },
20
+ },
21
+ required: ["resource_id"],
22
+ },
23
+ async handler(args) {
24
+ // @validate
25
+ const __v = requiredString(args?.resource_id, "resource_id");
26
+ if (__v)
27
+ return __v;
28
+ const docId = args?.doc_id;
29
+ const url = args?.url;
30
+ const resourceId = args?.resource_id;
31
+ const text = args?.text;
32
+ const dslRaw = args?.dsl;
33
+ if (!docId && !url) {
34
+ return {
35
+ content: [{ type: "text", text: JSON.stringify({ error: "请提供 doc_id 或 url / Provide doc_id or url" }, null, 2) }],
36
+ isError: true,
37
+ };
38
+ }
39
+ if (!text && !dslRaw) {
40
+ return {
41
+ content: [{ type: "text", text: JSON.stringify({ error: "请提供 text 或 dsl(二选一)/ Provide text or dsl (choose one)" }, null, 2) }],
42
+ isError: true,
43
+ };
44
+ }
45
+ const payload = { resource_type: "board", src: resourceId };
46
+ if (docId)
47
+ payload.doc_id = docId;
48
+ if (url)
49
+ payload.url = url;
50
+ if (text !== undefined) {
51
+ payload.text = text;
52
+ }
53
+ else if (dslRaw !== undefined) {
54
+ try {
55
+ payload.dsl = JSON.parse(dslRaw);
56
+ }
57
+ catch {
58
+ payload.dsl = dslRaw;
59
+ }
60
+ }
61
+ const data = await apiPut("/yfm/boards", payload, "Update board");
62
+ return handleApiCall(data, undefined);
63
+ },
64
+ };
65
+ //# sourceMappingURL=update-board.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-board.js","sourceRoot":"","sources":["../../src/board/update-board.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAY;IAClC,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,oGAAoG;IAEjH,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;YACpF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+CAA+C,EAAE;YACrF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kEAAkE,EAAE;YAChH,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uDAAuD,EAAE;YAC9F,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kEAAkE,EAAE;SACzG;QACD,QAAQ,EAAE,CAAC,aAAa,CAAC;KAC1B;IAED,KAAK,CAAC,OAAO,CAAC,IAAI;QAChB,YAAY;QACZ,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC7D,IAAI,GAAG;YAAE,OAAO,GAAG,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,EAAE,MAA4B,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,EAAE,GAAyB,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAI,EAAE,WAAqB,CAAC;QAC/C,MAAM,IAAI,GAAG,IAAI,EAAE,IAA0B,CAAC;QAC9C,MAAM,MAAM,GAAG,IAAI,EAAE,GAAyB,CAAC;QAE/C,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0CAA0C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC1H,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,uDAAuD,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvI,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAA4B,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC;QACrF,IAAI,KAAK;YAAE,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;QAClC,IAAI,GAAG;YAAE,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;QAC3B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACtB,CAAC;aAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC;gBAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC;YAAC,CAAC;QAC3E,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QAClE,OAAO,aAAa,CAAC,IAAI,EAAE,SAAgB,CAAC,CAAC;IAC/C,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * yuque-mcp-http CLI — HTTP SSE 模式(端口 3099)
4
+ * 用法:yuque-mcp-http [--config /path/to/config.json] [--port 3099]
5
+ */
6
+ import { spawn } from "child_process";
7
+ import { resolve } from "path";
8
+ import { fileURLToPath } from "url";
9
+ const __dirname = fileURLToPath(new URL(".", import.meta.url));
10
+ const args = [resolve(__dirname, "http.js")];
11
+ const child = spawn("node", args, {
12
+ stdio: "inherit",
13
+ env: { ...process.env },
14
+ });
15
+ child.on("exit", (code) => process.exit(code ?? 0));
16
+ //# sourceMappingURL=cli-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-http.js","sourceRoot":"","sources":["../src/cli-http.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;IAChC,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;CACxB,CAAC,CAAC;AACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * yuque-mcp CLI — stdio 模式
4
+ * 用法:yuque-mcp [--config /path/to/config.json]
5
+ */
6
+ import { spawn } from "child_process";
7
+ import { resolve } from "path";
8
+ import { fileURLToPath } from "url";
9
+ const __dirname = fileURLToPath(new URL(".", import.meta.url));
10
+ const child = spawn("node", [resolve(__dirname, "index.js")], {
11
+ stdio: "inherit",
12
+ env: { ...process.env },
13
+ });
14
+ child.on("exit", (code) => process.exit(code ?? 0));
15
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE;IAC5D,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;CACxB,CAAC,CAAC;AACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * api-client — 公共 HTTP 请求层
3
+ *
4
+ * 封装 fetch + 错误处理(含网络异常)+ 自动重试(429/5xx)+ 响应格式化,
5
+ * 减少工具文件中的重复代码。
6
+ * 重试策略:指数退避 1s → 2s → 4s,最多 3 次。
7
+ */
8
+ /** API 调用结果的类型 guard:检查是否是 MCP error */
9
+ export declare function isErrorResult(result: unknown): result is {
10
+ content: Array<{
11
+ type: "text";
12
+ text: string;
13
+ }>;
14
+ isError: true;
15
+ };
16
+ /** GET 请求 */
17
+ export declare function apiGet(path: string, params?: Record<string, string>, context?: string): Promise<unknown>;
18
+ /** POST 请求 */
19
+ export declare function apiPost(path: string, body: Record<string, unknown>, context?: string): Promise<unknown>;
20
+ /** PUT 请求 */
21
+ export declare function apiPut(path: string, body: Record<string, unknown>, context?: string): Promise<unknown>;
22
+ /** DELETE 请求 */
23
+ export declare function apiDelete(path: string, context?: string): Promise<unknown>;
24
+ /** POST 请求:支持 404 时 fallback 到备用路径(用于 user/group 端点自动切换) */
25
+ export declare function apiPostWithFallback(path: string, fallbackPath: string, body: Record<string, unknown>, context?: string): Promise<unknown>;
26
+ /** GET 请求:支持 404 时 fallback 到备用路径 */
27
+ export declare function apiGetWithFallback(path: string, fallbackPath: string, params?: Record<string, string>, context?: string): Promise<unknown>;
@@ -0,0 +1,198 @@
1
+ /**
2
+ * api-client — 公共 HTTP 请求层
3
+ *
4
+ * 封装 fetch + 错误处理(含网络异常)+ 自动重试(429/5xx)+ 响应格式化,
5
+ * 减少工具文件中的重复代码。
6
+ * 重试策略:指数退避 1s → 2s → 4s,最多 3 次。
7
+ */
8
+ import { loadConfig } from "./config.js";
9
+ import { handleApiError } from "./errors.js";
10
+ const cfg = loadConfig();
11
+ /** 最大重试次数 */
12
+ const MAX_RETRIES = 3;
13
+ /** 基延迟(ms) */
14
+ const BASE_DELAY = 1000;
15
+ /** 是否应该重试:网络异常、429、5xx */
16
+ function shouldRetry(res) {
17
+ if (!res)
18
+ return true; // 网络异常
19
+ return res.status === 429 || (res.status >= 500 && res.status < 600);
20
+ }
21
+ /** 等待 N ms */
22
+ function sleep(ms) {
23
+ return new Promise((r) => setTimeout(r, ms));
24
+ }
25
+ /** 执行 fetch 并自动重试 */
26
+ async function fetchWithRetry(url, options, context, attempt = 1) {
27
+ try {
28
+ const res = await fetch(url, options);
29
+ if (shouldRetry(res) && attempt <= MAX_RETRIES) {
30
+ const delay = BASE_DELAY * Math.pow(2, attempt - 1);
31
+ // 重试日志仅在 DEBUG 环境变量设置时输出
32
+ if (process.env.DEBUG)
33
+ console.error(`[RETRY] ${context} 第 ${attempt} 次失败 (${res.status}),${delay}ms 后重试`);
34
+ await sleep(delay);
35
+ return fetchWithRetry(url, options, context, attempt + 1);
36
+ }
37
+ return res;
38
+ }
39
+ catch (err) {
40
+ if (attempt <= MAX_RETRIES) {
41
+ const delay = BASE_DELAY * Math.pow(2, attempt - 1);
42
+ if (process.env.DEBUG)
43
+ console.error(`[RETRY] ${context} 第 ${attempt} 次网络异常,${delay}ms 后重试`);
44
+ await sleep(delay);
45
+ return fetchWithRetry(url, options, context, attempt + 1);
46
+ }
47
+ throw err;
48
+ }
49
+ }
50
+ /** API 调用结果的类型 guard:检查是否是 MCP error */
51
+ export function isErrorResult(result) {
52
+ return typeof result === "object" && result !== null && "isError" in result && result.isError === true;
53
+ }
54
+ /** 网络异常 → 结构化错误(避免未捕获异常炸到 AI 侧) */
55
+ function networkError(context, err) {
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ return {
58
+ content: [{
59
+ type: "text",
60
+ text: JSON.stringify({
61
+ error: "NETWORK_ERROR",
62
+ message: `网络请求失败 / Network request failed: ${context}`,
63
+ detail: message,
64
+ hint: "请检查网络连接、api_base 配置或语雀服务状态 / Check network, api_base config, or Yuque service status",
65
+ }, null, 2),
66
+ }],
67
+ isError: true,
68
+ };
69
+ }
70
+ /** 标准请求头(Token 认证) */
71
+ function authHeaders(extra) {
72
+ return { "X-Auth-Token": cfg.token, ...extra };
73
+ }
74
+ /** 构建完整 URL */
75
+ function buildUrl(path, params) {
76
+ const url = `${cfg.api_base}${path}`;
77
+ if (!params || Object.keys(params).length === 0)
78
+ return url;
79
+ const qs = new URLSearchParams(params);
80
+ return `${url}?${qs}`;
81
+ }
82
+ /** GET 请求 */
83
+ export async function apiGet(path, params, context) {
84
+ const ctx = context ?? `GET ${path}`;
85
+ try {
86
+ const url = buildUrl(path, params);
87
+ const res = await fetchWithRetry(url, { headers: authHeaders() }, ctx);
88
+ if (!res.ok)
89
+ return handleApiError(res, ctx);
90
+ return res.json();
91
+ }
92
+ catch (err) {
93
+ return networkError(ctx, err);
94
+ }
95
+ }
96
+ /** POST 请求 */
97
+ export async function apiPost(path, body, context) {
98
+ const ctx = context ?? `POST ${path}`;
99
+ try {
100
+ const url = `${cfg.api_base}${path}`;
101
+ const res = await fetchWithRetry(url, {
102
+ method: "POST",
103
+ headers: authHeaders({ "Content-Type": "application/json" }),
104
+ body: JSON.stringify(body),
105
+ }, ctx);
106
+ if (!res.ok)
107
+ return handleApiError(res, ctx);
108
+ return res.json();
109
+ }
110
+ catch (err) {
111
+ return networkError(ctx, err);
112
+ }
113
+ }
114
+ /** PUT 请求 */
115
+ export async function apiPut(path, body, context) {
116
+ const ctx = context ?? `PUT ${path}`;
117
+ try {
118
+ const url = `${cfg.api_base}${path}`;
119
+ const res = await fetchWithRetry(url, {
120
+ method: "PUT",
121
+ headers: authHeaders({ "Content-Type": "application/json" }),
122
+ body: JSON.stringify(body),
123
+ }, ctx);
124
+ if (!res.ok)
125
+ return handleApiError(res, ctx);
126
+ return res.json();
127
+ }
128
+ catch (err) {
129
+ return networkError(ctx, err);
130
+ }
131
+ }
132
+ /** DELETE 请求 */
133
+ export async function apiDelete(path, context) {
134
+ const ctx = context ?? `DELETE ${path}`;
135
+ try {
136
+ const url = `${cfg.api_base}${path}`;
137
+ const res = await fetchWithRetry(url, {
138
+ method: "DELETE",
139
+ headers: authHeaders(),
140
+ }, ctx);
141
+ if (!res.ok)
142
+ return handleApiError(res, ctx);
143
+ return res.json();
144
+ }
145
+ catch (err) {
146
+ return networkError(ctx, err);
147
+ }
148
+ }
149
+ /** POST 请求:支持 404 时 fallback 到备用路径(用于 user/group 端点自动切换) */
150
+ export async function apiPostWithFallback(path, fallbackPath, body, context) {
151
+ const ctx = context ?? `POST ${path}`;
152
+ try {
153
+ const cfg = loadConfig();
154
+ let url = `${cfg.api_base}${path}`;
155
+ let res = await fetchWithRetry(url, {
156
+ method: "POST",
157
+ headers: authHeaders({ "Content-Type": "application/json" }),
158
+ body: JSON.stringify(body),
159
+ }, ctx);
160
+ if (res.status === 404) {
161
+ url = `${cfg.api_base}${fallbackPath}`;
162
+ res = await fetchWithRetry(url, {
163
+ method: "POST",
164
+ headers: authHeaders({ "Content-Type": "application/json" }),
165
+ body: JSON.stringify(body),
166
+ }, ctx);
167
+ }
168
+ if (!res.ok)
169
+ return handleApiError(res, ctx);
170
+ return res.json();
171
+ }
172
+ catch (err) {
173
+ return networkError(ctx, err);
174
+ }
175
+ }
176
+ /** GET 请求:支持 404 时 fallback 到备用路径 */
177
+ export async function apiGetWithFallback(path, fallbackPath, params, context) {
178
+ const ctx = context ?? `GET ${path}`;
179
+ try {
180
+ const cfg = loadConfig();
181
+ const qs = params && Object.keys(params).length > 0
182
+ ? `?${new URLSearchParams(params)}`
183
+ : "";
184
+ let url = `${cfg.api_base}${path}${qs}`;
185
+ let res = await fetchWithRetry(url, { headers: authHeaders() }, ctx);
186
+ if (res.status === 404) {
187
+ url = `${cfg.api_base}${fallbackPath}${qs}`;
188
+ res = await fetchWithRetry(url, { headers: authHeaders() }, ctx);
189
+ }
190
+ if (!res.ok)
191
+ return handleApiError(res, ctx);
192
+ return res.json();
193
+ }
194
+ catch (err) {
195
+ return networkError(ctx, err);
196
+ }
197
+ }
198
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/common/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * config — 读取 config/config.json
3
+ *
4
+ * 所有工具模块通过此文件获取配置,不再依赖环境变量。
5
+ *
6
+ * slug 格式:`{book_id}/{doc_id}`,用 / 分割解析。
7
+ * kv_slugs / schedule_slugs 均为数组,支持多文档。
8
+ */
9
+ interface NamespaceConfig {
10
+ book_id: number[];
11
+ kv_slugs?: string[];
12
+ schedule_slugs?: string[];
13
+ }
14
+ interface RssConfig {
15
+ enabled: boolean;
16
+ namespaces?: Record<string, NamespaceConfig>;
17
+ }
18
+ interface KvConfig {
19
+ enabled: boolean;
20
+ }
21
+ interface CrawlerConfig {
22
+ enabled: boolean;
23
+ namespaces?: Record<string, NamespaceConfig>;
24
+ }
25
+ interface Config {
26
+ token: string;
27
+ api_base: string;
28
+ cookie?: string;
29
+ ctoken?: string;
30
+ rss?: RssConfig;
31
+ kv?: KvConfig;
32
+ crawler?: CrawlerConfig;
33
+ }
34
+ export declare function loadConfig(): Config;
35
+ /** 持久化 config 到文件 */
36
+ export declare function saveConfig(): void;
37
+ /** 解析 slug:`{book_id}/{doc_id}` → { bookId, docId } */
38
+ export declare function parseSlug(slug: string): {
39
+ bookId: number;
40
+ docId: number;
41
+ } | null;
42
+ /** 组装 slug:bookId/docId */
43
+ export declare function buildSlugStr(bookId: number, docId: number): string;
44
+ /** 自动生成 slug:英文/拼音 + 时间戳,中文名兜底纯时间戳 */
45
+ export declare function autoSlug(name: string): string;
46
+ export {};
@@ -0,0 +1,86 @@
1
+ /**
2
+ * config — 读取 config/config.json
3
+ *
4
+ * 所有工具模块通过此文件获取配置,不再依赖环境变量。
5
+ *
6
+ * slug 格式:`{book_id}/{doc_id}`,用 / 分割解析。
7
+ * kv_slugs / schedule_slugs 均为数组,支持多文档。
8
+ */
9
+ import { readFileSync, writeFileSync, existsSync } from "fs";
10
+ import { resolve, dirname } from "path";
11
+ import { fileURLToPath } from "url";
12
+ import { homedir } from "os";
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ /** 查找 config 文件:--config 参数 → cwd → ~/.yuque-mcp → 开发路径 */
15
+ function findConfigPath() {
16
+ // 1. 命令行参数 --config /path/to/config.json
17
+ const cliArg = process.argv.findIndex(a => a === "--config" || a === "-c");
18
+ if (cliArg !== -1 && process.argv[cliArg + 1]) {
19
+ return process.argv[cliArg + 1];
20
+ }
21
+ // 2. 当前工作目录
22
+ const cwdPath = resolve(process.cwd(), "yuque-config.json");
23
+ if (existsSync(cwdPath))
24
+ return cwdPath;
25
+ // 3. 用户目录
26
+ const homePath = resolve(homedir(), ".yuque-mcp", "config.json");
27
+ if (existsSync(homePath))
28
+ return homePath;
29
+ // 4. 开发模式(相对 dist/ 的路径)
30
+ const devPath = resolve(__dirname, "../../../config/config.json");
31
+ if (existsSync(devPath))
32
+ return devPath;
33
+ // 5. 包内默认
34
+ return resolve(homedir(), ".yuque-mcp", "config.json");
35
+ }
36
+ let _config = null;
37
+ export function loadConfig() {
38
+ if (_config)
39
+ return _config;
40
+ const configPath = findConfigPath();
41
+ try {
42
+ const raw = readFileSync(configPath, "utf-8");
43
+ _config = JSON.parse(raw);
44
+ }
45
+ catch {
46
+ throw new Error(`无法读取配置文件。请将 config.example.json 复制为 yuque-config.json(当前目录)或 ~/.yuque-mcp/config.json,并填入 Token。\n` +
47
+ `Cannot read config. Copy config.example.json to yuque-config.json (cwd) or ~/.yuque-mcp/config.json.`);
48
+ }
49
+ if (!_config.token || _config.token === "在此填入语雀 API Token") {
50
+ throw new Error("请在 config/config.json 中填入有效的语雀 API Token / Please fill in a valid Yuque API Token in config/config.json");
51
+ }
52
+ _config.api_base = _config.api_base || "https://www.yuque.com/api/v2";
53
+ return _config;
54
+ }
55
+ /** 持久化 config 到文件 */
56
+ export function saveConfig() {
57
+ if (!_config)
58
+ return;
59
+ const configPath = findConfigPath();
60
+ writeFileSync(configPath, JSON.stringify(_config, null, 2) + "\n", "utf-8");
61
+ }
62
+ /** 解析 slug:`{book_id}/{doc_id}` → { bookId, docId } */
63
+ export function parseSlug(slug) {
64
+ const parts = slug.split("/");
65
+ if (parts.length !== 2)
66
+ return null;
67
+ const bookId = parseInt(parts[0], 10);
68
+ const docId = parseInt(parts[1], 10);
69
+ if (isNaN(bookId) || isNaN(docId))
70
+ return null;
71
+ return { bookId, docId };
72
+ }
73
+ /** 组装 slug:bookId/docId */
74
+ export function buildSlugStr(bookId, docId) {
75
+ return `${bookId}/${docId}`;
76
+ }
77
+ /** 自动生成 slug:英文/拼音 + 时间戳,中文名兜底纯时间戳 */
78
+ export function autoSlug(name) {
79
+ const ascii = name
80
+ .replace(/[^a-zA-Z0-9]/g, "-")
81
+ .replace(/-+/g, "-")
82
+ .replace(/^-|-$/g, "");
83
+ const ts = Date.now().toString(36);
84
+ return ascii ? `${ascii.substring(0, 30)}-${ts}` : `repo-${ts}`;
85
+ }
86
+ //# sourceMappingURL=config.js.map