Server definition
- Hash
- sha256:04ed5fb9fdd940610dff0317105b39faadde489e851d6ff8ae1d4a24f224f3ad
- What it is
- What a remote MCP server returned when asked what it offers: 20 tools
The blob, as servednamed by its sha256
{
"instructions": "Stackcut checks what software costs and what to cut, using public prices it keeps current. Pick the tool by what the user wants: several subscriptions to review or a stack to cut: start_audit (it asks for the few facts that matter), then audit_stack; the paid services in a codebase: get_detection_rules applied on their machine, then audit_stack; one product they pay for ('cheaper than X?', 'is X worth it?'): find_alternatives; picking vendors for something they're building: choose_stack, or plan_stack_from_spec for a whole product brief; a whole workflow change (billing across projects, hosting, email, AI routing): search_workflow_recipes; browsing by feature or category: search_recipes; cancelling, pausing or paying less for any subscription (streaming, apps, software): get_exit_plan (search_exits to browse the cancel library). Pass what the user pays, seats, the features they use and usage numbers (usage: {emails_per_month: 40000, domains: 4, db_gb: 3}, or evidence such as '40,000 emails/mo'). A path is eligible, or a pick fits, only after every check passed; needs_info, fits_if_checks_pass, a candidate path and a hypothetical total mean something is still open, so ask the questions returned instead of recommending the change. Savings are modeled from public list prices, not guaranteed: say so. Ask before any cancel, purchase or sign-up. Send names, numbers and prices only: never source code, secrets, raw invoices or personal data. If the user gives you a Stackcut agent code (sca_…), get_my_plan returns their own savings plan: walk them through it from the biggest proven saving down. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"tools": [
{
"description": "Use when the user wants their stack checked as a whole: several subscriptions, the paid services in a codebase, or a portfolio of products ('audit what we pay for', 'what can we cut?'). One line per service with vendor, plan, what they pay, seats, the features they use and usage (or evidence strings); add project for a portfolio and account for a shared bill. Per service: status (eligible = a cheaper path checked end to end; needs_info = likely cheaper but a check is open, so ask its questions; keep; no_recipe), the best path, right_size, overlaps, and levers that are not counted as savings. Totals keep prices the user confirmed apart from modeled list prices. If facts are missing, start_audit says which ones matter first. Send vendor names, feature names, numbers and prices only: never source code, secrets or raw invoices. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"active_users": {
"description": "People or accounts active in the last 30 days (0 = unused: cleanup levers and sanity checks)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"limit_paths": {
"default": 3,
"maximum": 8,
"minimum": 1,
"type": "integer"
},
"revenue_usd_per_month": {
"description": "The product's revenue per month (context for sanity checks: no revenue, cost per user, fees vs revenue; never a cap)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"services": {
"items": {
"additionalProperties": false,
"properties": {
"account": {
"description": "Billing account key (e.g. 'supabase-org-main'): lines with the same vendor and key share one bill; different keys are separate bills. Give the bill once",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"active_users": {
"description": "People or accounts active in the last 30 days (0 = unused: cleanup levers and sanity checks)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"billing": {
"additionalProperties": false,
"description": "Billing evidence: scope (dedicated, shared or unknown), account_id (a non-secret alias; the account key), allocated_monthly_usd (attribution only, never a saving), avoidable_monthly_usd with avoidability_confirmed (what leaving actually removes from the bill; 0 is valid), commitment_months_remaining (non-refundable months left; 0 only when cancellable now) and source (a reference, no private contents). With billing, a path is eligible only once the avoidable amount, scope, commitment and source are all given",
"properties": {
"account_id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"allocated_monthly_usd": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"avoidability_confirmed": {
"type": "boolean"
},
"avoidable_monthly_usd": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"commitment_months_remaining": {
"maximum": 120,
"minimum": 0,
"type": "number"
},
"scope": {
"enum": [
"dedicated",
"shared",
"unknown"
],
"maxLength": 2000,
"type": "string"
},
"source": {
"maxLength": 1000,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"category": {
"description": "detect.mjs output (ignored)",
"maxLength": 100,
"type": "string"
},
"confidence": {
"description": "detect.mjs output: 'low' (only a config file) means no paid plan is assumed",
"maxLength": 20,
"type": "string"
},
"confirmed": {
"description": "true when the user confirmed they pay for this (with plan: its list price counts as confirmed spend). Scanner-only lines are unconfirmed",
"type": "boolean"
},
"evidence": {
"description": "Scan evidence labels and usage facts in words ('db 1.5 GB', '40,000 emails/mo', '37 domains')",
"items": {
"maxLength": 500,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"feature_counts": {
"description": "detect.mjs output (ignored)",
"items": {
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"features_used": {
"description": "Features the code or the user relies on; sizes and counts ('4,000 contacts') are read as usage",
"items": {
"maxLength": 200,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"files_referencing": {
"description": "detect.mjs output: marks the line as scan-only (unconfirmed); never read as usage",
"maximum": 1000000000000,
"minimum": 0,
"type": "integer"
},
"in_catalog": {
"description": "detect.mjs output (ignored)",
"type": "boolean"
},
"last_active": {
"description": "When this resource (project, app, account) was last used: an ISO date ('2026-03-10'), 'never', or '5 months ago'. 90+ days idle or never used gets a cleanup lever",
"maxLength": 100,
"type": "string"
},
"monthly_spend_usd": {
"description": "What they pay per month for it, all seats, if known",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"name": {
"description": "detect.mjs output (ignored)",
"maxLength": 200,
"type": "string"
},
"plan": {
"description": "Their plan, e.g. 'Business Standard' (else read from the name or evidence)",
"maxLength": 100,
"type": "string"
},
"project": {
"description": "Which of their projects or products this line is for (portfolio audits): lines of one vendor across projects are audited as one account. Give each project's own usage on its line and the account's bill once",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"replacement_validation": {
"additionalProperties": false,
"description": "A replacement path the user checked themselves: its current price, capacity, burst limits and paid add-ons against their usage. It answers that path's capacity checks (never its must-haves) and ranks it first",
"properties": {
"capacity_and_price_confirmed": {
"description": "true only after checking the price, capacity, burst limits and required add-ons",
"type": "boolean"
},
"path_id": {
"description": "The path id (from find_alternatives or audit_stack)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"source": {
"description": "Where the check comes from (usage report, pricing page, quote); no private contents",
"maxLength": 1000,
"minLength": 1,
"type": "string"
}
},
"required": [
"path_id",
"capacity_and_price_confirmed",
"source"
],
"type": "object"
},
"revenue_usd_per_month": {
"description": "The product's revenue per month (context for sanity checks: no revenue, cost per user, fees vs revenue; never a cap)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"seats": {
"description": "Paid seats",
"maximum": 100000,
"minimum": 1,
"type": "integer"
},
"service_id": {
"description": "A distinct bill when the same vendor appears more than once (an account key, like account; lines with the same key are one bill)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"shared_with": {
"description": "How many products share this bill (one account, org or team), when only this product is audited: moving one product off it saves only what it adds to the bill, never the whole bill. monthly_spend_usd is then the whole account's bill",
"maximum": 100000,
"minimum": 1,
"type": "integer"
},
"usage": {
"additionalProperties": false,
"description": "Their usage, checked against each plan's caps (priced with published overage and add-ons). Units: seats, members, mau, emails_per_month, emails_per_day, contacts, domains, events_per_month, pageviews_per_month, errors_per_month, requests_per_month, requests_per_day, searches_per_month, cpu_ms_per_request, db_gb, storage_gb, bandwidth_gb, projects, sites, videos, video_minutes, responses_per_month, tasks_per_month, keywords_tracked, credits_per_month, history_days, apps, files, event_types, monitors, tokens_per_month, images_per_month, audio_minutes_per_month, characters_per_month, transactions_per_month, sandbox_hours_per_month, concurrent_sessions, session_minutes, call_participants, meeting_minutes, records, inboxes, tokens_in_per_month, tokens_out_per_month, cached_tokens_per_month, video_minutes_stored, video_minutes_delivered_per_month, gmv_usd_per_month, payouts_per_month, active_accounts, verifications_per_month, browser_hours_per_month, proxy_gb_per_month, job_executions_per_month, sso_connections, sso_users, inbound_emails_per_month, stream_hours_per_month, vcpu_hours_per_month, credits_usd_per_month, disputes_per_month, payout_volume_usd_per_month, object_writes_per_month, object_reads_per_month, job_executions_per_day, scim_connections, searches_per_hour, sms_per_month, vectors_stored, vector_queries_per_month, cache_commands_per_month, mtu, gpu_seconds_per_month, revenue_usd_per_month, phone_minutes_per_month, vector_read_units_per_month, vector_write_units_per_month (MAU is accepted for mau). Example: {\"emails_per_month\": 40000, \"domains\": 4, \"db_gb\": 3}. get_usage_questions says which units matter for a vendor and where the user finds each number.",
"properties": {
"MAU": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"active_accounts": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"apps": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"audio_minutes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"bandwidth_gb": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"browser_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"cache_commands_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"cached_tokens_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"call_participants": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"characters_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"concurrent_sessions": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"contacts": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"cpu_ms_per_request": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"credits_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"credits_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"db_gb": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"disputes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"domains": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"emails_per_day": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"emails_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"errors_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"event_types": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"events_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"files": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"gmv_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"gpu_seconds_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"history_days": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"images_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"inbound_emails_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"inboxes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"job_executions_per_day": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"job_executions_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"keywords_tracked": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"mau": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"meeting_minutes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"members": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"monitors": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"mtu": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"object_reads_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"object_writes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"pageviews_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"payout_volume_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"payouts_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"phone_minutes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"projects": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"proxy_gb_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"records": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"requests_per_day": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"requests_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"responses_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"revenue_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sandbox_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"scim_connections": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"searches_per_hour": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"searches_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"seats": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"session_minutes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sites": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sms_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sso_connections": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sso_users": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"storage_gb": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"stream_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tasks_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tokens_in_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tokens_out_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tokens_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"transactions_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vcpu_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vector_queries_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vector_read_units_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vector_write_units_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vectors_stored": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"verifications_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"video_minutes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"video_minutes_delivered_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"video_minutes_stored": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"videos": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
}
},
"type": "object"
},
"vendor": {
"description": "Vendor id from the scan (e.g. 'sendgrid') or a product name as on the invoice ('Airtable', 'Slack Pro')",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"vendor"
],
"type": "object"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
}
},
"required": [
"services"
],
"type": "object"
},
"name": "audit_stack",
"outputSchema": null
},
{
"description": "Use when the user is picking vendors for something they're building: 'cheapest database for 20k users', 'Resend or Postmark at 60,000 emails a month?', 'what will auth cost at 10k MAU?'. Give each job with its volumes and must-have features; every tier of every indexed vendor is priced at those volumes and the cheapest valid tier wins. A pick 'fits' only when every volume is within published caps or priced overage, no published limit is broken, each must-have is included in that plan or priced as its add-on, and the price was checked within 120 days; anything else comes back as a check or a question. total keeps proven, estimated and unpriced jobs apart. Pass scales (MAU) for cost curves and break-evens; with no MAU elsewhere, the smallest scale is the MAU priced. budget_monthly_usd tests a budget. For a whole product brief, use plan_stack_from_spec. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"budget_monthly_usd": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"limit_per_job": {
"default": 4,
"maximum": 10,
"minimum": 1,
"type": "integer"
},
"needs": {
"items": {
"additionalProperties": false,
"properties": {
"avg_amount_usd": {
"description": "Average payment in USD; with transactions it prices payment fees",
"maximum": 10000000,
"minimum": 0,
"type": "number"
},
"features": {
"description": "Must-haves, e.g. ['Custom domain', 'CAPTCHA solving', 'platform holds funds', 'refunds enabled', 'unbounded sessions', '2 vCPU / 4 GiB', 'gpt-6-sol']. Sizes and counts ('30 GB database') are checked as volumes; a model or plan name pins that model; SSO, SOC 2, audit logs and region needs are listed as unverified requirements",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"job": {
"description": "A job id from list_stack_jobs (llm_inference, image_generation_api, video_delivery, object_storage, sandbox_compute, browser_automation, job_queue, auth_b2b, email_inbound, identity_verification, marketplace_payouts, database, auth, hosting, email_transactional, …) or plain words ('send email', 'video hosting (HLS)', 'KYC'). Unknown or ambiguous jobs come back in unsupported_jobs, never as an error",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"peak_volume": {
"additionalProperties": false,
"description": "Peak or burst requirement (1.6.0), e.g. {amount: 1500, unit: 'emails_per_day'} for a launch day. Checked against a tier's published daily cap where the index has one; otherwise it stays an open check (the index doesn't prove burst or rate limits), so no option is a plain fit",
"properties": {
"amount": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"unit": {
"enum": [
"emails_per_day",
"requests_per_day",
"requests_per_second"
],
"maxLength": 2000,
"type": "string"
}
},
"required": [
"amount",
"unit"
],
"type": "object"
},
"per_user": {
"description": "Volumes per monthly active user per month, e.g. [{amount: 6, unit: 'images'}]; multiplied by MAU (from scales, a mau volume or the project text)",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 1000000000000000,
"minimum": 0,
"type": "number"
},
"unit": {
"description": "A units.json unit, or an alias: tokens_in, tokens_out, images, gb_stored, gb_egress, transactions, gmv_usd, sandbox_seconds, sandbox_hours, vcpu_hours, browser_hours, job_executions, verifications, inbound_emails, video_minutes_delivered, sso_connections, sso_users, emails, events, requests, credits_usd, MAU (= mau). *_per_month units are monthly, *_per_day daily, *_gb and video_minutes_stored are totals.",
"enum": [
"seats",
"members",
"mau",
"emails_per_month",
"emails_per_day",
"contacts",
"domains",
"events_per_month",
"pageviews_per_month",
"errors_per_month",
"requests_per_month",
"requests_per_day",
"searches_per_month",
"cpu_ms_per_request",
"db_gb",
"storage_gb",
"bandwidth_gb",
"projects",
"sites",
"videos",
"video_minutes",
"responses_per_month",
"tasks_per_month",
"keywords_tracked",
"credits_per_month",
"history_days",
"apps",
"files",
"event_types",
"monitors",
"tokens_per_month",
"images_per_month",
"audio_minutes_per_month",
"characters_per_month",
"transactions_per_month",
"sandbox_hours_per_month",
"concurrent_sessions",
"session_minutes",
"call_participants",
"meeting_minutes",
"records",
"inboxes",
"tokens_in_per_month",
"tokens_out_per_month",
"cached_tokens_per_month",
"video_minutes_stored",
"video_minutes_delivered_per_month",
"gmv_usd_per_month",
"payouts_per_month",
"active_accounts",
"verifications_per_month",
"browser_hours_per_month",
"proxy_gb_per_month",
"job_executions_per_month",
"sso_connections",
"sso_users",
"inbound_emails_per_month",
"stream_hours_per_month",
"vcpu_hours_per_month",
"credits_usd_per_month",
"disputes_per_month",
"payout_volume_usd_per_month",
"object_writes_per_month",
"object_reads_per_month",
"job_executions_per_day",
"scim_connections",
"searches_per_hour",
"sms_per_month",
"vectors_stored",
"vector_queries_per_month",
"cache_commands_per_month",
"mtu",
"gpu_seconds_per_month",
"revenue_usd_per_month",
"phone_minutes_per_month",
"vector_read_units_per_month",
"vector_write_units_per_month",
"MAU",
"tokens",
"tokens_in",
"tokens_out",
"cached_tokens",
"images",
"video_minutes_delivered",
"gb_stored",
"gb_egress",
"transactions",
"gmv_usd",
"sandbox_seconds",
"sandbox_hours",
"vm_hours",
"vcpu_hours",
"browser_hours",
"proxy_gb",
"job_executions",
"verifications",
"inbound_emails",
"emails",
"events",
"errors",
"exceptions",
"requests",
"pageviews",
"searches",
"payouts",
"credits_usd",
"stream_hours",
"audio_minutes",
"characters",
"payout_volume_usd",
"disputes",
"object_writes",
"object_reads",
"sms",
"vectors",
"vector_queries",
"cache_commands",
"gpu_seconds",
"gpu_hours",
"revenue_usd",
"phone_minutes"
],
"maxLength": 2000,
"type": "string"
}
},
"required": [
"amount",
"unit"
],
"type": "object"
},
"maxItems": 8,
"minItems": 1,
"type": "array"
},
"sandbox_size": {
"additionalProperties": false,
"description": "Sandbox size for sandbox_compute",
"properties": {
"ram_gib": {
"maximum": 4096,
"minimum": 0.1,
"type": "number"
},
"vcpu": {
"maximum": 512,
"minimum": 0.1,
"type": "number"
}
},
"type": "object"
},
"volume": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 1000000000000000,
"minimum": 0,
"type": "number"
},
"unit": {
"description": "A units.json unit, or an alias: tokens_in, tokens_out, images, gb_stored, gb_egress, transactions, gmv_usd, sandbox_seconds, sandbox_hours, vcpu_hours, browser_hours, job_executions, verifications, inbound_emails, video_minutes_delivered, sso_connections, sso_users, emails, events, requests, credits_usd, MAU (= mau). *_per_month units are monthly, *_per_day daily, *_gb and video_minutes_stored are totals.",
"enum": [
"seats",
"members",
"mau",
"emails_per_month",
"emails_per_day",
"contacts",
"domains",
"events_per_month",
"pageviews_per_month",
"errors_per_month",
"requests_per_month",
"requests_per_day",
"searches_per_month",
"cpu_ms_per_request",
"db_gb",
"storage_gb",
"bandwidth_gb",
"projects",
"sites",
"videos",
"video_minutes",
"responses_per_month",
"tasks_per_month",
"keywords_tracked",
"credits_per_month",
"history_days",
"apps",
"files",
"event_types",
"monitors",
"tokens_per_month",
"images_per_month",
"audio_minutes_per_month",
"characters_per_month",
"transactions_per_month",
"sandbox_hours_per_month",
"concurrent_sessions",
"session_minutes",
"call_participants",
"meeting_minutes",
"records",
"inboxes",
"tokens_in_per_month",
"tokens_out_per_month",
"cached_tokens_per_month",
"video_minutes_stored",
"video_minutes_delivered_per_month",
"gmv_usd_per_month",
"payouts_per_month",
"active_accounts",
"verifications_per_month",
"browser_hours_per_month",
"proxy_gb_per_month",
"job_executions_per_month",
"sso_connections",
"sso_users",
"inbound_emails_per_month",
"stream_hours_per_month",
"vcpu_hours_per_month",
"credits_usd_per_month",
"disputes_per_month",
"payout_volume_usd_per_month",
"object_writes_per_month",
"object_reads_per_month",
"job_executions_per_day",
"scim_connections",
"searches_per_hour",
"sms_per_month",
"vectors_stored",
"vector_queries_per_month",
"cache_commands_per_month",
"mtu",
"gpu_seconds_per_month",
"revenue_usd_per_month",
"phone_minutes_per_month",
"vector_read_units_per_month",
"vector_write_units_per_month",
"MAU",
"tokens",
"tokens_in",
"tokens_out",
"cached_tokens",
"images",
"video_minutes_delivered",
"gb_stored",
"gb_egress",
"transactions",
"gmv_usd",
"sandbox_seconds",
"sandbox_hours",
"vm_hours",
"vcpu_hours",
"browser_hours",
"proxy_gb",
"job_executions",
"verifications",
"inbound_emails",
"emails",
"events",
"errors",
"exceptions",
"requests",
"pageviews",
"searches",
"payouts",
"credits_usd",
"stream_hours",
"audio_minutes",
"characters",
"payout_volume_usd",
"disputes",
"object_writes",
"object_reads",
"sms",
"vectors",
"vector_queries",
"cache_commands",
"gpu_seconds",
"gpu_hours",
"revenue_usd",
"phone_minutes"
],
"maxLength": 2000,
"type": "string"
}
},
"required": [
"amount",
"unit"
],
"type": "object"
},
"volumes": {
"description": "Several dimensions at once, e.g. [{amount: 15000000, unit: 'tokens_in'}, {amount: 7500000, unit: 'tokens_out'}]",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 1000000000000000,
"minimum": 0,
"type": "number"
},
"unit": {
"description": "A units.json unit, or an alias: tokens_in, tokens_out, images, gb_stored, gb_egress, transactions, gmv_usd, sandbox_seconds, sandbox_hours, vcpu_hours, browser_hours, job_executions, verifications, inbound_emails, video_minutes_delivered, sso_connections, sso_users, emails, events, requests, credits_usd, MAU (= mau). *_per_month units are monthly, *_per_day daily, *_gb and video_minutes_stored are totals.",
"enum": [
"seats",
"members",
"mau",
"emails_per_month",
"emails_per_day",
"contacts",
"domains",
"events_per_month",
"pageviews_per_month",
"errors_per_month",
"requests_per_month",
"requests_per_day",
"searches_per_month",
"cpu_ms_per_request",
"db_gb",
"storage_gb",
"bandwidth_gb",
"projects",
"sites",
"videos",
"video_minutes",
"responses_per_month",
"tasks_per_month",
"keywords_tracked",
"credits_per_month",
"history_days",
"apps",
"files",
"event_types",
"monitors",
"tokens_per_month",
"images_per_month",
"audio_minutes_per_month",
"characters_per_month",
"transactions_per_month",
"sandbox_hours_per_month",
"concurrent_sessions",
"session_minutes",
"call_participants",
"meeting_minutes",
"records",
"inboxes",
"tokens_in_per_month",
"tokens_out_per_month",
"cached_tokens_per_month",
"video_minutes_stored",
"video_minutes_delivered_per_month",
"gmv_usd_per_month",
"payouts_per_month",
"active_accounts",
"verifications_per_month",
"browser_hours_per_month",
"proxy_gb_per_month",
"job_executions_per_month",
"sso_connections",
"sso_users",
"inbound_emails_per_month",
"stream_hours_per_month",
"vcpu_hours_per_month",
"credits_usd_per_month",
"disputes_per_month",
"payout_volume_usd_per_month",
"object_writes_per_month",
"object_reads_per_month",
"job_executions_per_day",
"scim_connections",
"searches_per_hour",
"sms_per_month",
"vectors_stored",
"vector_queries_per_month",
"cache_commands_per_month",
"mtu",
"gpu_seconds_per_month",
"revenue_usd_per_month",
"phone_minutes_per_month",
"vector_read_units_per_month",
"vector_write_units_per_month",
"MAU",
"tokens",
"tokens_in",
"tokens_out",
"cached_tokens",
"images",
"video_minutes_delivered",
"gb_stored",
"gb_egress",
"transactions",
"gmv_usd",
"sandbox_seconds",
"sandbox_hours",
"vm_hours",
"vcpu_hours",
"browser_hours",
"proxy_gb",
"job_executions",
"verifications",
"inbound_emails",
"emails",
"events",
"errors",
"exceptions",
"requests",
"pageviews",
"searches",
"payouts",
"credits_usd",
"stream_hours",
"audio_minutes",
"characters",
"payout_volume_usd",
"disputes",
"object_writes",
"object_reads",
"sms",
"vectors",
"vector_queries",
"cache_commands",
"gpu_seconds",
"gpu_hours",
"revenue_usd",
"phone_minutes"
],
"maxLength": 2000,
"type": "string"
}
},
"required": [
"amount",
"unit"
],
"type": "object"
},
"maxItems": 8,
"minItems": 1,
"type": "array"
}
},
"required": [
"job"
],
"type": "object"
},
"maxItems": 12,
"minItems": 1,
"type": "array"
},
"prefer": {
"default": "cheapest",
"description": "managed leaves out self-hosted options",
"enum": [
"cheapest",
"managed",
"open_source"
],
"maxLength": 2000,
"type": "string"
},
"project": {
"description": "What is being built. Volumes written here ('1,200,000 preview images/mo', '20k MAU') are used and echoed as assumptions. Say 'personal' or 'hobby' if it is non-commercial; otherwise plans that forbid commercial use (e.g. Vercel Hobby) are blocked.",
"maxLength": 4000,
"type": "string"
},
"scale_by": {
"default": "mau",
"description": "mau: scales are monthly active users (per_user volumes × MAU; other monthly volumes and sizes grow in proportion to the MAU they were given at); multiplier: every monthly volume and size is multiplied",
"enum": [
"mau",
"multiplier"
],
"maxLength": 2000,
"type": "string"
},
"scales": {
"description": "Price the stack at several scales, e.g. [1000, 20000, 200000] MAU (scale_by mau) or [1, 10, 100] (scale_by multiplier): per-job cost curve, tier changes and break-even points between options",
"items": {
"maximum": 1000000000,
"minimum": 0.001,
"type": "number"
},
"maxItems": 6,
"minItems": 1,
"type": "array"
},
"unit_economics": {
"additionalProperties": false,
"description": "Revenue model for gross margin per scale: price_usd with conversion_rate, or revenue_per_mau",
"properties": {
"billing": {
"default": "monthly",
"description": "one_time: price_usd per purchase, conversion_rate = purchases per MAU per month",
"enum": [
"monthly",
"one_time"
],
"maxLength": 2000,
"type": "string"
},
"conversion_rate": {
"description": "Share of MAU who pay, e.g. 0.03",
"maximum": 1,
"minimum": 0,
"type": "number"
},
"price_usd": {
"description": "What a paying user pays",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"revenue_per_mau": {
"description": "Average monthly revenue per MAU (instead of price_usd × conversion_rate)",
"maximum": 10000,
"minimum": 0,
"type": "number"
},
"variable_cost_alert_pct": {
"default": 20,
"description": "Flag jobs whose monthly cost is above this % of revenue",
"maximum": 100,
"minimum": 1,
"type": "number"
}
},
"type": "object"
}
},
"required": [
"needs"
],
"type": "object"
},
"name": "choose_stack",
"outputSchema": null
},
{
"description": "Use when the user names one product they pay for and asks for something cheaper, whether it's worth it, or what to switch to: 'cheaper than Typeform?', 'is Semrush worth $139 a month for us?', 'we pay $90 for SendGrid'. Pass what they pay (monthly_spend_usd), seats, the features they use and their usage (usage, or evidence such as '40,000 emails/mo') so each plan's caps can be checked. Returns ranked paths re-costed at their price, including a cheaper plan of the same vendor (right_size). A path with fit 'fits' passed every check; a 'check' path is a candidate with open checks, so ask its questions before recommending it. status, why and questions say what is still missing. Savings are modeled from public list prices. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"active_users": {
"description": "People or accounts active in the last 30 days (0 = unused: cleanup levers and sanity checks)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"billing": {
"additionalProperties": false,
"description": "Billing evidence: scope (dedicated, shared or unknown), account_id (a non-secret alias; the account key), allocated_monthly_usd (attribution only, never a saving), avoidable_monthly_usd with avoidability_confirmed (what leaving actually removes from the bill; 0 is valid), commitment_months_remaining (non-refundable months left; 0 only when cancellable now) and source (a reference, no private contents). With billing, a path is eligible only once the avoidable amount, scope, commitment and source are all given",
"properties": {
"account_id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"allocated_monthly_usd": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"avoidability_confirmed": {
"type": "boolean"
},
"avoidable_monthly_usd": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"commitment_months_remaining": {
"maximum": 120,
"minimum": 0,
"type": "number"
},
"scope": {
"enum": [
"dedicated",
"shared",
"unknown"
],
"maxLength": 2000,
"type": "string"
},
"source": {
"maxLength": 1000,
"minLength": 1,
"type": "string"
}
},
"type": "object"
},
"confirmed": {
"description": "true when the user confirmed they pay for this (with plan: its list price counts as confirmed spend). Scanner-only lines are unconfirmed",
"type": "boolean"
},
"evidence": {
"description": "Usage facts in words, read best effort: 'db 1.5 GB', '40,000 emails/mo', '37 domains', '3,000 MAU', 'shared by 40 projects'",
"items": {
"maxLength": 500,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"features_used": {
"description": "Features they actually use; sizes and counts ('4,000 contacts', 'videos over 5 minutes') are read as usage",
"items": {
"maxLength": 200,
"type": "string"
},
"maxItems": 50,
"type": "array"
},
"last_active": {
"description": "When this resource (project, app, account) was last used: an ISO date ('2026-03-10'), 'never', or '5 months ago'. 90+ days idle or never used gets a cleanup lever",
"maxLength": 100,
"type": "string"
},
"limit": {
"default": 8,
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"monthly_spend_usd": {
"description": "What they pay per month today, all seats (replaces the modeled baseline)",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"plan": {
"description": "Their plan, e.g. 'Essential' (else read from the vendor name)",
"maxLength": 100,
"type": "string"
},
"replacement_validation": {
"additionalProperties": false,
"description": "A replacement path the user checked themselves: its current price, capacity, burst limits and paid add-ons against their usage. It answers that path's capacity checks (never its must-haves) and ranks it first",
"properties": {
"capacity_and_price_confirmed": {
"description": "true only after checking the price, capacity, burst limits and required add-ons",
"type": "boolean"
},
"path_id": {
"description": "The path id (from find_alternatives or audit_stack)",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"source": {
"description": "Where the check comes from (usage report, pricing page, quote); no private contents",
"maxLength": 1000,
"minLength": 1,
"type": "string"
}
},
"required": [
"path_id",
"capacity_and_price_confirmed",
"source"
],
"type": "object"
},
"revenue_usd_per_month": {
"description": "The product's revenue per month (context for sanity checks: no revenue, cost per user, fees vs revenue; never a cap)",
"maximum": 1000000000,
"minimum": 0,
"type": "number"
},
"seats": {
"description": "Paid seats; per-seat prices on both sides scale with it",
"maximum": 100000,
"minimum": 1,
"type": "integer"
},
"shared_with": {
"description": "How many products share this bill (one account, org or team), when only this product is audited: moving one product off it saves only what it adds to the bill, never the whole bill. monthly_spend_usd is then the whole account's bill",
"maximum": 100000,
"minimum": 1,
"type": "integer"
},
"usage": {
"additionalProperties": false,
"description": "Their usage, checked against each plan's caps (priced with published overage and add-ons). Units: seats, members, mau, emails_per_month, emails_per_day, contacts, domains, events_per_month, pageviews_per_month, errors_per_month, requests_per_month, requests_per_day, searches_per_month, cpu_ms_per_request, db_gb, storage_gb, bandwidth_gb, projects, sites, videos, video_minutes, responses_per_month, tasks_per_month, keywords_tracked, credits_per_month, history_days, apps, files, event_types, monitors, tokens_per_month, images_per_month, audio_minutes_per_month, characters_per_month, transactions_per_month, sandbox_hours_per_month, concurrent_sessions, session_minutes, call_participants, meeting_minutes, records, inboxes, tokens_in_per_month, tokens_out_per_month, cached_tokens_per_month, video_minutes_stored, video_minutes_delivered_per_month, gmv_usd_per_month, payouts_per_month, active_accounts, verifications_per_month, browser_hours_per_month, proxy_gb_per_month, job_executions_per_month, sso_connections, sso_users, inbound_emails_per_month, stream_hours_per_month, vcpu_hours_per_month, credits_usd_per_month, disputes_per_month, payout_volume_usd_per_month, object_writes_per_month, object_reads_per_month, job_executions_per_day, scim_connections, searches_per_hour, sms_per_month, vectors_stored, vector_queries_per_month, cache_commands_per_month, mtu, gpu_seconds_per_month, revenue_usd_per_month, phone_minutes_per_month, vector_read_units_per_month, vector_write_units_per_month (MAU is accepted for mau). Example: {\"emails_per_month\": 40000, \"domains\": 4, \"db_gb\": 3}. get_usage_questions says which units matter for a vendor and where the user finds each number.",
"properties": {
"MAU": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"active_accounts": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"apps": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"audio_minutes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"bandwidth_gb": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"browser_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"cache_commands_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"cached_tokens_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"call_participants": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"characters_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"concurrent_sessions": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"contacts": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"cpu_ms_per_request": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"credits_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"credits_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"db_gb": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"disputes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"domains": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"emails_per_day": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"emails_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"errors_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"event_types": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"events_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"files": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"gmv_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"gpu_seconds_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"history_days": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"images_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"inbound_emails_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"inboxes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"job_executions_per_day": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"job_executions_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"keywords_tracked": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"mau": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"meeting_minutes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"members": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"monitors": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"mtu": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"object_reads_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"object_writes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"pageviews_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"payout_volume_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"payouts_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"phone_minutes_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"projects": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"proxy_gb_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"records": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"requests_per_day": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"requests_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"responses_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"revenue_usd_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sandbox_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"scim_connections": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"searches_per_hour": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"searches_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"seats": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"session_minutes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sites": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sms_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sso_connections": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"sso_users": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"storage_gb": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"stream_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tasks_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tokens_in_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tokens_out_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"tokens_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"transactions_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vcpu_hours_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vector_queries_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vector_read_units_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vector_write_units_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"vectors_stored": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"verifications_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"video_minutes": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"video_minutes_delivered_per_month": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"video_minutes_stored": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
},
"videos": {
"maximum": 1000000000000,
"minimum": 0,
"type": "number"
}
},
"type": "object"
},
"vendor": {
"description": "Product name as on the invoice, e.g. 'Typeform', 'Slack Pro', 'HubSpot Sales Hub Starter'",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"vendor"
],
"type": "object"
},
"name": "find_alternatives",
"outputSchema": null
},
{
"description": "Use when the user wants to replace a tool by building their own (Replace with AI): returns SPEC.md, AGENTS.md and the runbook files a coding agent builds from, for a recipe with a build path. A recipe without one returns the assessment files for validating a switch or downgrade instead, never a spec to clone a service. Check packet_kind and next_step before acting. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"recipe_id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"recipe_id"
],
"type": "object"
},
"name": "get_build_packet",
"outputSchema": null
},
{
"description": "Rules for finding paid services in a codebase on the user's own machine: package names, environment variable name patterns, config files, API hosts and feature patterns for about 100 vendors. Apply them locally and send only the vendor and feature names you found to audit_stack, never code or secret values. Names without rules come back under unknown. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"vendors": {
"description": "Only these vendors, by id or name (default: all)",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 200,
"type": "array"
}
},
"required": [],
"type": "object"
},
"name": "get_detection_rules",
"outputSchema": null
},
{
"description": "Use when the user wants to cancel, unsubscribe from, pause or pay less for something they subscribe to: streaming, music, news, dating, cloud storage, AI tools, apps or business software ('cancel YouTube TV', 'how do I get out of Adobe', 'stop my Audible'). Returns Stackcut's exit plan: every way to cancel by who bills them (the company, Apple, Google Play, a partner or a contract), the steps with the words to expect on screen, when access ends, notice periods, fees and refunds, what to export first, cheaper ways to keep it, and notes for an agent, each fact sourced to the vendor's own page with a check date. Pass billed_by when known (the name on their card statement or receipt) and renewal_date to get the last safe day to cancel. Never cancel for the user without their go-ahead: they sign in, see any offer, and confirm the final step. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"billed_by": {
"description": "Who charges them (their card statement or receipt says): the company itself (direct_web), Apple, Google Play, Amazon, a phone/TV provider, a partner, or a business contract. Leave out or 'unknown' to get every route and the question to ask",
"enum": [
"direct_web",
"direct_app",
"apple_app_store",
"google_play",
"amazon",
"roku",
"paypal",
"carrier_or_isp",
"reseller_or_partner",
"sales_contract",
"unknown"
],
"maxLength": 2000,
"type": "string"
},
"renewal_date": {
"description": "Next renewal date, YYYY-MM-DD: adds the last safe day to cancel from the documented notice period",
"maxLength": 2000,
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"service": {
"description": "The subscription, e.g. 'YouTube TV', 'Adobe Creative Cloud', 'disneyplus.com'",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"service"
],
"type": "object"
},
"name": "get_exit_plan",
"outputSchema": null
},
{
"description": "Use only when the user gives you a Stackcut agent code (it starts with sca_; they copy it from 'Send to my agent' on stackcut.io). Returns their own savings plan: every subscription with its verdict, the proven saving, the proof (receipts, card charges or a sourced price), steps and checks. Walk them through it from the biggest proven saving down and ask before any cancel, purchase or sign-up. The code is read-only and expires. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"code": {
"description": "The agent code from stackcut.io, e.g. sca_…",
"maxLength": 200,
"type": "string"
}
},
"required": [
"code"
],
"type": "object"
},
"name": "get_my_plan",
"outputSchema": null
},
{
"description": "Full detail for one recipe from search_recipes: every replacement path with modeled first-year savings, monthly cost, setup time and upkeep, what is out of scope, checks to run before switching, how to leave the current vendor (cancel steps, refunds, exports, what you lose), step-by-step playbooks, sources, and Stackcut's own lab results where they exist (not customer results). Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Recipe id from search_recipes, e.g. 'crm-pipeline'",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "get_recipe",
"outputSchema": null
},
{
"description": "Before an audit: which usage numbers decide each vendor's answer (emails a month, domains, database size, seats…), where the user finds each one (dashboard page, API, export), and ready-to-ask questions. Units already stated in context are marked as given. Pass the answers to audit_stack or find_alternatives as usage and features_used. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"context": {
"description": "Optional: what is already known, in words (e.g. 'about 40,000 emails/mo, 4 domains'); units it states are marked as given and not asked again",
"maxLength": 2000,
"type": "string"
},
"vendors": {
"description": "Vendors they pay for, by name or id, e.g. ['Resend', 'Supabase Pro']",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 30,
"minItems": 1,
"type": "array"
}
},
"required": [
"vendors"
],
"type": "object"
},
"name": "get_usage_questions",
"outputSchema": null
},
{
"description": "One runbook from search_workflow_recipes in full: the evidence to collect, keep/downsize/consolidate/migrate/build/retire decisions, ordered steps, acceptance tests, rollout, rollback, maintenance, costs still unresolved, and scoped starter templates with their download digest. A reviewed playbook is not a completed customer migration. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"id": {
"description": "Workflow id from search_workflow_recipes, e.g. 'portfolio-shared-billing'",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"name": "get_workflow_recipe",
"outputSchema": null
},
{
"description": "The top replacement paths across the catalog by modeled first-year savings, payback months, or how often people and agents used them. Leaves out partial replacements unless include_partial, and never lists trials, one-time credits, expiring or non-commercial plans. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"include_partial": {
"default": false,
"type": "boolean"
},
"limit": {
"default": 10,
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"metric": {
"default": "savings",
"enum": [
"savings",
"payback",
"popular"
],
"maxLength": 2000,
"type": "string"
},
"path_type": {
"enum": [
"switch",
"downgrade",
"open_source",
"per_use",
"agent_skill",
"build",
"bundled"
],
"maxLength": 2000,
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "leaderboard",
"outputSchema": null
},
{
"description": "The catalog's categories with how many recipes each has and the best modeled first-year saving in each. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_categories",
"outputSchema": null
},
{
"description": "The jobs choose_stack can compare (database, auth, hosting, transactional and inbound email, object storage, LLM APIs, payments, sandboxes, browser automation, queues…) with how many vendors each has, plus the volume units and aliases it accepts. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {},
"required": [],
"type": "object"
},
"name": "list_stack_jobs",
"outputSchema": null
},
{
"description": "Use when the user shares a product brief or spec and asks what to build it with or what it will cost. Works out the jobs the brief needs (what it rules out, plans for later or already has is never priced), the volumes from its numbers or listed default rates, and its budget; prices the stack at several scales with choose_stack; and returns SPEC.md, AGENTS.md and a manifest for a coding agent. Keyword rules over the brief, no model call: when total.hypothetical is true, confirm the assumed jobs and volumes with the user before quoting the cost. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"add_jobs": {
"description": "Jobs to add that the brief doesn't mention",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 12,
"type": "array"
},
"exclude_jobs": {
"description": "Derived jobs to drop (job ids)",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 20,
"type": "array"
},
"limit_per_job": {
"default": 3,
"maximum": 10,
"minimum": 1,
"type": "integer"
},
"overrides": {
"description": "Edit the derived assumptions: a volume per MAU per month (per_user) or a fixed monthly total for a job",
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"maximum": 1000000000000000,
"minimum": 0,
"type": "number"
},
"basis": {
"default": "per_user",
"enum": [
"per_user",
"total"
],
"maxLength": 2000,
"type": "string"
},
"job": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"unit": {
"enum": [
"seats",
"members",
"mau",
"emails_per_month",
"emails_per_day",
"contacts",
"domains",
"events_per_month",
"pageviews_per_month",
"errors_per_month",
"requests_per_month",
"requests_per_day",
"searches_per_month",
"cpu_ms_per_request",
"db_gb",
"storage_gb",
"bandwidth_gb",
"projects",
"sites",
"videos",
"video_minutes",
"responses_per_month",
"tasks_per_month",
"keywords_tracked",
"credits_per_month",
"history_days",
"apps",
"files",
"event_types",
"monitors",
"tokens_per_month",
"images_per_month",
"audio_minutes_per_month",
"characters_per_month",
"transactions_per_month",
"sandbox_hours_per_month",
"concurrent_sessions",
"session_minutes",
"call_participants",
"meeting_minutes",
"records",
"inboxes",
"tokens_in_per_month",
"tokens_out_per_month",
"cached_tokens_per_month",
"video_minutes_stored",
"video_minutes_delivered_per_month",
"gmv_usd_per_month",
"payouts_per_month",
"active_accounts",
"verifications_per_month",
"browser_hours_per_month",
"proxy_gb_per_month",
"job_executions_per_month",
"sso_connections",
"sso_users",
"inbound_emails_per_month",
"stream_hours_per_month",
"vcpu_hours_per_month",
"credits_usd_per_month",
"disputes_per_month",
"payout_volume_usd_per_month",
"object_writes_per_month",
"object_reads_per_month",
"job_executions_per_day",
"scim_connections",
"searches_per_hour",
"sms_per_month",
"vectors_stored",
"vector_queries_per_month",
"cache_commands_per_month",
"mtu",
"gpu_seconds_per_month",
"revenue_usd_per_month",
"phone_minutes_per_month",
"vector_read_units_per_month",
"vector_write_units_per_month",
"MAU",
"tokens",
"tokens_in",
"tokens_out",
"cached_tokens",
"images",
"video_minutes_delivered",
"gb_stored",
"gb_egress",
"transactions",
"gmv_usd",
"sandbox_seconds",
"sandbox_hours",
"vm_hours",
"vcpu_hours",
"browser_hours",
"proxy_gb",
"job_executions",
"verifications",
"inbound_emails",
"emails",
"events",
"errors",
"exceptions",
"requests",
"pageviews",
"searches",
"payouts",
"credits_usd",
"stream_hours",
"audio_minutes",
"characters",
"payout_volume_usd",
"disputes",
"object_writes",
"object_reads",
"sms",
"vectors",
"vector_queries",
"cache_commands",
"gpu_seconds",
"gpu_hours",
"revenue_usd",
"phone_minutes"
],
"maxLength": 2000,
"type": "string"
}
},
"required": [
"job",
"unit",
"amount"
],
"type": "object"
},
"maxItems": 40,
"type": "array"
},
"prefer": {
"default": "cheapest",
"enum": [
"cheapest",
"managed",
"open_source"
],
"maxLength": 2000,
"type": "string"
},
"scales": {
"default": [
1000,
20000,
200000
],
"description": "MAU targets to price, default [1000, 20000, 200000]",
"items": {
"maximum": 1000000000,
"minimum": 1,
"type": "number"
},
"maxItems": 5,
"minItems": 1,
"type": "array"
},
"spec": {
"description": "The product brief (markdown or plain text, up to 20,000 characters): what it does, who uses it, how it makes money, any numbers you know (users, conversion, prices, volumes). Never paste secrets or personal data.",
"maxLength": 20000,
"minLength": 1,
"type": "string"
},
"unit_economics": {
"additionalProperties": false,
"description": "Revenue model for gross margin per scale: price_usd with conversion_rate, or revenue_per_mau",
"properties": {
"billing": {
"default": "monthly",
"description": "one_time: price_usd per purchase, conversion_rate = purchases per MAU per month",
"enum": [
"monthly",
"one_time"
],
"maxLength": 2000,
"type": "string"
},
"conversion_rate": {
"description": "Share of MAU who pay, e.g. 0.03",
"maximum": 1,
"minimum": 0,
"type": "number"
},
"price_usd": {
"description": "What a paying user pays",
"maximum": 1000000,
"minimum": 0,
"type": "number"
},
"revenue_per_mau": {
"description": "Average monthly revenue per MAU (instead of price_usd × conversion_rate)",
"maximum": 10000,
"minimum": 0,
"type": "number"
},
"variable_cost_alert_pct": {
"default": 20,
"description": "Flag jobs whose monthly cost is above this % of revenue",
"maximum": 100,
"minimum": 1,
"type": "number"
}
},
"type": "object"
}
},
"required": [
"spec"
],
"type": "object"
},
"name": "plan_stack_from_spec",
"outputSchema": null
},
{
"description": "Only after the user confirms what happened: record that a cancellation went through, that they kept the service for less, that they got stuck, or that the steps had changed (and at which step). Adds one to anonymous public counters that keep the cancel library current; stores no personal data and no free text. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"billed_by": {
"enum": [
"direct_web",
"direct_app",
"apple_app_store",
"google_play",
"amazon",
"roku",
"paypal",
"carrier_or_isp",
"reseller_or_partner",
"sales_contract"
],
"maxLength": 2000,
"type": "string"
},
"outcome": {
"enum": [
"cancelled",
"kept_for_less",
"blocked",
"steps_changed"
],
"maxLength": 2000,
"type": "string"
},
"service": {
"description": "The service, as passed to get_exit_plan",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"step": {
"description": "For blocked or steps_changed: the step number where it stopped matching",
"maximum": 50,
"minimum": 1,
"type": "integer"
}
},
"required": [
"service",
"billed_by",
"outcome"
],
"type": "object"
},
"name": "report_exit_outcome",
"outputSchema": null
},
{
"description": "Only after the user confirms what they did: record that they picked, switched to or reverted from a replacement path. Adds one to anonymous public counters and stores no personal data. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"outcome": {
"enum": [
"picked",
"switched",
"reverted"
],
"maxLength": 2000,
"type": "string"
},
"path_id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"recipe_id": {
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [
"recipe_id",
"path_id",
"outcome"
],
"type": "object"
},
"name": "report_outcome",
"outputSchema": null
},
{
"description": "Lists services in Stackcut's cancel library (streaming, music, news, dating, cloud storage, AI tools, apps and software), by name, domain or category, with the page and JSON for each. Use get_exit_plan for one service's steps. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"enum": [
"streaming_video",
"music_audio",
"news_magazines",
"dating",
"cloud_storage",
"productivity",
"ai_tools",
"design_creative",
"developer_tools",
"marketing_sales",
"communication",
"security_privacy",
"education_learning",
"health_fitness",
"gaming",
"shopping_memberships",
"finance_apps",
"other_digital"
],
"maxLength": 2000,
"type": "string"
},
"limit": {
"default": 20,
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "A name or domain, e.g. 'peacock', 'vpn'",
"maxLength": 200,
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "search_exits",
"outputSchema": null
},
{
"description": "Use when the user wants a cheaper way to do a job and names a feature or kind of tool rather than one product: 'cheaper keyword research', 'forms without Typeform', 'what can replace our CRM'. Filter by the vendor they pay for, a feature, a category or a path type (switch, cheaper plan, open source, pay per use, agent skill, build it). Returns compact recipe cards, each with its best priced path that saves money; get_recipe has every path, cost and source. For one product they pay for, find_alternatives re-costs it at their own price and usage. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"description": "Category name from list_categories, e.g. 'CRM', 'SEO data'",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"feature": {
"description": "A feature they rely on, e.g. 'rank tracking', 'e-signatures'",
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"limit": {
"default": 10,
"maximum": 25,
"minimum": 1,
"type": "integer"
},
"path_type": {
"description": "Only recipes offering this kind of replacement",
"enum": [
"switch",
"downgrade",
"open_source",
"per_use",
"agent_skill",
"build",
"bundled"
],
"maxLength": 2000,
"type": "string"
},
"query": {
"description": "Free text, e.g. 'client approval portal' or 'semrush backlinks'",
"maxLength": 300,
"type": "string"
},
"sort": {
"default": "relevance",
"enum": [
"savings",
"popular",
"relevance"
],
"maxLength": 2000,
"type": "string"
},
"vendor": {
"description": "Product currently paid for, e.g. 'Airtable', 'Salesforce', 'Semrush Pro'",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "search_recipes",
"outputSchema": null
},
{
"description": "Use for a whole operational change rather than one subscription: billing shared across projects, moving hosting or email, retiring a dormant project, cheaper AI model routing, queues, auth or storage. Returns reviewed runbooks with the query words they matched; get_workflow_recipe returns one in full. Runbooks are guidance, not proof that a migration ran. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"limit": {
"default": 10,
"maximum": 25,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "The job in words, e.g. 'shared billing across projects' or 'queue retries worker'",
"maxLength": 500,
"type": "string"
},
"vendor": {
"description": "Only runbooks tagged for this vendor id, e.g. 'stripe', 'supabase'",
"maxLength": 200,
"minLength": 1,
"type": "string"
}
},
"required": [],
"type": "object"
},
"name": "search_workflow_recipes",
"outputSchema": null
},
{
"description": "Start here when the user wants to cut spend across several tools, consolidate apps, or replace one tool safely, and the bills alone won't decide it. Send vendors and team_size (or a stack manifest) and get the few missing facts that would change the answer, ranked by what's at stake, each with where to find it. Fetch those, add them, and call again until status is 'enough', then call next.tool with next.arguments. Send counts, prices, feature and job names only, never raw exports, customer data, secrets or people's names. Stackcut stores the arguments of tool calls to improve its recommendations (vendor names, prices, seats, features, usage numbers, billing amounts and project descriptions; account keys only as a one-way hash, billing and validation sources not at all; never IP addresses): don't send personal data or secrets.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"decision": {
"description": "With vendors: what the audit is for (default cut_spend).",
"enum": [
"cut_spend",
"consolidate",
"replace_one",
"choose_stack",
"check_in"
],
"maxLength": 2000,
"type": "string"
},
"manifest": {
"description": "A stack manifest (JSON Schema at https://stackcut.io/schemas/stack-manifest-1.json; manifest_version '1'): goal, org, builder, services (vendor, plan, monthly_spend_usd, seats, active_users, features_used, usage, renewal_date, …), workflows, unknowns.",
"type": "object"
},
"max_questions": {
"description": "Most questions to return (default 8).",
"maximum": 20,
"minimum": 1,
"type": "integer"
},
"team_size": {
"description": "With vendors: people on the team.",
"maximum": 1000000,
"minimum": 1,
"type": "integer"
},
"vendors": {
"description": "A first pass without a manifest: the tools the team pays for, e.g. ['Notion', 'Asana', 'Loom'].",
"items": {
"maxLength": 200,
"minLength": 1,
"type": "string"
},
"maxItems": 200,
"minItems": 1,
"type": "array"
}
},
"required": [],
"type": "object"
},
"name": "start_audit",
"outputSchema": null
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:04ed5fb9fdd940610dff0317105b39faadde489e851d6ff8ae1d4a24f224f3ad | sha256sum