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
@@ -0,0 +1,99 @@
1
+ // ============================================================
2
+ // Tool: get_index_benchmarks
3
+ // AIPI index family benchmarks — public market intelligence.
4
+ // ============================================================
5
+ import { z } from "zod";
6
+ import { queryTable } from "../supabase.js";
7
+ export const getIndexBenchmarksSchema = {
8
+ index_code: z
9
+ .string()
10
+ .optional()
11
+ .describe("Filter by specific AIPI index code, e.g. 'AIPI-TXT-GLB', 'AIPI-IMG-GLB'. Omit to see all indexes."),
12
+ index_category: z
13
+ .string()
14
+ .optional()
15
+ .describe("Filter by index category, e.g. 'Text', 'Image', 'Audio', 'Video', 'Multimodal', 'Composite'"),
16
+ limit: z
17
+ .coerce.number()
18
+ .int()
19
+ .min(1)
20
+ .max(100)
21
+ .default(25)
22
+ .describe("Maximum results to return (default 25)"),
23
+ };
24
+ export async function handleGetIndexBenchmarks(params, tier) {
25
+ // Index benchmarks are fully public — no tier gating
26
+ const filters = [];
27
+ if (params.index_code && params.index_code.trim() !== "")
28
+ filters.push(`index_code=eq.${params.index_code.trim()}`);
29
+ if (params.index_category &&
30
+ params.index_category.trim() !== "" &&
31
+ params.index_category !== "(any)")
32
+ filters.push(`index_category=ilike.*${params.index_category}*`);
33
+ const rows = await queryTable("index_values", filters, {
34
+ order: "date.desc,index_code.asc",
35
+ limit: params.limit,
36
+ });
37
+ if (rows.length === 0) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: "text",
42
+ text: JSON.stringify({
43
+ tool: "get_index_benchmarks",
44
+ error: params.index_code
45
+ ? `No index found for '${params.index_code}'. Omit index_code to see all available indexes.`
46
+ : "No index data available.",
47
+ }),
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ // Extract unique index codes for summary
53
+ const indexCodes = [...new Set(rows.map((r) => r.index_code))];
54
+ const dates = [...new Set(rows.map((r) => r.date))].sort().reverse();
55
+ // Group by date for structured output
56
+ const byDate = {};
57
+ for (const row of rows) {
58
+ if (!byDate[row.date])
59
+ byDate[row.date] = [];
60
+ byDate[row.date].push(row);
61
+ }
62
+ // Format each entry
63
+ const formatted = rows.map((r) => ({
64
+ index_code: r.index_code,
65
+ index_category: r.index_category,
66
+ description: r.index_description,
67
+ date: r.date,
68
+ unit: r.unit,
69
+ input_price: r.input_price,
70
+ cached_price: r.cached_price,
71
+ output_price: r.output_price,
72
+ sku_count: r.sku_count,
73
+ }));
74
+ return {
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: JSON.stringify({
79
+ tool: "get_index_benchmarks",
80
+ tier,
81
+ description: "AIPI (ATOM Inference Price Index) — chained matched-model price benchmarks for AI inference.",
82
+ summary: {
83
+ total_indexes: indexCodes.length,
84
+ indexes_available: indexCodes,
85
+ date_range: {
86
+ latest: dates[0],
87
+ earliest: dates[dates.length - 1],
88
+ total_periods: dates.length,
89
+ },
90
+ },
91
+ benchmarks: formatted,
92
+ methodology: "Chained matched-model index. Only SKUs present in consecutive periods are compared, eliminating composition bias. See https://a7om.com/methodology",
93
+ source: "https://a7om.com",
94
+ }, null, 2),
95
+ },
96
+ ],
97
+ };
98
+ }
99
+ //# sourceMappingURL=get-index-benchmarks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-index-benchmarks.js","sourceRoot":"","sources":["../../src/tools/get-index-benchmarks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const getKpisSchema: {};
4
+ export declare function handleGetKpis(_params: z.infer<z.ZodObject<typeof getKpisSchema>>, tier: Tier): Promise<{
5
+ content: {
6
+ type: "text";
7
+ text: string;
8
+ }[];
9
+ }>;
10
+ //# sourceMappingURL=get-kpis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-kpis.d.ts","sourceRoot":"","sources":["../../src/tools/get-kpis.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAExC,eAAO,MAAM,aAAa,IAAK,CAAC;AAEhC,wBAAsB,aAAa,CACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,aAAa,CAAC,CAAC,EACnD,IAAI,EAAE,IAAI;;;;;GAgDX"}
@@ -0,0 +1,45 @@
1
+ // ============================================================
2
+ // Tool: get_kpis
3
+ // Developer-focused market KPIs from v_pricing_intel.
4
+ // ============================================================
5
+ import { queryView } from "../supabase.js";
6
+ export const getKpisSchema = {};
7
+ export async function handleGetKpis(_params, tier) {
8
+ // KPIs are public market intelligence — available to all tiers
9
+ // v_pricing_intel returns rows with KPI data
10
+ let kpis = [];
11
+ try {
12
+ kpis = await queryView("v_pricing_intel");
13
+ }
14
+ catch (error) {
15
+ // If view doesn't exist or fails, return graceful error
16
+ return {
17
+ content: [
18
+ {
19
+ type: "text",
20
+ text: JSON.stringify({
21
+ tool: "get_kpis",
22
+ tier,
23
+ error: "KPI view temporarily unavailable. Try again later.",
24
+ detail: String(error),
25
+ }, null, 2),
26
+ },
27
+ ],
28
+ };
29
+ }
30
+ return {
31
+ content: [
32
+ {
33
+ type: "text",
34
+ text: JSON.stringify({
35
+ tool: "get_kpis",
36
+ tier,
37
+ description: "ATOM Inference Price Index — market-level KPIs derived from 1,600+ SKUs across 40+ vendors.",
38
+ kpis,
39
+ source: "https://a7om.com",
40
+ }, null, 2),
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ //# sourceMappingURL=get-kpis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-kpis.js","sourceRoot":"","sources":["../../src/tools/get-kpis.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,iBAAiB;AACjB,sDAAsD;AACtD,+DAA+D;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAmD,EACnD,IAAU;IAEV,+DAA+D;IAC/D,6CAA6C;IAC7C,IAAI,IAAI,GAA8B,EAAE,CAAC;IAEzC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,SAAS,CAA0B,iBAAiB,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,wDAAwD;QACxD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,IAAI,EAAE,UAAU;wBAChB,IAAI;wBACJ,KAAK,EAAE,oDAAoD;wBAC3D,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC;qBACtB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI;oBACJ,WAAW,EACT,6FAA6F;oBAC/F,IAAI;oBACJ,MAAM,EAAE,kBAAkB;iBAC3B,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const getMarketStatsSchema: {
4
+ modality: z.ZodOptional<z.ZodString>;
5
+ };
6
+ export declare function handleGetMarketStats(params: z.infer<z.ZodObject<typeof getMarketStatsSchema>>, tier: Tier): Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ }>;
12
+ //# sourceMappingURL=get-market-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-market-stats.d.ts","sourceRoot":"","sources":["../../src/tools/get-market-stats.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,oBAAoB;;CAKhC,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,oBAAoB,CAAC,CAAC,EACzD,IAAI,EAAE,IAAI;;cAgFa,MAAM;cAAQ,MAAM;;GAY5C"}
@@ -0,0 +1,95 @@
1
+ // ============================================================
2
+ // Tool: get_market_stats
3
+ // Aggregate market intelligence from views.
4
+ // ============================================================
5
+ import { z } from "zod";
6
+ import { queryTable, queryView } from "../supabase.js";
7
+ import { freeTierNote } from "../auth.js";
8
+ export const getMarketStatsSchema = {
9
+ modality: z
10
+ .string()
11
+ .optional()
12
+ .describe("Optionally focus on a specific modality: Text, Image, Audio, Video, etc."),
13
+ };
14
+ export async function handleGetMarketStats(params, tier) {
15
+ // Get summary stats from view — returns rows of {metric, value}
16
+ const statRows = await queryView("v_summary_stats");
17
+ // Convert to a lookup object
18
+ const coverage = {};
19
+ for (const row of statRows) {
20
+ coverage[row.metric] = row.value;
21
+ }
22
+ // Get price distribution for the requested modality
23
+ const priceFilters = [];
24
+ if (params.modality)
25
+ priceFilters.push(`modality=ilike.*${params.modality}*`);
26
+ priceFilters.push("normalized_price=gt.0");
27
+ const skus = await queryTable("sku_index", priceFilters, {
28
+ select: "normalized_price,modality,direction,vendor_name",
29
+ });
30
+ const prices = skus
31
+ .map((s) => s.normalized_price)
32
+ .filter((p) => p !== null && p > 0)
33
+ .sort((a, b) => a - b);
34
+ const median = prices.length > 0
35
+ ? prices[Math.floor(prices.length / 2)]
36
+ : null;
37
+ const mean = prices.length > 0
38
+ ? +(prices.reduce((a, b) => a + b, 0) / prices.length).toFixed(6)
39
+ : null;
40
+ // Vendor distribution
41
+ const vendorCounts = {};
42
+ for (const s of skus) {
43
+ const v = s.vendor_name;
44
+ vendorCounts[v] = (vendorCounts[v] || 0) + 1;
45
+ }
46
+ // Modality distribution
47
+ const modalityCounts = {};
48
+ for (const s of skus) {
49
+ const m = s.modality;
50
+ modalityCounts[m] = (modalityCounts[m] || 0) + 1;
51
+ }
52
+ // Direction distribution
53
+ const directionCounts = {};
54
+ for (const s of skus) {
55
+ const d = s.direction;
56
+ directionCounts[d] = (directionCounts[d] || 0) + 1;
57
+ }
58
+ const response = {
59
+ tool: "get_market_stats",
60
+ tier,
61
+ coverage,
62
+ price_distribution: {
63
+ modality_filter: params.modality || "All",
64
+ total_skus: prices.length,
65
+ median_price: median,
66
+ mean_price: mean,
67
+ min_price: prices.length > 0 ? prices[0] : null,
68
+ max_price: prices.length > 0 ? prices[prices.length - 1] : null,
69
+ p25: prices.length > 0 ? prices[Math.floor(prices.length * 0.25)] : null,
70
+ p75: prices.length > 0 ? prices[Math.floor(prices.length * 0.75)] : null,
71
+ },
72
+ modality_breakdown: modalityCounts,
73
+ direction_breakdown: directionCounts,
74
+ };
75
+ // Vendor breakdown only for paid tier
76
+ if (tier === "paid") {
77
+ response.vendor_breakdown = vendorCounts;
78
+ }
79
+ else {
80
+ response.vendor_count = Object.keys(vendorCounts).length;
81
+ response.upgrade_message =
82
+ "Vendor-level breakdown requires ATOM MCP Pro ($49/mo). Visit https://a7om.com/mcp";
83
+ }
84
+ const content = [
85
+ {
86
+ type: "text",
87
+ text: JSON.stringify(response, null, 2),
88
+ },
89
+ ];
90
+ if (tier === "free") {
91
+ content.push(freeTierNote("Vendor-level breakdown and granular market segmentation"));
92
+ }
93
+ return { content };
94
+ }
95
+ //# sourceMappingURL=get-market-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-market-stats.js","sourceRoot":"","sources":["../../src/tools/get-market-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const getModelDetailSchema: {
4
+ model_name: z.ZodString;
5
+ };
6
+ export declare function handleGetModelDetail(params: z.infer<z.ZodObject<typeof getModelDetailSchema>>, tier: Tier): Promise<{
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ }>;
12
+ //# sourceMappingURL=get-model-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-model-detail.d.ts","sourceRoot":"","sources":["../../src/tools/get-model-detail.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAEjE,eAAO,MAAM,oBAAoB;;CAIhC,CAAC;AAEF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,oBAAoB,CAAC,CAAC,EACzD,IAAI,EAAE,IAAI;;;;;GAoGX"}
@@ -0,0 +1,96 @@
1
+ // ============================================================
2
+ // Tool: get_model_detail
3
+ // Deep dive on a single model — specs + pricing across vendors.
4
+ // ============================================================
5
+ import { z } from "zod";
6
+ import { queryTable } from "../supabase.js";
7
+ import { gateResults, freeTierNote } from "../auth.js";
8
+ export const getModelDetailSchema = {
9
+ model_name: z
10
+ .string()
11
+ .describe("Model name to look up, e.g. 'GPT-4o', 'Claude Sonnet 4.5', 'Llama 3.1 70B'"),
12
+ };
13
+ export async function handleGetModelDetail(params, tier) {
14
+ // Find model in registry (fuzzy match)
15
+ const models = await queryTable("model_registry", [
16
+ `model_name=ilike.*${params.model_name}*`,
17
+ ], {
18
+ limit: 5,
19
+ });
20
+ if (models.length === 0) {
21
+ return {
22
+ content: [
23
+ {
24
+ type: "text",
25
+ text: JSON.stringify({
26
+ tool: "get_model_detail",
27
+ error: `No model found matching '${params.model_name}'. Try a partial name like 'GPT-4' or 'Claude'.`,
28
+ }),
29
+ },
30
+ ],
31
+ };
32
+ }
33
+ const model = models[0];
34
+ // Get all SKUs for this model across vendors
35
+ const skus = await queryTable("sku_index", [
36
+ `model_id=eq.${model.model_id}`,
37
+ ], {
38
+ select: "sku_id,vendor_name,model_name,modality,modality_subtype,direction,normalized_price,normalized_price_unit,billing_method",
39
+ order: "normalized_price.asc",
40
+ });
41
+ // Build response
42
+ const modelSpecs = {
43
+ model_id: model.model_id,
44
+ model_name: model.model_name,
45
+ creator: model.creator,
46
+ model_family: model.model_family,
47
+ open_source: model.open_source,
48
+ parameter_count: model.parameter_count,
49
+ context_window: model.context_window,
50
+ max_output_tokens: model.max_output_tokens,
51
+ training_cutoff: model.training_cutoff,
52
+ modality_input: model.modality_input,
53
+ modality_output: model.modality_output,
54
+ tool_calling: model.tool_calling,
55
+ json_mode: model.json_mode,
56
+ streaming: model.streaming,
57
+ source_url: model.source_url,
58
+ };
59
+ let pricing;
60
+ if (tier === "paid") {
61
+ pricing = skus;
62
+ }
63
+ else {
64
+ // Free tier: show count and redacted sample
65
+ const vendors = [...new Set(skus.map((s) => s.vendor_name))];
66
+ pricing = {
67
+ total_skus: skus.length,
68
+ vendors_offering: vendors.length,
69
+ modalities: [...new Set(skus.map((s) => s.modality))],
70
+ directions: [...new Set(skus.map((s) => s.direction))],
71
+ sample: gateResults(skus.slice(0, 3), "free"),
72
+ upgrade_message: "Full vendor-by-vendor pricing requires ATOM MCP Pro ($49/mo). Visit https://a7om.com/mcp",
73
+ };
74
+ }
75
+ // Additional matches (other models with similar names)
76
+ const additionalMatches = models.length > 1
77
+ ? models.slice(1).map((m) => m.model_name)
78
+ : [];
79
+ const content = [
80
+ {
81
+ type: "text",
82
+ text: JSON.stringify({
83
+ tool: "get_model_detail",
84
+ tier,
85
+ model_specs: modelSpecs,
86
+ pricing,
87
+ additional_matches: additionalMatches,
88
+ }, null, 2),
89
+ },
90
+ ];
91
+ if (tier === "free") {
92
+ content.push(freeTierNote("Detailed per-vendor pricing for this model"));
93
+ }
94
+ return { content };
95
+ }
96
+ //# sourceMappingURL=get-model-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-model-detail.js","sourceRoot":"","sources":["../../src/tools/get-model-detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const getVendorCatalogSchema: {
4
+ vendor: z.ZodString;
5
+ modality: z.ZodOptional<z.ZodString>;
6
+ direction: z.ZodOptional<z.ZodEnum<["Input", "Output", "Cached Input"]>>;
7
+ limit: z.ZodDefault<z.ZodNumber>;
8
+ };
9
+ export declare function handleGetVendorCatalog(params: z.infer<z.ZodObject<typeof getVendorCatalogSchema>>, tier: Tier): Promise<{
10
+ content: {
11
+ type: "text";
12
+ text: string;
13
+ }[];
14
+ }>;
15
+ //# sourceMappingURL=get-vendor-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-vendor-catalog.d.ts","sourceRoot":"","sources":["../../src/tools/get-vendor-catalog.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,sBAAsB;;;;;CAmBlC,CAAC;AAEF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,sBAAsB,CAAC,CAAC,EAC3D,IAAI,EAAE,IAAI;;;;;GAuFX"}
@@ -0,0 +1,102 @@
1
+ // ============================================================
2
+ // Tool: get_vendor_catalog
3
+ // Everything a vendor offers: models, modalities, prices + metadata.
4
+ // ============================================================
5
+ import { z } from "zod";
6
+ import { queryTable } from "../supabase.js";
7
+ import { gateResults, freeTierNote } from "../auth.js";
8
+ export const getVendorCatalogSchema = {
9
+ vendor: z
10
+ .string()
11
+ .describe("Vendor name, e.g. 'OpenAI', 'Together AI', 'Amazon Bedrock'"),
12
+ modality: z
13
+ .string()
14
+ .optional()
15
+ .describe("Optionally filter by modality: Text, Image, Audio, Video, Voice, Multimodal"),
16
+ direction: z
17
+ .enum(["Input", "Output", "Cached Input"])
18
+ .optional()
19
+ .describe("Optionally filter by pricing direction"),
20
+ limit: z
21
+ .coerce.number()
22
+ .int()
23
+ .min(1)
24
+ .max(200)
25
+ .default(50)
26
+ .describe("Maximum results (default 50)"),
27
+ };
28
+ export async function handleGetVendorCatalog(params, tier) {
29
+ // Get vendor metadata
30
+ const vendors = await queryTable("vendor_registry", [
31
+ `vendor_name=ilike.*${params.vendor}*`,
32
+ ]);
33
+ if (vendors.length === 0) {
34
+ return {
35
+ content: [
36
+ {
37
+ type: "text",
38
+ text: JSON.stringify({
39
+ tool: "get_vendor_catalog",
40
+ error: `No vendor found matching '${params.vendor}'. Use list_vendors to see all available vendors.`,
41
+ }),
42
+ },
43
+ ],
44
+ };
45
+ }
46
+ const vendor = vendors[0];
47
+ // Get all SKUs for this vendor
48
+ const skuFilters = [
49
+ `vendor_name=ilike.*${params.vendor}*`,
50
+ ];
51
+ if (params.modality)
52
+ skuFilters.push(`modality=ilike.*${params.modality}*`);
53
+ if (params.direction)
54
+ skuFilters.push(`direction=eq.${params.direction}`);
55
+ const skus = await queryTable("sku_index", skuFilters, {
56
+ select: "sku_id,vendor_name,model_name,modality,modality_subtype,direction,normalized_price,normalized_price_unit,billing_method",
57
+ order: "model_name.asc,direction.asc",
58
+ limit: params.limit,
59
+ });
60
+ // Build catalog summary
61
+ const models = [...new Set(skus.map((s) => s.model_name))];
62
+ const modalities = [...new Set(skus.map((s) => s.modality))];
63
+ const catalogSummary = {
64
+ vendor_name: vendor.vendor_name,
65
+ country: vendor.country,
66
+ region: vendor.region,
67
+ pricing_page: vendor.pricing_page_url,
68
+ website: vendor.vendor_url,
69
+ total_models: models.length,
70
+ total_skus: skus.length,
71
+ modalities,
72
+ };
73
+ let catalog;
74
+ if (tier === "paid") {
75
+ catalog = {
76
+ summary: catalogSummary,
77
+ skus,
78
+ };
79
+ }
80
+ else {
81
+ catalog = {
82
+ summary: catalogSummary,
83
+ sample: gateResults(skus.slice(0, 3), "free"),
84
+ upgrade_message: "Full catalog with pricing requires ATOM MCP Pro ($49/mo). Visit https://a7om.com/mcp",
85
+ };
86
+ }
87
+ const content = [
88
+ {
89
+ type: "text",
90
+ text: JSON.stringify({
91
+ tool: "get_vendor_catalog",
92
+ tier,
93
+ catalog,
94
+ }, null, 2),
95
+ },
96
+ ];
97
+ if (tier === "free") {
98
+ content.push(freeTierNote("Full vendor catalog with all SKU-level pricing"));
99
+ }
100
+ return { content };
101
+ }
102
+ //# sourceMappingURL=get-vendor-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-vendor-catalog.js","sourceRoot":"","sources":["../../src/tools/get-vendor-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const listVendorsSchema: {
4
+ region: z.ZodOptional<z.ZodString>;
5
+ country: z.ZodOptional<z.ZodString>;
6
+ };
7
+ export declare function handleListVendors(params: z.infer<z.ZodObject<typeof listVendorsSchema>>, tier: Tier): Promise<{
8
+ content: {
9
+ type: "text";
10
+ text: string;
11
+ }[];
12
+ }>;
13
+ //# sourceMappingURL=list-vendors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-vendors.d.ts","sourceRoot":"","sources":["../../src/tools/list-vendors.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,aAAa,CAAC;AAExD,eAAO,MAAM,iBAAiB;;;CAS7B,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,iBAAiB,CAAC,CAAC,EACtD,IAAI,EAAE,IAAI;;;;;GAqCX"}
@@ -0,0 +1,49 @@
1
+ // ============================================================
2
+ // Tool: list_vendors
3
+ // All tracked vendors with metadata. Simple discovery tool.
4
+ // ============================================================
5
+ import { z } from "zod";
6
+ import { queryTable } from "../supabase.js";
7
+ export const listVendorsSchema = {
8
+ region: z
9
+ .string()
10
+ .optional()
11
+ .describe("Optionally filter by region: 'North America', 'Europe', 'Asia', etc."),
12
+ country: z
13
+ .string()
14
+ .optional()
15
+ .describe("Optionally filter by country, e.g. 'United States', 'China', 'France'"),
16
+ };
17
+ export async function handleListVendors(params, tier) {
18
+ const filters = [];
19
+ if (params.region)
20
+ filters.push(`region=ilike.*${params.region}*`);
21
+ if (params.country)
22
+ filters.push(`country=ilike.*${params.country}*`);
23
+ const vendors = await queryTable("vendor_registry", filters, {
24
+ order: "vendor_name.asc",
25
+ });
26
+ // Vendor list is public info — no gating needed.
27
+ const formatted = vendors.map((v) => ({
28
+ vendor_id: v.vendor_id,
29
+ name: v.vendor_name,
30
+ country: v.country,
31
+ region: v.region,
32
+ pricing_page: v.pricing_page_url,
33
+ website: v.vendor_url,
34
+ }));
35
+ return {
36
+ content: [
37
+ {
38
+ type: "text",
39
+ text: JSON.stringify({
40
+ tool: "list_vendors",
41
+ tier,
42
+ total: formatted.length,
43
+ vendors: formatted,
44
+ }, null, 2),
45
+ },
46
+ ],
47
+ };
48
+ }
49
+ //# sourceMappingURL=list-vendors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-vendors.js","sourceRoot":"","sources":["../../src/tools/list-vendors.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,qBAAqB;AACrB,4DAA4D;AAC5D,+DAA+D;AAE/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sEAAsE,CAAC;IACnF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,uEAAuE,CAAC;CACrF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAsD,EACtD,IAAU;IAEV,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACnE,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAiB,iBAAiB,EAAE,OAAO,EAAE;QAC3E,KAAK,EAAE,iBAAiB;KACzB,CAAC,CAAC;IAEH,iDAAiD;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,IAAI,EAAE,CAAC,CAAC,WAAW;QACnB,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,YAAY,EAAE,CAAC,CAAC,gBAAgB;QAChC,OAAO,EAAE,CAAC,CAAC,UAAU;KACtB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,IAAI,EAAE,cAAc;oBACpB,IAAI;oBACJ,KAAK,EAAE,SAAS,CAAC,MAAM;oBACvB,OAAO,EAAE,SAAS;iBACnB,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ import type { Tier } from "../types.js";
3
+ export declare const searchModelsSchema: {
4
+ modality: z.ZodOptional<z.ZodString>;
5
+ vendor: z.ZodOptional<z.ZodString>;
6
+ creator: z.ZodOptional<z.ZodString>;
7
+ model_family: z.ZodOptional<z.ZodString>;
8
+ open_source: z.ZodOptional<z.ZodString>;
9
+ direction: z.ZodOptional<z.ZodEnum<["Input", "Output", "Cached Input"]>>;
10
+ max_price: z.ZodOptional<z.ZodNumber>;
11
+ min_context_window: z.ZodOptional<z.ZodNumber>;
12
+ min_parameter_count: z.ZodOptional<z.ZodString>;
13
+ limit: z.ZodDefault<z.ZodNumber>;
14
+ offset: z.ZodDefault<z.ZodNumber>;
15
+ };
16
+ export declare function handleSearchModels(params: z.infer<z.ZodObject<typeof searchModelsSchema>>, tier: Tier): Promise<{
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ }>;
22
+ //# sourceMappingURL=search-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-models.d.ts","sourceRoot":"","sources":["../../src/tools/search-models.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,aAAa,CAAC;AAEjE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;CAmD9B,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,kBAAkB,CAAC,CAAC,EACvD,IAAI,EAAE,IAAI;;cAiDa,MAAM;cAAQ,MAAM;;GA+B5C"}