
Skylight Mcp
io.github.chrischall由 GitHub 账号 chrischall 发布v1.6.0更新于 Nov 7, 2026
Skylight Calendar for Claude — family events, chores, and rewards.
概览
将助手连接到 Skylight Calendar 家庭日历设备,管理日程、清单、家务、奖励、餐食、消息和照片。
- 可以做什么
- 读写日历事件、来源日历和事件通知设置
- 管理共享清单及其条目,包括分区、排序和批量清空
- 创建、完成、修改和删除家务、周期例程、奖励及奖励积分
- 规划餐食与食谱,并把食谱食材加入购物清单
- 发布、加说明、点赞、评论和删除设备消息与相册,并上传照片或视频
- 查看设备、成员、头像和账户设置,并生成 AI 餐食计划或活动点子草稿供审核
- 适用场景
- 适合家庭使用 Skylight Calendar 设备,并希望助手在对话中查询或修改家庭日程、家务、清单、餐食和照片,而不必打开应用。
- 运行要求
- 以 npm 包形式在本地通过 stdio 运行。需要 Skylight 凭据:SKYLIGHT_REFRESH_TOKEN,或 SKYLIGHT_EMAIL 搭配 SKYLIGHT_PASSWORD。可选设置包括 SKYLIGHT_FRAME_ID、SKYLIGHT_BASE_URL、SKYLIGHT_UPLOAD_DIR、SKYLIGHT_APPLE_ID 和 SKYLIGHT_APPLE_APP_PASSWORD。需要能访问 Skylight 服务的网络。
安装
在 SourceWeft 中
- 打开 控制台中的 Skylight Mcp,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
skylight-mcp
MCP server for Skylight Calendar — 115 tools across calendar events (read+write), shared lists (read+write), chores and rewards (read+write), task-box items (read+write), meals (read+write), AI auto-creation (meal-plan + activity-idea generators with draft review/approve), messages and albums (read+write), photo/video upload, and frame/device/account settings + calendar + member management (read+write, incl. preset and custom-photo avatars).
Every API request carries the skylight-api-version: 2026-05-01 header (matching the official mobile app); without it some features 422 with "API version does not support …".
MCP protocol support
The server uses the official TypeScript SDK v2 and supports the stateless 2026-07-28 protocol revision over stdio. Clients can discover and call tools without an initialization handshake. Existing clients can still use the 2025-11-25 handshake.
The transport remains stdio. A host can expose it over authenticated HTTP. This package does not open a network listener.
Auth
The server uses a headless email+password OAuth2 authorization-code flow — no SSO, no 2FA, no browser extension required. Configure it with SKYLIGHT_REFRESH_TOKEN if you already hold a token, or SKYLIGHT_EMAIL + SKYLIGHT_PASSWORD to log in for one.
On first tool call, the server performs four steps against https://app.ourskylight.com:
GET /auth/session/new— fetch the Rails CSRF token and session cookie.POST /auth/session— log in with email + password (must happen before OAuth authorize).GET /oauth/authorize— send an S256 PKCEcode_challenge(the server requires it) and receive the one-time authorization code via redirect.POST /oauth/token— exchange the code plus the matchingcode_verifierfor a beareraccess_token+refresh_token(currently a 24-hour expiry; the client reads the returnedexpires_inrather than assuming).
OAuth redirects stay on the authentication origin. Relative redirects resolve against the current URL. The configured callback supplies the authorization code without receiving a request or session cookie. Unexpected destinations fail without including the redirect URL in the error.
The client then refreshes the token proactively (~60 s before expiry) and reactively on any 401. No bot wall has been observed — the headless flow works directly from Node.
No env vars → clean start: if credentials are not set, the server still starts without error. Auth is deferred to the first tool call, so MCP hosts can complete install-time tool listing before credentials are configured.
Using the auth helpers from your own code
The package also exports Skylight's session login and refresh, so a separate program can authenticate without copying src/:
This is the only library entry point; everything else in the package is the MCP server. It is ESM-only and ships type declarations.
Frame model
All data in Skylight is scoped to a frame (the family hub device). On first use the client auto-discovers the single frame on the account. If the account has more than one frame, set SKYLIGHT_FRAME_ID to the frame ID you want. Every tool that reads frame-scoped data accepts an optional frameId arg to override the default.
Tools
Configuration
Required — one of these two
A refresh token you already hold (preferred: scoped, revocable, and it never touches the rate-limited login endpoint):
Or the login pair, which mints one for you:
Setting both is also valid, and is the most robust configuration: the token is used first, and if it has expired the login quietly mints a replacement. With a token alone, an expired token is reported as expired — the server says so plainly rather than claiming it is unconfigured.
A supplied refresh token is single-use. Skylight rotates the refresh token
every time it is spent, so the server's first start uses up
SKYLIGHT_REFRESH_TOKEN and keeps working on the rotated one — which lives only
in the token cache. With a token alone, keep that cache enabled
and writable, and never share one token between two hosts: a start that finds
the env token already spent cannot recover without the login pair.
Optional
Treat .env like a password file — it is gitignored, do not commit it.
Photo uploads on a hosted deployment
A hosted server (the claude.ai connector on mcp-host) shares no disk with you,
so image_path is refused there and the refusal says what to do instead. The
photo tools take exactly one of three sources:
Every route accepts only jpg/jpeg, png, heic, gif, webp, mp4 and mov, and checks
the file's leading bytes against its type. The confirmation preview carries the
file's SHA-256 and the confirmed call reads the file again, so a file that
changed in between is refused (DRAFT_CHANGED). A blob-store upload is deleted
once Skylight accepts the photo (the result's blob.deleted says whether the
delete worked) and kept if the upload fails, so the same image_blob_key can be
retried. skylight_upload_slots is refused on a server with no blob store.
Confirmations
Some writes ask you to confirm before anything happens: uploading a local
photo or avatar; inviting, approving or removing a user; deleting a family
member; linking an Apple calendar; opening the frame to the public; creating
or updating an event with invited_emails (Skylight e-mails each address, and
the preview names them); the bulk deletes (skylight_delete_messages,
skylight_clear_list, and skylight_delete_list of a non-empty list), whose
preview lists every item that would go; and meal/chore edits or deletes whose
apply_to reaches past the one occurrence named. A client that can show a confirmation prompt (Claude Code) shows one, unless
MCP_CONFIRM_ELICITATION=off. Elsewhere the first call makes no change and returns a preview of exactly what
would be sent plus a confirmToken; only a repeat call with that token, and
the same arguments, performs it — once.
Token cache
After the first login the OAuth token pair is cached at
$MCP_DATA_DIR/.skylight-mcp/tokens.json (falling back to $HOME), written
0600. A later start reuses it instead of re-running the four-step login —
which matters because Skylight's login endpoint rate-limits, and a hosted
server that scales to zero cold-starts constantly.
Only the tokens are written; your email and password stay in the environment. A cached token that has expired is refreshed rather than re-logged-in, and a refresh token the server rejects falls back to a fresh login, so a stale file cannot lock you out.
The cache is bound to whichever credential minted it — the password pair, or the
supplied SKYLIGHT_REFRESH_TOKEN. Rotate that credential, or point the server at
a different account, and the cached token is discarded rather than kept in play.
Only a salted digest is stored; no email, password or supplied token reaches the
file.
Set SKYLIGHT_TOKEN_CACHE=false to turn it off and log in on every start, or
SKYLIGHT_TOKEN_FILE to put the cache somewhere specific.
If a write fails (read-only or full data dir) the server logs to stderr and
keeps working on the in-memory token — only the next start pays for it. With
the login pair that cost is one login. With only SKYLIGHT_REFRESH_TOKEN it
would be a lockout, because Skylight rotates that token on first use and the
rotated one would never be saved. So a token-only deployment refuses to spend
it: SKYLIGHT_TOKEN_CACHE=false without a login pair is a configuration error,
and the server checks the cache is writable before the first refresh, failing
the call (token unspent) if it is not. A write that fails after that check is
reported loudly on stderr.
Local dev
Tests: vitest, 100% line/branch/function/statement coverage enforced. All tests are mocked — no network calls in CI.
Developed and maintained by AI (Claude). Use at your own discretion.
来源:README.md,提交 168834b
工具
0版本历史
23- v1.6.0最新Nov 7, 2026
- v1.5.0Nov 4, 2026
- v1.4.8Nov 3, 2026
- v1.4.7Oct 29, 2026
- v1.4.6Oct 20, 2026
- v1.4.5Oct 17, 2026
- v1.4.4Oct 17, 2026
- v1.4.3Oct 16, 2026
- v1.4.2Oct 10, 2026
- v1.4.1Oct 10, 2026
- v1.4.0Oct 7, 2026
- v1.3.2Oct 5, 2026
- v1.3.1Oct 3, 2026
- v1.3.0Sep 25, 2026
- v1.2.0Sep 24, 2026
- v1.1.3Sep 23, 2026
- v1.1.2Sep 23, 2026
- v1.1.1Sep 21, 2026
- v1.1.0Sep 20, 2026
- v1.0.1Sep 19, 2026
- v1.0.0Sep 19, 2026
- v0.10.2Sep 19, 2026
- v0.10.1Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分