本机 (原「书源工坊」)。App 内不调用任何模型、不保存任何模型密钥。书源的制作、修复和调试全部由外部 MCP 客户端完成。
概要
本机 (原「书源工坊」)。App 内不调用任何模型、不保存任何模型密钥。书源的制作、修复和调试全部由外部 MCP 客户端完成。 - 包名:com.mina.legadostudio - 当前版本:1.1.003(versionCode 182) - 许可证:GPL-3.0 - 上游致谢:DandanLLab/legadoSkill、LegadoTeam/legado - 下载:Releases(每个版本附带已签名 APK) iOS 简约白风格:液态玻璃顶栏/底栏(高斯模糊)、大圆角卡片、底部悬浮标签栏。底栏为 。 验证中心运行时提供圆形 字悬浮球:可自由拖动到任意位置,松手时若靠近屏幕左右边缘会自动吸附并半隐一半(点按展开);人工验证 alert 气泡弹出时自动贴边完整显示,不打断当前 App 操作。 MCP 页分三个页签:(服务开关 / 接入信息 / 健康检查)、(端口、令牌、书源类型、外观)、(通知、电池策略、端口占用等)。 1. 底栏 →「连接」页签开启服务(默认端口 ) 2. 「接入信息」卡按你的客户端界面形态给出对应填法,每一项都可一键复制: - :http://127.0.0.1:58823/mcp;客户端不在同一台设备时切「局域网」,使用 http:// :58823/mcp - 客户端有 → 只粘贴令牌本身,不要加 Bearer 前缀 - 客户端只有 → 名称填 Authorization,值填 Bearer (名称填成 Bearer 是常见错误,会 401) - 客户端没有任何鉴权输入 → 在「设置」页关闭访问令牌校验,或换用支持鉴权的客户端 - :标准 mcpServers JSON(Claude Code / Cline / Cherry Studio 等)整段复制 3. 鉴权统一使用 MCP 规范的标准头: 4. 调用 get_app_info,应返回 "ai": false、"role": "mcp-runtime" 与语料库信息 MCP 页可选择目标书源类型:(对应 Legado bookSourceType -1、0–4)。
README
阅读书源 MCP
本机 Legado 运行时 + MCP Server(原「书源工坊」)。App 内不调用任何模型、不保存任何模型密钥。书源的制作、修复和调试全部由外部 MCP 客户端完成。
- 包名:
com.mina.legadostudio - 当前版本:
1.1.003(versionCode 182) - 许可证:GPL-3.0
- 上游致谢:DandanLLab/legadoSkill、LegadoTeam/legado
- 下载:Releases(每个版本附带已签名 APK)
界面
iOS 简约白风格:液态玻璃顶栏/底栏(高斯模糊)、大圆角卡片、底部悬浮标签栏。底栏为 MCP / 书源 / 技能 / 验证中心 / 日志。
验证中心运行时提供圆形 M 字悬浮球:可自由拖动到任意位置,松手时若靠近屏幕左右边缘会自动吸附并半隐一半(点按展开);人工验证 alert 气泡弹出时自动贴边完整显示,不打断当前 App 操作。
连接 MCP
MCP 页分三个页签:连接(服务开关 / 接入信息 / 健康检查)、设置(端口、令牌、书源类型、外观)、前置条件(通知、电池策略、端口占用等)。
- 底栏 MCP →「连接」页签开启服务(默认端口 58823)
- 「接入信息」卡按你的客户端界面形态给出对应填法,每一项都可一键复制:
- 服务器链接(所有客户端):
http://127.0.0.1:58823/mcp;客户端不在同一台设备时切「局域网」,使用http://:58823/mcp - 客户端有 Token / Bearer Token 输入框 → 只粘贴令牌本身,不要加
Bearer前缀 - 客户端只有 自定义请求头(名称 + 值)两个框 → 名称填
Authorization,值填Bearer(名称填成Bearer是常见错误,会 401) - 客户端没有任何鉴权输入 → 在「设置」页关闭访问令牌校验,或换用支持鉴权的客户端
- 「配置文件客户端(高级)」折叠卡:标准
mcpServersJSON(Claude Code / Cline / Cherry Studio 等)整段复制
- 服务器链接(所有客户端):
- 鉴权统一使用 MCP 规范的标准头:
Authorization: Bearer - 调用
get_app_info,应返回"ai": false、"role": "mcp-runtime"与语料库信息
书源类型开关
MCP 页可选择目标书源类型:自动 / 文本 / 音频 / 图片 / 文件 / 视频(对应 Legado bookSourceType -1、0–4)。
save_source保存书源时自动写入所选类型;选「自动」时不写入,保留 JSON 原样;fetch_page按类型过滤二进制内容:文本类型跳过图片/音视频/压缩包等二进制响应(返回bodyNote/binaryBytes说明),非文本类型保留对应媒体内容;「自动」不干预抓取,适合图文漫画混合等类型不确定的站点。
MCP 工具一览
| 分组 | 工具 |
|---|---|
| 语料 / 知识 / 技能 | match_sources get_corpus_source get_corpus_shard search_knowledge read_knowledge list_skills get_skill get_skill_reference |
| 任务上下文 | create_context get_context list_contexts update_context clear_context read_page read_result |
| 抓取与解析 | fetch_page analyze_html inspect_rule eval_js |
| 书源 | validate_source list_sources get_source save_source export_source debug_source check_source list_projects get_project delete_projects |
| 验证与 Cookie | browser_verify get_verification_status get_domain_modes set_domain_mode get_cookies set_cookie clear_cookies |
| 状态与日志 | get_app_info app_status set_http_log_recording get_http_logs get_http_log get_logs get_log get_crash_logs get_crash_log get_diagnostic_snapshots get_diagnostic_snapshot capture_once webview_capture list_captures get_capture poll_capture get_capture_resource |
制作流程
match_sources 语料命中(同域/同模板族现成书源)
→ create_context 建任务,全程显式传 contextId
→ fetch_page 抓页存快照;read_page / inspect_rule / analyze_html / eval_js 在快照上作业
→ 编写 BookSource JSON → debug_source 逐阶段调试(正文→目录→详情→搜索→发现)
→ check_source(refresh=true) 全程实时验收
→ save_source 保存,get_source 回读确认
save_source 默认按书源 URL 覆盖更新同站记录;需要保留历史版本时传 newVersion=true 追加。技能包 legado-book-source 内置完整工作流与参考文档:get_skill 读主文件,get_skill_reference 分页读参考(语料 / 验证 / 基础 / 排障 / JS API 等),search_knowledge → read_knowledge 查验证码、编码、Web JS 逆向(方法论 / 入门 SOP / 进阶对抗 / 书源迁移四篇专题)等知识库;另附《书源 JS 入门教程》知识包(零基础语法到书源 `` 实战),技能参考文档同步收录。
eval_js 与书源 JS 环境
eval_js 与书源 `` / {{}} 段运行在 vendored 官方 Rhino + analyzeRule 引擎上,除 java(ajax/connect/加解密)外还注入官方同名对象:cookie(getCookie/getKey/setCookie/replaceCookie/removeCookie)、cache(put/get/delete/putMemory/getFromMemory,进程内有效)、source(put/get/getVariable/setVariable,debug_source 时与书源变量互通)。java.getStringList(...) 返回真正的 JS Array(可 .length / .map / 下标访问),与官方阅读一致。规则链路全程保留元素对象:CSS/XPath 子规则在列表元素自身上求值,裸 @attr(如 chapterUrl: "@href")取当前节点属性;多段落 @text 按官方语义 join 全部段落。
set_cookie 默认 merge=true 按 Cookie 名合并(不会冲掉该域其他 Cookie,如登录态),merge=false 为整串替换。
验收闭环
validate_source 检查联动完整性:searchUrl 必须配 ruleSearch.bookList、exploreUrl 必须配 ruleExplore.bookList,缺一直接判非法。check_source 在书源含 searchUrl 而未传 searchKey 时,自动用关键词「我」探测搜索链路并在 warnings 标注——搜索结果页结构与列表页常常是两套 DOM,漏验会导致真机搜索零结果;正式验收请显式传 searchKey 并配 refresh=true。
语料命中(省 token 第一步)
内置 26861 个现成书源,按内容规则签名聚成 1838 个模板族(同族 = 同 CMS / 同模板结构):
match_sources(域名或站名):返回i(序号)、d(域名)、f(族 ID)、t(类型)、g(特征位掩码:CookieJar / 登录 / 验证码 / Cloudflare / 禁用等);- 命中同域 →
get_corpus_source(i)取完整书源做底本最小修改; - 未命中同域 →
get_corpus_shard(f)读同族 ≤6 个最完整代表样例,参考结构改写; - 都未命中才走
fetch_page探索。语料样例改写通常比抓页探索省一个数量级调用。
验证中心(验证码 / CF / WAF)
遇到站点验证时,MCP 工具返回结构化 JSON 而不是裸错误,按 status 行动:
| status | 含义与行动 |
|---|---|
verification_required |
需要人工验证:browser_verify(url, waitSec=90) 阻塞等待用户在验证中心完成,完成后自动取证并返回 evidence;随后重试原工具 |
webview_mode_enabled |
该域已自动切换 WebView 抓取(fetch_page 已原地重试一次,autoRetried=true 时本次即成功结果) |
- 每域验证模式:
get_domain_modes/set_domain_mode(domain, auto|always|webview)。always适合「一搜一验、URL 次次不同」的站点——这类站点缓存 Cookie 无效,每次都走人工验证;验证完成但evidence.marker仍非空说明每次访问都要验,同样设always。 - 同一域的等待中验证会话自动复用,不会重复创建。
- WebView 通道的 Cookie 与 OkHttp 通道 TLS 指纹不一致(如
cf_clearance):系统对被 JS 盾拦截的站点自动改用 WebView 通道抓取,而不是把无效 Cookie 灌进规则。 - 成品源在官方阅读 App 内过盾靠书源
loginCheckJs+java.startBrowserAwait,与调试期验证中心互补。
图文验证码(image_code)
部分站点在搜索/详情页弹出纯图片验证码(输字符进框,非滑块/点选)。这一链路已闭环:
- 书源 JS 内
java.getVerificationCode(imageUrl)会挂起当前调用:App 把图片下载回本地,在验证中心弹出「看图输字符」会话,用户输入答案后自动把答案写回、原 JS 继续跑; - MCP 侧
browser_verify(url, imageUrl=...)同样可发起 image_code 会话(直接传验证码图 URL,不必先走网页);get_verification_status轮询到answered后取answer字段; - image_code 会话不采 Cookie(图片验证不建立登录态),验证中心按
kind区分 image_code / challenge 两类入口,UI 分别渲染「图片+输入框」与「WebView 内嵌页」。
并行多书源
同时制作多个书源时:
- 每个任务各自
create_context并全程显式传contextId,任务间缓存、引用、笔记完全隔离; - 未传
contextId时使用每条 MCP 连接各自的默认上下文,多客户端同时连接不会串数据; - 调试缓存按调用传入(无全局锁),多个书源可同时
debug_source而不互相等待; - 书源页「导入至阅读」支持最多 4 个书源同时排队待导入,新导入不会顶掉尚未被阅读拉取的端点。
书源与技能
书源页按站点域名分组,组内按保存时间倒序展开。每个书源版本支持点击查看格式化 JSON 详情(全屏独立滚动、支持文本自由选中复制),并在版本操作栏提供「复制源」一键写入剪贴板及「导入至阅读」。技能页可查看内置 Skill 并控制启用/停用(停用后对 MCP 不可见);自定义 Skill 支持新增、导入、导出和删除。save_skill / delete_skill 不能改写内置 Skill。
日志与诊断
底栏 日志 分五段:操作日志 / HTTP / 抓包 / 崩溃 / 诊断快照。可多选删除。
- 操作日志与 HTTP 日志均采用吸顶日期切换栏(一天一页),支持左右按天翻看与弹窗跳选日期;
- HTTP 记录含时间、状态码与耗时;自动过滤本地回环与私网探测流量,点击进入全屏详情页(请求/响应头、正文、重定向链),详情页内滚动与列表互不影响,系统返回键只关闭详情、回到列表;打开详情时隐藏底部标签栏;
- HTTP 列表停留在顶部时自动跟随最新记录,翻历史时不被打断;
- 「抓包」页签是三个独立页的入口:「逐次抓包」表单发一次请求并看逐跳结果;「浏览器抓包」是可见可交互的 WebView;「抓包会话历史」按
cap:contextId分组持久化(逐次/可见浏览器/无头 webview 三类,重启可回看),分页加载 + 按抓包 ID 全库精确查找;该页并可开关 HTTP 事务记录;抓包事务不进入 HTTP 标签、不参与锚点分桶与按天导出; - 抓包引擎对
application/octet-stream等无明确 MIME 的响应用魔数嗅探(PNG/JPEG/GIF/WebP/WOFF/WOFF2/zip 等)自动归类,字体/封面图落盘为二进制资源而不是文本乱码; - 操作日志与 HTTP 日志支持按天导出为文本(经系统分享发给电脑/AI 排查),导出含请求/响应头与正文;
- 诊断快照只含版本、MCP 状态和前置条件,不含 HTTP 或崩溃正文。
排查请用 MCP:get_logs / get_log / get_http_logs / get_http_log / get_crash_logs / get_crash_log / get_diagnostic_snapshots / get_diagnostic_snapshot。
抓包取证链路(cap: 会话,与上述普通 HTTP 日志隔离):capture_once 发单次请求并逐跳记录重定向(中间跳为 originKind=capture_hop);webview_capture 一次性无头 WebView 抓包(OkHttp 供给/观察证据,非 WebView 原生网络栈抓包;跑完即销毁、不可交互);用户在「浏览器抓包」页的可见交互会话同样以 cap:contextId 入库。AI 侧读取:list_captures 找会话(kind 如实区分逐次/可见浏览器/无头/未知)→ get_capture(contextId) 分页回看,活会话 poll_capture(contextId, afterLogId) 增量拉新 → get_http_log(id) 看单条详情 → 字体/图片等落盘二进制用 get_capture_resource(logId) 分片读取。日志与摘要含完整 URL/query,可能带令牌等敏感参数,分享前请自行检查。
构建说明见 BUILDING.md。
任务上下文
使用 create_context 创建任务,后续调用传入 contextId。fetch_page 保存网页并返回 pageId;相同 method+URL+body(含 POST 搜索)在 5 分钟内复用快照,只返回引用。正文通过 read_page 分段或搜索,也可直接交给 inspect_rule、analyze_html、eval_js(传 pageId 即可,免传 HTML)。工具结果超过 12000 字符自动转 resultId + 预览,用 read_result 分段取回,不重复执行原工具;list_contexts 可列出当前任务与占用,不返回正文。
update_context 保存阶段笔记,重连后使用 get_context 恢复目录与进度,完成后 clear_context。上限 16 个任务(LRU 兜底:满员时自动回收最久未用的空闲任务,不顶掉正在被引用的)、每任务 32 项 / 200 万字符 / 单项 100 万字符;快照 5 分钟内新鲜、闲置 30 分钟过期。上下文持久化到应用私有目录(memory + snapshot):进程重启后自动恢复,但恢复条目标记 stale,先 refresh=true 刷新再依赖其内容。MCP 令牌、User-Agent 或书源类型变化会使旧引用失效;它不自动读取、总结或裁剪客户端的聊天历史。
fetch_page 支持 responseMode=reference(不回传正文,仅存快照)与 maxChars(预览大小)进一步省流量;debug_source / check_source 默认复用本任务快照,最终验收传 refresh=true 全程实时;调试输出有意截断(正文 4000 字符、目录 20 章、搜索 10 条等),均带全量计数字段。
MCP 会话按 Mcp-Session-Id 统计:clientCount 只计最近 60 秒内发生过真实工具调用的活跃会话(客户端保活/心跳流量不计入),任务停止后自动掉出计数。会话活跃度只由真实工具调用刷新:闲置超过 reapIdleSeconds(默认 1800 秒)即由 McpSessions 主动关闭释放(客户端再请求会收到 404 并重新握手),不再长期占用。app_status 同时返回 sessionTotal(累计建立)、sessionClosed、sessionReaped(已回收)、reapIdleSeconds。
インストール
This server does not publish a one-line install command.
Open the repository installation guide