Create a cancellation alert
create_alertWatch a park for cancellations and notify the user when a matching stay opens up.
TWO QUOTAS can refuse this. The tier quota limits ACTIVE alerts and total watched sites. Separately, a user may hold at most 100 alerts in TOTAL — paused and expired ones included — and at that cap nothing new can be created until some are deleted (pausing does not help). list_my_alerts reports both, and a refusal here returns the same numbers in its structuredContent alongside the message.
NOT FOR ROUTE BACKCOUNTRY. Where a park sells backcountry as a traverse — a different site each night — this tool refuses it, because the app offers no plain backcountry alert there and the owner could not inspect or edit one. get_park reports supports_routes: true for those parks; call create_itinerary instead, and note a ONE-NIGHT route is the normal way to watch a single backcountry night, not a workaround.
THREE DATE MODES — pick the one the inventory uses, or the alert can never match:
Nights (most camping). date_start/date_end are a SEARCH WINDOW, not the stay: date_end is the last night that may be booked, and nights_min is the shortest stay worth notifying about.
Entry date (Quetico backcountry, Recreation.gov wilderness permits). These sell ONE ENTRY DATE against a daily quota, not a run of nights — asking for 1 night and 5 returns identical availability. Pass entry_dates with the exact dates wanted; date_start/date_end are then derived from them. A nights-based alert on this inventory NEVER matches. get_park reports backcountry_is_entry_date: true for these parks.
Day use (parking time slots, shuttles, Ontario Parks daily vehicle permits). These sell a SLOT or PERMIT on a given day. Pass day_use_cells as {site_id: [dates]}. A park offering this has DayUse in its camp_types. Ontario permits go on sale 5 days ahead; an alert for a later day is accepted and starts matching when the day is released.
Use list_park_campgrounds first to get campground ids, then list_campground_zones — for GoingToCamp parks the ZONES are the campgrounds a person names, so a park-wide selection is both imprecise and the largest thing you can ask for. Within a campground, pass ["all"] for zone_ids/site_ids to watch everything, or specific ids to narrow. Every id must be an ID, never a name, and must belong to the park you name.
If this is refused for SIZE, narrowing is the remedy: fewer zones, or specific site_ids. Falling back to the whole park makes the selection bigger and will fail again.
tier_label is the plan's real name — "essai" is French for trial and is NOT one; it is the permanent free plan.
Site caps are READABLE — max_sites_per_alert comes back from list_campground_zones for a campground and from get_alert for an existing alert, and it is per PROVIDER: the same free plan is 200 sites on Ontario Parks and 1 on Oregon State Parks, because a GoingToCamp scan reads a campground in one request while an Aspira scan costs one request per site. The number is readable, so it never has to be established by experiment: a throwaway alert spends a quota slot, and pausing a live one switches off the user's watch.
RESOLVE EVERY NARROWING INTO site_ids BEFORE creating this. If the user asked for a shaded site, one near the water, one with a fire pit or 50-amp power, read the attributes from list_zone_sites and pass the ids that qualify — do not pass ["all"] and describe the narrowing in prose.
The reason is the OTHER client: the account holder opens this alert in the AlertCamp app, which lists the sites it watches and has no way to show a filter. An alert on ["all"] looks like an alert on everything, cannot be checked, and cannot be edited back. An explicit list is visible, verifiable and editable by the person who owns it.
Same for position: if the ask was about the beach, the water or a quiet corner, pick the ids from get_zone_map or the lat/lng in list_zone_sites. An alert on the whole zone will notify them about every site in it, including the ones they ruled out.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| park_id | Yes | The park's id, from search_parks or get_park. | |
| date_end | No | YYYY-MM-DD — the last bookable NIGHT. Same rule as date_start. | |
| pets_only | No | Only sites that allow pets. | |
| tent_pads | No | Backcountry ZONE inventory only (Parks Canada): how many tent pads the party needs. Ignored elsewhere. | |
| date_start | No | YYYY-MM-DD. Required in nights mode; omit in entry-date or day-use mode and it is derived from the dates you picked. | |
| nights_max | No | Nights mode only. Optional ceiling. | |
| nights_min | No | Nights mode only. | |
| notify_sms | No | Text message on a match. Pro tier only and silently dropped otherwise, needs a verified phone number, and it is the one channel that costs real money per send — it stays off unless the user has asked for texts. | |
| party_size | No | People in the party. Where inventory is per bed or per person (huts, some backcountry zones) an opening must fit this many. | |
| split_stay | No | Accept a stay split across DIFFERENT sites rather than one site for every night. More matches, at the cost of moving camp mid-trip. | |
| days_filter | No | Which arrival nights count. 'weekends' narrows hard — it also cuts how often the alert can fire, so say so. | |
| entry_dates | No | ENTRY-DATE mode: the exact dates wanted, YYYY-MM-DD. Use for parks where get_park reports backcountry_is_entry_date. Tightly capped by tier (the free tier allows one), so ask for the dates that matter rather than a whole month. | |
| notify_push | No | Send a push notification to the account holder's phone when something opens. | |
| webhook_url | No | https URL to POST openings to — how YOU find out this alert fired, since MCP cannot push anything to you. Optional: without it, use list_matches to check in, and the account holder still gets their normal push/email. The response returns a webhook_secret ONCE. Each delivery carries X-AlertCamp-Signature (v1=HMAC-SHA256 over "<timestamp>.<body>") and X-AlertCamp-Timestamp — verify both before trusting a payload, and reject old timestamps. | |
| is_tent_only | No | Only tent-only sites, for campers who want to avoid being pitched beside RVs. NOT the same as equipment_filter_mode 'tent'. | |
| notify_email | No | Paid tiers only; silently dropped otherwise. | |
| activity_type | No | camping, chalet, canoe_camping, backcountry, fishing, boat, equestrian, day_use. Must be an activity the selected sites actually offer. Omitting it does NOT watch every activity — it is derived from the selection, and refused when the selection spans several. Send the one the user asked for whenever you know it: an alert carries exactly one activity and the owner cannot change that to 'any' in the app. | |
| day_use_cells | No | DAY-USE mode: {site_id: ["YYYY-MM-DD", ...]} — the exact slot/day cells wanted. Set once, at creation: these cannot be edited afterwards. | |
| is_accessible | No | Only wheelchair-accessible sites. | |
| has_electricity | No | Only sites with an electrical hookup. | |
| is_pull_through | No | Only pull-through sites (no reversing) — for big rigs. | |
| sub_equipment_id | No | From list_equipment_options for this park's provider. Never guess it: the integers are per-provider and a wrong one filters to the wrong sites silently. | |
| campground_selections | Yes | At least one campground to watch. | |
| equipment_filter_mode | No | What the user is camping IN. 'any' watches every site regardless. Pair 'tent' or 'rv' with sub_equipment_id from list_equipment_options — the mode alone does not say WHICH trailer. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| label | No | ||
| park_id | No | ||
| user_id | No | ||
| date_end | No | ||
| provider | No | ||
| is_active | No | ||
| park_name | No | ||
| pets_only | No | ||
| tent_pads | No | ||
| alert_type | No | ||
| created_at | No | ||
| date_start | No | ||
| nights_max | No | ||
| nights_min | No | ||
| notify_sms | No | ||
| party_size | No | ||
| scan_count | No | ||
| shade_only | No | ||
| split_stay | No | ||
| updated_at | No | ||
| booking_url | No | ||
| created_via | No | ||
| days_filter | No | ||
| entry_dates | No | ||
| notify_push | No | ||
| is_tent_only | No | ||
| notify_email | No | ||
| webhook_note | No | ||
| activity_type | No | ||
| day_use_cells | No | ||
| is_accessible | No | ||
| out_of_season | No | ||
| webhook_secret | No | ||
| has_electricity | No | ||
| is_pull_through | No | ||
| last_checked_at | No | ||
| waterfront_only | No | ||
| created_by_agent | No | ||
| last_notified_at | No | ||
| sub_equipment_id | No | ||
| notification_count | No | ||
| cancellations_found | No | ||
| availabilities_found | No | ||
| campground_selections | No | ||
| equipment_filter_mode | No | ||
| op_access_point_resource_id | No |