Skip to main content
Glama

Developer Utilities & Validators (Tanod)

utilpeek: cheapest GPU per hour on AWS, Azure, Google Cloud and Akash, on-demand, spot and marketplace bids, by chip, memory and region

get_gpu_prices
Read-onlyIdempotent

utilpeek: GPU prices: cheapest H100, A100, L4 per GPU-hour on AWS, Azure, Google Cloud, Akash. Returns cheapest GPU prices per GPU-hour on AWS, Azure and Google Cloud (list prices) and Akash (marketplace bids with GPUs free), by chip, memory, minimum GPUs per cloud machine, region and price ceiling; returns USD per machine-hour or null for unknown shape and an unknown-shape exclusion count; optionally rent-or-buy break-even. Input: all optional: chip, min_gpu_mem_gb, min_gpus_per_machine, provider, regions, pricing, max_usd_per_gpu_hour, limit, rent_vs_buy. List prices from a snapshot refreshed twice a day, excluding tax, egress and storage; spot changes often. A snapshot over 36 hours old is a 503 (not charged). Typically under 0.1 s. Price: USD 0.002. Free: 10 utilpeek calls per IP per UTC day. Docs: https://tanod.dev/learn/cloud-gpu-price-api.html

Input Schema

NameRequiredDescriptionDefault
chipNoGPU chip, any case, e.g. H100 or A100 80GB.
limitNoRows to return, 1-100.
pricingNoPrice to rank by; any is the lower of the two and also includes Akash marketplace rows (ranked by median bid); on_demand and spot are cloud list prices only.any
regionsNoRegion names, e.g. us-east-1.
providerNoAWS, Azure, Google Cloud or Akash (marketplace bids, with GPUs free).
rent_vs_buyNoRent-or-buy break-even against the cheapest matching row: monthly cloud cost, monthly ownership cost, break-even month and totals. When min_gpus_per_machine is set and rent_vs_buy.gpus is omitted, compares all GPUs of that machine; an explicit gpus overrides it. Same price.
min_gpu_mem_gbNoMinimum GPU memory in GB.
max_usd_per_gpu_hourNoCeiling on the ranked price, USD.
min_gpus_per_machineNoMinimum GPUs in one cloud machine (1-16). Excludes rows without a known machine shape, including Akash marketplace inventory; count_excluded_unknown_machine_shape reports otherwise-matching rows excluded.

Output Schema

NameRequiredDescriptionDefault
noteNo
rowsNo
errorNoOnly on an error result: an object {code, message}, or the reason string of an x402 PaymentRequired object.
pricingNo
sourcesNo
rent_vs_buyNoOnly with the rent_vs_buy input: break-even against the cheapest matching row; null when no row matches (see rent_vs_buy_unavailable).
generated_atNo
count_matchedNo
count_returnedNo
rent_vs_buy_unavailableNo
count_excluded_unknown_machine_shapeNoOtherwise-matching priced rows excluded because min_gpus_per_machine is set and their machine shape is unknown (including Akash inventory). Before limit; zero without the filter. Only rows available from the snapshot and best-effort Akash read are counted.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / rows / items / properties / basis / description
      Previous value: -"instance_share: price per GPU including a share of vCPU and memory"New value: +"instance_share: GPU share of machine price; spot: AWS Linux spot instance / GPUs; marketplace_bid: Akash bid"
  2. Changed6 schema fields changed
    • changedInput schema / $defs / RentVsBuy / properties / gpus / description
      Previous value: -"Number of GPUs bought and rented."New value: +"Number of GPUs bought and rented. Defaults to 1, or to the cheapest matching machine's GPU count when min_gpus_per_machine is set; an explicit value overrides that default."
    • addedInput schema / properties / min_gpus_per_machine
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 16,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Minimum GPUs in one cloud machine (1-16). Excludes rows without a known machine shape, including Akash marketplace inventory; count_excluded_unknown_machine_shape reports otherwise-matching rows excluded.",
      +  "title": "Min Gpus Per Machine"
      +}
    • changedInput schema / properties / rent_vs_buy / description
      Previous value: -"Rent-or-buy break-even against the cheapest matching row: monthly cloud cost, monthly ownership cost, break-even month and totals. Same price."New value: +"Rent-or-buy break-even against the cheapest matching row: monthly cloud cost, monthly ownership cost, break-even month and totals. When min_gpus_per_machine is set and rent_vs_buy.gpus is omitted, compares all GPUs of that machine; an explicit gpus overrides it. Same price."
    • addedOutput schema / properties / count_excluded_unknown_machine_shape
      Added value: +{
      +  "description": "Otherwise-matching priced rows excluded because min_gpus_per_machine is set and their machine shape is unknown (including Akash inventory). Before limit; zero without the filter. Only rows available from the snapshot and best-effort Akash read are counted.",
      +  "minimum": 0,
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / gpus / description
      Added value: +"GPUs per cloud machine when known; Akash rows: total marketplace inventory, not a machine size."
    • addedOutput schema / properties / rows / items / properties / usd_per_machine_hour
      Added value: +{
      +  "description": "Selected per-GPU rate times GPUs in the cloud machine, rounded to 4 decimal places (USD per machine-hour). Snapshot per-GPU rates are already rounded to 4 decimals, so this can differ slightly from the provider's instance price due to rounding. Null for unknown machine shape, including Akash inventory.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  3. Changed10 schema fields changed
    • changedInput schema / properties / pricing / description
      Previous value: -"Price to rank by; any is the lower of the two."New value: +"Price to rank by; any is the lower of the two and also includes Akash marketplace rows (ranked by median bid); on_demand and spot are cloud list prices only."
    • changedInput schema / properties / provider / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "AWS",
      -      "Azure",
      -      "Google Cloud"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "AWS",
      +      "Azure",
      +      "Google Cloud",
      +      "Akash"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / provider / description
      Previous value: -"AWS, Azure or Google Cloud."New value: +"AWS, Azure, Google Cloud or Akash (marketplace bids, with GPUs free)."
    • addedOutput schema / properties / rows / items / properties / gpus_available
      Added value: +{
      +  "description": "Akash rows: GPUs free at read_at",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / gpus_total
      Added value: +{
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / max_usd_per_gpu_hour
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / median_usd_per_gpu_hour
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / min_usd_per_gpu_hour
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / rows / items / properties / price_kind / enum
      Previous value: -[
      -  "on_demand",
      -  "spot",
      -  null
      -]New value: +[
      +  "on_demand",
      +  "spot",
      +  "marketplace_bid",
      +  null
      +]
    • addedOutput schema / properties / rows / items / properties / read_at
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. Changed9 schema fields changed
    • addedInput schema / $defs
      Added value: +{
      +  "RentVsBuy": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "gpus": {
      +        "default": 1,
      +        "description": "Number of GPUs bought and rented.",
      +        "maximum": 1024,
      +        "minimum": 1,
      +        "title": "Gpus",
      +        "type": "integer"
      +      },
      +      "hours_per_month": {
      +        "default": 730,
      +        "description": "Hours per month the GPUs run (utilisation).",
      +        "maximum": 744,
      +        "minimum": 1,
      +        "title": "Hours Per Month",
      +        "type": "number"
      +      },
      +      "months": {
      +        "default": 36,
      +        "description": "Horizon in months.",
      +        "maximum": 120,
      +        "minimum": 1,
      +        "title": "Months",
      +        "type": "integer"
      +      },
      +      "pue": {
      +        "default": 1,
      +        "description": "Power usage effectiveness multiplier for cooling and overhead.",
      +        "maximum": 3,
      +        "minimum": 1,
      +        "title": "Pue",
      +        "type": "number"
      +      },
      +      "purchase_usd": {
      +        "description": "Purchase price of the GPUs in USD.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 10000000,
      +        "title": "Purchase Usd",
      +        "type": "number"
      +      },
      +      "resale_pct": {
      +        "default": 0,
      +        "description": "Resale value after the horizon, percent of the purchase price.",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "title": "Resale Pct",
      +        "type": "number"
      +      },
      +      "usd_per_kwh": {
      +        "default": 0.15,
      +        "description": "Electricity price in USD per kWh.",
      +        "exclusiveMinimum": 0,
      +        "maximum": 5,
      +        "title": "Usd Per Kwh",
      +        "type": "number"
      +      },
      +      "watts_per_gpu": {
      +        "anyOf": [
      +          {
      +            "exclusiveMinimum": 0,
      +            "maximum": 2000,
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Power draw per GPU in watts under load; defaults by chip when the chip is a known one (H100 700, A100 400, L4 72), else required.",
      +        "title": "Watts Per Gpu"
      +      }
      +    },
      +    "required": [
      +      "purchase_usd"
      +    ],
      +    "title": "RentVsBuy",
      +    "type": "object"
      +  }
      +}
    • changedInput schema / properties / provider / anyOf
      Previous value: -[
      -  {
      -    "enum": [
      -      "AWS",
      -      "Azure"
      -    ],
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "enum": [
      +      "AWS",
      +      "Azure",
      +      "Google Cloud"
      +    ],
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / provider / description
      Previous value: -"AWS or Azure."New value: +"AWS, Azure or Google Cloud."
    • addedInput schema / properties / rent_vs_buy
      Added value: +{
      +  "anyOf": [
      +    {
      +      "$ref": "#/$defs/RentVsBuy"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Rent-or-buy break-even against the cheapest matching row: monthly cloud cost, monthly ownership cost, break-even month and totals. Same price."
      +}
    • addedOutput schema / properties / rent_vs_buy
      Added value: +{
      +  "description": "Only with the rent_vs_buy input: break-even against the cheapest matching row; null when no row matches (see rent_vs_buy_unavailable).",
      +  "properties": {
      +    "break_even_month": {
      +      "description": "First month the cumulative cloud cost reaches the purchase plus power so far (resale credited at the horizon); null if never within the horizon",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "cheaper_over_horizon": {
      +      "enum": [
      +        "buy",
      +        "rent",
      +        "equal",
      +        null
      +      ]
      +    },
      +    "cloud_row": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "inputs": {
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "monthly_cloud_usd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "monthly_depreciation_usd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "monthly_ownership_usd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "monthly_power_usd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "note": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "total_cloud_usd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "total_ownership_usd": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rent_vs_buy_unavailable
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / basis
      Added value: +{
      +  "description": "instance_share: price per GPU including a share of vCPU and memory",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / memory_gib_per_gpu
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / rows / items / properties / vcpus_per_gpu
      Added value: +{
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  5. Added

TDQS

A3.9/5.0
Behavior5/5

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

Annotations cover the safety profile, and the description then adds genuinely operational context: data is a snapshot refreshed twice a day, excludes tax, egress and storage, spot moves often, a snapshot older than 36 hours returns 503 (not charged), typical latency under 0.1 s, the price is USD 0.002 per call, and there is a free tier of 10 calls per IP per UTC day. Those cost, rate-limit and failure-mode details are exactly what annotations cannot convey.

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

Conciseness3/5

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

The core purpose is front-loaded, and most of the length is earned operational detail. However, the first sentence repeats what the second sentence says, listing the same providers, chips and pricing unit twice, which is wasted space in an already dense run-on.

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

Completeness5/5

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

Given an output schema exists, the description need not explain return shape, yet it still notes machine-hour versus GPU-hour pricing, null for unknown shape, and the exclusion count. Combined with freshness, pricing, latency, cost, and docs URL, an agent has everything needed to call it correctly.

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

Parameters3/5

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

Schema coverage is 100%, so every parameter is already documented in the schema, which sets the baseline at 3. The description restates the optional parameter names and adds meaning for a few (rent_vs_buy break-even, per-machine vs total GPU semantics) and for the unknown-shape exclusion count, but most parameters add no detail beyond the schema.

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

Purpose4/5

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

States a specific verb and resource: cheapest GPU price per GPU-hour across AWS, Azure, Google Cloud and Akash, filtered by chip, memory, machine shape, region and price ceiling. Scope and dimensions are unambiguous. It does not acknowledge the similarly named sibling get_gpu_price_index, so the agent must infer the split between a price lookup and a price index.

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

Usage Guidelines3/5

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

Usage is implied by the strong purpose statement and the pricing enum note ('on_demand and spot are cloud list prices only'), which helps the agent choose a mode. However, there is no explicit when-to-use, when-not-to-use, or pointer to an alternative tool such as get_gpu_price_index for historical/index data. Guidance is inferable but not stated.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources