mcpField
S
skylight-mcp

skylight-mcp

本地服务
github.com/chrischall生产力165 天前更新

关于 skylight-mcp

skylight-mcp 将 Skylight Calendar 接入 Claude 等 MCP 客户端,面向家庭日程管理。其工具涵盖日历事件、共享清单、家务、奖励、餐食、消息、媒体以及设备和账户设置,支持读取与写入。

主要功能

  1. 01读取和编辑日历事件
  2. 02管理共享清单及条目
  3. 03创建和更新家务与奖励
  4. 04规划餐食并管理食谱
  5. 05处理消息、相册和媒体
  6. 06管理设备、家庭成员及账户设置

适用场景

  1. 01更新家庭日程和共享清单
  2. 02跟踪家务、积分与奖励
  3. 03规划餐食并将食材加入采购清单
  4. 04管理设备设置和家庭成员

MCP 相关

这是一个 MCP 服务,将 Skylight Calendar 操作作为工具提供给 MCP 客户端。它使用 stdio 传输,支持无状态工具发现和既有初始化握手。

配置

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

mcp.json · 通用配置
{
"mcpServers": {
"chrischall-skylight": {
"command": "npx",
"args": [
"-y",
"skylight-mcp"
],
"env": {
"SKYLIGHT_REFRESH_TOKEN": "<SKYLIGHT_REFRESH_TOKEN>",
"SKYLIGHT_EMAIL": "<SKYLIGHT_EMAIL>",
"SKYLIGHT_PASSWORD": "<SKYLIGHT_PASSWORD>",
"SKYLIGHT_FRAME_ID": "<SKYLIGHT_FRAME_ID>",
"SKYLIGHT_NAME": "<SKYLIGHT_NAME>",
"SKYLIGHT_TOKEN_CACHE": "<SKYLIGHT_TOKEN_CACHE>",
"SKYLIGHT_TOKEN_FILE": "<SKYLIGHT_TOKEN_FILE>",
"SKYLIGHT_BASE_URL": "<SKYLIGHT_BASE_URL>",
"SKYLIGHT_APPLE_APP_PASSWORD": "<SKYLIGHT_APPLE_APP_PASSWORD>",
"SKYLIGHT_APPLE_ID": "<SKYLIGHT_APPLE_ID>",
"SKYLIGHT_UPLOAD_DIR": "<SKYLIGHT_UPLOAD_DIR>"
}
}
}
}
启动命令npx -y skylight-mcp
需要配置的环境变量
SKYLIGHT_REFRESH_TOKEN密钥An OAuth refresh token you already hold. Supply this and no password is needed — the login is skipped entirely.
SKYLIGHT_EMAILSkylight account email. Pair with SKYLIGHT_PASSWORD for direct login. Needed only if you are not supplying SKYLIGHT_REFRESH_TOKEN.
SKYLIGHT_PASSWORD密钥Skylight account password — required iff SKYLIGHT_EMAIL is set. Needed only if you are not supplying SKYLIGHT_REFRESH_TOKEN.
SKYLIGHT_FRAME_IDOptional: pick a specific Skylight frame when the account has more than one.
SKYLIGHT_NAMEFriendly account name used in startup logs.
SKYLIGHT_TOKEN_CACHE密钥Set to false to disable the on-disk token cache and re-authenticate on every process start. Defaults to enabled.
SKYLIGHT_TOKEN_FILE密钥Absolute path for the token cache file. Defaults to $MCP_DATA_DIR/.skylight-mcp/tokens.json.
SKYLIGHT_BASE_URLOverride the API base (default https://app.ourskylight.com/api). The auth origin is derived from it, so pointing this elsewhere moves the login flow too — and the new host must be added to the registration’s egress allowlist, or every call is blocked.
SKYLIGHT_APPLE_APP_PASSWORD密钥Optional: an app-specific password from appleid.apple.com, used only by skylight_link_apple_calendar. Env-only by design — the tool takes no password argument, so the credential never passes through the model or the transcript.
SKYLIGHT_APPLE_IDOptional: the Apple ID email skylight_link_apple_calendar links; the tool's email argument overrides it.
SKYLIGHT_UPLOAD_DIROptional: directories that the photo-upload, event-import-from-photo and avatar tools may read files from (several separated by ':', or ';' on Windows; '~' allowed). Any other path is refused. Unset: ~/Pictures and ~/Downloads, or only $MCP_DATA_DIR/uploads in a hosted deployment.

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

安装包
npmskylight-mcp1.4.6

工具

114

收录的工具列表 · 更新于 1 周前

此工具无需参数。

详细介绍

skylight-mcp

CI npm license

适用于 Skylight Calendar 的 MCP 服务,提供 114 个工具,涵盖日历事件(读写)、共享列表(读写)、家务和奖励(读写)、任务盒项目(读写)、餐食(读写)、AI 自动创建(餐食计划和活动创意生成器,支持草稿审核/批准)、消息和相册(读写)、照片/视频上传,以及相框/设备/账户设置、日历和成员管理(读写,包括预设头像和自定义照片头像)。

每个 API 请求都会携带 skylight-api-version: 2026-05-01 标头(与官方移动应用一致);缺少该标头时,部分功能会返回 422 错误,提示“API version does not support …”。

MCP 协议支持

该服务使用官方 TypeScript SDK v2,并通过 stdio 支持无状态的 2026-07-28 协议修订版。客户端无需初始化握手即可发现和调用工具。现有客户端仍可使用 2025-11-25 握手。

传输方式仍为 stdio。宿主可以通过经过身份验证的 HTTP 对外提供服务。此软件包不会打开网络监听端口。

身份验证

该服务采用无头的电子邮件地址+密码 OAuth2 授权码流程,无需 SSO、2FA 或浏览器扩展。若你已有令牌,请使用 SKYLIGHT_REFRESH_TOKEN 进行配置;也可以使用 SKYLIGHT_EMAIL + SKYLIGHT_PASSWORD 登录并获取令牌。

首次调用工具时,服务会向 https://app.ourskylight.com 执行以下四个步骤:

  1. GET /auth/session/new — 获取 Rails CSRF 令牌和会话 Cookie。
  2. POST /auth/session — 使用电子邮件地址 + 密码登录(必须先于 OAuth 授权)。
  3. GET /oauth/authorize — 发送 S256 PKCE code_challenge(服务要求提供),并通过重定向接收一次性授权码。
  4. POST /oauth/token — 使用授权码和匹配的 code_verifier 换取 bearer access_token + refresh_token(目前有效期为 24 小时;客户端会读取返回的 expires_in,而非假定固定时长)。

OAuth 重定向会始终留在身份验证来源站点内。相对重定向会根据当前 URL 解析。配置的回调会提供授权码,但不会接收请求或会话 Cookie。遇到意外目标时,流程会失败,且错误中不会包含重定向 URL。

随后,客户端会主动刷新令牌(约在令牌过期前 60 秒),并在任何 401 错误时立即刷新。目前尚未观察到机器人防护墙,无头流程可直接通过 Node 运行。

**未设置环境变量 → 正常启动:**如果没有设置凭据,服务仍会正常启动,不会报错。身份验证会延迟到首次调用工具时进行,因此 MCP 宿主可以先完成安装时的工具列表读取,再配置凭据。

在自己的代码中使用身份验证辅助函数

该软件包还导出了 Skylight 的会话登录和令牌刷新功能,因此独立程序无需复制 src/ 即可进行身份验证:

import { login, refresh } from 'skylight-mcp/auth';

const tokens = await login({
  authBaseUrl: 'https://app.ourskylight.com',
  email: process.env.SKYLIGHT_EMAIL!,
  password: process.env.SKYLIGHT_PASSWORD!,
});
// Skylight rotates refresh tokens: store the one each call returns.
const next = await refresh({ authBaseUrl: 'https://app.ourskylight.com', refreshToken: tokens.refreshToken });

这是唯一的库入口;软件包中的其他内容均属于 MCP 服务。该软件包仅支持 ESM,并附带类型声明。

相框模型

Skylight 中的所有数据都归属于一个相框(家庭中心设备)。首次使用时,客户端会自动发现账户中的唯一相框。如果账户中有多个相框,请将 SKYLIGHT_FRAME_ID 设置为所需相框的 ID。每个读取相框范围数据的工具都接受可选的 frameId 参数,用于覆盖默认值。

工具

模块工具读/写描述
framesskylight_list_framesR列出账户上的所有相框
framesskylight_get_frameR获取特定相框的详细信息
framesskylight_list_frame_membersR列出与相框关联的成员
framesskylight_list_devicesR列出关联到相框的实体设备
framesskylight_get_plus_accessR获取 Skylight Plus 订阅/权益状态
framesskylight_get_reward_pointsR获取每位家庭成员的奖励积分余额
framesskylight_get_household_configR获取相框的家庭配置
framesskylight_list_calendarsR列出相框的日历账户和启用的日历
framesskylight_get_event_notification_settingsR获取相框的日历事件通知设置
framesskylight_resolve_memberR将家庭成员姓名解析为其类别 ID
framesskylight_get_calendarR获取一个日历账户
framesskylight_list_nudgesR列出指定日期范围内的提醒
framesskylight_update_frameW更新相框显示/休眠设置
framesskylight_rename_frameW重命名相框
framesskylight_update_profileW更新相框个人资料(姓名、生日)
framesskylight_update_household_configW更新家庭配置
framesskylight_set_reminder_profileW设置全局提醒频率(interval_weeks)
framesskylight_add_webcalW让相框订阅 webcal/ICS 日历 URL
framesskylight_update_calendarW设置已连接账户中启用哪些子日历
framesskylight_delete_source_calendarW移除已连接的源日历(包括 webcal 订阅)
framesskylight_set_default_calendarW设置新事件的默认源日历
framesskylight_link_apple_calendarW关联 Apple/iCloud 日历;应用专用密码从 SKYLIGHT_APPLE_APP_PASSWORD 获取,不会作为工具参数传入(需确认)
framesskylight_categorize_source_calendarW将源日历的事件归属到一位或多位家庭成员
framesskylight_create_source_calendarW根据原始提供方属性创建源日历(高级)
framesskylight_invite_userW通过电子邮件邀请用户加入相框(需确认)
framesskylight_approve_userW批准待处理的相框用户(需确认)
framesskylight_remove_userW从相框中移除用户(需确认;预览中会显示成员姓名)
framesskylight_delete_categoryW删除类别/家庭成员(可选 reassign_to_category_id,推断;需确认,预览中会显示成员姓名)
framesskylight_update_family_memberW更新家庭成员的个人资料——生日、饮食偏好(姓名即类别标签;通过 skylight_update_category 设置)
framesskylight_update_categoryW更新类别——重命名/更改颜色,或将标签转换为家庭成员个人资料(linked_to_profile)
framesskylight_create_categoryW创建类别/家庭成员(可选 linked_to_profile、avatar_id)
framesskylight_list_avatarsR列出预设头像库(表情符号/图标图片)
framesskylight_set_member_avatarW将家庭成员的头像设置为自定义照片(需确认)
framesskylight_set_device_albumW设置设备显示哪个相册(推断)
framesskylight_rename_deviceW重命名 Skylight 设备
eventsskylight_list_eventsR列出指定日期范围内的日历事件
eventsskylight_get_eventR获取特定事件的详细信息
eventsskylight_create_eventW创建新的日历事件(可选 category_ids,用于分配成员;设置 invited_emails 时需确认,预览中会列出所有收件人)
eventsskylight_update_eventW更新现有日历事件(可选 category_ids,用于分配成员;设置 invited_emails 时需确认)
eventsskylight_delete_eventW删除日历事件
eventsskylight_list_categoriesR列出相框的事件类别
eventsskylight_list_source_calendarsR列出关联到相框的外部源日历
eventsskylight_list_recent_invited_emailsR列出最近邀请过的电子邮件地址
eventsskylight_update_event_notification_settingsW更新日历事件通知设置
listsskylight_list_listsR列出相框上的所有共享清单
listsskylight_get_list_itemsR获取特定共享清单中的项目
listsskylight_create_listW创建新的共享清单(标签 + 颜色 + 类型)
listsskylight_update_listW更新清单的名称、颜色或类型
listsskylight_delete_listW删除共享清单及其项目(清单中有项目时需确认;预览中会列出这些项目)
listsskylight_add_list_itemW向共享清单添加项目
listsskylight_update_list_itemW重命名清单项目、勾选/取消勾选项目,或设置其分区
listsskylight_delete_list_itemW从共享清单中删除项目
listsskylight_delete_list_itemsW批量删除指定清单项目
listsskylight_move_list_itemW调整清单项目的顺序
listsskylight_clear_listW移除清单中的所有项目(一次批量删除;需确认,预览中会列出这些项目)
listsskylight_set_list_item_sectionW将清单项目移至指定名称的分区(或清除分区)
choresskylight_list_choresR列出指定日期范围内的家务任务
choresskylight_search_choresR搜索家务任务(包括未安排时间/模板任务)
choresskylight_create_choreW创建新的家务任务(摘要 + 类别)
choresskylight_create_recurring_choreW创建重复家务任务或例行事项(RRULE)
choresskylight_complete_choreW将家务任务标记为已完成
choresskylight_uncomplete_choreW重新打开家务任务(取消完成状态)
choresskylight_update_choreW更新家务任务(支持重复规则 + apply_to)
choresskylight_complete_chore_instanceW将某次重复家务任务标记为已完成
choresskylight_delete_choreW删除家务任务(通过 apply_to 指定某次任务或整个系列)
choresskylight_list_rewardsR列出为相框配置的奖励
rewardsskylight_get_rewardR获取一项奖励
rewardsskylight_create_rewardW创建奖励(名称 + 描述 + 积分值 + 兑换后是否重新生成 + category_ids)
rewardsskylight_update_rewardW更新奖励
rewardsskylight_delete_rewardW删除奖励
rewardsskylight_redeem_rewardW兑换奖励
rewardsskylight_unredeem_rewardW撤销奖励兑换
rewardsskylight_add_reward_pointsW向成员发放或扣除奖励积分
mealsskylight_list_mealsR列出指定日期范围内的计划餐食(date_min 和 date_max 均为必填项)
mealsskylight_list_recipesR列出相框的餐食食谱
mealsskylight_list_meal_categoriesR列出相框的餐食类别
mealsskylight_get_recipeR获取一份餐食食谱
mealsskylight_create_recipeW创建餐食食谱(meal_category_id + 摘要)
mealsskylight_update_recipeW更新餐食食谱
mealsskylight_delete_recipeW删除餐食食谱
mealsskylight_add_recipe_to_grocery_listW将食谱的食材添加到购物清单
mealsskylight_plan_mealW计划某日的餐食(可选择重复、关联食谱、添加到购物清单)
mealsskylight_update_mealW在选定的重复范围内更新计划餐食(名称、食谱、时段、备注、日期、重复规则)
mealsskylight_delete_mealW移除计划餐食——单次、此后所有餐食或整个系列(需确认)
messagesskylight_list_messagesR列出发布到相框的消息(读取分页动态流,最多 20 页)
messagesskylight_list_albumsR列出相框上的相册
messagesskylight_get_messageR获取一条相框消息
messagesskylight_create_albumW创建相册
messagesskylight_update_albumW更新相册(重命名、从幻灯片播放中隐藏)
messagesskylight_delete_albumW删除相册
messagesskylight_add_to_albumW将消息/照片添加到相册
messagesskylight_remove_from_albumW从相册中移除消息/照片
messagesskylight_copy_messages_to_framesW将消息/照片复制到账户上的其他相框(推断)
messagesskylight_add_message_commentW评论相框消息/照片
messagesskylight_set_message_captionW设置消息/照片说明
messagesskylight_like_messageW为相框消息/照片点赞
messagesskylight_unlike_messageW取消对消息/照片的点赞
messagesskylight_delete_messageW删除相框消息/照片
messagesskylight_delete_messagesW批量删除相框中的消息/照片(需确认,预览中会逐一列出 ID 及其说明)
tasksskylight_list_tasksR列出任务盒项目
tasksskylight_create_taskW创建任务盒项目
tasksskylight_update_taskW更新任务盒项目
tasksskylight_delete_taskW删除任务盒项目
aiskylight_generate_meal_planW为指定日期生成 AI 餐食计划(草拟餐食安排——异步)
aiskylight_generate_activity_ideasW为指定地点和时间范围生成 AI 活动/事件创意(草拟事件——异步)
aiskylight_get_auto_creation_intentR获取 AI 自动创建意图(状态 + 草稿结果)
aiskylight_list_auto_creation_draftsR列出 AI 意图草拟的事件(批准前请先审核)
aiskylight_list_auto_creation_intentsR列出相框上的所有 AI 自动创建意图
aiskylight_list_auto_creation_itemsR列出 AI 意图创建的所有草稿项目(餐食、活动、清单项目)
aiskylight_approve_auto_creationW将 AI 草拟的事件批准并加入实际日历
aiskylight_undo_auto_creationW撤销/丢弃 AI 自动创建意图及其草稿
photosskylight_upload_photoW从本地文件向相框上传照片/视频(需确认)
photosskylight_import_events_from_photoW使用 Skylight 的 AI 从传单/邀请函照片中导入日历事件(尽力而为;需确认)
healthskylight_healthcheckR报告连接器是否正常工作:解析到的凭据、Skylight 是否接受该凭据,以及需要修复的内容

配置

必填 — 以下二选一

你已有的刷新令牌(推荐:权限范围有限、可撤销,且不会触及受速率限制的登录端点):

SKYLIGHT_REFRESH_TOKEN=your-refresh-token

或登录凭据对,系统会为你生成刷新令牌:

[email protected]
SKYLIGHT_PASSWORD=your-password

同时设置两者也有效,而且是最稳妥的配置:优先使用令牌;如果令牌已过期,则会静默登录并生成替代令牌。仅使用令牌时,过期令牌会被报告为已过期——服务会明确说明,而不会声称尚未配置。

提供的刷新令牌只能使用一次。 Skylight 每次使用刷新令牌时都会轮换令牌,因此服务首次启动时会用掉 SKYLIGHT_REFRESH_TOKEN,并继续使用轮换后的令牌——该令牌仅保存在令牌缓存中。仅使用令牌时,请确保缓存已启用且可写,并且切勿在两台主机间共用一个令牌:如果启动时发现环境变量中的令牌已被使用,就无法在没有登录凭据对的情况下恢复。

可选
环境变量默认值用途
SKYLIGHT_FRAME_ID自动发现账户有多个相框时,指定要使用的相框
SKYLIGHT_NAME(无)用于启动日志的易读名称
SKYLIGHT_BASE_URLhttps://app.ourskylight.com/api覆盖 API 基础 URL
SKYLIGHT_APPLE_APP_PASSWORD(无)应用专用密码(来自 appleid.apple.com),由 skylight_link_apple_calendar 发送给 Skylight。根据设计,此密码只能通过环境变量提供:它不会作为工具参数,因此不会经过模型、对话记录或主机的工具调用日志
SKYLIGHT_APPLE_ID(无)skylight_link_apple_calendar 使用的 Apple ID 邮箱;工具的 email 参数会覆盖此值
SKYLIGHT_UPLOAD_DIR~/Pictures 和 ~/Downloads(托管环境:仅 $MCP_DATA_DIR/uploads)skylight_upload_photo、skylight_import_events_from_photo 和 skylight_set_member_avatar 可从中上传文件的目录(多个目录以 : 分隔,Windows 上以 ; 分隔;允许使用 ~)。任何其他路径都会在确认预览前被拒绝;打开文件时,确认后的读取操作会再次检查路径。始终启用路径限制:未设置时使用默认目录,而非“任意位置”(同时始终执行文件类型、隐藏文件、符号链接、大小和内容检查)

请像对待密码文件一样对待 .env——它已加入 gitignore,请勿提交。

确认

部分写入操作会在执行前要求你确认:上传本地照片或头像;邀请、批准或移除用户;删除家庭成员;关联 Apple 日历;向公众开放相框;创建或更新包含 invited_emails 的活动(Skylight 会向每个地址发送电子邮件,预览中会列出这些地址);批量删除(skylight_delete_messages、skylight_clear_list,以及对非空列表执行 skylight_delete_list),预览会列出所有将被删除的项目;以及 apply_to 范围超出指定单次事件的餐食或家务编辑、删除操作。能够显示确认提示的客户端(Claude Code)会显示提示,除非设置了 MCP_CONFIRM_ELICITATION=off。其他情况下,首次调用不会进行任何更改,并会返回将要发送内容的完整预览和一个 confirmToken;只有使用该令牌和相同参数再次调用,才会执行操作,而且仅执行一次。

变量默认值
MCP_CONFIRM_MODEask-user客户端无法显示确认提示(claude.ai、Claude Desktop)时,写入操作的处理方式。ask-user:分两步执行——首次调用不做任何更改,并返回预览和令牌;模型必须先在聊天中获得你的批准,才能再次携带令牌调用。auto:同样分两步执行,但模型查看预览后可以自行使用令牌。refuse:此类客户端上的写入操作会被拒绝。能够显示提示的客户端(Claude Code)始终会收到真正的提示,除非设置了 MCP_CONFIRM_ELICITATION=off。无法识别的值会按 refuse 处理。
MCP_CONFIRM_ELICITATIONonoff 表示绝不显示确认提示,因此所有客户端都会采用 MCP_CONFIRM_MODE 指定的处理方式。如果客户端声称支持提示但实际上从不显示提示(写入操作会卡住——opencode 2.0.x),请为该客户端设置此项。其他任何值都会保持为 on,并在 stderr 上显示警告。
MCP_CONFIRM_TTL_SECONDS600令牌的有效时长。
MCP_CONFIRM_SECRET每个进程随机生成签名密钥;仅当令牌必须在服务重启后继续有效时才设置。
令牌缓存

首次登录后,OAuth 令牌对会缓存在 $MCP_DATA_DIR/.skylight-mcp/tokens.json(若未设置则使用 $HOME),并以 0600 权限写入。之后启动时会复用该缓存,而不再重新执行四步登录流程——这很重要,因为 Skylight 的登录端点会限制请求频率,而缩容至零的托管服务会不断冷启动。

只会写入令牌;你的电子邮件地址和密码仍保存在环境中。 过期的缓存令牌会被刷新,而不是重新登录;如果服务器拒绝刷新令牌,则会改用全新登录,因此过期文件不会让你无法登录。

缓存会绑定到生成它的凭据——密码对或提供的 SKYLIGHT_REFRESH_TOKEN。轮换该凭据,或让服务改用其他账户时,缓存令牌会被丢弃,不再继续使用。文件中仅存储加盐摘要;不会写入电子邮件地址、密码或提供的令牌。

设置 SKYLIGHT_TOKEN_CACHE=false 可关闭缓存并在每次启动时登录;设置 SKYLIGHT_TOKEN_FILE 可指定缓存位置。

如果写入失败(数据目录为只读或空间已满),服务器会在 stderr 上记录错误,并继续使用内存中的令牌运行——只有下次启动时才会受到影响。使用登录凭据对时,这只意味着需要登录一次。若仅使用 SKYLIGHT_REFRESH_TOKEN,则会导致无法登录,因为 Skylight 会在首次使用时轮换该令牌,而轮换后的令牌将无法保存。因此,仅使用令牌的部署不会冒险使用该令牌:未提供登录凭据对时设置 SKYLIGHT_TOKEN_CACHE=false 属于配置错误;服务器会在首次刷新前检查缓存是否可写,若不可写则令牌不会被消耗,并会使调用失败。若通过检查后写入仍然失败,服务器会在 stderr 上明确报告。

本地开发

npm install
npm run build
npm test
npm run dev   # requires .env with credentials

测试:使用 vitest,并强制要求行、分支、函数和语句覆盖率均达到 100%。所有测试都使用模拟,不会在 CI 中发起网络请求。

由 AI(Claude)开发和维护。请自行斟酌使用。

评论

支持 Markdown

第一次接触 MCP?

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

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