earlyon-mcp
Provides access to the Family Space Quinte EarlyON program calendar data hosted in a Wix Boom Calendar widget, enabling queries for daily events, weekly schedules, date ranges, program searches, closures, registrations, and recent changes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@earlyon-mcpwhat's on today at Family Space Quinte EarlyON?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
earlyon-mcp
An MCP server that exposes the Family Space Quinte EarlyON program calendar (Belleville / Quinte West / Tweed / Madoc / Marmora, Ontario) as tools an AI assistant can call: "what's on today?", "any evening programs next week?", "when was the last Wildwood at Potters Creek?", "is everything closed on the 20th?".
Unofficial. Not affiliated with or endorsed by Family Space Quinte. It reads the same public data the website's own calendar widget loads, at very low volume (one fetch every few hours by default). Please keep it that way.
What you get
Tool | Purpose |
| One day: time, type, venue, plus closure notices. |
| A Monday-Sunday week grouped by day ( |
| Any span, past or future |
| Find programs by name / place / topic; works on history |
| Full description text, links, venue, other upcoming dates |
| Morning Indoor, Afternoon Indoor, Wildwood Outdoor, Evening, Morning Outdoor, Special Event, Closure |
| Stat holidays / program closures |
| Pre-registration programs (e.g. Infant Massage, ASQ Connection) and whether registration is open |
| Programs added / removed (usually cancelled) / edited recently |
| Data freshness, coverage, forced refresh (rate limited) |
Every response carries notes that call out the data horizon (the site only publishes as far ahead as the
organisation has scheduled) and staleness, so "nothing scheduled yet" is never confused with "nothing on".
Related MCP server: calendar-mcp
How it works
The site's calendar is a Wix widget (Boom Calendar). It loads one JSON document containing event records with recurrence rules, not individual dates. This project:
fetches that document (two plain HTTP GETs, no browser, no login),
expands the rules into concrete occurrences using a re-implementation of the widget's own recurrence logic (weekly multi-weekday series, exclusion dates, nth/last-weekday monthly rules, exclusive end dates, multi-day closures; see
src/earlyon_mcp/expand.py),normalises titles, venues and HTML descriptions,
stores them in SQLite and serves read-only MCP tools over stdio.
The expansion is validated by tests/test_golden.py, which compares it against a snapshot of what the live
widget actually rendered for 16 months (1,150 events, exact match).
History is kept. Occurrences that have ended are frozen and never rewritten, so past schedules survive
later edits on the site. Today-onward occurrences mirror each fresh snapshot, and differences are logged
(that is how cancellations show up in get_recent_changes).
Safety gates. A refresh is rejected (previous data kept) if the calendar name is unexpected, it is empty, or the occurrence total shrinks by more than 30%. Failures never wipe data.
Run it
pip install .
earlyon-mcp refresh # one-shot fetch into ./earlyon.db
earlyon-mcp serve # stdio MCP server (also refreshes in the background every 3h)
earlyon-mcp statusClaude Desktop / any stdio client:
{ "mcpServers": { "earlyon": { "command": "earlyon-mcp", "args": ["serve"],
"env": { "EARLYON_DB_PATH": "/path/to/earlyon.db" } } } }Docker (streamable HTTP)
The image wraps the stdio server with mcp-proxy and serves
http://<host>:3000/mcp:
docker build -t earlyon-mcp .
docker run -d --name earlyon-mcp -p 127.0.0.1:3110:3000 -v earlyon-data:/data earlyon-mcpThere is no authentication in the container. Put it behind your own reverse proxy / auth if you expose it.
Configuration (environment)
Variable | Default | Meaning |
|
| SQLite file |
|
| Timezone used for "today" and output times |
|
| Background refresh interval |
|
| Minimum gap for |
|
| Widget instance id of the calendar on the page |
| see | Source overrides |
Development
python -m venv .venv && . .venv/bin/activate
pip install -e ".[dev]"
pytest # offline: unit + golden + tool tests
EARLYON_LIVE=1 pytest tests/test_live.py # also checks the real site still has the expected shapetests/fixtures/ holds sanitized snapshots (schedule structure only: no descriptions, contact details or
site/account identifiers); see the README in that folder.
Limitations
This depends on an undocumented widget endpoint. If the site changes, refreshes are rejected and
get_statusshows why while the last good data keeps being served.Descriptions belong to a program series; there is no per-date description.
The calendar runs only as far as the organisation has published. History starts where the current calendar system was adopted (September 2025).
If the widget's component id changes, set
EARLYON_COMP_ID.
License
MIT
Available Tools
11 toolsget_closures
Closure notices (stat holidays, office/program closures) in a date range.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Default: 90 days after start | |
| start | No | 'today', 'tomorrow', 'friday', 'next monday', 'in 3 days', '2026-11-12', or 'Nov 12' | today |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_event_details
Full details for one occurrence: description text, links, venue, and the program's other upcoming dates.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | An 'id' from another tool, e.g. '3526559:2026-11-04T09:30'. A bare series id (digits) returns that program's next occurrence. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_events
Programs happening on one day (time, type, venue) plus any closures that day.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | 'today', 'tomorrow', 'friday', 'next monday', 'in 3 days', '2026-11-12', or 'Nov 12' | today |
| program_type | No | Optional program-type filter, case-insensitive substring, e.g. 'morning', 'evening', 'wildwood', 'outdoor', 'afternoon'. Use list_program_types for the full list. | |
| include_description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_events_range
Programs between two dates inclusive (past or future), sorted by time.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | 'today', 'tomorrow', 'friday', 'next monday', 'in 3 days', '2026-11-12', or 'Nov 12' | |
| limit | No | ||
| start | Yes | 'today', 'tomorrow', 'friday', 'next monday', 'in 3 days', '2026-11-12', or 'Nov 12' | |
| program_type | No | Optional program-type filter, case-insensitive substring, e.g. 'morning', 'evening', 'wildwood', 'outdoor', 'afternoon'. Use list_program_types for the full list. | |
| include_description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_recent_changes
Upcoming programs that were added, removed (cancelled) or edited recently.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_registrations
Special programs that require pre-registration (e.g. Infant Massage, ASQ Connection) with open/closed state.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_status
Data freshness and coverage (last refresh, earliest/latest dates, recent refresh outcomes).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
get_week
A Monday-Sunday week of programs, grouped by day.
| Name | Required | Description | Default |
|---|---|---|---|
| week_of | No | 'this', 'next', 'last', or any date inside the wanted Monday-Sunday week | this |
| program_type | No | Optional program-type filter, case-insensitive substring, e.g. 'morning', 'evening', 'wildwood', 'outdoor', 'afternoon'. Use list_program_types for the full list. | |
| include_description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
list_program_types
The program categories (Morning Indoor, Wildwood Outdoor, Afternoon Indoor, Evening, ...) with counts.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
refresh_now
Force a refresh from the website (rate limited; normally refreshes automatically every few hours).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
search_events
Find occurrences of programs by name, place or topic.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | Words to find in title, type, venue, address or description, e.g. 'baby club', 'Tweed', 'storywalk' | |
| since | No | Earliest date (default today). Use a past date to search history. | |
| until | No | Latest date (default: no limit) | |
| newest_first | No | True to list latest first, e.g. 'when was the last ...' | |
| program_type | No | Optional program-type filter, case-insensitive substring, e.g. 'morning', 'evening', 'wildwood', 'outdoor', 'afternoon'. Use list_program_types for the full list. | |
| include_description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
get_closures - First observed
get_event_details - First observed
get_events - First observed
get_events_range - First observed
get_recent_changes - First observed
get_registrations - First observed
get_status - First observed
get_week - First observed
list_program_types - First observed
refresh_now - First observed
search_events
Related MCP Connectors
Your household's calendar, tasks, messages and apps. Read, update, or build new apps with AI.
Family calendars, tasks, reminders, and pickup coordination for your AI assistant.
Find kids' activities in Canada; parents check schedules, bookings and payments (read-only).
Read-only A2Me family context tools for AI assistants (members, dates, activity, relationships)
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to search and access public calendar data, supporting iCal, CalDAV, and Google Calendar sources with event search, details, and availability checks.MIT
- AlicenseNot gradedqualityCmaintenanceProvides read-only access to calendar events from iCal feeds, enabling agents to query schedules, search events, and check availability via natural language.AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to interact with Google Calendar through natural language, supporting listing, creating, and searching events across accessible calendars.473 npmMIT
- AlicenseAqualityCmaintenanceEnables AI clients to retrieve verified countdown event dates, semantics, and FAQ from Countdowns Online, allowing users to browse event categories and understand date contexts without API keys.2MIT