Koskamo

Whirrwork MCP

An official MCP server for Whirrwork that allows AI agents to search for robot use cases, find providers, compare robot vs human costs, estimate prices with sourced receipts, and submit RFQs for robot services globally.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Whirrwork MCP logo, by WhirrworkVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Whirrwork
MCP endpoint (Streamable HTTP)
https://whirrwork.com/mcp
Vendor documentation

What you can do with it

  • Search for robot use cases and providers by country
  • Compare robot vs human costs and get price estimates
  • Find providers and compare their specs and prices
  • Submit RFQs for robot services with buyer consent

Source and maintenance

Vendor evidenceRegistry 1.3.0

Protocol and capabilities

Server
whirrwork 1.8.0
MCP protocol
2025-06-18
Tools
23 advertised
Resources
4 advertised
Resource templates
3 advertised
Prompts
3 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Whirrwork maps jobs people hire robots for to sourced prices (with permanent price history) and providers worldwide. Flow: search_use_cases -> get_use_case (country) -> robot_or_ladder if a robot may be overkill -> estimate_cost / get_prices / get_price_history (calculators: estimate_drone_spraying_cost, estimate_drone_show_cost, buy_rent_or_hire, compare_robot_vs_human) -> find_providers (country, region) -> compare_providers -> get_rfq_template -> submit_rfq ONLY with the buyer's explicit consent -> get_rfq_status. Always cite source_url + as_of for prices and say they are benchmarks, not quotes; converted amounts state their FX date. Coverage is country-level unless a provider publishes regions; "based in" is not "serves". If estimate_cost returns null, say there is no sourced benchmark rather than guessing. Be honest when buyer tips say a robot is overkill. Data: Whirrwork (https://whirrwork.com), CC BY 4.0.

Tools

23 advertised

search_use_cases — Search robot jobs
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find the robot job (use case) that matches what the buyer wants, in plain words and in any of 12 languages. Returns matching use cases (id, name, price summary, provider count) plus matching providers and guides. Start here, then call get_use_case with the best id. Examples: "drone light show for a wedding", "robotic floor scrubbing for a warehouse", "limpieza de ventanas con drones", "无人机灯光秀".

search_use_cases input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "default": 8,
      "maximum": 25,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "examples": [
        "drone light show for 300 guests",
        "crop spraying 500 hectares soybeans"
      ],
      "maxLength": 300,
      "minLength": 2,
      "description": "What the buyer needs done, in their words"
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    },
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    }
  },
  "additionalProperties": false
}
search_use_cases output schema
{
  "type": "object",
  "required": [
    "query",
    "use_cases",
    "providers",
    "next"
  ],
  "properties": {
    "next": {
      "type": "string"
    },
    "query": {
      "type": "string"
    },
    "guides": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        }
      }
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "language": {
      "type": "string"
    },
    "providers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "hq_country": {
            "type": [
              "string",
              "null"
            ]
          },
          "matched_via_use_case": {
            "type": "string"
          }
        }
      }
    },
    "use_cases": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "score": {
            "type": "number"
          },
          "name_en": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "category_id": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "price_summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "provider_count": {
            "type": "integer"
          },
          "matched_language": {
            "type": "string"
          },
          "providers_in_country": {
            "type": "integer"
          },
          "price_benchmark_count": {
            "type": "integer"
          }
        }
      }
    },
    "match_quality": {
      "type": "string"
    },
    "detected_language": {
      "type": [
        "string",
        "null"
      ]
    }
  }
}
search_use_cases annotations
{
  "title": "Search robot jobs",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_use_case — Get a robot job
Advertised by the server during the last successful anonymous check.
Advertised read-only

Everything about one job: what it is, robot types, ways to buy (service/rental/RaaS/purchase), honest buyer tips (including when a robot is overkill), regulatory notes, every sourced price benchmark (with source_url, as_of and a USD conversion), price-history counts, the RFQ checklist, and providers. Pass country (and optionally region) to rank providers by who serves that place, with the reason.

get_use_case input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "examples": [
        "drone-light-show",
        "commercial-floor-scrubbing"
      ],
      "description": "Use case id from search_use_cases"
    },
    "region": {
      "type": "string",
      "description": "Optional sub-country region (e.g. \"US-CA\", \"California\", \"Mendoza\")"
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    },
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    }
  },
  "additionalProperties": false
}
get_use_case output schema
{
  "type": "object",
  "required": [
    "id",
    "name",
    "url",
    "price_benchmarks",
    "providers"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "region": {
      "type": [
        "string",
        "null"
      ]
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "geo_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "name_en": {
      "type": "string"
    },
    "rfq_url": {
      "type": "string"
    },
    "category": {
      "type": [
        "string",
        "null"
      ]
    },
    "language": {
      "type": "string"
    },
    "providers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Whirrwork profile page"
          },
          "name": {
            "type": "string"
          },
          "contact": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "email": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "rfq_url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "pricing": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "source_url",
                "as_of"
              ],
              "properties": {
                "low": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "usd": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "low": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "high": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "note": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    }
                  },
                  "description": "Labelled currency conversion at a dated FX rate (never a quote)"
                },
                "high": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "null = \"from\" / starting at"
                },
                "unit": {
                  "type": "string"
                },
                "as_of": {
                  "type": "string",
                  "description": "YYYY-MM or YYYY-MM-DD the source states"
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "currency": {
                  "type": "string"
                },
                "source_url": {
                  "type": "string",
                  "description": "Public page that states this price"
                },
                "description": {
                  "type": "string"
                },
                "older_price": {
                  "type": "boolean"
                }
              }
            }
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "coverage": {
            "type": [
              "string",
              "null"
            ],
            "description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
          },
          "hq_country": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          },
          "robot_types": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "last_checked": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "service_areas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "city": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "country": {
                  "type": "string"
                },
                "source_url": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "derived_from": {
                  "type": "string"
                }
              }
            }
          },
          "contact_routes": {
            "type": "object"
          },
          "coverage_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "service_regions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "engagement_models": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "has_published_pricing": {
            "type": "boolean"
          },
          "published_price_count": {
            "type": "integer"
          },
          "min_published_price_usd": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      }
    },
    "buyer_tips": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "category_id": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "robot_types": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "buyer_phrases": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "price_history": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "url": {
          "type": "string"
        },
        "series": {
          "type": "integer"
        },
        "observations": {
          "type": "integer"
        },
        "changed_series": {
          "type": "integer"
        }
      }
    },
    "price_summary": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "low": {
          "type": [
            "number",
            "null"
          ]
        },
        "high": {
          "type": [
            "number",
            "null"
          ]
        },
        "unit": {
          "type": "string"
        },
        "count": {
          "type": "integer"
        },
        "label": {
          "type": "string"
        },
        "older": {
          "type": "boolean"
        },
        "latest": {
          "type": [
            "string",
            "null"
          ]
        },
        "currency": {
          "type": "string"
        }
      }
    },
    "price_benchmarks": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source_url",
          "as_of"
        ],
        "properties": {
          "low": {
            "type": [
              "number",
              "null"
            ]
          },
          "usd": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "note": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            },
            "description": "Labelled currency conversion at a dated FX rate (never a quote)"
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "null = \"from\" / starting at"
          },
          "unit": {
            "type": "string"
          },
          "as_of": {
            "type": "string",
            "description": "YYYY-MM or YYYY-MM-DD the source states"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": "string"
          },
          "source_url": {
            "type": "string",
            "description": "Public page that states this price"
          },
          "description": {
            "type": "string"
          },
          "older_price": {
            "type": "boolean"
          }
        }
      }
    },
    "regulatory_notes": {
      "type": [
        "string",
        "null"
      ]
    },
    "rfq_template_url": {
      "type": "string"
    },
    "engagement_models": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "machine_translated": {
      "type": "boolean"
    },
    "what_to_specify_in_rfq": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
get_use_case annotations
{
  "title": "Get a robot job",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_categories — List categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

The 20 job categories with use-case counts, for browsing when the buyer is vague.

list_categories input schema
{
  "type": "object",
  "properties": {
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    }
  },
  "additionalProperties": false
}
list_categories output schema
{
  "type": "object",
  "required": [
    "categories"
  ],
  "properties": {
    "categories": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "use_case_ids"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "name_en": {
            "type": "string"
          },
          "use_case_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "use_case_count": {
            "type": "integer"
          }
        }
      }
    }
  }
}
list_categories annotations
{
  "title": "List categories",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_providers — Find providers
Advertised by the server during the last successful anonymous check.
Advertised read-only

Shortlist providers for a job and place. Ranked: lists the region > lists the country > lists part of the country > headquartered there (HQ is not a service area) > works worldwide. Each result has coverage + coverage_reason, engagement models, published pricing with USD conversion, min_published_price_usd and public contact routes. Coverage is country-level unless the provider published regions. Filters combine (AND). Example: {"use_case":"drone-light-show","country":"AE"}; {"use_case":"commercial-floor-scrubbing","country":"CA","region":"ON","engagement_model":"raas"}.

find_providers input schema
{
  "type": "object",
  "properties": {
    "near": {
      "type": "string",
      "description": "\"me\" = the country Cloudflare sees for this request (never stored), or a country name/code. Coordinates are not supported."
    },
    "sort": {
      "enum": [
        "relevance",
        "name",
        "-name",
        "price",
        "-price",
        "last_checked"
      ],
      "type": "string",
      "default": "relevance"
    },
    "limit": {
      "type": "integer",
      "default": 15,
      "maximum": 50,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "description": "Keyword filter on name/description"
    },
    "offset": {
      "type": "integer",
      "default": 0,
      "minimum": 0
    },
    "region": {
      "type": "string",
      "description": "Sub-country region code or name, e.g. \"US-CA\", \"ON\", \"Mendoza\""
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    },
    "use_case": {
      "type": "string",
      "examples": [
        "drone-light-show"
      ],
      "description": "Use case id (recommended)"
    },
    "hq_country": {
      "type": "string",
      "description": "Only providers headquartered in this country"
    },
    "robot_type": {
      "type": "string",
      "description": "Substring match on robot types, e.g. \"drone\", \"AMR\", \"humanoid\""
    },
    "has_contact": {
      "type": "boolean",
      "description": "Only providers with a public email, phone or quote form"
    },
    "has_pricing": {
      "type": "boolean",
      "description": "Only providers that publish prices"
    },
    "max_price_usd": {
      "type": "number",
      "description": "Only providers whose lowest published price (converted to USD) is at or below this. Excludes providers without published prices."
    },
    "include_global": {
      "type": "boolean",
      "default": true,
      "description": "Include providers that only say \"worldwide\" when a country is given"
    },
    "engagement_model": {
      "enum": [
        "service",
        "rental",
        "raas",
        "purchase"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
find_providers output schema
{
  "type": "object",
  "required": [
    "count",
    "providers"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "count": {
      "type": "integer"
    },
    "region": {
      "type": [
        "string",
        "null"
      ]
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "ranking": {
      "type": "string"
    },
    "use_case": {
      "type": [
        "string",
        "null"
      ]
    },
    "providers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Whirrwork profile page"
          },
          "name": {
            "type": "string"
          },
          "contact": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "email": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "rfq_url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "pricing": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "source_url",
                "as_of"
              ],
              "properties": {
                "low": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "usd": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "low": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "high": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "note": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    }
                  },
                  "description": "Labelled currency conversion at a dated FX rate (never a quote)"
                },
                "high": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "null = \"from\" / starting at"
                },
                "unit": {
                  "type": "string"
                },
                "as_of": {
                  "type": "string",
                  "description": "YYYY-MM or YYYY-MM-DD the source states"
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "currency": {
                  "type": "string"
                },
                "source_url": {
                  "type": "string",
                  "description": "Public page that states this price"
                },
                "description": {
                  "type": "string"
                },
                "older_price": {
                  "type": "boolean"
                }
              }
            }
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "coverage": {
            "type": [
              "string",
              "null"
            ],
            "description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
          },
          "hq_country": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          },
          "robot_types": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "last_checked": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "service_areas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "city": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "country": {
                  "type": "string"
                },
                "source_url": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "derived_from": {
                  "type": "string"
                }
              }
            }
          },
          "contact_routes": {
            "type": "object"
          },
          "coverage_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "service_regions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "engagement_models": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "has_published_pricing": {
            "type": "boolean"
          },
          "published_price_count": {
            "type": "integer"
          },
          "min_published_price_usd": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      }
    },
    "near_source": {
      "type": "string"
    },
    "next_offset": {
      "type": [
        "integer",
        "null"
      ]
    }
  }
}
find_providers annotations
{
  "title": "Find providers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_provider — Get a provider
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full public profile of one provider: website, HQ, service regions and explicit service areas (with sources), jobs, robot types, engagement models, published prices (with USD), contact routes, sources and last-checked date.

get_provider input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "examples": [
        "sky-elements"
      ]
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    }
  },
  "additionalProperties": false
}
get_provider output schema
{
  "type": "object",
  "required": [
    "id",
    "name",
    "url"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string",
      "description": "Whirrwork profile page"
    },
    "name": {
      "type": "string"
    },
    "contact": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "email": {
          "type": [
            "string",
            "null"
          ]
        },
        "phone": {
          "type": [
            "string",
            "null"
          ]
        },
        "rfq_url": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "pricing": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source_url",
          "as_of"
        ],
        "properties": {
          "low": {
            "type": [
              "number",
              "null"
            ]
          },
          "usd": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "note": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            },
            "description": "Labelled currency conversion at a dated FX rate (never a quote)"
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "null = \"from\" / starting at"
          },
          "unit": {
            "type": "string"
          },
          "as_of": {
            "type": "string",
            "description": "YYYY-MM or YYYY-MM-DD the source states"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "currency": {
            "type": "string"
          },
          "source_url": {
            "type": "string",
            "description": "Public page that states this price"
          },
          "description": {
            "type": "string"
          },
          "older_price": {
            "type": "boolean"
          }
        }
      }
    },
    "website": {
      "type": [
        "string",
        "null"
      ]
    },
    "coverage": {
      "type": [
        "string",
        "null"
      ],
      "description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
    },
    "hq_country": {
      "type": [
        "string",
        "null"
      ]
    },
    "description": {
      "type": "string"
    },
    "robot_types": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "source_urls": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "last_checked": {
      "type": [
        "string",
        "null"
      ]
    },
    "use_case_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "service_areas": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": "string"
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "derived_from": {
            "type": "string"
          }
        }
      }
    },
    "contact_routes": {
      "type": "object"
    },
    "coverage_reason": {
      "type": [
        "string",
        "null"
      ]
    },
    "service_regions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "engagement_models": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "has_published_pricing": {
      "type": "boolean"
    },
    "published_price_count": {
      "type": "integer"
    },
    "min_published_price_usd": {
      "type": [
        "number",
        "null"
      ]
    }
  }
}
get_provider annotations
{
  "title": "Get a provider",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_providers — Compare providers
Advertised by the server during the last successful anonymous check.
Advertised read-only

Side-by-side comparison of 2-10 providers: coverage for a country, engagement models, published prices (USD-normalized), HQ, contact routes, shared jobs, last checked. Facts only, no ratings.

compare_providers input schema
{
  "type": "object",
  "required": [
    "ids"
  ],
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "examples": [
        [
          "sky-elements",
          "verge-aero"
        ]
      ],
      "maxItems": 10,
      "minItems": 2
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    },
    "use_case": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
compare_providers output schema
{
  "type": "object",
  "required": [
    "providers"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "matrix": {
      "type": "object",
      "description": "attribute -> provider id -> value"
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "use_case": {
      "type": [
        "string",
        "null"
      ]
    },
    "providers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "description": "Whirrwork profile page"
          },
          "name": {
            "type": "string"
          },
          "contact": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "email": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "phone": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "rfq_url": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "pricing": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "source_url",
                "as_of"
              ],
              "properties": {
                "low": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "usd": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "low": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "high": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "note": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    }
                  },
                  "description": "Labelled currency conversion at a dated FX rate (never a quote)"
                },
                "high": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "null = \"from\" / starting at"
                },
                "unit": {
                  "type": "string"
                },
                "as_of": {
                  "type": "string",
                  "description": "YYYY-MM or YYYY-MM-DD the source states"
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "currency": {
                  "type": "string"
                },
                "source_url": {
                  "type": "string",
                  "description": "Public page that states this price"
                },
                "description": {
                  "type": "string"
                },
                "older_price": {
                  "type": "boolean"
                }
              }
            }
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "coverage": {
            "type": [
              "string",
              "null"
            ],
            "description": "How this provider relates to the requested place (serves region / country / part / HQ only / worldwide)"
          },
          "hq_country": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": "string"
          },
          "robot_types": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source_urls": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "last_checked": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "service_areas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "city": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "country": {
                  "type": "string"
                },
                "source_url": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "derived_from": {
                  "type": "string"
                }
              }
            }
          },
          "contact_routes": {
            "type": "object"
          },
          "coverage_reason": {
            "type": [
              "string",
              "null"
            ]
          },
          "service_regions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "engagement_models": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "has_published_pricing": {
            "type": "boolean"
          },
          "published_price_count": {
            "type": "integer"
          },
          "min_published_price_usd": {
            "type": [
              "number",
              "null"
            ]
          }
        }
      }
    },
    "shared_use_cases": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}
compare_providers annotations
{
  "title": "Compare providers",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_prices — Get current prices
Advertised by the server during the last successful anonymous check.
Advertised read-only

Current sourced prices for a job (benchmarks + provider-published), or for one provider. Every row has source_url and as_of. Set convert (e.g. "USD") to add a clearly labelled conversion with the FX rate, date and source. Benchmarks, not quotes.

get_prices input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 60,
      "maximum": 200,
      "minimum": 1
    },
    "convert": {
      "type": "string",
      "default": "USD",
      "examples": [
        "USD",
        "EUR",
        "BRL"
      ],
      "description": "Convert to this ISO 4217 currency (dated ECB reference rate)"
    },
    "currency": {
      "type": "string",
      "description": "Only rows quoted in this ISO 4217 currency"
    },
    "provider": {
      "type": "string"
    },
    "use_case": {
      "type": "string",
      "examples": [
        "crop-spraying-drone"
      ]
    },
    "include_providers": {
      "type": "boolean",
      "default": true
    }
  },
  "additionalProperties": false
}
get_prices output schema
{
  "type": "object",
  "required": [
    "count",
    "prices"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "count": {
      "type": "integer"
    },
    "prices": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source_url",
          "as_of"
        ],
        "properties": {
          "low": {
            "type": [
              "number",
              "null"
            ]
          },
          "high": {
            "type": [
              "number",
              "null"
            ]
          },
          "kind": {
            "type": "string"
          },
          "unit": {
            "type": "string"
          },
          "as_of": {
            "type": "string"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "display": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "provider": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case": {
            "type": [
              "string",
              "null"
            ]
          },
          "converted": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "note": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            },
            "description": "Labelled currency conversion at a dated FX rate (never a quote)"
          },
          "source_url": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "older_price": {
            "type": "boolean"
          },
          "provider_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case_id": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "fx_date": {
      "type": [
        "string",
        "null"
      ]
    },
    "license": {
      "type": "string"
    },
    "summary": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "low": {
          "type": [
            "number",
            "null"
          ]
        },
        "high": {
          "type": [
            "number",
            "null"
          ]
        },
        "unit": {
          "type": "string"
        },
        "count": {
          "type": "integer"
        },
        "label": {
          "type": "string"
        },
        "older": {
          "type": "boolean"
        },
        "latest": {
          "type": [
            "string",
            "null"
          ]
        },
        "currency": {
          "type": "string"
        }
      }
    }
  }
}
get_prices annotations
{
  "title": "Get current prices",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_price_history — Get price history
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every price observation we have recorded (append-only; never overwritten) for a job and/or provider, grouped into series with trend (change_pct between first and latest observation). observed_at = when we recorded it; as_of = the date the source states. If every series has one observation, say so: there is no trend yet.

get_price_history input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 100,
      "maximum": 500,
      "minimum": 1
    },
    "since": {
      "type": "string",
      "description": "YYYY-MM-DD; only observations recorded on/after this date"
    },
    "series": {
      "type": "string",
      "description": "A series_key to follow one price over time"
    },
    "provider": {
      "type": "string"
    },
    "use_case": {
      "type": "string",
      "examples": [
        "crop-spraying-drone"
      ]
    }
  },
  "additionalProperties": false
}
get_price_history output schema
{
  "type": "object",
  "required": [
    "total",
    "observations",
    "series"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "total": {
      "type": "integer"
    },
    "series": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "series_key"
        ],
        "properties": {
          "kind": {
            "type": "string"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "trend": {
            "type": [
              "object",
              "null"
            ],
            "description": "null when there is only one observation (no trend claimed)"
          },
          "latest": {
            "type": [
              "object",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "current": {
            "type": "boolean"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "series_key": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "provider_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "observations": {
            "type": "integer"
          },
          "last_rechecked": {
            "type": [
              "object",
              "null"
            ]
          },
          "last_observed_at": {
            "type": "string"
          },
          "first_observed_at": {
            "type": "string"
          }
        }
      }
    },
    "source": {
      "type": "string"
    },
    "license": {
      "type": "string"
    },
    "pagination": {
      "type": "object"
    },
    "observations": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "series_key",
          "source_url",
          "observed_at"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "low": {
            "type": [
              "number",
              "null"
            ]
          },
          "usd": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "note": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            },
            "description": "Labelled currency conversion at a dated FX rate (never a quote)"
          },
          "high": {
            "type": [
              "number",
              "null"
            ]
          },
          "kind": {
            "enum": [
              "benchmark",
              "provider_published"
            ],
            "type": "string"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "origin": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "current": {
            "type": "boolean"
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          },
          "series_key": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          },
          "supersedes": {
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "observed_at": {
            "type": "string"
          },
          "provider_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "use_case_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "content_hash": {
            "type": "string"
          },
          "use_case_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "change_reason": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "tracking_since": {
      "type": [
        "string",
        "null"
      ]
    },
    "source_rechecks": {
      "type": [
        "object",
        "null"
      ]
    }
  }
}
get_price_history annotations
{
  "title": "Get price history",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_cost — Estimate a job cost from sourced benchmarks
Advertised by the server during the last successful anonymous check.
Advertised read-only

Arithmetic on published prices: unit price × quantity, using exact unit conversions (acre↔hectare, sq ft↔m², mile↔km), preferring benchmarks whose region matches the country, converting currency at a dated ECB rate. Returns the range plus the basis rows (each with source_url, as_of, region match) and caveats. Returns estimate=null with a reason when no sourced benchmark fits; never invents a number. Example: {"use_case":"crop-spraying-drone","quantity":500,"unit":"hectare","country":"BR","currency":"USD"}.

estimate_cost input schema
{
  "type": "object",
  "required": [
    "use_case"
  ],
  "properties": {
    "unit": {
      "type": "string",
      "description": "Unit of quantity, e.g. \"hectare\", \"acre\", \"show\", \"month\", \"sq ft\". Omit to use the most common benchmark unit."
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    },
    "currency": {
      "type": "string",
      "examples": [
        "USD"
      ],
      "description": "Express the result in this ISO 4217 currency"
    },
    "quantity": {
      "type": "number",
      "description": "How many units (hectares, shows, months, inspections…). Omit for a per-unit price.",
      "exclusiveMinimum": 0
    },
    "use_case": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
estimate_cost output schema
{
  "type": "object",
  "required": [
    "use_case_id",
    "estimate"
  ],
  "properties": {
    "unit": {
      "type": [
        "string",
        "null"
      ]
    },
    "basis": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "source_url"
        ],
        "properties": {
          "cost": {
            "type": [
              "object",
              "null"
            ]
          },
          "kind": {
            "type": "string"
          },
          "as_of": {
            "type": "string"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "source_url": {
            "type": "string"
          },
          "unit_price": {
            "type": "object"
          },
          "description": {
            "type": "string"
          },
          "older_price": {
            "type": "boolean"
          },
          "provider_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "region_match": {
            "type": [
              "string",
              "null"
            ]
          },
          "used_in_range": {
            "type": "boolean"
          },
          "unit_conversion": {
            "type": [
              "object",
              "string",
              "null"
            ]
          }
        }
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "method": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "fx_date": {
      "type": [
        "string",
        "null"
      ]
    },
    "currency": {
      "type": [
        "string",
        "null"
      ]
    },
    "estimate": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "low": {
          "type": [
            "number",
            "null"
          ]
        },
        "high": {
          "type": [
            "number",
            "null"
          ]
        },
        "based_on": {
          "type": "integer"
        },
        "currency": {
          "type": "string"
        }
      },
      "description": "null = no sourced benchmark fits; never guessed"
    },
    "quantity": {
      "type": [
        "number",
        "null"
      ]
    },
    "use_case": {
      "type": "string"
    },
    "fx_source": {
      "type": "string"
    },
    "use_case_id": {
      "type": "string"
    },
    "available_units": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
estimate_cost annotations
{
  "title": "Estimate cost",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_robot_vs_human — Robot or human? Compare the cost
Advertised by the server during the last successful anonymous check.
Advertised read-only

Cost comparison of human labour (or a human service) against robot options (buy, lease, robots-as-a-service, robot service provider) for one of 22 jobs in one of 8 countries (US, DE, GB, JP, CN, IN, BR, MX). Uses the same model as whirrwork.com/tools/robot-vs-human/: every default input has a source or is flagged as an assumption (see input_sources). Returns monthly/annual cost, cost per unit, payback months, break-even utilisation, 5-year NPV vs the baseline, a verdict, non-cost factors, sensitivity ranking, and projections to 2035 with a crossover year range (robots-fast, base, robots-slow). Projections are modelled estimates, not facts: say so, and quote the range rather than one year. Examples: {"job":"warehouse-picking","country":"US"}; {"job":"commercial-floor-cleaning","country":"DE","inputs":{"volume":60000}}; {"job":"machine-tending","country":"US","region":"US-TX","include_projections":false}.

compare_robot_vs_human input schema
{
  "type": "object",
  "required": [
    "job"
  ],
  "properties": {
    "job": {
      "type": "string",
      "examples": [
        "commercial-floor-cleaning",
        "warehouse-picking",
        "wind-turbine-inspection"
      ],
      "description": "Job slug. One of the 22 jobs in GET /api/v1/robot-vs-human/jobs."
    },
    "inputs": {
      "type": "object",
      "examples": [
        {
          "wage": 21.5,
          "volume": 60000
        }
      ],
      "properties": {
        "svc": {
          "type": "number"
        },
        "days": {
          "type": "number"
        },
        "edge": {
          "type": "number"
        },
        "life": {
          "type": "number"
        },
        "raas": {
          "type": "number"
        },
        "rate": {
          "type": "number"
        },
        "wage": {
          "type": "number"
        },
        "hours": {
          "type": "number"
        },
        "kwh_h": {
          "type": "number"
        },
        "lease": {
          "type": "number"
        },
        "ratio": {
          "type": "number"
        },
        "burden": {
          "type": "number"
        },
        "months": {
          "type": "number"
        },
        "raas_h": {
          "type": "number"
        },
        "uptime": {
          "type": "number"
        },
        "volume": {
          "type": "number"
        },
        "failure": {
          "type": "number"
        },
        "horizon": {
          "type": "number"
        },
        "sup_min": {
          "type": "number"
        },
        "purchase": {
          "type": "number"
        },
        "kwh_price": {
          "type": "number"
        },
        "maint_pct": {
          "type": "number"
        },
        "svc_robot": {
          "type": "number"
        },
        "human_rate": {
          "type": "number"
        },
        "robot_rate": {
          "type": "number"
        },
        "svc_aerial": {
          "type": "number"
        },
        "integration": {
          "type": "number"
        },
        "wage_growth": {
          "type": "number"
        },
        "fee_hw_share": {
          "type": "number"
        },
        "human_equip_h": {
          "type": "number"
        },
        "svc_labour_share": {
          "type": "number"
        },
        "robot_svc_labour_share": {
          "type": "number"
        }
      },
      "description": "Optional overrides of default inputs, in the country currency. Fractions as 0-1 (uptime 0.85, rate 0.08).",
      "additionalProperties": false
    },
    "region": {
      "type": "string",
      "examples": [
        "US-CA"
      ],
      "description": "Optional regional wage preset: US states US-CA, US-TX, US-NY, US-FL, US-IL, US-WA, US-PA, US-OH; China CN-E, CN-C, CN-W, CN-NE."
    },
    "country": {
      "enum": [
        "US",
        "DE",
        "GB",
        "JP",
        "CN",
        "IN",
        "BR",
        "MX"
      ],
      "type": "string",
      "default": "US",
      "description": "Country for wage, on-cost and currency defaults (sourced: BLS, ILOSTAT, MHLW, NBS, Eurostat)."
    },
    "baseline": {
      "type": "string",
      "description": "Which human option to compare against (e.g. \"human\" or \"service\"). Defaults to the job default."
    },
    "include_tornado": {
      "type": "boolean",
      "default": true,
      "description": "Include the sensitivity (tornado) ranking of inputs by NPV swing."
    },
    "include_projections": {
      "type": "boolean",
      "default": true,
      "description": "Include 2026-2035 projections for three scenarios and the crossover year range."
    }
  },
  "additionalProperties": false
}
compare_robot_vs_human output schema
{
  "type": "object",
  "required": [
    "model_version",
    "label",
    "job",
    "country",
    "currency",
    "options",
    "verdict",
    "input_sources"
  ],
  "properties": {
    "job": {
      "type": "object",
      "required": [
        "slug",
        "name",
        "unit"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "slug": {
          "type": "string"
        },
        "unit": {
          "type": "string"
        },
        "period": {
          "type": "string"
        },
        "human_label": {
          "type": "string"
        },
        "robot_label": {
          "type": "string"
        }
      }
    },
    "label": {
      "type": "string",
      "description": "Always \"Whirrwork modelled estimates, not facts\""
    },
    "inputs": {
      "type": "object",
      "description": "Resolved inputs actually used (defaults + overrides), in the country currency; fractions 0-1",
      "additionalProperties": {
        "type": [
          "number",
          "null"
        ]
      }
    },
    "region": {
      "type": [
        "string",
        "null"
      ]
    },
    "country": {
      "type": "string"
    },
    "license": {
      "type": "string"
    },
    "noncost": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "options": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "side",
          "annual",
          "per_unit"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "side": {
            "enum": [
              "human",
              "robot"
            ],
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "annual": {
            "type": [
              "number",
              "null"
            ]
          },
          "robots": {
            "type": [
              "integer",
              "null"
            ]
          },
          "monthly": {
            "type": [
              "number",
              "null"
            ]
          },
          "upfront": {
            "type": [
              "number",
              "null"
            ]
          },
          "per_unit": {
            "type": [
              "number",
              "null"
            ]
          },
          "utilisation": {
            "type": [
              "number",
              "null"
            ]
          },
          "payback_months": {
            "type": [
              "number",
              "null"
            ],
            "description": "null = never pays back (or this is the baseline)"
          },
          "npv_vs_baseline": {
            "type": [
              "number",
              "null"
            ]
          },
          "breakeven_utilisation": {
            "type": [
              "number",
              "null"
            ],
            "description": "Share of available hours a robot must work to break even; >1 = unreachable"
          }
        }
      }
    },
    "verdict": {
      "type": "object",
      "required": [
        "winner"
      ],
      "properties": {
        "notes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "winner": {
          "enum": [
            "robot",
            "human",
            "toss-up",
            "n/a"
          ],
          "type": "string"
        },
        "saving_pct": {
          "type": [
            "number",
            "null"
          ]
        },
        "robot_option": {
          "type": [
            "string",
            "null"
          ]
        },
        "saving_annual": {
          "type": [
            "number",
            "null"
          ]
        }
      }
    },
    "baseline": {
      "type": [
        "string",
        "null"
      ]
    },
    "currency": {
      "type": "string"
    },
    "crossover": {
      "type": "object",
      "properties": {
        "base": {
          "type": [
            "integer",
            "string",
            "null"
          ]
        },
        "fast": {
          "type": [
            "integer",
            "string",
            "null"
          ]
        },
        "note": {
          "type": "string"
        },
        "slow": {
          "type": [
            "integer",
            "string",
            "null"
          ]
        }
      }
    },
    "best_robot": {
      "type": [
        "string",
        "null"
      ]
    },
    "wage_basis": {
      "type": [
        "string",
        "null"
      ]
    },
    "projections": {
      "type": "object",
      "description": "Per scenario (slow, base, fast): yearly cost per unit 2026-2035, constant 2026 money",
      "additionalProperties": {
        "type": "array",
        "items": {
          "type": "object",
          "required": [
            "year"
          ],
          "properties": {
            "year": {
              "type": "integer"
            },
            "ratio": {
              "type": [
                "number",
                "null"
              ]
            },
            "robot_option": {
              "type": [
                "string",
                "null"
              ]
            },
            "human_per_unit": {
              "type": [
                "number",
                "null"
              ]
            },
            "robot_per_unit": {
              "type": [
                "number",
                "null"
              ]
            }
          }
        }
      }
    },
    "sensitivity": {
      "type": "object",
      "properties": {
        "npv": {
          "type": [
            "number",
            "null"
          ]
        },
        "top": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "input"
            ],
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "input": {
                "type": "string"
              },
              "npv_low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "npv_high": {
                "type": [
                  "number",
                  "null"
                ]
              }
            }
          }
        },
        "option": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "input_sources": {
      "type": "object",
      "description": "Per input: status (sourced | derived | converted | assumption | user), source_id, source_url, note",
      "additionalProperties": {
        "type": "object",
        "required": [
          "status"
        ],
        "properties": {
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "enum": [
              "sourced",
              "derived",
              "converted",
              "assumption",
              "user"
            ],
            "type": "string"
          },
          "source_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "source_url": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "model_version": {
      "type": "string"
    },
    "calculator_url": {
      "type": "string"
    },
    "methodology_url": {
      "type": "string"
    }
  }
}
compare_robot_vs_human annotations
{
  "title": "Robot or human?",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
robot_or_ladder — Robot or ladder? (the Ladder Test)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Does this job need a robot at all? Rule-based verdict from the Ladder Test (the same rules as whirrwork.com/tools/robot-or-ladder/): answer up to 6 questions yes / no / unsure and get ladder, robot, both or tossup, the reasons on each side with their points, what to find out first, and (with job) the sourced price and provider counts for that job. No numbers except our own counts; nothing is stored. Questions: ladder = could a competent person with a ladder do it in an afternoon?; risk = is it dangerous for a person (height, confined space, live wires)?; scale = is it big (many hectares, a whole facade, a warehouse)?; repeat = will it repeat often (weekly, daily)?; data = do you need measurements or records (maps, thermal, logs)?; hands = does it need hands-on fixing (repair, not just looking)? Examples: {"ladder":"yes","risk":"no","scale":"no","repeat":"no"}; {"ladder":"no","risk":"yes","scale":"yes","data":"yes","job":"roof-inspection-drone"}.

robot_or_ladder input schema
{
  "type": "object",
  "properties": {
    "job": {
      "type": "string",
      "examples": [
        "roof-inspection-drone"
      ],
      "maxLength": 120,
      "description": "Optional job (use case) id from search_use_cases, to add its sourced price and provider counts"
    },
    "data": {
      "enum": [
        "yes",
        "no",
        "unsure"
      ],
      "type": "string"
    },
    "risk": {
      "enum": [
        "yes",
        "no",
        "unsure"
      ],
      "type": "string"
    },
    "hands": {
      "enum": [
        "yes",
        "no",
        "unsure"
      ],
      "type": "string"
    },
    "scale": {
      "enum": [
        "yes",
        "no",
        "unsure"
      ],
      "type": "string"
    },
    "ladder": {
      "enum": [
        "yes",
        "no",
        "unsure"
      ],
      "type": "string"
    },
    "repeat": {
      "enum": [
        "yes",
        "no",
        "unsure"
      ],
      "type": "string"
    },
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    }
  },
  "additionalProperties": false
}
robot_or_ladder output schema
{
  "type": "object",
  "required": [
    "tool",
    "verdict",
    "reasons",
    "url"
  ],
  "properties": {
    "of": {
      "type": "integer"
    },
    "job": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "prices_url": {
          "type": "string"
        },
        "robot_vs_human": {
          "type": [
            "string",
            "null"
          ]
        },
        "sourced_prices": {
          "type": "integer"
        },
        "listed_providers": {
          "type": "integer"
        }
      }
    },
    "url": {
      "type": "string"
    },
    "tool": {
      "type": "string"
    },
    "guide": {
      "type": "string"
    },
    "label": {
      "type": "string",
      "description": "Rule-based verdict, not a measurement or a cost estimate"
    },
    "rules": {
      "type": [
        "object",
        "array",
        "string"
      ]
    },
    "method": {
      "type": "string"
    },
    "answers": {
      "type": "object"
    },
    "reasons": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          },
          "answer": {
            "type": "string"
          },
          "points": {
            "type": "number"
          },
          "question": {
            "type": "string"
          },
          "points_to": {
            "type": "string"
          }
        }
      }
    },
    "verdict": {
      "enum": [
        "ladder",
        "robot",
        "both",
        "tossup",
        "none"
      ],
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "answered": {
      "type": "integer"
    },
    "buy_hint": {
      "type": [
        "string",
        "null"
      ]
    },
    "find_out": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          },
          "question": {
            "type": "string"
          }
        }
      }
    },
    "headline": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "questions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "answers": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    },
    "explanation": {
      "type": [
        "string",
        "null"
      ]
    },
    "robot_points": {
      "type": "integer"
    },
    "person_points": {
      "type": "integer"
    }
  }
}
robot_or_ladder annotations
{
  "title": "Robot or ladder?",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_drone_spraying_cost — Drone spraying cost for a field
Advertised by the server during the last successful anonymous check.
Advertised read-only

Cost of drone crop spraying for the buyer's field: every published per-acre, per-hectare, per-mu (China) and per-10-are (Japan) drone spraying rate in the dataset x area x passes, with the best-matching rate for the country (national, recent first), the same-country span, flags taken from the source (chemicals extra, minimum area, starting price, older than 12 months) and every rate's source_url and as_of. Same maths as whirrwork.com/tools/drone-spraying-cost/. Only unit conversion (1 ha = 2.4710538 acres = 15 mu = 10 x 10 a); currencies are NEVER converted. Not a quote and not a Whirrwork estimate: say so. If country_has_rates is false, say there is no published rate for that country rather than borrowing one. Examples: {"area":100,"unit":"acre","country":"US"}; {"area":40,"unit":"ha","passes":3,"country":"BR"}; {"area":250,"unit":"ha","country":"CN"}.

estimate_drone_spraying_cost input schema
{
  "type": "object",
  "properties": {
    "area": {
      "type": "number",
      "maximum": 10000000,
      "examples": [
        100
      ],
      "description": "Field area in the chosen unit",
      "exclusiveMinimum": 0
    },
    "unit": {
      "enum": [
        "acre",
        "ha"
      ],
      "type": "string",
      "description": "Area unit (default: the unit of the best-matching rate)"
    },
    "passes": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "Number of spray passes (default 1)"
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "examples": [
        "US",
        "BR",
        "CN"
      ],
      "description": "Buyer country, ISO 3166-1 alpha-2"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Currency of own_rate (ISO 4217)"
    },
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    },
    "own_rate": {
      "type": "number",
      "maximum": 10000000,
      "minimum": 0,
      "description": "A rate the buyer was quoted, per chosen unit, to compare"
    },
    "rate_index": {
      "type": "integer",
      "minimum": 0,
      "description": "Use this published rate (index from rates[].index) as the headline instead of the automatic pick"
    }
  },
  "additionalProperties": false
}
estimate_drone_spraying_cost output schema
{
  "type": "object",
  "required": [
    "tool",
    "rates",
    "formula",
    "url"
  ],
  "properties": {
    "job": {
      "type": "object"
    },
    "url": {
      "type": "string"
    },
    "area": {
      "type": [
        "number",
        "null"
      ]
    },
    "tool": {
      "type": "string"
    },
    "unit": {
      "type": "string"
    },
    "input": {
      "type": "object"
    },
    "label": {
      "type": "string"
    },
    "rates": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "index",
          "published",
          "source_url"
        ],
        "properties": {
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "flags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "index": {
            "type": "integer"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "provider": {
            "type": [
              "object",
              "null"
            ]
          },
          "published": {
            "type": "object",
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "unit": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            }
          },
          "source_url": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "converted_unit": {
            "type": "boolean"
          },
          "rate_per_your_unit": {
            "type": "object"
          },
          "cost_for_your_field": {
            "type": [
              "object",
              "null"
            ]
          }
        }
      }
    },
    "method": {
      "type": "string"
    },
    "passes": {
      "type": "integer"
    },
    "formula": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "selected": {
      "type": [
        "object",
        "null"
      ],
      "description": "Best-matching published rate for the country (null when none applies)"
    },
    "your_rate": {
      "type": [
        "object",
        "null"
      ]
    },
    "hectare_in_acres": {
      "type": "number"
    },
    "country_has_rates": {
      "type": "boolean"
    },
    "same_country_span": {
      "type": [
        "object",
        "null"
      ]
    },
    "countries_with_rates": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "hourly_rates_not_converted": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
estimate_drone_spraying_cost annotations
{
  "title": "Drone spraying cost",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_drone_show_cost — Drone light show cost
Advertised by the server during the last successful anonymous check.
Advertised read-only

Cost of a drone light show of N drones: every published per-drone price x drones (best match for the country first, peak-date prices only when peak=true), plus the published whole shows closest in drone count (NEVER scaled to your size; implied per drone = show price / stated drones), the same-country span, a check of a quote the buyer received (per drone vs the published range in that currency) and too_few_receipts when fewer than 3 prices apply to the country. Every price has source_url and as_of. Same maths as whirrwork.com/tools/drone-show-cost/. Currencies are NEVER converted. Not a quote and not a Whirrwork estimate: say so. Examples: {"drones":200,"country":"US"}; {"drones":100,"country":"GB","quote":9000,"currency":"GBP"}; {"drones":500,"country":"CN"}.

estimate_drone_show_cost input schema
{
  "type": "object",
  "properties": {
    "peak": {
      "type": "boolean",
      "description": "Peak date (e.g. July 4th, New Year's Eve): include peak-date prices"
    },
    "quote": {
      "type": "number",
      "description": "Total price the buyer was quoted, to check against published prices",
      "exclusiveMinimum": 0
    },
    "drones": {
      "type": "integer",
      "maximum": 20000,
      "minimum": 1,
      "examples": [
        200
      ],
      "description": "Number of drones in the show"
    },
    "country": {
      "type": "string",
      "pattern": "^[A-Za-z]{2}$",
      "examples": [
        "US",
        "GB",
        "AE",
        "CN"
      ],
      "description": "Buyer country, ISO 3166-1 alpha-2"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Currency of quote (ISO 4217)"
    },
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    }
  },
  "additionalProperties": false
}
estimate_drone_show_cost output schema
{
  "type": "object",
  "required": [
    "tool",
    "prices",
    "formula",
    "url"
  ],
  "properties": {
    "job": {
      "type": "object"
    },
    "url": {
      "type": "string"
    },
    "peak": {
      "type": "boolean"
    },
    "tool": {
      "type": "string"
    },
    "input": {
      "type": "object"
    },
    "label": {
      "type": "string"
    },
    "drones": {
      "type": [
        "integer",
        "null"
      ]
    },
    "method": {
      "type": "string"
    },
    "prices": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "index",
          "type",
          "published",
          "source_url"
        ],
        "properties": {
          "type": {
            "enum": [
              "per_drone",
              "whole_show"
            ],
            "type": "string"
          },
          "as_of": {
            "type": [
              "string",
              "null"
            ]
          },
          "flags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "index": {
            "type": "integer"
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "published": {
            "type": "object",
            "properties": {
              "low": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "unit": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              }
            }
          },
          "source_url": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "implied_per_drone": {
            "type": [
              "object",
              "number",
              "null"
            ]
          },
          "cost_for_your_show": {
            "type": [
              "object",
              "null"
            ]
          },
          "applies_to_your_country": {
            "type": "string"
          }
        }
      }
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "formula": {
      "type": "string"
    },
    "version": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "selected": {
      "type": [
        "object",
        "null"
      ],
      "description": "Best-matching per-drone price applied to your drone count (null when none applies)"
    },
    "your_quote": {
      "type": [
        "object",
        "null"
      ]
    },
    "too_few_receipts": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "same_country_span": {
      "type": [
        "object",
        "null"
      ]
    },
    "countries_with_prices": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "nearest_published_shows": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "receipts_for_your_country": {
      "type": [
        "integer",
        "null"
      ]
    }
  }
}
estimate_drone_show_cost annotations
{
  "title": "Drone show cost",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
buy_rent_or_hire — Buy, rent or hire a robot service?
Advertised by the server during the last successful anonymous check.
Advertised read-only

Total cost of buying a robot vs renting it (lease / robots-as-a-service) vs hiring a service over a period, with break-even months and the cheapest option ("within_10_percent" = too close to call). Defaults come only from sourced price rows hand-tagged buy / rent / service for the job (each with source_url and as_of; pick another with buy_receipt / rent_receipt / service_receipt, or "none"); any number the buyer gives overrides the receipt. Running costs (upkeep, staff hours x wage, setup fee, resale) are the buyer's own and have no default. Same maths as whirrwork.com/tools/buy-rent-or-hire/. Without job, returns jobs_with_receipts. Not a quote, not a forecast. Examples: {"job":"commercial-floor-scrubbing","months":36}; {"job":"crop-spraying-drone","months":24,"qty":300}; {"job":"commercial-floor-scrubbing","months":60,"upkeep":150,"hours":20,"wage":18}.

buy_rent_or_hire input schema
{
  "type": "object",
  "properties": {
    "buy": {
      "type": "number",
      "maximum": 1000000000,
      "minimum": 0,
      "description": "Purchase price (overrides the receipt)"
    },
    "end": {
      "enum": [
        "low",
        "mid",
        "high"
      ],
      "type": "string",
      "description": "Which end of each published range to use (default low)"
    },
    "job": {
      "type": "string",
      "examples": [
        "commercial-floor-scrubbing"
      ],
      "maxLength": 120,
      "description": "Job (use case) id; omit to list jobs that have tagged receipts"
    },
    "qty": {
      "type": "number",
      "maximum": 10000000,
      "minimum": 0,
      "description": "Service amount per month in the service receipt's unit (hectares, sq ft, visits...)"
    },
    "rent": {
      "type": "number",
      "maximum": 100000000,
      "minimum": 0,
      "description": "Rent / RaaS per month (overrides the receipt)"
    },
    "wage": {
      "type": "number",
      "maximum": 100000,
      "minimum": 0,
      "description": "Wage per staff hour"
    },
    "hours": {
      "type": "number",
      "maximum": 744,
      "minimum": 0,
      "description": "Staff hours per month to run it (buy and rent)"
    },
    "setup": {
      "type": "number",
      "maximum": 1000000000,
      "minimum": 0,
      "description": "One-off setup fee when renting"
    },
    "months": {
      "type": "integer",
      "maximum": 120,
      "minimum": 1,
      "description": "Period in months (default 36)"
    },
    "resale": {
      "type": "number",
      "maximum": 1000000000,
      "minimum": 0,
      "description": "Resale value at the end when bought"
    },
    "upkeep": {
      "type": "number",
      "maximum": 100000000,
      "minimum": 0,
      "description": "Upkeep per month when bought"
    },
    "service": {
      "type": "number",
      "maximum": 100000000,
      "minimum": 0,
      "description": "Service price per unit (overrides the receipt)"
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Currency of your own numbers (ISO 4217)"
    },
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    },
    "buy_receipt": {
      "type": [
        "integer",
        "string"
      ],
      "description": "Receipt index from receipts_available, or \"none\" to leave this option out"
    },
    "rent_receipt": {
      "type": [
        "integer",
        "string"
      ],
      "description": "Receipt index from receipts_available, or \"none\" to leave this option out"
    },
    "service_receipt": {
      "type": [
        "integer",
        "string"
      ],
      "description": "Receipt index from receipts_available, or \"none\" to leave this option out"
    }
  },
  "additionalProperties": false
}
buy_rent_or_hire output schema
{
  "type": "object",
  "required": [
    "tool",
    "url",
    "formula"
  ],
  "properties": {
    "job": {
      "type": [
        "object",
        "null"
      ]
    },
    "url": {
      "type": "string"
    },
    "tool": {
      "type": "string"
    },
    "input": {
      "type": "object"
    },
    "label": {
      "type": "string"
    },
    "issues": {
      "type": "array",
      "items": {
        "type": [
          "object",
          "string"
        ]
      }
    },
    "method": {
      "type": "string"
    },
    "months": {
      "type": "integer"
    },
    "ranked": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "object"
        ]
      }
    },
    "formula": {
      "type": "string"
    },
    "options": {
      "type": "object",
      "description": "buy / rent / service: totals, per month, source (receipt | yours) and the receipt used"
    },
    "version": {
      "type": "string"
    },
    "cheapest": {
      "type": [
        "string",
        "null"
      ]
    },
    "currency": {
      "type": [
        "string",
        "null"
      ]
    },
    "language": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "text": {
            "type": "string"
          }
        }
      }
    },
    "break_even_months": {
      "type": [
        "object",
        "null"
      ]
    },
    "receipts_reviewed": {
      "type": [
        "string",
        "object",
        "null"
      ]
    },
    "within_10_percent": {
      "type": [
        "boolean",
        "null"
      ]
    },
    "jobs_with_receipts": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "receipts_available": {
      "type": [
        "object",
        "null"
      ]
    }
  }
}
buy_rent_or_hire annotations
{
  "title": "Buy, rent or hire?",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_robots_for_job — Find robot types and models for a job
Advertised by the server during the last successful anonymous check.
Advertised read-only

Which kinds of robot do a job (primary type first, then alternatives), with the commercial models we have catalogued for each type: maker-published key specs, list price where published, and the Whirrwork assessment (a score only when independent trials or tests exist; otherwise "Not enough evidence to rate"). Use search_use_cases first to get the job id. Example: {"job":"crop-spraying-drone"}

find_robots_for_job input schema
{
  "type": "object",
  "required": [
    "job"
  ],
  "properties": {
    "job": {
      "type": "string",
      "examples": [
        "crop-spraying-drone",
        "commercial-floor-scrubbing",
        "solar-farm-cleaning"
      ],
      "maxLength": 120,
      "minLength": 2,
      "description": "Job (use case) id from search_use_cases"
    }
  },
  "additionalProperties": false
}
find_robots_for_job output schema
{
  "type": "object",
  "required": [
    "job",
    "types"
  ],
  "properties": {
    "job": {
      "type": "object",
      "required": [
        "id",
        "url"
      ],
      "properties": {
        "id": {
          "type": "string"
        },
        "url": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "note": {
      "type": "string"
    },
    "types": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "role": {
            "enum": [
              "primary",
              "alternative"
            ],
            "type": "string"
          },
          "family": {
            "type": "string"
          },
          "models": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "name",
                "maker",
                "url",
                "assessment"
              ],
              "properties": {
                "id": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "maker": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "summary": {
                  "type": "string"
                },
                "type_ids": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "key_specs": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "object",
                    "properties": {
                      "unit": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "value": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "value_max": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    }
                  }
                },
                "assessment": {
                  "type": "object",
                  "required": [
                    "rated",
                    "label",
                    "score"
                  ],
                  "properties": {
                    "band": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "label": {
                      "type": "string",
                      "description": "\"Whirrwork assessment, not a lab test\" or \"Not enough evidence to rate\""
                    },
                    "rated": {
                      "type": "boolean"
                    },
                    "score": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "0-100; null when not rated"
                    },
                    "evidence_count": {
                      "type": "integer"
                    }
                  }
                },
                "list_price": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "properties": {
                    "unit": {
                      "type": "string"
                    },
                    "amount": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "checked": {
                      "type": "string"
                    },
                    "currency": {
                      "type": "string"
                    },
                    "source_url": {
                      "type": "string"
                    },
                    "amount_high": {
                      "type": [
                        "number",
                        "null"
                      ]
                    },
                    "as_published": {
                      "type": "string"
                    }
                  },
                  "description": "Maker-published list price with source (not a quote)"
                },
                "provider_id": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "official_url": {
                  "type": "string"
                }
              }
            }
          },
          "as_listed": {
            "type": "string"
          },
          "job_count": {
            "type": "integer"
          },
          "key_specs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                }
              }
            }
          },
          "description": {
            "type": "string"
          },
          "family_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "model_count": {
            "type": "integer"
          }
        }
      }
    },
    "model_count": {
      "type": "integer"
    },
    "methodology_url": {
      "type": "string"
    }
  }
}
find_robots_for_job annotations
{
  "title": "Find robots for a job",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_robot_model — Get a robot model
Advertised by the server during the last successful anonymous check.
Advertised read-only

One commercial robot model: every maker-published spec with its source URL and the date we checked it (unknown specs are absent, never guessed), maker claims labelled as such, list price if published, independent evidence (trials, tests, certifications, documented deployments) with findings, the jobs its type does, and the Whirrwork assessment with its components. Quote specs with their source.

get_robot_model input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "examples": [
        "dji-agras-t50",
        "boston-dynamics-spot"
      ],
      "maxLength": 120,
      "minLength": 2,
      "description": "Model id from find_robots_for_job or /api/v1/robot-models"
    }
  },
  "additionalProperties": false
}
get_robot_model output schema
{
  "type": "object",
  "required": [
    "id",
    "name",
    "specs",
    "assessment",
    "evidence"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "jobs": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "role": {
            "type": "string"
          }
        }
      }
    },
    "name": {
      "type": "string"
    },
    "note": {
      "type": [
        "string",
        "null"
      ]
    },
    "maker": {
      "type": "string"
    },
    "specs": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "label",
          "as_published",
          "source_url",
          "checked"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "unit": {
            "type": [
              "string",
              "null"
            ]
          },
          "label": {
            "type": "string"
          },
          "value": {
            "type": [
              "number",
              "null"
            ]
          },
          "checked": {
            "type": "string"
          },
          "value_max": {
            "type": [
              "number",
              "null"
            ]
          },
          "source_url": {
            "type": "string"
          },
          "maker_claim": {
            "type": "boolean"
          },
          "as_published": {
            "type": "string"
          }
        }
      }
    },
    "types": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      }
    },
    "status": {
      "type": "string"
    },
    "summary": {
      "type": "string"
    },
    "evidence": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "title",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "date": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "checked": {
            "type": "string"
          },
          "finding": {
            "type": "string"
          },
          "direction": {
            "type": "string"
          },
          "publisher": {
            "type": "string"
          },
          "applies_to": {
            "type": "string"
          },
          "kind_label": {
            "type": "string"
          }
        }
      }
    },
    "spec_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "type_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "assessment": {
      "type": "object",
      "required": [
        "rated",
        "label",
        "score",
        "components"
      ],
      "properties": {
        "band": {
          "type": [
            "string",
            "null"
          ]
        },
        "label": {
          "type": "string"
        },
        "rated": {
          "type": "boolean"
        },
        "score": {
          "type": [
            "integer",
            "null"
          ]
        },
        "reasons": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "components": {
          "type": "object",
          "description": "evidence (0-60), transparency (0-20), strength (0-20 or not scored), with their inputs"
        },
        "evidence_count": {
          "type": "integer"
        },
        "methodology_url": {
          "type": "string"
        },
        "performance_evidence_count": {
          "type": "integer"
        }
      }
    },
    "list_price": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "unit": {
          "type": "string"
        },
        "amount": {
          "type": [
            "number",
            "null"
          ]
        },
        "checked": {
          "type": "string"
        },
        "currency": {
          "type": "string"
        },
        "source_url": {
          "type": "string"
        },
        "amount_high": {
          "type": [
            "number",
            "null"
          ]
        },
        "as_published": {
          "type": "string"
        }
      },
      "description": "Maker-published list price with source (not a quote)"
    },
    "specs_note": {
      "type": "string"
    },
    "provider_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "maker_claims": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "checked": {
            "type": "string"
          },
          "source_url": {
            "type": "string"
          }
        }
      }
    },
    "official_url": {
      "type": "string"
    }
  }
}
get_robot_model annotations
{
  "title": "Get a robot model",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
compare_robot_models — Compare robot models
Advertised by the server during the last successful anonymous check.
Advertised read-only

Side-by-side specs of 2-4 models of the same robot type: one row per spec with each model's maker-published value and source (null = not published), plus each model's assessment. Models of different types are refused with an explanation. Example: {"ids":["tennant-x4-rovr","avidbots-neo-2"]}

compare_robot_models input schema
{
  "type": "object",
  "required": [
    "ids"
  ],
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "examples": [
        [
          "dji-agras-t50",
          "dji-agras-t25"
        ]
      ],
      "maxItems": 4,
      "minItems": 2
    }
  },
  "additionalProperties": false
}
compare_robot_models output schema
{
  "type": "object",
  "required": [
    "type",
    "models",
    "rows"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key",
          "values"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "values": {
            "type": "array",
            "items": {
              "type": [
                "object",
                "null"
              ],
              "properties": {
                "key": {
                  "type": "string"
                },
                "unit": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "label": {
                  "type": "string"
                },
                "value": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "checked": {
                  "type": "string"
                },
                "value_max": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "source_url": {
                  "type": "string"
                },
                "maker_claim": {
                  "type": "boolean"
                },
                "as_published": {
                  "type": "string"
                }
              }
            }
          },
          "maker_claim": {
            "type": "boolean"
          }
        }
      }
    },
    "type": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "name": {
          "type": "string"
        }
      }
    },
    "models": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "name",
          "maker",
          "url",
          "assessment"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "maker": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "type_ids": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "key_specs": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "unit": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "value": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "value_max": {
                  "type": [
                    "number",
                    "null"
                  ]
                }
              }
            }
          },
          "assessment": {
            "type": "object",
            "required": [
              "rated",
              "label",
              "score"
            ],
            "properties": {
              "band": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "label": {
                "type": "string",
                "description": "\"Whirrwork assessment, not a lab test\" or \"Not enough evidence to rate\""
              },
              "rated": {
                "type": "boolean"
              },
              "score": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "0-100; null when not rated"
              },
              "evidence_count": {
                "type": "integer"
              }
            }
          },
          "list_price": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "unit": {
                "type": "string"
              },
              "amount": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "checked": {
                "type": "string"
              },
              "currency": {
                "type": "string"
              },
              "source_url": {
                "type": "string"
              },
              "amount_high": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "as_published": {
                "type": "string"
              }
            },
            "description": "Maker-published list price with source (not a quote)"
          },
          "provider_id": {
            "type": [
              "string",
              "null"
            ]
          },
          "official_url": {
            "type": "string"
          }
        }
      }
    }
  }
}
compare_robot_models annotations
{
  "title": "Compare robot models",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_countries — Coverage by country
Advertised by the server during the last successful anonymous check.
Advertised read-only

For each country: providers that list it as a service area, providers serving parts of it (with sub-regions), and providers headquartered there; plus the number of worldwide providers. Use to tell the buyer honestly how well their country is covered.

list_countries input schema
{
  "type": "object",
  "properties": {
    "country": {
      "type": "string",
      "description": "Optional: just this country"
    }
  },
  "additionalProperties": false
}
list_countries output schema
{
  "type": "object",
  "required": [
    "global_providers"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "countries": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "code"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "sub_regions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "slug": {
                  "type": "string"
                },
                "region": {
                  "type": "string"
                },
                "providers": {
                  "type": "integer"
                },
                "region_code": {
                  "type": [
                    "string",
                    "null"
                  ]
                }
              }
            }
          },
          "providers_hq": {
            "type": "integer"
          },
          "providers_serving": {
            "type": "integer"
          },
          "providers_serving_part": {
            "type": "integer"
          }
        }
      }
    },
    "sub_regions": {
      "type": "array"
    },
    "providers_hq": {
      "type": "integer"
    },
    "global_providers": {
      "type": "integer"
    },
    "providers_serving": {
      "type": "integer"
    },
    "providers_serving_part": {
      "type": "integer"
    }
  },
  "description": "Without country: { global_providers, countries[] }. With country: that country's counts + url."
}
list_countries annotations
{
  "title": "Coverage by country",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_rfq_template — Get the RFQ template for a job
Advertised by the server during the last successful anonymous check.
Advertised read-only

The exact fields to collect from the buyer before submit_rfq: core fields (required flags, formats) plus the job-specific checklist suppliers need to price it (as extra.{key}), regulatory notes, and a filled example. Ask the buyer for these, then call submit_rfq.

get_rfq_template input schema
{
  "type": "object",
  "required": [
    "use_case"
  ],
  "properties": {
    "language": {
      "enum": [
        "en",
        "es",
        "pt-BR",
        "fr",
        "de",
        "zh",
        "zh-Hant",
        "ja",
        "ar",
        "hi",
        "ko",
        "id",
        "tr"
      ],
      "type": "string",
      "examples": [
        "es",
        "pt-BR",
        "zh"
      ],
      "description": "Language for use-case text (machine-translated; English is authoritative). Default en."
    },
    "use_case": {
      "type": "string",
      "examples": [
        "commercial-floor-scrubbing"
      ]
    }
  },
  "additionalProperties": false
}
get_rfq_template output schema
{
  "type": "object",
  "required": [
    "use_case_id",
    "fields"
  ],
  "properties": {
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "key"
        ],
        "properties": {
          "key": {
            "type": "string"
          },
          "type": {
            "type": "string"
          },
          "value": {
            "type": "string"
          },
          "required": {
            "type": "boolean"
          },
          "description": {
            "type": "string"
          }
        }
      }
    },
    "submit": {
      "type": "object"
    },
    "example": {
      "type": "object"
    },
    "use_case": {
      "type": "string"
    },
    "buyer_tips": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "use_case_id": {
      "type": "string"
    },
    "regulatory_notes": {
      "type": [
        "string",
        "null"
      ]
    },
    "engagement_models": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "supplier_checklist": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "supplier_checklist_localized": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
get_rfq_template annotations
{
  "title": "Get RFQ template",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
submit_rfq — Submit a request for quotes
Advertised by the server during the last successful anonymous check.
Open-world

Submit a request for quotes for a real buyer who explicitly agreed to be contacted by matched suppliers (consent=true). Stored, auto-matched to providers by job + country, and reviewed by a human before anything is forwarded; nothing is emailed automatically. Returns id, status, matched provider ids, and a private status_url/access key for get_rfq_status. Use test=true for testing.

submit_rfq input schema
{
  "type": "object",
  "required": [
    "job",
    "country",
    "contact_email",
    "consent"
  ],
  "properties": {
    "job": {
      "type": "string",
      "maxLength": 300,
      "description": "One sentence: what, where, how big"
    },
    "test": {
      "type": "boolean",
      "description": "Mark as a test (excluded from stats, deleted)"
    },
    "extra": {
      "type": "object",
      "description": "Answers to the job checklist, keyed as in get_rfq_template",
      "additionalProperties": {
        "type": "string"
      }
    },
    "consent": {
      "type": "boolean",
      "const": true,
      "description": "Must be true: the buyer agreed to share the request (incl. email) with matched suppliers"
    },
    "country": {
      "type": "string",
      "examples": [
        "AE",
        "BR",
        "CA",
        "Germany"
      ],
      "description": "Buyer country: ISO 3166-1 alpha-2 (\"AE\") or English name (\"United Arab Emirates\")."
    },
    "details": {
      "type": "string",
      "maxLength": 5000
    },
    "date_end": {
      "type": "string",
      "format": "date"
    },
    "location": {
      "type": "string",
      "description": "City / site"
    },
    "agent_name": {
      "type": "string",
      "description": "Your agent/product name"
    },
    "budget_max": {
      "type": "number"
    },
    "budget_min": {
      "type": "number"
    },
    "date_start": {
      "type": "string",
      "format": "date"
    },
    "use_case_id": {
      "type": "string"
    },
    "contact_name": {
      "type": "string"
    },
    "contact_email": {
      "type": "string",
      "format": "email"
    },
    "contact_phone": {
      "type": "string",
      "description": "Optional phone/WhatsApp/WeChat, international format"
    },
    "date_flexible": {
      "type": "boolean"
    },
    "provider_hint": {
      "type": "string",
      "description": "Optional provider id the buyer prefers"
    },
    "budget_currency": {
      "type": "string",
      "description": "ISO 4217"
    },
    "contact_company": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
submit_rfq output schema
{
  "type": "object",
  "required": [
    "id",
    "status"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "enum": [
        "received",
        "matched",
        "sent_to_suppliers",
        "quoted",
        "closed"
      ],
      "type": "string"
    },
    "is_test": {
      "type": "boolean"
    },
    "message": {
      "type": "string"
    },
    "access_key": {
      "type": "string"
    },
    "status_url": {
      "type": "string"
    },
    "matched_provider_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
submit_rfq annotations
{
  "title": "Submit RFQ",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_rfq_status — Check an RFQ
Advertised by the server during the last successful anonymous check.
Advertised read-only

Status of a submitted RFQ (received → matched → sent_to_suppliers → quoted → closed) with its status history. Needs the id and the access key returned by submit_rfq (the key= part of status_url).

get_rfq_status input schema
{
  "type": "object",
  "required": [
    "id",
    "key"
  ],
  "properties": {
    "id": {
      "type": "string",
      "examples": [
        "RFQ-261025-ABCDE"
      ]
    },
    "key": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_rfq_status output schema
{
  "type": "object",
  "required": [
    "id",
    "status"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "status": {
      "enum": [
        "received",
        "matched",
        "sent_to_suppliers",
        "quoted",
        "closed"
      ],
      "type": "string"
    },
    "country": {
      "type": [
        "string",
        "null"
      ]
    },
    "created_at": {
      "type": "string"
    },
    "updated_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "use_case_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "status_history": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "at": {
            "type": "string"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "to_status": {
            "type": "string"
          },
          "from_status": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      }
    },
    "matched_provider_count": {
      "type": "integer"
    }
  }
}
get_rfq_status annotations
{
  "title": "Check RFQ status",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search_stats — Search citable robot statistics
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search Whirrwork Research: 100+ citable statistics on robot adoption, industrial and service robots, humanoids, drones, agriculture, cleaning, warehouses, labour shortages, wages, prices and funding, plus figures from Whirrwork's own dataset. Each result has the exact figure with unit and scope, the primary source (publisher, title, date, URL, Wayback archive), access and last-verified dates, a confidence level (high/medium/low), source_type (primary/secondary/whirrwork) and a permanent URL. Quote figures with their source and date; prefer high-confidence primary sources. Call get_stat for the verbatim quote, caveats and ready-made APA/Chicago/MLA/BibTeX citations. Examples: "humanoid robots sold 2025", "robot density Korea", "drone spraying price per acre", "robotics funding", topic="labour".

search_stats input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 50,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "examples": [
        "industrial robot installations China",
        "humanoid price",
        "labour shortage Japan"
      ],
      "description": "Keywords (English). Omit to list by topic."
    },
    "topic": {
      "enum": [
        "adoption",
        "service",
        "humanoids",
        "drones",
        "agriculture",
        "cleaning",
        "warehouse",
        "construction",
        "labour",
        "prices",
        "funding",
        "regulation",
        "whirrwork"
      ],
      "type": "string",
      "description": "Optional topic filter"
    },
    "confidence": {
      "enum": [
        "high",
        "medium",
        "low"
      ],
      "type": "string"
    },
    "source_type": {
      "enum": [
        "primary",
        "secondary",
        "whirrwork"
      ],
      "type": "string"
    }
  },
  "additionalProperties": false
}
search_stats output schema
{
  "type": "object",
  "required": [
    "count",
    "stats"
  ],
  "properties": {
    "note": {
      "type": "string"
    },
    "count": {
      "type": "integer"
    },
    "query": {
      "type": [
        "string",
        "null"
      ]
    },
    "stats": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "slug",
          "url",
          "claim",
          "figure",
          "confidence",
          "source"
        ],
        "properties": {
          "url": {
            "type": "string",
            "description": "Permanent Whirrwork page for this statistic"
          },
          "slug": {
            "type": "string"
          },
          "claim": {
            "type": "string",
            "description": "One-sentence claim (English)"
          },
          "quote": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "lang": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            }
          },
          "scope": {
            "type": "object",
            "properties": {
              "period": {
                "type": "string"
              },
              "geography": {
                "type": "string"
              }
            }
          },
          "stale": {
            "type": "boolean",
            "description": "true = not re-verified for more than 180 days"
          },
          "topic": {
            "type": "string"
          },
          "figure": {
            "type": "object",
            "required": [
              "display"
            ],
            "properties": {
              "unit": {
                "type": "string"
              },
              "value": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "display": {
                "type": "string"
              }
            }
          },
          "source": {
            "type": "object",
            "required": [
              "type",
              "name",
              "title",
              "url"
            ],
            "properties": {
              "url": {
                "type": "string"
              },
              "kind": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "type": {
                "enum": [
                  "primary",
                  "secondary",
                  "whirrwork"
                ],
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "date_note": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "published": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Publication date stated by the source (null = not stated; see date_note)"
              },
              "publisher": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "archive_url": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Wayback Machine copy"
              },
              "archived_at": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "primary_note": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          },
          "caveats": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "license": {
            "type": "string"
          },
          "measure": {
            "type": "string",
            "description": "How the figure was produced: official statistic, company claim, list price, survey, estimate, forecast..."
          },
          "release": {
            "type": [
              "string",
              "null"
            ]
          },
          "accessed": {
            "type": "string"
          },
          "citations": {
            "type": "object",
            "properties": {
              "apa": {
                "type": "string"
              },
              "mla": {
                "type": "string"
              },
              "bibtex": {
                "type": "string"
              },
              "chicago": {
                "type": "string"
              },
              "source_apa": {
                "type": "string"
              }
            }
          },
          "confidence": {
            "enum": [
              "high",
              "medium",
              "low"
            ],
            "type": "string"
          },
          "link_check": {
            "type": [
              "object",
              "null"
            ]
          },
          "quote_note": {
            "type": [
              "string",
              "null"
            ]
          },
          "report_url": {
            "type": [
              "string",
              "null"
            ]
          },
          "attribution": {
            "type": "string"
          },
          "source_type": {
            "enum": [
              "primary",
              "secondary",
              "whirrwork"
            ],
            "type": "string"
          },
          "verification": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_verified": {
            "type": "string"
          }
        }
      }
    },
    "topic": {
      "type": [
        "string",
        "null"
      ]
    },
    "total": {
      "type": "integer"
    },
    "topics": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "license": {
      "type": "string"
    },
    "release": {
      "type": "string"
    },
    "attribution": {
      "type": "string"
    },
    "standards_url": {
      "type": "string"
    }
  }
}
search_stats annotations
{
  "title": "Search citable robot statistics",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_stat — Get one statistic with citations
Advertised by the server during the last successful anonymous check.
Advertised read-only

One Whirrwork Research statistic by slug: claim, figure, scope, measure type, primary source with archive link, publication/access/last-verified dates, verbatim source passage (when licensing allows), confidence, caveats, and citations in APA, Chicago, MLA and BibTeX (plus an APA citation of the original source). Licensed CC BY 4.0: attribute "Whirrwork (https://whirrwork.com), CC BY 4.0" and the original source.

get_stat input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "examples": [
        "industrial-robot-installations-world-2025",
        "robot-density-korea-2024"
      ]
    }
  },
  "additionalProperties": false
}
get_stat output schema
{
  "type": "object",
  "required": [
    "slug",
    "url",
    "claim",
    "figure",
    "confidence",
    "source"
  ],
  "properties": {
    "url": {
      "type": "string",
      "description": "Permanent Whirrwork page for this statistic"
    },
    "slug": {
      "type": "string"
    },
    "claim": {
      "type": "string",
      "description": "One-sentence claim (English)"
    },
    "quote": {
      "type": [
        "object",
        "null"
      ],
      "properties": {
        "lang": {
          "type": "string"
        },
        "text": {
          "type": "string"
        }
      }
    },
    "scope": {
      "type": "object",
      "properties": {
        "period": {
          "type": "string"
        },
        "geography": {
          "type": "string"
        }
      }
    },
    "stale": {
      "type": "boolean",
      "description": "true = not re-verified for more than 180 days"
    },
    "topic": {
      "type": "string"
    },
    "figure": {
      "type": "object",
      "required": [
        "display"
      ],
      "properties": {
        "unit": {
          "type": "string"
        },
        "value": {
          "type": [
            "number",
            "null"
          ]
        },
        "display": {
          "type": "string"
        }
      }
    },
    "source": {
      "type": "object",
      "required": [
        "type",
        "name",
        "title",
        "url"
      ],
      "properties": {
        "url": {
          "type": "string"
        },
        "kind": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "type": {
          "enum": [
            "primary",
            "secondary",
            "whirrwork"
          ],
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "date_note": {
          "type": [
            "string",
            "null"
          ]
        },
        "published": {
          "type": [
            "string",
            "null"
          ],
          "description": "Publication date stated by the source (null = not stated; see date_note)"
        },
        "publisher": {
          "type": [
            "string",
            "null"
          ]
        },
        "archive_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "Wayback Machine copy"
        },
        "archived_at": {
          "type": [
            "string",
            "null"
          ]
        },
        "primary_note": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "caveats": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "license": {
      "type": "string"
    },
    "measure": {
      "type": "string",
      "description": "How the figure was produced: official statistic, company claim, list price, survey, estimate, forecast..."
    },
    "release": {
      "type": [
        "string",
        "null"
      ]
    },
    "accessed": {
      "type": "string"
    },
    "citations": {
      "type": "object",
      "properties": {
        "apa": {
          "type": "string"
        },
        "mla": {
          "type": "string"
        },
        "bibtex": {
          "type": "string"
        },
        "chicago": {
          "type": "string"
        },
        "source_apa": {
          "type": "string"
        }
      }
    },
    "confidence": {
      "enum": [
        "high",
        "medium",
        "low"
      ],
      "type": "string"
    },
    "link_check": {
      "type": [
        "object",
        "null"
      ]
    },
    "quote_note": {
      "type": [
        "string",
        "null"
      ]
    },
    "report_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "attribution": {
      "type": "string"
    },
    "source_type": {
      "enum": [
        "primary",
        "secondary",
        "whirrwork"
      ],
      "type": "string"
    },
    "verification": {
      "type": [
        "string",
        "null"
      ]
    },
    "last_verified": {
      "type": "string"
    }
  }
}
get_stat annotations
{
  "title": "Get one statistic with citations",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

3 advertised

find_and_quote — Find suppliers and request quotes

Advertised by the server during the last successful anonymous check.

End-to-end: identify the job, check prices, shortlist providers for a location, collect RFQ fields, submit with consent.

job
What the buyer needs (required)
location
Country / city (required)
evaluate_robot_vs_human — Robot or not?

Advertised by the server during the last successful anonymous check.

Honest assessment of whether a robot makes sense for this job, using buyer tips and prices.

job
No description (required)
price_check — Is this quote reasonable?

Advertised by the server during the last successful anonymous check.

Compare a quote the buyer received against sourced benchmarks and price history.

job
No description (required)
quote
e.g. "BRL 120 per hectare" (required)
country
No description

Resources

4 advertised

categories — Categories and use-case ids

Advertised by the server during the last successful anonymous check.

All categories with their use case ids and names

categories URI
whirrwork://categories

MIME type: application/json

countries — Coverage by country

Advertised by the server during the last successful anonymous check.

countries URI
whirrwork://countries

MIME type: application/json

license — Data license (CC BY 4.0)

Advertised by the server during the last successful anonymous check.

license URI
whirrwork://license

MIME type: text/plain

agent-guide — How to use Whirrwork as an agent

Advertised by the server during the last successful anonymous check.

agent-guide URI
whirrwork://guide/agents

MIME type: text/markdown

use-case — Robot job

Advertised by the server during the last successful anonymous check.

Full use case JSON (prices, checklist, providers)

use-case URI template
whirrwork://use-case/{id}

MIME type: application/json

provider — Provider

Advertised by the server during the last successful anonymous check.

Provider JSON

provider URI template
whirrwork://provider/{id}

MIME type: application/json

price-history — Price history for a job

Advertised by the server during the last successful anonymous check.

Append-only observations + series

price-history URI template
whirrwork://price-history/{use_case_id}

MIME type: application/json

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
366 ms
95th percentile latency
366 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 366 ms · metadata changed · 23 tool(s), 4 resource(s), 3 resource template(s), 3 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http whirrwork-mcp https://whirrwork.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add whirrwork-mcp --url https://whirrwork.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable whirrwork-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "whirrwork-mcp": {
      "url": "https://whirrwork.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "whirrwork-mcp": {
      "type": "streamableHttp",
      "url": "https://whirrwork.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start whirrwork-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "whirrwork-mcp": {
      "type": "http",
      "url": "https://whirrwork.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http whirrwork-mcp https://whirrwork.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "whirrwork-mcp": {
      "url": "https://whirrwork.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "whirrwork-mcp": {
      "serverUrl": "https://whirrwork.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Whirrwork MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Whirrwork MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing