本项目旨在演示如何构建一个简单的 Node.js 应用来抓取特定网站的 AI 新闻,并重点展示如何与假设的 "MCP" (根据文件名 mcp-client.js, firecrawl-server/, cline_mcp_settings.json 推断的系统或服务名称) 进行交互。
主要流程包括:
- 从
https://ai-bot.cn/daily-ai-news/获取每日 AI 新闻的 HTML 内容。 - 解析 HTML,提取关键信息(标题、内容摘要)。
- 将提取的数据格式化为结构化的 JSON 卡片。
- 提供独立运行的能力,同时也设计为可被 MCP 服务集成或通过 MCP 客户端调用,以此作为学习和实践 MCP 集成方法的案例。
注意: "MCP" 的具体性质和功能基于项目中的文件命名推测,实际交互细节需参考 mcp-client.js 和 firecrawl-server/ (如果存在并包含实现代码)。
- 新闻抓取: 使用
axios从目标网站获取 HTML。 - HTML 解析: 利用
cheerio库解析 DOM,提取新闻数据。包含多种解析策略以提高兼容性。 - 数据格式化: 将提取的新闻结构化为 JSON 对象数组(新闻卡片)。
- 数据持久化: 将中间处理结果 (
crawl-results.json) 和最终输出 (ai-news-cards.json) 保存为文件。 - 运行模式:
- 独立脚本: 可直接通过
node运行firecrawl-ai-news.js进行一次性抓取和处理。 - 模块集成 (MCP 学习重点):
firecrawl-ai-news.js导出fetchDailyAINews函数,设计为可被其他 Node.js 应用(如mcp-client.js或firecrawl-server/中的服务)导入和调用,模拟与 MCP 系统的集成。
- 独立脚本: 可直接通过
mcp/
├── .git/ # Git 版本控制元数据
├── firecrawl-server/ # (推测) 包含 MCP 服务端实现的目录
├── node_modules/ # Node.js 依赖库
├── ai-news-cards.json # 输出:格式化的新闻卡片 JSON
├── ai-news.html # (可能) 示例或测试用的原始 HTML 文件
├── cline_mcp_settings.json # (推测) 特定环境(cline)的 MCP 配置文件
├── crawl-results.json # 中间输出:原始 HTML 或提取的新闻条目 JSON
├── firecrawl-ai-news.js # 主要脚本:获取 HTML,调用格式化模块
├── firecrawl-ai-news-formatter.js # 核心逻辑:解析 HTML,格式化数据
├── mcp-client.js # (推测) 用于与 MCP 服务交互的客户端脚本
├── package-lock.json # 锁定依赖版本
├── package.json # 项目配置文件,定义依赖等
└── README.md # 项目说明文档 (本文档)
- 核心: Node.js
- 主要依赖:
axios: HTTP 请求库,用于获取网页 HTML。cheerio: HTML 解析库,用于提取新闻内容。puppeteer: 浏览器自动化库 (具体用途需检查firecrawl-server/或其他脚本,可能用于更复杂的抓取或 MCP 相关任务)。
- 确保已安装 Node.js 和 npm。
- 克隆仓库 (如果尚未克隆)。
- 进入项目目录并安装依赖:
cd mcp npm install
直接执行主脚本来抓取和处理新闻:
node firecrawl-ai-news.js该命令会:
- 访问
https://ai-bot.cn/daily-ai-news/。 - 处理获取到的 HTML。
- 将格式化的新闻卡片打印到控制台。
- 更新
crawl-results.json和ai-news-cards.json文件。
firecrawl-ai-news.js 被设计为可以集成到其他 Node.js 应用中,特别是与 MCP 相关的客户端或服务端。
它导出一个异步函数 fetchDailyAINews:
// 示例:在另一个脚本 (如 mcp-client.js 或 firecrawl-server/ 中的服务) 中调用
const { fetchDailyAINews } = require('./firecrawl-ai-news'); // 假设在同级目录
async function getAndProcessNewsForMCP() {
try {
console.log("正在为 MCP 获取和处理 AI 新闻...");
const newsCards = await fetchDailyAINews();
console.log(`成功获取 ${newsCards.length} 条新闻卡片。`);
// 在这里可以添加将 newsCards 发送给 MCP 服务或进行其他 MCP 相关操作的逻辑
// 例如:mcpApi.submitNews(newsCards);
return newsCards;
} catch (error) {
console.error("MCP 新闻处理失败:", error);
// 添加 MCP 相关的错误处理逻辑
}
}
// 调用示例
getAndProcessNewsForMCP();通过这种方式,可以将新闻抓取功能嵌入到更复杂的 MCP 工作流中。具体的 MCP 交互逻辑需要查看和实现 mcp-client.js 或 firecrawl-server/ 中的代码。
ai-news-cards.json: 包含一个 JSON 对象数组,每个对象代表一条新闻卡片,具有以下字段:source: 新闻来源 URL。title: 新闻标题。content: 新闻内容摘要(限制长度)。status: 处理状态 ("ok", "warning" 等)。timestamp: 处理时间戳 (ISO 格式)。hasError: 是否出错 (通常为 false)。errorMessage: 错误信息 (通常为 null)。
crawl-results.json: 包含处理过程中的中间数据。初始可能包含抓取的原始 HTML,之后会被提取出的新闻条目数组覆盖(结构类似ai-news-cards.json但可能字段略有不同)。
检查 cline_mcp_settings.json 文件以了解是否存在特定于 "cline" 环境的 MCP 相关配置。
mcp-client.js 和 firecrawl-server/ 目录预计包含了与 MCP 系统交互的具体实现。需要进一步分析这些文件来理解其功能和如何配置/运行 MCP 相关的客户端或服务端。