atom-mcp-server 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.
Files changed (73) hide show
  1. package/Dockerfile +18 -0
  2. package/README.md +184 -0
  3. package/claude_desktop_config.json +8 -0
  4. package/dist/auth.d.ts +38 -0
  5. package/dist/auth.d.ts.map +1 -0
  6. package/dist/auth.js +75 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/index.d.ts +3 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +92 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/server.d.ts +3 -0
  13. package/dist/server.d.ts.map +1 -0
  14. package/dist/server.js +234 -0
  15. package/dist/server.js.map +1 -0
  16. package/dist/supabase.d.ts +18 -0
  17. package/dist/supabase.d.ts.map +1 -0
  18. package/dist/supabase.js +86 -0
  19. package/dist/supabase.js.map +1 -0
  20. package/dist/tools/compare-prices.d.ts +16 -0
  21. package/dist/tools/compare-prices.d.ts.map +1 -0
  22. package/dist/tools/compare-prices.js +152 -0
  23. package/dist/tools/compare-prices.js.map +1 -0
  24. package/dist/tools/get-index-benchmarks.d.ts +14 -0
  25. package/dist/tools/get-index-benchmarks.d.ts.map +1 -0
  26. package/dist/tools/get-index-benchmarks.js +99 -0
  27. package/dist/tools/get-index-benchmarks.js.map +1 -0
  28. package/dist/tools/get-kpis.d.ts +10 -0
  29. package/dist/tools/get-kpis.d.ts.map +1 -0
  30. package/dist/tools/get-kpis.js +45 -0
  31. package/dist/tools/get-kpis.js.map +1 -0
  32. package/dist/tools/get-market-stats.d.ts +12 -0
  33. package/dist/tools/get-market-stats.d.ts.map +1 -0
  34. package/dist/tools/get-market-stats.js +95 -0
  35. package/dist/tools/get-market-stats.js.map +1 -0
  36. package/dist/tools/get-model-detail.d.ts +12 -0
  37. package/dist/tools/get-model-detail.d.ts.map +1 -0
  38. package/dist/tools/get-model-detail.js +96 -0
  39. package/dist/tools/get-model-detail.js.map +1 -0
  40. package/dist/tools/get-vendor-catalog.d.ts +15 -0
  41. package/dist/tools/get-vendor-catalog.d.ts.map +1 -0
  42. package/dist/tools/get-vendor-catalog.js +102 -0
  43. package/dist/tools/get-vendor-catalog.js.map +1 -0
  44. package/dist/tools/list-vendors.d.ts +13 -0
  45. package/dist/tools/list-vendors.d.ts.map +1 -0
  46. package/dist/tools/list-vendors.js +49 -0
  47. package/dist/tools/list-vendors.js.map +1 -0
  48. package/dist/tools/search-models.d.ts +22 -0
  49. package/dist/tools/search-models.d.ts.map +1 -0
  50. package/dist/tools/search-models.js +128 -0
  51. package/dist/tools/search-models.js.map +1 -0
  52. package/dist/types.d.ts +119 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +5 -0
  55. package/dist/types.js.map +1 -0
  56. package/env.example +17 -0
  57. package/package.json +52 -0
  58. package/railway.json +13 -0
  59. package/smithery.yaml +36 -0
  60. package/src/auth.ts +101 -0
  61. package/src/index.ts +94 -0
  62. package/src/server.ts +278 -0
  63. package/src/supabase.ts +125 -0
  64. package/src/tools/compare-prices.ts +175 -0
  65. package/src/tools/get-index-benchmarks.ts +122 -0
  66. package/src/tools/get-kpis.ts +62 -0
  67. package/src/tools/get-market-stats.ts +112 -0
  68. package/src/tools/get-model-detail.ts +119 -0
  69. package/src/tools/get-vendor-catalog.ts +121 -0
  70. package/src/tools/list-vendors.ts +60 -0
  71. package/src/tools/search-models.ts +146 -0
  72. package/src/types.ts +145 -0
  73. package/tsconfig.json +19 -0
package/dist/server.js ADDED
@@ -0,0 +1,234 @@
1
+ // ============================================================
2
+ // ATOM MCP Server — Tool Registration
3
+ // ============================================================
4
+ // Registers all 8 tools with the MCP SDK's McpServer.
5
+ // Each tool handler resolves the caller's tier from the API key
6
+ // passed via the _atom_api_key field.
7
+ // ============================================================
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { z } from "zod";
10
+ import { resolveTier } from "./auth.js";
11
+ // Tool imports
12
+ import { searchModelsSchema, handleSearchModels } from "./tools/search-models.js";
13
+ import { getModelDetailSchema, handleGetModelDetail } from "./tools/get-model-detail.js";
14
+ import { comparePricesSchema, handleComparePrices } from "./tools/compare-prices.js";
15
+ import { getVendorCatalogSchema, handleGetVendorCatalog } from "./tools/get-vendor-catalog.js";
16
+ import { getMarketStatsSchema, handleGetMarketStats } from "./tools/get-market-stats.js";
17
+ import { getIndexBenchmarksSchema, handleGetIndexBenchmarks } from "./tools/get-index-benchmarks.js";
18
+ import { getKpisSchema, handleGetKpis } from "./tools/get-kpis.js";
19
+ import { listVendorsSchema, handleListVendors } from "./tools/list-vendors.js";
20
+ // Common API key field injected into every tool's schema
21
+ const apiKeyField = {
22
+ _atom_api_key: z
23
+ .string()
24
+ .optional()
25
+ .describe("Your ATOM API key for full access. Omit for free tier (redacted data)."),
26
+ };
27
+ export function createServer() {
28
+ const server = new McpServer({
29
+ name: "atom-mcp-server",
30
+ version: "1.0.0",
31
+ });
32
+ // ----------------------------------------------------------
33
+ // 1. search_models
34
+ // ----------------------------------------------------------
35
+ server.registerTool("search_models", {
36
+ title: "Search AI Models",
37
+ description: `Search and filter AI inference models across 40+ vendors and 1,600+ SKUs.
38
+
39
+ Query by modality (Text, Image, Audio, Video, Multimodal), vendor, creator, model family, open-source status, price range, context window, and parameter count.
40
+
41
+ Returns matching models with pricing. Free tier shows count + price range; paid tier shows full details.
42
+
43
+ Examples:
44
+ - "Find open-source text models under $1/M tokens" → open_source=true, modality="Text", max_price=0.001
45
+ - "What multimodal models does Google offer?" → vendor="Google", modality="Multimodal"
46
+ - "Models with 128K+ context window" → min_context_window=128000`,
47
+ inputSchema: { ...searchModelsSchema, ...apiKeyField },
48
+ annotations: {
49
+ readOnlyHint: true,
50
+ destructiveHint: false,
51
+ idempotentHint: true,
52
+ openWorldHint: false,
53
+ },
54
+ }, async (params) => {
55
+ const tier = resolveTier(params._atom_api_key);
56
+ return handleSearchModels(params, tier);
57
+ });
58
+ // ----------------------------------------------------------
59
+ // 2. get_model_detail
60
+ // ----------------------------------------------------------
61
+ server.registerTool("get_model_detail", {
62
+ title: "Get Model Details",
63
+ description: `Deep dive on a single AI model: technical specs + pricing across all vendors.
64
+
65
+ Returns model_registry data (context window, parameters, open-source status, training cutoff, model family) plus all SKU pricing across every vendor that offers this model.
66
+
67
+ Examples:
68
+ - "Tell me everything about GPT-4o" → model_name="GPT-4o"
69
+ - "Claude Sonnet 4.5 specs and pricing" → model_name="Claude Sonnet 4.5"`,
70
+ inputSchema: { ...getModelDetailSchema, ...apiKeyField },
71
+ annotations: {
72
+ readOnlyHint: true,
73
+ destructiveHint: false,
74
+ idempotentHint: true,
75
+ openWorldHint: false,
76
+ },
77
+ }, async (params) => {
78
+ const tier = resolveTier(params._atom_api_key);
79
+ return handleGetModelDetail(params, tier);
80
+ });
81
+ // ----------------------------------------------------------
82
+ // 3. compare_prices
83
+ // ----------------------------------------------------------
84
+ server.registerTool("compare_prices", {
85
+ title: "Compare Prices Across Vendors",
86
+ description: `Cross-vendor price comparison for a specific model or model family.
87
+
88
+ Shows the same model (or family) priced across different vendors, sorted cheapest first. Essential for cost optimization and vendor selection.
89
+
90
+ Examples:
91
+ - "Compare Llama 3.1 70B pricing across vendors" → model_name="Llama 3.1 70B"
92
+ - "Cheapest GPT-4 family output pricing" → model_family="GPT-4", direction="Output"
93
+ - "Claude pricing comparison" → model_family="Claude"`,
94
+ inputSchema: { ...comparePricesSchema, ...apiKeyField },
95
+ annotations: {
96
+ readOnlyHint: true,
97
+ destructiveHint: false,
98
+ idempotentHint: true,
99
+ openWorldHint: false,
100
+ },
101
+ }, async (params) => {
102
+ const tier = resolveTier(params._atom_api_key);
103
+ return handleComparePrices(params, tier);
104
+ });
105
+ // ----------------------------------------------------------
106
+ // 4. get_vendor_catalog
107
+ // ----------------------------------------------------------
108
+ server.registerTool("get_vendor_catalog", {
109
+ title: "Get Vendor Catalog",
110
+ description: `Full catalog for a specific vendor: all models, modalities, and pricing.
111
+
112
+ Returns vendor metadata (country, region, pricing page URL) plus every model and SKU they offer.
113
+
114
+ Examples:
115
+ - "What does Together AI sell?" → vendor="Together AI"
116
+ - "OpenAI's text model pricing" → vendor="OpenAI", modality="Text"
117
+ - "Amazon Bedrock catalog" → vendor="Amazon Bedrock"`,
118
+ inputSchema: { ...getVendorCatalogSchema, ...apiKeyField },
119
+ annotations: {
120
+ readOnlyHint: true,
121
+ destructiveHint: false,
122
+ idempotentHint: true,
123
+ openWorldHint: false,
124
+ },
125
+ }, async (params) => {
126
+ const tier = resolveTier(params._atom_api_key);
127
+ return handleGetVendorCatalog(params, tier);
128
+ });
129
+ // ----------------------------------------------------------
130
+ // 5. get_market_stats
131
+ // ----------------------------------------------------------
132
+ server.registerTool("get_market_stats", {
133
+ title: "Get Market Statistics",
134
+ description: `Aggregate AI inference market intelligence.
135
+
136
+ Returns total vendor/model/SKU counts, price distribution (median, mean, quartiles, min/max), and modality breakdown. Optionally filter by modality.
137
+
138
+ Examples:
139
+ - "AI inference market overview" → (no params)
140
+ - "Text model pricing statistics" → modality="Text"
141
+ - "Image generation market stats" → modality="Image"`,
142
+ inputSchema: { ...getMarketStatsSchema, ...apiKeyField },
143
+ annotations: {
144
+ readOnlyHint: true,
145
+ destructiveHint: false,
146
+ idempotentHint: true,
147
+ openWorldHint: false,
148
+ },
149
+ }, async (params) => {
150
+ const tier = resolveTier(params._atom_api_key);
151
+ return handleGetMarketStats(params, tier);
152
+ });
153
+ // ----------------------------------------------------------
154
+ // 6. get_index_benchmarks
155
+ // ----------------------------------------------------------
156
+ server.registerTool("get_index_benchmarks", {
157
+ title: "Get AIPI Index Benchmarks",
158
+ description: `AIPI (ATOM Inference Price Index) — chained matched-model price benchmarks for AI inference.
159
+
160
+ Returns benchmark prices across index families (Text, Image, Audio, Video, Multimodal, Composite) with input, cached, and output pricing per period.
161
+
162
+ These are market-wide benchmarks, not individual vendor prices. Use them to understand where the market is and how it's moving.
163
+
164
+ Fully public — available to all tiers.
165
+
166
+ Examples:
167
+ - "What's the current benchmark for text inference?" → index_category="Text"
168
+ - "Show me all AIPI indexes" → (no params)
169
+ - "AIPI-TXT-GLB history" → index_code="AIPI-TXT-GLB"`,
170
+ inputSchema: { ...getIndexBenchmarksSchema, ...apiKeyField },
171
+ annotations: {
172
+ readOnlyHint: true,
173
+ destructiveHint: false,
174
+ idempotentHint: true,
175
+ openWorldHint: false,
176
+ },
177
+ }, async (params) => {
178
+ const tier = resolveTier(params._atom_api_key);
179
+ return handleGetIndexBenchmarks(params, tier);
180
+ });
181
+ // ----------------------------------------------------------
182
+ // 7. get_kpis
183
+ // ----------------------------------------------------------
184
+ server.registerTool("get_kpis", {
185
+ title: "Get Market KPIs",
186
+ description: `ATOM Inference Price Index (AIPI) market-level KPIs.
187
+
188
+ Returns 6 key performance indicators derived from 1,600+ SKUs:
189
+ - Output Premium: how much more output tokens cost vs input
190
+ - Caching Savings: average discount for cached input pricing
191
+ - Open Source Advantage: price difference between open-source and proprietary
192
+ - Context Cost Curve: price multiplier for larger context windows
193
+ - Caching Availability: % of models offering cached pricing
194
+ - Size Spread: price ratio between largest and smallest models
195
+
196
+ These KPIs are available to all tiers — they demonstrate ATOM's market intelligence.`,
197
+ inputSchema: { ...getKpisSchema, ...apiKeyField },
198
+ annotations: {
199
+ readOnlyHint: true,
200
+ destructiveHint: false,
201
+ idempotentHint: true,
202
+ openWorldHint: false,
203
+ },
204
+ }, async (params) => {
205
+ const tier = resolveTier(params._atom_api_key);
206
+ return handleGetKpis(params, tier);
207
+ });
208
+ // ----------------------------------------------------------
209
+ // 8. list_vendors
210
+ // ----------------------------------------------------------
211
+ server.registerTool("list_vendors", {
212
+ title: "List All Vendors",
213
+ description: `List all 41 AI inference vendors tracked by ATOM.
214
+
215
+ Returns vendor name, country, region, and pricing page URL. Optionally filter by region or country.
216
+
217
+ Examples:
218
+ - "List all vendors" → (no params)
219
+ - "European AI vendors" → region="Europe"
220
+ - "Chinese AI vendors" → country="China"`,
221
+ inputSchema: { ...listVendorsSchema, ...apiKeyField },
222
+ annotations: {
223
+ readOnlyHint: true,
224
+ destructiveHint: false,
225
+ idempotentHint: true,
226
+ openWorldHint: false,
227
+ },
228
+ }, async (params) => {
229
+ const tier = resolveTier(params._atom_api_key);
230
+ return handleListVendors(params, tier);
231
+ });
232
+ return server;
233
+ }
234
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ interface QueryOptions {
2
+ table: string;
3
+ select?: string;
4
+ filters?: string[];
5
+ order?: string;
6
+ limit?: number;
7
+ offset?: number;
8
+ count?: "exact" | "planned" | "estimated";
9
+ }
10
+ export declare function query<T>(opts: QueryOptions): Promise<{
11
+ data: T[];
12
+ count: number | null;
13
+ }>;
14
+ export declare function rpc<T>(functionName: string, body?: Record<string, unknown>): Promise<T[]>;
15
+ export declare function queryTable<T>(table: string, filters?: string[], options?: Partial<QueryOptions>): Promise<T[]>;
16
+ export declare function queryView<T>(viewName: string, filters?: string[], options?: Partial<QueryOptions>): Promise<T[]>;
17
+ export {};
18
+ //# sourceMappingURL=supabase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.d.ts","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"AA6BA,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;CAC3C;AAED,wBAAsB,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAwC/F;AAMD,wBAAsB,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAc/F;AAMD,wBAAsB,UAAU,CAAC,CAAC,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAM,EAAO,EACtB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAOd;AAED,wBAAsB,SAAS,CAAC,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,MAAM,EAAO,EACtB,OAAO,GAAE,OAAO,CAAC,YAAY,CAAM,GAClC,OAAO,CAAC,CAAC,EAAE,CAAC,CAEd"}
@@ -0,0 +1,86 @@
1
+ // ============================================================
2
+ // ATOM MCP Server — Supabase REST Client
3
+ // ============================================================
4
+ // Lightweight fetch-based client for Supabase PostgREST API.
5
+ // No Supabase JS SDK dependency — keeps the binary small.
6
+ // ============================================================
7
+ const SUPABASE_URL = process.env.SUPABASE_URL || "";
8
+ const SUPABASE_ANON_KEY = process.env.SUPABASE_ANON_KEY || "";
9
+ if (!SUPABASE_URL || !SUPABASE_ANON_KEY) {
10
+ console.error("ATOM MCP: SUPABASE_URL and SUPABASE_ANON_KEY must be set in environment variables.");
11
+ }
12
+ const BASE = `${SUPABASE_URL}/rest/v1`;
13
+ const headers = {
14
+ apikey: SUPABASE_ANON_KEY,
15
+ Authorization: `Bearer ${SUPABASE_ANON_KEY}`,
16
+ "Content-Type": "application/json",
17
+ Prefer: "return=representation",
18
+ };
19
+ export async function query(opts) {
20
+ const params = new URLSearchParams();
21
+ if (opts.select)
22
+ params.set("select", opts.select);
23
+ if (opts.order)
24
+ params.set("order", opts.order);
25
+ if (opts.limit)
26
+ params.set("limit", String(opts.limit));
27
+ if (opts.offset)
28
+ params.set("offset", String(opts.offset));
29
+ let url = `${BASE}/${opts.table}?${params.toString()}`;
30
+ // Append filters directly (PostgREST uses column=operator.value syntax)
31
+ if (opts.filters && opts.filters.length > 0) {
32
+ for (const f of opts.filters) {
33
+ url += `&${f}`;
34
+ }
35
+ }
36
+ const reqHeaders = { ...headers };
37
+ if (opts.count) {
38
+ reqHeaders["Prefer"] = `count=${opts.count}`;
39
+ }
40
+ const response = await fetch(url, { headers: reqHeaders });
41
+ if (!response.ok) {
42
+ const body = await response.text();
43
+ throw new Error(`Supabase query failed (${response.status}): ${body}`);
44
+ }
45
+ const data = (await response.json());
46
+ const contentRange = response.headers.get("content-range");
47
+ let count = null;
48
+ if (contentRange) {
49
+ const match = contentRange.match(/\/(\d+|\*)/);
50
+ if (match && match[1] !== "*") {
51
+ count = parseInt(match[1], 10);
52
+ }
53
+ }
54
+ return { data, count };
55
+ }
56
+ // ------------------------------------------------------------
57
+ // RPC call helper (for Supabase functions / views)
58
+ // ------------------------------------------------------------
59
+ export async function rpc(functionName, body) {
60
+ const url = `${SUPABASE_URL}/rest/v1/rpc/${functionName}`;
61
+ const response = await fetch(url, {
62
+ method: "POST",
63
+ headers,
64
+ body: body ? JSON.stringify(body) : undefined,
65
+ });
66
+ if (!response.ok) {
67
+ const text = await response.text();
68
+ throw new Error(`Supabase RPC ${functionName} failed (${response.status}): ${text}`);
69
+ }
70
+ return (await response.json());
71
+ }
72
+ // ------------------------------------------------------------
73
+ // Convenience helpers for common tables
74
+ // ------------------------------------------------------------
75
+ export async function queryTable(table, filters = [], options = {}) {
76
+ const result = await query({
77
+ table,
78
+ filters,
79
+ ...options,
80
+ });
81
+ return result.data;
82
+ }
83
+ export async function queryView(viewName, filters = [], options = {}) {
84
+ return queryTable(viewName, filters, options);
85
+ }
86
+ //# sourceMappingURL=supabase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supabase.js","sourceRoot":"","sources":["../src/supabase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const comparePricesSchema: {
4
+ model_name: z.ZodOptional<z.ZodString>;
5
+ model_family: z.ZodOptional<z.ZodString>;
6
+ direction: z.ZodOptional<z.ZodEnum<["Input", "Output", "Cached Input"]>>;
7
+ modality: z.ZodOptional<z.ZodString>;
8
+ limit: z.ZodDefault<z.ZodNumber>;
9
+ };
10
+ export declare function handleComparePrices(params: z.infer<z.ZodObject<typeof comparePricesSchema>>, tier: Tier): Promise<{
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ }>;
16
+ //# sourceMappingURL=compare-prices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-prices.d.ts","sourceRoot":"","sources":["../../src/tools/compare-prices.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,aAAa,CAAC;AAElD,eAAO,MAAM,mBAAmB;;;;;;CAwB/B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,mBAAmB,CAAC,CAAC,EACxD,IAAI,EAAE,IAAI;;;;;GAwIX"}
@@ -0,0 +1,152 @@
1
+ // ============================================================
2
+ // Tool: compare_prices
3
+ // Cross-vendor price comparison for a model or model family.
4
+ // ============================================================
5
+ import { z } from "zod";
6
+ import { queryTable } from "../supabase.js";
7
+ import { gateResults, freeTierNote } from "../auth.js";
8
+ export const comparePricesSchema = {
9
+ model_name: z
10
+ .string()
11
+ .optional()
12
+ .describe("Model name to compare prices for, e.g. 'GPT-4o', 'Llama 3.1 70B'"),
13
+ model_family: z
14
+ .string()
15
+ .optional()
16
+ .describe("Model family to compare, e.g. 'GPT-4o', 'Claude 3.5'"),
17
+ direction: z
18
+ .enum(["Input", "Output", "Cached Input"])
19
+ .optional()
20
+ .describe("Filter by pricing direction"),
21
+ modality: z
22
+ .string()
23
+ .optional()
24
+ .describe("Filter by modality: Text, Image, Audio, etc."),
25
+ limit: z
26
+ .coerce.number()
27
+ .int()
28
+ .min(1)
29
+ .max(100)
30
+ .default(50)
31
+ .describe("Maximum results (default 50)"),
32
+ };
33
+ export async function handleComparePrices(params, tier) {
34
+ if (!params.model_name && !params.model_family) {
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: JSON.stringify({
40
+ tool: "compare_prices",
41
+ error: "Please provide either model_name or model_family to compare.",
42
+ }),
43
+ },
44
+ ],
45
+ };
46
+ }
47
+ const filters = [];
48
+ if (params.model_name)
49
+ filters.push(`model_name=ilike.*${params.model_name}*`);
50
+ if (params.direction)
51
+ filters.push(`direction=eq.${params.direction}`);
52
+ if (params.modality)
53
+ filters.push(`modality=ilike.*${params.modality}*`);
54
+ filters.push("normalized_price=gt.0");
55
+ let skus = await queryTable("sku_index", filters, {
56
+ select: "sku_id,vendor_name,model_name,modality,direction,normalized_price,normalized_price_unit,billing_method",
57
+ order: "normalized_price.asc",
58
+ limit: params.limit,
59
+ });
60
+ // If model_family was provided, filter by model registry
61
+ if (params.model_family && !params.model_name) {
62
+ const models = await queryTable("model_registry", [
63
+ `model_family=ilike.*${params.model_family}*`,
64
+ ], {
65
+ select: "model_id",
66
+ });
67
+ const modelIds = new Set(models.map((m) => m.model_id));
68
+ // Re-query SKUs without model_name filter
69
+ const familyFilters = [];
70
+ if (params.direction)
71
+ familyFilters.push(`direction=eq.${params.direction}`);
72
+ if (params.modality)
73
+ familyFilters.push(`modality=ilike.*${params.modality}*`);
74
+ familyFilters.push("normalized_price=gt.0");
75
+ const allSkus = await queryTable("sku_index", familyFilters, {
76
+ select: "sku_id,model_id,vendor_name,model_name,modality,direction,normalized_price,normalized_price_unit,billing_method",
77
+ order: "normalized_price.asc",
78
+ limit: 200,
79
+ });
80
+ skus = allSkus.filter((s) => modelIds.has(s.model_id)).slice(0, params.limit);
81
+ }
82
+ if (skus.length === 0) {
83
+ return {
84
+ content: [
85
+ {
86
+ type: "text",
87
+ text: JSON.stringify({
88
+ tool: "compare_prices",
89
+ error: `No pricing data found for '${params.model_name || params.model_family}'.`,
90
+ }),
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ const prices = skus
96
+ .map((s) => s.normalized_price)
97
+ .filter((p) => p !== null && p > 0);
98
+ let results;
99
+ if (tier === "paid") {
100
+ results = {
101
+ comparisons: skus,
102
+ stats: {
103
+ total: skus.length,
104
+ vendors: [...new Set(skus.map((s) => s.vendor_name))].length,
105
+ cheapest: prices.length > 0 ? prices[0] : null,
106
+ most_expensive: prices.length > 0 ? prices[prices.length - 1] : null,
107
+ spread_ratio: prices.length >= 2
108
+ ? +(prices[prices.length - 1] / prices[0]).toFixed(2)
109
+ : null,
110
+ },
111
+ };
112
+ }
113
+ else {
114
+ results = {
115
+ summary: {
116
+ total_vendors: [...new Set(skus.map((s) => s.vendor_name))].length,
117
+ total_skus: skus.length,
118
+ price_range: {
119
+ min: prices.length > 0 ? prices[0] : null,
120
+ max: prices.length > 0 ? prices[prices.length - 1] : null,
121
+ },
122
+ spread_ratio: prices.length >= 2
123
+ ? +(prices[prices.length - 1] / prices[0]).toFixed(2)
124
+ : null,
125
+ directions: [...new Set(skus.map((s) => s.direction))],
126
+ },
127
+ sample: gateResults(skus.slice(0, 3), "free"),
128
+ upgrade_message: "Full vendor-by-vendor comparison requires ATOM MCP Pro ($49/mo). Visit https://a7om.com/mcp",
129
+ };
130
+ }
131
+ const content = [
132
+ {
133
+ type: "text",
134
+ text: JSON.stringify({
135
+ tool: "compare_prices",
136
+ tier,
137
+ query: {
138
+ model_name: params.model_name,
139
+ model_family: params.model_family,
140
+ direction: params.direction,
141
+ modality: params.modality,
142
+ },
143
+ results,
144
+ }, null, 2),
145
+ },
146
+ ];
147
+ if (tier === "free") {
148
+ content.push(freeTierNote("Full vendor-by-vendor price comparison"));
149
+ }
150
+ return { content };
151
+ }
152
+ //# sourceMappingURL=compare-prices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare-prices.js","sourceRoot":"","sources":["../../src/tools/compare-prices.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,uBAAuB;AACvB,6DAA6D;AAC7D,+DAA+D;AAE/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGvD,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kEAAkE,CAAC;IAC/E,YAAY,EAAE,CAAC;SACZ,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sDAAsD,CAAC;IACnE,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;SACzC,QAAQ,EAAE;SACV,QAAQ,CAAC,6BAA6B,CAAC;IAC1C,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8CAA8C,CAAC;IAC3D,KAAK,EAAE,CAAC;SACL,MAAM,CAAC,MAAM,EAAE;SACf,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,8BAA8B,CAAC;CAC5C,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAwD,EACxD,IAAU;IAEV,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC/C,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE,8DAA8D;qBACtE,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,CAAC,UAAU;QAAE,OAAO,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IAC/E,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACvE,IAAI,MAAM,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzE,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAEtC,IAAI,IAAI,GAAG,MAAM,UAAU,CAAW,WAAW,EAAE,OAAO,EAAE;QAC1D,MAAM,EAAE,wGAAwG;QAChH,KAAK,EAAE,sBAAsB;QAC7B,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC;IAEH,yDAAyD;IACzD,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAuB,gBAAgB,EAAE;YACtE,uBAAuB,MAAM,CAAC,YAAY,GAAG;SAC9C,EAAE;YACD,MAAM,EAAE,UAAU;SACnB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAExD,0CAA0C;QAC1C,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,SAAS;YAAE,aAAa,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7E,IAAI,MAAM,CAAC,QAAQ;YAAE,aAAa,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC;QAC/E,aAAa,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAE5C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAW,WAAW,EAAE,aAAa,EAAE;YACrE,MAAM,EAAE,iHAAiH;YACzH,KAAK,EAAE,sBAAsB;YAC7B,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QAEH,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;wBACnB,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE,8BAA8B,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,YAAY,IAAI;qBAClF,CAAC;iBACH;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAEnD,IAAI,OAAgB,CAAC;IAErB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,GAAG;YACR,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE;gBACL,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC5D,QAAQ,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC9C,cAAc,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;gBACpE,YAAY,EACV,MAAM,CAAC,MAAM,IAAI,CAAC;oBAChB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrD,CAAC,CAAC,IAAI;aACX;SACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,GAAG;YACR,OAAO,EAAE;gBACP,aAAa,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM;gBAClE,UAAU,EAAE,IAAI,CAAC,MAAM;gBACvB,WAAW,EAAE;oBACX,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;oBACzC,GAAG,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;iBAC1D;gBACD,YAAY,EACV,MAAM,CAAC,MAAM,IAAI,CAAC;oBAChB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;oBACrD,CAAC,CAAC,IAAI;gBACV,UAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;aACvD;YACD,MAAM,EAAE,WAAW,CACjB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAyC,EACxD,MAAM,CACP;YACD,eAAe,EACb,6FAA6F;SAChG,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAqC;QAChD;YACE,IAAI,EAAE,MAAe;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI;gBACJ,KAAK,EAAE;oBACL,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,SAAS,EAAE,MAAM,CAAC,SAAS;oBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B;gBACD,OAAO;aACR,EACD,IAAI,EACJ,CAAC,CACF;SACF;KACF,CAAC;IAEF,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const getIndexBenchmarksSchema: {
4
+ index_code: z.ZodOptional<z.ZodString>;
5
+ index_category: z.ZodOptional<z.ZodString>;
6
+ limit: z.ZodDefault<z.ZodNumber>;
7
+ };
8
+ export declare function handleGetIndexBenchmarks(params: z.infer<z.ZodObject<typeof getIndexBenchmarksSchema>>, tier: Tier): Promise<{
9
+ content: {
10
+ type: "text";
11
+ text: string;
12
+ }[];
13
+ }>;
14
+ //# sourceMappingURL=get-index-benchmarks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-index-benchmarks.d.ts","sourceRoot":"","sources":["../../src/tools/get-index-benchmarks.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,aAAa,CAAC;AAErD,eAAO,MAAM,wBAAwB;;;;CAoBpC,CAAC;AAEF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,wBAAwB,CAAC,CAAC,EAC7D,IAAI,EAAE,IAAI;;;;;GAwFX"}