ai-cost-analyzer 1.0.0 → 1.1.0

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.

Potentially problematic release.


This version of ai-cost-analyzer might be problematic. Click here for more details.

package/dist/index.js CHANGED
@@ -15,6 +15,7 @@ import { handleEstimateSavings } from "./tools/savings.js";
15
15
  import { handleOptimizePrompt } from "./tools/optimize.js";
16
16
  import { handleCompareModels } from "./tools/compare.js";
17
17
  import { handleGetPricing } from "./tools/pricing.js";
18
+ import { checkLicense } from "./license.js";
18
19
  // ---------------------------------------------------------------------------
19
20
  // Zod schemas for tool inputs
20
21
  // ---------------------------------------------------------------------------
@@ -40,11 +41,17 @@ const server = new McpServer({
40
41
  server.tool("analyze_usage", "Analyze AI API usage data and return cost breakdowns by model, average cost per request, token waste estimation, and daily/weekly trends.", {
41
42
  usage_data: z.array(UsageRecordSchema).describe("Array of API usage records with model, tokens, and timestamps"),
42
43
  }, async ({ usage_data }) => {
44
+ const license = checkLicense("ai-cost-analyzer");
45
+ if (!license.valid) {
46
+ return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
47
+ }
43
48
  try {
44
49
  const result = handleAnalyzeUsage(usage_data);
45
- return {
46
- content: [{ type: "text", text: result }],
47
- };
50
+ const content = [{ type: "text", text: result }];
51
+ if (license.trial && license.message) {
52
+ content.push({ type: "text", text: "\n\n" + license.message });
53
+ }
54
+ return { content };
48
55
  }
49
56
  catch (err) {
50
57
  return {
@@ -63,11 +70,17 @@ server.tool("estimate_savings", "Estimate potential monthly savings from prompt
63
70
  usage_data: z.array(UsageRecordSchema).describe("Array of API usage records representing current usage patterns"),
64
71
  monthly_multiplier: z.number().min(1).optional().describe("If the usage_data is a sample, multiply costs by this factor to project monthly totals (default: 1)"),
65
72
  }, async ({ usage_data, monthly_multiplier }) => {
73
+ const license = checkLicense("ai-cost-analyzer");
74
+ if (!license.valid) {
75
+ return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
76
+ }
66
77
  try {
67
78
  const result = handleEstimateSavings(usage_data, monthly_multiplier);
68
- return {
69
- content: [{ type: "text", text: result }],
70
- };
79
+ const content = [{ type: "text", text: result }];
80
+ if (license.trial && license.message) {
81
+ content.push({ type: "text", text: "\n\n" + license.message });
82
+ }
83
+ return { content };
71
84
  }
72
85
  catch (err) {
73
86
  return {
@@ -88,11 +101,17 @@ server.tool("optimize_prompt", "Analyze a system prompt and tool definitions, re
88
101
  requests_per_month: z.number().int().min(1).optional().describe("Estimated requests per month for cost projection (default: 10,000)"),
89
102
  model: z.string().optional().describe("Model name for pricing calculation (default: claude-sonnet)"),
90
103
  }, async ({ system_prompt, tool_definitions, requests_per_month, model }) => {
104
+ const license = checkLicense("ai-cost-analyzer");
105
+ if (!license.valid) {
106
+ return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
107
+ }
91
108
  try {
92
109
  const result = handleOptimizePrompt(system_prompt, tool_definitions, requests_per_month, model);
93
- return {
94
- content: [{ type: "text", text: result }],
95
- };
110
+ const content = [{ type: "text", text: result }];
111
+ if (license.trial && license.message) {
112
+ content.push({ type: "text", text: "\n\n" + license.message });
113
+ }
114
+ return { content };
96
115
  }
97
116
  catch (err) {
98
117
  return {
@@ -112,11 +131,17 @@ server.tool("compare_models", "Compare cost and quality tradeoffs across Claude,
112
131
  estimated_input_tokens: z.number().int().min(1).optional().describe("Override estimated input tokens per request"),
113
132
  estimated_output_tokens: z.number().int().min(1).optional().describe("Override estimated output tokens per request"),
114
133
  }, async ({ task_description, estimated_input_tokens, estimated_output_tokens }) => {
134
+ const license = checkLicense("ai-cost-analyzer");
135
+ if (!license.valid) {
136
+ return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
137
+ }
115
138
  try {
116
139
  const result = handleCompareModels(task_description, estimated_input_tokens, estimated_output_tokens);
117
- return {
118
- content: [{ type: "text", text: result }],
119
- };
140
+ const content = [{ type: "text", text: result }];
141
+ if (license.trial && license.message) {
142
+ content.push({ type: "text", text: "\n\n" + license.message });
143
+ }
144
+ return { content };
120
145
  }
121
146
  catch (err) {
122
147
  return {
@@ -132,11 +157,17 @@ server.tool("compare_models", "Compare cost and quality tradeoffs across Claude,
132
157
  // Tool: get_pricing
133
158
  // ---------------------------------------------------------------------------
134
159
  server.tool("get_pricing", "Return current pricing for all major LLM APIs (Claude, OpenAI, Gemini) with input, output, and cached token rates per million tokens.", {}, async () => {
160
+ const license = checkLicense("ai-cost-analyzer");
161
+ if (!license.valid) {
162
+ return { content: [{ type: "text", text: license.message ?? "License required" }], isError: true };
163
+ }
135
164
  try {
136
165
  const result = handleGetPricing();
137
- return {
138
- content: [{ type: "text", text: result }],
139
- };
166
+ const content = [{ type: "text", text: result }];
167
+ if (license.trial && license.message) {
168
+ content.push({ type: "text", text: "\n\n" + license.message });
169
+ }
170
+ return { content };
140
171
  }
141
172
  catch (err) {
142
173
  return {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAC/E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IACxE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC3F,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IACnE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAChG,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;CACtG,CAAC,CAAC;AAEH,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E,MAAM,CAAC,IAAI,CACT,eAAe,EACf,2IAA2I,EAC3I;IACE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAC7C,+DAA+D,CAChE;CACF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;IACvB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,0BAA0B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACnF,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,6HAA6H,EAC7H;IACE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAC7C,gEAAgE,CACjE;IACD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvD,qGAAqG,CACtG;CACF,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QACrE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACtF,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,oKAAoK,EACpK;IACE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IACxE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAC5C,uDAAuD,CACxD;IACD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7D,oEAAoE,CACrE;IACD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACnC,6DAA6D,CAC9D;CACF,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,KAAK,EAAE,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,oBAAoB,CAAC,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAChG,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,4BAA4B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACrF,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,gLAAgL,EAChL;IACE,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CACnC,+CAA+C,CAChD;IACD,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjE,6CAA6C,CAC9C;IACD,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAClE,8CAA8C,CAC/C;CACF,EACD,KAAK,EAAE,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,EAAE,EAAE;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAChC,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,CACxB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACpF,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,CAAC,IAAI,CACT,aAAa,EACb,uIAAuI,EACvI,EAAE,EACF,KAAK,IAAI,EAAE;IACT,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;iBACpF,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CACF,CAAC;AAEF,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE9C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QAEtD,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;QAEzD,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACtD,eAAe;YACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;YACpE,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;YAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,EAAE,CAAC,CAAC;YAEhE,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACpD,iDAAiD;gBACjD,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;gBACtC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAErC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBACnB,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1D,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACpD,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,8BAA8B,EAAE,CAAC,CAAC,CAAC;oBACnE,OAAO;gBACT,CAAC;gBACD,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC;gBAC7C,MAAM,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,eAAe;YACf,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxF,OAAO;YACT,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YAC3B,OAAO,CAAC,KAAK,CAAC,uDAAuD,IAAI,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,MAAM,CAAC,CAAC;YAC9D,OAAO,CAAC,KAAK,CAAC,yCAAyC,IAAI,WAAW,CAAC,CAAC;YACxE,OAAO,CAAC,KAAK,CAAC,oCAAoC,IAAI,SAAS,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Shared license validation for AIVP MCP servers.
3
+ *
4
+ * License keys are HMAC-SHA256 signed strings in the format:
5
+ * base64(email:product:expiry):signature
6
+ *
7
+ * The server validates locally — no network call needed.
8
+ *
9
+ * Without a key, users get a free trial (limited calls).
10
+ * With a valid key, usage is unlimited.
11
+ */
12
+ export interface LicenseResult {
13
+ valid: boolean;
14
+ message?: string;
15
+ trial?: boolean;
16
+ remaining?: number;
17
+ }
18
+ /**
19
+ * Generate a license key for a given email and product.
20
+ * Used by the key generation script, not by the server itself.
21
+ */
22
+ export declare function generateLicenseKey(email: string, product: string, expiryDays?: number): string;
23
+ /**
24
+ * Validate a license key for a given product.
25
+ * Returns { valid: true } if the key is valid for this product.
26
+ */
27
+ export declare function validateLicenseKey(key: string, product: string): LicenseResult;
28
+ /**
29
+ * Check if the current call is allowed.
30
+ * Call this at the start of every tool handler.
31
+ *
32
+ * - If LICENSE_KEY env var is set and valid: always allowed
33
+ * - If no key: allowed for FREE_TRIAL_LIMIT calls, then blocked
34
+ */
35
+ export declare function checkLicense(product: string): LicenseResult;
36
+ //# sourceMappingURL=license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,GACvB,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,aAAa,CAyCf;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAkC3D"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Shared license validation for AIVP MCP servers.
3
+ *
4
+ * License keys are HMAC-SHA256 signed strings in the format:
5
+ * base64(email:product:expiry):signature
6
+ *
7
+ * The server validates locally — no network call needed.
8
+ *
9
+ * Without a key, users get a free trial (limited calls).
10
+ * With a valid key, usage is unlimited.
11
+ */
12
+ import { createHmac } from "node:crypto";
13
+ // This secret is used to sign/verify license keys.
14
+ // In production, this should be injected via env var, but for local
15
+ // validation of HMAC-signed keys, it must be embedded.
16
+ const LICENSE_SECRET = process.env.AIVP_LICENSE_SECRET ?? "aivp-mcp-2026-s3cr3t-k3y";
17
+ const FREE_TRIAL_LIMIT = 3;
18
+ // In-memory call counter for free trial
19
+ const callCounts = new Map();
20
+ /**
21
+ * Generate a license key for a given email and product.
22
+ * Used by the key generation script, not by the server itself.
23
+ */
24
+ export function generateLicenseKey(email, product, expiryDays = 365) {
25
+ const expiry = new Date(Date.now() + expiryDays * 24 * 60 * 60 * 1000).toISOString().split("T")[0];
26
+ const payload = `${email}:${product}:${expiry}`;
27
+ const payloadB64 = Buffer.from(payload).toString("base64url");
28
+ const signature = createHmac("sha256", LICENSE_SECRET)
29
+ .update(payload)
30
+ .digest("base64url");
31
+ return `${payloadB64}.${signature}`;
32
+ }
33
+ /**
34
+ * Validate a license key for a given product.
35
+ * Returns { valid: true } if the key is valid for this product.
36
+ */
37
+ export function validateLicenseKey(key, product) {
38
+ try {
39
+ const [payloadB64, signature] = key.split(".");
40
+ if (!payloadB64 || !signature) {
41
+ return { valid: false, message: "Invalid key format" };
42
+ }
43
+ const payload = Buffer.from(payloadB64, "base64url").toString("utf-8");
44
+ const [email, keyProduct, expiry] = payload.split(":");
45
+ if (!email || !keyProduct || !expiry) {
46
+ return { valid: false, message: "Invalid key format" };
47
+ }
48
+ // Verify signature
49
+ const expectedSignature = createHmac("sha256", LICENSE_SECRET)
50
+ .update(payload)
51
+ .digest("base64url");
52
+ if (signature !== expectedSignature) {
53
+ return { valid: false, message: "Invalid license key" };
54
+ }
55
+ // Check product match (allow "all" for bundle keys)
56
+ if (keyProduct !== product && keyProduct !== "all") {
57
+ return {
58
+ valid: false,
59
+ message: `This key is for "${keyProduct}", not "${product}"`,
60
+ };
61
+ }
62
+ // Check expiry
63
+ const expiryDate = new Date(expiry);
64
+ if (isNaN(expiryDate.getTime()) || expiryDate < new Date()) {
65
+ return { valid: false, message: "License key has expired" };
66
+ }
67
+ return { valid: true };
68
+ }
69
+ catch {
70
+ return { valid: false, message: "Invalid license key" };
71
+ }
72
+ }
73
+ /**
74
+ * Check if the current call is allowed.
75
+ * Call this at the start of every tool handler.
76
+ *
77
+ * - If LICENSE_KEY env var is set and valid: always allowed
78
+ * - If no key: allowed for FREE_TRIAL_LIMIT calls, then blocked
79
+ */
80
+ export function checkLicense(product) {
81
+ const key = process.env.LICENSE_KEY ?? process.env.AIVP_LICENSE_KEY;
82
+ if (key) {
83
+ const result = validateLicenseKey(key, product);
84
+ if (result.valid) {
85
+ return { valid: true };
86
+ }
87
+ // Invalid key — still return the error, don't fall through to trial
88
+ return result;
89
+ }
90
+ // No key — free trial mode
91
+ const count = (callCounts.get(product) ?? 0) + 1;
92
+ callCounts.set(product, count);
93
+ if (count <= FREE_TRIAL_LIMIT) {
94
+ return {
95
+ valid: true,
96
+ trial: true,
97
+ remaining: FREE_TRIAL_LIMIT - count,
98
+ message: count === FREE_TRIAL_LIMIT
99
+ ? `⚠️ Free trial ended. Purchase a license at https://aivp-mcp.vercel.app`
100
+ : `Free trial: ${FREE_TRIAL_LIMIT - count} calls remaining. Get unlimited access at https://aivp-mcp.vercel.app`,
101
+ };
102
+ }
103
+ return {
104
+ valid: false,
105
+ trial: true,
106
+ remaining: 0,
107
+ message: `🔒 Free trial limit reached (${FREE_TRIAL_LIMIT} calls). Purchase a license at https://aivp-mcp.vercel.app to continue using this tool.`,
108
+ };
109
+ }
110
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../src/license.ts"],"names":[],"mappings":"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"}
@@ -162,7 +162,7 @@ export function handleCompareModels(taskDescription, estimatedInputTokens, estim
162
162
  entries.sort((a, b) => a.costPerReq - b.costPerReq);
163
163
  const cheapest = entries[0];
164
164
  const mostExpensive = entries[entries.length - 1];
165
- const ratio = mostExpensive.costPerReq / cheapest.costPerReq;
165
+ const ratio = cheapest.costPerReq > 0 ? mostExpensive.costPerReq / cheapest.costPerReq : 0;
166
166
  lines.push("## Cost Spread");
167
167
  lines.push(`- **Cheapest:** ${MODEL_PRICING[cheapest.id].name} at $${cheapest.costPerReq.toFixed(6)}/request`);
168
168
  lines.push(`- **Most Expensive:** ${MODEL_PRICING[mostExpensive.id].name} at $${mostExpensive.costPerReq.toFixed(6)}/request`);
@@ -1 +1 @@
1
- {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/tools/compare.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/tools/compare.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/tools/pricing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMzD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,CA6DvD,CAAC;AA6BF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAG/D;AAMD,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,MAAU,GACvB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAapF;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAoCzC"}
1
+ {"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/tools/pricing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMzD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,YAAY,CA6DvD,CAAC;AA0DF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAW/D;AAMD,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,YAAY,GAAE,MAAU,GACvB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAepF;AAMD,wBAAgB,gBAAgB,IAAI,MAAM,CAoCzC"}
@@ -72,45 +72,86 @@ export const MODEL_PRICING = {
72
72
  // Helper: resolve a user-supplied model string to a ModelId
73
73
  // ---------------------------------------------------------------------------
74
74
  const MODEL_ALIASES = {
75
- // Claude
75
+ // Claude Opus
76
76
  "claude-opus": "claude-opus",
77
77
  "claude-4-opus": "claude-opus",
78
+ "claude-opus-4": "claude-opus",
79
+ "claude-opus-4-0": "claude-opus",
78
80
  opus: "claude-opus",
81
+ // Claude Sonnet
79
82
  "claude-sonnet": "claude-sonnet",
80
83
  "claude-4-sonnet": "claude-sonnet",
84
+ "claude-sonnet-4": "claude-sonnet",
85
+ "claude-sonnet-4-5": "claude-sonnet",
86
+ "claude-sonnet-4.5": "claude-sonnet",
81
87
  "claude-3.5-sonnet": "claude-sonnet",
88
+ "claude-3-5-sonnet": "claude-sonnet",
89
+ "claude-sonnet-3-5": "claude-sonnet",
90
+ "claude-sonnet-3.5": "claude-sonnet",
82
91
  sonnet: "claude-sonnet",
92
+ // Claude Haiku
83
93
  "claude-haiku": "claude-haiku",
84
94
  "claude-3.5-haiku": "claude-haiku",
95
+ "claude-3-5-haiku": "claude-haiku",
96
+ "claude-haiku-3-5": "claude-haiku",
97
+ "claude-haiku-3.5": "claude-haiku",
85
98
  haiku: "claude-haiku",
86
99
  // OpenAI
87
100
  "gpt-4o": "gpt-4o",
88
101
  gpt4o: "gpt-4o",
89
102
  "gpt-4o-mini": "gpt-4o-mini",
90
103
  gpt4omini: "gpt-4o-mini",
104
+ "gpt-4o-mini-2024-07-18": "gpt-4o-mini",
105
+ "gpt-4o-2024-08-06": "gpt-4o",
91
106
  // Google
92
107
  "gemini-2.0-flash": "gemini-2.0-flash",
93
108
  "gemini-flash": "gemini-2.0-flash",
109
+ "gemini-2.0-flash-001": "gemini-2.0-flash",
94
110
  gemini: "gemini-2.0-flash",
95
111
  };
112
+ /**
113
+ * Fuzzy-match patterns: if exact alias lookup fails, try substring matching.
114
+ * Order matters -- more specific patterns come first.
115
+ */
116
+ const FUZZY_PATTERNS = [
117
+ { pattern: /opus/i, modelId: "claude-opus" },
118
+ { pattern: /sonnet/i, modelId: "claude-sonnet" },
119
+ { pattern: /haiku/i, modelId: "claude-haiku" },
120
+ { pattern: /gpt-?4o-?mini/i, modelId: "gpt-4o-mini" },
121
+ { pattern: /gpt-?4o/i, modelId: "gpt-4o" },
122
+ { pattern: /gemini/i, modelId: "gemini-2.0-flash" },
123
+ ];
96
124
  export function resolveModelId(raw) {
97
125
  const key = raw.toLowerCase().trim();
98
- return MODEL_ALIASES[key] ?? (MODEL_PRICING[key] ? key : undefined);
126
+ // 1. Exact alias match
127
+ if (MODEL_ALIASES[key])
128
+ return MODEL_ALIASES[key];
129
+ // 2. Direct pricing key match
130
+ if (MODEL_PRICING[key])
131
+ return key;
132
+ // 3. Fuzzy pattern match
133
+ for (const { pattern, modelId } of FUZZY_PATTERNS) {
134
+ if (pattern.test(key))
135
+ return modelId;
136
+ }
137
+ return undefined;
99
138
  }
100
139
  // ---------------------------------------------------------------------------
101
140
  // Cost helpers
102
141
  // ---------------------------------------------------------------------------
103
142
  export function computeCost(modelId, inputTokens, outputTokens, cachedTokens = 0) {
104
143
  const p = MODEL_PRICING[modelId];
105
- const uncachedInput = inputTokens - cachedTokens;
144
+ // Guard against cachedTokens exceeding inputTokens (invalid data)
145
+ const safeCached = Math.min(cachedTokens, inputTokens);
146
+ const uncachedInput = inputTokens - safeCached;
106
147
  const fullInputCost = (uncachedInput / 1_000_000) * p.inputPerMillion;
107
148
  const cachedCost = p.cachedInputPerMillion
108
- ? (cachedTokens / 1_000_000) * p.cachedInputPerMillion
109
- : (cachedTokens / 1_000_000) * p.inputPerMillion;
149
+ ? (safeCached / 1_000_000) * p.cachedInputPerMillion
150
+ : (safeCached / 1_000_000) * p.inputPerMillion;
110
151
  const inputCost = fullInputCost + cachedCost;
111
152
  const outputCost = (outputTokens / 1_000_000) * p.outputPerMillion;
112
153
  const cacheSavings = p.cachedInputPerMillion
113
- ? (cachedTokens / 1_000_000) * (p.inputPerMillion - p.cachedInputPerMillion)
154
+ ? (safeCached / 1_000_000) * (p.inputPerMillion - p.cachedInputPerMillion)
114
155
  : 0;
115
156
  return { inputCost, outputCost, cacheSavings, totalCost: inputCost + outputCost };
116
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/tools/pricing.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/tools/pricing.ts"],"names":[],"mappings":"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"}
@@ -73,9 +73,9 @@ function computeSavings(records, multiplier) {
73
73
  const p = MODEL_PRICING[mid];
74
74
  if (p.qualityTier === 1) {
75
75
  // 40% of Opus calls could go to Sonnet
76
- const routableCount = Math.floor(data.count * 0.4);
77
- const routableInputTokens = (data.input / data.count) * routableCount;
78
- const routableOutputTokens = (data.output / data.count) * routableCount;
76
+ const routableFraction = 0.4;
77
+ const routableInputTokens = data.input * routableFraction;
78
+ const routableOutputTokens = data.output * routableFraction;
79
79
  const currentCost = computeCost(mid, routableInputTokens, routableOutputTokens).totalCost;
80
80
  const cheaperCost = computeCost("claude-sonnet", routableInputTokens, routableOutputTokens).totalCost;
81
81
  routingSavings += currentCost - cheaperCost;
@@ -83,9 +83,9 @@ function computeSavings(records, multiplier) {
83
83
  }
84
84
  else if (p.qualityTier === 2) {
85
85
  // 25% of Sonnet/4o calls could go to Haiku/mini
86
- const routableCount = Math.floor(data.count * 0.25);
87
- const routableInputTokens = (data.input / data.count) * routableCount;
88
- const routableOutputTokens = (data.output / data.count) * routableCount;
86
+ const routableFraction = 0.25;
87
+ const routableInputTokens = data.input * routableFraction;
88
+ const routableOutputTokens = data.output * routableFraction;
89
89
  const currentCost = computeCost(mid, routableInputTokens, routableOutputTokens).totalCost;
90
90
  const cheaperId = mid === "gpt-4o" ? "gpt-4o-mini" : "claude-haiku";
91
91
  const cheaperCost = computeCost(cheaperId, routableInputTokens, routableOutputTokens).totalCost;
@@ -1 +1 @@
1
- {"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/tools/savings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/tools/savings.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-cost-analyzer",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "MCP server that helps developers understand and reduce their AI API costs through usage analysis, savings estimation, prompt optimization, and model comparison.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/index.ts CHANGED
@@ -18,6 +18,7 @@ import { handleEstimateSavings } from "./tools/savings.js";
18
18
  import { handleOptimizePrompt } from "./tools/optimize.js";
19
19
  import { handleCompareModels } from "./tools/compare.js";
20
20
  import { handleGetPricing } from "./tools/pricing.js";
21
+ import { checkLicense } from "./license.js";
21
22
 
22
23
  // ---------------------------------------------------------------------------
23
24
  // Zod schemas for tool inputs
@@ -55,11 +56,17 @@ server.tool(
55
56
  ),
56
57
  },
57
58
  async ({ usage_data }) => {
59
+ const license = checkLicense("ai-cost-analyzer");
60
+ if (!license.valid) {
61
+ return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
62
+ }
58
63
  try {
59
64
  const result = handleAnalyzeUsage(usage_data);
60
- return {
61
- content: [{ type: "text" as const, text: result }],
62
- };
65
+ const content = [{ type: "text" as const, text: result }];
66
+ if (license.trial && license.message) {
67
+ content.push({ type: "text" as const, text: "\n\n" + license.message });
68
+ }
69
+ return { content };
63
70
  } catch (err) {
64
71
  return {
65
72
  content: [{
@@ -88,11 +95,17 @@ server.tool(
88
95
  ),
89
96
  },
90
97
  async ({ usage_data, monthly_multiplier }) => {
98
+ const license = checkLicense("ai-cost-analyzer");
99
+ if (!license.valid) {
100
+ return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
101
+ }
91
102
  try {
92
103
  const result = handleEstimateSavings(usage_data, monthly_multiplier);
93
- return {
94
- content: [{ type: "text" as const, text: result }],
95
- };
104
+ const content = [{ type: "text" as const, text: result }];
105
+ if (license.trial && license.message) {
106
+ content.push({ type: "text" as const, text: "\n\n" + license.message });
107
+ }
108
+ return { content };
96
109
  } catch (err) {
97
110
  return {
98
111
  content: [{
@@ -125,11 +138,17 @@ server.tool(
125
138
  ),
126
139
  },
127
140
  async ({ system_prompt, tool_definitions, requests_per_month, model }) => {
141
+ const license = checkLicense("ai-cost-analyzer");
142
+ if (!license.valid) {
143
+ return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
144
+ }
128
145
  try {
129
146
  const result = handleOptimizePrompt(system_prompt, tool_definitions, requests_per_month, model);
130
- return {
131
- content: [{ type: "text" as const, text: result }],
132
- };
147
+ const content = [{ type: "text" as const, text: result }];
148
+ if (license.trial && license.message) {
149
+ content.push({ type: "text" as const, text: "\n\n" + license.message });
150
+ }
151
+ return { content };
133
152
  } catch (err) {
134
153
  return {
135
154
  content: [{
@@ -161,15 +180,21 @@ server.tool(
161
180
  ),
162
181
  },
163
182
  async ({ task_description, estimated_input_tokens, estimated_output_tokens }) => {
183
+ const license = checkLicense("ai-cost-analyzer");
184
+ if (!license.valid) {
185
+ return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
186
+ }
164
187
  try {
165
188
  const result = handleCompareModels(
166
189
  task_description,
167
190
  estimated_input_tokens,
168
191
  estimated_output_tokens,
169
192
  );
170
- return {
171
- content: [{ type: "text" as const, text: result }],
172
- };
193
+ const content = [{ type: "text" as const, text: result }];
194
+ if (license.trial && license.message) {
195
+ content.push({ type: "text" as const, text: "\n\n" + license.message });
196
+ }
197
+ return { content };
173
198
  } catch (err) {
174
199
  return {
175
200
  content: [{
@@ -191,11 +216,17 @@ server.tool(
191
216
  "Return current pricing for all major LLM APIs (Claude, OpenAI, Gemini) with input, output, and cached token rates per million tokens.",
192
217
  {},
193
218
  async () => {
219
+ const license = checkLicense("ai-cost-analyzer");
220
+ if (!license.valid) {
221
+ return { content: [{ type: "text" as const, text: license.message ?? "License required" }], isError: true };
222
+ }
194
223
  try {
195
224
  const result = handleGetPricing();
196
- return {
197
- content: [{ type: "text" as const, text: result }],
198
- };
225
+ const content = [{ type: "text" as const, text: result }];
226
+ if (license.trial && license.message) {
227
+ content.push({ type: "text" as const, text: "\n\n" + license.message });
228
+ }
229
+ return { content };
199
230
  } catch (err) {
200
231
  return {
201
232
  content: [{
package/src/license.ts ADDED
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Shared license validation for AIVP MCP servers.
3
+ *
4
+ * License keys are HMAC-SHA256 signed strings in the format:
5
+ * base64(email:product:expiry):signature
6
+ *
7
+ * The server validates locally — no network call needed.
8
+ *
9
+ * Without a key, users get a free trial (limited calls).
10
+ * With a valid key, usage is unlimited.
11
+ */
12
+
13
+ import { createHmac } from "node:crypto";
14
+
15
+ // This secret is used to sign/verify license keys.
16
+ // In production, this should be injected via env var, but for local
17
+ // validation of HMAC-signed keys, it must be embedded.
18
+ const LICENSE_SECRET = process.env.AIVP_LICENSE_SECRET ?? "aivp-mcp-2026-s3cr3t-k3y";
19
+
20
+ const FREE_TRIAL_LIMIT = 3;
21
+
22
+ // In-memory call counter for free trial
23
+ const callCounts = new Map<string, number>();
24
+
25
+ export interface LicenseResult {
26
+ valid: boolean;
27
+ message?: string;
28
+ trial?: boolean;
29
+ remaining?: number;
30
+ }
31
+
32
+ /**
33
+ * Generate a license key for a given email and product.
34
+ * Used by the key generation script, not by the server itself.
35
+ */
36
+ export function generateLicenseKey(
37
+ email: string,
38
+ product: string,
39
+ expiryDays: number = 365,
40
+ ): string {
41
+ const expiry = new Date(
42
+ Date.now() + expiryDays * 24 * 60 * 60 * 1000,
43
+ ).toISOString().split("T")[0];
44
+ const payload = `${email}:${product}:${expiry}`;
45
+ const payloadB64 = Buffer.from(payload).toString("base64url");
46
+ const signature = createHmac("sha256", LICENSE_SECRET)
47
+ .update(payload)
48
+ .digest("base64url");
49
+ return `${payloadB64}.${signature}`;
50
+ }
51
+
52
+ /**
53
+ * Validate a license key for a given product.
54
+ * Returns { valid: true } if the key is valid for this product.
55
+ */
56
+ export function validateLicenseKey(
57
+ key: string,
58
+ product: string,
59
+ ): LicenseResult {
60
+ try {
61
+ const [payloadB64, signature] = key.split(".");
62
+ if (!payloadB64 || !signature) {
63
+ return { valid: false, message: "Invalid key format" };
64
+ }
65
+
66
+ const payload = Buffer.from(payloadB64, "base64url").toString("utf-8");
67
+ const [email, keyProduct, expiry] = payload.split(":");
68
+
69
+ if (!email || !keyProduct || !expiry) {
70
+ return { valid: false, message: "Invalid key format" };
71
+ }
72
+
73
+ // Verify signature
74
+ const expectedSignature = createHmac("sha256", LICENSE_SECRET)
75
+ .update(payload)
76
+ .digest("base64url");
77
+
78
+ if (signature !== expectedSignature) {
79
+ return { valid: false, message: "Invalid license key" };
80
+ }
81
+
82
+ // Check product match (allow "all" for bundle keys)
83
+ if (keyProduct !== product && keyProduct !== "all") {
84
+ return {
85
+ valid: false,
86
+ message: `This key is for "${keyProduct}", not "${product}"`,
87
+ };
88
+ }
89
+
90
+ // Check expiry
91
+ const expiryDate = new Date(expiry);
92
+ if (isNaN(expiryDate.getTime()) || expiryDate < new Date()) {
93
+ return { valid: false, message: "License key has expired" };
94
+ }
95
+
96
+ return { valid: true };
97
+ } catch {
98
+ return { valid: false, message: "Invalid license key" };
99
+ }
100
+ }
101
+
102
+ /**
103
+ * Check if the current call is allowed.
104
+ * Call this at the start of every tool handler.
105
+ *
106
+ * - If LICENSE_KEY env var is set and valid: always allowed
107
+ * - If no key: allowed for FREE_TRIAL_LIMIT calls, then blocked
108
+ */
109
+ export function checkLicense(product: string): LicenseResult {
110
+ const key = process.env.LICENSE_KEY ?? process.env.AIVP_LICENSE_KEY;
111
+
112
+ if (key) {
113
+ const result = validateLicenseKey(key, product);
114
+ if (result.valid) {
115
+ return { valid: true };
116
+ }
117
+ // Invalid key — still return the error, don't fall through to trial
118
+ return result;
119
+ }
120
+
121
+ // No key — free trial mode
122
+ const count = (callCounts.get(product) ?? 0) + 1;
123
+ callCounts.set(product, count);
124
+
125
+ if (count <= FREE_TRIAL_LIMIT) {
126
+ return {
127
+ valid: true,
128
+ trial: true,
129
+ remaining: FREE_TRIAL_LIMIT - count,
130
+ message:
131
+ count === FREE_TRIAL_LIMIT
132
+ ? `⚠️ Free trial ended. Purchase a license at https://aivp-mcp.vercel.app`
133
+ : `Free trial: ${FREE_TRIAL_LIMIT - count} calls remaining. Get unlimited access at https://aivp-mcp.vercel.app`,
134
+ };
135
+ }
136
+
137
+ return {
138
+ valid: false,
139
+ trial: true,
140
+ remaining: 0,
141
+ message: `🔒 Free trial limit reached (${FREE_TRIAL_LIMIT} calls). Purchase a license at https://aivp-mcp.vercel.app to continue using this tool.`,
142
+ };
143
+ }
@@ -213,7 +213,7 @@ export function handleCompareModels(
213
213
  entries.sort((a, b) => a.costPerReq - b.costPerReq);
214
214
  const cheapest = entries[0];
215
215
  const mostExpensive = entries[entries.length - 1];
216
- const ratio = mostExpensive.costPerReq / cheapest.costPerReq;
216
+ const ratio = cheapest.costPerReq > 0 ? mostExpensive.costPerReq / cheapest.costPerReq : 0;
217
217
 
218
218
  lines.push("## Cost Spread");
219
219
  lines.push(
@@ -78,31 +78,68 @@ export const MODEL_PRICING: Record<ModelId, ModelPricing> = {
78
78
  // ---------------------------------------------------------------------------
79
79
 
80
80
  const MODEL_ALIASES: Record<string, ModelId> = {
81
- // Claude
81
+ // Claude Opus
82
82
  "claude-opus": "claude-opus",
83
83
  "claude-4-opus": "claude-opus",
84
+ "claude-opus-4": "claude-opus",
85
+ "claude-opus-4-0": "claude-opus",
84
86
  opus: "claude-opus",
87
+ // Claude Sonnet
85
88
  "claude-sonnet": "claude-sonnet",
86
89
  "claude-4-sonnet": "claude-sonnet",
90
+ "claude-sonnet-4": "claude-sonnet",
91
+ "claude-sonnet-4-5": "claude-sonnet",
92
+ "claude-sonnet-4.5": "claude-sonnet",
87
93
  "claude-3.5-sonnet": "claude-sonnet",
94
+ "claude-3-5-sonnet": "claude-sonnet",
95
+ "claude-sonnet-3-5": "claude-sonnet",
96
+ "claude-sonnet-3.5": "claude-sonnet",
88
97
  sonnet: "claude-sonnet",
98
+ // Claude Haiku
89
99
  "claude-haiku": "claude-haiku",
90
100
  "claude-3.5-haiku": "claude-haiku",
101
+ "claude-3-5-haiku": "claude-haiku",
102
+ "claude-haiku-3-5": "claude-haiku",
103
+ "claude-haiku-3.5": "claude-haiku",
91
104
  haiku: "claude-haiku",
92
105
  // OpenAI
93
106
  "gpt-4o": "gpt-4o",
94
107
  gpt4o: "gpt-4o",
95
108
  "gpt-4o-mini": "gpt-4o-mini",
96
109
  gpt4omini: "gpt-4o-mini",
110
+ "gpt-4o-mini-2024-07-18": "gpt-4o-mini",
111
+ "gpt-4o-2024-08-06": "gpt-4o",
97
112
  // Google
98
113
  "gemini-2.0-flash": "gemini-2.0-flash",
99
114
  "gemini-flash": "gemini-2.0-flash",
115
+ "gemini-2.0-flash-001": "gemini-2.0-flash",
100
116
  gemini: "gemini-2.0-flash",
101
117
  };
102
118
 
119
+ /**
120
+ * Fuzzy-match patterns: if exact alias lookup fails, try substring matching.
121
+ * Order matters -- more specific patterns come first.
122
+ */
123
+ const FUZZY_PATTERNS: Array<{ pattern: RegExp; modelId: ModelId }> = [
124
+ { pattern: /opus/i, modelId: "claude-opus" },
125
+ { pattern: /sonnet/i, modelId: "claude-sonnet" },
126
+ { pattern: /haiku/i, modelId: "claude-haiku" },
127
+ { pattern: /gpt-?4o-?mini/i, modelId: "gpt-4o-mini" },
128
+ { pattern: /gpt-?4o/i, modelId: "gpt-4o" },
129
+ { pattern: /gemini/i, modelId: "gemini-2.0-flash" },
130
+ ];
131
+
103
132
  export function resolveModelId(raw: string): ModelId | undefined {
104
133
  const key = raw.toLowerCase().trim();
105
- return MODEL_ALIASES[key] ?? (MODEL_PRICING[key as ModelId] ? (key as ModelId) : undefined);
134
+ // 1. Exact alias match
135
+ if (MODEL_ALIASES[key]) return MODEL_ALIASES[key];
136
+ // 2. Direct pricing key match
137
+ if (MODEL_PRICING[key as ModelId]) return key as ModelId;
138
+ // 3. Fuzzy pattern match
139
+ for (const { pattern, modelId } of FUZZY_PATTERNS) {
140
+ if (pattern.test(key)) return modelId;
141
+ }
142
+ return undefined;
106
143
  }
107
144
 
108
145
  // ---------------------------------------------------------------------------
@@ -116,15 +153,17 @@ export function computeCost(
116
153
  cachedTokens: number = 0,
117
154
  ): { inputCost: number; outputCost: number; cacheSavings: number; totalCost: number } {
118
155
  const p = MODEL_PRICING[modelId];
119
- const uncachedInput = inputTokens - cachedTokens;
156
+ // Guard against cachedTokens exceeding inputTokens (invalid data)
157
+ const safeCached = Math.min(cachedTokens, inputTokens);
158
+ const uncachedInput = inputTokens - safeCached;
120
159
  const fullInputCost = (uncachedInput / 1_000_000) * p.inputPerMillion;
121
160
  const cachedCost = p.cachedInputPerMillion
122
- ? (cachedTokens / 1_000_000) * p.cachedInputPerMillion
123
- : (cachedTokens / 1_000_000) * p.inputPerMillion;
161
+ ? (safeCached / 1_000_000) * p.cachedInputPerMillion
162
+ : (safeCached / 1_000_000) * p.inputPerMillion;
124
163
  const inputCost = fullInputCost + cachedCost;
125
164
  const outputCost = (outputTokens / 1_000_000) * p.outputPerMillion;
126
165
  const cacheSavings = p.cachedInputPerMillion
127
- ? (cachedTokens / 1_000_000) * (p.inputPerMillion - p.cachedInputPerMillion)
166
+ ? (safeCached / 1_000_000) * (p.inputPerMillion - p.cachedInputPerMillion)
128
167
  : 0;
129
168
  return { inputCost, outputCost, cacheSavings, totalCost: inputCost + outputCost };
130
169
  }
@@ -91,9 +91,9 @@ function computeSavings(records: UsageRecord[], multiplier: number): SavingsEsti
91
91
  const p = MODEL_PRICING[mid];
92
92
  if (p.qualityTier === 1) {
93
93
  // 40% of Opus calls could go to Sonnet
94
- const routableCount = Math.floor(data.count * 0.4);
95
- const routableInputTokens = (data.input / data.count) * routableCount;
96
- const routableOutputTokens = (data.output / data.count) * routableCount;
94
+ const routableFraction = 0.4;
95
+ const routableInputTokens = data.input * routableFraction;
96
+ const routableOutputTokens = data.output * routableFraction;
97
97
 
98
98
  const currentCost = computeCost(mid, routableInputTokens, routableOutputTokens).totalCost;
99
99
  const cheaperCost = computeCost("claude-sonnet", routableInputTokens, routableOutputTokens).totalCost;
@@ -101,9 +101,9 @@ function computeSavings(records: UsageRecord[], multiplier: number): SavingsEsti
101
101
  routingCurrentCost += currentCost;
102
102
  } else if (p.qualityTier === 2) {
103
103
  // 25% of Sonnet/4o calls could go to Haiku/mini
104
- const routableCount = Math.floor(data.count * 0.25);
105
- const routableInputTokens = (data.input / data.count) * routableCount;
106
- const routableOutputTokens = (data.output / data.count) * routableCount;
104
+ const routableFraction = 0.25;
105
+ const routableInputTokens = data.input * routableFraction;
106
+ const routableOutputTokens = data.output * routableFraction;
107
107
 
108
108
  const currentCost = computeCost(mid, routableInputTokens, routableOutputTokens).totalCost;
109
109
  const cheaperId: ModelId = mid === "gpt-4o" ? "gpt-4o-mini" : "claude-haiku";