{"id":"ac92f4df-8c06-4203-94da-7867b1de9310","entityType":"agent","slug":"clawhub-missial-travel-search-ru","name":"Travel Search RU","canonicalUrl":"https://www.xpersona.co/agent/clawhub-missial-travel-search-ru","canonicalPath":"/agent/clawhub-missial-travel-search-ru","generatedAt":"2026-10-10T07:29:28.879Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":null},"description":"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search. Skill: Travel Search RU Owner: missial Summary: Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search. Tags: latest:2.5.0 Version histo","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.1K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17a4kp37e7hyw85xvej8mer5s841zqb:travel-search-ru","sourceUrl":"https://clawhub.ai/missial/travel-search-ru","homepage":"https://clawhub.ai/missial/skills/travel-search-ru","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/missial/travel-search-ru","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/missial/skills/travel-search-ru","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":44,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russi"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":null},"stars":null,"forks":null,"downloads":2087,"packageName":null,"latestVersion":"2.5.0","tractionLabel":"2.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T19:16:32.251Z","lastCrawledAt":"2026-10-09T19:16:32.251Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T19:16:32.251Z","lastVerifiedAt":null,"highlights":[{"version":"2.5.0","createdAt":"2026-10-03T10:04:14.885Z","changelog":"Rules from 15-destination live tests: kids_ages, exact stars, center distance, unsupported conditions, atoll-wide hotel comparison, 31-day window, one-way combo for flights, local departure time, activity city fallback.","fileCount":9,"zipByteSize":44663},{"version":"2.4.0","createdAt":"2026-10-03T09:35:02.398Z","changelog":"Universal search rules: every constraint as a parameter (first line, beach distance, party/stay budget, exact resorts), one search per OR value, named-hotel comparison with verification, budget re-check after tour details, per-adult flight prices, activity query.","fileCount":9,"zipByteSize":43930},{"version":"2.3.0","createdAt":"2026-10-02T21:20:38.366Z","changelog":"Server error text reaches the model; date, meal and nights rules; cheapest-tours command; long round trips as two legs; rate_limited category; UTF-8-safe output.","fileCount":9,"zipByteSize":41456},{"version":"2.2.0","createdAt":"2026-08-17T16:52:18.178Z","changelog":"Добавлен поиск поездов Tutu.ru: направления на русском языке, дата поездки, сортировка, ориентировочные цены и безопасные ссылки для проверки наличия мест.","fileCount":8,"zipByteSize":34889},{"version":"2.1.1","createdAt":"2026-08-17T06:56:09.625Z","changelog":"Improved discovery for Russian travel-planning requests while keeping live search as the skill scope.","fileCount":8,"zipByteSize":34437},{"version":"2.1.0","createdAt":"2026-07-20T14:29:10.994Z","changelog":"Tripster + Sputnik8, activity filters and sorting, normalized price units, silent provider failover","fileCount":8,"zipByteSize":33626},{"version":"2.0.2","createdAt":"2026-07-15T18:23:28.487Z","changelog":"Added explicit metadata.permissions for single-endpoint HTTPS egress and bundled CLI execution; added privacy and unknown-retention notice to usage. Runtime CLI contract unchanged.","fileCount":7,"zipByteSize":15044},{"version":"2.0.1","createdAt":"2026-07-15T18:15:15.895Z","changelog":"Narrowed activation to explicit live travel search; documented Russian-language catalog without forcing reply language; declared Python/network/data compatibility; normalized frontmatter to official Agent Skills YAML. Runtime CLI contract unchanged.","fileCount":7,"zipByteSize":14712}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17a4kp37e7hyw85xvej8mer5s841zqb:travel-search-ru","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T07:29:28.876Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-missial-travel-search-ru/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":null},"readme":"Skill: Travel Search RU\n\nOwner: missial\n\nSummary: Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\n\nTags: latest:2.5.0\n\nVersion history:\n\nv2.5.0 | 2026-10-03T10:04:14.885Z | user\n\nRules from 15-destination live tests: kids_ages, exact stars, center distance, unsupported conditions, atoll-wide hotel comparison, 31-day window, one-way combo for flights, local departure time, activity city fallback.\n\nv2.4.0 | 2026-10-03T09:35:02.398Z | user\n\nUniversal search rules: every constraint as a parameter (first line, beach distance, party/stay budget, exact resorts), one search per OR value, named-hotel comparison with verification, budget re-check after tour details, per-adult flight prices, activity query.\n\nv2.3.0 | 2026-10-02T21:20:38.366Z | user\n\nServer error text reaches the model; date, meal and nights rules; cheapest-tours command; long round trips as two legs; rate_limited category; UTF-8-safe output.\n\nv2.2.0 | 2026-08-17T16:52:18.178Z | user\n\nДобавлен поиск поездов Tutu.ru: направления на русском языке, дата поездки, сортировка, ориентировочные цены и безопасные ссылки для проверки наличия мест.\n\nv2.1.1 | 2026-08-17T06:56:09.625Z | user\n\nImproved discovery for Russian travel-planning requests while keeping live search as the skill scope.\n\nv2.1.0 | 2026-07-20T14:29:10.994Z | user\n\nTripster + Sputnik8, activity filters and sorting, normalized price units, silent provider failover\n\nv2.0.2 | 2026-07-15T18:23:28.487Z | user\n\nAdded explicit metadata.permissions for single-endpoint HTTPS egress and bundled CLI execution; added privacy and unknown-retention notice to usage. Runtime CLI contract unchanged.\n\nv2.0.1 | 2026-07-15T18:15:15.895Z | user\n\nNarrowed activation to explicit live travel search; documented Russian-language catalog without forcing reply language; declared Python/network/data compatibility; normalized frontmatter to official Agent Skills YAML. Runtime CLI contract unchanged.\n\nv2.0.0 | 2026-07-15T18:03:25.612Z | user\n\nBreaking v2: lightweight Python 3.8+ CLI over production travel MCP; seven commands; live schemas via describe; raw API client and provider docs removed; strict Streamable HTTP lifecycle, deadlines, size limits, redirects, and safe errors.\n\nv1.3.1 | 2026-07-15T07:40:20.487Z | user\n\nИсправлены Travelata-маршруты и таймаут актуализации; добавлена актуальная документация MCP.\n\nv1.3.0 | 2026-07-14T16:26:14.501Z | user\n\nLevel.Travel переведён на живой асинхронный поиск: enqueue -> get_grouped_hotels, дети, любые даты и длительности, hotel-only. Travelata + Level.Travel параллельно на каждый туровый запрос.\n\nv1.2.3 | 2026-04-13T21:07:21.252Z | user\n\nSimplify tour and flight result formatting with calmer compact shortlists and section-based presentation.\n\nv1.2.2 | 2026-04-13T20:50:41.740Z | user\n\nImprove exact-area tour handling and shortlist presentation; avoid silent geographic broadening and present cleaner compact results.\n\nv1.2.1 | 2026-04-13T20:21:34.522Z | user\n\nClarify skill description and README with explicit search providers: Aviasales, Travelata + Level.Travel, and Sputnik8.\n\nv1.2.0 | 2026-04-13T20:07:25.356Z | user\n\nLevel.Travel parallel source (cached snapshot, 2 adults, 7-15 nights)\n\nv1.1.1 | 2026-04-13T11:15:35.392Z | user\n\nFix empty tours for far destinations: wait 3-5s based on destination, soft poll via repeated GET /tours before relaxing filters\n\nv1.1.0 | 2026-04-13T10:50:28.780Z | user\n\nMigrate Travelata to Partners API: live search, multiple tours per date, search by specific hotel, kids ages 2-17 with kidsAges[], 4+ adults supported\n\nv1.0.3 | 2026-04-02T06:26:19.305Z | user\n\nFix display name\n\nv1.0.2 | 2026-04-01T23:11:38.941Z | user\n\nFix Egypt country ID (34→29), UAE (69→68). Remove hardcoded Travelata IDs — bot resolves dynamically via directory endpoints. Sanitize error responses.\n\nv1.0.1 | 2026-04-01T19:56:40.690Z | user\n\nAdd keywords: aviasales, travelata, sputnik8, tripster, flights, tours, excursions, travel, russia, turkey, egypt, booking\n\nv1.0.0 | 2026-04-01T18:21:17.773Z | user\n\nInitial release: flights (Aviasales), tours (Travelata), excursions (Sputnik8)\n\nArchive index:\n\nArchive v2.5.0: 9 files, 44663 bytes\n\nFiles: LICENSE (1064b), package.json (862b), README.md (9107b), references/usage.md (13638b), scripts/travel_search.py (25779b), skill-card.md (1711b), SKILL.md (14955b), tests/test_travel_search.py (83817b), _meta.json (135b)\n\nFile v2.5.0:SKILL.md\n\n---\nname: travel-search-ru\ndescription: \"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\"\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.5.0\"\n  keywords: \"travel,travel-planning,trip-planner,itinerary,flights,trains,rail,tours,hotels,excursions,activities,mcp,russia,turkey,egypt,путешествия,планирование путешествий,туры,авиабилеты,поезда,жд билеты,отели,экскурсии,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, trains, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `cheapest-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-trains`, `search-activities`, `list-destinations`.\n\nParameters below and in [references/usage.md](references/usage.md) are current. Run `describe <command>` once per command when you need a field not documented here; never invent fields from memory.\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Даты\n\n`YYYY-MM-DD` в примерах — заполнитель. Сначала определите сегодняшнюю дату; если она неизвестна, выполните `date +%F`. Все даты передавайте в формате `YYYY-MM-DD` и не раньше сегодняшней, месяц для `flight-calendar` — в формате `YYYY-MM`. Если год не назван («15 сентября», «в мае»), имеется в виду ближайший такой день или месяц в будущем.\n\n## Scope\n\n- Use this skill as the search layer of travel planning. Build itineraries with general reasoning; use the skill to find package tours, hotel-only stays, flights, trains, activities, destination directories, prices, and booking links.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a long-term travel workspace.\n- Exact geography stays fixed unless the user explicitly agrees to broaden it.\n\n## Hard constraints\n\nTreat these as non-negotiable filters — do not silently relax them:\n\n- Geography (country, resort, city, hotel when named)\n- Dates and night range\n- Traveler composition (adults, children, infants)\n- Budget when stated\n\nIf children are in the party and ages are unknown, **ask for ages** before presenting bookable family prices. Do not invent ages for pricing.\n\n**Budget:** never auto-show offers that break a hard budget. Alternatives outside any hard constraint may appear only after **explicit user consent**, and only in a **separate labeled section**. Alternatives that satisfy every hard constraint (e.g. other hotels when the named ones do not fit) need no consent.\n\n## When to use which command\n\n| Need | Command |\n|------|---------|\n| Package tour (flight + hotel) | `search-tours` |\n| Quick cheapest tours, Travelata only | `cheapest-tours` |\n| Hotel only (no flight) | `search-hotels` |\n| Fresh price/availability before booking a tour | `get-tour-details` |\n| Flight options | `search-flights` |\n| Flight price calendar / flexible dates | `flight-calendar` |\n| Train schedule and indicative fares | `search-trains` |\n| Excursions and activities | `search-activities` |\n| Resolve destinations / directories | `list-destinations` |\n\n## Activities\n\nЕсли город экскурсий не найден, попробуйте ближайший крупный город или туристический центр. `search-activities` ищет по теме через `query` («сафари», «острова») и принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Сортировка: `recommended` (по умолчанию), `price`, `rating` или `reviews`. В каждой записи указан источник `provider`, единица цены `price_unit` (`per_person`, `per_group`, `per_ticket` или `unknown`) и понятный текст `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка `price` не смешивает разные единицы.\n\n## Туры и отели\n\n- `date_from`…`date_to` — окно дат вылета (для `search-hotels` — заезда) не длиннее 31 дня, то есть до календарного месяца.\n- `list-destinations` с `{\"country\": \"…\"}` даёт точные названия для `resort`; `resorts_level_travel_only` — места, которые есть только у Level.Travel (по ним ищет только он).\n- Всегда передавайте `nights_min` и `nights_max` явно (по умолчанию 7–10) и держите диапазон не шире 5 значений: Level.Travel ищет только `nights_min`…`nights_min`+4 (сервер сузит диапазон и добавит примечание), Travelata — весь диапазон. Для более широкого диапазона сделайте несколько поисков по очереди.\n- Питание `meal` (в `cheapest-tours` — список `meals`) передавайте кодом: `RO` — без питания, `BB` — завтраки, `HB` — полупансион, `FB` — полный пансион, `AI` — всё включено, `UAI` — ультра всё включено.\n- `search-hotels` тоже требует `departure_city`: передайте домашний город пользователя, а если он неизвестен — «Москва». Город влияет только на доступность предложений.\n- В предложениях есть `beach_distance_m` и `beach_line` — данные источника; `null` значит «неизвестно», а не «близко». Рейтинг — по шкале 0–10.\n- Выдача — по одному варианту на отель (самый дешёвый); `more_offers` — сколько ещё дат и вариантов у отеля.\n- `cheapest-tours` — быстрый обзор самых дешёвых туров только из Travelata; для выбранного предложения вызовите `get-tour-details` с его `offer_id`.\n\n## Авиабилеты\n\n- `search-flights`: `return_date` (`YYYY-MM-DD`) необязателен. Поездку туда-обратно длиннее 30 дней сервер ищет как два перелёта в одну сторону: у элементов есть `leg` (`outbound` или `return`), итоговая цена — их сумма. Поиск в одну сторону возвращает самый дешёвый вариант на каждую дату — часто это один результат. Цены всегда для эконом-класса, даже если `trip_class` ≠ 0.\n- Цены авиабилетов — за одного взрослого; `price_total_adults` — сумма за взрослых. Детские тарифы источник не даёт — так и скажите. `one_way_combo` — два билета в одну сторону, когда они дешевле туда-обратно. Время в `departure_at` местное: вылет в 00:55 — это ночь накануне.\n- Пустой ответ авиапоиска значит «нет в кэше цен», а не «нет рейсов»: проверьте соседние даты в `flight-calendar` и дайте ссылку.\n- `flight-calendar`: `month` в формате `YYYY-MM`; цены — за билет в одну сторону.\n\n## Ошибки\n\nПри ошибке CLI завершается с кодом 1 и печатает `{\"error\":true,\"category\":…,\"message\":…}`; для `tool_error` в `message` — текст сервера.\n\n- Сообщение о неверных данных — исправьте ввод и не повторяйте запрос без изменений.\n- «Источник отклонил параметры запроса…» — измените параметры.\n- «Источник временно недоступен…» (ошибка всего вызова) — повторите один раз чуть позже, затем сообщите пользователю.\n- «Сервис поиска сейчас перегружен…», «Слишком много запросов…» или `rate_limited` — подождите около минуты.\n- Не запускайте второй `search-tours`, пока не завершился первый, и не повторяйте его с теми же аргументами. Если результатов мало, расширяйте поиск в рамках жёстких ограничений или с согласия пользователя.\n\n## Workflow\n\n1. Clarify hard constraints: place, dates/nights, travelers, budget, and every must-have condition (meal, stars, distance to the beach).\n2. Translate each constraint into a parameter literally — never leave a must-have only in your head:\n   - Fixed stay («с 5 по 11») → `date_from` = `date_to` = check-in date, `nights_min` = `nights_max` = number of nights. Flexible dates → a `date_from`…`date_to` window.\n   - Budget → `price_max` for the whole party and the whole stay; convert per-person or per-night budgets first.\n   - Place → the exact resort name from `list-destinations` (a district inside a region looks like «Регион: Район»; a resort includes its districts).\n   - Party → `adults` and `kids_ages` (each child's age).\n   - Conditions → their own parameters (`meal`, `stars_min`/`stars_max`, `beach_distance_max`, `beach_line_max`, `center_distance_max`). «Первая линия» → `beach_line_max` 1; «не дальше N м» → `beach_distance_max` N; «у моря» without a number → `beach_distance_max` 500 (say so); «в центре» → `center_distance_max` ≈ 1500; «ровно 4★» → `stars_min` = `stars_max` = 4.\n   - No parameter for a condition (sea view, aquapark) → say it cannot be filtered and check names or `get-tour-details` room names.\n   - «A или B» (two meals, two resorts) → one search per value: `meal` and `resort` take one value, and `meal` matches exactly.\n   - A star range («4–5★») → `stars_min` = lower bound; if only the lower bound shows up, search the upper bound too.\n3. Build `--input` as one JSON object (use `describe` only for a field not documented here).\n4. User named specific properties → pass them in `hotels` and search the resort where they are (if their resorts are unknown or many, as on atolls, search the country). Properties in different resorts need separate searches. Check that each `named_hotels[].hotel` really is the property the user meant; a brand may return several (`other_matches`). If none fit, run the same search without `hotels` for alternatives.\n5. Call the command; preserve partial multi-provider results as success.\n6. For a specific offer, refresh with `get-tour-details` before booking guidance. The confirmed price may differ from the search price — re-check the budget and say if it changed.\n7. Present a short shortlist with prices, key facts, and links the server returned. When asked to compare named properties, cover each one from `named_hotels`: fits / does not fit (reason and price) / not found. When nothing fits, say which constraint removed the options and ask before relaxing it.\n\n## Rules\n\n- Russian catalog values/examples are intentional: the upstream directory uses Russian names. Preserve the user's answer language where possible; do not force Russian conversation. Use Russian catalog values for MCP calls when required.\n- **Fresh details** for a chosen tour use `get-tour-details`; do not reuse stale offer payloads as live quotes.\n- Prefer **short booking URLs** from the response. If a short URL is missing, **never** fall back to a raw/long provider URL.\n- **Cached flight prices** (including calendar data) are not live quotes — say they may be outdated.\n- **Tutu.ru train data is not real-time.** The requested date only shapes the result link. Verify the train, seats, and final price on Tutu.ru; never present `min_price_rub` as confirmed availability.\n- Если один источник недоступен, молча покажите полученные результаты и не сообщайте о сбое.\n- Keep the requested geography; show actual sub-area names without switching regions silently.\n- Default presentation: 5–8 strong options, calm text layout, group tours by hotel when multiple offers share one property.\n- When tours and activities are both relevant, search activities even if tour results are thin.\n\n## Presentation\n\n- Flights: route, dates, price, transfers/baggage notes if present, then link.\n- Trains: train number, departure/arrival time, travel time, indicative carriage prices, the non-real-time warning, then link.\n- Tours/hotels: property, stars/rating, area, meal, check-in and nights, price, brief fit note, then link.\n- Prefer short conclusions over long tables.\n\nFile v2.5.0:README.md\n\n# Travel Search RU\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![agentskills.io](https://img.shields.io/badge/agentskills.io-compatible-purple.svg)](https://agentskills.io)\n[![ClawHub](https://img.shields.io/badge/ClawHub-travel--search--ru-blue.svg)](https://clawhub.ai/skills/travel-search-ru)\n\nПоисковый слой для планирования путешествий с популярными туристическими сервисами: **Aviasales**, **Travelata**, **Level.Travel**, **Tutu.ru**, **Tripster** и **Sputnik8**.\n\nАгент может составить маршрут своими обычными инструментами, а навык найдёт для него авиабилеты, поезда, пакетные туры, отели и экскурсии. В ответе будут цены, ключевые параметры и короткие ссылки на выдачу. Навык работает в Claude Code, Cursor, Gemini CLI, GitHub Copilot и других AI-агентах.\n\n| Сервис | Что доступно |\n|--------|--------------|\n| **Aviasales** | Авиабилеты и календарь цен |\n| **Travelata** | Пакетные туры |\n| **Level.Travel** | Пакетные туры и отели без перелёта |\n| **Tutu.ru** | Кэшированное расписание поездов и ориентировочные цены |\n| **Tripster** | Экскурсии и активности |\n| **Sputnik8** | Экскурсии, билеты и активности |\n\n**Два способа подключения:** [Agent Skill](#установка) или [удалённый MCP-сервер](#mcp-сервер).\n\n## Демо\n\n### Codex: семейный отпуск в Кемере\n\n![Codex ищет тур и экскурсии в Кемере](https://github.com/MissiaL/travel-search-ru/releases/download/v2.1.0/codex-kemer-agent-log.gif)\n\nАнимация собрана из результатов живого MCP-запроса от 22 июля 2026 года; это не запись экрана. Перед бронированием уточняйте цену и доступность.\n\n![Travel search demo](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/book_small.gif)\n\n<details>\n<summary>Пример ответа</summary>\n\n![Запрос](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/request.webp)\n![Ответ часть 1](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response1.webp)\n![Ответ часть 2](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response2.webp)\n\n</details>\n\n## Совместимые агенты\n\nРаботает с любым AI-агентом, который поддерживает [agentskills.io](https://agentskills.io):\n\n**Claude Code** · **Cursor** · **Gemini CLI** · **GitHub Copilot** · **Windsurf** · **Junie** · **OpenCode** · **Goose** · **Aider** · **Cline** · **Roo Code** · **Amp** · **VS Code Agent** и 30+ других\n\n## Как это устроено\n\n```\nПользователь спрашивает про туры / отели / авиа / поезда / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)\n```\n\n| Команда CLI | Назначение |\n|-------------|------------|\n| `search-tours` | Пакетные туры (перелёт + отель) |\n| `cheapest-tours` | Быстрая подборка самых дешёвых туров Travelata |\n| `search-hotels` | Отели без перелёта |\n| `get-tour-details` | Актуальные детали тура перед бронированием |\n| `search-flights` | Варианты перелётов |\n| `flight-calendar` | Календарь цен на авиабилеты |\n| `search-trains` | Поезда Tutu.ru и ориентировочные цены |\n| `search-activities` | Экскурсии и активности |\n| `list-destinations` | Справочник направлений |\n\n## Установка\n\n```bash\ngit clone https://github.com/MissiaL/travel-search-ru.git travel-search-ru\n```\n\nИмя каталога должно совпадать с именем навыка: `travel-search-ru`.\n\n## CLI\n\nТолько стандартная библиотека Python 3.8+ (без pip-пакетов).\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe search-tours\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2}'\n```\n\nВместо `YYYY-MM-DD` подставьте реальные даты не раньше сегодняшней.\n\nАктуальные схемы полей — через `describe`, см. [references/usage.md](references/usage.md).\n\nОсобенности поиска:\n\n- `search-trains` возвращает кэшированное расписание Tutu.ru и ориентировочные цены. Дата используется в ссылке на выдачу; наличие поезда, мест и итоговую цену нужно проверить перед бронированием.\n- У `search-activities` поля `date_from` и `date_to` необязательны, а `persons` принимает значения от 1 до 100.\n- Для туров и отелей окно дат вылета (заезда) — не больше 30 дней, диапазон ночей лучше задавать явно и не шире 5 значений, питание — кодами `RO`, `BB`, `HB`, `FB`, `AI`, `UAI`.\n- Если сервер вернул ошибку, CLI передаёт её текст в поле `message` (категория `tool_error`); при перегрузке сервиса — категория `rate_limited`.\n\n## MCP-сервер\n\nТот же поиск доступен как удалённый MCP-сервер для агентов с поддержкой MCP, но без Agent Skills.\n\n**Эндпоинт:** `https://mcp.botclaw.ru/travel` (Streamable HTTP, без авторизации, только чтение)\n\n```bash\nclaude mcp add --transport http travel-search-ru https://mcp.botclaw.ru/travel\n```\n\nИли в конфигурации агента:\n\n```json\n{\n  \"mcpServers\": {\n    \"travel-search-ru\": {\n      \"url\": \"https://mcp.botclaw.ru/travel\"\n    }\n  }\n}\n```\n\n## Язык и каталог\n\nНавык оптимизирован под **русскоязычные запросы** и **русскоязычный каталог** (имена направлений и городов в upstream-справочнике на русском — отсюда русские примеры CLI). Это не принуждение к русскому диалогу: **язык ответа** по возможности совпадает с языком пользователя. Запросы **не на русском** тоже обрабатываются; для MCP при необходимости используются русские значения каталога.\n\n## Данные и удалённый сервис\n\nЕдинственный удалённый эндпоинт: `https://mcp.botclaw.ru/travel` (HTTPS, только чтение).\n\nНа сервис уходят **только переданные критерии поиска** (города, даты, состав путешественников и т.п.). Для поездов дата используется в ссылке Tutu.ru, но само расписание API по дате не фильтрует. Учётные данные не передаются; доступ к почте/календарю не используется; бронирование и долговременное хранение не выполняются.\n\n## Требования\n\n- Python 3.8+ (только стандартная библиотека)\n- Сетевой доступ к MCP-эндпоинту\n\n## Примеры запросов\n\n- «Спланируй поездку в Турцию на неделю с актуальными ценами»\n- «Найди туры в Турцию на двоих, 7 ночей в мае»\n- «Отель в Стамбуле без перелёта на 5 ночей»\n- «Дешёвые билеты из Москвы в Анталью в июне»\n- «Найди поезд из Москвы в Сочи на 15 сентября»\n- «Экскурсии в Кемере»\n\n## Лицензия\n\nMIT — см. [LICENSE](LICENSE).\n\nFile v2.5.0:_meta.json\n\n{\n  \"ownerId\": \"kn75rh4tzqmd6yy43xmswa5895841twa\",\n  \"slug\": \"travel-search-ru\",\n  \"version\": \"2.5.0\",\n  \"publishedAt\": 1791021854885\n}\n\nFile v2.5.0:references/usage.md\n\n# Travel Search CLI usage\n\n**Privacy:** Every command sends the supplied JSON search criteria to the live external production service. Criteria may contain itinerary/location, dates, traveler counts/ages, budget, and preferences. Do not include names, contacts, passport/payment details, credentials, or unnecessary sensitive data. The local skill does not persist requests, but no server-side retention guarantee is declared, so treat it as an external service.\n\nThe skill talks only to the production MCP endpoint over Streamable HTTP. There is no public `--url` flag and no environment-based endpoint override.\n\n## Commands\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py <command> --input '<JSON object>'\n```\n\n| CLI command | MCP tool |\n|-------------|----------|\n| `search-tours` | `search_tours` |\n| `cheapest-tours` | `get_cheapest_travelata_tours` |\n| `search-hotels` | `search_hotels` |\n| `get-tour-details` | `get_tour_details` |\n| `search-flights` | `search_flights` |\n| `flight-calendar` | `get_flight_price_calendar` |\n| `search-trains` | `search_train_tickets` |\n| `search-activities` | `search_activities` |\n| `list-destinations` | `list_destinations` |\n\n## Input\n\n`--input` must be a single JSON **object**. Arrays, strings, numbers, `null`, and `true`/`false` are rejected.\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py cheapest-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"resorts\":[\"Кемер\"],\"meals\":[\"AI\",\"UAI\"],\"limit\":5}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py flight-calendar --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"month\":\"YYYY-MM\"}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n### Dates\n\n`YYYY-MM-DD` / `YYYY-MM` above are placeholders. Determine today's date first (run `date +%F` if it is unknown). Every date is `YYYY-MM-DD` and must not be in the past; `flight-calendar` takes `month` as `YYYY-MM`. A day or month without a year means its next future occurrence. The server rejects past or malformed dates with a Russian validation message.\n\n## Discover schemas\n\nDo not hard-code provider field lists. Ask the live server:\n\n```bash\npython scripts/travel_search.py describe search-tours\n```\n\nResponse shape:\n\n```json\n{\n  \"name\": \"search_tours\",\n  \"description\": \"...\",\n  \"inputSchema\": { \"type\": \"object\", \"properties\": {} }\n}\n```\n\n`list-tools` returns all nine CLI names with mapped MCP names and live descriptions.\n\n## Tours and hotels\n\n`search-tours`, `search-hotels`, and `cheapest-tours` share these rules:\n\n- `date_from`…`date_to` is the departure (hotel check-in) window: `date_to` ≥ `date_from`, at most 31 days (a calendar month). A fixed stay is a one-day window: `date_from` = `date_to` = check-in, `nights_min` = `nights_max` = nights.\n- `price_max` and every returned `price` are totals for the whole party and the whole stay.\n- One offer per hotel (the cheapest), both providers merged; `more_offers` counts other dates/options for that hotel; `total_found` counts hotels. `rating` is on a 0–10 scale; `stars: null` = unknown. `limit` defaults to 10 (max 30).\n- Children: `kids_ages` (one age per child, 0–17) on `search-tours`, `search-hotels` and `cheapest-tours`.\n- Filters on our side (unknown values are hidden): `stars_max`, `beach_distance_max`, `beach_line_max`, `center_distance_max` (city hotels: `center_distance_m` in offers).\n- Resorts only Level.Travel knows (`resorts_level_travel_only` in `list-destinations`) are searched there only; a note says Travelata did not take part.\n- Dates more than ~5 months ahead: an empty result often means tours are not on sale yet (the note says so).\n- `meal` and `resort` take one value and `meal` matches exactly: for «завтраки или всё включено» or «Кемер или Белек» run one search per value. A resort includes its districts.\n- `resort` must be a name from `list-destinations` for that country; districts inside a region are listed as «Регион: Район». If a provider does not know the resort, it is skipped (see `notes`) rather than searched country-wide.\n- Always pass `nights_min` and `nights_max` explicitly (`nights_min` ≤ `nights_max`; defaults are 7–10 for tours and hotels). Level.Travel searches at most 5 night values: a wider range is clamped to `nights_min`…`nights_min`+4 with a note, while Travelata searches the full range. For wider ranges run several searches one after another.\n- Meal codes: `RO` (без питания), `BB` (завтраки), `HB` (полупансион), `FB` (полный пансион), `AI` (всё включено), `UAI` (ультра всё включено). Pass codes, not names: `meal` for `search-tours` / `search-hotels`, a `meals` list for `cheapest-tours`.\n- `search-hotels` also requires `departure_city` even for hotel-only stays. Pass the user's home city, or `Москва` if unknown; it only affects availability.\n- `beach_distance_max` (metres) and `beach_line_max` (1 = first line) keep only offers whose provider reports a value within the limit (unknown values are hidden); offers carry `beach_distance_m` and `beach_line` (`null` = unknown).\n- An empty result's note names the filters that removed the options and the cheapest blocked price — use it instead of a diagnostic re-search.\n- `get-tour-details` works for tour and hotel-only `offer_id`s. It returns the confirmed `price` (may differ from the search — re-check the budget), `transfer` (`group`, `individual`, or `none` = not included) and `flight_type` (`charter` / `regular`).\n- `hotels` (`search-tours` / `search-hotels`, up to 10 names in Latin script as the property spells it) compares specific properties: offers are limited to them and the result adds `named_hotels` — one entry per name with the matched `hotel`, `status` `matches`, `filtered_out` (with `reason`, e.g. over budget or fewer stars, plus `min_price`, `meal`, `check_in`, `nights`) or `not_found` (no offer for these dates, meal and party in this resort), and `other_matches` when a brand covers several hotels. Verify the matched `hotel` is the one meant. Search each resort separately.\n- `cheapest-tours` (`get_cheapest_travelata_tours`) is a quick Travelata-only overview of the cheapest tours: `departure_city`, `country`, `date_from`, `date_to`, optional `nights_min` / `nights_max`, `adults` (default 2), `kids_ages`, `resorts` (list), `meals` (list of codes), `stars_min`, `limit` (default 10). Refresh a chosen result with `get-tour-details` using its `offer_id`.\n\n## Flights\n\n- `search-flights` takes optional `return_date` (`YYYY-MM-DD`). A round trip longer than 30 days is answered as two one-way legs: items carry `\"leg\": \"outbound\"` or `\"leg\": \"return\"`, the total is their sum, and a note explains it.\n- One-way searches return the cheapest option per date, often a single item.\n- Prices are economy even when `trip_class` is not `0` (the server adds a note).\n- `price_per_adult` is per adult; `price_total_adults` multiplies it by `adults`. Child and infant fares are not provided — say so instead of guessing a family total.\n- Per leg: `transfers` and `duration_to_minutes` are outbound, `return_transfers` and `duration_back_minutes` are the way back; `duration_minutes` is both legs together.\n- `flight-calendar` requires `month` in `YYYY-MM`; its prices are one-way per date (a round trip costs more).\n- Round trips also check both one-way legs: when two one-way tickets are cheaper, the result adds `one_way_combo` (`outbound`, `return`, `price_per_adult`, `price_total_adults`). An empty result means nothing is cached for those dates, not that there are no flights. `departure_at` is local time.\n\n## Trains\n\n`search-trains` accepts Russian location names or 7-digit station codes,\n`depart_date` in `YYYY-MM-DD`, `sort` (`price`, `duration`, or `departure`), and\n`limit` from 1 to 20. Tutu.ru returns cached schedules and indicative prices,\nnot live inventory. The date is used in the result link but does not filter the\nupstream timetable. Always tell the user to verify that the train runs, seats\nare available, and the final price on Tutu.ru.\n\n## Activities\n\n`search-activities` ищет по теме через `query` (совпадение по основам слов в названии: «сафари», «острова», «Бурдж-Халифа») и принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Для `sort`: `recommended` (по умолчанию), `price`, `rating` или `reviews`.\n\nКаждый смешанный результат содержит `provider`, `price_unit` и `price_text`; `sources` показывает, сколько нашёл каждый источник и почему один мог не участвовать (`skipped`, `unavailable`, `city not found`). Даты и `children_allowed` поддерживает только Tripster — с ними Sputnik8 не участвует; для широкого обзора ищите без дат. Индивидуальные экскурсии Tripster — `per_group` (цена за всю группу до `max_persons`). Сравнивайте цены только при одинаковом `price_unit`; сортировка по цене не смешивает цену за человека, группу, билет и неизвестную единицу. Если один источник недоступен, покажите оставшиеся результаты без сообщения о сбое.\n\n## Output and exit codes\n\nEvery invocation prints exactly one JSON document to stdout (including `-h` / `--help`).\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success (including useful partial multi-provider results; also help) |\n| 2 | Usage or input error |\n| 1 | MCP / transport failure |\n\nOn failure, stdout is a small JSON object with `error`, `category`, and `message`. Stderr may contain only a short category token.\n\n| Category | Meaning | What to do |\n|----------|---------|------------|\n| `tool_error` | The server rejected or could not run the call; `message` is its text | See below |\n| `rate_limited` | HTTP 429 from the service; `message` includes `retry after N s` when the server sent `Retry-After` | Wait about a minute (or `N` seconds) |\n| `timeout`, `network_error`, `http_error`, others | Transport or protocol failure | Retry once later, then tell the user |\n\nFor `tool_error`, `message` is the first text item of the server's error with the `Error executing tool <name>: ` prefix and any URLs removed, capped at 300 characters. Typical texts:\n\n- Russian validation message (dates, nights, meal codes, …) — fix the input; do not repeat the same call.\n- «Источник отклонил параметры запроса…» — the provider rejected the parameters; change them.\n- «Источник временно недоступен. Повторите позже.» — provider outage; retry once later, then tell the user.\n- «Сервис поиска сейчас перегружен…» or «Слишком много запросов…» — rate limit; wait about a minute.\n\nNever start a second `search-tours` while one is running, and do not repeat it with identical arguments — widen dates or filters within the user's hard constraints instead.\n\n## Result normalization\n\nFor tool calls the CLI preserves normalized MCP data:\n\n1. If the tool result has `isError` exactly `true`, fail with `tool_error` (exit 1); only the sanitized first text item is surfaced as `message`, never `structuredContent`.\n2. Prefer `structuredContent` when present.\n3. Else, if the first text content item is a JSON document, decode and return it.\n4. Else return the MCP result/content object without inventing fields.\n\nUseful partial multi-provider payloads without `isError: true` remain success (exit 0).\n\n## Agent checklist\n\n- Exact geography, dates, nights, traveler composition, and **budget** are hard constraints.\n- Do **not** auto-show above-budget offers. Alternatives outside a hard constraint only after **explicit user consent**, in a **separate labeled section**.\n- Unknown child ages → clarify before bookable family prices.\n- Hotel-only → `search-hotels`.\n- Named properties → `hotels`; report every `named_hotels` entry, including why one does not fit.\n- Nothing fits → name the constraint that removed the options and ask before relaxing it.\n- Refresh a chosen tour → `get-tour-details`.\n- Missing short booking URL → do not substitute a raw URL.\n- Flight prices from search/calendar may be cached — not live tickets.\n- Tutu.ru train schedules/fares are cached and not date-verified — keep the warning and verify details through the returned link.\n\nFile v2.5.0:skill-card.md\n\n## Description:\n\nFinds package tours, hotels, flights, trains, and activities in Russian travel catalogs, with prices and booking links.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[missial](https://clawhub.ai/user/missial)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nTravelers and travel-planning agents use this skill to find tours, lodging, transport, and activities with prices and links for trip planning. It does not make bookings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Travel search criteria are sent to an external service.\n\nMitigation: Send only necessary search criteria; omit names, contact details, passport and payment details, and credentials.\n\nRisk: Listed prices and availability may change before booking.\n\nMitigation: Verify final prices and availability with the linked providers before booking.\n\n## Reference(s):\n\n- [Travel Search RU on ClawHub](https://clawhub.ai/missial/skills/travel-search-ru)\n- [Travel Search CLI usage](references/usage.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown travel options with prices, key details, and booking links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Search results are informational; prices and availability require provider confirmation.]\n\n## Skill Version(s):\n\n2.5.0 (source: skill metadata, package.json, server release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.5.0:package.json\n\n{\n  \"name\": \"travel-search-ru\",\n  \"version\": \"2.5.0\",\n  \"description\": \"Travel search for planning trips: tours, hotels, flights, trains, activities, prices, availability, and booking links.\",\n  \"keywords\": [\"agent-skill\", \"travel\", \"travel-planning\", \"trip-planner\", \"itinerary\", \"flights\", \"trains\", \"rail\", \"tours\", \"hotels\", \"excursions\", \"activities\", \"mcp\", \"russia\", \"turkey\", \"egypt\", \"путешествия\", \"планирование путешествий\", \"туры\", \"авиабилеты\", \"поезда\", \"жд билеты\", \"отели\", \"экскурсии\", \"booking\"],\n  \"author\": \"MissiaL\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/MissiaL/travel-search-ru.git\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"scripts/travel_search.py\",\n    \"references/usage.md\",\n    \"README.md\",\n    \"LICENSE\"\n  ]\n}\n\nFile v2.5.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 MissiaL\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.4.0: 9 files, 43930 bytes\n\nFiles: LICENSE (1064b), package.json (862b), README.md (9107b), references/usage.md (12692b), scripts/travel_search.py (25779b), skill-card.md (2011b), SKILL.md (13555b), tests/test_travel_search.py (83817b), _meta.json (135b)\n\nFile v2.4.0:SKILL.md\n\n---\nname: travel-search-ru\ndescription: \"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\"\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.4.0\"\n  keywords: \"travel,travel-planning,trip-planner,itinerary,flights,trains,rail,tours,hotels,excursions,activities,mcp,russia,turkey,egypt,путешествия,планирование путешествий,туры,авиабилеты,поезда,жд билеты,отели,экскурсии,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, trains, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `cheapest-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-trains`, `search-activities`, `list-destinations`.\n\nParameters below and in [references/usage.md](references/usage.md) are current. Run `describe <command>` once per command when you need a field not documented here; never invent fields from memory.\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Даты\n\n`YYYY-MM-DD` в примерах — заполнитель. Сначала определите сегодняшнюю дату; если она неизвестна, выполните `date +%F`. Все даты передавайте в формате `YYYY-MM-DD` и не раньше сегодняшней, месяц для `flight-calendar` — в формате `YYYY-MM`. Если год не назван («15 сентября», «в мае»), имеется в виду ближайший такой день или месяц в будущем.\n\n## Scope\n\n- Use this skill as the search layer of travel planning. Build itineraries with general reasoning; use the skill to find package tours, hotel-only stays, flights, trains, activities, destination directories, prices, and booking links.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a long-term travel workspace.\n- Exact geography stays fixed unless the user explicitly agrees to broaden it.\n\n## Hard constraints\n\nTreat these as non-negotiable filters — do not silently relax them:\n\n- Geography (country, resort, city, hotel when named)\n- Dates and night range\n- Traveler composition (adults, children, infants)\n- Budget when stated\n\nIf children are in the party and ages are unknown, **ask for ages** before presenting bookable family prices. Do not invent ages for pricing.\n\n**Budget:** never auto-show offers that break a hard budget. Alternatives outside any hard constraint may appear only after **explicit user consent**, and only in a **separate labeled section**. Alternatives that satisfy every hard constraint (e.g. other hotels when the named ones do not fit) need no consent.\n\n## When to use which command\n\n| Need | Command |\n|------|---------|\n| Package tour (flight + hotel) | `search-tours` |\n| Quick cheapest tours, Travelata only | `cheapest-tours` |\n| Hotel only (no flight) | `search-hotels` |\n| Fresh price/availability before booking a tour | `get-tour-details` |\n| Flight options | `search-flights` |\n| Flight price calendar / flexible dates | `flight-calendar` |\n| Train schedule and indicative fares | `search-trains` |\n| Excursions and activities | `search-activities` |\n| Resolve destinations / directories | `list-destinations` |\n\n## Activities\n\n`search-activities` ищет по теме через `query` («сафари», «острова») и принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Сортировка: `recommended` (по умолчанию), `price`, `rating` или `reviews`. В каждой записи указан источник `provider`, единица цены `price_unit` (`per_person`, `per_group`, `per_ticket` или `unknown`) и понятный текст `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка `price` не смешивает разные единицы.\n\n## Туры и отели\n\n- `date_from`…`date_to` — окно дат вылета (для `search-hotels` — заезда) не длиннее 30 дней.\n- Всегда передавайте `nights_min` и `nights_max` явно (по умолчанию 7–10) и держите диапазон не шире 5 значений: Level.Travel ищет только `nights_min`…`nights_min`+4 (сервер сузит диапазон и добавит примечание), Travelata — весь диапазон. Для более широкого диапазона сделайте несколько поисков по очереди.\n- Питание `meal` (в `cheapest-tours` — список `meals`) передавайте кодом: `RO` — без питания, `BB` — завтраки, `HB` — полупансион, `FB` — полный пансион, `AI` — всё включено, `UAI` — ультра всё включено.\n- `search-hotels` тоже требует `departure_city`: передайте домашний город пользователя, а если он неизвестен — «Москва». Город влияет только на доступность предложений.\n- В предложениях есть `beach_distance_m` и `beach_line` — данные источника; `null` значит «неизвестно», а не «близко». Рейтинг — по шкале 0–10.\n- Выдача — по одному варианту на отель (самый дешёвый); `more_offers` — сколько ещё дат и вариантов у отеля.\n- `cheapest-tours` — быстрый обзор самых дешёвых туров только из Travelata; для выбранного предложения вызовите `get-tour-details` с его `offer_id`.\n\n## Авиабилеты\n\n- `search-flights`: `return_date` (`YYYY-MM-DD`) необязателен. Поездку туда-обратно длиннее 30 дней сервер ищет как два перелёта в одну сторону: у элементов есть `leg` (`outbound` или `return`), итоговая цена — их сумма. Поиск в одну сторону возвращает самый дешёвый вариант на каждую дату — часто это один результат. Цены всегда для эконом-класса, даже если `trip_class` ≠ 0.\n- Цены авиабилетов — за одного взрослого; `price_total_adults` — сумма за взрослых. Детские тарифы источник не даёт — так и скажите.\n- `flight-calendar`: `month` в формате `YYYY-MM`; цены — за билет в одну сторону.\n\n## Ошибки\n\nПри ошибке CLI завершается с кодом 1 и печатает `{\"error\":true,\"category\":…,\"message\":…}`; для `tool_error` в `message` — текст сервера.\n\n- Сообщение о неверных данных — исправьте ввод и не повторяйте запрос без изменений.\n- «Источник отклонил параметры запроса…» — измените параметры.\n- «Источник временно недоступен…» (ошибка всего вызова) — повторите один раз чуть позже, затем сообщите пользователю.\n- «Сервис поиска сейчас перегружен…», «Слишком много запросов…» или `rate_limited` — подождите около минуты.\n- Не запускайте второй `search-tours`, пока не завершился первый, и не повторяйте его с теми же аргументами. Если результатов мало, расширяйте поиск в рамках жёстких ограничений или с согласия пользователя.\n\n## Workflow\n\n1. Clarify hard constraints: place, dates/nights, travelers, budget, and every must-have condition (meal, stars, distance to the beach).\n2. Translate each constraint into a parameter literally — never leave a must-have only in your head:\n   - Fixed stay («с 5 по 11») → `date_from` = `date_to` = check-in date, `nights_min` = `nights_max` = number of nights. Flexible dates → a `date_from`…`date_to` window.\n   - Budget → `price_max` for the whole party and the whole stay; convert per-person or per-night budgets first.\n   - Place → the exact resort name from `list-destinations` (a district inside a region looks like «Регион: Район»; a resort includes its districts).\n   - Conditions → their own parameters (`meal`, `stars_min`, `beach_distance_max`, `beach_line_max`). «Первая линия» → `beach_line_max` 1; «не дальше N м» → `beach_distance_max` N.\n   - «A или B» (two meals, two resorts) → one search per value: `meal` and `resort` take one value, and `meal` matches exactly.\n   - A star range («4–5★») → `stars_min` = lower bound; if only the lower bound shows up, search the upper bound too.\n3. Build `--input` as one JSON object (use `describe` only for a field not documented here).\n4. User named specific properties → pass them in `hotels` and search the resort where they are; properties in different resorts need separate searches. Check that each `named_hotels[].hotel` really is the property the user meant; a brand may return several (`other_matches`). If none fit, run the same search without `hotels` for alternatives.\n5. Call the command; preserve partial multi-provider results as success.\n6. For a specific offer, refresh with `get-tour-details` before booking guidance. The confirmed price may differ from the search price — re-check the budget and say if it changed.\n7. Present a short shortlist with prices, key facts, and links the server returned. When asked to compare named properties, cover each one from `named_hotels`: fits / does not fit (reason and price) / not found. When nothing fits, say which constraint removed the options and ask before relaxing it.\n\n## Rules\n\n- Russian catalog values/examples are intentional: the upstream directory uses Russian names. Preserve the user's answer language where possible; do not force Russian conversation. Use Russian catalog values for MCP calls when required.\n- **Fresh details** for a chosen tour use `get-tour-details`; do not reuse stale offer payloads as live quotes.\n- Prefer **short booking URLs** from the response. If a short URL is missing, **never** fall back to a raw/long provider URL.\n- **Cached flight prices** (including calendar data) are not live quotes — say they may be outdated.\n- **Tutu.ru train data is not real-time.** The requested date only shapes the result link. Verify the train, seats, and final price on Tutu.ru; never present `min_price_rub` as confirmed availability.\n- Если один источник недоступен, молча покажите полученные результаты и не сообщайте о сбое.\n- Keep the requested geography; show actual sub-area names without switching regions silently.\n- Default presentation: 5–8 strong options, calm text layout, group tours by hotel when multiple offers share one property.\n- When tours and activities are both relevant, search activities even if tour results are thin.\n\n## Presentation\n\n- Flights: route, dates, price, transfers/baggage notes if present, then link.\n- Trains: train number, departure/arrival time, travel time, indicative carriage prices, the non-real-time warning, then link.\n- Tours/hotels: property, stars/rating, area, meal, check-in and nights, price, brief fit note, then link.\n- Prefer short conclusions over long tables.\n\nFile v2.4.0:README.md\n\n# Travel Search RU\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![agentskills.io](https://img.shields.io/badge/agentskills.io-compatible-purple.svg)](https://agentskills.io)\n[![ClawHub](https://img.shields.io/badge/ClawHub-travel--search--ru-blue.svg)](https://clawhub.ai/skills/travel-search-ru)\n\nПоисковый слой для планирования путешествий с популярными туристическими сервисами: **Aviasales**, **Travelata**, **Level.Travel**, **Tutu.ru**, **Tripster** и **Sputnik8**.\n\nАгент может составить маршрут своими обычными инструментами, а навык найдёт для него авиабилеты, поезда, пакетные туры, отели и экскурсии. В ответе будут цены, ключевые параметры и короткие ссылки на выдачу. Навык работает в Claude Code, Cursor, Gemini CLI, GitHub Copilot и других AI-агентах.\n\n| Сервис | Что доступно |\n|--------|--------------|\n| **Aviasales** | Авиабилеты и календарь цен |\n| **Travelata** | Пакетные туры |\n| **Level.Travel** | Пакетные туры и отели без перелёта |\n| **Tutu.ru** | Кэшированное расписание поездов и ориентировочные цены |\n| **Tripster** | Экскурсии и активности |\n| **Sputnik8** | Экскурсии, билеты и активности |\n\n**Два способа подключения:** [Agent Skill](#установка) или [удалённый MCP-сервер](#mcp-сервер).\n\n## Демо\n\n### Codex: семейный отпуск в Кемере\n\n![Codex ищет тур и экскурсии в Кемере](https://github.com/MissiaL/travel-search-ru/releases/download/v2.1.0/codex-kemer-agent-log.gif)\n\nАнимация собрана из результатов живого MCP-запроса от 22 июля 2026 года; это не запись экрана. Перед бронированием уточняйте цену и доступность.\n\n![Travel search demo](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/book_small.gif)\n\n<details>\n<summary>Пример ответа</summary>\n\n![Запрос](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/request.webp)\n![Ответ часть 1](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response1.webp)\n![Ответ часть 2](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response2.webp)\n\n</details>\n\n## Совместимые агенты\n\nРаботает с любым AI-агентом, который поддерживает [agentskills.io](https://agentskills.io):\n\n**Claude Code** · **Cursor** · **Gemini CLI** · **GitHub Copilot** · **Windsurf** · **Junie** · **OpenCode** · **Goose** · **Aider** · **Cline** · **Roo Code** · **Amp** · **VS Code Agent** и 30+ других\n\n## Как это устроено\n\n```\nПользователь спрашивает про туры / отели / авиа / поезда / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)\n```\n\n| Команда CLI | Назначение |\n|-------------|------------|\n| `search-tours` | Пакетные туры (перелёт + отель) |\n| `cheapest-tours` | Быстрая подборка самых дешёвых туров Travelata |\n| `search-hotels` | Отели без перелёта |\n| `get-tour-details` | Актуальные детали тура перед бронированием |\n| `search-flights` | Варианты перелётов |\n| `flight-calendar` | Календарь цен на авиабилеты |\n| `search-trains` | Поезда Tutu.ru и ориентировочные цены |\n| `search-activities` | Экскурсии и активности |\n| `list-destinations` | Справочник направлений |\n\n## Установка\n\n```bash\ngit clone https://github.com/MissiaL/travel-search-ru.git travel-search-ru\n```\n\nИмя каталога должно совпадать с именем навыка: `travel-search-ru`.\n\n## CLI\n\nТолько стандартная библиотека Python 3.8+ (без pip-пакетов).\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe search-tours\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2}'\n```\n\nВместо `YYYY-MM-DD` подставьте реальные даты не раньше сегодняшней.\n\nАктуальные схемы полей — через `describe`, см. [references/usage.md](references/usage.md).\n\nОсобенности поиска:\n\n- `search-trains` возвращает кэшированное расписание Tutu.ru и ориентировочные цены. Дата используется в ссылке на выдачу; наличие поезда, мест и итоговую цену нужно проверить перед бронированием.\n- У `search-activities` поля `date_from` и `date_to` необязательны, а `persons` принимает значения от 1 до 100.\n- Для туров и отелей окно дат вылета (заезда) — не больше 30 дней, диапазон ночей лучше задавать явно и не шире 5 значений, питание — кодами `RO`, `BB`, `HB`, `FB`, `AI`, `UAI`.\n- Если сервер вернул ошибку, CLI передаёт её текст в поле `message` (категория `tool_error`); при перегрузке сервиса — категория `rate_limited`.\n\n## MCP-сервер\n\nТот же поиск доступен как удалённый MCP-сервер для агентов с поддержкой MCP, но без Agent Skills.\n\n**Эндпоинт:** `https://mcp.botclaw.ru/travel` (Streamable HTTP, без авторизации, только чтение)\n\n```bash\nclaude mcp add --transport http travel-search-ru https://mcp.botclaw.ru/travel\n```\n\nИли в конфигурации агента:\n\n```json\n{\n  \"mcpServers\": {\n    \"travel-search-ru\": {\n      \"url\": \"https://mcp.botclaw.ru/travel\"\n    }\n  }\n}\n```\n\n## Язык и каталог\n\nНавык оптимизирован под **русскоязычные запросы** и **русскоязычный каталог** (имена направлений и городов в upstream-справочнике на русском — отсюда русские примеры CLI). Это не принуждение к русскому диалогу: **язык ответа** по возможности совпадает с языком пользователя. Запросы **не на русском** тоже обрабатываются; для MCP при необходимости используются русские значения каталога.\n\n## Данные и удалённый сервис\n\nЕдинственный удалённый эндпоинт: `https://mcp.botclaw.ru/travel` (HTTPS, только чтение).\n\nНа сервис уходят **только переданные критерии поиска** (города, даты, состав путешественников и т.п.). Для поездов дата используется в ссылке Tutu.ru, но само расписание API по дате не фильтрует. Учётные данные не передаются; доступ к почте/календарю не используется; бронирование и долговременное хранение не выполняются.\n\n## Требования\n\n- Python 3.8+ (только стандартная библиотека)\n- Сетевой доступ к MCP-эндпоинту\n\n## Примеры запросов\n\n- «Спланируй поездку в Турцию на неделю с актуальными ценами»\n- «Найди туры в Турцию на двоих, 7 ночей в мае»\n- «Отель в Стамбуле без перелёта на 5 ночей»\n- «Дешёвые билеты из Москвы в Анталью в июне»\n- «Найди поезд из Москвы в Сочи на 15 сентября»\n- «Экскурсии в Кемере»\n\n## Лицензия\n\nMIT — см. [LICENSE](LICENSE).\n\nFile v2.4.0:_meta.json\n\n{\n  \"ownerId\": \"kn75rh4tzqmd6yy43xmswa5895841twa\",\n  \"slug\": \"travel-search-ru\",\n  \"version\": \"2.4.0\",\n  \"publishedAt\": 1791020102398\n}\n\nFile v2.4.0:references/usage.md\n\n# Travel Search CLI usage\n\n**Privacy:** Every command sends the supplied JSON search criteria to the live external production service. Criteria may contain itinerary/location, dates, traveler counts/ages, budget, and preferences. Do not include names, contacts, passport/payment details, credentials, or unnecessary sensitive data. The local skill does not persist requests, but no server-side retention guarantee is declared, so treat it as an external service.\n\nThe skill talks only to the production MCP endpoint over Streamable HTTP. There is no public `--url` flag and no environment-based endpoint override.\n\n## Commands\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py <command> --input '<JSON object>'\n```\n\n| CLI command | MCP tool |\n|-------------|----------|\n| `search-tours` | `search_tours` |\n| `cheapest-tours` | `get_cheapest_travelata_tours` |\n| `search-hotels` | `search_hotels` |\n| `get-tour-details` | `get_tour_details` |\n| `search-flights` | `search_flights` |\n| `flight-calendar` | `get_flight_price_calendar` |\n| `search-trains` | `search_train_tickets` |\n| `search-activities` | `search_activities` |\n| `list-destinations` | `list_destinations` |\n\n## Input\n\n`--input` must be a single JSON **object**. Arrays, strings, numbers, `null`, and `true`/`false` are rejected.\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py cheapest-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"resorts\":[\"Кемер\"],\"meals\":[\"AI\",\"UAI\"],\"limit\":5}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py flight-calendar --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"month\":\"YYYY-MM\"}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n### Dates\n\n`YYYY-MM-DD` / `YYYY-MM` above are placeholders. Determine today's date first (run `date +%F` if it is unknown). Every date is `YYYY-MM-DD` and must not be in the past; `flight-calendar` takes `month` as `YYYY-MM`. A day or month without a year means its next future occurrence. The server rejects past or malformed dates with a Russian validation message.\n\n## Discover schemas\n\nDo not hard-code provider field lists. Ask the live server:\n\n```bash\npython scripts/travel_search.py describe search-tours\n```\n\nResponse shape:\n\n```json\n{\n  \"name\": \"search_tours\",\n  \"description\": \"...\",\n  \"inputSchema\": { \"type\": \"object\", \"properties\": {} }\n}\n```\n\n`list-tools` returns all nine CLI names with mapped MCP names and live descriptions.\n\n## Tours and hotels\n\n`search-tours`, `search-hotels`, and `cheapest-tours` share these rules:\n\n- `date_from`…`date_to` is the departure (hotel check-in) window: `date_to` ≥ `date_from`, at most 30 days. A fixed stay is a one-day window: `date_from` = `date_to` = check-in, `nights_min` = `nights_max` = nights.\n- `price_max` and every returned `price` are totals for the whole party and the whole stay.\n- One offer per hotel (the cheapest), both providers merged; `more_offers` counts other dates/options for that hotel. `rating` is on a 0–10 scale.\n- `meal` and `resort` take one value and `meal` matches exactly: for «завтраки или всё включено» or «Кемер или Белек» run one search per value. A resort includes its districts.\n- `resort` must be a name from `list-destinations` for that country; districts inside a region are listed as «Регион: Район». If a provider does not know the resort, it is skipped (see `notes`) rather than searched country-wide.\n- Always pass `nights_min` and `nights_max` explicitly (`nights_min` ≤ `nights_max`; defaults are 7–10 for tours and hotels). Level.Travel searches at most 5 night values: a wider range is clamped to `nights_min`…`nights_min`+4 with a note, while Travelata searches the full range. For wider ranges run several searches one after another.\n- Meal codes: `RO` (без питания), `BB` (завтраки), `HB` (полупансион), `FB` (полный пансион), `AI` (всё включено), `UAI` (ультра всё включено). Pass codes, not names: `meal` for `search-tours` / `search-hotels`, a `meals` list for `cheapest-tours`.\n- `search-hotels` also requires `departure_city` even for hotel-only stays. Pass the user's home city, or `Москва` if unknown; it only affects availability.\n- `beach_distance_max` (metres) and `beach_line_max` (1 = first line) keep only offers whose provider reports a value within the limit (unknown values are hidden); offers carry `beach_distance_m` and `beach_line` (`null` = unknown).\n- An empty result's note names the filters that removed the options and the cheapest blocked price — use it instead of a diagnostic re-search.\n- `get-tour-details` works for tour and hotel-only `offer_id`s. It returns the confirmed `price` (may differ from the search — re-check the budget), `transfer` (`group`, `individual`, or `none` = not included) and `flight_type` (`charter` / `regular`).\n- `hotels` (`search-tours` / `search-hotels`, up to 10 names in Latin script as the property spells it) compares specific properties: offers are limited to them and the result adds `named_hotels` — one entry per name with the matched `hotel`, `status` `matches`, `filtered_out` (with `reason`, e.g. over budget or fewer stars, plus `min_price`, `meal`, `check_in`, `nights`) or `not_found` (no offer for these dates, meal and party in this resort), and `other_matches` when a brand covers several hotels. Verify the matched `hotel` is the one meant. Search each resort separately.\n- `cheapest-tours` (`get_cheapest_travelata_tours`) is a quick Travelata-only overview of the cheapest tours: `departure_city`, `country`, `date_from`, `date_to`, optional `nights_min` / `nights_max`, `adults` (default 2), `kids_ages`, `resorts` (list), `meals` (list of codes), `stars_min`, `limit` (default 10). Refresh a chosen result with `get-tour-details` using its `offer_id`.\n\n## Flights\n\n- `search-flights` takes optional `return_date` (`YYYY-MM-DD`). A round trip longer than 30 days is answered as two one-way legs: items carry `\"leg\": \"outbound\"` or `\"leg\": \"return\"`, the total is their sum, and a note explains it.\n- One-way searches return the cheapest option per date, often a single item.\n- Prices are economy even when `trip_class` is not `0` (the server adds a note).\n- `price_per_adult` is per adult; `price_total_adults` multiplies it by `adults`. Child and infant fares are not provided — say so instead of guessing a family total.\n- Per leg: `transfers` and `duration_to_minutes` are outbound, `return_transfers` and `duration_back_minutes` are the way back; `duration_minutes` is both legs together.\n- `flight-calendar` requires `month` in `YYYY-MM`; its prices are one-way per date (a round trip costs more).\n\n## Trains\n\n`search-trains` accepts Russian location names or 7-digit station codes,\n`depart_date` in `YYYY-MM-DD`, `sort` (`price`, `duration`, or `departure`), and\n`limit` from 1 to 20. Tutu.ru returns cached schedules and indicative prices,\nnot live inventory. The date is used in the result link but does not filter the\nupstream timetable. Always tell the user to verify that the train runs, seats\nare available, and the final price on Tutu.ru.\n\n## Activities\n\n`search-activities` ищет по теме через `query` (совпадение по основам слов в названии: «сафари», «острова», «Бурдж-Халифа») и принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Для `sort`: `recommended` (по умолчанию), `price`, `rating` или `reviews`.\n\nКаждый смешанный результат содержит `provider`, `price_unit` и `price_text`; `sources` показывает, сколько нашёл каждый источник и почему один мог не участвовать (`skipped`, `unavailable`, `city not found`). Даты и `children_allowed` поддерживает только Tripster — с ними Sputnik8 не участвует; для широкого обзора ищите без дат. Индивидуальные экскурсии Tripster — `per_group` (цена за всю группу до `max_persons`). Сравнивайте цены только при одинаковом `price_unit`; сортировка по цене не смешивает цену за человека, группу, билет и неизвестную единицу. Если один источник недоступен, покажите оставшиеся результаты без сообщения о сбое.\n\n## Output and exit codes\n\nEvery invocation prints exactly one JSON document to stdout (including `-h` / `--help`).\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success (including useful partial multi-provider results; also help) |\n| 2 | Usage or input error |\n| 1 | MCP / transport failure |\n\nOn failure, stdout is a small JSON object with `error`, `category`, and `message`. Stderr may contain only a short category token.\n\n| Category | Meaning | What to do |\n|----------|---------|------------|\n| `tool_error` | The server rejected or could not run the call; `message` is its text | See below |\n| `rate_limited` | HTTP 429 from the service; `message` includes `retry after N s` when the server sent `Retry-After` | Wait about a minute (or `N` seconds) |\n| `timeout`, `network_error`, `http_error`, others | Transport or protocol failure | Retry once later, then tell the user |\n\nFor `tool_error`, `message` is the first text item of the server's error with the `Error executing tool <name>: ` prefix and any URLs removed, capped at 300 characters. Typical texts:\n\n- Russian validation message (dates, nights, meal codes, …) — fix the input; do not repeat the same call.\n- «Источник отклонил параметры запроса…» — the provider rejected the parameters; change them.\n- «Источник временно недоступен. Повторите позже.» — provider outage; retry once later, then tell the user.\n- «Сервис поиска сейчас перегружен…» or «Слишком много запросов…» — rate limit; wait about a minute.\n\nNever start a second `search-tours` while one is running, and do not repeat it with identical arguments — widen dates or filters within the user's hard constraints instead.\n\n## Result normalization\n\nFor tool calls the CLI preserves normalized MCP data:\n\n1. If the tool result has `isError` exactly `true`, fail with `tool_error` (exit 1); only the sanitized first text item is surfaced as `message`, never `structuredContent`.\n2. Prefer `structuredContent` when present.\n3. Else, if the first text content item is a JSON document, decode and return it.\n4. Else return the MCP result/content object without inventing fields.\n\nUseful partial multi-provider payloads without `isError: true` remain success (exit 0).\n\n## Agent checklist\n\n- Exact geography, dates, nights, traveler composition, and **budget** are hard constraints.\n- Do **not** auto-show above-budget offers. Alternatives outside a hard constraint only after **explicit user consent**, in a **separate labeled section**.\n- Unknown child ages → clarify before bookable family prices.\n- Hotel-only → `search-hotels`.\n- Named properties → `hotels`; report every `named_hotels` entry, including why one does not fit.\n- Nothing fits → name the constraint that removed the options and ask before relaxing it.\n- Refresh a chosen tour → `get-tour-details`.\n- Missing short booking URL → do not substitute a raw URL.\n- Flight prices from search/calendar may be cached — not live tickets.\n- Tutu.ru train schedules/fares are cached and not date-verified — keep the warning and verify details through the returned link.\n\nFile v2.4.0:skill-card.md\n\n## Description:\n\nHelps agents search Russian travel catalogs for tours, hotels, flights, trains, and activities, then present prices and booking links for trip planning.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[missial](https://clawhub.ai/user/missial)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nTravelers and travel-planning agents use this skill to find and compare Russian-catalog tours, hotels, flights, trains, and activities against trip dates, party size, destination, and budget. It provides search results and booking links, but does not make bookings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Travel dates, cities, traveler counts or ages, budgets, and preferences are sent to an external travel service.\n\nMitigation: Share only search criteria; omit names, contact information, passport or payment details, and credentials.\n\nRisk: Listed prices and availability can change, and some flight and train prices are cached or indicative.\n\nMitigation: Refresh selected tour details and confirm final prices, seats, and availability with the linked provider before booking.\n\n## Reference(s):\n\n- [Travel Search RU on ClawHub](https://clawhub.ai/missial/skills/travel-search-ru)\n- [Usage reference](references/usage.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown travel shortlists with prices, trip details, and available booking links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Search results are informational; verify final prices and availability with providers before booking.]\n\n## Skill Version(s):\n\n2.4.0 (source: SKILL.md frontmatter, package.json, ClawHub release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.4.0:package.json\n\n{\n  \"name\": \"travel-search-ru\",\n  \"version\": \"2.4.0\",\n  \"description\": \"Travel search for planning trips: tours, hotels, flights, trains, activities, prices, availability, and booking links.\",\n  \"keywords\": [\"agent-skill\", \"travel\", \"travel-planning\", \"trip-planner\", \"itinerary\", \"flights\", \"trains\", \"rail\", \"tours\", \"hotels\", \"excursions\", \"activities\", \"mcp\", \"russia\", \"turkey\", \"egypt\", \"путешествия\", \"планирование путешествий\", \"туры\", \"авиабилеты\", \"поезда\", \"жд билеты\", \"отели\", \"экскурсии\", \"booking\"],\n  \"author\": \"MissiaL\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/MissiaL/travel-search-ru.git\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"scripts/travel_search.py\",\n    \"references/usage.md\",\n    \"README.md\",\n    \"LICENSE\"\n  ]\n}\n\nFile v2.4.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 MissiaL\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.3.0: 9 files, 41456 bytes\n\nFiles: LICENSE (1064b), package.json (862b), README.md (9107b), references/usage.md (9381b), scripts/travel_search.py (25779b), skill-card.md (1894b), SKILL.md (10944b), tests/test_travel_search.py (83817b), _meta.json (135b)\n\nFile v2.3.0:SKILL.md\n\n---\nname: travel-search-ru\ndescription: \"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\"\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.3.0\"\n  keywords: \"travel,travel-planning,trip-planner,itinerary,flights,trains,rail,tours,hotels,excursions,activities,mcp,russia,turkey,egypt,путешествия,планирование путешествий,туры,авиабилеты,поезда,жд билеты,отели,экскурсии,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, trains, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `cheapest-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-trains`, `search-activities`, `list-destinations`.\n\nCurrent tool schemas change over time. **Always** run `describe <command>` before a new parameter shape; do not invent fields from memory. See [references/usage.md](references/usage.md).\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Даты\n\n`YYYY-MM-DD` в примерах — заполнитель. Сначала определите сегодняшнюю дату; если она неизвестна, выполните `date +%F`. Все даты передавайте в формате `YYYY-MM-DD` и не раньше сегодняшней, месяц для `flight-calendar` — в формате `YYYY-MM`. Если год не назван («15 сентября», «в мае»), имеется в виду ближайший такой день или месяц в будущем.\n\n## Scope\n\n- Use this skill as the search layer of travel planning. Build itineraries with general reasoning; use the skill to find package tours, hotel-only stays, flights, trains, activities, destination directories, prices, and booking links.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a long-term travel workspace.\n- Exact geography stays fixed unless the user explicitly agrees to broaden it.\n\n## Hard constraints\n\nTreat these as non-negotiable filters — do not silently relax them:\n\n- Geography (country, resort, city, hotel when named)\n- Dates and night range\n- Traveler composition (adults, children, infants)\n- Budget when stated\n\nIf children are in the party and ages are unknown, **ask for ages** before presenting bookable family prices. Do not invent ages for pricing.\n\n**Budget:** never auto-show offers that break a hard budget. Alternatives outside any hard constraint may appear only after **explicit user consent**, and only in a **separate labeled section**.\n\n## When to use which command\n\n| Need | Command |\n|------|---------|\n| Package tour (flight + hotel) | `search-tours` |\n| Quick cheapest tours, Travelata only | `cheapest-tours` |\n| Hotel only (no flight) | `search-hotels` |\n| Fresh price/availability before booking a tour | `get-tour-details` |\n| Flight options | `search-flights` |\n| Flight price calendar / flexible dates | `flight-calendar` |\n| Train schedule and indicative fares | `search-trains` |\n| Excursions and activities | `search-activities` |\n| Resolve destinations / directories | `list-destinations` |\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Сортировка: `recommended` (по умолчанию), `price`, `rating` или `reviews`. В каждой записи указан источник `provider`, единица цены `price_unit` (`per_person`, `per_group`, `per_ticket` или `unknown`) и понятный текст `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка `price` не смешивает разные единицы.\n\n## Туры и отели\n\n- `date_from`…`date_to` — окно дат вылета (для `search-hotels` — заезда) не длиннее 30 дней.\n- Всегда передавайте `nights_min` и `nights_max` явно (по умолчанию 7–10) и держите диапазон не шире 5 значений: Level.Travel ищет только `nights_min`…`nights_min`+4 (сервер сузит диапазон и добавит примечание), Travelata — весь диапазон. Для более широкого диапазона сделайте несколько поисков по очереди.\n- Питание `meal` (в `cheapest-tours` — список `meals`) передавайте кодом: `RO` — без питания, `BB` — завтраки, `HB` — полупансион, `FB` — полный пансион, `AI` — всё включено, `UAI` — ультра всё включено.\n- `search-hotels` тоже требует `departure_city`: передайте домашний город пользователя, а если он неизвестен — «Москва». Город влияет только на доступность предложений.\n- `cheapest-tours` — быстрый обзор самых дешёвых туров только из Travelata; для выбранного предложения вызовите `get-tour-details` с его `offer_id`.\n\n## Авиабилеты\n\n- `search-flights`: `return_date` (`YYYY-MM-DD`) необязателен. Поездку туда-обратно длиннее 30 дней сервер ищет как два перелёта в одну сторону: у элементов есть `leg` (`outbound` или `return`), итоговая цена — их сумма. Поиск в одну сторону возвращает самый дешёвый вариант на каждую дату — часто это один результат. Цены всегда для эконом-класса, даже если `trip_class` ≠ 0.\n- `flight-calendar`: `month` в формате `YYYY-MM`.\n\n## Ошибки\n\nПри ошибке CLI завершается с кодом 1 и печатает `{\"error\":true,\"category\":…,\"message\":…}`; для `tool_error` в `message` — текст сервера.\n\n- Сообщение о неверных данных — исправьте ввод и не повторяйте запрос без изменений.\n- «Источник отклонил параметры запроса…» — измените параметры.\n- «Источник временно недоступен…» (ошибка всего вызова) — повторите один раз чуть позже, затем сообщите пользователю.\n- «Сервис поиска сейчас перегружен…», «Слишком много запросов…» или `rate_limited` — подождите около минуты.\n- Не запускайте второй `search-tours`, пока не завершился первый, и не повторяйте его с теми же аргументами. Если результатов мало, расширяйте поиск в рамках жёстких ограничений или с согласия пользователя.\n\n## Workflow\n\n1. Clarify hard constraints (place, dates/nights, travelers, budget).\n2. Resolve ambiguous places with `list-destinations` when needed.\n3. `describe` the command you will call; build `--input` as one JSON object.\n4. Call the command; preserve partial multi-provider results as success.\n5. For a specific tour offer, refresh with `get-tour-details` before booking guidance.\n6. Present a short shortlist with prices, key facts, and links the server returned.\n\n## Rules\n\n- Russian catalog values/examples are intentional: the upstream directory uses Russian names. Preserve the user's answer language where possible; do not force Russian conversation. Use Russian catalog values for MCP calls when required.\n- **Fresh details** for a chosen tour use `get-tour-details`; do not reuse stale offer payloads as live quotes.\n- Prefer **short booking URLs** from the response. If a short URL is missing, **never** fall back to a raw/long provider URL.\n- **Cached flight prices** (including calendar data) are not live quotes — say they may be outdated.\n- **Tutu.ru train data is not real-time.** The requested date only shapes the result link. Verify the train, seats, and final price on Tutu.ru; never present `min_price_rub` as confirmed availability.\n- Если один источник недоступен, молча покажите полученные результаты и не сообщайте о сбое.\n- Keep the requested geography; show actual sub-area names without switching regions silently.\n- Default presentation: 5–8 strong options, calm text layout, group tours by hotel when multiple offers share one property.\n- When tours and activities are both relevant, search activities even if tour results are thin.\n\n## Presentation\n\n- Flights: route, dates, price, transfers/baggage notes if present, then link.\n- Trains: train number, departure/arrival time, travel time, indicative carriage prices, the non-real-time warning, then link.\n- Tours/hotels: property, stars/rating, area, meal, check-in and nights, price, brief fit note, then link.\n- Prefer short conclusions over long tables.\n\nFile v2.3.0:README.md\n\n# Travel Search RU\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![agentskills.io](https://img.shields.io/badge/agentskills.io-compatible-purple.svg)](https://agentskills.io)\n[![ClawHub](https://img.shields.io/badge/ClawHub-travel--search--ru-blue.svg)](https://clawhub.ai/skills/travel-search-ru)\n\nПоисковый слой для планирования путешествий с популярными туристическими сервисами: **Aviasales**, **Travelata**, **Level.Travel**, **Tutu.ru**, **Tripster** и **Sputnik8**.\n\nАгент может составить маршрут своими обычными инструментами, а навык найдёт для него авиабилеты, поезда, пакетные туры, отели и экскурсии. В ответе будут цены, ключевые параметры и короткие ссылки на выдачу. Навык работает в Claude Code, Cursor, Gemini CLI, GitHub Copilot и других AI-агентах.\n\n| Сервис | Что доступно |\n|--------|--------------|\n| **Aviasales** | Авиабилеты и календарь цен |\n| **Travelata** | Пакетные туры |\n| **Level.Travel** | Пакетные туры и отели без перелёта |\n| **Tutu.ru** | Кэшированное расписание поездов и ориентировочные цены |\n| **Tripster** | Экскурсии и активности |\n| **Sputnik8** | Экскурсии, билеты и активности |\n\n**Два способа подключения:** [Agent Skill](#установка) или [удалённый MCP-сервер](#mcp-сервер).\n\n## Демо\n\n### Codex: семейный отпуск в Кемере\n\n![Codex ищет тур и экскурсии в Кемере](https://github.com/MissiaL/travel-search-ru/releases/download/v2.1.0/codex-kemer-agent-log.gif)\n\nАнимация собрана из результатов живого MCP-запроса от 22 июля 2026 года; это не запись экрана. Перед бронированием уточняйте цену и доступность.\n\n![Travel search demo](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/book_small.gif)\n\n<details>\n<summary>Пример ответа</summary>\n\n![Запрос](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/request.webp)\n![Ответ часть 1](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response1.webp)\n![Ответ часть 2](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response2.webp)\n\n</details>\n\n## Совместимые агенты\n\nРаботает с любым AI-агентом, который поддерживает [agentskills.io](https://agentskills.io):\n\n**Claude Code** · **Cursor** · **Gemini CLI** · **GitHub Copilot** · **Windsurf** · **Junie** · **OpenCode** · **Goose** · **Aider** · **Cline** · **Roo Code** · **Amp** · **VS Code Agent** и 30+ других\n\n## Как это устроено\n\n```\nПользователь спрашивает про туры / отели / авиа / поезда / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)\n```\n\n| Команда CLI | Назначение |\n|-------------|------------|\n| `search-tours` | Пакетные туры (перелёт + отель) |\n| `cheapest-tours` | Быстрая подборка самых дешёвых туров Travelata |\n| `search-hotels` | Отели без перелёта |\n| `get-tour-details` | Актуальные детали тура перед бронированием |\n| `search-flights` | Варианты перелётов |\n| `flight-calendar` | Календарь цен на авиабилеты |\n| `search-trains` | Поезда Tutu.ru и ориентировочные цены |\n| `search-activities` | Экскурсии и активности |\n| `list-destinations` | Справочник направлений |\n\n## Установка\n\n```bash\ngit clone https://github.com/MissiaL/travel-search-ru.git travel-search-ru\n```\n\nИмя каталога должно совпадать с именем навыка: `travel-search-ru`.\n\n## CLI\n\nТолько стандартная библиотека Python 3.8+ (без pip-пакетов).\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe search-tours\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2}'\n```\n\nВместо `YYYY-MM-DD` подставьте реальные даты не раньше сегодняшней.\n\nАктуальные схемы полей — через `describe`, см. [references/usage.md](references/usage.md).\n\nОсобенности поиска:\n\n- `search-trains` возвращает кэшированное расписание Tutu.ru и ориентировочные цены. Дата используется в ссылке на выдачу; наличие поезда, мест и итоговую цену нужно проверить перед бронированием.\n- У `search-activities` поля `date_from` и `date_to` необязательны, а `persons` принимает значения от 1 до 100.\n- Для туров и отелей окно дат вылета (заезда) — не больше 30 дней, диапазон ночей лучше задавать явно и не шире 5 значений, питание — кодами `RO`, `BB`, `HB`, `FB`, `AI`, `UAI`.\n- Если сервер вернул ошибку, CLI передаёт её текст в поле `message` (категория `tool_error`); при перегрузке сервиса — категория `rate_limited`.\n\n## MCP-сервер\n\nТот же поиск доступен как удалённый MCP-сервер для агентов с поддержкой MCP, но без Agent Skills.\n\n**Эндпоинт:** `https://mcp.botclaw.ru/travel` (Streamable HTTP, без авторизации, только чтение)\n\n```bash\nclaude mcp add --transport http travel-search-ru https://mcp.botclaw.ru/travel\n```\n\nИли в конфигурации агента:\n\n```json\n{\n  \"mcpServers\": {\n    \"travel-search-ru\": {\n      \"url\": \"https://mcp.botclaw.ru/travel\"\n    }\n  }\n}\n```\n\n## Язык и каталог\n\nНавык оптимизирован под **русскоязычные запросы** и **русскоязычный каталог** (имена направлений и городов в upstream-справочнике на русском — отсюда русские примеры CLI). Это не принуждение к русскому диалогу: **язык ответа** по возможности совпадает с языком пользователя. Запросы **не на русском** тоже обрабатываются; для MCP при необходимости используются русские значения каталога.\n\n## Данные и удалённый сервис\n\nЕдинственный удалённый эндпоинт: `https://mcp.botclaw.ru/travel` (HTTPS, только чтение).\n\nНа сервис уходят **только переданные критерии поиска** (города, даты, состав путешественников и т.п.). Для поездов дата используется в ссылке Tutu.ru, но само расписание API по дате не фильтрует. Учётные данные не передаются; доступ к почте/календарю не используется; бронирование и долговременное хранение не выполняются.\n\n## Требования\n\n- Python 3.8+ (только стандартная библиотека)\n- Сетевой доступ к MCP-эндпоинту\n\n## Примеры запросов\n\n- «Спланируй поездку в Турцию на неделю с актуальными ценами»\n- «Найди туры в Турцию на двоих, 7 ночей в мае»\n- «Отель в Стамбуле без перелёта на 5 ночей»\n- «Дешёвые билеты из Москвы в Анталью в июне»\n- «Найди поезд из Москвы в Сочи на 15 сентября»\n- «Экскурсии в Кемере»\n\n## Лицензия\n\nMIT — см. [LICENSE](LICENSE).\n\nFile v2.3.0:_meta.json\n\n{\n  \"ownerId\": \"kn75rh4tzqmd6yy43xmswa5895841twa\",\n  \"slug\": \"travel-search-ru\",\n  \"version\": \"2.3.0\",\n  \"publishedAt\": 1790976038366\n}\n\nFile v2.3.0:references/usage.md\n\n# Travel Search CLI usage\n\n**Privacy:** Every command sends the supplied JSON search criteria to the live external production service. Criteria may contain itinerary/location, dates, traveler counts/ages, budget, and preferences. Do not include names, contacts, passport/payment details, credentials, or unnecessary sensitive data. The local skill does not persist requests, but no server-side retention guarantee is declared, so treat it as an external service.\n\nThe skill talks only to the production MCP endpoint over Streamable HTTP. There is no public `--url` flag and no environment-based endpoint override.\n\n## Commands\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py <command> --input '<JSON object>'\n```\n\n| CLI command | MCP tool |\n|-------------|----------|\n| `search-tours` | `search_tours` |\n| `cheapest-tours` | `get_cheapest_travelata_tours` |\n| `search-hotels` | `search_hotels` |\n| `get-tour-details` | `get_tour_details` |\n| `search-flights` | `search_flights` |\n| `flight-calendar` | `get_flight_price_calendar` |\n| `search-trains` | `search_train_tickets` |\n| `search-activities` | `search_activities` |\n| `list-destinations` | `list_destinations` |\n\n## Input\n\n`--input` must be a single JSON **object**. Arrays, strings, numbers, `null`, and `true`/`false` are rejected.\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py cheapest-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"resorts\":[\"Кемер\"],\"meals\":[\"AI\",\"UAI\"],\"limit\":5}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py flight-calendar --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"month\":\"YYYY-MM\"}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n### Dates\n\n`YYYY-MM-DD` / `YYYY-MM` above are placeholders. Determine today's date first (run `date +%F` if it is unknown). Every date is `YYYY-MM-DD` and must not be in the past; `flight-calendar` takes `month` as `YYYY-MM`. A day or month without a year means its next future occurrence. The server rejects past or malformed dates with a Russian validation message.\n\n## Discover schemas\n\nDo not hard-code provider field lists. Ask the live server:\n\n```bash\npython scripts/travel_search.py describe search-tours\n```\n\nResponse shape:\n\n```json\n{\n  \"name\": \"search_tours\",\n  \"description\": \"...\",\n  \"inputSchema\": { \"type\": \"object\", \"properties\": {} }\n}\n```\n\n`list-tools` returns all nine CLI names with mapped MCP names and live descriptions.\n\n## Tours and hotels\n\n`search-tours`, `search-hotels`, and `cheapest-tours` share these rules:\n\n- `date_from`…`date_to` is the departure (hotel check-in) window: `date_to` ≥ `date_from`, at most 30 days.\n- Always pass `nights_min` and `nights_max` explicitly (`nights_min` ≤ `nights_max`; defaults are 7–10 for tours and hotels). Level.Travel searches at most 5 night values: a wider range is clamped to `nights_min`…`nights_min`+4 with a note, while Travelata searches the full range. For wider ranges run several searches one after another.\n- Meal codes: `RO` (без питания), `BB` (завтраки), `HB` (полупансион), `FB` (полный пансион), `AI` (всё включено), `UAI` (ультра всё включено). Pass codes, not names: `meal` for `search-tours` / `search-hotels`, a `meals` list for `cheapest-tours`.\n- `search-hotels` also requires `departure_city` even for hotel-only stays. Pass the user's home city, or `Москва` if unknown; it only affects availability.\n- `cheapest-tours` (`get_cheapest_travelata_tours`) is a quick Travelata-only overview of the cheapest tours: `departure_city`, `country`, `date_from`, `date_to`, optional `nights_min` / `nights_max`, `adults` (default 2), `kids_ages`, `resorts` (list), `meals` (list of codes), `stars_min`, `limit` (default 10). Refresh a chosen result with `get-tour-details` using its `offer_id`.\n\n## Flights\n\n- `search-flights` takes optional `return_date` (`YYYY-MM-DD`). A round trip longer than 30 days is answered as two one-way legs: items carry `\"leg\": \"outbound\"` or `\"leg\": \"return\"`, the total is their sum, and a note explains it.\n- One-way searches return the cheapest option per date, often a single item.\n- Prices are economy even when `trip_class` is not `0` (the server adds a note).\n- `flight-calendar` requires `month` in `YYYY-MM`.\n\n## Trains\n\n`search-trains` accepts Russian location names or 7-digit station codes,\n`depart_date` in `YYYY-MM-DD`, `sort` (`price`, `duration`, or `departure`), and\n`limit` from 1 to 20. Tutu.ru returns cached schedules and indicative prices,\nnot live inventory. The date is used in the result link but does not filter the\nupstream timetable. Always tell the user to verify that the train runs, seats\nare available, and the final price on Tutu.ru.\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Для `sort`: `recommended` (по умолчанию), `price`, `rating` или `reviews`.\n\nКаждый смешанный результат содержит `provider`, `price_unit` и `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка по цене не смешивает цену за человека, группу, билет и неизвестную единицу. Если один источник недоступен, покажите оставшиеся результаты без сообщения о сбое.\n\n## Output and exit codes\n\nEvery invocation prints exactly one JSON document to stdout (including `-h` / `--help`).\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success (including useful partial multi-provider results; also help) |\n| 2 | Usage or input error |\n| 1 | MCP / transport failure |\n\nOn failure, stdout is a small JSON object with `error`, `category`, and `message`. Stderr may contain only a short category token.\n\n| Category | Meaning | What to do |\n|----------|---------|------------|\n| `tool_error` | The server rejected or could not run the call; `message` is its text | See below |\n| `rate_limited` | HTTP 429 from the service; `message` includes `retry after N s` when the server sent `Retry-After` | Wait about a minute (or `N` seconds) |\n| `timeout`, `network_error`, `http_error`, others | Transport or protocol failure | Retry once later, then tell the user |\n\nFor `tool_error`, `message` is the first text item of the server's error with the `Error executing tool <name>: ` prefix and any URLs removed, capped at 300 characters. Typical texts:\n\n- Russian validation message (dates, nights, meal codes, …) — fix the input; do not repeat the same call.\n- «Источник отклонил параметры запроса…» — the provider rejected the parameters; change them.\n- «Источник временно недоступен. Повторите позже.» — provider outage; retry once later, then tell the user.\n- «Сервис поиска сейчас перегружен…» or «Слишком много запросов…» — rate limit; wait about a minute.\n\nNever start a second `search-tours` while one is running, and do not repeat it with identical arguments — widen dates or filters within the user's hard constraints instead.\n\n## Result normalization\n\nFor tool calls the CLI preserves normalized MCP data:\n\n1. If the tool result has `isError` exactly `true`, fail with `tool_error` (exit 1); only the sanitized first text item is surfaced as `message`, never `structuredContent`.\n2. Prefer `structuredContent` when present.\n3. Else, if the first text content item is a JSON document, decode and return it.\n4. Else return the MCP result/content object without inventing fields.\n\nUseful partial multi-provider payloads without `isError: true` remain success (exit 0).\n\n## Agent checklist\n\n- Exact geography, dates, nights, traveler composition, and **budget** are hard constraints.\n- Do **not** auto-show above-budget offers. Alternatives outside a hard constraint only after **explicit user consent**, in a **separate labeled section**.\n- Unknown child ages → clarify before bookable family prices.\n- Hotel-only → `search-hotels`.\n- Refresh a chosen tour → `get-tour-details`.\n- Missing short booking URL → do not substitute a raw URL.\n- Flight prices from search/calendar may be cached — not live tickets.\n- Tutu.ru train schedules/fares are cached and not date-verified — keep the warning and verify details through the returned link.\n\nFile v2.3.0:skill-card.md\n\n## Description:\n\nHelps agents find tours, hotels, flights, trains, and activities with indicative prices and booking links for travel planning.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[missial](https://clawhub.ai/user/missial)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nTravelers and travel-planning agents use the skill to compare package tours, hotels, flights, trains, and excursions and retrieve links to provider listings. It does not book travel.\n\n### Deployment Geography for Use:\n\nGlobal; searches use a Russian-language travel catalog and depend on destination coverage.\n\n## Known Risks and Mitigations:\n\nRisk: Trip criteria are sent to an external travel search service.\n\nMitigation: Do not include passport, payment, contact, credential, or other unnecessary sensitive information in searches.\n\nRisk: Cached or indicative results may not match current availability or final prices.\n\nMitigation: Check the final travel dates, availability, and booking price on provider sites before making a decision.\n\n## Reference(s):\n\n- [Travel Search CLI usage](references/usage.md)\n- [Travel Search RU on ClawHub](https://clawhub.ai/missial/skills/travel-search-ru)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Concise travel options with prices, key details, caveats, and booking links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Cached flight prices and train data may be outdated; confirm availability and final prices with providers.]\n\n## Skill Version(s):\n\n2.3.0 (source: skill metadata, package.json, server release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.3.0:package.json\n\n{\n  \"name\": \"travel-search-ru\",\n  \"version\": \"2.3.0\",\n  \"description\": \"Travel search for planning trips: tours, hotels, flights, trains, activities, prices, availability, and booking links.\",\n  \"keywords\": [\"agent-skill\", \"travel\", \"travel-planning\", \"trip-planner\", \"itinerary\", \"flights\", \"trains\", \"rail\", \"tours\", \"hotels\", \"excursions\", \"activities\", \"mcp\", \"russia\", \"turkey\", \"egypt\", \"путешествия\", \"планирование путешествий\", \"туры\", \"авиабилеты\", \"поезда\", \"жд билеты\", \"отели\", \"экскурсии\", \"booking\"],\n  \"author\": \"MissiaL\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/MissiaL/travel-search-ru.git\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"scripts/travel_search.py\",\n    \"references/usage.md\",\n    \"README.md\",\n    \"LICENSE\"\n  ]\n}\n\nFile v2.3.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026 MissiaL\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v2.2.0: 8 files, 34889 bytes\n\nFiles: package.json (847b), README.md (8315b), references/usage.md (5311b), scripts/travel_search.py (23712b), skill-card.md (2382b), SKILL.md (6893b), tests/test_travel_search.py (76398b), _meta.json (135b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: travel-search-ru\ndescription: \"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\"\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.2.0\"\n  keywords: \"travel,travel-planning,trip-planner,itinerary,flights,trains,rail,tours,hotels,excursions,activities,mcp,russia,turkey,egypt,путешествия,планирование путешествий,туры,авиабилеты,поезда,жд билеты,отели,экскурсии,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, trains, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-trains`, `search-activities`, `list-destinations`.\n\nCurrent tool schemas change over time. **Always** run `describe <command>` before a new parameter shape; do not invent fields from memory. See [references/usage.md](references/usage.md).\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"2026-09-15\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"2026-09-15\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-12\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Scope\n\n- Use this skill as the search layer of travel planning. Build itineraries with general reasoning; use the skill to find package tours, hotel-only stays, flights, trains, activities, destination directories, prices, and booking links.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a long-term travel workspace.\n- Exact geography stays fixed unless the user explicitly agrees to broaden it.\n\n## Hard constraints\n\nTreat these as non-negotiable filters — do not silently relax them:\n\n- Geography (country, resort, city, hotel when named)\n- Dates and night range\n- Traveler composition (adults, children, infants)\n- Budget when stated\n\nIf children are in the party and ages are unknown, **ask for ages** before presenting bookable family prices. Do not invent ages for pricing.\n\n**Budget:** never auto-show offers that break a hard budget. Alternatives outside any hard constraint may appear only after **explicit user consent**, and only in a **separate labeled section**.\n\n## When to use which command\n\n| Need | Command |\n|------|---------|\n| Package tour (flight + hotel) | `search-tours` |\n| Hotel only (no flight) | `search-hotels` |\n| Fresh price/availability before booking a tour | `get-tour-details` |\n| Flight options | `search-flights` |\n| Flight price calendar / flexible dates | `flight-calendar` |\n| Train schedule and indicative fares | `search-trains` |\n| Excursions and activities | `search-activities` |\n| Resolve destinations / directories | `list-destinations` |\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Сортировка: `recommended` (по умолчанию), `price`, `rating` или `reviews`. В каждой записи указан источник `provider`, единица цены `price_unit` (`per_person`, `per_group`, `per_ticket` или `unknown`) и понятный текст `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка `price` не смешивает разные единицы.\n## Workflow\n\n1. Clarify hard constraints (place, dates/nights, travelers, budget).\n2. Resolve ambiguous places with `list-destinations` when needed.\n3. `describe` the command you will call; build `--input` as one JSON object.\n4. Call the command; preserve partial multi-provider results as success.\n5. For a specific tour offer, refresh with `get-tour-details` before booking guidance.\n6. Present a short shortlist with prices, key facts, and links the server returned.\n\n## Rules\n\n- Russian catalog values/examples are intentional: the upstream directory uses Russian names. Preserve the user's answer language where possible; do not force Russian conversation. Use Russian catalog values for MCP calls when required.\n- **Hotel-only** requests use `search-hotels`, not package `search-tours`.\n- **Fresh details** for a chosen tour use `get-tour-details`; do not reuse stale offer payloads as live quotes.\n- Prefer **short booking URLs** from the response. If a short URL is missing, **never** fall back to a raw/long provider URL.\n- **Cached flight prices** (including calendar data) are not live quotes — say they may be outdated.\n- **Tutu.ru train data is not real-time.** The requested date only shapes the result link. Verify the train, seats, and final price on Tutu.ru; never present `min_price_rub` as confirmed availability.\n- Если один источник недоступен, молча покажите полученные результаты и не сообщайте о сбое.\n- Keep the requested geography; show actual sub-area names without switching regions silently.\n- Default presentation: 5–8 strong options, calm text layout, group tours by hotel when multiple offers share one property.\n- When tours and activities are both relevant, search activities even if tour results are thin.\n\n## Presentation\n\n- Flights: route, dates, price, transfers/baggage notes if present, then link.\n- Trains: train number, departure/arrival time, travel time, indicative carriage prices, the non-real-time warning, then link.\n- Tours/hotels: property, stars/rating, area, meal, check-in and nights, price, brief fit note, then link.\n- Prefer short conclusions over long tables.\n\nFile v2.2.0:README.md\n\n# Travel Search RU\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![agentskills.io](https://img.shields.io/badge/agentskills.io-compatible-purple.svg)](https://agentskills.io)\n[![ClawHub](https://img.shields.io/badge/ClawHub-travel--search--ru-blue.svg)](https://clawhub.ai/skills/travel-search-ru)\n\nПоисковый слой для планирования путешествий с популярными туристическими сервисами: **Aviasales**, **Travelata**, **Level.Travel**, **Tutu.ru**, **Tripster** и **Sputnik8**.\n\nАгент может составить маршрут своими обычными инструментами, а навык найдёт для него авиабилеты, поезда, пакетные туры, отели и экскурсии. В ответе будут цены, ключевые параметры и короткие ссылки на выдачу. Навык работает в Claude Code, Cursor, Gemini CLI, GitHub Copilot и других AI-агентах.\n\n| Сервис | Что доступно |\n|--------|--------------|\n| **Aviasales** | Авиабилеты и календарь цен |\n| **Travelata** | Пакетные туры |\n| **Level.Travel** | Пакетные туры и отели без перелёта |\n| **Tutu.ru** | Кэшированное расписание поездов и ориентировочные цены |\n| **Tripster** | Экскурсии и активности |\n| **Sputnik8** | Экскурсии, билеты и активности |\n\n**Два способа подключения:** [Agent Skill](#установка) или [удалённый MCP-сервер](#mcp-сервер).\n\n## Демо\n\n### Codex: семейный отпуск в Кемере\n\n![Codex ищет тур и экскурсии в Кемере](https://github.com/MissiaL/travel-search-ru/releases/download/v2.1.0/codex-kemer-agent-log.gif)\n\nАнимация собрана из результатов живого MCP-запроса от 22 июля 2026 года; это не запись экрана. Перед бронированием уточняйте цену и доступность.\n\n![Travel search demo](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/book_small.gif)\n\n<details>\n<summary>Пример ответа</summary>\n\n![Запрос](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/request.webp)\n![Ответ часть 1](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response1.webp)\n![Ответ часть 2](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response2.webp)\n\n</details>\n\n## Совместимые агенты\n\nРаботает с любым AI-агентом, который поддерживает [agentskills.io](https://agentskills.io):\n\n**Claude Code** · **Cursor** · **Gemini CLI** · **GitHub Copilot** · **Windsurf** · **Junie** · **OpenCode** · **Goose** · **Aider** · **Cline** · **Roo Code** · **Amp** · **VS Code Agent** и 30+ других\n\n## Как это устроено\n\n```\nПользователь спрашивает про туры / отели / авиа / поезда / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)\n```\n\n| Команда CLI | Назначение |\n|-------------|------------|\n| `search-tours` | Пакетные туры (перелёт + отель) |\n| `search-hotels` | Отели без перелёта |\n| `get-tour-details` | Актуальные детали тура перед бронированием |\n| `search-flights` | Варианты перелётов |\n| `flight-calendar` | Календарь цен на авиабилеты |\n| `search-trains` | Поезда Tutu.ru и ориентировочные цены |\n| `search-activities` | Экскурсии и активности |\n| `list-destinations` | Справочник направлений |\n\n## Установка\n\n```bash\ngit clone https://github.com/MissiaL/travel-search-ru.git travel-search-ru\n```\n\nИмя каталога должно совпадать с именем навыка: `travel-search-ru`.\n\n## CLI\n\nТолько стандартная библиотека Python 3.8+ (без pip-пакетов).\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe search-tours\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\n```\n\nАктуальные схемы полей — через `describe`, см. [references/usage.md](references/usage.md).\n\nОсобенности поиска:\n\n- `search-trains` возвращает кэшированное расписание Tutu.ru и ориентировочные цены. Дата используется в ссылке на выдачу; наличие поезда, мест и итоговую цену нужно проверить перед бронированием.\n- У `search-activities` поля `date_from` и `date_to` необязательны, а `persons` принимает значения от 1 до 100.\n\n## MCP-сервер\n\nТот же поиск доступен как удалённый MCP-сервер для агентов с поддержкой MCP, но без Agent Skills.\n\n**Эндпоинт:** `https://mcp.botclaw.ru/travel` (Streamable HTTP, без авторизации, только чтение)\n\n```bash\nclaude mcp add --transport http travel-search-ru https://mcp.botclaw.ru/travel\n```\n\nИли в конфигурации агента:\n\n```json\n{\n  \"mcpServers\": {\n    \"travel-search-ru\": {\n      \"url\": \"https://mcp.botclaw.ru/travel\"\n    }\n  }\n}\n```\n\n## Язык и каталог\n\nНавык оптимизирован под **русскоязычные запросы** и **русскоязычный каталог** (имена направлений и городов в upstream-справочнике на русском — отсюда русские примеры CLI). Это не принуждение к русскому диалогу: **язык ответа** по возможности совпадает с языком пользователя. Запросы **не на русском** тоже обрабатываются; для MCP при необходимости используются русские значения каталога.\n\n## Данные и удалённый сервис\n\nЕдинственный удалённый эндпоинт: `https://mcp.botclaw.ru/travel` (HTTPS, только чтение).\n\nНа сервис уходят **только переданные критерии поиска** (города, даты, состав путешественников и т.п.). Для поездов дата используется в ссылке Tutu.ru, но само расписание API по дате не фильтрует. Учётные данные не передаются; доступ к почте/календарю не используется; бронирование и долговременное хранение не выполняются.\n\n## Требования\n\n- Python 3.8+ (только стандартная библиотека)\n- Сетевой доступ к MCP-эндпоинту\n\n## Примеры запросов\n\n- «Спланируй поездку в Турцию на неделю с актуальными ценами»\n- «Найди туры в Турцию на двоих, 7 ночей в мае»\n- «Отель в Стамбуле без перелёта на 5 ночей»\n- «Дешёвые билеты из Москвы в Анталью в июне»\n- «Найди поезд из Москвы в Сочи на 15 сентября»\n- «Экскурсии в Кемере»\n\n## Лицензия\n\nMIT\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn75rh4tzqmd6yy43xmswa5895841twa\",\n  \"slug\": \"travel-search-ru\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1786985538178\n}\n\nFile v2.2.0:references/usage.md\n\n# Travel Search CLI usage\n\n**Privacy:** Every command sends the supplied JSON search criteria to the live external production service. Criteria may contain itinerary/location, dates, traveler counts/ages, budget, and preferences. Do not include names, contacts, passport/payment details, credentials, or unnecessary sensitive data. The local skill does not persist requests, but no server-side retention guarantee is declared, so treat it as an external service.\n\nThe skill talks only to the production MCP endpoint over Streamable HTTP. There is no public `--url` flag and no environment-based endpoint override.\n\n## Commands\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py <command> --input '<JSON object>'\n```\n\n| CLI command | MCP tool |\n|-------------|----------|\n| `search-tours` | `search_tours` |\n| `search-hotels` | `search_hotels` |\n| `get-tour-details` | `get_tour_details` |\n| `search-flights` | `search_flights` |\n| `flight-calendar` | `get_flight_price_calendar` |\n| `search-trains` | `search_train_tickets` |\n| `search-activities` | `search_activities` |\n| `list-destinations` | `list_destinations` |\n\n## Input\n\n`--input` must be a single JSON **object**. Arrays, strings, numbers, `null`, and `true`/`false` are rejected.\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"2026-09-15\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"2026-09-15\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-12\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Discover schemas\n\nDo not hard-code provider field lists. Ask the live server:\n\n```bash\npython scripts/travel_search.py describe search-tours\n```\n\nResponse shape:\n\n```json\n{\n  \"name\": \"search_tours\",\n  \"description\": \"...\",\n  \"inputSchema\": { \"type\": \"object\", \"properties\": {} }\n}\n```\n\n`list-tools` returns all eight CLI names with mapped MCP names and live descriptions.\n\n## Trains\n\n`search-trains` accepts Russian location names or 7-digit station codes,\n`depart_date` in `YYYY-MM-DD`, `sort` (`price`, `duration`, or `departure`), and\n`limit` from 1 to 20. Tutu.ru returns cached schedules and indicative prices,\nnot live inventory. The date is used in the result link but does not filter the\nupstream timetable. Always tell the user to verify that the train runs, seats\nare available, and the final price on Tutu.ru.\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Для `sort`: `recommended` (по умолчанию), `price`, `rating` или `reviews`.\n\nКаждый смешанный результат содержит `provider`, `price_unit` и `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка по цене не смешивает цену за человека, группу, билет и неизвестную единицу. Если один источник недоступен, покажите оставшиеся результаты без сообщения о сбое.\n\n## Output and exit codes\n\nEvery invocation prints exactly one JSON document to stdout (including `-h` / `--help`).\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success (including useful partial multi-provider results; also help) |\n| 2 | Usage or input error |\n| 1 | MCP / transport failure |\n\nOn failure, stdout is a small JSON object with `error`, `category`, and `message`. Stderr may contain only a short category token. Raw tool-error content is never echoed.\n\n## Result normalization\n\nFor tool calls the CLI preserves normalized MCP data:\n\n1. If the tool result has `isError` exactly `true`, fail with a safe error (exit 1) — do not surface `content` / `structuredContent`.\n2. Prefer `structuredContent` when present.\n3. Else, if the first text content item is a JSON document, decode and return it.\n4. Else return the MCP result/content object without inventing fields.\n\nUseful partial multi-provider payloads without `isError: true` remain success (exit 0).\n\n## Agent checklist\n\n- Exact geography, dates, nights, traveler composition, and **budget** are hard constraints.\n- Do **not** auto-show above-budget offers. Alternatives outside a hard constraint only after **explicit user consent**, in a **separate labeled section**.\n- Unknown child ages → clarify before bookable family prices.\n- Hotel-only → `search-hotels`.\n- Refresh a chosen tour → `get-tour-details`.\n- Missing short booking URL → do not substitute a raw URL.\n- Flight prices from search/calendar may be cached — not live tickets.\n- Tutu.ru train schedules/fares are cached and not date-verified — keep the warning and verify details through the returned link.\n\nFile v2.2.0:skill-card.md\n\n## Description:\n\nTravel Search RU helps agents search Russian-catalog package tours, hotels, flights, trains, excursions, prices, and booking links for travel planning.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[missial](https://clawhub.ai/user/missial)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal users and travel-planning agents use this skill as a search layer for tours, hotel-only stays, flights, trains, activities, destination lookup, prices, and returned booking links. It supports itinerary planning without making bookings or storing a long-term travel workspace.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Trip criteria such as destinations, dates, traveler counts, child ages, budgets, and preferences are sent to an external read-only service.\n\nMitigation: Do not include names, contacts, passport or payment details, credentials, or other unnecessary sensitive data in search inputs.\n\nRisk: Returned travel descriptions, prices, availability, and booking links may be stale or untrusted.\n\nMitigation: Verify final prices, availability, booking details, and provider terms on the provider site before acting.\n\nRisk: Tutu.ru train data and some flight price data may be cached rather than live inventory.\n\nMitigation: Present those values as indicative and tell users to verify train operation, seats, final fares, and live ticket availability through the returned link.\n\n## Reference(s):\n\n- [Travel Search RU ClawHub page](https://clawhub.ai/missial/skills/travel-search-ru)\n- [Travel Search CLI usage](references/usage.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, JSON, shell commands, guidance]\n\n**Output Format:** [Markdown travel shortlists and guidance backed by CLI JSON responses]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Search results may include prices, availability notes, provider names, and booking links; train and flight data can be cached and should be verified before action.]\n\n## Skill Version(s):\n\n2.2.0 (source: server release, frontmatter, package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.2.0:package.json\n\n{\n  \"name\": \"travel-search-ru\",\n  \"version\": \"2.2.0\",\n  \"description\": \"Travel search for planning trips: tours, hotels, flights, trains, activities, prices, availability, and booking links.\",\n  \"keywords\": [\"agent-skill\", \"travel\", \"travel-planning\", \"trip-planner\", \"itinerary\", \"flights\", \"trains\", \"rail\", \"tours\", \"hotels\", \"excursions\", \"activities\", \"mcp\", \"russia\", \"turkey\", \"egypt\", \"путешествия\", \"планирование путешествий\", \"туры\", \"авиабилеты\", \"поезда\", \"жд билеты\", \"отели\", \"экскурсии\", \"booking\"],\n  \"author\": \"MissiaL\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/MissiaL/travel-search-ru.git\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"scripts/travel_search.py\",\n    \"references/usage.md\",\n    \"README.md\"\n  ]\n}\n\nArchive v2.1.1: 8 files, 34437 bytes\n\nFiles: package.json (790b), README.md (8806b), references/usage.md (4526b), scripts/travel_search.py (23667b), skill-card.md (2436b), SKILL.md (6326b), tests/test_travel_search.py (75692b), _meta.json (135b)\n\nFile v2.1.1:SKILL.md\n\n---\nname: travel-search-ru\ndescription: \"Use while planning a trip or vacation when current Russian-catalog options are needed: search and compare package tours, hotels, flights, excursions, activities, prices, availability, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\"\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.1.1\"\n  keywords: \"travel,travel-planning,trip-planner,itinerary,flights,tours,hotels,excursions,activities,mcp,russia,turkey,egypt,путешествия,планирование путешествий,туры,авиабилеты,отели,экскурсии,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-activities`, `list-destinations`.\n\nCurrent tool schemas change over time. **Always** run `describe <command>` before a new parameter shape; do not invent fields from memory. See [references/usage.md](references/usage.md).\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"2026-09-15\",\"adults\":1}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-12\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Scope\n\n- Use this skill as the live-search layer of travel planning. Build itineraries with general reasoning; use the skill to find current package tours, hotel-only stays, flights, activities, destination directories, prices, and booking links.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a long-term travel workspace.\n- Exact geography stays fixed unless the user explicitly agrees to broaden it.\n\n## Hard constraints\n\nTreat these as non-negotiable filters — do not silently relax them:\n\n- Geography (country, resort, city, hotel when named)\n- Dates and night range\n- Traveler composition (adults, children, infants)\n- Budget when stated\n\nIf children are in the party and ages are unknown, **ask for ages** before presenting bookable family prices. Do not invent ages for pricing.\n\n**Budget:** never auto-show offers that break a hard budget. Alternatives outside any hard constraint may appear only after **explicit user consent**, and only in a **separate labeled section**.\n\n## When to use which command\n\n| Need | Command |\n|------|---------|\n| Package tour (flight + hotel) | `search-tours` |\n| Hotel only (no flight) | `search-hotels` |\n| Fresh price/availability before booking a tour | `get-tour-details` |\n| Flight options | `search-flights` |\n| Flight price calendar / flexible dates | `flight-calendar` |\n| Excursions and activities | `search-activities` |\n| Resolve destinations / directories | `list-destinations` |\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Сортировка: `recommended` (по умолчанию), `price`, `rating` или `reviews`. В каждой записи указан источник `provider`, единица цены `price_unit` (`per_person`, `per_group`, `per_ticket` или `unknown`) и понятный текст `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка `price` не смешивает разные единицы.\n## Workflow\n\n1. Clarify hard constraints (place, dates/nights, travelers, budget).\n2. Resolve ambiguous places with `list-destinations` when needed.\n3. `describe` the command you will call; build `--input` as one JSON object.\n4. Call the command; preserve partial multi-provider results as success.\n5. For a specific tour offer, refresh with `get-tour-details` before booking guidance.\n6. Present a short shortlist with prices, key facts, and links the server returned.\n\n## Rules\n\n- Russian catalog values/examples are intentional: the upstream directory uses Russian names. Preserve the user's answer language where possible; do not force Russian conversation. Use Russian catalog values for MCP calls when required.\n- **Hotel-only** requests use `search-hotels`, not package `search-tours`.\n- **Fresh details** for a chosen tour use `get-tour-details`; do not reuse stale offer payloads as live quotes.\n- Prefer **short booking URLs** from the response. If a short URL is missing, **never** fall back to a raw/long provider URL.\n- **Cached flight prices** (including calendar data) are not live quotes — say they may be outdated.\n- Если один источник недоступен, молча покажите полученные результаты и не сообщайте о сбое.\n- Keep the requested geography; show actual sub-area names without switching regions silently.\n- Default presentation: 5–8 strong options, calm text layout, group tours by hotel when multiple offers share one property.\n- When tours and activities are both relevant, search activities even if tour results are thin.\n\n## Presentation\n\n- Flights: route, dates, price, transfers/baggage notes if present, then link.\n- Tours/hotels: property, stars/rating, area, meal, check-in and nights, price, brief fit note, then link.\n- Prefer short conclusions over long tables.\n\nFile v2.1.1:README.md\n\n# Travel Search RU\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![agentskills.io](https://img.shields.io/badge/agentskills.io-compatible-purple.svg)](https://agentskills.io)\n[![ClawHub](https://img.shields.io/badge/ClawHub-travel--search--ru-blue.svg)](https://clawhub.ai/skills/travel-search-ru)\n\nПоисковый слой для планирования путешествий с популярными туристическими сервисами: **Aviasales**, **Travelata**, **Level.Travel** и **Sputnik8**.\n\nАгент может составить маршрут своими обычными инструментами, а навык найдёт для него актуальные авиабилеты, пакетные туры, отели и экскурсии. В ответе будут цены, ключевые параметры и короткие ссылки на выдачу. Навык работает в Claude Code, Cursor, Gemini CLI, GitHub Copilot и других AI-агентах.\n\n| Сервис | Что доступно |\n|--------|--------------|\n| **Aviasales** | Авиабилеты и календарь цен |\n| **Travelata** | Пакетные туры |\n| **Level.Travel** | Пакетные туры и отели без перелёта |\n| **Tripster** | Экскурсии и активности |\n| **Sputnik8** | Экскурсии, билеты и активности |\n\n**Два способа подключения:** [Agent Skill](#установка) или [удалённый MCP-сервер](#mcp-сервер).\n\n## Демо\n\n### Codex: семейный отпуск в Кемере\n\n![Codex ищет тур и экскурсии в Кемере](https://github.com/MissiaL/travel-search-ru/releases/download/v2.1.0/codex-kemer-agent-log.gif)\n\nАнимация собрана из результатов живого MCP-запроса от 22 июля 2026 года; это не запись экрана. Перед бронированием уточняйте цену и доступность.\n\n![Travel search demo](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/book_small.gif)\n\n<details>\n<summary>Пример ответа</summary>\n\n![Запрос](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/request.webp)\n![Ответ часть 1](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response1.webp)\n![Ответ часть 2](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response2.webp)\n\n</details>\n\n## Совместимые агенты\n\nРаботает с любым AI-агентом, который поддерживает [agentskills.io](https://agentskills.io):\n\n**Claude Code** · **Cursor** · **Gemini CLI** · **GitHub Copilot** · **Windsurf** · **Junie** · **OpenCode** · **Goose** · **Aider** · **Cline** · **Roo Code** · **Amp** · **VS Code Agent** и 30+ других\n\n## Как это устроено\n\n```\nПользователь спрашивает про туры / отели / авиа / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)\n```\n\n| Команда CLI | Назначение |\n|-------------|------------|\n| `search-tours` | Пакетные туры (перелёт + отель) |\n| `search-hotels` | Отели без перелёта |\n| `get-tour-details` | Актуальные детали тура перед бронированием |\n| `search-flights` | Варианты перелётов |\n| `flight-calendar` | Календарь цен на авиабилеты |\n| `search-activities` | Экскурсии и активности |\n| `list-destinations` | Справочник направлений |\n\n## Установка\n\n```bash\ngit clone https://github.com/MissiaL/travel-search-ru.git travel-search-ru\n```\n\nИмя каталога должно совпадать с именем навыка: `travel-search-ru`.\n\n## CLI\n\nТолько стандартная библиотека Python 3.8+ (без pip-пакетов).\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe search-tours\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\n```\n\nАктуальные схемы полей — через `describe`, см. [references/usage.md](references/usage.md).\n\n## MCP-сервер\n\nТот же поиск доступен как удалённый MCP-сервер для агентов с поддержкой MCP, но без Agent Skills.\n\n**Эндпоинт:** `https://mcp.botclaw.ru/travel` (Streamable HTTP, без авторизации, только чтение)\n\n```bash\nclaude mcp add --transport http travel-search-ru https://mcp.botclaw.ru/travel\n```\n\nИли в конфигурации агента:\n\n```json\n{\n  \"mcpServers\": {\n    \"travel-search-ru\": {\n      \"url\": \"https://mcp.botclaw.ru/travel\"\n    }\n  }\n}\n```\n\n## Язык и каталог\n\nНавык оптимизирован под **русскоязычные запросы** и **русскоязычный каталог** (имена направлений и городов в upstream-справочнике на русском — отсюда русские примеры CLI). Это не принуждение к русскому диалогу: **язык ответа** по возможности совпадает с языком пользователя. Запросы **не на русском** тоже обрабатываются; для MCP при необходимости используются русские значения каталога.\n\n## Данные и удалённый сервис\n\nЕдинственный удалённый эндпоинт: `https://mcp.botclaw.ru/travel` (HTTPS, только чтение).\n\nНа сервис уходят **только переданные критерии поиска** (города, даты, состав путешественников и т.п.). Учётные данные не передаются; доступ к почте/календарю не используется; бронирование и долговременное хранение не выполняются.\n\n## Миграция на 2.0.0\n\n- **v1.3.1** остаётся доступной через неизменяемый тег/релиз `v1.3.1`.\n- **v2.0.0** убирает `api_call.py` и сырые ссылки на провайдеров; вместо них вызывайте команды `scripts/travel_search.py`.\n- Поля `--input` берите из live-схемы (`describe`), а не из старых provider-документов.\n\n## Изменения в 2.1.1\n\nНавык лучше находится по русскоязычным запросам о планировании путешествия. Он подключается к планированию как источник актуальных туров, отелей, авиабилетов и экскурсий, а маршрут агент составляет своими обычными инструментами.\n\n## Изменения в 2.1.0\n\n`search-activities` объединяет Tripster и Sputnik8. Для экскурсий доступны необязательные фильтры дат `date_from` и `date_to`, `persons` от 1 до 100, `children_allowed` и сортировка `recommended`, `price`, `rating` или `reviews`.\n\nКаждая запись указывает `provider`, `price_unit` и `price_text`. Сравнивайте цены только с одинаковым `price_unit`: цена за человека, группу и билет — разные единицы.\n\n## Требования\n\n- Python 3.8+ (только стандартная библиотека)\n- Сетевой доступ к MCP-эндпоинту\n\n## Примеры запросов\n\n- «Спланируй поездку в Турцию на неделю с актуальными ценами»\n- «Найди туры в Турцию на двоих, 7 ночей в мае»\n- «Отель в Стамбуле без перелёта на 5 ночей»\n- «Дешёвые билеты из Москвы в Анталью в июне»\n- «Экскурсии в Кемере»\n\n## Лицензия\n\nMIT\n\nFile v2.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn75rh4tzqmd6yy43xmswa5895841twa\",\n  \"slug\": \"travel-search-ru\",\n  \"version\": \"2.1.1\",\n  \"publishedAt\": 1786949769625\n}\n\nFile v2.1.1:references/usage.md\n\n# Travel Search CLI usage\n\n**Privacy:** Every command sends the supplied JSON search criteria to the live external production service. Criteria may contain itinerary/location, dates, traveler counts/ages, budget, and preferences. Do not include names, contacts, passport/payment details, credentials, or unnecessary sensitive data. The local skill does not persist requests, but no server-side retention guarantee is declared, so treat it as an external service.\n\nThe skill talks only to the production MCP endpoint over Streamable HTTP. There is no public `--url` flag and no environment-based endpoint override.\n\n## Commands\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py <command> --input '<JSON object>'\n```\n\n| CLI command | MCP tool |\n|-------------|----------|\n| `search-tours` | `search_tours` |\n| `search-hotels` | `search_hotels` |\n| `get-tour-details` | `get_tour_details` |\n| `search-flights` | `search_flights` |\n| `flight-calendar` | `get_flight_price_calendar` |\n| `search-activities` | `search_activities` |\n| `list-destinations` | `list_destinations` |\n\n## Input\n\n`--input` must be a single JSON **object**. Arrays, strings, numbers, `null`, and `true`/`false` are rejected.\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"2026-09-15\",\"adults\":1}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-12\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Discover schemas\n\nDo not hard-code provider field lists. Ask the live server:\n\n```bash\npython scripts/travel_search.py describe search-tours\n```\n\nResponse shape:\n\n```json\n{\n  \"name\": \"search_tours\",\n  \"description\": \"...\",\n  \"inputSchema\": { \"type\": \"object\", \"properties\": {} }\n}\n```\n\n`list-tools` returns all seven CLI names with mapped MCP names and live descriptions.\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Для `sort`: `recommended` (по умолчанию), `price`, `rating` или `reviews`.\n\nКаждый смешанный результат содержит `provider`, `price_unit` и `price_text`. Сравнивайте цены только при одинаковом `price_unit`; сортировка по цене не смешивает цену за человека, группу, билет и неизвестную единицу. Если один источник недоступен, покажите оставшиеся результаты без сообщения о сбое.\n\n## Output and exit codes\n\nEvery invocation prints exactly one JSON document to stdout (including `-h` / `--help`).\n\n| Code | Meaning |\n|------|---------|\n| 0 | Success (including useful partial multi-provider results; also help) |\n| 2 | Usage or input error |\n| 1 | MCP / transport failure |\n\nOn failure, stdout is a small JSON object with `error`, `category`, and `message`. Stderr may contain only a short category token. Raw tool-error content is never echoed.\n\n## Result normalization\n\nFor tool calls the CLI preserves normalized MCP data:\n\n1. If the tool result has `isError` exactly `true`, fail with a safe error (exit 1) — do not surface `content` / `structuredContent`.\n2. Prefer `structuredContent` when present.\n3. Else, if the first text content item is a JSON document, decode and return it.\n4. Else return the MCP result/content object without inventing fields.\n\nUseful partial multi-provider payloads without `isError: true` remain success (exit 0).\n\n## Agent checklist\n\n- Exact geography, dates, nights, traveler composition, and **budget** are hard constraints.\n- Do **not** auto-show above-budget offers. Alternatives outside a hard constraint only after **explicit user consent**, in a **separate labeled section**.\n- Unknown child ages → clarify before bookable family prices.\n- Hotel-only → `search-hotels`.\n- Refresh a chosen tour → `get-tour-details`.\n- Missing short booking URL → do not substitute a raw URL.\n- Flight prices from search/calendar may be cached — not live tickets.\n\nFile v2.1.1:skill-card.md\n\n## Description:\n\nSearches current Russian-catalog package tours, hotels, flights, excursions, activities, prices, availability, and booking links for travel-planning requests.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[missial](https://clawhub.ai/user/missial)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and travel-planning agents use this skill to find current tours, hotel-only stays, flights, activities, prices, availability, and booking links from a Russian-language travel catalog. It is a search layer for itinerary planning and does not make bookings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Search criteria such as destinations, dates, traveler counts, ages, budgets, and preferences are sent to an external travel service.\n\nMitigation: Do not include names, passport details, payment data, credentials, or unnecessary sensitive information in search inputs.\n\nRisk: Returned travel options, prices, and availability may be incomplete, cached, or stale.\n\nMitigation: Treat results as search output, disclose cached flight prices when relevant, and verify selected options with the provider before booking guidance.\n\nRisk: Travel constraints such as geography, dates, traveler composition, and budget can materially affect suitability and price.\n\nMitigation: Clarify hard constraints before searching, ask for child ages when needed for family pricing, and only show above-budget or out-of-scope alternatives after explicit user consent.\n\n## Reference(s):\n\n- [README](README.md)\n- [Travel Search CLI usage](references/usage.md)\n- [ClawHub skill page](https://clawhub.ai/missial/skills/travel-search-ru)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [JSON CLI responses summarized by the agent as text or Markdown]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Results may include prices, availability, provider fields, and booking links; the skill does not book travel or persist local data.]\n\n## Skill Version(s):\n\n2.1.1 (source: evidence.json release, SKILL.md metadata, package.json)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v2.1.1:package.json\n\n{\n  \"name\": \"travel-search-ru\",\n  \"version\": \"2.1.1\",\n  \"description\": \"Live search for planning trips: package tours, hotels, flights, excursions, prices, availability, and booking links.\",\n  \"keywords\": [\"agent-skill\", \"travel\", \"travel-planning\", \"trip-planner\", \"itinerary\", \"flights\", \"tours\", \"hotels\", \"excursions\", \"activities\", \"mcp\", \"russia\", \"turkey\", \"egypt\", \"путешествия\", \"планирование путешествий\", \"туры\", \"авиабилеты\", \"отели\", \"экскурсии\", \"booking\"],\n  \"author\": \"MissiaL\",\n  \"license\": \"MIT\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/MissiaL/travel-search-ru.git\"\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"scripts/travel_search.py\",\n    \"references/usage.md\",\n    \"README.md\"\n  ]\n}\n\nArchive v2.1.0: 8 files, 33626 bytes\n\nFiles: package.json (580b), README.md (7534b), references/usage.md (4526b), scripts/travel_search.py (23667b), skill-card.md (2560b), SKILL.md (5926b), tests/test_travel_search.py (75446b), _meta.json (135b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: travel-search-ru\ndescription: Use when the user explicitly asks to search or compare current travel inventory, prices, availability, or booking links through this travel MCP (package tours, hotels, flights, or activities). Do not use for general travel advice, itinerary brainstorming, or non-search discussion. Optimized for Russian-language requests and a Russian-language catalog.\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.1.0\"\n  keywords: \"travel,flights,tours,hotels,excursions,mcp,russia,turkey,egypt,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-activities`, `list-destinations`.\n\nCurrent tool schemas change over time. **Always** run `describe <command>` before a new parameter shape; do not invent fields from memory. See [references/usage.md](references/usage.md).\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-20\",\"adults\":2}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"2026-09-15\",\"adults\":1}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"2026-09-10\",\"date_to\":\"2026-09-12\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Scope\n\n- Finds package tours, hotel-only stays, flights, activities, and destination directories; returns prices and booking links when the server provides them.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a long-term travel workspace.\n- Exact geography stays fixed unless the user explicitly agrees to broaden it.\n\n## Hard constraints\n\nTreat these as non-negotiable filters — do not silently relax them:\n\n- Geography (country, resort, city, hotel when named)\n- Dates and night range\n- Traveler composition (adults, children, infants)\n- Budget when stated\n\nIf children are in the party and ages are unknown, **ask for ages** before presenting bookable family prices. Do not invent ages for pricing.\n\n**Budget:** never auto-show offers that break a hard budget. Alternatives outside any hard constraint may appear only after **explicit user consent**, and only in a **separate labeled section**.\n\n## When to use which command\n\n| Need | Command |\n|------|---------|\n| Package tour (flight + hotel) | `search-tours` |\n| Hotel only (no flight) | `search-hotels` |\n| Fresh price/availability before booking a tour | `get-tour-details` |\n| Flight options | `search-flights` |\n| Flight price calendar / flexible dates | `flight-calendar` |\n| Excursions and activities | `search-activities` |\n| Resolve destinations / directories | `list-destinations` |\n\n## Activities\n\n`search-activities` принимает необязательные `date_from` и `date_to` в формате `YYYY-MM-DD` (`date_from` ≤ `date_to`), `persons` от 1 до 100 и булево `children_allowed`. Сортировка: `recommended` (по умолчанию), `price`, `rating` или `reviews`. В каждой записи у\n\nArchive v2.0.2: 7 files, 15044 bytes\n\nFiles: package.json (580b), README.md (6117b), references/usage.md (3587b), scripts/travel_search.py (23667b), skill-card.md (2817b), SKILL.md (4942b), _meta.json (135b)\n\nArchive v2.0.1: 7 files, 14712 bytes\n\nFiles: package.json (580b), README.md (6117b), references/usage.md (3150b), scripts/travel_search.py (23667b), skill-card.md (2586b), SKILL.md (4830b), _meta.json (135b)\n\nArchive v2.0.0: 7 files, 13842 bytes\n\nFiles: package.json (580b), README.md (4794b), references/usage.md (3150b), scripts/travel_search.py (23667b), skill-card.md (2172b), SKILL.md (4323b), _meta.json (135b)\n\nArchive v1.3.1: 16 files, 34590 bytes\n\nFiles: assets/departure-cities.json (908b), package.json (614b), README.md (7771b), references/aviasales-data-api.md (16812b), references/aviasales-links.md (2420b), references/leveltravel-api.md (12427b), references/sputnik8-api.md (5804b), references/tour-selection-playbook.md (1749b), references/travelata-api.md (10927b), references/travelata-directories.md (2869b), references/travelpayouts-utils.md (2228b), scripts/api_call.py (4213b), skill-card.md (2821b), SKILL.md (12685b), tests/test_api_call.py (1407b), _meta.json (135b)","readmeExcerpt":"Skill: Travel Search RU Owner: missial Summary: Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search. Tags: latest:2.5.0 Version histo","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"python scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools"},{"language":"bash","snippet":"python scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'"},{"language":"text","snippet":"Пользователь спрашивает про туры / отели / авиа / поезда / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)"},{"language":"bash","snippet":"git clone https://github.com/MissiaL/travel-search-ru.git travel-search-ru"},{"language":"bash","snippet":"python scripts/travel_search.py list-tools\npython scripts/travel_search.py describe search-tours\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2}'"},{"language":"bash","snippet":"claude mcp add --transport http travel-search-ru https://mcp.botclaw.ru/travel"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: travel-search-ru\ndescription: \"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search.\"\ncompatibility: Requires Python 3.8+ and outbound HTTPS access to https://mcp.botclaw.ru/travel. Search criteria are sent to this read-only service; it does not book.\nmetadata:\n  author: MissiaL\n  version: \"2.5.0\"\n  keywords: \"travel,travel-planning,trip-planner,itinerary,flights,trains,rail,tours,hotels,excursions,activities,mcp,russia,turkey,egypt,путешествия,планирование путешествий,туры,авиабилеты,поезда,жд билеты,отели,экскурсии,booking\"\n  permissions: \"outbound HTTPS only to https://mcp.botclaw.ru/travel; execute bundled scripts/travel_search.py\"\n---\n\n# Travel Search\n\nSearch tours, hotels, flights, trains, and activities through a single MCP-backed CLI.\n\n## CLI\n\n```bash\npython scripts/travel_search.py <command> --input '<JSON object>'\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py list-tools\n```\n\nCommands: `search-tours`, `cheapest-tours`, `search-hotels`, `get-tour-details`, `search-flights`, `flight-calendar`, `search-trains`, `search-activities`, `list-destinations`.\n\nParameters below and in [references/usage.md](references/usage.md) are current. Run `describe <command>` once per command when you need a field not documented here; never invent fields from memory.\n\n## Examples\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n## Даты\n\n`YYYY-MM-DD` в примерах — заполнитель. Сначала определите сегодняшнюю дату; если она неизвестна, выполните `date +%F`. Все даты передавайте в формате `YYYY-MM-DD` и не раньше сегодняшней, месяц для `flight-calendar` — в формате `YYYY-MM`. Если год не назван («15 сентября», «в мае»), имеется в виду ближайший такой день или месяц в будущем.\n\n## Scope\n\n- Use this skill as the search layer of travel planning. Build itineraries with general reasoning; use the skill to find package tours, hotel-only stays, flights, trains, activities, destination directories, prices, and booking links.\n- Does **not** make bookings, store personal travel data, access email/calendar, or keep a "},{"path":"README.md","content":"# Travel Search RU\n\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)\n[![agentskills.io](https://img.shields.io/badge/agentskills.io-compatible-purple.svg)](https://agentskills.io)\n[![ClawHub](https://img.shields.io/badge/ClawHub-travel--search--ru-blue.svg)](https://clawhub.ai/skills/travel-search-ru)\n\nПоисковый слой для планирования путешествий с популярными туристическими сервисами: **Aviasales**, **Travelata**, **Level.Travel**, **Tutu.ru**, **Tripster** и **Sputnik8**.\n\nАгент может составить маршрут своими обычными инструментами, а навык найдёт для него авиабилеты, поезда, пакетные туры, отели и экскурсии. В ответе будут цены, ключевые параметры и короткие ссылки на выдачу. Навык работает в Claude Code, Cursor, Gemini CLI, GitHub Copilot и других AI-агентах.\n\n| Сервис | Что доступно |\n|--------|--------------|\n| **Aviasales** | Авиабилеты и календарь цен |\n| **Travelata** | Пакетные туры |\n| **Level.Travel** | Пакетные туры и отели без перелёта |\n| **Tutu.ru** | Кэшированное расписание поездов и ориентировочные цены |\n| **Tripster** | Экскурсии и активности |\n| **Sputnik8** | Экскурсии, билеты и активности |\n\n**Два способа подключения:** [Agent Skill](#установка) или [удалённый MCP-сервер](#mcp-сервер).\n\n## Демо\n\n### Codex: семейный отпуск в Кемере\n\n![Codex ищет тур и экскурсии в Кемере](https://github.com/MissiaL/travel-search-ru/releases/download/v2.1.0/codex-kemer-agent-log.gif)\n\nАнимация собрана из результатов живого MCP-запроса от 22 июля 2026 года; это не запись экрана. Перед бронированием уточняйте цену и доступность.\n\n![Travel search demo](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/book_small.gif)\n\n<details>\n<summary>Пример ответа</summary>\n\n![Запрос](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/request.webp)\n![Ответ часть 1](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response1.webp)\n![Ответ часть 2](https://github.com/MissiaL/travel-search-ru/releases/download/v1.0/response2.webp)\n\n</details>\n\n## Совместимые агенты\n\nРаботает с любым AI-агентом, который поддерживает [agentskills.io](https://agentskills.io):\n\n**Claude Code** · **Cursor** · **Gemini CLI** · **GitHub Copilot** · **Windsurf** · **Junie** · **OpenCode** · **Goose** · **Aider** · **Cline** · **Roo Code** · **Amp** · **VS Code Agent** и 30+ других\n\n## Как это устроено\n\n```\nПользователь спрашивает про туры / отели / авиа / поезда / экскурсии\n  │\n  ▼\nАгент читает SKILL.md → запускает scripts/travel_search.py → оформляет ответ\n  │\n  ▼\nMCP https://mcp.botclaw.ru/travel (Streamable HTTP)\n```\n\n| Команда CLI | Назначение |\n|-------------|------------|\n| `search-tours` | Пакетные туры (перелёт + отель) |\n| `cheapest-tours` | Быстрая подборка самых дешёвых туров Travelata |\n| `search-hotels` | Отели без перелёта |\n| `get-tour-details` | Актуальные детали ту"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn75rh4tzqmd6yy43xmswa5895841twa\",\n  \"slug\": \"travel-search-ru\",\n  \"version\": \"2.5.0\",\n  \"publishedAt\": 1791021854885\n}"},{"path":"references/usage.md","content":"# Travel Search CLI usage\n\n**Privacy:** Every command sends the supplied JSON search criteria to the live external production service. Criteria may contain itinerary/location, dates, traveler counts/ages, budget, and preferences. Do not include names, contacts, passport/payment details, credentials, or unnecessary sensitive data. The local skill does not persist requests, but no server-side retention guarantee is declared, so treat it as an external service.\n\nThe skill talks only to the production MCP endpoint over Streamable HTTP. There is no public `--url` flag and no environment-based endpoint override.\n\n## Commands\n\n```bash\npython scripts/travel_search.py list-tools\npython scripts/travel_search.py describe <command>\npython scripts/travel_search.py <command> --input '<JSON object>'\n```\n\n| CLI command | MCP tool |\n|-------------|----------|\n| `search-tours` | `search_tours` |\n| `cheapest-tours` | `get_cheapest_travelata_tours` |\n| `search-hotels` | `search_hotels` |\n| `get-tour-details` | `get_tour_details` |\n| `search-flights` | `search_flights` |\n| `flight-calendar` | `get_flight_price_calendar` |\n| `search-trains` | `search_train_tickets` |\n| `search-activities` | `search_activities` |\n| `list-destinations` | `list_destinations` |\n\n## Input\n\n`--input` must be a single JSON **object**. Arrays, strings, numbers, `null`, and `true`/`false` are rejected.\n\n```bash\npython scripts/travel_search.py search-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"adults\":2,\"meal\":\"AI\"}'\npython scripts/travel_search.py cheapest-tours --input '{\"departure_city\":\"Москва\",\"country\":\"Турция\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"nights_min\":7,\"nights_max\":10,\"resorts\":[\"Кемер\"],\"meals\":[\"AI\",\"UAI\"],\"limit\":5}'\npython scripts/travel_search.py search-flights --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"depart_date\":\"YYYY-MM-DD\",\"adults\":1}'\npython scripts/travel_search.py flight-calendar --input '{\"origin\":\"MOW\",\"destination\":\"AYT\",\"month\":\"YYYY-MM\"}'\npython scripts/travel_search.py search-trains --input '{\"origin\":\"Москва\",\"destination\":\"Сочи\",\"depart_date\":\"YYYY-MM-DD\",\"sort\":\"price\",\"limit\":5}'\npython scripts/travel_search.py search-activities --input '{\"city\":\"Анталья\",\"date_from\":\"YYYY-MM-DD\",\"date_to\":\"YYYY-MM-DD\",\"persons\":2,\"children_allowed\":true,\"sort\":\"recommended\",\"limit\":5}'\n```\n\n### Dates\n\n`YYYY-MM-DD` / `YYYY-MM` above are placeholders. Determine today's date first (run `date +%F` if it is unknown). Every date is `YYYY-MM-DD` and must not be in the past; `flight-calendar` takes `month` as `YYYY-MM`. A day or month without a year means its next future occurrence. The server rejects past or malformed dates with a Russian validation message.\n\n## Discover schemas\n\nDo not hard-code provider field lists. Ask the live server:\n\n```bash\npython scripts/travel_search.py describe search-tours\n```\n\nResponse shape:\n\n```json\n{\n  \"name\": \"search_tours\",\n  \"descript"},{"path":"skill-card.md","content":"## Description:\n\nFinds package tours, hotels, flights, trains, and activities in Russian travel catalogs, with prices and booking links.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[missial](https://clawhub.ai/user/missial)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nTravelers and travel-planning agents use this skill to find tours, lodging, transport, and activities with prices and links for trip planning. It does not make bookings.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Travel search criteria are sent to an external service.\n\nMitigation: Send only necessary search criteria; omit names, contact details, passport and payment details, and credentials.\n\nRisk: Listed prices and availability may change before booking.\n\nMitigation: Verify final prices and availability with the linked providers before booking.\n\n## Reference(s):\n\n- [Travel Search RU on ClawHub](https://clawhub.ai/missial/skills/travel-search-ru)\n- [Travel Search CLI usage](references/usage.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Guidance]\n\n**Output Format:** [Markdown travel options with prices, key details, and booking links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Search results are informational; prices and availability require provider confirmation.]\n\n## Skill Version(s):\n\n2.5.0 (source: skill metadata, package.json, server release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search. Skill: Travel Search RU Owner: missial Summary: Use while planning a trip when Russian-catalog search is needed: package tours, hotels, flights, trains, excursions, prices, and booking links. Trigger on Russian requests: «спланировать путешествие», «подобрать тур», «найти отель/авиабилеты/жд билеты/экскурсии», «маршрут с актуальными ценами». Not for general advice without live search. Tags: latest:2.5.0 Version histo","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1325,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T19:16:32.251Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T07:29:28.879Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}