Technology
Skylight MCP, Part 1: The Problem and the Setup
Our recipes live in Apple Notes, our calendar lives on a Skylight, and the glue between them was me clicking buttons. Here's how an MCP server and Claude turned that into a conversation.
This is the first of four posts on how I automated our family's weekly meal planning (and, as it turns out, the chore chart) with Claude, the Skylight MCP server, Apple Notes, and a Ninja MultiPot XL. This one covers the problem and the plumbing. Part 2 covers the rules and the recipe cleanup. Part 3 walks through actually planning a week. Part 4 points the same tools at our chore chart and rewards system.
The problem
We're a family of four: two adults and two school-age kids. Monday through Thursday are sports nights by default, and the evenings always feel short and rushed. Dinner has to be ready when the last kid walks in the door, which means a slow cooker or multicooker gets loaded and started before we leave.
We have a Skylight Calendar near the kitchen (I wrote about setting it up a while back) with Calendar Plus, which adds meal planning and recipes. It's genuinely great for the family to glance at and see what's for dinner. Getting things onto it was the painful part, for four reasons.
1. Recipes live in Apple Notes, not Skylight
All of our recipes are in Apple Notes, in a shared folder structure the family uses (Mains, Crock Pot, Multi-Pot XL, Instant Pot). Notes is the source of truth. Everybody can see it, everybody can edit it from their phone, and it's where the recipes have lived for years.
Skylight wants its own copy of each recipe. The supported way to get one in is to email it to your Skylight address (or type it in by hand in the app). I didn't want to keep emailing recipes to a calendar every time I tweaked one, and I definitely didn't want two copies drifting apart. I've spent enough of my career chasing down "which one is the real one?" to know how that ends.
What I wanted: Notes is canonical, Skylight is a display-only copy I never touch by hand.
2. Dietary rules that don't overlap
Meal planning for one diet is easy. Ours has several constraints stacked on top of each other:
- I started a keto diet in April, but dinner still has to work for my wife and the kids.
- The kids are picky in very specific ways (no cooked peppers or onions, for example, even though raw mini peppers on the veggie tray are fine).
- Household rules: no peas, no beans (green beans are fine), no avocado, no artificial dyes, chicken breasts instead of thighs, low-sodium broth. Every one of those is a hard-learned lesson from years of trying recipes.
So a lot of dinners end up as "meat and veggies for the adults, with a kid-swap starch on the side." Keeping all of that in my head every Sunday is the actual work of meal planning. The cooking is the easy part.
3. Lots of clicking
Even once a recipe was in Skylight, planning a week meant opening the app, clicking into each day, picking Dinner, picking a recipe, saving. Then doing it all again for the make-ahead prep I wanted on the night before. Not hard, just tedious, and easy to get wrong.
4. The grocery list is a raw ingredient dump
Skylight has an "add recipe to grocery list" button. It takes every ingredient line from the recipe and drops it on the list, verbatim. If three recipes use garlic powder, you get three garlic powder lines reading "1 tsp," "2 tsp," and "1/2 tbsp." Pantry staples show up right next to the things I actually need to buy. Nothing is grouped by store.
That's not a grocery list. That's homework.
Setting up the Skylight MCP server
Skylight doesn't have an official public API. The skylight-mcp project by Chris Hall wraps the private API the Skylight apps use and exposes it as an MCP (Model Context Protocol) server. That means Claude can read and write calendar events, meals, recipes, lists, chores, and rewards on your frame.
The tools I lean on most for meal planning:
| Tool | What it does |
|---|---|
skylight_healthcheck |
Confirms login works |
skylight_get_plus_access |
Confirms Calendar Plus (meals and recipes) is active |
skylight_list_frames |
Lists the frames on the account |
skylight_list_meal_categories |
Finds Breakfast, Lunch, Dinner, Snack IDs |
skylight_list_recipes / skylight_create_recipe / skylight_update_recipe |
Manage the recipe box |
skylight_plan_meal / skylight_list_meals / skylight_update_meal |
Put meals on specific days |
skylight_list_events / skylight_create_event |
Read the calendar for sports nights, create reminders |
skylight_get_list_items / skylight_add_list_item / skylight_set_list_item_section |
Build the grocery list with store sections |
A word on trust, because this matters: the README is upfront that the project is maintained largely by AI and that you should use it at your own discretion. Your Skylight password lives in the extension's settings on your machine, nowhere else. Destructive writes require confirmation, which is how I wanted to work anyway (show me a summary first, then write).
There are two ways to install it.
Option A: download the release and install the extension
This is the easy route, and what I'd recommend for most people.
- Go to the repo's Releases page and download the
.mcpbfile (at the time it wasskylight-mcp-1.4.7.mcpb, about 460 KB). You can skip the source archives. - Double-click it and the Claude desktop app opens an install dialog. If it doesn't, go to Settings → Extensions and drag the file in.
- Fill in the settings form:
- Skylight email and password: your Skylight login.
- Refresh token: leave it blank. Skylight rotates the refresh token every time it's used, so a pasted token works exactly once. Email and password let the extension log itself back in.
- Token cache: leave it on (the default). It saves the session so the extension isn't signing in constantly, which Skylight rate-limits.
- Apple ID / app-specific password / upload dir: only needed for photo features. Leave them blank for meal planning.
- Make sure the extension is enabled, then fully quit and reopen Claude.
There's also an optional .skill file in the release that teaches Claude how to use the tools. I skipped it, since I was going to build my own meal-planning rules on top (that's Part 2).
If you'd rather run it from npm, there's a manual-config route too: add an npx -y skylight-mcp entry to claude_desktop_config.json with SKYLIGHT_EMAIL and SKYLIGHT_PASSWORD in env. Check the README for the current details.
Option B: fork the repo and run your own build
This is the route I took.
- Fork
chrischall/skylight-mcpon GitHub and clone your fork. - Install dependencies and build (it's a TypeScript project, with tests and a typecheck step).
- Point the Claude desktop app at your local build instead of the published release.
- Keep your fork synced with upstream so you pick up fixes.
Why bother? I wanted to be able to contribute back. Once you're using an MCP server for real household work, you start noticing rough edges, and it's a lot easier to fix one when you already have the repo building and the tests running locally. It also means I can test a fix against my own Skylight frame before opening a pull request.
That paid off quickly. While poking at the reward tools, I noticed skylight_list_rewards couldn't tell you whose reward a row belonged to, which matters a lot when you have two kids. I opened PR #274 to fix it. Part 4 gets into why I was in the reward tools to begin with and what the fix actually changed.
First connection: read-only checks
Before anything got written, I had Claude run a set of read-only checks:
skylight_healthcheckto confirm the login.skylight_get_plus_accessto confirm Calendar Plus was active (meals and recipes need it).skylight_list_frames, which turned up something I hadn't considered: our account has four frames. One family calendar, two photo frames (for family members), and another family member's calendar I help manage. If a tool picks a default frame, it could easily pick the wrong one. So the rule became: always pass the family calendar's frame ID explicitly on every call. (More on how I captured that in Part 2.)skylight_list_meal_categoriesto get the Dinner category ID.skylight_list_recipesto see what was already in the recipe box, so nothing gets duplicated.skylight_list_mealsfor the current week.
Then one test write: create a single recipe, plan it on a future date, confirm on the actual frame how the ingredients and directions display, and delete it.
Gotcha: desktop extensions and cloud chats
The extension runs inside the Claude desktop app on my Mac. My first attempt to check connectivity was from a chat running in the cloud, and the Skylight tools simply weren't there, even though Apple Notes was. Took me a minute to figure out what was going on. The fix was linking the chat to my computer through the desktop app, so the local MCP servers (Skylight and Apple Notes) are reachable. Once I did that, everything showed up.
The other connectors
Skylight is only one piece. The workflow leans on a few other connections:
- Apple Notes (local, through the desktop app). Claude can list notes in a folder, read a note's content, create notes, and update a note's HTML. This is how it reads recipes and writes new ones back in a consistent format. Limitations I hit: it can't create folders or move notes between folders (I do that myself), and creating a note puts the name on its own plain first line. So new notes get created with placeholder text and then overwritten with the full formatted HTML.
- Skylight Calendar (through the MCP). Skylight syncs with our Google calendars, so the calendar side does double duty. Claude reads the week's events to catch schedule changes (no practice, a game, a school event) and creates reminder events.
- Google Calendar (indirectly). Skylight's
create_eventdoesn't take a calendar parameter. New events land on whichever source calendar is set as the frame's default. To put prep reminders on my calendar instead of the shared Family calendar, Claude switches the default, creates the events, and switches it back. Clunky, but it works. - Web search and fetch. For researching new recipes, checking Trader Joe's or Lowes Foods availability, and looking up food-safety guidance (USDA fridge limits come up in Part 3).
- The MultiPot manuals. I uploaded the Ninja MultiPot XL owner's guide and quick-start guide to the Claude project. That's how Claude learned the MultiPot has no pressure function (important, since my wife is nervous about pressure cooking), that Slow Cook LO has a 6-hour minimum, HI runs 2 to 12 hours, there's no delay start, and the manual says never to put it on a smart plug or external timer.
That last point shapes the whole plan. If nothing can be started remotely, someone has to start it by 3:45 on sports nights.
What's next
With the plumbing in place, the next step was teaching Claude how we plan meals: which stores we use, how the grocery list should look, which nights get which kinds of meals, and how recipes should be formatted. That's Part 2.
Comments welcome!