Kong Reviews
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
Scored across 29 tools
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.
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.
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.
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 toolsaudit_stackAudit an existing stackARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stack | Yes | ||
| founder | No | Optional company details used only to find startup perks. | |
| mau_now | Yes | ||
| unpriced | No | Services detect_stack found that the catalogue can't price (its "unknown" list). | |
| switching | No | ||
| priorities | No | How much each criterion matters, 0 (not at all) to 3 (most). Defaults: cost 3, requirements 3, scale 2, lock_in 1. | |
| profile_id | No | Usage profile, e.g. b2b_saas, consumer_app, booking_marketplace, content_site, ios_on_device. | |
| mau_forecast | No | Monthly active users expected in 12 months. | |
| requirements | No | ||
| budget_monthly_usd | No | ||
| revenue_per_mau_usd | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 planAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A saved plan id from list_saved_stacks. | |
| repo | No | GitHub repo: owner/name or its github.com address. Links it to the plan, replacing any linked before. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 fitBRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mau | No | ||
| seats | No | Team members on per-seat plans. Default 1. | |
| per_user | No | 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. | |
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| vendor_ids | Yes | ||
| requirements | Yes | ||
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 architecturesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| answers | No | Interview answers by question id, each an option id from compare_architectures, e.g. {"server":"dynamic","logins":"consumers","threat":"public","ops":"managed"}. | |
| founder | No | Optional company details used only to find startup perks. | |
| mau_now | No | ||
| app_type | No | 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. | |
| platforms | No | Where the app runs. A phone app with no web platform gets the phone questions and options. | |
| categories | No | Categories to plan before the answers adjust them. Default: what the description needs. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| description | No | Plain-language product description or PRD text. Read for requirements (unless requirements is given) and for suggested answers. | |
| task_intent | No | What 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_forecast | No | ||
| requirements | No | Requirements already confirmed; when given, the description is not read for requirements again. | |
| forecast_months | No | ||
| budget_monthly_usd | No | ||
| output_destination | No | Where 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_usd | No | Average monthly revenue per active user (for payment fees). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 categoryBRead-onlyInspect
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"}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| mau | Yes | ||
| seats | No | Team members on per-seat plans. Default 1. | |
| exclude | No | ||
| category | Yes | ||
| per_user | No | 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. | |
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| requirements | No | ||
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 accountADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 stackADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 stackARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | The live website, to read its hosting headers and the scripts it loads. | |
| repo | No | Public GitHub repo: owner/name or its github.com address. | |
| text | No | Pasted text, e.g. a package.json or a list of services, when there are no file names. | |
| files | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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)ARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| plans | No | Plans the app is on, when known. | |
| mau_now | No | Monthly active users today. Default 1,000, and the comment says it was assumed. | |
| base_files | Yes | ||
| head_files | Yes | ||
| profile_id | No | ||
| mau_forecast | No | Users expected in 12 months. | |
| requirements | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 costARead-onlyInspect
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| mau | No | ||
| seats | No | Team members on per-seat plans. Default 1. | |
| usage | No | 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. | |
| plan_id | No | ||
| per_user | No | 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. | |
| required | No | Capability ids the plan must include. | |
| vendor_id | Yes | ||
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 switchARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seats | No | Team members on per-seat plans. Default 1. | |
| months | No | ||
| current | Yes | ||
| founder | No | Optional company details used only to find startup perks. | |
| mau_now | Yes | ||
| category | Yes | ||
| per_user | No | 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. | |
| switch_to | No | Evaluate a specific vendor instead of the best-ranked alternative. | |
| switching | No | ||
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| requirements | No | ||
| monthly_growth | No | ||
| migration_features | No | 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. | |
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 PRDARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| prd_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 cliffsARead-onlyInspect
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}.
| Name | Required | Description | Default |
|---|---|---|---|
| seats | No | Team members on per-seat plans. Default 1. | |
| to_mau | No | ||
| from_mau | No | ||
| per_user | No | 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. | |
| required | No | ||
| vendor_id | Yes | ||
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 perksARead-onlyInspect
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"]}}.
| Name | Required | Description | Default |
|---|---|---|---|
| founder | No | Optional company details used only to find startup perks. | |
| vendor_ids | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 stackARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | A saved plan id from list_saved_stacks (needs sign-in). | |
| framework | No | What 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_url | No | A plan link from plan_stack, recommend_stack or kongreviews.com. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 pricingARead-onlyInspect
Structured pricing and capabilities for one vendor: every plan, base fee, metered usage, limits, unmodelled costs, lock-in notes, source URL and verification date.
| Name | Required | Description | Default |
|---|---|---|---|
| vendor_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 pricesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| bills_month | No | Month (YYYY-MM) for the bills comparison; default the newest with bills. | |
| task_intent | No | What 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_destination | No | Where 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
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 capabilitiesBRead-onlyInspect
List capability ids (features, compliance, regions) that requirements can reference, e.g. auth.saml_sso, region.eu, payments.merchant_of_record.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 stacksARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 vendorsBRead-onlyInspect
List vendors in the pricing catalogue, optionally for one category (hosting, database, auth, email, payments, observability, ai, edge, app_store, coding).
| Name | Required | Description | Default |
|---|---|---|---|
| category | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 hostARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | A saved audit id (list_saved_stacks; needs sign-in): uses its users and plan, and shows the steps ticked so far. | |
| to | No | Target host vendor id. Default digitalocean-app-platform. | |
| from | No | Current host vendor id. Default netlify. | |
| repo | No | GitHub repo: owner/name or its github.com address. | |
| text | No | ||
| files | No | netlify.toml, _redirects, _headers, package.json, .env.example (names only), files in netlify/functions and netlify/edge-functions, and pages with forms. | |
| seats | No | Team members on per-seat plans. Default 1. | |
| branch | No | ||
| domain | No | The site's domain, for the draft spec. | |
| months | No | ||
| mau_now | No | Monthly active users today. Default 1,000, and the result says it was assumed. | |
| features | No | Feature ids the person confirms the app uses, including what only the dashboard shows (netlify-dns, forms, deploy-previews, custom-domain). | |
| per_user | No | 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. | |
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| monthly_growth | No | ||
| current_plan_id | No | The current host plan, if known; otherwise the cheapest that serves today's users is assumed. | |
| hourly_rate_usd | No | What an hour of work costs. Default $100. | |
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 requirementsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| needs | No | 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. | |
| seats | No | Team members on per-seat plans. Default 1. | |
| answers | No | Interview answers by question id, each an option id from compare_architectures, e.g. {"server":"dynamic","logins":"consumers","threat":"public","ops":"managed"}. | |
| founder | No | Optional company details used only to find startup perks. | |
| mau_now | No | Monthly active users now. Without it, a new product of the app type at launch. | |
| ranking | No | 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. | |
| accounts | No | 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. | |
| app_type | No | 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. | |
| per_user | No | 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. | |
| confirmed | No | 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…). | |
| platforms | No | Where the app runs; with architecture, a phone-only app leaves out web hosting. | |
| build_tool | No | 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. | |
| categories | No | ||
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| apply_perks | No | ||
| task_intent | No | What 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. | |
| architecture | No | Plan with only this architecture's vendors, from compare_architectures (e.g. serverless_nextjs, cloudflare_edge, vps_cloudflare). | |
| mau_forecast | No | ||
| requirements | No | ||
| builder_profile | No | 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). | |
| exclude_vendors | No | ||
| forecast_months | No | ||
| budget_monthly_usd | No | ||
| output_destination | No | Where 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_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 timeBRead-onlyInspect
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"]}}.
| Name | Required | Description | Default |
|---|---|---|---|
| seats | No | Team members on per-seat plans. Default 1. | |
| months | No | ||
| founder | No | Optional company details used only to find startup perks. | |
| vendors | Yes | ||
| per_user | No | 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. | |
| start_mau | Yes | ||
| mau_series | No | Explicit MAU per month; overrides start_mau, monthly_growth and months. | |
| per_1k_mau | No | 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. | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| apply_perks | No | ||
| monthly_growth | No | e.g. 0.1 = 10% per month | |
| revenue_per_mau_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 descriptionARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| seats | No | Team members on per-seat plans. Default 1. | |
| founder | No | Optional company details used only to find startup perks. | |
| mau_now | No | Monthly active users now or at launch. | |
| ranking | No | 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. | |
| app_type | No | 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. | |
| per_user | No | 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. | |
| confirmed | No | 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…). | |
| build_tool | No | 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. | |
| categories | No | 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). | |
| profile_id | No | Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile. | |
| description | Yes | Plain-language product description or PRD text. | |
| task_intent | No | What 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_forecast | No | Monthly active users expected at the forecast horizon. | |
| builder_profile | No | 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). | |
| forecast_months | No | ||
| budget_monthly_usd | No | ||
| output_destination | No | Where 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_usd | No | Average monthly revenue per active user (for payment fees). | |
| transactions_per_mau | No | Payments per active user per month. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 costAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The saved stack or audit. Leave out to keep the bills on the account. | |
| csv | No | A CSV billing export: a header row, then one row per charge. | |
| bills | No | ||
| month | No | Which month to compare. Default: the newest with bills. | |
| remove | No | ||
| preview | No | With invoice_text: read it and show what was found, without saving. | |
| invoice_text | No | One invoice's text, copied from the PDF or the email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Short name the user will recognise. | |
| plan | No | plan_stack arguments, if there is no share_url. | |
| share_url | No | share_url returned by recommend_stack, plan_stack or audit_stack. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 directoryARead-onlyInspect
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Exact provider id, e.g. "neon". | |
| limit | No | ||
| query | No | Words to match, e.g. "sms", "vector", "merchant of record", "Supabase", or a company such as "Amazon" for all its services. | |
| offset | No | ||
| status | No | researched: prices read from the pricing page. candidate: listed without prices. | |
| category | No | Directory category id, e.g. database, email, sms, llm, vector_db. Every result lists the categories with counts. | |
| in_cost_engine | No | true: only providers estimate_cost and plan_stack can price. | |
| include_closed | No | true: include services that have shut down (left out by default; an exact id always finds one). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 showcaseARead-onlyInspect
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"}.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Exact product id. | |
| form | No | How 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). | |
| sort | No | stars: most GitHub stars first. | featured |
| tech | No | A tech key from facets.tech: a directory id such as "supabase", or a framework such as "next-js". | |
| limit | No | ||
| query | No | Words to match against names, taglines, makers and the stack, e.g. "habit tracker", "Expo". | |
| offset | No | ||
| pricing | No | ||
| category | No | ||
| platform | No | Runs on this platform, whatever else it runs on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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 alertsAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| name | No | ||
| No | Where alerts go. A confirmation link is sent first; only ask for it when the user wants alerts. | ||
| alerts | No | Email the user when prices, cost jumps or credits change this stack. | |
| answers | No | 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. | |
| mau_now | No | Monthly active users today. | |
| unlink_repo | No | Forget the repo linked with check_build, and its last check. | |
| mau_forecast | No | Users expected at the end of the forecast (12 months for audits). | |
| build_progress | No | 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. | |
| migration_progress | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | The tool result. Its shape depends on the tool. |
| stale | Yes | |
| caveats | Yes | Show to the user word for word. |
| sources | Yes | |
| confidence | Yes | |
| assumptions | Yes | Usage and pricing assumptions behind the numbers. |
| disclosures | Yes | 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. |
| generated_at | Yes | |
| engine_version | Yes |
TDQS
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.
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.
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.
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.
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.
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.
29 tool updates
- Changed
audit_stack3 fields changed- changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - changed
Input schema / properties / stack / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Added
check_build - Changed
check_fit14 fields changed- changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
compare_architectures3 fields changed- changed
Input schema / properties / categories / items / enumPrevious 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" +] - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
compare_vendors15 fields changed- changed
Input schema / properties / category / enumPrevious 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" +] - changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
delete_account1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
delete_saved_stack1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
detect_stack1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
diff_stack2 fields changed- changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
estimate_cost24 fields changed- changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - changed
Input schema / properties / usage / descriptionPrevious 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." - added
Input schema / properties / usage / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / usage / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
evaluate_change16 fields changed- changed
Input schema / properties / category / enumPrevious 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" +] - added
Input schema / properties / migration_featuresAdded 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" +} - changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
extract_requirements1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
find_cost_cliffs13 fields changed- changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
find_perks1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Added
get_build_pack - Changed
get_pricing1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
get_saved_stack1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
list_capabilities1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
list_saved_stacks1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
list_vendors2 fields changed- changed
Input schema / properties / category / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Added
plan_migration - Changed
plan_stack21 fields changed- added
Input schema / properties / accountsAdded 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" +} - added
Input schema / properties / build_toolAdded 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" +} - added
Input schema / properties / builder_profileAdded 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" +} - changed
Input schema / properties / categories / items / enumPrevious 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" +] - added
Input schema / properties / confirmedAdded 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" +} - added
Input schema / properties / needsAdded 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" +} - changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - added
Input schema / properties / rankingAdded 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" +} - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
project_stack14 fields changed- changed
Input schema / properties / per_1k_mau / descriptionPrevious 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." - added
Input schema / properties / per_1k_mau / properties / file_egress_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_readAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_storage_gbAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / file_writeAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / job_runAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_recordAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / search_requestAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / smsAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_deliveredAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_1k_mau / properties / video_min_storedAdded value: +{ + "minimum": 0, + "type": "number" +} - added
Input schema / properties / per_userAdded 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" +} - changed
Input schema / properties / vendors / maxItemsPrevious value: -12New value: +20 - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
recommend_stack8 fields changed- added
Input schema / properties / build_toolAdded 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" +} - added
Input schema / properties / builder_profileAdded 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" +} - changed
Input schema / properties / categories / descriptionPrevious 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)." - changed
Input schema / properties / categories / items / enumPrevious 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" +] - added
Input schema / properties / confirmedAdded 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" +} - added
Input schema / properties / per_userAdded 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" +} - added
Input schema / properties / rankingAdded 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" +} - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
record_bills1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
save_stack1 field changed- added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
search_directory2 fields changed- added
Input schema / properties / include_closedAdded value: +{ + "description": "true: include services that have shut down (left out by default; an exact id always finds one).", + "type": "boolean" +} - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
search_showcase2 fields changed- changed
Input schema / properties / category / enumPrevious 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" +] - added
Output schema / properties / disclosures / descriptionAdded 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."
- Changed
update_saved_stack5 fields changed- added
Input schema / properties / answersAdded 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" +} - added
Input schema / properties / build_progressAdded 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" +} - added
Input schema / properties / migration_progressAdded 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" +} - added
Input schema / properties / unlink_repoAdded value: +{ + "description": "Forget the repo linked with check_build, and its last check.", + "type": "boolean" +} - added
Output schema / properties / disclosures / descriptionAdded 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."
1 tool update
- Changed
search_directory1 field changed- changed
Input schema / properties / query / descriptionPrevious 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."
1 tool update
- Changed
record_bills2 fields changed- added
Input schema / properties / id / descriptionAdded value: +"The saved stack or audit. Leave out to keep the bills on the account." - removed
Input schema / requiredRemoved value: -[ - "id" -]
2 tool updates
- Added
compare_architectures - Changed
plan_stack3 fields changed- added
Input schema / properties / answersAdded 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" +} - added
Input schema / properties / architectureAdded 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" +} - added
Input schema / properties / platformsAdded 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" +}
1 tool update
- Changed
record_bills2 fields changed- added
Input schema / properties / invoice_textAdded value: +{ + "description": "One invoice's text, copied from the PDF or the email.", + "maxLength": 60000, + "type": "string" +} - added
Input schema / properties / previewAdded value: +{ + "description": "With invoice_text: read it and show what was found, without saving.", + "type": "boolean" +}
5 tool updates
- Added
diff_stack - Changed
get_saved_stack1 field changed- added
Input schema / properties / bills_monthAdded value: +{ + "description": "Month (YYYY-MM) for the bills comparison; default the newest with bills.", + "maxLength": 20, + "type": "string" +}
- Added
record_bills - Changed
save_stack1 field changed- changed
Input schema / properties / share_url / descriptionPrevious value: -"share_url returned by recommend_stack or plan_stack."New value: +"share_url returned by recommend_stack, plan_stack or audit_stack."
- Added
update_saved_stack
1 tool update
- Changed
search_showcase3 fields changed- changed
Input schema / properties / category / enumPrevious 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" +] - added
Input schema / properties / sort / descriptionAdded value: +"stars: most GitHub stars first." - changed
Input schema / properties / sort / enumPrevious value: -[ - "featured", - "newest", - "name" -]New value: +[ + "featured", + "newest", + "name", + "stars" +]
11 tool updates
- Changed
audit_stack2 fields changed- changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +] - changed
Input schema / properties / stack / items / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +]
- Changed
check_fit2 fields changed- changed
Input schema / properties / profile_id / descriptionPrevious 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." - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +]
- Changed
compare_vendors3 fields changed- changed
Input schema / properties / category / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +] - changed
Input schema / properties / profile_id / descriptionPrevious 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." - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +]
- Changed
estimate_cost1 field changed- changed
Input schema / properties / profile_id / descriptionPrevious 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."
- Changed
evaluate_change3 fields changed- changed
Input schema / properties / category / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +] - changed
Input schema / properties / profile_id / descriptionPrevious 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." - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +]
- Changed
find_cost_cliffs1 field changed- changed
Input schema / properties / profile_id / descriptionPrevious 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."
- Changed
list_vendors1 field changed- changed
Input schema / properties / category / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +]
- Changed
plan_stack6 fields changed- added
Input schema / properties / app_typeAdded 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" +} - changed
Input schema / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +] - added
Input schema / properties / mau_now / descriptionAdded value: +"Monthly active users now. Without it, a new product of the app type at launch." - changed
Input schema / properties / profile_id / descriptionPrevious 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." - changed
Input schema / properties / requirements / items / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +] - removed
Input schema / requiredRemoved value: -[ - "mau_now" -]
- Changed
project_stack1 field changed- changed
Input schema / properties / profile_id / descriptionPrevious 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."
- Changed
recommend_stack3 fields changed- added
Input schema / properties / app_typeAdded 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" +} - changed
Input schema / properties / categories / items / enumPrevious value: -[ - "hosting", - "database", - "auth", - "email", - "payments", - "observability", - "ai", - "edge", - "app_store" -]New value: +[ + "hosting", + "database", + "auth", + "email", + "payments", + "observability", + "ai", + "edge", + "app_store", + "coding" +] - changed
Input schema / properties / profile_id / descriptionPrevious 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."
- Added
search_showcase
1 tool update
- Added
search_directory
2 tool updates
- Added
audit_stack - Added
detect_stack
18 tool updates
- First observed
check_fit - First observed
compare_vendors - First observed
delete_account - First observed
delete_saved_stack - First observed
estimate_cost - First observed
evaluate_change - First observed
extract_requirements - First observed
find_cost_cliffs - First observed
find_perks - First observed
get_pricing - First observed
get_saved_stack - First observed
list_capabilities - First observed
list_saved_stacks - First observed
list_vendors - First observed
plan_stack - First observed
project_stack - First observed
recommend_stack - First observed
save_stack
Related MCP Connectors
Estimate development costs and hours, scope an MVP, and write a PRD with user stories and specs.
51Designs, prices, and deploys AWS/GCP cloud infrastructure from plain-English requirements.
Simulate cloud infrastructure and estimate cost before deploying or changing infrastructure.
Pay-per-call ($0.25 USDC) project cost estimator: modules + cheapest model mix that clears quality.
Related MCP Servers
AlicenseNot gradedqualityAmaintenanceEnables 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- FlicenseAqualityBmaintenanceParametric price benchmarking for engineering and procurement trade-offs. Agentic first, runs on your data, stays on your machine.1235 PyPI2-
- AlicenseBqualityDmaintenancePredict the cost of an LLM call before you make it, and pick the cheapest model that still does the job, offline, from your editor.728 npmApache 2.0
- AlicenseAqualityAmaintenanceSearch and compare free tiers, credits, and pricing changes across 1,500+ developer tools. 8 MCP tools for infrastructure decisions, cost estimation, and vendor comparison.49 npm24MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.