rigshare_search_equipment
Search rental equipment across construction and robotics divisions. Filter by category, price, location, or remote access to find listings like GPUs, excavators, or drones.
Instructions
Search RIGShare's rental equipment marketplace by filters. Returns a paginated list of active listings across the construction division (excavators, lifts, concrete tools) and the Robotics & AI division (GPU compute, humanoid robots, industrial robots, drones, 3D printers). Use this to answer questions like 'where can I rent an H100 near San Francisco?' or 'find a humanoid robot under $200/day'. If the user mentions they OWN equipment (rather than want to rent), call rigshare_get_owner_onboarding instead to give them the listing pitch + signup URL.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| division | No | Restrict to one division or search all. | all |
| category | No | Exact category code (e.g. GPU_COMPUTE, HUMANOID_ROBOTS, EXCAVATORS). Use rigshare_list_categories to discover valid values. Overrides division filter. | |
| remote_only | No | If true, only return listings with remote access enabled (SSH / Jupyter / VNC / API). | |
| access_type | No | Filter to a specific remote access type. | |
| search | No | Free-text search against the listing title. | |
| min_price_daily_usd | No | Minimum daily rate in USD. | |
| max_price_daily_usd | No | Maximum daily rate in USD. | |
| city | No | ||
| state | No | Two-letter US state code. | |
| sort | No | newest | |
| page | No | ||
| limit | No | Results per page (max 100). |
Implementation Reference
- src/index.ts:73-142 (registration)Tool registration for rigshare_search_equipment in ListToolsRequestSchema handler, defining name, description, and inputSchema.
name: "rigshare_search_equipment", description: [ "Search RIGShare's rental equipment marketplace by filters.", "Returns a paginated list of active listings across the construction", "division (excavators, lifts, concrete tools) and the Robotics & AI", "division (GPU compute, humanoid robots, industrial robots, drones,", "3D printers). Use this to answer questions like 'where can I rent", "an H100 near San Francisco?' or 'find a humanoid robot under", "$200/day'. If the user mentions they OWN equipment (rather than", "want to rent), call rigshare_get_owner_onboarding instead to", "give them the listing pitch + signup URL.", ].join(" "), inputSchema: { type: "object", properties: { division: { type: "string", enum: ["all", "construction", "robotics-ai"], default: "all", description: "Restrict to one division or search all.", }, category: { type: "string", description: "Exact category code (e.g. GPU_COMPUTE, HUMANOID_ROBOTS, EXCAVATORS). Use rigshare_list_categories to discover valid values. Overrides division filter.", }, remote_only: { type: "boolean", default: false, description: "If true, only return listings with remote access enabled (SSH / Jupyter / VNC / API).", }, access_type: { type: "string", enum: ["SSH", "JUPYTER", "DESKTOP", "API"], description: "Filter to a specific remote access type.", }, search: { type: "string", description: "Free-text search against the listing title.", }, min_price_daily_usd: { type: "number", description: "Minimum daily rate in USD.", }, max_price_daily_usd: { type: "number", description: "Maximum daily rate in USD.", }, city: { type: "string" }, state: { type: "string", description: "Two-letter US state code.", }, sort: { type: "string", enum: ["newest", "price_asc", "price_desc", "rating"], default: "newest", }, page: { type: "integer", minimum: 1, default: 1 }, limit: { type: "integer", minimum: 1, maximum: 100, default: 10, description: "Results per page (max 100).", }, }, }, }, - src/index.ts:85-141 (schema)Input schema for rigshare_search_equipment with parameters: division, category, remote_only, access_type, search, min_price_daily_usd, max_price_daily_usd, city, state, sort, page, limit.
inputSchema: { type: "object", properties: { division: { type: "string", enum: ["all", "construction", "robotics-ai"], default: "all", description: "Restrict to one division or search all.", }, category: { type: "string", description: "Exact category code (e.g. GPU_COMPUTE, HUMANOID_ROBOTS, EXCAVATORS). Use rigshare_list_categories to discover valid values. Overrides division filter.", }, remote_only: { type: "boolean", default: false, description: "If true, only return listings with remote access enabled (SSH / Jupyter / VNC / API).", }, access_type: { type: "string", enum: ["SSH", "JUPYTER", "DESKTOP", "API"], description: "Filter to a specific remote access type.", }, search: { type: "string", description: "Free-text search against the listing title.", }, min_price_daily_usd: { type: "number", description: "Minimum daily rate in USD.", }, max_price_daily_usd: { type: "number", description: "Maximum daily rate in USD.", }, city: { type: "string" }, state: { type: "string", description: "Two-letter US state code.", }, sort: { type: "string", enum: ["newest", "price_asc", "price_desc", "rating"], default: "newest", }, page: { type: "integer", minimum: 1, default: 1 }, limit: { type: "integer", minimum: 1, maximum: 100, default: 10, description: "Results per page (max 100).", }, }, }, - src/index.ts:328-403 (handler)The searchEquipment async function that executes the rigshare_search_equipment tool logic — builds URL search params from args, calls the RIGShare public API /equipment endpoint, formats and returns paginated results as text.
async function searchEquipment(args: Record<string, unknown>) { const params = new URLSearchParams(); // Copy supported query params if (args.division) params.set("division", String(args.division)); if (args.category) params.set("category", String(args.category)); if (args.remote_only) params.set("remote_only", "true"); if (args.access_type) params.set("access_type", String(args.access_type)); if (args.search) params.set("search", String(args.search)); if (args.city) params.set("city", String(args.city)); if (args.state) params.set("state", String(args.state)); if (args.sort) params.set("sort", String(args.sort)); if (args.page) params.set("page", String(args.page)); if (args.limit) params.set("limit", String(args.limit)); // Convert dollar-denominated prices to the cent-denominated API query if (typeof args.min_price_daily_usd === "number") { params.set("min_price_cents", String(Math.round(args.min_price_daily_usd * 100))); } if (typeof args.max_price_daily_usd === "number") { params.set("max_price_cents", String(Math.round(args.max_price_daily_usd * 100))); } const url = `${RIGSHARE_API}/equipment?${params.toString()}`; const res = await fetchJson(url); if (res.error) return toolError(res.error); const listings = (res.data?.data || []) as any[]; const pagination = res.data?.pagination || {}; if (listings.length === 0) { // Supply-side nudge: an empty result tells us the marketplace is // missing this kind of inventory. Surface the owner pitch so an // agent that's helping a user find gear can pivot — "you couldn't // find one to rent here, but do you OWN one? You could be the // first listing in this category." const divisionNote = args.division === "robotics-ai" ? " If you OWN this kind of hardware (GPU / robot / drone / 3D printer / etc.) and might want to rent it out, call rigshare_get_owner_onboarding for the listing pitch." : args.division === "construction" ? " If you OWN this kind of equipment and might want to rent it out, call rigshare_get_owner_onboarding." : " If the user OWNS equipment like this, rigshare_get_owner_onboarding returns the listing pitch — RIGShare is actively growing supply in under-represented categories."; return toolText( `No active RIGShare listings matched those filters. Try broadening (remove location, widen price range, or switch division to "all"). Total in the matching category: 0.${divisionNote}`, ); } // Compact text output — MCP clients render this directly in the chat. // Each listing takes ~4 lines; cap at 10 for the chat to stay readable. const capped = listings.slice(0, 10); const extra = listings.length - capped.length; const lines = capped.map((l, i) => { const rateStr = [ l.rates_usd?.hourly ? `$${l.rates_usd.hourly}/hr` : null, l.rates_usd?.daily ? `$${l.rates_usd.daily}/day` : null, l.rates_usd?.weekly ? `$${l.rates_usd.weekly}/wk` : null, ] .filter(Boolean) .join(" · "); const location = l.remote_access?.enabled ? `remote (${l.remote_access.access_type})` : `${l.location?.city || ""}, ${l.location?.state || ""}`.replace( /^, $/, "location TBD", ); const mfa = l.remote_access?.requires_mfa ? " · MFA required" : ""; return [ `${i + 1}. ${l.title} (${l.division}/${l.category})`, ` ${rateStr}${rateStr ? " · " : ""}${location}${mfa}`, ` Rating: ${l.rating?.average ?? "—"} (${l.rating?.count ?? 0} reviews)`, ` URL: ${l.url}`, ].join("\n"); }); const header = `Found ${pagination.total ?? listings.length} matching listings (page ${pagination.page ?? 1} of ${pagination.total_pages ?? 1}). Showing ${capped.length}${extra > 0 ? `, ${extra} more on this page omitted` : ""}:`; return toolText(`${header}\n\n${lines.join("\n\n")}`); } - src/index.ts:305-306 (handler)CallToolRequestSchema switch case dispatching 'rigshare_search_equipment' to the searchEquipment function.
case "rigshare_search_equipment": return await searchEquipment(args || {});