Inspiration

It's 11:47 PM on a Sunday. Picture a student, call her Maya, finally lying down after a long weekend. Then she remembers: the Spanish test is Friday. She opens her calendar. Monday is full of lectures. Tuesday has a group project meeting at 5. Wednesday has the "study block" she made three weeks ago, and her part-time shift sits right on top of it. Her calendar never warned her, because calendars don't warn you. They store things. They don't think about them.

Every learner lives some version of this: students, working parents doing night classes, engineers studying for a certification on their lunch break. Our calendars are full of events, but nothing reads them. Study time quietly gets booked over. Deadlines show up as a surprise. And when we tried "smart" scheduling assistants, they made it worse: they booked right over the top of existing commitments without asking.

Then the Alexa+ track put it plainly: Alexa+ is the agent. MCP servers are the tools. That gave us the idea. We didn't need another chatbot. We needed a calendar that an agent could actually reason with, and one with a rule we would never break:

Nothing gets booked over something else until you give the nod.

That's where the name comes from. Nod plans ahead, then waits for your yes.

What it does

Nod is a self-hosted MCP server (spec 2025-11-25, Streamable HTTP) that turns any MCP agent (Alexa+, Claude, ChatGPT, MCP Inspector) into a scheduling and study coach that respects consent. It exposes 16 clean tools in three areas:

  • Calendar: daily brief, add/update/delete events, free-slot suggestions, household overlap policy
  • Study: deadlines, study plans, booking study sessions, flashcards
  • Sync: ICS export/import, plus live two-way Google Calendar sync

Here's Maya's Monday with Nod:

  1. "Alexa, what's my day?" → get_daily_brief starts with today's plan and the deadlines coming up.
  2. "I have a meeting at 5am tomorrow." → add_event notices it overlaps a study session. It creates nothing. Instead it returns a structured clash payload: the draft event, the household policy, every conflicting event with a movable flag and any linked deadline, and free slots that have already been checked. The agent asks one clear question: "That overlaps your Spanish study block. Keep both, take 7am instead, or move the study session?" Maya gives the nod, and it does exactly what she picked.
  3. "Spanish test Friday." → add_deadline → create_study_plan → schedule_study books real sessions on her actual calendar and works around everything else she has on.
  4. "Quiz me." → create_flashcards sends flip-cards right in the conversation.
  5. Her phone just knows. Events export to Google, Apple and Outlook via ICS, or sync live through per-user Google OAuth.

There's also a family kiosk view for the living-room screen. All of it runs with zero cloud dependencies: your schedule stays at home.

How we built it

We followed one principle: the server stays thin, and the agent stays smart.

  • Core: Python on the MCP SDK 2.x, using Streamable HTTP on a single /mcp endpoint that follows spec 2025-11-25 and validates the Origin header.
  • Pure tools, no fake NLU: 16 tools with strict schemas and structured results. Understanding language is the host's job, so we left it to the host.
  • Data: SQLite for local-first storage. iCalendar import/export. Per-user Google Calendar OAuth with syncToken incremental sync, 410 recovery and pagination.
  • Inline UI: the MCP Apps extension. Card tools declare ui://timeos/view.html, so compatible hosts show rich inline views instead of walls of text.
  • A real MCP client as the Alexa+ stand-in: the Alexa+ MCP Toolkit is partner-only, so our web app speaks the actual protocol: initialize → tools/list → tools/call over Streamable HTTP. That's exactly the simulated-experience path the hackathon FAQ endorses.
  • Agent Skill: skills/timeos-coordinator writes the "wait for the nod" overlap negotiation down as a repeatable procedure, so any agent handles a clash the same safe way.
  • AWS-ready: rule-based flashcards by default, so it runs anywhere for $0. An optional Amazon Bedrock generation hook is documented and ready.

Challenges we ran into

  • The SDK moved under our feet. MCP Python SDK 2.x renamed FastMCP to MCPServer with no compatibility shim. We worked it out by reading the installed source, not the docs.
  • A silent deadlock, the worst kind of bug. Tool callbacks run on worker threads (this isn't documented), so SQLite immediately threw cross-thread errors. Our first fix, a plain threading.Lock, then hung silently with no error and no log. Switching to RLock fixed it. We logged every step.
  • We deleted our own feature, and it was the right call. We first built a rule-based "chat" tool to parse natural language. We watched it book "5am tomorrow" as today at 9:00: wrong day, wrong time, wrong architecture. So we removed it. An MCP server that tries to out-think the agent is a bug waiting to happen.
  • structuredContent only appears for pydantic-typed returns. Plain dicts don't produce it, so clients have to fall back to parsing content[0].text.
  • The $150 AWS credit program ran out on Oct 7, mid-hackathon. We designed the whole demo to need zero AWS spend, which also proved the local-first idea.

Accomplishments that we're proud of

  • A consent-first overlap protocol. The tool reports, the agent negotiates, the human gives the nod. Nothing is ever created over an existing commitment without consent. Most scheduling agents don't have this safety property. Nod is named after it.
  • Spec-faithful and works with any host. The same server works with Claude Desktop, MCP Inspector, ChatGPT, and Alexa+ once access opens. There's no lock-in.
  • A genuine end-to-end demo, not mockups. A real MCP client web app, a family kiosk screen, ICS subscriptions that show up on a real phone, and live Google Calendar sync, all for $0 in cloud spend.
  • We had the discipline to remove code. Deleting our NLU tool made the product better. Every tool that's left earns its place.
  • An 8-entry friction log written live during development, with real, reproducible feedback for the MCP SDK, Amazon tooling and the AWS programs.

What we learned

  • Don't rebuild the host. Natural language belongs to the agent. MCP servers are at their best as thin, sharp tools with clean schemas and structured results. Our biggest improvement was a deletion.
  • Safety is a design property, not a feature. Returning "here's the clash, here are your options" instead of "done!" changed how the whole agent behaves.
  • SDKs move fast, so read the source. The installed code is the real documentation. A one-release compatibility shim would have saved hours, and we've passed that feedback on.
  • Local-first agent tooling is real. A genuinely useful assistant doesn't need your life stored in someone else's cloud.

What's next for Nod — the study planner that waits for your yes

  • Connect to the real Alexa+ MCP Toolkit as soon as partner access opens. The server already speaks the protocol.
  • Amazon Bedrock flashcards that generate study cards from your actual course material (AWS Builder mini-challenge).
  • Shared household calendars. One schedule for the whole family, shown on the kitchen kiosk, an Echo Show, and every phone, with each person giving their own nod.
  • Proactive nudges: deadline push notifications and "you haven't studied for Friday yet" check-ins.
  • A hosted multi-user version with proper TZID/VTIMEZONE ICS output, which fixes the floating-time caveat from our friction log.
  • Beyond exams: full workflows for courses, certifications and lifelong learning.

Back to Maya: next Sunday at 11:47 PM, she's asleep. Her study sessions for Friday were booked last Monday, after one nod. Her shift and her study block no longer collide. And the flashcards are waiting for her breakfast.

Calendars remember. Nod thinks ahead, and waits for your yes.

Built With

Share this project:

Updates

Submission history