1. 项目概述一个由AI驱动的个人“数字秘书”我一直想要一个秘书。不是真人秘书而是一个能帮我处理日常数字杂务的智能助手。这个想法从童年对“权力”的幼稚向往到后来对“效率”的务实追求再到如今对“解放心智空间”的深刻理解伴随了我很多年。早期尝试用GPT-2等模型构建类似系统结果总是失败直到我遇到了Claude Code。现在我构建了一个名为“Muninn”取自北欧神话中奥丁的乌鸦意为“记忆”的系统它帮我阅读邮件、管理日历、检查车辆电量、订购食品杂货甚至分析我的睡眠质量。整个系统没有一行代码是我亲手写的全部通过语音口述给Claude Code完成其核心就是一堆Markdown文件、一系列MCP连接器以及一个清晰的执行逻辑。这不是一个复杂的软件工程而是一套可操作、可迭代的个人生产力自动化框架。如果你也厌倦了在十几个应用间来回切换感觉生活被琐事淹没那么这个基于Claude Code构建的“数字秘书”方案或许能为你打开一扇新的大门。2. 核心设计哲学为什么是Markdown和“指令即代码”在开始动手之前理解背后的“为什么”至关重要。我尝试过很多自动化方案从IFTTT、Zapier到自己写Python脚本但它们要么太死板要么维护成本太高。Muninn系统的核心设计哲学可以归结为两点“指令即代码”和“最小化架构”。2.1 为什么选择纯Markdown作为系统载体这可能是最反直觉的决定。在充斥着数据库、API和微服务的时代为什么用最朴素的文本文件第一零部署与零依赖。Markdown文件就在你的硬盘上用任何文本编辑器都能打开和修改。没有服务器需要维护没有运行时环境需要配置没有版本兼容性问题。系统能否运行只取决于Claude Code能否读取这些文件——而它天生就擅长这个。第二对人类和AI的双重友好。Markdown结构清晰Claude Code能完美解析。同时作为构建者的我也能轻松阅读、理解和调整。当系统行为出现偏差时我不需要去调试复杂的代码逻辑只需要检查并修改对应的Markdown指令即可。这种透明性是任何黑盒框架无法比拟的。第三极致的模块化与可组合性。每个领域如日历、邮件、健康都是一个独立的Markdown文件我称之为“剧本”。添加新功能新建一个cooking.md。某个功能出问题直接注释掉或删除那个文件不影响其他部分。这种基于文件的模块化比任何编程中的接口设计都要直观和灵活。2.2 “指令即代码”与传统的编程自动化有何不同传统自动化是“if-else”逻辑的硬编码。例如“如果时间是早上8点且日历上有会议则发送提醒。”这种逻辑很脆弱一旦情况稍有变化比如会议取消了但提醒还是发了就需要修改代码。“指令即代码”则是将意图和原则交给AI由AI在具体情境中动态决定如何执行。我的CLAUDE.md文件中写道“偏向行动——如果你能自己做某事就直接做不要让我手动操作。” 同时还有“确认规则——任何对外的行动发邮件、完成任务、创建日程都必须先展示给我看并等待确认。”这意味着系统不是一个执行固定流程的机器人而是一个理解了工作原则的智能体。它知道什么时候该主动比如扫描未读邮件什么时候该请示比如回复一封重要的工作邮件。这种动态性是应对复杂、多变的真实生活所必需的。2.3 工具选择策略CLI优先MCP补充Claude Code通过MCP连接外部服务但我的原则是能用命令行工具解决的绝不用MCP。原因在于上下文开销。每个MCP服务器启动时都会将其所有工具的架构描述加载到对话的上下文窗口中。连接五六个MCP后可能还没开始干活宝贵的上下文令牌就被工具描述占用了不少。而一个简单的命令行工具调用起来又快又轻。例如对于Todoist任务管理我写了两个简单的Shell脚本todoist-addtodoist-list-today它们能处理90%的常用操作速度远超通过MCP调用Todoist官方API。只有遇到创建复杂项目、设置标签等高级操作时才会fallback到Todoist MCP。必须使用MCP的场景是那些没有稳定CLI接口的服务比如Google Workspace邮件、日历和Home Assistant。这里的权衡很明确性能与便利性。对于高频、简单的操作追求极致的轻量和速度对于复杂、官方的集成则接受MCP带来的便利性和可靠性。3. 系统架构深度解析从核心指令到领域剧本理解了“为什么”我们来看“是什么”。Muninn的目录结构非常清晰它反映了一个从核心身份到具体执行的逻辑层次。~/ai/agents/muninn/ ├── CLAUDE.md # 智能体的“宪法”身份、能力、行为准则 ├── domains/ # 领域剧本每个生活领域的具体操作手册 │ ├── tasks.md │ ├── calendar.md │ ├── email-personal.md │ ├── email-work.md │ ├── comms.md │ ├── home.md │ ├── health.md │ ├── transport.md │ ├── cooking.md │ ├── jira.md │ └── agents.md # 子智能体注册表 ├── memory/ # 持久化记忆库 │ ├── people.md │ ├── decisions.md │ ├── projects.md │ ├── briefing-notes.md │ └── daily/ # 自动生成的每日日志 └── STATUS-FORMAT.md # 状态报告模板3.1 核心宪法CLAUDE.md 文件剖析这个文件是智能体的灵魂。它不包含具体操作步骤而是定义了最高层级的规则。以下是我的CLAUDE.md核心部分拆解身份定义开宗明义“Muninn — 参谋长兼行政助理”。这个头衔很重要它设定了智能体的角色是“辅助决策与执行”而非简单的“任务执行器”。这会影响AI在后续所有交互中的语气和主动性。能力清单明确列出它能做什么“任务通过Todoist创建/更新/完成日历通过Google Workspace MCP管理邮件通过Google Workspace MCP撰写/发送/回复……” 这份清单有两个作用一是告诉AI它的工具范围二是在我口述指令时我能清晰地知道它的能力边界。核心行为准则这是精髓所在。偏向行动原则原文是“If you can do something yourself, just do it — don‘t ask me to do it manually.” 这直接杜绝了AI那种“我可以帮你写一段代码你来运行”的无效建议模式。它必须自己调用工具去执行。确认规则原文是“For any outward action ... show exactly what you’ll do and wait for confirmation.” 这是安全阀门。内部扫描读邮件、查日历无需确认但任何会产生外部影响的操作发邮件、替我做决定都必须让我过目。这个“展示-确认”的步骤是建立信任的关键。记忆路由规则这部分指导AI如何更新记忆库。明确指令人物信息去people.md项目信息去projects.md决策和偏好去decisions.md。并且严禁将待办事项写入记忆——它们必须去Todoist。这个区分保证了记忆库是干净的“事实数据库”而不是混杂着意图的垃圾场。3.2 领域剧本标准化操作流程domains/目录下的每个文件都对应一个生活领域并遵循相同的结构扫描流程和执行流程。以health.md为例## 扫描流程 1. 获取睡眠数据——分数、时长、质量 2. 获取身体电量——当前水平、充/放电趋势 3. 获取训练准备程度 4. 检查静息心率——正常值 vs. 当前值 5. 获取近期活动——与训练计划对比 6. **如果**训练准备度低或睡眠分数60→ 标记为FYI“恢复日——考虑跳过今日跑步” ## 执行流程 ### “我睡得怎么样” → 拉取睡眠数据总结分数时长深睡/REM睡眠占比 ### “我今天应该跑步吗” → 检查训练准备度身体电量日程安排 → 给出“推荐/谨慎/不推荐”的建议扫描流程用于每日简报是拉取信息、按规则初步过滤的过程。它是一系列条件判断目的是从海量数据中筛选出需要我关注的信息点。执行流程则用于我主动询问时的按需深度查询与行动。它更具体直接对应一个自然语言问题并给出结构化的答案或操作。这种设计的妙处在于分离了关注点。简报时AI按部就班执行所有扫描流程当我需要特定信息时它又能精准调用对应的执行流程。每个领域剧本都是独立的插件增删改都不会影响系统其他部分。3.3 记忆系统从向量搜索回归关键词搜索记忆系统是迭代最多、也最反潮流的部分。我最初也采用了时髦的向量搜索但很快放弃了。为什么放弃向量搜索向量搜索嵌入模型擅长语义相似性比如“汽车”和“车辆”。但在个人助理场景下精确匹配往往更重要。当我说“记得张三不喜欢开会”我希望AI在下次看到“张三”和“开会”时能关联起来而不是去匹配“李四”和“讨论”。向量搜索的“模糊性”在这里成了缺点它可能召回一些语义相关但实际无关的记忆造成干扰。此外向量搜索通常更慢且需要维护额外的嵌入索引。为什么选择BM25关键词搜索我使用了QMD这个本地搜索工具它基于BM25算法。对于我这种文档小、词汇受控、结构清晰的记忆库关键词搜索速度快、结果精确、可预测性强。people.md里就是人名和事实decisions.md里就是决策条目AI搜索“牙医预约”能直接定位到那条“已解决”的记录不会产生歧义。记忆库的精心组织people.md: 记录人际关系事实“李四的生日是5月20日”“王五喜欢喝黑咖啡”。decisions.md:这是最重要的文件。它记录三类内容1)已解决事项“2026-02-20 - 已解决牙医预约已订于2月27日”防止系统反复提醒2)永久驳回项“太阳能逆变器离线警报——已知硬件问题无需处理”3)个人偏好“不要在周末安排工作事项”“花园事务主要由我妻子负责”。projects.md: 记录项目或系统的客观事实“家庭服务器IP是192.168.1.100”“博客部署密钥存放在~/.ssh/”。briefing-notes.md: 记录针对简报的过滤规则“来自‘订阅邮件’发件人的未读邮件除非标题包含‘账单’否则标记为已读”。关键心得记忆是用于存储事实和决策的而不是存储意图或任务。将待办事项误写入记忆是污染记忆库、导致后续搜索失效的最常见错误。务必在CLAUDE.md中严格规定路由规则。4. 核心工作流每日简报的魔法每日简报是整套系统的价值巅峰也是让我从“使用工具”到“拥有助手”感受转变的关键。它不是一个简单的信息汇总而是一个多阶段的智能过滤与呈现管道。4.1 简报五阶段工作流详解当我输入/briefing指令后系统内部会经历以下五个阶段第一阶段加载上下文与排除列表AI首先读取decisions.md和briefing-notes.md并在整个记忆库中搜索“最近已解决”的条目。这一步的目的是生成一个“免提清单”。比如如果decisions.md里写着“牙医预约已解决”那么今天日历上关于牙医的提醒就不会出现在简报里。这解决了所有提醒类工具最恼人的问题——对已处理事项的重复唠叨。第二阶段并行启动领域扫描这是性能关键。系统不会一个个领域串行检查。相反它会“启动”所有领域的扫描代理在概念上并行。tasks.md剧本去查Todoistcalendar.md去查Google日历health.md去拉Garmin数据transport.md去查汽车电量……所有这些查询同时发生。在Claude Code的上下文中这表现为AI快速、连续地调用一系列工具极大地缩短了等待时间。第三阶段过滤与综合各领域返回原始结果。此时主智能体Muninn会拿着第一阶段生成的“免提清单”对所有这些结果进行二次过滤。这是一个“深度防御”策略即使某个子代理忘了过滤已解决事项主代理也会兜底。过滤之后AI开始综合信息判断优先级并按照固定模板进行组织。第四阶段结构化呈现简报的输出格式是固定的这减少了我的认知负荷紧急—— 需要未来几小时内处理如一小时后有会议车辆电量不足20%。今日—— 今天需要完成如提交项目报告购买晚餐食材。明日—— 明日提醒如明天上午预约了理发。本周—— 未来几天需要关注如周末家庭聚餐需要确认人数。仅供参考—— 信息性内容无需行动如昨晚睡眠得分85分表现良好。异常情况—— 预料之外的事情如家庭服务器离线静息心率异常升高。建议行动—— 系统可以替我立即执行的操作如“我可以帮你把‘买牛奶’加入Todoist吗”或“需要我起草一封邮件回复张三的询问吗”。第五阶段捕获反馈简报结束后AI会主动询问“上述事项中哪些已处理哪些需要推迟哪些可以永久忽略”我的回答会被直接格式化并追加到decisions.md文件中。这是一个闭环。我的反馈直接强化了系统的“免提清单”让下一次简报更精准。这是系统能够“学习”和“进化”的核心机制。4.2 简报的实际体验与心流调整最初简报打乱了我的工作节奏。我正在编码突然弹出一个简报需要审核刚处理完又有一封邮件草稿需要确认。这种频繁的上下文切换让我精疲力竭感觉思维像一团浆糊几乎要导致职业倦怠。我做了两个关键调整固定简报时间我不再随时触发/briefing而是固定在每天早、中、晚几个特定时间点如早上开工前、午饭后、下班前。这让我有连续、不受打扰的“深度工作”时间块。心态转变我意识到即便我每天花15分钟处理这些简报和确认它所节省的时间和避免的遗漏远超我过去花在零散切换应用上的精力。这15分钟的投资换回的是数小时的专注和内心的宁静。接受“主动管理”而非“被动响应”的模式是使用这类系统的心理门槛。5. 子智能体生态与权限管理Muninn是我的“总参谋长”但它不是万能的。围绕它我建立了一个由专业子智能体构成的生态系统。5.1 子智能体从临时项目到常驻专家子智能体本质上是独立的Claude Code项目文件夹。例如~/ai/agents/cook/: 专门负责膳食计划和杂货订购。它知道我家人的口味、常买的食材并能根据日历上的安排今晚是否在家吃饭来建议食谱。~/ai/agents/system-audit/: 定期检查我所有电脑的磁盘空间、备份状态、安全更新。~/ai/agents/trip-planner/: 为一次即将到来的家庭公路旅行而生负责研究路线、预订住宿、整理行李清单。旅行结束后它可能就被归档了。~/ai/agents/memory-janitor/:元智能体。它的工作是定期扫描memory/目录检查是否有重复条目、过期引用或违反路由规则比如把任务写进了people.md的内容。每个子智能体都有自己的CLAUDE.md定义其专长和STATUS.md记录其最近工作和待办事项。Muninn在简报时会通过读取这些STATUS.md文件来了解各子智能体的状况。这种设计让系统具备了弹性和可生长性。智能体可以随着需求诞生、演化或休眠。5.2 权限管理的噩梦与救星权限优化器在系统搭建初期最大的体验杀手是权限弹窗。“允许执行bash命令吗”“允许使用MCP工具吗”“允许编辑文件吗”几乎每执行一个操作就要确认一次工作流被彻底打断。我的解决方案是创建一个专门的权限优化器智能体。它定期运行比如每周一次执行以下操作扫描所有权限文件遍历所有Claude Code项目目录下的权限设置文件。去重与清理移除因多次点击“允许以后不再询问”而产生的重复或冗余条目。更新全局允许列表将那些明确安全、高频使用的操作如ls,cat, 特定的MCP工具调用添加到全局允许列表中。维护极简拒绝列表只保留真正危险的操作如rm -rf /,dd if/dev/random等。这个优化器运行后我的交互体验从“步步确认”变成了“畅通无阻”。对于绝大多数安全操作AI可以直接执行仅在最敏感的操作如发送邮件、完成重要任务前需要我确认。如果你从本文只借鉴一个点子那就应该是构建一个权限优化器它对使用体验的提升是颠覆性的。6. 实操搭建指南从零到一的步骤理论说了这么多现在我们来动手搭建。请记住不要试图一步到位。采用渐进式方法从一个痛点开始。6.1 第一步创建核心结构与宪法在你的工作区例如~/ai/agents/新建一个目录比如my_assistant。创建CLAUDE.md文件。最初内容可以非常简单# 我的个人助理 ## 身份 你是我的个人效率助理帮助我管理数字生活。 ## 核心原则 1. 偏向行动如果你能自己完成一件事就直接做不要让我手动操作。 2. 安全确认任何会向外部发送信息、修改重要数据或产生承诺的操作都必须先展示给我看并获得我的明确确认。 ## 初始能力 - 你可以读取和列出当前目录下的文件。 - 你可以通过bash命令执行简单的系统操作需先询问。在Claude Code中打开这个目录。现在你可以和这个初步定义的智能体对话了。测试一下“帮我列出这个文件夹里所有的markdown文件。”6.2 第二步添加第一个领域剧本选择你每天早晨第一个检查的应用。比如很多人是邮箱。在my_assistant目录下创建domains/文件夹。在domains/内创建email.md。内容可以这样开始# 邮件领域剧本 ## 扫描流程用于每日简报 1. 连接到我的工作邮箱account: work。 2. 获取收件箱中未读邮件的数量及发件人。 3. 标记出来自“老板”、“客户”或标题包含“紧急”、“截止”关键词的邮件。 4. 忽略来自“订阅邮件”、“推广”等列表的邮件。 ## 执行流程用于按需操作 ### “我有多少封未读邮件” → 连接邮箱统计未读邮件总数并按发件人分组列出。 ### “老板今天发邮件了吗” → 搜索发件人为“老板”的今日邮件并总结主题。更新你的CLAUDE.md在“初始能力”里加上“- 可以读取和执行domains/email.md中的邮件相关流程。”现在你可以尝试命令“执行邮件扫描流程。”或者问“我有多少封未读邮件”当然前提是你已配置好Google Workspace MCP。6.3 第三步引入记忆系统当你的助理开始处理重复信息时记忆就变得必要了。在my_assistant目录下创建memory/文件夹。创建memory/decisions.md。第一条可以写## 2024-05-20 - PREFERENCE: 简报时忽略所有来自“系统通知”的邮件。更新CLAUDE.md添加记忆路由规则## 记忆规则 - 我的明确偏好和已处理的决定请记录到 memory/decisions.md。 - 在每次执行扫描流程前请先读取 memory/decisions.md并避免提醒我已决定忽略或已处理的事项。现在当你下次运行简报时AI应该会跳过那些“系统通知”邮件。6.4 第四步配置工具MCP与CLI这是让系统“活”起来的关键。MCP配置参考Claude Code官方文档安装并配置你需要的MCP服务器。对于新手强烈建议从Google Workspace和Todoist开始。将MCP服务器配置添加到~/.claude.json中。CLI工具对于Todoist你可以先创建两个简单的Shell脚本# 文件: ~/bin/todoist-today #!/bin/bash # 调用Todoist API (需要先安装其CLI或使用curl) 获取今日任务 # 这里只是一个示例你需要替换成真实的API调用 echo 1. 完成项目报告草案 echo 2. 预约牙医 echo 3. 购买 groceries赋予执行权限chmod x ~/bin/todoist-today。然后在CLAUDE.md中说明“你可以通过执行todoist-today命令来获取我今天的任务列表。”更新你的领域剧本。在domains/tasks.md中扫描流程可以改为“1. 执行todoist-today命令获取今日任务列表。2. 标记出已过截止时间的任务。”6.5 第五步组装你的第一个简报当你有了一两个领域剧本和基础记忆后就可以创建简报流程了。在CLAUDE.md中创建一个新的章节或添加一个触发词。## 简报指令 当我说“开始简报”或“/briefing”时请按顺序执行以下操作 1. 加载记忆读取 memory/decisions.md了解需要忽略的事项。 2. 执行扫描依次运行 domains/email.md 和 domains/tasks.md 中定义的扫描流程。 3. 综合报告将扫描结果分类为“紧急”、“今日”、“FYI”并向我汇报。 4. 收集反馈报告后询问我哪些事项已处理并更新到 memory/decisions.md。现在在Claude Code中对你的助理说“开始简报。” 你将收到一份属于你自己的、最简单的个性化简报。7. 常见问题、故障排查与进阶技巧在构建和使用过程中你一定会遇到各种问题。以下是我踩过坑后总结的经验。7.1 问题排查清单问题现象可能原因解决方案AI完全不执行命令只给出建议。CLAUDE.md中“偏向行动”原则不明确或未被理解。强化指令。使用更绝对的语气如“必须自行调用工具完成禁止建议我手动操作”。简报重复提醒已处理的事项。1.decisions.md中的记录格式AI无法识别。2. 扫描流程没有在开始时读取记忆。1. 统一使用- RESOLVED: [事项描述]的格式。2. 在领域剧本的扫描流程第一步明确写入“首先检查memory/decisions.md中是否有相关已解决项”。AI混淆了个人和工作邮箱。在CLAUDE.md或领域剧本中没有明确的路由规则。在domains/email-work.md和email-personal.md中明确指定MCP连接的账户名称如account: work。在CLAUDE.md中说明不同场景下的默认账户。权限弹窗过多体验割裂。全局允许列表未正确配置或权限优化器未运行。运行权限优化器智能体。手动检查~/.claude/settings.json将常用、安全的工具和命令路径添加到allowed列表中。AI“忘记”了之前对话中设定的偏好。偏好没有被持久化到记忆文件中。建立严格的口令。当AI做对一件事时立刻命令它“将‘我喜欢邮件在简报中按项目分组显示’这一偏好记录到memory/decisions.md中。”简报速度很慢。1. 领域扫描是串行的。2. 某个MCP连接超时。1. 在指令中鼓励AI“尽可能并行地检查各个领域”。虽然Claude Code是线性处理但清晰的指令能优化其调度。2. 检查网络或为缓慢的MCP设置超时fallback机制。7.2 进阶技巧与心得为指令添加“为什么”不要只告诉AI“做什么”告诉它“为什么”这么做。例如在decisions.md的格式旁加注“使用- RESOLVED:前缀是为了让搜索算法能准确识别已解决条目。”这能提升AI在边缘情况下的理解能力。创建“系统健康”剧本增加一个domains/system_health.md让它定期检查你的服务器、备份、证书到期日等。预防性问题远比补救性问题更容易处理。利用briefing-notes.md进行微调这是记忆系统中专门用于过滤简报的。你可以记录“如果睡眠分数80且没有紧急会议则不要提醒‘考虑午休’。”这种细粒度的规则让简报越来越贴合你的习惯。接受不完美迭代改进这个系统的强大之处不在于初始的完美而在于它的可进化性。每次AI犯错或遗漏都是一次改进指令的机会。直接告诉它“刚才你漏掉了X是因为Y吗请更新对应的剧本确保以后能捕获此类信息。”你是在训练一个高度定制的助手。警惕模型先验LLM基于海量数据训练有其固有的“世界观”。例如它可能默认认为“未读邮件紧急”。你需要通过decisions.md和领域剧本中的规则坚定地告诉它你的优先级是什么例如“来自家人的消息优先级高于工作邮件”。手动触发是特性不是缺陷我坚持所有操作都由我手动触发没有后台守护进程。这确保了我始终是系统的控制者。当我不在电脑前时系统就处于休眠状态。这种设计给了我巨大的安全感因为一个拥有广泛权限的AI助手在无人监督下运行其风险是不可预测的。构建这样一个系统最大的回报不是某个具体任务被完成而是那种“一切尽在掌握”的秩序感。琐事被归位信息被梳理决策被记录。你的心智空间得以从杂乱的管理工作中解放出来投入到真正重要的创造和思考中。它不完美但它在你的每一次交互中变得更好。就像一位真正的秘书你们之间逐渐磨合出默契。从这个Markdown文件和简单的指令开始一步步搭建属于你的“数字参谋长”吧。