Skip to content

Whirrwork

com.whirrwork/whirrworkwhirrwork.comstreamable-httpv1.3.0Scanned

Robot jobs, sourced prices with history, providers by country, robot-vs-human costs, and RFQs.

16 tools: 2 change things and 14 only read.

Tools: 0 delete, 0 irreversible, 2 write, 14 read.
  • Reads private data · 4
  • Reads text others write · 3
  • Can send data out · 0
  • No findings

Anlyon alternative

2 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

16 tools

Changes things 2Claude Code: ask
  • estimate_costArithmetic on published prices: unit price × quantity, using exact unit conversions (acre↔hectare, sq ft↔m², mile↔km), preferring benchmarks whose region matches the country, conve…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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"}.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Estimate cost
  • submit_rfqSubmit a request for quotes for a real buyer who explicitly agreed to be contacted by matched suppliers (consent=true).Reads text others writeNo findings

    Why it is in this group

    • The name "submit_rfq" says "submit": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
    • title: Submit RFQ
Only reads 14Show 14 read-only tools
  • compare_providersSide-by-side comparison of 2-10 providers: coverage for a country, engagement models, published prices (USD-normalized), HQ, contact routes, shared jobs, last checked.Reads private dataNo findings

    Why it is in this group

    • The name "compare_providers" says "compare": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Compare providers
  • compare_robot_vs_humanCost 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, D…No findings

    Why it is in this group

    • The name "compare_robot_vs_human" says "compare": a word for reading.
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Robot or human?
  • find_providersShortlist providers for a job and place.No findings

    Why it is in this group

    • The name "find_providers" says "find": a word for reading.
    Description, as the server wrote it
    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"}.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Find providers
  • get_price_historyEvery 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…No findings

    Why it is in this group

    • The name "get_price_history" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Get price history
  • get_pricesCurrent sourced prices for a job (benchmarks + provider-published), or for one provider.No findings

    Why it is in this group

    • The name "get_prices" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Get current prices
  • get_providerFull public profile of one provider: website, HQ, service regions and explicit service areas (with sources), jobs, robot types, engagement models, published prices (with USD), cont…Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "get_provider" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe description's first sentence says "website": it reads web pages, which anyone can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Get a provider
  • get_rfq_statusStatus of a submitted RFQ (received → matched → sent_to_suppliers → quoted → closed) with its status history.No findings

    Why it is in this group

    • The name "get_rfq_status" says "get": a word for reading.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Check RFQ status
  • get_rfq_templateThe 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}), reg…Reads private dataNo findings

    Why it is in this group

    • The name "get_rfq_template" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "note": it reads notes.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Get RFQ template
  • get_statOne Whirrwork Research statistic by slug: claim, figure, scope, measure type, primary source with archive link, publication/access/last-verified dates, verbatim source passage (whe…No findings

    Why it is in this group

    • The name "get_stat" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Get one statistic with citations
  • get_use_caseEverything 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 sourc…Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "get_use_case" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "note": it reads notes.
    • untrusted-inputThe description's first sentence says "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Get a robot job
  • list_categoriesThe 20 job categories with use-case counts, for browsing when the buyer is vague.No findings

    Why it is in this group

    • The name "list_categories" says "list": a word for reading.
    Description, as the server wrote it
    The 20 job categories with use-case counts, for browsing when the buyer is vague.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: List categories
  • list_countriesFor 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 provid…No findings

    Why it is in this group

    • The name "list_countries" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Coverage by country
  • search_statsSearch Whirrwork Research: 100+ citable statistics on robot adoption, industrial and service robots, humanoids, drones, agriculture, cleaning, warehouses, labour shortages, wages, …No findings

    Why it is in this group

    • The name "search_stats" says "search": a word for reading.
    Description, as the server wrote it
    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".

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Search citable robot statistics
  • search_use_casesFind the robot job (use case) that matches what the buyer wants, in plain words and in any of 12 languages.No findings

    Why it is in this group

    • The name "search_use_cases" says "search": a word for reading.
    Description, as the server wrote it
    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", "无人机灯光秀".

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Search robot jobs

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads private data4
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write3
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

No check matched anything in these tool definitions. That is not a safety guarantee.

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.3.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http whirrwork https://whirrwork.com/mcp
claude mcp add --transport http whirrwork https://whirrwork.com/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__whirrwork__search_use_cases",
      "mcp__whirrwork__get_use_case",
      "mcp__whirrwork__list_categories",
      "mcp__whirrwork__find_providers",
      "mcp__whirrwork__get_provider",
      "mcp__whirrwork__compare_providers",
      "mcp__whirrwork__get_prices",
      "mcp__whirrwork__get_price_history",
      "mcp__whirrwork__compare_robot_vs_human",
      "mcp__whirrwork__list_countries",
      "mcp__whirrwork__get_rfq_template",
      "mcp__whirrwork__get_rfq_status",
      "mcp__whirrwork__search_stats",
      "mcp__whirrwork__get_stat"
    ],
    "ask": [
      "mcp__whirrwork__estimate_cost",
      "mcp__whirrwork__submit_rfq"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as whirrwork. Review it before you use it.

Capability tags behind 5 rules
  • mcp__whirrwork__get_use_case private-data, untrusted-input
  • mcp__whirrwork__get_provider private-data, untrusted-input
  • mcp__whirrwork__compare_providers private-data
  • mcp__whirrwork__get_rfq_template private-data
  • mcp__whirrwork__submit_rfq untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/com.whirrwork/whirrwork/verify?hash=8a9bd5c7503f00f0ea6b9ff051471923e62307189be60e8a077417ff00f37ec4" | jq -e '.changed == false'

Pinned hash 8a9bd5c7503f, from Oct 25, 2026, 18:27 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/com.whirrwork/whirrwork/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for com.whirrwork/whirrwork
[![anlyon.dev](https://anlyon.dev/badge/com.whirrwork/whirrwork.svg)](https://anlyon.dev/servers/com.whirrwork/whirrwork)

Source: MCP Registry. Synced Oct 25, 2026, 18:27 UTC.