Skip to main content
Glama

Stay, optimise or switch

evaluate_change
Read-only

When something changes (bill too high, growth, a missing feature such as SSO, a renewal), compare staying on the current plan, optimising with the same vendor, and switching vendor, including one-off switching cost and the month switching pays off. Example: {"category":"auth","current":{"vendor_id":"clerk","plan_id":"pro"},"mau_now":11000,"monthly_growth":0.18,"requirements":[{"capability":"auth.saml_sso"}]}. When a migration playbook covers the move (Netlify to DigitalOcean App Platform so far) and switching.hours is left out, the switching cost uses its effort range, not a flat 40 hours; plan_migration gives the full plan. How to present the result: show stay, optimise and switch side by side with cumulative cost at each month given, the break-even month and any problems; show every caveat word for word.

Input Schema

NameRequiredDescriptionDefault
seatsNoTeam members on per-seat plans. Default 1.
monthsNo
currentYes
founderNoOptional company details used only to find startup perks.
mau_nowYes
categoryYes
per_userNoUsage per active user a month, e.g. {"sms": 2, "file_storage_gb": 0.2, "ai_input_ktok": 30}. Replaces the profile and the filled-in defaults for those units; a plan's questions say which unit each answer sets. Units: mau, seat, request_million, bandwidth_gb, db_storage_gb, egress_gb, email, event, error_event, compute_hour, revenue_usd, transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write, ci_hour, file_storage_gb, file_egress_gb, file_write, file_read, video_min_stored, video_min_delivered, sms, job_run, search_request, search_record.
switch_toNoEvaluate a specific vendor instead of the best-ranked alternative.
switchingNo
per_1k_mauNoOverride usage per 1,000 MAU. Units: mau, seat, request_million, bandwidth_gb, db_storage_gb, egress_gb, email, event, error_event, compute_hour, revenue_usd, transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write, ci_hour, file_storage_gb, file_egress_gb, file_write, file_read, video_min_stored, video_min_delivered, sms, job_run, search_request, search_record.
profile_idNoUsage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile.
requirementsNo
monthly_growthNo
migration_featuresNoFeatures of the current host the app uses (feature ids from plan_migration or detect_stack's netlify_features), so a migration playbook prices the work. Leave switching.hours out to use them.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescriptionDefault
dataYesThe tool result. Its shape depends on the tool.
staleYes
caveatsYesShow to the user word for word.
sourcesYes
confidenceYes
assumptionsYesUsage and pricing assumptions behind the numbers.
disclosuresYesAlways includes the neutrality note: no vendor pays for a place in the answer. Link its url when you mention how Kong Reviews is paid.
generated_atYes
engine_versionYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changed
    • changedInput schema / properties / category / enum
      Previous value: -[
      -  "hosting",
      -  "database",
      -  "auth",
      -  "email",
      -  "payments",
      -  "observability",
      -  "ai",
      -  "edge",
      -  "app_store",
      -  "coding"
      -]New value: +[
      +  "hosting",
      +  "database",
      +  "auth",
      +  "email",
      +  "payments",
      +  "observability",
      +  "ai",
      +  "edge",
      +  "app_store",
      +  "coding",
      +  "storage",
      +  "video",
      +  "sms",
      +  "push",
      +  "jobs",
      +  "search"
      +]
    • addedInput schema / properties / migration_features
      Added value: +{
      +  "description": "Features of the current host the app uses (feature ids from plan_migration or detect_stack's netlify_features), so a migration playbook prices the work. Leave switching.hours out to use them.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 30,
      +  "type": "array"
      +}
    • changedInput schema / properties / per_1k_mau / description
      Previous value: -"Override usage per 1,000 MAU. Units: mau, seat, request_million, bandwidth_gb, db_storage_gb, egress_gb, email, event, error_event, compute_hour, revenue_usd, transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write, ci_hour."New value: +"Override usage per 1,000 MAU. Units: mau, seat, request_million, bandwidth_gb, db_storage_gb, egress_gb, email, event, error_event, compute_hour, revenue_usd, transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write, ci_hour, file_storage_gb, file_egress_gb, file_write, file_read, video_min_stored, video_min_delivered, sms, job_run, search_request, search_record."
    • addedInput schema / properties / per_1k_mau / properties / file_egress_gb
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / file_read
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / file_storage_gb
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / file_write
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / job_run
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / search_record
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / search_request
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / sms
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / video_min_delivered
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_1k_mau / properties / video_min_stored
      Added value: +{
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / per_user
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Usage per active user a month, e.g. {\"sms\": 2, \"file_storage_gb\": 0.2, \"ai_input_ktok\": 30}. Replaces the profile and the filled-in defaults for those units; a plan's questions say which unit each answer sets. Units: mau, seat, request_million, bandwidth_gb, db_storage_gb, egress_gb, email, event, error_event, compute_hour, revenue_usd, transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write, ci_hour, file_storage_gb, file_egress_gb, file_write, file_read, video_min_stored, video_min_delivered, sms, job_run, search_request, search_record.",
      +  "properties": {
      +    "ai_input_ktok": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "ai_output_ktok": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "bandwidth_gb": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "ci_hour": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "compute_hour": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "db_storage_gb": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "egress_gb": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "email": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "error_event": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "event": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "file_egress_gb": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "file_read": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "file_storage_gb": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "file_write": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "job_run": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "kv_read": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "kv_write": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "mau": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "request_million": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "revenue_usd": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "search_record": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "search_request": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "seat": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "sms": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "transaction": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "video_min_delivered": {
      +      "minimum": 0,
      +      "type": "number"
      +    },
      +    "video_min_stored": {
      +      "minimum": 0,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • changedInput schema / properties / requirements / items / properties / categories / items / enum
      Previous value: -[
      -  "hosting",
      -  "database",
      -  "auth",
      -  "email",
      -  "payments",
      -  "observability",
      -  "ai",
      -  "edge",
      -  "app_store",
      -  "coding"
      -]New value: +[
      +  "hosting",
      +  "database",
      +  "auth",
      +  "email",
      +  "payments",
      +  "observability",
      +  "ai",
      +  "edge",
      +  "app_store",
      +  "coding",
      +  "storage",
      +  "video",
      +  "sms",
      +  "push",
      +  "jobs",
      +  "search"
      +]
    • addedOutput schema / properties / disclosures / description
      Added value: +"Always includes the neutrality note: no vendor pays for a place in the answer. Link its url when you mention how Kong Reviews is paid."
  2. Changed3 schema fields changed
    • changedInput schema / properties / category / enum
      Previous value: -[
      -  "hosting",
      -  "database",
      -  "auth",
      -  "email",
      -  "payments",
      -  "observability",
      -  "ai",
      -  "edge",
      -  "app_store"
      -]New value: +[
      +  "hosting",
      +  "database",
      +  "auth",
      +  "email",
      +  "payments",
      +  "observability",
      +  "ai",
      +  "edge",
      +  "app_store",
      +  "coding"
      +]
    • changedInput schema / properties / profile_id / description
      Previous value: -"Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site."New value: +"Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile."
    • changedInput schema / properties / requirements / items / properties / categories / items / enum
      Previous value: -[
      -  "hosting",
      -  "database",
      -  "auth",
      -  "email",
      -  "payments",
      -  "observability",
      -  "ai",
      -  "edge",
      -  "app_store"
      -]New value: +[
      +  "hosting",
      +  "database",
      +  "auth",
      +  "email",
      +  "payments",
      +  "observability",
      +  "ai",
      +  "edge",
      +  "app_store",
      +  "coding"
      +]
  3. First observed

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare a safe read (readOnlyHint true, openWorldHint false), so the bar is lowered. The description still adds real behaviour: if a migration playbook covers the move and switching.hours is omitted, the switching cost uses the playbook's effort range rather than a flat 40 hours, and caveats must be reproduced word for word. A short note on what the output contains beyond the schema would push this higher.

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?

It leads with the trigger and the comparison, then the example, then the playbook caveat, then presentation rules, in a sensible order. Sentences are dense but each carries information. The presentation block is slightly long relative to the rest, but it earns its place by specifying output handling that the output schema does not cover.

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?

The output schema exists, so return values need not be described, and the description still covers the non-obvious behaviour of switching cost estimation. What is missing is guidance on precedence among the overlapping usage inputs (per_user, per_1k_mau, profile_id) for a 16-parameter tool, which an agent could easily get wrong.

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 56%, so some parameter work remains for the description. It usefully explains the interaction between migration_features, the playbook, and switching.hours, and its example shows category, current, mau_now, monthly_growth and requirements in context. Fault lines remain: with 16 parameters, the description says nothing about when to use per_user vs per_1k_mau vs profile_id, and nothing about what months or switch_to change in the result.

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 states a specific verb and resource: compare staying, optimising with the same vendor, and switching vendor, complete with one-off switching cost and payback month. That is far more specific than the title alone. It does not name its nearest siblings (compare_vendors, estimate_cost, recommend_stack), so an agent still has to infer the boundary between this and those tools.

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

Usage Guidelines4/5

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

It gives concrete trigger conditions: bill too high, growth, a missing feature such as SSO, or a renewal. Those are usable cues for when to reach for this tool. It does not say when not to use it, nor does it name the tool to use instead for adjacent questions such as raw cost comparison.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources