io.github.Tomalarrrr/cyclesite-mcp-server
Official33 toolsSearch, value, sell, and trust-check used bikes on Cyclesite — UK's used-bicycle marketplace.
Search, price, and verify used bicycles on UK's Cyclesite marketplace.
Captured live from the server via tools/list.
search_bikes
Search live UK used-bike listings on Cyclesite (the UK's used bicycle marketplace). Filter by brand, category, city, price range, and condition. Returns up to 5 active listings with specs and listing URLs. Live data — refreshed continuously as new bikes are listed. Example queries: 'a Trek Domane in Manchester under £2,000', 'gravel bike, very good condition, near Bristol'.
Parameters (6)
- brandstring
Bike brand (e.g. Trek, Specialized, Canyon).
- categorystring
Bike category.
- citystring
UK city.
- minPricenumber
Minimum price in GBP.
- maxPricenumber
Maximum price in GBP.
- conditionstring
Condition rating.
get_recent_listings
What's new on Cyclesite right now — up to 10 of the freshest active UK listings, refreshed every 15 minutes. Use when the user asks 'what's new today?' or 'any new road bikes this week?' rather than for a specific filter. Optional category + maxPrice filters. Live data.
Parameters (3)
- categorystring
- maxPricenumber
Maximum price in GBP.
- limitnumber
How many listings to return (1-10, default 10).
get_listing_detail
Full details for a specific bike listing on Cyclesite — specs, condition, frame number presence, photos, delivery, seller's city. Provide the URL slug returned by search_bikes or get_recent_listings. Example: after the user says 'tell me more about that 2022 Trek Domane', call this with the slug from the prior result.
Parameters (1)
- slugstringrequired
Listing URL slug (e.g. "used-trek-domane-sl-6-2022").
find_similar_listings
Given a Cyclesite listing slug, return up to 5 similar active listings (same category, ±25% price, same brand or frame size weighted higher). Use when the user is interested in one bike and wants alternatives. Example: 'show me bikes like that one'.
Parameters (1)
- slugstringrequired
Source listing URL slug.
search_by_location
Find Cyclesite listings within a radius of a UK location (lat/lng). Radius capped at 50 miles. Returns up to 10 listings ordered by distance. Live UK marketplace data. Example: 'used bikes within 25 miles of LE10 0AA' (geocode the postcode first, then call this).
Parameters (6)
- latnumberrequired
Latitude (UK only, 49.5–61.0).
- lngnumberrequired
Longitude (UK only, -8.5–2.0).
- radiusMilesnumber
Search radius in miles (1-50, default 25).
- categorystring
- maxPricenumber
- limitnumber
1-10, default 5.
recommend_bike_for_budget
Curated picks from Cyclesite's live UK inventory for a budget and intent. Prefers higher-engagement listings. Returns up to 5 picks with a one-line rationale each. Example queries: 'a road bike for £1,500 for weekend rides', 'best e-MTB I can buy under £3,000', 'commuter bike in London under £400'.
Parameters (5)
- budgetGbpnumberrequired
Maximum budget in GBP.
- categorystring
- useCasestring
Free-text intent (e.g. "commuting", "weekend trail", "first road bike").
- citystring
UK city to focus on (optional).
- limitnumber
1-10, default 5.
list_brands
Paginated UK bike-brand catalogue from Cyclesite, ordered by stock level. Use to validate a brand name, surface options to a user, or paginate the catalogue. Stock counts are returned as bands (none / 1-5 / 6-25 / 26-100 / 100+) — Cyclesite doesn't expose precise per-brand inventory. Example: 'what brands of e-bike are available?'.
Parameters (3)
- qstring
Optional search filter (case-insensitive contains).
- limitnumber
1-50, default 25.
- offsetnumber
0-500.
list_models_for_brand
Models for a brand on Cyclesite (paginated). Returns model names, year ranges, in-stock flag. Example: "what Trek road bikes are available?" → list_brands(q:"Trek") → list_models_for_brand(brandSlug:"trek", category:"road").
Parameters (4)
- brandSlugstringrequired
Brand slug from list_brands (lowercase, hyphenated).
- categorystring
- limitnumber
1-50, default 25.
- offsetnumber
0-500.
get_model_info
Cyclesite catalogue entry for a brand+model: category, year range, AI-generated description, key specs, market summary. Reference data — refreshed when models are added or specs change. Example: 'tell me about the Specialized Allez'.
Parameters (2)
- brandstringrequired
- modelstringrequired
get_spec_sheet
Aggregated spec sheet for a brand+model[+year], derived from Cyclesite's live UK inventory plus the catalogue record. Returns the most-common frame material, wheel size, groupset, brakes, weight, and (for e-bikes) motor and battery specs. Example: 'what groupset does a Canyon Endurace usually have?'.
Parameters (3)
- brandstringrequired
- modelstringrequired
- yearnumber
compare_bikes
Side-by-side comparison of up to 3 bikes (each by brand+model[+year]). Returns spec sheets and valuations together so the user can pick. Reuses get_spec_sheet + get_valuation server-side. Example: 'compare a Trek Domane SL 6 against a Specialized Roubaix Comp'.
Parameters (1)
- bikesarrayrequired
get_size_guide
Frame-size recommendation for a rider's height and bike category, sourced from Cyclesite's real UK listings (riders' declared heights against frame sizes they bought). Falls back to industry-standard charts when the dataset is thin. Example: 'I'm 178cm — what road-bike size do I need?'.
Parameters (2)
- heightCmnumberrequired
Rider height in centimetres (120-220).
- categorystring
get_valuation
What a used UK bike is worth right now, Cyclesite's flagship tool. Returns median, range, condition breakdown, confidence level, 90-day price trend, and comparable active listings. Sourced from real UK market prices, what bikes actually list and sell for, refreshed nightly. Example: 'what's a 2022 Trek Domane SL 6 worth?'.
Parameters (2)
- brandstringrequired
- modelstringrequired
suggest_listing_price
For a seller about to list: suggested ask, floor, and ceiling for their bike's brand+model[+condition] on the UK market. Same measured UK used-price data as get_valuation but framed as seller guidance. Example: 'I'm selling a 2021 Specialized Allez in good condition — what should I ask?'.
Parameters (3)
- brandstringrequired
- modelstringrequired
- conditionstring
get_market_index
Current UK used-bike market prices by category, from Cyclesite's nightly index. Returns median + range per category (road, mtb, gravel, e-bike, etc.). Example: 'how does the UK used-bike market look right now?'. Refreshed nightly from real UK market prices.
No parameters.
get_market_health
Buyer's-vs-seller's market signal for the UK used-bike market — should the user buy or sell now? Composite indicator from days-to-sell, asking-vs-sold-price spread, and inventory levels. Example: 'is now a good time to buy a road bike?'. Refreshed nightly.
No parameters.
get_depreciation
Brands ranked by how well (or poorly) they hold their value, from Cyclesite's measured UK used-price data. Returns top N brands by % retained vs new RRP. Example: 'which bike brands hold their value best?'.
Parameters (2)
- sortstring
- limitnumber
1-20, default 10.
get_price_trends
UK used-bike price trends over the last N months by category, from Cyclesite's index series. Example: 'how have road-bike prices changed in 2026?'. Monthly data, refreshed at month-end.
Parameters (2)
- categorystring
- monthsnumber
1-24.
grade_listing_quality
Categorical quality grade for a Cyclesite listing (excellent / good / fair / weak) plus up to 2 wins and 2 flags. Helps a buyer assess trustworthiness; helps a seller self-audit. Example: 'is this listing trustworthy?' (provide the slug). Note: returns the *categorical* judgement only, not the underlying score (intentional to avoid gaming).
Parameters (1)
- slugstringrequired
draft_listing
Sell-side helper: turn a seller's raw facts into a polished Cyclesite listing draft (title, description, suggested price, photo plan). Does NOT publish — for actual publication use publish_listing (requires OAuth). Useful for previewing what a listing would look like. Example: 'help me draft a listing for my 2021 Specialized Allez, very good condition, in Bristol'.
Parameters (9)
- brandstringrequired
- modelstringrequired
- yearnumber
- conditionstring
- frameSizestring
- groupsetstring
- knownIssuesstring
Honest declaration of any issues.
- citystring
- willShipboolean
check_stolen
Check if a UK bicycle is reported stolen by serial number. Cyclesite aggregates lookups across UK stolen-bike databases — the unique data we own. Per-serial rate-limited (3/hour) to prevent enumeration. Example: 'is the bike with serial WTU123456 reported stolen?'. Live data — cross-references multiple registries on every call.
Parameters (1)
- serialstringrequired
Frame/serial number (4-50 chars).
report_stolen
Step-by-step guidance for reporting a stolen UK bike: police, insurance, listing alerts. Returns a 5-step checklist plus the official Cyclesite report URL. Example: 'my bike was just stolen, what do I do?'.
Parameters (3)
- brandstring
- modelstring
- serialstring
get_buying_guide
Search Cyclesite's expert buying guides (24+ articles by cycling-journalism authors). Returns up to 3 matching guides with title, excerpt, difficulty, reading time, and URL. Use for educational queries that don't need live inventory. Example: 'how do I choose a bike size?', 'tips for buying a used e-bike'.
Parameters (2)
- querystringrequired
What to search for (e.g. "first road bike", "bike sizing").
- limitnumber
1-5, default 3.
publish_listing
Publish a Cyclesite listing on the user's behalf. Multi-step: first call (no draftId) returns a phone-friendly photo upload URL; once 3+ photos are uploaded, the next call returns either step:'live' (during launch promo, no fee) or step:'payment_required' with a Stripe Checkout URL for the £10.99 listing fee. Idempotent — keep calling with the same draftId until step:'live'. Requires OAuth scope `listings:publish`. Example flow: user says 'sell my Trek Domane' → call publish_listing → assistant directs user to upload URL → user uploads → call again → step:'live' → seller receives a confirmation email with a 24h undo link.
Parameters (15)
- draftIdstring
Returned by a previous call. Omit on first call.
- titlestring
Listing title (10-160 chars).
- descriptionstring
Listing description (30-5000 chars).
- brandstring
- modelstring
- categorystring
- conditionstring
- priceGbpnumber
- citystring
UK city.
- yearnumber
- frameSizestring
- groupsetstring
- frameSerialstring
Frame/serial number — runs a stolen-bike check before publish.
- knownIssuesstring
- willShipboolean
list_my_listings
Show the authenticated user's Cyclesite listings (draft / active / sold). Requires OAuth scope `listings:read`. Example: 'how are my listings doing?'.
Parameters (2)
- statusstring
- limitnumber
1-20.
mark_as_sold
Mark a Cyclesite listing as sold (optionally with the final sale price). Requires OAuth scope `listings:manage`. Example: 'mark my Trek Domane as sold for £1,750'.
Parameters (2)
- listingIdstringrequired
- salePriceGbpnumber
get_my_enquiries
Show buyer enquiries on the authenticated user's Cyclesite listings. Requires OAuth scope `listings:read`. Example: 'any messages about my Trek?'.
Parameters (2)
- listingIdstring
- limitnumber
1-20.
respond_to_enquiry
Reply to a buyer enquiry on the authenticated user's listing. Requires OAuth scope `enquiries:respond`. Example: 'reply to that enquiry — say it's still available, collection only'.
Parameters (2)
- enquiryIdstringrequired
- answerstringrequired
Reply text (1-2000 chars).
search
OpenAI deep-research / company-knowledge compatibility. Search Cyclesite's active UK used-bike listings by free-text query (matches title, brand, model). Returns the canonical OpenAI shape: { results: [{ id, title, url }] }. Use the id to call fetch() for the full document.
Parameters (1)
- querystringrequired
Free-text query.
fetch
OpenAI deep-research / company-knowledge compatibility. Fetch the full document for a Cyclesite listing id (returned by the search tool). Returns { id, title, text, url, metadata } — text is a plain-prose summary of the listing's description and specs, suitable for direct quoting in deep-research answers.
Parameters (1)
- idstringrequired
Document id from search results.
save_search
Subscribe the user to alerts for new Cyclesite listings matching a filter — the AI assistant will then proactively notify them when a matching bike appears (price drop or fresh listing). Requires OAuth scope `listings:read` (read-only on data, but this is technically a write — it creates a SavedSearch row on the user's account). Examples: 'let me know when a Trek Domane SL 6 in Manchester under £2,000 appears', 'alert me to any e-MTB drops below £2,500 in Yorkshire'. Each user is capped at 50 active alerts.
Parameters (9)
- namestring
Optional human-readable name (e.g. "Trek Domane in Manchester").
- brandstring
- modelstring
- categorystring
- citystring
UK city to focus on.
- minPricenumber
- maxPricenumber
- conditionstring
- alertFrequencystring
How often to send digest. Default: instant.
make_enquiry
Send an enquiry to a Cyclesite seller on the buyer's behalf — Cyclesite becomes the messaging layer for the AI conversation. Per-buyer-per-listing daily cap (2/day) prevents spam. The seller is emailed; the buyer's reply appears via get_my_enquiries. Requires OAuth scope `enquiries:respond` (note: the scope name is shared with seller-side replies). Example: 'message the seller of that Trek and ask if they'd take £1,400 collection only in Manchester next Saturday'.
Parameters (2)
- listingIdstringrequired
Bike ID from search_bikes / get_listing_detail.
- messagestringrequired
The buyer's question to the seller (10-2000 chars).
reserve_listing
Hold a Cyclesite listing for 24 hours so other buyers can't claim it while the user decides. Optional refundable deposit via Stripe (returned if the user doesn't proceed; applied to the bike if they do). The first UK marketplace where a buyer can COMMIT inside an AI conversation. Requires OAuth scope `listings:manage`. Example: 'put a hold on that Trek for me, I want to view it Saturday'.
Parameters (2)
- listingIdstringrequired
- depositGbpnumber
Optional refundable deposit (£10-£500). When set, user pays via Stripe Checkout.
README not available yet.
Install
Configuration
CYCLESITE_API_URLdefault https://www.cyclesite.co.ukCyclesite base URL. Override only for partner staging environments.
CYCLESITE_API_KEYsecretOptional partner API key for raised rate limits. Public tier works without one.
claude_desktop_config.json
{
"mcpServers": {
"cyclesite-mcp-server": {
"command": "npx",
"args": [
"-y",
"cyclesite-mcp-server@2.4.3"
],
"env": {
"CYCLESITE_API_URL": "https://www.cyclesite.co.uk",
"CYCLESITE_API_KEY": "<YOUR_CYCLESITE_API_KEY>"
}
}
}
}