BRIJ Travel
Server Details
BRIJ lets your assistant shop for real things, starting with travel: search and book flights and trains, paid in USDC on Solana. Searching is free, and you only pay the price, which is held in escrow and refunded automatically if a booking fails.
- Status
- Healthy
- Uptime
- 100.0% over 24 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 34 tools
Several tools are effectively the same operation under different names: brij_search_trains and brij_search_buses have identical descriptions pointing at one endpoint differentiated only by mode, and brij_quote_train/brij_quote_bus, brij_get_train_order/brij_get_bus_order, and brij_request_train_refund/brij_request_bus_refund are verbatim duplicates. brij_get_intent also overlaps heavily with the per-vertical order tools (it already returns status and booking_reference for flight, train, bus and product intents, for free), so an agent must guess which status tool to call.
All names are prefixed brij_, snake_case, and follow a predictable verb_noun pattern (search_/quote_/create_*_intent/get_*_order/request_*_refund). The main deviation is the purchase verb split: book_flight and book_hotel versus buy_train, buy_bus and buy_product for the same conceptual step, plus the odd one-off find_hotel_places and cancel_hotel.
34 tools is high, but the server genuinely spans five purchase verticals (flights, hotels, trains, buses, products), each needing search, quote, intent, purchase, order and refund steps. The count is inflated by redundancy rather than scope: the train/bus pairs are the same operation, and get_intent largely subsumes the four per-vertical order tools.
The core lifecycle is covered end to end for every vertical: search, quote, create escrow intent, purchase, poll order status, and request a refund, plus helper lookups (hotel places, hotel rates, airline catalog, progressive flight search updates). The main gaps are that cancellation is only first-class for hotels (everything else requires a manual refund request) and there is no way to list or enumerate existing intents/orders.
Available Tools
34 toolsbrij_book_flightPay and book a flightAInspect
Over MCP: you pay only the purchase itself, into its escrow. Pays the ticket into the intent's escrow with x402 (USDC on Solana). Call it once without payment to get the payment requirements, sign them with your wallet, and call again with the payment in _meta["x402/payment"] or in x402_payment (the base64 PAYMENT-SIGNATURE value).
Pay the escrow and request booking.
The intent id travels in the request body; the resource URL is static. Paid x402 endpoint. The payment challenge is dynamic for the intent:
payTo is the intent escrow address, asset is the expected escrow
mint, and amount is the expected escrow amount.
After x402 settlement, the API records the passenger list (lead first), verifies exact escrow funding on-chain, and enqueues the booking worker. Airline payment and escrow capture happen asynchronously.
If booking fails after x402 settlement, retry the same /book call;
excess funds remain refundable to refund_wallet.
Lowcost travel document. For an intent created on a trip.com: offer, each passenger additionally requires nationality, passport_number, and passport_expiry (YYYY-MM-DD, in the future) — the supplier's booking form demands them. Missing or expired documents are refused BEFORE payment (400 travel_document_required / travel_document_expired). Booking is asynchronous exactly like fastbooking: poll GET /air/intents/{intent_id} until booked or refunded. A browser-tier booking is captured only once the airline actually issues the ticket, and auto-refunds if it never does.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | Id returned by POST /air/intents. | |
| passengers | Yes | Exactly as many passengers as the intent's passenger_count (= adults searched), LEAD PASSENGER FIRST. Positions map to the offer's travellers. The lead passenger receives all emails, and refund requests authenticate against the LEAD passenger's family name. Duplicate travellers (same name and birth date) are refused with 400 duplicate_passenger. All refunds are all-or-nothing: one booking = one escrow, there is no per-passenger cancellation. | |
| x402_payment | No | Optional: the base64 x402 payment payload (the PAYMENT-SIGNATURE header value), for a client that cannot set _meta["x402/payment"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | |
| booking | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the x402 settlement flow, escrow semantics, the two-step challenge/sign/retry pattern, the async booking worker, that funds stay in the wallet on validation failure, that excess funds remain refundable to refund_wallet, and that travel documents are refused BEFORE payment (400 codes). It also explains auto-refund if the airline never issues the ticket — rich behavioral context the readOnlyHint/openWorldHint flags cannot convey.
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?
Information-dense and roughly front-loaded (payment mechanics first, lowcost-travel caveat last), but it duplicates schema content — the trip.com nationality/passport requirement appears in both description and schema — and carries awkward mid-sentence line breaks. Some sentences could be trimmed without loss.
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 complex, paid, asynchronous write operation with an output schema present (so return values need not be described), the description covers the payment handshake, async booking, retry, and refund behavior thoroughly. Minor gaps remain around explicit permission/wallet prerequisites and any polling cadence, but nothing essential to calling it correctly 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 description coverage is 100%, so passengers, intent_id, and x402_payment are already fully documented in the schema. The description reinforces passenger-list ordering ('lead first') and the trip.com document fields, but largely restates what the schema already says, so it sits at the baseline for high-coverage schemas.
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 states a specific action sequence: pay the ticket into the intent's escrow via x402 and request booking. It clearly sits downstream of intent creation ('The intent id travels in the request body', 'Id returned by POST /air/intents'), which distinguishes it from brij_create_flight_intent. It stops short of naming a sibling outright, but the verb+resource is unambiguous.
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?
Offers concrete operating instructions: 'Call it once without payment to get the payment requirements, sign them with your wallet, and call again with the payment', retry 'the same /book call' if booking fails, and polling GET /air/intents/{intent_id} until booked or refunded. It never explicitly states a when-not or names an alternative tool, so routing relies on the reader inferring the intent-creation prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_book_hotelPay and book a hotelAInspect
Over MCP: you pay only the purchase itself, into its escrow. Needs guests (lead first), email and phone_number in E.164 (+ country code, digits only, e.g. +447400123456): ask the guest for each by name if you do not have it. Pays the stay into the intent's escrow with x402, like brij_book_flight. Then poll brij_get_hotel_order until confirmed.
Pay the hotel escrow and name the guests
Paid x402 endpoint: the intent's escrow amount. Body: intent_id, guests[] (the lead first, then at least one per room, each {given_name, family_name, born_on?}), email and phone_number (E.164) of the lead guest, optional special_requests (forwarded to the hotel). Every check (guests, price unchanged, nothing booked yet) happens before settle. Then the stay is booked at Duffel once the escrow is funded: poll POST /hotels/orders until status is confirmed (booking_reference set, escrow captured, confirmation emailed) or failed (refunded in full).
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The lead guest's email address: the confirmation goes there. Ask the guest for it by name ("your email address"), never as "contact details". | ||
| guests | Yes | The lead guest first (the reservation's name and the identity for a cancellation), then at least one guest per room. | |
| intent_id | Yes | The intent id returned by POST /hotels/intents. | |
| phone_number | Yes | The lead guest's mobile number WITH its country code, E.164 (e.g. +447400123456). Ask the guest for it by name ("your phone number, with country code"): the hotel calls it. | |
| x402_payment | No | Optional: the base64 x402 payment payload (the PAYMENT-SIGNATURE header value), for a client that cannot set _meta["x402/payment"]. | |
| special_requests | No | Forwarded to the hotel (early check-in, cot). |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | booking: poll POST /hotels/orders. |
| booking | No | The booking record (HotelConfirmation). |
| intent_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only flagging it as a non-readonly, open-world, non-idempotent write, the description adds substantial context: payment goes only into the purchase's escrow, all checks (guests, unchanged price, nothing booked yet) run before settle, booking happens at Duffel after funding, and a failure is refunded in full with confirmation emailed. That is exactly the behavioral detail an agent needs before committing money.
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 key constraint (pay only the purchase into escrow) is front-loaded, which is good. However, the text repeats itself across three fragments — 'Pays the stay into the intent's escrow with x402', 'Pay the hotel escrow and name the guests', and 'Paid x402 endpoint: the intent's escrow amount' — and mixes prose with endpoint-style notes, making it longer than needed.
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 payment-bearing booking tool the description covers the money flow, pre-settle validation, post-settle booking, polling target, and failure/refund path, and an output schema exists so return values need no explanation. The one gap is the missing explicit pointer to brij_create_hotel_intent as the source of intent_id.
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 restates what the schema already documents (guests lead-first with at least one per room, E.164 phone, special_requests forwarded to the hotel) and adds only the 'ask the guest by name' framing. Little meaning is added beyond the structured fields.
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 states a specific compound action: pay the stay's escrow via x402 and book it, naming guests. It distinguishes itself from the intent-creation and order-polling siblings by explicitly directing the agent to poll brij_get_hotel_order until confirmed. It never names brij_create_hotel_intent as the prerequisite step, leaving the intent_id provenance to 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?
Clear operational sequencing: collect guests (lead first), email and phone in E.164, ask the guest for each by name, then poll brij_get_hotel_order until confirmed or failed. It gives the 'ask by name, never as contact details' instruction, which is genuinely actionable. It stops short of explicit exclusions, e.g. that an intent must already exist or that this should not be called before brij_quote_hotel/brij_create_hotel_intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_buy_busPay for a bus bookingAInspect
Over MCP: you pay only the purchase itself, into its escrow. Pays into the intent's escrow with x402, like brij_book_flight. For buses in India (FlixBus India) send each passenger's gender (F or M): seats are assigned by it. For buses in Türkiye (Kamil Koç) send each passenger's gender (F or M), document_number (passport, or the Turkish ID of a Turkish citizen) and citizenship (two-letter country code): seats are assigned by gender and the operator names every traveller's document.
Fund the escrow and name the travellers.
Paid x402 endpoint: the intent's escrow amount. Body: intent_id, passengers[] — exactly the party the fare was priced for (the search's adults), lead first, each {given_name, family_name, born_on YYYY-MM-DD}; contact_phone (the buyer's mobile, E.164) when the quote's requires lists contact.phone — some operators (OUIGO, Eurostar) cannot issue a ticket without one, and the buy answers 400 contact_phone_required before settle; contact_postal_code (the buyer's postcode) when it lists contact.postal_code (OUIGO France), else 400 contact_postal_code_required; each passenger's document_number (passport or ID number) when it lists document (Renfe), else 400 document_required; optional notify_email. Every refusal happens before settle. Then: the checkout is re-read and must be no higher than the quote, a human approves, BRIJ's card pays; captured only on the merchant's confirmation email naming the booking we made, refunded automatically otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /rail/intents. | |
| passengers | Yes | The travellers, exactly as many as the search's adults, lead traveller first. | |
| notify_email | No | Optional email that receives the order confirmation and booking reference. | |
| x402_payment | No | Optional: the base64 x402 payment payload (the PAYMENT-SIGNATURE header value), for a client that cannot set _meta["x402/payment"]. | |
| contact_phone | No | The buyer's mobile, E.164. Required when the quote's requires lists contact.phone. | |
| contact_postal_code | No | The buyer's postcode. Required when the quote's requires lists contact.postal_code. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | |
| status | No | purchasing: the merchant is being paid; follow with the orders endpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnly=false, idempotent=false, openWorld=true; the description goes far beyond them, disclosing the escrow payment model, human approval before card payment, capture gated on the merchant's confirmation email, automatic refund otherwise, and the exact 400 error codes raised before settle. This is precisely the money-movement context an agent needs and cannot get from annotations.
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 payment model and the operator-specific passenger rules, and the 'Fund the escrow and name the travellers' line anchors the body. There is real redundancy — gender/document rules appear in the opening paragraph and again in the body/schema — and the final settle-and-refund sentence is a long run-on, but no sentence is filler.
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 mutation tool that moves money, the description covers the input party constraints, conditional field requirements, error behavior, the re-read/approval/settle sequence, and the refund fallback. With an output schema present it needn't describe return values, so nothing an agent needs to call it safely 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 would be 3, but the description adds cross-field semantics the schema cannot express: passengers must be exactly the fare-priced party (the search's adults) with the lead first, and each optional field is conditional on the quote's `requires` list. It largely restates the per-field operator rules already in the schema, which keeps it 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?
The description states a specific verb+resource ('you pay only the purchase itself, into its escrow') and immediately scopes it to bus intents via x402, distinguishing it from the create_*_intent, quote_bus and buy_train/buy_flight siblings. An agent can tell this is the payment step of the bus flow 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?
'Fund the escrow and name the travellers' plus the intent_id/escrow framing make the preconditions clear (a priced intent must already exist). The per-operator conditionals ('when the quote's requires lists contact.phone', 'For buses in Türkiye…') give concrete when-to-send rules, but it never explicitly names the preceding sibling tools (brij_create_bus_intent / brij_quote_bus) or states when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_buy_productPay for a productAInspect
Over MCP: you pay only the purchase itself, into its escrow. Pays into the intent's escrow with x402, like brij_book_flight.
Fund the escrow and hand over the shipping details.
Paid x402 endpoint: the intent's escrow amount (expected_escrow_amount), paid into the intent's escrow. The body names the recipient and the full US address; its region and ZIP must be the quoted ones (409 ship_to_changed otherwise — tax was priced on them), and every refusal happens before settle. The purchase then runs: the merchant's cashier is re-read and must match the quote, a human approves, the payment is made with BRIJ's card, and the merchant's confirmation email (the escrow's proof) captures. No confirmation within 6 h → automatic refund. notify_email is optional and only used to reach you about this order. Read progress with POST /shop/orders.
| Name | Required | Description | Default |
|---|---|---|---|
| ship_to | Yes | Full shipping address; its postal_code must equal the quote's. | |
| intent_id | Yes | The intent id returned by POST /shop/intents. | |
| recipient | Yes | Who receives the parcel: given name, surname, optional phone (E.164). | |
| notify_email | No | Optional email that receives the order confirmation and booking reference. | |
| x402_payment | No | Optional: the base64 x402 payment payload (the PAYMENT-SIGNATURE header value), for a client that cannot set _meta["x402/payment"]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | |
| status | No | purchasing: the merchant is being paid; follow with the orders endpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the generic safety profile (not read-only, open world, non-idempotent, non-destructive). The description goes far beyond: escrow funding semantics, the 409 ship_to_changed refusal when region/ZIP diverge from the quote, every refusal happening before settle, human approval, card payment, merchant confirmation email as escrow proof, and automatic refund after 6 h. This is unusually rich behavioral disclosure for a mutation tool.
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 content is comprehensive but the opening is awkward and redundant — 'you pay only the purchase itself, into its escrow' is immediately restated by 'Pays into the intent's escrow with x402.' Mixing transport framing ('Over MCP:', 'Paid x402 endpoint:') with operational detail dilutes the front-loading of the core action.
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?
Given an output schema exists, the description need not explain return values, and it covers everything else an agent needs: prerequisites, escrow/refund timing, error conditions, and where to poll status. Nothing material is missing for correct invocation.
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, but the description adds real meaning: region and postal_code must equal the quoted values or the call 409s, notify_email is optional and scoped to order contact only, and x402_payment exists for clients that cannot set _meta. That is genuine value 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 — pays the intent's escrow for a product purchase and funds it with shipping details — and distinguishes itself from siblings by naming the escrow model that separates it from brij_quote_product and brij_create_product_intent. An agent can tell this is the payment step, not the quoting or intent-creation step.
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 supplies the prerequisite (intent_id from the intent endpoint) and a downstream pointer (read progress with POST /shop/orders), and explicitly ties behavior to the analogous sibling brij_book_flight. It does not spell out the full when-not-to-use path versus brij_quote_product / brij_create_product_intent, so it falls short of explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_buy_trainPay for a train bookingAInspect
Over MCP: you pay only the purchase itself, into its escrow. Pays into the intent's escrow with x402, like brij_book_flight.
Fund the escrow and name the travellers.
Paid x402 endpoint: the intent's escrow amount. Body: intent_id, passengers[] — exactly the party the fare was priced for (the search's adults), lead first, each {given_name, family_name, born_on YYYY-MM-DD}; contact_phone (the buyer's mobile, E.164) when the quote's requires lists contact.phone — some operators (OUIGO, Eurostar) cannot issue a ticket without one, and the buy answers 400 contact_phone_required before settle; contact_postal_code (the buyer's postcode) when it lists contact.postal_code (OUIGO France), else 400 contact_postal_code_required; each passenger's document_number (passport or ID number) when it lists document (Renfe), else 400 document_required; optional notify_email. Every refusal happens before settle. Then: the checkout is re-read and must be no higher than the quote, a human approves, BRIJ's card pays; captured only on the merchant's confirmation email naming the booking we made, refunded automatically otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /rail/intents. | |
| passengers | Yes | The travellers, exactly as many as the search's adults, lead traveller first. | |
| notify_email | No | Optional email that receives the order confirmation and booking reference. | |
| x402_payment | No | Optional: the base64 x402 payment payload (the PAYMENT-SIGNATURE header value), for a client that cannot set _meta["x402/payment"]. | |
| contact_phone | No | The buyer's mobile, E.164. Required when the quote's requires lists contact.phone. | |
| contact_postal_code | No | The buyer's postcode. Required when the quote's requires lists contact.postal_code. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | |
| status | No | purchasing: the merchant is being paid; follow with the orders endpoint. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds what annotations convey: it discloses that all validations refuse before settle, names specific 400 error codes (contact_phone_required, contact_postal_code_required, document_required), describes the human approval step, card payment, capture-only-on-merchant-confirmation-email, and automatic refund otherwise. This tells the agent the financial and failure semantics of a money-moving call, which annotations (destructiveHint=false, openWorldHint=true) alone do not.
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 action, but the opening two sentences are partly redundant ('you pay only the purchase itself, into its escrow' / 'Pays into the intent's escrow with x402'), and the payment-flow sentence is a semicolon-chained run-on that is hard to parse. Nearly every clause carries real information, so it is dense rather than padded, but the structure costs readability.
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 money-spending, non-idempotent, open-world tool, the description covers prerequisites, conditional parameters, error paths, approval, capture, and refund behavior, and an output schema already handles return values. Nothing an agent needs in order to call it safely 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; the description earns more by tying parameters to runtime triggers ('when the quote's requires lists contact.phone'), naming the operators that cause them (OUIGO, Eurostar, Renfe, FlixBus Türkiye/India), and warning that a missing value yields a specific 400 rather than a late failure. It also enforces ordering ('lead first') and cardinality ('exactly the party the fare was priced for').
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 action on a specific resource: pays the escrow for a train booking intent with x402 and names the travellers. The analogy to brij_book_flight and the reference to the intent/quote pipeline make clear this is the terminal purchase step, not search, quote, or intent creation. It does not explicitly contrast itself with brij_quote_train or brij_get_train_order, but the resource scope is unambiguous.
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 through references to prior artifacts ('the intent's escrow', 'the search's adults', 'the quote's requires'), and the agent must infer the sequence: search_trains → quote_train → create_train_intent → buy_train. There is useful conditional guidance (contact.phone, contact.postal_code, document triggers) but no explicit 'call this after X, not instead of Y' statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_cancel_hotelCancel a hotel bookingAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Cancels at the hotel immediately and files the refund the cancellation terms allow. Confirm with the guest first: it cannot be undone.
Cancel a hotel booking and file its refund
Paid x402 endpoint: $0.10 USDC. Body {intent_id}; headers X-Customer-Support-Code and X-Passenger-Family-Name (the lead guest's family name). Cancels at the hotel now. The refund is what the cancellation timeline returns at this moment, plus the service fee minus 2 % of the stay (between 2 and 5 USDC); it is sent to the refund wallet set at intent creation. A non-refundable rate returns only that part of the fee.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /hotels/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. | |
| passenger_family_name | Yes | The lead guest's family name (the first guest sent to POST /hotels/book). |
Output Schema
| Name | Required | Description |
|---|---|---|
| stay | No | The stay as quoted. |
| No | ||
| guests | No | |
| status | No | awaiting_payment, booking, confirmed, failed, cancelled. |
| reference | No | The hotel's booking reference. |
| booking_id | No | |
| cancelled_at | No | |
| confirmed_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses substantial behavior: the cancellation is immediate and irreversible, the refund amount equals whatever the cancellation timeline returns plus the service fee minus 2% of the stay (2–5 USDC), the refund goes to the wallet set at intent creation, and non-refundable rates return only part of the fee. It also covers auth inputs (support code + lead guest family name) and rate limiting. Minor gap: it does not reconcile 'cannot be undone' with destructiveHint=false, which an agent could read either way.
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 critical warning ('Confirm with the guest first: it cannot be undone') is front-loaded, which is good, but the text is cluttered with x402/HTTP-API pricing boilerplate that is explicitly irrelevant to MCP calls, and it repeats the title verbatim as its own sentence. The refund mechanics are dense but useful; the payment plumbing could be trimmed.
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 three-parameter mutation with full schema coverage, an output schema, and annotations, the description supplies what those fields cannot: irreversibility, refund calculation, refund destination, and cost model. An agent has enough to decide and call correctly; only the destructiveHint tension and prior-step prerequisites (intent must exist) are left implicit.
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 all three parameters are already documented with their origins (intent creation response, lead guest family name). The description adds only modestly, restating that the support code and lead-guest family name are required headers and noting where the refund wallet comes from. Baseline 3 applies when the schema carries the parameter burden.
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 states a specific verb and resource ('Cancel a hotel booking and file its refund') and specifies the two-part behavior: cancellation happens at the hotel immediately and a refund is filed per the cancellation terms. It does not explicitly name or differentiate itself from the refund-request siblings (brij_request_*_refund), though no hotel-specific refund sibling exists, so the scope is largely unambiguous.
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 gives a clear operational precondition: 'Confirm with the guest first: it cannot be undone,' which tells the agent to verify intent before calling. It does not state when *not* to use it or point to an alternative path (e.g., checking order status via brij_get_hotel_order first, or handling a refund without cancelling), so guidance is strong on preconditions but silent on alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_create_bus_intentLock a bus quoteBInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). offer_id is the quote's offer_id. KEEP customer_support_code from the answer. Next: brij_buy_bus.
Create the escrow for a quoted journey.
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/intents with the offer_id from POST /rail/quote. Persist customer_support_code.
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | The offer to book, sent back EXACTLY as received from POST /air/search or POST /air/offer-details — never reassembled by hand. | |
| refund_wallet | No | Optional Solana wallet for refunds. Defaults to funding_wallet. | |
| funding_wallet | Yes | Solana wallet expected to fund the escrow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | Read-only projection of a booking intent. Omits customer_support_code and passenger PII; those fields are returned once at intent-creation and /book time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/openWorld/non-idempotent profile, and the description usefully adds context beyond them: MCP calls are free but rate-limited, the x402 $0.10 USDC price applies only to the HTTP surface, escrow creation locks a quote, and the returned customer_support_code must be retained. It stops short of warning that the non-idempotent flag means repeat calls create separate escrows/charges.
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 primary purpose statement is not front-loaded — it appears after pricing and parameter guidance. Content is redundant (offer_id and customer_support_code are each mentioned twice) and the trailing 'Identical to POST /air/intents...' fragment is confusing rather than informative for a bus endpoint.
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 an output schema present, return values needn't be explained, and annotations carry the safety profile. The description covers cost model, workflow sequencing, and support-code handling, but for a funds-locking mutation it omits irreversibility/idempotency implications and misplaces the domain reference (/air) for a bus 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 coverage is 100% with only 3 params, so the schema already documents funding_wallet and refund_wallet fully. The description only restates that offer_id is the quote's offer_id, adding no syntax or constraints beyond what the schema already says ('sent back EXACTLY as received'). Baseline 3 for full coverage with minimal added meaning.
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 core sentence 'Create the escrow for a quoted journey' gives a specific verb and resource, and the title 'Lock a bus quote' plus the 'Next: brij_buy_bus' pointer position it clearly in the quote→intent→buy sequence distinct from brij_quote_bus and brij_buy_bus. However, the purpose sentence is buried after pricing/param notes, and the reference to 'POST /air/intents' in a bus tool muddies the resource identity.
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?
'Next: brij_buy_bus' explicitly signals the downstream step, and requiring the offer_id from the quote implies this must follow brij_quote_bus. But there is no explicit when-to-use statement, no when-not, and no prerequisite framing (e.g. 'call this after quoting, before paying') spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_create_flight_intentLock a flight offerAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Creates the escrow for one offer. KEEP customer_support_code from the answer: it cannot be read again, and orders and refunds need it. Next: brij_book_flight.
Create an escrow-backed booking intent from a selected offer.
Paid x402 endpoint. Send a valid PAYMENT-SIGNATURE header to create
the intent. Without payment, the API returns 402 Payment Required.
Optional request field referrer: an affiliate code (see POST /affiliates) — the resolved affiliate wallet is frozen on the intent and credited a share of the platform fee once the booking captures and the journey is flown without refund; unknown or self-referring codes are silently ignored.
Creates the local booking intent and initializes its Solana escrow. This does not fund the escrow, pay the airline, or issue a ticket.
Lowcost (trip.com: offers). These book through a browser-driven fulfiller, not an airline API, so a few rules differ. The escrow amount is the offer's own price (fare menus from POST /air/offer-details are bookable: an offer_id like "trip.com:##@s" locks fare n and the escrow prices at that fare). A fare offer_id is only bookable while its menu is fresh (~30 min) — a stale one returns 409 fare_menu_expired, re-open the fares and retry. If the most recent fare check (POST /air/offer-details) for the offer failed within the last ~30 min, intent creation returns 409 fare_check_failed — a failed fare check temporarily blocks booking that offer; retry POST /air/offer-details in a few minutes and book once it answers. If that supplier is not currently selling, intent creation returns 409 browser_booking_unavailable — book a fastbooking offer, or retry later. An unknown/expired browser-tier offer_id returns 404 offer_not_found. Send an offer_id back EXACTLY as received. A browser-tier id is derived from the flight, so it is the same string for every buyer; the trailing "@s" is what ties it to YOUR search, and therefore to the cabin, the party and the fare menu your price came from. Strip it and the offer resolves against whoever searched that flight most recently. Booking then requires the travel document at POST /air/book (see there).
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | The offer to book, sent back EXACTLY as received from POST /air/search or POST /air/offer-details — never reassembled by hand. | |
| refund_wallet | No | Optional Solana wallet for refunds. Defaults to funding_wallet. | |
| funding_wallet | Yes | Solana wallet expected to fund the escrow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | Read-only projection of a booking intent. Omits customer_support_code and passenger PII; those fields are returned once at intent-creation and /book time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) by disclosing the payment model (free over MCP, x402/PAYMENT-SIGNATURE for HTTP, 402 without payment), escrow semantics, the unrecoverable customer_support_code, affiliate referral freezing, and specific failure modes (409 fare_menu_expired, 409 fare_check_failed, 409 browser_booking_unavailable, 404 offer_not_found). This is exactly the behavioral 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?
Critical warnings are front-loaded well (free-over-MCP, KEEP customer_support_code, Next step), and the failure-mode detail is justified by complexity. However, the core purpose is restated three times ('Creates the escrow for one offer', 'Create an escrow-backed booking intent from a selected offer', 'Creates the local booking intent'), and the lowcost block is dense and unordered, so not every sentence earns its place.
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?
An output schema exists, so return-value explanation is not required, yet the description still flags the must-keep customer_support_code. Combined with the payment requirements, escrow-vs-funding distinction, referrer behavior, and the full set of supplier-specific error paths, an agent has everything needed to invoke this tool correctly and recover from failure.
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 real value: it documents the optional 'referrer' field, which does not appear in the input schema at all, and explains offer_id semantics ('send back EXACTLY as received', the trailing '@s<search>' tying it to the buyer's search). That is meaning beyond the schema, though funding/refund wallet semantics are left to 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+resource: 'Creates the escrow for one offer' / 'Create an escrow-backed booking intent from a selected offer.' It distinguishes itself from the sibling it feeds into by naming the next step ('Next: brij_book_flight') and clarifying that it 'does not fund the escrow, pay the airline, or issue a ticket.' An agent can tell it apart from brij_book_flight and brij_get_flight_offer_details without opening any 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?
Explicit routing: 'Next: brij_book_flight' after intent creation, and a clear negative boundary ('This does not fund the escrow, pay the airline, or issue a ticket') that separates it from the booking tool. It also gives conditional usage for the lowcost variant, including when to re-open fares, retry offer-details, or fall back to a fastbooking offer. Alternatives and preconditions are spelled out rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_create_hotel_intentLock a hotel quoteAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). offer_id is the quote's offer_id. KEEP customer_support_code from the answer: orders and cancellation need it. Next: brij_book_hotel.
Create the escrow for a quoted hotel stay
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/intents with the offer_id from POST /hotels/quote. The escrow amount is the quote's ALL-IN total. Persist customer_support_code: it cannot be read again, and POST /hotels/orders and /hotels/cancel need it.
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | The offer to book, sent back EXACTLY as received from POST /air/search or POST /air/offer-details — never reassembled by hand. | |
| refund_wallet | No | Optional Solana wallet for refunds. Defaults to funding_wallet. | |
| funding_wallet | Yes | Solana wallet expected to fund the escrow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | Read-only projection of a booking intent. Omits customer_support_code and passenger PII; those fields are returned once at intent-creation and /book time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses real consequences: this moves funds into escrow, the escrow amount is the quote's ALL-IN total, and customer_support_code is single-read and unrecoverable but required for brij_book_hotel, order lookup, and cancellation. It also clarifies cost mechanics (free over MCP, rate-limited; $0.10 USDC only on the HTTP x402 path) and confirms it is the same operation as POST /air/intents, which is genuinely useful context an agent would otherwise have to guess.
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 actual purpose statement is buried in the middle of the paragraph, after a pricing preamble and before a near-duplicate pricing sentence at the end ("Free over MCP..." vs "Paid x402 endpoint: $0.10 USDC"), so the same cost caveat is stated twice. Parameter advice, pricing, purpose, and the next-step pointer are interleaved rather than front-loaded or grouped.
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 3-parameter mutation tool with an output schema, the description covers the workflow, the money semantics, the immutability of customer_support_code, and pricing — the things an agent can't get from structured fields. Only the missing sibling exclusions keep it from being fully complete.
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 schema already documents funding_wallet, refund_wallet, and the exact offer_id semantics including the refund_wallet default. The description only adds that offer_id belongs to the hotel quote, which is marginal beyond what the schema says; baseline 3 applies when the schema does the heavy lifting.
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 sentence "Create the escrow for a quoted hotel stay" names a specific verb (create) and resource (escrow for a hotel stay), and the opener "Lock a hotel quote" plus "Next: brij_book_hotel" make the position in the quote → intent → book sequence unambiguous. An agent can distinguish this from brij_quote_hotel and brij_book_hotel without opening a 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 prerequisite (must follow a hotel quote), the flow position ("Next: brij_book_hotel"), and a hard usage rule for offer_id ("sent back EXACTLY as received... never reassembled by hand"). It doesn't explicitly name the sibling alternatives (e.g. why not brij_create_flight_intent or brij_book_hotel directly), so it falls just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_create_product_intentLock a product quoteAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). offer_id is the quote's offer_id. KEEP customer_support_code from the answer. Next: brij_buy_product.
Create the escrow for a quoted product.
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/intents — same body {funding_wallet, refund_wallet?, offer_id} and the same response — with the offer_id from POST /shop/quote. The escrow amount is the quote's total_amount. 409 offer_expired after ~20 min: quote again. Persist customer_support_code from the response: it is needed to read the order and to request a refund, and cannot be re-read later.
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | The offer to book, sent back EXACTLY as received from POST /air/search or POST /air/offer-details — never reassembled by hand. | |
| refund_wallet | No | Optional Solana wallet for refunds. Defaults to funding_wallet. | |
| funding_wallet | Yes | Solana wallet expected to fund the escrow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | Read-only projection of a booking intent. Omits customer_support_code and passenger PII; those fields are returned once at intent-creation and /book time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true): it discloses the MCP vs HTTP cost model and rate limiting, escrow amount derivation from the quote's total_amount, the ~20-minute quote expiry with a 409 error, and the fact that customer_support_code is required later for reads and refunds and cannot be re-read. That is exactly the operational context an agent needs and 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 purpose sentence is buried after a pricing/persistence preamble, and the customer_support_code warning is stated twice (opening fragment and closing paragraph). The content is valuable but the ordering is not front-loaded and there is mild redundancy.
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?
An output schema exists so return values need no explanation, and the description covers cost, expiry, error handling, workflow position, and the refund path. Minor gap: it references POST /air/intents and /air/* offer sources for a product tool, a copy-paste artifact that could momentarily confuse an agent about the endpoint family.
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 real meaning: it pins offer_id to the quote's offer_id, restates the request body shape {funding_wallet, refund_wallet?, offer_id}, and ties the escrow amount to the quote's total_amount — an input-to-effect mapping the schema does not express.
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 — "Create the escrow for a quoted product" — and the title/slug make the product variant distinguishable from brij_create_flight_intent and brij_create_train_intent. It also situates the tool in the workflow (offer_id from quote, next step brij_buy_product), so an agent can place it without reading either 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?
Gives a clear before/after context: offer_id must come from the quote step, and the next call is brij_buy_product, plus explicit retry guidance for the 409 offer_expired case (~20 min). It never states the negative case (that this is not for flights/trains), leaving sibling exclusion to the name and title.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_create_train_intentLock a train quoteAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). offer_id is the quote's offer_id. KEEP customer_support_code from the answer. Next: brij_buy_train.
Create the escrow for a quoted journey.
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/intents with the offer_id from POST /rail/quote. Persist customer_support_code.
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | The offer to book, sent back EXACTLY as received from POST /air/search or POST /air/offer-details — never reassembled by hand. | |
| refund_wallet | No | Optional Solana wallet for refunds. Defaults to funding_wallet. | |
| funding_wallet | Yes | Solana wallet expected to fund the escrow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | Read-only projection of a booking intent. Omits customer_support_code and passenger PII; those fields are returned once at intent-creation and /book time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write/open-world/non-idempotent profile, and the description adds real value beyond them: MCP calls are free but rate-limited, the HTTP endpoint costs $0.10 USDC, an escrow is being created, and customer_support_code must be persisted. It does not describe reversibility of the escrow lock.
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 text is jumbled and poorly front-loaded: the actual purpose ('Create the escrow') appears third, pricing is split across two spots, and 'customer_support_code' is stated twice ('KEEP customer_support_code from the answer' and 'Persist customer_support_code'). The 'Identical to POST /air/intents' line is likely a copy-paste error that adds noise.
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 an output schema present, return values need not be explained. The description covers pricing model, sequencing, and key parameter handling, which is nearly complete for a financial intent tool. The only blemish is the misleading /air/intents reference for a train endpoint.
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 schema fully documents all three parameters. The description reinforces that offer_id must be the quote's offer_id, but adds no syntax or format detail beyond what the schema already carries, matching the baseline for full schema coverage.
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 core purpose is stated with a specific verb and resource: 'Create the escrow for a quoted journey.' It also implies the train-specific scope through 'Next: brij_buy_train'. However, it never explicitly distinguishes itself from create_flight_intent / create_product_intent siblings, and it confusingly cites POST /air/intents for a train tool.
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 provides clear sequencing: use the offer_id from the quote and 'Next: brij_buy_train', which routes the agent through the workflow. It does not, however, state any when-not-to-use condition or the alternative siblings to pick instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_find_hotel_placesFind a city for a hotel searchARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Cities (city_id) and, from 3 characters, hotels by name (accommodation_id) for brij_search_hotels. Optional: brij_search_hotels also takes a city name as location.
Suggest cities and hotels by name for a hotel search
Free. Up to 8 cities matching q (2+ characters), each with an id to send as city_id to POST /hotels/search, and from 3 characters up to 8 hotels matching q by name (hotels[]: accommodation_id, name, address), each searched on its own with accommodation_id. Optional: /hotels/search also takes a typed location or coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | The start of a city name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hotels | No | Hotels whose name matches q: accommodation_id, name, address, city, country. |
| places | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world), yet the description still adds real operational context: MCP calls are free and rate-limited while the x402 price applies only to the HTTP API, plus concrete result caps (up to 8 cities at 2+ characters, up to 8 hotels from 3 characters). Those caps and the cost/rate-limit distinction are not derivable from any structured field.
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 content is delivered twice in near-identical form (a pricing/summary paragraph, then a restatement with the same limits and the same 'Optional: ... location' note), so roughly half the text is duplication. Leading with x402 pricing and an HTTP-vs-MCP caveat buries the actual purpose for a one-parameter lookup tool.
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?
An output schema exists, so return-value explanation is optional, yet the description still names the returned fields (hotels[]: accommodation_id, name, address). For a single-parameter, read-only suggestion tool this covers what an agent needs, with only matching semantics and empty-result behavior left implicit.
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% and the single parameter q is already documented as 'the start of a city name.' The description adds genuine meaning beyond that — the 2-character minimum for city matches and the 3-character threshold that unlocks hotel-by-name matches from the same input — but leaves prefix-vs-substring matching and case sensitivity unstated.
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 states a specific verb and resource — suggest cities (city_id) and, from 3 characters, hotels by name (accommodation_id) — and names the downstream consumer, brij_search_hotels, which separates it cleanly from siblings like brij_get_hotel_rates or brij_quote_hotel. The title ('Find a city for a hotel search') understates the hotel-lookup half, but the body corrects that.
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: the call exists to supply city_id/accommodation_id to brij_search_hotels, and the description notes that search_hotels also accepts a typed city name as location. That hint gestures at an alternative path but never says explicitly when to look up an id versus passing a free-text location, nor when this tool should be skipped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_bus_orderBus booking statusBRead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Rail booking status and reference.
Paid x402 endpoint: $0.01 USDC. Body {intent_id}; header X-Customer-Support-Code. status purchasing → ordered (booking reference) → confirmed (captured) | refunded.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /rail/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | purchasing → ordered (merchant reference) → confirmed (captured) | refunded. |
| merchant | No | |
| intent_id | No | |
| shipped_at | No | |
| captured_at | No | |
| refunded_at | No | |
| escrow_amount | No | |
| merchant_total | No | |
| service_ends_at | No | |
| tracking_number | No | |
| merchant_order_number | No | The merchant's order number / booking reference. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely useful behavior: MCP calls are free but rate-limited (vs the $0.01 USDC x402 HTTP path), the required header X-Customer-Support-Code, and the status lifecycle purchasing → ordered → confirmed | refunded. That lifecycle detail is context beyond anything the annotations 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 purpose is buried behind a pricing disclaimer, then restated, then followed by more pricing, producing a jumbled front-load. Every element is relevant, but the ordering wastes the reader's first sentence on billing mechanics rather than what the tool returns.
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?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description supplies the auth header and status flow, but the rail/bus resource mismatch and absence of when-to-use routing leave the definition only adequately complete for a read-only status lookup.
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 two parameters are already documented. The description restates that intent_id goes in the body and customer_support_code goes in a header, which adds minor transport detail but little semantic meaning 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?
The description states a specific verb+resource ('booking status and reference'), but it names the resource as 'Rail' while the tool name, title ('Bus booking status'), and siblings (brij_get_flight_order, brij_get_train_order) all indicate this is the bus variant. An agent can infer the general purpose but the resource label is inconsistent with the tool's own identity.
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?
There is no explicit when-to-use guidance and no alternatives named. The closest sibling, brij_get_intent, and the order-retrieval siblings for other modes are never referenced, so the agent must infer that this is the post-purchase status lookup rather than an intent or quote call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_flight_offer_detailsFlight offer detailsARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Drill into one offer: fare menu, bag prices, live price.
Paid x402 endpoint: $0.01 USDC for fastbooking: offers, $0.10 USDC for offers from a browser tier (trip.com:, ryanair:) — reading their fare menu costs a real browser session at the supplier — the PAYMENT-REQUIRED challenge always quotes the applicable price.
fastbooking: offers — re-fetches the offer from the flight provider and returns it in the same shape as search results, with CURRENT price and expires_at, plus available_services: the purchasable extras (checked bags with weight limits and prices) on that exact fare. fare_options lists EVERY fare of this flight (same aircraft, every brand: Basic, Standard, Flex…), fresh from the supplier and price-ascending, each with its own bookable offer_id — including fares the search left out of its page. Pick the row you want and pass its offer_id to POST /air/intents.
browser-tier offers (trip.com:, ryanair:) — return the offer with fare_options filled from the supplier's own fare menu: per fare, the price, cabin, seats_left, and conditions[] (the supplier's verbatim wording for baggage allowances and refund policy — {type, text} pairs such as CARRY_ON, CONSIGN, UN_REFUND). Each fare row carries its own bookable offer_id (':##', e.g. 'trip.com:2026-11-07T20:35|2026-11-07T21:55|FR##1') and fare_index: create the intent on that offer_id to book THAT fare - the escrow prices at the fare, and the fulfiller selects the same menu index at the supplier. The fare menu must be fresh (re-drill after ~30 min: 409 fare_menu_expired). Expect 20-45s on a cold read; 202 fares_pending means the menu is still being fetched and nothing was charged — wait for the Retry-After header (15s) and send the same request again: it returns the finished result. Do not treat a 202 as the offer. Results are cached ~5 min per offer_id, so repeats are instant and free of supplier load.
Use it to (1) answer "how much is an extra bag on this fare?" or "is this browser-tier fare refundable?" — the ancillary/conditions questions search results cannot answer — and (2) revalidate a single offer minutes after a search, which is cheaper and quota-friendlier than re-searching.
A stale or unknown offer_id returns 404 and the payment is never settled: refusals cost nothing. Offers expire roughly 20-30 minutes after search; on 404, re-search.
Services are informational only: this API books the fare as-is and cannot add services to the order.
| Name | Required | Description | Default |
|---|---|---|---|
| offer_id | Yes | id from POST /air/search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| offer | No | The offer re-fetched live: total_amount and expires_at are CURRENT, unlike a minutes-old search result. |
| available_services | No | Purchasable extras with prices. Empty array = the airline offers none on this fare (an answer, not missing data). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavioral context beyond them: caching (~5 min per offer_id), staleness windows (20-30 min, 409 fare_menu_expired), the 202 fares_pending flow with Retry-After, 404 semantics where 'the payment is never settled', latency expectations (20-45s cold read), and the informational-only services caveat.
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 purpose and routed well, but the definition is long for a one-parameter read tool and repeats fare-menu and pricing detail across paragraphs. The edge-case coverage (202/409/404, caching, latency) justifies most of the length, though some sentences could be tightened without information loss.
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?
An output schema exists, so return-value documentation is not required, and the description still covers pricing, failure modes, caching, freshness, and booking handoff. Nothing an agent needs to invoke this correctly appears to be 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% and only one parameter exists, so the schema already documents offer_id. The description still adds value by explaining the id's provenance ('id from POST /air/search'), the browser-tier composite format ('<tier>:<flight>##<n>'), and where the id is consumed next (POST /air/intents).
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?
Opens with a specific verb and resource: 'Drill into one offer: fare menu, bag prices, live price.' It distinguishes itself from brij_search_flights by framing the tool as a per-offer drill-down and revalidation step, so an agent can tell it apart from siblings without reading 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?
Explicitly enumerates the two use cases — answering ancillary/conditions questions ('how much is an extra bag', 'is this fare refundable') and revalidating a single offer after a search — and states it is 'cheaper and quota-friendlier than re-searching,' naming the alternative it replaces.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_flight_orderFlight order statusARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Fetch airline order status.
Returns the booking reference and order status for ANY fulfiller — a Duffel ticket is read from Duffel, a partner-tier booking (trip.com, ryanair.com) from the marketplace's own record: the supplier reference, the airline PNR the settlement oracle extracted from the confirmation email, and the engaged amount. If all you need is the PNR, GET /air/intents/{intent_id} carries it for free as booking_reference. Paid x402 endpoint at a token $0.01 USDC, and still gated by the X-Customer-Support-Code returned at intent creation. Refusals are never charged: a missing or wrong code (401/403) or an unknown order (404) happens before the payment settles. Note the response distinguishes an unknown order (404) from a wrong code (403).
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | The airline order id (intent.order_id once booked). | |
| customer_support_code | Yes | The customer support code returned when the intent was created. |
Output Schema
| Name | Required | Description |
|---|---|---|
| order | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds substantial behavior beyond them: the customer-support-code auth gate, the x402/$0.01 USDC payment context, MCP-side rate limiting, and detailed refusal semantics (401/403 for missing or wrong code, 404 for unknown order, none of which are charged since they occur before settlement). That is a materially richer picture than the annotations alone.
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 purpose statement is pushed to the second sentence by a lengthy pricing caveat, and the payment story is repeated (free over MCP, then the $0.01 USDC x402 note, then the refusal-charging rule). The error-semantics content earns its place, but the pricing digression is partly about the HTTP API rather than this MCP tool, which dilutes front-loading.
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?
An output schema exists, so return values needn't be explained, yet the description helpfully enumerates them anyway and adds error-path semantics and auth requirements. Rate limits are mentioned but not quantified, and the description is otherwise complete for calling the tool correctly.
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% and both parameters are documented in the schema, so the baseline is 3. The description only echoes the code's origin ('returned at intent creation') and says nothing about order_id format or where to obtain it that the schema doesn't already state, so it adds little on this dimension.
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 states a concrete verb and resource: 'Fetch airline order status,' and clarifies it returns booking reference and order status for any fulfiller. The word 'airline' distinguishes it from the product/train order siblings without needing their schemas. It stops short of an explicit sibling comparison beyond mentioning the PNR alternative, so it is clear but not maximally differentiated.
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 gives a concrete routing rule: 'If all you need is the PNR, GET /air/intents/{intent_id} carries it for free as booking_reference,' which maps to the brij_get_intent sibling and states the condition that selects it. It doesn't spell out when not to use this tool versus the train/product order siblings, but the core when-to-use guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_flight_search_updatesPoll a flight searchARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Poll a progressive search for offers still arriving (free).
Free companion to POST /air/search — no x402 payment: the search was already paid, and the unguessable search_id is the authorization.
A search answers within seconds with the fast tiers' offers and status: enriching when slower, cheaper fulfiller tiers are still working. Poll this endpoint (respecting poll_after_ms, ~5s) until status: complete. Each poll returns the full merged-and-deduplicated offer list so far — idempotent reads, safe to retry.
The search_id expires ~5 minutes after the search; after that this endpoint returns 410 and a new search is needed. The rest of the purchase tunnel (offer-details, intents, book) is unchanged — offers gained here are used exactly like offers from the initial response.
| Name | Required | Description | Default |
|---|---|---|---|
| search_id | Yes | The search_id returned by POST /air/search. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | Present while status is enriching: keep polling until complete before choosing. Absent when complete. |
| offers | No | The FULL merged offer list so far (not a delta), deduplicated across fulfiller tiers, shaped exactly like the original search request. |
| status | No | "complete" once no further offers can arrive. |
| fulfillers | No | Per-tier quoting state. |
| highlights | No | The three offers an agent asks about first — cheapest, fastest, cheapest nonstop — each taken from EVERYTHING that matched, before the limit cut. A page of the 15 cheapest is only honest if it says what it left out: on a long-haul route every one of the 15 cheapest can be a connection while a direct exists at a higher price. Read cheapest_nonstop before concluding a route has no direct flight. A field is absent when no offer qualifies (no nonstop on the route, or none within max_stops / the time window). |
| matched_count | No | How many offers survived the filters and grouping BEFORE the limit cut — what a full listing would hold. |
| poll_after_ms | No | Suggested delay before the next poll. Absent when complete. |
| new_since_last_poll | No | How many offers landed since the previous poll (all of them on the first poll). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: idempotent merged-and-deduplicated full-list reads, safe to retry, rate-limited rather than x402-priced, and the 5-minute expiry yielding 410. It also explains the authorization model (unguessable search_id) and the status:enriching lifecycle, which the readOnly/idempotent hints do not convey.
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-loads the free/rate-limited clarification and the core polling instruction, then layers lifecycle details. Slightly verbose with repeated emphasis on 'free' and the payment model, but nearly every sentence carries actionable information.
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 an output schema present, return-value detail is unnecessary, and the description covers the remaining gaps: polling cadence, terminal status, expiry, idempotency, and how gained offers feed the unchanged purchase tunnel. Nothing an agent needs to poll correctly 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 single search_id parameter is already documented. The description adds meaning the schema lacks: that search_id is the authorization token and expires ~5 minutes, which affects how the agent should treat the value.
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+resource (poll a progressive flight search for still-arriving offers) and explicitly positions it as the companion to the initial POST /air/search. An agent can distinguish it from brij_search_flights without opening either 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?
Gives explicit when-to-use (poll until status: complete), the cadence (respect poll_after_ms, ~5s), and the failure/expiry condition (search_id expires ~5 min, then 410 and a new search is needed). It also clarifies the search itself must be initiated elsewhere first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_hotel_orderHotel booking statusARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Get a hotel booking's status and reference
Paid x402 endpoint: $0.01 USDC. Body {intent_id}; header X-Customer-Support-Code. status awaiting_payment → booking → confirmed (booking_reference, escrow captured) | failed | cancelled | refunded; booking carries the full confirmation (hotel, dates, guests, key collection, cancellation terms).
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /hotels/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | awaiting_payment, booking, confirmed, failed, cancelled, refunded. |
| booking | No | The full confirmation (HotelConfirmation). |
| intent_id | No | |
| captured_at | No | |
| refunded_at | No | |
| escrow_amount | No | |
| booking_reference | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered; the description still adds real value with the rate-limiting note, the auth/header requirement, and the full status state machine including when escrow is captured. The HTTP-vs-MCP pricing preamble is partly noise for an MCP caller, which keeps it off a 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?
The core is front-loaded and dense with useful information, but the opening parenthetical about x402 pricing and MCP-vs-HTTP billing is context that does not help an agent decide or call the tool. The semicolon-separated state chain is compact but slightly cryptic on first read.
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?
An output schema exists, so the description need not enumerate return fields, and it still explains the status lifecycle and that the booking object carries hotel, dates, guests, key collection and cancellation terms. Authentication and rate limits are noted, leaving little an agent needs that 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 description coverage is 100%, so the baseline is 3: both parameters are already documented in the schema, including that intent_id comes from POST /hotels/intents. The description's only added semantic is that customer_support_code travels as an X-Customer-Support-Code header, which is a small increment over 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?
"Get a hotel booking's status and reference" gives a specific verb and resource, and the state-machine sentence makes clear this is a status-poll on an existing booking rather than a search or a rate lookup. It does not explicitly name the near neighbours (brij_get_intent, brij_get_hotel_rates), so an agent must infer the boundary from the hotel/booking wording.
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: an agent learns the tool needs an intent_id from POST /hotels/intents and returns a status progression, so polling after intent creation is the obvious use. There is no explicit when-to-use versus brij_get_intent or when-not-to-use (e.g. after cancellation), and no stated prerequisites beyond the support code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_hotel_ratesHotel rooms and ratesARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Next: brij_quote_hotel with the rate_id the guest chose.
List the rooms and rates of one searched hotel
Paid x402 endpoint: $0.01 USDC. Body {hotel_id} from POST /hotels/search. Answer: room_types[], each with rates[]: rate_id (send it to POST /hotels/quote), board (room only, breakfast...), refundable, refundability and cancellation_timeline (what is refunded until when), price (hotel total with tax and fees, service fee, ALL-IN total, due at hotel). Rates paid at the hotel are not listed. Refusals are free.
| Name | Required | Description | Default |
|---|---|---|---|
| hotel_id | Yes | hotel_id from POST /hotels/search, exactly as received. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hotel | No | Name, address, rating, check-in/out times. |
| seller | No | Who sells the stay (BRIJ). |
| hotel_id | No | |
| room_types | No | Each room: name, beds, rates[] (rate_id, board, refundable, refundability, cancellation_timeline, price). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real behavior: MCP calls are rate-limited rather than charged, refusals are free, and critically 'Rates paid at the hotel are not listed', which signals a coverage limitation an agent could otherwise misinterpret as an empty result. The dense enumeration of the response shape adds less value since an output schema exists.
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 first third of the text is x402/MCP billing boilerplate that the agent cannot act on and that precedes the actual purpose statement, so the definition is badly front-loaded. It then spends further sentences restating the return shape in prose even though an output schema is present.
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 one-parameter read tool, the essentials are all present: where hotel_id comes from, what the call yields, which field to pass onward, and the notable gap that pay-at-hotel rates are excluded. The only shortfall is that this is achieved through verbose duplication of structured fields rather than focused new information.
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?
There is a single required parameter with 100% schema description coverage, so the schema already carries the semantics. The description only echoes the origin of hotel_id ('from POST /hotels/search'), matching rather than extending the schema text. 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 sentence 'List the rooms and rates of one searched hotel' gives a specific verb and resource, and the prerequisite ('hotel_id from POST /hotels/search') together with 'Next: brij_quote_hotel' separates it cleanly from the search and quote siblings. It loses a point because the actual purpose statement is buried behind pricing/billing boilerplate that has nothing to do with what the tool does.
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 establishes the position in the workflow: it consumes a hotel_id produced by hotel search and feeds a rate_id into brij_quote_hotel. That is clear context for when to call it. It stops short of explicit exclusions, e.g. it never says to call brij_search_hotels first if no hotel_id exists, or that this is not the tool for booking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_intentRead an intentARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Works for flight, train, bus and product intents.
Fetch a booking intent by id.
Free. Poll it after /air/book: status moves to booked once the escrow is captured, and booking_reference carries the airline PNR as soon as the ticket is issued. A booking is finished for the traveller when booking_reference is present: relay it to them.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned when the intent was created. |
Output Schema
| Name | Required | Description |
|---|---|---|
| intent | No | Read-only projection of a booking intent. Omits customer_support_code and passenger PII; those fields are returned once at intent-creation and /book time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial context beyond them: MCP calls are free but rate-limited rather than x402-priced, the status transitions to booked only after escrow capture, and booking_reference holds the airline PNR once ticketed.
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 short paragraphs, mostly front-loaded and information-dense. The pricing/rate-limit note leads before the core purpose, which slightly buries the one-line 'Fetch a booking intent by id', but nothing 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?
An output schema exists, yet the description still supplies the lifecycle semantics an agent needs (polling, status=booked, terminal condition of booking_reference present, and the instruction to relay it to the traveller). Nothing required to invoke or interpret this tool 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?
The single parameter has 100% schema description coverage, so the schema already explains that intent_id is the id returned at creation. The description only adds that the same id space spans all four intent types, which is marginal value 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+resource ('Fetch a booking intent by id') and explicitly scopes it to flight, train, bus and product intents, which cleanly separates it from the vertical-specific siblings like brij_get_flight_order and brij_get_bus_order.
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?
Gives a concrete usage trigger: poll it after /air/book to watch status move to booked. It stops short of naming when to prefer this over the per-vertical order tools or when not to call it, so it is clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_product_orderProduct order statusARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Merchant order status: order number, shipping, tracking.
Paid x402 endpoint: $0.01 USDC. Body {intent_id}; header X-Customer-Support-Code (401 missing, 403 mismatch — both free). status: purchasing → ordered (merchant order number known) → confirmed (escrow captured) → shipped (tracking_number when the merchant sent one); or refunded.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /shop/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | purchasing → ordered (merchant reference) → confirmed (captured) | refunded. |
| merchant | No | |
| intent_id | No | |
| shipped_at | No | |
| captured_at | No | |
| refunded_at | No | |
| escrow_amount | No | |
| merchant_total | No | |
| service_ends_at | No | |
| tracking_number | No | |
| merchant_order_number | No | The merchant's order number / booking reference. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive. The description adds genuinely new behavioral context: MCP calls are rate-limited rather than paid, auth failures are free (401 missing / 403 mismatch), and the full order state machine including when tracking_number appears. This is well beyond what the annotations 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?
Front-loaded with the purpose, but the x402 pricing/header paragraph is largely irrelevant to an MCP caller and consumes space before the useful lifecycle detail. The state-machine sentence at the end is the most valuable and is buried.
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?
An output schema exists, so return values need no explanation, and the description covers auth requirements and the status lifecycle. It is complete enough to invoke correctly, with only sibling routing left unaddressed.
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. The description only maps intent_id to the request body and customer_support_code to a header, which is marginal added meaning over a schema that already documents both.
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+resource: 'Merchant order status: order number, shipping, tracking.' The word 'Merchant' plus the field list distinguishes it from the sibling flight/train order tools and from brij_get_intent, though it never names those siblings 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?
Conveys the context implicitly (this is the post-order status check, and the lifecycle purchasing → ordered → confirmed → shipped → refunded signals when it becomes relevant), plus the MCP-vs-HTTP pricing distinction. But it never says 'use this rather than brij_get_intent' or when NOT to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_get_train_orderTrain booking statusBRead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Rail booking status and reference.
Paid x402 endpoint: $0.01 USDC. Body {intent_id}; header X-Customer-Support-Code. status purchasing → ordered (booking reference) → confirmed (captured) | refunded.
| Name | Required | Description | Default |
|---|---|---|---|
| intent_id | Yes | The intent id returned by POST /rail/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | purchasing → ordered (merchant reference) → confirmed (captured) | refunded. |
| merchant | No | |
| intent_id | No | |
| shipped_at | No | |
| captured_at | No | |
| refunded_at | No | |
| escrow_amount | No | |
| merchant_total | No | |
| service_ends_at | No | |
| tracking_number | No | |
| merchant_order_number | No | The merchant's order number / booking reference. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive behavior, so the safety profile is covered. The description adds useful behavioral context: MCP calls are free but rate-limited, the HTTP endpoint has a different x402 price, and the status transitions are purchasing → ordered → confirmed/refunded.
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 description is short but poorly front-loaded: it opens with MCP pricing instead of the tool's purpose. The paid x402 endpoint sentence is relevant mainly to the HTTP API and may distract an MCP agent, though the status lifecycle fragment is useful.
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 rich annotations, full schema coverage, and an output schema, the definition does not need to explain return values. However, it does not route the agent to this tool over brij_get_intent or explain when a train order status check is appropriate, leaving a notable workflow 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 coverage is 100%, so both parameters are already documented in the input schema. The description maps intent_id to the body and customer_support_code to a header, but adds no format, validation, or source details beyond what the schema provides.
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 clearly states the tool retrieves rail booking status and reference, which is specific enough to distinguish it from flight/product order tools by resource. It does not explicitly name sibling alternatives, but 'Rail booking status and reference' is a clear purpose statement.
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 gives the status lifecycle but no explicit guidance on when to use this tool versus alternatives such as brij_get_intent or the flight/product order equivalents. It also does not state prerequisites like needing an intent_id from brij_create_train_intent beyond what the schema already says.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_list_airlinesSupported airlinesARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Supported airlines (free).
Free, no auth. Aggregate carrier catalog over every fulfiller tier: source "api" is the API-settled (Duffel) catalog, refreshed at most daily; a tier name ("trip.com" = the OTA, "ryanair.com" = ryanair.com) means that fulfiller has actually QUOTED the carrier — observed coverage that grows with searches and understates an OTA's true span. Presence is recognition, not a bookability promise: what is bookable for a route is what POST /air/search returns.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| airlines | No | |
| coverage | No | |
| refreshed_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/open-world, so the bar is lower and the description adds real value on top: no auth required, MCP calls are rate-limited rather than x402-priced, and the api tier refreshes at most daily. The tier-coverage semantics (observed vs. true span) are disclosed as a caveat. It doesn't quantify the rate limit, which keeps it from a 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?
Useful but verbose: 'Free over MCP (…free). Free, no auth.' repeats the free/no-auth point, and the x402 pricing parenthetical reads as vendor boilerplate before the actual purpose. The core catalog semantics are buried in the middle sentence rather than front-loaded.
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?
An output schema exists, so return values needn't be explained, and indeed they aren't. Crucially, the description supplies the semantic meaning of the 'source'/tier values in the response — knowledge the schema alone could not convey — which is exactly the right thing to include. What's missing is any sense of response shape/size, though that is partially covered by the output 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?
The tool takes zero parameters, so per the rubric the baseline is 4. There is no parameter surface for the description to clarify, and it correctly avoids inventing one.
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+resource: lists supported airlines as an aggregate carrier catalog across fulfiller tiers. It also distinguishes its role from the search path by noting that bookability is determined by POST /air/search rather than this catalog. Sibling differentiation is implied rather than named (e.g. vs brij_search_flights), keeping it just 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?
The description sets clear context — use this to see which carriers are recognized, and use search results to determine actual bookability ('what is bookable for a route is what POST /air/search returns'). It clarifies the free/no-auth, read-only nature of the call. It stops short of an explicit 'use this when X, use Y when Z' routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_quote_busQuote a bus journeyARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). journey_id from brij_search_buses. If the answer is pending, call again with the same arguments after retry_after. Next: brij_create_bus_intent.
Quote a journey's exact all-in price at merchant checkout.
Paid x402 endpoint: $0.25 USDC. Body: journey_id from POST /rail/search, optional fare (e.g. "Standard", "Flexible"), optional max_total_usd. Same answer as POST /shop/quote: offer_id to pass to POST /rail/intents, breakdown, total_amount ALL-IN, requires [person], expires_at (~20 min). 422 options_required lists the fares on sale (detail.options) — retry with fare. Refusals are free; 202 quote_pending means retry.
| Name | Required | Description | Default |
|---|---|---|---|
| fare | No | Optional fare to quote, when the journey offers several (e.g. a flexible fare); default: the cheapest. | |
| journey_id | Yes | A journey_id from POST /rail/search, exactly as received. | |
| max_total_usd | No | Optional ceiling: the quote is refused (409 over_budget) if the all-in total exceeds it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fx | No | When the merchant is not USD: ECB rate, conversion margin, merchant_usd. |
| product | No | What is being bought, as the merchant names it. |
| merchant | No | |
| offer_id | No | Pass it to POST /rail/intents or /shop/intents, exactly as received. Valid ~20 min (expires_at). |
| quantity | No | |
| requires | No | What the buy must provide (person, document, contact.phone…). |
| breakdown | No | What the merchant itself charges (items, shipping, tax), in merchant_currency. |
| expires_at | No | |
| fee_amount | No | BRIJ's fee, included in total_amount. |
| ship_country | No | The single country this order ships to, or for a multi-market store the market its product link named (a default the buyer may change within ship_countries). |
| total_amount | No | ALL-IN price in USDC: the escrow amount. |
| ship_countries | No | Instant quotes: the countries ship_to.country may be (ISO 3166 alpha-2). One entry for a store whose domain names its country (amazon.de); every euro-area country for a euro store whose domain names none (on.com); absent when the store's country is unknown, in which case the buyer names it. |
| total_currency | No | |
| shipping_method | No | |
| delivery_estimate | No | |
| merchant_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety story is covered structurally. The description genuinely adds behavioral context the annotations cannot convey: MCP calls are free but rate-limited, quotes expire in roughly 20 minutes, refusals cost nothing, and 202/409/422 each have defined meanings. However, the x402 pricing block ($0.25 USDC, HTTP body shape) is aimed at the HTTP API rather than this MCP tool and muddies rather than clarifies the cost model the agent actually faces.
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 operative guidance (free, rate-limited, journey_id source, retry, next step) is front-loaded and useful. But the middle section duplicates itself, naming journey_id's origin twice (brij_search_buses and POST /rail/search), and the "Paid x402 endpoint: $0.25 USDC. Body: ..." block describes a different transport than the one this tool uses, diluting focus for an MCP caller.
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?
An output schema exists, yet the description still names the key return fields (offer_id, breakdown, total_amount ALL-IN, requires [person], expires_at) so the agent knows what it must carry forward to brij_create_bus_intent. Retry semantics, error codes, expiry window, and prerequisite are all present, leaving nothing an agent needs to call this correctly unstated.
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 earns above baseline: it explains that omitting fare defaults to the cheapest, that the 422 options_required response enumerates on-sale fares under detail.options, and that max_total_usd produces a 409 over_budget refusal. These are behavioral consequences of parameters, not restatements of the schema text.
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 ("Quote a journey's exact all-in price at merchant checkout") and distinguishes the tool from its quote/search/intent siblings by naming journey_id's source (brij_search_buses) and the next step (brij_create_bus_intent). An agent can place this tool in the flow without opening any other 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?
Provides explicit flow guidance: take journey_id from brij_search_buses, hand off to brij_create_bus_intent, and retry with identical arguments after retry_after when the result is pending. It also states the escape hatch for 422 options_required (retry with fare). It stops short of explicitly excluding the train/hotel quote variants, but the bus-specific naming makes the routing unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_quote_hotelQuote a hotel rateARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Show the guest the total, what is due at the hotel and the cancellation terms. Then ask, explicitly and by name (not "contact details"): the full name of each guest as on their ID (lead first, one per room), the lead guest's email address, and their phone number with country code (e.g. +44 7400 123456). Next: brij_create_hotel_intent with offer_id.
Lock one hotel rate and get its exact all-in price
Paid x402 endpoint: $0.01 USDC. Body {rate_id} from POST /hotels/rates. Answer: the stay as it will be booked (hotel, address, room, board, check-in/out dates and times, party, cancellation timeline, price with tax, fees, our service fee and what is due at the hotel) and offer_id ("hotel:<quote_id>"): pass it to POST /hotels/intents. Show the guest the price, what is due at the hotel and the cancellation terms before creating the intent. Refusals are free.
| Name | Required | Description | Default |
|---|---|---|---|
| rate_id | Yes | rate_id from POST /hotels/rates, exactly as received. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rate | No | Board, refundability, cancellation_timeline, conditions. |
| room | No | |
| hotel | No | |
| party | No | |
| price | No | hotel_total (tax and fees included), service_fee, total_amount (ALL-IN, what the escrow holds), due_at_hotel_amount. |
| nights | No | |
| seller | No | |
| offer_id | No | Pass to POST /hotels/intents. |
| quote_id | No | |
| check_in_date | No | |
| check_out_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnly/idempotent/non-destructive, the description adds substantial context beyond them: MCP calls are free but rate-limited, the x402 price ($0.01 USDC) applies only to the HTTP API, refusals are free, and it enumerates the full return payload including the offer_id format 'hotel:<quote_id>'. The word 'lock' creates minor ambiguity about whether inventory is held since annotations say readOnly, but the quoting flow makes clear the actual booking happens in brij_create_hotel_intent.
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?
Core purpose and next-step routing are front-loaded, but the description is bloated by a long run-on sentence enumerating guest data to collect (guest ID names, email, phone with country code) that this tool does not accept as parameters and belongs to the intent step. The x402 pricing caveat is repeated in two places, and the second half restates return fields already implied earlier.
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?
Output schema and annotations carry the structural burden and the description still thoroughly explains what the agent will receive. It is nearly complete; the only unresolved point is whether 'lock' implies a hold on inventory or expires, which matters for how the agent should frame urgency to the guest.
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; the description adds value by embedding rate_id in the call chain (rates endpoint → quote → intent) and specifying the exact string form of the derived offer_id. It does not add format or validation details beyond 'exactly as received', which the schema already states.
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 ('Lock one hotel rate and get its exact all-in price') and disambiguates from its neighbors by naming the follow-on tool brij_create_hotel_intent and describing the returned offer_id. An agent can distinguish this from brij_get_hotel_rates and brij_create_hotel_intent 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?
Explicitly prescribes the next step ('Next: brij_create_hotel_intent with offer_id') and the prerequisite display step (show price, amount due at hotel, cancellation terms before creating the intent). The gap is that the upstream tool for obtaining rate_id is referenced only as the HTTP endpoint 'POST /hotels/rates' rather than the sibling tool brij_get_hotel_rates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_quote_productQuote a productARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). If the answer is pending, call again with the same arguments after retry_after.
Exact all-in price to buy one product on a merchant's website.
Paid x402 endpoint: $0.25 USDC — the merchant's cashier is read in a real browser session (product page → cart → checkout with your ZIP), so the quote carries the exact shipping and sales tax, not a product-page price.
Send the product page URL on a supported merchant, optional options (variant choices, e.g. {"Size":"M","Color":"Charcoal"}), a quantity (1-10) and ship_to {country: US, region: 2-letter state, postal_code}. The answer's offer_id (':q_') is valid ~20 min: pass it to POST /shop/intents, EXACTLY as received.
total_amount is ALL-IN (merchant total + the shop fee: 4 USDC + 3 % of the merchant total); breakdown shows what the merchant itself charges (items, shipping, tax), in merchant_currency — the merchant's own (USD, EUR, GBP or CHF). When it is not USD, fx says how it became USDC: the ECB reference rate (USD per unit), the margin_pct added for the conversion and rate moves, and merchant_usd; the merchant is paid in its own currency, you always pay USDC. Every refusal is free (never settled): 404 merchant_not_supported, 422 options_required (detail.options lists each option's values in stock — ask your user and retry with options), 409 item_unavailable, 409 over_budget (above your max_total_usd), 409 over_order_limit (merchant total above the per-order limit, 1000 USD today). 202 quote_pending means the cashier is still being read and nothing was charged: wait for Retry-After (15s) and send the SAME request again. Expect 30-60s on a cold quote.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | Variant choices, e.g. {"Size":"M","Color":"Charcoal"}. A 422 options_required lists the values in stock. | |
| ship_to | Yes | Where it ships: country, region (2-letter state in the US) and postal_code. The buy must use the same postcode. | |
| quantity | No | How many, 1-10 (default 1). | |
| product_url | Yes | The product page URL on a supported merchant. | |
| max_total_usd | No | Optional ceiling: the quote is refused (409 over_budget) if the all-in total exceeds it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fx | No | When the merchant is not USD: ECB rate, conversion margin, merchant_usd. |
| product | No | What is being bought, as the merchant names it. |
| merchant | No | |
| offer_id | No | Pass it to POST /rail/intents or /shop/intents, exactly as received. Valid ~20 min (expires_at). |
| quantity | No | |
| requires | No | What the buy must provide (person, document, contact.phone…). |
| breakdown | No | What the merchant itself charges (items, shipping, tax), in merchant_currency. |
| expires_at | No | |
| fee_amount | No | BRIJ's fee, included in total_amount. |
| ship_country | No | The single country this order ships to, or for a multi-market store the market its product link named (a default the buyer may change within ship_countries). |
| total_amount | No | ALL-IN price in USDC: the escrow amount. |
| ship_countries | No | Instant quotes: the countries ship_to.country may be (ISO 3166 alpha-2). One entry for a store whose domain names its country (amazon.de); every euro-area country for a euro store whose domain names none (on.com); absent when the store's country is unknown, in which case the buyer names it. |
| total_currency | No | |
| shipping_method | No | |
| delivery_estimate | No | |
| merchant_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: MCP calls are free but rate-limited (the $0.25 USDC x402 charge applies only to the HTTP API), a cold quote takes 30-60s, nothing is charged on 202, every refusal is free, and the returned offer_id is valid only ~20 minutes. That is exactly the operational context an agent needs and cannot infer from annotations.
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 content is dense and mostly earns its place, but it is badly front-loaded: the first paragraph is billing and retry mechanics while the actual purpose appears in paragraph two. The pending-retry instruction is also stated twice (once as 'retry_after', later as 'Retry-After (15s)'), wasting space and introducing naming inconsistency.
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 complex, open-world, browser-scraping quote tool this is nearly complete — pricing model, latency, error taxonomy, offer lifetime and fee/FX breakdown are all covered, and an output schema exists so return shapes needn't be spelled out. The remaining gap is that 'a supported merchant' is never resolvable (404 merchant_not_supported with no way to discover the supported list), and the next step is given as an HTTP path rather than the MCP sibling.
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 genuine meaning: `options` is tied to the 422 options_required flow that enumerates in-stock values, `quantity` is bounded 1-10, and `max_total_usd` is explained via the 409 over_budget refusal. It does not add anything for `ship_to` beyond the schema, and it omits the requirement that the later buy use the same postcode (that lives only in 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?
The second sentence states a precise verb+resource+scope: 'Exact all-in price to buy one product on a merchant's website,' which cleanly separates it from the quote_bus/quote_train siblings and from the create_*_intent tools. The verb 'quote' and the qualifier 'all-in' also distinguish it from a bare product-page price.
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 gives concrete when-to-retry rules (202 quote_pending → wait Retry-After 15s → resend the SAME request; 422 options_required → ask the user, then retry with `options`) and maps refusal codes to conditions. It never explicitly names a sibling as the follow-up step, though — it points at the HTTP endpoint 'POST /shop/intents' rather than brij_create_product_intent, which is a weaker hand-off for an agent operating purely over MCP.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_quote_trainQuote a train journeyARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). If the answer is pending, call again with the same arguments after retry_after.
Quote a journey's exact all-in price at merchant checkout.
Paid x402 endpoint: $0.25 USDC. Body: journey_id from POST /rail/search, optional fare (e.g. "Standard", "Flexible"), optional max_total_usd. Same answer as POST /shop/quote: offer_id to pass to POST /rail/intents, breakdown, total_amount ALL-IN, requires [person], expires_at (~20 min). 422 options_required lists the fares on sale (detail.options) — retry with fare. Refusals are free; 202 quote_pending means retry.
| Name | Required | Description | Default |
|---|---|---|---|
| fare | No | Optional fare to quote, when the journey offers several (e.g. a flexible fare); default: the cheapest. | |
| journey_id | Yes | A journey_id from POST /rail/search, exactly as received. | |
| max_total_usd | No | Optional ceiling: the quote is refused (409 over_budget) if the all-in total exceeds it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fx | No | When the merchant is not USD: ECB rate, conversion margin, merchant_usd. |
| product | No | What is being bought, as the merchant names it. |
| merchant | No | |
| offer_id | No | Pass it to POST /rail/intents or /shop/intents, exactly as received. Valid ~20 min (expires_at). |
| quantity | No | |
| requires | No | What the buy must provide (person, document, contact.phone…). |
| breakdown | No | What the merchant itself charges (items, shipping, tax), in merchant_currency. |
| expires_at | No | |
| fee_amount | No | BRIJ's fee, included in total_amount. |
| ship_country | No | The single country this order ships to, or for a multi-market store the market its product link named (a default the buyer may change within ship_countries). |
| total_amount | No | ALL-IN price in USDC: the escrow amount. |
| ship_countries | No | Instant quotes: the countries ship_to.country may be (ISO 3166 alpha-2). One entry for a store whose domain names its country (amazon.de); every euro-area country for a euro store whose domain names none (on.com); absent when the store's country is unknown, in which case the buyer names it. |
| total_currency | No | |
| shipping_method | No | |
| delivery_estimate | No | |
| merchant_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses cost model (free over MCP, rate-limited instead), retry semantics that match idempotentHint, quote expiry (~20 min), that refused quotes are free, and the concrete failure modes 422 options_required, 409 over_budget and 202 quote_pending. This is the kind of operational context an agent could not infer from structured fields.
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 content is dense and useful, but the front-loading is wrong: the first two sentences are pricing and retry boilerplate, and the actual purpose appears third. Packing server routes, dollar amounts and three error codes into flowing prose makes it harder to scan than a short structured list would be.
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 three-parameter, read-only quoting tool with an output schema, this covers nearly everything an agent needs: input provenance, output handoff to the intent step, retry and error paths. It slightly over-explains the return payload (offer_id, breakdown, total_amount) that the output schema already defines, and the MCP-vs-HTTP pricing sentence risks confusing rather than informing.
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 only marginal meaning over the schema, since the fare examples ('Standard', 'Flexible'), the 'default: cheapest' behavior, and the max_total_usd / 409 over_budget relationship are all already present in the parameter descriptions.
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 second sentence states a specific verb and resource: 'Quote a journey's exact all-in price at merchant checkout', and the surrounding flow (journey_id from POST /rail/search, offer_id to POST /rail/intents) makes clear it is the rail-pricing step. Sibling differentiation comes largely from the title ('train journey') rather than the body text, which spends its first sentence on pricing and retry meta before naming the action.
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 places the tool explicitly in a workflow chain: take journey_id from search, pass the resulting offer_id to POST /rail/intents, and it names POST /shop/quote as an equivalent alternative. Retry conditions are spelled out for each status (pending/retry_after, 202 quote_pending, 422 options_required with fare). What is missing is an explicit statement of when NOT to use it (e.g. that it does not reserve or book).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_request_bus_refundRequest a bus refundBInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Ask for a refund on a rail booking (manual review).
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/refund-requests (X-Customer-Support-Code, X-Passenger-Family-Name = lead traveller's family name).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Free-text explanation of why the refund is requested. | |
| contact | No | Optional reply-to channel (email, phone, etc.) the operator can use to follow up. | |
| intent_id | Yes | Id returned by POST /air/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. | |
| passenger_family_name | Yes | Family name of the passenger as captured at /book. Compared case-insensitively with leading/trailing whitespace trimmed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| intent_id | No | |
| requested_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=true, so safety is largely covered. The description adds genuinely useful behavior beyond that: MCP calls are free but rate-limited, and refunds undergo manual review rather than being immediate. It stops short of describing turnaround or outcome semantics, which would justify a 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?
The first sentence front-loads pricing that is explicitly irrelevant to MCP callers ('the x402 price quoted below applies to the HTTP API only'), which is wasted space for an agent using the MCP tool. Two of the three sentences are spent on billing/API-parity detail rather than the refund action.
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 an output schema present and 100% param coverage, the description does not need to describe return values. It supplies the key missing behavioral context (manual review, rate limits, auth-code header mapping), leaving mainly the 'rail' mislabel and lack of turnaround expectations as gaps.
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 all five parameters are already documented in the schema, including the case-insensitive family-name comparison and the optional contact field. The description only maps two parameters to their HTTP header equivalents (X-Customer-Support-Code, X-Passenger-Family-Name), which adds marginal value over the schema baseline.
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 ('Ask for a refund on a rail booking'), clearly distinguishing a refund-request operation from the sibling purchase/quote/intent tools and from the flight/train/product refund variants. However, it mislabels a bus refund as a 'rail booking', which is a factual slip that slightly undermines precision even though the tool name is unambiguous.
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?
No guidance on when to use this versus brij_request_train_refund or brij_request_flight_refund, nor on prerequisites (e.g., that intent_id and customer_support_code must first come from an intent-creation call). The 'manual review' note implies a workflow but does not state any selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_request_flight_refundRequest a flight refundAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Request a manual refund after the intent has been booked.
The intent id travels in the request body; the resource URL is static. Paid x402 endpoint. Send a valid PAYMENT-SIGNATURE header to record
the refund request. Without payment, the API returns 402 Payment Required.
Records a refund request for a booked intent. The on-chain escrow has
already been captured by the time the intent is booked, so refunds at
this stage are processed manually by an operator. This endpoint persists
the request and pages the operator on Telegram; the response is
202 Accepted and is not a guarantee of refund — eligibility and
any applicable carrier penalties are reviewed manually.
For pre-capture states (active), the booking_sync worker handles
refunds automatically; this endpoint returns 409 use_automatic_refund
for those.
The caller must include the X-Customer-Support-Code header matching
the code returned at intent creation.
For multi-passenger bookings, X-Passenger-Family-Name is the LEAD passenger's family name (position 0 of the /air/book list).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Free-text explanation of why the refund is requested. | |
| contact | No | Optional reply-to channel (email, phone, etc.) the operator can use to follow up. | |
| intent_id | Yes | Id returned by POST /air/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. | |
| passenger_family_name | Yes | Family name of the passenger as captured at /book. Compared case-insensitively with leading/trailing whitespace trimmed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| intent_id | No | |
| requested_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations, which only declare readOnly=false, destructive=false, idempotent=false and openWorld=true. The description discloses payment/auth mechanics (PAYMENT-SIGNATURE header, 402 without payment, rate limiting on MCP), the persisted-and-paged-operator side effect, the 202 Accepted response, an explicit warning that it is NOT a guarantee of refund, and the 409 behavior for active-state intents. That is exactly the operational 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?
Front-loads the free-MCP/paid-HTTP distinction and then proceeds in short, purposeful paragraphs; the refund-eligibility caveat and 409 rule are given their own lines. Slightly weakened by the initial pricing paragraph creating mild internal tension with the later 'Paid x402 endpoint' sentence, costing a point but not readability.
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?
An output schema exists, so return values needn't be spelled out, yet the description still explains the 202/402/409 responses and the manual-operator follow-up. Combined with prerequisites, auth headers and the multi-passenger rule, an agent has everything needed to call this correctly.
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 real meaning: it identifies customer_support_code as travelling in the X-Customer-Support-Code header and tied to intent creation, and clarifies that passenger_family_name is the LEAD passenger's family name at position 0 of the /air/book list for multi-passenger bookings. That resolves an ambiguity the schema alone does not.
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 ('Request a manual refund after the intent has been booked') and immediately scopes it as manual post-capture processing, which separates it from the automatic refund path and from the train/product refund siblings. An agent can identify the operation 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?
Explicit preconditions ('after the intent has been booked') and an explicit when-not with the alternative ('For pre-capture states (active), the booking_sync worker handles refunds automatically; this endpoint returns 409 use_automatic_refund'). It also names the required X-Customer-Support-Code header precondition. Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_request_product_refundRequest a product refundAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Ask for a refund on a purchase (manual review).
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/refund-requests (headers X-Customer-Support-Code and X-Passenger-Family-Name — the recipient's surname). Use it for a parcel that never arrived after its delivery estimate.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Free-text explanation of why the refund is requested. | |
| contact | No | Optional reply-to channel (email, phone, etc.) the operator can use to follow up. | |
| intent_id | Yes | Id returned by POST /air/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. | |
| passenger_family_name | Yes | Family name of the passenger as captured at /book. Compared case-insensitively with leading/trailing whitespace trimmed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| intent_id | No | |
| requested_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, open-world, non-idempotent, non-destructive behavior, so the bar is lower. The description adds real value beyond them: MCP calls are rate-limited rather than charged, the operation goes through manual review, and it is behaviorally identical to POST /air/refund-requests with specific auth headers.
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 instruction is front-loaded, but the pricing/rate-limit aside and the HTTP-endpoint equivalence consume several sentences that are only loosely relevant to invoking the MCP tool, diluting the description's focus.
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?
An output schema exists so return values need not be explained. Given a 5-param mutation with full schema coverage, the description covers cost model, review process, auth prerequisites, and usage trigger, leaving little an agent would need beyond what is present.
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 five parameters, including the case-insensitive surname comparison. The description only adds that customer_support_code and passenger_family_name correspond to HTTP headers, which is marginal value over 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+resource: 'Ask for a refund on a purchase (manual review).' The 'product' framing in the name/title implicitly separates it from brij_request_flight_refund and brij_request_train_refund, but the description never explicitly names those siblings for contrast, so it stays at 4.
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?
'Use it for a parcel that never arrived after its delivery estimate' gives one concrete trigger condition and notes manual review, but there is no explicit when-not guidance and no routing to alternatives such as brij_request_flight_refund for non-parcel cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_request_train_refundRequest a train refundAInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead).
Ask for a refund on a rail booking (manual review).
Paid x402 endpoint: $0.10 USDC. Identical to POST /air/refund-requests (X-Customer-Support-Code, X-Passenger-Family-Name = lead traveller's family name).
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Free-text explanation of why the refund is requested. | |
| contact | No | Optional reply-to channel (email, phone, etc.) the operator can use to follow up. | |
| intent_id | Yes | Id returned by POST /air/intents. | |
| customer_support_code | Yes | The customer_support_code returned when the intent was created. | |
| passenger_family_name | Yes | Family name of the passenger as captured at /book. Compared case-insensitively with leading/trailing whitespace trimmed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| intent_id | No | |
| requested_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations declaring readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, the description adds genuinely new context: the request goes through manual review, MCP calls are rate-limited rather than priced, and specific auth headers are required. It does not, however, say whether a refund request can be withdrawn or how long review takes.
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 description opens with pricing/billing framing ('Free over MCP... x402 price quoted below') rather than the action, so the front-loaded content is the least decision-relevant part. The body is short and the endpoint equivalence line is compact, so waste is limited but structure is suboptimal.
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?
An output schema exists so return values need not be explained, and the description covers the key behavioral facts an agent needs (manual review, rate limiting, auth headers). It is slightly incomplete on what the request lifecycle looks like after submission, but overall adequate for a 4-required-parameter mutation.
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 all five parameters are already documented in the schema. The description only restates the support-code and family-name inputs in HTTP-header form, adding no new meaning about formats, constraints, or relationships.
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 sentence 'Ask for a refund on a rail booking (manual review)' gives a specific verb, resource, and processing mode, and the rail qualifier cleanly separates it from brij_request_flight_refund and brij_request_product_refund in the sibling list. An agent can identify the tool's job 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?
There is no statement of when to use this tool versus its flight/product refund siblings, nor any prerequisite guidance (e.g. that an intent must first exist). The reference to the equivalent HTTP endpoint and required headers is endpoint trivia, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_search_busesSearch busesBRead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Long-distance buses (Flixbus) — trains are brij_search_trains. A journey's summary.mode is "bus", or "bus+train" when a leg is a train. If the answer is search_pending, call again with the same arguments after retry_after (a repeat costs nothing). Next: brij_quote_bus with the journey_id.
Search trains, or long-distance buses with mode=bus.
Paid x402 endpoint: $0.25 USDC — each rail merchant is searched in a real browser session. Body: origin and destination as station or city names ("Paris", "London St Pancras"), depart_date (YYYY-MM-DD), optional depart_after (HH:MM local), adults (1-9, default 1), optional mode ("train", default, or "bus" for long-distance buses). Answer: journeys[] cheapest first, each with journey_id (send it back EXACTLY to POST /rail/quote), title, summary (times, stations, changes), price_from (merchant price, in merchant_currency: USD, EUR, GBP or CHF) and total_from (ALL-IN, USDC: converted at the ECB rate + a conversion margin when the merchant is not USD, + 4 USDC + 3 %). 202 search_pending: nothing charged, retry the same request after Retry-After. Refusals are free.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Adult travellers, 1-9 (default 1). The buy must name exactly this many. | |
| origin | Yes | Departure station or city, as a person would type it ("Paris", "London St Pancras"). | |
| depart_date | Yes | Travel date, YYYY-MM-DD. | |
| destination | Yes | Arrival station or city, as a person would type it. | |
| depart_after | No | Optional earliest departure time, HH:MM local. |
Output Schema
| Name | Required | Description |
|---|---|---|
| adults | No | Travellers searched; the buy names exactly this many. |
| journeys | No | Journeys, cheapest first. |
| above_limit | No | Journeys hidden because their total is above the per-order limit. |
| order_limit | No | The per-order limit, USDC. |
| pending_merchants | No | Merchants still searching (retry the same request). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnly/idempotent/openWorld/non-destructive) are consistent, and the description adds real context beyond them: MCP calls are free but rate-limited, the x402 price applies to the HTTP API only, a repeated search_pending retry costs nothing, and refusals are free. It does not clarify why 'rail merchant' language appears in a bus tool, but behavioral disclosure is otherwise strong.
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 text is long and poorly front-loaded, opening with pricing/rate-limit caveats rather than what the tool does. It carries HTTP-API-specific details (POST /rail/quote, x402 pricing) and a duplicated 'Search trains, or long-distance buses with mode=bus' line that reads like leftover content from another tool and does not belong here.
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 an output schema present and full annotation coverage, the description goes beyond requirements by describing the journeys[] shape, price_from vs total_from semantics, and the 202 pending flow. It is broadly complete, though the phantom 'mode' parameter and the train-boundary ambiguity leave small gaps.
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 schema already documents all five parameters; the description largely repeats them (origin/destination as station or city names, depart_date format, adults 1-9). It also references an optional 'mode' parameter that does not exist in the input schema, which adds confusion rather than meaning. 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 opening line clearly scopes it to long-distance buses (Flixbus) and distinguishes from brij_search_trains, which is good. But a later fragment — 'Search trains, or long-distance buses with mode=bus' — and repeated 'rail merchant' language muddy whether this tool also searches trains, leaving the tool's boundary ambiguous. The core purpose is legible but not cleanly stated.
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 explicitly names the alternative (brij_search_trains), gives the follow-up step (brij_quote_bus with the journey_id), and explains the retry path for a search_pending answer ('call again with the same arguments after retry_after'). There is no explicit when-not-to-use beyond the sibling mention, keeping it short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_search_flightsSearch flightsARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Prices are all-in (fees included). If the answer says the search is still enriching, call brij_get_flight_search_updates with its search_id.
Search live flight offers.
Flight search can be paid with x402 or sponsored by the BRIJ gateway.
For direct x402 clients, send a valid PAYMENT-SIGNATURE header. Without
payment, the API returns 402 Payment Required carrying the current price.
For BRIJ Wallet preview calls, the gateway may send X-BRIJ-SPONSORED-*
headers. Providers should treat that as a BRIJ-sponsored preview, not as a
user-paid x402 settlement.
Every price in the response is the price a buyer pays: total_amount / total_amount_decimal (offers, fare_options, highlights) are all-in, and max_price filters on that figure. POST /air/intents asks exactly this amount as expected_escrow_amount (a wallet enrolled in a fee-waiving cohort is asked less, never more).
Base x402 price is 0.10 USDC. The price is multiplied (up to 50×) by the
current search load: completed searches in the last 60 seconds and
any upstream rate-limit response in the last 5 minutes. Always read
the latest PAYMENT-REQUIRED challenge before signing - the price
your client saw a moment ago may already be stale.
The same flight commonly appears several times at different prices: each offer is one fare (fare_brand_name, baggage, change/refund conditions) sold by one seller (owner_name). Two offers on the same flight can share identical conditions and differ only in seller and price — compare the fare fields, never assume cheaper means more restrictive.
Data boundaries — what this response does and does not contain. Each offer carries EVERYTHING the flight inventory provider discloses at search time: itinerary (legs, times with IANA timezones, durations, aircraft, terminals, technical stops), identity (comparison_key, both carriers on codeshares, flight numbers, fare_basis_code), fare content (brand, cabin, included baggage, change/refund conditions with penalties), price breakdown (base + tax), CO2 estimate, and loyalty programmes. To drill into ONE offer — fresh price/expiry and paid-ancillary prices — use POST /air/offer-details. Filters (max_stops, departure_after/before, max_price) apply before sort, grouping and limit — so limit + sort=duration + max_stops=0 means "the fastest directs". Offers default to cheapest first; a full response can exceed 300 KB, so LLM-driven agents should send cheapest_per_itinerary=true with a limit and drill into finalists.
Not available in SEARCH results (use POST /air/offer-details per offer):
Prices of paid ancillaries (extra checked bags and other extras).
Seat maps and specific seat availability.
Full legal fare-rule text. It does not exist upstream in machine form: the structured conditions object IS the complete machine-readable ruleset. For airline-side research, fare_basis_code plus the marketing carrier identifies the exact fare.
Everywhere in this response, null/empty means the airline did not disclose the value — unknown, never zero or false.
Anti-pattern — truncation without grouping. cheapest_per_itinerary=false combined with a small limit returns the N cheapest fare INSTANCES, not the N cheapest itineraries. Basic/Lite fares are always cheaper than Comfort/Flex/refundable/business variants of the SAME flight, so the pricier variants sort to the tail and fall off — and their absence from a truncated response proves nothing. To answer "is there a refundable / with-bag / higher-cabin fare?", always use cheapest_per_itinerary=true and read fare_options; it is lossless on price, brand, refund/change conditions and checked bags.
Progressive results. The response may carry status: enriching plus a search_id: slower, cheaper fulfiller tiers are still quoting. Poll the free POST /air/search-updates with that search_id (every ~poll_after_ms) to receive their offers as they land, until status: complete — usually under 2 minutes. Do not choose an offer before then: the slower tiers often carry airlines the fast tier does not (other carriers' nonstops, notably) and cheaper fares. While enriching, the response also says this in words, in next.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ordering, ascending only. Default price. duration = fastest first, departure = earliest local departure first, emissions = lowest CO2 first (unknown values sort last). nonstop_first = every nonstop itinerary (price-ascending) before any connection — with a limit, directs survive the cut. | |
| limit | No | Optional. Cap the number of offers returned; 0 or absent returns every match. Offers are sorted per `sort` (cheapest first by default), so a limit keeps the best ones under that order. ONE EXCEPTION, and it is why the array can hold limit+1 rows: when the cut would have dropped the cheapest NONSTOP, that offer is appended as the last row, so a page never hides that a direct exists even from a caller that reads no other field. It is appended, never inserted at its price rank — the first `limit` rows are still the `limit` best under your sort, and offers[0] is still the cheapest. `highlights` names it too. | |
| adults | No | Adult passengers, 1 to 9 (the airline maximum per booking). The offer is priced for this many travellers, and /air/book must later supply exactly this many passengers. | |
| max_price | No | Decimal cap on total_amount in the offer currency, e.g. "250.00". | |
| max_stops | No | Maximum plane changes PER DIRECTION: 0 keeps directs only (a round trip qualifies only if both legs are direct). Absent = any. Technical stops without a plane change do not count. | |
| cabin_class | No | Optional, defaults to economy. | |
| depart_date | Yes | Outbound date, YYYY-MM-DD. | |
| origin_iata | Yes | Departure airport or city IATA code, 3 letters (e.g. MAD). | |
| return_date | No | Optional. Adds the inbound slice (destination back to origin on this date). Round-trip offers cover both directions and are booked in ONE /air/book — the escrow amount is the round-trip total. | |
| departure_after | No | Outbound departs at or after this time, LOCAL to the departure airport, HH:MM. | |
| departure_before | No | Outbound departs at or before this time, local HH:MM. Combine with departure_after for a window: afternoon = after 12:00, before 18:00. | |
| destination_iata | Yes | Arrival airport or city IATA code, 3 letters (e.g. LIS). | |
| cheapest_per_itinerary | No | Optional. Return only the cheapest fare of each physical itinerary (comparison_key); the folded fares stay visible in each offer's fare_options (offer_id, brand, price, refundable, changeable, checked bags), so refundability questions are answerable from the grouped data itself. Recommended for LLM-driven agents together with limit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| search | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive, open-world), yet the description adds substantial behavioral context beyond them: the MCP-is-free-vs-x402-HTTP pricing model, load-multiplied price dynamics and stale-challenge warnings, progressive 'enriching' status with polling cadence, null/empty meaning 'undisclosed' rather than zero, and the ~300 KB payload warning. These are genuine operational traits not derivable from structured fields.
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 definition is extremely long and not front-loaded: the actual purpose appears after payment mechanics, and x402/sponsorship pricing is restated across multiple paragraphs that are largely irrelevant to the MCP caller ('Free over MCP'). Much of the response-shape discussion is redundant with the existing output schema, so many sentences do not earn their place.
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 13-parameter, high-complexity tool with an output schema present, the description is more than sufficiently complete — it covers progressive enrichment, grouping semantics, truncation pitfalls, and data boundaries. If anything it over-delivers on return-content detail that the output schema already carries, rather than leaving gaps.
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 schema already documents sort, limit, max_stops, cabin_class, etc. The description nonetheless adds real semantic value beyond the schema — the filter-before-sort/group/limit ordering, the 'fastest directs' combination, and the rationale for the cheapest_per_itinerary anti-pattern — which lifts it above baseline.
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 definition states a specific verb+resource ('Search live flight offers') and differentiates from siblings by routing to brij_get_flight_search_updates for enriching results and POST /air/offer-details for single-offer drill-down. However, the purpose statement is buried mid-paragraph behind several sentences of x402 pricing and rate-limit text, so an agent must read well past the opening to learn what the tool does.
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 explicitly names alternatives and the conditions that select them: poll brij_get_flight_search_updates while status=enriching, use offer-details for ancillaries/seat maps/fare rules, and use cheapest_per_itinerary=true when answering refundable/bag/cabin questions. There is no explicit 'do not use when' clause, but the routing guidance is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_search_hotelsSearch hotelsARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Prices are for the whole stay; total_from is all-in (fees included), due_at_hotel_from is paid at the hotel on top. Next: brij_get_hotel_rates with a hotel_id.
Search hotels for dates and a party in one city
Paid x402 endpoint: $0.10 USDC. Body: a place (city_id from GET /hotels/places, or one hotel by accommodation_id from its hotels[], or location as a city name, or latitude + longitude with radius_km), check_in_date and check_out_date (YYYY-MM-DD, up to 30 nights), rooms (1-4, default 1), adults (1-8, default 1), child_ages, free_cancellation_only, stars (e.g. [4, 5]), sort (price | price_desc). Answer: hotels[] cheapest first, each with hotel_id (send it to POST /hotels/rates), name, rating, address, price_from (the hotel's total for the whole stay), total_from (ALL-IN, USDC: + 5 USDC + 2 %, capped at 30) and due_at_hotel_from (paid at the hotel, on top: city tax, resort fees). Refusals are free.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order by the all-in total: price (default, cheapest first) or price_desc. Applied before the 50-hotel cap. | |
| rooms | No | Rooms, default 1. | |
| stars | No | Keep hotels with one of these star ratings, e.g. [4, 5]. Unrated hotels are left out when set. | |
| adults | No | Adults in total, default 1. | |
| city_id | No | A city_id from GET /hotels/places. | |
| latitude | No | Latitude of the place, with longitude, instead of a city. | |
| location | No | A city name, when no city_id or coordinates are sent. | |
| longitude | No | Longitude of the place. | |
| radius_km | No | Around the coordinates, default 10. | |
| child_ages | No | One age per child, up to 4. | |
| check_in_date | Yes | Check-in day, YYYY-MM-DD. | |
| check_out_date | Yes | Check-out day, YYYY-MM-DD, at most 30 nights later. | |
| accommodation_id | No | Search ONE hotel: an accommodation_id from GET /hotels/places (hotels[]), instead of a place. | |
| free_cancellation_only | No | Only hotels with a free-cancellation rate. |
Output Schema
| Name | Required | Description |
|---|---|---|
| party | No | rooms, adults, children. |
| place | No | The place searched. |
| hotels | No | Cheapest first: hotel_id, name, rating, review_score, address, distance_km, price_from, total_from (ALL-IN), due_at_hotel_from, currency. |
| nights | No | |
| check_in_date | No | |
| check_out_date | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that MCP calls are free but rate-limited (the $0.10 x402 price applies only to the HTTP API), that refusals are free, and that a 5 USDC + 2% (capped at 30) conversion markup is folded into total_from. That is meaningful pricing and limits context the annotations do not carry. It omits pagination/result-cap behavior in prose (the 50-hotel cap appears only 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?
The core purpose sentence is buried third, behind a pricing caveat and a forward reference to the next tool. A chunk of the text describes the paid HTTP API body format, which is only partly relevant to an MCP caller. The content is useful overall but not front-loaded or trimmed.
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 14-parameter search tool with annotations and an output schema, the description covers addressing modes, date constraints, pricing semantics, and the natural next step. It explains return semantics (hotels[], price_from vs total_from vs due_at_hotel_from) even though an output schema exists. Minor gap: the 50-hotel result cap is not surfaced in the description.
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 14 parameters well. The description's parameter prose (rooms 1-4, adults 1-8, child_ages, free_cancellation_only, stars, sort, 30-night max) largely restates the schema rather than adding new meaning. 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?
"Search hotels for dates and a party in one city" gives a specific verb, resource, and scope, and the description names the follow-up tool (brij_get_hotel_rates with a hotel_id). It is distinguishable from brij_find_hotel_places by referencing city_id/accommodation_id as inputs, though the boundary between the two is implied rather than stated.
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?
Clear routing context: resolve places first via GET /hotels/places, then call this tool, then pass hotel_id to brij_get_hotel_rates. It also lays out alternative addressing modes (city_id, accommodation_id, location name, or lat/long + radius). It does not explicitly say when NOT to use this versus brij_find_hotel_places, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brij_search_trainsSearch trainsARead-onlyIdempotentInspect
Free over MCP (the x402 price quoted below applies to the HTTP API only; MCP calls are rate-limited instead). Trains only — long-distance buses are brij_search_buses. If the answer is search_pending, call again with the same arguments after retry_after (a repeat costs nothing).
Search trains, or long-distance buses with mode=bus.
Paid x402 endpoint: $0.25 USDC — each rail merchant is searched in a real browser session. Body: origin and destination as station or city names ("Paris", "London St Pancras"), depart_date (YYYY-MM-DD), optional depart_after (HH:MM local), adults (1-9, default 1), optional mode ("train", default, or "bus" for long-distance buses). Answer: journeys[] cheapest first, each with journey_id (send it back EXACTLY to POST /rail/quote), title, summary (times, stations, changes), price_from (merchant price, in merchant_currency: USD, EUR, GBP or CHF) and total_from (ALL-IN, USDC: converted at the ECB rate + a conversion margin when the merchant is not USD, + 4 USDC + 3 %). 202 search_pending: nothing charged, retry the same request after Retry-After. Refusals are free.
| Name | Required | Description | Default |
|---|---|---|---|
| adults | No | Adult travellers, 1-9 (default 1). The buy must name exactly this many. | |
| origin | Yes | Departure station or city, as a person would type it ("Paris", "London St Pancras"). | |
| depart_date | Yes | Travel date, YYYY-MM-DD. | |
| destination | Yes | Arrival station or city, as a person would type it. | |
| depart_after | No | Optional earliest departure time, HH:MM local. |
Output Schema
| Name | Required | Description |
|---|---|---|
| adults | No | Travellers searched; the buy names exactly this many. |
| journeys | No | Journeys, cheapest first. |
| above_limit | No | Journeys hidden because their total is above the per-order limit. |
| order_limit | No | The per-order limit, USDC. |
| pending_merchants | No | Merchants still searching (retry the same request). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), and the description layers on genuinely new behavior: pricing ($0.25 USDC on HTTP), that MCP calls are rate-limited rather than charged, that a 202 search_pending costs nothing and a repeat is free, and that refusals are free. This is exactly the kind of operational 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 cost/retry information is front-loaded well, but the bus scope is stated twice in conflicting ways ('Trains only — long-distance buses are brij_search_buses' vs 'or long-distance buses with mode=bus'), and the pricing/margin parenthetical is dense. Every sentence is informative, but the internal tension costs it.
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 search tool with an output schema already defined, the description still supplies the operational envelope an agent needs: cost, free-vs-rate-limited path, pending/retry semantics, and how to carry journey_id forward. Nothing required to invoke it correctly 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, and the description adds real meaning beyond it: price_from is merchant currency while total_from is all-in USDC (ECB conversion + margin + 4 USDC + 3%), and journey_id must be echoed exactly to POST /rail/quote. It loses a point for referencing a mode=bus parameter that does not exist in the input schema, which could mislead the agent.
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+resource ('Search trains') and explicitly distinguishes from the sibling it could be confused with: 'long-distance buses are brij_search_buses.' An agent can route correctly without opening either schema. The one blemish is the later 'or long-distance buses with mode=bus', which muddies the clean scope statement, but the primary purpose is unambiguous.
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?
Names the alternative (brij_search_buses) and the condition that selects it, plus a concrete retry protocol for the search_pending case ('call again with the same arguments after retry_after'). It also states the cost model (free over MCP, rate-limited) so the agent knows when to prefer this over the paid HTTP path.
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 tool update
- Changed
brij_book_hotel2 fields changed- changed
Input schema / properties / email / descriptionPrevious value: -"The lead guest's email: the confirmation goes there."New value: +"The lead guest's email address: the confirmation goes there. Ask the guest for it by name (\"your email address\"), never as \"contact details\"." - changed
Input schema / properties / phone_number / descriptionPrevious value: -"The lead guest's phone, E.164."New value: +"The lead guest's mobile number WITH its country code, E.164 (e.g. +447400123456). Ask the guest for it by name (\"your phone number, with country code\"): the hotel calls it."
2 tool updates
- Changed
brij_find_hotel_places1 field changed- added
Output schema / properties / hotelsAdded value: +{ + "description": "Hotels whose name matches q: accommodation_id, name, address, city, country." +}
- Changed
brij_search_hotels1 field changed- added
Input schema / properties / accommodation_idAdded value: +{ + "description": "Search ONE hotel: an accommodation_id from GET /hotels/places (hotels[]), instead of a place.", + "type": "string" +}
8 tool updates
- Added
brij_book_hotel - Added
brij_cancel_hotel - Added
brij_create_hotel_intent - Added
brij_find_hotel_places - Added
brij_get_hotel_order - Added
brij_get_hotel_rates - Added
brij_quote_hotel - Added
brij_search_hotels
3 tool updates
- Changed
brij_quote_bus2 fields changed- added
Output schema / properties / ship_countriesAdded value: +{ + "description": "Instant quotes: the countries ship_to.country may be (ISO 3166 alpha-2). One entry for a store whose domain names its country (amazon.de); every euro-area country for a euro store whose domain names none (on.com); absent when the store's country is unknown, in which case the buyer names it." +} - changed
Output schema / properties / ship_country / descriptionPrevious value: -"The only country this order may ship to."New value: +"The single country this order ships to, or for a multi-market store the market its product link named (a default the buyer may change within ship_countries)."
- Changed
brij_quote_product2 fields changed- added
Output schema / properties / ship_countriesAdded value: +{ + "description": "Instant quotes: the countries ship_to.country may be (ISO 3166 alpha-2). One entry for a store whose domain names its country (amazon.de); every euro-area country for a euro store whose domain names none (on.com); absent when the store's country is unknown, in which case the buyer names it." +} - changed
Output schema / properties / ship_country / descriptionPrevious value: -"The only country this order may ship to."New value: +"The single country this order ships to, or for a multi-market store the market its product link named (a default the buyer may change within ship_countries)."
- Changed
brij_quote_train2 fields changed- added
Output schema / properties / ship_countriesAdded value: +{ + "description": "Instant quotes: the countries ship_to.country may be (ISO 3166 alpha-2). One entry for a store whose domain names its country (amazon.de); every euro-area country for a euro store whose domain names none (on.com); absent when the store's country is unknown, in which case the buyer names it." +} - changed
Output schema / properties / ship_country / descriptionPrevious value: -"The only country this order may ship to."New value: +"The single country this order ships to, or for a multi-market store the market its product link named (a default the buyer may change within ship_countries)."
2 tool updates
- Changed
brij_buy_bus1 field changed- changed
Input schema / properties / passengers / items / properties / gender / descriptionPrevious value: -"F or M. Send it for buses in Türkiye (Kamil Koç, sold by Flixbus): seats there are assigned by gender, and a buy without it fails before payment and is refunded. Optional elsewhere."New value: +"F or M. Send it for buses in Türkiye (Kamil Koç, sold by Flixbus) and India (FlixBus India): seats there are assigned by gender, and a buy without it fails before payment and is refunded. Optional elsewhere."
- Changed
brij_buy_train1 field changed- changed
Input schema / properties / passengers / items / properties / gender / descriptionPrevious value: -"F or M. Send it for buses in Türkiye (Kamil Koç, sold by Flixbus): seats there are assigned by gender, and a buy without it fails before payment and is refunded. Optional elsewhere."New value: +"F or M. Send it for buses in Türkiye (Kamil Koç, sold by Flixbus) and India (FlixBus India): seats there are assigned by gender, and a buy without it fails before payment and is refunded. Optional elsewhere."
2 tool updates
- Changed
brij_buy_bus1 field changed- added
Input schema / properties / passengers / items / properties / citizenshipAdded value: +{ + "description": "The traveller's nationality, ISO 3166 two-letter code. Required, with document_number (passport, or the 11-digit Turkish ID for a Turkish citizen), for buses in Türkiye (Kamil Koç): their quote's requires lists document. Optional elsewhere.", + "type": "string" +}
- Changed
brij_buy_train1 field changed- added
Input schema / properties / passengers / items / properties / citizenshipAdded value: +{ + "description": "The traveller's nationality, ISO 3166 two-letter code. Required, with document_number (passport, or the 11-digit Turkish ID for a Turkish citizen), for buses in Türkiye (Kamil Koç): their quote's requires lists document. Optional elsewhere.", + "type": "string" +}
2 tool updates
- Changed
brij_buy_bus1 field changed- added
Input schema / properties / passengers / items / properties / genderAdded value: +{ + "description": "F or M. Send it for buses in Türkiye (Kamil Koç, sold by Flixbus): seats there are assigned by gender, and a buy without it fails before payment and is refunded. Optional elsewhere.", + "enum": [ + "F", + "M" + ], + "type": "string" +}
- Changed
brij_buy_train1 field changed- added
Input schema / properties / passengers / items / properties / genderAdded value: +{ + "description": "F or M. Send it for buses in Türkiye (Kamil Koç, sold by Flixbus): seats there are assigned by gender, and a buy without it fails before payment and is refunded. Optional elsewhere.", + "enum": [ + "F", + "M" + ], + "type": "string" +}
6 tool updates
- Added
brij_buy_bus - Added
brij_create_bus_intent - Added
brij_get_bus_order - Added
brij_quote_bus - Added
brij_request_bus_refund - Added
brij_search_buses
20 tool updates
- First observed
brij_book_flight - First observed
brij_buy_product - First observed
brij_buy_train - First observed
brij_create_flight_intent - First observed
brij_create_product_intent - First observed
brij_create_train_intent - First observed
brij_get_flight_offer_details - First observed
brij_get_flight_order - First observed
brij_get_flight_search_updates - First observed
brij_get_intent - First observed
brij_get_product_order - First observed
brij_get_train_order - First observed
brij_list_airlines - First observed
brij_quote_product - First observed
brij_quote_train - First observed
brij_request_flight_refund - First observed
brij_request_product_refund - First observed
brij_request_train_refund - First observed
brij_search_flights - First observed
brij_search_trains
Publisher details
- Operator
- BRIJ Digital, Inc.
- Operator website
- https://brij.fi
- Vendor relationship
- First-party
- Documentation
- Unknown
- Trust center
- Not applicable
- Restrictions
- Unknown
Related MCP Connectors
Web search, page reading, HTML to PDF, file upload and flight search for AI agents, paid in USDC.
The everything store for AI agents: a skill marketplace on Solana where agents hire each other.
Travel & commerce intelligence for AI agents: search, book & price-track hotels, events, retail.
Personal AI travel agent. Points optimization, live flight/hotel/award search, trip planning.
Related MCP Servers
AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search, price-track, and book flights across ~300 airlines, with traveler profiles, preferences, and email fare-drop alerts.82MIT- AlicenseCqualityDmaintenanceEnables AI agents to interact with cryptocurrency ecosystems through wallet management, trading operations (swaps, DCA, limit orders), staking, and multi-chain support starting with Solana.37GPL 3.0
- AlicenseAqualityCmaintenanceEnables AI agents to discover, inspect, and pay for paid HTTP and MCP services using USDC on Solana with a self-custodial wallet.4116 npm9Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables agents to discover and pay for AI services per call via USDC on Solana, supporting marketplace search, listing details, on-chain reputation, wallet info, and paid calls.2 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.