Skip to main content
Glama
x7even

OpenCloudCosts MCP

by x7even

OpenCloudCosts MCP

Anchor AI FinOps to real, live cloud pricing.

License: MIT PyPI version Release

Your LLM's cloud pricing knowledge was frozen at training cutoff. Cloud pricing wasn't.

opencloudcosts is an MCP server that gives your AI assistant live, structured access to AWS, GCP, and Azure pricing — 16 tools it can call directly, with results it can reason over rather than guess at. Ask it to compare a full multi-resource workload across all three clouds simultaneously. Ask it for your actual post-discount effective rates from Reserved Instances, Savings Plans, or Enterprise Discount Programs. Ask it to fan out across every region and return the cheapest option. None of that is possible from training data alone, and none of it is possible from a single-cloud pricing calculator.

Related MCP server: CloudCost MCP Server

The Problem

Ask any AI assistant what an m5.2xlarge costs in ap-southeast-2, whether AWS or GCP is cheaper for a three-tier web app, or what your effective hourly rate is after Savings Plans. You will get a confident answer. It will probably be wrong.

Cloud pricing is a poor fit for static model weights: instance families are added and retired, regional pricing diverges (the same instance type can differ 20–40% across regions), spot markets fluctuate, and commitment discounts are by definition unique to each account. A model answering from training data cannot know your negotiated EDP rate. It can barely reliably recall last year's list price. The problem is not that LLMs are bad — it's that real-time, account-specific pricing data is structurally outside what a model can know.

opencloudcosts fixes this by giving your AI assistant 16 MCP tools backed by live provider APIs. Instead of hallucinating numbers, the model calls a tool and gets a precise answer.

A Concrete Scenario

Your team asks: "We're evaluating whether to migrate this workload from AWS to GCP. What does the full stack cost on-demand vs. three-year committed, across all three clouds, so I can make the case to leadership?"

Without this tool, the model interpolates — possibly from pricing that is a year out of date — across three providers, multiple resource types, and at least four pricing tiers. The numbers will be plausible and wrong.

With opencloudcosts, the model calls compare_bom with the workload spec (compute + storage + database). The tool fans out 8 concurrent provider calls across AWS, GCP, and Azure simultaneously, prices each resource category at public and committed rates, and returns a per-provider, per-term breakdown with savings analysis — in a single tool call.

No spreadsheet. No switching between three provider calculators. No manual SKU matching. No training-data approximation.

Why Not the Obvious Alternatives

Asking a model without tools — Training data has a cutoff. Cloud pricing changes constantly, varies 20–40% across regions for the same instance type, and includes account-level commitment discounts that are invisible at inference time. The model will approximate, confabulate, or recall stale numbers. There is no structured output, and the model cannot access your contracted rates under any circumstances.

Cloud pricing calculators (AWS / GCP / Azure) — Each covers exactly one cloud. They are UI-only with no API surface callable from an AI assistant. Cross-cloud comparison requires manually reproducing the same architecture three times across three separate calculators and reconciling exports by hand. They have no concept of unit economics and produce no programmatic output for agentic workflows.

Infracost — Excellent at estimating cost diffs against Terraform plans. It requires IaC files as input — it cannot answer "what does an n2-standard-8 cost in europe-west4?" without a Terraform plan in hand. It is not an MCP server and is not callable from a conversational AI context.

Calling provider APIs directly — AWS bulk pricing files are multi-GB and require targeted API access patterns to avoid downloading them in full. GCP's Cloud Billing Pricing API v1beta requires a multi-source ADC credential chain and provider-specific IAM. Azure's Retail Prices API needs pagination logic and SKU matching. Every provider uses different region naming conventions, SKU formats, and data schemas. opencloudcosts normalizes all of this behind a uniform MCP tool interface and handles credential chains, caching, and retry logic so the model does not have to.

Capabilities at a Glance

Capability

LLM (no tools)

Cloud Calculators

Infracost

opencloudcosts

Live pricing (not frozen at training cutoff)

No

Manual input only

IaC-bound

Yes — fetched from provider APIs

Cross-cloud comparison in one call

No

No

No

Yes — compare_bom, 8 concurrent provider calls

Effective/contracted rates (RI, SP, EDP, CUD)

No

No

No

Yes — credentials unlock this layer

Multi-region concurrent fan-out

No

No

No

Yes — up to 32 goroutines

Unit economics (cost/user, cost/request)

Approximate

No

No

Yes — estimate_unit_economics

MCP tool surface — callable by model

N/A

No

No

Yes — 16 tools

AWS + Azure public pricing, zero credentials

N/A

Single-cloud only

Partial

Yes

HTTP service for shared/Kubernetes deployments

N/A

N/A

No

Yes — bearer auth, rate limiting, probes

Coverage: Three Clouds, 16 Tools

Fourteen tools are fully functional. Two entries are compatibility stubs: search_pricing (a deprecated redirect from v0.8.x, kept for backward compatibility) and get_spot_history (registered but not implemented in the Go server — returns a structured "not available" response).

Credential requirements by provider

Coverage

Credentials required

AWS EC2, EBS (gp3/io2/sc1), RDS, inter-region egress

None

Azure VMs, Managed Disks, Blob Storage, Azure SQL/MySQL/PostgreSQL, Cosmos DB, AKS, Azure Functions, Azure OpenAI (GPT-4o, GPT-4, GPT-3.5-Turbo, o1, o1-mini, embeddings)

None — fully public Retail Prices API

GCP Compute Engine, Cloud Storage, Persistent Disk, Cloud SQL, Memorystore, GKE, BigQuery, Vertex AI, Gemini, Cloud LB/CDN/NAT/Armor, Cloud Monitoring

Free API key (OCC_GCP_API_KEY) — no billing account, no credit card

AWS post-discount rates (Reserved Instances, Savings Plans) + get_discount_summary

AWS credentials + OCC_AWS_ENABLE_COST_EXPLORER=true ($0.01/call to Cost Explorer, opt-in only)

GCP committed-use discounts (CUDs) and Enterprise Discount Programs (EDPs)

ADC credentials + billing.billingAccountPrice.get IAM + OCC_GCP_BILLING_ACCOUNT_ID

Azure Reserved VM pricing (1-year and 3-year terms) is available via the public Retail Prices API — no credentials needed. compare_bom returns committed-term Azure pricing with no setup beyond the binary.

The 16 tools by category

Category

Tools

Pricing

get_price, get_prices_batch, compare_prices, describe_catalog, search_pricing†, get_spot_history

FinOps

estimate_bom, estimate_unit_economics, compare_bom, get_discount_summary

Discovery

list_regions, list_instance_types, find_cheapest_region, find_available_regions

Cache

refresh_cache, cache_stats

† Compatibility stub only — not functional for live data. See opencloudcosts-go/README.md for full parameter reference.

Performance and Reliability

Concurrency — The analysis tools are not sequential HTTP wrappers:

  • find_cheapest_region and find_available_regions: errgroup + semaphore, up to 32 goroutines — queries all available regions in parallel, returns results sorted cheapest-first

  • compare_bom: 8 concurrent provider calls across AWS, GCP, and Azure simultaneously

  • compare_prices: semaphore of 10 concurrent region calls

  • get_prices_batch: parallelized across instance types within a region

Rate limiting and timeouts — Token-bucket rate limiter at 200 req/s on the HTTP transport (OCC_RATE_LIMIT). Per-request deadline: 60s (OCC_REQUEST_TIMEOUT). Per-provider API call: 30s (OCC_PROVIDER_TIMEOUT). Graceful SIGTERM drain: 15s (OCC_SHUTDOWN_TIMEOUT).

Cache — Prices are stored in a concurrent in-memory cache (read-optimised with sync.RWMutex) with atomic JSON persistence at ~/.cache/opencloudcosts/cache.json. TTLs: public prices 24h (OCC_CACHE_TTL_HOURS), region/instance metadata 7 days (OCC_METADATA_TTL_DAYS), effective/contracted rates 1h (OCC_EFFECTIVE_PRICE_TTL_HOURS). Cache survives binary updates. 401/403 responses from billing APIs are never cached, so credential rotation takes effect immediately.

AWS pricing — EC2/EBS/RDS public pricing uses a targeted SKU API path rather than downloading the full multi-GB bulk pricing file, keeping startup fast and avoiding large network payloads.

Error isolation — Raw exception text never reaches LLM context. All tool boundaries emit structured error envelopes; full tracebacks are logged server-side only. GCP contract pricing falls back to public list prices on auth failure rather than surfacing an error into the conversation.

Validated: 234/234

opencloudcosts v1.0.0 achieves 234/234 (100%) on the LLM grounding harness, with zero XML hallucinations across the full suite.

The harness covers 234 realistic pricing questions across all three clouds: instance spot checks, cross-region comparisons, BOM estimates, multi-cloud comparisons, unit economics, AI model pricing, database pricing, storage pricing, discount summaries, egress pricing, availability queries, and network pricing.

Primary validation model: qwen3.6-35b-128k running locally via llama-swap — a self-hosted 35B reasoning model with no external API dependency. The harness has also been exercised against qwen3.6-35b-a3b, qwen3.5-122b-a10b@q6_k, and gemma-4-26b-a4b. Because MCP is a protocol rather than a model feature, accuracy comes from the tool returning correct live data — any MCP-capable AI assistant calls the same tool surface and gets the same structured response.

Harness progression: 109/123 (Python v0.8.x) → 169/169 (v0.9.0) → 199/199 (v0.9.2) → 234/234 (v1.0.0).

643 Go unit tests across all providers and tools verify behavioral correctness and cross-provider API parity, independent of LLM evaluation.

Use Cases

1. Price the same workload across all three clouds at once

"Price the following on AWS, GCP, and Azure simultaneously: 4 instances (8 vCPU, 32 GB RAM), 1 managed PostgreSQL database (4 vCPU, 16 GB RAM), and 500 GB block storage. Return on-demand, 1-year committed, and 3-year committed totals for each cloud with monthly and annual figures, and flag which provider is cheapest at each commitment term."

compare_bom fans out 8 concurrent provider calls and returns a per-provider, per-term breakdown with savings analysis versus on-demand. No pricing calculator does this across cloud boundaries. AWS and Azure public pricing requires no credentials; GCP requires a free API key.


2. Find the cheapest AWS region for a long-running compute workload

"I need to run a c6a.4xlarge continuously. Fan out across all available AWS regions and return the 5 cheapest, sorted by on-demand hourly rate. Show us-east-1 as a baseline."

find_cheapest_region uses a 32-goroutine fan-out across every region where the instance type is available and returns results sorted cheapest-first. Regional price deltas for the same instance type routinely exceed 20%. No credentials needed.


3. Determine your effective AWS rate after commitments

"I have two m5.xlarge Reserved Instances (1-year, no upfront) in us-east-1 and a Compute Savings Plan covering $500/month of EC2 spend. What is my effective blended hourly rate on m5.xlarge right now, and what percentage am I saving versus on-demand?"

get_price with AWS credentials and OCC_AWS_ENABLE_COST_EXPLORER=true returns your actual post-discount rate alongside the public list price, pulling live data from Cost Explorer and Savings Plans APIs.


4. Azure serverless vs. always-on: break-even analysis

"Our batch processing job runs 1.5 million Azure Function executions per month, each consuming 512 MB for 900ms. What is the total monthly cost on the Consumption plan in West Europe, and what is the monthly cost of a Standard_D2s_v5 VM running continuously in the same region? At what monthly execution count do they break even?"

estimate_unit_economics covers the Functions path; get_price covers the VM. Azure pricing is fully public — no credentials, no API key, no subscription required.


5. Unit economics for a SaaS product

"If I run two m5.large app servers, one db.t3.medium RDS MySQL instance, and 200 GB gp3 in us-east-1, and I have 50,000 monthly active users making 1 million requests per day, what is my infrastructure cost per user and per request?"

estimate_bom prices the full stack; estimate_unit_economics computes cost per user and per request at that scale. Output is structured for direct use in a margin model or board-level cost discussion. No credentials needed.


6. AI token cost comparison: Vertex AI vs. Azure OpenAI

"We process 50 million input tokens and 8 million output tokens per month. Compare the total monthly cost of Gemini 1.5 Pro on Vertex AI versus GPT-4o and GPT-4o-mini on Azure OpenAI. Show cost per million tokens and total monthly bill for each."

get_price with domain: ai covers both providers. GCP Vertex AI and Gemini pricing requires a free GCP API key (OCC_GCP_API_KEY); Azure OpenAI pricing is fully public — no credentials needed.


Setup

Option 1 — pip (easiest, cross-platform)

The PyPI package wraps the native Go binary — no Go toolchain needed.

pip install opencloudcosts
opencloudcosts            # stdio mode (for local MCP clients)
opencloudcosts --transport http --host 0.0.0.0 --port 8080  # HTTP mode

Option 2 — Homebrew (macOS / Linux)

brew tap x7even/opencloudcosts
brew install opencloudcosts

Option 3 — binary download

Download the pre-built binary for your platform from the latest release:

# Linux (amd64)
curl -L https://github.com/x7even/cloudcostsmcp/releases/latest/download/opencloudcosts_linux_amd64.tar.gz | tar xz
./opencloudcosts

# macOS (Apple Silicon)
curl -L https://github.com/x7even/cloudcostsmcp/releases/latest/download/opencloudcosts_darwin_arm64.tar.gz | tar xz
./opencloudcosts

Option 4 — Docker / container

# Build the image first (no pre-built image is published)
cd opencloudcosts-go
docker build -t opencloudcosts:local .

# Run — HTTP transport, bound to all interfaces
docker run -p 8080:8080 \
  -e OCC_GCP_API_KEY=AIza... \
  -v ~/.aws:/root/.aws:ro \
  opencloudcosts:local

The image is ~15 MB (distroless scratch base, static binary). No credentials are required for AWS and Azure public pricing.

Option 5 — build from source

git clone https://github.com/x7even/cloudcostsmcp
cd cloudcostsmcp/opencloudcosts-go
CGO_ENABLED=0 go build -o opencloudcosts ./cmd/opencloudcosts
./opencloudcosts

Connect to Claude Code

Stdio (local process — recommended for single-user)

Add to ~/.claude/settings.json or your project's .mcp.json:

{
  "mcpServers": {
    "cloudcost": {
      "command": "opencloudcosts",
      "env": {
        "OCC_GCP_API_KEY": "AIza..."
      }
    }
  }
}

HTTP (shared/remote server — one server, many clients)

{
  "mcpServers": {
    "cloudcost": {
      "transport": "http",
      "url": "http://localhost:8080/"
    }
  }
}

Kubernetes

See deploy/kubernetes/ for manifests. Build and push your own image (see Docker section above), then reference it in deployment.yaml. Credentials are passed via environment variables or Kubernetes Secrets — same variable names as the Docker examples above.

Test with MCP Inspector

npx @modelcontextprotocol/inspector opencloudcosts

AWS Credentials

Feature

Credentials needed

Public pricing (EC2, EBS, RDS list prices)

None

Effective pricing (RI / SP discounts)

AWS credentials + OCC_AWS_ENABLE_COST_EXPLORER=true

Minimal IAM policy for public pricing:

{
  "Effect": "Allow",
  "Action": ["pricing:GetProducts", "pricing:DescribeServices", "pricing:GetAttributeValues"],
  "Resource": "*"
}

Add these for effective pricing:

"ce:GetCostAndUsage", "savingsplans:DescribeSavingsPlans", "savingsplans:DescribeSavingsPlanRates"

Configuration

All settings via environment variables (prefix OCC_) or .env file:

Variable

Default

Description

OCC_CACHE_TTL_HOURS

24

Public price cache TTL

OCC_AWS_ENABLE_COST_EXPLORER

false

Enable AWS effective pricing (costs $0.01/call)

OCC_DEFAULT_REGIONS

us-east-1,us-west-2

Default regions

AWS_PROFILE

(default chain)

AWS credentials profile

OCC_GCP_BILLING_ACCOUNT_ID

(none)

GCP billing account ID for contract/effective pricing

Caching

Prices are stored in a concurrent in-memory cache (read-optimised with sync.RWMutex) with atomic JSON persistence at ~/.cache/opencloudcosts/cache.json. Public list prices are cached for 24 hours — AWS pricing changes infrequently. Use the refresh_cache tool to force a refresh.

GCP Setup

Unlike AWS (which has public bulk pricing endpoints), GCP's pricing API always requires at least a free API key. No credit card or billing account is needed.

Option A — Free API key (recommended, 2 min setup):

  1. Go to console.cloud.google.com/apis/credentials

  2. Create a Project if you don't have one (free)

  3. Click Create Credentials → API key

  4. Set the key:

export OCC_GCP_API_KEY=AIza...

Or add OCC_GCP_API_KEY=AIza... to your .env file.

Option B — Application Default Credentials (if you already use gcloud):

gcloud auth application-default login
# or set GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json

GCP instance type format: {family}-{series}-{vcpus} e.g. n2-standard-4, e2-highmem-8, c2-standard-16

GCP Contract / Effective Pricing

If you have a negotiated pricing contract with Google Cloud, you can retrieve your actual discounted rates (EDP, custom pricing) via the Cloud Billing Pricing API v1beta. This requires:

  1. ADC credentials: gcloud auth application-default login

  2. billing.billingAccountPrice.get IAM permission on your billing account

  3. Your billing account ID:

export OCC_GCP_BILLING_ACCOUNT_ID=012345-567890-ABCDEF

With this configured, get_price responses for GCP compute will include an effective_price block showing your contract rate and discount percentage. Without it, public list prices are returned unchanged.

Azure Setup

Azure pricing is fully public — no credentials, API key, or subscription needed.

# No configuration needed — works out of the box
uv run opencloudcosts

Azure instance type format: ARM SKU names e.g. Standard_D4s_v3, Standard_E8s_v3, Standard_B2ms

Azure pricing terms: on_demand (default), reserved_1yr, reserved_3yr, spot

Azure regions: ARM region names e.g. eastus, westeurope, southeastasia (use list_regions for full list)

Azure supported services:

Domain

Service

Description

compute

vm

Virtual Machines — all families, Linux/Windows, on-demand/spot/reserved

storage

managed_disks

Premium SSD, Standard SSD, Standard HDD, Ultra Disk

storage

blob

Blob Storage

database

sql

Azure SQL Database, Azure DB for MySQL/PostgreSQL — vCore tiers, HA, reserved

database

cosmos

Cosmos DB — provisioned (per 100 RU/s), serverless, autoscale

container

aks

AKS cluster management fee (free tier or $0.10/hr Standard)

serverless

azure_functions

Functions Consumption plan — per GB-second + per execution

ai

openai

Azure OpenAI — GPT-4o, GPT-4, GPT-3.5-Turbo, o1, o1-mini, embeddings

inter_region_egress

Outbound data transfer — internet and inter-region, Zone 1 rates, 5 GB/month free

GCP pricing terms: on_demand (default), spot (preemptible), cud_1yr, cud_3yr

Security

OpenCloudCosts can access sensitive billing data when configured with cloud credentials (AWS Cost Explorer, GCP billing, Azure contract pricing). Follow these guidelines to keep that data safe.

Credential hygiene

  • Use dedicated, least-privilege credentials — read-only access scoped to pricing and billing APIs only. Never use root, owner, or admin credentials.

  • AWS: create an IAM user/role with only ce:GetCostAndUsage, pricing:GetProducts, and savingsplans:Describe* permissions.

  • Store credentials in .env (see .env.example) and never commit that file to version control.

Transport security

  • The default stdio transport is safe — the server runs as a local process with no network exposure.

  • If you use --transport http, never expose it publicly without a reverse proxy and authentication in front of it. Treat it as an internal service.

MCP client trust

  • Only add this server to MCP client configs you control.

  • Avoid running it alongside untrusted third-party MCP servers — a malicious server can craft prompts that cause the LLM to call your billing tools and relay the results.

What this server can access With credentials configured: actual spend, contract/negotiated pricing, reservation and savings plan data. Understand this before granting access in shared or multi-user environments.

Server instructions

This is the complete, verbatim Instructions string this server sends to MCP clients (from opencloudcosts-go/internal/server/server.go), reproduced here so it can be checked without reading source:

OpenCloudCosts MCP provides accurate public and effective cloud pricing data. Use it to look up compute, storage, and database pricing on AWS, GCP, and Azure; compare prices across regions and providers; estimate TCO from a Bill of Materials; and calculate unit economics. For effective/bespoke pricing (post-discount), ensure provider credentials are configured. Azure pricing requires no credentials.

That's the whole thing: a description of what the tools do and when credentials matter. It contains no directives about the model's behavior, tone, or process, and it never will. We commit to keeping these instructions minimal and strictly pricing-scoped — any future change that adds a "you must...", "always...", or other behavioral directive is a review-blocking change and should be rejected in review unless this section of the README is updated in the same PR to reflect it.

If your MCP client or harness renders instructions from multiple locally-installed servers or plugins adjacent to each other (for example, a separate SessionStart hook from an unrelated plugin), that adjacent output is not produced by this server. Compare what you see against the fenced block above — only that text originates from OpenCloudCosts MCP.

Recent releases

  • v0.9.1 ✅ GCP egress contract pricing; fix PricingResult.source Literal

  • v0.9.2 ✅ Azure OpenAI model matching fix; Azure Functions pricing fix; list_instance_types cap; 199-prompt harness suite

  • v1.0.0 ✅ Go rewrite — static binary, dual stdio/HTTP transport, 16 tools, compare_bom cross-cloud workload comparison, concurrent region fan-out (32 goroutines), Azure o1-mini SKU fix; 234/234 (100%) LLM grounding harness

  • v1.0.1 ✅ PyPI package description; CI Trusted Publisher fix; go install tag

  • v1.0.2 ✅ README accuracy fixes; cache description updated

Available Tools

15 tools
cache_statsA

Return statistics about the local pricing cache (entry counts, DB size).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It implies read-only behavior ('return statistics') but does not disclose if the call has side effects, permissions required, or if the stats are real-time. It is adequate but not comprehensive.

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?

The description is a single sentence that is concise and front-loaded, with no wasted words.

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?

Given the tool has zero parameters and an output schema exists (not provided), the description offers minimal context about the return value ('entry counts, DB size'). It is adequate for a simple stats tool but could be more informative.

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?

There are zero parameters, so the description adds no parameter information. Baseline 4 is appropriate per the rubric.

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 description clearly states the tool returns statistics about the local pricing cache, specifying 'entry counts, DB size'. The verb 'return' and resource 'local pricing cache' are precise, and it distinguishes from sibling tools like refresh_cache which modify the cache.

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?

No guidance on when or when not to use this tool. It does not mention when querying cache stats is appropriate, nor does it contrast with alternatives like 'refresh_cache'. The context must be inferred.

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

compare_pricesA

Compare pricing for any service across multiple regions.

Fetches concurrently. Returns results sorted cheapest first, with % delta between cheapest and most expensive. Optionally shows delta vs a baseline region.

Args: spec: PricingSpec dict (same as get_price). The region field is overridden per comparison — you can pass any region in the spec. regions: List of region codes to compare, e.g. ["us-east-1", "eu-west-1", "ap-northeast-1"] baseline_region: Optional region for delta comparison, e.g. "us-east-1".

ParametersJSON Schema
NameRequiredDescriptionDefault
specYes
regionsYes
baseline_regionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses concurrent fetching, sorting cheapest first, % delta inclusion, and optional baseline region comparison. This provides solid behavioral detail beyond basic read or write hints.

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?

The description is concise and well-structured: a clear purpose sentence, a behavioral note, then listed arguments. Every sentence adds value without redundancy or fluff.

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?

Given the presence of an output schema, return value details are not needed. The description covers input parameters, concurrency, sorting, delta, and baseline. It could mention potential limits (e.g., number of regions) or prerequisites, but overall it's sufficiently complete for a comparison tool.

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 compensates well. For 'spec', it explains it's a PricingSpec dict like get_price and notes region override. 'regions' is clarified with an example list. 'baseline_region' includes purpose. Meaning is added beyond the basic schema types.

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 description clearly states 'Compare pricing for any service across multiple regions' with a specific verb and resource. It distinguishes itself from siblings like get_price, get_prices_batch, and find_cheapest_region by focusing on cross-region 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?

The description implies usage when you need to compare pricing across regions, but lacks explicit guidance on when to use this tool versus alternatives such as find_cheapest_region or get_prices_batch. No when-not-to-use or exclusion criteria are provided.

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

describe_catalogA

Discover what each provider supports and how to call get_price.

  • No args → full support matrix across all configured providers.

  • provider only → all domains/services for that provider.

  • provider + domain [+ service] → targeted guidance with required_fields, supported_terms, filter_hints, and a ready-to-use example_invocation you can pass directly to get_price.

Use this before get_price when unsure of exact field names or values.

Args: provider: Cloud provider — "aws", "gcp", or "azure". Empty = all providers. domain: Domain — "compute", "storage", "database", "ai", "container", "serverless", "analytics", "network", "observability". Empty = all. service: Service — e.g. "bedrock", "rds", "gke", "bigquery". Empty = all.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNo
serviceNo
providerNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It explains that the tool returns a 'support matrix' or targeted guidance with specific fields like required_fields, supported_terms, filter_hints, and example_invocation, which is transparent and helpful.

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?

The description is concise and well-structured, using bullet points for argument combinations. Every sentence adds value, and there is no fluff.

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?

Despite no annotations, the description comprehensively covers all arguments, usage scenarios, and return values. It even mentions example_invocation, which aligns with the output schema. The tool's contextually complete given its complexity.

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

Parameters5/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 parameters. It does so effectively, listing provider values ('aws', 'gcp', 'azure'), domain examples (compute, storage, etc.), and service examples (bedrock, rds, etc.), adding meaning beyond the bare schema.

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 description clearly states the tool's purpose: 'Discover what each provider supports and how to call get_price.' It differentiates from sibling tools like get_price and search_pricing by focusing on exploration and guidance.

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?

The description provides explicit guidance: 'Use this before get_price when unsure of exact field names or values.' It also outlines behavior with different argument combinations, though it could mention when not to use (e.g., if you already know the exact fields).

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

estimate_bomA

Use this tool for total infrastructure cost, TCO, monthly spend for a multi-resource stack, or cost comparison between architectures.

Handles compute + storage + database + AI together in a single call — do NOT call get_price individually for multi-resource questions; use this tool instead.

Returns per-item and total monthly/annual costs with real public pricing data, plus a not_included list of hidden costs (egress, load balancers, NAT Gateway, monitoring, backups). IMPORTANT: if not_included is present in the response, you MUST call get_price for each listed item — using the exact command in each item's how_to_price field — before writing your final answer. Do NOT estimate or guess any cost from the not_included list.

Each item should be a PricingSpec dict PLUS a quantity field:

  • provider: "aws" | "gcp" | "azure"

  • domain: "compute" | "storage" | "database" | "ai" | ...

  • region: region code

  • quantity: number of units (default 1)

  • hours_per_month: hours/month for compute (default 730 = always-on)

  • description: optional label for this line item Plus domain-specific fields (see get_price or describe_catalog for details).

Examples: Compute + database + storage on AWS: [ {"provider": "aws", "domain": "compute", "resource_type": "m5.xlarge", "region": "us-east-1", "quantity": 3}, {"provider": "aws", "domain": "database", "service": "rds", "resource_type": "db.r6g.large", "engine": "MySQL", "deployment": "single-az", "region": "us-east-1"}, {"provider": "aws", "domain": "storage", "storage_type": "gp3", "size_gb": 500, "region": "us-east-1"} ]

Mixed cloud: [ {"provider": "gcp", "domain": "compute", "resource_type": "n1-standard-4", "region": "us-central1", "quantity": 2}, {"provider": "azure", "domain": "compute", "resource_type": "Standard_D4s_v3", "region": "eastus", "quantity": 1} ]

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

No annotations provided, but description fully discloses behavior: returns per-item and total costs, real public pricing data, and a not_included list. Also explains input format requirements.

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?

Well-structured, front-loaded with purpose and guidelines, then behavioral notes, then parameter format, then examples. Every sentence adds value; no wasted words.

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 complexity of multi-resource estimation, description covers input format, output structure, required follow-up actions, and examples. No gaps.

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

Parameters5/5

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

Schema has 0% coverage, but description completely compensates by detailing the structure of items: PricingSpec dict with provider, domain, region, quantity, hours_per_month, etc., and provides examples.

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?

Clearly states it computes total infrastructure cost, TCO, monthly spend for multi-resource stacks. Distinguishes from get_price by explicitly saying not to use get_price for multi-resource questions.

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

Usage Guidelines5/5

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

Explicitly says when to use (multi-resource stack, cost comparison) and when not to (avoid get_price individually). Also gives important post-call instructions for not_included items.

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

estimate_unit_economicsA

Estimate per-unit economics (cost per user, per request, per transaction) given a Bill of Materials and expected monthly usage volume.

Args: items: Same format as estimate_bom — list of cloud resource PricingSpec dicts plus quantity field. See estimate_bom for full item format. units_per_month: Monthly volume being measured (e.g. 10000 users) unit_label: What the unit represents — "user", "request", "transaction", etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYes
unit_labelNouser
units_per_monthYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

No annotations provided, so description holds the burden. It describes the estimation behavior and input format but does not state side effects (e.g., read-only, no modifications). As an estimation tool, likely idempotent, but not explicitly disclosed.

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?

Description is concise: a clear purpose sentence followed by parameter definitions. No redundant information, well-structured with Args section.

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?

Given 3 parameters, no annotations, and presence of output schema, description adequately covers input semantics and cross-references estimate_bom. It does not describe return values, but output schema likely handles that. Slight gap in not explaining output format.

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%, but description adds meaning: clarifies items format (PricingSpec dicts with quantity), units_per_month as monthly volume, unit_label with default 'user' and examples. This compensates well for missing schema descriptions.

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?

Description clearly states verb 'estimate' and resource 'per-unit economics', with specific examples (cost per user/request/transaction). It implies differentiation from sibling estimate_bom but does not explicitly contrast.

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?

Description indicates when to use: for per-unit cost estimation given BOM and volume. It references estimate_bom for item format but does not explain when not to use this tool versus alternatives like estimate_bom or get_price.

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

find_available_regionsA

Find all regions where a specific service/instance type is available, cheapest first.

Args: spec: PricingSpec dict (same as get_price). The region field is overridden per comparison — pass any region in the spec. regions: Region codes to check. Omit for major regions. Pass ["all"] to search every available region. baseline_region: Optional region for delta comparison.

ParametersJSON Schema
NameRequiredDescriptionDefault
specYes
regionsNo
baseline_regionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. Discloses 'cheapest first' ordering and that region in spec is overridden. Lacks mentions of rate limits, auth, or edge cases (e.g., behavior when service not found).

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?

Concise, front-loaded with main purpose. Each sentence adds value: purpose, spec reuse, region usage, baseline option. No extraneous text.

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?

Given three parameters (one required, one nested object) and an output schema, description covers key aspects. Does not explain output schema structure but that is handled by schema itself. Suffers slightly from missing explicit sibling usage guidance.

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%, but description compensates by explaining spec as 'same as get_price' and region override, regions parameter usage, and baseline_region purpose. Could further detail spec structure, but references get_price as baseline.

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?

Clearly states 'Find all regions where a specific service/instance type is available, cheapest first.' Uses specific verb-resource pair and ordering, differentiating from siblings like find_cheapest_region (which returns only the cheapest) and compare_prices.

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?

Provides explicit guidance on spec parameter (same as get_price, region overridden) and regions parameter (omit for major, 'all' for full scan). Mentions baseline_region for delta comparison. Missing explicit differentiation from siblings like find_cheapest_region or compare_prices.

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

find_cheapest_regionA

Find the cheapest region for any cloud service.

Queries pricing concurrently across regions and returns results sorted cheapest first, with the price delta between cheapest and most expensive regions.

Args: spec: PricingSpec dict (same as get_price). The region field is overridden for each comparison — pass any region in the spec. regions: List of region codes to compare. Omit for major regions (faster). Pass ["all"] to search every available region (slow on first run without cache). baseline_region: Optional region for delta comparison, e.g. "us-east-1".

ParametersJSON Schema
NameRequiredDescriptionDefault
specYes
regionsNo
baseline_regionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses that pricing is queried concurrently, results are sorted cheapest first, and a delta is calculated. It also notes that the region field in the spec is overridden. However, it does not mention idempotency, rate limits, or caching behavior (though cache_stats sibling suggests caching exists).

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 description is moderately sized, starting with a clear title line, then a brief explanation, followed by an Args section with bullet points. It is front-loaded with the main purpose. A few words could be trimmed, but overall it is efficient and well-structured.

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?

Although an output schema exists (context signal), the description mentions only that results are sorted cheapeast first with a price delta. It lacks details about the output structure, formats, or edge cases. Given the complexity of nested input and 0% schema coverage, the description could be more complete about caching and performance implications.

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%, but the description explains each parameter: spec is a PricingSpec dict (same as get_price) with region overridden; regions can be omitted, a list, or ['all'] with speed implications; baseline_region is optional for delta. The spec parameter is not detailed but references get_price, which is acceptable.

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 description clearly states the tool's purpose: 'Find the cheapest region for any cloud service.' It specifies the verb 'find' and the resource 'cheapest region', and explains concurrent querying and sorting behavior. The purpose is distinct from siblings like get_price, compare_prices, and find_available_regions.

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?

The description provides usage guidance: 'Omit for major regions (faster). Pass ["all"] to search every available region' and mentions baseline_region for delta comparison. It implies when to use each parameter variant, but does not explicitly state when not to use this tool or provide alternatives among siblings.

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

get_discount_summaryA

Return a summary of all active cloud discounts for the authenticated account.

For AWS: active Savings Plans (type, commitment $/hr, utilization %) and active Reserved Instances (instance type, count, payment type, days remaining), plus Cost Explorer utilization for the previous month.

Requires credentials and OCC_AWS_ENABLE_COST_EXPLORER=true for AWS.

Args: provider: Cloud provider — "aws" (GCP CUD support coming later)

ParametersJSON Schema
NameRequiredDescriptionDefault
providerNoaws

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It mentions that credentials and a specific environment variable are required. However, it does not state whether the operation is read-only, idempotent, or any rate limits. The description is adequate but could be more explicit about safety.

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 description is concise at three sentences plus a bullet-like line. The main purpose is front-loaded. The structure could be improved by separating theArgs line more clearly, but overall it is efficient and readable.

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 need not detail return values. It already lists what is returned for AWS. The tool has one optional parameter, and the description covers the prerequisite. This is sufficient for an agent to invoke correctly.

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?

The schema has one string parameter 'provider' with a default and no description. The description adds value by specifying that only 'aws' is valid now and mentioning future GCP support. This clarifies the parameter's allowed values beyond the schema.

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 description clearly states it returns a summary of active cloud discounts, specifying AWS details (Savings Plans, Reserved Instances, Cost Explorer). The verb 'Return a summary' and resource 'active cloud discounts' are specific and distinguishable from sibling tools, none of which cover discounts.

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?

The description explicitly mentions prerequisites: credentials and the environment variable OCC_AWS_ENABLE_COST_EXPLORER=true for AWS. It also notes that only AWS is currently supported, implying when not to use for other providers. However, it does not explicitly state alternatives or when not to use this tool.

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

get_priceA

Unified pricing tool — returns public catalog rates plus contracted/effective prices where credentials are available.

Pass a spec dict with at minimum: provider, domain, region. Domain-specific required fields (call describe_catalog for the complete list):

COMPUTE : resource_type ("m5.xlarge" / "n1-standard-4" / "Standard_D4s_v3") os ("Linux" or "Windows"), term ("on_demand"/"spot"/"cud_1yr") Fargate: vcpu (e.g. 2.0), memory_gb (e.g. 4.0), service="fargate" STORAGE : storage_type ("gp3"/"standard"/"nearline"/"premium-ssd") DATABASE : resource_type ("db.r5.large"/"db-n1-standard-4"), engine ("MySQL"), deployment ("single-az"/"ha"/"multi-az"), service ("rds"/"cloud_sql"/"memorystore") AI : model ("claude-3-5-sonnet"/"gemini-1.5-flash"), service ("bedrock"/"gemini"/"vertex"), input_tokens, output_tokens | machine_type + task for Vertex CONTAINER: service ("gke"/"eks"), mode ("standard"/"autopilot"), node_count, vcpu, memory_gb ANALYTICS: service ("bigquery"), query_tb, active_storage_gb, longterm_storage_gb, streaming_gb NETWORK : service ("cloud_lb"/"cloud_cdn"/"cloud_nat"/"cloud_armor"), lb_type, rule_count, data_gb, gateway_count, egress_gb, policy_count OBSERVABILITY: service ("cloudwatch"/"cloud_monitoring"), ingestion_mib, log_gb INTER_REGION_EGRESS: source_region, dest_region (empty = internet), data_gb Example: {"provider": "aws", "domain": "inter_region_egress", "source_region": "us-east-1", "dest_region": "eu-west-1"}

Returns public_prices[] always. When auth exists: contracted_prices[], effective_price, auth_available=true.

Call describe_catalog(provider, domain, service) for an example_invocation you can copy directly into this tool.

Args: spec: PricingSpec dict — see field descriptions above.

Examples: {"provider": "aws", "domain": "compute", "resource_type": "m5.xlarge", "region": "us-east-1"} {"provider": "aws", "domain": "ai", "service": "bedrock", "model": "claude-3-5-sonnet", "region": "us-east-1", "input_tokens": 1000000, "output_tokens": 1000000} {"provider": "gcp", "domain": "compute", "resource_type": "n1-standard-4", "region": "us-central1", "term": "cud_1yr"} {"provider": "gcp", "domain": "analytics", "service": "bigquery", "query_tb": 10.0, "active_storage_gb": 500.0, "region": "us"} {"provider": "azure", "domain": "compute", "resource_type": "Standard_D4s_v3", "region": "eastus"} {"provider": "aws", "domain": "database", "service": "rds", "resource_type": "db.r5.large", "engine": "MySQL", "deployment": "single-az", "region": "us-east-1"}

ParametersJSON Schema
NameRequiredDescriptionDefault
specYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It describes the return values (public_prices[] always, contracted_prices[], effective_price, auth_available=true when auth exists) but does not mention side effects, rate limits, error handling, or other behaviors. It is partially transparent but lacks depth.

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 description is lengthy but well-organized with sections for each domain and bullet-style field requirements. It includes multiple examples. While it could be slightly more concise, the complexity of the tool justifies the length, and the structure aids readability.

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 the tool's complexity and the existence of an output schema (so return details need not be in description), the description is thorough. It covers all domains, references a sibling tool (describe_catalog) for additional guidance, and provides concrete examples that an agent can copy. The context is sufficient for correct invocation.

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

Parameters5/5

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

The input schema defines only a generic spec object with additionalProperties: true, providing zero semantic guidance. The description compensates fully by detailing domain-specific required fields (e.g., for COMPUTE, STORAGE, DATABASE, AI, etc.) with concrete key-value pairs and examples, massively adding value beyond the schema.

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 description clearly defines get_price as a unified pricing tool that returns public catalog rates and contracted/effective prices. It distinguishes itself from sibling tools like compare_prices and find_cheapest_region by focusing on precise pricing for specific configurations and requiring a spec dict with provider, domain, and region.

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?

The description explicitly states minimum required fields (provider, domain, region) and that domain-specific fields are needed, directing users to describe_catalog for the complete list. It provides multiple examples. However, it does not explicitly state when not to use this tool versus alternatives, though the examples and context imply its specific purpose.

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

get_prices_batchA

Get prices for multiple compute instance types in a single region in one call.

Fetches all prices concurrently. Useful for comparing a shortlist of candidate instance types (e.g. m5.xlarge vs c5.xlarge vs r5.xlarge) without separate calls.

Args: provider: Cloud provider — "aws", "gcp", or "azure" instance_types: List of instance types, e.g. ["m5.xlarge", "c5.xlarge", "r5.large"] region: Region code, e.g. "us-east-1" or "us-central1" os: Operating system — "Linux" (default) or "Windows" term: Pricing term — "on_demand" (default), "spot", "reserved_1yr", "cud_1yr"

ParametersJSON Schema
NameRequiredDescriptionDefault
osNoLinux
termNoon_demand
regionYes
providerYes
instance_typesYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It mentions 'fetches all prices concurrently', which is a useful behavioral trait. However, it does not disclose response format, error handling, rate limits, or authentication needs.

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 description is well-structured with an introductory sentence, a use-case sentence, and a clear Args list. It is front-loaded with the purpose. The Args section adds length, but each line is earned.

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?

Given the tool has 5 parameters (3 required), an output schema, and sibling tools, the description covers the input semantics and use case well. However, it lacks details on handling partial failures, pagination, or response structure beyond what the output schema provides.

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

Parameters5/5

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

Schema description coverage is 0%, but the description includes a detailed Args section explaining each parameter (provider, instance_types, region, os, term) with examples and defaults, adding significant meaning beyond the raw schema.

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 description uses specific verbs and resources: 'Get prices for multiple compute instance types in a single region'. It clearly distinguishes from sibling tools like 'get_price' (single instance) and 'compare_prices' (likely cross-provider comparison).

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?

The description states it's 'useful for comparing a shortlist of candidate instance types' and that it 'fetches all prices concurrently' to avoid separate calls. While it gives clear context, it does not explicitly state when not to use it or name alternatives beyond implication.

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

get_spot_historyA

Get spot price history and stability analysis for a compute instance type.

Returns per-AZ spot price statistics (current, min, max, avg, sample count), overall volatility ratio, a stability label, and an actionable recommendation. Currently supported by AWS (requires credentials). GCP and Azure return not_supported.

Args: spec: PricingSpec dict with domain="compute", resource_type (instance type), region. Example: {"provider": "aws", "domain": "compute", "resource_type": "m5.xlarge", "region": "us-east-1"} hours: Lookback window in hours (default 24, max 720) availability_zone: Filter to a specific AZ, e.g. "us-east-1a". Empty = all AZs (AWS only).

ParametersJSON Schema
NameRequiredDescriptionDefault
specYes
hoursNo
availability_zoneNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, description discloses provider-specific behavior and return structure. It could mention read-only nature but is otherwise transparent about supported providers and 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?

Concise and well-structured: purpose first, then returns, then provider support, then parameters with examples. Every sentence adds value.

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?

Comprehensive given output schema exists. Summarizes returns (per-AZ stats, volatility, stability, recommendation) and provider constraints. No missing critical information.

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

Parameters5/5

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

Adds significant meaning beyond the schema: explains spec as PricingSpec dict with example, hours as lookback with default/max, availability_zone as filter. Schema coverage 0% so description is essential.

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 description clearly states the tool gets spot price history and stability analysis for a compute instance type, listing specific return values. This distinguishes it from sibling tools that focus on on-demand pricing or other aspects.

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?

Provides context on provider support (AWS requires credentials, GCP/Azure return not_supported), guiding when to use. Does not explicitly contrast with alternatives but implies use for spot pricing.

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

list_instance_typesA

List available compute instance types in a region, with optional filters.

Useful for discovering what instances are available before fetching pricing, or for finding instances that meet specific vCPU/memory/GPU requirements.

Args: provider: Cloud provider — "aws", "gcp", or "azure" region: Region code, e.g. "us-east-1" (AWS), "us-central1" (GCP), "eastus" (Azure) family: Optional instance family prefix, e.g. "m5", "c6g" (AWS), "n2", "c2" (GCP), or "Standard_D", "Standard_E" (Azure) min_vcpu: Filter to instances with at least this many vCPUs. min_memory_gb: Filter to instances with at least this much memory (GB). gpu: If true, only return GPU instances max_results: Maximum number of results (default 50)

ParametersJSON Schema
NameRequiredDescriptionDefault
gpuNo
familyNo
regionYes
min_vcpuNo
providerYes
max_resultsNo
min_memory_gbNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations provided, but the description clearly indicates a read-only list operation with filtering. Does not mention side effects or return format, but output schema exists to cover return structure.

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?

Concise description with front-loaded purpose and structured Args section. Every sentence adds value with no redundancy.

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?

Covers purpose, usage, and parameters well. Could mention default values or behavior of max_results, but it is already documented. Good overall for a 7-parameter tool with output schema.

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

Parameters5/5

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

Schema has 0% description coverage, but the description thoroughly explains each parameter with examples and usage context, adding significant value beyond the property titles.

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?

Clear verb 'List' and resource 'compute instance types' with optional filters. Distinguishes from sibling tools like compare_prices and search_pricing by focusing on instance type discovery.

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?

Explicitly states the tool is useful for discovering instances before fetching pricing or for meeting specific requirements. Could be improved by explicitly stating when not to use it, but the context provides sibling alternatives.

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

list_regionsB

List all regions where a cloud service is available for the given provider.

Args: provider: Cloud provider — "aws", "gcp", or "azure" domain: Domain filter — "compute" (default), "storage", "database"

ParametersJSON Schema
NameRequiredDescriptionDefault
domainNocompute
providerYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It only states the core purpose without mentioning authentication, rate limits, or whether results are paginated.

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?

The description is very concise: one sentence for purpose followed by clear arg definitions. No redundant information.

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?

The description is adequate for a simple tool but lacks details on what 'available' means and how it relates to sibling tools. Output schema exists but return values are not described.

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 adds meaningful parameter explanations (provider: aws/gcp/azure, domain: compute/storage/database) that compensate for the schema's lack of descriptions.

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 clearly states the tool lists regions for a given provider. However, it does not explicitly differentiate from sibling tools like find_available_regions.

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?

No guidance on when to use this tool versus siblings like find_available_regions or find_cheapest_region. No conditions or exclusions are provided.

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

refresh_cacheA

Invalidate the pricing cache to force fresh data on next request.

Args: provider: Provider to clear ("aws", "gcp", "azure"), or empty string to purge expired entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
providerNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It mentions invalidation but lacks details on whether the operation is reversible, the scope of cache cleared (all or per provider), and what 'expired entries' means. More context is needed for a destructive operation.

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?

The description is extremely concise: two sentences covering purpose and parameter usage. No superfluous content; every sentence earns its place.

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?

Given the low complexity (1 parameter) and presence of an output schema, the description is adequate but could benefit from clarifying that the effect is immediate and affects subsequent queries. Otherwise, it sufficiently covers the tool's functionality.

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 adds value by specifying valid provider values ('aws', 'gcp', 'azure') and the behavior for an empty string (purge expired entries). This goes beyond the schema, which only defines type and default.

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 description clearly states the tool invalidates the pricing cache to force fresh data on next request. The verb 'invalidate' and resource 'pricing cache' are specific, and it distinguishes from siblings like 'cache_stats' which likely shows cache status.

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 description implies usage when fresh pricing data is needed but does not provide explicit guidance on when to use vs alternatives, such as checking cache age via 'cache_stats' first. It also lacks scenarios where this tool should not be used.

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

search_pricingA

Free-text search across the pricing catalog.

Useful for exploring what SKUs are available for a service before calling get_price, or for finding pricing for services not yet covered by a specific domain.

Args: provider: Cloud provider — "aws", "gcp", or "azure" query: Search string, e.g. "NAT gateway", "CloudWatch metrics", "Lambda duration" domain: Optional domain filter — "compute", "storage", "database", etc. region: Optional region filter max_results: Maximum results to return (default 20)

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
domainNo
regionNo
providerYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It describes a search operation, which implies read-only and non-destructive behavior. However, it does not explicitly state safety or side-effect guarantees, but the nature of search is clear.

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?

The description is concise with a brief introductory sentence followed by a clear bullet list of parameters. Every sentence adds value and is well-structured for quick comprehension.

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 the 5 parameters and no schema descriptions, the description covers all parameters and provides usage context. It references an output schema (though not shown), so return values need not be explained. Complete for a search tool with good sibling differentiation.

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

Parameters5/5

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

Schema description coverage is 0%, but the description adds meaning by explaining each parameter: provider (with example values), query (with examples), domain, region, and max_results (with default). This compensates fully for the missing schema descriptions.

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 description clearly states it's a free-text search across the pricing catalog, distinguishes itself from get_price by noting it's useful before calling that tool, and provides examples. This differentiates it from siblings like compare_prices or get_price.

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

Usage Guidelines5/5

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

Explicitly says when to use: for exploring SKUs before get_price or for services not covered by a specific domain. Implicitly suggests not for exact price lookups (handled by get_price). Provides clear context with sibling references.

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. Dates show when Glama detected each change.

  1. 15 tool updatesv0.1.0
    • First observedcache_stats
    • First observedcompare_prices
    • First observeddescribe_catalog
    • First observedestimate_bom
    • First observedestimate_unit_economics
    • First observedfind_available_regions
    • First observedfind_cheapest_region
    • First observedget_discount_summary
    • First observedget_price
    • First observedget_prices_batch
    • First observedget_spot_history
    • First observedlist_instance_types
    • First observedlist_regions
    • First observedrefresh_cache
    • First observedsearch_pricing

TDQS

A4.2/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose. While several tools deal with pricing (get_price, compare_prices, find_cheapest_region, etc.), their specific functions are well-defined and non-overlapping, preventing confusion.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case (e.g., compare_prices, describe_catalog, list_instance_types). The naming is predictable and clear, with only minor stylistic variations (get vs list) that are standard.

Tool Count5/5

15 tools is appropriate for a cloud cost server. The set covers core queries, comparisons, batch operations, catalog discovery, and utilities without being overwhelming. Each tool serves a clear purpose and earns its place.

Completeness5/5

The tool surface is comprehensive for cloud pricing: single and batch price queries, region comparison, instance type discovery, catalog help, unit economics, BOM estimation, and spot history. It covers the full lifecycle of pricing analysis with no obvious gaps.

Maintenance

ActivitySlowing
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Global price benchmarking for AI inference across 2,600+ SKUs from 47 vendors. Query live pricing, market indexes, and model specs via 8 tools. Free tier available.
    8
    103
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to parse multi-cloud infrastructure-as-code files, query real-time pricing from AWS, Azure, and GCP, and generate cost estimates and comparison reports.
    39
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Live LLM API pricing: current token prices, model comparisons, cheapest-model lookups, and The LLM Price Index for 150+ models across 20+ providers, re-verified daily. No API key required.
    5
    1
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/x7even/cloudcostsmcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server