Skip to main content
Glama

assess_trip

Read-onlyIdempotent

Assess one trip: current disruption status for its destinations and dates.

Use this tool when the user asks whether a specific trip is affected by
strikes, weather, transport disruptions or other travel risks.
Give the destinations and the travel window (date_from/date_to,
YYYY-MM-DD). Destinations are the EU-27 ISO2 codes (Greece = "EL") PLUS the
non-EU27 countries we actively monitor: Norway ("NO", rail via Entur, live),
the United Kingdom ("UK" or "GB", transit via TfL, live), and Switzerland
("CH", rail via SBB — key-pending, so it is reported as a declared blind
spot until the feed is keyed, never a false all-clear). A code we do not
monitor is rejected with {"error": "unknown_country"} rather than silently
all-cleared. Returns a Decision-Support answer, not raw data:
  * travel_status: NORMAL | MINOR_DISRUPTION | MAJOR_DISRUPTION;
  * actionable_lines: per-event DECISION-IMPACT guidance — what the
    disruption means for THIS trip and what to do (e.g. "affects regional
    trains, not airports -> take a road airport transfer, leave ~30 min
    earlier"), or a clearly-labelled "nothing material" line when calm;
  * confidence: a LABELLED model output (coverage/corroboration/recency/
    blind-spots blend, not a probability) — read its caveats;
  * sources_checked: proof of what was monitored (sources_ok, blind spots);
  * events + caveats.
Sub-floor noise (a deep, far-field seismic blip) is omitted; calm is a
monitoring result for the window, never an invented forecast. Invalid
inputs return an explicit {"error": ...}; nothing is fabricated.

Top-level MCP-facing structure (additive; existing fields preserved):
  * presentation: a three-section block — affects_your_trip[] (each
    item with verified_sources[] as display-ready names, source_count,
    corroborated flag (≥2 distinct sources), an honest for_you line
    bound to destinations+dates only, report_url, first_detected_at,
    last_verified_at); doesnt_affect_your_trip (the proof-of-work
    pile — shown[] of {headline, reason_excluded}, additional_checked_count,
    summary_line, total_checked); next_steps[] (deterministic — re-check
    date, aviation-handoff watch when blind spot, per-active monitor URLs);
  * track_record_ref: lean {window_days, flagged, ended, still_active,
    monitoring_since, url} — numbers + URL only, no narrative;
  * suggested_next_call: {tool, context} — the suggested follow-up
    (watch_trip) when the user wants continued monitoring.
These exist so an LLM consumer can quote verbatim — every fact is
traceable to a named source or an input field, never invented.

Destinations also accept natural input: IATA airport codes (e.g. 'TSR',
'AMS', 'ZRH') and major city names (e.g. 'Timișoara', 'Amsterdam',
'Zürich', 'London'), resolved deterministically to a monitored country
code. The response includes a 'resolved' list ([{input, country, kind}])
disclosing how each token was mapped (e.g. 'TSR -> RO via iata-airport').
A token that resolves to a country we do not monitor is rejected with
{'error': 'unknown_country'}; a token we cannot resolve at all is rejected
with {'error': 'unknown_destination', 'tokens': [...]} — we reject rather
than guess.

Pass `lang` (e.g. "de", "ro", "pl", "fr", "es", "it"; default English) to
answer in the traveller's language — useful for a traveller
in a country whose language they do not speak. The response then carries a
`localized` block with the status sentence, an honest reassurance line
(calm ONLY when status is NORMAL), the decision-impact lines, AND — never
dropped — the localized caveats + blind_spots. Source-derived free text the
traveller cannot read (an event headline in the source language) is
AI-translated via Gemini and carries the label "AI-translated — verify
against the linked official source"; when no GEMINI_API_KEY is set or a
translation fails, the original source text is kept with an honest note —
never a fake translation. Our own wording falls back to English (flagged in
`localized.fallback_lang_parts`) when no template exists for `lang`; an
unknown `lang` answers in English and says so (`is_known_lang=false`).
Localization NEVER becomes a false all-clear and the aviation handoff is a
SIGNPOST that DISCLOSES the blind spot, not coverage.

Pass `audience` for role-specific operational actions (B2B travel-risk /
duty-of-care): one of "tmc" (travel management company / corporate travel
risk), "hotel", "ota", "tour_operator". The response then carries a
`persona` block: {audience, actions[]} where each action ties an affecting
event to that role's recommended steps (e.g. TMC: flexible-rebooking policy,
reroute inventory, proactive guest comms) — a PURE PROJECTION of the
audience-tagged recommendations already computed per event, each carrying a
`based_on` disclosure of the inputs it used. An unknown audience is reported
honestly with the valid set, never guessed. Omit `audience` for the default
(no persona block).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
langNo
date_toYes
audienceNo
date_fromYes
destinationsYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnly, idempotent), the description discloses error behavior ('Invalid inputs return an explicit {"error": ...}; nothing is fabricated'), blind spots (Switzerland key-pending), and translation honesty ('never a fake translation'). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is verbose but well-structured with bullet points and front-loaded with a clear summary. Each section covers a meaningful aspect (usage, parameters, output structure, localization, audience). However, some caveats (e.g., 'never a false all-clear') are repeated, and the length is borderline for an MCP description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description thoroughly details the response structure (presentation block, track_record_ref, suggested_next_call, resolved, localized, persona) and error handling, making it complete for an agent to consume.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description fully compensates: it details destination formats (EU-27 ISO2 codes, IATA, city names), date format (YYYY-MM-DD), language codes, and audience values, plus error handling for unknown tokens.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence precisely defines the tool's scope: 'Assess one trip: current disruption status for its destinations and dates.' This distinguishes it from sibling tools like country_briefing (country-level) or watch_trip (ongoing monitoring).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'Use this tool when the user asks whether a specific trip is affected by strikes, weather, transport disruptions or other travel risks.' It also mentions a follow-up tool (watch_trip) for continued monitoring and frames the output as decision-support rather than raw data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.6/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose, with explicit cross-references to differentiate overlapping tools (e.g., get_trip_updates_since vs whats_changed, assess_trip vs watch_trip). There is no ambiguity in when to use each tool.

Naming Consistency2/5

Naming is inconsistent: some tools use verb_noun (assess_trip, list_events, watch_trip), some use noun_noun (country_briefing, country_tourism_profile), and one uses a question phrase (whats_changed). This mixed convention reduces predictability.

Tool Count5/5

8 tools is well-scoped for a travel-trends server, covering trip assessment, monitoring, update retrieval, event browsing, daily briefing, and tourism statistics. Each tool earns its place without unnecessary bloat.

Completeness4/5

The core workflows (assess, watch, get updates, explain silence, list events) are well covered. The only notable gap is the absence of trip lifecycle management, such as an unwatch_trip or list_trips tool, which is a minor omission.

Resources