AeternaLabsHQ/pullmd
Self-hosted URL- and file-to-Markdown service for humans and AI agents - web pages, documents, images, audio, YouTube. PWA + REST + MCP + Claude Code skill, Reddit-aware, refreshable share links.
PullMD – 自托管 URL 转 Markdown 服务
是什么
- 一个自托管的 Web 服务,可获取网页(或多种其他媒体类型)并返回干净、高效的 Markdown 文档。
- 专为需要在线内容简洁、结构化表示的人类和 AI 代理设计。
核心功能
| 功能 | 详情 |
|---|---|
| 网页提取 | 采用级联流程:Cloudflare 原生 Markdown → Mozilla Readability → Trafilatura → (回退)通过 Playwright 使用无头 Chromium。可完整处理 Reddit 和 Hacker News 线程及评论树。 |
| 文档转换(v3) | 支持上传或通过 URL 提供 PDF、Word/PowerPoint/Excel、EPUB 等文件。可选 OCR 层(?pdf=ocr)可生成高质量表格。 |
| 媒体处理 | 图像 → 生成字幕;音频 → 转录;YouTube URL → 提取标题、描述和带时间戳的转录文本。所有功能由您配置的任意 OpenAI 兼容视觉/语音识别端点驱动。 |
| 输出格式 | Markdown 正文仅包含 # 标题 + 内容。所有元数据(源 URL、获取日期、作者、子版块、点赞数、OCR/模型使用情况等)均存储在 YAML 前置元数据块中,可通过 PULLMD_FRONTMATTER_FIELDS 进行裁剪以降低 LLM 流水线的 token 使用量。 |
| 可共享 ID | 每次转换都会分配一个 8 位十六进制 ID。GET /s/:id 返回缓存的 Markdown,并在超过一小时后自动刷新。 |
| API 表面 | • GET /api?url=… – 一次性转换(仅限网页)。• POST /api/file – 上传文档、图像或音频进行转换。• POST /mcp – 用于无状态流式传输的 MCP(Claude 兼容)端点。 |
| 认证 | 三种模式:disabled(开放)、single-admin(单管理员)、multi-user(自助注册)。管理员可通过提供的 CLI 管理用户。 |
| 安全 | 内置 SSRF 保护,阻止私有、回环、链路本地和云元数据地址。可通过 PULLMD_ALLOWED_HOSTS 白名单化主机。 |
| 可扩展性 | 可通过 PULLMD_SITE_RECIPES 添加站点特定的“配方”(JSON-LD 转前置元数据、自定义选择器等)。 |
| 监控 | 侧车健康端点(GET /api/status)在渲染器(Playwright、MarkItDown 等)宕机时返回 503。 |
如何运行
- Docker Compose(推荐) – 从 Docker Hub 拉取预构建的多架构镜像,通过单条命令启动:
无需mkdir pullmd && cd pullmd curl -O https://raw.githubusercontent.com/AeternaLabsHQ/pullmd/main/docker-compose.yml docker compose up -d # 服务监听 http://localhost:3000.env文件;合理默认值已内嵌。通过在 compose 文件旁创建.env文件可覆盖任意设置。 - 可选侧车 – 该堆栈包含三个辅助容器:
pullmd-trafilatura– Trafilatura 提取服务。pullmd-playwright– 用于 JS 富集页面的无头 Chromium/Firefox/WebKit 渲染器(增加约 3.7 GB 镜像缓存)。若仅需静态提取,可省略。pullmd-markitdown– 文档转 Markdown 转换器(PDF/Office/EPUB 必需)。禁用文档转换可省略。
- 本地开发 – 克隆仓库,运行
npm install,然后npm start。
配置亮点(在 .env 文件中设置)
PUBLIC_URL– 帮助页面和可下载的 Claude 技能中使用的公共源地址。PULLMD_AUTH_MODE–disabled/single-admin/multi-user。PULLMD_ADMIN_EMAIL/PULLMD_ADMIN_PASSWORD– 启动管理员凭据。PULLMD_VISION_API_KEY,PULLMD_STT_API_KEY– 通过任意 OpenAI 兼容视觉/语音识别端点启用图像字幕或音频转录。PULLMD_PDF_OCR_API_KEY– 启用 PDF 的高级 OCR 层(?pdf=ocr)。PULLMD_FRONTMATTER_FIELDS– 白名单化前置元数据字段,以降低 LLM 流水线的 token 使用量。DISABLE_PUBLIC_HISTORY– 隐私优先部署中隐藏全局转换历史。PULLMD_ALLOWED_HOSTS– 若需绕过默认 SSRF 阻止获取内部主机,可将其加入白名单。
对 AI/LLM 工作流的意义
- Token 效率:通过将所有元数据移至前置元数据块并最小化正文,可将 Markdown 直接输入 LLM,避免重复 URL 或时间戳浪费上下文。
- 代理就绪:MCP 端点允许 Claude 风格代理通过流式兼容 HTTP 调用请求转换。
- 自托管控制:基本网页提取无需第三方 API 密钥,确保数据私密且成本可预测。
- 可扩展媒体处理:图像和音频可实时生成字幕/转录,对多模态代理非常有用。
典型用法
# 单次网页转 Markdown
curl "http://localhost:3000/api?url=https://example.com"
# 上传 PDF 进行转换(需要 markitdown 侧车)
curl -F file=@report.pdf http://localhost:3000/api/file
# 通过 ID 获取可共享 Markdown
curl http://localhost:3000/s/1a2b3c4d
许可证 – AGPL-3.0(参见 LICENSE)。
以上所有细节均直接取自仓库的 README;未推断任何额外功能。
相关
- 项目
- 项目
- Dispatch
- 项目
- 项目