jolly-tur-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jolly-tur-mcpSearch Antalya hotels for 2026-11-20 to 2026-11-22 and show prices"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
jolly-tur-mcp 🇹🇷
mcp-name: io.github.mohammad-abbasi-sh/jolly-tur-mcp
Unofficial read-only MCP server for Jolly Tur (jollytur.com), one of Türkiye's top-3 tour operators — hotel search with live prices, hotel detail and current campaigns.
Part of the "Turkey MCP factory". Not affiliated with Jolly Tur.
For AI agents
Add to your MCP client config (stdio):
{
"mcpServers": {
"jolly": {
"command": "uvx",
"args": ["jolly-tur-mcp"]
}
}
}Or run locally: python -m jolly_mcp.server (needs mcp<2, curl-cffi).
Related MCP server: webhotelier-mcp
Tools
Tool | Description |
| Search hotels in a city — |
| Detail for one hotel — |
| Current campaigns from /kampanyalar (title + link) |
Example output (jolly_search_hotels / Antalya, 2026-11-20 → 2026-11-22):
{"result_count": 1067, "count": 20,
"hotels": [{"name": "The X Belek", "location": "Antalya, Serik, Belek, Kadriye",
"rating": 9.6, "rating_count": 4186, "rating_text": "Mükemmel",
"concept": "Ultra Her Åžey Dahil",
"total_price_tl": 21576.0, "discounted_price_tl": 13377.12}]}Notes:
Prices are Turkish Lira (TRY) for the requested stay; without dates the cards show no price (
prices_available: false).Searches are slow (~10–15s: the site renders results server-side per query, and the endpoint occasionally stalls — the server retries once). Prefer one search per question.
Data: Jolly's own listing/search flow (listing page +
GetListPagePartialsPOST) — no key, no login, read-only.
Development
python3 -m venv .venv && .venv/bin/pip install "mcp<2" curl-cffi pytest
.venv/bin/python -m pytest tests/ -qtests/test_hotels.py— offline, parses real captured pagestests/test_live.py— 4 cautious live requests against jollytur.com
License
MIT
Available Tools
3 toolsjolly_get_hotelA
Detail for one Jolly hotel. hotel_slug: e.g. "the-x-belek" (from search results) or a full jollytur.com hotel URL.
| Name | Required | Description | Default |
|---|---|---|---|
| hotel_slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the disclosure burden. 'Detail for one hotel' strongly implies a non-mutating lookup, and an output schema exists so return values need not be explained. However, nothing is said about behavior for invalid or stale slugs, or about whether the full URL form is resolved via redirect/parsing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no waste, and the operation is stated before the parameter note. The only quibble is the elliptical first sentence, which reads as a note fragment rather than a full description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema, the essentials are covered: what it returns conceptually (hotel detail) and both accepted input formats with an example. Missing only edge-case behavior and explicit tie-in to the search workflow, which are minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% (the single property is bare 'string'), so the description must compensate, and it does: it gives a concrete example slug ('the-x-belek') and an alternate accepted format, a full jollytur.com hotel URL. That materially extends what the schema conveys, though it does not say whether the bare slug or URL is preferred when both could work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation (fetch detail for a single hotel) and names the resource domain ('Jolly hotel'), which separates it from the sibling jolly_search_hotels and jolly_list_campaigns. The fragment phrasing ('Detail for one Jolly hotel') is slightly clipped but an agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(from search results)' hints at the intended workflow — call search first, then fetch detail by slug — but this is implied rather than stated as an explicit when-to-use rule. There is no guidance on when to prefer this over search results already returned, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jolly_list_campaignsA
Current Jolly Tur campaigns from /kampanyalar (title + link).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral load; it does disclose the upstream source (/kampanyalar) and the shape of each item (title + link), which is useful. It does not state that the call is read-only, whether results are cached or live-scraped, or what happens on fetch failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that front-loads the resource and tucks the return fields into parentheses; nothing is wasted. It is a fragment rather than a full sentence, which slightly reduces polish but not economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with an output schema already defining the return shape, the description covers what and where from. The only missing piece an agent might want is a hint about result volume or freshness, which is minor given the schema carries the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain and the baseline of 4 applies. The description correctly implies no filtering options exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (Jolly Tur campaigns), qualifies it as current, and even identifies the source path /kampanyalar, so the agent knows exactly what is returned. It implicitly contrasts with the hotel-oriented siblings, though it never names them explicitly, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit 'use this when...' statement or reference to the hotel siblings. Usage is strongly implied by the resource itself — a zero-argument listing call for campaign promotions — but the agent must infer that this is the entry point for deals rather than hotel lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jolly_search_hotelsA
Search Jolly hotels in a city. city: slug like "antalya", "istanbul", "bodrum". check_in/check_out: YYYY-MM-DD (both needed for prices). page: results page (20 hotels/page). hotel_name: optional name filter (4+ chars). Returns hotels with rating, concept, campaigns and prices.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | ||
| page | No | ||
| check_in | No | ||
| check_out | No | ||
| hotel_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does meaningful work: it discloses that prices only appear when both dates are supplied, that results are paginated at 20 hotels per page, that hotel_name needs 4+ characters, and what fields come back. Unstated behaviour such as authentication needs, sort order, or whether prices are per-room vs per-person keeps this below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence establishes purpose, then each parameter is addressed in a compact, consistently labelled clause followed by return fields. No filler and no repetition of structured data beyond the useful minimum.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter search tool with an output schema present, the description covers formats, the price precondition, pagination, and the result shape. Environment-level details like auth or rate limits are missing, but nothing an agent needs in order to construct a correct call is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: slug format with example values for city, YYYY-MM-DD format for the date pair, page semantics with page size, and a minimum length for hotel_name. Minor gaps remain, such as the default page value and whether dates are optional or merely required for pricing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Search Jolly hotels in a city" states a specific verb and resource, and the city-scoped framing implicitly separates it from jolly_get_hotel (single hotel) and jolly_list_campaigns. It stops short of naming a sibling explicitly, but an agent can tell these apart from the description alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent learns it needs a city slug and that check_in/check_out are both required for prices, which is genuine conditional guidance. There is no explicit statement of when to prefer jolly_get_hotel, nor any mention of exclusions or failure modes for an invalid city.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.0- First observed
jolly_get_hotel - First observed
jolly_list_campaigns - First observed
jolly_search_hotels
TDQS
Scored across 3 tools
Each tool maps to a distinct operation: city-level search, single-hotel detail lookup, and campaign listing. There is no plausible way to confuse them, and the search-to-detail handoff (hotel_slug from search results) is explicitly documented.
All three tools use the same jolly_<verb>_<noun> convention (jolly_search_hotels, jolly_get_hotel, jolly_list_campaigns). The server prefix is applied uniformly and verbs are used consistently for their action type.
Three tools is on the thin side, but for a read-only hotel discovery server each tool earns its place and nothing is redundant. A small set of extra tools (e.g. destination/availability lookup) would round it out without bloat.
The core read-only lifecycle is covered: find hotels by city, drill into a hotel, and surface current promotions. Gaps remain around room/availability details and booking or filtering beyond name and city, but agents can work around these for search-oriented tasks.
Maintenance
Related MCP Connectors
Hotel booking MCP server. Search, book, and manage reservations across 250K+ properties worldwide.
Official MCP server for MAQAMI, a hotel and flight booking platform with 3M+ hotels. Search live hotel rates and flights, look up places, airports and hotel details, then prebook and book. Remote Streamable HTTP endpoint, no API key required.
Search MCP servers, agent skills and APIs for travel: hotel ID mapping, rates, rooms.
Search hotels and get hotel details. Search-only; book on hotely.travel.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables interaction with LiteAPI's hotel booking and travel services through MCP tools, supporting search, booking, vouchers, analytics, and more.6 npm4MIT- FlicenseAqualityDmaintenanceA read-only MCP server that lets AI assistants query the WebHotelier REST API for live hotel data, including property info, room availability, rates, calendars, and offers via natural language tools.8-
- AlicenseAqualityBmaintenanceEnables MCP clients to search stays by destination and dates with rich filters and read full property details as structured JSON, without needing a Booking.com account or self-hosting.2103 npm22 PyPI11MIT
- AlicenseAqualityCmaintenanceEnables MCP clients to search hotel availability, validate rates, create and retrieve bookings, simulate or execute cancellations, and browse destinations and hotel content through the Hotelbeds Booking and Content APIs. Includes a surface-and-reconfirm booking flow that re-validates live prices with a tolerance before confirming.9MIT