Blog
Building a Plutus agent: MCP setup for Claude and Gemini
“Agentic” gets used for anything with a chat box in front of it lately. What actually makes something an agent instead of a chatbot is narrower than that: it has to see real data, and it has to run without a person opening the window and asking. A tool that only answers when you type a question is a search bar with better manners.
Plutus has both halves already built. The read-only MCP server is the “sees real data” half. This is the setup for the “runs without you” half, in Claude and in Gemini specifically, since the two get there differently.
What you need before either one
One thing: an MCP key. Mint one from /mcp-keys in the app. read scope is the default and
the right choice for everything below, since nothing here needs to create a budget or touch an
alert channel, only report on what’s already there. Paste the key into this config, which is
the shape both Claude and Gemini expect:
{
"mcpServers": {
"plutus": {
"url": "https://console.plutus-cloud.com/api/mcp",
"headers": {
"Authorization": "Bearer <your-key>"
}
}
}
}
Where that JSON goes differs by client. Everything downstream (the tools available, the six ready-made prompts, the actual answers) is identical, because both are talking to the same server.
What comes back
Worth seeing before wiring up a schedule around it. Using the same illustrative account walked
through in Root-causing a cost spike with the event overlay
— AWS spend climbing from ~$25k/month to $86.5k over ten weeks — a query_costs call for that
window comes back as:
{
"currency": "USD",
"rows": [
{ "period": "2026-04-01", "cost": 26104.18 },
{ "period": "2026-05-01", "cost": 51780.42 },
{ "period": "2026-06-01", "cost": 86512.77 }
],
"coverage": {
"complete_through": "2026-06-30",
"lagging_sources": []
}
}
Every monetary field states its own currency, because the thing
reading it is a model, not a person who’d notice a EUR account being quoted in bare numbers. The
spend-anomaly-check prompt calls list_anomalies on top of that same data and gets back
something with the story already attached, correlated events included:
{
"anomalies": [
{
"service": "Amazon EC2",
"detected_on": "2026-05-28",
"delta_pct": 41.2,
"driven_by": "autoscale ceiling raised (INFRA-482)",
"correlated_events": [
{
"type": "pr_merged",
"title": "api-gateway v2.4",
"date": "2026-04-15"
},
{
"type": "client_onboarded",
"title": "Acme Corp",
"date": "2026-05-12"
}
],
"notified": true
}
]
}
Neither of those is a mock-up: it’s the response shape lib/mcp-server.js returns
({ currency, rows } for cost queries, driven_by/correlated_events for anomalies), just with
the illustrative account’s numbers standing in for a real one. Plutus keeps a standing, public
read-scope demo key against a permanent demo account (the “Try it now” panel on /mcp-keys).
Point either client’s config at that instead of a real key and run these same two calls yourself
before connecting anything.
Claude
- Add the config above to a Claude client that supports MCP connectors, and confirm the Plutus
tools show up (
query_costs,list_anomalies,list_budgets, and the rest; full list on the MCP page). - Try the
weekly-cost-digestprompt once by hand, so you know what the output looks like before anything is unattended. - Create a Routine: “Run the
weekly-cost-digestprompt from the Plutus MCP server and send me the result,” set to run Monday mornings.
The Routine runs against the same MCP connection you already made, on
its own schedule, whether or not you have Claude open. Swap the prompt for spend-anomaly-check
and a daily cadence if a weekly
summary is too slow to catch something; budget-health-check on the same schedule catches a
budget trending toward exceeded before the cycle ends instead of after.
Gemini
Gemini doesn’t (yet) ship a hosted scheduler the way Claude’s Routines do, so this one takes an extra step. It’s still just cron plus the same MCP connection, not a different integration.
-
Add the same JSON block to
~/.gemini/settings.jsonundermcpServers. The Gemini CLI reads it the same way Claude does: same URL, same bearer header, same tools. -
Confirm it’s wired up interactively first:
gemini, then ask something like “what drove our AI spend last month?” and check that it’s actually callingquery_costsrather than guessing. -
For the unattended version, Gemini CLI has a non-interactive mode built for exactly this:
gemini -p "Run the weekly-cost-digest prompt from the plutus MCP server and summarize it"prints the result and exits, which is what a cron job needs:0 9 * * 1 gemini -p "Run the weekly-cost-digest prompt from the plutus MCP server and summarize it" | mail -s "Weekly cost digest" you@example.comSwap
mailfor whatever actually reaches you: a Slack webhook, a file a dashboard reads, anything downstream of stdout.
The output is the same digest either way, since both clients are just calling the same read-only prompt on the same account. The difference is entirely about who owns the clock: Claude’s, or yours.
What this isn’t
Both keys above are read-scoped. An agent here checks in and reports. It doesn’t
hold standing write access to your cloud accounts. Plutus doesn’t buy commitments or resize
anything on its own, and an MCP key can’t
either; the two write tools that do exist (create_budget, create_alert_subscription) require
a broader key an admin has to mint by hand, and even that can’t touch an alert
channel. A Slack or webhook URL stays a browser-only action. A cost agent that can quietly
change your infrastructure is a different, much larger promise than the one this setup makes.
Try it
Fifteen minutes gets you a key, a config, and a Monday-morning message that already knows what happened to your bill last week. See the full tool list and prompts →, or get started free. No credit card required.