
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 分