mcpField
F
facetimemcp

facetimemcp

本地服务
github.com/aernouddekker通信协作58 周前更新

关于 facetimemcp

facetimemcp 是面向 MCP 客户端的本地 macOS MCP 服务,可发起电话和 FaceTime 通话。它通过 macOS URL 方案操作;蜂窝电话需配对 iPhone 并启用 Continuity。

主要功能

  1. 01通过配对的 iPhone 拨打电话
  2. 02发起 FaceTime 音频通话
  3. 03发起 FaceTime 视频通话
  4. 04规范化并验证电话号码

适用场景

  1. 01从 MCP 客户端发起电话呼叫
  2. 02通过 FaceTime 音频联系对象
  3. 03发起 FaceTime 视频通话
  4. 04拨号前验证电话号码

MCP 相关

向 MCP 客户端提供三个发起通话的工具。服务通过 stdio 在本地运行,并将 tel:// 或 facetime:// URL 交给 macOS 的 open 命令。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"aernouddekker-facetimemcp": {
"command": "npx",
"args": [
"-y",
"@aernoud/facetimemcp"
]
}
}
}
启动命令npx -y @aernoud/facetimemcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@aernoud/facetimemcp0.1.1

工具

还没有获取到工具列表

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

详细介绍

macos-mcp

适用于 macOS 原生应用的 MCP 服务——让 Claude Code、Claude Desktop 和任何 MCP 客户端都能原生访问 Mail、Numbers、Contacts、Calendar、Reminders 以及 FaceTime/电话。

无需 API 密钥、OAuth 或云服务。通过 AppleScript 和 URL 方案(tel://、facetime://)直接与 macOS 应用通信。在你的 Mac 上本地运行。

CUPS 打印(printmcp)曾经属于此项目;它已移至 office-mcp,因为它是 Shell 封装,而不是 AppleScript 桥接。

服务

Mail(mailappmcp)——21 个工具

适用于 Mail.app 中配置的所有电子邮件账户——iCloud、Gmail、Outlook、Fastmail 等。

工具描述
list-mailboxes列出所有账户中的邮箱及未读邮件数量
list-accounts列出已配置的邮件账户及其电子邮件地址和类型
list-signatures列出可用的电子邮件签名
search-messages按主题或发件人搜索邮件(查询为空时列出全部)
read-message阅读指定邮件的完整内容
get-message-source获取邮件的原始 RFC822 源内容
list-attachments列出邮件附件及其名称、MIME 类型和大小
save-attachment将电子邮件附件保存到磁盘
compose-message在 Mail.app 中创建草稿(不会发送)——支持纯文本或通过 htmlBody 设置 HTML 正文,也支持附件
send-message立即发送电子邮件(支持 from、附件,以及通过 htmlBody 设置纯文本或 HTML 正文)
reply-to-message回复或回复所有人——正确关联邮件会话,并支持带品牌标识的 htmlBody 或附件
forward-message将邮件转发给新收件人
redirect-message重定向邮件(保留原始发件人)
move-messages在邮箱之间移动邮件
delete-messages按 Message-ID 删除邮件
mark-as-read将邮件标记为已读
mark-as-junk将邮件标记为垃圾邮件或取消标记
flag-message标记或取消标记邮件,支持颜色
set-message-color设置邮件列表中邮件的背景颜色
check-for-new-mail为一个或所有账户触发邮件获取
extract-email-address将 "John Doe <[email protected]>" 解析为姓名和地址
Numbers(numbersmcp)— 29 个工具

适用于任何已打开的 Numbers 电子表格。

工具描述
list-spreadsheets列出所有已打开的 Numbers 文档
create-document创建新的 Numbers 文档
list-sheets列出文档中的工作表和表格
get-active-sheet获取当前活动工作表
read-range读取指定区域的单元格值(例如,“A1:C10”)
read-table将整个表格读取为结构化数据
write-cell向指定单元格写入值
write-range向指定区域写入多个值
clear-range清除单元格区域的内容和格式
get-formula获取单元格中的公式
set-formula为单元格设置公式
add-row在表格末尾添加一行
delete-row删除表格中的一行
add-column在表格中添加一列
delete-column删除表格中的一列
resize-row-column设置行高或列宽
add-sheet在文档中添加新工作表
delete-sheet删除工作表
rename-sheet重命名工作表
add-table在工作表中添加新表格
delete-table删除工作表中的表格
rename-table重命名表格
sort-table按列对表格排序
transpose-table交换表格的行和列
merge-cells合并单元格区域
unmerge-cells取消合并之前已合并的单元格
set-cell-format设置单元格格式(数字、货币、日期、百分比等)
set-cell-style设置字体、颜色、背景、粗体、斜体和对齐方式
export-document导出为 PDF、Excel 或 CSV
联系人(@aernoud/contactsmcp)— 15 个工具

使用系统通讯录,其中包含所有已同步到 Contacts.app 的帐户。

工具描述
search-contacts按姓名、电子邮件或电话号码搜索联系人
search-by-modification-date查找在指定日期之后修改的联系人
read-contact获取联系人的完整详细信息
get-my-card获取用户自己的联系人名片
get-vcard将联系人导出为 vCard 3.0 文本
create-contact创建新联系人
update-contact更新联系人字段
delete-contact删除联系人
list-groups列出所有联系人群组
create-group创建新的联系人群组
rename-group重命名联系人群组
delete-group删除联系人群组
add-to-group将联系人添加到群组
remove-from-group将联系人从群组中移除
list-group-members列出群组中的所有联系人
日历(calendarmcp)— 25 个工具

适用于 Calendar.app 中配置的所有日历——iCloud、Google、Exchange、本地日历等。

工具描述
list-calendars列出所有日历及其名称、可写标记和描述
get-calendar按名称获取单个日历的属性(包括事件数量)
create-calendar创建新日历
update-calendar重命名日历或设置其描述
delete-calendarCalendar.app 不支持——返回描述性错误;必须通过 Calendar.app 界面移除日历
switch-view将 Calendar.app 切换到日/周/月视图,可选择跳转到指定日期
reload-calendars强制 Calendar.app 从账户刷新
list-events列出日历中两个 ISO 日期之间的事件
search-events在指定日期范围内按摘要子字符串搜索事件(默认范围:−30 天至 +365 天)。限定到单个日历可提高速度
get-event按 uid 获取完整事件详情
create-event创建事件,可设置摘要、开始时间、结束时间,以及可选的位置/描述/url
update-event按 uid 更新事件的任意字段
delete-event按 uid 删除事件
move-event将事件移至其他日历(先删除再创建;会生成新的 uid)
duplicate-event将事件复制到同一日历或其他日历
today-events列出单个日历或所有日历中的今日事件
upcoming-events列出未来 N 天内的事件
list-attendees列出事件的参加者
add-attendee添加参加者,可设置邮箱和可选的显示名称
remove-attendee按邮箱移除参加者
list-alarms列出事件的显示、邮件和声音提醒
add-display-alarm添加在事件开始前 N 分钟触发的显示提醒
add-sound-alarm添加在事件开始前 N 分钟触发的声音提醒
add-mail-alarm添加在事件开始前 N 分钟触发的邮件提醒
remove-alarm根据 list-alarms 输出中的从 1 开始的索引移除提醒
提醒事项(@aernoud/remindersmcp)— 22 个工具

适用于 Reminders.app 中配置的所有提醒事项列表——iCloud、Exchange、本地列表等。

工具描述
list-accounts列出 Reminders.app 中所有账户及其名称和 id
list-lists列出所有提醒事项列表,可限定到某个账户
get-list获取单个列表的属性(id、账户、颜色、标志、未完成和已完成数量)
create-list创建新列表,可选择将其放入指定账户
update-list重命名列表
delete-list删除列表(Reminders.app 可通过 AppleScript 直接执行此操作,而 Calendar.app 不支持)
show-list在 Reminders.app 中将列表置于前台
list-reminders列出指定名称列表中的提醒事项(默认不包括已完成项)
search-reminders按名称子字符串搜索提醒事项;限定到单个列表可提高速度
get-reminder按 id 获取完整提醒事项详情
today-reminders列出今天到期的提醒事项,可限定到单个列表或所有列表
upcoming-reminders列出未来 N 天内到期的提醒事项
overdue-reminders列出已过期且尚未完成的提醒事项
create-reminder创建提醒事项,可设置正文、到期日期或全天到期日期、提醒日期、优先级和标记状态
update-reminder按 id 更新提醒事项的任意字段
delete-reminder按 id 删除提醒事项
complete-reminder将提醒事项标记为已完成(Reminders 会自动记录完成日期)
uncomplete-reminder将先前已完成的提醒事项标记为未完成
move-reminder将提醒事项移至其他列表(使用原生 move 动词——id 会保留)
flag-reminder设置或清除标记状态
set-priority将优先级设为无/高/中/低(分别映射到 Reminders 的 0/1/5/9 枚举值)
show-reminder将 Reminders.app 置于前台并聚焦到指定提醒事项
FaceTime(facetimemcp)——3 个工具

通过将 URL 方案交给 open 来发起通话。电话通话需要通过 Continuity 配对的 iPhone(这样 macOS 才能通过手机路由通话)。

工具描述
call-phone通过配对的 iPhone 发起蜂窝电话通话(tel://)
call-facetime-audio向电话号码或 Apple ID 邮箱发起 FaceTime 音频通话
call-facetime-video向电话号码或 Apple ID 邮箱发起 FaceTime 视频通话

电话号码会规范化并验证为 E.164 格式(+15551234567);空格、连字符和括号均可接受。macOS 可能会在拨号前显示确认提示——这是设计使然,无法完全静默地拨号。

要求

  • macOS(使用 AppleScript——无法在 Linux/Windows 上运行)
  • Node.js 18+

安装

从 npm 安装
npm install -g mailappmcp            # Mail server
npm install -g numbersmcp            # Numbers server
npm install -g @aernoud/contactsmcp  # Contacts server
npm install -g @aernoud/calendarmcp  # Calendar server
npm install -g @aernoud/remindersmcp # Reminders server
npm install -g @aernoud/facetimemcp  # FaceTime / phone calls
从源代码安装
git clone https://github.com/aernouddekker/macos-mcp.git
cd macos-mcp
npm install
npm run build

配置

Claude Code

添加到 ~/.claude/settings.json 或项目的 .mcp.json:

{
  "mcpServers": {
    "mailappmcp":   { "command": "npx", "args": ["-y", "mailappmcp"] },
    "numbersmcp":   { "command": "npx", "args": ["-y", "numbersmcp"] },
    "contactsmcp":  { "command": "npx", "args": ["-y", "@aernoud/contactsmcp"] },
    "calendarmcp":  { "command": "npx", "args": ["-y", "@aernoud/calendarmcp"] },
    "remindersmcp": { "command": "npx", "args": ["-y", "@aernoud/remindersmcp"] },
    "facetimemcp":  { "command": "npx", "args": ["-y", "@aernoud/facetimemcp"] }
  }
}
Claude Desktop / Cowork

添加到 ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "mailappmcp":   { "command": "npx", "args": ["-y", "mailappmcp"] },
    "numbersmcp":   { "command": "npx", "args": ["-y", "numbersmcp"] },
    "contactsmcp":  { "command": "npx", "args": ["-y", "@aernoud/contactsmcp"] },
    "calendarmcp":  { "command": "npx", "args": ["-y", "@aernoud/calendarmcp"] },
    "remindersmcp": { "command": "npx", "args": ["-y", "@aernoud/remindersmcp"] },
    "facetimemcp":  { "command": "npx", "args": ["-y", "@aernoud/facetimemcp"] }
  }
}

工作原理

每个服务都通过 stdio 在本地运行。Mail、Numbers 和 Contacts 服务会构建 AppleScript 字符串,通过 osascript 执行,并将结构化输出解析回 JSON。Print 服务会调用 CUPS 命令(lp、lpstat、lpoptions、cancel);FaceTime 服务会将 tel:// / facetime:// URL 交给 open。共享软件包(@mailappmcp/shared)提供 AppleScript 运行器、通用命令运行器(runCommand)、字符串转义和基于分隔符的解析功能。

应用生命周期——保持原状

Mail、Calendar、Contacts 和 Reminders 需要各自的应用正在运行,才能响应 AppleScript。无需让这些应用一直保持打开状态,每个服务都会在首次使用时自动启动相应应用,并在之后进行清理:

  • 首次调用会涉及某个应用的工具时,服务会检查(通过 pgrep)该应用是否已在运行。如果没有,就会在后台启动它(open -g -a),不会抢占焦点,并等待最多 5 秒,直到应用接受 AppleEvents,然后再运行工具。
  • 该状态会在进程内保留,持续时间与 MCP 服务的生命周期相同。之后针对同一应用的工具调用会跳过探测并复用正在运行的应用——不会反复承担启动开销。
  • 服务关闭时(SIGTERM / SIGINT / SIGHUP / 正常退出——例如 Claude Desktop 断开服务连接或聊天结束时),服务只会退出由它启动的应用。服务启动前已打开的应用会保持不变。
  • 边缘情况:如果服务被强制终止(SIGKILL),退出处理程序无法运行,因此任何自动启动的应用都会继续运行。这与从未启动过该服务的情况相同。

这意味着,你可以放心使用这些工具,不必担心会话结束后留下大量启动一半的应用,也不必担心服务会关闭你正在使用的应用。

安全性
  • compose-message 会打开可见的草稿——发送前可先检查
  • send-message 是单独且明确的操作
  • reply-to-message 和 forward-message 默认以草稿模式运行(sendImmediately: false)
  • delete-messages 会将邮件移至废纸篓(Mail.app 的标准行为)
HTML 邮件

compose-message 和 send-message 接受可选的 htmlBody 参数。提供此参数时,邮件会以富文本/HTML 格式创建,收件人看到的是渲染后的格式(标题、粗体、列表、可点击链接),而不是原始标签。仍然必须提供 body,它会作为纯文本回退内容,供读取纯文本内容的客户端使用。省略 htmlBody 即采用现有的纯文本行为——完全向后兼容。

// send-message with HTML body
{
  "to": ["[email protected]"],
  "subject": "Weekly update",
  "body": "Highlights:\n- Shipped feature X\n- Fixed bug Y",
  "htmlBody": "<h2>Highlights</h2><ul><li>Shipped <b>feature X</b></li><li>Fixed bug Y — see <a href=\"https://example.com/issue/42\">#42</a></li></ul>"
}

在底层,compose-message / send-message 的 HTML 路径使用 JXA(osascript -l JavaScript)以及 Mail.app 对外发邮件运行时提供的 htmlContent setter。纯文本路径仍使用常规 AppleScript。

正确保持对话线程的品牌化回复

reply-to-message 还接受 htmlBody,可生成既带有品牌样式又能正确保持对话线程的回复。Mail 的脚本模型无法设置任意 RFC 标头,而外发回复的富文本编辑器无法通过 AppleScript content 属性写入,因此此前单独使用这两种工具都无法同时实现这两点。现在,回复工具会:

  1. 调用 Mail 原生的 reply 动作来创建回复,并填充 In-Reply-To / References 标头(这些是与正文相互独立的邮件属性),然后
  2. 将带有品牌样式的 HTML 作为 public.html 放到剪贴板上,并将其粘贴(Cmd-V)到自动引用的对话线程上方。

最终效果是:品牌样式以内嵌形式显示,保留引用的对话线程,并包含严格客户端(Outlook、Gmail web)要求的线程标头,以便将回复嵌套在对话中。

// reply-to-message with a branded HTML body
{
  "account": "iCloud",
  "mailbox": "INBOX",
  "messageId": "<[email protected]>",
  "body": "Thanks — see below.",       // ignored when htmlBody is set
  "htmlBody": "<p>Thanks for reaching out — here's the update:</p><ul><li><b>Status:</b> shipped</li></ul>"
}

限制:

  • 回复时不能同时使用 htmlBody 和 attachments(Mail 在构成 MIME 多部分内容时会重新解析 HTML,导致渲染后的正文损坏)——如果同时传入两者,工具会返回错误。请先发送带有品牌样式的回复,再通过单独的回复附加文件。
  • 提供 htmlBody 时,会忽略纯文本 body;Mail 会根据粘贴的富文本生成纯文本 MIME 替代内容。
  • 粘贴时需要 Mail 短暂保持焦点;如果焦点丢失,脚本会安全中止(并恢复剪贴板内容)。
验证 HTML/品牌化回复

生成品牌化回复后,请确认这两部分都正常工作:

  1. 渲染检查——打开 Mail 创建的草稿。品牌样式应以格式化富文本显示(标题、粗体、链接),而不是原始的 <tags>,并位于引用的原始邮件上方。
  2. 线程/标头检查——将回复发送给使用严格客户端(Outlook 或 Gmail web)的收件人,并确认回复嵌套在原始对话中,而不是作为一封独立消息显示。也可以对已发送的回复运行 get-message-source,确认其中包含指向原始 Message-ID 的 In-Reply-To: 和 References: 标头。
  3. 剪贴板检查——确认操作完成后剪贴板仍保留之前的内容(工具会在粘贴前保存剪贴板内容,并在之后恢复)。
  4. 附件限制检查——同时使用 htmlBody 和 attachments 调用 reply-to-message 时,应返回清晰的错误,而不是生成损坏的草稿。

已知限制

通用
  • 每次调用 osascript 的超时时间为 30 秒
  • 首次使用时会自动启动应用;服务器关闭时,如果应用此前未运行,则会退出——请参阅应用生命周期——保持原状
Mail
  • 对于接受 messageId 或 messageIds 的 Mail 工具,建议使用 search-messages 返回的数字字符串 id。仍支持 RFC messageId 值,但比较这些值时会加载整个邮箱中的邮件标头,即使超过 30 秒的超时时间后,Mail 也可能仍处于忙碌状态。本地 ID 仅适用于此 Mac 的 Mail 邮件库;移动邮件或重建邮件库后,请重新搜索。
  • AppleScript 中的 content contains 搜索在大型邮箱中可能很慢——Mail 服务器默认会搜索主题和发件人
Numbers
  • Numbers 工具需要打开的文稿
日历

以下是 Calendar.app 的 AppleScript 接口本身的限制,并非 MCP 服务的限制:

  • 无法通过 AppleScript 删除日历。 在所有现代 macOS 版本中,delete calendar 都会引发 -10000(AppleEvent 处理程序失败)。delete-calendar 工具会检查日历是否存在,然后返回描述性错误——你必须在 Calendar.app 侧边栏中手动移除日历(右键单击 → 删除)。
  • 日历没有可用的 id/uid。 Calendar.app 的 calendar 类不会通过 AppleScript 提供稳定的 id(uid of 会引发 -10000)。因此,所有日历工具都按名称识别日历——请确保日历名称唯一。
  • whose 筛选器会对事件执行 O(n) 扫描。 AppleScript 会扫描日历中的每个事件,以评估 whose start date ≥ X 谓词。在繁忙的多日历存储中,即使是跨所有日历查询空的 7 天范围,也可能耗时 60 秒以上,并超过 30 秒的 osascript 超时时间。请尽可能始终为 list-events、search-events、today-events 和 upcoming-events 传入 calendarName,以限定扫描范围。search-events 还会强制限定日期范围(默认:−30 天至 +365 天)。
  • move-event 会重新分配 uid。 Calendar.app 无法在日历之间重新归属事件。该工具会删除源事件,并在目标日历中创建新事件;新事件会获得新的 uid(与 oldUid 一起以 newUid 返回)。
  • 重复规则以原始 RRULE 字符串形式提供(例如 FREQ=WEEKLY;INTERVAL=1)——仅支持读取和写入,不支持解析或展开。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

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

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