sample-aws-pricing-calculator-mcp 1.2.7 → 1.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -6,16 +6,15 @@
|
|
|
6
6
|
"status": "verified",
|
|
7
7
|
"traps": [
|
|
8
8
|
"Cognito has THREE pricing tiers selected via the `estimateFor` template id: 'Cognito' (Lite, legacy, includes a 10,000-MAU FREE TIER), 'CognitoEssentials' (paid from MAU 1, the modern default for auth-heavy apps), 'CognitoPlus' (premium with advanced security). Pick the right TEMPLATE ID for the use case — sending Essentials-tier fields under the Lite template silently produces $0 estimates because Lite's pricing engine ignores Essentials-prefixed components and 10K MAU is inside Lite's free tier.",
|
|
9
|
-
"Each tier has its own field-name prefix that must match the chosen template: Lite uses cognito_NumberOfMAUs + cognito_NumberOfTokenRequests; Essentials uses cognito_NumberOfMAUs_Essential + cognitoEssentials_*; Plus uses cognito_NumberOfMAUs_Plus + cognitoPlus_*. Mixing prefixes across tiers, or mixing a tier's fields with another tier's templateId, produces a saved estimate that 'looks editable' but renders $0 because the pricing engine for the active tier has nothing to charge against."
|
|
9
|
+
"Each tier has its own field-name prefix that must match the chosen template: Lite uses cognito_NumberOfMAUs + cognito_NumberOfTokenRequests; Essentials uses cognito_NumberOfMAUs_Essential + cognitoEssentials_*; Plus uses cognito_NumberOfMAUs_Plus + cognitoPlus_*. Mixing prefixes across tiers, or mixing a tier's fields with another tier's templateId, produces a saved estimate that 'looks editable' but renders $0 because the pricing engine for the active tier has nothing to charge against.",
|
|
10
|
+
"Do NOT include Lite-tier fields (optimizationRateTokenRequests, optimizationRateAppClients) in an Essentials config: they belong to the 'Cognito' (Lite) template, so template inference scores Lite and Essentials evenly and falls back to the FIRST template (Lite) — which prices 10K MAU at $0 inside its free tier. Keep the config to Essentials-prefixed fields only so inference resolves CognitoEssentials unambiguously (no templateIdHint needed)."
|
|
10
11
|
],
|
|
11
12
|
"minimalConfig": {
|
|
12
13
|
"region": "us-east-1",
|
|
13
|
-
"description": "Cognito Essentials,
|
|
14
|
-
"cognito_NumberOfMAUs_Essential": "
|
|
15
|
-
"cognitoEssentials_userTokenRequests": "
|
|
16
|
-
"optimizationRateTokenRequests": "0",
|
|
17
|
-
"optimizationRateAppClients": "0"
|
|
14
|
+
"description": "Cognito Essentials, 100K MAU",
|
|
15
|
+
"cognito_NumberOfMAUs_Essential": "100000",
|
|
16
|
+
"cognitoEssentials_userTokenRequests": "1000000"
|
|
18
17
|
},
|
|
19
|
-
"lastVerifiedAt": "2026-
|
|
20
|
-
"verifiedEstimateId": "
|
|
18
|
+
"lastVerifiedAt": "2026-07-23",
|
|
19
|
+
"verifiedEstimateId": "bb4a30d7d17de5bedc2d33390841b782c8c7c4d6"
|
|
21
20
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schema.json",
|
|
3
|
+
"serviceCode": "amazonFSxForLustre",
|
|
4
|
+
"displayName": "Amazon FSx for Lustre",
|
|
5
|
+
"templateId": "persistent",
|
|
6
|
+
"status": "verified",
|
|
7
|
+
"required": [
|
|
8
|
+
{
|
|
9
|
+
"field": "columnFormIPM",
|
|
10
|
+
"hint": "Storage Type and throughput matrix. One row selects Storage type (SSD/HDD), Throughput capacity, and Cache Type. disableCalculation:true — the row rate is a mapping-table (monthly_ipm) lookup, so this MUST be present or storage prices at $0. Selector values may be sent in raw form (e.g. Throughput '1000', Cache 'N/A'); the builder's columnFormRemap translates them to the stored labels ('1000 MBps/TiB', 'No Cache').",
|
|
11
|
+
"shape": "{ value: [{ 'Storage type': {value: 'SSD'|'HDD'}, 'Throughput capacity': {value: '<MBps/TiB>'}, 'Cache Type': {value: 'N/A'|'RC20'} }] }",
|
|
12
|
+
"example": {
|
|
13
|
+
"value": [
|
|
14
|
+
{
|
|
15
|
+
"Storage type": {
|
|
16
|
+
"value": "SSD"
|
|
17
|
+
},
|
|
18
|
+
"Throughput capacity": {
|
|
19
|
+
"value": "1000"
|
|
20
|
+
},
|
|
21
|
+
"Cache Type": {
|
|
22
|
+
"value": "N/A"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"field": "persistent_generated_0",
|
|
30
|
+
"hint": "Storage capacity. The real field id is persistent_generated_0, NOT 'storageCapacity' — but the builder's label→id normalization accepts the friendly 'storageCapacity' key too. fileSize, minimum 1200 GB. Unit must be the size|frequency form 'gb|NA'; a bare 'gb' or a plain number is repaired to 'gb|NA' automatically.",
|
|
31
|
+
"shape": "{ value: '<gb>', unit: 'gb|NA' }",
|
|
32
|
+
"example": {
|
|
33
|
+
"value": "1200",
|
|
34
|
+
"unit": "gb|NA"
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"traps": [
|
|
39
|
+
"The storage field id is persistent_generated_0, not 'storageCapacity'. Sending 'storageCapacity' verbatim (pre-normalization) lands in the saved blob but the engine finds no matching field and prices storage at $0. The label→fieldId normalization in estimate-builder maps the friendly 'storageCapacity' key onto persistent_generated_0 so either form works.",
|
|
40
|
+
"fileSize units must be 'size|frequency' (e.g. 'gb|NA'), not a bare 'gb'. A bare size or a plain number renders $0 until repaired to the full unit.",
|
|
41
|
+
"Without the columnFormIPM Storage-type/throughput row, storage cannot price at all — the row drives the per-GB rate via a mapping-table (monthly_ipm) lookup, and the whole component is disableCalculation:true.",
|
|
42
|
+
"HDD throughput is limited to 12 or 40 MBps/TiB; SSD supports 50/100/125/200/250/500/1000. Off-list throughput rehydrates as the default."
|
|
43
|
+
],
|
|
44
|
+
"minimalConfig": {
|
|
45
|
+
"region": "us-east-1",
|
|
46
|
+
"description": "FSx for Lustre 1200 GB SSD Persistent, 1000 MBps/TiB",
|
|
47
|
+
"columnFormIPM": {
|
|
48
|
+
"value": [
|
|
49
|
+
{
|
|
50
|
+
"Storage type": {
|
|
51
|
+
"value": "SSD"
|
|
52
|
+
},
|
|
53
|
+
"Throughput capacity": {
|
|
54
|
+
"value": "1000"
|
|
55
|
+
},
|
|
56
|
+
"Cache Type": {
|
|
57
|
+
"value": "N/A"
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
"persistent_generated_0": {
|
|
63
|
+
"value": "1200",
|
|
64
|
+
"unit": "gb|NA"
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
"lastVerifiedAt": "2026-07-23",
|
|
68
|
+
"verifiedEstimateId": "f790c38853d5dae8313688fca7457d7bc89b3898"
|
|
69
|
+
}
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
"serviceCode": "awsStepFunctions",
|
|
4
4
|
"displayName": "AWS Step Functions",
|
|
5
5
|
"status": "verified",
|
|
6
|
-
"lastVerifiedAt": "2026-
|
|
7
|
-
"verifiedEstimateId": "
|
|
6
|
+
"lastVerifiedAt": "2026-07-23",
|
|
7
|
+
"verifiedEstimateId": "a8add11e9464c5b4472e11c54495920ef5a620a4",
|
|
8
8
|
"required": [],
|
|
9
9
|
"traps": [
|
|
10
10
|
"awsStepFunctions is a subServiceSelector parent. Call addService('stepFunctionStandard', ...) and/or addService('stepFunctionExpress', ...). EstimateBuilder merges children into a single parent envelope with estimateFor: awsStepFunctionGroups.",
|
|
11
11
|
"Frequency unit MUST be one of perHour, perDay, perMonth — NOT millionPerMonth (which is valid elsewhere in the calculator but silently zeroes Step Functions pricing). Express the volume directly: 1M req/mo is value:'1000000', unit:'perMonth'.",
|
|
12
12
|
"Express workflow memory field 'stateMachineDefinitionSize' uses fileSize shape with unit 'mb|NA' (not 'mb|month'). Valid sizes: mb, gb.",
|
|
13
|
-
"Express workflow duration field ID contains spaces: 'Average duration of workflow'. Value is a plain numeric string
|
|
13
|
+
"Express workflow duration field ID contains spaces: 'Average duration of workflow'. Value is a plain numeric string in MILLISECONDS (min 100, max 300000 = the 5-minute Express Workflow cap), not seconds."
|
|
14
14
|
],
|
|
15
15
|
"subServices": [
|
|
16
16
|
{
|
|
@@ -49,9 +49,9 @@
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"field": "Average duration of workflow",
|
|
52
|
-
"hint": "Duration of each workflow execution in
|
|
52
|
+
"hint": "Duration of each workflow execution in MILLISECONDS (numericInput — plain string). Min 100, max 300000 (5 min, the Express Workflow cap); default 500.",
|
|
53
53
|
"shape": "string",
|
|
54
|
-
"example": "
|
|
54
|
+
"example": "100"
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"field": "stateMachineDefinitionSize",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"value": "10000000",
|
|
87
87
|
"unit": "perMonth"
|
|
88
88
|
},
|
|
89
|
-
"Average duration of workflow": "
|
|
89
|
+
"Average duration of workflow": "100",
|
|
90
90
|
"stateMachineDefinitionSize": {
|
|
91
91
|
"value": "64",
|
|
92
92
|
"unit": "mb|NA"
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
{
|
|
16
16
|
"field": "pricingStrategy",
|
|
17
|
-
"hint": "Pricing model. Accepts shorthand strings for simple cases OR a full object for committed pricing.\n\nShorthand (On-Demand/Spot only): \"ondemand\", \"spot\"\n\nFull object (required for any committed/discounted pricing):\n- EC2 Instance Savings Plans: {\"model\":\"instanceSavings\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n- Compute Savings Plans: {\"model\":\"computeSavings\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n- Standard Reserved Instances (dedicated tenancy only): {\"model\":\"standard\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n- Convertible Reserved Instances (dedicated tenancy only): {\"model\":\"convertible\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n\nValid term values: \"1 Year\", \"3 Year\" (
|
|
17
|
+
"hint": "Pricing model. Accepts shorthand strings for simple cases OR a full object for committed pricing.\n\nShorthand (On-Demand/Spot only): \"ondemand\", \"spot\"\n\nFull object (required for any committed/discounted pricing):\n- EC2 Instance Savings Plans: {\"model\":\"instanceSavings\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n- Compute Savings Plans: {\"model\":\"computeSavings\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n- Standard Reserved Instances (dedicated tenancy only): {\"model\":\"standard\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n- Convertible Reserved Instances (dedicated tenancy only): {\"model\":\"convertible\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}\n\nValid term values: \"1 Year\", \"3 Year\" (case-insensitive; shorthand \"1yr\"/\"3yr\" also accepted). Term defaults to \"3 Year\" (the cheaper, deeper-commitment Savings Plan) when omitted or unrecognized — pass \"1 Year\" explicitly if you do not want the 3-year commitment.\nValid upfrontPayment values: \"None\", \"Partial\", \"All\" (exact case)\n\nCRITICAL: Do NOT use shorthand \"reserved\" or \"instanceSavings\" for committed pricing — these may silently fall back to On-Demand or produce $0 costs. Always use the full object format for any non-OnDemand, non-Spot pricing. EstimateBuilder normalizes via lib/ec2.js.",
|
|
18
18
|
"enum": [
|
|
19
19
|
"ondemand",
|
|
20
20
|
"reserved",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"traps": [
|
|
30
30
|
"Use serviceCode 'ec2Enhancement' with templateId 'template'. The legacy (eC2Next, quickEstimate) format saves cleanly but renders Read-only — the calculator cannot rehydrate it. EstimateBuilder forces this transformation automatically; do not bypass it.",
|
|
31
31
|
"Reserved Instances (standard, convertible) are HIDDEN under shared tenancy. For shared tenancy with committed pricing, ALWAYS use the full object format: {\"model\":\"instanceSavings\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"} or {\"model\":\"computeSavings\",\"term\":\"1 Year\",\"upfrontPayment\":\"None\"}. The shorthand \"reserved\" and \"instanceSavings\" strings are unreliable and may produce On-Demand pricing or $0 costs. Real Standard/Convertible RIs require tenancy:\"dedicated\" or \"host\".",
|
|
32
|
-
"pricingStrategy term
|
|
32
|
+
"pricingStrategy term accepts '1 Year' or '3 Year' (case-insensitive; shorthand '1yr'/'3yr' also works). Anything else — including an omitted term — defaults to '3 Year'. Pass '1 Year' explicitly when you do not want the 3-year commitment.",
|
|
33
33
|
"pricingStrategy upfrontPayment values: 'None', 'Partial', 'All'. EstimateBuilder accepts shorthand 'No' and converts to 'None'.",
|
|
34
34
|
"The calculator silently demands tenancy, workload, workloadSelection, dataTransferForEC2, detailedMonitoringCheckbox, and ec2AdvancedPricingMetrics — even though the PCT does not mark them validations.required. EstimateBuilder injects all of these via lib/ec2.js#transformConfig.",
|
|
35
35
|
"utilization is HIDDEN inside the pricingStrategy component and does NOT appear in get_service_fields' field list. To set utilization, pass top-level utilization: 'N' (string, 1–100); EstimateBuilder routes it into pricingStrategy.value.utilizationValue.",
|