Line-Up MCP server
Handles payment processing through Adyen as one of the supported payment providers; payment items are reported as method type, amount, currency and status, though Adyen session data and client keys are never returned.
Handles payment processing through Square as one of the supported payment providers; payment items are reported as method type, amount, currency and status, though Square application and location ids are never returned.
Handles payment processing through Stripe as one of the supported payment providers; payment items are reported as method type, amount, currency and status, though the Stripe continuation secret, publishable key and account id are never returned.
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., "@Line-Up MCP serverWhat's on next Friday and how many seats are left?"
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.
Line-Up MCP server
An MCP server that lets Claude, ChatGPT and other MCP clients work with a Line-Up ticketing channel: events, performances with pricing and capacity, seating, packages, visits (who is coming to a performance), transactions, the organisation's venue plans, payment, delivery and seat types, and (when enabled) creating and releasing reservations. It is built from Line-Up's public Transactional API documentation: the OpenAPI 3.1 document the API serves at https://api.line-up.tickets/api/openapi.json (Swagger UI at /api/docs).
Once it's connected, someone at the venue can ask things like:
"What's on in the next two weeks, and how many seats are left for each night?"
"How much is a concession in the stalls for Friday's Macbeth?"
"Which rows in Stalls Left still have seats together?"
"Who is coming tonight? Show me booking LU-TEST1 and its notes."
"What packages do we sell for Macbeth, and what payment methods does this channel take?"
With writes enabled: "Hold two adult stalls seats for tonight for 15 minutes under the name Box office hold."
Tools
Tool | What it does | API calls |
| Events with description, run time, venue and address, tags. Filters |
|
| One event in full: description, booking information, organisation currency, gallery, seat-view base URL. |
|
| Performances with start/end, time zone, total capacity and remaining, and pricing per price band and variant (including the |
|
| One performance with the same pricing and capacity detail. |
|
| Seating groups (areas, sections, blocks, rows) with capacity and capacity remaining; optionally the individual available seats with price band, seat type and group, capped and summarised per group. Filters |
|
| Packages per performance for one event (paged) or for one performance, with capacity remaining and total price; with a |
|
| Visits: for each performance a customer holds tickets to, the event, the performance and the ticket items with their transaction (reference, lead booker name, status). Filters |
|
| One visit with every ticket item and, for shared tickets, whether the share was claimed. |
|
| One transaction: status, reference, totals, customer name, ticket items with seat, price and barcode status (paged), product, delivery, payment, add-on, package and adjuster items, coupons, staff notes (paged). |
|
| The organisation's currency, venue plans with admission type, payment methods by name and type, seat types (optionally for one performance) and, with a |
|
| Creates a transaction, then adds one ticket item per request (reserved seat, general admission or best available). Refuses locally when seat fields do not match the reservation type. Only registered when writes are enabled. |
|
| Deletes a transaction, releasing the seats it holds. Marked destructive. Writes only. |
|
Not covered on purpose: customer accounts, login and password reset, addresses, opt-ins, forms, discounts, payments and payment actions, terminal readiness, completing a transaction, product/package/delivery/add-on items on a basket, notes creation and editing, and the PUT/PATCH transaction updates. The spec's x-purchase-flow-id header and the group_preset/group_by query parameters are not sent. GET /health is not called by any tool (the test suite checks the mock serves it unauthenticated, as the live API does: an anonymous curl https://api.line-up.tickets/api/health answers {"status":"ok"}, while /meta/ answers 401; the spec itself lists the bearer scheme on /health, with no scopes, so the open access is an observation, not documentation).
Related MCP server: ops-agent-mcp
Setup
Requires Node 18 or later.
npm install
npm run buildYou need a channel API key from Line-Up. Keys are not self-serve: Line-Up issues one per sales channel on request to their support (see their guide on setting up a third-party seller).
Claude Desktop: add this to claude_desktop_config.json:
{
"mcpServers": {
"lineup": {
"command": "node",
"args": ["/absolute/path/to/lineup-mcp/dist/index.js"],
"env": { "LINEUP_API_KEY": "your-channel-key" }
}
}
}Claude Code:
claude mcp add lineup -e LINEUP_API_KEY=your-channel-key -- node /absolute/path/to/lineup-mcp/dist/index.jsVariable | Required | Meaning |
| yes | Your channel API key, sent as |
| no |
|
| no | An integer sent as the optional |
| no |
|
| no | Defaults to |
Safety defaults
Read-only unless
LINEUP_ALLOW_WRITES=true. Read tools carry the MCPreadOnlyHintannotation;release_reservationis marked destructive.Customer names are returned by default. The customer's email address, postal address and phone number on a transaction, and the purchaser's and recipient's email addresses on a shared ticket, are only returned when a tool is called with
include_contact_details=true. The same flag governs one rule for text: every string a person typed, whether a customer or the organisation (event, venue, performance, package, product, add-on, venue plan, payment method, delivery method, seat type, price band, variant and adjuster names and descriptions, seat and seating group labels, tag names, seat type notes, coupon codes, transaction references and source references, lead booker names, customer names, staff notes, API warnings and error messages), has email addresses replaced with[email redacted]and phone-number-like sequences with[phone redacted]by default; IDs, external IDs, enums, dates, times, colours and URLs are returned as stored. Every read tool takesinclude_contact_details;create_reservationalways returns the redacted form. The phone match is a heuristic: it covers international numbers written with+or00(including the+44 (0)7700 …form), UK numbers with a bracketed area code such as(020) 7946 0958, and UK-style0…numbers of 9 to 11 digits with spaces, dots or hyphens between groups; other digit strings starting with0are redacted too, while public IDs such astxn_test1, numeric IDs and timestamps are left alone. Only emails and phone numbers are matched: a postcode, a date of birth or a document number typed into a staff note, a lead booker name or a reference is returned as stored. A venue's address is a business address and is returned.Ticket barcode codes (what gets scanned at the door) are only returned with
include_barcodes=true; their status (type, redeemed, scan status) is always returned.Payment provider data is never returned: the Stripe continuation secret, Adyen session data, additional actions, payment references, the SOLT
lastFourdigits, and the provider keys on payment methods (Stripe publishable key and account id, Adyen client key, Square application and location ids). A payment item is reported as method type, amount, currency and status. The customer's identity-provider id (idpId) is never returned either.Input is checked before any call is made: integer IDs must be positive whole numbers; transaction IDs must match the spec's
txn_[a-zA-Z0-9]+and visit IDs^vis_\d+$; dates must be real calendar dates inYYYY-MM-DD; enum parameters (sort_by,sort_direction,time_filter,reservation_type) must be one of the documented values;page,max_results,performance_buffer_minutes,day_of_week,max_seats,max_notesandseconds_to_bookmust be within their documented or stated ranges.create_reservationrefuses locally aseating_object_idon anything butRESERVEDand aseating_group_idon anything butBEST_AVAILABLE(the spec'sReservedTicketCreateandBestAvailableTicketCreate). Line-Up documents no idempotency key, so none is sent.Line-Up documents no rate limit anywhere in the OpenAPI document or the older docs. Requests are spaced 250 ms apart (about four per second). A 429 is retried at most twice for any method, including the two
POSTs ofcreate_reservation, on the assumption that a rate-limited request was not processed (see Status). The retry waits forRetry-After(whole or fractional seconds, or an HTTP-date; 2 s then 4 s when the header is absent or unreadable). Each wait is capped at 10 seconds so a tool call stays under the MCP client's default 60-second request timeout: if Line-Up asks for a longer wait the call gives up at once and the message says how long to wait.502, 503 and 504 are retried the same way for
GETonly; when all three attempts fail the error says the service may be unavailable and to try again in a few minutes, without the gateway's HTML. APOSTorDELETEis never retried after a gateway error, because the request may already have been processed and a retry could reserve seats twice; the error tells the assistant to check withget_transactionfirst.A 200 whose body is not JSON (a proxy or a login page in the way), or whose JSON is not the documented shape (a list without the
Pageenvelope'smetadataanddata; a record or transaction withoutdata), is reported as an error namingLINEUP_BASE_URLand the keys it did get, never as an empty list or an empty transaction.A rejected API key produces a message that says which variable to fix and which scheme was used (Bearer by default, suggesting
LINEUP_AUTH=basic; or Basic, suggesting the default); a 403 says the key lacks the scope (api_read,api_write,api_list,api_deletein the spec); a 422 is passed on with FastAPI's field-level messages.
Tests
npm testThe test suite:
Validates every fixture record against the component schemas in Line-Up's OpenAPI document (
Event,EventDetail,PerformancePricing,SeatingGroupCapacity,PerformanceSeatingObjectDetail,PerformancePackages,ProductPricing,AddOn,VisitSummary,Visit,Transaction,TicketTransactionItem,NoteDetail,Meta,VenuePlanListItem,DeliveryMethod,PaymentMethod,SeatType) with Ajv 2020 (the document is OpenAPI 3.1). The document is downloaded fromapi.line-up.tickets/api/openapi.jsontospec.jsonon the first run. One format is relaxed: the spec typesstartTime/endTimeasformat: time, which ajv-formats reads as RFC 3339 full-time with a mandatory zone, while FastAPI serialises a naive time as19:30:00; the suite acceptsHH:MM:SSwith an optional fraction and zone.Starts a local mock of the API under
/apithat serves those fixtures with the documentedpage/sizepagination andMetaData, serves/healthwithout auth (as the live API does; the spec lists the bearer scheme on it), answers a wrong key with the live API's unauthenticated401body ({"detail":"Could not validate credentials"}andWWW-Authenticate: Bearer, which anyone can observe), unknown routes and ids with{"detail":"Not Found"}(the spec documents 404 with no body schema), invalid input with the spec'sHTTPValidationError, and the firstGET /event/with a 429. Every list, detail, write and error response of the mock is validated against the spec's response schemas.Starts the built server and drives it over stdio with the official MCP client: 32 checks (34 in all with the two above) covering every tool, tool annotations, page-based pagination stopping at the documented
totalPages(events, performances, packages, ticket items, notes) and reportingnext_page, every exposed filter passed through under its documented name (including repeated keys for array parameters), redaction of contact details by default (customer email, address and phone; share emails; lead booker names; notes; event text) and their return on request, a probe that types a phone number and an email address into every text field the fixtures carry (names, descriptions, labels, notes, tag names, coupon codes, on every record type) and checks that no tool returns them by default and every read tool returns them withinclude_contact_details, barcodes withheld by default, payment provider data and keys absent from every output, the 429 retry waiting forRetry-Afterin the seconds, fractional-seconds and HTTP-date forms, giving up after three attempts on a persistent 429 and at once on aRetry-Afterabove the cap, a 429 onPOST /transaction/retried once, a 502 retried forGETand never forPOST, a 503 onDELETEnot retried, aGETfailing three times with 503 reported with advice and without the gateway HTML, a 200 with a non-JSON body and a 200 whose JSON lacks thePageordataenvelope reported as errors, the write gate with the variable unset and set tofalse, thePOST /transaction/body validated againstTransactionCreateand each ticket-item body compared field by field with the documented shape (the spec's branches allow extra properties, so schema validation alone would not catch a stray seat field), the local refusal of mismatched seat fields, a refused later ticket item reported with the transaction id, theDELETE, refusal before any call of bad IDs, unknown enum values, out-of-range numbers and impossible dates, the 401 message in both auth schemes, the 403 and 404 messages,LINEUP_AUTH=basic,LINEUP_CHANNELsent exactly on the operations the spec declaresx-channelon (checked against the spec) and not on/meta/,/venue-plan/,/visit/and/visit/{id}/, that the main session used only the Bearer key and every call template it should, and that every request of the run, later sessions included, hit a documented method and path with its trailing slash, without thex-purchase-flow-idheader.
Status
This is a working prototype. It has not yet been run against the live API, because it was built without a Line-Up channel key (keys are issued by Line-Up on request, not self-serve). Everything below is taken from the published OpenAPI document and should be confirmed on a real channel:
Authentication: whether the channel key is accepted as a Bearer token (the OpenAPI document's scheme, and what the unauthenticated 401 advertises) or must be sent as the HTTP Basic username (the older docs' scheme,
LINEUP_AUTH=basic); whetherPOST /purchase-channel/{key}/(a token exchange the spec lists) is needed first; what a 403 looks like when a key lacks a scope; and whether thex-channelheader is needed at all.Pagination: that
pageis 1-based andsizeup to 1000 are honoured as documented, thattotalPagesandnumberOfResultsare filled (the spec allows null; the server then ends at a short page), and what a page past the end returns (the mock answers an emptydata).The sort order of every list. The spec documents
sort_by/sort_directiononly on events andsort_directionon visits; the server returns whatever order the API uses.The meaning of
codeon performances, seats and products (typed as a list of strings; the mock records it and does not interpret it), the numbering ofday_of_week, theexpandparameter onGET /performance/(not exposed), and whetherhasPackage=falsemeans "no filter" or "events without packages" (the server only sends the parameter when given).Which id is
priceIdfor a ticket item. The server reports a pricing variant'sprice.idasprice_idbecause a ticket item'sPricein a transaction has the same{id, value, priceBand, priceVariant}shape; the variant's own id is reported asvariant_id. Confirm which onePOST .../ticket-item/expects.The reservation flow: the default and maximum
secondsToBook, the status a new transaction has (IN_BASKETorRESERVATIONin the enum), whether ticket items can be added one request at a time as this server does (the spec also acceptsticketItemsinsideTransactionCreate), what a refused ticket item answers (the mock uses 422 for an unknown price and 404 for an unknown seat), and whetherDELETE /transaction/{id}/releases a basket (the spec calls it "Delete Transaction", describes it as "Patch an existing transaction" and answers with the object's id; what it does to a completed transaction is undocumented, so only release reservations you created).GET /product/without atransaction_id(the spec makes it optional; the server only calls it with one), and whetherGET /add-on/andGET /delivery-method/really need a transaction (they are required parameters in the spec).Time and date formats:
startTimewith or without a zone (see Tests), andtimeZonevalues.Whether
GET /transaction/{id}/ticket-item/fillsbarcodefor reservations and completed bookings alike, and which fields the live API fills onTransaction(customer,address,phoneNumber,parentTransaction,coupons).The wording of Line-Up's error messages and whether any echo request data; the server passes on FastAPI's
detailstrings and redacts contact details from them regardless.Rate limits: nothing is documented, so the 250 ms spacing is a guess on the polite side, and a 429 on
POSTis retried on the assumption that a rate-limited request was not processed. Confirm on a live channel that Line-Up never creates the transaction before answering 429.
Going to production
This version runs locally over stdio, with the channel's own API key. For venues to connect from claude.ai or ChatGPT without handling keys, the next step is a remote server (Streamable HTTP) behind OAuth, hosted by Line-Up, and then a listing in the Claude and ChatGPT connector directories. Customer-facing flows (customer accounts, payment, completing a transaction) can follow once they can be tested on a real channel.
Licence
MIT. Built by Alexandru Dragoș (alexandru.dragos96@gmail.com) with an AI agent (Claude) working under his direction.
Available Tools
10 toolsget_eventGet eventARead-onlyIdempotent
One event in full: description, booking information, organisation and currency, venue with address, tags, gallery, seat-view base URL. Uses GET /event/{event_id}/.
| Name | Required | Description | Default |
|---|---|---|---|
| event_id | Yes | Event ID (a positive whole number) | |
| include_contact_details | No | Include email addresses and phone numbers typed into the event's text fields. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is fully covered. The description adds only the underlying endpoint (GET /event/{event_id}/), and stays silent on redaction behavior, which is handled in the schema instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence front-loads the core purpose and then lists the payload areas, with the endpoint appended. There is no filler, though the endpoint mention is of marginal value to an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what comes back, which is the right thing to compensate for. It still omits error/not-found behavior and any hint that some fields may be redacted by default, leaving a small gap for a read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including a thorough explanation of include_contact_details and its redaction default, so the schema carries parameter semantics. The description adds no parameter-level detail (e.g., what event_id accepts, or that contact details are gated), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One event in full') and enumerates the returned content areas (description, booking info, organisation, venue, tags, gallery, seat-view URL), making the scope concrete. It does not explicitly distinguish itself from get_performance or list_events, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: a single-event-by-ID fetch is inferable from 'One event in full' and the required event_id. There is no explicit when-to-use guidance, no exclusion of list_events, and no note on behavior when the ID is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_organisation_contextOrganisation contextARead-onlyIdempotent
What the channel is set up with: the organisation's currency (GET /meta/), venue plans with admission type (GET /venue-plan/), payment methods by name and type without any provider keys (GET /payment-method/), seat types (GET /seat-type/, optionally for one performance) and, when a transaction_id is given, the delivery methods available to that basket (GET /delivery-method/, which the API scopes to a transaction).
| Name | Required | Description | Default |
|---|---|---|---|
| performance_id | No | Seat types for this performance only (API parameter `performance_id` on seat-type) | |
| transaction_id | No | A basket (txn_ id) to list delivery methods for (API parameter `transaction_id`, required by delivery-method) | |
| include_contact_details | No | Include email addresses and phone numbers typed into venue plan, payment method, seat type and delivery method names, descriptions and notes. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive, so the bar is low. The description adds real disclosure beyond them: payment methods are returned 'without any provider keys' (a security-relevant guarantee) and the delivery-method endpoint is API-scoped to a transaction. Redaction behavior is present but lives in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence opens with the framing ('What the channel is set up with') and then enumerates the resources in parallel, with endpoint references inline. It is dense and slightly run-on, but every clause carries information and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return values, and it does so by listing each returned resource category plus the condition that gates it. All three optional parameters are accounted for, so an agent has everything needed to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters, including the redaction semantics of include_contact_details. The description's notes on performance_id and transaction_id largely restate the schema, adding only the scoping rationale. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource bundle — organisation currency, venue plans, payment methods, seat types, delivery methods — with the backing endpoints, so an agent knows exactly what comes back. It doesn't explicitly contrast itself with siblings like get_transaction or get_performance_seating, but the config-level scope is distinctive enough to separate it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Conditional usage is stated directly: seat types can be scoped to a single performance, and delivery methods are returned only when a transaction_id is supplied. There is no explicit when-not-to-use or named alternative, but the parameter-driven conditions make the invocation context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performanceGet performanceARead-onlyIdempotent
One performance with its pricing per price band and variant, capacity and capacity remaining, venue plan id. Uses GET /performance/{performance_id}/.
| Name | Required | Description | Default |
|---|---|---|---|
| codes | No | Values for the API's `code` parameter (repeated). The spec types it as a list of strings and does not say what it does. | |
| performance_id | Yes | Performance ID (a positive whole number) | |
| include_contact_details | No | Include email addresses and phone numbers typed into the performance's description, price band and variant names and tags. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful scope about what the response contains (pricing per band/variant, capacity remaining) but says nothing about auth needs, rate limits, or the redaction behavior described in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the substantive content (fields returned) before a short endpoint note. The trailing "Uses GET /performance/{performance_id}/." adds little for an agent but costs only one clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description earns its keep by enumerating the key return fields. It is nearly complete for a simple read-by-id tool; the only real omissions are error/not-found behavior and any hint on the `codes` parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds no parameter meaning beyond the schema; notably it does not clarify the opaque `codes` parameter, which the schema itself admits is undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"One performance with its pricing per price band and variant, capacity and capacity remaining, venue plan id" gives a specific verb+resource and previews the returned payload. The word "one" implicitly separates it from list_performances, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: fetching a single performance by id when you already have the id. There is no statement of when to prefer get_performance over list_performances or get_performance_seating, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_performance_seatingPerformance seatingARead-onlyIdempotent
Seating availability for one performance: the seating groups (areas, sections, blocks, rows) with capacity and capacity remaining, from GET /performance/{id}/seating-group/, and optionally the individual available seats (seating objects with price band, seat type and group) from GET /performance/{id}/seating-object/. Seat lists can be large, so seats are off by default and capped by max_seats; a per-group summary is always included when seats are fetched.
| Name | Required | Description | Default |
|---|---|---|---|
| codes | No | Values for the API's `code` parameter (repeated). The spec types it as a list of strings and does not say what it does. | |
| max_seats | No | Most individual seats to return (the endpoint is not paged; the rest are summarised) | |
| package_id | No | Seats priced for this package (API parameter `package_id` on seating-object; only with include_seats) | |
| parent_ids | No | Only groups/seats under these seating groups (API parameter `parent_id`, repeated, on both endpoints) | |
| include_root | No | Include the top-level groups (API parameter `include_root` on seating-group; the API's default is true) | |
| include_seats | No | Also fetch the individual available seats | |
| performance_id | Yes | Performance ID (a positive whole number) | |
| include_contact_details | No | Include email addresses and phone numbers typed into seating group labels. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive profile, so the description earns credit for adding what they cannot: seat lists can be large, seats default off, results are capped by max_seats with the remainder summarised, and a per-group summary always accompanies seat fetches. It still does not discuss authentication or rate limits, but the added operational context is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and no filler sentences; every clause carries information. The single dense sentence is slightly run-on, which is the only structural weakness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden of describing return values (capacity, capacity remaining, price band, seat type, group) and the default/cap behavior. Nothing an agent needs to invoke and interpret the call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds meaning beyond the schema by explaining the interaction between include_seats and max_seats and the always-present per-group summary, clarifying why the cap exists. The ambiguous `codes` parameter is left unexplained in both places, which keeps this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Seating availability for one performance') and enumerates the returned entities (groups, areas, sections, rows with capacity/capacity remaining). An agent can distinguish this from get_performance, which covers performance metadata rather than seat inventory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two underlying endpoints and the default-off seat behavior, which implies usage, but never says when to call this instead of siblings like get_performance or list_performances, nor any preconditions. Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionGet transactionARead-onlyIdempotent
One transaction (basket, reservation or completed booking) by its txn_ id: status, reference, totals (gross, tax, paid, balance), customer name, every ticket item with seat, price and barcode status (GET /transaction/{id}/ticket-item/, paged), product, delivery, payment, add-on, package and adjuster items, coupons, and the staff notes (GET /transaction/{id}/note/, paged). The customer's email, address and phone number only with include_contact_details; barcode codes only with include_barcodes; payment provider data is never returned.
| Name | Required | Description | Default |
|---|---|---|---|
| max_notes | No | ||
| transaction_id | Yes | Transaction ID (txn_...) | |
| include_barcodes | No | Include each ticket's barcode code (what gets scanned at the door). Off by default. | |
| max_ticket_items | No | ||
| include_contact_details | No | Include the customer's email address, postal address and phone number, and stop redacting emails and phone numbers from names, references and notes. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive call, and the description adds substantive behavior beyond that: payment provider data is never returned, contact fields stay redacted unless include_contact_details is set, barcode codes are gated, and ticket-item/note payloads are paged via sub-resources. That is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core identification ('One transaction ... by its txn_ id') is front-loaded, and the second sentence carries the conditional-access rules. It is dense — a long mid-sentence enumeration of returned sub-resources — but nearly every clause conveys a field set or a gate, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly assumes the burden of describing the return payload: identity fields, totals, line-item types, coupons, notes and paging sub-endpoints, plus redaction and payment-provider exclusions. An agent can anticipate the shape of the response without a return schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 60% schema description coverage, the schema documents include_barcodes, include_contact_details and transaction_id, but leaves max_notes and max_ticket_items undocumented there. The description compensates by explaining the contact-detail redaction and barcode gates and by signaling that ticket-item and note collections are paged, though it does not explicitly explain the two max_* limits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('One transaction ... by its txn_ id') and enumerates the returned content: status, reference, totals, customer name, ticket items, coupons, notes. This is clearly distinguishable from siblings like get_visit and get_event because it names the transaction resource and its txn_ identifier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 'by its txn_ id' framing and the explicit gates on include_contact_details/include_barcodes, but the description never says when to prefer this tool over a sibling such as get_visit or when a lookup should be avoided. No explicit when-not guidance or named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_visitGet visitARead-onlyIdempotent
One visit with every ticket item, its transaction and, for tickets that were shared with someone, the share (created, claimed). The purchaser's and recipient's email addresses only with include_contact_details. Uses GET /visit/{visit_id}/.
| Name | Required | Description | Default |
|---|---|---|---|
| visit_id | Yes | Visit ID (vis_...) | |
| include_contact_details | No | Include the purchaser's and recipient's email addresses on shared tickets. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world behavior, so the safety profile is covered without the description. The description adds that contact details are gated behind include_contact_details and cites the underlying endpoint, but it largely restates what the schema parameter already documents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the return payload, which is the most useful information for an agent. The trailing endpoint reference ('Uses GET /visit/{visit_id}/') is somewhat redundant but doesn't obscure the content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully describes the shape of the returned visit (tickets, transaction, share). An agent has enough to call it correctly, though it does not mention pagination or error behavior for a missing visit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already fully documented. The description's note that emails appear 'only with include_contact_details' adds only marginal meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource and enumerates the payload contents ('every ticket item, its transaction, and... the share'), which clearly separates it from list_visits and get_transaction. It is specific rather than tautological, though the retrieval verb itself is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the required visit_id and the single-visit scope, but there is no explicit statement of when to call this versus get_transaction or list_visits. No prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsList eventsARead-onlyIdempotent
Events on this channel (shows, productions, exhibitions): name, short description, run time, venue with address, tags, image. Filter by venue and by whether the event has packages; sort by id, name or venue name. Uses GET /event/.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | API page number to start from (1-based, as the spec documents; use next_page from a previous call) | |
| sort_by | No | Sort field (API parameter `sort_by`; the API's default is id) | |
| venue_id | No | Only events at this venue (API parameter `venue_id`) | |
| has_package | No | Only events that have packages (API parameter `hasPackage`; the API's default is false, which the spec does not say means 'no filter' or 'without packages', so it is only sent when given) | |
| max_results | No | Stop once at least this many records have been fetched. Whole API pages are returned, so up to one page more may come back; next_page says where to continue | |
| sort_direction | No | API parameter `sort_direction`; the API's default is asc | |
| include_contact_details | No | Include email addresses and phone numbers typed into event names, descriptions and notes. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the read-only, safe, repeatable profile is covered. The description adds the underlying endpoint (GET /event/) and field inventory, but the one notable behavioral wrinkle — redaction of emails/phones — is already spelled out in the schema, so the description contributes modest extra context rather than new behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with what the tool returns, then filtering/sorting, then the endpoint. Little waste, though the trailing 'Uses GET /event/' is arguably low-value implementation detail for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description's enumeration of returned fields carries real weight and mostly compensates. With 7 optional parameters, 100% schema coverage, and read-only annotations, the definition is nearly complete; the only gap is routing guidance versus the many list/get siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and those descriptions are notably detailed (pagination semantics, hasPackage ambiguity, redaction default). The description's filter/sort sentence restates what the schema already documents without adding format, syntax, or interaction details, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Events on this channel (shows, productions, exhibitions)') and enumerates the fields returned (name, description, run time, venue with address, tags, image) plus filtering and sorting capability. It is clearly distinguishable from get_event by the plural/resource-list framing, but it never names a sibling, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says what can be filtered and sorted, which implies when the tool is useful (browsing/filtering events by venue or packages). However it gives no explicit when-to-use guidance against list_performances or get_event, and no exclusions or prerequisites, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_packages_and_add_onsPackages, products and add-onsARead-onlyIdempotent
Packages (bundles priced per performance, with capacity remaining and total price) for one event (GET /package/, paged) or one performance (GET /performance/{id}/package/). With a transaction_id, also the products available to that basket (GET /product/) and its add-ons such as booking protection (GET /add-on/); the API scopes both to a transaction, so without one they are not fetched. Give event_id or performance_id.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | API page number to start from (1-based, as the spec documents; use next_page from a previous call) | |
| event_id | No | Packages for every performance of this event (API parameter `event_id`, required by GET /package/) | |
| package_id | No | Only this package (API parameter `package_id`) | |
| max_results | No | Stop once at least this many records have been fetched. Whole API pages are returned, so up to one page more may come back; next_page says where to continue | |
| performance_id | No | Packages for this one performance instead | |
| start_date_gte | No | Only performances starting on or after this date (API parameter `start_date.gte`) | |
| start_date_lte | No | Only performances starting on or before this date (API parameter `start_date.lte`) | |
| transaction_id | No | A basket (txn_ id) to list products and add-ons for (API parameter `transaction_id`) | |
| include_contact_details | No | Include email addresses and phone numbers typed into package, product and add-on names and descriptions. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real behavioral context beyond that: results are paged, and products/add-ons are silently omitted without a transaction_id (a non-obvious scoping quirk that would otherwise look like an empty result). It stops short of covering auth needs or rate limits, so 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary resource and its contents before the conditional transaction branch. The parenthetical endpoint citations add useful anchoring, though the second sentence is dense enough that it takes a second pass to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter read-only listing tool with no output schema, the description covers the essentials: what comes back, how the two modes differ, the paging model, and the transaction scoping constraint. Missing only edge-case behavior (e.g. empty results, ordering), which is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still adds meaning the schema does not: the schema marks zero required parameters, while the description tells the agent it must supply event_id or performance_id, and it explains the transaction_id dependency that governs whether products/add-ons appear at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Packages ... for one event ... or one performance'), enumerates what the records contain (bundles priced per performance, capacity remaining, total price), and cites the exact endpoints (GET /package/, GET /performance/{id}/package/, GET /product/, GET /add-on/). No sibling tool covers packages or add-ons, so the agent can separate it from list_events/get_transaction without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the selection rule plainly ('Give event_id or performance_id') and explains the transaction branch conditionally: products and add-ons are only fetched when transaction_id is supplied, because the API scopes them to a transaction. That is clear when-to-use guidance, though it never names an alternative sibling tool or a when-not-to-use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_performancesList performancesARead-onlyIdempotent
Performances (dated showings) with start and end, time zone, total capacity and capacity remaining, and pricing per price band and variant (the price_id values a reservation needs). Filter by event, venue, date range, tags, days of the week. The spec says this endpoint 'bypasses Pydantic due to performance requirements', so the shape is documented but not validated by Line-Up on the way out. Uses GET /performance/.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | API page number to start from (1-based, as the spec documents; use next_page from a previous call) | |
| tags | No | Only performances with these tags (API parameter `tags`, repeated) | |
| codes | No | Values for the API's `code` parameter (repeated). The spec types it as a list of strings and does not say what it does. | |
| event_id | No | Only performances of this event (API parameter `event_id`) | |
| venue_id | No | Only performances at this venue (API parameter `venue_id`) | |
| start_date | No | Only performances starting on this date (API parameter `start_date`) | |
| day_of_week | No | Only these days of the week (API parameter `day_of_week`, repeated integers; the spec does not document the numbering) | |
| max_results | No | Stop once at least this many records have been fetched. Whole API pages are returned, so up to one page more may come back; next_page says where to continue | |
| end_date_gte | No | Only performances ending on or after this date (API parameter `end_date.gte`) | |
| end_date_lte | No | Only performances ending on or before this date (API parameter `end_date.lte`) | |
| start_date_gte | No | Only performances starting on or after this date (API parameter `start_date.gte`) | |
| start_date_lte | No | Only performances starting on or before this date (API parameter `start_date.lte`) | |
| include_contact_details | No | Include email addresses and phone numbers typed into performance descriptions, price band and variant names and tags. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: the endpoint bypasses Pydantic validation so the response shape is documented but unvalidated, and it notes the redaction default for contact details. No statement about pagination semantics beyond what the schema says, but the validation caveat is real added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and returned fields, then filters, then the implementation caveat. Three dense sentences, each carrying information. The 'Uses GET /performance/' tail is marginally redundant but not wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by enumerating the return fields. All 13 parameters are documented in the schema. What remains thin is how pagination and max_results interact at the tool boundary, though the schema parameters cover it individually.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline would be 3, but the description adds meaning the schema does not: it explains that price_id values are what a reservation requires, tying the pricing output to a sibling workflow. Filter parameters are summarized rather than repeated, which is the right level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Performances (dated showings)'), enumerates the returned fields (start/end, time zone, capacity, pricing per price band and variant), and lists the filter axes. An agent can distinguish this list endpoint from get_performance or list_events without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states what can be filtered by (event, venue, date range, tags, days of week), which implies when the tool is applicable, but never gives explicit when-to-use/when-not guidance or names a preferred alternative such as get_performance for a single showing. Usage is inferred rather than directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_visitsList visitsARead-onlyIdempotent
Visits: for each performance a customer holds tickets to, the event, the performance and the ticket items with their transaction (reference, lead booker name, status). Filter to upcoming or past performances with a buffer in minutes around the start time. Uses GET /visit/.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | API page number to start from (1-based, as the spec documents; use next_page from a previous call) | |
| max_results | No | Stop once at least this many records have been fetched. Whole API pages are returned, so up to one page more may come back; next_page says where to continue | |
| time_filter | No | Only upcoming or only past performances (API parameter `time_filter`) | |
| sort_direction | No | API parameter `sort_direction`; the API's default is asc | |
| include_contact_details | No | Include email addresses and phone numbers typed into lead booker names and references. Off by default: email addresses and phone numbers typed into any text field (names, descriptions, notes, labels, references) are replaced with [email redacted] / [phone redacted]. | |
| performance_buffer_minutes | No | Minutes around the performance start that still count as upcoming (API parameter `performance_buffer_minutes`, 0-360; the API's default is 120) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds the underlying endpoint (GET /visit/) and the shape of the result set, which is useful, but says nothing about pagination semantics, volume, or rate limits beyond what the schema already states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the resource and result shape front-loaded before the filtering detail. Slightly dense packing of filter information into one sentence but still readable and appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does describe the composite structure returned, which is the main thing an agent needs. It stops short of documenting pagination/continuation behavior (next_page) that matters for a list endpoint, leaving a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented at the schema level, including defaults, ranges and the redaction behavior of include_contact_details. The description's mention of the buffer and time filter merely restates those parameters, adding no format or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and goes further by enumerating the returned composition (event, performance, ticket items, transaction with reference/lead booker/status). This clearly separates it from get_visit (single visit) and the list_events/list_performances siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what can be filtered (upcoming/past plus a buffer window) but never says when to choose this tool over get_visit or the other list_* siblings, nor any prerequisite or context of use. Usage has to be inferred from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.1.0- First observed
get_event - First observed
get_organisation_context - First observed
get_performance - First observed
get_performance_seating - First observed
get_transaction - First observed
get_visit - First observed
list_events - First observed
list_packages_and_add_ons - First observed
list_performances - First observed
list_visits
TDQS
Scored across 10 tools
The list_/get_ pattern cleanly separates collection vs. detail for events, performances, visits and transactions, and get_performance_seating and get_organisation_context are clearly distinct. The only slight ambiguity is list_packages_and_add_ons, which merges packages, products and add-ons with conditional behavior depending on event_id/performance_id/transaction_id.
Every tool follows a consistent verb_noun snake_case convention (list_events, get_event, list_performances, get_performance, get_visit, etc.). The pattern is predictable throughout with no mixed styles or vague verbs.
Ten tools is well within the ideal range and each earns its place, covering the read/query surface for events, performances, seating, packages, visits, transactions and org context without redundancy.
The lifecycle for querying the domain is well covered: list/detail for events, performances, seating, packages, visits and transactions plus configuration context. It is a read-only surface with no reservation/booking creation or update tools, but the descriptions imply a query-oriented purpose rather than a gap.
Maintenance
Related MCP Connectors
Let AI agents query data and act across all your business apps via MCP.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT.
AI marketplace — flights, tours, activities, transport & more via MCP. No auth required.
Related MCP Servers
- AlicenseAqualityBmaintenanceExposes FreeTicket's B2B domain (events, sales, tickets, etc.) as tools for MCP clients like Claude Code, using the same authentication as the CLI.6MIT
- AlicenseAqualityCmaintenanceEnables any MCP client to run natural-language queries and actions against CRM and ticket systems, with schema-validated tools, audit logging, and server-side write gating.7MIT
- AlicenseAqualityCmaintenanceEnables MCP clients like Claude and ChatGPT to query and manage TicketSource box office data, including events, performances, bookings, customers, and seats, through natural language.7MIT
- AlicenseAqualityCmaintenanceEnables MCP clients to search availability, read services, resources, bookings and customers, and, when writes are enabled, reserve slots, create or cancel bookings, and add or update customers.10MIT