{"name":"travlrid-vault","version":"1.0.0","protocol_version":"2024-11-05","description":"TravlrID Vault — encrypted personal data vault","tools":[{"name":"update_traveler","description":"Update traveler identity fields — given names, surname, phone, date of birth, nationalities or display name.\n\nRules:\n  • NEVER ask for user_aid, public_key, private_key — all auto-injected from OAuth2 token.\n  • NEVER assume or guess any field value — only send what the user explicitly confirms.\n  • NEVER call this tool without verbal confirmation from the user.\n  • Do NOT set a field the user did not mention — even if it seems obvious.\n\nALL FIELDS ARE OPTIONAL — ask the user which ones to update:\n  given_names   → string   as on the passport, middle names included, e.g. \"Zorvik Ana\"\n  surname       → string   as on the passport, e.g. \"Quellmar\"\n  phone         → string   E.164 format, e.g. +919876543210\n  date_of_birth → string   YYYY-MM-DD format, e.g. 1995-08-15\n  nationalities → string[] ISO 3166-1 alpha-2 codes, e.g. [\"IN\"]\n  display_name  → string   Name shown in the UI (follows the name when not set)\n\nThe traveler record is auto-created at sign-up — this tool only updates it.\nDo NOT use for profiles or travel preferences.","inputSchema":{"type":"object","properties":{"given_names":{"type":"string","description":"Given names as printed on the passport, middle names included."},"surname":{"type":"string","description":"Surname as printed on the passport."},"phone":{"type":"string","description":"Phone in E.164 format, e.g. +919876543210."},"date_of_birth":{"type":"string","description":"Date of birth in YYYY-MM-DD format."},"nationalities":{"type":"array","description":"Citizenships as ISO 3166-1 alpha-2 codes, e.g. [\"IN\"].","items":{"type":"string","pattern":"^[A-Z]{2}$"}},"display_name":{"type":"string","description":"Name shown in the UI."},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}}},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Updating traveler identity…","openai/toolInvocation/invoked":"Traveler identity updated."}},{"name":"save_profile","description":"Create or update the traveller's personal travel profile.\n\nCREATE: omit vault_record_id. profile_type (\"personal\") and profile_email are REQUIRED.\nUPDATE: pass vault_record_id from a prior save_profile response (not from the user).\n\nRules:\n  • Account ids are auto-filled — never ask for vault_record_id, user_aid, or public_key.\n  • Only send values the user explicitly confirmed; never guess a field.\n\nREQUIRED on create: profile_type (\"personal\"), profile_email.\n\nCorporate / TMC profiles are set up by the organisation, not here — this tool refuses them,\nand a work profile appears automatically when the traveller is added to an organisation.","inputSchema":{"type":"object","properties":{"vault_record_id":{"type":"string","description":"Id of the profile to update. Omit to create."},"profile_type":{"type":"string","description":"Required. \"personal\" | \"corporate\".","enum":["personal","corporate"]},"profile_email":{"type":"string","description":"Required. Email address for this profile — must be OTP-verified to link."},"org_id":{"type":"string","description":"AID of the linked organization. Required for corporate profiles."},"tenant_id":{"type":"string","description":"Organization tenant ID. Required for corporate profiles."},"employee_id":{"type":"string"},"department":{"type":"string"},"cost_center":{"type":"string"},"manager":{"type":"string"},"workspace_id":{"type":"string"},"employment_type":{"type":"string","description":"Corporate profiles only: employee | contractor | guest | intern | other."},"custom_data":{"type":"object","description":"Corporate profiles only. Organisation-defined fields; the definition lives in Command (EmployeeSchema). Nested rather than top-level because field NAMES reach plaintext."},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}}},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving profile…","openai/toolInvocation/invoked":"Profile saved."}},{"name":"save_preference","description":"Save (create OR update) travel preferences for a transport mode.\n\nOne preference record per transport mode per profile.\nCalling a second time for the same preference_type UPDATES silently — no vault_record_id needed.\n\nCORPORATE PROFILES — FIELD RULES:\n  Corporate field rules are enforced automatically.\n  If your fields do not match them, the call fails with:\n    \"Corporate travel policy violation\"\n  The error lists which fields are not allowed and the complete set of allowed\n  fields, their types, and permitted values.\n  WHEN THIS HAPPENS → Do NOT ask the user anything. Read the error, use ONLY the\n    allowed fields it names, and retry immediately. Move any corporate-specific\n    extras into custom_fields, or drop them.\n\nCORPORATE PROFILES — PRE-STEP (recommended):\n  Call get_preference_schema(preference_type) BEFORE collecting answers from the user.\n  This tells you which fields to ask about. Standard fields → named parameters.\n  Corporate-specific fields → custom_fields object.\n\nUPDATING AN EXISTING PREFERENCE — SEND EVERY FIELD:\n  On a corporate profile an update REPLACES the record rather than merging into it,\n  so send the fields you are NOT changing too, or they are lost.\n  → Call get_preferences FIRST, then send the current values for every field the\n    record already has, plus the ones you are changing. Include custom_fields.\n  Any update that would drop a field is refused and names exactly which ones,\n  so nothing is lost if you forget — read the error, add the named fields, retry.\n  Do NOT ask the user for values you can read back yourself.\n\nRules:\n  • NEVER ask for vault_record_id, profile_id, user_aid, public_key — all auto-resolved.\n  • NEVER assume or guess any field value — only send what the user explicitly confirms.\n  • INFER preference_type from context.\n  • Do NOT ask \"do you want to create or update?\" — the server decides automatically.\n  • If a policy violation error is returned, fix the fields and retry — do not ask user.\n  • Ask about ONE field at a time.\n\npreference_type: flight | hotel | rail | bus | car","inputSchema":{"type":"object","properties":{"preference_type":{"type":"string","enum":["flight","hotel","rail","bus","car"],"description":"Transport mode. Required."},"preferred_cabin":{"type":"string","enum":["economy","premium_economy","business","first"]},"seat_preference":{"type":"string","enum":["window","aisle","front","back","no_preference"]},"meal_preference":{"type":"string","enum":["standard","vegetarian","vegan","kosher","halal","gluten_free"]},"frequent_flyer_programs":{"type":"array","description":"List of frequent flyer memberships.","items":{"type":"object","properties":{"airline":{"type":"string"},"program_name":{"type":"string"},"membership_number":{"type":"string"}}}},"room_type":{"type":"string","enum":["single","double","suite"]},"bed_preference":{"type":"string","enum":["single","double","twin","king"]},"smoking_preference":{"type":"string","enum":["non_smoking","smoking"]},"floor_preference":{"type":"string","enum":["low","high","no_preference"]},"amenities":{"type":"array","items":{"type":"string","enum":["wifi","gym","pool","spa","parking","breakfast"]}},"loyalty_programs":{"type":"array","items":{"type":"object"}},"preferred_class":{"type":"string","enum":["economy","first","business"]},"quiet_zone":{"type":"boolean","description":"Prefer quiet zone seating."},"preferred_bus_type":{"type":"string","enum":["standard","express","luxury","sleeper"]},"preferred_operators":{"type":"array","items":{"type":"string"}},"require_amenities":{"type":"array","items":{"type":"string","enum":["wifi","ac","restroom","charging","entertainment","meals","reclining_seats"]}},"max_duration":{"type":"string","description":"Max travel time in ISO 8601 duration format, e.g. PT8H."},"max_stops":{"type":"integer","description":"Maximum acceptable number of stops."},"transmission_type":{"type":"string","enum":["automatic","manual"]},"car_category":{"type":"string","enum":["economy","compact","midsize","fullsize","suv","luxury","van"]},"custom_fields":{"type":"object","description":"Corporate-specific fields returned by get_preference_schema. All key-value pairs here are merged into the saved record alongside the standard fields. Example: { \"cost_centre_code\": \"CC-4201\", \"require_work_wifi\": true }"},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}},"required":["preference_type"]},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving travel preference…","openai/toolInvocation/invoked":"Travel preference saved."}},{"name":"get_preference_schema","description":"Fetch the complete field definitions for a preference type in the current corporate context.\n\nCall this:\n  • BEFORE save_preference when the active profile is corporate, to know which fields to collect.\n  • AFTER a \"Corporate travel policy violation\" error from save_preference, to see the\n    current schema and understand which fields are allowed before retrying.\n\n  Returns ALL fields — both standard Travlr ID fields AND any extra fields the\n  corporation has added (e.g. cost_centre_code, preferred_vendor, require_work_wifi).\n\n  Required fields (required: true) MUST be collected from the user.\n  Optional fields — skip if the user says \"no preference\".\n\n  Pass standard fields as named parameters in save_preference.\n  Pass corporate-specific extra fields in the custom_fields object.\n\npreference_type: flight | hotel | rail | bus | car","inputSchema":{"type":"object","properties":{"preference_type":{"type":"string","enum":["flight","hotel","rail","bus","car"],"description":"Transport mode to fetch the schema for."}},"required":["preference_type"]},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Fetching preference schema…","openai/toolInvocation/invoked":"Preference schema loaded."}},{"name":"save_booking","description":"Save (create or update) a travel booking of any type.\n\nCREATE: Omit vault_record_id. booking_type and booking_reference are required.\nUPDATE: Pass vault_record_id — read it from the `said` field returned by get_analytics.\n        Only the fields you provide change; all others are preserved.\n\nRules:\n  • NEVER ask the user for vault_record_id — get it from get_analytics (the `said` field).\n  • NEVER ask for profile_id, user_aid, public_key, session_token — all auto-resolved.\n  • INFER booking_type from context.\n  • NEVER assume or guess any field value — only send what the user explicitly confirms.\n\nbooking_type: flight | hotel | rail | car | bus | event","inputSchema":{"type":"object","properties":{"booking_type":{"type":"string","enum":["flight","hotel","rail","car","bus","event"],"description":"Booking transport type. Required."},"vault_record_id":{"type":"string","description":"Id of the booking to update. Omit to create a new booking."},"booking_reference":{"type":"string","description":"PNR / confirmation number. Required for create."},"status":{"type":"string","enum":["confirmed","pending","cancelled","completed"]},"profile_id":{"type":"string","description":"Profile this booking belongs to. Auto-resolved if omitted."},"trip_id":{"type":"string","description":"Trip this booking is part of. Optional."},"flight":{"type":"object","description":"{ airline (required), airlineCode (required), flightNumber (required), operatingAirline }"},"departure":{"type":"object","description":"{ airportCode (required), airport, terminal, gate, scheduledTime (required ISO 8601), actualTime }"},"arrival":{"type":"object","description":"{ airportCode (required), airport, terminal, scheduledTime (required ISO 8601) }"},"cabin_class":{"type":"string","enum":["economy","premium_economy","business","first"]},"seat_number":{"type":"string"},"fare":{"type":"object","description":"Bus/Rail/Flight total fare: { currency, totalAmount, baseAmount, taxes }"},"hotel":{"type":"object","description":"Hotel: { name (required), checkIn (required ISO 8601), checkOut (required ISO 8601), roomType, address }"},"number_of_guests":{"type":"integer","description":"Hotel: number of guests."},"special_requests":{"type":"string","description":"Hotel: special requests."},"operator":{"type":"string","description":"Rail/Bus: carrier operator name."},"train_number":{"type":"string","description":"Rail: train number."},"class":{"type":"string","description":"Rail: class (economy / first / business / sleeper)."},"car_rental_company":{"type":"string","description":"Car: rental company name."},"vehicle_type":{"type":"string","description":"Car: vehicle type, e.g. SUV, Compact."},"pickup_location":{"type":"string","description":"Car: pickup location."},"dropoff_location":{"type":"string","description":"Car: drop-off location."},"pickup_date":{"type":"string","description":"Car: ISO 8601 date-time."},"return_date":{"type":"string","description":"Car: ISO 8601 date-time."},"bus_type":{"type":"string","enum":["standard","express","luxury","sleeper","ac_seater","ac_sleeper","non_ac"],"description":"Bus: service type."},"origin":{"type":"string","description":"Bus/Rail: departure city or town name."},"destination":{"type":"string","description":"Bus/Rail: arrival city or location."},"boarding_point":{"type":"string","description":"Bus: exact boarding stop / address."},"drop_point":{"type":"string","description":"Bus: exact drop-off stop / address."},"departure_time":{"type":"string","description":"Bus: departure date-time ISO 8601."},"arrival_time":{"type":"string","description":"Bus: estimated arrival date-time ISO 8601."},"passengers":{"type":"array","description":"Bus: ALL passengers in this booking.","items":{"type":"object","properties":{"name":{"type":"string","description":"Passenger full name as on ticket."},"seatNumber":{"type":"string","description":"Assigned seat number."},"fare":{"type":"object","description":"{ currency, amount } — per-passenger fare."}},"required":["name"]}},"event_name":{"type":"string","description":"Event: event name."},"event_date":{"type":"string","description":"Event: ISO 8601 date-time."},"venue":{"type":"string","description":"Event: venue name or address."},"ticket_type":{"type":"string","description":"Event: ticket type, e.g. General, VIP."},"number_of_tickets":{"type":"integer","description":"Event: number of tickets."},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}},"required":["booking_type"]},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving booking…","openai/toolInvocation/invoked":"Booking saved."}},{"name":"save_document","description":"Save (create or update) a travel document (passport, visa, national ID, etc.).\n\nUpsert by document_number + issuing_country — same values on a later call update the document.\n\nRules:\n  • NEVER ask for user_aid, public_key — auto-injected from OAuth2 token.\n  • ALWAYS read back document_number character by character for confirmation before saving.\n  • Do NOT ask \"is this a new document or update?\" — the server upserts automatically.\n\nREQUIRED: document_type, document_number, issuing_country","inputSchema":{"type":"object","properties":{"document_type":{"type":"string","description":"Document type. Required.","enum":["passport","visa","national_id","driving_license","resident_permit","other"]},"document_number":{"type":"string","description":"Document number. Required."},"issuing_country":{"type":"string","description":"ISO 3166-1 alpha-2 country code. Required."},"holder_name":{"type":"string"},"date_of_birth":{"type":"string","description":"YYYY-MM-DD."},"issue_date":{"type":"string","description":"YYYY-MM-DD."},"expiry_date":{"type":"string","description":"YYYY-MM-DD."},"status":{"type":"string","enum":["valid","expired","cancelled","lost"]},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}},"required":["document_type","document_number","issuing_country"]},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving travel document…","openai/toolInvocation/invoked":"Travel document saved."}},{"name":"save_loyalty_account","description":"Save (create or update) a loyalty / rewards program membership.\n\nUpsert by program_name + account_number — same values on a later call update it.\n\nRules:\n  • NEVER ask for user_aid, public_key — auto-injected from OAuth2 token.\n  • Do NOT ask \"create or update?\" — the server upserts automatically.\n\nREQUIRED: program_name, programme_type, account_number","inputSchema":{"type":"object","properties":{"program_name":{"type":"string","description":"Program name, e.g. \"Air India Flying Returns\". Required."},"programme_type":{"type":"string","description":"Program category. Required.","enum":["airline","hotel","rail","car_rental"]},"account_number":{"type":"string","description":"Membership number. Required."},"tier":{"type":"string","description":"Tier level, e.g. Gold, Platinum."},"points":{"type":"number","description":"Current points balance."},"benefits":{"type":"array","items":{"type":"string"}},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}},"required":["program_name","programme_type","account_number"]},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving loyalty account…","openai/toolInvocation/invoked":"Loyalty account saved."}},{"name":"save_trip","description":"Save (create or update) a trip.\n\nCREATE: Omit trip_id. trip_name is required.\nUPDATE: Pass trip_id from a prior save_trip response (not from the user).\n\nREQUIRED on create: trip_name (string)","inputSchema":{"type":"object","properties":{"trip_id":{"type":"string","description":"Omit to create a new trip. Provide to update an existing trip."},"trip_name":{"type":"string","description":"Trip name. Required for create."},"start_date":{"type":"string","description":"ISO 8601 date, e.g. 2026-04-01."},"end_date":{"type":"string","description":"ISO 8601 date."},"purpose":{"type":"string","description":"Trip purpose, e.g. \"Business\", \"Leisure\"."},"status":{"type":"string","enum":["planned","active","completed","cancelled"]},"budget":{"type":"object","description":"{ currency: \"INR\", amount: 50000 }"},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}}},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving trip…","openai/toolInvocation/invoked":"Trip saved."}},{"name":"save_itinerary","description":"Save (create or update) an itinerary linked to a trip.\n\nCREATE: Omit itinerary_id. trip_id is required.\nUPDATE: Pass itinerary_id from a prior save_itinerary response (not from the user).\n\nREQUIRED on create: trip_id (string)","inputSchema":{"type":"object","properties":{"itinerary_id":{"type":"string","description":"Omit to create. Provide to update."},"trip_id":{"type":"string","description":"Trip this itinerary belongs to. Required for create."},"timeline":{"type":"array","description":"Ordered list of itinerary events.","items":{"type":"object"}},"schedule":{"type":"object","description":"Schedule summary object."},"participants":{"type":"array","description":"Participant names or AIDs.","items":{"type":"string"}},"budget":{"type":"object","description":"{ currency, amount }"},"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}}},"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"_meta":{"securitySchemes":[{"type":"oauth2","scopes":["mcp:write"]}],"openai/toolInvocation/invoking":"Saving itinerary…","openai/toolInvocation/invoked":"Itinerary saved."}},{"name":"get_traveler_profile","description":"Get the traveler's base identity (name, email, phone) plus a lightweight index of profiles they hold.\n\nUSE WHEN user asks: \"who am I\", \"show my profile\", \"what is my name\", \"my email\", \"my phone\".\n\nDO NOT USE for:\n- Listing profiles only           → use list_profiles\n- The full contents of a profile  → use get_my_profile\n- Travel preferences              → use get_preferences\n- Bookings / trips                → use get_analytics\n- Documents / constraints         → use get_documents / get_constraints\n\nRETURNS:\n  data.identity.context = { givenNames, surname, email, phone, dateOfBirth, nationalities, ... }\n  data.profiles[]       = brief { profile_id, tenant_id, profile_type, status }\n  data.profile_count    = number\n\nREAD-BACK: read identity.context fields naturally; skip null/empty fields.\n  e.g. \"Your name is {givenNames} {surname}, email {email}, phone {phone}.\"","inputSchema":{"type":"object","properties":{"user_aid":{"type":"string","description":"Auto-injected from OAuth2 token — omit."}}}},{"name":"get_my_profile","description":"Get the full details of the profile the traveller is currently using.\n\nUSE WHEN user asks: \"show my profile\", \"my work profile\", \"my corporate details\",\n  \"what does my company know about me\", \"my profile data\".\n\nNo parameters. The active profile was chosen on the OAuth login screen and is bound\nto this session’s token — the LLM cannot (and need not) specify which profile.\n\nTo switch profiles the user must log out of the connector and reconnect.\nTo see ALL profiles (names only) call list_profiles instead.","inputSchema":{"type":"object","properties":{"user_aid":{"type":"string","description":"Auto-injected — omit."}}}},{"name":"get_preferences","description":"Get the travel preferences — flight seat, meal, cabin class, hotel room type, rail seat, etc. — for the user's active profile.\n\nUSE WHEN user asks: \"my preferences\", \"what seat do I prefer\", \"my meal preference\",\n  \"window or aisle\", \"my hotel preferences\".\n\nNo parameters. Preferences are scoped to the active profile bound to this session.\n\nREAD-BACK: group by mode.\n  e.g. \"For flights you prefer a {seat_preference} seat in {preferred_cabin}, meal: {meal_preference}.\"\n  If empty: \"You haven't saved any travel preferences yet.\"","inputSchema":{"type":"object","properties":{"user_aid":{"type":"string","description":"Auto-injected — omit."}}}},{"name":"get_complete_context","description":"Get the COMPLETE context for the user's active profile — identity + active profile + preferences in one call.\n\nUSE WHEN user asks: \"tell me everything about me\", \"all my data\", or BEFORE planning a trip\n  to load identity + preferences + policies in a single request.\n\nNo tenant or profile parameter — always scoped to the active profile bound to this session.\nSet include_preferences=false to skip preferences (faster).","inputSchema":{"type":"object","properties":{"include_preferences":{"type":"boolean","description":"Default: true."},"include_profiles":{"type":"boolean","description":"Default: true."},"user_aid":{"type":"string","description":"Auto-injected — omit."}}}},{"name":"get_analytics","description":"Get bookings, trips, or travel stats for the authenticated traveler.\n\nUSE WHEN user asks: \"show my bookings\", \"my travel history\", \"trips this year\", \"travel stats\".\n\nDEFAULTS: query_type=\"summary\", entity=\"bookings\". Keep them unless the traveller asks\n  for something the summary does not carry; then use query_type=\"details\".\n\nREAD-BACK: answer the question that was asked, as sentences, one booking at a time.\n  e.g. \"You have a {airline} flight from {origin} to {destination} on {date} at {time},\n        booking reference {reference}, seat {seat} in {cabin_class}.\"\n  Give the details that are present and simply omit the ones that are not.\n  If there are none: \"You don't have any bookings saved yet.\" and offer to import them.","inputSchema":{"type":"object","properties":{"query_type":{"type":"string","description":"\"summary\" (default, O(1)) | \"details\" (O(N)) | \"list\" (metadata) | \"aggregation\" (counts).","enum":["summary","list","aggregation","details"],"default":"summary"},"entity":{"type":"string","description":"Entity to query. Default: \"bookings\".","enum":["bookings","flights","hotels","rail","car","bus","events","trips","travelers","profiles","preferences","loyalty"]},"tenant_id":{"type":"string","description":"Filter by organization. Optional."},"start_date":{"type":"string","description":"ISO 8601. Optional."},"end_date":{"type":"string","description":"ISO 8601. Optional."},"workspace_id":{"type":"string","description":"Filter by workspace. Optional."},"user_aid":{"type":"string","description":"Auto-injected — omit."}}}},{"name":"get_documents","description":"List the traveller's travel documents (passport, visa, national_id, driving_license, resident_permit).\n\nUSE WHEN user asks: \"what documents do I have\", \"show my passports\", \"list my visas\",\n  \"when does my passport expire\", \"my document numbers\", or BEFORE booking international travel.\n\nRETURNS:\n  data.documents[] = { document_type, document_number, issuing_country, holder_name,\n                       date_of_birth, issue_date, expiry_date, status, details{...} }\n  data.count       = number\n\nREAD-BACK: skip null fields. Flag expiry.\n  e.g. \"Your {document_type} #{document_number} ({issuing_country}) expires on {expiry_date}.\"\n  If expired: prepend \"Note — this document expired on {expiry_date}.\"\n\nDocuments are identity-level, not profile-scoped. Add new documents with save_document.","inputSchema":{"type":"object","properties":{"user_aid":{"type":"string","description":"Auto-injected — omit."}}}},{"name":"get_constraints","description":"List the traveller's constraints (dietary, accessibility, medical, religious, visa_restriction, travel_restriction).\n\nUSE WHEN user asks: \"my dietary restrictions\", \"my accessibility needs\", \"my medical requirements\",\n  \"am I vegetarian\", \"do I need a wheelchair\", \"my religious restrictions\",\n  or BEFORE booking to flag mandatory accommodations.\n\nRETURNS:\n  data.constraints[] = { type, severity, category, description, applicable_to[],\n                         valid_from, valid_to, details{...} }\n  data.count         = number\n\n  type:     \"accessibility\" | \"dietary\" | \"medical\" | \"religious\" | \"visa_restriction\" | \"travel_restriction\" | \"custom\"\n  severity: \"mandatory\" | \"important\" | \"preference\"\n\nREAD-BACK: group by type; mention severity for non-mandatory items.\n  e.g. \"You have a {type} constraint: {description}. Severity: {severity}.\"\n\nConstraints are identity-level, not profile-scoped.","inputSchema":{"type":"object","properties":{"user_aid":{"type":"string","description":"Auto-injected — omit."}}}},{"name":"list_profiles","description":"List all profiles linked to the authenticated traveler — both personal and corporate.\n\nUSE WHEN user asks: \"what profiles do I have\", \"show all my profiles\",\n  \"which companies am I linked to\".\n\nThis is a names-and-types listing. To read the full details of the\ncurrently-active profile use get_my_profile (no parameters needed).\n\nRETURNS data.profiles[] = {\n  profile_type : \"personal\" | \"corporate\"\n  label        : human-readable name if set\n  (corporate profiles also carry their organisation identifiers)\n}\n\nTo switch the active profile, the user must log out of the connector and reconnect —\nprofile selection happens only on the OAuth login screen.","inputSchema":{"type":"object","properties":{"user_aid":{"type":"string","description":"Auto-injected — omit."}}}}],"auth":{"type":"bearer","description":"Obtain a Bearer token via the OAuth2 PKCE flow","token_url":"https://vault.staging.travlr.network/oauth/token","authorize_url":"https://vault.staging.travlr.network/oauth/authorize"},"endpoints":{"mcp":"https://vault.staging.travlr.network/mcp"}}