Skip to content

Developers

The PermitSnag MCP server

AI assistants and agents can search our permit and campground catalogue, read rules and key dates, read the openings our scans recorded with the time we recorded them, and get the official booking link. Every tool is read-only. No sign-in is needed.

Looking for setup steps for Claude, ChatGPT or another assistant? See Use PermitSnag in your AI assistant.

Endpoint and transport

  • Endpoint: https://api.permitsnag.com/mcp
  • Streamable HTTP, POST only. Send one JSON-RPC message per request; a JSON array body is refused. GET and DELETE get 405.
  • Responses are application/json. The server never opens an event stream, so a client that asks for text/event-stream still gets plain JSON.
  • No sessions. The server never sends an Mcp-Session-Id and ignores one if you send it.
  • Notifications get 202 with an empty body.
  • Browser pages cannot call it. A request that carries an Origin header we have not approved gets 403. Call it from a server, a command line or an assistant host.

Protocol versions and sign-in

Supported versions: 2025-06-18 and 2025-11-25. Send the version you want in initialize; if we support it, we agree to it, and if we do not, we answer with the newest version we support. After that, send the agreed version in the MCP-Protocol-Version header on every request.

No authentication is required in this version. There are no accounts, API keys or OAuth, and no tool reads or changes anything that belongs to a person.

Tools

Read each tool's inputSchema from tools/list for its arguments. Every tool carries readOnlyHint: true.

Permits

search_permits
Find permits by name, park, trail or state.
get_permit_details
Rules, season, key dates and how booking works for one permit, including whether it is a lottery or first come, first served.
check_availability
What our scans last recorded for a permit on the dates asked about, with the time we looked. A date we did not observe comes back as unknown.
get_booking_link
The official booking page for a permit, or our page for it. It returns a link and does nothing else.

Campgrounds

search_campgrounds
Find campgrounds by name, park or state.
get_campground_details
A campground's booking system, season and what our scans recorded, with the time we looked and whether the record is per site or for the whole campground.

Errors

  • An unknown method returns JSON-RPC error -32601.
  • An unknown tool name or arguments that do not match the schema return -32602.
  • When a tool runs but cannot answer, for example for a permit we do not list, you get a normal result with isError: true and a sentence explaining why. Show that sentence to the person rather than retrying.

Freshness

Every availability answer states when we last looked, in the sentence and in a structured field. Never treat it as live inventory. An opening we recorded may already be gone, and a date we did not observe is unknown, not sold out. The agency booking system is the source of truth, so send the person there to book.

Rate limits

Requests are rate-limited by address and across the whole endpoint. Over the limit you get HTTP 429. Back off and retry later, waiting longer after each 429. Do not poll: our answers change only when our scans record something new, so asking again a few seconds later returns the same answer.

Versioning and change notice

  • Additive changes can ship at any time: a new tool, a new optional argument, a new structured field or a new protocol version. Ignore fields you do not recognise.
  • Removing or renaming a tool, an argument or a field, and dropping a protocol version, is announced in the changelog below at least 30 days before it takes effect.
  • We may switch off a tool or the whole endpoint without notice to protect people, the service or the agency booking systems. If we do, we say so here.

Quickstart with curl

Four requests: initialize, confirm, list the tools, call one.

1. Initialize

The reply carries the protocol version the server agreed to and its serverInfo. If you ask for a version we do not support, the reply names the newest one we do.

curl -s https://api.permitsnag.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl-example","version":"1.0.0"}}}'

2. Send the initialized notification

Notifications get 202 with an empty body. From here on, send the agreed version in the MCP-Protocol-Version header.

curl -s -o /dev/null -w '%{http_code}\n' https://api.permitsnag.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'

3. List the tools

Each tool comes back with its inputSchema. That schema is the contract for its arguments.

curl -s https://api.permitsnag.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'

4. Call a tool

ARGS holds an object that matches the tool's inputSchema from step 3. The answer is in result.content as text, with structured fields in result.structuredContent.

ARGS='{"query":"Mount Whitney","limit":3}'  # search_permits arguments; see its inputSchema
curl -s https://api.permitsnag.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2025-11-25' \
  -d "{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"search_permits\",\"arguments\":$ARGS}}"

Changelog

  1. October 9, 2026

    • First published version of the connector.
    • Six read-only tools: search_permits, get_permit_details, check_availability, get_booking_link, search_campgrounds and get_campground_details.
    • Protocol versions 2025-06-18 and 2025-11-25 over Streamable HTTP, JSON responses only. No sign-in.

Terms and contact

Use of the server is covered by our Terms of Service (Section 18) and our Privacy Policy. Questions, bugs or a security report: support@permitsnag.com.