mcpField
G
Griasa

Griasa

本地服务
stari-am.github.io生产力71 天前更新

关于 Griasa

Griasa 是一款本地优先的 macOS 菜单栏应用,可从会议中提取承诺并为后续通话生成简报。它关联录音、承诺、同事页面和提醒,并提供供 AI 助手读取的本地只读 MCP 端点。

主要功能

  1. 01依据参会者和历史生成会前简报
  2. 02分别录制麦克风和系统音频
  3. 03提取并追踪会议承诺
  4. 04提供上下文提醒和同事页面
  5. 05支持设备端语音识别与 AI 选项
  6. 06本地令牌保护的只读端点

适用场景

  1. 01会前查看相关承诺
  2. 02从当前应用或窗口创建提醒
  3. 03向当前焦点应用口述文字
  4. 04让 MCP 客户端读取会议记录

MCP 相关

提供本地、受令牌保护的只读 MCP 端点,供兼容客户端读取会议信息。Claude Desktop 支持一键安装。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
mcpbGriasa.mcpb

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

README 配图

Griasa

有日期的承诺会在日期到来时浮现。没有日期的承诺则永远不会浮现。

Griasa 会在你自己的 Mac 上记录会议,梳理谁承诺了什么,并在你下次与 欠对方人情的人通话前,把另一类承诺摆到你面前。 它是菜单栏应用,不是服务。

下载 macOS 版 · 项目主页 · 变更记录

最新版本 许可证 平台 依赖项

一段 19 秒的循环演示:转录中的一句话变成一条承诺,附有日期和原句;下一次通话前显示简报;Claude Desktop 根据 Griasa 回答“我上周答应 Maya 做什么了?”

会前简报:通话参与者及每个人未兑现承诺的数量、上次会议的主题,以及按“逾期”“此前与这些人开会时”“一对一会议”“与这些人在其他场合”分组的承诺

通话开始前五分钟出现,不会抢走键盘焦点。截图中的人物全是虚构的——应用使用虚构团队来生成截图,通过 Support/shoot-docs.sh 实现。

功能

通话前。 日历事件开始前几分钟,面板会显示参与者和上次讨论的内容。未兑现的承诺会根据显示它们的原因分组——逾期、在之前与恰好这些人参加的通话中许下、在与房间里某人的一对一会议中许下,或是在其他场合与这些人许下。若承诺涉及的人都不在房间里,就不会显示。点击一个按钮即可打开 Zoom 或 Meet 链接并开始录音。

通话中。 你的麦克风和 Mac 播放的所有声音会分别录为两条音轨,因此转录才能标明说话者。在屏幕上的任何内容上创建提醒(⌃⌥⌘R),应用会记住来源应用、窗口和浏览器标签页。按住按键说话,语音就会输入到当前获得焦点的应用中。

通话后。 应用会从转录中提取承诺——谁答应了什么、何时完成——并分成你欠别人的和别人欠你的。之后的对话可以建议关闭某条承诺,但必须引用表明事情已完成的句子;承诺不会自动关闭。对于时间久远且没有日期的承诺,应用会询问你,因为这类承诺本身永远不会浮现。每位同事都会根据会议名单生成个人页面,无需任何设置。

你的助手也能读取这些内容。 Claude Code、Codex、Cursor——任何使用 MCP 的客户端——都可以通过本地、受令牌保护的只读端点访问;Claude Desktop 只需点击一次即可安装。

所有功能可以同时运行:录制对话时,你仍然可以听写。大多数组件都很小,Apple 明天就能推出其中好几个。难以复制的是它们融为一体:通话中的提醒、从同一通话中提取的承诺、承诺者的个人页面,以及与此人下次会议前的简报,都指向同一批人和同一段历史。拆成独立应用就需要各自集成,而且仍会丢失它们之间的关联,因为关联并不是其中任何一个应用独有的功能。

项目主页还介绍了其余内容:更多截图、哪些内容会离开你的 Mac、哪些不会、比想象中更棘手的工程难题,以及人们真正会问的问题。

隐私政策

简要说明如下;完整政策请见 stari-am.github.io/griasa/privacy.html。

  • 音频绝不会离开你的 Mac。 转录在本地进行——使用 Apple 的识别器或 whisper.cpp。Griasa 没有服务器,也不需要账户。
  • 默认情况下,文本会留在 Mac 上。 新安装会使用 Griasa 在询问一次后配置好的本地模型;只有在你选择后才会使用 Anthropic、OpenAI 或 Gemini。
  • 日历只读取,不写入。 会创建提醒事项,但仅在你要求时创建。
  • API 密钥保存在 macOS 钥匙串中,经过加密,不会存放在纯文本偏好设置文件里。
  • 所有权限均为可选项,如果你拒绝授权,应用会说明哪些功能将无法使用。
  • 可选的录音对象提醒。 通话另一端不会收到 macOS 提供的录音指示。开启 Settings → Meetings → Remind me to tell everyone 后,开始录音时会提供一段话,供你粘贴到通话聊天中。
  • 也可以导入其他工具的笔记。 Import Meeting Notes… 会将 ChatGPT Record、Zoom 或 Meet 的摘要转换为 Griasa 会议记录——包括承诺事项、人员页面和简报,并按会议发生日期记录。
  • 旧音频可以自动删除。 转录文本和笔记会保留;已转录录音的音频可在选定期限后删除(Settings → Meetings → Recordings on disk)。录音占用的空间几乎全都来自音频。
  • 企业可通过 MDM 锁定设置——仅使用设备端 AI、使用企业模型服务器、关闭 MCP。请参见 Support/mdm。

下载

下载最新版本——已签名、公证,支持通用架构,或运行 ./build.sh 自行编译。

使用 Homebrew,只需一条命令即可安装应用及其使用的两个引擎(用于语音的 whisper.cpp,以及用于设备端 AI 的 llama.cpp):

brew install --cask stari-am/tap/griasa

免费使用,没有任何功能受限:不需要许可证检查,而且根据 GPL-3.0 的规定,也不可能设置有实际意义的许可证检查。如果它为你节省了时间,在 Ko-fi 上赞助 $29 就会让我很开心——任何金额都欢迎,当然不赞助也完全没问题。

可以把它想成 WinRAR:试用期永远不会结束,无论是否付费,它都能持续使用。显然,WinRAR 这样确实赚到了钱,这留下了一个三十年来无人解开的谜团——总有人付费。欢迎成为其中一员。

Commitments 标签页:一个 Looks done 卡片提出两项关闭建议,并附上说明原因的句子;一个 Still real? 卡片询问三项超过一个月且没有日期的承诺;下方是 My promises

让列表变短的两件事:证明某件事已完成,以及询问一项已经一个月没有日期的承诺现在进展如何。

文档

以下内容介绍如何运行、构建和修改它。

听写的工作方式

触发方式按住 Right Option / Right Command / Fn(可配置)——在任何应用的文本框中均可使用
输入方式说话时实时输入,松开后一次性替换为修正后的文本
自动编辑删除填充词、恢复标点、整理列表格式、处理自我更正
语气将最前端应用的名称传递给 AI 提示词,因此 Slack 中语气随意,Mail 中语气正式
语音识别在设备端进行(Apple 识别器或本地 whisper.cpp)——音频绝不会离开 Mac
云端使用只有简短的润色步骤可能会调用大模型,而且只发送文本,并且只有在你启用后才会调用
语言支持系统提供的任意区域设置;可同时运行两到三种语言作为并行候选,并锁定胜出的结果
片段输入缩写即可在原位置展开,包括用于内联提问的 ;ai … ;;

构建与运行

./build.sh        # produces "Griasa Dev.app"
open "Griasa Dev.app"
./test.sh         # the invariant checks; release.sh runs these first

本地构建会明确标识自己:琥珀色的 DEV 图标、独立的文件名、隐私设置和活动监视器中显示的“Griasa Dev”,以及方角的菜单栏图标。它也使用独立的 bundle 标识符 am.stari.griasa.dev。这一点并非表面功夫——macOS 会将隐私授权同时绑定到标识符和它所见到的签名,因此,两个签名不同的构建若共用一个标识符,就会相互覆盖对方的授权,导致每次启动都重新询问。使用独立标识符只需多走一轮权限提示,而且只需一次。release.sh 不会执行这些操作;签名后的构建会携带正式的标识符、图标和名称。

test.sh 会检查实时输入绝不能破坏的规则——输出文本只能增长;如果某个假设改写了话语的开头,就不能延长其结尾;语言锁定后不得更改。前两项曾导致实际发布的回归问题;现在它们会使命令失败,而不是文本字段出错。这里没有使用测试框架:swiftc 会将 PartialStabilizer.swift 与检查代码编译在一起,二进制程序会以非零状态退出,因此只安装了命令行工具的机器也能运行这些检查。每条失败信息都会说明规则及其重要性,因为“预期为 true,实际为 false”对看到它的人毫无帮助。

自行分发

./release.sh      # signed + notarized dist/Griasa-<version>.dmg — the one on Releases
./dist.sh         # ad-hoc signed dmg, no Apple account needed

release.sh 用于生成正式发布版本:使用 Developer ID 签名、启用 Hardened Runtime、将 Apple 的公证票据装订到应用和磁盘映像,然后以陌生人的 Mac 上会采用的方式验证成品——对最终文件运行 spctl、stapler 和 lipo -archs,而不是检查构建设置。它需要 Developer ID Application 证书和已存储的 notarytool 凭证;如果缺少这些内容,运行前检查会准确说明需要创建什么,其中也包括最耗时的两个陷阱(使用 security import 导入证书,因为双击会报错 -25294;单独安装 G2 中间证书,否则 codesign 会因“unable to build chain to self-signed root”而失败)。

dist.sh 用于将构建版本交给没有 Apple Developer 账户的同事:它会生成一个通用 dmg,包含应用图标、/Applications 快捷方式和 INSTALL.txt。由于采用临时签名,接收者必须右键 → 打开一次。无论采用哪种方式,其余步骤都可由应用自行完成:首次启动时,应用会通过 Homebrew 安装 whisper-cpp、下载模型,并请求四项权限。

可使用完整的 Xcode 或独立的命令行工具在 macOS 14 及更高版本上构建;可在 macOS 14 及更高版本上运行。build.sh 直接使用 swiftc 编译,无需正常工作的 SwiftPM——部分独立的命令行工具安装包带有损坏的清单库。Package.swift 与之等效,在完整的 Xcode 环境下可以使用 swift build;任选一种即可。

Intel 构建有截止期限。 Xcode 26 是最后一个能在 Intel Mac 上运行的版本,也是最后一个免费提供 x86_64 架构的版本。在 Xcode 27 下,如果部署目标为 27.0 或更高版本,ARCHS_STANDARD 会静默移除 x86_64——不会报错,只会生成仅支持 arm64 的二进制文件;而 macOS 28 将彻底终止对 Intel 软件的支持。本项目的目标版本为 macOS 14.0,因此 release.sh 仍会生成真正的通用二进制文件;它会通过 lipo -archs 验证,而不是盲目相信构建设置。如果将来提高目标版本,也应继续这样验证。

参与贡献

欢迎提交补丁,也欢迎派生项目。CONTRIBUTING.md 介绍了构建、约束检查,以及补丁最容易碰到的几项约定——提示词放在哪里、为什么新增 UI 应作为中心页签而非窗口,以及为什么绝不能使用真实数据截图。

定制你的版本(分支与自定义构建)

用于标识构建归属的所有内容都在一个文件中:Sources/Griasa/BuildConfig.swift。构建前请编辑此文件:

常量用途留空时的行为
supportEmail“发送反馈”邮件草稿隐藏反馈按钮
donateURL♥ 捐赠按钮隐藏捐赠按钮
updateRepo每日检查 github.com/<owner>/<name> Releases 中的更新关闭更新检查
appName邮件主题和版本行—

代码签名通过环境变量进行参数化,无需修改脚本:

CODESIGN_IDENTITY="My Own Cert" ./build.sh                       # dev build (default: "Griasa Dev Signing")
DIST_SIGN_IDENTITY="Developer ID Application: You (TEAM)" ./dist.sh  # distributable (default: ad-hoc)

Bundle 标识符和版本信息位于 Support/Info.plist 中。如果要分发分支版本,请更改 CFBundleIdentifier,以免权限授权和更新源与上游构建冲突。

更改告知 AI 的内容

Griasa 发送给模型的所有系统提示词都在一个文件中:Sources/Griasa/Prompts.swift——听写清理、会议纪要、承诺事项提取、同事档案、项目归档、文档起草、提醒解析、聊天回复和内联解答。阅读该文件即可准确了解应用要求模型执行的任务;编辑后重新构建即可更改应用的行为。

运行时值采用 {{placeholder}} 形式,并由调用方填入,例如 {{today}}、{{participants}}、{{skeleton}} 等。调用方未提供的占位符会保留在提示词中,而不会被静默清空,因此错误会显示在输出中,而不是被隐藏起来。

你无需重新构建即可进行试验:设置 → AI 与操作 → 系统提示词 → 导出以编辑会将当前文本写入 ~/Documents/Griasa Prompts.json。其中存在的任何键都会覆盖内置版本;删除某个键(或该文件)即可恢复默认版本。点击重新加载编辑内容即可应用更改,无需重启。

提示词预设库(设置 → 提示词预设)有意不放在该文件中——这些是你自己的文档,通过界面编辑并按用户存储,不属于应用行为。

请始终运行已打包的应用(本地运行 Griasa Dev.app,安装后运行 Griasa.app),不要直接运行裸二进制文件——macOS 权限提示(麦克风、语音)需要应用包中的 Info.plist。

权限(仅需设置一次)

首次启动时,Griasa 会请求所需的所有权限。如果没有出现提示,请在系统设置 → 隐私与安全性中手动授权:

权限用途
麦克风听写与录音
语音识别设备端转录
辅助功能全局快捷键与插入文本(⌘V 合成)
屏幕录制系统音频采集(macOS 会要求应用音频通过此权限)

授予辅助功能或屏幕录制权限后,请退出并重新启动 Griasa。

签名与权限稳定性:macOS 会将隐私授权与应用的代码签名绑定。build.sh 使用本地自签名证书(“Griasa Dev Signing”,在登录钥匙串中创建一次)进行签名,因此应用身份和权限授权会在重新构建后保留。如果证书缺失,脚本会回退到临时签名并发出警告(使用临时签名时,每次重新构建都会被视为一个新应用,权限也会重置)。如需重新创建证书:生成带有 codeSigning EKU 的自签名证书,将 .p12(旧版格式)导入登录钥匙串,然后使用 security add-trusted-cert -r trustRoot -p codeSign 将其设为信任证书。如果权限状态混乱,可使用 tccutil reset All am.stari.griasa 清除权限,然后重新授权一次。

使用方法

听写
  1. 点击任意应用中的任意文本字段。
  2. 按住右 Option(⌥) — 菜单栏麦克风会填满。
  3. 开始说话 — 说话时,文字会实时出现在光标处(即时本地设备识别器)。
  4. 松开按键 — 实时文本会在原处更正为润色后的 Whisper + AI 清理版本(仅重写不同的尾部内容,通过合成按键的差异来实现)。

可以在“设置”→“听写”中关闭实时输入(这样所有内容都会在最后一次性粘贴)——适用于合成按键表现异常的应用(例如,启用了激进自动补全的字段)。

Griasa 会在菜单栏面板和“设置”→“系统”中保留一个累计的节省时间计数器(听写字数 × 每分钟打字 40 字与每分钟说话 150 字之间的差值)。

首次启动时,中心会打开一份欢迎指南:包含快速入门,以及一份实时清单,列出三项系统权限;每项权限都提供一键跳转,可打开相应的“系统设置”页面,并说明拒绝权限后哪些功能仍可使用。你可以随时从“设置”→“系统”重新打开该指南。

AI 清理使用已配置的AI 提供商(见下文)。如果未配置,或调用失败,则会改用本地的基于规则的清理,因此听写始终可以离线使用。

AI 提供商 — 默认使用本地模型;也可按需选择 Anthropic、OpenAI、Gemini 或现有订阅

所有 AI 功能都通过一个可配置的提供商运行(设置 → AI 与操作)。新安装默认使用本地模型——除非有人选择云端提供商,否则不会向云服务商发送任何内容。

  • 本地(默认) — 无需密钥,也无需手动安装任何内容。Griasa 会检查 Mac 的内存和可用磁盘空间;如果 Ollama 或 LM Studio 中已有模型,就会使用该模型;否则会询问一次,是否下载一个适合 Mac 内存容量的模型(约 3 GB 到 37 GB),并将其安装到自己的引擎中,地址为 127.0.0.1:8177。如果 Mac 支持 Apple 设备端模型,简短的英文文本清理任务会交由该模型处理。输入到设置中的服务器地址或模型名称(customBaseURL、customFastModel、customSmartModel)绝不会被替换。模型准备就绪前结束的会议会在之后生成摘要。如果没有本地模型正在运行,首次执行 AI 操作时会说明原因及解决方法。配合内置的本地 Whisper,Griasa 随后即可完全离线运行——文本绝不会离开 Mac。(组织: MDM 指南。)
  • Anthropic(Claude) — 可在设置中填写密钥,或使用 ANTHROPIC_API_KEY。在设置中输入的密钥会保存在 macOS 登录钥匙串中,绝不会写入偏好设置文件。
  • OpenAI — 可在设置中填写密钥,或使用 OPENAI_API_KEY(默认使用 GPT-5.6 系列)。
  • Google(Gemini) — 可在设置中填写密钥,或使用 GEMINI_API_KEY(通过 Google 的 OpenAI 兼容端点;默认使用 Gemini 3.x)。
  • Claude Code(订阅) / Codex CLI(ChatGPT 订阅) — 完全无需 API 密钥:如果已安装并登录 claude 或 codex CLI,Griasa 就会通过它来回答,费用计入你已付费的订阅。系统会自动检测(也可选择覆盖路径);每次请求预计需要约 5–10 秒——非常适合会议记录、资料汇编和文档处理;但对于 ;tldr 等输入路径功能,速度会比 API 密钥慢。(CLIRunner.swift)

每个提供商都有一个快速模型(用于听写清理、提醒解析、分类和回复草稿)和一个智能模型(用于预设、摘要、询问项目和会议记录);默认值经过合理设置(Haiku 4.5/Opus 4.8、GPT-5.6 Luna/Terra、Gemini 3.1 Flash-Lite/3.5 Flash;手动设置的本地服务使用 Qwen3 8B/30B——Griasa 自行设置的模型同时承担这两类任务),并且可以编辑——对于本地端点,加载模型列表按钮会显示实际已安装的模型,测试则会向提供商发送请求并报告延迟。对于本地模型,会议转录文本会按上下文预算截短(Griasa 设置的模型为 38k 个字符,为回复留出空间;手动设置的服务器默认值为 24k,可配置;云端模型为 400k)。在本地模型成为默认选项之前安装的版本,如果已有云端密钥且未保存任何选择,则会继续使用该提供商——粘贴密钥本身就代表做出了选择。如果所选提供商失败——常见情况是本地模型未运行——且云端提供商也可用,明确触发的操作会在通过云端重新发送该请求前征求同意(“每次都询问”,另有直到重新启动为止选项);听写清理和后台分类不会询问,而是静默降级。(LLMProvider.swift、AIFormatter.swift)

语音引擎

Griasa 首选 Whisper(whisper.cpp,large-v3-turbo)——准确度远超 Apple 识别器,完全在本地运行,并由模型原生支持真正的自动语言检测。

首次启动时会自动完成设置:如果尚未安装,应用会通过 Homebrew 安装 whisper-cpp,并将 1.6 GB 的模型下载到 ~/Library/Application Support/Griasa/。下载进度会显示在菜单栏菜单和“设置”→“语音引擎”中(如果出现问题,还会提供“重试”按钮)。应用只假设你已安装 Homebrew;如果没有,应用会告知你,并继续使用 Apple 引擎。

**每个模型在使用前都会经过检查。**下载来自固定的仓库提交版本,而非分支;在移入指定位置之前,会根据写入应用中的 SHA-256 和文件大小进行验证(ModelManifest.swift)——不匹配的文件绝不会安装。更新后,磁盘上已有的模型会检查一次并记录结果;检查失败的模型会重命名为 *.unverified,并替换为经过验证的下载文件。手动操作方式:

brew install whisper-cpp
curl -L -o ~/Library/Application\ Support/Griasa/ggml-large-v3-turbo.bin \
  https://huggingface.co/ggerganov/whisper.cpp/resolve/5359861c739e955e79d9a303bcbc70fb988958b1/ggml-large-v3-turbo.bin
shasum -a 256 ~/Library/Application\ Support/Griasa/ggml-large-v3-turbo.bin
# expect 1fc70f774d38eb169993ac391eea357ef47c88757ef72ee5943879b7e8e2bc69

Griasa 会在本地运行已加载模型的 whisper-server,因此释放热键后几乎可以立即完成听写转录,会议音频片段也无需每次都重新加载模型。缺少 whisper-cli 或模型时,所有功能都会回退到 Apple 识别器。

会议转录的时间线正确无误:whisper.cpp 内置的 --vad 会拼接语音片段并连续重新计时,因此长时间停顿后的文本会向前漂移(上游 issue #3634)。Griasa 通过自行运行 Silero VAD(whisper-vad-speech-segments)避免了这个问题:从音频中切出每个语音片段,利用已热加载的服务逐段转录,并为每段标注其真实起始时间——即使经过长时间静音,各片段仍会按真实时间顺序排列。无界面模式可在任何过往录音上重新运行此流程:"./Griasa Dev.app"/Contents/MacOS/Griasa --transcribe "<recording folder>"。

自动语言检测
  • Whisper:语言检测由模型原生支持(-l auto),无需配置。
  • Apple 回退引擎:Apple 识别器每次请求都需要固定区域设置,因此 Griasa 会为每种已配置语言并行运行一个识别器(“设置”→“听写”→“语言”,默认为 en-US, ru-RU),并保留置信度得分最高的转录结果——听写时按短语选择,会议时按每个 30 秒片段选择。

混入的英语科技/加密货币术语通过两种方式处理:

  • 内置词汇表(Vocabulary.swift:GitHub、deploy、staking、jetton、seed phrase、mainnet……)以及你在“设置”中添加的术语,会作为初始提示词提供给 Whisper,并作为上下文提示提供给 Apple 识别器。
  • 清理提示词会指示模型保留英语术语、不进行翻译,并修正按发音音译的术语(“гит хаб”→“GitHub”),同时不翻译文本的其他部分。
对所选文本应用提示词预设(适用于任何应用)

在任意位置(浏览器、Slack、PDF 等)选择文本,然后通过菜单或热键应用提示词预设。内置预设包括“总结”(⌃⌥⌘S)、“修正文法”(⌃⌥⌘G)、“翻译成英语”、“改为专业表达”、“转换为项目符号”和“改写为提交说明”。可编辑预设中会改写文本的预设(修正文法、翻译等)会显示“替换所选内容”按钮;总结预设不会。

添加自己的预设:前往“设置”→“AI 与操作”,填写名称、表情符号、给模型的指令、是否替换所选内容,以及可选的热键。默认使用三个修饰键 ⌃⌥⌘,因为 macOS 上的全局热键无法被拦截——最前端应用也会收到按键,因此组合键必须是没有任何应用绑定的组合。Griasa 会等你松开修饰键后再读取所选内容(按住修饰键时模拟 ⌘C 可能会被某些应用当作纯文本输入,从而清除所选内容);你的剪贴板会先保存,再恢复。

历史记录与导出

每次听写、会议转录和预设结果都会保存到可搜索的历史记录窗口中(菜单 → 历史记录…)。搜索全文,然后复制、插入、显示文件或导出。数据在本地保存于 ~/Library/Application Support/Griasa/history.json(最近 500 条记录)。

导出(在历史记录中或任意结果弹出窗口中)无需外部服务或身份验证:

  • 另存为… → Markdown(.md)、PDF、HTML、RTF 或纯文本。
  • 复制为富文本 → 可直接粘贴到 Google Docs、Notion、Confluence、Word 或 Slack,并保留格式(标题、粗体、项目符号)。

Markdown 可顺利导入 Notion/Obsidian/GitHub;HTML 和 RTF 粘贴到 Docs/Confluence 时会保留格式;PDF 可直接打印。(Exporter.swift — 一个小巧、无依赖的 Markdown→HTML 转换器,为 macOS 的富文本和打印系统提供输入。)

捕获(任意应用)

四种系统级操作,每种都有对应的菜单项和可配置的快捷键(设置 → 捕获):

  • ⏰ 提醒我 (⌃⌥⌘R) — 可从所选文本创建提醒;如果没有选中文本,也可以拖动屏幕区域。光标处会弹出类似 Slack 的菜单:20 分钟后 / 1 小时后 / 3 小时后 / 明天 9:00 / 下周一 9:00 / 自定义…(日期选择器),还有 从文本提取,由模型直接从文本中读取截止时间(例如“завтра в 3”“in 2 hours”)。固定时间无需 API 密钥。提醒会保存到提醒事项 App,因此会同步到你的 iPhone/Watch。每条提醒都会记录来源:在备注中注明来源 App 和窗口标题(Slack 工作区/频道、Telegram 聊天),如果来自浏览器,还会记录标签页 URL,并附带跳转到所捕获文本位置的锚点——作为提醒链接,一键即可返回原文位置。通过拖动区域创建的提醒还会将裁剪的图像保存到 Documents/Griasa/Reminders/,并在提醒中附上链接(EventKit 无法直接附加文件),这样你保留的不只是 OCR 文本,还有图像本身。(ReminderSource.swift;浏览器 URL 需要为每个浏览器一次性授予自动化权限。)
  • 🔤 区域 OCR (⌃⌥⌘O) — 拖动矩形区域;其中的文本会在设备上识别(Apple Vision,支持俄语和英语,离线运行),并复制到剪贴板。适用于图像、PDF,以及他人共享的屏幕。
  • 💬 起草回复 (⌃⌥⌘Y) — 通过 OCR 读取最前面的聊天窗口,并以相同语言和语气起草符合上下文的回复。通用适用:Telegram、Slack、Gmail 及任何 App。替换所选内容会将回复粘贴回去。
  • 从剪贴板运行(菜单)— 针对当前剪贴板内容运行任意提示词预设,无需选择文本。
  • ✂️ 片段 — 在任意 App 中输入缩写(如 ;meet、;sig),即可在原处展开,也可从菜单插入。模板支持动态占位符,并会在插入时解析:{date} {date+3d} {time} {clipboard} {meetlink}(你在设置中配置的永久 Zoom/Meet 会议室链接)、{slot} / {slots:3}(日历中最近的空闲时段——EventKit 只读,可配置工作时间)、{commitments} / {commitments:mine} / {commitments:theirs}(“承诺事项”标签页中的未完成承诺,以项目符号列出,并附上来源会议、日期和截止时间——;todos 可将你的承诺粘贴到任意状态更新中),以及 {ai: instruction}。默认的 ;meet 会生成类似 “Would Tue 21 Jul, 15:00 work for you? Here's my room: …” 的文本。设置 → 片段。
  • ✨ ;ai … ;; — 无需离开句子即可提问。 在任意 App 中输入 ;ai,写下问题,再用 ;; 结束,整段内容就会在原处替换为答案:;ai как по-английски "предварительный расчёт";;。无需设置片段——此功能已内置,而且会读取两个标记之间的所有内容,因此问题长度不限。按 Escape 或移动插入点即可取消;如果模型运行失败,你输入的文本会原样恢复。(SnippetExpander.swift)
  • ✨ {ai:} — 可在任意文本框中输入的 AI。 {ai: instruction} 占位符会在光标所在位置插入模型生成的内容,而且占位符支持嵌套,因此提示词可以使用实时上下文:;tldr 会将 {ai: Summarize in 3 bullets: {clipboard}} 展开为对你复制内容的摘要,;en 会将剪贴板内容翻译成英语,而一行自定义片段就能把任何重复的写作任务(礼貌拒绝、站会开场白、提交说明风格)变成三次按键。适用于 Slack、Jira、代码审查等任何需要输入文本的场景。(依托模型的知识和你的本地上下文;不会浏览网页。)

屏幕/窗口捕获会复用屏幕录制权限;提醒功能会请求一次“提醒事项”访问权限。(CaptureController.swift、OCR.swift、RegionCapture.swift、WindowCapture.swift、Reminders.swift)

面向远程团队负责人:承诺、人员、会议准备、文档
  • ✅ 承诺 — 每次记录会议后,系统都会在后台提取通话中作出的承诺(谁负责什么、截止时间是什么时候——“周五前”会变成真实的到期日期标签),并将其放入「承诺」标签页,分为我的承诺和等待他人兑现。勾选完成项,点一下即可将任意承诺发送到 Apple Reminders(它会在你的 iPhone 上提醒你),也可以手动添加;点击一下即可跳转到来源会议。菜单栏项目会显示未完成项的数量。导出可将未完成列表复制为 Markdown 任务清单(Notion/Obsidian/GitHub),或复制为每行一项的简洁任务列表——Todoist、Things 和 Linear 会将多行粘贴内容转换为单独的任务,并包含到期日期。;todos 代码片段可在你输入的任何位置粘贴未完成的承诺。(Commitments.swift)
  • 📇 人员 — 为每位同事创建一个页面,根据会议名单自动生成,无需任何设置:包含你的自由格式笔记(自动保存)、与对方参加过的所有会议、对方未兑现的承诺,以及按需生成的 AI 档案——根据对方出现过的会议转录内容撰写,涵盖职务与负责范围、兑现承诺的情况、工作风格和近期话题。(People.swift、PeopleView.swift)
  • 📋 会议准备 — 在包含参会者或通话链接的日历事件开始前几分钟(可在「设置」→「会议」中配置提前时间),「准备」标签页会滑入显示,不会抢走键盘焦点:谁会参加通话(附带你的笔记和对方未兑现承诺的数量)、上次与这些人开会时讨论了什么、你向他们承诺了什么以及他们向你承诺了什么——还有一个加入并录制按钮,一键打开 Zoom/Meet/Teams 链接并开始录制。也可按需打开:菜单 → 准备下次会议。(MeetingPrep.swift)
  • 📄 新建文档 — 选择一个模板(PRD、RFC、单页文档、复盘报告——均可编辑,也可在「设置」→「AI 与操作」中添加自定义模板),口述或粘贴简介,然后由智能模型填充模板各章节。简介中未提及的内容会如实标为 待定,并附上需要回答的问题——绝不编造事实。结果可直接编辑,点一下即可复制,并会保存到历史记录中,同时自动归档到某个项目。(DocTemplates.swift)
项目(整理所有内容并向其提问)

每条历史记录——听写、会议、采集结果——都会自动归档到某个项目:快速模型会根据每个项目的名称和描述(「设置」→「项目」)匹配条目;不确定或处于离线状态时则归入收件箱。可在「历史记录」窗口中重新分配任意条目(在详情窗格中使用项目选择器,或在侧边栏中筛选),还可运行一次分类现有历史记录,为该功能推出前记录的所有内容归档。

每个项目都会以纯 Markdown 格式映射到磁盘:~/Documents/Griasa/Projects/<Project>/YYYY-MM-DD-HHmm-<kind>-<id>.md,并带有 YAML frontmatter——可浏览、适合与 git/Obsidian 配合使用,而且永远不会被删除(移除项目时,其文件会移至收件箱)。

🗂 询问项目(⌃⌥⌘P 或通过菜单打开)会打开一个窗口,由智能模型以项目条目以及附加的源文件夹为上下文回答问题——可附加代码仓库、文档文件夹或其他内容;文本文件会按条目从新到旧的顺序读取,最多约 150k 个字符。回答会保存回项目的历史记录中。(Projects.swift、ProjectFiles.swift、ProjectAI.swift、AskProjectWindow.swift)

让助手读取你的会议(MCP)

开启 Settings → System → AI assistants (MCP) 后,Griasa 会在这台 Mac 上提供一个只读端点(127.0.0.1,端口 8179 或下一个可用端口,Bearer 令牌)。它可以回答八类问题:未兑现的承诺(你做出的承诺和你正在等待他人兑现的承诺)、某位同事、按关键词搜索会议、某场会议的摘要、会议转录(仅在有人请求时提供)、下一场会议的简报、人员、项目。无法通过它更改任何内容。

  • Claude Desktop — 一键安装。 按下 Add to Claude Desktop。Griasa 会将 Griasa.mcpb 写入其存储文件夹,并在 Claude Desktop 中打开;Claude Desktop 会要求你确认安装。该扩展是一个小型 Node 脚本(Node 内置于 Claude Desktop),负责将 Claude 的请求转发给应用;它每次都会从 mcp.json 读取端口和令牌,因此令牌更新或端口变更都不需要重新安装。Griasa 必须处于运行状态 — 如果没有运行,Claude 会提示你从菜单栏打开它。
  • Claude Code、Codex、Cursor 及其他客户端。 按下 Copy client configuration,并将配置块粘贴到客户端的 MCP 设置中。配置块的样子如下:{"mcpServers": {"griasa": {"type": "http", "url": "http://127.0.0.1:8179/mcp", "headers": {"Authorization": "Bearer …"}}}}。
  • 协议。 Streamable HTTP,MCP 2026-07-28(无状态;server/discover;每个请求都携带版本和标头),并在同一端点支持使用 initialize 握手的 2025-06-18 和 2025-11-25 客户端。工具包含标题、只读注释和输出架构。源码:MCPEndpoint.swift、MCPTools.swift、MCPBundle.swift。

助手读取的内容会被发送到该助手上下文所去的地方;会议转录是单独的工具,因此关于承诺的问题不会意外拉取会议转录。

通话期间的实时笔记

启用 Show live notes while recording(Settings → Meetings)。录音期间,中心页的 Recording tab 会使用已预热的 Whisper 服务,每隔约 18 秒分块转录双方音轨,并显示实时摘要(标题、要点、待解问题、行动事项)。开启 Auto 开关后,摘要每分钟刷新一次;也可以选择仅在按下 ⟳ Summarize now 时刷新。转录下方有一个笔记字段:你输入的任何内容都会以当前时间码固定到转录中(📝 行),作为高信号输入传给实时摘要,并融入最终会议笔记 — 模型会在 Summary/Key points/Action items 中体现你的笔记,并在转录中将其保留为 > 📝 **Note [mm:ss]:** 引用块。

无人停止的录音会在静音后停止

过去,如果录音时无人说话,录音会一直持续,直到有人发现 — 有一次录音整夜未停,填满了磁盘。当麦克风和 Mac 自带音频都持续一段时间没有检测到语音时,会弹出一个小窗口询问是否继续。Keep recording 会重新启动计时器,因此再次等待同样的时长后会再次询问,而不是只询问一次;如果没有回应,录音会自动停止,转录方式与手动停止完全相同,且转录的最后一行会说明录音已自动停止以及持续了多久。这两个时间间隔都可在 Settings → Meetings → Silence 中设置(默认分别为五分钟和两分钟)。如果问题弹出时语音恢复,问题会消失,录音继续。(SilenceWatch.swift、SilenceLevel.swift)

一个集线器窗口,告别弹窗泛滥

所有内容都集中在一个带标签页的浮动集线器窗口中:操作结果、实时录音标签页、自定义提醒日期选择器、“通话中有哪些人?”问题、Ask Project 和历史记录。忙碌时刻——一边录制通话,一边根据预设结果设置提醒——只需一个包含三个标签页的窗口,而不是三个争抢焦点的窗口。关闭标签页会妥善结束对应流程(关闭的提醒会删除其孤立录音片段;关闭参与者标签页会视为“跳过”,确保转录流程不会停滞)。标签页旁的固定按钮可在切换应用时让窗口保持打开状态——面板默认会在失去激活状态时隐藏,这适合弹窗,却不适合花一小时查看历史记录。只有设置(标准 macOS 设置场景)和系统对话框(文件保存/打开、区域拖拽截屏叠层)会留在窗口之外。(HubWindow.swift)

说话人姓名

设置你的姓名并启用询问通话参与者(设置 → 会议)。录音停止后,Griasa 会询问哪些已知人员参与了通话(名单会被记住),以及是否有新成员;模型会根据自我介绍、彼此直呼姓名等对话线索,将转录内容归属到真实姓名,而不是笼统的“你”/“他们”。这种归属方式基于内容(两条音轨分别是麦克风和其他所有音频,并非按说话人分轨),因此提供名单时准确度最高。

会议录音 + AI 转录
  • 菜单栏 → 开始录音(或在设置中启用启动 Griasa 时开始录音,以便始终捕获音频)。
  • 停止录音后,Griasa 会自动:
    1. 在设备上按 30 秒分段转录两条音轨,并添加时间戳(所有受支持的提供商都只处理文本,因此语音转文本始终在本地完成——只有文本会离开设备)。
    2. 按时间顺序交错合并两条音轨,生成 You: / Them: 对话(transcript-raw.txt)。
    3. 将对话发送给已配置的智能模型,由其修正识别错误并生成 meeting-transcript.md,其中包含摘要、要点、行动项以及整理过并标注说话人的转录内容,然后打开该文件(可切换此选项)。
  • 没有 API 密钥时,仍会在 meeting-transcript.md 中生成合并后的原始转录。
  • ~/Documents/Griasa Recordings/<timestamp>/ 下的每个会话文件夹都包含:
    • microphone.caf — 你的语音
    • system-audio.caf — Mac 播放的所有音频(通话参与者、视频……)
    • transcript-raw.txt — 带时间戳的合并对话
    • meeting-transcript.md — AI 整理的会议记录
  • 此外,每份完成的转录内容都可以复制到镜像文件夹,由你指定路径(设置 → 文件夹 → 转录镜像文件夹;默认留空,因此除非你主动设置,否则不会重复保存)。将其指向编码 Agent 的项目目录、Obsidian 库或 git 仓库,会议记录就会以纯 Markdown 文件的形式出现在其中。
  • 会话运行时,菜单栏图标会显示红色录音标记;模型处理期间,菜单中会显示进度。

⚠️ 同意:根据你所在的司法管辖区,录制通话可能需要取得所有参与者的同意(许多地方要求双方同意)。请告知他人你正在录音。

架构

Sources/Griasa/
├── GriasaApp.swift          # MenuBarExtra app entry
├── AppState.swift           # Central state + settings (UserDefaults)
├── HotkeyMonitor.swift      # Global flagsChanged monitor (hold-to-talk)
├── MicCapture.swift         # Single shared AVAudioEngine mic tap, multi-consumer
├── DictationEngine.swift    # Parallel per-language recognizers, best-confidence pick
├── Vocabulary.swift         # Built-in tech/crypto contextual vocabulary
├── LLMProvider.swift        # Provider config (Anthropic/OpenAI/Gemini/local) + fallback consent
├── AIFormatter.swift        # Provider router, dictation cleanup + local fallback
├── TextInserter.swift       # Pasteboard swap + synthetic ⌘V
├── SystemAudioCapture.swift # ScreenCaptureKit audio stream → .caf
├── ConversationRecorder.swift # Session folders, mic+system tracks
├── WhisperTranscriber.swift # whisper.cpp integration (preferred engine)
├── WhisperInstaller.swift   # First-launch auto-install: brew + model download
├── FileTranscriber.swift    # Apple-recognizer fallback (chunked, timestamped)
├── MeetingTranscriber.swift # Merge tracks + AI meeting-notes formatting
├── Permissions.swift        # TCC requests/status
├── SelectionActions.swift   # Global preset hotkeys, selection grab
├── PromptPresets.swift      # Prompt-preset model + store (built-in + custom)
├── HubWindow.swift          # The shared tabbed hub window all activities open in
├── PopupController.swift    # Result tab content (preset/action output)
├── HistoryStore.swift       # Persistent searchable history
├── HistoryWindow.swift      # History browser (hub tab)
├── Participants.swift       # Speaker roster + "who's who" prompt
├── LiveNotes.swift          # Realtime transcript, typed notes + running summary
├── LiveTyper.swift          # Synthetic keystrokes for live dictation typing
├── CaptureController.swift  # Capture actions: remind / OCR / draft reply / clipboard
├── CaptureAI.swift          # AI calls for reminder parsing + reply drafting
├── OCR.swift                # On-device text recognition (Apple Vision)
├── RegionCapture.swift      # Interactive screen-region screenshot
├── WindowCapture.swift      # Frontmost-window screenshot
├── Reminders.swift          # EventKit reminder creation
├── ReminderSource.swift     # source app / window / tab URL for reminders
├── Projects.swift           # Project model + store (auto-categorized history)
├── ProjectFiles.swift       # Markdown mirror: one .md per entry per project
├── ProjectAI.swift          # AI classification + Ask Project context/Q&A
├── AskProjectWindow.swift   # Ask Project window (question → answer over context)
├── Exporter.swift           # Markdown → MD/PDF/HTML/RTF/plain export + rich copy
├── Prompts.swift            # EVERY system prompt, in one place (JSON-overridable)
├── Snippets.swift           # Snippet model + store (defaults incl. ;meet)
├── SnippetEngine.swift      # Placeholder rendering: date/clipboard/meetlink/slot/ai
├── SnippetExpander.swift    # Type-anywhere abbreviation expansion + `;ai … ;;` inline ask
├── FreeSlotFinder.swift     # EventKit free-slot search for {slot}
├── Commitments.swift        # Promise model/store + AI extraction from meetings
├── CommitmentsView.swift    # ✅ Commitments hub tab (mine / theirs / done)
├── People.swift             # Person pages store, avatars, AI dossier
├── PeopleView.swift         # 📇 People hub tab (notes, meetings, promises)
├── MeetingPrep.swift        # Calendar watcher + pre-meeting brief assembly
├── PrepView.swift           # 📋 Prep hub tab (countdown, Join & Record)
├── DocTemplates.swift       # Editable PRD/RFC/1-pager/postmortem templates + generator
├── NewDocumentView.swift    # 📄 New Document hub tab (brief → filled draft)
├── OnboardingView.swift     # First-launch welcome guide + live permission checklist
├── UsageStats.swift         # Lifetime dictation counters ("time saved vs typing")
├── UpdateChecker.swift      # Daily GitHub-Releases update check (pre-Sparkle)
├── BuildConfig.swift        # ← fork here: support email, donate URL, update repo
├── Support.swift            # Donate / feedback actions driven by BuildConfig
├── HubStyle.swift           # Shared hub visual language: cards, empty states
├── MenuView.swift           # Menu-bar popover UI
└── SettingsView.swift       # Settings window

设计说明:

  • 一个麦克风采集,多处使用 — MicCapture 安装一个 AVAudioEngine 采集点并将缓冲区分发给多个使用方,因此听写和录音不会争用输入设备。
  • 隐私优先的转录 — 当语言区域支持时,Apple 识别器会在设备上运行(requiresOnDeviceRecognition)。只有简短的润色步骤会将文本(绝不发送音频)发送给已配置的提供商,而且只有在你启用该功能后才会发送。
  • 通过 ScreenCaptureKit 捕获系统音频 — 这是 macOS 13+ 上捕获应用音频的受支持方式;视频通道配置为 2×2 px、1 fps 的流,然后丢弃。

已知限制 / 想法

  • 说话人分离目前仅支持两方(“你”=麦克风,“对方”=系统音频);无法区分多个远程参与者。使用 Whisper.cpp 加上说话人分离功能可以改进这一点。
  • 目前还没有个人词典或免手操作切换模式。Prompts.swift(键 dictationCleanup)是注入自定义词典的位置。
  • 录音会保留为两个独立音轨,而不是混合成一个文件;这是有意为之(转录文本更清晰),不过可以通过 ffmpeg -filter_complex amix 后处理步骤生成单个文件。
  • 使用的模型是 large-v3-turbo——根据已发布的基准测试,其平均 WER 仅比完整的 large-v3 高约 0.4 个百分点,同时速度约快 4 倍,因此适用于听写延迟和会议处理量。如果未来俄语准确度比速度更重要,可将 ggml-large-v3.bin 放入 ~/Library/Application Support/Griasa/(3 GB),并更新 WhisperTranscriber.swift 中的文件名。
  • Whisper 每个语音片段只检测一种语言;句中频繁切换语言时,结果可能会以占主导地位的语言输出(AI 清理步骤会修正技术术语)。
  • Apple 备用语言检测会并行地为每种配置的语言运行一个识别器——请保持语言列表较短(2–3 种)。

许可证

GPL-3.0。构建、修改并分享——衍生作品也必须遵循相同许可证开源。如果 Griasa 为你节省了时间,欢迎点击菜单中的 ♥ 按钮表示支持。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。