Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Certificate recorded, valid to 2027-01-20
Authorization required, Bearer, issuer https://kongreviews.com
Added "accept_change", "explain_bill", "get_project_context" and 2 more; changed the definition of "audit_stack", "check_build", "check_fit" and 26 more (29 tools before, 34 now)
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Changes data (links the repo, records installed packages as tool-verified); needs sign-in; reads GitHub. Finding a package proves only that it is installed, never that the service works. Link the GitHub repo a saved plan is ⟨128 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Use for a pull request or a diff of an app that has no saved project; to price a change against the accepted project, use price_change. Reads only; no sign-in. What a code change does to an app's ⟨78 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Use for one vendor in one category (stay, optimise or switch); to price a change against a whole saved project use price_change. Reads only; no sign-in. When something changes (bill too high, growth, ⟨116 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Use when the user is ready to build or to resume setup. Reads only; a share_url needs no sign-in, a saved id does and adds the checklist with each step's state and the next step to do. Everything needed to start building a planned stack: ⟨117 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Reads only; needs sign-in. Re-run a saved stack or audit with today's ⟨248 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Reads only; needs sign-in. To continue one project, get_project_context is usually the better first call: it resolves a name and returns the whole context. List the stacks the signed-in user saved, newest ⟨60 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Use to re-plan with confirmed requirements (after recommend_stack) or with exact inputs. Reads only; no sign-in. Given confirmed requirements as capability ids, recommend a ⟨219 unchanged words⟩
⟨240 unchanged words⟩ , cloudflare_edge, vps_cloudflare).","enum":["app_builder","static_cdn","frontend_baas","serverless_nextjs","cloudflare_edge"," ⟨123 unchanged words⟩ ,"type":"string"},"type":"array"},"chosen_vendors":{"additionalProperties":true,"description":"A vendor chosen for a category, as category → vendor id (e.g. {\"sms\": \"twilio\"}): only that vendor is considered there, and the category is planned if it wasn't. Accepted changes (accept_change) are kept this way.","type":"object"},"confirmed":{"description":"Ids of ⟨885 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Use for a new app (no saved project yet); for a saved one use get_project_context. Reads only; no sign-in. Start here. Describe the product in plain language ⟨337 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Changes data (adds bills); needs sign-in. To explain a bill or a month-on-month increase, use explain_bill. Record what the user actually paid each service ⟨242 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Changes data (creates a project); needs sign-in. Save a recommended stack, or an audit of ⟨92 unchanged words⟩
⟨13 unchanged words⟩ "},"plan":{"description":"plan_stack arguments (recommend_stack returns them as plan_stack_arguments). With share_url,iftheythereare what isnokept,share_url.so each requirement's source sentence survives; without, they are the plan.","type":"object"},"share_url":{ ⟨16 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"confidence":{"enum":["high","medium" ⟨45 unchanged words⟩ "string"},"generated_at":{"type":"string"},"project":{"description":"On results about a saved project: its id and the context version the answer was computed on. Pass both back in follow-up calls.","properties":{"context_version":{"type":"integer"},"id":{"type":"string"},"name":{"type":"string"}},"type":"object"},"sources":{"items":{"properties" ⟨48 unchanged words⟩
Changes data; needs sign-in. Pass expected_version (the context_version you read) so an edit made meanwhile is never overwritten. To add or swap a service, use price_change and accept_change instead. Change one of the signed-in user's saved stacks ⟨121 unchanged words⟩
⟨427 unchanged words⟩ "maxLength":254,"type":"string"},"expected_version":{"description":"The context_version you last read (get_project_context, get_saved_stack). A change to users or answers is refused if the project changed since, instead of overwriting it.","minimum":1,"type":"integer"},"id":{"maxLength":64,"type":"string ⟨84 unchanged words⟩
⟨23 unchanged words⟩ :"string"},"type":"array"},"completeness":{"description":"On plan and project results: complete, complete_with_assumptions, incomplete or needs_clarification, with the reasons. Say plainly when it is not complete.","properties":{"reasons":{"items":{"type":"string"},"type":"array"},"status":{"enum":["complete","complete_with_assumptions","incomplete","needs_clarification"],"type":"string"}},"type":"object"},"
Accept (or reject) a priced change into the project — Use only after the user agrees to a change that price_change priced ("yes, add the SMS reminders"). Changes data; needs sign-in. Pass exactly accept_with.arguments from price_change: id, proposal_id, base_version and change. The plan is updated in one step and the project gets a new context_version; calling it again with the same proposal changes nothing and returns the same result (safe to retry). It is refused when the project changed after base_version (another accepted change, new users or answers): the answer says what changed, and you re-price with price_change. A change that breaks a m…
Explain a bill against the plan — Use when the user asks about what they actually paid: "why did my bill go up", "explain my bill", "are we over the estimate". Reads only; needs sign-in. For one project and one month (default: the newest with bills), compares the recorded bills with the plan's estimate for that same month, in USD, and with the month before: expected, actual and the difference over services that have both; which services make up the difference; known causes, each with the records that show it; possible explanations labelled as hypotheses, with the evidence that would settle each; and suggested actions with a s…
Continue a saved project — Use when the user wants to continue, change or ask about a project they saved ("continue the booking app", "where was I", "add SMS to my project"). Reads only; needs sign-in. Returns the accepted plan without the user repeating it: requirements (with their source sentences), accepted decisions and their history, the services and plans selected, users now and at forecast, budget, region, platforms and builder, the linked repo and billing accounts, what is still assumed or unresolved, setup progress, and how fresh each part is, plus the context_version to pass to later calls. Pass id when you h…
Price a change before building it — Use before implementing anything that might change the bill: "what does adding SMS reminders cost", "before I add this background-job package", "should we swap Postmark for Resend", "what if we reach 50,000 users". Prices the change against the accepted project (id, needs sign-in) or a plan link (share_url, no sign-in): what changes, services added or removed, the cost before and after and the difference, now and at forecast, with the same users, forecast and usage on both sides; free-tier and quota limits; whether it breaks a must-have (a required region, SSO, HIPAA); alternatives using what…
Record a setup step's state, with evidence — Use while setting a saved plan up, after the user finishes part of a step ("the Supabase client is installed", "sign-in works on the live site"). Changes data; needs sign-in. Each build-pack step (domain, hosting, database, auth, …: the checklist ids from get_build_pack) has one state: not_started, dependency_installed, configuration_present, connection_tested, feature_verified, deployment_verified, or unknown. connection_tested and above need evidence: what the user ran and saw (a status code, a record id, "signed in on the deployed URL"). Never record a state the user hasn't confirmed, and …
Added "check_build" and "plan_migration"; changed the definition of "evaluate_change", "get_build_pack", "get_saved_stack" and 4 more (27 tools before, 29 now)
⟨52 unchanged words⟩ ":[{"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, ⟨25 unchanged words⟩
⟨94 unchanged words⟩ "minimum":0,"type":"number"},"migration_features":{"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"},"monthly_growth":{"maximum":2,"minimum":-0.5, ⟨550 unchanged words⟩
Added "get_build_pack"; changed the definition of "audit_stack", "check_fit", "compare_architectures" and 23 more (26 tools before, 27 now)
⟨172 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":" ⟨47 unchanged words⟩ ","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type": ⟨68 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
Changed the definition of "search_showcase"
⟨3 unchanged words⟩ {"category":{"enum":["ai","productivitycommerce","customer_support","data_analytics","design","developer_tools","education","energy","finance","government","hardware","health","educationhr","commerceindustrial","sociallegal","designmarketing","media","travelproductivity","marketingsales","security","social","travel
Unknown → Live
First tool surface recorded: 26 tools (server version 0.1.0)
https://kongreviews.com/mcp (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 9 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"properties":{"framework":{"description":"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.","enum":["nextjs","remix","sveltekit","astro","expo","node"],"type":"string"},"id":{"description":"A saved plan id ⟨25 unchanged words⟩
⟨58 unchanged words⟩ 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 ⟨60 unchanged words⟩ 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 ⟨13 unchanged words⟩ 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 ⟨17 unchanged words⟩
⟨123 unchanged words⟩ 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 ⟨13 unchanged words⟩ 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 ⟨17 unchanged words⟩
before
{"properties":{"answers":{"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"},"app_type":{"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"},"apply_perks":{"type":"boolean"},"architecture":{"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"},"budget_monthly_usd":{"minimum":0,"type":"number"},"builder_profile":{"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"},"categories":{"items":{"enum":["hosting","database","auth","email","payments","observability","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":"array"},"exclude_vendors":{"items":{"type":"string"},"type":"array"},"forecast_months":{"maximum":36,"minimum":1,"type":"integer"},"founder":{"description":"Optional company details used only to find startup perks.","properties":{"arr_usd":{"minimum":0,"type":"number"},"existing_customer_of":{"description":"Vendor ids you already pay (new-customer perks are excluded).","items":{"type":"string"},"type":"array"},"gateways":{"description":"Perk gateways you belong to, e.g. [\"mercury\", \"stripe_atlas\", \"yc\"].","items":{"type":"string"},"type":"array"},"venture_backed":{"type":"boolean"}},"type":"object"},"mau_forecast":{"maximum":100000000,"minimum":0,"type":"number"},"mau_now":{"description":"Monthly active users now. Without it, a new product of the app type at launch.","maximum":100000000,"minimum":0,"type":"number"},"needs":{"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"},"output_destination":{"description":"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.","enum":["chat","document","code"],"type":"string"},"per_1k_mau":{"additionalProperties":false,"description":"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.","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"},"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"},"platforms":{"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"},"profile_id":{"description":"Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile.","type":"string"},"ranking":{"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.","enum":["balanced","cost"],"type":"string"},"requirements":{"items":{"properties":{"capability":{"description":"Capability id from list_capabilities, e.g. auth.saml_sso.","type":"string"},"categories":{"items":{"enum":["hosting","database","auth","email","payments","observability","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":"array"},"must":{"description":"true (default) = must-have; false = nice-to-have.","type":"boolean"},"source":{"description":"The PRD sentence this came from.","maxLength":500,"type":"string"}},"required":["capability"],"type":"object"},"type":"array"},"revenue_per_mau_usd":{"description":"Average monthly revenue per active user (for payment fees).","minimum":0,"type":"number"},"seats":{"description":"Team members on per-seat plans. Default 1.","maximum":10000,"minimum":1,"type":"integer"},"task_intent":{"description":"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.","maxLength":300,"type":"string"},"transactions_per_mau":{"description":"Payments per active user per month.","minimum":0,"type":"number"}},"type":"object"}after
{"properties":{"accounts":{"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"},"answers":{"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"},"app_type":{"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"},"apply_perks":{"type":"boolean"},"architecture":{"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"},"budget_monthly_usd":{"minimum":0,"type":"number"},"build_tool":{"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"},"builder_profile":{"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"},"categories":{"items":{"enum":["hosting","database","auth","email","payments","observability","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":"array"},"confirmed":{"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"},"exclude_vendors":{"items":{"type":"string"},"type":"array"},"forecast_months":{"maximum":36,"minimum":1,"type":"integer"},"founder":{"description":"Optional company details used only to find startup perks.","properties":{"arr_usd":{"minimum":0,"type":"number"},"existing_customer_of":{"description":"Vendor ids you already pay (new-customer perks are excluded).","items":{"type":"string"},"type":"array"},"gateways":{"description":"Perk gateways you belong to, e.g. [\"mercury\", \"stripe_atlas\", \"yc\"].","items":{"type":"string"},"type":"array"},"venture_backed":{"type":"boolean"}},"type":"object"},"mau_forecast":{"maximum":100000000,"minimum":0,"type":"number"},"mau_now":{"description":"Monthly active users now. Without it, a new product of the app type at launch.","maximum":100000000,"minimum":0,"type":"number"},"needs":{"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"},"output_destination":{"description":"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.","enum":["chat","document","code"],"type":"string"},"per_1k_mau":{"additionalProperties":false,"description":"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.","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"},"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"},"platforms":{"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"},"profile_id":{"description":"Usage profile: b2b_saas (default), consumer_app, booking_marketplace, content_site, ios_on_device. Defaults to the app type's profile.","type":"string"},"ranking":{"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"},"requirements":{"items":{"properties":{"capability":{"description":"Capability id from list_capabilities, e.g. auth.saml_sso.","type":"string"},"categories":{"items":{"enum":["hosting","database","auth","email","payments","observability","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":"array"},"must":{"description":"true (default) = must-have; false = nice-to-have.","type":"boolean"},"source":{"description":"The PRD sentence this came from.","maxLength":500,"type":"string"}},"required":["capability"],"type":"object"},"type":"array"},"revenue_per_mau_usd":{"description":"Average monthly revenue per active user (for payment fees).","minimum":0,"type":"number"},"seats":{"description":"Team members on per-seat plans. Default 1.","maximum":10000,"minimum":1,"type":"integer"},"task_intent":{"description":"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.","maxLength":300,"type":"string"},"transactions_per_mau":{"description":"Payments per active user per month.","minimum":0,"type":"number"}},"type":"object"}⟨241 unchanged words⟩ 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 ⟨13 unchanged words⟩ 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 ⟨17 unchanged words⟩
⟨55 unchanged words⟩ "minimum":0,"type":"number"},"build_tool":{"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"},"builder_profile":{"description":"Who builds it. developer ⟨106 unchanged words⟩ :"string"},"type":"array"},"confirmed":{"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"},"description":{"description":"Plain-language product description or PRD text.","maxLength" ⟨396 unchanged words⟩ 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"},"revenue_per_mau_usd": ⟨85 unchanged words⟩
⟨59 unchanged words⟩ 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"}.
⟨46 unchanged words⟩ can price.","type":"boolean"},"include_closed":{"description":"true: include services that have shut down (left out by default; an exact id always finds one).","type":"boolean"},"limit":{"default":25,"maximum":500, ⟨62 unchanged words⟩
⟨17 unchanged words⟩ now (mau_now) or expects (mau_forecast),andwhether 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 ⟨72 unchanged words⟩
⟨13 unchanged words⟩ this stack.","type":"boolean"},"answers":{"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"},"build_progress":{"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"},"email":{"description":"Where alerts go. A confirmation link is sent ⟨44 unchanged words⟩ "minimum":0,"type":"number"},"migration_progress":{"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"},"name":{"maxLength":80,"type":"string"},"unlink_repo":{"description":"Forget the repo linked with check_build, and its last check.","type":"boolean"}},"required":["id"],"type":"object"}
Check a repo against its saved plan — 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_buil…
Plan a move to another host — 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 th…
⟨28 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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"},"profile_id":{"description":"Usage profile: b2b_saas ⟨35 unchanged words⟩ ","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type": ⟨90 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨185 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":" ⟨225 unchanged words⟩ ","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type": ⟨87 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨9 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"exclude":{ ⟨34 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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"},"profile_id":{"description":"Usage profile: b2b_saas ⟨35 unchanged words⟩ ","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type": ⟨78 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨127 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":" ⟨35 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨30 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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"},"plan_id":{"type":"string"},"profile_id" ⟨93 unchanged words⟩ 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.","properties ⟨46 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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" ⟨9 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨9 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"current":{ ⟨112 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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"},"profile_id":{"description":"Usage profile: b2b_saas ⟨35 unchanged words⟩ ","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type": ⟨106 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨28 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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" ⟨81 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨116 unchanged words⟩ drop one. Mention requirement gaps, blockers andtrade-offs.trade-offs, and each pick's "weighed" note when a cheaper vendor lost on lock-in, setup work or seed prices. 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). Link share_url so the user can open the ⟨16 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨9 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"}},"type":"object"}
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨105 unchanged words⟩ drop one. Mention requirement gaps, blockers andtrade-offs.trade-offs, and each pick's "weighed" note when a cheaper vendor lost on lock-in, setup work or seed prices. 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). Link share_url so the user can open the ⟨16 unchanged words⟩
⟨188 unchanged words⟩ "minimum":0,"type":"number"},"builder_profile":{"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"},"categories":{"items":{"enum":["hosting"," ⟨5 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":" ⟨99 unchanged words⟩ "minimum":0,"type":"number"},"needs":{"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"},"output_destination":{"description":"Where the answer goes. ⟨54 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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"},"platforms":{"description":"Where the app runs; ⟨33 unchanged words⟩ type's profile.","type":"string"},"ranking":{"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.","enum":["balanced","cost"],"type":"string"},"requirements":{"items":{"properties":{"capability ⟨18 unchanged words⟩ ","ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type": ⟨114 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨128 unchanged words⟩ transaction, ai_input_ktok, ai_output_ktok, kv_read, kv_write,ci_hour.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": ⟨44 unchanged words⟩ "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 ⟨16 unchanged words⟩ "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"},"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"},"profile_id":{"description":"Usage profile: b2b_saas ⟨78 unchanged words⟩ "],"type":"object"},"maxItems":1220,"minItems":1,"type":"array"}} ⟨5 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨223 unchanged words⟩ drop one. Mention requirement gaps, blockers andtrade-offs.trade-offs, and each pick's "weighed" note when a cheaper vendor lost on lock-in, setup work or seed prices. 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). Link share_url so the user can open the ⟨16 unchanged words⟩
⟨55 unchanged words⟩ "minimum":0,"type":"number"},"builder_profile":{"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"},"categories":{"description":"Plan these categories. Default: a build tool (an AI app builder or coding agent) plus what the description needs (a web app gets ⟨5 unchanged words⟩ and observability; an on-device app only what itnamesnames; a one-sentence idea such as a pantry tracker what that kind of app usually needs).","items":{"enum":["hosting ⟨5 unchanged words⟩ ,"ai","edge","app_store","coding","storage","video","sms","push","jobs","search"],"type":"string"},"type":" ⟨145 unchanged words⟩ ,"code"],"type":"string"},"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"},"profile_id":{"description":"Usage profile: b2b_saas ⟨4 unchanged words⟩ , ios_on_device. Defaults to the app type's profile.","type":"string"},"ranking":{"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.","enum":["balanced","cost"],"type":"string"},"revenue_per_mau_usd":{" ⟨85 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
⟨40 unchanged words⟩ depends on the tool."},"disclosures":{"description":"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.","type":"array"},"engine_version":{"type" ⟨55 unchanged words⟩
Get the build pack for a planned stack — 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 …