ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

anything-to-notebooklm 飞书文档读取 MCP 服务器:从飞书文档到 Markdown 的全自动转换实践

anything-to-notebooklm 飞书文档读取 MCP 服务器:从飞书文档到 Markdown 的全自动转换实践 AI 技能AI 应用【免费下载链接】anything-to-notebooklmClaude Skill: Multi-source content processor for NotebookLM. Supports WeChat articles, web pages, YouTube, PDF, Markdown, search queries → Podcast/PPT/MindMap/Quiz etc.项目地址https://gitcode.com/GitHub_Trending/an/qiaomu-anything-to-notebooklm点击查看免费下载本文以feishu-read-mcp/README.md为主体深入讲解 anything-to-notebooklm 仓库中飞书文档读取 MCP 服务器的完整使用方案安装部署、MCP 工具调用、Python 库集成、图片下载处理、并发与超时等高级配置并结合src/下的源码实现剖析其底层抓取、解析与转换原理。读完本文你将能够把任意飞书文档公开或需登录一键转换为保留标题层级、列表、表格、代码块、引用与图片的 Markdown并将其接入 Claude Code / NotebookLM 内容管线。一、它是什么飞书文档 → Markdown 的 MCP 服务器feishu-read-mcp是 anything-to-notebooklm 项目内的一个独立子模块实现了一个符合 MCPModel Context Protocol标准的服务器核心能力是读取飞书文档并转换为 Markdown 格式同时自动下载文档内图片到本地。在仓库总览 README.md 的项目结构中它与wexin-read-mcp并列作为多源内容处理器Anything → NotebookLM的文档读取层之一典型用途是配合深度分析模式将 NotebookLM 生成的分析结果以 Markdown 形式写回飞书文档。从源码看整个模块由四个组件构成feishu-read-mcp/src/组件文件职责MCP 入口server.py基于 FastMCP 暴露read_feishu_doc、get_doc_info两个工具抓取器scraper.py基于 Playwright 无头浏览器加载飞书文档提取标题、作者、正文 HTML 与图片 URL解析器parser.py用 BeautifulSoup 将 HTML 解析为结构化内容块再渲染成 Markdown图片处理器image_handler.py基于 aiohttp 并发下载图片支持格式校验、压缩优化与本地存储依赖清单见 feishu-read-mcp/requirements.txtfastmcp0.2.0、playwright1.40.0、aiohttp3.9.0、aiofiles23.0.0、beautifulsoup44.12.0、lxml4.9.0、Pillow10.0.0、aiohttp-client-cache0.6.0。二、安装部署1. 安装 Python 依赖pip install -r requirements.txt2. 安装 Playwright 浏览器抓取飞书文档依赖 Chromium 无头浏览器playwright install chromium3. 配置 MCP在 Claude Code 配置文件中注册 MCP 服务器将args中的路径替换为仓库内server.py的绝对路径{ mcpServers: { feishu-reader: { command: python, args: [ /path/to/feishu-read-mcp/src/server.py ] } } }配置完成后重启 Claude Code即可在对话中直接调用feishu-reader提供的工具。4. 一键安装脚本仓库还提供了 install.sh自动完成三步安装检查python3/pip3→ 安装 Python 依赖与 Chromium → 创建/tmp/feishu_docs、/tmp/feishu_images两个临时目录并在结尾对FeishuScraper、FeishuParser、ImageHandler三个模块做导入自检最后打印 MCP 配置示例。三、使用方式方式一作为 MCP 工具使用server.py通过FastMCP(feishu-reader)注册了两个工具feishu-read-mcp/src/server.py#L32-L1171. 读取飞书文档read_feishu_doc(url, cookies_str?)result await read_feishu_doc(https://bytedance.feishu.cn/docs/docc/xxx)返回结构源码 feishu-read-mcp/src/scraper.py#L271-L280 实际返回字段{ success: True, # 是否成功 title: 文档标题, author: 作者, content: # 文档标题\n\n这是文档内容..., # Markdown 格式正文 images: {原始URL: 本地路径}, # 原始URL → 本地路径映射字典 word_count: 1500, # 字数统计 image_count: 2, # 图片数量 url: 原始URL }说明successFalse时返回{success: False, error: str}。参数cookies_str为可选的 cookie 字符串格式为key1value1; key2value2用于读取需要登录的文档以及下载需要认证的图片源码 feishu-read-mcp/src/server.py#L33-L41。工具内部会对 URL 做校验仅接受包含feishu.cn或feishu.com的地址feishu-read-mcp/src/server.py#L57-L61。2. 获取文档信息get_doc_info(url)只获取基本信息不下载正文内容info await get_doc_info(https://bytedance.feishu.cn/docs/docc/xxx){ success: True, title: 文档标题, author: 作者, word_count: 1500, image_count: 2 }get_doc_info在服务启动时即创建全局单例FeishuScraper并复用内部通过networkidle等待页面加载完成用document.body.innerText估算字数、用document.querySelectorAll(img).length估算图片数feishu-read-mcp/src/scraper.py#L291-L340。方式二直接作为 Python 库使用不通过 MCP在自有代码中直接实例化抓取器支持异步上下文管理器自动完成 Playwright 初始化与清理from src.scraper import FeishuScraper # 读取文档 async with FeishuScraper() as scraper: result await scraper.fetch_doc(https://bytedance.feishu.cn/docs/docc/xxx) print(result[content]) print(f下载了 {len(result[images])} 张图片)此外scraper.py还导出了两个便捷函数feishu-read-mcp/src/scraper.py#L448-L469from src.scraper import fetch_feishu_doc, get_feishu_doc_info result await fetch_feishu_doc(url, cookies_strkey1value1; key2value2) info await get_feishu_doc_info(url)模块内部同时支持相对导入与绝对导入from .scraper import ...失败时回退到from scraper import ...因此既可作为包feishu-read-mcp/src/导入也可将src目录加入sys.path后直接运行。四、支持的输入与输出格式输入格式✅ 飞书文档feishu.cn / feishu.com✅ 公开文档✅ 需要登录的文档通过cookies_str参数传入 Cookie输出格式Markdown 保留能力✅ Markdown.md✅ 保留标题层级H1–H6✅ 保留列表结构有序 / 无序✅ 保留表格✅ 保留代码块含语言标注✅ 保留图片转换为本地路径✅ 保留链接✅ 保留引用图片处理✅ 自动下载图片✅ 支持 JPG、PNG、GIF、WebP 等格式✅ 图片优化压缩、格式转换✅ 本地存储默认/tmp/feishu_images/五、源码级解析抓取到 Markdown 的完整流水线FeishuScraper.fetch_doc()是整条管线的核心其执行流程feishu-read-mcp/src/scraper.py#L99-L289可拆解为 10 个步骤无头浏览器启动chromium.launch(headlessTrue)携带--no-sandbox、--disable-setuid-sandbox、--disable-dev-shm-usage、--disable-gpu等参数feishu-read-mcp/src/scraper.py#L55-L88创建 1920×1080 视口的浏览器上下文注入 Chrome 120 的 User-Agent并把cookies_str按;拆分解析为.feishu.cn域下的 cookie 列表。页面导航page.goto(url, wait_untildomcontentloaded, timeout60000)首次等待 60 秒。初始等待wait_for_timeout(5000)等待 5 秒再尝试等待页面上的.loading、.spinner等加载指示器消失超时 10 秒失败仅告警不中断。提取标题与作者优先取page.title()失败则通过h1、.document-title、.title、[data-testidtitle]等选择器兜底作者则尝试.author、.creator、[data-testidauthor]、.user-avatarfeishu-read-mcp/src/scraper.py#L342-L405。等待动态渲染完成以document.body.innerText长度超过 500 字符为内容就绪信号最长轮询 30 秒每秒检查一次。提取正文 HTML优先使用body.innerText按双换行/单换行切分重组段落过滤少于 10 字符的短段落、超过 300 字符的长段落按单换行二次拆分再依次尝试div[contenteditabletrue]、.larkui-theme-default、.document、.feishu-docs-content、.page-container、.wiki-page、main、[data-docx-id]等容器选择器若均无命中则回退到body *中文本量最大的容器feishu-read-mcp/src/scraper.py#L157-L245。提取图片 URL遍历所有img兼容src/data-src/data-lazy-src属性相对路径补全为绝对地址过滤 URL 中含icon、avatar、logo、favicon的小图标并去重feishu-read-mcp/src/scraper.py#L407-L444。结构化解析交给FeishuParser.parse_html()转为内容块列表。并发下载图片ImageHandler.download_images()返回{原始URL: 本地路径}映射。生成 Markdown 与统计parser.generate_markdown(blocks, image_map)渲染 Markdownword_count按去掉换行与空格后的正文长度统计。六、解析器HTML → 结构化块 → MarkdownFeishuParserfeishu-read-mcp/src/parser.py使用BeautifulSoup(html, html.parser)遍历p、h1-h6、ul、ol、blockquote、pre、table、img、a元素将其解析为带type标签的结构化块再逐块渲染 Markdownfeishu-read-mcp/src/parser.py#L235-L308内容块类型Markdown 渲染规则heading#× level 空格 文本paragraph直接输出清理后的文本list有序列表1. item无序列表- itemquote每行前加code三个反引号围栏语言从language-*class 自动检测无则空table\| 表头 \|\| --- \|分隔线 数据行imagealt通过image_map将原始 URL 映射为本地路径link文本与 URL 相同时输出href否则text表格解析支持thead/tbody结构也兼容无tbody的直接tr遍历feishu-read-mcp/src/parser.py#L129-L168。此外还提供extract_text(blocks)抽取纯文本、extract_images(blocks)抽取图片 URL 两个辅助方法便于下游做文本统计或预处理。七、图片处理流水线下载、校验、优化与清理ImageHandlerfeishu-read-mcp/src/image_handler.py承担全部图片工作关键设计如下存储与命名默认目录/tmp/feishu_images/启动时自动mkdir(parentsTrue, exist_okTrue)文件名由 URL 的 MD5 哈希 扩展名组成同名图片重复下载时直接复用本地文件feishu-read-mcp/src/image_handler.py#L107-L114。扩展名识别按 URL 路径后缀匹配.jpg/.jpeg/.png/.gif/.webp/.svg/.bmp无后缀时默认.png。认证与异常处理HTTP 401/403 判定为需要认证跳过下载并返回原始 URL 兜底非 200 状态同样返回原 URLfeishu-read-mcp/src/image_handler.py#L117-L124避免单个失败拖垮整批。有效性校验文件大小须在 100 字节 ~ 10MB 之间并按文件头魔数校验格式PNG、JPEG\xff\xd8\xff、GIF、WebPRIFF、BMP。优化压缩超过 1MB 的图片用 Pillow 打开RGBA 模式先贴白底转 RGB再缩略到最大 1920×1080LANCZOS 重采样以 JPEG 质量 85 optimize 保存feishu-read-mcp/src/image_handler.py#L203-L241。并发下载默认asyncio.Semaphore(5)限制最多 5 个并发任务配合asyncio.gather(..., return_exceptionsTrue)保证单个任务异常不中断整体feishu-read-mcp/src/image_handler.py#L68-L91。定时清理cleanup()会删除image_dir中修改时间超过 7 天的旧图片。八、高级配置以下配置均可通过直接修改对应源码常量实现图片存储路径默认存储在/tmp/feishu_images/可在代码中实例化后调整image_handler ImageHandler() image_handler.image_dir Path(/custom/path/to/images)对应源码字段为 feishu-read-mcp/src/image_handler.py#L28-L30。并发控制默认最多并发 5 个图片下载任务。README 中说明可通过修改scraper.py中的 semaphore 调整从当前源码看信号量实际定义在 feishu-read-mcp/src/image_handler.py#L70 的download_images()内semaphore asyncio.Semaphore(10) # 改为 10超时设置默认下载超时 30 秒连接超时 10 秒修改 feishu-read-mcp/src/image_handler.py#L30 中的ClientTimeoutself.timeout ClientTimeout(total60, connect20) # 改为 60 秒九、完整示例示例 1读取简单的飞书文档from src.scraper import fetch_feishu_doc result await fetch_feishu_doc( https://bytedance.feishu.cn/docs/docc/abc123 ) if result[success]: print(f标题: {result[title]}) print(f作者: {result[author]}) print(f内容:\n{result[content]}) print(f图片: {result[images]}) else: print(f错误: {result[error]})示例 2批量处理多个文档from src.scraper import FeishuScraper async def batch_process(urls): async with FeishuScraper() as scraper: for url in urls: result await scraper.fetch_doc(url) # 处理结果...示例 3自定义图片处理from src.image_handler import ImageHandler async def download_with_custom_handler(urls): handler ImageHandler() handler.image_dir Path(./my_images) # 自定义目录 image_map await handler.download_images(urls) return image_map十、测试验证仓库提供了独立测试脚本 feishu-read-mcp/test.py可执行python test.py运行 4 项自测测试基本导入验证FeishuScraper、FeishuParser、ImageHandler三个模块可正常导入测试爬虫初始化实例化FeishuScraper并完成init()/cleanup()生命周期测试解析器用一段含标题、段落、列表的 HTML 验证parse_html()能解析出内容块且generate_markdown()能生成正确 Markdown测试图片处理器验证ImageHandler初始化及默认目录/tmp/feishu_images创建。十一、故障排除问题 1Playwright 安装失败# 卸载并重新安装 pip uninstall playwright pip install playwright # 安装浏览器 playwright install chromium问题 2图片下载失败按顺序检查网络连接、图片 URL 是否可访问、临时目录权限。部分图片若返回 401/403说明需要登录态应通过cookies_str传入 Cookie源码会跳过认证错误并回退返回原始 URLls -la /tmp/feishu_images/问题 3文档加载超时增加页面加载超时时间对应 feishu-read-mcp/src/scraper.py#L114 的page.goto超时参数await page.goto(url, wait_untilnetworkidle, timeout120000) # 改为 120 秒此外正文内容等待上限为 30 秒以 body 文本超 500 字符为就绪信号图片下载总超时 30 秒均可按上文「高级配置」对应调整。十二、在 anything-to-notebooklm 中的定位从根目录 README.md 的项目结构可以看出feishu-read-mcp是整个任何内容 → NotebookLM管线中的飞书文档读取层。它的典型落地场景是你深度分析这篇微信文章并写入飞书 https://mp.weixin.qq.com/s/abc123 AI 自动执行 ✓ MCP 浏览器模拟抓取微信文章 ✓ 上传到 NotebookLM ✓ 生成 10 个问题并递归提问 ✓ 格式化为飞书 Markdown ✓ 自动创建飞书文档 ✅ 结果飞书文档已创建含完整问答对应 CLI 用法为python main.py ./book.epub --deep-analysis --to-feishu。此时feishu-read-mcp的价值在于它先把飞书端已有的内容无损地读成结构化 Markdown供 NotebookLM 分析反过来又通过 MCP 工具把 AI 生成的结果写回飞书文档从而打通飞书文档 ↔ AI 分析的双向链路。十三、许可证feishu-read-mcp采用 MIT License允许个人学习与二次开发使用。赞分享AI 技能AI 应用【免费下载链接】anything-to-notebooklmClaude Skill: Multi-source content processor for NotebookLM. Supports WeChat articles, web pages, YouTube, PDF, Markdown, search queries → Podcast/PPT/MindMap/Quiz etc.项目地址https://gitcode.com/GitHub_Trending/an/qiaomu-anything-to-notebooklm点击查看免费下载相关推荐SGLang构建下一代企业级大模型服务的五大架构范式演进SGLang构建下一代企业级大模型服务的五大架构范式演进 在人工智能技术快速迭代的今天企业部署大规模语言模型面临着前所未有的挑战。SGLang作为面向生产环模型推理服务推理引擎人工智能大模型本地部署多模态飞书文档转Markdown轻松实现文档格式无缝转换飞书文档转Markdown轻松实现文档格式无缝转换 还在为飞书文档的格式转换问题而烦恼每次复制粘贴都要重新调整格式既浪费时间又影响效率现在通过飞书文档开发工具CLI飞书文档转Markdown神器5分钟搞定高效文档转换飞书文档转Markdown神器5分钟搞定高效文档转换 还在为飞书文档导出格式混乱而烦恼feishu2md正是你需要的终极解决方案这款专业的飞书文档转换工具开发工具CLI上一篇LeetCode 148 链表排序Sort List全解数组转换、递归与迭代归并排序三种解法下一篇CANN ops-transformer MaskedCausalConv1dBackward 算子深度指南masked 因果一维分组卷积反向梯度的 aclnn 接口与实现解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表