{
  "markdown": "# Open State: Camping — Parks Canada\n\nPart of **The Open State**, a reference implementation of the **Civic Access\nProtocol**. This lets a citizen reach **Parks Canada** reservations through their\nown AI assistant, in plain language, while keeping their credentials and their\ncontrol.\n\n> Your services. Your assistant. Your access.\n\nIt is a **local MCP bundle** (`.mcpb`) you add to your assistant on your own\nmachine. It runs over **stdio**, searches Parks Canada's public availability, and\n**prepares** a booking right up to the payment screen in *your own* session. It\nnever sees your password or payment details. Session cookies are encrypted on\nyour device; you directly approve consequential actions and pay yourself.\n\nFor the binding rules and design, see The Open State:\n[`CONSTITUTION.md`](https://github.com/JCrossman/the-open-state/blob/main/CONSTITUTION.md),\n[`AGENTS.md`](AGENTS.md),\n[`docs/00-overview.md`](https://github.com/JCrossman/the-open-state/blob/main/docs/00-overview.md),\n[`docs/01-architecture.md`](https://github.com/JCrossman/the-open-state/blob/main/docs/01-architecture.md).\nThe verified Parks Canada API contract is in\n[`docs/parks-canada-api-findings.md`](docs/parks-canada-api-findings.md).\n\n## What it does\n\nAll four Parks Canada booking families — **search and book, end-to-end**:\n\n| Family | Search | Prepare booking |\n|---|---|---|\n| Frontcountry campsites & group sites | ✅ | ✅ |\n| Accommodations (oTENTik, cabin, yurt, …) | ✅ | ✅ |\n| Day Use (shuttles, parking, guided events) | ✅ | ✅ |\n| Backcountry zone permits (entry point + per-night zones) | ✅ | ✅ |\n\nPlain-language tools, grouped:\n\n- **Search / discovery:** `search_parks`, `search_park_availability`,\n  `search_sites` (with a `category` of campsite / group / accommodation),\n  `search_day_use`, `search_backcountry`, `get_site_details`,\n  `list_equipment_types`, `resolve_dates`.\n- **Account (your session):** `connect_account` opens *your own* browser to sign in\n  yourself; the session is stored encrypted in a local vault. `disconnect_account`,\n  `connection_status`.\n- **Booking:** `prepare_booking` shows the exact action in a trusted host form,\n  then assembles the cart and drives it to the **payment screen** only after your\n  approval. You review and pay (Constitution Art. 2).\n- **Alerts:** `create_alert` / `list_alerts` / `delete_alert` — watch a campground\n  and get pinged when a cancellation opens a site.\n- **Policies:** `get_reservation_policies` — Parks Canada's reservation rules in\n  plain language (fees, change/cancel deadlines and refunds, check-in times,\n  no-shows, and that park entry isn't included). The assistant also surfaces the key\n  deadline and fee right in the booking preview, so you confirm with the terms in\n  front of you.\n\n**Accessibility is the point.** Where Parks Canada exposes an accessibility\nattribute, sites are flagged per-site and filterable (`accessible_only`); output\nis written to read cleanly with a screen reader (Constitution Art. 3).\n\n## Build\n\nPart of the repo-root pnpm workspace: `packages/core` (provider, booking cart,\navailability) and `packages/bundle` (the MCP server + the `.mcpb`), on\n[`@open-state/kit`](https://www.npmjs.com/package/@open-state/kit) for the session\nvault and citizen-driven sign-in.\n\n```bash\n# at the repository root\npnpm install\npnpm -r build\n```\n\n## Run (local, stdio)\n\n```bash\nnode packages/bundle/standalone/server.js\n```\n\nThe server speaks MCP over stdio and waits for an assistant to connect.\n\n## Install from npm\n\nNode.js 20 or newer is required. Configure any stdio MCP client to run:\n\n```bash\nnpx --yes @open-state/camping@1.0.7\n```\n\nFor upgrades, change the pinned version and restart the client. To uninstall,\nremove the MCP client configuration. Local state is intentionally retained;\nafter disconnecting, delete `~/.open-state-camping` to remove alerts and all\nremaining data. See [`PRIVACY.md`](PRIVACY.md).\n\n## Install in Claude Desktop (the .mcpb)\n\n**Easiest — download the prebuilt bundle.** Grab `open-state-camping.mcpb` from the\nlatest [**release**](https://github.com/JCrossman/can-fed-camp-mcp/releases)\n(tagged `camping-v*`). In **Claude Desktop → Settings → Extensions**, install that\nfile and restart. (When upgrading, remove the old version first, then install the\nnew one.)\n\n**Or build it yourself** from source:\n\n```bash\n# from the repo root\npnpm --filter @open-state/camping build\npnpm --filter @open-state/camping pack:mcpb\n```\n\nThen install `packages/bundle/open-state-camping.mcpb` the same way.\n\n## Connect it to Claude Code\n\nThe repo root ships a [`.mcp.json`](.mcp.json) that registers the built bundle\nfor [Claude Code](https://claude.com/claude-code) with a **relative** path (works\nfor anyone who clones the repo). Build first (`pnpm -r build`), open the repo in\nClaude Code, and approve the `open-state-camping` server when prompted.\n\n### Try it\n\n- \"Find me a Parks Canada campground in Banff.\"\n- \"Any accessible sites at Two Jack Lakeside for the August long weekend, two people?\"\n- \"Find a cabin or oTENTik in PEI for mid-September.\"\n- \"Moraine Lake shuttle times for July 17, party of 2.\"\n- \"Search Forillon backcountry for Aug 28 — then prepare Lean-to Les Lacs via Le Portage trailhead.\"\n- \"Nothing's open — watch it and let me know if a cancellation comes up.\"\n- \"What's the cancellation policy if I book a cabin and have to back out?\"\n\nTo book: ask the assistant to **prepare** it; it opens *your* cart at the Parks\nCanada payment screen, where you sign in (if you haven't via `connect_account`),\nreview, and pay yourself.\n\nConsequential tools require MCP form elicitation so the host can show the\nprepared action directly to you. Hosts without it retain anonymous search and\nread-only tools but intentionally cannot book, update/disconnect an account, or\ncreate/delete alerts. See [`COMPATIBILITY.md`](COMPATIBILITY.md).\n\n## Alerts\n\n`create_alert` saves a search and the in-process poller re-checks it on a polite\nschedule (never faster than every 5 minutes). When a site opens, the watch is\nretired and — if you gave a `notify_target` — a short message is sent there.\n\n- **Easiest:** ask to be notified — the assistant calls `create_alert` with\n  `notify_target=\"auto\"`, which provisions a **private, random\n  [ntfy.sh](https://ntfy.sh) topic** (no sign-up), sends a **test message**, and\n  hands back a subscribe link plus an `ntfy://` app deep link.\n- **Bring your own:** pass an `http(s)` ntfy link **you** control as `notify_target`\n  (for safety, links must be on an allowed notification host — not an arbitrary\n  site — to prevent SSRF/open-relay abuse).\n- No account, password, or personal information is stored — only the search and the\n  link. An auto topic's random suffix is its secret; treat the link as private, or\n  point `OPEN_STATE_NTFY_BASE` at a self-hosted ntfy.\n- **Local limitation:** the bundle runs as a local stdio process, so the poller\n  checks **only while your assistant is connected** to it. The watch persists on\n  disk; notifications fire only while a session is live.\n\n## Configuration\n\nAll optional, via environment variables:\n\n| Variable | Default | Meaning |\n|---|---|---|\n| `OPEN_STATE_HOME` | `~/.open-state-camping` | Local dir for the encrypted session vault and the alerts file. |\n| `OPEN_STATE_USER_AGENT` | a browser UA | See the honest note below. |\n| `OPEN_STATE_HTTP_TIMEOUT_MS` | `30000` | Upstream request timeout (ms). |\n| `OPEN_STATE_POLL_INTERVAL_MINUTES` | `10` | Alert poll interval; floored at 5. |\n| `OPEN_STATE_MAX_ALERTS` | `25` | Max concurrent cancellation watches. |\n| `OPEN_STATE_NTFY_BASE` | `https://ntfy.sh` | Base for auto-provisioned notify topics; set to a self-hosted ntfy for privacy. |\n| `OPEN_STATE_NOTIFY_ALLOWED_HOSTS` | (none) | Extra hosts a citizen-supplied `notify_target` may point at, comma-separated. |\n\n## Tests\n\n```bash\npnpm -r test\n```\n\nTests run fully offline against recorded fixtures — no live network calls. Booking\ncarts are diffed key-for-key against real captured sessions.\n\n## Public project policies\n\n- [Privacy and local data deletion](PRIVACY.md)\n- [Security reporting and supported versions](SECURITY.md)\n- [Compatibility](COMPATIBILITY.md)\n- [Contributing](CONTRIBUTING.md), [Code of Conduct](CODE_OF_CONDUCT.md), and\n  [support](SUPPORT.md)\n- [Release history](CHANGELOG.md) and [release process](RELEASING.md)\n\n## Honest notes and known limits\n\nReality, recorded rather than guessed (Constitution Art. 7):\n\n- **Price is not shown.** Parks Canada exposes no read-only price; a price only\n  exists as a cart/checkout line item — which is the payment step this tool stops\n  before. You see the price in your own session.\n- **User-Agent tension.** Parks Canada returns HTTP 403 to non-browser\n  User-Agents, so the default UA is browser-like to function. This sits awkwardly\n  with \"honest identification\" (Art. 7.3); it is configurable and is a candidate\n  for resolution through an official relationship.\n- **Backcountry `availability` is a status, not a count** — `0` means available\n  (like frontcountry). Booking carts differ by family (site vs quota-zone holds);\n  all are matched to real captured sessions. See the findings doc.\n\n*No citizen should be excluded from what is already theirs.*\n",
  "bytes": 9222,
  "sha": "edc40490c895037d153fec51f35546a04a46b69539bac004b2714858085e32e7",
  "repo_slug": "jcrossman/can-fed-camp-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_jcrossman_open_state_camping_2e3700d7/readme"
}