关于 shyn
shyn 是面向 Apple Silicon Mac 的本地记忆 MCP 服务,可捕获屏幕、会议、浏览记录和笔记,供 AI 助手检索个人历史。数据以加密形式保存在设备上,并支持关键词与语义混合搜索。
主要功能
- 01捕获屏幕文字并建立可搜索历史
- 02本地录制会议并转写、标记说话者
- 03导入 Chrome、Safari 历史和 Apple Notes
- 04关键词与设备端语义混合搜索
- 05暂停采集、排除应用并删除记忆
适用场景
- 01查找会议中讨论过的决定
- 02定位曾读过的网页或资料
- 03让助手检索并阅读完整笔记或转录稿
MCP 相关
shyn 通过标准 stdio MCP 服务向客户端提供记忆搜索、文档读取、写入、删除和状态查询等工具;可选的文件搜索需配合独立的 thatone 应用。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
shyn — 随时调用的 Mac 记忆 ☀️
shyn.day · macOS(Apple Silicon)· 预 Alpha 阶段 · Elastic License 2.0
Shyn 是 Mac 的常驻记忆助手。 它会悄悄记住你看到、听到和读到的内容——你的屏幕、会议、浏览记录、笔记——并让你的 AI 助手完整回忆起你的生活。问 Claude“我们昨天的站会决定了什么?”或“我在哪里读到那个留存率 Bug 的?”它就会根据你自己的历史记录,而非互联网内容,给出答案。
你的记忆始终保存在本地,隐私设计融入其中。 shyn 捕获的一切都存储在 Mac 上的加密数据库中。它捕获的内容不会上传、同步或发送回开发方——离开你设备的只有与你主动提出的问题相关的少量片段,并且只会发送给你选择询问的 AI。
在 Beta 期间,shyn 还会发送匿名使用数据。 shyn 需要适配不同的 macOS 版本、硬件和权限状态,而这些组合会产生我们无法复现或测试的 Bug。遇到这类问题的大多数人不会提交报告,只会退出应用。因此,shyn 会报告哪些功能被使用、发生了什么崩溃、应用版本和耗时数据,并将这些信息关联到一个与你无关的随机 ID。
这些数据绝不包含 shyn 捕获的任何内容。没有屏幕文本、转录内容、搜索记录或身份信息。首次运行时由你选择,之后随时可以在设置中单击一次更改。关闭此功能后,shyn 就会完全遵守上述承诺:离开你设备的只有你自己的问题。
状态:预 Alpha 阶段。 Shyn 还很新,迭代迅速,且仅支持 macOS (Apple Silicon)。请做好遇到不够完善之处和破坏性变更的准备。安装只需两条 Homebrew cask 命令(
brew install+shyn setup)——这些应用采用自签名,并由shyn setup在本地重新签名,不经过 Apple 公证;一键公证安装已列入路线图。
为什么选择 shyn
- 🧠 瞬间完整回忆。 混合搜索——关键词(FTS5/BM25)+ 语义搜索(设备端嵌入)——可在几毫秒内通过本地套接字搜索你捕获的所有内容。
- 👁️ 随时记录屏幕记忆。 一个轻量级 Agent 会在你工作时捕获屏幕上的文本——你读过、写过和点击过的内容都会成为可搜索的历史记录。
- 🎙️ 记住每场会议。 Shyn 会检测你的通话,在本地录制双方音频,用 Whisper 在设备端转录,并将带有说话人标签的转录文本归档到你的记忆中。音频不会通过套接字传输,转录完成后立即清除——文本留存,音频数据即刻消失。授予日历访问权限后,转录文本会根据对应日历事件添加标题(包括参会者,例如“冲刺站会”)——数据直接从 Mac 自带的日历存储中读取,不使用 Google API,也不会有任何内容离开设备。
- 🌐 串联你的数字足迹。 Chrome 和 Safari 浏览历史记录以及 Apple Notes 会自动导入;文件和 PDF 可按需导入。
- ☀️ 一目了然,安心无忧。 磨砂玻璃风格的菜单栏助手会显示运行状态——菜单栏中一个太阳图标,四种实时状态;录制会议时,红点会闪烁。状态从不静默,也绝不偷偷运行。
- 🔒 以征得同意为先。 开始录制时会发出提示,并且可以在宽限期内取消。单击一次或运行
shyn pause 30m即可暂停所有功能。排除应用。删除任意内容——forget会彻底清除数据:经过清理,彻底消失,而非软删除。 - ⚡ 专为即时启动而设计。 关键词搜索从启动后的第一秒起即可使用;嵌入模型会在后台下载,随后搜索结果会静默升级为混合搜索。模型从不影响关键路径。
工作原理
后台守护进程管理一个加密的 SQLite 索引(密钥保存在 macOS
Keychain 中),并通过 Unix 套接字提供 JSON-RPC 服务。采集 Agent——屏幕、
会议——以及来源读取器——Chrome、Safari、Apple Notes——会向它提供数据。
你的 AI 通过六个 MCP 工具(以及下文介绍的可选第七个工具
search_files)与它交互。诀窍就是:一个私有索引、多种记忆,以及任何支持 MCP 的助手。
| 工具 | 你的 AI 可以获取什么 |
|---|---|
search_memory(query, …) | 带来源信息的混合搜索——核心工具 |
recent_activity(hours?, …) | 活动时间线,面对模糊问题时很适合作为首次调用 |
get_document(uri | doc_id, …) | 阅读整篇文档(完整的转录稿或笔记),而不是摘录 |
remember(content, tags?) | 明确“记下这个”的记忆 |
forget(doc_id | source | time-range, confirm) | 可靠删除;没有 confirm: true 就会拒绝 |
memory_status() | 健康状态、索引计数、模型下载进度、已连接来源 |
search_files(query, kinds?, folder?, limit?) | 可选:通过独立的 thatone 应用,按含义查找你自己的文件 |
文件搜索(可选)
search_files 可以根据文件内容查找 Mac 上的文件(图像、PDF、文档、音频、视频、
文本)。它需要在同一台 Mac 上运行独立的
thatone 应用(源代码可用,
Elastic License 2.0,适用于 Apple Silicon 版 macOS,预 Alpha 阶段)。shyn 本身不会为任何文件编制索引;文件索引由 thatone 管理。
- **发送的内容:**只有查询文本以及可选的
kinds、folder和limit会发送到 thatone 的本地套接字。两个程序都不会通过网络发送任何内容。结果(文件路径和你自己文件中的简短片段)会像search_memory的结果一样发送给你的 AI 客户端。 - **返回的内容:**文件路径(照片项目显示为“位置:Apple Photos,
名称”)、文件类型、录音和视频中的时间、PDF 页码,以及最多 300 个字符的片段。这些内容会像
search_memory的结果一样进入 AI 的上下文,因此是否安装并运行 thatone 由你决定。 - **关闭方式:**没有相关设置。退出或卸载 thatone 后,该工具会在约 20 秒内消失;shyn 会频繁重新检查。
- **套接字:**默认为
~/Library/Application Support/thatone/thatone.sock; 使用环境变量SHYN_FILE_SEARCH_SOCKET覆盖。 - 状态:
memory_status的最后一行会显示file search: ready (thatone)、file search: not running (thatone)或file search: not installed (thatone)。
快速开始
使用 Homebrew 安装(推荐)
brew install --cask shyn-labs/tap/shyn
shyn setup
只需两条命令:cask 会根据固定的校验和验证下载内容,shyn setup 会启动所有组件,并通过 ☀️ 菜单栏窗口引导你完成权限设置。无需 Node、无需 Xcode,也无需克隆仓库。请阅读 cask 的注意事项——其中列出了实情细则(本地签名、隔离属性、EDR)。之后使用 brew upgrade shyn && shyn setup 更新。
或从源代码构建(面向贡献者)
pnpm install
# start the daemon (first run downloads the embedding model in the
# background; search works before that finishes)
pnpm --filter @shyn/daemon start
向 Claude Code 注册 MCP 服务:
claude mcp add shyn -- pnpm --dir <path-to-shyn-repo> --filter @shyn/mcp-client exec tsx src/main.ts
将 <path-to-shyn-repo> 替换为你克隆此仓库的绝对路径
(例如,在仓库目录中运行 pwd 得到的输出)。
向它提供一些内容,然后询问 Claude:
pnpm shyn ingest /absolute/path/to/some/folder
请使用绝对路径:该路径会保存为文档的 uri。Ingest 接受单个文件(.md、.txt、.pdf)或要遍历的目录。你可以随时使用 pnpm shyn sync 导入浏览器历史记录和 Apple Notes。
完整搭档方案(守护进程 + Agent + 菜单栏)——一条命令
pnpm setup
就这样:安装依赖项,创建稳定的本地签名身份,构建守护进程包、采集 Agent 和状态应用,并通过 launchd 启动所有组件。操作具有幂等性——每次 git pull 后都可以重新运行。
在底层,它会暂存并启动所有组件——守护进程、屏幕 Agent、会议 Agent 和菜单栏状态应用——并确保它们在重启后仍能运行,日志写入 ~/Library/Logs/shyn/。授予 macOS 请求的权限(会议需要麦克风 + 系统音频;屏幕采集需要屏幕录制 + 辅助功能;只有在需要使用 Safari/Notes 时才需要完全磁盘访问——其他功能无需此权限,不会暗中收集数据,也不会反复打扰)。
pnpm shyn uninstall # stop + remove, keep data
pnpm shyn uninstall --purge # scorched earth: data, logs, keys
Claude Desktop
pnpm build:mcpb 会生成 dist/shyn.mcpb——将其拖到 Claude Desktop 的“设置”→“扩展”页面即可。(这会注册 MCP 客户端;守护进程必须通过上面的 install 运行。)
其他客户端,包括完全本地运行的模型
Shyn 是标准的 stdio MCP 服务——任何 MCP 客户端都能使用,而且你的记忆完全不必接触付费 API。目前已测试:
-
Claude Code / Claude Desktop——日常主力,在不经提示时判断何时主动检索记忆方面表现出色。
-
通过 Open WebUI 在本地运行的 Qwen3 14B(Apple Silicon 上使用 MLX),并通过 mcpo 将 MCP 桥接到 OpenAPI:
uvx mcpo --port 8600 -- "$HOME/Library/Application Support/shyn/bin/shyn-mcp" # then add http://localhost:8600 as a tool server in Open WebUI
测试中的实话:检索质量在所有环境中都相同——排序在守护进程内运行,而非由模型负责。差异在于驱动模型。较小的本地模型在指令明确时(“搜索我的记忆,查找……”)能很好地回答,但自行判断是否检索的可靠性较低;思考模式模型可能还需要限制其推理(Qwen3 可使用 /no_think)。在守护进程之外运行 14B 模型,建议预留约 10GB 统一内存。
日常控制
pnpm shyn status # daemon + agents + index health
pnpm shyn search "that one thing" # search from the terminal
pnpm shyn pause 30m # pause all capture (2h, until-tomorrow too); resume to undo
pnpm shyn exclude com.1password.1password # never capture an app
pnpm shyn meeting status # live meeting controls (stop | cancel too)
shyn voice forget-self # delete shyn's sample of your voice
……或者完全跳过终端,点击菜单栏中的 ☀️。
细节说明(我们替你操心)
- 静态数据加密可防止磁盘失窃和备份泄露,但无法防范以你当前用户身份运行的恶意软件。我们会明确说明这一点。
- 会议:按通道标注说话者(
Me:/Others:,说话者分离功能关闭时的默认设置);录制前有 10 秒可取消的等待时间;硬性时长上限为 180 分钟;采集时会逐字节清除临时音频。对于 Shyn 无法听到自身声音的场景,例如房间会议、演讲或免提通话,请点击菜单栏中的开始录制:系统会显示一个简短表单,询问会议内容和参与者,两项均为可选;填写的答案会成为标题和参与者列表(也可在终端中执行相同操作:shyn meeting start "Day 5 review" --with "Maya R, Dev P")。每场会议还会记录 Mac 所在时区,方便日后按出行记录搜索。转录默认使用 Whispersmall;使用此模型时,印地语/印地语英语混用语及其他非英语语音经常会被转成英文大意(这一点有文档说明,并未隐瞒)。如需显著提升多语言转录效果,请在菜单栏弹出面板的“会议语言”下点击多语言(需要一次性下载约 3GB 的模型,下载会立即开始;弹出面板会清楚显示下一场会议将使用的模型)。也可以手动切换:在~/Library/Application Support/shyn/capture.json中设置"meeting": { "whisperModel": "large-v3_turbo" }(此处可使用任意 WhisperKit 模型名称;如果名称无法识别,弹出面板会显示为“自定义”)。配置会热重载,无需重启。转录只会解码每个通道中有语音的片段,并一次解码多个片段(将"chunkedTranscription": false设置为可恢复整通道解码);每场会议的日志都会报告各通道中包含语音的时长比例。转录运行期间会阻止系统空闲睡眠,但合上笔记本电脑盖仍会使其进入睡眠并暂停转录——转录进行中,弹出面板会对此作出提示。若要在自己的文件上计时或比较解码器:shyn-meeting transcribe mic.wav system.wav [--whole](二进制文件位于暂存的shyn-meeting.app中)。 说话人分离(菜单栏,“说话人分离”)。通话中,对方会被拆分为Speaker 1、Speaker 2……;你的麦克风始终显示为Me:,而一对一通话中如果只有一个人说话,则会保留参会者姓名。线下见面时,你麦克风收录的每个人都会被分离,shyn 会识别出你是哪一个。请注意默认设置:说话人分离处于关闭状态,直到你开启它。 shyn 只保存你自己的声音特征,用于在线下会议中将你与他人区分开来。 shyn 会从你的通话中学习;运行shyn voice forget-self即可删除该特征。 其他人的声音只用于为他们编号,随后就会丢弃。 - 会议标题为可选项,并按层级获取:首先是日历事件(需要日历访问权限),其次是通话窗口标题(需要辅助功能权限),否则显示普通的“应用 · 日期”。即使拒绝所有权限,会议仍会正常转录。
- 菜单栏应用每天检查一次 GitHub 是否有新版——只会发送未经身份验证的请求,以获取最新版本号;不会附带任何关于你或你的设备的信息。可在 capture.json 中设置
"updateCheck": false关闭此功能。 - 测试阶段会收集匿名使用数据。 只有守护进程会发送数据,而且只有在你回答首次运行提示后才会发送。
发送的数据包括:使用了哪些功能、崩溃信息、版本和操作系统、时间数据,以及一个与你无关的随机 ID。绝不会发送:shyn 捕获的任何内容,包括搜索文本、文档标题和文件路径(发送前会从错误消息中清除凭据和主目录路径)。
事件名称来自
analytics.ts中的固定列表——你可以查看;该列表就是全部数据范围。在“设置”中关闭后,会立即停止发送并丢弃所有排队的数据。捕获 Agent 本身绝不会发出网络请求。 - 需要权限的来源会用通俗易懂的原因说明其不可用,而不会悄悄地什么也不捕获。
- 评估工具(
pnpm eval:keyword、eval:hybrid)会使用合成语料库,按照预先提交的 CI 通过/失败标准运行。它不是基准测试,其数据也不代表准确性声明。 - 已知的局限和边缘情况记录在
docs/known-issues.md中——坦诚也是一种功能。
shyn 绝不会做的事
- 将你捕获的记忆发送到任何地方。 屏幕文本、转录内容、文档和搜索查询在任何设置下都不会离开你的 Mac。 对外网络流量仅限于三类:与你提出的问题相关的片段、菜单栏应用向 GitHub 发出的版本检查,以及下文所述的匿名测试阶段使用数据。
- 保存你的搜索内容。 使用统计数据只是本地数据库中的计数(每天的搜索次数——绝不记录查询内容)。测试阶段上报的数据也一样:只记录发生过搜索,绝不记录搜索了什么。
- 在你看到选项前发送任何内容。 测试阶段,shyn 会上报匿名使用数据和崩溃数据;首次运行时,它会先征求你的同意,不会提前排入任何事件。拒绝后,甚至不会生成标识符;你也可以随时在“设置”中更改选择。关于包含和不包含哪些数据,请参阅上文“测试阶段会收集匿名使用数据”。
- 将你的内容发送到任何地方。 出现问题时,运行
shyn diagnose:它会输出一个可直接复制粘贴的信息块,其中包含版本、服务状态和错误日志行——不含任何文档内容——由你选择粘贴到哪里。
许可证
Elastic License 2.0(可查阅源代码)。
简单来说:你可以免费使用、阅读、修改和分享,无论是个人使用还是工作中使用。你不得出售 shyn,也不得将其作为商业服务或托管服务提供给他人;这项权利仍归项目所有。完整许可文本只有一页,值得一读。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。