yuque-ai-mcp 2.8.0 → 2.10.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 +10 -9
- package/README_CN.md +10 -10
- package/SKILL.md +10 -1
- package/dist/common/register-tools.d.ts +1 -0
- package/dist/common/register-tools.js +3 -0
- package/dist/common/register-tools.js.map +1 -1
- package/dist/common/web-request.d.ts +1 -1
- package/dist/common/web-request.js.map +1 -1
- package/dist/web-doc/delete-doc.d.ts +14 -0
- package/dist/web-doc/delete-doc.js +79 -0
- package/dist/web-doc/delete-doc.js.map +1 -0
- package/dist/web-doc/get-doc.d.ts +13 -0
- package/dist/web-doc/get-doc.js +129 -0
- package/dist/web-doc/get-doc.js.map +1 -0
- package/dist/web-doc/get-toc.d.ts +12 -0
- package/dist/web-doc/get-toc.js +88 -0
- package/dist/web-doc/get-toc.js.map +1 -0
- package/dist/web-doc/index.d.ts +7 -0
- package/dist/web-doc/index.js +12 -0
- package/dist/web-doc/index.js.map +1 -0
- package/dist/web-doc/list-docs.d.ts +13 -0
- package/dist/web-doc/list-docs.js +109 -0
- package/dist/web-doc/list-docs.js.map +1 -0
- package/dist/web-doc/list-repos.d.ts +14 -0
- package/dist/web-doc/list-repos.js +111 -0
- package/dist/web-doc/list-repos.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
<h1 align="center">yuque-ai-mcp</h1>
|
|
6
6
|
<p align="center">
|
|
7
|
-
<b>
|
|
7
|
+
<b>68 fine-grained MCP tools for the full Yuque OpenAPI</b>
|
|
8
8
|
</p>
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
11
|
<a href="https://github.com/yehuoshun/yuque-ai-mcp"><img src="https://img.shields.io/badge/version-2.8.0-blue" alt="version" /></a>
|
|
12
12
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="license" /></a>
|
|
13
|
-
<a href="https://github.com/yehuoshun/yuque-ai-skills"><img src="https://img.shields.io/badge/skills-
|
|
13
|
+
<a href="https://github.com/yehuoshun/yuque-ai-skills"><img src="https://img.shields.io/badge/skills-67%20guides-orange" alt="skills" /></a>
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
@@ -19,15 +19,15 @@
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
A full-featured Yuque (语雀) MCP Server built on the [Model Context Protocol](https://modelcontextprotocol.io/). Provides
|
|
22
|
+
A full-featured Yuque (语雀) MCP Server built on the [Model Context Protocol](https://modelcontextprotocol.io/). Provides 68 fine-grained tools across 16 domains — every Yuque OpenAPI endpoint as a dedicated tool.
|
|
23
23
|
|
|
24
24
|
## Why
|
|
25
25
|
|
|
26
|
-
- **19 →
|
|
26
|
+
- **19 → 68 tools** — 3x more coverage than the official [yuque-mcp-server](https://github.com/yuque/yuque-mcp-server)
|
|
27
27
|
- **Dual transport** — stdio + HTTP SSE, shared registry, zero downtime on reload
|
|
28
28
|
- **Modular architecture** — 15 domains, barrel exports, single source of truth registry
|
|
29
29
|
- **Full API coverage** — group, recycle, upload, statistics, versions, boards — all the missing pieces
|
|
30
|
-
- **[Skill layer](https://github.com/yehuoshun/yuque-ai-skills)** —
|
|
30
|
+
- **[Skill layer](https://github.com/yehuoshun/yuque-ai-skills)** — 67 usage guides for AI agents
|
|
31
31
|
|
|
32
32
|
## Table of Contents
|
|
33
33
|
|
|
@@ -76,9 +76,9 @@ npm run dev:http # HTTP SSE mode (http://localhost:3099)
|
|
|
76
76
|
| **rss** | 3 | Source list, fetch + dedup + save, schedule analysis |
|
|
77
77
|
| **crawler** | 4 | Fetch, CSS extract, dedup save, schedule analysis |
|
|
78
78
|
| **kv** | 4 | Get, set, delete, list — incremental sharding, 250KB/doc limit |
|
|
79
|
-
| **Total** | **
|
|
79
|
+
| **Total** | **68** | |
|
|
80
80
|
|
|
81
|
-
### All
|
|
81
|
+
### All 68 Tools
|
|
82
82
|
|
|
83
83
|
| Tool | Domain | Description |
|
|
84
84
|
|------|--------|-------------|
|
|
@@ -88,6 +88,7 @@ npm run dev:http # HTTP SSE mode (http://localhost:3099)
|
|
|
88
88
|
| `yuque_search` | search | 通用搜索文档/知识库 |
|
|
89
89
|
| `yuque_rag_search` | search | RAG 检索增强搜索 + 自动获取文档内容 |
|
|
90
90
|
| `yuque_web_search` | search | Cookie 态 Web 搜索,返回完整文档对象 + 精确总数 + 高亮摘要 |
|
|
91
|
+
| `yuque_web_delete_doc` | doc | Cookie 态删除文档(v2 被限流时的备用通道,移入回收站) |
|
|
91
92
|
| `yuque_get_group_users` | group | 获取团队成员列表 |
|
|
92
93
|
| `yuque_update_group_user` | group | 变更团队成员角色 |
|
|
93
94
|
| `yuque_delete_group_user` | group | 删除团队成员 |
|
|
@@ -152,13 +153,13 @@ See [SKILL.md](SKILL.md) or [yuque-ai-skills](https://github.com/yehuoshun/yuque
|
|
|
152
153
|
|
|
153
154
|
| Feature | Official yuque-mcp-server | yuque-ai-mcp |
|
|
154
155
|
|---------|--------------------------|--------------|
|
|
155
|
-
| Tools | 19 | **
|
|
156
|
+
| Tools | 19 | **68** |
|
|
156
157
|
| Granularity | Coarse | **Fine-grained** (1 tool / endpoint) |
|
|
157
158
|
| Group, Recycle, Upload, Statistics | ❌ | ✅ |
|
|
158
159
|
| Versions, Diff, Cross-book Copy | ❌ | ✅ |
|
|
159
160
|
| Transport | stdio only | **stdio + HTTP SSE** |
|
|
160
161
|
| Config | Env var | **config.json** (token + cookie) |
|
|
161
|
-
| Skill Layer | ❌ | ✅
|
|
162
|
+
| Skill Layer | ❌ | ✅ 67 guides |
|
|
162
163
|
|
|
163
164
|
## Architecture
|
|
164
165
|
|
package/README_CN.md
CHANGED
|
@@ -5,14 +5,14 @@
|
|
|
5
5
|
<p align="center">
|
|
6
6
|
<h1 align="center">yuque-ai-mcp</h1>
|
|
7
7
|
<p align="center">
|
|
8
|
-
<b>
|
|
8
|
+
<b>67 个细粒度 MCP 工具,覆盖语雀 OpenAPI 全部能力</b>
|
|
9
9
|
</p>
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
13
13
|
<a href="https://github.com/yehuoshun/yuque-ai-mcp"><img src="https://img.shields.io/badge/版本-2.8.0-blue" alt="version" /></a>
|
|
14
14
|
<a href="LICENSE"><img src="https://img.shields.io/badge/许可-MIT-green" alt="license" /></a>
|
|
15
|
-
<a href="https://github.com/yehuoshun/yuque-ai-skills"><img src="https://img.shields.io/badge/skills-
|
|
15
|
+
<a href="https://github.com/yehuoshun/yuque-ai-skills"><img src="https://img.shields.io/badge/skills-67%20指导-orange" alt="skills" /></a>
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
18
|
<p align="center">
|
|
@@ -21,15 +21,15 @@
|
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
基于 [Model Context Protocol](https://modelcontextprotocol.io/) 的语雀全功能 MCP Server。
|
|
24
|
+
基于 [Model Context Protocol](https://modelcontextprotocol.io/) 的语雀全功能 MCP Server。67 个工具,16 个域——每个语雀 OpenAPI 端点一个专用工具。
|
|
25
25
|
|
|
26
26
|
## 为什么选这个
|
|
27
27
|
|
|
28
|
-
- **19 →
|
|
28
|
+
- **19 → 67 工具** — 比官方 [yuque-mcp-server](https://github.com/yuque/yuque-mcp-server) 多 3 倍覆盖
|
|
29
29
|
- **双传输模式** — stdio + HTTP SSE,共享注册中心,修改无需重启
|
|
30
|
-
- **模块化架构** —
|
|
30
|
+
- **模块化架构** — 16 个域,barrel export,唯一注册中心
|
|
31
31
|
- **完整 API 覆盖** — 团队、回收站、上传、统计、版本、画板——补全官方缺失
|
|
32
|
-
- **[Skill 层](https://github.com/yehuoshun/yuque-ai-skills)** —
|
|
32
|
+
- **[Skill 层](https://github.com/yehuoshun/yuque-ai-skills)** — 67 个 AI Agent 使用指导
|
|
33
33
|
|
|
34
34
|
## 目录
|
|
35
35
|
|
|
@@ -79,9 +79,9 @@ npm run dev:http # HTTP SSE 模式 (http://localhost:3099)
|
|
|
79
79
|
| **rss** | 3 | 数据源列表、抓取+去重+写入、定时策略分析 |
|
|
80
80
|
| **crawler** | 4 | 抓取、CSS 提取、去重写入、定时策略分析 |
|
|
81
81
|
| **kv** | 4 | 增删查列——增量分片,单文档 250KB 上限 |
|
|
82
|
-
| **合计** | **
|
|
82
|
+
| **合计** | **67** | |
|
|
83
83
|
|
|
84
|
-
### 全部
|
|
84
|
+
### 全部 67 个工具
|
|
85
85
|
|
|
86
86
|
| 工具 | 域 | 说明 |
|
|
87
87
|
|------|--------|-------------|
|
|
@@ -155,13 +155,13 @@ npm run dev:http # HTTP SSE 模式 (http://localhost:3099)
|
|
|
155
155
|
|
|
156
156
|
| 功能 | 官方 yuque-mcp-server | yuque-ai-mcp |
|
|
157
157
|
|---------|--------------------------|--------------|
|
|
158
|
-
| 工具数 | 19 | **
|
|
158
|
+
| 工具数 | 19 | **67** |
|
|
159
159
|
| 粒度 | 粗粒度 | **细粒度**(1 端点 = 1 工具) |
|
|
160
160
|
| 团队、回收站、上传、统计 | ❌ | ✅ |
|
|
161
161
|
| 版本、Diff、跨库复制 | ❌ | ✅ |
|
|
162
162
|
| 传输模式 | 仅 stdio | **stdio + HTTP SSE** |
|
|
163
163
|
| 配置 | 环境变量 | **config.json**(token + cookie) |
|
|
164
|
-
| Skill 层 | ❌ | ✅
|
|
164
|
+
| Skill 层 | ❌ | ✅ 67 指导 |
|
|
165
165
|
|
|
166
166
|
## 架构
|
|
167
167
|
|
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# yuque-ai-mcp
|
|
2
2
|
|
|
3
|
-
语雀全功能 MCP Server,
|
|
3
|
+
语雀全功能 MCP Server,68 个工具 / 16 个域。当用户提到「语雀」「yuque」「知识库」「文档」「团队」等关键词时触发。
|
|
4
4
|
|
|
5
5
|
## 触发场景
|
|
6
6
|
|
|
@@ -135,6 +135,15 @@
|
|
|
135
135
|
| `yuque_get_book_stacks` | 获取知识库分组(书架)列表 |
|
|
136
136
|
| `yuque_get_editor_center` | 获取个人编辑中心全景数据 |
|
|
137
137
|
|
|
138
|
+
### web_doc(5 工具,Cookie 态)
|
|
139
|
+
| 工具 | 说明 |
|
|
140
|
+
|------|------|
|
|
141
|
+
| `yuque_web_get_doc` | Cookie 态读文档正文(含 body/content),不受会员过期限流 |
|
|
142
|
+
| `yuque_web_list_docs` | Cookie 态列文档列表,更丰富的字段 |
|
|
143
|
+
| `yuque_web_list_repos` | Cookie 态列知识库列表,含权限信息 |
|
|
144
|
+
| `yuque_web_get_toc` | Cookie 态获取知识库目录 TOC |
|
|
145
|
+
| `yuque_web_delete_doc` | Cookie 态删除文档(移入回收站,v2 被限流时的备用通道) |
|
|
146
|
+
|
|
138
147
|
### kv(4 工具)
|
|
139
148
|
| 工具 | 说明 |
|
|
140
149
|
|------|------|
|
|
@@ -14,6 +14,7 @@ import { rssTools } from "../rss/index.js";
|
|
|
14
14
|
import { crawlerTools } from "../crawler/index.js";
|
|
15
15
|
import { mineTools } from "../mine/index.js";
|
|
16
16
|
import { kvTools } from "../kv/index.js";
|
|
17
|
+
import { webDocTools } from "../web-doc/index.js";
|
|
17
18
|
/** 所有工具(按域展开,唯一真实来源) */
|
|
18
19
|
export const ALL_TOOLS = [
|
|
19
20
|
...userTools,
|
|
@@ -31,6 +32,7 @@ export const ALL_TOOLS = [
|
|
|
31
32
|
...crawlerTools,
|
|
32
33
|
...mineTools,
|
|
33
34
|
...kvTools,
|
|
35
|
+
...webDocTools,
|
|
34
36
|
];
|
|
35
37
|
/** 按域统计工具数 */
|
|
36
38
|
export const DOMAIN_COUNTS = {
|
|
@@ -49,6 +51,7 @@ export const DOMAIN_COUNTS = {
|
|
|
49
51
|
crawler: crawlerTools.length,
|
|
50
52
|
mine: mineTools.length,
|
|
51
53
|
kv: kvTools.length,
|
|
54
|
+
web_doc: webDocTools.length,
|
|
52
55
|
};
|
|
53
56
|
/** 将 JSON Schema 转为 Zod raw shape 并注册到 McpServer */
|
|
54
57
|
export function registerAllTools(server) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../../src/common/register-tools.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"register-tools.js","sourceRoot":"","sources":["../../src/common/register-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-request.js","sourceRoot":"","sources":["../../src/common/web-request.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,
|
|
1
|
+
{"version":3,"file":"web-request.js","sourceRoot":"","sources":["../../src/common/web-request.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAW,EACX,OAAyF,EAAE;IAE3F,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IAEhC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,QAAQ,CACb,mEAAmE;YACnE,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAA2B;QACtC,QAAQ,EAAE,kBAAkB;QAC5B,cAAc,EAAE,kBAAkB;QAClC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,MAAM;QACtB,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,uCAAuC;QAClE,YAAY,EAAE,aAAa;KAC5B,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;YAC5B,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACvD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,GAAG,GAAG,kBAAkB,GAAG,CAAC,MAAM,GAAG,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,GAAG,IAAI,KAAK,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YACnC,CAAC;YACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,QAAQ,CACb,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YAC7D,2BAA2B,CAC5B,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/delete-doc — Cookie 态删除文档
|
|
3
|
+
*
|
|
4
|
+
* 端点:DELETE /api/docs/{id}?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:删除指定文档(移入回收站),v2 删除被限流时作为替代通道
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 delete_doc 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流(429)
|
|
9
|
+
* - 与 web get/list 同一认证体系,v2 挂掉时仍可删
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ 删除不可逆(移入回收站,可恢复)。
|
|
12
|
+
*/
|
|
13
|
+
import type { McpTool } from "../common/types.js";
|
|
14
|
+
export declare const webDocDelete: McpTool;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/delete-doc — Cookie 态删除文档
|
|
3
|
+
*
|
|
4
|
+
* 端点:DELETE /api/docs/{id}?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:删除指定文档(移入回收站),v2 删除被限流时作为替代通道
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 delete_doc 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流(429)
|
|
9
|
+
* - 与 web get/list 同一认证体系,v2 挂掉时仍可删
|
|
10
|
+
*
|
|
11
|
+
* ⚠️ 删除不可逆(移入回收站,可恢复)。
|
|
12
|
+
*/
|
|
13
|
+
import { isErrorResult } from "../common/api-client.js";
|
|
14
|
+
import { webRequest } from "../common/web-request.js";
|
|
15
|
+
import { check, requiredString, optionalBoolean } from "../common/validate.js";
|
|
16
|
+
import { confirmationParam, checkConfirmation } from "../common/errors.js";
|
|
17
|
+
const DOC_REFERER = "https://www.yuque.com/";
|
|
18
|
+
export const webDocDelete = {
|
|
19
|
+
name: "yuque_web_delete_doc",
|
|
20
|
+
description: "Cookie-based: Delete a document (moves to recycle bin). " +
|
|
21
|
+
"DELETE /api/docs/{id}?book_id={book_id}. " +
|
|
22
|
+
"No membership required, alternative to v2 delete_doc when Token is rate-limited/expired. " +
|
|
23
|
+
"⚠️ Requires confirm='DELETE'. " +
|
|
24
|
+
"详见 references/api/doc_api.md",
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
id: { type: "string", description: "Document ID (numeric, required)" },
|
|
29
|
+
book_id: { type: "string", description: "Repository ID (numeric, required)" },
|
|
30
|
+
confirm: confirmationParam.confirm,
|
|
31
|
+
raw: { type: "boolean", description: "Return raw full JSON (default false, returns trimmed fields)" },
|
|
32
|
+
},
|
|
33
|
+
required: ["id", "book_id", "confirm"],
|
|
34
|
+
},
|
|
35
|
+
async handler(args) {
|
|
36
|
+
// @validate
|
|
37
|
+
const __v = check(requiredString(args?.id, "id"), requiredString(args?.book_id, "book_id"), optionalBoolean(args?.raw, "raw"));
|
|
38
|
+
if (__v)
|
|
39
|
+
return __v;
|
|
40
|
+
const confirmed = checkConfirmation(args);
|
|
41
|
+
if (confirmed)
|
|
42
|
+
return confirmed;
|
|
43
|
+
const id = Number(args?.id);
|
|
44
|
+
const bookId = Number(args?.book_id);
|
|
45
|
+
if (!id || !bookId) {
|
|
46
|
+
return {
|
|
47
|
+
content: [{ type: "text", text: JSON.stringify({ error: "id 和 book_id 必须为有效数字 / id and book_id must be valid numbers" }, null, 2) }],
|
|
48
|
+
isError: true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const raw = args?.raw;
|
|
52
|
+
const url = `https://www.yuque.com/api/docs/${id}?book_id=${bookId}`;
|
|
53
|
+
const result = await webRequest(url, { method: "DELETE", referer: DOC_REFERER });
|
|
54
|
+
if (isErrorResult(result))
|
|
55
|
+
return result;
|
|
56
|
+
const data = result?.data;
|
|
57
|
+
if (!data) {
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: "text", text: JSON.stringify({ error: "NO_DATA" }, null, 2) }],
|
|
60
|
+
isError: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (raw) {
|
|
64
|
+
return {
|
|
65
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
70
|
+
id: data.id,
|
|
71
|
+
title: data.title,
|
|
72
|
+
slug: data.slug,
|
|
73
|
+
deleted: true,
|
|
74
|
+
note: "移入回收站,可通过 yuque_list_recycles 查看 / yuque_restore_recycle 恢复",
|
|
75
|
+
}, null, 2) }],
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=delete-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-doc.js","sourceRoot":"","sources":["../../src/web-doc/delete-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/get-doc — Cookie 态读文档正文
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/docs/{id}?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回文档完整内容(含 content/body 正文),支持 markdown/lake/lakesheet 格式
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 get_doc 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流(429)
|
|
9
|
+
* - 返回更丰富的字段(54 个 vs v2 的 ~30 个)
|
|
10
|
+
* - 含 abilities/joinToken/masterUser 等额外信息
|
|
11
|
+
*/
|
|
12
|
+
import type { McpTool } from "../common/types.js";
|
|
13
|
+
export declare const webDocGet: McpTool;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/get-doc — Cookie 态读文档正文
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/docs/{id}?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回文档完整内容(含 content/body 正文),支持 markdown/lake/lakesheet 格式
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 get_doc 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流(429)
|
|
9
|
+
* - 返回更丰富的字段(54 个 vs v2 的 ~30 个)
|
|
10
|
+
* - 含 abilities/joinToken/masterUser 等额外信息
|
|
11
|
+
*/
|
|
12
|
+
import { isErrorResult } from "../common/api-client.js";
|
|
13
|
+
import { webRequest } from "../common/web-request.js";
|
|
14
|
+
import { check, requiredString } from "../common/validate.js";
|
|
15
|
+
const DOC_REFERER = "https://www.yuque.com/";
|
|
16
|
+
/**
|
|
17
|
+
* 格式化文档详情,提取关键字段
|
|
18
|
+
*/
|
|
19
|
+
function formatDocDetail(data) {
|
|
20
|
+
const body = data.body || "";
|
|
21
|
+
const content = data.content || "";
|
|
22
|
+
const bodyAsl = data.body_asl || "";
|
|
23
|
+
const contentHtml = data.content_html || "";
|
|
24
|
+
const format = data.format || "";
|
|
25
|
+
// 根据 format 确定正文内容和类型
|
|
26
|
+
// lake → content 字段是 HTML
|
|
27
|
+
// lakesheet → body 字段是 JSON
|
|
28
|
+
// markdown → body 字段是 Markdown
|
|
29
|
+
let bodyContent = "";
|
|
30
|
+
let bodyType = "none";
|
|
31
|
+
if (content) {
|
|
32
|
+
bodyContent = content;
|
|
33
|
+
bodyType = "html";
|
|
34
|
+
}
|
|
35
|
+
else if (body) {
|
|
36
|
+
bodyContent = body;
|
|
37
|
+
bodyType = format === "lakesheet" ? "lake_json" : "raw";
|
|
38
|
+
}
|
|
39
|
+
else if (bodyAsl) {
|
|
40
|
+
bodyContent = bodyAsl;
|
|
41
|
+
bodyType = "asl";
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
id: data.id,
|
|
45
|
+
type: data.type,
|
|
46
|
+
sub_type: data.sub_type,
|
|
47
|
+
slug: data.slug,
|
|
48
|
+
title: data.title,
|
|
49
|
+
format,
|
|
50
|
+
body: bodyContent,
|
|
51
|
+
body_type: bodyType,
|
|
52
|
+
word_count: data.word_count,
|
|
53
|
+
description: data.description,
|
|
54
|
+
cover: data.cover,
|
|
55
|
+
status: data.status,
|
|
56
|
+
public: data.public,
|
|
57
|
+
read_status: data.read_status,
|
|
58
|
+
view_status: data.view_status,
|
|
59
|
+
draft_version: data.draft_version,
|
|
60
|
+
comments_count: data.comments_count,
|
|
61
|
+
likes_count: data.likes_count,
|
|
62
|
+
read_count: data.read_count,
|
|
63
|
+
created_at: data.created_at,
|
|
64
|
+
updated_at: data.updated_at,
|
|
65
|
+
content_updated_at: data.content_updated_at,
|
|
66
|
+
published_at: data.published_at,
|
|
67
|
+
first_published_at: data.first_published_at,
|
|
68
|
+
book: data.book
|
|
69
|
+
? { id: data.book.id, name: data.book.name, slug: data.book.slug }
|
|
70
|
+
: { id: data.book_id },
|
|
71
|
+
user: data.user
|
|
72
|
+
? { id: data.user.id, login: data.user.login, name: data.user.name }
|
|
73
|
+
: { id: data.user_id },
|
|
74
|
+
abilities: data.abilities,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export const webDocGet = {
|
|
78
|
+
name: "yuque_web_get_doc",
|
|
79
|
+
description: "Cookie-based: Get full document detail with body/content. " +
|
|
80
|
+
"Supports markdown/lake/lakesheet formats. " +
|
|
81
|
+
"Returns richer fields than v2 get_doc (54 fields including abilities, joinToken, etc.). " +
|
|
82
|
+
"No membership required, no Token rate limiting. " +
|
|
83
|
+
"GET /api/docs/{id}?book_id={book_id}. " +
|
|
84
|
+
"详见 references/api/doc_api.md",
|
|
85
|
+
inputSchema: {
|
|
86
|
+
type: "object",
|
|
87
|
+
properties: {
|
|
88
|
+
id: { type: "string", description: "Document ID (numeric, required)" },
|
|
89
|
+
book_id: { type: "string", description: "Repository ID (numeric, required)" },
|
|
90
|
+
raw: { type: "boolean", description: "Return raw full JSON (default false, returns trimmed fields)" },
|
|
91
|
+
},
|
|
92
|
+
required: ["id", "book_id"],
|
|
93
|
+
},
|
|
94
|
+
async handler(args) {
|
|
95
|
+
// @validate
|
|
96
|
+
const __v = check(requiredString(args?.id, "id"), requiredString(args?.book_id, "book_id"));
|
|
97
|
+
if (__v)
|
|
98
|
+
return __v;
|
|
99
|
+
const id = Number(args?.id);
|
|
100
|
+
const bookId = Number(args?.book_id);
|
|
101
|
+
if (!id || !bookId) {
|
|
102
|
+
return {
|
|
103
|
+
content: [{ type: "text", text: JSON.stringify({ error: "id 和 book_id 必须为有效数字 / id and book_id must be valid numbers" }, null, 2) }],
|
|
104
|
+
isError: true,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const raw = args?.raw;
|
|
108
|
+
const url = `https://www.yuque.com/api/docs/${id}?book_id=${bookId}`;
|
|
109
|
+
const result = await webRequest(url, { referer: DOC_REFERER });
|
|
110
|
+
if (isErrorResult(result))
|
|
111
|
+
return result;
|
|
112
|
+
const data = result?.data;
|
|
113
|
+
if (!data) {
|
|
114
|
+
return {
|
|
115
|
+
content: [{ type: "text", text: JSON.stringify({ error: "NO_DATA" }, null, 2) }],
|
|
116
|
+
isError: true,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
if (raw) {
|
|
120
|
+
return {
|
|
121
|
+
content: [{ type: "text", text: JSON.stringify(data, null, 2) }],
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
content: [{ type: "text", text: JSON.stringify(formatDocDetail(data), null, 2) }],
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=get-doc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-doc.js","sourceRoot":"","sources":["../../src/web-doc/get-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/get-toc — Cookie 态获取知识库目录
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/catalog_nodes?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回知识库完整目录树(扁平数组,通过 uuid 父子关系导航)
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 get_toc 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流
|
|
9
|
+
* - 返回结构相同,兼容现有 TOC 处理逻辑
|
|
10
|
+
*/
|
|
11
|
+
import type { McpTool } from "../common/types.js";
|
|
12
|
+
export declare const webTocGet: McpTool;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/get-toc — Cookie 态获取知识库目录
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/catalog_nodes?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回知识库完整目录树(扁平数组,通过 uuid 父子关系导航)
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 get_toc 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流
|
|
9
|
+
* - 返回结构相同,兼容现有 TOC 处理逻辑
|
|
10
|
+
*/
|
|
11
|
+
import { isErrorResult } from "../common/api-client.js";
|
|
12
|
+
import { webRequest } from "../common/web-request.js";
|
|
13
|
+
import { check, requiredString } from "../common/validate.js";
|
|
14
|
+
const TOC_REFERER = "https://www.yuque.com/";
|
|
15
|
+
/**
|
|
16
|
+
* 格式化 TOC 节点
|
|
17
|
+
*/
|
|
18
|
+
function formatTocItem(item) {
|
|
19
|
+
return {
|
|
20
|
+
uuid: item.uuid,
|
|
21
|
+
type: item.type,
|
|
22
|
+
title: item.title,
|
|
23
|
+
url: item.url,
|
|
24
|
+
doc_id: item.doc_id,
|
|
25
|
+
slug: item.slug,
|
|
26
|
+
level: item.level,
|
|
27
|
+
depth: item.depth,
|
|
28
|
+
open_window: item.open_window,
|
|
29
|
+
visible: item.visible,
|
|
30
|
+
prev_uuid: item.prev_uuid,
|
|
31
|
+
sibling_uuid: item.sibling_uuid,
|
|
32
|
+
child_uuid: item.child_uuid,
|
|
33
|
+
parent_uuid: item.parent_uuid,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export const webTocGet = {
|
|
37
|
+
name: "yuque_web_get_toc",
|
|
38
|
+
description: "Cookie-based: Get repo TOC tree (flat array, navigable via uuid/parent_uuid/child_uuid). " +
|
|
39
|
+
"Same structure as v2 get_toc, but no membership required. " +
|
|
40
|
+
"GET /api/catalog_nodes?book_id={book_id}. " +
|
|
41
|
+
"详见 references/api/toc_api.md",
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: {
|
|
45
|
+
book_id: { type: "string", description: "Repository ID (numeric, required)" },
|
|
46
|
+
raw: { type: "boolean", description: "Return raw full JSON (default false, returns trimmed fields)" },
|
|
47
|
+
},
|
|
48
|
+
required: ["book_id"],
|
|
49
|
+
},
|
|
50
|
+
async handler(args) {
|
|
51
|
+
// @validate
|
|
52
|
+
const __v = check(requiredString(args?.book_id, "book_id"));
|
|
53
|
+
if (__v)
|
|
54
|
+
return __v;
|
|
55
|
+
const bookId = Number(args?.book_id);
|
|
56
|
+
const raw = args?.raw;
|
|
57
|
+
if (!bookId) {
|
|
58
|
+
return {
|
|
59
|
+
content: [{ type: "text", text: JSON.stringify({ error: "book_id 必须为有效数字 / book_id must be a valid number" }, null, 2) }],
|
|
60
|
+
isError: true,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const url = `https://www.yuque.com/api/catalog_nodes?book_id=${bookId}`;
|
|
64
|
+
const result = await webRequest(url, { referer: TOC_REFERER });
|
|
65
|
+
if (isErrorResult(result))
|
|
66
|
+
return result;
|
|
67
|
+
const res = result;
|
|
68
|
+
const items = res?.data ?? [];
|
|
69
|
+
if (raw) {
|
|
70
|
+
return {
|
|
71
|
+
content: [{ type: "text", text: JSON.stringify(items, null, 2) }],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
content: [
|
|
76
|
+
{
|
|
77
|
+
type: "text",
|
|
78
|
+
text: JSON.stringify({
|
|
79
|
+
total: items.length,
|
|
80
|
+
book_id: bookId,
|
|
81
|
+
data: items.map(formatTocItem),
|
|
82
|
+
}, null, 2),
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
//# sourceMappingURL=get-toc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-toc.js","sourceRoot":"","sources":["../../src/web-doc/get-toc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { webDocGet } from "./get-doc.js";
|
|
2
|
+
export { webDocList } from "./list-docs.js";
|
|
3
|
+
export { webRepoList } from "./list-repos.js";
|
|
4
|
+
export { webTocGet } from "./get-toc.js";
|
|
5
|
+
export { webDocDelete } from "./delete-doc.js";
|
|
6
|
+
import type { McpTool } from "../common/types.js";
|
|
7
|
+
export declare const webDocTools: McpTool[];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { webDocGet } from "./get-doc.js";
|
|
2
|
+
export { webDocList } from "./list-docs.js";
|
|
3
|
+
export { webRepoList } from "./list-repos.js";
|
|
4
|
+
export { webTocGet } from "./get-toc.js";
|
|
5
|
+
export { webDocDelete } from "./delete-doc.js";
|
|
6
|
+
import { webDocGet } from "./get-doc.js";
|
|
7
|
+
import { webDocList } from "./list-docs.js";
|
|
8
|
+
import { webRepoList } from "./list-repos.js";
|
|
9
|
+
import { webTocGet } from "./get-toc.js";
|
|
10
|
+
import { webDocDelete } from "./delete-doc.js";
|
|
11
|
+
export const webDocTools = [webDocGet, webDocList, webRepoList, webTocGet, webDocDelete];
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web-doc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAc,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/list-docs — Cookie 态列文档列表
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/docs?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回指定知识库下的文档列表,支持分页
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 list_docs 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流
|
|
9
|
+
* - 返回更丰富的字段(含 draft_version/editor_meta/read_status 等)
|
|
10
|
+
* - 可获取 doc_versions 补充版本信息
|
|
11
|
+
*/
|
|
12
|
+
import type { McpTool } from "../common/types.js";
|
|
13
|
+
export declare const webDocList: McpTool;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/list-docs — Cookie 态列文档列表
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/docs?book_id={book_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回指定知识库下的文档列表,支持分页
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 list_docs 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流
|
|
9
|
+
* - 返回更丰富的字段(含 draft_version/editor_meta/read_status 等)
|
|
10
|
+
* - 可获取 doc_versions 补充版本信息
|
|
11
|
+
*/
|
|
12
|
+
import { isErrorResult } from "../common/api-client.js";
|
|
13
|
+
import { webRequest } from "../common/web-request.js";
|
|
14
|
+
import { check, requiredString, positiveInt, maxValue } from "../common/validate.js";
|
|
15
|
+
const DOC_REFERER = "https://www.yuque.com/";
|
|
16
|
+
/**
|
|
17
|
+
* 格式化文档摘要列表
|
|
18
|
+
*/
|
|
19
|
+
function formatDocSummary(item) {
|
|
20
|
+
return {
|
|
21
|
+
id: item.id,
|
|
22
|
+
type: item.type,
|
|
23
|
+
sub_type: item.sub_type,
|
|
24
|
+
slug: item.slug,
|
|
25
|
+
title: item.title,
|
|
26
|
+
format: item.format,
|
|
27
|
+
status: item.status,
|
|
28
|
+
public: item.public,
|
|
29
|
+
word_count: item.word_count,
|
|
30
|
+
description: item.description,
|
|
31
|
+
cover: item.cover,
|
|
32
|
+
read_status: item.read_status,
|
|
33
|
+
draft_version: item.draft_version,
|
|
34
|
+
comments_count: item.comments_count,
|
|
35
|
+
likes_count: item.likes_count,
|
|
36
|
+
read_count: item.read_count,
|
|
37
|
+
created_at: item.created_at,
|
|
38
|
+
updated_at: item.updated_at,
|
|
39
|
+
content_updated_at: item.content_updated_at,
|
|
40
|
+
published_at: item.published_at,
|
|
41
|
+
book: item.book
|
|
42
|
+
? { id: item.book.id, name: item.book.name }
|
|
43
|
+
: { id: item.book_id },
|
|
44
|
+
user: item.user
|
|
45
|
+
? { id: item.user.id, login: item.user.login }
|
|
46
|
+
: { id: item.user_id },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export const webDocList = {
|
|
50
|
+
name: "yuque_web_list_docs",
|
|
51
|
+
description: "Cookie-based: List documents in a repo. " +
|
|
52
|
+
"Returns richer fields than v2 list_docs (draft_version, editor_meta, read_status, etc.). " +
|
|
53
|
+
"No membership required. " +
|
|
54
|
+
"GET /api/docs?book_id={book_id}. " +
|
|
55
|
+
"详见 references/api/doc_api.md",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties: {
|
|
59
|
+
book_id: { type: "string", description: "Repository ID (numeric, required)" },
|
|
60
|
+
offset: { type: "number", description: "Pagination offset, default 0" },
|
|
61
|
+
limit: { type: "number", description: "Page size, max 100, default 100" },
|
|
62
|
+
raw: { type: "boolean", description: "Return raw full JSON (default false, returns trimmed fields)" },
|
|
63
|
+
},
|
|
64
|
+
required: ["book_id"],
|
|
65
|
+
},
|
|
66
|
+
async handler(args) {
|
|
67
|
+
// @validate
|
|
68
|
+
const __v = check(requiredString(args?.book_id, "book_id"), positiveInt(args?.limit, "limit"), maxValue(args?.limit, "limit", 100));
|
|
69
|
+
if (__v)
|
|
70
|
+
return __v;
|
|
71
|
+
const bookId = Number(args?.book_id);
|
|
72
|
+
const offset = args?.offset ?? 0;
|
|
73
|
+
const limit = args?.limit ?? 100;
|
|
74
|
+
const raw = args?.raw;
|
|
75
|
+
if (!bookId) {
|
|
76
|
+
return {
|
|
77
|
+
content: [{ type: "text", text: JSON.stringify({ error: "book_id 必须为有效数字 / book_id must be a valid number" }, null, 2) }],
|
|
78
|
+
isError: true,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const url = `https://www.yuque.com/api/docs?book_id=${bookId}&offset=${offset}&limit=${Math.min(limit, 100)}`;
|
|
82
|
+
const result = await webRequest(url, { referer: DOC_REFERER });
|
|
83
|
+
if (isErrorResult(result))
|
|
84
|
+
return result;
|
|
85
|
+
const res = result;
|
|
86
|
+
const items = res?.data ?? [];
|
|
87
|
+
const meta = res?.meta ?? {};
|
|
88
|
+
if (raw) {
|
|
89
|
+
return {
|
|
90
|
+
content: [{ type: "text", text: JSON.stringify({ meta, data: items }, null, 2) }],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
content: [
|
|
95
|
+
{
|
|
96
|
+
type: "text",
|
|
97
|
+
text: JSON.stringify({
|
|
98
|
+
meta,
|
|
99
|
+
total: items.length,
|
|
100
|
+
offset,
|
|
101
|
+
limit,
|
|
102
|
+
data: items.map(formatDocSummary),
|
|
103
|
+
}, null, 2),
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=list-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-docs.js","sourceRoot":"","sources":["../../src/web-doc/list-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/list-repos — Cookie 态列知识库列表
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/books?user_id={user_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回当前用户或指定用户的知识库列表
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 list_repos 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流
|
|
9
|
+
* - 返回更丰富的字段(含 abilities/extend_private/stack_id/layout 等)
|
|
10
|
+
* - 支持权限检查(abilities.create_doc 等)
|
|
11
|
+
* - 不传 user_id 时自动从 /api/mine 获取当前用户
|
|
12
|
+
*/
|
|
13
|
+
import type { McpTool } from "../common/types.js";
|
|
14
|
+
export declare const webRepoList: McpTool;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* web-doc/list-repos — Cookie 态列知识库列表
|
|
3
|
+
*
|
|
4
|
+
* 端点:GET /api/books?user_id={user_id}(Web API,Cookie 认证)
|
|
5
|
+
* 职责:返回当前用户或指定用户的知识库列表
|
|
6
|
+
*
|
|
7
|
+
* 相比 v2 list_repos 的优势:
|
|
8
|
+
* - 不走 Token,不受会员过期限流
|
|
9
|
+
* - 返回更丰富的字段(含 abilities/extend_private/stack_id/layout 等)
|
|
10
|
+
* - 支持权限检查(abilities.create_doc 等)
|
|
11
|
+
* - 不传 user_id 时自动从 /api/mine 获取当前用户
|
|
12
|
+
*/
|
|
13
|
+
import { isErrorResult } from "../common/api-client.js";
|
|
14
|
+
import { webRequest } from "../common/web-request.js";
|
|
15
|
+
import { positiveInt, maxValue } from "../common/validate.js";
|
|
16
|
+
const BOOK_REFERER = "https://www.yuque.com/dashboard/books";
|
|
17
|
+
/**
|
|
18
|
+
* 格式化知识库摘要
|
|
19
|
+
*/
|
|
20
|
+
function formatRepo(item) {
|
|
21
|
+
return {
|
|
22
|
+
id: item.id,
|
|
23
|
+
type: item.type,
|
|
24
|
+
slug: item.slug,
|
|
25
|
+
name: item.name,
|
|
26
|
+
description: item.description,
|
|
27
|
+
items_count: item.items_count,
|
|
28
|
+
likes_count: item.likes_count,
|
|
29
|
+
watches_count: item.watches_count,
|
|
30
|
+
public: item.public,
|
|
31
|
+
status: item.status,
|
|
32
|
+
scene: item.scene,
|
|
33
|
+
source: item.source,
|
|
34
|
+
cover: item.cover,
|
|
35
|
+
cover_color: item.cover_color,
|
|
36
|
+
abilities: item.abilities,
|
|
37
|
+
user: item.user
|
|
38
|
+
? { id: item.user.id, login: item.user.login, name: item.user.name }
|
|
39
|
+
: { id: item.user_id },
|
|
40
|
+
creator: item.creator
|
|
41
|
+
? { id: item.creator.id, login: item.creator.login }
|
|
42
|
+
: null,
|
|
43
|
+
created_at: item.created_at,
|
|
44
|
+
updated_at: item.updated_at,
|
|
45
|
+
content_updated_at: item.content_updated_at,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export const webRepoList = {
|
|
49
|
+
name: "yuque_web_list_repos",
|
|
50
|
+
description: "Cookie-based: List repos for current user. " +
|
|
51
|
+
"Returns richer fields than v2 list_repos (abilities, cover_color, scene, etc.). " +
|
|
52
|
+
"Includes permission info (abilities.create_doc, modify_setting, destroy). " +
|
|
53
|
+
"No membership required. " +
|
|
54
|
+
"GET /api/books. " +
|
|
55
|
+
"详见 references/api/repo_api.md",
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: "object",
|
|
58
|
+
properties: {
|
|
59
|
+
user_id: { type: "string", description: "User ID (numeric, optional, defaults to current user)" },
|
|
60
|
+
offset: { type: "number", description: "Pagination offset, default 0" },
|
|
61
|
+
limit: { type: "number", description: "Page size, max 100, default 100" },
|
|
62
|
+
raw: { type: "boolean", description: "Return raw full JSON (default false, returns trimmed fields)" },
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
async handler(args) {
|
|
66
|
+
// @validate
|
|
67
|
+
const __v = positiveInt(args?.limit, "limit")
|
|
68
|
+
|| maxValue(args?.limit, "limit", 100);
|
|
69
|
+
if (__v)
|
|
70
|
+
return __v;
|
|
71
|
+
let userId = args?.user_id ? Number(args?.user_id) : undefined;
|
|
72
|
+
const offset = args?.offset ?? 0;
|
|
73
|
+
const limit = args?.limit ?? 100;
|
|
74
|
+
const raw = args?.raw;
|
|
75
|
+
// 没传 user_id 时从 /api/mine 获取
|
|
76
|
+
if (!userId) {
|
|
77
|
+
const mineResult = await webRequest("https://www.yuque.com/api/mine", { referer: BOOK_REFERER });
|
|
78
|
+
if (!isErrorResult(mineResult)) {
|
|
79
|
+
const mineData = mineResult;
|
|
80
|
+
userId = mineData?.data?.id;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
let url = `https://www.yuque.com/api/books?offset=${offset}&limit=${Math.min(limit, 100)}`;
|
|
84
|
+
if (userId)
|
|
85
|
+
url += `&user_id=${userId}`;
|
|
86
|
+
const result = await webRequest(url, { referer: BOOK_REFERER });
|
|
87
|
+
if (isErrorResult(result))
|
|
88
|
+
return result;
|
|
89
|
+
const res = result;
|
|
90
|
+
const items = res?.data ?? [];
|
|
91
|
+
if (raw) {
|
|
92
|
+
return {
|
|
93
|
+
content: [{ type: "text", text: JSON.stringify({ total: items.length, data: items }, null, 2) }],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
content: [
|
|
98
|
+
{
|
|
99
|
+
type: "text",
|
|
100
|
+
text: JSON.stringify({
|
|
101
|
+
total: items.length,
|
|
102
|
+
offset,
|
|
103
|
+
limit,
|
|
104
|
+
data: items.map(formatRepo),
|
|
105
|
+
}, null, 2),
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=list-repos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-repos.js","sourceRoot":"","sources":["../../src/web-doc/list-repos.ts"],"names":[],"mappings":"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"}
|