open-state-camping

open-state-camping

MCP server that lets citizens search and book Parks Canada campgrounds, accommodations, day use, and backcountry permits through their own AI assistant, with secure local session handling and payment completed by the user in their own browser.

Category
访问服务器

README

Open State: Camping — Parks Canada

Part of The Open State, a reference implementation of the Civic Access Protocol. This lets a citizen reach Parks Canada reservations through their own AI assistant, in plain language, while keeping their credentials and their control.

Your services. Your assistant. Your access.

It is a local MCP bundle (.mcpb) you add to your assistant on your own machine. It runs over stdio, searches Parks Canada's public availability, and prepares a booking right up to the payment screen in your own session. It never sees your password or payment details. Session cookies are encrypted on your device; you directly approve consequential actions and pay yourself.

For the binding rules and design, see The Open State: CONSTITUTION.md, AGENTS.md, docs/00-overview.md, docs/01-architecture.md. The verified Parks Canada API contract is in docs/parks-canada-api-findings.md.

What it does

All four Parks Canada booking families — search and book, end-to-end:

Family Search Prepare booking
Frontcountry campsites & group sites ✅ ✅
Accommodations (oTENTik, cabin, yurt, …) ✅ ✅
Day Use (shuttles, parking, guided events) ✅ ✅
Backcountry zone permits (entry point + per-night zones) ✅ ✅

Plain-language tools, grouped:

  • Search / discovery: search_parks, search_park_availability, search_sites (with a category of campsite / group / accommodation), search_day_use, search_backcountry, get_site_details, list_equipment_types, resolve_dates.
  • Account (your session): connect_account opens your own browser to sign in yourself; the session is stored encrypted in a local vault. disconnect_account, connection_status.
  • Booking: prepare_booking shows the exact action in a trusted host form, then assembles the cart and drives it to the payment screen only after your approval. You review and pay (Constitution Art. 2).
  • Alerts: create_alert / list_alerts / delete_alert — watch a campground and get pinged when a cancellation opens a site.
  • Policies: get_reservation_policies — Parks Canada's reservation rules in plain language (fees, change/cancel deadlines and refunds, check-in times, no-shows, and that park entry isn't included). The assistant also surfaces the key deadline and fee right in the booking preview, so you confirm with the terms in front of you.

Accessibility is the point. Where Parks Canada exposes an accessibility attribute, sites are flagged per-site and filterable (accessible_only); output is written to read cleanly with a screen reader (Constitution Art. 3).

Build

Part of the repo-root pnpm workspace: packages/core (provider, booking cart, availability) and packages/bundle (the MCP server + the .mcpb), on @open-state/kit for the session vault and citizen-driven sign-in.

# at the repository root
pnpm install
pnpm -r build

Run (local, stdio)

node packages/bundle/standalone/server.js

The server speaks MCP over stdio and waits for an assistant to connect.

Install from npm

Node.js 20 or newer is required. Configure any stdio MCP client to run:

npx --yes @open-state/camping@1.0.3

For upgrades, change the pinned version and restart the client. To uninstall, remove the MCP client configuration. Local state is intentionally retained; after disconnecting, delete ~/.open-state-camping to remove alerts and all remaining data. See PRIVACY.md.

Install in Claude Desktop (the .mcpb)

Easiest — download the prebuilt bundle. Grab open-state-camping.mcpb from the latest release (tagged camping-v*). In Claude Desktop → Settings → Extensions, install that file and restart. (When upgrading, remove the old version first, then install the new one.)

Or build it yourself from source:

# from the repo root
pnpm --filter @open-state/camping build
pnpm --filter @open-state/camping pack:mcpb

Then install packages/bundle/open-state-camping.mcpb the same way.

Connect it to Claude Code

The repo root ships a .mcp.json that registers the built bundle for Claude Code with a relative path (works for anyone who clones the repo). Build first (pnpm -r build), open the repo in Claude Code, and approve the open-state-camping server when prompted.

Try it

  • "Find me a Parks Canada campground in Banff."
  • "Any accessible sites at Two Jack Lakeside for the August long weekend, two people?"
  • "Find a cabin or oTENTik in PEI for mid-September."
  • "Moraine Lake shuttle times for July 17, party of 2."
  • "Search Forillon backcountry for Aug 28 — then prepare Lean-to Les Lacs via Le Portage trailhead."
  • "Nothing's open — watch it and let me know if a cancellation comes up."
  • "What's the cancellation policy if I book a cabin and have to back out?"

To book: ask the assistant to prepare it; it opens your cart at the Parks Canada payment screen, where you sign in (if you haven't via connect_account), review, and pay yourself.

Consequential tools require MCP form elicitation so the host can show the prepared action directly to you. Hosts without it retain anonymous search and read-only tools but intentionally cannot book, update/disconnect an account, or create/delete alerts. See COMPATIBILITY.md.

Alerts

create_alert saves a search and the in-process poller re-checks it on a polite schedule (never faster than every 5 minutes). When a site opens, the watch is retired and — if you gave a notify_target — a short message is sent there.

  • Easiest: ask to be notified — the assistant calls create_alert with notify_target="auto", which provisions a private, random ntfy.sh topic (no sign-up), sends a test message, and hands back a subscribe link plus an ntfy:// app deep link.
  • Bring your own: pass an http(s) ntfy link you control as notify_target (for safety, links must be on an allowed notification host — not an arbitrary site — to prevent SSRF/open-relay abuse).
  • No account, password, or personal information is stored — only the search and the link. An auto topic's random suffix is its secret; treat the link as private, or point OPEN_STATE_NTFY_BASE at a self-hosted ntfy.
  • Local limitation: the bundle runs as a local stdio process, so the poller checks only while your assistant is connected to it. The watch persists on disk; notifications fire only while a session is live.

Configuration

All optional, via environment variables:

Variable Default Meaning
OPEN_STATE_HOME ~/.open-state-camping Local dir for the encrypted session vault and the alerts file.
OPEN_STATE_USER_AGENT a browser UA See the honest note below.
OPEN_STATE_HTTP_TIMEOUT_MS 30000 Upstream request timeout (ms).
OPEN_STATE_POLL_INTERVAL_MINUTES 10 Alert poll interval; floored at 5.
OPEN_STATE_MAX_ALERTS 25 Max concurrent cancellation watches.
OPEN_STATE_NTFY_BASE https://ntfy.sh Base for auto-provisioned notify topics; set to a self-hosted ntfy for privacy.
OPEN_STATE_NOTIFY_ALLOWED_HOSTS (none) Extra hosts a citizen-supplied notify_target may point at, comma-separated.

Tests

pnpm -r test

Tests run fully offline against recorded fixtures — no live network calls. Booking carts are diffed key-for-key against real captured sessions.

Public project policies

Honest notes and known limits

Reality, recorded rather than guessed (Constitution Art. 7):

  • Price is not shown. Parks Canada exposes no read-only price; a price only exists as a cart/checkout line item — which is the payment step this tool stops before. You see the price in your own session.
  • User-Agent tension. Parks Canada returns HTTP 403 to non-browser User-Agents, so the default UA is browser-like to function. This sits awkwardly with "honest identification" (Art. 7.3); it is configurable and is a candidate for resolution through an official relationship.
  • Backcountry availability is a status, not a count — 0 means available (like frontcountry). Booking carts differ by family (site vs quota-zone holds); all are matched to real captured sessions. See the findings doc.

No citizen should be excluded from what is already theirs.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选