Cuddlynest Mcp

io.github.mafedelahoz由 GitHub 帳號 mafedelahoz 發布v0.2.1更新於 Oct 24, 2026

Search CuddlyNest hotels and read rooms, prices, availability and cancellation policies

概覽

AI 產生的概覽

搜尋 CuddlyNest 飯店,並從公開房源頁讀取房型、價格、可訂狀態與取消政策,唯讀不訂房。

可以做什麼
  • 依目的地搜尋地點與熱門飯店,可選擇取得更完整的城市飯店清單
  • 讀取單一飯店的靜態資訊:名稱、地址、座標、星級、設施、圖片
  • 依入住日期讀取房型報價:單價、剩餘房間、價格明細、取消政策
  • 回傳人數、日期與幣別,供後續使用
適用情境
適合讓助理不必自己開瀏覽器,就能比較 CuddlyNest 的飯店選項與房價。它為唯讀,適合資料蒐集與比價,而非訂房。
執行需求
透過 npx 以 stdio 在本機執行;需要 Node.js 18+ 以及 Playwright 的 Chromium(npm install 會自動安裝,也可手動執行 npx playwright install chromium)。選用環境變數 CUDDLYNEST_SCRAPE_TIMEOUT_MS 控制等待頁面渲染的時間(預設 35000 毫秒)。需要能連線至 CuddlyNest 的公開頁面與 API。
安裝前請注意
它以無頭瀏覽器擷取公開頁面,依賴 CuddlyNest 目前的前端內部結構,網站改版後可能默默回傳空結果。提供忽略 robots.txt 擷取房源頁的選項。它不訂房也不付款,但會把目的地與飯店查詢送到 CuddlyNest 的端點。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Cuddlynest Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

[CuddlyNest]

CuddlyNest Search & Listings — MCP Server

[npm] [MCP Registry]

A Model Context Protocol (MCP) server for searching CuddlyNest hotels and retrieving listing details, including room options, prices, availability and cancellation policies.

Read-only by design: search and listing details only. No booking, no payment.

How it gets the data

This server reads that data the same way a visitor does: it opens the real, public listing page in a headless browser (Playwright/Chromium), lets the page's own JavaScript load the rooms, waits for them to render, and reads the result out of the DOM.

DataSource
Name, description, address, coordinates, star rating, amenities, imagesListing page schema.org ld+json + Open Graph tags (cuddlynest.ts)
Room title, partner, unit_price, remaining_rooms, price_breakdown, cancellation_policy (incl. .text), room_filtersRendered listing page DOM, via a React-fiber walk (scrape-listing.ts)
Destination → place candidates + top hotelsautosuggestion-2-0.cuddlynest.com (public, no auth)
Destination → broader city hotel list (~60–250)discovery-pages.cuddlynest.com/fetch_geopage/<ct-id> (public); <ct-id> recovered from a hotel's product-detail breadcrumbs
product_id → name / city / breadcrumbsldp-2-0-product-details.cuddlynest.com/api/v1/productDetail (public)
product_id → canonical listing path/hotel/-<id> server redirect

The DOM extraction, and how it breaks

extractRoomsFromDom() walks every price-shaped text node (COL$742,637), then walks up its React fiber tree to the nearest ancestor component whose props carry both unit_price and roomGroups. Those props are the room offer the page already rendered.

This is coupled to CuddlyNest's current frontend internals (a React prop shape, not a stable contract). If they ship a frontend change it can start returning zero rooms even though the public page still shows prices. The single place to update is the detector condition 'unit_price' in p && 'roomGroups' in p in scrape-listing.ts. npm run e2e:sansiraka is meant to catch that early (non-zero exit, not a silent empty result).

The fromPriceText ("From COL$…") field uses a looser heuristic and can come back null even on a healthy scrape; rooms.fromPrice (cheapest extracted unit) is the reliable figure.


Requirements

  • Node.js 18+
  • A Chromium build for Playwright. npm install runs playwright install chromium automatically (postinstall); if that is blocked in your environment, run npx playwright install chromium once by hand.

Installation

Published as cuddlynest-mcp on npm and listed in the official MCP registry as io.github.mafedelahoz/cuddlynest-mcp.

json
{  "mcpServers": {    "cuddlynest": {      "command": "npx",      "args": ["-y", "cuddlynest-mcp"]    }  }}

Add "--ignore-robots-txt" to args to bypass robots.txt for the listing-page fetches. CUDDLYNEST_SCRAPE_TIMEOUT_MS (default 35000) caps how long the browser waits for prices to render.

An MCPB bundle (.mcpb) for Claude Desktop is attached to each GitHub release — note it does not bundle Chromium, so run npx playwright install chromium once after installing it that way.

Remote / Streamable HTTP

Default transport is stdio. For a hosted deployment, run it over Streamable HTTP:

bash
node dist/index.js --http 8080      # or: MCP_TRANSPORT=http PORT=8080 node dist/index.js#   POST  http://<host>:8080/mcp    — JSON-RPC (stateless, no sessions)#   GET   http://<host>:8080/health — liveness

Tools

Both tools are annotated readOnlyHint: true — they never write, book, or pay.

cuddlynest_search

Search a destination and the top hotels there, from public CuddlyNest APIs (autosuggestion-2-0 for the fuzzy match, discovery-pages geo pages for the broader city list). Prices are not here — pass a hotel's productId to cuddlynest_listing_details.

ParameterRequiredDescription
destinationyesCity / area string, e.g. "Cartagena, Colombia"
hotelsOnlynoOmit the places[] block (default false)
fullCityListnoAlso pull the geo-page city list (~60–250 hotels) when it can be resolved and verified against the destination — a few extra requests (default true)
checkin, checkout, adults, children, childAges, infants, rooms, currencynoechoed back for downstream use

Returns: { query, guests, places[], city, hotelSource, hotelCount, hotels[], note }. Each hotels[] entry: productId, name, url, slug, propertyType, starRating, guestRating (/10) + guestRatingText, reviewCount, and — from the geo page — images[], distanceFromCenterKm, featuredAmenities[]. hotelSource is "autosuggest" or "autosuggest+geopage". The list is top-matches scale, not full inventory — CuddlyNest's real results page (/sr/…) is bot-blocked and Disallowed in robots.txt.

cuddlynest_listing_details

Static basics and rooms/pricing for one hotel.

ParameterRequiredDescription
hotelyesListing URL or numeric product_id (trailing number in the URL)
checkin, checkoutfor pricingYYYY-MM-DD — required to read rooms/prices
adults, children, childAges, infants, roomsnodefaults 2 / 0 / – / 0 / 1
currencynoISO 4217, default USD
ignoreRobotsTextnoignore robots.txt for the static fetch

Returns: { productId, hotelUrl, guests, staticListing, staticError, rooms, roomsError, notes }. rooms.units[] is the extracted room offers, each with title, partnerName, unitPrice, currency, remainingRooms, guests, cancellationPolicyType, cancellationPolicyText, priceBreakdown, roomFilters. rooms also carries fromPrice, partnersSeen, listingUrl, scrapedAt.


Development

bash
npm install          # installs deps + Chromium (postinstall)npm run build        # sync-version + tsc -> dist/npm run typechecknpm test             # offline: smoke test (stdio) + scraper testsnpm run e2e:sansiraka # ONLINE: real scrape of cuddlynest.com, structural assertsnpm run watch

Architecture

  • index.ts — MCP server, tool schemas, stdio and Streamable HTTP transports, robots.txt handling
  • cuddlynest.ts — hotel-URL parsing, static-listing ld+json parse, destination autosuggestion, result shaping
  • scrape-listing.ts — resolveListingPath, buildListingUrl, scrapeListing (headless browser), extractRoomsFromDom (React-fiber walk)
  • util.ts — generic object/JSON helpers

License

MIT — see LICENSE.

來源:README.md,提交 2e96075

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.2.1最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分