Pitchup.com MCP server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Pitchup.com MCP server Who's arriving on Saturday, and do any have special requests?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Pitchup.com MCP server
An MCP server that lets Claude, ChatGPT and other MCP clients work with a campsite's Pitchup.com supplier account: campsites, pitch types, pitches, charge types, prices and stay rules, allocation, extras and bookings, and (when enabled) setting allocation, prices and charge types. It is built from Pitchup's public API Integration Guide, which is published as one OpenAPI 3.0.3 document (docs.pitchup.com/api/pitchup-api-openapi.yaml, 24 operations, 14 schemas, with the whole guide in its description).
Once it's connected, a site owner or manager can ask things like:
"Who's arriving on Saturday, how many people and dogs, and does anyone have special requests?"
"What bookings came in or changed since yesterday morning?"
"What's the nightly price for electric pitches in August, and which days are closed to arrivals?"
"Is there allocation for the bell tent from 14 to 18 July?"
With writes enabled: "Set max allocation to 3 for electric pitches for all of August, and put weekend prices up to £28."
Tools
Tool | What it does | API calls |
| The resources the key can reach, plus the environment and API version the server is using. A quick key check. |
|
| Campsites: slug, name, state, currency, categories, pitch type IDs, availability. |
|
| One campsite: languages, child and infant ages, arrival and departure times, opening dates, rating, notices and policies. |
|
| Pitch types with capacity, persons included, pricing method, pitch count, lead price, facilities, charge type and pitch IDs. Optional campsite filter, applied by this server. |
|
| One pitch type. An answer that does not carry the requested ID is treated as not found. |
|
| Pitches (units): pitch type, name, bookable by Pitchup, priority, your external ID, calendar sync status. Filters: |
|
| Charge types (tariffs) with pitch type, active flag and status. Optional pitch type filter, applied by this server. |
|
| One charge type. |
|
| Prices and stay rules from arrival days: pitch, adult, child and infant prices, pricing period, minimum and maximum stay, closed to arrival or departure, status, pitches sold and left. Filters: |
|
| Bookings with dates, status, lead guest name, party size, pitch, unit, extras, special requests and amounts. Every documented filter: |
|
| Who arrives on one date: confirmed and reserved bookings by default (others are counted; the status is compared case-insensitively), sorted by pitch type and name, with party totals. The dog total only counts bookings that carry a dog count, and is |
|
| Allocation days: max allocation and pitches left to sell per date and pitch type. Filters: |
|
| For one pitch type and a stay, the allocation of every night (nights without an allocation day and nights with nothing left are named) and the arrival days on the arrival date for that pitch type's charge types. It does not reproduce Pitchup's pitch assignment or price calculation. |
|
| Extras with price, pricing type and period, maximum quantity, compulsory flag and charge types; optionally the dated prices of variable-priced extras. |
|
| Sets |
|
| Sets either |
|
| Updates prices and stay rules of one charge type from |
|
| Renames a charge type, changes its internal description or switches its pricing on or off. Reads the charge type first and sends it back whole, because the documented update is a |
|
Not covered on purpose: every DELETE (charge types, bookings, pitches, webhooks), creating or amending bookings and Reserved bookings, creating pitches and charge types, POST /rest/api/arrival/ (single arrival days; set_pricing covers ranges), PATCH /rest/api/extra/, webhooks, and the currency and language lists.
Related MCP server: Amiqus MCP server
Setup
Requires Node 18 or later.
npm install
npm run buildYou need an API key: in the Pitchup Manager Portal, open My details and copy the key from the API key section. Sandbox and Live keys are different, and the sandbox needs its own sign-up at www.sandbox.pitchup.com/supplier2/signup/. The key is sent as Authorization: Token <key>; a key pasted with its Token prefix is accepted and the prefix dropped.
Claude Desktop: add this to claude_desktop_config.json:
{
"mcpServers": {
"pitchup": {
"command": "node",
"args": ["/absolute/path/to/pitchup-mcp/dist/index.js"],
"env": { "PITCHUP_API_KEY": "your-sandbox-key", "PITCHUP_ENV": "sandbox" }
}
}
}Claude Code:
claude mcp add pitchup -e PITCHUP_API_KEY=your-sandbox-key -e PITCHUP_ENV=sandbox -- node /absolute/path/to/pitchup-mcp/dist/index.jsVariable | Required | Meaning |
| yes | Your API key from My details, sent as |
| no |
|
| no | The API version sent in the |
| no |
|
| no | Overrides the host (the server adds |
Safety defaults
Read-only unless
PITCHUP_ALLOW_WRITES=true. Read tools carry the MCPreadOnlyHintannotation. The four write tools are markeddestructiveHint: true(each overwrites existing allocation days, prices or charge type fields; setting allocation to 0 stops sales on those dates) andidempotentHint: true. Nothing is ever deleted: the server has no tool that sendsDELETEorPATCH, and the test suite asserts that no such request is made.Sandbox by default.
PITCHUP_ENV=livehas to be set on purpose.Guests: the lead guest's name, party size, dates, pitch, unit, extras, special requests and amounts are returned by default. The booking's structured contact fields (email, telephone, postal address with street, city, county, postcode and country,
names_of_all_party_members,car_registration_numberandchild_ages) are only returned when a tool is called withinclude_contact_details=true.Free text is not withheld, only redacted, and the redaction is a heuristic. A campsite can require guests to write their vehicle registration and the names of everyone in the party in the special requests field (the pitch type's
require_car_registrationandrequire_party_names, which the spec describes as "included in the special requests field"), and guests can type anything else there. By default, in special requests, the unit description, group name and cancellation reason: email addresses become[email redacted]; phone-number-like sequences become[phone redacted](international numbers written with+or00, including+44 (0)7700 …, UK numbers with a bracketed area code, UK-style numbers starting with0, and 10-digit numbers starting with7, a UK mobile without its0; other such digit strings may be redacted too, while IDs, dates and amounts are left alone); upper-case UK postcodes become[postcode redacted]; and current-format UK registrations (AB12 CDE) become[registration redacted]. Names (such as the party names a campsite asks for), street addresses, lower-case postcodes, older or foreign registration formats and dates of birth written in free text are returned as typed. The test suite checks this with a booking on a pitch type that requires both.Payment data is never returned, even on request: the card type and number,
charge_id,token_id,stripe_charge_idand thedatafield of a booking, and the campsite'spayment_email,stripe_token,card_typesand payment timings. Only the payment status word (pending,paid…) and its due date are passed on. A card number a guest types into free text (13 to 19 digits starting with 1 to 9, grouped or not) is replaced with[card number redacted]in every case, with or withoutinclude_contact_details; this is a pattern match, so a card number written in some other way (split by words, say) would not be caught.The campsite's own email, the manager's email, its phone numbers and postal address are only returned with
include_contact_details; its notices, useful info and cancellation policy have emails, phone numbers, UK postcodes and UK registrations redacted by default, as above.Pitch calendar links are only returned with
include_contact_details: the guide describes the Pitchup feed (pitchup_calendar_feed) as a signed link whose events carry the customer's name, telephone, email and address, and external feed links often carry their own tokens. By default a pitch shows how many external feeds it has and their sync status. Nothing is ever downloaded.Input is checked before any call: pitch type, pitch and charge type IDs must be positive whole numbers (the spec types them as numbers), campsite slugs letters, digits,
_and-, dates realYYYY-MM-DDdates, booking creation and modification filters a date orYYYY-MM-DD HH:MM[:SS](the guide's datetime example), prices decimal strings such as10.50. Write tools refuse locally a range that ends before it starts, a repeated date,min_daysabovemax_days, both or neither ofallocationandmax_allocation, and a pricing request with nothing to change.Pagination follows the
nextlink exactly as Pitchup returns it, as the guide asks, withpage_size=100(the documented maximum) on the first request, untilnextis null or the tool'smax_resultsis reached; an empty page with anextlink is followed too. A list cut short says so withcomplete: falseand a note, whether it was cut by Pitchup's paging limit or bymax_resultsafter a filter this server applies itself (pitch type, charge type, campsite). A200whose JSON is not a list (noresultsarray) is an error, not an empty list. Anextlink on another host is not followed, so the API key is only ever sent to the configured Pitchup host.check_availabilityreads at most 30 pages of allocation days (7.5 seconds of request spacing plus Pitchup's own response time), to stay within the MCP client's default 60-second request timeout in case Pitchup ignoresafter/beforeon allocation days; when it stops early it says so and does not claim that a night it did not find has no allocation day.Rate limits: the guide documents none; its best-practice list only says failed requests should be retried "on a reasonable schedule". Requests are spaced 250 ms apart (about four per second, a guess on the polite side). A 429 is retried at most twice for any method, on the assumption that a rate-limited request was not processed, waiting for
Retry-After(whole or fractional seconds, or an HTTP-date; 2 s before the second attempt and 4 s before the third when the header is absent). Each wait is capped at 10 seconds; if Pitchup asks for longer, the call gives up at once and says how long to wait.502, 503 and 504 are retried the same way for
GETonly; after three failures the error says the service may be unavailable, without the gateway's HTML. A write is never retried after a gateway error, because Pitchup may already have queued the job; the error says to check the current values with the matching list tool first.A 200 whose body is not JSON (a proxy or login page) is an error described by content type and size, never an empty list. A rejected key produces a message naming
PITCHUP_API_KEY, the environment in use and the Sandbox/Live difference. Error messages pass on only JSON fields from Pitchup (at most six), with contact details redacted and the API key scrubbed.
Tests
npm testThe test suite (30 checks, about 195 requests to the mock, about 60 seconds):
Validates every fixture record against the schemas in Pitchup's published OpenAPI document with Ajv (
strict: false,ajv-formats, plus the spec'sdecimalformat):CampsiteBase; theGET /pitchtype/{pk}/results item (with all 44 keys it marks required) andPitchTypeBase; thePOST /pitch/response andPitchBase;ChargeTypeBaseand theGET /chargetype/{chargetype_id}/response; theGET /arrival/results item andArrivalBase;AllocationBase;ExtraBase;ExtraPriceBase; thePOST /booking/response andBookingBase; and the API root. The spec is downloaded fromdocs.pitchup.com/api/pitchup-api-openapi.yamltospec.yamlon the first run. Where a component schema disagrees with the guide's own examples, the disagreeing properties are left out of that one check and the suite proves the list is exact (every error the full schema reports is on a listed property, and every listed property does fail):BookingBasetypesadults,party,extras,payment_status,priceandtaxesas strings while the guide's booking example and thePOST /booking/response schema show numbers, objects and arrays (the fixtures follow the example and pass that response schema in full);PitchTypeBasetypespitchesandlead_priceas strings andground_typeas non-nullable, where theGET /pitchtype/{pk}/schema and example use an array, a number and null;PitchBasetypescalendar_feedsas a string where the guide and thePOST /pitch/schema use an array.Starts a local mock of the API under
/rest/api/that serves those fixtures with the documentedAuthorization: Token <key>check and DRF-style pagination (next/previouslinks,counton page-number lists, a cursor on bookings as in the guide's booking example,page_sizehonoured up to 100, booking pages capped at 3 by the mock so the suite pages), 401s with the guide's messages for a missing key, a wrong key and "Token" typed twice, 404Not found.for unknown IDs, 405 for other methods, and injected 429s, 5xx gateway pages, a 400 and an HTML 200. The mock's list, detail and write responses are validated against the spec's response schemas (list envelopes withnext/previousallowed to be null, as the guide's "Pagination" section says), the write request examples from the spec are posted to it, and its error bodies are validated against a schema written by hand (test/schemas.mjs), because the spec documents no error response: the messages are the ones the guide's troubleshooting table quotes, and the suite checks each one appears in the spec.Starts the built server and drives it over stdio with the official MCP client: 27 checks covering tools/list and the annotations (14 read tools read-only; 4 write tools destructive and idempotent), every read tool, pagination following
nextacross three pages of 100 arrival days and four cursor pages of bookings to a nullnext, an empty page with anextlink followed, a200with non-list JSON reported as an error, the booking filters (the names are read from the guide's "Filtering bookings" section and compared with the tool's inputs, and each of the 20 is passed through exactly:statusas its numeric key,pitchas the pitch ID, a datetime with a space sent as%20), a list cut short bymax_resultssaying so (unfiltered, and after this server's own pitch type, charge type and campsite filters in all five tools that have one), aGET /pitchtype/{pk}/answer holding another pitch type (as a list and as an object) refused byget_pitch_type,get_pricing,check_availabilityandset_allocationwith no request after it, andset_allocationrefusing a record whoseurlpoints at another pitch type, requests within one tool call spaced at least 240 ms apart, thedate/after/beforefilters on arrival and allocation days, theexternal_idfilter on pitches, the spec's list-shapedGET /pitchtype/{pk}/answer and a plain object, redaction of guest and campsite contact details and calendar links by default and their return on request (including phone numbers written(01632) 960555,+44 (0)7700 …,0044 …and7700900123in free text), a booking on a pitch type that requires the registration and party names in special requests (registration, postcode, card number and mobile redacted by default, names and street returned as typed, the card number redacted even on request), card and payment fields never returned in either case,list_arrivalsfiltering and totals (aConfirmedstatus counted as confirmed, a booking withoutparty.dogsnot counted as 0 dogs, and anulldog total when no booking has one),check_availabilitynaming a night without an allocation day and a night with nothing left, refusing 91 nights and accepting 90, stopping after 30 pages of allocation days and then reporting the result as partial,list_extrascapping the variable prices atmax_results, the write gate with the variable unset andfalse, every write body validated against the spec's request schema (POST /allocation/as one object and as a list,POST /pitchtype/{pk}/allocation/withmax_allocationand withallocation,POST .../pricing/against its request schema andChargeTypePricingBase, the whole-recordPUT /chargetype/{id}/), local refusals before any call (reversed ranges, a repeated date,min_daysabovemax_days, both or neither allocation field, nothing to change, a price that is not a decimal string), bad IDs and dates rejected before any call, the 404 and 401 messages (a 401 sent once, not retried), a 400 passed on redacted, an error body that echoes the key passed on with the key scrubbed and at most six messages, the 429 retry waiting forRetry-Afterin the whole-seconds, fractional-seconds and HTTP-date forms and 2 s then 4 s when it is absent, giving up after three attempts and at once above the cap, a 429 on a write retried once, a 502 retried forGETand a 503 on a write not retried, aGETfailing three times reported without the HTML, a non-JSON 200 reported as an error without quoting it, anextlink on another host not followed, a key pasted withTokensent once, and that every request carriedAuthorization: Token <key>,Accept: application/json; version=2023-08-25and a documented method and path (the spec'spathsplusGET /rest/api/pitchtype/, which the suite checks is written in the guide). One more check reads the environment rules (sandbox default, live, bad values refused) from the builtdist/config.jswithout any network call.
The fixtures avoid null in fields the spec does not mark nullable, although the guide's examples show null in several of them (external_id, arrival_time, cancelled_at, name and notes on pitches, many campsite fields); the server treats null, an empty string and the string "null" the same way.
Status
This is a working prototype. It has not yet been run against the live API or the sandbox, because it was built without a Pitchup account. Everything below is taken from the published guide and should be confirmed on a sandbox account (the sandbox sign-up is self-serve; test bookings need Pitchup to activate the listing):
The error responses: the status codes and bodies for a missing or wrong key (the mock answers 401
{"detail": "Invalid token."}), for an unknown ID (404Not found.), for validation errors (the 400 body shape is not documented; the server reads any JSON strings in it) and for rate limiting (no 429 is documented at all).The API version: that
Accept: application/json; version=2023-08-25is honoured, and which field names and status values come back under it (the guide's booking example shows"status": "paid", which version 2019-01-21 says becameconfirmed).GET /rest/api/pitchtype/: it is documented in the guide's text and the API root's example, not in the spec'spaths. Whether it accepts a campsite filter (the guide says "optionally filtered by campsite" without naming the parameter; this server filters by the campsite link itself).GET /rest/api/pitchtype/{pk}/: the spec documents a paginated list as its answer (and whether that list can hold other pitch types is not said); the server takes the record with the requested ID fromresults, or accepts a plain object with that ID, and treats an answer without that ID as not found.Pagination: that
page_sizeup to 100 is honoured on every list, thatnextlinks point to the same host the request went to (on the sandbox, the sandbox host; the guide's examples all usewww.pitchup.com), which lists use cursors and which page numbers, and whether the API root answers an object (spec schema) or a one-element array (guide example); both are handled.Filter semantics: whether
afterandbeforeon arrival and allocation days compare thedateand include it (check_availabilityasks for one day more on each side and picks the nights itself, so either reading works); whether allocation days acceptdate,afterandbeforeat all (the guide documents them for arrival days and names them in its general filtering section, but its allocation section lists no filters); that bookingafter/beforecompare the creation date, as the guide says, whether they include the given time, and that they acceptYYYY-MM-DD HH:MM:SS; thatstatustakes the numeric key (the guide's example isstatus=3) andpitchthe pitch ID; thatfirst_name/last_namematch "containing" case-insensitively.Booking status spelling: the status values list and the 2019-01-21 changelog write
confirmed, the booking response table's example value is"Confirmed";list_arrivalscompares case-insensitively, so either works, and shows the status as sent.Dogs: the guide lists
dogsinpartyunder "What's new in version prerelease", and this server pins2023-08-25by default, so the booking API may send no dog count at all.list_arrivalsthen reports the number of dogs as unknown (null, or a total of the bookings that do carry one, with a note) rather than 0. Whetherparty.dogscomes back under2023-08-25is unconfirmed;PITCHUP_API_VERSION=prereleaseshould include it.Booking field shapes:
party,payment_status,extrasandtaxesas objects and arrays, as in the guide's example and thePOST /booking/schema rather thanBookingBase. The shape of an item inextrasis not shown anywhere (the example list is empty; the response table namesextra,extra priceandquantity); the server readsextraorname,quantityandprice,extra priceorextra_price.The schema disagreements listed under Tests (
BookingBase,PitchTypeBase,PitchBase), theExtraBasestatus enum (active,deleted,disabled) against the guide's example valueinactive, and which fields are really nullable.Writes, all untested on a real account: that
POST /rest/api/allocation/accepts the pitch type's ownurlaspitchtypeand a JSON list of up to 90 days, and what it answers for a list (the guide's example response is a paginated list; the server accepts a list, a paginated list or one object); thatPOST /pitchtype/{pk}/allocation/acceptsmax_allocation(documented in the guide's text and response table, not in the request schema); thatPOST .../pricing/takesis_soft_closeandclosed_to_departureas JSON booleans andweekdaysas integers (the guide's examples quote them as strings, the spec's example quotes weekdays as strings); that thetask_idjobs apply as described (a job's result can only be queried in the prerelease version); and thatPUT /chargetype/{id}/acceptsname,description,pitchtypeandis_activealone, and what it does tostatuswhenis_activechanges.Past dates: the guide says updates to arrival and allocation days in the past are refused, using Europe/London time; the server does not check this itself.
How many requests per second the API tolerates; nothing is documented, so the 250 ms spacing is a guess.
Going to production
This version runs locally over stdio, with the site owner's own API key. For site owners to connect from claude.ai or ChatGPT without handling keys, the next step is a remote server (Streamable HTTP) behind OAuth, hosted by Pitchup, and then a listing in the Claude and ChatGPT connector directories. A production version, tested on a sandbox site with an activated listing, would also cover the booking amendment and Reserved-booking endpoints, the task_id status check once it leaves prerelease, and webhooks for new bookings and cancellations.
Licence
MIT. Built by Alexandru Dragoș (alexandru.dragos96@gmail.com) with an AI agent (Claude) working under his direction.
Available Tools
14 toolsapi_rootAPI rootARead-only
The resources this API key can reach (GET /rest/api/), plus which Pitchup environment and API version this server is using. A quick way to check the key works.
Inputs: no named parameters.
check_availabilityCheck allocation for a stayARead-only
For one pitch type and a stay (arrive to depart), the allocation of every night and the arrival-day rules on the arrival date for that pitch type's charge types. The guide says a stay is bookable when every night has allocation, a pitch is free for the whole stay and prices cover the period: this tool checks the first and shows the arrival-date rules, but does not reproduce Pitchup's pitch assignment or price calculation.
Inputs: arrive (required), depart (required), pitch_type_id (required).
get_campsiteGet a campsiteARead-only
One campsite by slug: state, currency, pitch types, languages, child and infant age limits, arrival and departure times, opening dates, rating, notices and policies. Payment settings are never returned.
Inputs: slug (required), include_contact_details.
get_charge_typeGet a charge typeCRead-only
One charge type by ID.
Inputs: charge_type_id (required).
get_pitch_typeGet a pitch typeARead-only
One pitch type by ID, with its charge type and pitch IDs, capacity, pricing method and facilities.
Inputs: pitch_type_id (required).
get_pricingGet prices and stay rulesARead-only
Prices and stay rules from arrival days (GET /rest/api/arrival/): for each date and charge type, the pitch price and extra adult, child and infant prices, the pricing period, minimum and maximum stay, closed to arrival or departure, status, and pitches sold and left. The API only returns future arrival days. Filter by date (one day) or after/before, and by charge type or pitch type.
Inputs: date, after, before, max_results, +2 more.
list_allocationsList allocation daysARead-only
Allocation days: for each date and pitch type, the maximum number of pitches Pitchup may sell (max_allocation) and how many are left to sell. A date with no allocation day has no allocation. Filter by date or after/before, and by pitch type.
Inputs: date, after, before, max_results, +1 more.
list_arrivalsWho arrives on a dateARead-only
Guests arriving on one date (bookings with that arrival date), with lead guest name, party size, pitch type and pitch, unit, estimated arrival time and special requests, plus totals. By default only confirmed (Pitchup) and reserved (external) bookings are listed; the rest are counted. The dog total only counts bookings that carry a dog count (the guide lists party.dogs as a prerelease addition) and is null when none does. Structured guest contact details only with include_contact_details; special requests are returned with emails, phone numbers, UK postcodes and UK registrations redacted, but names and street addresses in them are not.
Inputs: date (required), campsite, include_all_statuses, include_contact_details.
list_bookingsList bookingsARead-only
Bookings (Pitchup bookings and your Reserved external bookings) with dates, status, lead guest name, party size, pitch, unit, extras, special requests and amounts. Every documented filter is available: creation and modification dates, arrival and departure dates (equals, gt, gte, lt, lte), status, first/last name, campsite, pitch, external_id. Guest emails, phones and addresses only with include_contact_details (in free text, emails, phone numbers, UK postcodes and UK registrations are redacted by default; names and street addresses are not); card details never.
Inputs: after, pitch, arrive, before, +18 more.
list_campsitesList campsitesARead-only
The campsites on this Pitchup account: slug, name, state (settingup, bookable...), currency, categories, pitch type IDs and availability. The campsite's own email, phone and address only with include_contact_details.
Inputs: max_results, include_contact_details.
list_charge_typesList charge typesBRead-only
Charge types (tariffs such as Standard or Weekly) with their pitch type, active flag and status. Prices for each are read with get_pricing.
Inputs: max_results, pitch_type_id.
list_extrasList extrasBRead-only
Extras that can be added to a booking (for example a dog, a cot or an extra car): price, pricing type, pricing period, maximum quantity, compulsory flag and linked charge types. Optionally also the dated prices of extras with variable pricing.
Inputs: max_results, include_variable_prices.
list_pitchesList pitchesARead-only
Individual pitches (units) with their pitch type, name, whether Pitchup may book them, priority, your external ID and calendar sync status. Optionally only one pitch type, or the pitch with a given external_id. Calendar feed links (the Pitchup feed carries guests' contact details) only with include_contact_details.
Inputs: external_id, max_results, pitch_type_id, include_contact_details.
list_pitch_typesList pitch typesBRead-only
Pitch types (for example an electric grass pitch, a bell tent or a static caravan) with capacity, persons included, pricing method, number of pitches, lead price, facilities and the IDs of their charge types and pitches. Optionally only those of one campsite.
Inputs: campsite, max_results.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
Each tool targets a fairly distinct resource (campsites, pitch types, pitches, charge types, pricing, bookings, arrivals, allocations, extras). There is mild overlap between list_allocations and check_availability (both concern allocation) and between list_arrivals and list_bookings (arrivals is a filtered view of bookings), but the detailed descriptions clarify the boundaries well enough.
Most tools follow a clean get_/list_ + noun pattern (get_campsite, list_pitches, get_pricing, list_bookings). Minor deviations exist: api_root is a bare noun and check_availability uses a different verb, but the set still reads as one coherent convention.
14 tools is well within the ideal range and each maps to a distinct resource or operation in the booking-management domain. No tool appears redundant or padded.
The surface covers the full read lifecycle: account/environment, campsites, pitch types, pitches, charge types, pricing, allocations, availability, bookings, arrivals and extras. It appears intentionally read-only (no create/update/delete), which is likely by API design, though agents cannot mutate bookings or campsites. A direct get_booking for a single booking is also absent, but list_bookings largely compensates.
Maintenance
Related MCP Connectors
AI Visibility Isn’t Luck. It’s Signal Alignment. Read-only MCP access to Market Brew, a patented search engineering platform for SEO and AI visibility. Market Brew uses particle swarm optimization and template models to reverse engineer observed search behavior. Inspect ranking models, content alignment, knowledge bases, crawl data, and AI visibility history through a hosted Streamable HTTP MCP server. Requires an enabled Market Brew account and OAuth. Setup guide: https://brew.marketbrew.ai/customer-manual.htm#api-and-chatgpt-read-access
Amazon Ads, Seller Central, Vendor Central and AMC data for AI agents. Read-only by default.
Read-only MCP for AI usage profiles, leaderboards, stats, and docs; no writes or private data.
Read-only MCP tools for Total Parks-listed Australian holiday parks, caravan parks, and campgrounds.
Related MCP Servers
- AlicenseAqualityCmaintenanceIt enables MCP clients such as Claude and ChatGPT to read an estate agency's Dezrez Rezi CRM data, including properties and their timelines, people, groups, and offers. It is read-only and applies privacy redactions by default.10MIT
- AlicenseAqualityCmaintenanceEnables Claude, ChatGPT and other MCP clients to read an Amiqus ID account—clients, onboarding records and steps, check results, templates, case status counts and webhooks—and, when writes are enabled, create records.9MIT
- AlicenseNot gradedqualityCmaintenanceLets MCP clients such as Claude and ChatGPT read a rota and time-and-attendance account, exposing venues, groups, shifts, absences and absence types, time entries, venue events and staff names through read-only tools that never return pay data.MIT
- AlicenseAqualityCmaintenanceEnables MCP clients such as Claude and ChatGPT to read a Timesheet Portal account, including timesheet time and cost reports, invoices, leave bookings and balances, projects or jobs, clients, users and cost centres, across both the Standard and Recruitment editions. It is read-only, with personal and pay data withheld unless explicitly requested.8MIT