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,290 @@
1
+ /**
2
+ * rss/fetch-feed — 通用 RSS 抓取 → 解析 → 去重(语雀 KV)→ 写入语雀
3
+ *
4
+ * 职责:抓取 RSS/Atom Feed,解析条目,语雀 KV 去重后写入目标知识库。
5
+ * 去重:调用 kv/common.ts 的 loadKvMap / saveKvMap,不再自己创建 KV 标记文档。
6
+ */
7
+ import { apiPut } from "../common/api-client.js";
8
+ import { check, requiredString } from "../common/validate.js";
9
+ import { loadConfig } from "../common/config.js";
10
+ import { RSS_SOURCES } from "./sources.js";
11
+ import { parseFeed } from "./parser.js";
12
+ import { buildSlug } from "./dedup.js";
13
+ import { loadKvMap, kvIncrementalSet } from "../kv/common.js";
14
+ import { createDocWithAutoExpand } from "../common/repo-capacity.js";
15
+ /** 构建 feed URL */
16
+ function buildFeedUrl(source, feedType, params) {
17
+ const src = RSS_SOURCES[source];
18
+ if (!src)
19
+ return null;
20
+ const feed = src.feeds[feedType];
21
+ if (!feed)
22
+ return null;
23
+ if (feed.url)
24
+ return feed.url;
25
+ if (feed.url_template) {
26
+ let url = feed.url_template;
27
+ if (params) {
28
+ for (const [key, value] of Object.entries(params)) {
29
+ url = url.replace(`{${key}}`, String(value));
30
+ }
31
+ }
32
+ return url;
33
+ }
34
+ return null;
35
+ }
36
+ /**
37
+ * 解析 RSS 目标知识库
38
+ * 优先级:tool 参数 → config.rss.namespaces.{source}.book_id(取最后一个)
39
+ */
40
+ function resolveRssRepo(source, paramRepo) {
41
+ if (paramRepo)
42
+ return parseInt(paramRepo, 10) || null;
43
+ const cfg = loadConfig();
44
+ const ids = cfg.rss?.namespaces?.[source]?.book_id;
45
+ if (ids && ids.length > 0)
46
+ return ids[ids.length - 1];
47
+ return null;
48
+ }
49
+ /** 将 FeedEntry 转为语雀文档 Markdown body */
50
+ function entryToMarkdown(entry, sourceName) {
51
+ const lines = [];
52
+ lines.push(`> 来源:${sourceName} | 作者:${entry.author || "未知"} | ${entry.published || "未知时间"}`);
53
+ lines.push("");
54
+ lines.push(`# ${entry.title}`);
55
+ lines.push("");
56
+ if (entry.summary) {
57
+ lines.push(entry.summary);
58
+ lines.push("");
59
+ }
60
+ lines.push(`[原文链接](${entry.link})`);
61
+ return lines.join("\n");
62
+ }
63
+ /** 创建一篇语雀文档(带自动扩容) */
64
+ async function createDoc(bookId, title, body, link, slug, source) {
65
+ const payload = {
66
+ title,
67
+ body,
68
+ slug,
69
+ description: `原文链接: ${link}`,
70
+ format: "markdown",
71
+ public: 0,
72
+ };
73
+ const result = await createDocWithAutoExpand(bookId, "rss", source, payload, `Create doc: ${title}`);
74
+ if (!result.ok)
75
+ return result;
76
+ // 加入目录(用扩容后的 book_id)
77
+ const targetBookId = result.book_id ?? bookId;
78
+ if (result.id) {
79
+ try {
80
+ await apiPut(`/repos/${targetBookId}/toc`, {
81
+ action: "appendNode",
82
+ action_mode: "sibling",
83
+ type: "DOC",
84
+ doc_ids: [result.id],
85
+ }, `Add to TOC: ${title}`);
86
+ }
87
+ catch { /* TOC 失败不影响主流程 */ }
88
+ }
89
+ return result;
90
+ }
91
+ export const rssFetch = {
92
+ name: "yuque_rss_fetch",
93
+ description: "Fetch RSS/Atom feed, parse entries, deduplicate via Yuque KV (single-doc JSON map), and save to Yuque repo. Call yuque_rss_list_sources first. 详见 references/api/extended_api.md",
94
+ inputSchema: {
95
+ type: "object",
96
+ properties: {
97
+ source: { type: "string", description: "Source key, e.g. 'cnblogs'. Use yuque_rss_list_sources to list available sources." },
98
+ feed_type: { type: "string", description: "Feed type key, e.g. 'sitehome', 'picked', 'user'. Use yuque_rss_list_sources to see available feed types." },
99
+ feed_params: { type: "string", description: "Template params for feeds with url_template. JSON string, e.g. '{\"username\":\"hsewr333\"}'" },
100
+ target_repo: { type: "string", description: "RSS target repo ID. Optional — falls back to config.json rss.namespaces.{source}.book_id." },
101
+ kv_namespace: { type: "string", description: "KV namespace for dedup, e.g. 'cnblogs'. Defaults to source key." },
102
+ max_items: { type: "number", description: "Max items to fetch and save (default 10, max 50)" },
103
+ mode: { type: "string", description: "Mode: 'append' (save new docs, default) | 'dry_run' (preview only, no save)" },
104
+ title_prefix: { type: "string", description: "Optional prefix for doc titles, e.g. '[博客园] '" },
105
+ raw: { type: "boolean", description: "Return raw full JSON (default false, returns summary)" },
106
+ },
107
+ required: ["source", "feed_type"],
108
+ },
109
+ async handler(args) {
110
+ const __v = check(requiredString(args?.source, "source"), requiredString(args?.feed_type, "feed_type"));
111
+ if (__v)
112
+ return __v;
113
+ const source = args?.source;
114
+ const feedType = args?.feed_type;
115
+ let feedParams = args?.feed_params;
116
+ if (typeof feedParams === "string") {
117
+ try {
118
+ feedParams = JSON.parse(feedParams);
119
+ }
120
+ catch { /* keep as-is */ }
121
+ }
122
+ feedParams = feedParams;
123
+ const targetRepoParam = args?.target_repo;
124
+ const kvNamespace = args?.kv_namespace || source;
125
+ const maxItems = Math.min(args?.max_items ?? 10, 50);
126
+ const mode = args?.mode ?? "append";
127
+ const titlePrefix = args?.title_prefix ?? "";
128
+ const targetRepo = resolveRssRepo(source, targetRepoParam);
129
+ const cfg = loadConfig();
130
+ const enableKv = !!(cfg.kv?.enabled);
131
+ // 1. 查数据源配置
132
+ const src = RSS_SOURCES[source];
133
+ if (!src) {
134
+ return {
135
+ content: [{ type: "text", text: JSON.stringify({
136
+ error: "UNKNOWN_SOURCE",
137
+ message: `未知数据源: ${source}`,
138
+ hint: "调用 yuque_rss_list_sources 查看可用数据源",
139
+ }, null, 2) }],
140
+ isError: true,
141
+ };
142
+ }
143
+ const feed = src.feeds[feedType];
144
+ if (!feed) {
145
+ return {
146
+ content: [{ type: "text", text: JSON.stringify({
147
+ error: "UNKNOWN_FEED_TYPE",
148
+ message: `未知 feed 类型: ${feedType}`,
149
+ available: Object.keys(src.feeds),
150
+ }, null, 2) }],
151
+ isError: true,
152
+ };
153
+ }
154
+ // 2. 构建 feed URL
155
+ const feedUrl = buildFeedUrl(source, feedType, feedParams);
156
+ if (!feedUrl) {
157
+ return {
158
+ content: [{ type: "text", text: JSON.stringify({
159
+ error: "URL_BUILD_FAILED",
160
+ message: "无法构建 feed URL,请检查 feed_params",
161
+ }, null, 2) }],
162
+ isError: true,
163
+ };
164
+ }
165
+ // 3. 抓取 RSS
166
+ let xml;
167
+ try {
168
+ const res = await fetch(feedUrl);
169
+ if (!res.ok) {
170
+ return {
171
+ content: [{ type: "text", text: JSON.stringify({
172
+ error: "FETCH_FAILED",
173
+ message: `RSS 抓取失败,HTTP ${res.status}`,
174
+ url: feedUrl,
175
+ }, null, 2) }],
176
+ isError: true,
177
+ };
178
+ }
179
+ xml = await res.text();
180
+ }
181
+ catch (err) {
182
+ return {
183
+ content: [{ type: "text", text: JSON.stringify({
184
+ error: "NETWORK_ERROR",
185
+ message: `网络请求失败: ${err instanceof Error ? err.message : String(err)}`,
186
+ url: feedUrl,
187
+ }, null, 2) }],
188
+ isError: true,
189
+ };
190
+ }
191
+ // 4. 解析
192
+ const parsed = parseFeed(xml);
193
+ const entries = parsed.entries.slice(0, maxItems);
194
+ // 5. 去重:加载 KV map,过滤已存在的 slug
195
+ let newEntries = [];
196
+ let skippedCount = 0;
197
+ let existingMap = {};
198
+ if (enableKv && mode !== "dry_run") {
199
+ existingMap = await loadKvMap("rss", kvNamespace);
200
+ for (const entry of entries) {
201
+ const slug = buildSlug(source, entry.link);
202
+ if (slug in existingMap) {
203
+ skippedCount++;
204
+ }
205
+ else {
206
+ newEntries.push({ ...entry, slug });
207
+ }
208
+ }
209
+ }
210
+ else {
211
+ newEntries = entries.map((e) => ({
212
+ ...e,
213
+ slug: buildSlug(source, e.link),
214
+ }));
215
+ }
216
+ // 6. dry_run 模式:只预览不写入
217
+ if (mode === "dry_run") {
218
+ return {
219
+ content: [{
220
+ type: "text",
221
+ text: JSON.stringify({
222
+ mode: "dry_run",
223
+ source: `${src.name} / ${feed.label}`,
224
+ feed_url: feedUrl,
225
+ feed_title: parsed.feedTitle,
226
+ total: entries.length,
227
+ entries: newEntries.map((e) => ({
228
+ title: e.title,
229
+ link: e.link,
230
+ slug: e.slug,
231
+ author: entries.find((x) => x.link === e.link)?.author,
232
+ published: entries.find((x) => x.link === e.link)?.published,
233
+ })),
234
+ }, null, 2),
235
+ }],
236
+ };
237
+ }
238
+ // 7. 写入语雀 + KV 标记
239
+ if (!targetRepo) {
240
+ return {
241
+ content: [{ type: "text", text: JSON.stringify({
242
+ error: "NO_TARGET_REPO",
243
+ message: "未配置目标知识库,请在 config.json 的 rss.namespaces.{source}.book_id 中设置或传 target_repo 参数",
244
+ }, null, 2) }],
245
+ isError: true,
246
+ };
247
+ }
248
+ const results = [];
249
+ for (const entry of newEntries) {
250
+ const docTitle = `${titlePrefix}${entry.title}`;
251
+ const body = entryToMarkdown(entry, src.name);
252
+ const result = await createDoc(targetRepo, docTitle, body, entry.link, entry.slug, source);
253
+ if (result.ok && enableKv) {
254
+ // 增量写入 KV 标记(含时间戳和作者,供 schedule 分析用)
255
+ const kvMeta = JSON.stringify({
256
+ link: entry.link,
257
+ author: entry.author || "未知",
258
+ date: entry.published || new Date().toISOString(),
259
+ feed: feedType,
260
+ });
261
+ await kvIncrementalSet("rss", kvNamespace, entry.slug, kvMeta);
262
+ }
263
+ results.push({
264
+ title: entry.title,
265
+ link: entry.link,
266
+ slug: entry.slug,
267
+ doc_id: result.id,
268
+ status: result.ok ? "created" : "failed",
269
+ error: result.error,
270
+ });
271
+ }
272
+ return {
273
+ content: [{
274
+ type: "text",
275
+ text: JSON.stringify({
276
+ source: `${src.name} / ${feed.label}`,
277
+ feed_url: feedUrl,
278
+ target_repo: targetRepo,
279
+ kv_namespace: kvNamespace,
280
+ fetched: entries.length,
281
+ new: newEntries.length,
282
+ skipped: skippedCount,
283
+ dedup: { strategy: enableKv ? "yuque-kv-json-map" : "disabled" },
284
+ results,
285
+ }, null, 2),
286
+ }],
287
+ };
288
+ },
289
+ };
290
+ //# sourceMappingURL=fetch-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-feed.js","sourceRoot":"","sources":["../../src/rss/fetch-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { rssListSources } from "./list-sources.js";
2
+ export { rssFetch } from "./fetch-feed.js";
3
+ export { rssSchedule } from "./schedule.js";
4
+ import type { McpTool } from "../common/types.js";
5
+ export declare const rssTools: McpTool[];
@@ -0,0 +1,8 @@
1
+ export { rssListSources } from "./list-sources.js";
2
+ export { rssFetch } from "./fetch-feed.js";
3
+ export { rssSchedule } from "./schedule.js";
4
+ import { rssListSources } from "./list-sources.js";
5
+ import { rssFetch } from "./fetch-feed.js";
6
+ import { rssSchedule } from "./schedule.js";
7
+ export const rssTools = [rssListSources, rssFetch, rssSchedule];
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rss/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,QAAQ,GAAc,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * rss/list-sources — 列出所有可用 RSS 数据源
3
+ *
4
+ * 无参数,直接返回 sources.ts 中的配置。
5
+ * Agent 调用 fetch 前先调这个了解有哪些源可用。
6
+ */
7
+ import type { McpTool } from "../common/types.js";
8
+ export declare const rssListSources: McpTool;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * rss/list-sources — 列出所有可用 RSS 数据源
3
+ *
4
+ * 无参数,直接返回 sources.ts 中的配置。
5
+ * Agent 调用 fetch 前先调这个了解有哪些源可用。
6
+ */
7
+ import { RSS_SOURCES } from "./sources.js";
8
+ export const rssListSources = {
9
+ name: "yuque_rss_list_sources",
10
+ description: "List all available RSS sources and their feed types. Call before yuque_rss_fetch. 详见 references/api/extended_api.md",
11
+ async handler() {
12
+ const sources = Object.entries(RSS_SOURCES).map(([key, src]) => ({
13
+ key,
14
+ name: src.name,
15
+ description: src.description,
16
+ feeds: Object.entries(src.feeds).map(([feedKey, feed]) => ({
17
+ key: feedKey,
18
+ label: feed.label,
19
+ description: feed.description,
20
+ has_template: !!feed.url_template,
21
+ params: feed.params_schema
22
+ ? Object.entries(feed.params_schema).map(([k, v]) => ({
23
+ name: k,
24
+ type: v.type,
25
+ description: v.description,
26
+ required: v.required,
27
+ }))
28
+ : [],
29
+ })),
30
+ }));
31
+ return {
32
+ content: [{
33
+ type: "text",
34
+ text: JSON.stringify({ sources, total: sources.length }, null, 2),
35
+ }],
36
+ };
37
+ },
38
+ };
39
+ //# sourceMappingURL=list-sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-sources.js","sourceRoot":"","sources":["../../src/rss/list-sources.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,CAAC,MAAM,cAAc,GAAY;IACrC,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,qHAAqH;IAElI,KAAK,CAAC,OAAO;QACX,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/D,GAAG;YACH,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACzD,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;gBACjC,MAAM,EAAE,IAAI,CAAC,aAAa;oBACxB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAClD,IAAI,EAAE,CAAC;wBACP,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;wBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;qBACrB,CAAC,CAAC;oBACL,CAAC,CAAC,EAAE;aACP,CAAC,CAAC;SACJ,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAClE,CAAC;SACH,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * rss/parser — RSS/Atom XML 解析
3
+ *
4
+ * 职责:将 RSS 2.0 / Atom 1.0 格式的 XML 解析为统一的条目结构。
5
+ * 不做网络请求,只做字符串 → 结构化的转换。
6
+ */
7
+ /** 统一条目结构,与 RSS/Atom 格式无关 */
8
+ export interface FeedEntry {
9
+ title: string;
10
+ link: string;
11
+ summary: string;
12
+ author: string;
13
+ published: string;
14
+ guid: string;
15
+ }
16
+ /** 解析结果 */
17
+ export interface ParseResult {
18
+ feedTitle: string;
19
+ feedSubtitle: string;
20
+ updated: string;
21
+ entries: FeedEntry[];
22
+ total: number;
23
+ }
24
+ /**
25
+ * 解析 RSS 2.0 / Atom 1.0 格式的 XML 字符串
26
+ */
27
+ export declare function parseFeed(xml: string): ParseResult;
@@ -0,0 +1,87 @@
1
+ /**
2
+ * rss/parser — RSS/Atom XML 解析
3
+ *
4
+ * 职责:将 RSS 2.0 / Atom 1.0 格式的 XML 解析为统一的条目结构。
5
+ * 不做网络请求,只做字符串 → 结构化的转换。
6
+ */
7
+ import { unescapeHtml as decodeXmlEntities } from "../common/text-utils.js";
8
+ /**
9
+ * 解析 RSS 2.0 / Atom 1.0 格式的 XML 字符串
10
+ */
11
+ export function parseFeed(xml) {
12
+ const feedTitle = extractTag(xml, "title") ?? extractAttr(xml, "feed", "title") ?? "Untitled Feed";
13
+ const feedSubtitle = extractTag(xml, "subtitle") ?? extractTag(xml, "description") ?? "";
14
+ const updated = extractTag(xml, "updated") ?? extractTag(xml, "lastBuildDate") ?? new Date().toISOString();
15
+ // 支持 <item> (RSS) 和 <entry> (Atom)
16
+ const entries = [];
17
+ const atomEntries = extractBlocks(xml, "entry");
18
+ const rssItems = extractBlocks(xml, "item");
19
+ const blocks = atomEntries.length > 0 ? atomEntries : rssItems;
20
+ for (const block of blocks) {
21
+ const title = extractTag(block, "title") ?? "";
22
+ const link = extractLink(block);
23
+ const summary = extractTag(block, "summary") ?? extractTag(block, "description") ?? "";
24
+ const author = extractTag(block, "name") ?? extractTag(block, "author") ?? extractTag(block, "dc:creator") ?? "";
25
+ const published = extractTag(block, "published") ?? extractTag(block, "pubDate") ?? extractTag(block, "dc:date") ?? "";
26
+ const guid = extractTag(block, "guid") ?? extractTag(block, "id") ?? link;
27
+ if (title && link) {
28
+ entries.push({ title, link, summary, author, published, guid });
29
+ }
30
+ }
31
+ return { feedTitle, feedSubtitle, updated, entries, total: entries.length };
32
+ }
33
+ // ── 内部工具函数 ──
34
+ /** 提取 <tag>内容</tag>,不支持嵌套同名标签 */
35
+ function extractTag(xml, tag) {
36
+ const re = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)</${tag}>`, "i");
37
+ const m = xml.match(re);
38
+ if (!m)
39
+ return null;
40
+ return decodeXmlEntities(m[1].trim());
41
+ }
42
+ /** 提取属性值,如 <feed title="xxx"> */
43
+ function extractAttr(xml, tag, attr) {
44
+ const re = new RegExp(`<${tag}[^>]*${attr}=["']([^"']*)["']`, "i");
45
+ const m = xml.match(re);
46
+ return m ? decodeXmlEntities(m[1]) : null;
47
+ }
48
+ /** 提取 <link> 的 href 或内容 */
49
+ function extractLink(block) {
50
+ const href = extractAttr(block, "link", "href");
51
+ if (href)
52
+ return href;
53
+ return extractTag(block, "link") ?? "";
54
+ }
55
+ /** 提取所有 <tag>...</tag> 块(支持嵌套同标签) */
56
+ function extractBlocks(xml, tag) {
57
+ const blocks = [];
58
+ const openRe = new RegExp(`<${tag}[^>]*>`, "gi");
59
+ const closeRe = new RegExp(`</${tag}>`, "gi");
60
+ const markers = [];
61
+ let m;
62
+ while ((m = openRe.exec(xml)) !== null) {
63
+ markers.push({ pos: m.index, isOpen: true, raw: m[0] });
64
+ }
65
+ while ((m = closeRe.exec(xml)) !== null) {
66
+ markers.push({ pos: m.index, isOpen: false, raw: m[0] });
67
+ }
68
+ markers.sort((a, b) => a.pos - b.pos);
69
+ let depth = 0;
70
+ let start = 0;
71
+ for (const mk of markers) {
72
+ if (mk.isOpen) {
73
+ if (depth === 0)
74
+ start = mk.pos + mk.raw.length;
75
+ depth++;
76
+ }
77
+ else {
78
+ depth--;
79
+ if (depth === 0) {
80
+ blocks.push(xml.slice(start, mk.pos));
81
+ }
82
+ }
83
+ }
84
+ return blocks;
85
+ }
86
+ // decodeXmlEntities 已从 common/text-utils.ts 导入
87
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/rss/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * rss/schedule — 定时抓取策略分析
3
+ *
4
+ * 主方案:读取 RSS 配置知识库(config.json 中 rss.namespaces.{source}.schedule_slugs),
5
+ * 分析每个 feed 的最近更新频率,生成推荐下次抓取时间,写回知识库。
6
+ *
7
+ * 频率分档(保守策略,最小间隔 1 天):
8
+ * - 高频:近 7 天 ≥5 篇 → 每天 1 次
9
+ * - 中频:近 7 天 1-4 篇 → 每 7 天
10
+ * - 低频:近 14 天 1 篇 → 每 15 天
11
+ * - 休眠:近 30 天 0 篇 → 每 30 天
12
+ */
13
+ import type { McpTool } from "../common/types.js";
14
+ export declare const rssSchedule: McpTool;