tomalarrrr avatar

Cyclesite Mcp Server

tomalarrrr/the-sites

Connects Claude to Cyclesite, the UK's used bicycle marketplace, letting you search listings, get bike valuations, post sales, and run trust checks on sellers or bikes directly from your AI workflow. Useful when you're helping someone buy or sell a used bike in the UK and want to pull real marketplace data without tab switching. The server exposes Cyclesite's API through both stdio and streamable HTTP transports, so you can integrate it locally or call it remotely. Reach for this when you need to price check a bike model, verify a seller's reputation, or search inventory based on specific criteria like frame size, brand, or location.

tools
34
auth
Secret needed
transport
STDIO, HTTP
env vars
2
last updated
Oct 27, 2026

Install

From registry metadata
$ npx add-mcp https://www.cyclesite.co.uk/api/mcp-server --name cyclesite

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http cyclesite https://www.cyclesite.co.uk/api/mcp-server

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 34 tools

Verified live against the running server on Nov 6, 2026.

search_bikesSearch 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 que...6 params

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 que...

Parameters* required
brandstring
Bike brand (e.g. Trek, Specialized, Canyon).
categorystring
Bike category.one of road · mtb · gravel · hybrid · ebike · kids
citystring
UK city.
conditionstring
Condition rating.one of Excellent · Very_Good · Good · Fair · Poor · For_Parts
maxPricenumber
Maximum price in GBP.
minPricenumber
Minimum price in GBP.
get_recent_listingsWhat's new on Cyclesite right now: up to 10 of the freshest active UK listings, refreshed every 15 minutes. Suited to questions like 'what's new today?' or 'any new road bikes this week?' rather than a specific filter. Optional category + maxPrice filters. Live data.3 params

What's new on Cyclesite right now: up to 10 of the freshest active UK listings, refreshed every 15 minutes. Suited to questions like 'what's new today?' or 'any new road bikes this week?' rather than a specific filter. Optional category + maxPrice filters. Live data.

Parameters* required
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
limitnumber
How many listings to return (1-10, default 10).
maxPricenumber
Maximum price in GBP.
get_listing_detailFull details for a specific bike listing on Cyclesite: specs, condition, frame number presence, photos, delivery, seller's city. Takes the URL slug from a listing result. Example: 'tell me more about that 2022 Trek Domane'. The marketplace is not the seller: contact goes throu...1 params

Full details for a specific bike listing on Cyclesite: specs, condition, frame number presence, photos, delivery, seller's city. Takes the URL slug from a listing result. Example: 'tell me more about that 2022 Trek Domane'. The marketplace is not the seller: contact goes throu...

Parameters* required
slug*string
Listing URL slug (e.g. "used-trek-domane-sl-6-2022").
find_similar_listingsGiven a Cyclesite listing slug, return up to 5 similar active listings (same category, ±25% price, same brand or frame size weighted higher), as alternatives to one bike. Example: 'show me bikes like that one'.1 params

Given a Cyclesite listing slug, return up to 5 similar active listings (same category, ±25% price, same brand or frame size weighted higher), as alternatives to one bike. Example: 'show me bikes like that one'.

Parameters* required
slug*string
Source listing URL slug.
search_by_locationFind Cyclesite listings within a radius of a UK town, city or postcode district (the first half of a postcode, e.g. 'BS1', 'M20'). A full postcode is cut to its district; coordinates are not accepted. Radius capped at 50 miles. Returns up to 10 listings ordered by distance, ro...5 params

Find Cyclesite listings within a radius of a UK town, city or postcode district (the first half of a postcode, e.g. 'BS1', 'M20'). A full postcode is cut to its district; coordinates are not accepted. Radius capped at 50 miles. Returns up to 10 listings ordered by distance, ro...

Parameters* required
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
limitnumber
1-10, default 5.
maxPricenumber
place*string
UK town or city name (e.g. 'Bristol'), or a postcode district (e.g. 'BS1').
radiusMilesnumber
Search radius in miles (1-50, default 25).
recommend_bike_for_budgetCurated 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...5 params

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...

Parameters* required
budgetGbp*number
Maximum budget in GBP.
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
citystring
UK city to focus on (optional).
limitnumber
1-10, default 5.
useCasestring
Free-text intent (e.g. "commuting", "weekend trail", "first road bike").
list_brandsPaginated UK bike-brand catalogue from Cyclesite, ordered by stock level, for checking a brand name, listing the options or paging through the catalogue. Stock counts are returned as bands (none / 1-5 / 6-25 / 26-100 / 100+); Cyclesite doesn't expose precise per-brand inventor...3 params

Paginated UK bike-brand catalogue from Cyclesite, ordered by stock level, for checking a brand name, listing the options or paging through the catalogue. Stock counts are returned as bands (none / 1-5 / 6-25 / 26-100 / 100+); Cyclesite doesn't expose precise per-brand inventor...

Parameters* required
limitnumber
1-50, default 25.
offsetnumber
0-500.
qstring
Optional search filter (case-insensitive contains).
list_models_for_brandModels for a brand on Cyclesite (paginated). Returns model names, year ranges, in-stock flag. Example: "what Trek road bikes are available?" (brandSlug "trek", category "road").4 params

Models for a brand on Cyclesite (paginated). Returns model names, year ranges, in-stock flag. Example: "what Trek road bikes are available?" (brandSlug "trek", category "road").

Parameters* required
brandSlug*string
Brand slug, lowercase and hyphenated (e.g. "trek").
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
limitnumber
1-50, default 25.
offsetnumber
0-500.
get_model_infoCyclesite catalogue entry for a brand+model: category, year range, model description, key specs, market summary. Reference data — refreshed when models are added or specs change. Example: 'tell me about the Specialized Allez'.2 params

Cyclesite catalogue entry for a brand+model: category, year range, model description, key specs, market summary. Reference data — refreshed when models are added or specs change. Example: 'tell me about the Specialized Allez'.

Parameters* required
brand*string
model*string
get_spec_sheetAggregated 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...3 params

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...

Parameters* required
brand*string
model*string
yearnumber
compare_bikesSide-by-side comparison of up to 3 bikes (each by brand+model[+year]). Returns spec sheets and valuations together, from the same measured UK data as the single-bike spec sheets and valuations. Example: 'compare a Trek Domane SL 6 against a Specialized Roubaix Comp'.1 params

Side-by-side comparison of up to 3 bikes (each by brand+model[+year]). Returns spec sheets and valuations together, from the same measured UK data as the single-bike spec sheets and valuations. Example: 'compare a Trek Domane SL 6 against a Specialized Roubaix Comp'.

Parameters* required
bikes*array
get_size_guideFrame-size recommendation for a rider's height and bike category, the same chart Cyclesite publishes at /bike-size-calculator (height to inside leg to seat tube), refined by real UK listing data where riders' declared heights are available. Children are sized by wheel diameter...2 params

Frame-size recommendation for a rider's height and bike category, the same chart Cyclesite publishes at /bike-size-calculator (height to inside leg to seat tube), refined by real UK listing data where riders' declared heights are available. Children are sized by wheel diameter...

Parameters* required
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
heightCm*number
Rider height in centimetres (120-220).
get_valuationWhat a used UK bike is worth right now, Cyclesite's flagship tool. Returns median, range, a measured price-by-model-year curve, confidence level, and comparable active listings. When `year` is given, the answer is resolved against that model year's own measured median and conf...3 params

What a used UK bike is worth right now, Cyclesite's flagship tool. Returns median, range, a measured price-by-model-year curve, confidence level, and comparable active listings. When `year` is given, the answer is resolved against that model year's own measured median and conf...

Parameters* required
brand*string
model*string
yearnumber
Model year, e.g. 2022. Optional. When given, the response carries a `forYear` block resolving the valuation to that year, or saying in words why it could not be.
suggest_listing_priceFor a seller about to list: suggested ask, floor, and ceiling for their bike's brand+model[+year][+condition] on the UK market. Same measured UK used-price data as the valuations, framed as seller guidance. When `year` is given, the ask is anchored on that model year's own med...4 params

For a seller about to list: suggested ask, floor, and ceiling for their bike's brand+model[+year][+condition] on the UK market. Same measured UK used-price data as the valuations, framed as seller guidance. When `year` is given, the ask is anchored on that model year's own med...

Parameters* required
brand*string
conditionstring
one of Excellent · Very_Good · Good · Fair · Poor · For_Parts
model*string
yearnumber
Model year, e.g. 2021. Optional. Anchors the ask on that year when the curve covers it; `basis` in the response always names what the ask was actually derived from.
get_market_indexCurrent 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.

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. Call it with no arguments.

get_market_healthBuyer'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.

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. Call it with no arguments.

get_depreciationBrands 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?'.2 params

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* required
limitnumber
1-20, default 10.
sortstring
one of best · worst
get_price_trendsUK 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.2 params

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* required
categorystring
monthsnumber
1-24.
grade_listing_qualityCategorical 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* judgem...1 params

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* judgem...

Parameters* required
slug*string
draft_listingSell-side helper: turn a seller's raw facts into a polished Cyclesite listing draft (title, description, suggested price, photo plan). Does not publish anything: publishing needs a signed-in account (OAuth). Useful for previewing what a listing would look like. Example: 'help...10 params

Sell-side helper: turn a seller's raw facts into a polished Cyclesite listing draft (title, description, suggested price, photo plan). Does not publish anything: publishing needs a signed-in account (OAuth). Useful for previewing what a listing would look like. Example: 'help...

Parameters* required
brand*string
citystring
conditionstring
one of Excellent · Very_Good · Good · Fair · Poor · For_Parts
frameSizestring
groupsetstring
itemConditionstring
Whether the bike is new (never ridden) or used. Defaults to used. A new bike gets no used-market price suggestion.one of new · used
knownIssuesstring
Honest declaration of any issues.
model*string
willShipboolean
yearnumber
check_stolenCheck whether a UK bike's frame (serial) number matches a theft report held by Cyclesite. Live data, checked on every call. Rate-limited per serial number (3 an hour) to prevent enumeration. Example: 'does frame number WTU123456 match a theft report?'. Someone who has found a...1 params

Check whether a UK bike's frame (serial) number matches a theft report held by Cyclesite. Live data, checked on every call. Rate-limited per serial number (3 an hour) to prevent enumeration. Example: 'does frame number WTU123456 match a theft report?'. Someone who has found a...

Parameters* required
serial*string
Frame/serial number (4-50 chars).
report_stolenStep-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?'.3 params

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* required
brandstring
modelstring
serialstring
get_buying_guideSearch 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. Covers educational questions that don't need live inventory. Example: 'how do I choose a bike size?', '...2 params

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. Covers educational questions that don't need live inventory. Example: 'how do I choose a bike size?', '...

Parameters* required
limitnumber
1-5, default 3.
query*string
What to search for (e.g. "first road bike", "bike sizing").
publish_listingPublish a Cyclesite listing on the user's behalf. Multi-step: the first call (no draftId) returns step:'photos_required' with a phone-friendly photo upload URL for the seller. Once 3+ photos are uploaded, a call with the same draftId returns either step:'live' (listing is free...24 params

Publish a Cyclesite listing on the user's behalf. Multi-step: the first call (no draftId) returns step:'photos_required' with a phone-friendly photo upload URL for the seller. Once 3+ photos are uploaded, a call with the same draftId returns either step:'live' (listing is free...

Parameters* required
batteryCyclesnumber
Charge cycles as the seller reports them.
batteryHealthPercentnumber
Battery health as the seller reports it, 0-100.
brandstring
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
citystring
UK city.
conditionstring
one of Excellent · Very_Good · Good · Fair · Poor · For_Parts
descriptionstring
Listing description (30-5000 chars).
draftIdstring
Returned by a previous call. Omit on first call.
ebikeBatteryWhnumber
Battery capacity in watt-hours (100-3000).
frameSerialstring
Frame/serial number — runs a stolen-bike check before publish.
frameSizestring
groupsetstring
isEbikeboolean
True for an electric bike.
itemConditionstring
Whether the bike is new (never ridden) or used. Defaults to used.one of new · used
knownIssuesstring
modelstring
motorBrandstring
E-bike motor make, e.g. "Bosch", "Shimano", "Bafang".
motorModelstring
E-bike motor model, e.g. "Performance Line CX".
motorPositionstring
one of Mid-drive · Rear hub · Front hub
priceGbpnumber

+4 more parameters. See the server's own documentation for the full schema.

list_my_listingsShow the authenticated user's Cyclesite listings (draft / active / sold). Requires OAuth scope `listings:read`. Example: 'how are my listings doing?'.2 params

Show the authenticated user's Cyclesite listings (draft / active / sold). Requires OAuth scope `listings:read`. Example: 'how are my listings doing?'.

Parameters* required
limitnumber
1-20.
statusstring
one of active · draft · sold · all
mark_as_soldMark a Cyclesite listing as sold, optionally with the final sale price, where it sold and the date it sold. Requires OAuth scope `listings:manage`. Example: 'mark my Trek Domane as sold for £1,750 on Facebook last Saturday'.4 params

Mark a Cyclesite listing as sold, optionally with the final sale price, where it sold and the date it sold. Requires OAuth scope `listings:manage`. Example: 'mark my Trek Domane as sold for £1,750 on Facebook last Saturday'.

Parameters* required
listingId*string
salePriceGbpnumber
What it actually sold for. Leave out if the seller did not say.
saleVenuestring
Where the sale was agreed.one of cyclesite · facebook · ebay · gumtree · other_bike_site · elsewhere
soldOnstring
The day it sold, YYYY-MM-DD. Leave out for today. Ignored if in the future or before the listing went up.
get_my_enquiriesShow the messages buyers have sent about the authenticated user's Cyclesite listings, newest first. Each enquiry is one buyer's conversation: its id, the listing, the buyer's latest message, the unread count and whether the seller has replied. The seller can answer an enquiry...2 params

Show the messages buyers have sent about the authenticated user's Cyclesite listings, newest first. Each enquiry is one buyer's conversation: its id, the listing, the buyer's latest message, the unread count and whether the seller has replied. The seller can answer an enquiry...

Parameters* required
limitnumber
1-20.
listingIdstring
Only enquiries about this listing.
get_my_messagesRead the buyer's own Cyclesite message threads and any seller replies. With no arguments it lists the buyer's conversations; with a threadId it returns that thread's messages. Enquiries the buyer has sent to sellers appear here. Requires OAuth scope `listings:read`. Example: '...2 params

Read the buyer's own Cyclesite message threads and any seller replies. With no arguments it lists the buyer's conversations; with a threadId it returns that thread's messages. Enquiries the buyer has sent to sellers appear here. Requires OAuth scope `listings:read`. Example: '...

Parameters* required
limitnumber
1-50.
threadIdstring
Thread id from a conversation list or a sent enquiry. Omit to list all threads.
respond_to_enquirySend the seller's reply to a buyer who messaged about one of the authenticated user's listings. Takes the id of one of the seller's enquiries. The buyer is notified, and the message tells them an AI assistant sent it on the seller's behalf. Requires OAuth scope `enquiries:resp...2 params

Send the seller's reply to a buyer who messaged about one of the authenticated user's listings. Takes the id of one of the seller's enquiries. The buyer is notified, and the message tells them an AI assistant sent it on the seller's behalf. Requires OAuth scope `enquiries:resp...

Parameters* required
answer*string
Reply text, as the seller would write it.
enquiryId*string
The id of one of the seller's enquiries.
searchOpenAI 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 }] }. Each result id is a listing id.1 params

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 }] }. Each result id is a listing id.

Parameters* required
query*string
Free-text query.
fetchOpenAI deep-research / company-knowledge compatibility. Fetch the full document for one Cyclesite listing id. Returns { id, title, text, url, metadata }, where text is a plain-prose summary of the listing's description and specs, suitable for direct quoting in deep-research an...1 params

OpenAI deep-research / company-knowledge compatibility. Fetch the full document for one Cyclesite listing id. Returns { id, title, text, url, metadata }, where text is a plain-prose summary of the listing's description and specs, suitable for direct quoting in deep-research an...

Parameters* required
id*string
Listing id.
save_searchSubscribe the user to email alerts for Cyclesite listings matching a filter. We email them when a matching bike is listed or drops in price, instantly or in a daily digest, depending on their email preferences. Requires OAuth scope `listings:read` (read-only on data, but this...9 params

Subscribe the user to email alerts for Cyclesite listings matching a filter. We email them when a matching bike is listed or drops in price, instantly or in a daily digest, depending on their email preferences. Requires OAuth scope `listings:read` (read-only on data, but this...

Parameters* required
alertFrequencystring
How often to send digest. Default: instant.one of instant · daily · weekly
brandstring
categorystring
one of road · mtb · gravel · hybrid · ebike · kids
citystring
UK city to focus on.
conditionstring
one of Excellent · Very_Good · Good · Fair · Poor · For_Parts
maxPricenumber
minPricenumber
modelstring
namestring
Optional human-readable name (e.g. "Trek Domane in Manchester").
make_enquirySend an enquiry to a Cyclesite seller on the buyer's behalf. It's saved to the buyer's Cyclesite inbox, where the seller's reply also arrives, and the seller is notified. Per-buyer-per-listing daily cap (2/day) prevents spam. Requires OAuth scope `enquiries:respond` (the scope...2 params

Send an enquiry to a Cyclesite seller on the buyer's behalf. It's saved to the buyer's Cyclesite inbox, where the seller's reply also arrives, and the seller is notified. Per-buyer-per-listing daily cap (2/day) prevents spam. Requires OAuth scope `enquiries:respond` (the scope...

Parameters* required
listingId*string
The `listingId` of a listing.
message*string
The buyer's question to the seller (10-1930 chars).
reserve_listingHold a Cyclesite listing for 24 hours so other buyers can't claim it while the user decides. The hold is free and advisory: the seller isn't obligated to honour it. We never take a deposit or any payment for a bike; the buyer and seller arrange payment between them. Requires O...1 params

Hold a Cyclesite listing for 24 hours so other buyers can't claim it while the user decides. The hold is free and advisory: the seller isn't obligated to honour it. We never take a deposit or any payment for a bike; the buyer and seller arrange payment between them. Requires O...

Parameters* required
listingId*string

Sponsors

Configuration

CYCLESITE_API_URLdefault: https://www.cyclesite.co.uk

Cyclesite base URL. Override only for partner staging environments.

CYCLESITE_API_KEYsecret

Optional partner API key for raised rate limits. Public tier works without one.

Readme

Details

Repository
github.com/tomalarrrr/the-sites
Website
www.cyclesite.co.uk
Category
Search & Web Crawling
Package
cyclesite-mcp-server
Transport
STDIO, HTTP
Auth
Required
Registry
MCP registry, active
Resources
8
Prompts
9
Tools verified
Nov 6, 2026

Related Search & Web Crawling MCP servers

View all
1tradeos-ai avatarTradeOS (test)tradeos-ai/tradeos-mcp[TEST] TradeOS MCP bridge: ticker search, My Agent, chart TA, macro news. npm or HTTP.0stars
2valmo-sarl avatarJoomil — Swiss Classifieds MCPvalmo-sarl/joomil-mcpSearch Swiss classifieds on Joomil.ch — top marketplace in French-speaking Switzerland since 2007.0stars
3wywy-llc avatarGas Library Hubwywy-llc/app-script-hubSearch and discover Google Apps Script libraries with AI-generated summaries0stars
4yakub268 avatarKalshiyakub268/kalshi-mcpSearch, analyze, and trade Kalshi prediction markets through Claude Desktop0stars
5yifanyifan897645 avatarGit Summaryyifanyifan897645/git-summary-mcpGit repo intelligence: summaries, blame, changelogs, branch health, and history search0stars
6jobsbase avatarJobs Baseio.jobsbase/jobsSearch builder roles - jobs where one person owns engineering, product, and QA end-to-end.0stars