本文经原作者授权转载,版权归原作者所有。原作者:知野(@knoYee_)。查看原文 →


相信大家是不是和我一样:

早上起来先刷 45 分钟推特,想看看有什么前沿资讯,结果淹没在一堆噪音中。

费尽心思,才找到两三篇可以细品的优质文章。

放进收藏里,再打开就不知道是什么时候了。

Article image

因此,我搭了一个每天早晨自动跑的 Research Agent。

Codex 驱动的。

跑了快两个月,分享一下详细的搭建过程和关键判断。

它的工作流程是:

  • 在我碰任何信息源之前,Codex 已经替我把跟我工作相关的来源扫完,
  • 过滤掉噪声,综合成一份结构化、五分钟能读完的 brief,
  • 直接写进 Obsidian 库。
Article image

我醒来坐下,就可以直接进入工作状态。

Codex CLI + MCP + n8n。

我们需要把这三者串起来,这个工作流才能跑下去。

接下来是详细搭建流程。

从零搭一遍。

它实际做什么?

Article image

1. 来源监控

按你配置的清单读每一个信息源:

  • 行业新闻、竞争对手网站、学术论文、newsletter、YouTube 频道研究内容、播客文字稿、GitHub 仓库、Reddit 子版块……

2. 信号过滤

按你定的标准分信号和噪声。

  • 竞争对手发了新产品——信号。
  • 一篇复述上周内容的博客——噪声。

过滤层决定了 brief 是真正有用,还是所有信息的缩短版。

3. 综合分析

不列 bullet points 交差。

写成结构化叙述:

  • 发生了什么、为什么值得关注、跟你已知的事有什么关联、你可以怎么应对。

4. 自动投递

每天定时把 brief 放到 Obsidian 库的指定位置。

不靠手动触发。

四项串起来,45 分钟信息搜集变成 5 分钟阅读。

四个组件

1. Codex CLI

智能层兼执行层。
  • 读来源里的原始信息,用你给的标准过滤重要内容,综合成结构化 brief,通过 MCP 直接读写 Obsidian 库。
  • 不需要 Desktop 界面。
  • 终端里的一个命令就能跑。

这是 Codex 做这件事最顺手的地方:

它生来就是命令行工具,定时任务、文件读写、MCP 调用都是原生能力。

2. Brave Search MCP

实时搜索能力。
  • 有了它,能搜索实时网页,获取指定主题的最新动态。
  • 免费层每月 2000 次查询,每天跑一次完全够用。

API key 在这里获取:

https://brave.com/search/api

3. 配置 Codex 的 MCP

在 Codex 配置文件里加这两段:

{ "mcpServers": { "filesystem": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-filesystem", "/path/to/obsidian/vault" ] }, "brave-search": { "command": "npx", "args": [ "-y", "@modelcontextprotocol/server-brave-search" ], "env": { "BRAVE_API_KEY": "your-key" } } } }

  • 第一,能访问实时信息源。
  • 第二,能把结果写回你的本地知识库。
  1. 搜索能力解决输入。
  2. Filesystem MCP 解决输出。

二者接上,Research Agent 才不是聊天机器人,而是一个能持续工作的早报系统。

4. n8n

整个系统的调度心脏。

每天在你设定的时间触发 Research Agent,把 prompt 和背景信息一起传给 Codex,接收输出,保存到库。

可以自托管在每月约 5 美元的小服务器上。

  • DigitalOcean 开一个基础 Ubuntu droplet,SSH 进去,npm 装 n8n,配成 service。

第一次搭大约半小时。

之后所有自动化工作流都可以复用这套基础设施。

5. CODEX.md

Article image
CODEX.md 是研究和决策背景。

这个文件决定了 brief 是跟你个人相关,还是任何人都能读的泛泛总结。

它告诉 Codex 四件事:

  • 你是谁。
  • 你关心什么。
  • 你已经知道什么。
  • 你现在正在做什么。

第一步:写 CODEX.md

这一步做对还是做废,直接决定产出质量。

在 Obsidian 库里创建:

Research Agent Context

  • 我是谁
  • [名字、角色、所做的工作]
  • 我的主要关注领域
  • [具体列出需要跟踪的主题、行业、领域]
  • 对我来说什么算重要新闻
  • [具体。不是“AI 新闻”,而是“Codex CLI 更新、新 MCP server 发布、多 Agent 框架、AI Agent 安全进展”]
  • 我的竞争格局
  • [你监控的具体公司、人物和产品]
  • 我已经非常熟悉的内容
  • [有深厚经验的领域——只需要真正重要的新动态,不要入门覆盖]
  • 我目前正在做什么
  • [活跃项目。相关新闻可以直接转化为行动。每周更新。]
  • 我信任的来源
  • [值得优先处理的具体 publication、newsletter、researcher、YouTube 频道、subreddit]
  • 我明确不想看到的内容
  • [你领域里常出现但浪费时间的主题。泛 AI 炒作文章、重复内容、不关心的公司公告。]
  • Brief 格式偏好
  • [你希望输出怎么组织]
  • “我明确不想看到的内容”是大多数人会跳过的章节,也是最有用的一章。

写清楚了,过滤更激进,brief 只留真正可能行动的信号。

信息来源也要配。

Brave Search 给覆盖面,但最有价值的信息源——特定研究员博客、竞品发布页——需要直接列出来。

写进“我信任的来源”,加上具体指令。

比如:

  • “每日检查 HN 首页 AI 与开发者工具相关内容。”
  • “每周扫 arxiv.org/cs.AI 本周重要论文。”

第二步:写 research prompt

Article image

这是每天早晨运行的核心 prompt,放在 n8n 工作流里发给 Codex:

你是我的个人 research agent。请生成我的晨间简报。

先读我库里 CODEX.md 的 research context。

然后执行以下流程:

步骤 1:主要主题搜索

对 research context 中每个关注领域,搜索过去 24 小时重要动态。

步骤 2:信号过滤

纳入:

  • 我关注的公司或工具发的新产品 / 重大更新
  • 会改变我们对某领域理解的研究发现
  • 竞争对手的战略行动
  • 影响我所在领域的监管或政策变化
  • 值得了解的新工具、框架、技术

排除:

  • “明确不想看到”章节中注明的任何内容
  • 复述 48 小时前已发布信息的二次内容
  • 没有新增信息的观点文章
  • 不关注的公司的公告
  • 缺乏具体可行动细节的泛 AI 炒作
  • 某分类没有重要事发生,直接写“今天没有”,不填充

步骤 3:竞争情报

专门搜竞争格局中列出的公司和人物。

突出战略转变、新品发布。

步骤 4:综合输出

严格按以下格式:

晨间简报 - [DATE]

生成时间:[TIME]

今天最重要的一件事

[今天最重要的单项动态。一段说明它为什么对你重要。]

发生了什么

[3-7 项。每项含来源 / 公司 / 主题、发生了什么、为什么跟你的工作有关。每项 1-3 句。]

竞争动态观察

[竞争格局中的重要行动。无则写“今天没有重要动态”。]

可采取的行动

[1-3 个具体行动。只有真正可行动时才写。]

深入阅读

[与今天首要事项相关的 2-3 篇完整文章链接]

重要格式规则:

  • 整份 brief 五分钟能读完
  • 每一项必须直接对应 research context 中的某个内容
  • 不填充,不闪烁其辞
  • 重要就说清楚为什么重要
  • 今天新闻平淡,直接说明平淡
  • 保存到:BRIEFINGS/[YYYY-MM-DD]-morning-brief.md

第三步:搭 n8n 工作流

五个节点。

节点 1:Schedule Trigger

设为早上 6 点。

在你打开电脑前,brief 已经生成好了。

周一至周五:

0 6 * * 1-5

包含周末:

0 6 * * *

节点 2:Read File

读取库里 CODEX.md 的完整内容。

节点 3:Code

把 prompt 和 CODEX.md 内容拼成 API 请求:

const codexMd = $node["Read CODEX.md"].json.content; const today = new Date().toISOString().split('T')[0]; const time = new Date().toLocaleTimeString(); const systemPrompt = `你是个人 research agent。 今天是 ${today},当前时间 ${time}。 可通过 Brave Search MCP 访问实时搜索,请充分使用。 用户的 CODEX.md research context: ${codexMd}`; return { model: "gpt-5-codex", max_tokens: 4096, messages: [ { role: "system", content: systemPrompt }, { role: "user", content: "请按 research context 中规定的格式和指令,生成我的晨间研究简报。" } ] };

节点 4:HTTP Request

调用 OpenAI API:

URL: https://api.openai.com/v1/chat/completions Method: POST Headers: Authorization: Bearer [你的 OPENAI_API_KEY] Content-Type: application/json

Body 使用节点 3 的输出。

节点 5:Write File

把结果写进 Obsidian 库:

const response = $node["Codex API Call"].json; const content = response.choices[0].message.content; const date = new Date().toISOString().split('T')[0]; return { filename: `${date}-morning-brief.md`, content: content };

路径指向:

/your/vault/path/BRIEFINGS/${date}-morning-brief.md

可选节点 6:Telegram 通知

brief 投递后,手机收到提醒。

你甚至可以在起床前先看完。

第四步:接上反馈回路

Article image

这是整个系统里最容易被跳过、但决定 brief 是越跑越准还是越跑越烂的一步。

每次读完 brief,花两分钟在文件底部写标注:

我对这份 Brief 的笔记

[哪些有用、哪些是噪声、缺了什么]

  • 每周日,让 Codex 读过去一周所有 brief 和你的标注,更新 CODEX.md。
  • 持续产出信号的来源,提权。
  • 持续产生噪声的主题,加进“不想看到”清单。
  • 反复缺失的信息类型,补充搜索关键词。
  • 被标记为“有用”的内容模式,记录为明确偏好。

有了这个回路,到第三个月,brief 对你的信息需求会比第一周校准得准确得多。

扩展方向

  • 1. 主题深挖

哪天 brief 里出现重大动态,扔进 deeper research 队列。

队列处理器自动对该主题跑一次全面 research,生成详细分析笔记,不等到第二天。

  • 2. 竞争情报即时提醒

配一条轻量工作流,每四小时查一次竞品新闻。

发现重要动态,立刻 Telegram 通知,不等晨间 brief。

  • 3. 周报

周日不跑标准日报。

让 Codex 读过去七天的七份日报,生成周报:

  1. 本周最大主题是什么。
  2. 对你所在领域长期意味着什么。
  3. 最重要的单条动态你要怎么应对。
  4. 你预期发生但没发生的事意味着什么。

但搭完只是第一步

第一周你大概率会发现 brief 还不够准。

有些内容你觉得有用但没出现。

这不是系统有问题,是 CODEX.md 还没被真实反馈打磨过。

接下来要做的事,比搭建更重要:

  1. 持续调控。
  2. 每次读完 brief,写两行标注。
  3. 每个周日花十分钟扫一眼当周标注,改 CODEX.md。
  4. 该提权的提权,该拉黑的拉黑。
  5. 缺什么信息类型,就补一句搜索指令。
  6. 第二周会比第一周准。
  7. 第一个月会比第二周更准。

你的关注方向会变,项目在推进,CODEX.md 也要跟着动。

工作流是骨架。
后期的打磨,才决定它能不能真的成为你的研究系统。

这只是一条路,大家也可以搞一个云服务器来完成,也可以实现24小时在线的效果。