Plutus
Query cloud, AI and SaaS spend across 25+ providers: costs, budgets, anomalies, unit economics.
Connect it
Settings → Connectors → Add custom connector
URL: https://console.plutus-cloud.com/api/mcpSettings → Apps & Connectors → Advanced → Developer mode
Create connector with URL: https://console.plutus-cloud.com/api/mcp{
"mcpServers": {
"plutus-cost-data": {
"url": "https://console.plutus-cloud.com/api/mcp",
"headers": {
"Authorization": "<YOUR_AUTHORIZATION>"
}
}
}
}claude mcp add --transport http plutus-cost-data https://console.plutus-cloud.com/api/mcp --header "Authorization: <value>"{
"servers": {
"plutus-cost-data": {
"type": "http",
"url": "https://console.plutus-cloud.com/api/mcp",
"headers": {
"Authorization": "<YOUR_AUTHORIZATION>"
}
}
}
}32 tools, verified live
list_cost_sourcesread-onlyList the cost-source providers (AWS, GCP, Anthropic, etc.) enabled for this account. Each row's cost_basis says where that provider's money figures come from: "invoiced" = amounts the provider actually charged; "estimated_from_provider_rates" = an estimate built from the provider's own published rates, because it exposes no historical billing API; "estimated_from_static_rates" = an estimate built
query_costsread-onlyQuery time-bucketed spend for this account, optionally broken down by a dimension (service, region, linked_account, usage_type, operation, or identity) or by a custom cost-allocation tag (see list_cost_tags), and filtered by dimension values. `identity` is per-actor spend (e.g. an OpenAI or Anthropic api_key_id) where a provider's cost/usage API can group by it; not every provider populates it. Mi
list_savings_recommendationsread-onlyList active cost-reduction recommendations for this account. Most come from each provider's own already-computed engine (AWS Cost Explorer, Azure Advisor, GCP Recommender); rows with `source` = `plutus` are computed by Plutus itself (rightsizing, and `billing_pattern` below). `type` is one of: `terminate` (an idle resource to shut down), `modify` (an overprovisioned one to downsize), `commitment_s
list_commitment_utilizationread-onlyList Reservation (RI) and Savings Plan utilization/coverage snapshots for this account â sourced from AWS Cost Explorer's own GetReservationUtilization/GetSavingsPlansUtilization APIs, one snapshot per commitment type per month. Shows how much of a purchased commitment is actually being used and its net savings vs on-demand. Mirrors GET /api/accounts/:accountId/commitment-utilization.
list_commitment_expirationsread-onlyList this account's Reserved Instance / Savings Plan / Azure Reservation commitments with their expiration dates, ordered soonest-first. `days_until_expiration` is computed server-side against the current UTC date (negative means already expired â rows are not pruned immediately on expiry, so check the sign). `latest_utilization_percentage` is the commitment TYPE's most recent monthly aggregate
list_cost_tagsread-onlyList the virtual cost-allocation tag_keys defined for this account (e.g. "team", "product"), each with the cost_entries grain it's locked to and how many rules map dimension values to a tag_value. Use a tag_key with query_costs (breakdown_by: "tag") to see spend broken down by it. redistribute_bucket, when non-null, names a bucket (often "Untagged") whose spend is dissolved into the other tag_valu
list_anomaliesread-onlyList detected cost anomalies for this account over a trailing lookback window â the real output of Plutus's nightly anomaly detector (severity, baseline vs. current spend, and what drove a tag-level spike), not something recomputed here from raw spend. Prefer this over eyeballing query_costs for "did anything spike" â the detector already accounts for day-of-week baselines and an absolute-doll
explain_cost_changeread-onlyExplain a specific cost change: which timeline events line up with it, how strongly, and how much of the move Plutus could account for. Ask this about any point on a cost chart â it is not limited to anomalies the detector flagged (use list_anomalies for those; each already carries the same explanation). RENDER `explanation.sentences` AS WRITTEN. They are generated under a strict discipline and
list_anomaly_suppressionsread-onlyList this account's active anomaly suppressions â signatures (a provider+service pair, or a tag_key+tag_value) a human has marked as expected, so the detector stops surfacing them. Each has an `expires_at` (null = indefinite). Mirrors GET /api/accounts/:accountId/anomaly-suppressions. Creating/deleting a suppression is not available over MCP.
list_tag_recommendationsread-onlyList suggested cost-allocation tag rules this account doesn't have yet â high-spend values currently falling through to "Untagged" for an existing tag_key, or a provider-native tag worth promoting into a virtual tag_key of its own (see list_cost_tags). Each recommendation carries `estimated_monthly_spend_cents` (USD base) it would newly cover. Mirrors GET /api/accounts/:accountId/tag-recommendat
list_data_healthread-onlyList sync health for every cost/event/usage connection this account has â last synced time, next scheduled sync, the outcome of its most recent run, and `is_overdue` (no successful sync within twice the connection's own effective sync interval). `recent_failure_count` counts failed runs among the last 5, and a run that finished but reported a partial failure (`latest_run.partial_failure`, with t
list_scheduled_reportsread-onlyList this account's scheduled cost digests â cadence, scope (whole account, one cost source, or one cost-allocation tag value), destination alert channel, and when the next one is due. `next_period_label` names the concrete date range the next digest will cover. Mirrors GET /api/accounts/:accountId/scheduled-reports. Creating/editing a scheduled report is not available over MCP.
list_dashboard_widget_catalogread-onlyList the built-in ("preset") dashboard widgets available to place with create_dashboard/set_dashboard_widgets â small `kpi` stat tiles and larger `widget` data cards, each with the id (`catalog_id`) a {"kind": "preset", "catalog_id": "..."} widget spec references. There is no preset chart: to put a trend chart on a dashboard, build one inline with a {"kind": "custom_chart", ...} spec instead of
list_dashboardsread-onlyList this account's org-shared dashboards â visible to every account member. Does not include any member's PERSONAL dashboard: those live in one specific signed-in user's own browser session and have no id an account-level MCP key can address. Use a returned `id` with get_dashboard, set_dashboard_widgets or delete_dashboard.
get_dashboardread-onlyFetch one org-shared dashboard's full layout â its placed widgets, custom metrics and custom charts, and their grid positions. A `widgets` entry references a preset catalog_id (see list_dashboard_widget_catalog); `customMetrics`/`customCharts` carry their own full config inline. Call this before set_dashboard_widgets if you want to keep some of what's already there rather than replacing the whol
list_unit_metricsread-onlyList this account's saved unit-economics metrics â each one a cost ÷ business-unit ratio such as "cost per 1k API requests" or "infra cost per order". `numerator_scope` says which slice of spend is on top (the whole account, one cost source, or one cost-allocation tag_value â see list_cost_tags), `denominator_metric` names the usage metric counting the business units, and `denominator_scale`
query_unit_costsread-onlyCompute one of this account's saved unit-economics metrics (see list_unit_metrics) over a date range â the cost of a slice of spend divided by the business units it produced. Each row carries `cost` (the numerator, in the USD base like every other figure this server returns), `quantity` (the denominator, a raw count with no currency), and `unit_cost`. CRITICAL: `unit_cost` is null whenever it c
query_usageread-onlyQuery time-bucketed usage telemetry this account's own backend has pushed or synced in (e.g. API request counts, tokens processed) â the raw data unit-economics metrics divide cost by (see list_unit_metrics/query_unit_costs), inspected directly rather than through a pre-defined ratio. `quantity` is a raw count with no currency â never treat it as money. Optionally broken down by `external_cust
list_usage_dimensionsread-onlyList the distinct values seen for a usage dimension ("metric" or "external_customer_id") over a date range â useful for discovering filter values before calling query_usage. Each entry pairs the raw `value` with a `label` (for external_customer_id, the customer's name from account_customers when known, falling back to the id itself). Mirrors GET /api/usage/dimensions.
query_eventsread-onlyQuery this account's business-event timeline (GitHub releases/PRs, PagerDuty incidents, Jira issues, GitLab, Salesforce onboarding/churn, Stripe subscription created/canceled, Vercel production deploys, Linear issue creation, Sentry newly reported errors) â the same events overlaid on the Cost/Event Explorer charts. Always scope with start_date/end_date: there is no pagination and results are ca
list_event_facetsread-onlyList the distinct values seen for a faceted event metadata field over a date range â currently just "repo" (every GitHub repo with at least one event), the same facet the Event Explorer's repo picker uses. Useful for discovering query_events' meta_repo filter values before calling it. Mirrors GET /api/events/facets.
list_cost_tag_rulesread-onlyList the actual match rules for one of this account's cost-allocation tag_keys (see list_cost_tags) â which dimension values (or provider-native tag) map to which tag_value, and in what priority order. Rules are evaluated in ascending priority and the first match wins; spend matching no rule falls to "Untagged". Mirrors GET /api/accounts/:accountId/cost-tags/:tagKey/rules. IMPORTANT â a rule i
list_cost_source_tag_keysread-onlyList distinct provider-native tag/label keys actually present in this account's cost data (AWS Cost Allocation Tags, GCP/Hetzner labels, Azure tags) â useful for discovering what a "tags.<key>" cost-tag-rule match could reference before creating one. Only ever populated on grain='service' rows. Omit cost_source_id to search across every enabled provider.
list_cost_source_tag_valuesread-onlyList distinct values seen for one provider-native tag/label key (see list_cost_source_tag_keys) in this account's cost data.
list_teamsread-onlyList this account's teams (user groups) with their members and the cost-tag tag_value each is reserved under â team-scoped budgets (create_budget with scope_type: "team") reference a team's id as scope_ref. Mirrors GET /api/accounts/:accountId/teams.
list_tracker_linksread-onlyList the tickets linked to savings recommendations, waste findings and anomalies, with their tracker status, resolution and Plutus-side owner. status is open, done, closed_unresolved (closed as Won't Do/Duplicate/Declined), orphaned (ticket not found) or disconnected. Mirrors GET /api/accounts/:accountId/tracker-links.
list_budgetsread-onlyList this account's spend budgets with their current-cycle status (spend so far, projected total, ok/warning/exceeded state, and forecast state). Mirrors GET /api/accounts/:accountId/budgets. A budget carries its own `currency` (budgets are NOT converted to the USD base the cost tools return), and `amount_cents` is denominated in it; `spend_cents`/`projected_cents` are in `status_currency`, the bu
list_alert_channelsread-onlyList this account's alert notification channels (Slack/Teams/webhook/email) â need a channel's id to call create_alert_subscription. Never returns the channel's credentials/URL, only its id/type/name/enabled state.
list_alert_subscriptionsread-onlyList which alert channels are subscribed to which trigger (a specific budget's spend_threshold, or account-wide event_overage/cost_anomaly/commitment_expiring/sync_failure). Mirrors GET /api/accounts/:accountId/alert-subscriptions.
list_alert_deliveriesread-onlyList recent alert delivery history for this account (did an alert actually fire, and did it send successfully) â the same data behind the Alerts page's delivery heatmap. Does not include the delivery error text. Mirrors GET /api/accounts/:accountId/alert-deliveries.
list_dimensionsread-onlyList the distinct values seen for a given dimension (service, region, linked_account, usage_type, or operation) for one provider â useful for discovering filter values before calling query_costs.
get_cost_entriesread-onlyFetch raw per-service cost entries for this account over a date range (unaggregated). Prefer query_costs for time-bucketed/aggregated spend â this is for inspecting individual rows. Each row's `cost` is in USD (see the response's top-level `currency` field), like every other figure this server returns. A row also carries `native_cost`/`native_currency` â what the provider actually billed, for
Alternatives in Cloud & Infra
Compare →
Cronitor MCP by usefulapiB
Manage Cronitor monitors and send telemetry pings — list, inspect, create, update, delete.
Civo MCP by usefulapiB
List Civo instances, Kubernetes clusters, networks and DNS; reboot instances, add rules.
Checkly MCP by usefulapiB
Query Checkly synthetic monitoring — checks, statuses, results, alerts, reporting and dashboards.
Better Stack MCP by usefulapiB
Read monitors, incidents, heartbeats, on-call and status pages; acknowledge or resolve incidents.
UptimeRobotB
Monitor websites, APIs, and servers: create monitors, triage incidents, and query uptime stats.
TRTLS RadarB
SSL/TLS scanning, free Let's Encrypt issuance, and certificate-expiry monitoring.