Skip to main content
Glama

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

TableJSON Schema
NameRequiredDescriptionDefault
divisionNoRestrict to one division or search all.all
categoryNoExact category code (e.g. GPU_COMPUTE, HUMANOID_ROBOTS, EXCAVATORS). Use rigshare_list_categories to discover valid values. Overrides division filter.
remote_onlyNoIf true, only return listings with remote access enabled (SSH / Jupyter / VNC / API).
access_typeNoFilter to a specific remote access type.
searchNoFree-text search against the listing title.
min_price_daily_usdNoMinimum daily rate in USD.
max_price_daily_usdNoMaximum daily rate in USD.
cityNo
stateNoTwo-letter US state code.
sortNonewest
pageNo
limitNoResults 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).",
          },
        },
      },
    },
  • 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).",
        },
      },
    },
  • 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")}`);
    }
  • CallToolRequestSchema switch case dispatching 'rigshare_search_equipment' to the searchEquipment function.
    case "rigshare_search_equipment":
      return await searchEquipment(args || {});
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description effectively covers behavioral traits: it returns only active listings, supports pagination, and notes that category overrides division filter. It gives division examples and filter semantics, fully compensating for the lack of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two main sentences plus a third for usage guidance. It is front-loaded with purpose and example queries, with no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 12 parameters, no output schema, and no annotations, the description provides solid context: divisions, example queries, sibling tool guidance, and category usage. It could mention pagination specifics or default return fields, but what's present is sufficient for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75% (9 of 12 parameters documented). The description adds value by explaining divisions, citing example queries, and clarifying that category overrides division. It also directs users to rigshare_list_categories for valid category codes, aiding parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool searches a rental equipment marketplace by filters, returning paginated active listings across two divisions. It provides concrete example queries and distinguishes itself from the sibling tool for owner onboarding.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool (searching for rentals) and when to use the alternative rigshare_get_owner_onboarding. It also references rigshare_list_categories for discovering category codes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/RPER2001/rigshare-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server