nable (finops-mcp)
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_connected_providersA | List all configured cloud and SaaS providers with their connection status. Shows which connectors are active, which need credentials, and the active plan. |
| check_connector_healthA | Actively test every configured connector with a real API call. Reports health status, last successful data time, and fix instructions for failures. Examples: - "Are all my connectors healthy?" - "Which connectors are broken or stale?" - "Why am I not getting data from Datadog?" |
| get_cost_summaryA | Get total spend summarized by service, account, and region. Args: provider: Provider name (e.g. "aws", "datadog"). None = all. category: "cloud" or "saas". None = all. start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. granularity: "DAILY" or "MONTHLY". account: Named AWS account from accounts.yaml. Uses default when omitted. Examples: - "How much did we spend last month?" - "Give me an AWS cost summary for January" - "What did the production account spend this month?" |
| get_costs_by_serviceA | Cost breakdown by service, optionally filtered to a keyword. Args: service_filter: Case-insensitive substring (e.g. "compute", "storage"). provider: Specific provider. None = all. category: "cloud" or "saas". None = all. start_date: ISO date. Defaults to 30 days ago. end_date: ISO date. Defaults to today. account: Named AWS account from accounts.yaml. Examples: - "How much did compute cost us?" - "Show me all Datadog product costs" - "What did the staging account spend on EC2?" |
| get_top_cost_driversA | Return the top N most expensive services across all configured providers. Args: limit: Number of top services to return (default 10). provider: Specific provider. None = all. category: "cloud" or "saas". None = all. start_date: ISO date. Defaults to 30 days ago. end_date: ISO date. Defaults to today. account: Named AWS account from accounts.yaml. Examples: - "What are our biggest cost drivers this month?" - "Top 5 most expensive things in AWS" - "Top cost drivers in the staging account" |
| compare_providersA | Side-by-side cost comparison across all configured providers. Args: category: "cloud" or "saas". None = all. start_date: ISO date. Defaults to 30 days ago. end_date: ISO date. Defaults to today. Examples: - "Which cloud are we spending the most on?" - "Compare our SaaS tool spending" - "How does AWS compare to Azure and GCP?" |
| get_cost_trendsA | Cost trends over time broken down by day or month. Args: provider: Specific provider. None = all. category: "cloud" or "saas". None = all. days: Look-back window in days (default 30). granularity: "DAILY" or "MONTHLY". Examples: - "Is our AWS spend trending up or down?" - "Show daily cloud costs for the last 2 weeks" - "What did we spend each month this quarter?" |
| list_accountsA | List all cloud accounts, subscriptions, and SaaS org IDs that are accessible. Args: provider: Specific provider. None = all. |
| list_aws_accountsA | List all AWS accounts configured in ~/.finops-mcp/accounts.yaml. Shows each account's name, account ID, region, and auth method. Use account names as the 'account' parameter in cost tools like get_cost_summary. Examples: - "What AWS accounts do I have configured?" - "List all my AWS accounts" - "Which account is the default?" |
| get_cost_summary_all_accountsA | 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. Args: start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. granularity: "DAILY" or "MONTHLY". Examples: - "Show costs across all my AWS accounts" - "What is each client account spending this month?" - "Compare spend across production and staging accounts" |
| get_saas_spend_summaryA | Dedicated summary of all SaaS tool spending (Datadog, Snowflake, GitHub, etc.). Useful for understanding your software vendor bill separate from cloud infrastructure. Examples: - "How much are we spending on SaaS tools?" - "What's our total software vendor spend?" - "Break down our SaaS costs by tool" |
| get_total_spend_all_sourcesA | Grand total across ALL connected sources, cloud infrastructure + SaaS tools combined. The true "total technology spend" number. Examples: - "What is our total tech spend this month?" - "How much are we spending on everything combined?" - "Give me our full cloud + software cost picture" |
| set_alert_policyA | Set a custom alert policy for anomaly detection on a specific provider or service. Use this to:
Supports glob patterns: "DataTransfer*", "Transfer", "EC2*" Args: provider: "aws", "azure", "gcp", or "" for all providers service_pattern: Exact service name or glob pattern (e.g. "DataTransfer", "*") muted: If True, all anomalies matching this rule are silenced min_pct_change: Only alert if change exceeds this % (overrides default 20%) min_usd_change: Only alert if absolute change exceeds this $ amount note: Why this policy exists (shown in list_alert_policies) Examples: - "Mute DataTransfer anomalies, they're always noisy" - "Only alert on EC2 if it changes by more than 40%" - "Ignore AWS Tax service anomalies" - "Only alert on changes over $500, ignore tiny fluctuations" - "Set a 50% threshold for Support charges" |
| list_alert_policiesA | List all custom alert policies for anomaly detection. Shows which services are muted, which have custom thresholds, and why. Examples: - "What alert policies do I have?" - "Which services are muted from anomaly detection?" - "Show my alert thresholds" |
| delete_alert_policyA | Remove a custom alert policy. The service will revert to the default threshold. Args: policy_id: The ID from list_alert_policies() Examples: - "Delete alert policy 3" - "Remove the mute on DataTransfer" |
| get_anomaliesA | Return active (unacknowledged) cost anomalies detected from historical baselines. Args: provider: Filter to a specific provider. None = all. severity: "high", "medium", or "low". None = all severities. limit: Max anomalies to return (default 20). account: Named AWS account from accounts.yaml to filter results. Examples: - "Are there any cost anomalies I should know about?" - "Show me high-severity cost spikes" - "What spiked in AWS this week?" - "Any anomalies in the production account?" Note: Anomalies require at least 7 days of snapshot history. Run 'finops snapshot' or wait for the daily job to accumulate data. |
| acknowledge_anomalyA | Mark an anomaly as acknowledged (dismissed). It will no longer appear in active anomalies. Args: anomaly_id: The ID from get_anomalies(). Examples: - "Dismiss anomaly 42, it was a planned migration" - "Acknowledge that spike, it was expected" |
| get_cost_historyA | Return historical daily cost data for a specific provider + service. Used for trend analysis and understanding anomaly context. Args: provider: e.g. "aws" service: e.g. "Amazon EC2" account_id: The account/subscription ID days: Look-back window in days (default 30) Examples: - "Show me 30 days of history for AWS EC2" - "What did Datadog cost each day this month?" |
| take_snapshot_nowA | Manually trigger a cost snapshot right now (fetches yesterday's costs from all providers). Normally this runs automatically at 01:00 UTC daily. Examples: - "Take a cost snapshot now" - "Update the cost history with today's data" |
| get_costs_by_teamA | Return cloud costs broken down by engineering team, using tag attribution rules. Requires:
Args: start_date: ISO date. Defaults to 30 days ago. end_date: ISO date. Defaults to today. provider: Filter to a specific provider. Examples: - "How much is the data team spending?" - "Show me cloud costs by team this month" - "Which team has the highest AWS bill?" |
| run_attribution_nowA | 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. Args: start_date: ISO date. Defaults to 30 days ago. end_date: ISO date. Defaults to today. Examples: - "Run tag attribution now" - "Update team cost data" |
| send_onboarding_emailA | Send an onboarding email to a specific address. Variants: welcome → "Here's how easy setup is", sent on email capture day7 → Nudge for users who haven't connected a provider yet trial_end → Trial expiring in N days, soft upgrade prompt Args: to_email: Recipient email address variant: "welcome", "day7", or "trial_end" days_left: For trial_end variant, days until trial expires Examples: - "Send the welcome email to john@example.com" - "Send a day 7 nudge to user@company.com" - "Send the trial ending email to someone@corp.com with 3 days left" |
| send_digest_nowA | Manually trigger a cost digest to Slack and/or Teams right now. Normally this sends automatically at 09:00 UTC daily. Examples: - "Send the daily cost digest to Slack" - "Push the current cost summary to Teams" |
| check_notification_configA | Check which notification channels (Slack, Teams) are configured and active. Examples: - "Is Slack configured for alerts?" - "Where are cost alerts being sent?" |
| list_vault_credentialsA | List the names of credentials stored in the encrypted vault (never the values). Examples: - "What credentials are stored in the vault?" - "Which providers have been configured via setup?" |
| get_rightsizing_recommendationsA | Analyze EC2 instances with low CPU utilization over the past 14 days and return rightsizing recommendations with projected monthly savings. Args: avg_cpu_threshold: Flag instances with average CPU below this % (default 20%) max_cpu_threshold: Flag instances whose peak CPU never exceeded this % (default 50%) Examples: - "Which EC2 instances are over-provisioned?" - "How much could we save by rightsizing?" - "Find underutilized instances we should downsize" |
| get_savings_summaryA | 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. Tracks the full lifecycle of every recommendation: open → acted on → verified (change confirmed in AWS/Azure/GCP) open → dismissed (won't fix) Examples: - "How much have we saved from recommendations so far?" - "Show me our realized savings" - "Which recommendations have we actually acted on?" - "What's our total potential savings sitting open?" |
| generate_account_dashboardA | Generate a cost dashboard for the account and open it in your browser. Shows total spend this month vs last month, projected spend, top cost drivers by service, open optimization opportunities, realized savings, and budget status. Outputs a self-contained HTML file. Args: account_id: AWS account ID to scope the dashboard. Auto-detected from your configured credentials when omitted. open_browser: Open the HTML file in the default browser (default True). push_to_notion: Also push a summary to your configured Notion page (requires NOTION_API_KEY and NOTION_PAGE_ID env vars). Use when: - "Show me a dashboard" - "Give me a summary of my costs" - "Generate the account dashboard" - "What does my cost health look like?" |
| export_cost_reportA | Export a cost report as HTML (printable to PDF) and/or CSV. Saved to ~/.finops/exports/. No Claude Desktop required to open. Args: title: Report title. Defaults to "Cloud Cost Report ". sections: Sections to include: cost_summary, services, anomalies, rightsizing, savings, budgets. Default: all. formats: ["html", "csv"]. Default: both. start_date: ISO date. Defaults to 30 days ago. end_date: ISO date. Defaults to today. open_file: Open HTML in browser after export (default True). Examples: - "Export a cost report for this month" - "Give me a CSV export of anomalies and rightsizing" - "Make a weekly cost report for the team" |
| list_savings_recommendationsA | List tracked recommendations with their current status. Args: status: Filter by status: "open", "acted_on", "verified", "dismissed", "expired". None = all. source: Filter by source: "rightsizing", "idle", "kubernetes", "waste", "commitment". None = all. limit: Max results (default 30). Examples: - "Show all open recommendations" - "Which recommendations have we acted on?" - "List verified savings" - "Show dismissed recommendations" |
| mark_recommendation_acted_onA | 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. Args: recommendation_id: The ID from list_savings_recommendations() or get_savings_summary(). Examples: - "I resized that EC2 instance, mark recommendation 42 as done" - "We shut down the idle RDS, mark it acted on" - "Mark recommendation 7 as complete" |
| dismiss_recommendationA | 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. Args: recommendation_id: The ID from list_savings_recommendations(). reason: Optional note on why you're dismissing it (e.g. "reserved for burst traffic"). Examples: - "Dismiss recommendation 15, we need that instance for peak load" - "Mark recommendation 8 as won't fix" |
| verify_savingsA | Auto-verify acted-on recommendations by checking if changes were actually implemented in AWS (EC2 instance type changes, etc.). Moves verified recommendations from 'acted_on' to 'verified' status and records the actual measured savings. Examples: - "Verify our savings, check if the rightsizing changes were made" - "Confirm which recommendations actually happened" - "Check if our EC2 downsizes are done" |
| get_savings_ledgerA | Shows a clean summary of savings found, acted on, and verified. Use when: - "Show me the savings ledger" - "What savings have we achieved?" - "How much money has nable saved us?" - "Show me what opportunities were acted on" Args: days: Lookback window in days (default 30). Filters by generated_at. account_id: Filter to a specific cloud account ID. None = all accounts. |
| get_recommendation_qualityA | 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. Use when: - "Which of our recommendations actually saved money?" - "How accurate are nable's savings estimates?" - "How much have we verifiably saved, and from what?" |
| get_recommendation_learningA | What nable has learned about how YOU use recommendations, and how it adapts. Per recommendation type (rightsizing, commitment, idle, spot, ...): your act-rate (how often you act on that type, vs blanket assumptions), how accurate the past savings estimates were, a COLD/WARMING/WARM confidence state, and the resulting verdict (boosted, suppressed-for-you, or neutral) with a plain-English reason. This is the adaptive moat: instead of blanket advice, recommendations are ranked and filtered to fit your environment and your track record. It is propose-only, it changes what you see and in what order, never the cloud. Use when: - "Why am I seeing this recommendation?" / "Why did this rank high?" - "What recommendation types did you stop showing me?" - "How is nable tailoring recommendations to us?" |
| list_profilesA | List all configured nable profiles (for multi-account or multi-client setups). Profiles allow engineers who manage multiple accounts to switch context cleanly. Each profile has its own database and credential namespace. Use when: - "What profiles do I have configured?" - "Show me my nable profiles" - "Which profile is active?" |
| get_commitment_analysisA | 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). Examples: - "How well are we using our Reserved Instances?" - "Should we buy more Savings Plans?" - "How much are we wasting on unused RIs?" - "What's our RI/SP coverage?" |
| create_anomaly_ticketsA | 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. Args: limit: Max number of anomalies to process (default 20) Examples: - "Create Jira tickets for all cost anomalies" - "File GitHub issues for the anomalies" - "Open Linear tasks for cost spikes" |
| create_rightsizing_ticketsA | Create tickets for rightsizing recommendations, over-provisioned EC2, RDS, and other resources that could be downsized to save money. Args: min_monthly_savings: Only ticket recommendations above this threshold (default $100/mo) provider: Cloud provider to pull recommendations from (default: aws) Examples: - "Create Jira tickets for all rightsizing opportunities" - "File issues for EC2 instances we should downsize" - "Open Linear tasks for $500+ monthly rightsizing savings" |
| create_kubernetes_waste_ticketsA | Create tickets for Kubernetes waste findings: idle nodes, over-provisioned workloads, and orphaned Helm releases. Args: min_monthly_waste: Only ticket findings above this threshold (default $50/mo) Examples: - "Create tickets for all Kubernetes waste" - "File Jira issues for idle K8s nodes" - "Open issues for orphaned Helm releases" |
| create_scorecard_ticketsB | Create tickets for scorecard dimensions scoring below a threshold. Helps teams track and remediate FinOps efficiency gaps. Args: score_threshold: Create tickets for dimensions below this score (default 50) team: Scope to a specific team tag (optional) Examples: - "Create tickets for all failing scorecard dimensions" - "File issues for the platform team's low scores" - "Open Jira tasks for scorecard dimensions below 40" |
| create_ticketA | 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. Args: title: Ticket title / issue summary body: Full ticket description with context and action items priority: "low", "medium", "high", or "critical" (default: medium) labels: Optional list of labels/tags to apply (default: ["finops"]) Examples: - "Create a Jira ticket to disable Textract in non-prod environments" - "File a GitHub issue to switch LambdaClassifier from Sonnet to Haiku" - "Open a Linear task for the NAT gateway consolidation" |
| fetch_invoice_emailsA | 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. Examples: - "Parse our billing inbox for new invoices" - "How much did PagerDuty charge us this month? (after forwarding invoice)" - "Fetch and store any new vendor invoices" |
| push_weekly_insightA | Push a rich weekly cost intelligence summary to Slack right now. Covers: week-over-week spend change, top cost movers, open savings pipeline, active anomalies, budget alerts, and a single recommended action. This is the proactive format, an analyst briefing, not a metric dump. Runs automatically every Monday morning when scheduled. Use this to trigger it on demand. Examples: - "Send a weekly cost summary to Slack" - "Push the weekly insight to the team channel" - "Send this week's cost intelligence to Slack now" |
| send_weekly_digest_nowA | Immediately send the weekly email digest to the configured recipient. Includes spend summary, anomalies, and top rightsizing recommendations. Works without Claude, pure standalone email. Examples: - "Send the weekly cost digest now" - "Trigger the weekly email report" |
| audit_aws_wasteA | Deep AWS waste audit: scans EC2, EBS, RDS, Lambda, NAT Gateways, CloudWatch Logs, S3, and CloudTrail for waste. Returns findings sorted by monthly savings. Args: regions: AWS regions to scan. Defaults to all opted-in regions. checks: Subset to run: ebs, snapshots, eips, nat, rds, cloudtrail, cloudwatch, s3, lambda, ec2. Defaults to all. account_id: AWS account ID (auto-discovered from STS if not provided). Examples: - "Run a full AWS waste audit" - "Find all idle NAT gateways and unattached EBS volumes" - "Audit CloudWatch log groups for missing retention policies" |
| audit_gcp_wasteA | 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. Args: projects: GCP project IDs to scan. Defaults to GCP_PROJECT_IDS or the default project on your credentials. checks: Subset to run: disks, ips, snapshots, idle_vms. Defaults to all. idle_days: Lookback window for the idle-VM CPU check (default 14). snapshot_age_days: Flag snapshots older than this many days (default 30). Examples: - "Run a full GCP waste audit" - "Find unattached GCP disks and idle static IPs" - "Which GCP VMs are idle this month?" |
| get_traffic_cost_breakdownA | Break down AWS network/data-transfer spend: how much, and where it goes. Splits your traffic cost into INTERNAL (cross-AZ, cross-region, NAT, VPC peering, private endpoints) vs EXTERNAL (internet egress, CDN), then a per-scope breakdown and a ranked solve playbook (VPC endpoints, topology-aware routing, CDN, peering). Pulls Cost Explorer grouped by usage type; the classifier keeps only the network line items. AWS today; GCP and Azure decomposition are on the roadmap. Args: days: Look-back window in days (default 30). Examples: - "How much are we spending on network traffic and where is it going?" - "What's our internal vs external data transfer cost?" - "Break down our cross-AZ and egress spend" |
| audit_public_ipv4_addressesA | 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. Args: regions: AWS regions to scan. Defaults to all opted-in regions. Examples: - "Find unattached Elastic IPs we can release" - "How much are we spending on public IPv4?" - "Show Elastic IPs on stopped instances" |
| get_instance_deep_analysisA | 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. Args: instance_id: EC2 instance ID (e.g. "i-0abc1234567890def") region: AWS region (default: us-east-1) lookback_days: Days of metrics to analyze (default: 14, max: 63) Examples: - "Is i-0abc1234 over-provisioned?" - "Show CPU trends for i-0abc1234 over the last 30 days" |
| scan_cloudwatch_wasteA | 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. Args: regions: Regions to scan. Defaults to all opted-in regions. Examples: - "Which CloudWatch log groups have no retention policy?" - "Scan for infinite log retention across all regions" |
| get_rds_rightsizing_recommendationsA | Detect over-provisioned RDS instances with low CPU utilization. Uses CloudWatch CPUUtilization over 14 days. Excludes Aurora Serverless and read replicas. Returns downsizing recommendations with estimated savings. Args: cpu_threshold: Flag instances with average CPU below this % (default 20%). regions: AWS regions to scan. Defaults to all opted-in regions. Examples: - "Which RDS instances are over-provisioned?" - "Find oversized databases we can downsize" - "How much could we save by rightsizing RDS?" |
| get_idle_rds_instancesA | Find RDS instances with near-zero database connections over the past 14 days. Zero-connection instances are likely decommissioned and can be stopped (free, preserves data) or deleted (saves full cost after final snapshot). Args: regions: AWS regions to scan. Defaults to all opted-in regions. Examples: - "Which RDS databases have no active connections?" - "Find idle databases we can stop to save money" - "Are there any unused RDS instances running?" |
| get_idle_load_balancersA | Detect ALBs, NLBs, and Classic ELBs with near-zero traffic over the past 14 days. Idle load balancers still incur hourly LCU base charges. ALB/NLB cost ~$5.84/mo minimum; Classic ELBs cost ~$18.25/mo minimum. Args: regions: AWS regions to scan. Defaults to all opted-in regions. request_threshold: Max requests in 14 days to flag as idle (default 100). Examples: - "Find idle load balancers we can delete" - "Which ALBs have no traffic?" - "Are there any unused load balancers costing us money?" |
| get_s3_incomplete_multipart_uploadsA | Find S3 buckets with incomplete multipart uploads older than the threshold. Incomplete uploads accumulate silently at STANDARD storage rates ($0.023/GB-month). The fix is a single S3 lifecycle rule per bucket. This tool shows which buckets need it and how much wasted storage they hold. Args: older_than_days: Flag uploads older than this many days (default 7). Examples: - "Which S3 buckets have incomplete multipart uploads?" - "Find wasted S3 storage from incomplete uploads" - "How much are we paying for failed S3 uploads?" |
| get_ecr_cleanup_recommendationsA | Find ECR repositories with old untagged container images consuming storage. ECR charges $0.10/GB-month for images beyond the free 500MB per repo. Untagged images from old CI builds accumulate quickly. The fix is an ECR lifecycle policy that auto-expires untagged images. Args: older_than_days: Flag untagged images older than this many days (default 90). regions: AWS regions to scan. Defaults to all opted-in regions. Examples: - "Which ECR repos have old images wasting storage?" - "Find container image cleanup opportunities" - "How much are old ECR images costing us?" |
| get_ecs_rightsizing_recommendationsA | Find ECS Fargate services with over-provisioned CPU allocations. Uses Container Insights CpuUtilized metric. Services using less than cpu_threshold% of their allocated vCPUs are candidates for downsizing. Fargate billing is per vCPU-hour, so reducing allocation directly cuts cost. Requires Container Insights to be enabled on the ECS cluster. Args: cpu_threshold: Flag services with average CPU below this % (default 20%). regions: AWS regions to scan. Defaults to all opted-in regions. Examples: - "Which ECS Fargate services are over-provisioned?" - "Find oversized ECS tasks we can right-size" - "How much could we save by reducing Fargate CPU allocations?" |
| get_data_transfer_costsA | Identify significant data transfer cost line items from AWS Cost Explorer. Surfaces internet egress, cross-AZ transfer, inter-region transfer, and NAT Gateway data charges. Each finding includes a specific cost-reduction recommendation (VPC endpoints, CloudFront, regional consolidation). Args: start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. threshold_usd: Only return usage types costing more than this (default $50). Examples: - "What are our data transfer costs?" - "How much are we paying for inter-region traffic?" - "Which data transfer charges are most expensive?" - "Are we overpaying for NAT Gateway data transfer?" |
| list_idle_resourcesA | Scan for idle/wasted AWS resources that are costing money but doing nothing. Finds: unattached EBS volumes, unused Elastic IPs, old snapshots with no AMI dependency, stopped EC2 instances (still paying for EBS), load balancers with no healthy targets. Results are sorted by monthly waste descending. Protected resources (tagged env=prod, protected=true, etc.) are flagged but never acted on. Examples: - "Find idle resources wasting money in AWS" - "List any unattached EBS volumes older than 90 days" - "What stopped EC2 instances are we still paying for?" |
| cleanup_idle_resourcesA | 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. Requires FINOPS_CLEANUP_ENABLED=true in the environment (opt-in safety gate). Every action is written to ~/.finops-mcp/cleanup_audit.jsonl for audit. dry_run=True (default): shows what WOULD be deleted, nothing is changed. dry_run=False: actually deletes. Only set this after explicit user confirmation. Examples: - "Clean up idle EC2 instances and unattached EBS volumes" - "Show me what I can safely delete to save money" - "Terminate the stopped instances that have been idle for 2 weeks" - "Show me what would happen if I cleaned up unattached EBS volumes" - "Delete the EBS volumes we just listed" (then confirm: dry_run=False) - "Clean up all unused Elastic IPs in us-east-1" |
| get_effective_rate_profileA | Auto-detect the account's effective private rates by comparing actual billed amounts against public on-demand prices. Captures EDP discounts, MOSA/negotiated rates, and private pricing automatically from Cost Explorer or CUR, no manual input needed. Used internally by the commitment optimizer and PR cost estimator. Useful for understanding how large your negotiated discount actually is. Examples: - "What's our effective AWS discount?" - "Do we have private pricing on AWS?" - "How does our actual rate compare to on-demand list prices?" |
| list_kubernetes_contextsA | 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. Examples: - "What Kubernetes clusters do I have?" - "List my kubeconfig contexts" - "Which K8s context is currently active?" |
| get_kubernetes_costsA | Full Kubernetes cost breakdown -- node costs attributed to namespaces, workloads, and labels. Detects wasted spend and rightsizing opportunities. Requires: pip install finops-mcp[kubernetes] Optional: metrics-server in-cluster for actual CPU/memory usage data. Examples: - "How much does our Kubernetes cluster cost?" - "Which namespace is spending the most?" - "Show me wasted Kubernetes spend" - "Which pods are over-provisioned?" - "What's our cluster CPU efficiency?" |
| get_kubernetes_namespace_breakdownA | Deep-dive cost breakdown for a single Kubernetes namespace. Shows every workload, pod count, CPU/memory efficiency, and waste. Examples: - "Break down costs in the production namespace" - "Which services in 'data-platform' are most expensive?" - "Show me waste in the staging namespace" |
| get_efficiency_scorecardA | FinOps efficiency scorecard, a 0–100 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. Scope options:
Examples: - "What's our FinOps score?" - "Show me the efficiency scorecard for the platform team" - "How is our AWS efficiency rated?" - "What's our worst performing dimension?" - "Are we improving or getting worse on cloud efficiency?" |
| get_team_scorecardsA | 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. Examples: - "Show me efficiency scores for all teams" - "Which team has the worst FinOps score?" - "Compare cloud efficiency across teams" - "Who is leading on waste reduction?" |
| get_commitment_coverage_by_tagA | Estimate RI/SP commitment coverage for a specific tag slice, even when tagging is incomplete. At 70% tag coverage we measure the tagged resources directly via Cost Explorer, then solve algebraically for the untagged 30% using account totals, producing a full-domain estimate with confidence rating. Args: tag_key: Tag key to filter on (e.g. "domain", "team", "service") tag_value: Tag value (e.g. "payments", "platform", "checkout-api") tag_coverage_pct: How complete the tagging is for this domain (0–100). If unknown, leave at 100 and interpret results as lower bounds only. Examples: - "What's the RI coverage for the payments domain? Tags are about 70% complete" - "How covered is team=platform under Savings Plans?" - "Estimate commitment coverage for env=prod with 85% tag coverage" |
| get_helm_release_costsA | Cost breakdown by Helm release, shows what each release actually costs rather than raw deployment names. Detects orphaned releases wasting money. Works without the helm CLI, reads release state directly from cluster secrets. Examples: - "How much does our Prometheus stack cost?" - "Which Helm releases are most expensive?" - "Do we have any orphaned Helm releases?" - "Show me waste broken down by Helm chart" - "How much is our ingress controller costing us?" |
| estimate_helm_diff_costA | Estimate the monthly cost impact of a helm diff or values.yaml change. Handles replicaCount, CPU/memory requests, instanceType, and nodeCount changes. Paste the output of Examples: - "How much will this helm diff cost?" - "What's the cost impact of scaling from 3 to 10 replicas?" - "Estimate cost of upgrading this node pool instance type" |
| get_cluster_efficiencyA | Kubernetes cluster efficiency score (0-100) with letter grade, per-namespace breakdown, and prioritised recommendations ranked by dollar impact. Scores across 4 dimensions:
Works without metrics-server, uses request fill-ratio against node capacity. Examples: - "What's our Kubernetes efficiency score?" - "Grade our cluster" - "Which namespaces are dragging down our efficiency score?" - "Where should we focus to improve cluster efficiency?" - "Are we wasting money in Kubernetes?" |
| get_label_costsA | Aggregate Kubernetes costs by any pod label across all namespaces. Great for chargeback: see spend by team, environment, app, or any label. Workloads without the label are grouped under 'untagged'. If tagging coverage is low, the response includes a warning with the tagged %. Common label_key values: team, env, environment, app, component, tier, app.kubernetes.io/name, app.kubernetes.io/part-of Examples: - "Show me Kubernetes costs by team" - "Which team is spending the most on Kubernetes?" - "Break down K8s costs by environment" - "How much is the payments team spending in the cluster?" - "Show K8s cost by app label" - "What percentage of our cluster is untagged?" |
| get_workload_costsA | Detailed Kubernetes workload cost breakdown with efficiency grades. Supports filtering by namespace and workload kind, sorting by cost or waste. Args: namespace: Filter to a specific namespace (e.g. "production") kind: Filter by workload type: Deployment, StatefulSet, DaemonSet, Job sort_by: "cost" (default) | "waste" | "efficiency" (worst first) context: Kubeconfig context (default: current context) limit: Max workloads returned (default 50) Each workload includes: cost, waste, CPU/memory requests vs actual usage, efficiency grade (A-F), and pod labels for attribution. Examples: - "Show me all workload costs in the production namespace" - "Which Deployments are wasting the most money?" - "Show me StatefulSet costs sorted by waste" - "What are the least efficient workloads in the cluster?" - "List all DaemonSet costs" - "Show me every workload cost sorted by efficiency" |
| get_kubernetes_cost_trendsA | Kubernetes cost trend over time from stored daily snapshots. Shows whether cluster spend is growing, shrinking, or stable. Snapshots are stored automatically each time get_kubernetes_costs is called. The first snapshot date is the start of your trend history. Args: days: Lookback window in days (default 30) cluster: Filter to a specific cluster name namespace: Filter to a specific namespace granularity: "daily" or "weekly" Examples: - "Is our Kubernetes spend growing?" - "Show me the K8s cost trend for the last 30 days" - "How has the production namespace spend changed?" - "Is the cluster getting more or less expensive?" - "Show weekly Kubernetes cost trends" |
| compare_kubernetes_clustersA | Compare costs and efficiency across all configured Kubernetes clusters. Useful for multi-cluster setups (prod vs staging, region vs region). Set K8S_CONTEXTS=prod-cluster,staging-cluster to configure. Examples: - "Compare our Kubernetes clusters" - "Which cluster is most efficient?" - "Show me spend across all clusters" |
| subscribe_to_reportA | Create a scheduled report subscription. Reports are delivered automatically to Slack channels and/or email addresses on the configured schedule. Args: name: Report name (e.g. "Platform Team Weekly") sections: List of sections to include. Options: spend, anomalies, scorecard, k8s, commitments, rightsizing, budgets, teams frequency: "daily", "weekday", "weekly", "monthly" (or use cron for custom) slack_channels: List of Slack channel IDs or names (e.g. ["#finops-alerts"]) email_addresses: List of email recipients team: Scope report to a specific team tag value provider: Scope report to a specific cloud provider (aws, azure, gcp) lookback_days: How many days of history to include (default 7) cron: Custom cron expression, overrides frequency (e.g. "0 8 * * 1-5") Examples: - "Send me a daily Slack report with spend and anomalies to #finops" - "Set up a weekly report for the platform team every Monday" - "Create a monthly rightsizing report emailed to cfo@company.com" - "Subscribe to a daily digest in #cost-alerts with spend, anomalies, and budgets" |
| list_report_subscriptionsA | List all active report subscriptions, their names, schedules, sections, and delivery channels. Examples: - "What reports are scheduled?" - "Show me all active report subscriptions" - "List my scheduled reports" |
| send_report_nowA | Trigger a report subscription immediately, regardless of its schedule. Args: subscription_id: ID of the subscription to run (from list_report_subscriptions) Examples: - "Send report #3 now" - "Run the platform team report immediately" - "Trigger report subscription 1" |
| cancel_report_subscriptionB | Cancel (deactivate) a scheduled report subscription. Args: subscription_id: ID of the subscription to cancel Examples: - "Cancel report #2" - "Stop the weekly platform report" - "Disable subscription 3" |
| set_budgetA | 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. Args: name: Budget name (e.g. "Platform Team Monthly") limit_usd: Spending limit in USD scope_type: What to watch, "total", "provider", "team", "service" scope_value: The specific value (e.g. "aws", "platform", "EC2") Use "*" for total account budget period: "monthly" or "weekly" alert_at_pct: Send warning alert at this % of limit (default 80) block_at_pct: Fail CI gate at this % of limit (default 100) Examples: - "Set a $50,000 monthly budget for AWS" - "Create a $15,000 monthly budget for the platform team" - "Set a $20,000 budget for EC2 with warnings at 75%" - "Add a total monthly budget of $100,000" |
| check_budget_statusA | Check current spend against budgets. Shows how much has been spent, what's remaining, and whether any budgets are in warning or exceeded status. Args: budget_name: Filter to a specific budget name (optional, shows all if empty) Examples: - "Check all budgets" - "How are we doing against budget?" - "Is the platform team over budget?" - "Show budget status for AWS" |
| list_budgetsA | List all configured budgets with their limits and scopes. Examples: - "What budgets do we have?" - "Show me all spending limits" - "List configured budgets" |
| delete_budgetA | Delete (deactivate) a budget by ID. Args: budget_id: Budget ID from list_budgets Examples: - "Delete budget #3" - "Remove the platform team budget" |
| sync_budgets_from_yamlA | Import budgets from a budget.yml file. Idempotent, running twice is safe. Use this to version-control your spending limits alongside your infrastructure code. budget.yml format: budgets: - name: Platform Team Monthly scope_type: team scope_value: platform period: monthly limit_usd: 15000 alert_at_pct: 80 block_at_pct: 100 Args: yaml_path: Path to the budget.yml file Examples: - "Load budgets from ./budget.yml" - "Sync budgets from /path/to/budget.yml" - "Import the budget configuration file" |
| list_org_accountsA | 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. Requires: AWS credentials with organizations:ListAccounts permission (management account or delegated admin). Examples: - "List all accounts in the AWS org" - "Show me all AWS member accounts" - "How many AWS accounts do we have?" |
| get_org_cost_summaryA | 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). Args: days_back: Look-back period in days (default 30) Examples: - "Show me org-wide cloud costs" - "Which account is spending the most?" - "Give me a breakdown of costs across all accounts" - "What's our total AWS spend across the whole org?" |
| get_top_spending_accountsA | Show the highest-spending AWS accounts in the organization. Requires a Team plan (org_reports). Args: limit: Number of top accounts to return (default 10) days_back: Look-back period in days (default 30) Examples: - "Which 5 accounts are spending the most?" - "Show top spending accounts this month" - "Which teams are the biggest AWS spenders?" |
| get_account_anomaliesA | 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). Args: days_back: Look-back period to compare (default 30 vs prior 30) Examples: - "Which accounts had unusual spend changes?" - "Are any accounts spiking this month?" - "Show me account-level anomalies" |
| get_ou_cost_breakdownA | 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). Args: days_back: Look-back period in days (default 30) Examples: - "Break down costs by business unit" - "Show OU-level cost breakdown" - "How much is each department spending in AWS?" |
| get_resource_cost_breakdown_awsA | 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. Requires CUR delivery to S3 and an Athena database. Team plan feature. Args: start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. service: AWS service code filter (e.g. "Amazon EC2"). None = all services. account_id: 12-digit AWS account ID filter. None = all accounts. min_cost_usd: Exclude resources below this cost threshold (default $1). limit: Maximum resources to return ordered by cost descending (default 100). Examples: - "Show me per-resource EC2 costs from CUR" - "Which S3 buckets are costing the most this month?" - "Break down costs by resource for account 123456789012" |
| get_ri_waste_detailA | Identify wasted Reserved Instance spend from CUR RIFee line items. Shows which reservations have low utilization and how much money is being wasted on unused reserved capacity. Requires CUR via Athena. Team plan feature. Args: start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. min_waste_usd: Minimum wasted dollars to include a reservation (default $10). Examples: - "Which Reserved Instances are underutilized?" - "How much are we wasting on unused RIs?" - "Show RI waste for this quarter" |
| get_tag_cost_breakdown_curA | Break AWS costs down by a resource tag using CUR line-item data via Athena. Supports both unblended and amortized cost types. Resources missing the specified tag are grouped under "untagged". Team plan feature. Args: tag_key: Tag key to group by (e.g. "team", "env", "project"). start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. cost_type: "unblended" (default) or "amortized" (applies effective SP/RI rates instead of list price). Examples: - "Show me AWS costs broken down by team tag" - "What is each environment costing us in CUR?" - "Break down amortized costs by project tag" |
| get_savings_plan_showbackA | Show exactly how much each team saved from Savings Plans and Reserved Instances. This is the showback problem no other tool solves at line-item granularity. Instead of blending SP/RI discounts across the account, nable attributes the real dollar benefit back to the team or service that consumed the covered usage, using CUR fields that Cost Explorer doesn't expose. For each team (or tag value): • effective_cost , what they actually paid under SP/RI rates • on_demand_equiv , what they would have paid without commitments • savings_captured , real dollar benefit from Savings Plans + RIs • discount_rate_pct , their effective discount rate • sp_savings / ri_savings, broken out by commitment type Requires CUR delivery to S3 and Athena. Team plan feature. Args: tag_key: Resource tag to group by, "team", "project", "env" (default "team") start_date: ISO date YYYY-MM-DD (default: start of current month) end_date: ISO date YYYY-MM-DD (default: today) include_ri: Include Reserved Instance savings alongside SP savings (default True) Examples: - "Show me savings plan showback by team this month" - "How much did the payments team save from our savings plans?" - "What's the effective discount rate per team from our commitments?" - "Which team is getting the most benefit from our reserved instances?" |
| get_resource_cost_breakdown_azureA | Return per-resource Azure cost detail via the Cost Management Query API. No storage account or export job required -- data is queried live. Supports multi-subscription environments. Team plan feature. Args: start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. subscription_id: Single Azure subscription ID. None = all configured subs. resource_group: Filter to a specific resource group. None = all groups. min_cost_usd: Exclude resources below this cost threshold (default $1). limit: Maximum resources to return ordered by cost descending (default 200). Examples: - "Show me per-resource Azure costs this month" - "Which Azure resources are most expensive in the production resource group?" - "Break down costs by resource across all subscriptions" |
| get_azure_reservation_utilizationA | Fetch Azure reservation utilization summaries from the Capacity API. Shows monthly utilization rates, used vs reserved hours, and wasted capacity for all reservations visible to the configured service principal. Team plan feature. Args: start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. Examples: - "How well are we utilizing our Azure reservations?" - "Which Azure reservations are underutilized?" - "Show wasted Azure reserved capacity this quarter" |
| get_azure_advisor_recommendationsA | Azure Advisor cost recommendations, with Microsoft-computed annual savings. Advisor is Azure's native optimization engine: VM rightsizing, idle resource cleanup, and reservation / savings-plan purchase recommendations, each with a savings figure Microsoft already calculated. This is the Azure parallel of AWS Compute Optimizer. Args: subscription_id: A single Azure subscription. None = all configured subs. limit: Max recommendations to return, highest savings first (default 100). Examples: - "What does Azure Advisor recommend to cut our costs?" - "Show Azure cost recommendations with the biggest savings" - "Any idle or oversized Azure resources Advisor flagged?" |
| get_azure_vm_rightsizingA | Find idle and oversized Azure VMs from Azure Monitor CPU, with real dollar cost. Idle VMs (very low average CPU and a low peak) are deallocate/delete candidates. Underutilized VMs (low average but some real peak) are downsize candidates. Bursty VMs (high peak) are left alone. Per-VM monthly cost is joined from Cost Management so the savings are real, not a guess. This is the Azure parallel of nable's idle-EC2 and rightsizing engines. Args: subscription_id: A single Azure subscription. None = all configured subs. lookback_days: CPU history window for the analysis (default 14). limit: Max VMs to return, highest savings first (default 100). max_vms_scanned: Cap on how many VMs (costliest first) get a CPU-metrics call, so a large estate does not hang on hundreds of serial requests (default 200). Examples: - "vm rightsizing" - "Show me oversized Azure VMs we can downsize" - "Which Azure VMs are idle and wasting money?" - "Azure rightsizing opportunities for the last two weeks" |
| get_azure_budgetsA | Read the budgets you already set in Azure and report consumption against each. Pulls native Azure Consumption Budgets (the ones configured in the Azure Portal), with amount, current spend, percent consumed, and a warning/exceeded status. Use this to see budget health without leaving Claude. Args: subscription_id: A single Azure subscription. None = all configured subs. Examples: - "Are we over any Azure budgets?" - "Show our Azure budget status" - "Which Azure budgets are close to their limit?" |
| forecast_azure_costsA | Forecast Azure spend using Azure Cost Management's own forecast model. Calls Microsoft's forecast endpoint, which blends actual billed days with a forecast for the rest of the window. Defaults to projecting the current month to month-end. More accurate for Azure than a generic statistical forecast. Args: subscription_id: A single Azure subscription. None = all configured subs. end_date: ISO date to forecast to (YYYY-MM-DD). Defaults to end of month. Examples: - "What will our Azure bill be at the end of the month?" - "Forecast Azure spend to month-end" - "Projected Azure costs for this subscription" |
| get_azure_cost_by_dimensionA | Break Azure spend down by any dimension: service, resource group, location, or meter. Args: dimension: One of service, resource_group, location, meter, meter_subcategory. start_date: ISO date (YYYY-MM-DD). Defaults to 30 days ago. end_date: ISO date. Defaults to today. subscription_id: A single Azure subscription. None = all configured subs. limit: Max values to return, highest cost first (default 50). Examples: - "Break down Azure costs by resource group" - "Azure spend by location this month" - "Which Azure meters cost the most?" |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| connection_status | Returns nable's current connection status, which providers are configured, the active plan, and setup instructions if nothing is connected. AI clients should read this resource on first connect to understand what data is available. |
Latest Blog Posts
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/chaandannn/finopsmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server