Skip to main content
Glama

Lantern Works GPU Prices: daily GPU rental price comparison

Server Details

GPU rental prices checked daily, with price history and change feed; stack optimizer; AI-infra deals

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
connormatthewdouglas/agent-work-stack-deals
GitHub Stars
0
Server Listing
Lantern Works agent deals

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation3/5

Two pairs overlap heavily: optimize_agent_stack is explicitly a free-text front end over the same data as optimize_stack, and compare_deals vs compare_gpu_prices differ only in domain while sharing a near-identical name shape. The descriptions do disambiguate (free text vs explicit quantities; deals vs GPU rental rates), so an agent can recover, but it requires reading long text rather than names.

Naming Consistency5/5

All seven tools use consistent snake_case verb_noun form (compare_*, get_*, optimize_*, search_*). Verb choices are meaningful and non-duplicated (compare vs get vs search), so the pattern is predictable throughout.

Tool Count5/5

Seven tools is well within the ideal 3-15 range and each maps to a distinct data surface (GPU price comparison, price change feed, deals, stack estimation). Nothing feels padded or missing at the count level.

Completeness4/5

The read-only comparison domain is broadly covered: price comparison, change history, deal search/detail, and stack cost estimation. Minor gaps exist — no explicit tool to list tracked GPU models or providers (only a not_found fallback), and no per-provider rate lookup, but these are workable arounds.

Available Tools

7 tools
compare_dealsB
Read-only
Inspect

Compare 2-5 deals side by side (price, unit, offer type, code, verification), best value first.

NameRequiredDescriptionDefault
idsYes
modeNofull

Output Schema

NameRequiredDescription
okYes
modeNo
dealsNo
errorNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds real behavioral value by stating results are ordered 'best value first', but leaves the ranking criterion ('best value') undefined, which is the key behavioral unknown for interpreting output.

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

Conciseness5/5

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

A single front-loaded sentence with zero filler: verb, scope, compared fields, and result ordering all in one line. Nothing is wasted.

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

Completeness3/5

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

An output schema exists, so return structure need not be explained. But for a 2-parameter tool with 0% schema coverage, the unexplained 'mode' parameter and the unspecified ids delimiter leave genuine gaps an agent would hit on first invocation.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the full burden. It hints that 'ids' holds multiple deals (2-5) but never gives the format (comma-separated? array in a string?), and the 'mode' parameter (default 'full') is entirely undocumented in both schema and description.

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 (compare) and resource (deals) with scope (2-5) and the compared attributes (price, unit, offer type, code, verification). It implicitly distinguishes itself from get_deal (single) and compare_gpu_prices (domain-specific) but never names those siblings, so an agent must infer the boundary.

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?

The '2-5 deals' range implies this is for multi-deal evaluation rather than single lookups, which is useful implied guidance. However, it never states when to prefer get_deal, search_deals, or compare_gpu_prices instead, and gives no precondition that ids must reference existing deals.

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

compare_gpu_pricesA
Read-only
Inspect

Compare tracked GPU rental prices for one model (e.g. 'H100', 'A100 SXM', 'RTX 4090', 'L40S'), cheapest first.

Same data as https://thelanternworks.com/api/v1/gpu-prices.json. Sorted by hourly_usd ascending; each result has source_url and checked_at. 'Cheapest' means cheapest among tracked providers, not the whole market. limit 1-25. Unknown model returns not_found listing tracked models. Each result has tier_class: on-demand | community | marketplace | interruptible (spot/preemptible) | reserved | dedicated-monthly. Reserved (reservation/commitment 'starting from') rates are left out unless include_reserved=true, and even then they are never reported as cheapest. The cheapest overall can be spot or community capacity; on_demand_only=true keeps only on-demand rates, and the summary names the cheapest on-demand rate when the overall cheapest isn't. include_history=true adds each result's price_history (daily-snapshot change points) and history.recent_changes (price changes for this model among tracked providers, last 30 days) from /api/v1/gpu-prices/history.json. Each result has data_age_hours (hours since its price was last verified), degraded (> 48 h) and stale (> 7 days). max_data_age_hours (optional) drops older rates; excluded_too_old reports how many were dropped.

NameRequiredDescriptionDefault
gpuYes
modeNofull
limitNo
on_demand_onlyNo
include_historyNo
include_reservedNo
max_data_age_hoursNo

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo
resultsNo

TDQS

A4.5/5.0
Behavior5/5

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

With only readOnlyHint and openWorldHint annotated, the description does real work: it discloses ordering, the 'tracked providers, not the whole market' caveat, the reserved-rate exclusion policy, the degraded (>48h) and stale (>7d) thresholds, and the not_found behavior. These are exactly the behavioral facts an agent cannot infer from annotations or schema.

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

Conciseness4/5

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

The purpose and the 'cheapest among tracked providers' caveat are front-loaded, and most sentences carry real information. It is dense and long (the tier_class enumeration and reservation rules take several lines), but almost none of it is filler — the only soft spot is that the default 'mode' behavior is never addressed despite its prominence in the schema.

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

Completeness4/5

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

For a 7-param, open-world read tool with an output schema, the description covers return fields, error behavior, and all but one flag. The lack of explanation for 'mode' (default 'full') is the only thing an agent could trip over; everything else needed to call it correctly is present.

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

Parameters4/5

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

Schema coverage is 0%, so the description must explain all 7 parameters. It explains 6 of them well: gpu (example model names), limit (1-25), on_demand_only, include_reserved, include_history (with what it adds), max_data_age_hours (with the excluded_too_old counter). Only 'mode' is left completely unexplained, which is the one real gap.

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

Purpose5/5

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

The first sentence gives a specific verb ('Compare'), a specific resource ('tracked GPU rental prices'), a scope limiter ('for one model') and the ordering ('cheapest first'). The model examples ('H100', 'A100 SXM', 'RTX 4090', 'L40S') plus the note that prices come from tracked providers, not the whole market, make it clearly distinct from the deal-oriented siblings.

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

Usage Guidelines4/5

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

Usage is spelled out in detail: when to set include_reserved (reserved rates excluded by default and never reported as cheapest), when to set on_demand_only, when to set include_history, and when to set max_data_age_hours. The unknown-model fallback (not_found with the tracked model list) is also described. The one thing missing is any comparison to the sibling tools (compare_deals, search_deals), so the tool gives no routing guidance beyond flag selection.

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

get_dealC
Read-only
Inspect

Get one deal's public record by id, including redeem_url and agent_instructions.

NameRequiredDescriptionDefault
idYes
modeNofull

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-source behavior are covered. The description adds only "public record" and the presence of redeem_url/agent_instructions, which is return-content info that the existing output schema already conveys; nothing is said about what the mode parameter changes.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the resource and access path (id) come first. Nothing to trim, though the brevity trades away detail that belongs in the other dimensions.

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

Completeness3/5

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

Because an output schema exists and annotations cover the read-only profile, the return values and safety needn't be explained. The agent can still succeed calling with only 'id', but the undocumented 'mode' parameter and absent when-to-use guidance leave a meaningful gap for a lookup tool in a family of deal tools.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must carry the burden. It explains 'id' only conceptually (one deal, by id, no format), and the second parameter 'mode' with default 'full' is never mentioned or given possible values — a real blind spot for a 2-param tool.

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 with scope: "Get one deal's public record by id." That cleanly separates it from search_deals (list) and the compare_* siblings, though no sibling is named explicitly. Purpose is unambiguous without opening the schema.

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

Usage Guidelines2/5

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

"by id" implies an id must already be in hand, but the description never says when to use this versus search_deals (to find the id) or compare_deals. No exclusions, prerequisites, or routing guidance of any kind.

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

get_price_changesA
Read-only
Inspect

GPU rental price changes among tracked providers, each with old/new hourly price, change_pct, direction, the vendor source_url, a stable event_id (dedupe key) and rate_id.

since: 'YYYY-MM-DD' returns every change on or after that date, newest first (daily snapshots in /api/v1/gpu-prices/history.json); omitted returns the latest day's moves (/api/v1/gpu-price-changes.json). cursor: pass next_cursor from a previous call to get every change after it, oldest first, with has_more; loop until has_more is false, and store next_cursor only after processing (a watcher never misses or repeats events). error cursor_expired means re-sync with since and dedupe by event_id. kinds: optional subset of down, up, new, removed, same. gpu: optional model filter (substring, e.g. 'H100'). limit 1-200. Includes data_checked_at and next_refresh_utc (prices refresh daily at about 10:23 UTC).

NameRequiredDescriptionDefault
gpuNo
modeNofull
kindsNo
limitNo
sinceNo
cursorNo

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo
changesNo
has_moreNo
last_seqNo
next_cursorNo

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the readOnly/openWorld annotations it discloses data provenance (daily snapshots at /history.json, latest-day at /price-changes.json), refresh cadence (~10:23 UTC daily) and freshness fields (data_checked_at, next_refresh_utc). It also explains pagination semantics (ordering differs between since and cursor modes), a stable dedupe key, and an error-recovery path for expired cursors — exactly the operational context 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.

Conciseness5/5

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

Dense but front-loaded: the resource is stated first, then the parameter playbook in the order an agent would use it, with no filler sentences. The only mild redundancy is enumerating returned fields even though an output schema exists, but it is one clause and aids dedupe reasoning.

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

Completeness4/5

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

With an output schema present, the description rightly focuses on pagination, ordering, freshness windows and error recovery rather than return shapes. Combined with annotations, an agent can call this correctly end-to-end. The undocumented `mode` parameter is the one thing left for the agent to infer.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the full burden and it delivers formats and semantics for `since` (YYYY-MM-DD, inclusive, newest-first), `cursor` (opaque, from next_cursor), `kinds` (enum subset down/up/new/removed/same), `gpu` (substring, example 'H100') and `limit` (1-200). The `mode` parameter (default 'full') is never mentioned anywhere, which is a real gap in an otherwise strong parameter explanation.

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?

The opening sentence names a specific resource and view: GPU rental price changes across tracked providers, plus the exact fields returned (old/new price, change_pct, direction, source_url, event_id, rate_id). It is unmistakably a change-feed rather than a comparison or deal tool. It stops short of naming any sibling tool or explicitly excluding a comparison-style call, so it is clear but not sibling-differentiating.

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

Usage Guidelines4/5

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

It gives concrete when-to-use rules for both retrieval modes: `since` for a date-windowed backfill, `cursor` for incremental continuation, including the rule to loop until has_more is false and to persist next_cursor only after processing. It also tells the agent what to do on cursor_expired (re-sync with since, dedupe by event_id). No guidance on when a different tool (e.g. a comparison tool) is the better choice.

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

optimize_agent_stackA
Read-only
Inspect

Estimate a monthly stack cost from a short description of the agent being built.

description: free text, e.g. 'scrapes 20k JS pages/month via 5 GB residential proxies, 3k search queries, summarizes with an LLM, budget $300/mo'. Parsed deterministically (keywords/regex, no LLM) into components: gpu, scraping, proxy, search, llm_api, email, hosting, database, monitoring. Optional fields override the parse: gpu_hours (GPU-hours/month), gpu_model ('H100', 'A100', 'RTX 4090'), model_size_b (billions of params; sets a minimum VRAM using FP16 x 1.2), scrape_pages, js_rendering, proxy_gb, search_queries, emails_sent, llm_api, monthly_budget_usd. Each component gets the cheapest option with a cited price among tracked providers, with calc, source_url, verified_at, referral_disclosure (set when the link is a referral link) and manual-signup notes. Components with no cited price say 'no sourced price tracked' (nothing is estimated). Totals show the math and say whether they are complete. Pulled listings are excluded. Every option has data_age_hours, degraded (> 48 h) and stale (> 7 days); max_data_age_hours drops older options (excluded_too_old counts them). Same data as optimize_stack, compare_gpu_prices and the deal feed.

NameRequiredDescriptionDefault
modeNofull
llm_apiNo
proxy_gbNo
workloadNo
gpu_hoursNo
gpu_modelNo
descriptionNo
emails_sentNo
js_renderingNo
model_size_bNo
scrape_pagesNo
search_queriesNo
max_data_age_hoursNo
monthly_budget_usdNo
exclude_manual_signupNo

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo
linesNo
quote_idNo
issued_atNo
quote_basisNo

TDQS

A4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial non-obvious behavior: the parse is deterministic (keywords/regex, no LLM), each component resolves to the cheapest cited price, unsourced components return 'no sourced price tracked' rather than an estimate, referral links are disclosed, pulled listings are excluded, and freshness is graded (degraded >48h, stale >7 days) with excluded_too_old counting. Nothing here contradicts readOnlyHint/openWorldHint — it is a read-only external lookup, consistent with the annotations.

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

Conciseness4/5

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

The purpose sentence is front-loaded and the rest is dense but earns its place given the zero schema coverage — the parse rules, override precedence, and freshness thresholds all affect how an agent calls it. It is a long unbroken block with nested parentheticals rather than scannable structure, which costs it a point.

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

Completeness4/5

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

An output schema exists, so return-value shape needn't be explained, yet the description still usefully describes the per-component fields (calc, source_url, verified_at, referral_disclosure) and total completeness signaling. For a 15-parameter tool the only meaningful omission is the unexplained mode and workload parameters, which leaves an agent guessing at a top-level switch.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry all 15 parameters, and it does for most: description parsing targets, gpu_hours, gpu_model with enumerated examples, model_size_b with the actual VRAM rule (FP16 x 1.2), scrape_pages, js_rendering, proxy_gb, search_queries, emails_sent, llm_api, monthly_budget_usd, max_data_age_hours. The gaps are mode, workload, and exclude_manual_signup, which are never explained even though exclude_manual_signup interacts with the manual-signup notes mentioned elsewhere.

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?

Opens with a specific verb and resource: 'Estimate a monthly stack cost from a short description of the agent being built.' That distinguishes it from compare_gpu_prices or search_deals at a glance. It weakens itself at the end by saying it is 'Same data as optimize_stack, compare_gpu_prices and the deal feed' without stating how the view differs, leaving the estimate-vs-optimize boundary blurry.

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 example description ('scrapes 20k JS pages/month...') and by the note that optional fields override the deterministic parse, which is real operational guidance. But there is no explicit statement of when to choose this over optimize_stack, which is its closest sibling and is named in the same breath. An agent must infer the routing rule.

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

optimize_stackA
Read-only
Inspect

Cheapest suitable stack among tracked providers for monthly needs (set the quantities you need, rest 0).

scrape_pages: pages/month without JS rendering. scrape_pages_js: pages/month needing JS rendering. proxy_gb: residential proxy GB/month. emails_sent: transactional emails/month. search_queries: search API queries/month. gpu_hours: GPU-hours/month (1 GPU), optionally gpu_model e.g. 'H100', 'A100', 'RTX 4090'. Each line has the chosen plan, monthly_cost_usd, calc, vendor quote, source_url, checked_at and assumptions, plus alternatives. A vendor price that isn't published is 'unknown' (never estimated). manual_signup_only=true means a human must sign up (never automate it); exclude_manual_signup=true drops those plans. Same data as https://thelanternworks.com/api/v1/stack-pricing.json and /tools/stack-optimizer/.

NameRequiredDescriptionDefault
modeNofull
proxy_gbNo
gpu_hoursNo
gpu_modelNo
emails_sentNo
scrape_pagesNo
search_queriesNo
scrape_pages_jsNo
exclude_manual_signupNo

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo
linesNo
quote_idNo
issued_atNo
quote_basisNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already cover read-only and open-world, but the description adds real behavioral context: unpublished vendor prices are reported as 'unknown' and never estimated, and manual_signup_only=true plans require human signup and must never be automated. That automation-safety note is exactly the kind of guidance annotations cannot express. It loses a point only because the return-field enumeration partly duplicates the output schema.

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

Conciseness4/5

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

Purpose is front-loaded in the first clause, then a compact per-parameter unit glossary — every line earns its place. The trailing sentence pointing at the equivalent JSON endpoint and web tool is somewhat extraneous for tool selection but does establish data provenance.

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

Completeness4/5

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

With an output schema present, the description correctly does not need to explain return structure, and it covers inputs, pricing caveats, and the manual-signup constraint. The only material omission for a 9-parameter tool is the 'mode' parameter's semantics and allowed values.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the full burden and largely does: it defines units and meaning for scrape_pages, scrape_pages_js, proxy_gb, emails_sent, search_queries, gpu_hours, gpu_model (with example values), and exclude_manual_signup. The one gap is 'mode', which is undocumented in both schema and description despite having a non-obvious default of 'full'.

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 outcome ("cheapest suitable stack among tracked providers") with a concrete cost basis (monthly needs). It is clear what the tool computes, but it never distinguishes itself from the very similarly named sibling optimize_agent_stack, so an agent must guess between them.

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?

"Set the quantities you need, rest 0" gives operational guidance on how to drive the inputs, and the exclude_manual_signup note clarifies one selection behavior. However, there is no explicit when-to-use versus compare_gpu_prices, compare_deals, or optimize_agent_stack — the choice is left to inference.

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

search_dealsB
Read-only
Inspect

Search agent work-stack deals (compute, search, email, unblock, hosting...).

offer_type: verified_discount | listed_discount (not confirmed; verified_at null) | free_tier | trial | standard_referral | credit_only_referral. max_price excludes deals with unknown price. limit 1-25. Pass next_cursor back as cursor to page.

NameRequiredDescriptionDefault
modeNofull
tagsNo
limitNo
queryNo
cursorNo
categoryNo
max_priceNo
offer_typeNo

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo
resultsNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description meaningfully adds that listed_discount is unconfirmed with verified_at null, and that max_price silently excludes deals with unknown price — a non-obvious filter side effect worth knowing. It says nothing about result ordering, result count semantics, or what mode does.

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

Conciseness4/5

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

Terse and front-loaded: the resource statement leads, then parameter semantics in a compact list, with no filler. Density is close to the limit — bare fragments like "unblock" and "limit 1-25" read as shorthand rather than prose, but nothing is wasted.

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

Completeness3/5

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

An output schema exists, so return values need no explanation, and pagination plus price/offer-type filtering are covered. The significant remaining hole is mode (default "full") and the free-text filters query/category/tags, which are the primary levers for a search tool and are undocumented everywhere.

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 0% across 8 parameters, so the description must compensate and only partly does: it defines the offer_type value set, the max_price exclusion rule, the limit 1-25 bound, and the next_cursor→cursor paging loop (4 of 8). mode (default "full"), tags, query, and category get zero explanation in either schema or description.

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 ("Search agent work-stack deals") and enumerates the domain (compute, search, email, unblock, hosting), which is more than a restatement of the name. It never distinguishes itself from siblings like get_deal or compare_deals, so an agent must still guess which search/lookup tool to use.

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

Usage Guidelines2/5

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

There is no explicit statement of when to use this tool versus get_deal, compare_deals, or optimize_stack. The offer_type list and pagination hint imply it is the bulk-listing entry point, but the agent has to infer that from context rather than being told.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updates
    • Changedcompare_deals1 field changed
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
    • Changedcompare_gpu_prices3 fields changed
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
      • addedOutput schema / properties / results / items / properties
        Added value: +{
        +  "rate_id": {
        +    "pattern": "^r_[0-9a-f]{12}$",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "advertiser",
        -  "gpu",
        -  "hourly_usd",
        -  "source_url",
        -  "rank"
        -]New value: +[
        +  "advertiser",
        +  "gpu",
        +  "hourly_usd",
        +  "source_url",
        +  "rank",
        +  "rate_id"
        +]
    • Changedget_deal1 field changed
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
    • Changedget_price_changes7 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "default": null,
        +  "type": "string"
        +}
      • addedInput schema / properties / kinds
        Added value: +{
        +  "default": null,
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / changes / items / properties
        Added value: +{
        +  "event_id": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "key": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "rate_id": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "seq": {
        +    "type": [
        +      "integer",
        +      "null"
        +    ]
        +  },
        +  "snapshot_id": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  }
        +}
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
      • addedOutput schema / properties / has_more
        Added value: +{
        +  "type": [
        +    "boolean",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / last_seq
        Added value: +{
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedoptimize_agent_stack6 fields changed
      • changedOutput schema / else / required
        Previous value: -[
        -  "ok",
        -  "mode",
        -  "lines",
        -  "monthly_estimate_usd",
        -  "estimate_is_complete"
        -]New value: +[
        +  "ok",
        +  "mode",
        +  "lines",
        +  "monthly_estimate_usd",
        +  "estimate_is_complete",
        +  "quote_id",
        +  "issued_at"
        +]
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
      • addedOutput schema / properties / issued_at
        Added value: +{
        +  "format": "date-time",
        +  "type": "string"
        +}
      • addedOutput schema / properties / lines / items / properties
        Added value: +{
        +  "alternatives": {
        +    "items": {
        +      "properties": {
        +        "rate_id": {
        +          "pattern": "^r_[0-9a-f]{12}$",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "rate_id"
        +      ],
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  "choice": {
        +    "properties": {
        +      "rate_id": {
        +        "pattern": "^r_[0-9a-f]{12}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "rate_id"
        +    ],
        +    "type": [
        +      "object",
        +      "null"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / quote_basis
        Added value: +{
        +  "type": "object"
        +}
      • addedOutput schema / properties / quote_id
        Added value: +{
        +  "pattern": "^q_[0-9a-f]{20}$",
        +  "type": "string"
        +}
    • Changedoptimize_stack6 fields changed
      • changedOutput schema / else / required
        Previous value: -[
        -  "ok",
        -  "mode",
        -  "lines",
        -  "total_monthly_usd",
        -  "total_is_complete"
        -]New value: +[
        +  "ok",
        +  "mode",
        +  "lines",
        +  "total_monthly_usd",
        +  "total_is_complete",
        +  "quote_id",
        +  "issued_at"
        +]
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
      • addedOutput schema / properties / issued_at
        Added value: +{
        +  "format": "date-time",
        +  "type": "string"
        +}
      • addedOutput schema / properties / lines / items / properties
        Added value: +{
        +  "alternatives": {
        +    "items": {
        +      "properties": {
        +        "rate_id": {
        +          "pattern": "^r_[0-9a-f]{12}$",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "rate_id"
        +      ],
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "type": "array"
        +  },
        +  "choice": {
        +    "properties": {
        +      "rate_id": {
        +        "pattern": "^r_[0-9a-f]{12}$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "rate_id"
        +    ],
        +    "type": [
        +      "object",
        +      "null"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / quote_basis
        Added value: +{
        +  "type": "object"
        +}
      • addedOutput schema / properties / quote_id
        Added value: +{
        +  "pattern": "^q_[0-9a-f]{20}$",
        +  "type": "string"
        +}
    • Changedsearch_deals1 field changed
      • changedOutput schema / properties / error / properties / code / enum
        Previous value: -[
        -  "invalid_argument",
        -  "invalid_cursor",
        -  "not_found",
        -  "feed_unavailable",
        -  "feed_invalid",
        -  "upstream_unavailable",
        -  "internal_error"
        -]New value: +[
        +  "invalid_argument",
        +  "invalid_cursor",
        +  "cursor_expired",
        +  "not_found",
        +  "feed_unavailable",
        +  "feed_invalid",
        +  "upstream_unavailable",
        +  "internal_error"
        +]
  2. 7 tool updates
    • First observedcompare_deals
    • First observedcompare_gpu_prices
    • First observedget_deal
    • First observedget_price_changes
    • First observedoptimize_agent_stack
    • First observedoptimize_stack
    • First observedsearch_deals

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables agents to query live cloud GPU pricing, stock availability, and up to 12 months of price history across 30+ hyperscalers, neoclouds, and marketplaces, including comparisons of cheapest listed versus cheapest in-stock offers. All tools are read-only, with provider listings and GPU catalogs available at no cost.
    8
    721 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to query real-time GPU rental prices across 26 platforms, including current lowest quotes, 30-day price history, market movers, platform reliability, and task/budget recommendations. Access is read-only and metered per call via x402 with USDC on Base, requiring no signup or API key.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.