Skip to content

Commit 4169123

Browse files
authored
Merge pull request #32 from msftnadavbh/feature/github-pricing-tool
feat: add GitHub pricing tools (github_pricing + github_cost_estimate)
2 parents 3a9c359 + a98fc51 commit 4169123

File tree

14 files changed

+1826
-409
lines changed

14 files changed

+1826
-409
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ All notable changes to the Azure Pricing MCP Server will be documented in this f
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [3.5.0] - 2026-03-03
9+
10+
### Added
11+
12+
- **GitHub Pricing Tools** — full GitHub product pricing catalog
13+
- `github_pricing` — look up pricing for Plans, Copilot, Actions runners, Advanced Security, Codespaces, Git LFS, and Packages
14+
- `github_cost_estimate` — estimate monthly/annual GitHub costs based on team size and usage
15+
- Static pricing table verified against github.com/pricing (no API calls required)
16+
- Natural-language product aliases (e.g., 'ci/cd' → Actions, 'pair programmer' → Copilot)
17+
- Full test suite with config validation, service logic, formatter, and handler integration tests
18+
819
## [3.4.0] - 2026-03-03
920

1021
### Added

docs/FEATURES.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ The Azure Pricing MCP Server provides comprehensive Azure pricing intelligence t
1919
| 📊 **Real-time Data** | Live data from Azure Retail Prices API |
2020
| 🏷️ **Customer Discounts** | Apply discount percentages to all pricing queries |
2121
|**PTU Sizing** | Estimate Provisioned Throughput Units for Azure OpenAI deployments |
22+
| 🐙 **GitHub Pricing** | Full GitHub pricing catalog + cost estimation (Plans, Copilot, Actions, Security, Codespaces) |
2223

2324
---
2425

@@ -166,6 +167,37 @@ PTU sizing calculations are purely offline. Optional cost lookup uses the public
166167

167168
---
168169

170+
## GitHub Pricing Tools
171+
172+
Full GitHub product pricing catalog and cost estimation — no authentication required.
173+
174+
### Capabilities
175+
176+
| Feature | Description |
177+
|---------|-------------|
178+
| **Plan pricing** | Free, Team, Enterprise — per-user monthly rates |
179+
| **Copilot pricing** | Free, Pro, Pro+, Business, Enterprise plans |
180+
| **Actions runners** | Per-minute rates for Linux, Windows, macOS, ARM, GPU runners |
181+
| **Advanced Security** | GHAS per-committer pricing |
182+
| **Codespaces** | Compute (per core-hour) and storage (per GB/month) |
183+
| **Add-ons** | Git LFS, Packages, data transfer |
184+
| **Cost estimation** | Monthly/annual projections based on team size and usage |
185+
186+
### No Authentication Required
187+
188+
GitHub pricing data is maintained as a static table verified against github.com/pricing. All lookups are offline — no API calls required.
189+
190+
### Example Usage
191+
192+
```
193+
"What are the GitHub Copilot pricing plans?"
194+
"How much does GitHub Actions cost for macOS runners?"
195+
"Estimate monthly GitHub cost for 50 users on Team plan with Copilot Business"
196+
"Show me GitHub Advanced Security pricing"
197+
```
198+
199+
---
200+
169201
## Docker Support
170202

171203
Run in containers for easy deployment and isolation. See [INSTALL.md](../INSTALL.md) for Docker setup instructions.

docs/TOOLS.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Available Tools
22

3-
The Azure Pricing MCP Server provides 13 tools for querying Azure pricing information.
3+
The Azure Pricing MCP Server provides 15 tools for querying Azure pricing information.
44

55
---
66

@@ -55,6 +55,17 @@ No authentication required for sizing. Cost lookup uses the public Azure Retail
5555
5656
---
5757

58+
## GitHub Pricing Tools
59+
60+
No authentication required. Data sourced from static pricing tables verified against github.com/pricing.
61+
62+
| Tool | Description |
63+
|------|-------------|
64+
| `github_pricing` | Look up GitHub product pricing: Plans (Free/Team/Enterprise), Copilot (Free/Pro/Pro+/Business/Enterprise), Actions runners, Advanced Security, Codespaces, Git LFS, and Packages |
65+
| `github_cost_estimate` | Estimate monthly and annual GitHub costs based on team size and usage (plan seats, Copilot licenses, Actions minutes, Codespaces hours, LFS packs, GHAS committers) |
66+
67+
---
68+
5869
## Example Queries
5970

6071
Once configured, ask your AI assistant:
@@ -73,6 +84,8 @@ Once configured, ask your AI assistant:
7384
| **Orphaned Resources** | "Find orphaned resources across all my subscriptions" |
7485
| **PTU Sizing** | "How many PTUs do I need for gpt-4.1 at 100 RPM with 500 input and 200 output tokens?" |
7586
| **PTU Cost** | "Estimate PTU cost for gpt-5 deployment with 50 RPM, 1000 input tokens, 500 output tokens, include cost for eastus" |
87+
| **GitHub Pricing** | "What are the GitHub Copilot plan prices?" |
88+
| **GitHub Cost** | "Estimate monthly GitHub cost for 50 users on Team plan with Copilot Business and 10,000 Actions minutes" |
7689

7790
### Sample Response
7891

src/azure_pricing_mcp/config.py

Lines changed: 250 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,256 @@
169169
"lakebase": "database serverless",
170170
}
171171

172+
# =============================================================================
173+
# GitHub Pricing Configuration (static catalog — not available via Azure API)
174+
# =============================================================================
175+
176+
# Data version tracks the last manual verification date for static pricing data.
177+
# Bump this when prices are re-verified from https://github.com/pricing
178+
GITHUB_PRICING_DATA_VERSION = "2026-03-03"
179+
180+
# ---------------------------------------------------------------------------
181+
# GitHub Plans (per-user/month)
182+
# ---------------------------------------------------------------------------
183+
GITHUB_PLANS: dict[str, dict] = {
184+
"Free": {
185+
"price_monthly": 0.0,
186+
"price_annual_per_month": 0.0,
187+
"target": "Individual developers & small OSS projects",
188+
"includes": [
189+
"Unlimited public/private repos",
190+
"2,000 Actions minutes/month",
191+
"500 MB Packages storage",
192+
"Community support",
193+
],
194+
},
195+
"Team": {
196+
"price_monthly": 4.0,
197+
"price_annual_per_month": 4.0,
198+
"target": "Small teams wanting collaboration features",
199+
"includes": [
200+
"Everything in Free",
201+
"3,000 Actions minutes/month",
202+
"2 GB Packages storage",
203+
"Required reviewers",
204+
"Code owners",
205+
"Draft pull requests",
206+
"Repository insights",
207+
],
208+
},
209+
"Enterprise": {
210+
"price_monthly": 21.0,
211+
"price_annual_per_month": 21.0,
212+
"target": "Large organisations with advanced security & compliance",
213+
"includes": [
214+
"Everything in Team",
215+
"50,000 Actions minutes/month",
216+
"50 GB Packages storage",
217+
"SAML SSO",
218+
"Advanced auditing",
219+
"GitHub Connect",
220+
"Enterprise Managed Users (optional)",
221+
],
222+
},
223+
}
224+
225+
# ---------------------------------------------------------------------------
226+
# GitHub Copilot Plans
227+
# ---------------------------------------------------------------------------
228+
GITHUB_COPILOT_PLANS: dict[str, dict] = {
229+
"Free": {
230+
"price_monthly": 0.0,
231+
"price_annual": 0.0,
232+
"target": "Individuals — limited completions & chat",
233+
"includes": [
234+
"2,000 code completions/month",
235+
"50 chat messages/month",
236+
"Access to GPT-4o & Claude 3.5 Sonnet",
237+
],
238+
},
239+
"Pro": {
240+
"price_monthly": 10.0,
241+
"price_annual": 100.0,
242+
"target": "Individual developers — unlimited usage",
243+
"includes": [
244+
"Unlimited code completions",
245+
"Unlimited chat messages",
246+
"Access to GPT-4o, Claude 3.5 Sonnet, and more",
247+
"CLI and IDE support",
248+
],
249+
},
250+
"Pro+": {
251+
"price_monthly": 39.0,
252+
"price_annual": 390.0,
253+
"target": "Power users — premium models & agents",
254+
"includes": [
255+
"Everything in Pro",
256+
"Access to GPT-o1, Claude 3.7 Sonnet, Gemini 2.5 Pro",
257+
"Full Copilot agent mode",
258+
"Unlimited premium model usage",
259+
],
260+
},
261+
"Business": {
262+
"price_monthly": 19.0,
263+
"price_annual": 228.0,
264+
"target": "Organisations — per-seat with admin controls",
265+
"includes": [
266+
"Everything in Pro",
267+
"Organisation-wide policy management",
268+
"Audit logs",
269+
"IP indemnity",
270+
"Content exclusions",
271+
],
272+
},
273+
"Enterprise": {
274+
"price_monthly": 39.0,
275+
"price_annual": 468.0,
276+
"target": "Enterprises — advanced customisation & security",
277+
"includes": [
278+
"Everything in Business",
279+
"Fine-tuned custom models",
280+
"Knowledge bases",
281+
"SAML SSO enforcement",
282+
],
283+
},
284+
}
285+
286+
# ---------------------------------------------------------------------------
287+
# GitHub Actions Runner Pricing (per-minute rates)
288+
# ---------------------------------------------------------------------------
289+
GITHUB_ACTIONS_RUNNERS: dict[str, dict] = {
290+
"Linux 2-core": {"per_minute": 0.008, "os": "Linux", "cores": 2},
291+
"Linux 4-core": {"per_minute": 0.016, "os": "Linux", "cores": 4},
292+
"Linux 8-core": {"per_minute": 0.032, "os": "Linux", "cores": 8},
293+
"Linux 16-core": {"per_minute": 0.064, "os": "Linux", "cores": 16},
294+
"Linux 32-core": {"per_minute": 0.128, "os": "Linux", "cores": 32},
295+
"Linux 64-core": {"per_minute": 0.256, "os": "Linux", "cores": 64},
296+
"Windows 2-core": {"per_minute": 0.016, "os": "Windows", "cores": 2},
297+
"Windows 4-core": {"per_minute": 0.032, "os": "Windows", "cores": 4},
298+
"Windows 8-core": {"per_minute": 0.064, "os": "Windows", "cores": 8},
299+
"Windows 16-core": {"per_minute": 0.128, "os": "Windows", "cores": 16},
300+
"Windows 32-core": {"per_minute": 0.256, "os": "Windows", "cores": 32},
301+
"Windows 64-core": {"per_minute": 0.512, "os": "Windows", "cores": 64},
302+
"macOS 3-core (M1)": {"per_minute": 0.08, "os": "macOS", "cores": 3},
303+
"macOS 4-core (M2 Pro)": {"per_minute": 0.16, "os": "macOS", "cores": 4},
304+
"macOS 12-core (Intel)": {"per_minute": 0.12, "os": "macOS", "cores": 12},
305+
"Linux 2-core ARM": {"per_minute": 0.005, "os": "Linux ARM", "cores": 2},
306+
"Linux 4-core ARM": {"per_minute": 0.01, "os": "Linux ARM", "cores": 4},
307+
"Linux 8-core ARM": {"per_minute": 0.02, "os": "Linux ARM", "cores": 8},
308+
"Linux 16-core ARM": {"per_minute": 0.04, "os": "Linux ARM", "cores": 16},
309+
"Linux 32-core ARM": {"per_minute": 0.08, "os": "Linux ARM", "cores": 32},
310+
"Linux 64-core ARM": {"per_minute": 0.16, "os": "Linux ARM", "cores": 64},
311+
"Linux 2-core GPU": {"per_minute": 0.07, "os": "Linux GPU", "cores": 2},
312+
"Linux 4-core GPU": {"per_minute": 0.14, "os": "Linux GPU", "cores": 4},
313+
}
314+
315+
# Free Actions minutes included per plan (Linux minutes; Windows = 2×, macOS = 10×)
316+
GITHUB_ACTIONS_FREE_MINUTES: dict[str, dict] = {
317+
"Free": {"minutes": 2000, "storage_gb": 0.5},
318+
"Team": {"minutes": 3000, "storage_gb": 2},
319+
"Enterprise": {"minutes": 50000, "storage_gb": 50},
320+
}
321+
322+
# ---------------------------------------------------------------------------
323+
# GitHub Advanced Security Products
324+
# ---------------------------------------------------------------------------
325+
GITHUB_SECURITY_PRODUCTS: dict[str, dict] = {
326+
"GitHub Advanced Security (GHAS)": {
327+
"price_monthly_per_committer": 49.0,
328+
"target": "GitHub Enterprise — required for private repos",
329+
"includes": [
330+
"Code scanning (CodeQL)",
331+
"Secret scanning",
332+
"Dependency review",
333+
"Security overview dashboard",
334+
],
335+
},
336+
}
337+
338+
# ---------------------------------------------------------------------------
339+
# GitHub Add-on Services
340+
# ---------------------------------------------------------------------------
341+
GITHUB_ADDONS: dict[str, dict] = {
342+
"Codespaces Compute": {
343+
"unit": "per core-hour",
344+
"price": 0.18,
345+
"description": "Cloud dev environments — $0.18/core-hour",
346+
},
347+
"Codespaces Storage": {
348+
"unit": "per GB/month",
349+
"price": 0.07,
350+
"description": "Codespaces persistent storage — $0.07/GB/month",
351+
},
352+
"Copilot for Pull Requests": {
353+
"unit": "included with Copilot Enterprise",
354+
"price": 0.0,
355+
"description": "AI-generated PR summaries — included with Copilot Enterprise",
356+
},
357+
"Git LFS Data": {
358+
"unit": "per 50 GB pack/month",
359+
"price": 5.0,
360+
"description": "Large File Storage — $5/50 GB data pack per month",
361+
},
362+
"Git LFS Bandwidth": {
363+
"unit": "per 50 GB pack/month",
364+
"price": 5.0,
365+
"description": "Large File Storage bandwidth — $5/50 GB bandwidth pack per month",
366+
},
367+
"GitHub Packages": {
368+
"unit": "per GB/month beyond free tier",
369+
"price": 0.25,
370+
"description": "Container & package storage — $0.25/GB/month beyond free",
371+
},
372+
"GitHub Packages Data Transfer": {
373+
"unit": "per GB beyond free tier",
374+
"price": 0.50,
375+
"description": "Package data transfer — $0.50/GB beyond free",
376+
},
377+
}
378+
379+
# ---------------------------------------------------------------------------
380+
# Aliases for natural-language lookup
381+
# ---------------------------------------------------------------------------
382+
GITHUB_PRODUCT_ALIASES: dict[str, str] = {
383+
# Plans
384+
"plan": "plans",
385+
"plans": "plans",
386+
"github plan": "plans",
387+
"github plans": "plans",
388+
"subscription": "plans",
389+
# Copilot
390+
"copilot": "copilot",
391+
"github copilot": "copilot",
392+
"ai assistant": "copilot",
393+
"code completion": "copilot",
394+
"pair programmer": "copilot",
395+
# Actions
396+
"actions": "actions",
397+
"github actions": "actions",
398+
"ci/cd": "actions",
399+
"ci cd": "actions",
400+
"runners": "actions",
401+
"workflows": "actions",
402+
"build minutes": "actions",
403+
# Security
404+
"security": "security",
405+
"advanced security": "security",
406+
"ghas": "security",
407+
"code scanning": "security",
408+
"secret scanning": "security",
409+
# Codespaces
410+
"codespaces": "codespaces",
411+
"dev environments": "codespaces",
412+
"cloud ide": "codespaces",
413+
# Storage / Add-ons
414+
"lfs": "storage",
415+
"git lfs": "storage",
416+
"large file storage": "storage",
417+
"packages": "storage",
418+
"container registry": "storage",
419+
"storage": "storage",
420+
}
421+
172422
# =============================================================================
173423
# Spot VM Tools Configuration (requires Azure authentication)
174424
# =============================================================================
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"""GitHub Pricing package for Azure Pricing MCP Server."""
2+
3+
from .formatters import (
4+
format_github_cost_estimate_response,
5+
format_github_pricing_response,
6+
)
7+
from .handlers import GitHubPricingHandlers
8+
from .tools import get_github_pricing_tool_definitions
9+
10+
__all__ = [
11+
"GitHubPricingHandlers",
12+
"format_github_cost_estimate_response",
13+
"format_github_pricing_response",
14+
"get_github_pricing_tool_definitions",
15+
]

0 commit comments

Comments
 (0)