Koskamo

Escape the Week MCP

An MCP server that allows AI agents to plan and price Friday-to-Monday city weekends in 42 cities. It provides tools to list cities, personas, and itineraries, estimate costs, and generate booking checklists and manifests for travel planning.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Escape the Week MCP logo, by Escape the WeekVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Escape the Week
MCP endpoint (Streamable HTTP)
https://escapetheweek.com/mcp/public
Vendor documentation

What you can do with it

  • Find a city and persona for a weekend trip
  • Estimate itinerary costs for a specific origin and party size
  • Generate a booking manifest with an ordered plan
  • Submit tips for travel experiences

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
Escape the Week 0.1.0
MCP protocol
2025-06-18
Tools
16 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Plan and price a Friday-to-Monday city weekend and get a booking manifest to execute. Discover with list_cities, list_personas, list_origins and list_published_itineraries; price with estimate_itinerary; call booking_manifest for the ordered booking plan. Escape the Week never takes payment: every booking is made on a partner site and every payment needs the person's approval.

Tools

16 advertised

list_cities — List cities
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the cities that have published weekends, with their slug, IATA airport code, currency and the twelve monthly season factors (1.0 = shoulder season; higher is dearer). Start here to discover city slugs for every other tool. Paged.

list_cities input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; name, tagline and description in that language when translated."
    },
    "limit": {
      "type": "integer",
      "default": 100,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max items to return (default 100, max 1000)."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "description": "Items to skip for paging (default 0)."
    },
    "status": {
      "enum": [
        "draft",
        "published",
        "archived",
        "all"
      ],
      "type": "string",
      "description": "Status filter (default published). Use all for every row."
    }
  }
}
list_cities annotations
{
  "title": "List cities",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_city — Get a city
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch one city by its slug (from list_cities): name, country, region, coordinates, IATA code, currency and the twelve monthly season factors.

get_city input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; name, tagline and description in that language when translated."
    },
    "slug": {
      "type": "string",
      "description": "City slug."
    }
  }
}
get_city annotations
{
  "title": "Get a city",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_personas — List traveller types
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the personas (the kind of traveller an itinerary is written for, e.g. foodie or collector) with their slug and audience: party_shapes (solo, couple, friends, family, multigen), children (boolean) and pace (relaxed, steady, brisk). Persona slugs are used with city slugs to name an itinerary. Paged.

list_personas input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; name, tagline and description in that language when translated."
    },
    "limit": {
      "type": "integer",
      "default": 100,
      "maximum": 1000,
      "minimum": 1,
      "description": "Max items to return (default 100, max 1000)."
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "description": "Items to skip for paging (default 0)."
    },
    "status": {
      "enum": [
        "draft",
        "published",
        "archived",
        "all"
      ],
      "type": "string",
      "description": "Status filter (default published). Use all for every row."
    }
  }
}
list_personas annotations
{
  "title": "List traveller types",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_persona — Get a traveller type
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch one persona by its slug (from list_personas), with its audience.

get_persona input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; name, tagline and description in that language when translated."
    },
    "slug": {
      "type": "string",
      "description": "Persona slug."
    }
  }
}
get_persona annotations
{
  "title": "Get a traveller type",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_origins — List departure cities
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the origins a trip can start from: slug (pass as origin to the pricing and booking tools), name and IATA airport code. Unpaged.

list_origins input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
list_origins annotations
{
  "title": "List departure cities",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_pricing_tiers — List budget levels
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the budget tiers in display order (cheap, modest, expensive, luxury, ultra). Pass the name as tier.

list_pricing_tiers input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
list_pricing_tiers annotations
{
  "title": "List budget levels",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_pricing_multipliers — List price multipliers
Advertised by the server during the last successful anonymous check.
Advertised read-only

List every price multiplier: for each (tier, dimension) the factor applied to the modest-tier price. Dimensions are sight, culture, dining, lodging, transport and flight.

list_pricing_multipliers input schema
{
  "type": "object",
  "required": [],
  "properties": {}
}
list_pricing_multipliers annotations
{
  "title": "List price multipliers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_published_itineraries — List weekend itineraries
Advertised by the server during the last successful anonymous check.
Advertised read-only

The public index: every published itinerary with its city and persona slugs, title, summary, names, step counts and the sum of its steps' costs in integer cents (currency EUR unless the city says otherwise). Use it to discover which (city, persona) weekends exist.

list_published_itineraries input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; city and persona names in that language when translated."
    }
  }
}
list_published_itineraries annotations
{
  "title": "List weekend itineraries",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_published_itinerary — Get a weekend itinerary
Advertised by the server during the last successful anonymous check.
Advertised read-only

The full published itinerary for one (city, persona): its days and steps with local times (HH:MM), kind, notes, cost_cents per person at the modest tier (integer cents), reserve_days (how many days ahead a hard step must be booked, or null), a fallback, and each step's venue with coordinates and offers. Day 0 is Friday.

get_published_itinerary input schema
{
  "type": "object",
  "required": [
    "city",
    "persona"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City slug."
    },
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; collapses every *_i18n map into its field."
    },
    "persona": {
      "type": "string",
      "description": "Persona slug."
    }
  }
}
get_published_itinerary annotations
{
  "title": "Get a weekend itinerary",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
itinerary_calendar — Itinerary calendar file
Advertised by the server during the last successful anonymous check.
Advertised read-only

The published itinerary as iCalendar text for one weekend (Friday = day 0): one event per step at floating local times, no time zone. friday is a YYYY-MM-DD date.

itinerary_calendar input schema
{
  "type": "object",
  "required": [
    "city",
    "persona",
    "friday"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City slug."
    },
    "lang": {
      "type": "string",
      "description": "Optional BCP 47 tag; titles and notes in that language when translated."
    },
    "friday": {
      "type": "string",
      "description": "Friday of the weekend, YYYY-MM-DD."
    },
    "persona": {
      "type": "string",
      "description": "Persona slug."
    }
  }
}
itinerary_calendar annotations
{
  "title": "Itinerary calendar file",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_itinerary — Price a weekend
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Budget estimate (integer cents) for a published itinerary: activities, lodging, transport and flights for a tier, a month or the year average, and a group.

estimate_itinerary input schema
{
  "type": "object",
  "required": [
    "city",
    "persona"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City slug from list_cities, e.g. lisbon."
    },
    "lang": {
      "type": "string",
      "description": "BCP 47 language of the published text, e.g. es (default English)."
    },
    "tier": {
      "enum": [
        "cheap",
        "modest",
        "expensive",
        "luxury",
        "ultra"
      ],
      "type": "string",
      "description": "Budget tier, cheapest to most lavish (default modest). Scales every price line."
    },
    "month": {
      "enum": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "year"
      ],
      "type": "string",
      "description": "Month of travel, or the twelve-month mean (default)."
    },
    "friday": {
      "type": "string",
      "description": "The Friday of the weekend as a YYYY-MM-DD date (it must be a Friday); the weekend runs Friday to Monday. Enables a real fare."
    },
    "origin": {
      "type": "string",
      "description": "Origin slug from list_origins, e.g. barcelona; adds flights."
    },
    "persona": {
      "type": "string",
      "description": "Persona slug from list_personas, e.g. foodie."
    },
    "travellers": {
      "type": "integer",
      "description": "Group size, 1-20 (default 2). Prices are for the whole group."
    }
  }
}
estimate_itinerary annotations
{
  "title": "Price a weekend",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_all — Price every weekend for a city
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Every published itinerary priced at once (integer cents): total, per person and flights per (city, persona), plus the cheapest persona per city, for a tier, a month or the year average, a group and an optional origin; each estimate carries the persona's party_shapes. Estimates only, no fare lookups; cached for a minute per parameter set.

estimate_all input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "tier": {
      "enum": [
        "cheap",
        "modest",
        "expensive",
        "luxury",
        "ultra"
      ],
      "type": "string",
      "description": "Budget tier (default modest)."
    },
    "month": {
      "enum": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "9",
        "10",
        "11",
        "12",
        "year"
      ],
      "type": "string",
      "description": "Month of travel, or the twelve-month mean (default)."
    },
    "friday": {
      "type": "string",
      "description": "Friday of the weekend, YYYY-MM-DD; echoed, not priced."
    },
    "origin": {
      "type": "string",
      "description": "Origin slug; enables flights, travel hours and distance."
    },
    "travellers": {
      "type": "integer",
      "description": "Group size, 1-20 (default 2)."
    }
  }
}
estimate_all annotations
{
  "title": "Price every weekend for a city",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_fare — Get a flight fare
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Cheapest known return fare per person between two IATA codes for a Friday-to-Monday weekend (cached from Travelpayouts).

get_fare input schema
{
  "type": "object",
  "required": [
    "from",
    "to",
    "friday"
  ],
  "properties": {
    "to": {
      "type": "string",
      "description": "Destination IATA code."
    },
    "from": {
      "type": "string",
      "description": "Origin IATA code."
    },
    "friday": {
      "type": "string",
      "description": "Friday of the weekend, YYYY-MM-DD."
    }
  }
}
get_fare annotations
{
  "title": "Get a flight fare",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
booking_checklist — Booking checklist
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Booking links and checklist for a weekend, ordered by scarcity: first the steps that must be booked ahead (longest lead time first, each with reserve_days, a book_by date YYYY-MM-DD and an easier fallback), then flights, the hotel and the other bookable steps. Book in list order. An item's alternatives [{provider, url}] are other sites that book the same thing (the hotel on Klook beside Booking.com): compare them and book one, not both. For a plan an agent can execute (dates, costs, what to ask the person) use booking_manifest instead.

booking_checklist input schema
{
  "type": "object",
  "required": [
    "city",
    "persona",
    "friday"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City slug from list_cities, e.g. lisbon."
    },
    "lang": {
      "type": "string",
      "description": "BCP 47 language of the published text, e.g. es (default English)."
    },
    "tier": {
      "enum": [
        "cheap",
        "modest",
        "expensive",
        "luxury",
        "ultra"
      ],
      "type": "string",
      "description": "Budget tier, cheapest to most lavish (default modest). Scales every price line."
    },
    "friday": {
      "type": "string",
      "description": "The Friday of the weekend as a YYYY-MM-DD date (it must be a Friday); the weekend runs Friday to Monday. Enables a real fare."
    },
    "origin": {
      "type": "string",
      "description": "Origin slug from list_origins, e.g. barcelona; adds flights."
    },
    "persona": {
      "type": "string",
      "description": "Persona slug from list_personas, e.g. foodie."
    },
    "travellers": {
      "type": "integer",
      "description": "Group size, 1-20 (default 2). Prices are for the whole group."
    }
  }
}
booking_checklist annotations
{
  "title": "Booking checklist",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
booking_manifest — Booking plan
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Everything an agent needs to book one weekend, in the order to book it. Returns items (flights, hotel and bookable steps; scarcest first) each with kind, title, when (date YYYY-MM-DD and local time HH:MM), the affiliate-tracked partner url with dates, party size and time prefilled where the partner supports it, provider, estimated_cost {cents, currency} for the whole party, reserve_days, book_by (YYYY-MM-DD), fallback and alternatives [{provider, url}]: other sites that book the same item (the hotel on Klook beside Booking.com), to compare, booking one of them, never both; plus needs_from_user (traveller names, contact, payment approval), a sequence_note, the total estimate in integer cents, cancellation_advice and a disclosure that the links are affiliate links. Escape the Week never takes payment: open each url in a browser and have the person approve every payment on the partner's site. Prices are estimates, not quotes.

booking_manifest input schema
{
  "type": "object",
  "required": [
    "city",
    "persona",
    "friday"
  ],
  "properties": {
    "city": {
      "type": "string",
      "description": "City slug from list_cities, e.g. lisbon."
    },
    "lang": {
      "type": "string",
      "description": "BCP 47 language of the published text, e.g. es (default English)."
    },
    "tier": {
      "enum": [
        "cheap",
        "modest",
        "expensive",
        "luxury",
        "ultra"
      ],
      "type": "string",
      "description": "Budget tier, cheapest to most lavish (default modest). Scales every price line."
    },
    "party": {
      "enum": [
        "solo",
        "couple",
        "friends",
        "family",
        "multigen"
      ],
      "type": "string",
      "description": "Who is travelling, to check the persona fits (optional); never changes a price."
    },
    "friday": {
      "type": "string",
      "description": "The Friday of the weekend as a YYYY-MM-DD date (it must be a Friday); the weekend runs Friday to Monday. Enables a real fare."
    },
    "origin": {
      "type": "string",
      "description": "Origin slug from list_origins, e.g. barcelona; adds flights."
    },
    "persona": {
      "type": "string",
      "description": "Persona slug from list_personas, e.g. foodie."
    },
    "travellers": {
      "type": "integer",
      "description": "Group size, 1-20 (default 2). Prices are for the whole group."
    }
  }
}
booking_manifest annotations
{
  "title": "Booking plan",
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_tip — Send a local tip
Advertised by the server during the last successful anonymous check.

Send a tip about a city: a place to add, a closed place, somewhere nearly impossible to book, or a wrong fact. Public. A tip is never published; an editor reviews it first. Rate limited per sender.

submit_tip input schema
{
  "type": "object",
  "required": [
    "city",
    "kind",
    "body"
  ],
  "properties": {
    "body": {
      "type": "string",
      "description": "The tip, 10 to 1000 characters."
    },
    "city": {
      "type": "string",
      "description": "City slug."
    },
    "kind": {
      "enum": [
        "add",
        "closed",
        "hard_to_book",
        "wrong_info",
        "other"
      ],
      "type": "string",
      "description": "What the tip is."
    },
    "locale": {
      "type": "string",
      "description": "Language the tip is written in, a BCP 47 tag (default en)."
    },
    "contact": {
      "type": "string",
      "description": "How to reach the sender, at most 200 characters (optional)."
    },
    "persona": {
      "type": "string",
      "description": "Persona slug the tip is about, if any."
    },
    "step_ref": {
      "type": "string",
      "description": "What the tip is about: '<day index>/<step index>' of the itinerary, or a venue id."
    }
  }
}
submit_tip annotations
{
  "title": "Send a local tip",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
675 ms
95th percentile latency
675 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 675 ms · metadata changed · 16 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http escape-the-week-mcp https://escapetheweek.com/mcp/public

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add escape-the-week-mcp --url https://escapetheweek.com/mcp/public

Cursor

Merge this server into .cursor/mcp.json in your project, then enable escape-the-week-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "escape-the-week-mcp": {
      "url": "https://escapetheweek.com/mcp/public"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "escape-the-week-mcp": {
      "type": "streamableHttp",
      "url": "https://escapetheweek.com/mcp/public",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start escape-the-week-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "escape-the-week-mcp": {
      "type": "http",
      "url": "https://escapetheweek.com/mcp/public"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http escape-the-week-mcp https://escapetheweek.com/mcp/public

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "escape-the-week-mcp": {
      "url": "https://escapetheweek.com/mcp/public"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "escape-the-week-mcp": {
      "serverUrl": "https://escapetheweek.com/mcp/public"
    }
  }
}

Let your agent find its tools

Find servers like Escape the Week MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Escape the Week MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing