Azure Cost Management MCP

Azure Cost Management MCP

Integrates Azure Cost Management APIs via MCP, enabling cost queries, forecasts, budgets, and Advisor recommendations through natural language in compatible clients.

Category
访问服务器

README

Azure Cost Management MCP Server

MCP (Model Context Protocol) server per l'integrazione con le API di Azure Cost Management, allineato alle linee guida WAF Cost Optimization e CAF (Cloud Adoption Framework) di Microsoft.

Compatibile con GitHub Copilot Chat, Claude Desktop, e qualsiasi client MCP.


Indice


Prerequisiti

Requisito Versione minima
Node.js 18.0.0
npm 9.x
Azure CLI (az) qualsiasi — solo per autenticazione locale

Installazione

cd azure-cost-management-mcp
npm install
npm run build

Il server compilato sarà disponibile in dist/index.js.


Autenticazione Azure

Il server usa DefaultAzureCredential dall'SDK @azure/identity, che tenta automaticamente le seguenti modalità in ordine:

Opzione A — Azure CLI (sviluppo locale, consigliata)

az login
# oppure, per un tenant specifico:
az login --tenant <TENANT_ID>

Nessuna variabile d'ambiente necessaria. Il server rileva il token CLI in modo automatico.

Opzione B — Service Principal (CI/CD, automazione)

Imposta le seguenti variabili d'ambiente (vedi .env.example):

AZURE_TENANT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
AZURE_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
AZURE_CLIENT_SECRET=your-client-secret
AZURE_SUBSCRIPTION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  # default subscription

Opzione C — Managed Identity (workload ospitati su Azure)

Nessuna configurazione. DefaultAzureCredential rileva l'identità gestita tramite IMDS in modo automatico.


Configurazione IDE

VS Code + GitHub Copilot Chat

Metodo 1 — File .vscode/mcp.json nel workspace (consigliato)

Crea o modifica il file <cartella-workspace>/.vscode/mcp.json:

{
  "servers": {
    "azure-cost-management": {
      "type": "stdio",
      "command": "node",
      "args": ["${userHome}/azure-cost-management-mcp/dist/index.js"],
      "env": {
        "AZURE_SUBSCRIPTION_ID": "${env:AZURE_SUBSCRIPTION_ID}"
      }
    }
  }
}

Se usi az login, la sezione env può rimanere vuota — DefaultAzureCredential usa il token CLI. Per Service Principal aggiungi AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_CLIENT_SECRET.

Metodo 2 — Settings utente VS Code (globale)

Apri Ctrl+Shift+PPreferences: Open User Settings (JSON) e aggiungi:

{
  "mcp.servers": {
    "azure-cost-management": {
      "type": "stdio",
      "command": "node",
      "args": ["C:/Users/<TUO_UTENTE>/azure-cost-management-mcp/dist/index.js"]
    }
  }
}

Verifica connessione in VS Code:

  1. Apri il pannello GitHub Copilot Chat (Ctrl+Alt+I)
  2. Seleziona modalità Agent (@)
  3. Scrivi: @azure-cost-management qual è la spesa del mese corrente per la subscription xxx?

Claude Desktop

Modifica il file di configurazione di Claude Desktop:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "azure-cost-management": {
      "command": "node",
      "args": ["C:/Users/<TUO_UTENTE>/azure-cost-management-mcp/dist/index.js"],
      "env": {
        "AZURE_SUBSCRIPTION_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
    }
  }
}

Riavvia Claude Desktop dopo la modifica.


Cursor

Crea o modifica .cursor/mcp.json nella home utente oppure nella cartella del progetto:

{
  "mcpServers": {
    "azure-cost-management": {
      "command": "node",
      "args": ["C:/Users/<TUO_UTENTE>/azure-cost-management-mcp/dist/index.js"],
      "env": {
        "AZURE_SUBSCRIPTION_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
    }
  }
}

Windsurf

Modifica ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "azure-cost-management": {
      "command": "node",
      "args": ["C:/Users/<TUO_UTENTE>/azure-cost-management-mcp/dist/index.js"],
      "env": {
        "AZURE_SUBSCRIPTION_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
      }
    }
  }
}

Riferimento Scope

Tutti i tool accettano un parametro scope che identifica il livello Azure su cui operare.

Formato Esempio Scope risultante
Path completo /subscriptions/aaaa-bbbb Subscription
Path completo /subscriptions/aaaa/resourceGroups/my-rg Resource Group
UUID nudo aaaa-bbbb-cccc-dddd-eeee Subscription
sub:{id} sub:aaaa-bbbb Subscription
sub:{id}/rg:{name} sub:aaaa/rg:my-rg Resource Group
rg:{name} rg:my-rg RG nella subscription default (AZURE_SUBSCRIPTION_ID)
mg:{id} mg:my-management-group Management Group (CAF enterprise)
ba:{id} ba:12345678 Billing Account (EA/MCA)
ba:{id}/bp:{id} ba:12345/bp:ABCD Billing Profile (MCA)

CAF tip: usa mg: per analisi cross-subscription su tutti i landing zone senza dover iterare su ogni subscription singolarmente.


Tool disponibili

azure_cost_query

Interroga i costi effettivi o ammortizzati per uno scope Azure con raggruppamento e filtri temporali.

Parametri:

Parametro Tipo Default Descrizione
scope string Scope Azure (vedi Riferimento Scope)
type ActualCost | AmortizedCost ActualCost ActualCost: addebiti pay-as-you-go. AmortizedCost: include l'ammortamento di Reserved Instances e Savings Plans
timeframe enum MonthToDate Finestra temporale: BillingMonth, MonthToDate, TheLastMonth, TheLastBillingMonth, WeekToDate, Custom
from string (ISO 8601) Data inizio (solo con timeframe=Custom)
to string (ISO 8601) Data fine (solo con timeframe=Custom)
granularity None | Daily | Monthly None None=totale unico, Daily=trend giornaliero, Monthly=riepilogo mensile
groupBy string[] [] Dimensioni per il raggruppamento (vedi esempi sotto)
top integer (1-1000) 100 Numero massimo di righe restituite

Valori comuni per groupBy:

ResourceGroup       ServiceName         ResourceType
Location            SubscriptionName    MeterCategory
MeterSubCategory    ChargeType
tag:CostCenter      tag:Environment     tag:Application

azure_cost_forecast

Restituisce le previsioni di spesa basate sui trend di utilizzo correnti.

Parametri:

Parametro Tipo Default Descrizione
scope string Scope Azure
from string (ISO 8601) Data inizio previsione
to string (ISO 8601) Data fine previsione
granularity Daily | Monthly Monthly Granularità della previsione
includeActualCost boolean true Includi i costi reali per confronto con la previsione

azure_cost_dimensions

Elenca le dimensioni disponibili per raggruppamento e filtro allo scope indicato. Da usare prima di azure_cost_query per scoprire i valori validi di groupBy.

Parametri:

Parametro Tipo Descrizione
scope string Scope Azure

azure_cost_alerts

Elenca gli alert di costo attivi per uno scope: sforamenti budget, avvisi credito, violazioni quota, anomalie.

Parametri:

Parametro Tipo Descrizione
scope string Scope Azure

Risposta — campi principali:

{
  "total": 2,
  "active": 1,
  "alerts": [
    {
      "name": "alert-xxx",
      "definitionType": "Budget",
      "definitionCategory": "Cost",
      "status": "Active",
      "creationTime": "2024-01-15T10:30:00Z"
    }
  ]
}

azure_budget_list

Elenca tutti i budget di costo allo scope con la spesa corrente, le soglie e lo stato.

Parametri:

Parametro Tipo Descrizione
scope string Scope Azure (richiede subscription)

Stati possibili nel campo status:

Status Significato
OK Spesa < 80% del budget
WARNING Spesa tra 80% e 90%
CRITICAL Spesa tra 90% e 100%
EXCEEDED Spesa > 100% del budget

azure_budget_get

Recupera i dettagli completi di un budget specifico: spesa corrente, spesa prevista, soglie di notifica e filtri.

Parametri:

Parametro Tipo Descrizione
scope string Scope Azure
budgetName string Nome del budget

azure_budget_create

Crea o aggiorna un budget di costo con le soglie di alert raccomandate da WAF. Se esiste già un budget con lo stesso nome nello stesso scope, verrà aggiornato.

Parametri:

Parametro Tipo Default Descrizione
scope string Scope Azure (richiede subscription)
name string Nome univoco del budget nello scope
amount number Importo del budget nella valuta della subscription
timeGrain enum Monthly Periodo di reset: Monthly, Quarterly, Annually, BillingMonth, BillingQuarter, BillingAnnually
startDate string (YYYY-MM-DD) Data inizio. Per grain Monthly deve essere il primo del mese
endDate string (YYYY-MM-DD) +10 anni Data fine (opzionale)
contactEmails string[] [] Email da notificare al raggiungimento delle soglie
contactRoles string[] ["Owner","Contributor"] Ruoli RBAC da notificare
notifyAt80Percent boolean true Alert WAF: avviso anticipato all'80% della spesa effettiva
notifyAt100Percent boolean true Alert WAF: budget raggiunto al 100% della spesa effettiva
notifyForecastAt100Percent boolean true Alert WAF: previsione che raggiungerà il 100% prima della fine del periodo

azure_budget_delete

Elimina permanentemente un budget. L'operazione non è reversibile.

Parametri:

Parametro Tipo Descrizione
scope string Scope Azure
budgetName string Nome del budget da eliminare

azure_advisor_recommendations

Recupera le raccomandazioni di Azure Advisor per la categoria Cost Optimization.

Copre: ridimensionamento VM sottoutilizzate, eliminazione risorse idle (dischi non collegati, IP pubblici inutilizzati), acquisto Reserved Instances o Savings Plans per workload prevedibili.

Parametri:

Parametro Tipo Default Descrizione
scope string Scope a livello subscription (UUID, sub:{id}, o path completo)
impact High | Medium | Low | All All Filtra per impatto. High = maggior risparmio potenziale
top integer (1-500) 50 Numero massimo di raccomandazioni

Nota: Azure Advisor opera solo a livello di subscription. Lo scope mg: non è supportato per questo tool.


Esempi d'uso in chat

Questi esempi funzionano sia con GitHub Copilot Chat che con Claude Desktop, Cursor, e Windsurf.

Analisi spesa corrente

Mostrami la spesa del mese corrente per la subscription aaaa-bbbb-cccc,
raggruppata per ServiceName e ordinata per costo decrescente.
Qual è la spesa degli ultimi 3 mesi raggruppata per ResourceGroup?
Usa il periodo Custom da 2024-01-01 a 2024-03-31 con granularità Monthly.
Mostrami la ripartizione dei costi per tag:CostCenter e tag:Environment
nella subscription aaaa — voglio fare il chargeback ai team.

Previsioni e anomalie

Prevedi la spesa di marzo per la subscription aaaa.
Poi confronta con il budget esistente per capire se siamo a rischio sforamento.
Ci sono alert di costo attivi nella subscription aaaa?

Gestione budget

Elenca tutti i budget nella subscription aaaa con il loro stato attuale.
Crea un budget mensile da 5000 EUR per il resource group "prod-rg"
nella subscription aaaa, con notifiche a mario@example.com.
Il budget "monthly-prod" nella subscription aaaa è stato superato?
Mostrami i dettagli e la spesa prevista per fine mese.

Ottimizzazione costi (WAF/CAF)

Quali sono le raccomandazioni di Azure Advisor ad alto impatto
per la subscription aaaa? Voglio massimizzare i risparmi.
Fai un'analisi completa dei costi per il management group "my-mg":
spesa corrente per subscription, alert attivi, e raccomandazioni Advisor.
Quali dimensioni sono disponibili per il raggruppamento dei costi
nella subscription aaaa? Voglio capire su quali tag posso fare showback.

RBAC — Ruoli richiesti

Assegna i ruoli allo scope appropriato (subscription, resource group o management group):

Operazione Ruolo minimo richiesto
Leggere costi, forecast, dimensioni, alert Cost Management Reader
Leggere budget Cost Management Reader
Creare/aggiornare/eliminare budget Cost Management Contributor
Raccomandazioni Advisor Reader (a livello subscription)

CAF enterprise: assegna i ruoli a livello di Management Group per coprire tutte le subscription dei landing zone con un'unica assegnazione.

# Esempio: assegnare Cost Management Reader al management group
az role assignment create \
  --role "Cost Management Reader" \
  --assignee <CLIENT_ID_O_UPN> \
  --scope /providers/Microsoft.Management/managementGroups/<MG_ID>

Architettura del codice

azure-cost-management-mcp/
├── src/
│   ├── index.ts              # Entry point MCP server, registrazione tool
│   ├── client.ts             # Client Azure singleton + helper scope/risposta
│   ├── tools/
│   │   ├── cost.ts           # azure_cost_query, forecast, dimensions, alerts
│   │   ├── budgets.ts        # azure_budget_list/get/create/delete
│   │   └── advisor.ts        # azure_advisor_recommendations
│   └── __tests__/
│       ├── client.test.ts    # Unit test: normalizeScope, transformRows, ecc.
│       └── server.integration.test.ts  # Integration test: protocollo MCP
├── dist/                     # Output compilato TypeScript (generato da npm run build)
├── package.json
├── tsconfig.json
└── .env.example

Dipendenze principali:

Pacchetto Versione Uso
@modelcontextprotocol/sdk ^1.27.1 Protocollo MCP, transport stdio
@azure/arm-costmanagement 1.0.0-beta.1 Query costi, forecast, dimensioni, alert
@azure/arm-consumption ^9.2.0 Gestione budget
@azure/arm-advisor ^3.2.0 Raccomandazioni Cost Optimization
@azure/identity ^4.13.1 DefaultAzureCredential (auth unificata)
zod ^3.23.0 Validazione input schema tool

Flusso architetturale:

GitHub Copilot / Claude / Cursor
         │ MCP (stdio)
         ▼
    src/index.ts  (McpServer + StdioServerTransport)
         │
    src/client.ts  (DefaultAzureCredential, singleton client, normalizeScope)
         │
    ┌────┼────────────────────┐
    ▼    ▼                    ▼
Azure Cost    Azure           Azure
Management    Consumption     Advisor
API           API (Budgets)   API

Sviluppo

# Avvia in watch mode (rebuild automatico al salvataggio)
npm run dev

# Verifica tipi senza compilare
npm run typecheck

# Build di produzione
npm run build

# Avvia il server compilato
npm start

# Esegui tutti i test (unit + integration)
npm test

# Solo unit test (client utilities)
npm run test:unit

# Solo integration test (protocollo MCP)
npm run test:integration

Test rapido del server:

# Verifica che il server si avvii e risponda al protocollo MCP
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' \
  | node dist/index.js

Lista tool registrati:

(
  echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'
  echo '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
) | node dist/index.js

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选