All notable changes to the Azure Pricing MCP Server will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
Documentation overhaul — comprehensive review and update of all markdown files
- Fixed tool count across all docs (was 6/13/15 in different files → now consistently 18)
- Added Databricks DBU pricing tools to TOOLS.md, USAGE_EXAMPLES.md, FEATURES.md, and README.md (were missing from all four despite being added in v3.4.0)
- Added GitHub pricing examples to USAGE_EXAMPLES.md
- Added full parameter documentation to TOOLS.md for all 18 tools
- Rewrote PROJECT_STRUCTURE.md to reflect current architecture (was stuck at ~v3.0.0)
- Fixed 8 broken links (references to deleted QUICK_START.md, nonexistent DOCKER.md, wrong relative paths)
- Added Copilot disambiguation note (GitHub Copilot vs Microsoft 365 Copilot) to FEATURES.md and TOOLS.md
- Updated DEVELOPMENT.md "Adding a New Tool" guide to reflect service → handler → formatter → tool pattern
- Fixed stale version references and removed outdated setup.py reference in DEVELOPMENT.md
- Removed stale "Reserved Instances" item from CONTRIBUTING.md (already implemented)
- Simplified README.md contributing section (removed duplication with CONTRIBUTING.md)
- Updated INSTALL.md auth note to include Orphaned Resources (not just Spot VMs)
- Fixed SETUP_CHECKLIST.md tool count and resource links
-
Version bump to 4.0.0 — major documentation restructuring
- Added @roy2392 as a contributor
- GitHub Pricing Tools — full GitHub product pricing catalog
github_pricing— look up pricing for Plans, Copilot, Actions runners, Advanced Security, Codespaces, Git LFS, and Packagesgithub_cost_estimate— estimate monthly/annual GitHub costs based on team size and usage- Static pricing table verified against github.com/pricing (no API calls required)
- Natural-language product aliases (e.g., 'ci/cd' → Actions, 'pair programmer' → Copilot)
- Full test suite with config validation, service logic, formatter, and handler integration tests
- Azure Databricks DBU Pricing Tools (contributed by PR #28)
databricks_dbu_pricing- Search and list Azure Databricks DBU rates by workload type, tier, and regiondatabricks_cost_estimate- Estimate monthly and annual Databricks costs based on DBU consumptiondatabricks_compare_workloads- Compare DBU costs across workload types or regions- Supports 14 workload types with fuzzy alias matching (e.g., 'etl' -> 'jobs', 'warehouse' -> 'serverless sql')
- Real-time pricing from Azure Retail Prices API — no authentication required
- Photon pricing comparison included automatically
- Orphaned Resource Detection expanded from 5 to 11 resource types (contributed by @iditbnaya, PR #30)
- Removed NICs and NSGs (no cost impact — not billable resources)
- Added: SQL Elastic Pools, Application Gateways, NAT Gateways, Load Balancers, Private DNS Zones, Private Endpoints, Virtual Network Gateways, DDoS Protection Plans
- Fixed SQL Elastic Pools query to correctly filter for pools with no databases (leftanti join)
- Fixed Private Endpoints query to check both auto-approved and manual-approval connections
- Updated all documentation (FEATURES.md, ORPHANED_RESOURCES.md, TOOLS.md, USAGE_EXAMPLES.md)
- Added Databricks DBU pricing tools to TOOLS.md
- Updated orphaned resource documentation across all docs
-
PTU Sizing + Cost Planner (
azure_ptu_sizingtool)- Estimate required Provisioned Throughput Units (PTUs) for Azure OpenAI / AI Foundry model deployments
- Supports 19 models: gpt-5.2, gpt-5.1, gpt-5, gpt-5-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, o3, o4-mini, gpt-4o, gpt-4o-mini, o3-mini, o1, Llama-3.3-70B-Instruct, DeepSeek-R1, DeepSeek-V3-0324, DeepSeek-R1-0528, and codex variants
- Applies official rounding rules (minimum PTUs + scale increments per model and deployment type)
- Supports Global, Data Zone, and Regional Provisioned deployment types
- Accounts for output token multipliers (e.g., gpt-5: 1 output = 8 input tokens)
- Supports cached token deduction (100% deducted from utilization per docs)
- Optional live cost estimation via Azure Retail Prices API ($/PTU/hr, monthly projections)
- Full calculation transparency: shows intermediate math, rounding rules, and data sources
- Includes reservation guidance and benchmarking recommendations
-
PTU Service (
services/ptu.py,services/ptu_models.py)PTUServiceclass with pure computation methods and async orchestrator- Versioned model data table sourced from official Microsoft PTU documentation
- Case-insensitive model lookup with canonical name resolution
- Added
azure_ptu_sizingtool to TOOLS.md - Added PTU Sizing section to FEATURES.md
-
Orphaned Resource Detection Tool (contributed by @iditbnaya)
find_orphaned_resources- Detect orphaned Azure resources and compute wasted costs- Initial release: scans for unattached managed disks, orphaned NICs, public IPs, NSGs, and empty App Service Plans
- Integrates with Azure Cost Management API for historical cost lookup
- Groups results by resource type with per-type summary tables
- Configurable lookback period (default: 60 days)
- Supports scanning all subscriptions or a single subscription
-
Orphaned Resources Service (
services/orphaned_resources.py,services/orphaned.py)OrphanedResourceScannerfor async Resource Graph queries- Azure Cost Management integration for per-resource cost lookup
- Uses existing aiohttp and azure-identity - no new dependencies
- Added orphaned resource detection to TOOLS.md
- Added detailed feature documentation in FEATURES.md
- Added @iditbnaya as contributor
-
Spot VM Tools (requires Azure authentication)
spot_eviction_rates- Query Spot VM eviction rates for SKUs across regionsspot_price_history- Get up to 90 days of Spot pricing historysimulate_eviction- Trigger eviction simulation on Spot VMs for resilience testing
-
Azure Authentication Module (
auth.py)AzureCredentialManagerfor Azure AD authentication- Non-interactive credential support (environment variables, managed identity, Azure CLI)
- Graceful error handling with authentication help messages
- Least-privilege permission guidance for each tool
-
New Dependencies
azure-identity>=1.15.0for Azure AD authentication (Spot VM tools)
-
Spot Service (
services/spot.py)- Azure Resource Graph integration for eviction rates and price history
- Azure Compute API integration for eviction simulation
- Lazy initialization - auth only checked when Spot tools are called
AZURE_RESOURCE_GRAPH_URL- Resource Graph API endpointAZURE_RESOURCE_GRAPH_API_VERSION- API version for Resource GraphAZURE_COMPUTE_API_VERSION- API version for Compute operationsSPOT_CACHE_TTL- Cache TTL for Spot data (1 hour default)SPOT_PERMISSIONS- Least-privilege permission documentation
- Console script entry point changed from
maintorun- The
run()function is now the synchronous entry point that wrapsasyncio.run(main()) - Existing console script configurations (
azure-pricing-mcp) will continue to work - Code directly importing and calling
main()still works (it's async) - This change improves the structure by clearly separating sync/async entry points
- The
create_server()now returns a tuple(Server, AzurePricingServer)by default- This change exposes the pricing server for testing and advanced use cases
- Use
create_server(return_pricing_server=False)for the previous behavior (returns onlyServer) - The
AzurePricingServerinstance is needed for lifecycle management
- HTTP session is now managed at the server level, not per-tool-call
- Previously: Each tool call created and destroyed a new HTTP session (inefficient)
- Now: A single HTTP session is created at server startup and reused for all tool calls
- This significantly improves performance and reduces overhead
- When using
AzurePricingServerdirectly, you must manage its lifecycle:# Option 1: Context manager (recommended) async with AzurePricingServer() as pricing_server: result = await pricing_server.tool_handlers.handle_price_search(...) # Option 2: Manual lifecycle management pricing_server = AzurePricingServer() await pricing_server.initialize() try: result = await pricing_server.tool_handlers.handle_price_search(...) finally: await pricing_server.shutdown()
-
Modular Services Architecture
client.py- HTTP client for Azure Pricing APIservices/- Business logic (PricingService, SKUService, RetirementService)handlers.py- MCP tool routingformatters.py- Response formattingmodels.py- Data structurestools.py- Tool definitionsconfig.py- Configuration constants
-
New
AzurePricingServerMethodsinitialize()- Explicitly start the HTTP sessionshutdown()- Explicitly close the HTTP sessionis_activeproperty - Check if session is active
-
Improved Documentation
- Comprehensive docstrings for all public APIs
- Breaking change documentation in module docstring
- Restructured codebase from monolithic to modular architecture
- Updated all tests to use service-based architecture with proper dependency injection
- Improved error handling with session state checks
- Obsolete documentation files:
DOCUMENTATION_UPDATES.mdMIGRATION_GUIDE.mdQUICK_START.md(replaced by README quick start section)USAGE_EXAMPLES.md(replaced by README examples)
No changes required. The azure-pricing-mcp command continues to work.
-
If you call
create_server():# Old (v2.x) server = create_server() # New (v3.0) - if you don't need pricing_server server = create_server(return_pricing_server=False) # New (v3.0) - if you need pricing_server for testing server, pricing_server = create_server()
-
If you use
AzurePricingServerdirectly:# You MUST initialize the session before tool calls async with AzurePricingServer() as pricing_server: # All tool calls within this block share the same HTTP session result = await pricing_server.tool_handlers.handle_price_search(...)
See git history for changes in previous versions.