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.
- package/Dockerfile +18 -0
- package/README.md +184 -0
- package/claude_desktop_config.json +8 -0
- package/dist/auth.d.ts +38 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +75 -0
- package/dist/auth.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +234 -0
- package/dist/server.js.map +1 -0
- package/dist/supabase.d.ts +18 -0
- package/dist/supabase.d.ts.map +1 -0
- package/dist/supabase.js +86 -0
- package/dist/supabase.js.map +1 -0
- package/dist/tools/compare-prices.d.ts +16 -0
- package/dist/tools/compare-prices.d.ts.map +1 -0
- package/dist/tools/compare-prices.js +152 -0
- package/dist/tools/compare-prices.js.map +1 -0
- package/dist/tools/get-index-benchmarks.d.ts +14 -0
- package/dist/tools/get-index-benchmarks.d.ts.map +1 -0
- package/dist/tools/get-index-benchmarks.js +99 -0
- package/dist/tools/get-index-benchmarks.js.map +1 -0
- package/dist/tools/get-kpis.d.ts +10 -0
- package/dist/tools/get-kpis.d.ts.map +1 -0
- package/dist/tools/get-kpis.js +45 -0
- package/dist/tools/get-kpis.js.map +1 -0
- package/dist/tools/get-market-stats.d.ts +12 -0
- package/dist/tools/get-market-stats.d.ts.map +1 -0
- package/dist/tools/get-market-stats.js +95 -0
- package/dist/tools/get-market-stats.js.map +1 -0
- package/dist/tools/get-model-detail.d.ts +12 -0
- package/dist/tools/get-model-detail.d.ts.map +1 -0
- package/dist/tools/get-model-detail.js +96 -0
- package/dist/tools/get-model-detail.js.map +1 -0
- package/dist/tools/get-vendor-catalog.d.ts +15 -0
- package/dist/tools/get-vendor-catalog.d.ts.map +1 -0
- package/dist/tools/get-vendor-catalog.js +102 -0
- package/dist/tools/get-vendor-catalog.js.map +1 -0
- package/dist/tools/list-vendors.d.ts +13 -0
- package/dist/tools/list-vendors.d.ts.map +1 -0
- package/dist/tools/list-vendors.js +49 -0
- package/dist/tools/list-vendors.js.map +1 -0
- package/dist/tools/search-models.d.ts +22 -0
- package/dist/tools/search-models.d.ts.map +1 -0
- package/dist/tools/search-models.js +128 -0
- package/dist/tools/search-models.js.map +1 -0
- package/dist/types.d.ts +119 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/env.example +17 -0
- package/package.json +52 -0
- package/railway.json +13 -0
- package/smithery.yaml +36 -0
- package/src/auth.ts +101 -0
- package/src/index.ts +94 -0
- package/src/server.ts +278 -0
- package/src/supabase.ts +125 -0
- package/src/tools/compare-prices.ts +175 -0
- package/src/tools/get-index-benchmarks.ts +122 -0
- package/src/tools/get-kpis.ts +62 -0
- package/src/tools/get-market-stats.ts +112 -0
- package/src/tools/get-model-detail.ts +119 -0
- package/src/tools/get-vendor-catalog.ts +121 -0
- package/src/tools/list-vendors.ts +60 -0
- package/src/tools/search-models.ts +146 -0
- package/src/types.ts +145 -0
- 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"}
|