oci-pricing-mcp 1.2.1

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.
Files changed (49) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +24 -0
  3. package/README.md +299 -0
  4. package/dist/data/cache.d.ts +50 -0
  5. package/dist/data/cache.d.ts.map +1 -0
  6. package/dist/data/cache.js +90 -0
  7. package/dist/data/cache.js.map +1 -0
  8. package/dist/data/fetcher.d.ts +96 -0
  9. package/dist/data/fetcher.d.ts.map +1 -0
  10. package/dist/data/fetcher.js +232 -0
  11. package/dist/data/fetcher.js.map +1 -0
  12. package/dist/data/pricing-data.json +6162 -0
  13. package/dist/index.d.ts +21 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +582 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/tools/calculator.d.ts +17 -0
  18. package/dist/tools/calculator.d.ts.map +1 -0
  19. package/dist/tools/calculator.js +318 -0
  20. package/dist/tools/calculator.js.map +1 -0
  21. package/dist/tools/compute.d.ts +58 -0
  22. package/dist/tools/compute.d.ts.map +1 -0
  23. package/dist/tools/compute.js +172 -0
  24. package/dist/tools/compute.js.map +1 -0
  25. package/dist/tools/core.d.ts +70 -0
  26. package/dist/tools/core.d.ts.map +1 -0
  27. package/dist/tools/core.js +113 -0
  28. package/dist/tools/core.js.map +1 -0
  29. package/dist/tools/database.d.ts +66 -0
  30. package/dist/tools/database.d.ts.map +1 -0
  31. package/dist/tools/database.js +212 -0
  32. package/dist/tools/database.js.map +1 -0
  33. package/dist/tools/kubernetes.d.ts +65 -0
  34. package/dist/tools/kubernetes.d.ts.map +1 -0
  35. package/dist/tools/kubernetes.js +226 -0
  36. package/dist/tools/kubernetes.js.map +1 -0
  37. package/dist/tools/networking.d.ts +63 -0
  38. package/dist/tools/networking.d.ts.map +1 -0
  39. package/dist/tools/networking.js +248 -0
  40. package/dist/tools/networking.js.map +1 -0
  41. package/dist/tools/storage.d.ts +64 -0
  42. package/dist/tools/storage.d.ts.map +1 -0
  43. package/dist/tools/storage.js +175 -0
  44. package/dist/tools/storage.js.map +1 -0
  45. package/dist/types.d.ts +162 -0
  46. package/dist/types.d.ts.map +1 -0
  47. package/dist/types.js +5 -0
  48. package/dist/types.js.map +1 -0
  49. package/package.json +53 -0
@@ -0,0 +1,318 @@
1
+ /**
2
+ * OCI Monthly Cost Calculator
3
+ */
4
+ import { getComputePricing, getStoragePricing, getDatabasePricing, getNetworkingPricing, getFreeTier, } from '../data/fetcher.js';
5
+ const HOURS_PER_MONTH = 730; // Average hours in a month
6
+ /**
7
+ * Calculate monthly cost for a given configuration
8
+ */
9
+ export function calculateMonthlyCost(input) {
10
+ const breakdown = [];
11
+ const notes = [];
12
+ let totalMonthly = 0;
13
+ // Calculate compute costs
14
+ if (input.compute) {
15
+ const computePricing = getComputePricing();
16
+ const shape = computePricing.find((c) => c.shapeFamily?.toLowerCase() === input.compute?.shape.toLowerCase());
17
+ if (shape) {
18
+ const hoursPerMonth = input.compute.hoursPerMonth || HOURS_PER_MONTH;
19
+ // OCPU cost
20
+ const ocpuCost = shape.ocpuPrice * input.compute.ocpus * hoursPerMonth;
21
+ breakdown.push({
22
+ category: 'Compute',
23
+ item: `${shape.shapeFamily} - OCPUs`,
24
+ quantity: input.compute.ocpus,
25
+ unit: 'OCPU',
26
+ unitPrice: shape.ocpuPrice,
27
+ monthlyTotal: ocpuCost,
28
+ });
29
+ totalMonthly += ocpuCost;
30
+ // Memory cost
31
+ const memoryCost = shape.memoryPricePerGB * input.compute.memoryGB * hoursPerMonth;
32
+ breakdown.push({
33
+ category: 'Compute',
34
+ item: `${shape.shapeFamily} - Memory`,
35
+ quantity: input.compute.memoryGB,
36
+ unit: 'GB',
37
+ unitPrice: shape.memoryPricePerGB,
38
+ monthlyTotal: memoryCost,
39
+ });
40
+ totalMonthly += memoryCost;
41
+ // Check memory-to-OCPU ratio
42
+ const ratio = input.compute.memoryGB / input.compute.ocpus;
43
+ if (shape.memoryPerOCPURatio && ratio > shape.memoryPerOCPURatio) {
44
+ notes.push(`Warning: Memory-to-OCPU ratio (${ratio}) exceeds maximum (${shape.memoryPerOCPURatio}). Configuration may not be valid.`);
45
+ }
46
+ if (hoursPerMonth < HOURS_PER_MONTH) {
47
+ notes.push(`Compute calculated for ${hoursPerMonth} hours/month (not 24/7).`);
48
+ }
49
+ }
50
+ else {
51
+ notes.push(`Warning: Compute shape "${input.compute.shape}" not found. Compute costs not calculated.`);
52
+ }
53
+ }
54
+ // Calculate storage costs
55
+ if (input.storage) {
56
+ const storagePricing = getStoragePricing();
57
+ // Block Volume
58
+ if (input.storage.blockVolumeGB) {
59
+ const blockPrice = storagePricing.find((s) => s.type === 'block-storage-balanced');
60
+ if (blockPrice) {
61
+ const cost = blockPrice.pricePerUnit * input.storage.blockVolumeGB;
62
+ breakdown.push({
63
+ category: 'Storage',
64
+ item: 'Block Volume (Balanced)',
65
+ quantity: input.storage.blockVolumeGB,
66
+ unit: 'GB',
67
+ unitPrice: blockPrice.pricePerUnit,
68
+ monthlyTotal: cost,
69
+ });
70
+ totalMonthly += cost;
71
+ }
72
+ }
73
+ // Object Storage
74
+ if (input.storage.objectStorageGB) {
75
+ const objectPrice = storagePricing.find((s) => s.type === 'object-storage');
76
+ if (objectPrice) {
77
+ const cost = objectPrice.pricePerUnit * input.storage.objectStorageGB;
78
+ breakdown.push({
79
+ category: 'Storage',
80
+ item: 'Object Storage (Standard)',
81
+ quantity: input.storage.objectStorageGB,
82
+ unit: 'GB',
83
+ unitPrice: objectPrice.pricePerUnit,
84
+ monthlyTotal: cost,
85
+ });
86
+ totalMonthly += cost;
87
+ }
88
+ }
89
+ // Archive Storage
90
+ if (input.storage.archiveStorageGB) {
91
+ const archivePrice = storagePricing.find((s) => s.type === 'object-storage-archive');
92
+ if (archivePrice) {
93
+ const cost = archivePrice.pricePerUnit * input.storage.archiveStorageGB;
94
+ breakdown.push({
95
+ category: 'Storage',
96
+ item: 'Object Storage (Archive)',
97
+ quantity: input.storage.archiveStorageGB,
98
+ unit: 'GB',
99
+ unitPrice: archivePrice.pricePerUnit,
100
+ monthlyTotal: cost,
101
+ });
102
+ totalMonthly += cost;
103
+ }
104
+ }
105
+ // File Storage
106
+ if (input.storage.fileStorageGB) {
107
+ const filePrice = storagePricing.find((s) => s.type === 'file-storage');
108
+ if (filePrice) {
109
+ const cost = filePrice.pricePerUnit * input.storage.fileStorageGB;
110
+ breakdown.push({
111
+ category: 'Storage',
112
+ item: 'File Storage',
113
+ quantity: input.storage.fileStorageGB,
114
+ unit: 'GB',
115
+ unitPrice: filePrice.pricePerUnit,
116
+ monthlyTotal: cost,
117
+ });
118
+ totalMonthly += cost;
119
+ }
120
+ }
121
+ }
122
+ // Calculate database costs
123
+ if (input.database) {
124
+ const dbPricing = getDatabasePricing();
125
+ const licenseType = input.database.licenseIncluded !== false ? '' : '-byol';
126
+ const dbTypeKey = `autonomous-db-${input.database.type.split('-').pop()}${licenseType}`;
127
+ const dbPrice = dbPricing.find((d) => d.type.toLowerCase().includes(input.database?.type.toLowerCase() || '') ||
128
+ d.databaseType === input.database?.type);
129
+ if (dbPrice && input.database.ecpus) {
130
+ // ECPU cost
131
+ const ecpuPrice = dbPrice.ecpuPrice || dbPrice.pricePerUnit;
132
+ const ecpuCost = ecpuPrice * input.database.ecpus * HOURS_PER_MONTH;
133
+ breakdown.push({
134
+ category: 'Database',
135
+ item: `${dbPrice.description} - Compute`,
136
+ quantity: input.database.ecpus,
137
+ unit: 'ECPU',
138
+ unitPrice: ecpuPrice,
139
+ monthlyTotal: ecpuCost,
140
+ });
141
+ totalMonthly += ecpuCost;
142
+ // Storage cost
143
+ if (input.database.storageGB) {
144
+ const storagePrice = dbPrice.storagePrice || 0.0255;
145
+ const storageCost = storagePrice * input.database.storageGB;
146
+ breakdown.push({
147
+ category: 'Database',
148
+ item: `${dbPrice.description} - Storage`,
149
+ quantity: input.database.storageGB,
150
+ unit: 'GB',
151
+ unitPrice: storagePrice,
152
+ monthlyTotal: storageCost,
153
+ });
154
+ totalMonthly += storageCost;
155
+ }
156
+ if (input.database.licenseIncluded === false) {
157
+ notes.push('Database costs calculated with BYOL (Bring Your Own License).');
158
+ }
159
+ }
160
+ else {
161
+ notes.push(`Warning: Database type "${input.database.type}" not found or ECPUs not specified.`);
162
+ }
163
+ }
164
+ // Calculate networking costs
165
+ if (input.networking) {
166
+ const netPricing = getNetworkingPricing();
167
+ // Load Balancer
168
+ if (input.networking.loadBalancerBandwidthMbps) {
169
+ const lbPrice = netPricing.find((n) => n.type === 'flexible-load-balancer');
170
+ const bwPrice = netPricing.find((n) => n.type === 'flexible-load-balancer-bandwidth');
171
+ if (lbPrice && bwPrice) {
172
+ // Base LB cost
173
+ const lbCost = lbPrice.pricePerUnit * HOURS_PER_MONTH;
174
+ breakdown.push({
175
+ category: 'Networking',
176
+ item: 'Flexible Load Balancer',
177
+ quantity: 1,
178
+ unit: 'instance',
179
+ unitPrice: lbPrice.pricePerUnit,
180
+ monthlyTotal: lbCost,
181
+ });
182
+ totalMonthly += lbCost;
183
+ // Bandwidth cost
184
+ const bwCost = bwPrice.pricePerUnit * input.networking.loadBalancerBandwidthMbps * HOURS_PER_MONTH;
185
+ breakdown.push({
186
+ category: 'Networking',
187
+ item: 'Load Balancer Bandwidth',
188
+ quantity: input.networking.loadBalancerBandwidthMbps,
189
+ unit: 'Mbps',
190
+ unitPrice: bwPrice.pricePerUnit,
191
+ monthlyTotal: bwCost,
192
+ });
193
+ totalMonthly += bwCost;
194
+ notes.push('First LB and 10 Mbps free for paid accounts (not reflected in estimate).');
195
+ }
196
+ }
197
+ // Outbound Data Transfer
198
+ if (input.networking.outboundDataGB) {
199
+ const egressPrice = netPricing.find((n) => n.type === 'data-egress');
200
+ if (egressPrice) {
201
+ // First 10 TB (10,240 GB) is free
202
+ const freeGB = egressPrice.includedDataGB || 10240;
203
+ const billableGB = Math.max(0, input.networking.outboundDataGB - freeGB);
204
+ if (billableGB > 0) {
205
+ const egressCost = egressPrice.pricePerUnit * billableGB;
206
+ breakdown.push({
207
+ category: 'Networking',
208
+ item: 'Outbound Data Transfer',
209
+ quantity: billableGB,
210
+ unit: 'GB',
211
+ unitPrice: egressPrice.pricePerUnit,
212
+ monthlyTotal: egressCost,
213
+ });
214
+ totalMonthly += egressCost;
215
+ }
216
+ notes.push(`First ${freeGB / 1024} TB of outbound data is free per month. You specified ${input.networking.outboundDataGB} GB.`);
217
+ }
218
+ }
219
+ }
220
+ // Add free tier notes
221
+ const freeTier = getFreeTier();
222
+ if (freeTier) {
223
+ notes.push('OCI Always Free tier may reduce costs further (4 A1 OCPUs + 24GB RAM, 200GB block storage, etc.).');
224
+ }
225
+ return {
226
+ breakdown,
227
+ totalMonthly: Math.round(totalMonthly * 100) / 100, // Round to 2 decimal places
228
+ currency: 'USD',
229
+ region: input.region || 'us-ashburn-1',
230
+ notes,
231
+ };
232
+ }
233
+ export function quickEstimate(params) {
234
+ const presets = {
235
+ 'small-web-app': {
236
+ compute: {
237
+ shape: 'VM.Standard.E4.Flex',
238
+ ocpus: 1,
239
+ memoryGB: 8,
240
+ },
241
+ storage: {
242
+ blockVolumeGB: 100,
243
+ objectStorageGB: 50,
244
+ },
245
+ networking: {
246
+ loadBalancerBandwidthMbps: 10,
247
+ outboundDataGB: 500,
248
+ },
249
+ },
250
+ 'medium-api-server': {
251
+ compute: {
252
+ shape: 'VM.Standard.E5.Flex',
253
+ ocpus: 4,
254
+ memoryGB: 32,
255
+ },
256
+ storage: {
257
+ blockVolumeGB: 500,
258
+ objectStorageGB: 200,
259
+ },
260
+ networking: {
261
+ loadBalancerBandwidthMbps: 100,
262
+ outboundDataGB: 2000,
263
+ },
264
+ },
265
+ 'large-database': {
266
+ compute: {
267
+ shape: 'VM.Standard.E5.Flex',
268
+ ocpus: 8,
269
+ memoryGB: 128,
270
+ },
271
+ storage: {
272
+ blockVolumeGB: 2000,
273
+ },
274
+ database: {
275
+ type: 'autonomous-transaction-processing',
276
+ ecpus: 4,
277
+ storageGB: 1000,
278
+ licenseIncluded: true,
279
+ },
280
+ },
281
+ 'ml-training': {
282
+ compute: {
283
+ shape: 'BM.GPU.A100-v2.8',
284
+ ocpus: 128,
285
+ memoryGB: 2048,
286
+ hoursPerMonth: 160, // Part-time usage
287
+ },
288
+ storage: {
289
+ blockVolumeGB: 5000,
290
+ objectStorageGB: 10000,
291
+ },
292
+ },
293
+ 'kubernetes-cluster': {
294
+ compute: {
295
+ shape: 'VM.Standard.E5.Flex',
296
+ ocpus: 12, // 3 nodes x 4 OCPUs
297
+ memoryGB: 96, // 3 nodes x 32 GB
298
+ },
299
+ storage: {
300
+ blockVolumeGB: 300, // 3 nodes x 100 GB
301
+ objectStorageGB: 500,
302
+ },
303
+ networking: {
304
+ loadBalancerBandwidthMbps: 100,
305
+ outboundDataGB: 5000,
306
+ },
307
+ },
308
+ };
309
+ const config = presets[params.preset];
310
+ if (!config) {
311
+ throw new Error(`Unknown preset: ${params.preset}. Valid presets: ${Object.keys(presets).join(', ')}`);
312
+ }
313
+ config.region = params.region;
314
+ const result = calculateMonthlyCost(config);
315
+ result.notes.unshift(`Preset: ${params.preset}`);
316
+ return result;
317
+ }
318
+ //# sourceMappingURL=calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator.js","sourceRoot":"","sources":["../../src/tools/calculator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * OCI Compute Pricing Tools
3
+ */
4
+ export interface ListComputeShapesParams {
5
+ family?: string;
6
+ type?: string;
7
+ maxOcpuPrice?: number;
8
+ }
9
+ export interface ComputeShapeInfo {
10
+ shapeFamily: string;
11
+ type: string;
12
+ description: string;
13
+ ocpuPrice: number;
14
+ memoryPricePerGB: number;
15
+ instancePricePerHour?: number;
16
+ totalPriceExample: string;
17
+ ocpuRange: string;
18
+ memoryRange: string;
19
+ gpuCount?: number;
20
+ localStorageGB?: number;
21
+ notes?: string;
22
+ }
23
+ /**
24
+ * List available OCI compute shapes with pricing
25
+ */
26
+ export declare function listComputeShapes(params?: ListComputeShapesParams): {
27
+ shapes: ComputeShapeInfo[];
28
+ totalCount: number;
29
+ lastUpdated: string;
30
+ freeTierNote: string;
31
+ tips: string[];
32
+ };
33
+ /**
34
+ * Get details for a specific compute shape
35
+ */
36
+ export declare function getComputeShapeDetails(shapeFamily: string): {
37
+ shape: ComputeShapeInfo | null;
38
+ monthlyEstimates: Array<{
39
+ config: string;
40
+ monthlyUSD: number;
41
+ }>;
42
+ recommendations: string[];
43
+ };
44
+ /**
45
+ * Compare compute shapes
46
+ */
47
+ export declare function compareComputeShapes(shapes: string[]): {
48
+ comparison: Array<{
49
+ shapeFamily: string;
50
+ ocpuPrice: number;
51
+ memoryPricePerGB: number;
52
+ monthly4ocpu32gb: number;
53
+ maxOCPU: number | null;
54
+ maxMemoryGB: number | null;
55
+ }>;
56
+ recommendation: string;
57
+ };
58
+ //# sourceMappingURL=compute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../../src/tools/compute.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,uBAA4B,GAAG;IACvE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAkFA;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG;IAC3D,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CA0EA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG;IACtD,UAAU,EAAE,KAAK,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,MAAM,CAAC;QACzB,gBAAgB,EAAE,MAAM,CAAC;QACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KAC5B,CAAC,CAAC;IACH,cAAc,EAAE,MAAM,CAAC;CACxB,CAyCA"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * OCI Compute Pricing Tools
3
+ */
4
+ import { getComputePricing, getLastUpdated, getFreeTier } from '../data/fetcher.js';
5
+ /**
6
+ * List available OCI compute shapes with pricing
7
+ */
8
+ export function listComputeShapes(params = {}) {
9
+ let shapes = getComputePricing();
10
+ // Filter by family
11
+ if (params.family) {
12
+ const familyFilter = params.family.toLowerCase();
13
+ shapes = shapes.filter((s) => s.shapeFamily?.toLowerCase().includes(familyFilter) ||
14
+ s.type?.toLowerCase().includes(familyFilter));
15
+ }
16
+ // Filter by type
17
+ if (params.type) {
18
+ const typeFilter = params.type.toLowerCase();
19
+ shapes = shapes.filter((s) => s.type?.toLowerCase().includes(typeFilter));
20
+ }
21
+ // Filter by max price
22
+ if (params.maxOcpuPrice !== undefined) {
23
+ shapes = shapes.filter((s) => s.ocpuPrice <= params.maxOcpuPrice);
24
+ }
25
+ // Transform to user-friendly format
26
+ const shapeInfos = shapes.map((s) => {
27
+ // Check if this is a fixed-instance shape (bare metal, GPU) vs flexible
28
+ const isFixedInstance = s.unit === 'instance per hour' || (s.ocpuPrice === 0 && s.pricePerUnit > 0);
29
+ let totalPriceExample;
30
+ let instancePricePerHour;
31
+ if (isFixedInstance) {
32
+ // Fixed instance pricing (bare metal, GPU)
33
+ instancePricePerHour = s.pricePerUnit;
34
+ const monthlyPrice = s.pricePerUnit * 730;
35
+ totalPriceExample = `$${s.pricePerUnit.toFixed(2)}/hr = ~$${monthlyPrice.toFixed(2)}/month (fixed instance)`;
36
+ }
37
+ else {
38
+ // Flexible pricing (OCPU + memory)
39
+ const exampleOcpus = Math.min(4, s.maxOCPU || 4);
40
+ const exampleMemory = Math.min(32, s.maxMemoryGB || 32);
41
+ const exampleMonthly = (s.ocpuPrice * exampleOcpus + s.memoryPricePerGB * exampleMemory) * 730;
42
+ totalPriceExample = `~$${exampleMonthly.toFixed(2)}/month for ${exampleOcpus} OCPU, ${exampleMemory} GB RAM`;
43
+ }
44
+ return {
45
+ shapeFamily: s.shapeFamily || s.type,
46
+ type: s.type,
47
+ description: s.description,
48
+ ocpuPrice: s.ocpuPrice,
49
+ memoryPricePerGB: s.memoryPricePerGB,
50
+ instancePricePerHour,
51
+ totalPriceExample,
52
+ ocpuRange: s.minOCPU && s.maxOCPU ? `${s.minOCPU}-${s.maxOCPU} OCPUs` : 'N/A',
53
+ memoryRange: s.minMemoryGB && s.maxMemoryGB ? `${s.minMemoryGB}-${s.maxMemoryGB} GB` : 'N/A',
54
+ gpuCount: s.gpuCount,
55
+ localStorageGB: s.localStorageGB,
56
+ notes: s.notes,
57
+ };
58
+ });
59
+ // Get free tier info
60
+ const freeTier = getFreeTier();
61
+ const freeTierNote = freeTier?.compute
62
+ ? `Always Free: ${freeTier.compute.arm}, ${freeTier.compute.amd}`
63
+ : 'Always Free tier available';
64
+ return {
65
+ shapes: shapeInfos,
66
+ totalCount: shapeInfos.length,
67
+ lastUpdated: getLastUpdated(),
68
+ freeTierNote,
69
+ tips: [
70
+ 'VM.Standard.A1.Flex (Arm) offers best value at $0.01/OCPU/hr',
71
+ 'VM.Standard.E5.Flex is recommended for new x86 deployments (21% better perf vs E4)',
72
+ '1 OCPU = 2 vCPUs for x86 architectures',
73
+ 'Preemptible instances are 50% cheaper for fault-tolerant workloads',
74
+ 'Memory pricing is separate from OCPU pricing for Flex shapes',
75
+ ],
76
+ };
77
+ }
78
+ /**
79
+ * Get details for a specific compute shape
80
+ */
81
+ export function getComputeShapeDetails(shapeFamily) {
82
+ const shapes = getComputePricing();
83
+ const shape = shapes.find((s) => s.shapeFamily?.toLowerCase() === shapeFamily.toLowerCase());
84
+ if (!shape) {
85
+ return {
86
+ shape: null,
87
+ monthlyEstimates: [],
88
+ recommendations: [`Shape "${shapeFamily}" not found. Use list_compute_shapes to see available shapes.`],
89
+ };
90
+ }
91
+ const shapeInfo = {
92
+ shapeFamily: shape.shapeFamily || shape.type,
93
+ type: shape.type,
94
+ description: shape.description,
95
+ ocpuPrice: shape.ocpuPrice,
96
+ memoryPricePerGB: shape.memoryPricePerGB,
97
+ totalPriceExample: '',
98
+ ocpuRange: shape.minOCPU && shape.maxOCPU ? `${shape.minOCPU}-${shape.maxOCPU} OCPUs` : 'N/A',
99
+ memoryRange: shape.minMemoryGB && shape.maxMemoryGB ? `${shape.minMemoryGB}-${shape.maxMemoryGB} GB` : 'N/A',
100
+ gpuCount: shape.gpuCount,
101
+ localStorageGB: shape.localStorageGB,
102
+ notes: shape.notes,
103
+ };
104
+ // Calculate various monthly estimates
105
+ const configs = [
106
+ { ocpus: 1, memory: 8, name: '1 OCPU, 8 GB' },
107
+ { ocpus: 2, memory: 16, name: '2 OCPU, 16 GB' },
108
+ { ocpus: 4, memory: 32, name: '4 OCPU, 32 GB' },
109
+ { ocpus: 8, memory: 64, name: '8 OCPU, 64 GB' },
110
+ { ocpus: 16, memory: 128, name: '16 OCPU, 128 GB' },
111
+ ];
112
+ const monthlyEstimates = configs
113
+ .filter((c) => (!shape.maxOCPU || c.ocpus <= shape.maxOCPU) &&
114
+ (!shape.maxMemoryGB || c.memory <= shape.maxMemoryGB))
115
+ .map((c) => ({
116
+ config: c.name,
117
+ monthlyUSD: Math.round((shape.ocpuPrice * c.ocpus + shape.memoryPricePerGB * c.memory) * 730 * 100) / 100,
118
+ }));
119
+ // Generate recommendations
120
+ const recommendations = [];
121
+ if (shape.shapeFamily?.includes('A1')) {
122
+ recommendations.push('Best value for Arm-compatible workloads (Linux, containers, etc.)');
123
+ recommendations.push('Includes in Always Free tier (4 OCPUs + 24 GB)');
124
+ }
125
+ else if (shape.shapeFamily?.includes('E5')) {
126
+ recommendations.push('Recommended for new x86 deployments');
127
+ recommendations.push('21%+ better price-performance vs E4');
128
+ }
129
+ else if (shape.shapeFamily?.includes('E4')) {
130
+ recommendations.push('Previous generation - consider E5 for new workloads');
131
+ recommendations.push('Still widely supported and stable');
132
+ }
133
+ else if (shape.type?.includes('gpu')) {
134
+ recommendations.push('For ML/AI training and inference workloads');
135
+ recommendations.push('Consider preemptible instances for training (50% savings)');
136
+ }
137
+ return {
138
+ shape: shapeInfo,
139
+ monthlyEstimates,
140
+ recommendations,
141
+ };
142
+ }
143
+ /**
144
+ * Compare compute shapes
145
+ */
146
+ export function compareComputeShapes(shapes) {
147
+ const allShapes = getComputePricing();
148
+ const comparison = shapes
149
+ .map((shapeFamily) => {
150
+ const shape = allShapes.find((s) => s.shapeFamily?.toLowerCase() === shapeFamily.toLowerCase());
151
+ if (!shape)
152
+ return null;
153
+ return {
154
+ shapeFamily: shape.shapeFamily || shape.type,
155
+ ocpuPrice: shape.ocpuPrice,
156
+ memoryPricePerGB: shape.memoryPricePerGB,
157
+ monthly4ocpu32gb: Math.round((shape.ocpuPrice * 4 + shape.memoryPricePerGB * 32) * 730 * 100) / 100,
158
+ maxOCPU: shape.maxOCPU || null,
159
+ maxMemoryGB: shape.maxMemoryGB || null,
160
+ };
161
+ })
162
+ .filter(Boolean);
163
+ // Find cheapest
164
+ const cheapest = comparison.reduce((min, c) => (c.monthly4ocpu32gb < min.monthly4ocpu32gb ? c : min), comparison[0]);
165
+ return {
166
+ comparison,
167
+ recommendation: cheapest
168
+ ? `${cheapest.shapeFamily} is most cost-effective at $${cheapest.monthly4ocpu32gb}/month for 4 OCPU, 32 GB`
169
+ : 'No shapes found for comparison',
170
+ };
171
+ }
172
+ //# sourceMappingURL=compute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute.js","sourceRoot":"","sources":["../../src/tools/compute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Core OCI Pricing Tools
3
+ * get_pricing, list_services, compare_regions
4
+ */
5
+ import type { OCIServiceCategory, PricingItem, RegionComparisonResult } from '../types.js';
6
+ /**
7
+ * Get pricing for a specific OCI resource
8
+ */
9
+ export interface GetPricingParams {
10
+ service: 'compute' | 'storage' | 'database' | 'networking' | 'kubernetes';
11
+ type?: string;
12
+ region?: string;
13
+ }
14
+ export declare function getPricing(params: GetPricingParams): {
15
+ items: PricingItem[];
16
+ service: string;
17
+ type?: string;
18
+ region?: string;
19
+ lastUpdated: string;
20
+ note: string;
21
+ };
22
+ /**
23
+ * List all OCI services with pricing categories
24
+ */
25
+ export interface ListServicesParams {
26
+ category?: OCIServiceCategory;
27
+ }
28
+ export declare function listServices(params?: ListServicesParams): {
29
+ services: Array<{
30
+ name: string;
31
+ category: string;
32
+ description: string;
33
+ pricingTypes: string[];
34
+ documentationUrl: string;
35
+ }>;
36
+ categories: string[];
37
+ totalCount: number;
38
+ lastUpdated: string;
39
+ };
40
+ /**
41
+ * Compare pricing for a resource across regions
42
+ * Note: OCI has consistent pricing across commercial regions
43
+ */
44
+ export interface CompareRegionsParams {
45
+ service: 'compute' | 'storage' | 'database' | 'networking' | 'kubernetes';
46
+ type: string;
47
+ }
48
+ export declare function compareRegions(params: CompareRegionsParams): {
49
+ result: RegionComparisonResult | null;
50
+ regions: Array<{
51
+ name: string;
52
+ location: string;
53
+ type: string;
54
+ }>;
55
+ note: string;
56
+ lastUpdated: string;
57
+ };
58
+ /**
59
+ * List all available OCI regions
60
+ */
61
+ export declare function listRegions(): {
62
+ regions: Array<{
63
+ name: string;
64
+ location: string;
65
+ type: string;
66
+ }>;
67
+ commercialCount: number;
68
+ totalCount: number;
69
+ };
70
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/tools/core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE3F;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG;IACpD,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd,CA+CA;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,kBAAuB,GAAG;IAC7D,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,CAmBA;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,CAAC;IAC1E,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG;IAC5D,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACtC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB,CA0CA;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CASA"}