
Azure FinOps MCP Server
io.github.raviteja-pegataPublished by GitHub account raviteja-pegatav0.1.1Updated Nov 3, 2026
Azure FinOps MCP: cost, budgets, forecasting and optimization for Claude, VS Code and Cursor.
Overview
Local MCP server that gives an assistant read-only Azure cost analysis, budgets, forecasting and idle-resource optimization across allowed subscriptions.
- What you can do
- List allowed subscriptions with friendly names
- Query cost totals, month-to-date spend, breakdowns by service, resource group, location, meter or tag, and portfolio-wide spend
- Check budget consumption for one subscription or across all subscriptions
- Find idle resources, pull Azure Advisor cost recommendations and check VM CPU utilization
- Forecast month-end spend for a single subscription or the whole portfolio
- When to use it
- Useful when you want to ask an assistant plain-language questions about Azure spend, budget headroom, savings opportunities or month-end forecasts, especially across several subscriptions, without building queries by hand.
- Requirements
- Runs locally as a Python package (Python 3.11+) started over stdio; Azure CLI installed and logged in via az login, or a managed identity when deployed remotely. Requires AZURE_ALLOWED_SUBSCRIPTIONS and AZURE_DEFAULT_SUBSCRIPTION; optional FINOPS_CACHE_TTL_SECONDS. The identity needs Cost Management Reader, Reader and Monitoring Reader roles on each subscription queried.
Installation
In SourceWeft
- Open Azure FinOps MCP Server in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Azure FinOps MCP Server
An MCP server that gives LLM clients (Claude Desktop, Claude Code, VS Code, Cursor) conversational access to Azure cost analysis, budget tracking, forecasting, and resource optimization — across multiple subscriptions.
Tools
Discovery
Cost Analysis
Budgets
Optimization
Forecasting
Quick Install
Then add it to your MCP client config using the installed command — no cloning needed:
See the Client Configuration section below for per-client config file locations.
Prerequisites
- Python 3.11+
- Azure CLI installed and logged in (
az login)
Azure RBAC Permissions
The identity running this server (your user, a service principal, or a managed identity) needs three roles assigned on each subscription you want to query:
Assign via Azure CLI
Repeat for each subscription listed in AZURE_ALLOWED_SUBSCRIPTIONS.
Local development (your own user)
Your user already has these roles if you're a subscription Owner or Contributor. If not, ask your Azure admin to assign them.
Managed Identity (Container Apps deployment)
After deploying with deploy.sh, the script automatically assigns these three roles
to the Container App's system-assigned managed identity on each allowed subscription.
No credentials or secrets are needed — DefaultAzureCredential picks up the
managed identity automatically at runtime.
Install
Configure .env
Test with MCP Inspector
The Inspector is a web UI that lets you call tools interactively and see raw JSON-RPC messages. Always test here before connecting to Claude Desktop.
In the Inspector UI:
- Verify Transport Type is STDIO
- Click Connect — should succeed and show "azure-finops" as the server name
- Navigate to Tools, click List Tools — you should see all 15 tools
- Try
list_subscriptionsfirst (no arguments needed) - Try
get_month_to_date_cost(no arguments needed — uses default sub)
Client Configuration
Find the absolute path to your venv's Python first — you'll need it in every config below:
Claude Desktop
Edit claude_desktop_config.json:
Restart Claude Desktop. A tool icon in the chat input confirms the server connected.
VS Code (GitHub Copilot / Agent mode)
Create .vscode/mcp.json in your workspace (or add to user settings.json under "mcp"):
Requires VS Code 1.99+ with the GitHub Copilot extension. Open the Chat panel,
switch to Agent mode, and the azure-finops tools will appear automatically.
Cursor
Create or edit ~/.cursor/mcp.json:
Or add it via Cursor Settings → MCP → Add new global MCP server. Restart Cursor. The tools appear in Cursor's Agent/Composer panel.
Claude Code (CLI)
Remote HTTP (after deploying to Azure Container Apps)
All clients support connecting to the deployed server over HTTP — no local Python needed:
Claude Desktop / Cursor — add to the same config files above:
VS Code — in .vscode/mcp.json:
Claude Web — Settings → Integrations → Add → https://<your-container-app-fqdn>/mcp
Example Prompts
Try these once connected:
- "What are our allowed subscriptions?"
- "What's our total month-to-date spend across all subscriptions?"
- "Which 10 services cost the most on our prod subscription last month?"
- "Break down last quarter's spend by the
costcentertag." - "Are any budgets close to breaching?"
- "Show me idle resources across all our subscriptions."
- "What does Azure Advisor recommend for cost savings?"
- "Is VM
my-analytics-vmactually being used? Check its CPU over 14 days." - "Compare our forecast for this month against our budgets."
Architecture
Key design decisions
Narrow tools over flexible tools. The LLM picks among well-named tools far better than it constructs complex query objects. 15 purpose-built tools beats 3 configurable ones.
Subscription allowlist. A frozenset loaded from env. Every tool calls
resolve_subscription() which refuses any ID not in the list. Prevents the
LLM from querying unauthorized subscriptions — important for prompt injection
defense.
Portfolio tools catch per-sub errors. When querying 5+ subscriptions, one
might have different RBAC or be in a weird state. Portfolio tools (get_portfolio_*)
wrap each sub in try/except so partial results are returned with errors listed
separately.
Cache on Cost Management only. Cost queries are expensive and rate-limited (~30 req/min per tenant). Cost data updates hourly at best. Default 15-minute TTL trades almost nothing in freshness for significant rate-limit headroom. Resource Graph and Advisor are fast and cheap — no caching needed.
Structured returns, not prose. Tools return dicts with columns/rows/metadata. The LLM narrates them naturally. This avoids encoding English into tool responses (which makes them brittle to prompt changes).
Deploying to Azure (Remote Mode)
For team-wide access, deploy as a remote HTTP server:
-
Transport swap in
server.py: -
Dockerfile:
-
Deploy to Azure Container Apps with a user-assigned managed identity.
-
Grant RBAC to the managed identity (same 3 roles: Cost Management Reader, Reader, Monitoring Reader) on each subscription.
-
Add auth via APIM or Azure Front Door + Entra ID. MCP supports OAuth for remote servers.
-
DefaultAzureCredentialpicks up the managed identity automatically — no code changes needed.
Troubleshooting
Source: README.md at commit ef5b83b
Tools
0Version history
1- v0.1.1LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts