Skip to main content
Glama

Server Details

Pick a tech stack from a PRD and see what it costs now and at scale, after startup perks.

The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.

If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.

Status
Unhealthy
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.6/5.0

Scored across 29 tools

Disambiguation3/5

Several clusters overlap heavily: recommend_stack, plan_stack, audit_stack, compare_architectures and extract_requirements all produce or feed stack recommendations, and get_pricing, estimate_cost, compare_vendors and find_cost_cliffs all answer 'what does vendor X cost'. The descriptions do explicitly route between them (recommend_stack says 'start here', plan_stack says 'use recommend_stack instead when you only have a plain-language description'), so an agent can resolve the conflict, but only by reading long guidance text. Boundaries like plan_stack vs project_stack and check_build vs get_build_pack remain fuzzier than ideal.

Naming Consistency5/5

Every one of the 29 names is snake_case with a leading verb (list_, get_, check_, compare_, plan_, find_, delete_, update_), and nouns are reused consistently (stack, saved_stack, vendors, capabilities). No camelCase or vague one-word names anywhere.

Tool Count2/5

29 tools is above the comfortable ceiling, and the surface is split by narrow variations rather than distinct capabilities (four pricing tools, four stack-recommendation tools, three saved-stack mutation tools). Several could be merged or folded into parameters, which would cut selection errors substantially.

Completeness4/5

Coverage is genuinely broad: catalogue discovery (list_vendors, search_directory, get_pricing), recommendation/planning, audit and drift detection, cost projection and cliffs, migration planning, build packs, saved-stack lifecycle, billing reconciliation and account deletion. Gaps are minor — there is no way to update or annotate catalogue data and no single-item lookup for showcase products, but agents can work around these via search_showcase and the share URLs.

Available Tools

29 tools
audit_stackAudit an existing stackA
Read-only
Inspect

Assess the stack an existing app runs on and recommend what to do. For each service: its plan, cost now and in 12 months, must-haves it lacks, cost jumps in the next year, lock-in, and a verdict (keep, watch, optimise, switch or fix) with savings, one-off moving cost and the month a switch pays off. Then a scorecard (cost, requirements, ready to scale, lock-in; A to F, weighted by priorities 0-3) and recommendations ranked by what the user cares about. Categories the requirements need but nothing covers are suggested too. Use the vendor ids from detect_stack; pass plan_id when the user knows their plan (otherwise the cheapest that serves today's users is assumed and said so). How to present: lead with the summary and overall grade, then the ranked recommendations with savings or added cost, then the scorecard; show every caveat and assumption word for word.

NameRequiredDescriptionDefault
stackYes
founderNoOptional company details used only to find startup perks.
mau_nowYes
unpricedNoServices detect_stack found that the catalogue can't price (its "unknown" list).
switchingNo
prioritiesNoHow much each criterion matters, 0 (not at all) to 3 (most). Defaults: cost 3, requirements 3, scale 2, lock_in 1.
profile_idNoUsage profile, e.g. b2b_saas, consumer_app, booking_marketplace, content_site, ios_on_device.
mau_forecastNoMonthly active users expected in 12 months.
requirementsNo
budget_monthly_usdNo
revenue_per_mau_usdNo

Output Schema

NameRequiredDescription
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

TDQS

A4.3/5.0
Behavior5/5

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

The description adds substantial behavioral context beyond the readOnlyHint=true and openWorldHint=false annotations. It explains per-service outputs, assumptions when plan_id is missing, verdict categories, savings, moving costs, payback month, scorecard weighting, and presentation instructions including showing caveats verbatim.

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 front-loaded with a clear purpose sentence and then adds output, usage, and presentation details. It is dense and long, but nearly every sentence contributes to calling or presenting the tool correctly.

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

Completeness4/5

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

For a complex 11-parameter analysis tool with an output schema, the description is behaviorally rich and explains assumptions and presentation. It is not fully complete on input parameter semantics, but the output schema and existing schema descriptions reduce that burden.

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 45% across 11 parameters, so the description must compensate. It adds useful semantics for plan_id fallback, vendor_id sourcing from detect_stack, and priorities weighting, but leaves many parameters such as mau_now, switching, budget_monthly_usd, revenue_per_mau_usd, profile_id, and unpriced largely unexplained.

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 a specific verb and resource: assess an existing app's stack and recommend actions. It clearly distinguishes the tool from detect_stack by saying to use vendor ids from detect_stack, and it names the concrete outputs (verdicts, scorecard, ranked recommendations).

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 clear context for use: existing apps, after detect_stack, with optional plan_id when the user knows their plan. It does not explicitly state when not to use it versus siblings like evaluate_change or diff_stack, but the workflow guidance is strong.

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

check_buildCheck a repo against its saved planA
Idempotent
Inspect

Link the GitHub repo a saved plan is being built in, and check it: detect_stack reads the repo and each planned service is marked found or not found yet (normal while building), services the repo uses that the plan doesn't are listed as drift, and when every planned service is found the plan is marked built. Pass id (a saved plan from list_saved_stacks) and repo the first time; after that, id alone checks the linked repo again. Private repos need the Kong Reviews GitHub App on that repo. How to present: say whether it is built; list what is not found yet as the next setup steps (from get_build_pack); for each drift service, ask the user whether to keep it (price it with diff_stack, or re-plan) or take it out of the code. Needs sign-in.

NameRequiredDescriptionDefault
idYesA saved plan id from list_saved_stacks.
repoNoGitHub repo: owner/name or its github.com address. Links it to the plan, replacing any linked before.

Output Schema

NameRequiredDescription
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

TDQS

A4.8/5.0
Behavior5/5

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

Annotations establish this is a non-read-only, open-world, idempotent, non-destructive operation. The description adds useful context beyond annotations: it explains that linking a repo can replace a prior linked repo, that private repos require the GitHub Reviews App, that sign-in is needed, and that repeated id-only calls recheck the same repo.

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 front-loaded and every part serves a purpose, including presentation guidance. However, the opening sentence is a long run-on that packs several behaviors together and could be easier to scan if broken into shorter statements.

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 presence of an output schema, the description does not need to explain return values. It covers the key operational context an agent needs: linking behavior, auth requirements, drift handling, and how to present results.

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 100%, so the baseline is 3. The description adds meaningful parameter workflow semantics: repo is needed the first time, id alone is enough afterward, and id comes from list_saved_stacks.

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 states a specific verb and resource: link a GitHub repo to a saved plan and check it. It then names the concrete outcomes—found/not-found services, drift, and plan-built status—so the agent can distinguish it from siblings like detect_stack and diff_stack.

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?

It explicitly explains the first call (pass id and repo) and subsequent calls (id alone rechecks the linked repo). It also gives handling guidance for drift and not-found services, including using get_build_pack and diff_stack, and notes sign-in and GitHub App requirements for private repos.

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

check_fitCheck requirement fitB
Read-only
Inspect

For each vendor, show whether each requirement is met on its cheapest plan, needs a higher tier (with that tier's cost), or is missing.

NameRequiredDescriptionDefault
mauNo
seatsNoTeam members on per-seat plans. Default 1.
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.
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.
vendor_idsYes
requirementsYes
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description still adds real value by disclosing the evaluation model: fit is assessed starting at each vendor's cheapest plan, and an upgrade result carries the higher tier's cost — telling the agent how the answer is derived, not just what comes back.

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

Conciseness4/5

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

A single front-loaded sentence with no filler; the outcome categories are enumerated compactly. It is efficient, though its brevity comes at the cost of context rather than being the optimal size for a 9-parameter pricing tool.

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?

With an output schema present, return-shape explanation is not required, and the description covers the core concept plus the cheapest-plan baseline. Missing for a tool this complex: that requirements must be capability ids from list_capabilities, how the usage profile/defaults drive tier qualification, and how it relates to sibling tools — meaningful gaps but not fatal given a rich input schema.

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

Parameters3/5

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

Schema coverage is 67% with rich nested descriptions for per_user, per_1k_mau, profile_id, seats and payments fields, so the schema does most of the work. The description only echoes 'each vendor' (vendor_ids) and 'each requirement' (requirements) and adds no syntax or defaults beyond that; a 3 baseline is appropriate at mid coverage.

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

Purpose4/5

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

States a specific verb and resource: for each vendor, evaluate whether each requirement is met on its cheapest plan, requires an upgrade (with cost), or is missing. That is concrete enough to distinguish a requirement-fit check from sibling tools like compare_vendors or estimate_cost, though it never names those alternatives.

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 when-to-use guidance, no prerequisites, no routing to alternatives. An agent must infer that this belongs after extract_requirements/list_capabilities and instead of compare_vendors, and that vendor_ids and requirement capability ids come from other tools — none of which the description states.

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

compare_architecturesInterview, then compare architecturesA
Read-only
Inspect

Asks the questions that decide an architecture (static or dynamic, who signs in, how much data, uploads and media, background jobs and live updates, data sensitivity, threat profile, cost of downtime, who runs the servers), then rates every architecture against the answers: static site on a CDN, frontend with Supabase, serverless Next.js on Vercel, Cloudflare Workers, containers on DigitalOcean App Platform, one server, one server behind Cloudflare, Firebase, or on the phone with no server. Returns the top three with a 0-100 fit, what each service does, the monthly cost now and at forecast, strengths and concerns; the rest it considered; and the ones ruled out with the reason. Interview loop: call it with the description first; show the user the questions (each has options, why it matters, and sometimes a suggested answer read from the description); ask the unanswered ones, a few at a time, and call it again with answers. It ranks with whatever is answered, so it is fine to stop early. No model is used for the questions or the ratings. Each architecture has plan_stack_arguments and share_url for the full plan. When the user adds a requirement later, call it again with the same answers and the new description or requirements.

NameRequiredDescriptionDefault
answersNoInterview answers by question id, each an option id from compare_architectures, e.g. {"server":"dynamic","logins":"consumers","threat":"public","ops":"managed"}.
founderNoOptional company details used only to find startup perks.
mau_nowNo
app_typeNoKind of app, from Product Hunt's categories: productivity, engineering_development, design_creative, finance, marketing_sales, data_analysis, platforms, no_code, product_addons, llms, ai_agents, voice_ai, social_community, health_fitness, family, lifestyle, web3, ecommerce, travel, physical_products, booking_marketplace, content_site, ios_on_device. Sets the usage profile and, when users are not given, typical users at launch and after the forecast period.
platformsNoWhere the app runs. A phone app with no web platform gets the phone questions and options.
categoriesNoCategories to plan before the answers adjust them. Default: what the description needs.
profile_idNoUsage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile.
descriptionNoPlain-language product description or PRD text. Read for requirements (unless requirements is given) and for suggested answers.
task_intentNoWhat the user is trying to do, in a few words, e.g. "pick a stack for an MVP" or "cost section for an investor deck". No names or contact details.
mau_forecastNo
requirementsNoRequirements already confirmed; when given, the description is not read for requirements again.
forecast_monthsNo
budget_monthly_usdNo
output_destinationNoWhere the answer goes. chat (default): summary for the conversation. document: a section ready to paste into a PRD. code: adds npm packages and environment variable names for each pick.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).

Output Schema

NameRequiredDescription
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

TDQS

A3.9/5.0
Behavior4/5

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

Adds context beyond the readOnly/openWorld annotations: ratings are deterministic ('No model is used'), partial answers still produce a ranking, ruled-out options come with reasons, and each architecture carries plan_stack_arguments and share_url. That is real behavioral detail an agent could not infer from annotations alone.

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

Conciseness3/5

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

The core purpose is front-loaded, but the body is one very long run-on paragraph with a multi-clause parenthetical question list and repeated 'call it again' instructions. It is dense and useful but would scan far better broken into purpose / workflow / output sections.

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

Completeness4/5

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

For a 15-parameter, multi-turn, stateful tool it covers the interplay of description, answers, requirements, and forecast well enough to drive correct calls, and it repeats return contents even though an output schema exists. Minor gaps remain around defaults for optional params and how answers map to question ids.

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 73%, so the schema carries most param meaning, but the description supplies the crucial chicken-and-egg guidance that `answers` option ids are produced by this very tool's question output, and that `description` is read both for requirements and suggested answers. Several params (founder, budget, mau) get no mention, but are documented in the schema.

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

Purpose4/5

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

States a specific two-part action (interview, then rate architectures), enumerates the candidate architectures and the ranked output shape, so an agent knows exactly what it gets back. It doesn't explicitly contrast itself with recommend_stack or plan_stack, though it links to plan_stack_arguments, leaving sibling differentiation implicit.

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

Usage Guidelines4/5

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

Gives an explicit, actionable protocol: call with description first, show the user the questions, ask unanswered ones a few at a time, call again with answers, and stopping early is fine. It also covers the later-requirement case (re-call with same answers plus new description/requirements). Only the comparison to sibling tools is absent.

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

compare_vendorsCompare vendors in a categoryB
Read-only
Inspect

Rank vendors in one category at a given scale. Vendors meeting every must-have come first, then cheapest. Ranking is by cost and fit only. Example: {"category":"auth","mau":50000,"requirements":[{"capability":"auth.saml_sso"}]}.

NameRequiredDescriptionDefault
mauYes
seatsNoTeam members on per-seat plans. Default 1.
excludeNo
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.
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
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuinely useful ranking behavior — must-haves first, then cheapest, 'cost and fit only' — but leaves unstated what happens with nice-to-have requirements (must:false), what an empty/no-match result looks like, and whether ranking is stable across identical costs.

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

Conciseness4/5

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

Front-loaded with the core operation and ranking rule in two sentences, then a compact example. Slight redundancy between 'then cheapest' and 'ranking is by cost and fit only', but nothing is padded.

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

Completeness3/5

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

An output schema exists, so return values needn't be described. But with 10 parameters, two nested override objects, and a profile system that interacts with per_user/per_1k_mau defaults, the description does not explain how those overrides layer. It is adequate for the common call and thin for the advanced ones.

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

Parameters3/5

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

Schema coverage is 60%, so roughly half the parameters are documented in the schema and several (category, mau, exclude) are bare. The single example clarifies the shape of the requirements objects and how category/mau combine, but says nothing about profile_id, per_user, per_1k_mau, seats, or exclude, which are the highest-complexity inputs. Partial compensation only.

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

Purpose4/5

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

States a specific verb and resource with scope: 'Rank vendors in one category at a given scale.' That is clearly distinct from siblings like check_fit, estimate_cost, or list_vendors, which either evaluate a single stack or enumerate data. It stops short of naming those alternatives explicitly, but the operation is unambiguous.

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?

Use is implied by the ranking/scoping language and the sample call, but there is no explicit when-to-use or when-not, and no routing to close siblings such as check_fit (single stack fit) or recommend_stack. An agent must infer which of these to reach for.

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

delete_accountDelete your Kong Reviews accountA
DestructiveIdempotent
Inspect

Permanently delete the signed-in user's Kong Reviews account: their GitHub sign-in link and every saved stack. This cannot be undone. Only call it when the user explicitly asks to delete their account, after telling them what will be removed; pass confirm exactly as "delete my account". Needs sign-in.

NameRequiredDescriptionDefault
confirmYes

Output Schema

NameRequiredDescription
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

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description adds what the agent cannot infer: exactly what is destroyed (GitHub sign-in link and all saved stacks), that it is irreversible ("This cannot be undone"), and that authentication is required ("Needs sign-in").

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?

Three tight sentences with the destructive action and its scope front-loaded, followed by the irreversibility warning, then the call conditions. No filler or redundancy.

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?

An output schema exists so return values need no explanation, and the description covers the remaining agent-critical facts for a destructive single-parameter tool: scope of deletion, irreversibility, auth requirement, and confirmation-phrase handling.

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 there is only one enum-constrained parameter whose allowed value is already visible in the schema. The description still adds the operational meaning of that parameter — it acts as a consent guard that must be passed "exactly" as the enum string — rather than merely repeating the literal.

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?

States a specific verb and resource ("Permanently delete the signed-in user's Kong Reviews account") and immediately scopes it to "their GitHub sign-in link and every saved stack", which distinguishes it from the sibling delete_saved_stack that removes a single stack.

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?

Gives an explicit gating condition ("Only call it when the user explicitly asks to delete their account") plus a prerequisite conversational step ("after telling them what will be removed"). The scope wording also implicitly routes single-stack deletion to the sibling tool.

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

delete_saved_stackDelete a saved stackA
DestructiveIdempotent
Inspect

Permanently delete one of the signed-in user's saved stacks by id. Only call it when the user explicitly asks to delete that stack; confirm the name first. Needs sign-in.

NameRequiredDescriptionDefault
idYes

Output Schema

NameRequiredDescription
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

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real context the annotations don't: the deletion is permanent, it is scoped to the signed-in user's own stacks, and it requires sign-in. It doesn't cover what happens on an unknown id or whether dependent artifacts are affected.

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?

Three short sentences with zero filler; the destructive verb and scope lead, followed by the call condition and the auth requirement in priority order.

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

Completeness4/5

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

For a destructive one-parameter mutation with an output schema and strong annotations, this covers safety, auth, and confirmation. The remaining gap is id provenance and not-found behavior, which is a modest omission rather than a blocking one.

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

Parameters3/5

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

Schema description coverage is 0% for the single `id` parameter, so the description carries the burden. It clarifies the id refers to the user's saved stack, but gives no format, no source (list_saved_stacks / get_saved_stack), and no behavior for a missing or malformed id.

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?

States a specific verb and resource ("Permanently delete ... saved stacks") plus the scoping constraint ("one of the signed-in user's ... by id"), which cleanly separates it from get_saved_stack, update_saved_stack, and list_saved_stacks in the sibling set.

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

Usage Guidelines4/5

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

Gives an explicit gating condition ("Only call it when the user explicitly asks to delete that stack") and a workflow precondition ("confirm the name first"), which is genuine when/when-not guidance. It stops short of a 5 because it never names an alternative tool (e.g., get_saved_stack or list_saved_stacks) for locating the target.

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

detect_stackDetect an existing app's stackA
Read-only
Inspect

Work out which services an existing app runs on, from its files, a public GitHub repo, or its live website. From an AI coding app, read the project yourself and pass the files that say the most: package.json (or requirements.txt, pyproject.toml, Gemfile, go.mod, pubspec.yaml, Podfile), .env.example (names only, never secret values), and deploy configs (vercel.json, netlify.toml, fly.toml, render.yaml, .do/app.yaml, wrangler.toml, firebase.json, Dockerfile). Returns each catalogue vendor found with its evidence and confidence, services the catalogue can't price yet, frameworks and platforms. Rules only; nothing is stored. Then call audit_stack with the services (and their plans, if the user knows them).

NameRequiredDescriptionDefault
urlNoThe live website, to read its hosting headers and the scripts it loads.
repoNoPublic GitHub repo: owner/name or its github.com address.
textNoPasted text, e.g. a package.json or a list of services, when there are no file names.
filesNo

Output Schema

NameRequiredDescription
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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavior beyond that: detection is rules-only, nothing is stored, and secrets should never be passed — but it says nothing about rate limits or how live-site probing behaves.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence and every subsequent clause is useful. It is a dense single paragraph, so it is slightly harder to scan than a structured list would be, but there is little waste.

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?

An output schema exists, yet the description still sketches what comes back — catalogue vendors with evidence and confidence, unpriced services, frameworks and platforms — plus the concrete next step. Nothing an agent needs to call it correctly is missing.

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 75%, and the description goes well beyond it by enumerating which files matter (package.json, requirements.txt, .env.example, deploy configs) and constraining .env.example to names only. This gives an agent actionable selection guidance the schema does not.

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?

States a specific verb and resource: work out which services an existing app runs on, from files, a repo, or a live site. It also distinguishes itself from audit_stack by positioning this as the detection step that feeds it.

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

Usage Guidelines4/5

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

Gives clear invocation guidance: from an AI coding app, read the project yourself and pass the highest-signal files, then call audit_stack with the detected services. It lacks an explicit when-not-to-use or alternative-tool exclusion, so it falls just short of a 5.

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

diff_stackPrice a code change (pull request)A
Read-only
Inspect

What a code change does to an app's bill: pass the files before (base_files) and after (head_files) the change, such as package.json, requirements.txt, .env.example (names only) and deploy configs. Returns the services added and removed, each priced now and in 12 months at the given users, with cheaper options and cost jumps, the change in monthly cost, and comment_markdown ready to post on a pull request. Use it before adding a paid service or SDK, or to review a pull request. Rules only; nothing is stored.

NameRequiredDescriptionDefault
plansNoPlans the app is on, when known.
mau_nowNoMonthly active users today. Default 1,000, and the comment says it was assumed.
base_filesYes
head_filesYes
profile_idNo
mau_forecastNoUsers expected in 12 months.
requirementsNo

Output Schema

NameRequiredDescription
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

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true and openWorldHint=false, and the description reinforces this with 'Rules only; nothing is stored,' which is genuinely additive about determinism and side effects. It also discloses that output includes a PR-ready comment_markdown and 12-month forecast pricing, giving useful behavioral context.

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?

One dense paragraph, front-loaded with the core action and the input convention, then results and usage. It is packed but nearly every clause carries meaning; a small amount of length could be trimmed around the results list.

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

Completeness4/5

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

An output schema exists, so return values need not be spelled out, yet the description still summarizes them helpfully. Given seven params and a diff-based workflow, the main residual gap is the unexplained plans/profile_id/requirements inputs, but overall an agent can call it correctly.

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

Parameters3/5

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

With schema coverage at 43%, the description compensates partly by clarifying what base_files/head_files should contain (manifest and config files, .env.example names only) and that pricing uses 'the given users' for mau inputs. However, the seven params include plans, profile_id, and requirements that the description never explains, so the coverage gap is only partially filled.

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?

States a specific verb and resource: pricing what a code change does to an app's bill, by passing base_files and head_files. It clearly differentiates from siblings like estimate_cost or project_stack by framing it as a before/after diff for a pull request.

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

Usage Guidelines4/5

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

Gives clear usage context: use before adding a paid service or SDK, or to review a pull request. It does not name an explicit alternative sibling (e.g. evaluate_change, estimate_cost) or state when-not to use it, leaving that inference to the agent.

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

estimate_costEstimate monthly costA
Read-only
Inspect

Monthly cost for one vendor at a given scale. Give mau (monthly active users) and a usage profile, or exact usage numbers. Picks the cheapest plan that fits unless plan_id is set. Example: {"vendor_id":"clerk","mau":25000}.

NameRequiredDescriptionDefault
mauNo
seatsNoTeam members on per-seat plans. Default 1.
usageNoExact monthly usage by unit (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); overrides values derived from mau.
plan_idNo
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.
requiredNoCapability ids the plan must include.
vendor_idYes
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.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

A3.6/5.0
Behavior4/5

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

With readOnlyHint=true and openWorldHint=false already covering safety, the description still adds a real behavioral rule: it auto-selects the cheapest fitting plan unless plan_id pins one. That is meaningful context an agent cannot get from annotations. It stops short of noting anything about pricing-data currency or how partial usage inputs are filled.

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?

Three short sentences plus a concrete example, with the core purpose and the plan-selection rule front-loaded. Nothing is wasted, though the example is arguably redundant given the schema.

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

Completeness3/5

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

An output schema exists, so return-value explanation is not required. But for an 11-parameter tool sitting among pricing siblings (get_pricing, compare_vendors, find_cost_cliffs, check_fit), the absence of any when-to-use-this routing leaves a real gap.

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

Parameters3/5

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

At 73% schema coverage the schema already documents profile_id, its enum-like values, revenue_per_mau_usd and transactions_per_mau, and the nested objects spell out their own override semantics. The description only restates the two input pathways, adding little beyond that baseline.

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?

"Monthly cost for one vendor at a given scale" gives a specific verb (estimate cost), resource (a vendor's pricing) and scope (single vendor, monthly). The single-vendor framing implicitly separates it from compare_vendors/compare_architectures, but no sibling is named outright.

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?

It tells the agent how to supply scale (mau + profile, or exact usage numbers) and the plan-selection default, which is usable invocation guidance. It never says when to prefer this over get_pricing, compare_vendors or find_cost_cliffs, so routing among the cost-related siblings is left to inference.

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

evaluate_changeStay, optimise or switchA
Read-only
Inspect

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.

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

NameRequiredDescription
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

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.

extract_requirementsExtract requirements from a PRDA
Read-only
Inspect

Turn PRD or spec text into structured requirements (scale, capabilities, compliance, regions, budget) for plan_stack, without planning. recommend_stack does both in one call. Each requirement quotes the sentence it came from. Show them to the user to confirm before planning. Without a model on the server it reads the PRD with keyword rules (mode "rules") and also returns the capability vocabulary and instructions: as an assistant, prefer doing the extraction yourself and use the rules result only as a starting point.

NameRequiredDescriptionDefault
prd_textYes

Output Schema

NameRequiredDescription
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

TDQS

A4.2/5.0
Behavior4/5

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

Goes well beyond the readOnly/openWorld annotations by disclosing the degraded-mode behavior (keyword rules when no model is on the server) and the trust model for the returned vocabulary/instructions. It does not mention max input size or rate/limit behavior, and the reference to 'mode "rules"' is slightly opaque since no such parameter exists in the schema.

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

Conciseness3/5

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

The first three sentences are tight and front-loaded, but the final sentence is a long compound thought that mixes fallback behavior, return payload, and agent instructions, making it harder to parse than it needs to be.

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

Completeness4/5

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

An output schema exists, and the description still adds enough about extraction scope, provenance quotes, and the rules fallback for an agent to call it correctly and use the result. The main remaining gap is input-side guidance for prd_text.

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

Parameters3/5

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

Schema description coverage is 0% for the single parameter prd_text, and the description does not describe its expected format or the 60,000-character limit. It does usefully describe the output shape (requirements quoting source sentences) but says little about the input itself.

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?

States a specific verb+resource ('Turn PRD or spec text into structured requirements') and enumerates the extracted dimensions (scale, capabilities, compliance, regions, budget). It explicitly bounds scope ('without planning') and names the sibling that combines both steps, so it is distinguishable from recommend_stack and plan_stack without opening either schema.

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 positions the tool against recommend_stack ('does both in one call') and against plan_stack ('for plan_stack, without planning'), and adds a workflow rule: show extracted requirements to the user for confirmation before planning. It also tells the assistant to prefer doing extraction itself and treat the rules output as a starting point.

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

find_cost_cliffsFind cost cliffsA
Read-only
Inspect

Scan a range of user counts for one vendor and report where cost jumps: forced plan upgrades and points where usage charges start. Example: {"vendor_id":"clerk","from_mau":1000,"to_mau":200000}.

NameRequiredDescriptionDefault
seatsNoTeam members on per-seat plans. Default 1.
to_mauNo
from_mauNo
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.
requiredNo
vendor_idYes
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.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavioral value by specifying what it reports (forced plan upgrades, points where usage charges start), which goes beyond the annotations. It stops short of detailing computational cost or how discontinuous ranges are sampled.

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?

Two sentences: purpose is front-loaded, and the example immediately grounds the abstract 'range of user counts' in concrete parameters. No filler or repetition.

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

Completeness4/5

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

An output schema exists and the nested per_user/per_1k_mau semantics are well documented in-schema, so the description needn't restate returns. For a 10-param nested tool it covers purpose and range well, though the profile-vs-per_user-vs-per_1k_mau relationship is left entirely to the schema.

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

Parameters3/5

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

Schema coverage is 60%, and the example concretely illustrates from_mau/to_mau, which are undocumented in the schema itself. But the description says nothing about the interaction among profile_id, per_user, per_1k_mau, seats, and required, leaving the more complex nested override parameters to the schema alone.

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?

States a specific verb and resource (scan a range of user counts for one vendor) and precisely what it outputs: forced plan upgrades and points where usage charges start. This crisply distinguishes it from the generic estimate_cost/project_stack siblings by focusing on discontinuities rather than a single cost figure.

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 scope 'scan a range of user counts for one vendor' implies when to use it (to locate cliff points), and the from_mau/to_mau example reinforces the range concept. However, it never names an alternative such as estimate_cost or says when not to use this versus a single-point estimate, leaving the sibling choice to inference.

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

find_perksFind startup perksA
Read-only
Inspect

Startup credits for the given vendors, and whether you qualify based on your bank, incorporation provider, accelerator or funding. Example: {"vendor_ids":["supabase","posthog"],"founder":{"gateways":["mercury"]}}.

NameRequiredDescriptionDefault
founderNoOptional company details used only to find startup perks.
vendor_idsNo

Output Schema

NameRequiredDescription
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

TDQS

A3.5/5.0
Behavior3/5

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

readOnlyHint and openWorldHint already tell the agent this is a safe, closed-world read, so the description only needs to add context. It does add that qualification is computed from bank, incorporation provider, accelerator, and funding signals, but says nothing about result shape, whether unqualified vendors are returned, or how vendor ids should be sourced.

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?

Two compact sentences plus an example, all of which carry information; the eligibility drivers are front-loaded. The opening fragment is slightly awkward and the embedded JSON example makes the sentence harder to parse than a plain enumeration would.

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?

For a read-only lookup whose return shape is documented by an output schema, this is nearly sufficient, but it never explains where vendor ids come from (list_vendors / search_directory) or what happens when vendor_ids is omitted. Those gaps matter for an agent deciding how to call the 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 only 50%, and the description compensates by explaining what the founder object is for: gating on bank/incorporation provider/accelerator (the gateways array) and funding stage (venture_backed/arr_usd). The inline example also clarifies the expected id format and nesting. It does not explain existing_customer_of, which the schema covers anyway.

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 names the resource precisely: startup credits for a list of vendors plus an eligibility determination. It lacks an explicit verb ("Startup credits for..." is a fragment), but the result an agent gets back is unambiguous and no sibling tool operates in this space.

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

Usage Guidelines3/5

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

Usage is only implied: pass vendor ids and optional founder attributes to get credits and qualification. There is no statement of when to prefer this over nearby tools (e.g., list_vendors, search_directory to obtain ids) and no prerequisite or exclusion guidance.

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

get_build_packGet the build pack for a planned stackA
Read-only
Inspect

Everything needed to start building a planned stack: the decisions (each service, what it covers, the runner-up, cost now and at forecast), setup steps in order (domain, hosting, database, sign-in, email, payments, monitoring), the variable names as .env.example, KONG.md (a brief for the AI assistant: the stack, rules, cost cliffs, setup order, and what "done" means), an acceptance checklist and cost guardrails. For a plan built with an app builder (builder_profile non_developer), KONG.md is one prompt to paste into the builder instead. Pass the share_url of a plan (no sign-in needed) or the id of a saved plan (needs sign-in). Write KONG.md and .env.example into the project root, then follow the steps with the user. Values never pass through Kong Reviews: only variable names.

NameRequiredDescriptionDefault
idNoA saved plan id from list_saved_stacks (needs sign-in).
frameworkNoWhat the app is built with: nextjs (default), remix (Remix or React Router), sveltekit, astro, expo (React Native) or node (Express). Picks each service's package, variable names and guide for it. Read it from the project (package.json) when you can.
share_urlNoA plan link from plan_stack, recommend_stack or kongreviews.com.

Output Schema

NameRequiredDescription
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

TDQS

A4.4/5.0
Behavior4/5

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

Adds real context beyond readOnlyHint/openWorldHint: the two auth modes, the builder_profile non_developer variant where KONG.md becomes a single paste-in prompt, and the privacy guarantee that variable values never pass through Kong Reviews. The 'write KONG.md into the project root' instruction is agent-side file I/O, not a contradiction of readOnlyHint.

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

Conciseness4/5

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

Front-loaded with what the pack contains (the highest-value information), then invocation, then next actions. Dense but every clause carries content; the long parenthetical service list is the only slightly heavy part.

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?

Output schema covers return values, so the description's job is inputs, auth, and post-call workflow — all present. For a zero-required-parameter read tool it leaves nothing an agent needs to call it or act on the result unresolved.

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 already 100%, so baseline is 3; the description adds the sign-in distinction for share_url vs id and the framework default implied by the builder_profile note. It does not add framework-selection detail (reading package.json), which lives in 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?

Names a specific resource (the build pack for a planned stack) and enumerates exactly what it contains: decisions with runner-up and cost, ordered setup steps, .env.example variable names, KONG.md, acceptance checklist and cost guardrails. An agent knows precisely what comes back without opening the output schema.

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

Usage Guidelines4/5

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

Gives the two invocation paths with their auth conditions (share_url = no sign-in, id from list_saved_stacks = needs sign-in) and states the follow-on workflow: write KONG.md and .env.example to project root, then walk the steps with the user. No explicit when-not or named alternative sibling, so not a 5.

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

get_pricingGet vendor pricingA
Read-only
Inspect

Structured pricing and capabilities for one vendor: every plan, base fee, metered usage, limits, unmodelled costs, lock-in notes, source URL and verification date.

NameRequiredDescriptionDefault
vendor_idYes

Output Schema

NameRequiredDescription
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

TDQS

A3.5/5.0
Behavior3/5

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

The readOnlyHint and openWorldHint=false annotations already establish that this is a safe, closed-corpus read, so the description's job is only to add context. It does contribute provenance signal ('source URL and verification date') and scope signal ('unmodelled costs', 'lock-in notes'), but most of the enumerated fields restate what the output schema already declares.

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?

One front-loaded sentence that names the resource and scope before enumerating payload contents. The field list is dense but every item signals scope rather than padding; a fragment structure is acceptable for a reference tool.

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 and read-only annotations in place, the description only needs to convey scope and payload character, which it does. The one meaningful omission is how to obtain a valid vendor_id, which an agent calling a single-vendor lookup will need.

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?

There is a single required parameter at 0% schema description coverage, so the description must carry the load and it only implies that vendor_id is a single-vendor identifier via 'one vendor'. It does not say the expected format, whether it must come from list_vendors or search_directory, or what happens on an unknown id.

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

Purpose4/5

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

States a specific verb (returns structured pricing and capabilities) and a specific scope (one vendor), which separates it from list_vendors and compare_vendors at a glance. It stops short of naming those siblings explicitly, so the differentiation is implied by scope rather than stated.

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

Usage Guidelines3/5

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

Usage is only implied by the phrase 'for one vendor', which suggests this is the single-vendor lookup as opposed to the multi-vendor comparison siblings. There is no explicit when-to-use, when-to-use-instead (e.g. compare_vendors vs estimate_cost), or guidance on where the vendor_id comes from.

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

get_saved_stackOpen a saved stack with current pricesA
Read-only
Inspect

Re-run a saved stack or audit with today's catalogue and compare it with when it was saved: monthly cost then and now, picks (or plans) that changed, vendors whose pricing changed and, for audits, the grade; and any bills recorded with record_bills next to the estimate. Use it when the user asks about a stack they saved, or whether prices moved. Pass the id from list_saved_stacks. Its questions are what is still assumed; keep the user's answers on the stack with update_saved_stack (answers). Needs sign-in. How to present the result: show the stack table (pick and runner-up per category, monthly cost now and at forecast) and the totals. For each price give its source's verified date, or say it is unverified seed data. Show every caveat word for word; never round, merge or drop one. Mention requirement gaps, blockers and trade-offs, and each pick's "weighed" note when a cheaper vendor lost on lock-in, setup work or seed prices. Offer the alternatives (cheapest, fewest vendors) with what each changes, its cost and its share_url. List not_planned as needed but not in the totals. Ask the questions (most expensive first) and re-plan with the answers in the argument each names (per_user, revenue_per_mau_usd, builder_profile); when the user says an assumption is right, add the question id to confirmed so it isn't asked again. On a saved stack, keep answers with update_saved_stack (answers). Link share_url so the user can open the full result on kongreviews.com. Do not add vendors or prices that are not in the result.

NameRequiredDescriptionDefault
idYes
bills_monthNoMonth (YYYY-MM) for the bills comparison; default the newest with bills.
task_intentNoWhat the user is trying to do, in a few words, e.g. "pick a stack for an MVP" or "cost section for an investor deck". No names or contact details.
output_destinationNoWhere the answer goes. chat (default): summary for the conversation. document: a section ready to paste into a PRD. code: adds npm packages and environment variable names for each pick.

Output Schema

NameRequiredDescription
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

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only say readOnlyHint=true and openWorldHint=false, so the description adds real value by disclosing 'Needs sign-in', the confirmed/answers flow, and the fact that it re-plans on answers. It also constrains the agent ('Do not add vendors or prices that are not in the result'), which is behavior beyond the annotations. It stops short of full disclosure since rate limits, error modes and pagination are unaddressed.

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

Conciseness2/5

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

The purpose is front-loaded, but the remainder is a long run-on chain of presentation rules and caveat instructions that buries key operational facts (sign-in, id source) mid-stream. Much of the presentation guidance belongs in the output schema or a separate presentation spec, not the tool definition.

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 annotations and an output schema present, the description does more than required: auth requirement, sibling routing, answer persistence, and output-shaping rules. Gaps remain around the undocumented optional parameters and around whether the re-plan step mutates anything, but for a read-only call this is close to complete.

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

Parameters3/5

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

Schema coverage is 75% with three of four parameters documented, so the schema already carries most parameter meaning, supporting the baseline 3. The description adds value only for id (take it from list_saved_stacks); it never mentions bills_month, task_intent, or output_destination, and confusingly names per_user, revenue_per_mau_usd and builder_profile, which are not parameters of this tool.

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 opening sentence gives a precise verb+resource+scope: re-run a saved stack or audit against today's catalogue and diff it against the saved snapshot. It is clearly distinguishable from list_saved_stacks (source of the id) and update_saved_stack (persists answers), so an agent can route without opening schemas.

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?

Explicit trigger ('when the user asks about a stack they saved, or whether prices moved') plus a concrete prerequisite ('Pass the id from list_saved_stacks') and named sibling for follow-up writes. This is genuine when/how/with-what guidance rather than a vague hint.

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

list_capabilitiesList capabilitiesB
Read-only
Inspect

List capability ids (features, compliance, regions) that requirements can reference, e.g. auth.saml_sso, region.eu, payments.merchant_of_record.

NameRequiredDescriptionDefault
categoryNo

Output Schema

NameRequiredDescription
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

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds only domain context (these IDs are referenceable by requirements); it says nothing about whether the full ID set is returned, ordering, or pagination.

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

Conciseness5/5

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

A single front-loaded sentence with the verb and resource first, followed by disambiguating categories and examples. No filler.

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 output schema exists, so return values needn't be explained, and the purpose is clear. But with an undocumented filtering parameter and no guidance on scope (full catalog vs filtered subset), the definition is only adequate.

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

Parameters2/5

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

There is one parameter, 'category', with 0% schema description coverage, and the description never mentions it or explains how filtering by category relates to the listed category groups. The burden of documenting that parameter falls entirely on the description and it is unmet.

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

Purpose4/5

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

States a specific verb (list) and resource (capability ids) and disambiguates with parenthetical categories (features, compliance, regions) plus concrete ID examples like auth.saml_sso. It doesn't name a sibling tool, but the meaning is unmistakable against list_vendors or search_directory.

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 phrase 'that requirements can reference' implies the tool is used before writing requirements or fitting a stack, but there is no explicit when-to-use, no prerequisites, and no mention of alternatives such as searching the directory.

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

list_saved_stacksList your saved stacksA
Read-only
Inspect

List the stacks the signed-in user saved, newest first, with their monthly cost when saved and a link to each. Use it when the user mentions "my stacks", "the stack I saved" or a saved stack by name; then call get_saved_stack for one of them. Needs sign-in. How to present: a short table of name, saved date and monthly cost when saved, each name linked to its share_url.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
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

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered; the description adds real context beyond that with the auth requirement ("Needs sign-in") and the newest-first ordering. It doesn't address empty-state or volume limits, which keeps it from a 5.

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

Conciseness5/5

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

Three tightly packed sentences: what it returns first, then when to invoke it with the sibling hand-off, then auth and presentation. Every sentence carries information an agent would otherwise have to guess.

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?

For a zero-parameter read tool with an output schema, the description supplies the trigger conditions, auth prerequisite, ordering, and even a presentation recipe. Nothing needed to select or invoke it correctly is missing.

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?

Zero parameters, so the schema baseline of 4 applies and there is nothing for the description to disambiguate. The description correctly implies no filtering or paging inputs are required.

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?

States a specific verb and resource plus scope: lists the signed-in user's saved stacks, newest first, with cost and link. This is clearly distinguishable from get_saved_stack (single item) and save_stack/delete_saved_stack, which appear in the sibling list.

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?

Names concrete trigger phrases ("my stacks", "the stack I saved", a stack by name) and explicitly routes to get_saved_stack when the user wants one specific stack. Both the when-to-use and the alternative are stated.

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

list_vendorsList vendorsB
Read-only
Inspect

List vendors in the pricing catalogue, optionally for one category (hosting, database, auth, email, payments, observability, ai, edge, app_store, coding).

NameRequiredDescriptionDefault
categoryNo

Output Schema

NameRequiredDescription
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

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description confirms the closed 'pricing catalogue' scope, consistent with openWorldHint=false, but adds nothing about result volume, pagination, or ordering. An output schema exists, so return-shape disclosure is not required.

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

Conciseness4/5

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

A single well-formed sentence with the action front-loaded and the filter trailing as a qualifier. The parenthetical enum is space-consuming and, given its incompleteness, does not fully earn 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?

For a one-optional-param read tool with annotations and an output schema, most structured burden is already covered. What remains missing is sibling routing (compare_vendors, get_pricing) and a correct/complete category enumeration, leaving the definition merely adequate.

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

Parameters2/5

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

Schema description coverage is 0%, so the description should carry the parameter burden, but the enumerated category list omits six valid enum values present in the schema (storage, video, sms, push, jobs, search). That partial list actively risks misleading the agent into thinking those categories are invalid, so it adds no meaning beyond the enum and slightly subtracts.

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

Purpose4/5

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

States a specific verb and resource ('List vendors in the pricing catalogue') with the optional category filter, so the agent knows exactly what it returns. It does not distinguish itself from siblings like compare_vendors, search_directory, or get_pricing, which is the only thing keeping it from a 5.

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

Usage Guidelines3/5

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

Usage is only implied: the word 'optionally' signals that the category parameter is a filter, but there is no explicit when-to-use guidance and no mention of when to prefer compare_vendors, get_pricing, or search_directory instead. An agent can infer this is the catalogue-browsing entry point, but must guess.

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

plan_migrationPlan a move to another hostA
Read-only
Inspect

Plan moving an existing app from one host to another (playbooks so far: netlify → digitalocean-app-platform). Reads the repo (files, pasted text or a GitHub repo, as detect_stack does) for the features the app uses on the current host. Returns, in this order: the verdict (monthly cost before and after, one-off hours low to high, the month the move pays off, and whether staying is cheaper; staying is a valid answer), the features (those with no equivalent or that need another service first, each with its effort, risk, steps and sources), what to check in the current host's dashboard because the repo can't show it, a draft .do/app.yaml, and a cutover runbook that keeps the old site live until the new one is proven. Pass features the person confirms from their dashboard (e.g. netlify-dns, forms, deploy-previews) in features. Nothing is deployed or stored; the person deploys the spec themselves. How to present: lead with the verdict and say plainly when staying is cheaper; then the features with no equivalent or needing a service; then the rest, the checks, the spec and the runbook. Show every caveat word for word.

NameRequiredDescriptionDefault
idNoA saved audit id (list_saved_stacks; needs sign-in): uses its users and plan, and shows the steps ticked so far.
toNoTarget host vendor id. Default digitalocean-app-platform.
fromNoCurrent host vendor id. Default netlify.
repoNoGitHub repo: owner/name or its github.com address.
textNo
filesNonetlify.toml, _redirects, _headers, package.json, .env.example (names only), files in netlify/functions and netlify/edge-functions, and pages with forms.
seatsNoTeam members on per-seat plans. Default 1.
branchNo
domainNoThe site's domain, for the draft spec.
monthsNo
mau_nowNoMonthly active users today. Default 1,000, and the result says it was assumed.
featuresNoFeature ids the person confirms the app uses, including what only the dashboard shows (netlify-dns, forms, deploy-previews, custom-domain).
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.
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.
monthly_growthNo
current_plan_idNoThe current host plan, if known; otherwise the cheapest that serves today's users is assumed.
hourly_rate_usdNoWhat an hour of work costs. Default $100.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond readOnlyHint/openWorldHint: states that nothing is deployed or stored, that the person deploys the spec themselves, that the old site stays live until cutover is proven, and that verdicts may legitimately recommend staying. It also dictates output ordering and the 'word for word' caveat rule, which is real behavioral context an annotation cannot carry.

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

Conciseness4/5

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

Front-loaded with purpose, then the returned artifacts in order, then the presentation rules. Dense but each clause carries information; the 'How to present' section is long and arguably agent-instruction rather than definition, which keeps it from a 5.

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?

For a 20-parameter, read-only, open-world analysis tool with an output schema, the description covers inputs sources (repo, text, files, saved id), key defaults, the ordered artifacts, and the no-side-effects contract. Nothing needed to call it correctly is missing.

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 already 80%, so baseline is 3; the description adds meaning on top by explaining that `features` carries dashboard-only capabilities (netlify-dns, forms, deploy-previews) and that `id` reuses a saved audit's users and plan. The remaining 20 params (per_user, per_1k_mau, seats, months, growth) are left entirely to 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?

Names a specific verb and resource (plan moving an app from one host to another), states the supported playbook (netlify → digitalocean-app-platform), and references the sibling it shares an input mode with ('as detect_stack does'). An agent can distinguish it from detect_stack, estimate_cost, or plan_stack without opening the schema.

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

Usage Guidelines4/5

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

Clear about the trigger context (the person wants to move hosts) and tells the caller to pass dashboard-confirmed feature ids in `features`, plus notes 'staying is a valid answer'. It does not explicitly exclude or route to adjacent tools such as estimate_cost or plan_stack, so the when-not guidance is incomplete.

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

plan_stackRecommend a stack from requirementsA
Read-only
Inspect

Given confirmed requirements as capability ids, recommend a vendor per category with a runner-up, requirement fit, cost now, cost at forecast scale, year-one cost after perks, cost cliffs, trade-offs and blockers. Use recommend_stack instead when you only have a plain-language description. Example: {"mau_now":5000,"mau_forecast":20000,"profile_id":"booking_marketplace","requirements":[{"capability":"auth.google"},{"capability":"payments.merchant_of_record"}],"founder":{"gateways":["mercury"]}}. How to present the result: show the stack table (pick and runner-up per category, monthly cost now and at forecast) and the totals. For each price give its source's verified date, or say it is unverified seed data. Show every caveat word for word; never round, merge or drop one. Mention requirement gaps, blockers and trade-offs, and each pick's "weighed" note when a cheaper vendor lost on lock-in, setup work or seed prices. Offer the alternatives (cheapest, fewest vendors) with what each changes, its cost and its share_url. List not_planned as needed but not in the totals. Ask the questions (most expensive first) and re-plan with the answers in the argument each names (per_user, revenue_per_mau_usd, builder_profile); when the user says an assumption is right, add the question id to confirmed so it isn't asked again. On a saved stack, keep answers with update_saved_stack (answers). Link share_url so the user can open the full result on kongreviews.com. Do not add vendors or prices that are not in the result.

NameRequiredDescriptionDefault
needsNoNeeds the plan should list even though they are not priced (directory category ids such as maps, vector_db, speech), from recommend_stack's requirements_read.needs.
seatsNoTeam members on per-seat plans. Default 1.
answersNoInterview answers by question id, each an option id from compare_architectures, e.g. {"server":"dynamic","logins":"consumers","threat":"public","ops":"managed"}.
founderNoOptional company details used only to find startup perks.
mau_nowNoMonthly active users now. Without it, a new product of the app type at launch.
rankingNobalanced (default): monthly cost plus a small monthly weight for lock-in, setup work before first use and unverified seed prices, so a slightly cheaper vendor that is hard to leave or slow to set up can lose. cost: price alone. simplest: fewest vendors and least setup (one vendor covering several categories wins unless the others are much cheaper). Each plan lists the other two as alternatives when their picks differ.
accountsNoFor a business product counted in customers ("50 clinics now, 500 next year"): customers now and at the forecast, and people using it at each (default 10). Users are worked out from these when mau_now is not given.
app_typeNoKind of app, from Product Hunt's categories: productivity, engineering_development, design_creative, finance, marketing_sales, data_analysis, platforms, no_code, product_addons, llms, ai_agents, voice_ai, social_community, health_fitness, family, lifestyle, web3, ecommerce, travel, physical_products, booking_marketplace, content_site, ios_on_device. Sets the usage profile and, when users are not given, typical users at launch and after the forecast period.
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.
confirmedNoIds of questions whose assumption the user confirmed as right (e.g. ["region", "builder"]), so the plan stops asking them. A question answered with a figure goes in its own argument instead (per_user, revenue_per_mau_usd…).
platformsNoWhere the app runs; with architecture, a phone-only app leaves out web hosting.
build_toolNoThe build tool the user named, as a coding vendor id (lovable, bolt, replit, base44, v0, cursor, claude-code, github-copilot…): the plan uses it. An app builder that hosts the app and runs its database and sign-in (Lovable, Bolt, Replit, Base44) covers those, so they are not planned separately.
categoriesNo
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.
apply_perksNo
task_intentNoWhat the user is trying to do, in a few words, e.g. "pick a stack for an MVP" or "cost section for an investor deck". No names or contact details.
architectureNoPlan with only this architecture's vendors, from compare_architectures (e.g. serverless_nextjs, cloudflare_edge, vps_cloudflare).
mau_forecastNo
requirementsNo
builder_profileNoWho builds it. developer picks an AI coding agent, non_developer an app builder (and counts setup work double). Given without categories, the plan adds the build tool (coding).
exclude_vendorsNo
forecast_monthsNo
budget_monthly_usdNo
output_destinationNoWhere the answer goes. chat (default): summary for the conversation. document: a section ready to paste into a PRD. code: adds npm packages and environment variable names for each pick.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare this is a read-only, closed-world planning call, yet the description still adds real behavioral constraints: never invent vendors or prices, reproduce caveats verbatim, flag unverified seed data, and link share_url so results live on kongreviews.com. The one gap is that it doesn't say anything about cost or latency for a 27-parameter computation over pricing data.

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

Conciseness4/5

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

Purpose and the sibling exclusion are front-loaded, and nearly every sentence is actionable. It is still a dense single block that mixes invocation guidance with output presentation rules and a raw JSON example, which makes it harder to scan than a short segmented description would be.

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?

For a 27-parameter planning tool with nested usage overrides, an output schema already present, and a multi-turn interview workflow, the description covers what an agent needs: the input contract, the ask-then-re-plan loop, how to record confirmations, and what to surface from the result. Nothing essential to calling it correctly is missing.

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 74%, so most parameters are self-documenting, but the description adds cross-parameter semantics the schema cannot express: interview answers are re-submitted into 'the argument each names (per_user, revenue_per_mau_usd, builder_profile)' and confirmed question ids go into `confirmed` so they aren't re-asked. The embedded example call anchors the requirements/founder/mau_now combination. It does not touch many of the pricing-override objects, but those are covered in 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?

States a specific verb and resource plus the full output shape: 'recommend a vendor per category with a runner-up, requirement fit, cost now, cost at forecast scale, year-one cost after perks, cost cliffs, trade-offs and blockers.' It explicitly separates itself from the closest sibling, recommend_stack, by input type (confirmed capability ids vs. plain-language description).

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?

Gives an explicit when-not with the alternative named: 'Use recommend_stack instead when you only have a plain-language description.' It also routes downstream work to specific siblings with argument names ('keep answers with update_saved_stack (answers)'), so the agent knows the handoff points as well as the entry condition.

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

project_stackProject stack cost over timeB
Read-only
Inspect

Month-by-month cost for a whole stack as users grow, with startup perks applied if requested, plus cost cliffs (forced plan upgrades, sharp jumps, credits running out). Example: {"vendors":[{"vendor_id":"supabase"},{"vendor_id":"vercel"}],"start_mau":2000,"monthly_growth":0.15,"months":24,"apply_perks":true,"founder":{"gateways":["mercury"]}}.

NameRequiredDescriptionDefault
seatsNoTeam members on per-seat plans. Default 1.
monthsNo
founderNoOptional company details used only to find startup perks.
vendorsYes
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.
start_mauYes
mau_seriesNoExplicit MAU per month; overrides start_mau, monthly_growth and months.
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.
apply_perksNo
monthly_growthNoe.g. 0.1 = 10% per month
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral detail beyond annotations: the output includes cost cliffs such as forced plan upgrades, sharp jumps, and credits expiring, which tells the agent what to expect. It does not state pagination, cost model assumptions, or currency.

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

Conciseness3/5

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

One dense sentence front-loads the purpose well, but the trailing example dominates the length and only illustrates a subset of the 13 parameters. The raw JSON example is useful yet not the most token-efficient way to convey it; overall it's adequate but not tight.

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?

This is a complex 13-parameter nested tool with an output schema, so the description must carry modeling semantics. It covers projection, growth, perks, and cliff detection, and the example anchors the vendor/founder shape. It omits how vendor plan_id/required interact with the pricing model and how per_user competes with per_1k_mau, leaving minor gaps.

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

Parameters3/5

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

Schema coverage is 69%, and the schema itself carries the rich per_unit/per_1k_mau unit lists and profile enums. The description's main contribution is a worked example showing vendors as objects with vendor_id, plus founder.gateways, which clarifies two under-documented required/nested spots. It says nothing about per_user vs per_1k_mau precedence or how apply_perks interacts with founder.existing_customer_of.

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

Purpose4/5

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

States a specific verb+resource: month-by-month cost projection for a whole stack as MAU grows, plus cost cliffs. This distinguishes it from estimate_cost (point-in-time) and find_cost_cliffs (cliff-only) by combining projection + cliffs. It doesn't explicitly name those siblings, so it falls short of a 5.

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

Usage Guidelines3/5

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

The word 'stack' and 'as users grow' implies usage for multi-vendor growth projections, and 'with startup perks applied if requested' hints at when to set apply_perks. But there is no explicit when-to-use-this-vs-estimate_cost/find_perks/plan_stack guidance, no prerequisites, and no exclusions.

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

recommend_stackRecommend a stack from a descriptionA
Read-only
Inspect

Start here. Describe the product in plain language and get a recommended stack with costs now and at scale, in one call. Write the description as the user would: what the product does, who signs in and how, how it charges, which emails it sends, compliance or data-region needs, and expected users now and in 12 months. Example: "A booking app for yoga studios. Members sign in with Google and pay a monthly subscription. Studios get paid out. EU data. 2,000 users at launch, 20,000 within a year." Pass a PRD as the description if you have one. Numbers you pass (mau_now, mau_forecast, budget_monthly_usd, profile_id, app_type) override what is read from the text. Without a user count it assumes a new product of that app type at launch and its typical growth, and lists that in defaults_used. Before treating the plan as final, show the user the requirements it read (each quotes its sentence) and the open questions, and ask them to confirm or correct them; then call plan_stack with the corrected requirements. How to present the result: show the stack table (pick and runner-up per category, monthly cost now and at forecast) and the totals. For each price give its source's verified date, or say it is unverified seed data. Show every caveat word for word; never round, merge or drop one. Mention requirement gaps, blockers and trade-offs, and each pick's "weighed" note when a cheaper vendor lost on lock-in, setup work or seed prices. Offer the alternatives (cheapest, fewest vendors) with what each changes, its cost and its share_url. List not_planned as needed but not in the totals. Ask the questions (most expensive first) and re-plan with the answers in the argument each names (per_user, revenue_per_mau_usd, builder_profile); when the user says an assumption is right, add the question id to confirmed so it isn't asked again. On a saved stack, keep answers with update_saved_stack (answers). Link share_url so the user can open the full result on kongreviews.com. Do not add vendors or prices that are not in the result.

NameRequiredDescriptionDefault
seatsNoTeam members on per-seat plans. Default 1.
founderNoOptional company details used only to find startup perks.
mau_nowNoMonthly active users now or at launch.
rankingNobalanced (default): monthly cost plus a small monthly weight for lock-in, setup work before first use and unverified seed prices, so a slightly cheaper vendor that is hard to leave or slow to set up can lose. cost: price alone. simplest: fewest vendors and least setup (one vendor covering several categories wins unless the others are much cheaper). Each plan lists the other two as alternatives when their picks differ.
app_typeNoKind of app, from Product Hunt's categories: productivity, engineering_development, design_creative, finance, marketing_sales, data_analysis, platforms, no_code, product_addons, llms, ai_agents, voice_ai, social_community, health_fitness, family, lifestyle, web3, ecommerce, travel, physical_products, booking_marketplace, content_site, ios_on_device. Sets the usage profile and, when users are not given, typical users at launch and after the forecast period.
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.
confirmedNoIds of questions whose assumption the user confirmed as right (e.g. ["region", "builder"]), so the plan stops asking them. A question answered with a figure goes in its own argument instead (per_user, revenue_per_mau_usd…).
build_toolNoThe build tool the user named, as a coding vendor id (lovable, bolt, replit, base44, v0, cursor, claude-code, github-copilot…): the plan uses it. An app builder that hosts the app and runs its database and sign-in (Lovable, Bolt, Replit, Base44) covers those, so they are not planned separately.
categoriesNoPlan these categories. Default: a build tool (an AI app builder or coding agent) plus what the description needs (a web app gets hosting, database, sign-in, email, payments and observability; an on-device app only what it names; a one-sentence idea such as a pantry tracker what that kind of app usually needs).
profile_idNoUsage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile.
descriptionYesPlain-language product description or PRD text.
task_intentNoWhat the user is trying to do, in a few words, e.g. "pick a stack for an MVP" or "cost section for an investor deck". No names or contact details.
mau_forecastNoMonthly active users expected at the forecast horizon.
builder_profileNoWho builds it. developer picks an AI coding agent, non_developer an app builder (and counts setup work double). Given without categories, the plan adds the build tool (coding).
forecast_monthsNo
budget_monthly_usdNo
output_destinationNoWhere the answer goes. chat (default): summary for the conversation. document: a section ready to paste into a PRD. code: adds npm packages and environment variable names for each pick.
revenue_per_mau_usdNoAverage monthly revenue per active user (for payment fees).
transactions_per_mauNoPayments per active user per month.

Output Schema

NameRequiredDescription
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

TDQS

A4.9/5.0
Behavior5/5

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

The description discloses substantial behavior beyond the annotations: it explains assumptions, defaults_used, question flow, confirmed assumptions, caveats, alternatives, share_url, and that it must not invent vendors or prices. This is rich transparency for a read-only, open-world recommendation tool.

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 long and dense, but it is front-loaded with the core action and organized as a workflow. Most sentences carry actionable guidance, though the volume of presentation instructions makes it less concise than ideal.

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, 19 parameters, output schema, and rich annotations, the description is complete enough for an agent to call it correctly. It covers input guidance, assumption handling, output presentation, caveats, alternatives, and follow-up routing to plan_stack and update_saved_stack.

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?

Although schema coverage is already high at 89%, the description adds important semantics such as which numeric arguments override text, how per_user and confirmed behave, how build_tool affects category planning, and how answers map back to specific arguments. This goes well beyond the schema’s field-level 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 opens with a clear verb and resource: 'Describe the product ... and get a recommended stack with costs now and at scale.' It also distinguishes this from the sibling plan_stack tool by saying 'Start here' and describing the workflow of confirming requirements before calling plan_stack.

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?

It explicitly tells the agent when to use this tool and how it fits with alternatives: start here, pass a PRD if available, confirm requirements, then call plan_stack with corrected requirements. It also says to use update_saved_stack for saved stacks, giving clear routing guidance.

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

record_billsRecord what a stack or account actually costA
Idempotent
Inspect

Record what the user actually paid each service in a month, on one of their saved stacks or audits, and compare it with the estimate at the users it was saved with. Without id, the bills are kept on the account, not on a stack (for someone who has not saved one): they are recorded and listed, with no estimate to compare, and can be moved onto a stack later on the Billing page. Pass bills (month as YYYY-MM, the service as vendor_id or name as on the invoice, amount_usd), or csv: a billing export with columns for month or date, service or vendor, and amount, or invoice_text: an invoice's text as pasted from the PDF or email (the service, month and total are read from it, each with the invoice line it came from; preview: true reads it without saving, so the user can check it first). A bill replaces any earlier one for the same service and month; remove deletes a month (or one service in it). Returns, per service, the estimate, the bill and the difference, flagging bills more than 20% (and $5) over or under. With alerts on, a bill well over its estimate is emailed too. Needs sign-in. How to present: a table of service, estimate, billed and difference; then say what could explain the biggest gap (more users or usage than given, a plan above the one assumed, add-ons the catalogue does not price) and offer update_saved_stack with the real user count.

NameRequiredDescriptionDefault
idNoThe saved stack or audit. Leave out to keep the bills on the account.
csvNoA CSV billing export: a header row, then one row per charge.
billsNo
monthNoWhich month to compare. Default: the newest with bills.
removeNo
previewNoWith invoice_text: read it and show what was found, without saving.
invoice_textNoOne invoice's text, copied from the PDF or the email.

Output Schema

NameRequiredDescription
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

TDQS

A4.5/5.0
Behavior5/5

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

With readOnlyHint=false already set, the description still adds substantial disclosure: sign-in requirement, that a new bill replaces the earlier one for the same service/month (idempotent, matching idempotentHint), that remove deletes a month or a single service, that alerts can trigger an outbound email, and that a >20%/$5 gap gets flagged. Note the mild tension with destructiveHint=false given 'remove deletes a month', but this is record-level cleanup of bill entries rather than account data loss, so it does not read as a contradiction.

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

Conciseness3/5

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

The content is dense and mostly earns its place, but it arrives as one long run-on paragraph with stacked parentheticals, so key facts (mode selection, replacement semantics, return shape) are hard to scan. The trailing 'How to present' instruction is useful but adds further bulk without any structural separation.

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

Completeness4/5

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

For a 7-parameter, nested-object, multi-modal tool with an output schema, this covers auth, write semantics, side effects and mode selection thoroughly. Return values are re-described despite an output schema existing, which is redundant rather than harmful; the remaining gap is error/partial-failure behaviour for CSV or invoice parsing.

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?

Goes well past the 71% schema coverage: it specifies the bills item shape (month as YYYY-MM, vendor_id or invoice name, amount_usd), what columns the csv must contain, that invoice_text is pasted PDF/email text from which service/month/total are extracted, and that preview only reads without saving. It also clarifies the id-absent behaviour and the month default, which the schema only partially carries.

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?

States a specific verb and resource ('Record what the user actually paid each service in a month, on one of their saved stacks or audits') and the downstream comparison against the estimate. An agent can distinguish this from estimate_cost, plan_stack or project_stack without opening the schema, since this is the only one that ingests actual invoices/bills.

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?

Clearly routes the three input modes (bills, csv, invoice_text) and the id-less variant ('the bills are kept on the account, not on a stack'), plus the preview/remove sub-modes. It also tells the agent to offer update_saved_stack afterwards when the real user count differs. It never explicitly says when NOT to use it (e.g. use estimate_cost for hypotheticals), but the context is unambiguous.

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

save_stackSave a stack to your accountAInspect

Save a recommended stack, or an audit of an existing app, to the signed-in user's Kong Reviews account so it can be reopened later and compared with current prices. Pass the share_url from recommend_stack, plan_stack or audit_stack (preferred) or the plan_stack arguments, plus a short name such as "Yoga booking MVP". Afterwards, offer update_saved_stack with alerts: true so they are emailed when prices or cost jumps change it. Needs sign-in: if the user isn't signed in, the app will ask them to connect their Kong Reviews account. Only save when the user asks to keep or save a stack.

NameRequiredDescriptionDefault
nameYesShort name the user will recognise.
planNoplan_stack arguments, if there is no share_url.
share_urlNoshare_url returned by recommend_stack, plan_stack or audit_stack.

Output Schema

NameRequiredDescription
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

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, non-idempotent write, and the description adds auth behavior (sign-in required, the app will prompt to connect an account) plus the post-save lifecycle (reopenable, comparable against current prices, eligible for price alerts). It does not say what happens when the same stack is saved twice, which matters because idempotentHint=false — a minor but real gap.

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 core action and accepted inputs are front-loaded, followed by the follow-up workflow, the auth caveat, and finally the gating rule. Most sentences carry weight, though the account/auth sentences could be tightened slightly without losing meaning.

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?

For a nested-object write tool with an output schema, the description covers everything needed to invoke it correctly: which inputs to pass and in what order of preference, naming guidance, auth preconditions, the recommended downstream call, and a usage gate. Return values are handled by the output schema, so their absence from the description is appropriate.

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 100%, so baseline is 3, but the description adds genuine precedence semantics not encoded in the schema: share_url is preferred and plan is the fallback when no share_url exists, and plan is defined as 'plan_stack arguments'. It also illustrates the name parameter with a concrete example.

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?

States a specific verb (save) and resource (a recommended stack or app audit) and names the destination account, making clear it is a persistence operation distinct from generation siblings like recommend_stack, plan_stack and audit_stack. The distinction from update_saved_stack is also implied via the follow-up instruction.

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?

Gives an explicit trigger condition ('Only save when the user asks to keep or save a stack'), names the preferred input source (share_url from recommend_stack/plan_stack/audit_stack) with a documented fallback (plan_stack arguments), and prescribes the natural next step (offer update_saved_stack with alerts: true). Alternatives and exclusions are both present.

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

search_directorySearch the service directoryA
Read-only
Inspect

Search the directory of developer services (hosting, databases, auth, email, SMS, payments, analytics, monitoring, LLM APIs, vector databases, search, CMS and more): what each provider sells, its free tier, its lowest paid price, caveats and the pricing page it came from. Wider than the cost engine: use it to find options or check a provider the other tools don't price. Entries marked candidate have no prices yet. A provider can carry availability (acquired, shutting_down) and an admin_note: say so when you mention it. Services that shut down are left out unless include_closed is true. Example: {"query":"postgres","category":"database"}.

NameRequiredDescriptionDefault
idNoExact provider id, e.g. "neon".
limitNo
queryNoWords to match, e.g. "sms", "vector", "merchant of record", "Supabase", or a company such as "Amazon" for all its services.
offsetNo
statusNoresearched: prices read from the pricing page. candidate: listed without prices.
categoryNoDirectory category id, e.g. database, email, sms, llm, vector_db. Every result lists the categories with counts.
in_cost_engineNotrue: only providers estimate_cost and plan_stack can price.
include_closedNotrue: include services that have shut down (left out by default; an exact id always finds one).

Output Schema

NameRequiredDescription
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

TDQS

A4.6/5.0
Behavior4/5

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

Beyond the readOnly/openWorld annotations, it discloses meaningful behavior: candidate entries carry no prices, results may include availability flags (acquired, shutting_down) plus admin_note with an instruction to surface them, and closed services are excluded by default. It stops short of describing result ordering or pagination behavior, which keeps it at a 4 rather than 5.

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

Conciseness4/5

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

The capability and its differentiation from the cost engine are front-loaded, followed by edge-case rules and an example. It is dense but not padded; the only slight drag is the long enumeration of categories and the closing example sitting mid-paragraph.

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?

With 8 params, an output schema present, and annotations covering the safety profile, the description supplies everything else the agent needs: scope, filtering defaults, status semantics, and how to treat availability metadata. Nothing required to call it correctly is missing.

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 75%, so the schema carries most parameter meaning; the description adds value on top by explaining candidate vs. researched semantics, the default exclusion of closed services, and a worked example ({"query":"postgres","category":"database"}). It does not elaborate on id, limit, or offset, but those are self-documenting in 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 states a specific verb and resource ("search the directory of developer services") and enumerates the covered categories, then explicitly positions it against the cost-engine siblings. An agent can distinguish it from estimate_cost, plan_stack, or compare_vendors without opening any schema.

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?

It names the selection condition directly: use it "to find options or check a provider the other tools don't price," and notes it is "wider than the cost engine." It also gives concrete when-to-use rules for edge cases (candidate entries, include_closed, availability/admin_note disclosure).

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

search_showcaseSearch the startup showcaseA
Read-only
Inspect

Browse products startups have built and the stack each runs on: what it is, whether it is a website, a mobile app, both or a desktop app, its category and pricing, and every framework and service it uses (services link to the directory and, where priced, the cost engine). Use it to find real stacks to learn from, e.g. apps built with Supabase. Results list each filter value with counts. Example: {"tech":"supabase","form":"app"}.

NameRequiredDescriptionDefault
idNoExact product id.
formNoHow it ships. web: a website (maybe with a desktop app). app: a mobile app only. both: a website and a mobile app. desktop: a desktop app with no website (maybe with a mobile app).
sortNostars: most GitHub stars first.featured
techNoA tech key from facets.tech: a directory id such as "supabase", or a framework such as "next-js".
limitNo
queryNoWords to match against names, taglines, makers and the stack, e.g. "habit tracker", "Expo".
offsetNo
pricingNo
categoryNo
platformNoRuns on this platform, whatever else it runs on.

Output Schema

NameRequiredDescription
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

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare this as a safe read-only operation, so the description focuses on behavior beyond safety: results include filter-value counts, and service links connect to the directory and cost engine where priced. It does not discuss pagination behavior or rate limits, but with annotations carrying the safety profile this is a useful addition.

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 text is front-loaded with what is browsed and what each result contains, then moves to usage and an example. It is dense but every sentence contributes; there is little 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?

With 10 optional parameters, an output schema, and read-only annotations, the description is sufficient for an agent to understand the search surface and invoke it. It could be stronger by naming the closest sibling alternative, but no critical information is missing.

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 60%, so several parameters are documented but not all. The description adds an example combination ({tech: supabase, form: app}) and notes that results list filter values with counts, but it does not explain fields such as pricing, category, limit, or offset beyond schema enums/defaults. It adds only modest value over the schema.

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

Purpose4/5

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

The description clearly states a specific verb and resource: browse/search startup-built products and the stack each runs on. It enumerates the dimensions returned (form, category, pricing, frameworks/services), which distinguishes it from generic directory search. It does not explicitly contrast itself with sibling search_directory, so it falls short of a 5.

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

Usage Guidelines4/5

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

It gives a clear use case (“find real stacks to learn from, e.g. apps built with Supabase”) and an example query. However, it does not state when to use this instead of search_directory or recommend_stack, nor does it give exclusions.

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

update_saved_stackUpdate a saved stack: users, name or alertsA
Idempotent
Inspect

Change one of the signed-in user's saved stacks or audits: its name, how many users it has now (mau_now) or expects (mau_forecast), whether to email them when it changes (alerts), which build-pack steps are done (build_progress, for plans) and which steps of a host move are done (migration_progress, for audits). With alerts on, Kong Reviews checks it every day and emails when a vendor's price change moves its monthly cost, when a cost jump or a startup credit running out is about 45 days away, and once a month to ask for the current user count. Alerts need a confirmed email: pass email to send the confirmation link (GitHub sign-in shares no email). Updating users re-prices it and makes today the start of its projection. Needs sign-in.

NameRequiredDescriptionDefault
idYes
nameNo
emailNoWhere alerts go. A confirmation link is sent first; only ask for it when the user wants alerts.
alertsNoEmail the user when prices, cost jumps or credits change this stack.
answersNoAnswers to the plan's questions (from get_saved_stack), kept with the stack so a re-plan doesn't ask again. Plans only. Re-prices the stack.
mau_nowNoMonthly active users today.
unlink_repoNoForget the repo linked with check_build, and its last check.
mau_forecastNoUsers expected at the end of the forecast (12 months for audits).
build_progressNoTick build-pack steps done (true) or not done (false), by step id from get_build_pack: domain or the step's category (hosting, database, auth…). Plans only.
migration_progressNoTick a host move's features and cutover steps done (true) or not done (false), by id from plan_migration (e.g. forms, redirects, lower-ttl, switch). Audits only.

Output Schema

NameRequiredDescription
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

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: updating users re-prices the stack and resets the projection start to today, and enabling alerts triggers daily monitoring with three specific email conditions. It also discloses the auth/email-confirmation requirement (GitHub sign-in shares no email), which is exactly the kind of operational detail annotations cannot express.

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

Conciseness4/5

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

Front-loaded with the core action and the field list, with the caveats following. The alerts paragraph is long — three distinct email triggers are more than an agent needs to invoke the tool — but it is dense and free of filler.

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

Completeness4/5

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

Output schema exists, so return values need no explanation, and the description covers side effects, auth and per-entity field applicability. Minor gap: `answers` (a large nested object that re-prices the stack) and `unlink_repo` (which destroys the linked repo check) are only covered inside the schema, not in the description.

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 already 80%, yet the description disambiguates the two easily-confused user fields (mau_now = today, mau_forecast = end of projection, 12 months for audits) and explains build_progress/migration_progress scope. It does not mention unlink_repo or the answers object, leaving those to 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?

States a specific verb plus resource ('Change one of the signed-in user's saved stacks or audits') and enumerates exactly what is mutable: name, mau_now, mau_forecast, alerts, build_progress, migration_progress. It also scopes which fields apply to which entity ('for plans' vs 'for audits'), which no sibling tool name conveys.

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

Usage Guidelines4/5

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

Gives clear preconditions and gating rules: 'Needs sign-in', alerts require a confirmed email, and the email confirmation link must be requested first. It lacks an explicit 'use this instead of save_stack/plan_stack when…' routing sentence, so the agent must infer the edit-vs-create boundary from sibling names.

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

Tool Schema Changelog

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

  1. 29 tool updates
    • Changedaudit_stack3 fields changed
      • 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"
        +]
      • changedInput schema / properties / stack / 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."
    • Addedcheck_build
    • Changedcheck_fit14 fields changed
      • 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."
    • Changedcompare_architectures3 fields changed
      • changedInput schema / 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"
        +]
      • 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."
    • Changedcompare_vendors15 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"
        +]
      • 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."
    • Changeddelete_account1 field changed
      • 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."
    • Changeddelete_saved_stack1 field changed
      • 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."
    • Changeddetect_stack1 field changed
      • 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."
    • Changeddiff_stack2 fields changed
      • 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."
    • Changedestimate_cost24 fields changed
      • 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 / usage / description
        Previous value: -"Exact monthly usage by unit (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); overrides values derived from mau."New value: +"Exact monthly usage by unit (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); overrides values derived from mau."
      • addedInput schema / properties / usage / properties / file_egress_gb
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / file_read
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / file_storage_gb
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / file_write
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / job_run
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / search_record
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / search_request
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / sms
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / video_min_delivered
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / usage / properties / video_min_stored
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • 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."
    • Changedevaluate_change16 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."
    • Changedextract_requirements1 field changed
      • 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."
    • Changedfind_cost_cliffs13 fields changed
      • 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"
        +}
      • 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."
    • Changedfind_perks1 field changed
      • 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."
    • Addedget_build_pack
    • Changedget_pricing1 field changed
      • 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."
    • Changedget_saved_stack1 field changed
      • 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."
    • Changedlist_capabilities1 field changed
      • 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."
    • Changedlist_saved_stacks1 field changed
      • 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."
    • Changedlist_vendors2 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"
        +]
      • 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."
    • Addedplan_migration
    • Changedplan_stack21 fields changed
      • addedInput schema / properties / accounts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "For a business product counted in customers (\"50 clinics now, 500 next year\"): customers now and at the forecast, and people using it at each (default 10). Users are worked out from these when mau_now is not given.",
        +  "properties": {
        +    "forecast": {
        +      "maximum": 10000000,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "now": {
        +      "maximum": 10000000,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "users_per_account": {
        +      "maximum": 100000,
        +      "minimum": 1,
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / build_tool
        Added value: +{
        +  "description": "The build tool the user named, as a coding vendor id (lovable, bolt, replit, base44, v0, cursor, claude-code, github-copilot…): the plan uses it. An app builder that hosts the app and runs its database and sign-in (Lovable, Bolt, Replit, Base44) covers those, so they are not planned separately.",
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / builder_profile
        Added value: +{
        +  "description": "Who builds it. developer picks an AI coding agent, non_developer an app builder (and counts setup work double). Given without categories, the plan adds the build tool (coding).",
        +  "enum": [
        +    "developer",
        +    "non_developer",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / 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"
        +]
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Ids of questions whose assumption the user confirmed as right (e.g. [\"region\", \"builder\"]), so the plan stops asking them. A question answered with a figure goes in its own argument instead (per_user, revenue_per_mau_usd…).",
        +  "items": {
        +    "maxLength": 40,
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "type": "array"
        +}
      • addedInput schema / properties / needs
        Added value: +{
        +  "description": "Needs the plan should list even though they are not priced (directory category ids such as maps, vector_db, speech), from recommend_stack's requirements_read.needs.",
        +  "items": {
        +    "properties": {
        +      "id": {
        +        "maxLength": 40,
        +        "type": "string"
        +      },
        +      "label": {
        +        "maxLength": 80,
        +        "type": "string"
        +      },
        +      "source": {
        +        "maxLength": 500,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  "maxItems": 20,
        +  "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"
        +}
      • addedInput schema / properties / ranking
        Added value: +{
        +  "description": "balanced (default): monthly cost plus a small monthly weight for lock-in, setup work before first use and unverified seed prices, so a slightly cheaper vendor that is hard to leave or slow to set up can lose. cost: price alone. simplest: fewest vendors and least setup (one vendor covering several categories wins unless the others are much cheaper). Each plan lists the other two as alternatives when their picks differ.",
        +  "enum": [
        +    "balanced",
        +    "cost",
        +    "simplest"
        +  ],
        +  "type": "string"
        +}
      • 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."
    • Changedproject_stack14 fields changed
      • 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 / vendors / maxItems
        Previous value: -12New value: +20
      • 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."
    • Changedrecommend_stack8 fields changed
      • addedInput schema / properties / build_tool
        Added value: +{
        +  "description": "The build tool the user named, as a coding vendor id (lovable, bolt, replit, base44, v0, cursor, claude-code, github-copilot…): the plan uses it. An app builder that hosts the app and runs its database and sign-in (Lovable, Bolt, Replit, Base44) covers those, so they are not planned separately.",
        +  "maxLength": 40,
        +  "type": "string"
        +}
      • addedInput schema / properties / builder_profile
        Added value: +{
        +  "description": "Who builds it. developer picks an AI coding agent, non_developer an app builder (and counts setup work double). Given without categories, the plan adds the build tool (coding).",
        +  "enum": [
        +    "developer",
        +    "non_developer",
        +    "unknown"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / categories / description
        Previous value: -"Plan these categories. Default: what the description needs (a web app gets hosting, database, sign-in, email, payments and observability; an on-device app only what it names)."New value: +"Plan these categories. Default: a build tool (an AI app builder or coding agent) plus what the description needs (a web app gets hosting, database, sign-in, email, payments and observability; an on-device app only what it names; a one-sentence idea such as a pantry tracker what that kind of app usually needs)."
      • changedInput schema / 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"
        +]
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "description": "Ids of questions whose assumption the user confirmed as right (e.g. [\"region\", \"builder\"]), so the plan stops asking them. A question answered with a figure goes in its own argument instead (per_user, revenue_per_mau_usd…).",
        +  "items": {
        +    "maxLength": 40,
        +    "type": "string"
        +  },
        +  "maxItems": 20,
        +  "type": "array"
        +}
      • 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"
        +}
      • addedInput schema / properties / ranking
        Added value: +{
        +  "description": "balanced (default): monthly cost plus a small monthly weight for lock-in, setup work before first use and unverified seed prices, so a slightly cheaper vendor that is hard to leave or slow to set up can lose. cost: price alone. simplest: fewest vendors and least setup (one vendor covering several categories wins unless the others are much cheaper). Each plan lists the other two as alternatives when their picks differ.",
        +  "enum": [
        +    "balanced",
        +    "cost",
        +    "simplest"
        +  ],
        +  "type": "string"
        +}
      • 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."
    • Changedrecord_bills1 field changed
      • 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."
    • Changedsave_stack1 field changed
      • 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."
    • Changedsearch_directory2 fields changed
      • addedInput schema / properties / include_closed
        Added value: +{
        +  "description": "true: include services that have shut down (left out by default; an exact id always finds one).",
        +  "type": "boolean"
        +}
      • 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."
    • Changedsearch_showcase2 fields changed
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "ai",
        -  "productivity",
        -  "developer_tools",
        -  "finance",
        -  "health",
        -  "education",
        -  "commerce",
        -  "social",
        -  "design",
        -  "media",
        -  "travel",
        -  "marketing",
        -  "other"
        -]New value: +[
        +  "ai",
        +  "commerce",
        +  "customer_support",
        +  "data_analytics",
        +  "design",
        +  "developer_tools",
        +  "education",
        +  "energy",
        +  "finance",
        +  "government",
        +  "hardware",
        +  "health",
        +  "hr",
        +  "industrial",
        +  "legal",
        +  "marketing",
        +  "media",
        +  "productivity",
        +  "sales",
        +  "security",
        +  "social",
        +  "travel",
        +  "other"
        +]
      • 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."
    • Changedupdate_saved_stack5 fields changed
      • addedInput schema / properties / answers
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Answers to the plan's questions (from get_saved_stack), kept with the stack so a re-plan doesn't ask again. Plans only. Re-prices the stack.",
        +  "properties": {
        +    "builder_profile": {
        +      "enum": [
        +        "developer",
        +        "non_developer"
        +      ],
        +      "type": "string"
        +    },
        +    "confirmed": {
        +      "description": "Question ids whose assumption is right, e.g. [\"region\", \"builder\"].",
        +      "items": {
        +        "maxLength": 40,
        +        "type": "string"
        +      },
        +      "maxItems": 20,
        +      "type": "array"
        +    },
        +    "data_in_eu": {
        +      "description": "true: user data has to stay in the EU. false: no region requirement.",
        +      "type": "boolean"
        +    },
        +    "per_user": {
        +      "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"
        +    },
        +    "revenue_per_mau_usd": {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "transactions_per_mau": {
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "users_per_account": {
        +      "description": "People who use it at each business customer.",
        +      "maximum": 100000,
        +      "minimum": 1,
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / build_progress
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Tick build-pack steps done (true) or not done (false), by step id from get_build_pack: domain or the step's category (hosting, database, auth…). Plans only.",
        +  "properties": {
        +    "ai": {
        +      "type": "boolean"
        +    },
        +    "app_store": {
        +      "type": "boolean"
        +    },
        +    "auth": {
        +      "type": "boolean"
        +    },
        +    "coding": {
        +      "type": "boolean"
        +    },
        +    "database": {
        +      "type": "boolean"
        +    },
        +    "domain": {
        +      "type": "boolean"
        +    },
        +    "edge": {
        +      "type": "boolean"
        +    },
        +    "email": {
        +      "type": "boolean"
        +    },
        +    "hosting": {
        +      "type": "boolean"
        +    },
        +    "jobs": {
        +      "type": "boolean"
        +    },
        +    "observability": {
        +      "type": "boolean"
        +    },
        +    "payments": {
        +      "type": "boolean"
        +    },
        +    "push": {
        +      "type": "boolean"
        +    },
        +    "search": {
        +      "type": "boolean"
        +    },
        +    "sms": {
        +      "type": "boolean"
        +    },
        +    "storage": {
        +      "type": "boolean"
        +    },
        +    "video": {
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / migration_progress
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Tick a host move's features and cutover steps done (true) or not done (false), by id from plan_migration (e.g. forms, redirects, lower-ttl, switch). Audits only.",
        +  "type": "object"
        +}
      • addedInput schema / properties / unlink_repo
        Added value: +{
        +  "description": "Forget the repo linked with check_build, and its last check.",
        +  "type": "boolean"
        +}
      • 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. 1 tool update
    • Changedsearch_directory1 field changed
      • changedInput schema / properties / query / description
        Previous value: -"Words to match, e.g. \"sms\", \"vector\", \"merchant of record\", \"Supabase\"."New value: +"Words to match, e.g. \"sms\", \"vector\", \"merchant of record\", \"Supabase\", or a company such as \"Amazon\" for all its services."
  3. 1 tool update
    • Changedrecord_bills2 fields changed
      • addedInput schema / properties / id / description
        Added value: +"The saved stack or audit. Leave out to keep the bills on the account."
      • removedInput schema / required
        Removed value: -[
        -  "id"
        -]
  4. 2 tool updates
    • Addedcompare_architectures
    • Changedplan_stack3 fields changed
      • addedInput schema / properties / answers
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Interview answers by question id, each an option id from compare_architectures, e.g. {\"server\":\"dynamic\",\"logins\":\"consumers\",\"threat\":\"public\",\"ops\":\"managed\"}.",
        +  "properties": {
        +    "background": {
        +      "enum": [
        +        "none",
        +        "jobs",
        +        "realtime"
        +      ],
        +      "type": "string"
        +    },
        +    "data": {
        +      "enum": [
        +        "little",
        +        "lots"
        +      ],
        +      "type": "string"
        +    },
        +    "logins": {
        +      "enum": [
        +        "none",
        +        "consumers",
        +        "teams",
        +        "enterprise"
        +      ],
        +      "type": "string"
        +    },
        +    "media": {
        +      "enum": [
        +        "none",
        +        "images",
        +        "video"
        +      ],
        +      "type": "string"
        +    },
        +    "ops": {
        +      "enum": [
        +        "managed",
        +        "some",
        +        "admin"
        +      ],
        +      "type": "string"
        +    },
        +    "sensitivity": {
        +      "enum": [
        +        "low",
        +        "eu",
        +        "business",
        +        "health"
        +      ],
        +      "type": "string"
        +    },
        +    "server": {
        +      "enum": [
        +        "static",
        +        "mixed",
        +        "dynamic",
        +        "none",
        +        "proxy",
        +        "full"
        +      ],
        +      "type": "string"
        +    },
        +    "threat": {
        +      "enum": [
        +        "low",
        +        "public",
        +        "target"
        +      ],
        +      "type": "string"
        +    },
        +    "uptime": {
        +      "enum": [
        +        "fine",
        +        "costly",
        +        "critical"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedInput schema / properties / architecture
        Added value: +{
        +  "description": "Plan with only this architecture's vendors, from compare_architectures (e.g. serverless_nextjs, cloudflare_edge, vps_cloudflare).",
        +  "enum": [
        +    "static_cdn",
        +    "frontend_baas",
        +    "serverless_nextjs",
        +    "cloudflare_edge",
        +    "managed_containers",
        +    "single_vps",
        +    "vps_cloudflare",
        +    "firebase",
        +    "on_device"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / platforms
        Added value: +{
        +  "description": "Where the app runs; with architecture, a phone-only app leaves out web hosting.",
        +  "items": {
        +    "enum": [
        +      "web",
        +      "ios",
        +      "android",
        +      "desktop"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
  5. 1 tool update
    • Changedrecord_bills2 fields changed
      • addedInput schema / properties / invoice_text
        Added value: +{
        +  "description": "One invoice's text, copied from the PDF or the email.",
        +  "maxLength": 60000,
        +  "type": "string"
        +}
      • addedInput schema / properties / preview
        Added value: +{
        +  "description": "With invoice_text: read it and show what was found, without saving.",
        +  "type": "boolean"
        +}
  6. 5 tool updates
    • Addeddiff_stack
    • Changedget_saved_stack1 field changed
      • addedInput schema / properties / bills_month
        Added value: +{
        +  "description": "Month (YYYY-MM) for the bills comparison; default the newest with bills.",
        +  "maxLength": 20,
        +  "type": "string"
        +}
    • Addedrecord_bills
    • Changedsave_stack1 field changed
      • changedInput schema / properties / share_url / description
        Previous value: -"share_url returned by recommend_stack or plan_stack."New value: +"share_url returned by recommend_stack, plan_stack or audit_stack."
    • Addedupdate_saved_stack
  7. 1 tool update
    • Changedsearch_showcase3 fields changed
      • changedInput schema / properties / category / enum
        Previous value: -[
        -  "ai",
        -  "productivity",
        -  "developer_tools",
        -  "finance",
        -  "health",
        -  "education",
        -  "commerce",
        -  "social",
        -  "design",
        -  "travel",
        -  "marketing",
        -  "other"
        -]New value: +[
        +  "ai",
        +  "productivity",
        +  "developer_tools",
        +  "finance",
        +  "health",
        +  "education",
        +  "commerce",
        +  "social",
        +  "design",
        +  "media",
        +  "travel",
        +  "marketing",
        +  "other"
        +]
      • addedInput schema / properties / sort / description
        Added value: +"stars: most GitHub stars first."
      • changedInput schema / properties / sort / enum
        Previous value: -[
        -  "featured",
        -  "newest",
        -  "name"
        -]New value: +[
        +  "featured",
        +  "newest",
        +  "name",
        +  "stars"
        +]
  8. 11 tool updates
    • Changedaudit_stack2 fields changed
      • 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"
        +]
      • changedInput schema / properties / stack / 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"
        +]
    • Changedcheck_fit2 fields changed
      • 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"
        +]
    • Changedcompare_vendors3 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"
        +]
    • Changedestimate_cost1 field changed
      • 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."
    • Changedevaluate_change3 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"
        +]
    • Changedfind_cost_cliffs1 field changed
      • 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."
    • Changedlist_vendors1 field 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"
        +]
    • Changedplan_stack6 fields changed
      • addedInput schema / properties / app_type
        Added value: +{
        +  "description": "Kind of app, from Product Hunt's categories: productivity, engineering_development, design_creative, finance, marketing_sales, data_analysis, platforms, no_code, product_addons, llms, ai_agents, voice_ai, social_community, health_fitness, family, lifestyle, web3, ecommerce, travel, physical_products, booking_marketplace, content_site, ios_on_device. Sets the usage profile and, when users are not given, typical users at launch and after the forecast period.",
        +  "type": "string"
        +}
      • changedInput schema / 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"
        +]
      • addedInput schema / properties / mau_now / description
        Added value: +"Monthly active users now. Without it, a new product of the app type at launch."
      • 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"
        +]
      • removedInput schema / required
        Removed value: -[
        -  "mau_now"
        -]
    • Changedproject_stack1 field changed
      • 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."
    • Changedrecommend_stack3 fields changed
      • addedInput schema / properties / app_type
        Added value: +{
        +  "description": "Kind of app, from Product Hunt's categories: productivity, engineering_development, design_creative, finance, marketing_sales, data_analysis, platforms, no_code, product_addons, llms, ai_agents, voice_ai, social_community, health_fitness, family, lifestyle, web3, ecommerce, travel, physical_products, booking_marketplace, content_site, ios_on_device. Sets the usage profile and, when users are not given, typical users at launch and after the forecast period.",
        +  "type": "string"
        +}
      • changedInput schema / 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"
        +]
      • 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."
    • Addedsearch_showcase
  9. 1 tool update
    • Addedsearch_directory
  10. 2 tool updates
    • Addedaudit_stack
    • Addeddetect_stack
  11. 18 tool updates
    • First observedcheck_fit
    • First observedcompare_vendors
    • First observeddelete_account
    • First observeddelete_saved_stack
    • First observedestimate_cost
    • First observedevaluate_change
    • First observedextract_requirements
    • First observedfind_cost_cliffs
    • First observedfind_perks
    • First observedget_pricing
    • First observedget_saved_stack
    • First observedlist_capabilities
    • First observedlist_saved_stacks
    • First observedlist_vendors
    • First observedplan_stack
    • First observedproject_stack
    • First observedrecommend_stack
    • First observedsave_stack

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to fetch live, dated prices for LLM models and cloud compute instances across providers, compare and recommend models, and estimate monthly costs based on workload-specific token shapes and constraints.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Search and compare free tiers, credits, and pricing changes across 1,500+ developer tools. 8 MCP tools for infrastructure decisions, cost estimation, and vendor comparison.
    4
    9 npm
    24
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources