Skip to main content
Glama

Create a cancellation alert

create_alert

Watch 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:

  1. 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.

  2. 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.

  3. 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

TableJSON Schema
NameRequiredDescriptionDefault
park_idYesThe park's id, from search_parks or get_park.
date_endNoYYYY-MM-DD — the last bookable NIGHT. Same rule as date_start.
pets_onlyNoOnly sites that allow pets.
tent_padsNoBackcountry ZONE inventory only (Parks Canada): how many tent pads the party needs. Ignored elsewhere.
date_startNoYYYY-MM-DD. Required in nights mode; omit in entry-date or day-use mode and it is derived from the dates you picked.
nights_maxNoNights mode only. Optional ceiling.
nights_minNoNights mode only.
notify_smsNoText 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_sizeNoPeople in the party. Where inventory is per bed or per person (huts, some backcountry zones) an opening must fit this many.
split_stayNoAccept a stay split across DIFFERENT sites rather than one site for every night. More matches, at the cost of moving camp mid-trip.
days_filterNoWhich arrival nights count. 'weekends' narrows hard — it also cuts how often the alert can fire, so say so.
entry_datesNoENTRY-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_pushNoSend a push notification to the account holder's phone when something opens.
webhook_urlNohttps 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_onlyNoOnly tent-only sites, for campers who want to avoid being pitched beside RVs. NOT the same as equipment_filter_mode 'tent'.
notify_emailNoPaid tiers only; silently dropped otherwise.
activity_typeNocamping, 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_cellsNoDAY-USE mode: {site_id: ["YYYY-MM-DD", ...]} — the exact slot/day cells wanted. Set once, at creation: these cannot be edited afterwards.
is_accessibleNoOnly wheelchair-accessible sites.
has_electricityNoOnly sites with an electrical hookup.
is_pull_throughNoOnly pull-through sites (no reversing) — for big rigs.
sub_equipment_idNoFrom 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_selectionsYesAt least one campground to watch.
equipment_filter_modeNoWhat 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

TableJSON Schema
NameRequiredDescriptionDefault
idYes
labelNo
park_idNo
user_idNo
date_endNo
providerNo
is_activeNo
park_nameNo
pets_onlyNo
tent_padsNo
alert_typeNo
created_atNo
date_startNo
nights_maxNo
nights_minNo
notify_smsNo
party_sizeNo
scan_countNo
shade_onlyNo
split_stayNo
updated_atNo
booking_urlNo
created_viaNo
days_filterNo
entry_datesNo
notify_pushNo
is_tent_onlyNo
notify_emailNo
webhook_noteNo
activity_typeNo
day_use_cellsNo
is_accessibleNo
out_of_seasonNo
webhook_secretNo
has_electricityNo
is_pull_throughNo
last_checked_atNo
waterfront_onlyNo
created_by_agentNo
last_notified_atNo
sub_equipment_idNo
notification_countNo
cancellations_foundNo
availabilities_foundNo
campground_selectionsNo
equipment_filter_modeNo
op_access_point_resource_idNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / notify_push / description
      Added value: +"Send a push notification to the account holder's phone when something opens."
    • addedInput schema / properties / park_id / description
      Added value: +"The park's id, from search_parks or get_park."
    • addedInput schema / properties / party_size / description
      Added value: +"People in the party. Where inventory is per bed or per person (huts, some backcountry zones) an opening must fit this many."
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare it is a non-read-only, non-idempotent, open-world write. The description adds far more: two independent quotas and how they are reported, refusal returning the same numbers in structuredContent, the webhook_secret returned once with signature/timestamp verification, SMS cost and silent dropping of tier-gated channels, and the non-editable nature of day_use_cells and activity_type.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then quotas, then the exclusion, then date modes — a sensible order for a 24-parameter tool, and most sentences earn their place. It is nonetheless very long, and the final two paragraphs argue the same point (resolve narrowing into explicit site_ids) twice, once for verifiability and once for position, which is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool this complex — 24 parameters, nested objects, two enums, a quota system, three mutually exclusive date modes — the description covers every decision an agent must make before calling. An output schema exists, so return values are correctly left unelaborated beyond the refusal-shaped structuredContent note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description goes well beyond per-field docs by explaining cross-parameter interplay: nights vs entry-date vs day-use modes and which fields are derived or ignored in each, the ['all'] semantics for zone_ids/site_ids, and the warning that sub_equipment_id integers are per-provider. This is meaning the schema alone cannot carry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Watch a park for cancellations and notify the user when a matching stay opens up.' The scope is further pinned by explicit exclusions (route backcountry → create_itinerary), so an agent can separate it from create_itinerary, update_alert and get_alert without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative (create_itinerary) and the exact condition that selects it (get_park reports supports_routes: true), including the one-night-route nuance. It also gives the prerequisite call chain (list_park_campgrounds → list_campground_zones → list_zone_sites), the remedy when refused for size, and when each of the three date modes applies.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources