Skip to main content
Glama
dragosh29

Line-Up MCP server

by dragosh29

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

list_events

Events with description, run time, venue and address, tags. Filters venue_id, hasPackage; sort by id, name or venue name; paged.

GET /event/

get_event

One event in full: description, booking information, organisation currency, gallery, seat-view base URL.

GET /event/{event_id}/

list_performances

Performances with start/end, time zone, total capacity and remaining, and pricing per price band and variant (including the price_id a reservation needs). Filters event_id, venue_id, start_date, start_date.gte/.lte, end_date.gte/.lte, tags, day_of_week, code; paged.

GET /performance/

get_performance

One performance with the same pricing and capacity detail.

GET /performance/{performance_id}/

get_performance_seating

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 parent_id, include_root, package_id, code.

GET /performance/{id}/seating-group/, GET /performance/{id}/seating-object/

list_packages_and_add_ons

Packages per performance for one event (paged) or for one performance, with capacity remaining and total price; with a transaction_id, also the products and add-ons available to that basket.

GET /package/, GET /performance/{id}/package/, GET /product/, GET /add-on/

list_visits

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 time_filter (upcoming/past), performance_buffer_minutes, sort_direction; paged.

GET /visit/

get_visit

One visit with every ticket item and, for shared tickets, whether the share was claimed.

GET /visit/{visit_id}/

get_transaction

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).

GET /transaction/{id}/, GET /transaction/{id}/ticket-item/, GET /transaction/{id}/note/

get_organisation_context

The organisation's currency, venue plans with admission type, payment methods by name and type, seat types (optionally for one performance) and, with a transaction_id, the delivery methods available to that basket.

GET /meta/, GET /venue-plan/, GET /payment-method/, GET /seat-type/, GET /delivery-method/

create_reservation

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.

POST /transaction/, POST /transaction/{id}/ticket-item/

release_reservation

Deletes a transaction, releasing the seats it holds. Marked destructive. Writes only.

DELETE /transaction/{id}/

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 build

You 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.js

Variable

Required

Meaning

LINEUP_API_KEY

yes

Your channel API key, sent as Authorization: Bearer <key> by default.

LINEUP_AUTH

no

bearer (default) or basic. The OpenAPI document declares an OAuth2 password/bearer scheme and an unauthenticated call is answered 401 with WWW-Authenticate: Bearer; the older docs at docs.lineupnow.com describe HTTP Basic with the key as the username and no password. If Bearer is rejected, try basic.

LINEUP_CHANNEL

no

An integer sent as the optional x-channel header, only on the operations the spec declares it on; it is not sent to GET /meta/, /venue-plan/, /visit/ and /visit/{id}/, which do not declare it. Leave unset unless Line-Up tells you to set it.

LINEUP_ALLOW_WRITES

no

true to register create_reservation and release_reservation. Off by default.

LINEUP_BASE_URL

no

Defaults to https://api.line-up.tickets/api. Used by the tests.

Safety defaults

  • Read-only unless LINEUP_ALLOW_WRITES=true. Read tools carry the MCP readOnlyHint annotation; release_reservation is 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 takes include_contact_details; create_reservation always returns the redacted form. The phone match is a heuristic: it covers international numbers written with + or 00 (including the +44 (0)7700 … form), UK numbers with a bracketed area code such as (020) 7946 0958, and UK-style 0… numbers of 9 to 11 digits with spaces, dots or hyphens between groups; other digit strings starting with 0 are redacted too, while public IDs such as txn_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 lastFour digits, 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 in YYYY-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_notes and seconds_to_book must be within their documented or stated ranges.

  • create_reservation refuses locally a seating_object_id on anything but RESERVED and a seating_group_id on anything but BEST_AVAILABLE (the spec's ReservedTicketCreate and BestAvailableTicketCreate). 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 of create_reservation, on the assumption that a rate-limited request was not processed (see Status). The retry waits for Retry-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 GET only; 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. A POST or DELETE is 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 with get_transaction first.

  • 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 Page envelope's metadata and data; a record or transaction without data), is reported as an error naming LINEUP_BASE_URL and 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_delete in the spec); a 422 is passed on with FastAPI's field-level messages.

Tests

npm test

The test suite:

  1. 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 from api.line-up.tickets/api/openapi.json to spec.json on the first run. One format is relaxed: the spec types startTime/endTime as format: time, which ajv-formats reads as RFC 3339 full-time with a mandatory zone, while FastAPI serialises a naive time as 19:30:00; the suite accepts HH:MM:SS with an optional fraction and zone.

  2. Starts a local mock of the API under /api that serves those fixtures with the documented page/size pagination and MetaData, serves /health without auth (as the live API does; the spec lists the bearer scheme on it), answers a wrong key with the live API's unauthenticated 401 body ({"detail":"Could not validate credentials"} and WWW-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's HTTPValidationError, and the first GET /event/ with a 429. Every list, detail, write and error response of the mock is validated against the spec's response schemas.

  3. 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 reporting next_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 with include_contact_details, barcodes withheld by default, payment provider data and keys absent from every output, the 429 retry waiting for Retry-After in the seconds, fractional-seconds and HTTP-date forms, giving up after three attempts on a persistent 429 and at once on a Retry-After above the cap, a 429 on POST /transaction/ retried once, a 502 retried for GET and never for POST, a 503 on DELETE not retried, a GET failing 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 the Page or data envelope reported as errors, the write gate with the variable unset and set to false, the POST /transaction/ body validated against TransactionCreate and 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, the DELETE, 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_CHANNEL sent exactly on the operations the spec declares x-channel on (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 the x-purchase-flow-id header.

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); whether POST /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 the x-channel header is needed at all.

  • Pagination: that page is 1-based and size up to 1000 are honoured as documented, that totalPages and numberOfResults are 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 empty data).

  • The sort order of every list. The spec documents sort_by/sort_direction only on events and sort_direction on visits; the server returns whatever order the API uses.

  • The meaning of code on performances, seats and products (typed as a list of strings; the mock records it and does not interpret it), the numbering of day_of_week, the expand parameter on GET /performance/ (not exposed), and whether hasPackage=false means "no filter" or "events without packages" (the server only sends the parameter when given).

  • Which id is priceId for a ticket item. The server reports a pricing variant's price.id as price_id because a ticket item's Price in a transaction has the same {id, value, priceBand, priceVariant} shape; the variant's own id is reported as variant_id. Confirm which one POST .../ticket-item/ expects.

  • The reservation flow: the default and maximum secondsToBook, the status a new transaction has (IN_BASKET or RESERVATION in the enum), whether ticket items can be added one request at a time as this server does (the spec also accepts ticketItems inside TransactionCreate), what a refused ticket item answers (the mock uses 422 for an unknown price and 404 for an unknown seat), and whether DELETE /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 a transaction_id (the spec makes it optional; the server only calls it with one), and whether GET /add-on/ and GET /delivery-method/ really need a transaction (they are required parameters in the spec).

  • Time and date formats: startTime with or without a zone (see Tests), and timeZone values.

  • Whether GET /transaction/{id}/ticket-item/ fills barcode for reservations and completed bookings alike, and which fields the live API fills on Transaction (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 detail strings 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 POST is 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 tools
get_eventGet eventA
Read-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}/.

ParametersJSON Schema
NameRequiredDescriptionDefault
event_idYesEvent ID (a positive whole number)
include_contact_detailsNoInclude 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 contextA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
performance_idNoSeat types for this performance only (API parameter `performance_id` on seat-type)
transaction_idNoA basket (txn_ id) to list delivery methods for (API parameter `transaction_id`, required by delivery-method)
include_contact_detailsNoInclude 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

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 performanceA
Read-onlyIdempotent

One performance with its pricing per price band and variant, capacity and capacity remaining, venue plan id. Uses GET /performance/{performance_id}/.

ParametersJSON Schema
NameRequiredDescriptionDefault
codesNoValues for the API's `code` parameter (repeated). The spec types it as a list of strings and does not say what it does.
performance_idYesPerformance ID (a positive whole number)
include_contact_detailsNoInclude 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 seatingA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codesNoValues for the API's `code` parameter (repeated). The spec types it as a list of strings and does not say what it does.
max_seatsNoMost individual seats to return (the endpoint is not paged; the rest are summarised)
package_idNoSeats priced for this package (API parameter `package_id` on seating-object; only with include_seats)
parent_idsNoOnly groups/seats under these seating groups (API parameter `parent_id`, repeated, on both endpoints)
include_rootNoInclude the top-level groups (API parameter `include_root` on seating-group; the API's default is true)
include_seatsNoAlso fetch the individual available seats
performance_idYesPerformance ID (a positive whole number)
include_contact_detailsNoInclude 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

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 transactionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_notesNo
transaction_idYesTransaction ID (txn_...)
include_barcodesNoInclude each ticket's barcode code (what gets scanned at the door). Off by default.
max_ticket_itemsNo
include_contact_detailsNoInclude 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

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 visitA
Read-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}/.

ParametersJSON Schema
NameRequiredDescriptionDefault
visit_idYesVisit ID (vis_...)
include_contact_detailsNoInclude 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 eventsA
Read-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/.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoAPI page number to start from (1-based, as the spec documents; use next_page from a previous call)
sort_byNoSort field (API parameter `sort_by`; the API's default is id)
venue_idNoOnly events at this venue (API parameter `venue_id`)
has_packageNoOnly 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_resultsNoStop 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_directionNoAPI parameter `sort_direction`; the API's default is asc
include_contact_detailsNoInclude 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

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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-onsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoAPI page number to start from (1-based, as the spec documents; use next_page from a previous call)
event_idNoPackages for every performance of this event (API parameter `event_id`, required by GET /package/)
package_idNoOnly this package (API parameter `package_id`)
max_resultsNoStop 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_idNoPackages for this one performance instead
start_date_gteNoOnly performances starting on or after this date (API parameter `start_date.gte`)
start_date_lteNoOnly performances starting on or before this date (API parameter `start_date.lte`)
transaction_idNoA basket (txn_ id) to list products and add-ons for (API parameter `transaction_id`)
include_contact_detailsNoInclude 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

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 performancesA
Read-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/.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoAPI page number to start from (1-based, as the spec documents; use next_page from a previous call)
tagsNoOnly performances with these tags (API parameter `tags`, repeated)
codesNoValues for the API's `code` parameter (repeated). The spec types it as a list of strings and does not say what it does.
event_idNoOnly performances of this event (API parameter `event_id`)
venue_idNoOnly performances at this venue (API parameter `venue_id`)
start_dateNoOnly performances starting on this date (API parameter `start_date`)
day_of_weekNoOnly these days of the week (API parameter `day_of_week`, repeated integers; the spec does not document the numbering)
max_resultsNoStop 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_gteNoOnly performances ending on or after this date (API parameter `end_date.gte`)
end_date_lteNoOnly performances ending on or before this date (API parameter `end_date.lte`)
start_date_gteNoOnly performances starting on or after this date (API parameter `start_date.gte`)
start_date_lteNoOnly performances starting on or before this date (API parameter `start_date.lte`)
include_contact_detailsNoInclude 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

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 visitsA
Read-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/.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoAPI page number to start from (1-based, as the spec documents; use next_page from a previous call)
max_resultsNoStop 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_filterNoOnly upcoming or only past performances (API parameter `time_filter`)
sort_directionNoAPI parameter `sort_direction`; the API's default is asc
include_contact_detailsNoInclude 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_minutesNoMinutes around the performance start that still count as upcoming (API parameter `performance_buffer_minutes`, 0-360; the API's default is 120)

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

  1. 10 tool updatesv0.1.0
    • First observedget_event
    • First observedget_organisation_context
    • First observedget_performance
    • First observedget_performance_seating
    • First observedget_transaction
    • First observedget_visit
    • First observedlist_events
    • First observedlist_packages_and_add_ons
    • First observedlist_performances
    • First observedlist_visits

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    7
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    10
    MIT