# Content Extract MCP MVP 归档记录 ## 1. 归档目的 本文档用于记录当前 MVP 阶段已经完成的能力、实现边界、验证结果和已知限制。 当前结论:MCP 这一层不再负责生成摘要,而是只负责将网页或标准化 `item` 提取为结构化文章内容,再把结果交给上层 LLM 做摘要、分类和知识判断。 --- ## 2. 当前 MVP 的目标与边界 当前 MVP 实现的是阅读流中的第 2 步前半段: `RSS / 页面来源 -> Content Extract MCP -> 结构化文章 JSON -> LLM 摘要` ### 2.1 当前 MCP 负责的事情 - 接收单个 URL - 接收标准化 `item` - 抓取网页 HTML - 抽取标题 - 抽取正文纯文本 - 返回结构化文章对象 - 返回质量标记和结构化错误 ### 2.2 当前 MCP 不负责的事情 - RSS 聚合 - 摘要生成 - 主题分类 - 价值判断 - 规则过滤 - 知识库入库 - 推送通知 这意味着: 当前实现已经把“内容提取”这一层从整条流水线中独立出来,成为一个可被 LLM 或自动化编排系统复用的能力模块。 --- ## 3. 当前实现的服务定位 当前项目虽然目录名仍然沿用了 `summary_mcp`,但实际职责已经调整为: `Content Extraction MCP` 也就是: - MCP 负责内容提取 - LLM 负责总结摘要 - 规则引擎负责过滤 - sink 负责入库与推送 这比早期“让 MCP 直接产出摘要”的思路更合理,因为职责边界更清楚,也更利于后续替换模型和 prompt。 --- ## 4. 当前工具接口 当前 MCP 暴露两个 tool: - `extract_url_content` - `extract_item_content` ### 4.1 `extract_url_content` 用途: - 直接输入 URL - 适合单条文章调试 - 适合上层 Agent 在没有标准化 `item` 时直接调用 ### 4.2 `extract_item_content` 用途: - 输入标准化 `item` - 适合与上游 RSS 聚合层对接 - 保留 `item_id`、`source_id` 等追踪信息 --- ## 5. 当前输出结构 当前 MCP 输出的核心对象是结构化文章,而不是摘要结果。 关键字段包括: - `extract_id` - `item_id` - `source_id` - `url` - `title` - `author` - `published_at` - `language` - `content_kind` - `plain_text` - `quality_flags` - `metadata` - `pipeline_state` 其中: - `plain_text` 是给上层 LLM 的核心输入 - `quality_flags` 用于后续过滤参考 - `metadata` 里包含当前提取来源和抽取器信息 --- ## 6. 当前代码结构 当前目录结构如下: ```text src/summary_mcp/ server.py core/ content_loader.py errors.py extractor.py mapper.py normalizer.py pipeline.py quality_checker.py summarizer.py models/ document.py item.py summary_io.py ``` ### 6.1 当前核心模块职责 - `server.py` - MCP 服务入口 - 注册 `extract_url_content` / `extract_item_content` - `normalizer.py` - 统一 `url` 输入和 `item` 输入 - `content_loader.py` - 负责正文来源选择和回源抓取 - `extractor.py` - 负责标题提取和正文抽取 - `quality_checker.py` - 负责生成质量标记 - `mapper.py` - 负责将结果映射为结构化文章对象 - `pipeline.py` - 负责串联整条提取流程 ### 6.2 当前遗留项 - `core/summarizer.py` 仍保留在仓库中,但已经不再属于当前 MCP 的主流程 - 包名 `summary_mcp` 和项目名 `summary-mcp` 仍然沿用了早期命名,后续建议重命名为更符合职责的名称 --- ## 7. 当前技术选型 当前 MVP 使用: - Python - MCP Python SDK (`FastMCP`) - `httpx` 进行网络抓取 - `trafilatura` 进行正文抽取 - `beautifulsoup4` 作为 HTML 解析和兜底手段 - `pydantic` 定义输入输出模型 设计原则是: - 外层 MCP - 内层 extraction core - 上层 LLM 单独负责总结和判断 --- ## 8. 当前验证结果 ### 8.1 语法与结构验证 已执行: - `python -m compileall src` 结果: - 当前 Python 源码可以通过语法编译检查 ### 8.2 真实 URL 提取验证 已使用以下参考文章进行了真实提取测试: - 验证结果: - URL 抓取成功 - 标题提取成功 - 正文抽取成功 - 输出返回结构化 JSON - `quality_flags` 正常生成 - `metadata` 中记录了 `content_source=fetched_html` 和 `extractor=trafilatura` 输出文件: - `outputs/read-flow-2026.extracted.json` ### 8.3 LLM 摘要链路验证 已基于提取结果生成: - `outputs/llm-summary-prompt.txt` - `outputs/result.json` 验证结果: - LLM 可基于提取结果生成结构化摘要 JSON - 在 prompt 收紧后,`summary` 长度和 `keywords/topics` 区分已达到预期 --- ## 9. 当前 MVP 已经达成的结论 当前 MVP 已经证明以下链路是成立的: 1. 参考文章 URL 可以被 MCP 成功提取为结构化内容 2. 提取结果可以独立保存为 JSON 文件 3. JSON 文件可以被上层 LLM 消费 4. LLM 可以输出稳定的摘要结构 5. “MCP 负责提取,LLM 负责摘要” 这一职责拆分是可行的 这意味着: 当前 MVP 的核心目标已经完成。 --- ## 10. 已知限制 当前实现仍存在以下限制: - 还没有正式的 JSON Schema 校验器去验证 LLM 输出 - 还没有批量处理能力 - 还没有与 RSS 聚合层正式对接 - 还没有接规则过滤器 - 还没有接知识库 sink - 还没有移除遗留的 `summarizer.py` - 项目命名和职责命名仍存在历史包袱 --- ## 11. 下一阶段建议 后续建议按以下顺序推进: 1. 为 LLM 输出增加 schema 校验 2. 将提取结果与摘要结果串成标准化流水线 3. 接入 RSS 聚合层 4. 引入规则过滤 5. 接入知识库 sink 或 webhook 6. 最后再考虑与 OpenClaw 的进一步编排整合 --- ## 12. 当前阶段一句话归档结论 当前 MVP 已经完成“内容提取 MCP”这一独立能力层:能够将文章 URL 或标准化 item 提取为结构化 JSON,并稳定交给上层 LLM 做摘要与后续处理。