Skip to main content
Glama

Lantern Works — GPU price comparison for agents, checked daily

Lantern Works tracks hourly GPU rental prices (H100, A100, RTX 4090 and more) across cloud providers, re-read every day from each vendor's own pricing page, with the quote, source link and check date for every rate, plus daily price history (since 2026-10-27). Agents get it through the compare_gpu_prices MCP tool (include_history=true for price history) or plain JSON. "Cheapest" always means cheapest among tracked providers. It also keeps a directory of work-stack deals (scraping/unblock, email, search, hosting), ranked by customer value (price, free tier, fit), never by affiliate status. Some result links are referral links.

Contact: lanternworks@agentmail.to

MCP server (v0.3.16, read-only, stdio)

Free, read-only, no API key. Package lantern-works-deals-mcp on PyPI; MCP Registry name io.github.connormatthewdouglas/lantern-works-deals. Built on the official Python MCP SDK.

Tools

Tool

What it does

compare_gpu_prices

Hourly rental prices for a GPU model (e.g. H100, A100 SXM, RTX 4090) across tracked providers, cheapest first, each with source_url and checked_at. "Cheapest" means cheapest among tracked providers, not the whole market. include_history=true adds each rate's price history and recent price changes (daily snapshots since 2026-10-27). Each rate has tier_class (on-demand, community, marketplace, interruptible, reserved, dedicated-monthly; also in the public JSON feed); on_demand_only=true keeps on-demand rates only. reserved = reservation/commitment "starting from" prices (e.g. Hyperstack reservations): they need a term contract, so they are left out of results and never called "cheapest" unless you pass include_reserved=true (even then they sort after pay-as-you-go rates).

get_price_changes

GPU price moves among tracked providers, newest first: old and new hourly price, change_pct, direction and the vendor source_url. since (YYYY-MM-DD) returns every move on or after that date; without it, the latest day's moves. Optional gpu filter.

optimize_stack

Given monthly usage (pages scraped, proxy GB, emails, search queries, GPU hours/model), pick the cheapest tracked plan per line and total the monthly cost, with the calculation, sources and alternatives; unpublished prices are reported as unknown.

optimize_agent_stack

Describe the agent in plain text (e.g. "scrapes 20k JS pages via 5 GB proxies, 3k searches, summarizes with an LLM, budget $300/mo"); a deterministic keyword parse (no LLM) maps it to components and returns the cheapest cited option per component with the math, source_url, verified_at and a referral disclosure where applicable. Components with no cited price say "no sourced price tracked".

search_deals

Search the deals feed by text, category, offer_type, max_price and tags; paginated summaries (limit 1-25, cursor).

compare_deals

Compare 2-5 deals by id side by side, best customer value first.

get_deal

Return the full public record for one deal id.

Install

uvx lantern-works-deals-mcp

Quickstart: ask for compare_gpu_prices(gpu="H100"), then the next day call get_price_changes(since="<data_checked_at date>") to see what moved. Prices refresh daily at about 10:23 UTC; compare_gpu_prices and optimize_agent_stack return data_checked_at and next_refresh_utc.

Claude Code:

claude mcp add lantern-works-deals -- uvx lantern-works-deals-mcp

Cursor (.cursor/mcp.json) and Cline (cline_mcp_settings.json, via MCP Servers → Configure) use the same entry:

{ "mcpServers": { "lantern-works-deals": { "command": "uvx", "args": ["lantern-works-deals-mcp"] } } }

Docker: docker build -t lantern-works-deals-mcp . && docker run -i --rm lantern-works-deals-mcp (the root Dockerfile installs the pinned PyPI release and runs the stdio server). Without uv: pip install lantern-works-deals-mcp, then use "command": "lantern-works-deals-mcp". Other clients: https://thelanternworks.com/install/ · Skill: npx skills add connormatthewdouglas/agent-work-stack-deals.

Telemetry is off by default. LANTERN_TELEMETRY=1 opts in to an anonymous daily count of tool calls: tool name, version, day and count only. No arguments, IDs or IPs are sent or stored. See PRIVACY.md.

Terminal demo: cheapest H100 for 100 hours via compare_gpu_prices

Demo (live data, 2026-10-28): the MCP server answers "cheapest H100 for 100 hours?". It shows 100-hour totals for the cheapest, next and most expensive tracked rates, each with its source and check time, and labels referral links. Recording: docs/demo/cheapest-h100-100h.cast · script: docs/demo/demo.py.

Framework examples: LangGraph (cheapest H100), CrewAI and OpenAI Agents SDK (cheapest GPU for a described job), Stack optimizer (describe your agent, get the cheapest cited stack via optimize_agent_stack), GPU price watcher (what moved since a date via get_price_changes, cron-ready), GPU price monitor (price-drop alerts from the history API). All examples: examples/. Some tool results include referral links (affiliate: true).

Arguments, errors, data sources and tests: mcp_server/README.md.

Hosted endpoint (no install)

Streamable HTTP, same read-only tools: https://lantern-works-mcp.lantern-works.workers.dev/mcp?ref=github-readme (claude mcp add --transport http lantern-works-deals https://lantern-works-mcp.lantern-works.workers.dev/mcp?ref=github-readme). Free Cloudflare Worker; it stores only anonymous call counts per tool per day (no IPs, user agents or arguments), public at https://lantern-works-mcp.lantern-works.workers.dev/stats. ?ref= only tags which link was used.

Related MCP server: 1cent

Feed contract, validation and deploy gate

  • Schema: schema.json (JSON Schema 2020-12). deals.json carries schema_version; prices are nullable (null = unknown, 0 = free tier), with explicit currency, unit, billing_period, verified_at, updated_at.

  • Stable feed: https://thelanternworks.com/api/v1/deals.json is byte-identical to /deals.json (both written by scripts/generate_seo_pages.py). The gist is a byte-identical mirror.

  • Private data: commission, payout and compliance data live only in a private file outside this repo (path set by LANTERN_PRIVATE_FIELDS). The generator reads it only for local sanity checks and leak detection and fails the build if any private key or commission-like text reaches public output.

  • Validation: pip install jsonschema && python3 scripts/validate_feed.py --gist --links checks schema, private-leak scan, api/v1 parity, sitemap host, old-host hardcodes, gist parity and redeem URLs (403/429/timeouts warn; 404/410/DNS/persistent 5xx fail, exit 1).

  • Deploy gate: GitHub Actions runs schema validation, the test suite, a clean PyPI install check and a Docker build/stdio check; Pages deploys only after they pass, then live checks run.

  • Migration test: python3 scripts/test_url_migration.py checks old GitHub Pages project URLs 301 to the new domain, key pages return 200, and the feeds match.

  • Compliance gate: when the private registry (path set by LANTERN_COMPLIANCE_REGISTRY) is present, the generator publishes only deals whose status is approved; others move to a private held file and come back automatically once approved. Absent registry (CI) = feed published as-is.

  • For agents: https://thelanternworks.com/for-agents/ documents endpoints, schema and offer types.

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 establish readOnlyHint=true and openWorldHint=true, so the safety profile is mostly covered. The description adds useful behavior by naming compared fields and stating results are ordered "best value first," but it does not explain the mode parameter or any limits beyond the 2-5 count.

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 compact sentence with the key action, input range, compared fields, and ordering front-loaded. There is no wasted text.

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-value details are less necessary in the description. Still, for a tool with an unexplained mode parameter and no schema descriptions, the definition leaves meaningful gaps about how the comparison behaves in different modes.

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 compensate but only indirectly implies that the ids input should contain 2-5 deal identifiers. The mode parameter is completely undocumented, leaving an agent without guidance on what "full" means or what other values might do.

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 description gives a clear verb and resource ("Compare ... deals") plus comparison fields and output ordering, so the core purpose is specific. It does not explicitly differentiate from siblings such as search_deals, get_deal, or compare_gpu_prices, so it falls short of a 5.

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 deal constraint gives some usage context, implying this is for small side-by-side comparisons rather than listing or retrieving one deal. However, it never says when to use this instead of search_deals or get_deal, nor does it mention exclusions or prerequisites.

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.2/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld, and the description adds substantial behavior beyond that: 'cheapest' is scoped to tracked providers not the whole market, reserved rates are excluded by default and never ranked as cheapest, tier_class taxonomy is enumerated, data_age_hours/degraded/stale thresholds are disclosed, and excluded_too_old is reported.

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?

Front-loads the core action and scope, and nearly every sentence carries operational detail. It is dense and slightly repetitive ('cheapest among tracked providers' restated as reserved 'never reported as cheapest') with awkward mid-sentence line breaks, but nothing is filler.

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-parameter read tool it covers ranking semantics, tier classes, freshness cutoffs and the not_found fallback; return-field explanation is partly redundant given an output schema exists, but it doesn't hurt. The only real omission is the undocumented 'mode' parameter.

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 parameter meaning, and it does for gpu (with examples), limit (1-25), on_demand_only, include_reserved, include_history and max_data_age_hours. The 'mode' parameter (default 'full') is never mentioned, leaving one of seven parameters undocumented anywhere.

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), resource (tracked GPU rental prices), scope (one model, cheapest first) and gives example model strings. It is distinguishable from deal-oriented siblings like compare_deals and search_deals, though the overlap with get_price_changes (history/price-change data) is never explicitly addressed.

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?

Gives concrete conditions for the optional flags: on_demand_only keeps only on-demand rates, include_reserved pulls in reservation rates that are otherwise dropped, include_history adds history payloads, max_data_age_hours drops stale rates. It also states the unknown-model fallback. It stops short of naming siblings to use instead.

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

get_dealB
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

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 safety and open-world nature are covered. The description adds that the record is public and surfaces redeem_url and agent_instructions, which is useful content disclosure, but it says nothing about failure behavior for a bad id or what the undocumented "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.

Conciseness5/5

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

A single sentence with the lookup key and the notable returned fields front-loaded; no filler or redundant restatement of the tool name.

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 shape need not be explained, and the description does highlight the two most decision-relevant fields. But for a 2-parameter tool with zero schema description coverage, the unexplained "mode" parameter and absent usage/error guidance leave real gaps.

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 clarifies that "id" identifies a single deal, but the second parameter "mode" (default "full") is never mentioned and has no enum, leaving the agent unable to know what modes exist or what they alter.

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 ("Get one deal's public record") and scopes it to a single item by id, which implicitly separates it from search_deals and compare_deals. It does not name any sibling explicitly, so differentiation relies on inference from the singular "one deal by id" framing.

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?

"by id" implies the usage condition (you already have a deal identifier), which is enough to infer this is a direct-lookup tool rather than a discovery tool. However, there is no explicit when-to-use statement, no mention of when to prefer search_deals/compare_deals, and no guidance on what to do if the id is unknown.

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, newest first, each with old/new hourly price, change_pct, direction and the vendor source_url.

since: 'YYYY-MM-DD' returns every change on or after that date (daily snapshots in /api/v1/gpu-prices/history.json); omitted returns the latest day's moves (/api/v1/gpu-price-changes.json). 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), so you can call again after the next refresh to see what moved.

NameRequiredDescriptionDefault
gpuNo
modeNofull
limitNo
sinceNo

Output Schema

NameRequiredDescription
okYes
modeNo
errorNo
changesNo

TDQS

A3.9/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses the backing endpoints, the ordering (newest first), the daily refresh cadence (~10:23 UTC), and that the response carries data_checked_at and next_refresh_utc for staleness reasoning. That is meaningful operational context an annotation cannot convey; only the unexplained 'mode' parameter keeps it from a 5.

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 lead sentence front-loads the resource and output shape, followed by parameter behavior in decreasing order of importance. It runs long and the parenthetical endpoint paths are somewhat noisy, but each clause carries usable information rather than filler.

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 a read-only annotation set and an output schema already present, the description doesn't need to enumerate return values, yet it helpfully names the key fields and freshness markers. The single real hole is that 'mode' has no explanation anywhere, which for a 4-parameter tool is a modest but genuine gap.

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 description coverage is 0%, so the description must carry the load and it does for three of four params: gpu is a substring filter with an 'H100' example, limit is bounded 1-200, and since has both format and semantics. The 'mode' parameter (default 'full') is never mentioned, leaving one documented-in-neither-place argument that an agent must guess at.

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 description opens with a specific verb+resource: 'GPU rental price changes among tracked providers, newest first, each with old/new hourly price, change_pct, direction and the vendor source_url.' That distinguishes it from the snapshot-oriented siblings (compare_gpu_prices, search_deals), though it never names an alternative explicitly, so differentiation is inferred rather than stated.

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 clearly states the conditional behavior of the two main arguments: since='YYYY-MM-DD' returns every change on or after that date, while omitting it returns only the latest day's moves. It also explains when to call again ('call again after the next refresh to see what moved'), giving the agent a polling strategy. What's missing is explicit routing against siblings like compare_gpu_prices.

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

TDQS

A3.7/5.0
Behavior5/5

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

Annotations only declare readOnly/openWorld; the description adds substantial behavior: deterministic keyword/regex parsing with no LLM, explicit override semantics for optional fields, cheapest-option-with-cited-price rule, 'no sourced price tracked' instead of estimating, totals showing math and completeness, exclusion of pulled listings, and full freshness state machine (degraded >48h, stale >7d, max_data_age_hours exclusion with excluded_too_old).

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?

Front-loaded with purpose, which is good, but the body is a dense run-on paragraph of semicolon- and parenthetical-separated field lists. Almost every clause carries information, yet the lack of structure makes it harder to scan than it needs to be for 15 parameters.

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 values needn't be spelled out, and the description still usefully previews provenance fields (calc, source_url, verified_at, referral_disclosure) and freshness handling. It's nearly complete for a 15-parameter tool, missing only the semantics of `mode`, `workload` and `exclude_manual_signup`.

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?

With 0% schema description coverage, the description carries the burden and mostly succeeds: it gives units and examples for gpu_hours, gpu_model, model_size_b ('sets a minimum VRAM using FP16 x 1.2'), scrape_pages, js_rendering, proxy_gb, search_queries, emails_sent, llm_api, monthly_budget_usd and max_data_age_hours. Three parameters (`mode`, `workload`, `exclude_manual_signup`) are never explained, leaving a real gap.

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 concrete verb+resource: 'Estimate a monthly stack cost from a short description of the agent being built.' It names the siblings sharing the same data (optimize_stack, compare_gpu_prices, deal feed), which tells the agent this is a sibling entry point, but never states what distinguishes it from optimize_stack itself.

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 a usage example for the `description` field, but no guidance on when to pick this over optimize_stack or compare_gpu_prices, and no prerequisites or exclusions. The agent must infer selection from the names alone.

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

TDQS

A3.8/5.0
Behavior4/5

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

Beyond the readOnlyHint/openWorldHint annotations, the description discloses real behavioral traits: each result line carries plan, monthly_cost_usd, calc, vendor quote, source_url, checked_at, assumptions, plus alternatives. It also states that unpublished prices are 'unknown' and are never estimated, and that manual_signup_only means a human must sign up and must never be automated — an important safety constraint.

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 core rule ('set quantities, rest 0') are front-loaded, followed by a compact parameter glossary and return-shape notes. It is dense but every line carries information; only the trailing URL self-reference adds little for an agent.

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 9 loosely-titled parameters and no schema descriptions, the description supplies the missing semantics and explains result fields well enough that an output schema is barely needed for interpretation. The one omission is the undocumented 'mode' argument, which an agent cannot reason about from this text.

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 defines nearly every parameter in domain terms: scrape_pages vs scrape_pages_js (JS rendering), proxy_gb (residential GB/month), emails_sent, search_queries, gpu_hours (1 GPU) and gpu_model with concrete examples like 'H100'. The notable gap is the 'mode' parameter, which defaults to 'full' but is never explained.

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 states a specific outcome: the cheapest suitable stack across tracked providers for the given monthly usage quantities. It is clear what the tool returns, but it never distinguishes itself from the sibling optimize_agent_stack, which sounds nearly identical in intent.

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 through the input framing ('set the quantities you need, rest 0') and the exclude_manual_signup exclusion rule, which tells the agent when plans get dropped. However, there is no statement of when to prefer this over compare_gpu_prices, compare_deals, or optimize_agent_stack, so the agent must infer routing.

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

search_dealsA
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

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds real behavior: max_price silently drops deals with unknown price, listed_discount values are unconfirmed (verified_at null), limit is bounded 1-25, and next_cursor must be passed back as cursor. These are non-obvious traits an agent would otherwise get wrong.

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?

Tight, front-loaded, and free of filler; the offer_type list is dense but carries necessary semantic distinctions. The line breaks make it scannable, though the taxonomy block could be trimmed of the parenthetical if the field were enumerated in the schema instead.

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-value explanation is rightly omitted, and the pagination contract is given. But for an 8-parameter tool with zero schema descriptions, leaving mode/tags/query/category undefined is a meaningful completeness gap that the description should have closed.

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%, so the description must compensate, and it does for offer_type (full value list with semantics), max_price, limit, and cursor. However mode, tags, query, and category — half the parameters, including the opaquely named mode with default "full" — are 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?

Specific verb+resource ("Search ... deals") with a scoping qualifier ("agent work-stack") and example categories (compute, search, email, unblock, hosting). It does not distinguish itself from siblings like compare_deals, get_deal, or optimize_stack, so an agent must infer the boundary between lookup and comparison.

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 only implied: the offer_type taxonomy and max_price caveat tell the agent how to filter, and the cursor sentence tells it how to page. There is no statement of when to prefer this over compare_deals or get_deal, and no prerequisite/exclusion guidance.

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 updatesv0.3.16
    • First observedcompare_deals
    • First observedcompare_gpu_prices
    • First observedget_deal
    • First observedget_price_changes
    • First observedoptimize_agent_stack
    • First observedoptimize_stack
    • First observedsearch_deals

TDQS

A3.8/5.0

Scored across 7 tools

Disambiguation4/5

Most tools have distinct resource+action targets: search_deals finds deals, compare_deals compares specific ones, get_deal fetches a single record, and compare_gpu_prices vs get_price_changes separate snapshot pricing from movement history. The one real overlap is optimize_stack vs optimize_agent_stack, since the latter accepts all of the former's explicit fields as overrides, making the plain optimizer largely a subset.

Naming Consistency5/5

Every tool follows a clean snake_case verb_noun pattern (compare_*, get_*, search_*, optimize_*), with verbs that accurately signal the operation. No mixed casing or inconsistent verb styles anywhere in the set.

Tool Count5/5

Seven tools is well-scoped for a price/deal data service, with each covering a distinct facet: GPU price comparison, price movement, deal search, deal comparison, deal lookup, and two stack cost estimators. Nothing feels padded or missing at the count level.

Completeness4/5

The surface covers the core workflows: find/compare/get deals, compare GPU prices, track changes, and estimate stack costs with history via parameters. Minor gaps remain — no way to list tracked models or providers directly (only via not_found or a substring filter), and no per-provider price table across models, but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

  • Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.

    https://mcp.cralo.ai/mcp
  • Free search over ~50k agent tools: paid x402 APIs and MCP servers. Price, networks, how to call.

    https://subpay.ai/find/mcp
  • Read-only search over 1,771 AI agent tools and 248 MCP servers. No sign-up needed.

  • Your agent needs live data — a competitor's traffic, who to contact there, what people are saying, what Google and ChatGPT answer about you, a company's filings. Normally that is six vendor accounts, six sets of keys and six SDKs. This is one URL. **What you can ask for** • "How much traffic does stripe.com get, where does it come from, and who competes for the same keywords?" • "Find 20 Series-B fintech companies in Germany and the heads of marketing there, with emails." • "Does ChatGPT mention our brand when someone asks for the best CRM — and what does it cite?" • "What is X saying about $NVDA today, and what did the stock actually do?" • "Search the web for this, then scrape the three best pages into markdown." **How to use it** Point any MCP client at https://mcp.aisa.one/mcp and sign in with OAuth — there is no key to create or paste. Then just ask: the agent calls search to find the right operation and use to run it. **Why this rather than the source** 26 sources behind one account and one bill — DataForSEO, Semrush, Ahrefs, Similarweb, Apollo, X/Twitter, Instagram, Reddit, Pinterest, YouTube, Tavily, Exa, Perplexity, Firecrawl, CoinGecko, Kalshi, Polymarket, AgentMail and more, 580+ operations. tools/list returns five tools, not 580, so the introduction does not eat your context window. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** One slice at a time: https://mcp.aisa.one/seo/mcp · /finance/mcp · /social/mcp · /search/mcp · /sales/mcp · /mail/mcp · /gtm/mcp, or a single provider like /twitter-api/mcp. Same account, fewer tools listed, and search still reaches everything. Full list at https://mcp.aisa.one/servers

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Company technographics: search 760,000+ companies by the technologies they use — with direction of change (adopting / replacing / evaluating) — enrich any domain with firmographics and hiring signals, and browse a 10,000+ technology catalog. Remote server at https://api.echoloc.ai/mcp (Streamable HTTP); free API key: 100 requests/month, no card. Docs: https://echoloc.ai/for-agents
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides a bundle of marketing data APIs as MCP tools, including contact extraction, Google Maps reviews, SEO audits, and more. Enables AI agents to access these services with Solana USDC payment support.
    MIT