{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","name":"com.coticsy.travel/travel-companions","title":"Travel Companions","description":"Find travel companions: public trip search with masked profiles, ranked matches, double opt-in connections.","version":"0.2.0","websiteUrl":"https://travel.coticsy.com","icons":[{"src":"https://travel.coticsy.com/icon-512.png","mimeType":"image/png","sizes":["512x512"]},{"src":"https://travel.coticsy.com/icon.svg","mimeType":"image/svg+xml","sizes":["any"]}],"remotes":[{"type":"streamable-http","url":"https://travel.coticsy.com/mcp"},{"type":"streamable-http","url":"https://travel.coticsy.com/mcp/auth"}],"supportedProtocolVersions":["2025-11-25","2025-06-18","2025-03-26"],"capabilities":{"tools":{"listChanged":false},"resources":{},"prompts":{}},"authentication":{"required":false,"schemes":["oauth2","apiKey"],"protectedResourceMetadata":"https://travel.coticsy.com/.well-known/oauth-protected-resource"},"tools":[{"name":"search_trips","title":"Search travel companions","description":"Find travelers looking for companions. Works without an account. Filter by destination, origin, dates, needs (share_room, split_costs...), languages, sex, age range. Free text `q` matches plans and interests semantically. Results are ranked by compatibility and include masked traveler cards (first name + initial, age range, city).","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"search_travelers","title":"Search travelers","description":"Browse masked traveler cards (not trip posts). Filter by destination of their open trips, languages, age, nationality, interests, or free text. Useful when the user asks who is going somewhere rather than for a specific date window.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"get_trip","title":"Get a trip","description":"Get the public view of one trip by id, including the masked traveler card.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"get_traveler_card","title":"Get a traveler card","description":"Get the public, masked card of a traveler by their public id.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"list_popular_destinations","title":"Popular destinations","description":"Destinations with the most open trips right now. Useful to suggest where companions are easiest to find.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"list_needs_taxonomy","title":"List suggested needs","description":"Suggested `needs` tags. Any snake_case tag is accepted, but these are the common ones.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"get_my_status","title":"Get my account status","description":"Tells the agent what the current user can do: trust level, plan, whether a profile exists, and the next steps to unlock more (create profile, accept terms, verify ID).","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"create_or_update_profile","title":"Create or update my profile","description":"Create the traveler profile on first call (all required fields) or update parts of it later. Birth date and postal code stay private; others see an age range and city only.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"get_my_profile","title":"Get my profile","description":"Return the full profile of the authenticated user.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"post_trip","title":"Post a trip","description":"Publish a trip to find companions. kind=solo (default) for a traveler seeking companions, kind=group to organize a group with N spots, kind=meetup when already at the destination. Requires a profile.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"update_trip","title":"Update a trip","description":"Update fields of one of my trips.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"close_trip","title":"Close a trip","description":"Close or cancel one of my trips so it no longer appears in search.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"list_my_trips","title":"List my trips","description":"List the authenticated user's trips, optionally filtered by status.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"get_my_matches","title":"Get matches for my trip","description":"Ranked compatible travelers for one of my trips, with reasons. Uses my profile preferences and the other side's preferences.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"create_group_trip","title":"Create a group trip","description":"Create a group trip with multiple open spots. Same fields as post_trip; kind is forced to group.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"meet_at_destination","title":"Meet at destination","description":"Post a meetup for someone already at (or about to arrive at) a destination. kind is forced to meetup.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"join_group_trip","title":"Join a group trip","description":"Request to join an open group trip. Requires terms acceptance. Owner must accept via respond_to_connection.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"accept_terms","title":"Accept terms","description":"Record that the user is 18+ and accepts the Terms of Service. Required before connecting with other travelers. Send them {base}/terms first.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"request_connection","title":"Request a connection","description":"Send a connection request to the owner of a trip. Both sides must accept before contact is shared. Requires accept_terms first.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"respond_to_connection","title":"Respond to a connection","description":"Accept or decline an incoming connection request.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"list_connections","title":"List my connections","description":"List incoming and outgoing connection requests and accepted connections.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"send_message","title":"Send a message","description":"Send a relayed message on an accepted connection. Emails stay private.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"get_messages","title":"Get messages","description":"List relayed messages on an accepted connection.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"reveal_contact","title":"Reveal contact","description":"Reveal the counterpart's email (and phone if set) after both sides accept. Requires ID verification (trust level 3).","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"leave_review","title":"Leave a review","description":"Leave a 1-5 star review of a companion from an accepted connection, once the trip is over (from the day after its end date). One review per traveler per trip.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"subscribe_match_webhook","title":"Subscribe to match webhooks","description":"Register an HTTPS URL that receives signed POSTs when new matches or connection events fire for this user. Agents use this to proactively notify travelers. The signing secret is returned once.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"report_user","title":"Report a traveler","description":"Report a traveler for spam, scam, harassment, fake profile or safety concerns.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"block_user","title":"Block a traveler","description":"Block a traveler. Neither side will see the other in search or be able to connect.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"export_my_data","title":"Export my data","description":"Return everything stored about the authenticated user (GDPR/CCPA export).","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"delete_my_account","title":"Delete my account","description":"Permanently delete the account, profile, trips and messages. Irreversible. The agent must confirm with the user first.","annotations":{"readOnlyHint":false,"destructiveHint":true}},{"name":"start_id_verification","title":"Start ID verification","description":"Create a Stripe Identity verification session. Send the returned URL to the user. Unlocks the verified badge and contact reveal.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"start_premium_checkout","title":"Start premium checkout","description":"Create a Stripe Checkout (Link-compatible) session for Premium. Send the returned URL to the user.","annotations":{"readOnlyHint":false,"destructiveHint":false}},{"name":"get_subscription","title":"Get subscription","description":"Return the current plan, status and usage limits.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"find_shared_stay","title":"Find a shared stay","description":"Affiliate search for hotels/villas near the destination that two matched travelers can share.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"find_flights_together","title":"Find flights together","description":"Affiliate flight search for matched travelers sharing an itinerary.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"find_travel_insurance","title":"Find travel insurance","description":"Affiliate link for travel insurance suitable for companion trips.","annotations":{"readOnlyHint":true,"destructiveHint":false}},{"name":"find_esim","title":"Find an eSIM","description":"Affiliate link for destination eSIMs.","annotations":{"readOnlyHint":true,"destructiveHint":false}}],"resources":[{"uri":"profile://me","name":"profile-me"},{"uriTemplate":"trip://{id}","name":"trip"},{"uri":"travelcompanions://guide","name":"guide"}],"prompts":[{"name":"onboard_traveler"},{"name":"find_companion_for_trip"}]}