{
 "count": 185,
 "tools": [
  {
   "name": "get_ai_billing_blind_spots",
   "summary": "Flag AWS AI/Marketplace spend that bypasses AWS Cost Anomaly Detection,    Bedrock (bills through Marketplace), other Marketplace AI/SaaS, and SageMaker. These line items are invisible to AWS's own anomaly detector, so a spike goes unnoticed until the invoice lands. nable watches them directly.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 7744
  },
  {
   "name": "get_ai_engineering_report",
   "summary": "What your AI coding tools actually shipped, by model, and what it cost.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "repos",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "unit",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "AI & LLM spend",
   "lineno": 7552
  },
  {
   "name": "get_ai_kpis",
   "summary": "Full AI cost health dashboard with actionable KPIs.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "infra_total_usd",
     "type": "float | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "AI & LLM spend",
   "lineno": 8595
  },
  {
   "name": "get_ai_spend_monitor",
   "summary": "On-demand view of what nable's daily AI-spend monitor watches: a spike or drop on your token-spend series, plus commitment contracts that need attention (capacity under-utilized, enterprise minimum shortfall, commitment expiring). The scheduler runs this daily and alerts via Slack; this returns the same view on demand.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "AI & LLM spend",
   "lineno": 7881
  },
  {
   "name": "get_bedrock_costs",
   "summary": "Break down Amazon Bedrock costs by model and token type.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "account",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 10514
  },
  {
   "name": "get_gpu_infra_costs",
   "summary": "Report spend status across serverless-GPU / inference-infra providers,    Modal, Together, and Replicate. For the model-builder slice of AI startups this is the single largest variable cost, billed per GPU-second inside each vendor's own dashboard and invisible to any cloud bill.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 7675
  },
  {
   "name": "get_kendra_costs",
   "summary": "Analyze Amazon Kendra costs by index, with edition and usage flags.",
   "params": [
    {
     "name": "account",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 10562
  },
  {
   "name": "get_langfuse_model_costs",
   "summary": "Break down LLM spend and token usage by model from Langfuse observability data.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 8061
  },
  {
   "name": "get_langfuse_trace_volume",
   "summary": "Daily trace and observation counts from Langfuse, usage volume over time.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 8123
  },
  {
   "name": "get_llm_commitment_analysis",
   "summary": "Optimize token spend against committed AI contracts: prepaid credits, Azure OpenAI PTUs, AWS Bedrock Provisioned Throughput, and enterprise rate cards. This is Reserved-Instance analysis for tokens. nable prices you against your ACTUAL negotiated terms, not list, which a provider dashboard cannot do.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 7775
  },
  {
   "name": "get_llm_cost_by_model",
   "summary": "Break down AI/LLM costs by individual model with efficiency metrics.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 7938
  },
  {
   "name": "get_llm_costs",
   "summary": "Aggregate AI/LLM spend across all configured providers, OpenAI, Anthropic, AWS Bedrock, Azure OpenAI, and Vertex AI.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 7594
  },
  {
   "name": "get_llm_unit_economics",
   "summary": "Calculate cost per unit of business value from AI APIs.",
   "params": [
    {
     "name": "metric_name",
     "type": "str",
     "required": false
    },
    {
     "name": "metric_count",
     "type": "float | None",
     "required": false
    },
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "AI & LLM spend",
   "lineno": 7993
  },
  {
   "name": "get_llm_unit_economics_full",
   "summary": "AI cost unit economics: cost per customer, MAU, API request, and gross margin impact.",
   "params": [
    {
     "name": "customers",
     "type": "int | None",
     "required": false
    },
    {
     "name": "mau",
     "type": "int | None",
     "required": false
    },
    {
     "name": "mrr",
     "type": "float | None",
     "required": false
    },
    {
     "name": "api_requests",
     "type": "int | None",
     "required": false
    },
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "AI & LLM spend",
   "lineno": 8733
  },
  {
   "name": "get_textract_costs",
   "summary": "Analyze AWS Textract costs by API type (sync vs async).",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "account",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 10586
  },
  {
   "name": "optimize_ai_spend",
   "summary": "Ranked, dollar-quantified plan to cut your AI/LLM bill, across OpenAI, Anthropic, AWS Bedrock, Azure OpenAI, and Vertex.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 8657
  },
  {
   "name": "recommend_bedrock_model_routing",
   "summary": "Analyzes Bedrock model usage to find invocations that could route to cheaper models without quality loss. Sonnet costs 20x more than Haiku. Classification, extraction, and short-context tasks rarely need Sonnet.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "AI & LLM spend",
   "lineno": 10710
  },
  {
   "name": "check_action_policy",
   "summary": "Advisory policy gate: should a proposed remediation action proceed?",
   "params": [
    {
     "name": "action_type",
     "type": "str",
     "required": true
    },
    {
     "name": "terraform_plan_json",
     "type": "str | None",
     "required": false
    },
    {
     "name": "terraform_plan_file",
     "type": "str | None",
     "required": false
    },
    {
     "name": "tf_dir",
     "type": "str | None",
     "required": false
    },
    {
     "name": "helm_diff",
     "type": "str | None",
     "required": false
    },
    {
     "name": "monthly_delta_usd",
     "type": "float | None",
     "required": false
    },
    {
     "name": "budget_name",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Agent cost gate",
   "lineno": 8510
  },
  {
   "name": "delete_alert_policy",
   "summary": "Remove a custom alert policy. The service will revert to the default threshold.",
   "params": [
    {
     "name": "policy_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Agent cost gate",
   "lineno": 1718
  },
  {
   "name": "estimate_change_cost",
   "summary": "Cost preflight for a proposed change: what it costs and whether it fits budget.",
   "params": [
    {
     "name": "terraform_plan_json",
     "type": "str | None",
     "required": false
    },
    {
     "name": "terraform_plan_file",
     "type": "str | None",
     "required": false
    },
    {
     "name": "tf_dir",
     "type": "str | None",
     "required": false
    },
    {
     "name": "helm_diff",
     "type": "str | None",
     "required": false
    },
    {
     "name": "monthly_delta_usd",
     "type": "float | None",
     "required": false
    },
    {
     "name": "budget_name",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Agent cost gate",
   "lineno": 8392
  },
  {
   "name": "estimate_terraform_cost",
   "summary": "Estimate the monthly AWS cost change from a Terraform plan BEFORE applying it.",
   "params": [
    {
     "name": "plan_json",
     "type": "str | None",
     "required": false
    },
    {
     "name": "plan_file",
     "type": "str | None",
     "required": false
    },
    {
     "name": "tf_dir",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Agent cost gate",
   "lineno": 8333
  },
  {
   "name": "set_alert_policy",
   "summary": "Set a custom alert policy for anomaly detection on a specific provider or service.",
   "params": [
    {
     "name": "provider",
     "type": "str",
     "required": false
    },
    {
     "name": "service_pattern",
     "type": "str",
     "required": false
    },
    {
     "name": "muted",
     "type": "bool",
     "required": false
    },
    {
     "name": "min_pct_change",
     "type": "float | None",
     "required": false
    },
    {
     "name": "min_usd_change",
     "type": "float | None",
     "required": false
    },
    {
     "name": "note",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "Agent cost gate",
   "lineno": 1602
  },
  {
   "name": "acknowledge_anomaly",
   "summary": "Mark an anomaly as acknowledged (dismissed). It will no longer appear in active anomalies.",
   "params": [
    {
     "name": "anomaly_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Anomalies & alerts",
   "lineno": 1868
  },
  {
   "name": "check_notification_config",
   "summary": "Check which notification channels (Slack, Teams) are configured and active, returning each channel's status and what is missing when one is not set up. Use it to verify where anomaly alerts and digests will be delivered before relying on them.",
   "params": [],
   "pro": false,
   "category": "Anomalies & alerts",
   "lineno": 2157
  },
  {
   "name": "create_anomaly_tickets",
   "summary": "Create tickets in Jira, Linear, or GitHub Issues for all active high/medium anomalies that don't already have a ticket. Uses the first configured ticketing provider.",
   "params": [
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Anomalies & alerts",
   "lineno": 3013
  },
  {
   "name": "get_account_anomalies",
   "summary": "Detect accounts with unusual spend changes versus their prior period. Returns accounts that significantly spiked or dropped in cost. Requires a Team plan (org_reports).",
   "params": [
    {
     "name": "days_back",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Anomalies & alerts",
   "lineno": 6268
  },
  {
   "name": "get_anomalies",
   "summary": "Return active (unacknowledged) cost anomalies detected from historical baselines.",
   "params": [
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "severity",
     "type": "str | None",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    },
    {
     "name": "account",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Anomalies & alerts",
   "lineno": 1749
  },
  {
   "name": "list_alert_policies",
   "summary": "List all custom alert policies for anomaly detection.",
   "params": [],
   "pro": false,
   "category": "Anomalies & alerts",
   "lineno": 1676
  },
  {
   "name": "get_azure_advisor_recommendations",
   "summary": "Azure Advisor cost recommendations, with Microsoft-computed annual savings.",
   "params": [
    {
     "name": "subscription_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Azure",
   "lineno": 6688
  },
  {
   "name": "get_azure_budgets",
   "summary": "Read the budgets you already set in Azure and report consumption against each.",
   "params": [
    {
     "name": "subscription_id",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Azure",
   "lineno": 6782
  },
  {
   "name": "get_azure_cost_by_dimension",
   "summary": "Break Azure spend down by any dimension: service, resource group, location, or meter.",
   "params": [
    {
     "name": "dimension",
     "type": "str",
     "required": true
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "subscription_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Azure",
   "lineno": 6841
  },
  {
   "name": "get_azure_reservation_utilization",
   "summary": "Fetch Azure reservation utilization summaries from the Capacity API.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Azure",
   "lineno": 6650
  },
  {
   "name": "get_azure_vm_rightsizing",
   "summary": "Find idle and oversized Azure VMs from Azure Monitor CPU, with real dollar cost.",
   "params": [
    {
     "name": "subscription_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "lookback_days",
     "type": "int",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    },
    {
     "name": "max_vms_scanned",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Azure",
   "lineno": 6728
  },
  {
   "name": "get_resource_cost_breakdown_azure",
   "summary": "Return per-resource Azure cost detail via the Cost Management Query API.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "subscription_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "resource_group",
     "type": "str | None",
     "required": false
    },
    {
     "name": "min_cost_usd",
     "type": "float",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Azure",
   "lineno": 6582
  },
  {
   "name": "check_budget_status",
   "summary": "Check current spend against budgets. Shows how much has been spent, what's remaining, and whether any budgets are in warning or exceeded status.",
   "params": [
    {
     "name": "budget_name",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Budgets",
   "lineno": 6037
  },
  {
   "name": "delete_budget",
   "summary": "Delete (deactivate) a budget by ID so it stops alerting and gating agent actions.",
   "params": [
    {
     "name": "budget_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Budgets",
   "lineno": 6100
  },
  {
   "name": "get_credit_status",
   "summary": "Track AWS promotional-credit (Activate) burn-down and detect the moment billing flips from credits to cash, the cliff where an early startup first feels cost pain. AWS sends no native alert for this.",
   "params": [
    {
     "name": "months",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Budgets",
   "lineno": 7714
  },
  {
   "name": "list_budgets",
   "summary": "List all configured budgets with their limits and scopes.",
   "params": [],
   "pro": false,
   "category": "Budgets",
   "lineno": 6082
  },
  {
   "name": "set_budget",
   "summary": "Create or update a spending budget. Budgets fire Slack alerts when spend crosses alert_at_pct, and fail CI checks when it crosses block_at_pct.",
   "params": [
    {
     "name": "name",
     "type": "str",
     "required": true
    },
    {
     "name": "limit_usd",
     "type": "float",
     "required": true
    },
    {
     "name": "scope_type",
     "type": "str",
     "required": false
    },
    {
     "name": "scope_value",
     "type": "str",
     "required": false
    },
    {
     "name": "period",
     "type": "str",
     "required": false
    },
    {
     "name": "alert_at_pct",
     "type": "float",
     "required": false
    },
    {
     "name": "block_at_pct",
     "type": "float",
     "required": false
    }
   ],
   "pro": false,
   "category": "Budgets",
   "lineno": 5989
  },
  {
   "name": "sync_budgets_from_yaml",
   "summary": "Import budgets from a budget.yml file. Idempotent, running twice is safe. Use this to version-control your spending limits alongside your infrastructure code.",
   "params": [
    {
     "name": "yaml_path",
     "type": "str",
     "required": true
    }
   ],
   "pro": false,
   "category": "Budgets",
   "lineno": 6122
  },
  {
   "name": "benchmark_costs",
   "summary": "Compare this account's spend profile against anonymised peer group medians.",
   "params": [
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "vertical",
     "type": "str",
     "required": false
    },
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 8167
  },
  {
   "name": "compare_providers",
   "summary": "Side-by-side cost comparison across all configured providers.",
   "params": [
    {
     "name": "category",
     "type": "str | None",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Cost visibility",
   "lineno": 1198
  },
  {
   "name": "explain_cost_change",
   "summary": "Explain what recent cost changes actually mean for the business.",
   "params": [
    {
     "name": "compare_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Cost visibility",
   "lineno": 9102
  },
  {
   "name": "explain_recent_cost_drivers",
   "summary": "Explain what drove cost changes across all connected providers in the last N days.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "top_n",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 12930
  },
  {
   "name": "get_cost_history",
   "summary": "Return historical daily cost data for a specific provider + service. Used for trend analysis and understanding anomaly context.",
   "params": [
    {
     "name": "provider",
     "type": "str",
     "required": true
    },
    {
     "name": "service",
     "type": "str",
     "required": true
    },
    {
     "name": "account_id",
     "type": "str",
     "required": true
    },
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 1888
  },
  {
   "name": "get_cost_summary",
   "summary": "Get total spend summarized by service, account, and region.",
   "params": [
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "category",
     "type": "str | None",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    },
    {
     "name": "account",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 934
  },
  {
   "name": "get_cost_trends",
   "summary": "Cost trends over time broken down by day or month.",
   "params": [
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "category",
     "type": "str | None",
     "required": false
    },
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 1269
  },
  {
   "name": "get_costs_by_service",
   "summary": "Cost breakdown by service, optionally filtered to a keyword.",
   "params": [
    {
     "name": "service_filter",
     "type": "str | None",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "category",
     "type": "str | None",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "account",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 1048
  },
  {
   "name": "get_data_transfer_costs",
   "summary": "Identify significant data transfer cost line items from AWS Cost Explorer.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "threshold_usd",
     "type": "float",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 4409
  },
  {
   "name": "get_documentdb_costs",
   "summary": "Analyze Amazon DocumentDB costs by cluster, with rightsizing recommendations.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "account",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 10538
  },
  {
   "name": "get_focus_costs",
   "summary": "Return unified cost data in FOCUS 1.2 format across all connected providers, clouds plus supported usage-based SaaS (e.g. Snowflake).",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "group_by",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 9983
  },
  {
   "name": "get_marketplace_costs",
   "summary": "Break down AWS Marketplace costs by product and vendor.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "account",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 10742
  },
  {
   "name": "get_resource_cost_breakdown_aws",
   "summary": "Return per-resource AWS cost detail from the Cost and Usage Report (CUR) via Athena. Includes unblended cost, on-demand equivalent, and effective savings from Savings Plans or Reserved Instances.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "service",
     "type": "str | None",
     "required": false
    },
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "min_cost_usd",
     "type": "float",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Cost visibility",
   "lineno": 6348
  },
  {
   "name": "get_saas_spend_summary",
   "summary": "Dedicated summary of all SaaS tool spending (Datadog, Snowflake, GitHub, etc.). Useful for understanding your software vendor bill separate from cloud infrastructure.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 1461
  },
  {
   "name": "get_service_cost",
   "summary": "Get cost breakdown for any named cloud service on AWS, Azure, or GCP.",
   "params": [
    {
     "name": "service_name",
     "type": "str",
     "required": true
    },
    {
     "name": "provider",
     "type": "str",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 10829
  },
  {
   "name": "get_storage_info",
   "summary": "Show the current storage backend (SQLite local or Postgres shared). Helps teams understand whether they're in single-engineer or shared mode.",
   "params": [],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 6891
  },
  {
   "name": "get_top_cost_drivers",
   "summary": "Return the top N most expensive services across all configured providers.",
   "params": [
    {
     "name": "limit",
     "type": "int",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "category",
     "type": "str | None",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "account",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 1149
  },
  {
   "name": "get_total_spend_all_sources",
   "summary": "Grand total across ALL connected sources, cloud infrastructure + SaaS tools combined. The true \"total technology spend\" number.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Cost visibility",
   "lineno": 1482
  },
  {
   "name": "get_traffic_cost_breakdown",
   "summary": "Break down AWS network/data-transfer spend: how much, and where it goes.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 3742
  },
  {
   "name": "list_active_services",
   "summary": "List every cloud service that has spend in the period, across AWS, Azure, and GCP.",
   "params": [
    {
     "name": "provider",
     "type": "str",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 10765
  },
  {
   "name": "list_connected_providers",
   "summary": "List every cloud, SaaS, and LLM provider nable knows, each marked connected or not-configured, plus the active plan. The starting point for \"what am I connected to\" and for spotting which connector still needs credentials (each not-configured entry names the setup command to run).",
   "params": [],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 730
  },
  {
   "name": "run_full_cost_audit",
   "summary": "Run a full cost optimization audit across all connected AWS resources. Use this when the user explicitly asks for a full audit, cost scan, or optimization sweep. For simple cost questions (\"what did I spend last month?\") prefer get_cost_summary or get_costs_by_service, they are faster and cheaper.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "top_n",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 11987
  },
  {
   "name": "slice_costs",
   "summary": "Slice cloud cost any way you want. This is the flexible, moldable cost query: group and filter by ANY combination of dimensions, over any date range, instead of a fixed set of canned reports. Returns both the numbers and a `card` describing how to chart them (which the UI can render and pin to the dashboard).",
   "params": [
    {
     "name": "dimensions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "filters",
     "type": "list[dict] | None",
     "required": false
    },
    {
     "name": "exclusions",
     "type": "list[dict] | None",
     "required": false
    },
    {
     "name": "metric",
     "type": "str",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    },
    {
     "name": "order_by",
     "type": "str",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "title",
     "type": "str | None",
     "required": false
    },
    {
     "name": "via",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Cost visibility",
   "lineno": 10191
  },
  {
   "name": "get_databricks_costs",
   "summary": "Return Databricks workspace cost breakdown for the given date range.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Databricks",
   "lineno": 9718
  },
  {
   "name": "get_databricks_dbu_breakdown",
   "summary": "Show DBU (Databricks Unit) consumption by cluster, job, and cluster type.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Databricks",
   "lineno": 9778
  },
  {
   "name": "get_databricks_job_costs",
   "summary": "Show cost and DBU breakdown by Databricks job run.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "top_n",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Databricks",
   "lineno": 9916
  },
  {
   "name": "forecast_azure_costs",
   "summary": "Forecast Azure spend using Azure Cost Management's own forecast model.",
   "params": [
    {
     "name": "subscription_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Forecasting",
   "lineno": 6807
  },
  {
   "name": "forecast_costs",
   "summary": "Forecast future cloud spend using Holt-Winters time-series modelling.",
   "params": [
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "service",
     "type": "str | None",
     "required": false
    },
    {
     "name": "horizon_days",
     "type": "int",
     "required": false
    },
    {
     "name": "history_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Forecasting",
   "lineno": 8203
  },
  {
   "name": "forecast_llm_costs",
   "summary": "Forecast AI/LLM token spend and, if you give a balance, the date your credits or commitment run out. Uses nable's per-account forecaster (Holt-Winters with linear and naive fallbacks by history length) on your daily token-cost series.",
   "params": [
    {
     "name": "horizon_days",
     "type": "int",
     "required": false
    },
    {
     "name": "balance_usd",
     "type": "float | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Forecasting",
   "lineno": 7846
  },
  {
   "name": "audit_gcp_waste",
   "summary": "Deep GCP waste audit: scans Compute Engine across all zones/regions for unattached persistent disks, reserved-but-idle static IPs, old snapshots, and idle VMs (CPU joined from Cloud Monitoring). Returns findings sorted by estimated monthly savings.",
   "params": [
    {
     "name": "projects",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "checks",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "idle_days",
     "type": "int",
     "required": false
    },
    {
     "name": "snapshot_age_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "GCP",
   "lineno": 3581
  },
  {
   "name": "get_gcp_recommendations",
   "summary": "Pull Google's native Recommender API cost recommendations for your GCP projects.",
   "params": [
    {
     "name": "projects",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "recommenders",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "GCP",
   "lineno": 3662
  },
  {
   "name": "compare_kubernetes_clusters",
   "summary": "Compare costs and efficiency across all configured Kubernetes clusters. Useful for multi-cluster setups (prod vs staging, region vs region).",
   "params": [],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5752
  },
  {
   "name": "create_kubernetes_waste_tickets",
   "summary": "Create tickets for Kubernetes waste findings: idle nodes, over-provisioned workloads, and orphaned Helm releases.",
   "params": [
    {
     "name": "min_monthly_waste",
     "type": "float",
     "required": false
    }
   ],
   "pro": true,
   "category": "Kubernetes",
   "lineno": 3106
  },
  {
   "name": "estimate_helm_diff_cost",
   "summary": "Estimate the monthly cost impact of a helm diff or values.yaml change. Handles replicaCount, CPU/memory requests, instanceType, and nodeCount changes.",
   "params": [
    {
     "name": "diff_text",
     "type": "str",
     "required": true
    },
    {
     "name": "release_name",
     "type": "str",
     "required": false
    },
    {
     "name": "current_replicas",
     "type": "int",
     "required": false
    },
    {
     "name": "current_cpu_request",
     "type": "str",
     "required": false
    },
    {
     "name": "current_memory_request",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5297
  },
  {
   "name": "get_cluster_efficiency",
   "summary": "Kubernetes cluster efficiency score (0-100) with letter grade, per-namespace breakdown, and prioritised recommendations ranked by dollar impact.",
   "params": [
    {
     "name": "context",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5358
  },
  {
   "name": "get_databricks_cluster_efficiency",
   "summary": "Audit all Databricks clusters for efficiency issues and cost waste.",
   "params": [],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 9850
  },
  {
   "name": "get_helm_release_costs",
   "summary": "Cost breakdown by Helm release, shows what each release actually costs rather than raw deployment names. Detects orphaned releases wasting money.",
   "params": [
    {
     "name": "context",
     "type": "str | None",
     "required": false
    },
    {
     "name": "namespace",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5160
  },
  {
   "name": "get_kubernetes_cost_trends",
   "summary": "Kubernetes cost trend over time from stored daily snapshots. Shows whether cluster spend is growing, shrinking, or stable.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "cluster",
     "type": "str | None",
     "required": false
    },
    {
     "name": "namespace",
     "type": "str | None",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5544
  },
  {
   "name": "get_kubernetes_costs",
   "summary": "Full Kubernetes cost breakdown -- node costs attributed to namespaces, workloads, and labels. Detects wasted spend and rightsizing opportunities.",
   "params": [
    {
     "name": "context",
     "type": "str | None",
     "required": false
    },
    {
     "name": "namespace",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 4649
  },
  {
   "name": "get_kubernetes_namespace_breakdown",
   "summary": "Deep-dive cost breakdown for a single Kubernetes namespace. Shows every workload, pod count, CPU/memory efficiency, and waste.",
   "params": [
    {
     "name": "namespace",
     "type": "str",
     "required": true
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 4808
  },
  {
   "name": "get_label_costs",
   "summary": "Aggregate Kubernetes costs by any pod label across all namespaces. Great for chargeback: see spend by team, environment, app, or any label.",
   "params": [
    {
     "name": "label_key",
     "type": "str",
     "required": false
    },
    {
     "name": "context",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5422
  },
  {
   "name": "get_workload_costs",
   "summary": "Detailed Kubernetes workload cost breakdown with efficiency grades. Supports filtering by namespace and workload kind, sorting by cost or waste.",
   "params": [
    {
     "name": "namespace",
     "type": "str | None",
     "required": false
    },
    {
     "name": "kind",
     "type": "str | None",
     "required": false
    },
    {
     "name": "sort_by",
     "type": "str",
     "required": false
    },
    {
     "name": "context",
     "type": "str | None",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 5478
  },
  {
   "name": "list_kubernetes_contexts",
   "summary": "List all Kubernetes contexts available in the local kubeconfig, and show which one is currently active. Use this to discover what to pass as the 'context' argument to get_kubernetes_costs.",
   "params": [],
   "pro": false,
   "category": "Kubernetes",
   "lineno": 4619
  },
  {
   "name": "generate_account_dashboard",
   "summary": "Generate a cost dashboard for the account and open it in your browser.",
   "params": [
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "open_browser",
     "type": "bool",
     "required": false
    },
    {
     "name": "push_to_notion",
     "type": "bool",
     "required": false
    }
   ],
   "pro": false,
   "category": "Organizations & accounts",
   "lineno": 2340
  },
  {
   "name": "get_cost_summary_all_accounts",
   "summary": "Fan out cost queries across ALL configured AWS accounts and return a combined view sorted by total spend. Shows each account's total and top services.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Organizations & accounts",
   "lineno": 1386
  },
  {
   "name": "get_org_cost_summary",
   "summary": "Get a cost rollup across all AWS Organization accounts: total spend, per-account breakdown sorted by spend, and top services per account. Requires a Team plan (org_reports).",
   "params": [
    {
     "name": "days_back",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Organizations & accounts",
   "lineno": 6205
  },
  {
   "name": "get_ou_cost_breakdown",
   "summary": "Break costs down by AWS Organizational Unit (OU). When OUs map to departments or teams, this gives you a clean chargeback report. Requires a Team plan (org_reports).",
   "params": [
    {
     "name": "days_back",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Organizations & accounts",
   "lineno": 6318
  },
  {
   "name": "get_top_spending_accounts",
   "summary": "Show the highest-spending AWS accounts in the organization. Requires a Team plan (org_reports).",
   "params": [
    {
     "name": "limit",
     "type": "int",
     "required": false
    },
    {
     "name": "days_back",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Organizations & accounts",
   "lineno": 6243
  },
  {
   "name": "list_accounts",
   "summary": "List all cloud accounts, subscriptions, and SaaS org IDs that nable can see, grouped by provider: AWS account ids, Azure subscriptions, GCP billing accounts, and each SaaS provider's org. Use it to find the account id or name other tools accept as their account argument.",
   "params": [
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Organizations & accounts",
   "lineno": 1312
  },
  {
   "name": "list_aws_accounts",
   "summary": "List all AWS accounts configured in ~/.finops-mcp/accounts.yaml.",
   "params": [],
   "pro": false,
   "category": "Organizations & accounts",
   "lineno": 1339
  },
  {
   "name": "list_org_accounts",
   "summary": "List all AWS Organization member accounts, discovering them via the AWS Organizations API. Syncs account metadata to local DB for future queries. Account listing is free. Detailed cost rollup across accounts requires a Team plan.",
   "params": [],
   "pro": false,
   "category": "Organizations & accounts",
   "lineno": 6160
  },
  {
   "name": "nable_setup_status",
   "summary": "Agent-driven onboarding: what is connected, what credentials are already on this machine, and the exact command to connect each remaining provider.",
   "params": [],
   "pro": false,
   "category": "Other",
   "lineno": 669
  },
  {
   "name": "check_connector_health",
   "summary": "Actively test every configured connector with a real API call. Reports health status, last successful data time, and fix instructions for failures.",
   "params": [],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 818
  },
  {
   "name": "create_api_key",
   "summary": "Create a new API key for a team member. Requires admin role in shared mode.",
   "params": [
    {
     "name": "name",
     "type": "str",
     "required": true
    },
    {
     "name": "role",
     "type": "str",
     "required": false
    },
    {
     "name": "email",
     "type": "str",
     "required": false
    },
    {
     "name": "scope_team",
     "type": "str | None",
     "required": false
    },
    {
     "name": "scope_provider",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 6919
  },
  {
   "name": "get_nable_roi",
   "summary": "Shows the return on investment from using nable: savings found, acted on, and verified versus the cost of the tool itself.",
   "params": [
    {
     "name": "period_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 13035
  },
  {
   "name": "list_api_keys",
   "summary": "List all active API keys (names, roles, scopes). Raw keys are never shown. Requires admin role in shared mode.",
   "params": [],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 6960
  },
  {
   "name": "list_profiles",
   "summary": "List all configured nable profiles (for multi-account or multi-client setups).",
   "params": [],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 2863
  },
  {
   "name": "list_vault_credentials",
   "summary": "List the names of credentials stored in the encrypted vault (never the values).",
   "params": [],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 2192
  },
  {
   "name": "revoke_api_key",
   "summary": "Revoke an API key by ID. The key is soft-deleted, it stops working immediately. Requires admin role. Use list_api_keys to find the key ID first.",
   "params": [
    {
     "name": "key_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 6976
  },
  {
   "name": "what_can_nable_do",
   "summary": "Show everything nable can do, tailored to what you've connected.",
   "params": [
    {
     "name": "detailed",
     "type": "bool",
     "required": false
    }
   ],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 12854
  },
  {
   "name": "whoami",
   "summary": "Show the current identity and access level. Works in both permissive and shared auth mode.",
   "params": [],
   "pro": false,
   "category": "Platform & admin",
   "lineno": 6997
  },
  {
   "name": "cancel_report_subscription",
   "summary": "Cancel (deactivate) a scheduled report subscription.",
   "params": [
    {
     "name": "subscription_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 5962
  },
  {
   "name": "export_board_summary",
   "summary": "Generate the cost section of a board / investor update as markdown.",
   "params": [
    {
     "name": "period_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 9213
  },
  {
   "name": "export_cost_report",
   "summary": "Export a cost report as HTML (printable to PDF) and/or CSV. Saved to ~/.finops/exports/. No Claude Desktop required to open.",
   "params": [
    {
     "name": "title",
     "type": "str | None",
     "required": false
    },
    {
     "name": "sections",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "formats",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "open_file",
     "type": "bool",
     "required": false
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 2436
  },
  {
   "name": "export_cost_report_csv",
   "summary": "Runs the full cost audit and exports results to a CSV file.",
   "params": [
    {
     "name": "output_path",
     "type": "str | None",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "top_n",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 12252
  },
  {
   "name": "fetch_invoice_emails",
   "summary": "Fetch unread invoice emails from the configured IMAP mailbox, extract amounts, and store them as cost entries. Solves the billing API gap for vendors like PagerDuty, New Relic, and GitHub Enterprise.",
   "params": [],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 3295
  },
  {
   "name": "get_tableau_connection_info",
   "summary": "Returns the Tableau Web Data Connector URL for connecting Tableau Desktop to nable.",
   "params": [
    {
     "name": "port",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 13235
  },
  {
   "name": "list_report_subscriptions",
   "summary": "List all active report subscriptions, their names, schedules, sections, and delivery channels.",
   "params": [],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 5903
  },
  {
   "name": "publish_cost_report_to_notion",
   "summary": "Runs the full cost audit and publishes results to your team's Notion page.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 12606
  },
  {
   "name": "push_to_n8n",
   "summary": "Runs the cost audit and pushes results to your n8n workflow via webhook.",
   "params": [
    {
     "name": "event_type",
     "type": "str",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 12511
  },
  {
   "name": "push_weekly_insight",
   "summary": "Push a rich weekly cost intelligence summary to Slack right now.",
   "params": [],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 3325
  },
  {
   "name": "send_digest_now",
   "summary": "Manually trigger a cost digest to Slack and/or Teams right now. Normally this sends automatically at 09:00 UTC daily.",
   "params": [],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 2134
  },
  {
   "name": "send_onboarding_email",
   "summary": "Send an onboarding email to a specific address.",
   "params": [
    {
     "name": "to_email",
     "type": "str",
     "required": true
    },
    {
     "name": "variant",
     "type": "str",
     "required": false
    },
    {
     "name": "days_left",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 2084
  },
  {
   "name": "send_report_now",
   "summary": "Trigger a report subscription immediately, regardless of its schedule.",
   "params": [
    {
     "name": "subscription_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 5937
  },
  {
   "name": "send_weekly_digest_now",
   "summary": "Immediately send the weekly email digest to the configured recipient. Includes spend summary, anomalies, and top rightsizing recommendations. Works without Claude, pure standalone email.",
   "params": [],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 3477
  },
  {
   "name": "start_dashboard_server",
   "summary": "Starts a local web dashboard you can open in a browser. Binds to localhost by default. Pass expose=true to bind all interfaces so others on your network can reach it (plain HTTP, so only do this on a trusted network or behind a TLS proxy).",
   "params": [
    {
     "name": "port",
     "type": "int",
     "required": false
    },
    {
     "name": "host",
     "type": "str",
     "required": false
    },
    {
     "name": "expose",
     "type": "bool",
     "required": false
    }
   ],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 13165
  },
  {
   "name": "subscribe_to_report",
   "summary": "Create a scheduled report subscription. Reports are delivered automatically to Slack channels and/or email addresses on the configured schedule.",
   "params": [
    {
     "name": "name",
     "type": "str",
     "required": true
    },
    {
     "name": "sections",
     "type": "list[str]",
     "required": true
    },
    {
     "name": "frequency",
     "type": "str",
     "required": false
    },
    {
     "name": "slack_channels",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "email_addresses",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "team",
     "type": "str",
     "required": false
    },
    {
     "name": "provider",
     "type": "str",
     "required": false
    },
    {
     "name": "lookback_days",
     "type": "int",
     "required": false
    },
    {
     "name": "cron",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "Reports & exports",
   "lineno": 5818
  },
  {
   "name": "take_snapshot_now",
   "summary": "Manually trigger a cost snapshot right now (fetches yesterday's costs from all providers). Normally this runs automatically at 01:00 UTC daily.",
   "params": [],
   "pro": false,
   "category": "Reports & exports",
   "lineno": 1935
  },
  {
   "name": "get_pinned_view",
   "summary": "Re-run a pinned view by id and return fresh cost data plus its rendered card. Read-only: nothing is modified, the saved definition is executed against current data.",
   "params": [
    {
     "name": "view_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Saved views",
   "lineno": 10469
  },
  {
   "name": "get_view",
   "summary": "Run a pre-built cost view by name. These are standard reports your whole team can share.",
   "params": [
    {
     "name": "view",
     "type": "str",
     "required": true
    },
    {
     "name": "tag_key",
     "type": "str | None",
     "required": false
    },
    {
     "name": "tag_value",
     "type": "str | None",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    },
    {
     "name": "days",
     "type": "int | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Saved views",
   "lineno": 9425
  },
  {
   "name": "list_pinned_views",
   "summary": "List the cost cards pinned to the dashboard: every saved view with its id, title, template, metric and dimensions, so you can re-run one with get_pinned_view(id) or remove one with unpin_view(id).",
   "params": [],
   "pro": false,
   "category": "Saved views",
   "lineno": 10448
  },
  {
   "name": "list_views",
   "summary": "List all pre-built cost views available to your team.",
   "params": [],
   "pro": false,
   "category": "Saved views",
   "lineno": 9396
  },
  {
   "name": "pin_view",
   "summary": "Pin a cost slice to the dashboard as a saved card. Takes the same slicing arguments as slice_costs (dimensions / filters / exclusions / metric / etc.), plus a title and a rolling lookback `days`. The pinned card re-runs its slice live on each dashboard load over the trailing `days`, so it always shows fresh numbers. scope: \"instance\" (shared on this nable) or \"me\". Read-only on the cloud: this only saves a view definition locally. Args: title: Card title shown on the dashboard. dimensions: Fields to group by (as in slice_costs). filters: Include-filters, {field: [values]}. exclusions: Exclude-filters, {field: [values]}. metric: \"cost\" (default) or another supported metric. granularity: \"DAILY\" or \"MONTHLY\". order_by: Sort field, defaults to the metric descending. limit: Max rows in the card. days: Look-back window in days (default 30). scope: \"instance\" (default) pins for this machine.",
   "params": [
    {
     "name": "title",
     "type": "str",
     "required": true
    },
    {
     "name": "dimensions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "filters",
     "type": "list[dict] | None",
     "required": false
    },
    {
     "name": "exclusions",
     "type": "list[dict] | None",
     "required": false
    },
    {
     "name": "metric",
     "type": "str",
     "required": false
    },
    {
     "name": "granularity",
     "type": "str",
     "required": false
    },
    {
     "name": "order_by",
     "type": "str",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    },
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "scope",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Saved views",
   "lineno": 10390
  },
  {
   "name": "unpin_view",
   "summary": "Remove a pinned cost card from the dashboard by id, so the dashboard stops tracking that saved view. The underlying saved view is not deleted, only unpinned; pin_view() puts it back.",
   "params": [
    {
     "name": "view_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Saved views",
   "lineno": 10493
  },
  {
   "name": "dismiss_recommendation",
   "summary": "Dismiss a recommendation you've decided not to act on (won't fix, accepted risk, etc.). Dismissed recommendations won't appear in open potential savings.",
   "params": [
    {
     "name": "recommendation_id",
     "type": "int",
     "required": true
    },
    {
     "name": "reason",
     "type": "str",
     "required": false
    }
   ],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2647
  },
  {
   "name": "get_commitment_analysis",
   "summary": "Analyze Reserved Instance and Savings Plan coverage, utilization, and waste. Coverage %, utilization, and waste figures are free. Purchase recommendations with $ amounts require a Team plan (commitment_recommendations).",
   "params": [],
   "pro": true,
   "category": "Savings & commitments",
   "lineno": 2933
  },
  {
   "name": "get_commitment_coverage_by_tag",
   "summary": "Estimate RI/SP commitment coverage for a specific tag slice, even when tagging is incomplete.",
   "params": [
    {
     "name": "tag_key",
     "type": "str",
     "required": true
    },
    {
     "name": "tag_value",
     "type": "str",
     "required": true
    },
    {
     "name": "tag_coverage_pct",
     "type": "float",
     "required": false
    }
   ],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 5061
  },
  {
   "name": "get_effective_rate_profile",
   "summary": "Auto-detect the account's effective private rates by comparing actual billed amounts against public on-demand prices.",
   "params": [],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 4576
  },
  {
   "name": "get_recommendation_learning",
   "summary": "What nable has learned about how YOU use recommendations, and how it adapts.",
   "params": [],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2834
  },
  {
   "name": "get_recommendation_quality",
   "summary": "The recommendation-quality flywheel: per recommendation type, how often recs get acted on and how close the predicted savings were to the measured realized savings. The verified-savings proof, and the signal for which recommendation types actually pay off.",
   "params": [],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2810
  },
  {
   "name": "get_savings_ledger",
   "summary": "Shows a clean summary of savings found, acted on, and verified.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    },
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2716
  },
  {
   "name": "get_savings_plan_showback",
   "summary": "Show exactly how much each team saved from Savings Plans and Reserved Instances.",
   "params": [
    {
     "name": "tag_key",
     "type": "str",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "include_ri",
     "type": "bool",
     "required": false
    }
   ],
   "pro": true,
   "category": "Savings & commitments",
   "lineno": 6520
  },
  {
   "name": "get_savings_summary",
   "summary": "Show the realized-savings dashboard: how much nable has recommended, how much has been acted on, and how much has been verified as actually saved.",
   "params": [],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2294
  },
  {
   "name": "list_savings_recommendations",
   "summary": "List tracked recommendations with their current status.",
   "params": [
    {
     "name": "status",
     "type": "str | None",
     "required": false
    },
    {
     "name": "source",
     "type": "str | None",
     "required": false
    },
    {
     "name": "limit",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2565
  },
  {
   "name": "mark_recommendation_acted_on",
   "summary": "Mark a savings recommendation as acted on (you've implemented the change). nable will then attempt to verify the change next time verify_savings() runs.",
   "params": [
    {
     "name": "recommendation_id",
     "type": "int",
     "required": true
    }
   ],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2620
  },
  {
   "name": "verify_savings",
   "summary": "Auto-verify acted-on recommendations by checking if changes were actually implemented in AWS (EC2 instance type changes, etc.).",
   "params": [],
   "pro": false,
   "category": "Savings & commitments",
   "lineno": 2673
  },
  {
   "name": "get_business_metrics",
   "summary": "Return stored business metrics and trend over time.",
   "params": [
    {
     "name": "history_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Teams & attribution",
   "lineno": 8970
  },
  {
   "name": "get_costs_by_team",
   "summary": "Return cloud costs broken down by engineering team, using tag attribution rules.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Teams & attribution",
   "lineno": 1957
  },
  {
   "name": "get_efficiency_scorecard",
   "summary": "FinOps efficiency scorecard, a 0\u2013100 score with letter grade across 5 dimensions: compute efficiency, waste reduction, commitment coverage, tag hygiene, and anomaly response. Tracked over time so you can see if you're improving.",
   "params": [
    {
     "name": "scope",
     "type": "str",
     "required": false
    },
    {
     "name": "team",
     "type": "str | None",
     "required": false
    },
    {
     "name": "environment",
     "type": "str | None",
     "required": false
    },
    {
     "name": "provider",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Teams & attribution",
   "lineno": 4825
  },
  {
   "name": "get_tag_cost_breakdown_cur",
   "summary": "Break AWS costs down by a resource tag using CUR line-item data via Athena.",
   "params": [
    {
     "name": "tag_key",
     "type": "str",
     "required": false
    },
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "cost_type",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "Teams & attribution",
   "lineno": 6473
  },
  {
   "name": "get_team_scorecards",
   "summary": "Efficiency scorecard for every team, side by side. Teams are discovered from your cost attribution tags (team=X). Shows which teams are leading and which need help.",
   "params": [],
   "pro": false,
   "category": "Teams & attribution",
   "lineno": 4980
  },
  {
   "name": "get_unit_economics",
   "summary": "Connect your total cloud and SaaS spend to business metrics.",
   "params": [
    {
     "name": "period_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": true,
   "category": "Teams & attribution",
   "lineno": 9017
  },
  {
   "name": "run_attribution_now",
   "summary": "Fetch tagged cost data from AWS/Azure/GCP and store team attributions. Run this after setting up tag_rules.yaml to populate team cost data.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Teams & attribution",
   "lineno": 2019
  },
  {
   "name": "set_business_metrics",
   "summary": "Store your business metrics so nable can connect cloud costs to business outcomes.",
   "params": [
    {
     "name": "arr_usd",
     "type": "float | None",
     "required": false
    },
    {
     "name": "mrr_usd",
     "type": "float | None",
     "required": false
    },
    {
     "name": "mau",
     "type": "int | None",
     "required": false
    },
    {
     "name": "dau",
     "type": "int | None",
     "required": false
    },
    {
     "name": "paying_customers",
     "type": "int | None",
     "required": false
    },
    {
     "name": "api_calls_monthly",
     "type": "int | None",
     "required": false
    },
    {
     "name": "employees",
     "type": "int | None",
     "required": false
    },
    {
     "name": "custom_metrics",
     "type": "dict | None",
     "required": false
    },
    {
     "name": "notes",
     "type": "str | None",
     "required": false
    },
    {
     "name": "metric_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "cash_on_hand_usd",
     "type": "float | None",
     "required": false
    },
    {
     "name": "last_raise_amount_usd",
     "type": "float | None",
     "required": false
    },
    {
     "name": "last_raise_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "monthly_opex_usd",
     "type": "float | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Teams & attribution",
   "lineno": 8864
  },
  {
   "name": "create_rightsizing_tickets",
   "summary": "Create tickets for rightsizing recommendations, over-provisioned EC2, RDS, and other resources that could be downsized to save money.",
   "params": [
    {
     "name": "min_monthly_savings",
     "type": "float",
     "required": false
    },
    {
     "name": "provider",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "Tickets & PRs",
   "lineno": 3042
  },
  {
   "name": "create_scorecard_tickets",
   "summary": "Create tickets for scorecard dimensions scoring below a threshold. Helps teams track and remediate FinOps efficiency gaps.",
   "params": [
    {
     "name": "score_threshold",
     "type": "int",
     "required": false
    },
    {
     "name": "team",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "Tickets & PRs",
   "lineno": 3202
  },
  {
   "name": "create_ticket",
   "summary": "Create a ticket in the configured ticketing system (Jira, Linear, or GitHub Issues) with a custom title and body. Use this for any finding, recommendation, or action item that doesn't fit a specific category.",
   "params": [
    {
     "name": "title",
     "type": "str",
     "required": true
    },
    {
     "name": "body",
     "type": "str",
     "required": true
    },
    {
     "name": "priority",
     "type": "str",
     "required": false
    },
    {
     "name": "labels",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": true,
   "category": "Tickets & PRs",
   "lineno": 3255
  },
  {
   "name": "generate_terraform_tag_fixes",
   "summary": "Generate HCL patches for all open tag violations in tf_dir. Shows a unified diff per .tf file, does NOT write to disk. Run audit_terraform_tags first to populate violations.",
   "params": [
    {
     "name": "tf_dir",
     "type": "str",
     "required": true
    }
   ],
   "pro": false,
   "category": "Tickets & PRs",
   "lineno": 7094
  },
  {
   "name": "open_rightsizing_pr",
   "summary": "Apply rightsizing recommendations to Terraform source, optionally opening a GitHub PR.",
   "params": [
    {
     "name": "tf_dir",
     "type": "str",
     "required": true
    },
    {
     "name": "github_repo",
     "type": "str | None",
     "required": false
    },
    {
     "name": "recommendation_ids",
     "type": "list[int] | None",
     "required": false
    },
    {
     "name": "resource_overrides",
     "type": "list[dict] | None",
     "required": false
    },
    {
     "name": "branch",
     "type": "str",
     "required": false
    },
    {
     "name": "base_branch",
     "type": "str",
     "required": false
    },
    {
     "name": "pr_title",
     "type": "str | None",
     "required": false
    },
    {
     "name": "dry_run",
     "type": "bool",
     "required": false
    },
    {
     "name": "patch_only",
     "type": "bool",
     "required": false
    }
   ],
   "pro": true,
   "category": "Tickets & PRs",
   "lineno": 7347
  },
  {
   "name": "open_terraform_tag_pr",
   "summary": "Apply tag fixes to .tf files and open a GitHub PR. Requires GITHUB_TOKEN env var and a git remote configured for github_repo.",
   "params": [
    {
     "name": "tf_dir",
     "type": "str",
     "required": true
    },
    {
     "name": "github_repo",
     "type": "str",
     "required": true
    },
    {
     "name": "branch",
     "type": "str",
     "required": false
    },
    {
     "name": "base_branch",
     "type": "str",
     "required": false
    },
    {
     "name": "pr_title",
     "type": "str",
     "required": false
    }
   ],
   "pro": true,
   "category": "Tickets & PRs",
   "lineno": 7188
  },
  {
   "name": "audit_aws_waste",
   "summary": "Deep AWS waste audit: scans EC2, EBS, RDS, Lambda, NAT Gateways, CloudWatch Logs, S3, and CloudTrail for waste. Returns findings sorted by monthly savings.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "checks",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 3509
  },
  {
   "name": "audit_cloudwatch_logs_ia_opportunities",
   "summary": "Finds CloudWatch Log groups to migrate to Infrequent Access class. IA cuts ingestion cost 50% ($0.075 to $0.0375/GB). Candidates: groups older than 30 days with >1 GB/month still on STANDARD. Note: IA does not support metric filters or subscription filters.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11793
  },
  {
   "name": "audit_cloudwatch_metric_cardinality",
   "summary": "Audits CloudWatch custom metric cardinality. Custom metrics above the 10,000 free-tier threshold cost $0.30/metric/month. High-cardinality dimensions like pod_id or request_id can cause thousands of metrics per microservice.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11637
  },
  {
   "name": "audit_cloudwatch_orphaned_alarms",
   "summary": "Finds CloudWatch alarms on deleted resources. Standard alarms cost $0.10/month, composite $0.30/month. Terminated instances and deleted queues leave alarms stuck in INSUFFICIENT_DATA indefinitely.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "max_results",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11712
  },
  {
   "name": "audit_duplicate_spend",
   "summary": "Find places where you're paying for the same capability through two different services or providers at once, the kind of waste a plain cost breakdown never surfaces because every line item looks legitimate on its own. Covers three patterns: multiple LLM inference paths active at the same time (e.g. AWS Bedrock Claude AND a direct Anthropic API key), multiple managed search/retrieval services (Kendra + OpenSearch), and two data platforms at once (Databricks + Snowflake).",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 10638
  },
  {
   "name": "audit_ebs_snapshot_replication",
   "summary": "Audits cross-region EBS snapshot replication for waste. Replicated snapshots cost $0.05/GB-month in each region. Finds orphaned copies (source volume deleted), excessive copies (more than 3 regions), and old copies where a newer copy exists.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "max_results",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11898
  },
  {
   "name": "audit_efs_cross_az_mounts",
   "summary": "Finds EC2 instances mounting EFS from a different AZ. Cross-AZ mounts cost $0.02/GB in hidden transfer charges. Fix by adding a mount target per AZ.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11238
  },
  {
   "name": "audit_nlb_cross_zone_costs",
   "summary": "Finds NLBs with cross-zone load balancing enabled. Cross-zone LB charges $0.01/GB for cross-AZ traffic. Safe to disable when AZs have equal capacity.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11281
  },
  {
   "name": "audit_public_ipv4_addresses",
   "summary": "Audits public IPv4 addresses across AWS. Since Feb 2024, AWS charges $3.60/month per IP including stopped instances. Finds unattached Elastic IPs and IPs on stopped instances with release recommendations.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 3788
  },
  {
   "name": "audit_rds_manual_snapshots",
   "summary": "Audits RDS manual snapshots for waste. Manual snapshots never auto-expire and cost $0.095/GB-month. Finds orphaned snapshots (source DB deleted) and old snapshots past the retention threshold.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "age_threshold_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 10977
  },
  {
   "name": "audit_s3_intelligent_tiering",
   "summary": "Finds S3 buckets using Intelligent-Tiering where the monitoring fee exceeds savings. IT costs $0.0025/1,000 objects, making it more expensive than S3 Standard for objects smaller than 128KB.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "max_results",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11330
  },
  {
   "name": "audit_s3_transfer_acceleration",
   "summary": "Finds S3 buckets with Transfer Acceleration enabled that won't benefit. TA adds $0.04-0.08/GB and is often forgotten. Flags buckets as waste if volume is under 1 GB/month, bucket is in us-east-1, or it is behind CloudFront. Returns a CLI disable command for each flagged bucket.",
   "params": [],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11943
  },
  {
   "name": "audit_spot_diversification",
   "summary": "Audits ASGs using spot for instance type diversification. ASGs with fewer than 3 types are HIGH_RISK. Best practice: 5+ types with capacity-optimized allocation to avoid correlated interruptions.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11554
  },
  {
   "name": "audit_terraform_tags",
   "summary": "Scan Terraform state for resources missing required tags. Runs `terraform show -json` in tf_dir (or reads state_path directly). Required tags configured via FINOPS_REQUIRED_TAGS env var (comma-separated, default: team,environment,service).",
   "params": [
    {
     "name": "tf_dir",
     "type": "str",
     "required": true
    },
    {
     "name": "state_path",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 7038
  },
  {
   "name": "audit_textract_environment_waste",
   "summary": "Analyzes Textract spend by environment to find non-production API calls. Textract charges per page, QA and staging environments often call it unnecessarily. Identifies which Lambda functions or services are calling Textract in non-prod and estimates the monthly waste.",
   "params": [
    {
     "name": "days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 10610
  },
  {
   "name": "cleanup_idle_resources",
   "summary": "Delete or release idle AWS resources. This is a REAL ACTION that terminates EC2 instances, releases EBS volumes, and frees Elastic IPs. Always runs in dry_run=True mode first so you can review what will be deleted. Requires explicit confirmation before setting dry_run=False.",
   "params": [
    {
     "name": "resource_ids",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "resource_types",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "min_idle_days",
     "type": "int",
     "required": false
    },
    {
     "name": "dry_run",
     "type": "bool",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4526
  },
  {
   "name": "get_ecr_cleanup_recommendations",
   "summary": "Find ECR repositories with old untagged container images consuming storage.",
   "params": [
    {
     "name": "older_than_days",
     "type": "int",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4271
  },
  {
   "name": "get_ecs_rightsizing_recommendations",
   "summary": "Find ECS Fargate services with over-provisioned CPU allocations.",
   "params": [
    {
     "name": "cpu_threshold",
     "type": "float",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4338
  },
  {
   "name": "get_idle_load_balancers",
   "summary": "Detect ALBs, NLBs, and Classic ELBs with near-zero traffic over the past 14 days.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "request_threshold",
     "type": "float",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4152
  },
  {
   "name": "get_idle_rds_instances",
   "summary": "Find RDS instances with near-zero database connections over the past 14 days.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4079
  },
  {
   "name": "get_instance_deep_analysis",
   "summary": "Deep CloudWatch analysis for a specific EC2 instance. Returns CPU, network, and disk utilization percentiles, a rightsizing recommendation, and the Compute Optimizer recommendation if available.",
   "params": [
    {
     "name": "instance_id",
     "type": "str",
     "required": true
    },
    {
     "name": "region",
     "type": "str",
     "required": false
    },
    {
     "name": "lookback_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 3889
  },
  {
   "name": "get_rds_rightsizing_recommendations",
   "summary": "Detect over-provisioned RDS instances with low CPU utilization.",
   "params": [
    {
     "name": "cpu_threshold",
     "type": "float",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 3975
  },
  {
   "name": "get_ri_waste_detail",
   "summary": "Identify wasted Reserved Instance spend from CUR RIFee line items.",
   "params": [
    {
     "name": "start_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "end_date",
     "type": "str | None",
     "required": false
    },
    {
     "name": "min_waste_usd",
     "type": "float",
     "required": false
    }
   ],
   "pro": true,
   "category": "Waste & rightsizing",
   "lineno": 6418
  },
  {
   "name": "get_rightsizing_recommendations",
   "summary": "Analyze EC2 instances with low CPU utilization over the past 14 days and return rightsizing recommendations with projected monthly savings.",
   "params": [
    {
     "name": "avg_cpu_threshold",
     "type": "float",
     "required": false
    },
    {
     "name": "max_cpu_threshold",
     "type": "float",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 2216
  },
  {
   "name": "get_s3_incomplete_multipart_uploads",
   "summary": "Find S3 buckets with incomplete multipart uploads older than the threshold.",
   "params": [
    {
     "name": "older_than_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4227
  },
  {
   "name": "identify_nonprod_scheduling_opportunities",
   "summary": "Finds non-production EC2 instances (dev/staging/test) running 24/7. Scheduling to business hours only saves 60-70% on compute costs.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "max_results",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 10883
  },
  {
   "name": "list_idle_resources",
   "summary": "Scan for idle/wasted AWS resources that are costing money but doing nothing.",
   "params": [
    {
     "name": "resource_types",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    },
    {
     "name": "min_idle_days",
     "type": "int",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 4465
  },
  {
   "name": "recommend_database_savings_plans",
   "summary": "Recommends AWS Database Savings Plans for RDS and Aurora spend. Database SPs (re:Invent 2025) offer up to 45% savings, separate from Compute SPs. Sizes a 1-year no-upfront plan to uncovered baseline spend.",
   "params": [],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11867
  },
  {
   "name": "recommend_lambda_snapstart",
   "summary": "Finds Java Lambda functions that should use SnapStart. SnapStart eliminates cold starts for free, replacing expensive provisioned concurrency.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11192
  },
  {
   "name": "recommend_spot_adoption",
   "summary": "Finds on-demand EC2 instances to migrate to spot for 60-80% savings. Uses env tags, ASG membership, CPU variance, and Spot Advisor interruption data. Returns RECOMMENDED, POSSIBLE, or NOT_RECOMMENDED per instance.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11469
  },
  {
   "name": "scan_cloudwatch_waste",
   "summary": "Finds CloudWatch Log Groups with no retention policy (infinite retention costs $0.03/GB-month). Returns groups, estimated monthly cost, recommended retention periods by log type, and CLI commands to fix top offenders.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 3921
  },
  {
   "name": "scan_graviton_migration_opportunities",
   "summary": "Finds EC2 instances that can migrate to Graviton (arm64) for 20-40% savings. Returns ranked candidates with estimated monthly savings per instance.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11387
  },
  {
   "name": "scan_lambda_concurrency_waste",
   "summary": "Scans Lambda functions with provisioned concurrency for waste. Provisioned concurrency costs money even when idle. Returns functions below 50% avg utilization with savings estimates.",
   "params": [
    {
     "name": "regions",
     "type": "list[str] | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11107
  },
  {
   "name": "scan_s3_bucket_key_opportunities",
   "summary": "Finds S3 buckets using KMS encryption without Bucket Keys enabled. Bucket Keys reduce KMS API calls by up to 99%. Returns affected buckets with the CLI command to fix each one.",
   "params": [],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 11151
  },
  {
   "name": "scan_waste_patterns",
   "summary": "Scan for cloud cost waste patterns using nable's proprietary pattern library.",
   "params": [
    {
     "name": "account_id",
     "type": "str | None",
     "required": false
    },
    {
     "name": "min_monthly_waste",
     "type": "float",
     "required": false
    },
    {
     "name": "categories",
     "type": "str | None",
     "required": false
    }
   ],
   "pro": false,
   "category": "Waste & rightsizing",
   "lineno": 8258
  }
 ]
}