Whirrwork
REMOTE · WHIRRWORK.COM
Robot jobs, sourced prices with history, providers by country, robot-vs-human costs, and RFQs.
Available components
Last scanned (5 hours ago)
Scores higher than 64% of remote servers
Reachable. Last reached 5 Nov 2026.
Category IoT and Hardware
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security80
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability56
- 57% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Partial
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 5621 tokens (~208/item across 27 items; 23 tools + 4 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management37
- Stability observed for 11 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage91
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 68% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 23 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 25 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Schema quality: 189 → 208 ▼ functional
- 3 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Oct 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Schema quality: 157 → 189 ▼ functional
- Tool coverage: 60% → 68% ▲ functional
- Server version: 1.4.0 → 1.8.0 functional
- New tool “buy_rent_or_hire” functional
- New tool “compare_robot_models” functional
- New tool “estimate_drone_show_cost” functional
- New tool “estimate_drone_spraying_cost” functional
- New tool “find_robots_for_job” functional
- New tool “get_robot_model” functional
- New tool “robot_or_ladder” functional
- 26 Oct 26 +1
- Stability: unverified → 0.03 ▲ functional
- Server version: 1.3.0 → 1.4.0 functional
- 25 Oct 26 69
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://whirrwork.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=whirrwork.com | CN=WE1,O=Google Trust Services,C=US | 25 Oct 2026 | 23 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 6c70006e169a57720eea25451f2e88f1 |
| SANs: whirrwork.com, www.whirrwork.com, *.www.whirrwork.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of whirrwork.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| whirrwork.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000 |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | geolocation=(), camera=(), microphone=() |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://whirrwork.com/mcp | Verified | 200 | |
| http (plaintext) | http://whirrwork.com/mcp | HTTPS enforced | 301 | https://whirrwork.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
buy_rent_or_hire Buy, rent or hire a robot service? ~545
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| buy | number | – | Purchase price (overrides the receipt) |
| buy_receipt | integer|string | – | Receipt index from receipts_available, or "none" to leave this option out |
| currency | string | – | Currency of your own numbers (ISO 4217) |
| end | string | – | Which end of each published range to use (default low) |
| hours | number | – | Staff hours per month to run it (buy and rent) |
| job | string | – | Job (use case) id; omit to list jobs that have tagged receipts |
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| months | integer | – | Period in months (default 36) |
| qty | number | – | Service amount per month in the service receipt's unit (hectares, sq ft, visits...) |
| rent | number | – | Rent / RaaS per month (overrides the receipt) |
| rent_receipt | integer|string | – | Receipt index from receipts_available, or "none" to leave this option out |
| resale | number | – | Resale value at the end when bought |
| service | number | – | Service price per unit (overrides the receipt) |
| service_receipt | integer|string | – | Receipt index from receipts_available, or "none" to leave this option out |
| setup | number | – | One-off setup fee when renting |
| upkeep | number | – | Upkeep per month when bought |
| wage | number | – | Wage per staff hour |
| Name | Type | Req | Description |
|---|---|---|---|
| break_even_months | object|null | – | – |
| cheapest | string|null | – | – |
| currency | string|null | – | – |
| formula | string | yes | – |
| input | object | – | – |
| issues | array | – | – |
| job | object|null | – | – |
| jobs_with_receipts | array | – | – |
| label | string | – | – |
| language | string | – | – |
| method | string | – | – |
| months | integer | – | – |
| options | object | – | buy / rent / service: totals, per month, source (receipt | yours) and the receipt used |
| ranked | array | – | – |
| receipts_available | object|null | – | – |
| receipts_reviewed | string|object|null | – | – |
| tool | string | yes | – |
| url | string | yes | – |
| version | string | – | – |
| warnings | array | – | – |
| within_10_percent | boolean|null | – | – |
No examples provided.
compare_providers Compare providers ~96
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.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| ids | array | yes | – |
| use_case | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| country | string|null | – | – |
| matrix | object | – | attribute -> provider id -> value |
| note | string | – | – |
| providers | array | yes | – |
| shared_use_cases | array | – | – |
| use_case | string|null | – | – |
No examples provided.
compare_robot_models Compare robot models ~87
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"]}
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| models | array | yes | – |
| note | string | – | – |
| rows | array | yes | – |
| type | object | yes | – |
| url | string | – | – |
No examples provided.
compare_robot_vs_human Robot or human? Compare the cost ~476
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}.
| Name | Type | Req | Description |
|---|---|---|---|
| baseline | string | – | Which human option to compare against (e.g. "human" or "service"). Defaults to the job default. |
| country | string | – | Country for wage, on-cost and currency defaults (sourced: BLS, ILOSTAT, MHLW, NBS, Eurostat). |
| include_projections | boolean | – | Include 2026-2035 projections for three scenarios and the crossover year range. |
| include_tornado | boolean | – | Include the sensitivity (tornado) ranking of inputs by NPV swing. |
| inputs | object | – | Optional overrides of default inputs, in the country currency. Fractions as 0-1 (uptime 0.85, rate 0.08). |
| job | string | yes | Job slug. One of the 22 jobs in GET /api/v1/robot-vs-human/jobs. |
| region | string | – | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| baseline | string|null | – | – |
| best_robot | string|null | – | – |
| calculator_url | string | – | – |
| country | string | yes | – |
| crossover | object | – | – |
| currency | string | yes | – |
| input_sources | object | yes | Per input: status (sourced | derived | converted | assumption | user), source_id, source_url, note |
| inputs | object | – | Resolved inputs actually used (defaults + overrides), in the country currency; fractions 0-1 |
| job | object | yes | – |
| label | string | yes | Always "Whirrwork modelled estimates, not facts" |
| license | string | – | – |
| methodology_url | string | – | – |
| model_version | string | yes | – |
| noncost | object | – | – |
| options | array | yes | – |
| projections | object | – | Per scenario (slow, base, fast): yearly cost per unit 2026-2035, constant 2026 money |
| region | string|null | – | – |
| sensitivity | object | – | – |
| verdict | object | yes | – |
| wage_basis | string|null | – | – |
No examples provided.
estimate_cost Estimate a job cost from sourced benchmarks ~255
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"}.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| currency | string | – | Express the result in this ISO 4217 currency |
| quantity | number | – | How many units (hectares, shows, months, inspections…). Omit for a per-unit price. |
| unit | string | – | Unit of quantity, e.g. "hectare", "acre", "show", "month", "sq ft". Omit to use the most common benchmark unit. |
| use_case | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| available_units | array | – | – |
| basis | array | – | – |
| country | string|null | – | – |
| currency | string|null | – | – |
| estimate | object|null | yes | null = no sourced benchmark fits; never guessed |
| fx_date | string|null | – | – |
| fx_source | string | – | – |
| method | string | – | – |
| notes | array | – | – |
| quantity | number|null | – | – |
| reason | string | – | – |
| unit | string|null | – | – |
| use_case | string | – | – |
| use_case_id | string | yes | – |
No examples provided.
estimate_drone_show_cost Drone light show cost ~314
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"}.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country, ISO 3166-1 alpha-2 |
| currency | string | – | Currency of quote (ISO 4217) |
| drones | integer | – | Number of drones in the show |
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| peak | boolean | – | Peak date (e.g. July 4th, New Year's Eve): include peak-date prices |
| quote | number | – | Total price the buyer was quoted, to check against published prices |
| Name | Type | Req | Description |
|---|---|---|---|
| countries_with_prices | array | – | – |
| country | string|null | – | – |
| drones | integer|null | – | – |
| formula | string | yes | – |
| input | object | – | – |
| job | object | – | – |
| label | string | – | – |
| language | string | – | – |
| method | string | – | – |
| nearest_published_shows | array | – | – |
| peak | boolean | – | – |
| prices | array | yes | – |
| receipts_for_your_country | integer|null | – | – |
| same_country_span | object|null | – | – |
| selected | object|null | – | Best-matching per-drone price applied to your drone count (null when none applies) |
| too_few_receipts | boolean|null | – | – |
| tool | string | yes | – |
| url | string | yes | – |
| version | string | – | – |
| your_quote | object|null | – | – |
No examples provided.
estimate_drone_spraying_cost Drone spraying cost for a field ~395
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"}.
| Name | Type | Req | Description |
|---|---|---|---|
| area | number | – | Field area in the chosen unit |
| country | string | – | Buyer country, ISO 3166-1 alpha-2 |
| currency | string | – | Currency of own_rate (ISO 4217) |
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| own_rate | number | – | A rate the buyer was quoted, per chosen unit, to compare |
| passes | integer | – | Number of spray passes (default 1) |
| rate_index | integer | – | Use this published rate (index from rates[].index) as the headline instead of the automatic pick |
| unit | string | – | Area unit (default: the unit of the best-matching rate) |
| Name | Type | Req | Description |
|---|---|---|---|
| area | number|null | – | – |
| countries_with_rates | array | – | – |
| country_has_rates | boolean | – | – |
| formula | string | yes | – |
| hectare_in_acres | number | – | – |
| hourly_rates_not_converted | array | – | – |
| input | object | – | – |
| job | object | – | – |
| label | string | – | – |
| language | string | – | – |
| method | string | – | – |
| passes | integer | – | – |
| rates | array | yes | – |
| same_country_span | object|null | – | – |
| selected | object|null | – | Best-matching published rate for the country (null when none applies) |
| tool | string | yes | – |
| unit | string | – | – |
| url | string | yes | – |
| version | string | – | – |
| your_rate | object|null | – | – |
No examples provided.
find_providers Find providers ~410
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"}.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| engagement_model | string | – | – |
| has_contact | boolean | – | Only providers with a public email, phone or quote form |
| has_pricing | boolean | – | Only providers that publish prices |
| hq_country | string | – | Only providers headquartered in this country |
| include_global | boolean | – | Include providers that only say "worldwide" when a country is given |
| limit | integer | – | – |
| max_price_usd | number | – | Only providers whose lowest published price (converted to USD) is at or below this. Excludes providers without published prices. |
| near | string | – | "me" = the country Cloudflare sees for this request (never stored), or a country name/code. Coordinates are not supported. |
| offset | integer | – | – |
| query | string | – | Keyword filter on name/description |
| region | string | – | Sub-country region code or name, e.g. "US-CA", "ON", "Mendoza" |
| robot_type | string | – | Substring match on robot types, e.g. "drone", "AMR", "humanoid" |
| sort | string | – | – |
| use_case | string | – | Use case id (recommended) |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| country | string|null | – | – |
| near_source | string | – | – |
| next_offset | integer|null | – | – |
| note | string | – | – |
| providers | array | yes | – |
| ranking | string | – | – |
| region | string|null | – | – |
| use_case | string|null | – | – |
No examples provided.
find_robots_for_job Find robot types and models for a job ~114
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"}
| Name | Type | Req | Description |
|---|---|---|---|
| job | string | yes | Job (use case) id from search_use_cases |
| Name | Type | Req | Description |
|---|---|---|---|
| job | object | yes | – |
| methodology_url | string | – | – |
| model_count | integer | – | – |
| note | string | – | – |
| types | array | yes | – |
No examples provided.
get_price_history Get price history ~133
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | – |
| provider | string | – | – |
| series | string | – | A series_key to follow one price over time |
| since | string | – | YYYY-MM-DD; only observations recorded on/after this date |
| use_case | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| license | string | – | – |
| note | string | – | – |
| observations | array | yes | – |
| pagination | object | – | – |
| series | array | yes | – |
| source | string | – | – |
| source_rechecks | object|null | – | – |
| total | integer | yes | – |
| tracking_since | string|null | – | – |
No examples provided.
get_prices Get current prices ~134
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.
| Name | Type | Req | Description |
|---|---|---|---|
| convert | string | – | Convert to this ISO 4217 currency (dated ECB reference rate) |
| currency | string | – | Only rows quoted in this ISO 4217 currency |
| include_providers | boolean | – | – |
| limit | integer | – | – |
| provider | string | – | – |
| use_case | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | – |
| fx_date | string|null | – | – |
| license | string | – | – |
| note | string | – | – |
| prices | array | yes | – |
| summary | object|null | – | – |
No examples provided.
get_provider Get a provider ~89
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.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| id | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| contact | object|null | – | – |
| contact_routes | object | – | – |
| coverage | string|null | – | How this provider relates to the requested place (serves region / country / part / HQ only / worldwide) |
| coverage_reason | string|null | – | – |
| description | string | – | – |
| engagement_models | array | – | – |
| has_published_pricing | boolean | – | – |
| hq_country | string|null | – | – |
| id | string | yes | – |
| last_checked | string|null | – | – |
| min_published_price_usd | number|null | – | – |
| name | string | yes | – |
| pricing | array | – | – |
| published_price_count | integer | – | – |
| robot_types | array | – | – |
| service_areas | array | – | – |
| service_regions | array | – | – |
| source_urls | array | – | – |
| url | string | yes | Whirrwork profile page |
| use_case_ids | array | – | – |
| website | string|null | – | – |
No examples provided.
get_rfq_status Check an RFQ ~70
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).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
| key | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| country | string|null | – | – |
| created_at | string | – | – |
| id | string | yes | – |
| matched_provider_count | integer | – | – |
| status | string | yes | – |
| status_history | array | – | – |
| updated_at | string|null | – | – |
| use_case_id | string|null | – | – |
No examples provided.
get_rfq_template Get the RFQ template for a job ~98
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.
| Name | Type | Req | Description |
|---|---|---|---|
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| use_case | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| buyer_tips | array | – | – |
| engagement_models | array | – | – |
| example | object | – | – |
| fields | array | yes | – |
| notes | array | – | – |
| regulatory_notes | string|null | – | – |
| submit | object | – | – |
| supplier_checklist | array | – | – |
| supplier_checklist_localized | array | – | – |
| use_case | string | – | – |
| use_case_id | string | yes | – |
No examples provided.
get_robot_model Get a robot model ~111
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.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Model id from find_robots_for_job or /api/v1/robot-models |
| Name | Type | Req | Description |
|---|---|---|---|
| assessment | object | yes | – |
| evidence | array | yes | – |
| id | string | yes | – |
| jobs | array | – | – |
| list_price | object|null | – | Maker-published list price with source (not a quote) |
| maker | string | – | – |
| maker_claims | array | – | – |
| name | string | yes | – |
| note | string|null | – | – |
| official_url | string | – | – |
| provider_id | string|null | – | – |
| spec_url | string|null | – | – |
| specs | array | yes | – |
| specs_note | string | – | – |
| status | string | – | – |
| summary | string | – | – |
| type_ids | array | – | – |
| types | array | – | – |
| url | string | – | – |
No examples provided.
get_stat Get one statistic with citations ~116
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.
| Name | Type | Req | Description |
|---|---|---|---|
| slug | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| accessed | string | – | – |
| attribution | string | – | – |
| caveats | array | – | – |
| citations | object | – | – |
| claim | string | yes | One-sentence claim (English) |
| confidence | string | yes | – |
| figure | object | yes | – |
| last_verified | string | – | – |
| license | string | – | – |
| link_check | object|null | – | – |
| measure | string | – | How the figure was produced: official statistic, company claim, list price, survey, estimate, forecast... |
| quote | object|null | – | – |
| quote_note | string|null | – | – |
| release | string|null | – | – |
| report_url | string|null | – | – |
| scope | object | – | – |
| slug | string | yes | – |
| source | object | yes | – |
| source_type | string | – | – |
| stale | boolean | – | true = not re-verified for more than 180 days |
| topic | string | – | – |
| url | string | yes | Permanent Whirrwork page for this statistic |
| verification | string|null | – | – |
No examples provided.
get_use_case Get a robot job ~189
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.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| id | string | yes | Use case id from search_use_cases |
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| region | string | – | Optional sub-country region (e.g. "US-CA", "California", "Mendoza") |
| Name | Type | Req | Description |
|---|---|---|---|
| buyer_phrases | array | – | – |
| buyer_tips | array | – | – |
| category | string|null | – | – |
| category_id | string | – | – |
| country | string|null | – | – |
| description | string | – | – |
| engagement_models | array | – | – |
| geo_url | string|null | – | – |
| id | string | yes | – |
| language | string | – | – |
| machine_translated | boolean | – | – |
| name | string | yes | – |
| name_en | string | – | – |
| price_benchmarks | array | yes | – |
| price_history | object|null | – | – |
| price_summary | object|null | – | – |
| providers | array | yes | – |
| region | string|null | – | – |
| regulatory_notes | string|null | – | – |
| rfq_template_url | string | – | – |
| rfq_url | string | – | – |
| robot_types | array | – | – |
| url | string | yes | – |
| what_to_specify_in_rfq | array | – | – |
No examples provided.
list_categories List categories ~49
The 20 job categories with use-case counts, for browsing when the buyer is vague.
| Name | Type | Req | Description |
|---|---|---|---|
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| Name | Type | Req | Description |
|---|---|---|---|
| categories | array | yes | – |
No examples provided.
list_countries Coverage by country ~70
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.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Optional: just this country |
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | – | – |
| countries | array | – | – |
| global_providers | integer | yes | – |
| name | string | – | – |
| providers_hq | integer | – | – |
| providers_serving | integer | – | – |
| providers_serving_part | integer | – | – |
| sub_regions | array | – | – |
| url | string | – | – |
No examples provided.
robot_or_ladder Robot or ladder? (the Ladder Test) ~342
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"}.
| Name | Type | Req | Description |
|---|---|---|---|
| data | string | – | – |
| hands | string | – | – |
| job | string | – | Optional job (use case) id from search_use_cases, to add its sourced price and provider counts |
| ladder | string | – | – |
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| repeat | string | – | – |
| risk | string | – | – |
| scale | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| answered | integer | – | – |
| answers | object | – | – |
| buy_hint | string|null | – | – |
| explanation | string|null | – | – |
| find_out | array | – | – |
| guide | string | – | – |
| headline | string | – | – |
| job | object|null | – | – |
| label | string | – | Rule-based verdict, not a measurement or a cost estimate |
| language | string | – | – |
| method | string | – | – |
| of | integer | – | – |
| person_points | integer | – | – |
| questions | array | – | – |
| reasons | array | yes | – |
| robot_points | integer | – | – |
| rules | object|array|string | – | – |
| tool | string | yes | – |
| url | string | yes | – |
| verdict | string | yes | – |
| version | string | – | – |
No examples provided.
search_stats Search citable robot statistics ~242
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".
| Name | Type | Req | Description |
|---|---|---|---|
| confidence | string | – | – |
| limit | integer | – | – |
| query | string | – | Keywords (English). Omit to list by topic. |
| source_type | string | – | – |
| topic | string | – | Optional topic filter |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | string | – | – |
| count | integer | yes | – |
| license | string | – | – |
| note | string | – | – |
| query | string|null | – | – |
| release | string | – | – |
| standards_url | string | – | – |
| stats | array | yes | – |
| topic | string|null | – | – |
| topics | array | – | – |
| total | integer | – | – |
No examples provided.
search_use_cases Search robot jobs ~180
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", "无人机灯光秀".
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | – | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| language | string | – | Language for use-case text (machine-translated; English is authoritative). Default en. |
| limit | integer | – | – |
| query | string | yes | What the buyer needs done, in their words |
| Name | Type | Req | Description |
|---|---|---|---|
| country | string|null | – | – |
| detected_language | string|null | – | – |
| guides | array | – | – |
| language | string | – | – |
| match_quality | string | – | – |
| next | string | yes | – |
| providers | array | yes | – |
| query | string | yes | – |
| use_cases | array | yes | – |
No examples provided.
submit_rfq Submit a request for quotes ~343
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.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_name | string | – | Your agent/product name |
| budget_currency | string | – | ISO 4217 |
| budget_max | number | – | – |
| budget_min | number | – | – |
| consent | boolean | yes | Must be true: the buyer agreed to share the request (incl. email) with matched suppliers |
| contact_company | string | – | – |
| contact_email | string | yes | – |
| contact_name | string | – | – |
| contact_phone | string | – | Optional phone/WhatsApp/WeChat, international format |
| country | string | yes | Buyer country: ISO 3166-1 alpha-2 ("AE") or English name ("United Arab Emirates"). |
| date_end | string | – | – |
| date_flexible | boolean | – | – |
| date_start | string | – | – |
| details | string | – | – |
| extra | object | – | Answers to the job checklist, keyed as in get_rfq_template |
| job | string | yes | One sentence: what, where, how big |
| location | string | – | City / site |
| provider_hint | string | – | Optional provider id the buyer prefers |
| test | boolean | – | Mark as a test (excluded from stats, deleted) |
| use_case_id | string | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| access_key | string | – | – |
| id | string | yes | – |
| is_test | boolean | – | – |
| matched_provider_ids | array | – | – |
| message | string | – | – |
| status | string | yes | – |
| status_url | string | – | – |
No examples provided.
How do I install the Whirrwork MCP server?
Whirrwork is a hosted endpoint at https://whirrwork.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · whirrwork.com
claude mcp add --transport http com-whirrwork-whirrwork 'https://whirrwork.com/mcp'
What is the Whirrwork MCP server?
Whirrwork is an MCP server listed in the public MCP registry as com.whirrwork/whirrwork. Robot jobs, sourced prices with history, providers by country, robot-vs-human costs, and RFQs. This page covers its hosted endpoint (https://whirrwork.com/mcp).
Is the Whirrwork MCP server safe to use?
Whirrwork scores 75 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Whirrwork MCP server expose?
Whirrwork exposes 23 tools: search_use_cases, get_use_case, list_categories, find_providers, get_provider, and 18 more. Their descriptions and schemas cost roughly 4,858 tokens of context every time the server is loaded.
Does the Whirrwork MCP server require authentication?
No. We connected to Whirrwork without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Whirrwork MCP server still maintained?
Whirrwork is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.