@cryptoquant_official/mcp 0.0.4 → 0.0.6-alpha
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/LICENSE +21 -0
- package/README.md +330 -37
- package/dist/ai-sdk/anthropic.d.ts +125 -0
- package/dist/ai-sdk/anthropic.d.ts.map +1 -0
- package/dist/ai-sdk/anthropic.js +278 -0
- package/dist/ai-sdk/anthropic.js.map +1 -0
- package/dist/ai-sdk/execute.d.ts +35 -0
- package/dist/ai-sdk/execute.d.ts.map +1 -0
- package/dist/ai-sdk/execute.js +531 -0
- package/dist/ai-sdk/execute.js.map +1 -0
- package/dist/ai-sdk/index.d.ts +53 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +56 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/ai-sdk/prompts.d.ts +34 -0
- package/dist/ai-sdk/prompts.d.ts.map +1 -0
- package/dist/ai-sdk/prompts.js +74 -0
- package/dist/ai-sdk/prompts.js.map +1 -0
- package/dist/ai-sdk/schemas.d.ts +66 -0
- package/dist/ai-sdk/schemas.d.ts.map +1 -0
- package/dist/ai-sdk/schemas.js +136 -0
- package/dist/ai-sdk/schemas.js.map +1 -0
- package/dist/ai-sdk/tools.d.ts +165 -0
- package/dist/ai-sdk/tools.d.ts.map +1 -0
- package/dist/ai-sdk/tools.js +152 -0
- package/dist/ai-sdk/tools.js.map +1 -0
- package/dist/ai-sdk/types.d.ts +149 -0
- package/dist/ai-sdk/types.d.ts.map +1 -0
- package/dist/ai-sdk/types.js +5 -0
- package/dist/ai-sdk/types.js.map +1 -0
- package/dist/core/auth/storage.d.ts.map +1 -0
- package/dist/core/auth/storage.js.map +1 -0
- package/dist/core/cache/storage.d.ts +110 -0
- package/dist/core/cache/storage.d.ts.map +1 -0
- package/dist/core/cache/storage.js +356 -0
- package/dist/core/cache/storage.js.map +1 -0
- package/dist/core/cache/summary.d.ts.map +1 -0
- package/dist/core/cache/summary.js.map +1 -0
- package/dist/{cache → core/cache}/types.d.ts +25 -0
- package/dist/{cache → core/cache}/types.d.ts.map +1 -1
- package/dist/core/cache/types.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/discovery.d.ts.map +1 -0
- package/dist/{discovery.js → core/discovery.js} +14 -2
- package/dist/core/discovery.js.map +1 -0
- package/dist/core/index.d.ts +16 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +19 -0
- package/dist/core/index.js.map +1 -0
- package/dist/{permissions.d.ts → core/permissions.d.ts} +2 -2
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/{permissions.js → core/permissions.js} +38 -14
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/plan-limits.d.ts.map +1 -0
- package/dist/core/plan-limits.js.map +1 -0
- package/dist/{utils.d.ts → core/utils.d.ts} +13 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/{utils.js → core/utils.js} +34 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/data/metrics.toon +8 -5
- package/dist/http/chat-proxy.d.ts +32 -0
- package/dist/http/chat-proxy.d.ts.map +1 -0
- package/dist/http/chat-proxy.js +310 -0
- package/dist/http/chat-proxy.js.map +1 -0
- package/dist/http/index.d.ts +12 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +30 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/server.d.ts +20 -0
- package/dist/http/server.d.ts.map +1 -0
- package/dist/http/server.js +231 -0
- package/dist/http/server.js.map +1 -0
- package/dist/shared/metrics-data.generated.d.ts +176 -0
- package/dist/shared/metrics-data.generated.d.ts.map +1 -0
- package/dist/shared/metrics-data.generated.js +3077 -0
- package/dist/shared/metrics-data.generated.js.map +1 -0
- package/dist/stdio/index.d.ts +10 -0
- package/dist/stdio/index.d.ts.map +1 -0
- package/dist/stdio/index.js +30 -0
- package/dist/stdio/index.js.map +1 -0
- package/dist/stdio/tools/auth.d.ts +3 -0
- package/dist/stdio/tools/auth.d.ts.map +1 -0
- package/dist/{tools → stdio/tools}/auth.js +38 -12
- package/dist/stdio/tools/auth.js.map +1 -0
- package/dist/stdio/tools/core.d.ts +3 -0
- package/dist/stdio/tools/core.d.ts.map +1 -0
- package/dist/{tools → stdio/tools}/core.js +122 -162
- package/dist/stdio/tools/core.js.map +1 -0
- package/package.json +55 -14
- package/dist/auth/storage.d.ts.map +0 -1
- package/dist/auth/storage.js.map +0 -1
- package/dist/cache/storage.d.ts +0 -47
- package/dist/cache/storage.d.ts.map +0 -1
- package/dist/cache/storage.js +0 -140
- package/dist/cache/storage.js.map +0 -1
- package/dist/cache/summary.d.ts.map +0 -1
- package/dist/cache/summary.js.map +0 -1
- package/dist/cache/types.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/discovery.d.ts.map +0 -1
- package/dist/discovery.js.map +0 -1
- package/dist/index.d.ts +0 -18
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -46
- package/dist/index.js.map +0 -1
- package/dist/permissions.d.ts.map +0 -1
- package/dist/permissions.js.map +0 -1
- package/dist/plan-limits.d.ts.map +0 -1
- package/dist/plan-limits.js.map +0 -1
- package/dist/tools/auth.d.ts +0 -3
- package/dist/tools/auth.d.ts.map +0 -1
- package/dist/tools/auth.js.map +0 -1
- package/dist/tools/core.d.ts +0 -3
- package/dist/tools/core.d.ts.map +0 -1
- package/dist/tools/core.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
- /package/dist/{auth → core/auth}/storage.d.ts +0 -0
- /package/dist/{auth → core/auth}/storage.js +0 -0
- /package/dist/{cache → core/cache}/summary.d.ts +0 -0
- /package/dist/{cache → core/cache}/summary.js +0 -0
- /package/dist/{cache → core/cache}/types.js +0 -0
- /package/dist/{config.d.ts → core/config.d.ts} +0 -0
- /package/dist/{config.js → core/config.js} +0 -0
- /package/dist/{discovery.d.ts → core/discovery.d.ts} +0 -0
- /package/dist/{plan-limits.d.ts → core/plan-limits.d.ts} +0 -0
- /package/dist/{plan-limits.js → core/plan-limits.js} +0 -0
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool execution logic for CryptoQuant tools
|
|
3
|
+
* Shared between AI SDK integration and chat-proxy
|
|
4
|
+
*/
|
|
5
|
+
import { getApiBaseUrl, getApiUrl } from "../core/config.js";
|
|
6
|
+
import { getEndpointByPath, getParameterOptions, isDiscoveryLoaded, searchEndpoints, validateEndpointParams, } from "../core/discovery.js";
|
|
7
|
+
import { getPermissionState, initializePermissions, resetPermissions, } from "../core/permissions.js";
|
|
8
|
+
import { getPlanLimitsState, getRequiredPlan, hasEndpointAccess, validateDateRange, } from "../core/plan-limits.js";
|
|
9
|
+
import { logger } from "../core/utils.js";
|
|
10
|
+
import { METRIC_DEFINITIONS, SCORING_RULES, calculateScore, calculateTradingSignal, getAvailableMetrics, } from "../shared/metrics-data.generated.js";
|
|
11
|
+
/**
|
|
12
|
+
* Execute initialize tool
|
|
13
|
+
*/
|
|
14
|
+
export async function executeInitialize(params, context) {
|
|
15
|
+
const apiKey = params.api_key || context.cryptoquantApiKey;
|
|
16
|
+
if (!apiKey) {
|
|
17
|
+
return {
|
|
18
|
+
success: false,
|
|
19
|
+
error: "API key required. Provide cryptoquant_api_key in the config.",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
// Skip re-initialization if already authenticated with the same API key
|
|
23
|
+
const currentState = getPermissionState();
|
|
24
|
+
if (currentState.authenticated &&
|
|
25
|
+
currentState.api_key === apiKey &&
|
|
26
|
+
isDiscoveryLoaded()) {
|
|
27
|
+
logger.debug("[executeInitialize] already initialized, skipping");
|
|
28
|
+
const planState = getPlanLimitsState();
|
|
29
|
+
return {
|
|
30
|
+
success: true,
|
|
31
|
+
plan: planState.plan,
|
|
32
|
+
message: "Already initialized (cached)",
|
|
33
|
+
from_cache: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const apiUrl = getApiUrl();
|
|
37
|
+
resetPermissions();
|
|
38
|
+
const result = await initializePermissions(apiKey, apiUrl);
|
|
39
|
+
if (!result.success) {
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
error: result.error || "Failed to initialize",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Note: fetchDiscoveryEndpoints is already called inside initializePermissions
|
|
46
|
+
const planState = getPlanLimitsState();
|
|
47
|
+
return {
|
|
48
|
+
success: true,
|
|
49
|
+
plan: planState.plan,
|
|
50
|
+
message: "CryptoQuant session initialized successfully",
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execute discover_endpoints tool
|
|
55
|
+
*/
|
|
56
|
+
export async function executeDiscoverEndpoints(params) {
|
|
57
|
+
const state = getPermissionState();
|
|
58
|
+
if (!state.authenticated) {
|
|
59
|
+
return {
|
|
60
|
+
success: false,
|
|
61
|
+
error: "Not authenticated. Call initialize first.",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (!isDiscoveryLoaded()) {
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: "Discovery data not loaded. Try initializing again.",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const endpoints = searchEndpoints({
|
|
71
|
+
asset: params.asset,
|
|
72
|
+
category: params.category,
|
|
73
|
+
query: params.query,
|
|
74
|
+
});
|
|
75
|
+
// Group by category for cleaner output
|
|
76
|
+
const grouped = {};
|
|
77
|
+
for (const ep of endpoints.slice(0, 50)) {
|
|
78
|
+
// Limit to 50 for readability
|
|
79
|
+
grouped[ep.category] ??= [];
|
|
80
|
+
grouped[ep.category].push({ path: ep.path, metric: ep.metric });
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
total_found: endpoints.length,
|
|
85
|
+
showing: Math.min(endpoints.length, 50),
|
|
86
|
+
endpoints: grouped,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Execute query_data tool
|
|
91
|
+
*/
|
|
92
|
+
export async function executeQueryData(params, _context) {
|
|
93
|
+
const state = getPermissionState();
|
|
94
|
+
if (!state.authenticated || !state.api_key) {
|
|
95
|
+
return {
|
|
96
|
+
success: false,
|
|
97
|
+
error: "Not authenticated. Call initialize first.",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const endpointPath = params.endpoint;
|
|
101
|
+
const endpoint = getEndpointByPath(endpointPath);
|
|
102
|
+
if (!endpoint) {
|
|
103
|
+
// Try to suggest similar endpoints
|
|
104
|
+
const suggestions = searchEndpoints({
|
|
105
|
+
query: endpointPath.split("/").pop() || "",
|
|
106
|
+
})
|
|
107
|
+
.slice(0, 3)
|
|
108
|
+
.map((e) => e.path);
|
|
109
|
+
return {
|
|
110
|
+
success: false,
|
|
111
|
+
error: `Unknown endpoint: ${endpointPath}`,
|
|
112
|
+
suggestions,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Build query params
|
|
116
|
+
const queryParams = {};
|
|
117
|
+
if (params.window)
|
|
118
|
+
queryParams.window = params.window;
|
|
119
|
+
if (params.limit)
|
|
120
|
+
queryParams.limit = params.limit;
|
|
121
|
+
if (params.from)
|
|
122
|
+
queryParams.from = params.from;
|
|
123
|
+
if (params.to)
|
|
124
|
+
queryParams.to = params.to;
|
|
125
|
+
// Validate params
|
|
126
|
+
const validation = validateEndpointParams(endpoint, queryParams);
|
|
127
|
+
if (!validation.valid) {
|
|
128
|
+
const paramOptions = getParameterOptions(endpointPath);
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: "Invalid parameters",
|
|
132
|
+
details: validation.errors?.join(", "),
|
|
133
|
+
available_parameters: paramOptions?.parameters,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// Check plan access
|
|
137
|
+
const planState = getPlanLimitsState();
|
|
138
|
+
if (planState.loaded && !hasEndpointAccess(endpointPath)) {
|
|
139
|
+
const requiredPlan = getRequiredPlan(endpointPath);
|
|
140
|
+
return {
|
|
141
|
+
success: false,
|
|
142
|
+
error: "Endpoint not accessible on your plan",
|
|
143
|
+
your_plan: planState.plan,
|
|
144
|
+
required_plan: requiredPlan,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// Validate date range
|
|
148
|
+
if (planState.loaded && queryParams.from) {
|
|
149
|
+
const dateValidation = validateDateRange(endpointPath, queryParams.from, queryParams.window);
|
|
150
|
+
if (!dateValidation.valid) {
|
|
151
|
+
return {
|
|
152
|
+
success: false,
|
|
153
|
+
error: dateValidation.error || "Date range exceeds plan limit",
|
|
154
|
+
earliest_allowed: dateValidation.earliest_allowed,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Make API request
|
|
159
|
+
try {
|
|
160
|
+
const urlParams = new URLSearchParams();
|
|
161
|
+
for (const [key, value] of Object.entries(queryParams)) {
|
|
162
|
+
if (value !== undefined && value !== null) {
|
|
163
|
+
urlParams.set(key, String(value));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (!urlParams.has("limit")) {
|
|
167
|
+
urlParams.set("limit", "30");
|
|
168
|
+
}
|
|
169
|
+
const apiUrl = getApiBaseUrl();
|
|
170
|
+
const fullUrl = `${apiUrl}${endpointPath}?${urlParams.toString()}`;
|
|
171
|
+
logger.debug(`[execute] querying: ${fullUrl}`);
|
|
172
|
+
const response = await fetch(fullUrl, {
|
|
173
|
+
method: "GET",
|
|
174
|
+
headers: { Authorization: `Bearer ${state.api_key}` },
|
|
175
|
+
});
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
const errorBody = await response.text();
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
error: `API request failed: ${response.status}`,
|
|
181
|
+
details: errorBody,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
const data = await response.json();
|
|
185
|
+
return {
|
|
186
|
+
success: true,
|
|
187
|
+
endpoint: endpointPath,
|
|
188
|
+
...data,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
return {
|
|
193
|
+
success: false,
|
|
194
|
+
error: `Network error: ${error}`,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Execute describe_metric tool
|
|
200
|
+
*/
|
|
201
|
+
export async function executeDescribeMetric(params) {
|
|
202
|
+
const metricId = params.metric_id?.toLowerCase();
|
|
203
|
+
const definition = METRIC_DEFINITIONS[metricId];
|
|
204
|
+
if (definition) {
|
|
205
|
+
return {
|
|
206
|
+
success: true,
|
|
207
|
+
metric: definition,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
success: false,
|
|
212
|
+
error: `Unknown metric: ${metricId}`,
|
|
213
|
+
available: getAvailableMetrics(),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Execute market_summary tool
|
|
218
|
+
*/
|
|
219
|
+
export async function executeMarketSummary(params, _context) {
|
|
220
|
+
const state = getPermissionState();
|
|
221
|
+
if (!state.authenticated || !state.api_key) {
|
|
222
|
+
return {
|
|
223
|
+
success: false,
|
|
224
|
+
error: "Not authenticated. Call initialize first.",
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
const asset = params.asset || "btc";
|
|
228
|
+
const apiUrl = getApiBaseUrl();
|
|
229
|
+
// Query metrics in parallel
|
|
230
|
+
const endpoints = {
|
|
231
|
+
mvrv: `/v1/${asset}/market-indicator/mvrv`,
|
|
232
|
+
sopr: `/v1/${asset}/market-indicator/sopr`,
|
|
233
|
+
netflow: `/v1/${asset}/exchange-flows/netflow`,
|
|
234
|
+
};
|
|
235
|
+
try {
|
|
236
|
+
const results = await Promise.all(Object.entries(endpoints).map(async ([key, endpoint]) => {
|
|
237
|
+
const url = `${apiUrl}${endpoint}?window=day&limit=1`;
|
|
238
|
+
const response = await fetch(url, {
|
|
239
|
+
headers: { Authorization: `Bearer ${state.api_key}` },
|
|
240
|
+
});
|
|
241
|
+
if (!response.ok)
|
|
242
|
+
return { key, value: null };
|
|
243
|
+
const data = await response.json();
|
|
244
|
+
const value = data.result?.[0]?.value ?? data.result?.[0]?.netflow ?? null;
|
|
245
|
+
return { key, value };
|
|
246
|
+
}));
|
|
247
|
+
const metrics = [];
|
|
248
|
+
let bullishCount = 0;
|
|
249
|
+
let bearishCount = 0;
|
|
250
|
+
for (const { key, value } of results) {
|
|
251
|
+
if (value === null)
|
|
252
|
+
continue;
|
|
253
|
+
const score = calculateScore(key, value);
|
|
254
|
+
let signal;
|
|
255
|
+
let emoji;
|
|
256
|
+
if (score >= 70) {
|
|
257
|
+
signal = "bullish";
|
|
258
|
+
emoji = "🟢";
|
|
259
|
+
bullishCount++;
|
|
260
|
+
}
|
|
261
|
+
else if (score >= 45) {
|
|
262
|
+
signal = "neutral";
|
|
263
|
+
emoji = "🟡";
|
|
264
|
+
}
|
|
265
|
+
else if (score >= 30) {
|
|
266
|
+
signal = "caution";
|
|
267
|
+
emoji = "🟠";
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
signal = "bearish";
|
|
271
|
+
emoji = "🔴";
|
|
272
|
+
bearishCount++;
|
|
273
|
+
}
|
|
274
|
+
metrics.push({
|
|
275
|
+
metric: key.toUpperCase(),
|
|
276
|
+
value: typeof value === "number" ? Number(value.toFixed(4)) : value,
|
|
277
|
+
signal,
|
|
278
|
+
emoji,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
// Determine overall signal
|
|
282
|
+
let overallSignal;
|
|
283
|
+
if (bullishCount >= 3)
|
|
284
|
+
overallSignal = "Bullish";
|
|
285
|
+
else if (bullishCount >= 2)
|
|
286
|
+
overallSignal = "Slightly Bullish";
|
|
287
|
+
else if (bearishCount >= 3)
|
|
288
|
+
overallSignal = "Bearish";
|
|
289
|
+
else if (bearishCount >= 2)
|
|
290
|
+
overallSignal = "Slightly Bearish";
|
|
291
|
+
else
|
|
292
|
+
overallSignal = "Neutral";
|
|
293
|
+
return {
|
|
294
|
+
success: true,
|
|
295
|
+
asset: asset.toUpperCase(),
|
|
296
|
+
metrics,
|
|
297
|
+
overall: {
|
|
298
|
+
signal: overallSignal,
|
|
299
|
+
bullishCount,
|
|
300
|
+
bearishCount,
|
|
301
|
+
},
|
|
302
|
+
insight: generateMarketInsight(metrics),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
return {
|
|
307
|
+
success: false,
|
|
308
|
+
error: `Failed to fetch market data: ${error}`,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Execute trading_signal tool
|
|
314
|
+
*/
|
|
315
|
+
export async function executeTradingSignal(params, _context) {
|
|
316
|
+
const state = getPermissionState();
|
|
317
|
+
if (!state.authenticated || !state.api_key) {
|
|
318
|
+
return {
|
|
319
|
+
success: false,
|
|
320
|
+
error: "Not authenticated. Call initialize first.",
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
const asset = params.asset || "btc";
|
|
324
|
+
const apiUrl = getApiBaseUrl();
|
|
325
|
+
// Query metrics for signal calculation
|
|
326
|
+
const endpoints = {
|
|
327
|
+
mvrv: `/v1/${asset}/market-indicator/mvrv`,
|
|
328
|
+
sopr: `/v1/${asset}/market-indicator/sopr`,
|
|
329
|
+
netflow: `/v1/${asset}/exchange-flows/netflow`,
|
|
330
|
+
"funding-rates": `/v1/${asset}/market-data/funding-rates`,
|
|
331
|
+
};
|
|
332
|
+
try {
|
|
333
|
+
const metricValues = {};
|
|
334
|
+
const metricScores = [];
|
|
335
|
+
const results = await Promise.all(Object.entries(endpoints).map(async ([key, endpoint]) => {
|
|
336
|
+
const url = `${apiUrl}${endpoint}?window=day&limit=1`;
|
|
337
|
+
const response = await fetch(url, {
|
|
338
|
+
headers: { Authorization: `Bearer ${state.api_key}` },
|
|
339
|
+
});
|
|
340
|
+
if (!response.ok)
|
|
341
|
+
return { key, value: null };
|
|
342
|
+
const data = await response.json();
|
|
343
|
+
const value = data.result?.[0]?.value ?? data.result?.[0]?.netflow ?? data.result?.[0]?.rate ?? null;
|
|
344
|
+
return { key, value };
|
|
345
|
+
}));
|
|
346
|
+
for (const { key, value } of results) {
|
|
347
|
+
if (value === null)
|
|
348
|
+
continue;
|
|
349
|
+
metricValues[key] = value;
|
|
350
|
+
const score = calculateScore(key, value);
|
|
351
|
+
const scoring = SCORING_RULES[key];
|
|
352
|
+
const weight = scoring ? `${Math.round(scoring.weight * 100)}%` : "N/A";
|
|
353
|
+
metricScores.push({
|
|
354
|
+
metric: key.toUpperCase(),
|
|
355
|
+
value: typeof value === "number" ? Number(value.toFixed(6)) : value,
|
|
356
|
+
score,
|
|
357
|
+
weight,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
const { signal, confidence } = calculateTradingSignal(metricValues);
|
|
361
|
+
// Generate analysis
|
|
362
|
+
const analysis = {
|
|
363
|
+
bullish: [],
|
|
364
|
+
neutral: [],
|
|
365
|
+
bearish: [],
|
|
366
|
+
};
|
|
367
|
+
for (const ms of metricScores) {
|
|
368
|
+
if (ms.score >= 70) {
|
|
369
|
+
analysis.bullish.push(`${ms.metric} indicates buying opportunity`);
|
|
370
|
+
}
|
|
371
|
+
else if (ms.score >= 40) {
|
|
372
|
+
analysis.neutral.push(`${ms.metric} is neutral`);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
analysis.bearish.push(`${ms.metric} shows caution`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
success: true,
|
|
380
|
+
asset: asset.toUpperCase(),
|
|
381
|
+
signal,
|
|
382
|
+
confidence,
|
|
383
|
+
metrics: metricScores,
|
|
384
|
+
analysis,
|
|
385
|
+
disclaimer: "This is not financial advice. Always do your own research.",
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
return {
|
|
390
|
+
success: false,
|
|
391
|
+
error: `Failed to calculate trading signal: ${error}`,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Execute whale_activity tool
|
|
397
|
+
*/
|
|
398
|
+
export async function executeWhaleActivity(params, _context) {
|
|
399
|
+
const state = getPermissionState();
|
|
400
|
+
if (!state.authenticated || !state.api_key) {
|
|
401
|
+
return {
|
|
402
|
+
success: false,
|
|
403
|
+
error: "Not authenticated. Call initialize first.",
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
const asset = params.asset || "btc";
|
|
407
|
+
const timeframe = params.timeframe || "24h";
|
|
408
|
+
const apiUrl = getApiBaseUrl();
|
|
409
|
+
// Determine limit based on timeframe
|
|
410
|
+
const limitMap = { "24h": 1, "7d": 7, "30d": 30 };
|
|
411
|
+
const limit = limitMap[timeframe] || 1;
|
|
412
|
+
try {
|
|
413
|
+
// Query flow data (available on free plan)
|
|
414
|
+
const flowEndpoints = {
|
|
415
|
+
inflow: `/v1/${asset}/exchange-flows/inflow`,
|
|
416
|
+
outflow: `/v1/${asset}/exchange-flows/outflow`,
|
|
417
|
+
netflow: `/v1/${asset}/exchange-flows/netflow`,
|
|
418
|
+
};
|
|
419
|
+
const flowResults = await Promise.all(Object.entries(flowEndpoints).map(async ([key, endpoint]) => {
|
|
420
|
+
const url = `${apiUrl}${endpoint}?window=day&limit=${limit}&exchange=all_exchange`;
|
|
421
|
+
const response = await fetch(url, {
|
|
422
|
+
headers: { Authorization: `Bearer ${state.api_key}` },
|
|
423
|
+
});
|
|
424
|
+
if (!response.ok)
|
|
425
|
+
return { key, value: null };
|
|
426
|
+
const data = await response.json();
|
|
427
|
+
// Sum values for timeframe
|
|
428
|
+
const values = data.result?.map((r) => r.value ?? r[key] ?? 0) || [];
|
|
429
|
+
const total = values.reduce((a, b) => a + b, 0);
|
|
430
|
+
return { key, value: total };
|
|
431
|
+
}));
|
|
432
|
+
const flows = {
|
|
433
|
+
inflow: 0,
|
|
434
|
+
outflow: 0,
|
|
435
|
+
netflow: 0,
|
|
436
|
+
};
|
|
437
|
+
for (const { key, value } of flowResults) {
|
|
438
|
+
if (value !== null && key in flows) {
|
|
439
|
+
flows[key] = Math.round(value);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
// Try to get whale ratio (may require professional plan)
|
|
443
|
+
let whaleRatio;
|
|
444
|
+
let whaleStatus;
|
|
445
|
+
try {
|
|
446
|
+
const whaleUrl = `${apiUrl}/v1/${asset}/flow-indicator/exchange-whale-ratio?window=day&limit=1`;
|
|
447
|
+
const whaleResponse = await fetch(whaleUrl, {
|
|
448
|
+
headers: { Authorization: `Bearer ${state.api_key}` },
|
|
449
|
+
});
|
|
450
|
+
if (whaleResponse.ok) {
|
|
451
|
+
const whaleData = await whaleResponse.json();
|
|
452
|
+
whaleRatio = whaleData.result?.[0]?.value;
|
|
453
|
+
if (whaleRatio !== undefined) {
|
|
454
|
+
if (whaleRatio < 0.3)
|
|
455
|
+
whaleStatus = "Retail dominated";
|
|
456
|
+
else if (whaleRatio < 0.5)
|
|
457
|
+
whaleStatus = "Mixed";
|
|
458
|
+
else if (whaleRatio < 0.7)
|
|
459
|
+
whaleStatus = "Whale heavy";
|
|
460
|
+
else if (whaleRatio < 0.85)
|
|
461
|
+
whaleStatus = "Whale dominated";
|
|
462
|
+
else
|
|
463
|
+
whaleStatus = "Extreme whale activity";
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
catch {
|
|
468
|
+
// Whale ratio not available on current plan
|
|
469
|
+
}
|
|
470
|
+
// Determine behavior and signal
|
|
471
|
+
let behavior;
|
|
472
|
+
let signal;
|
|
473
|
+
if (flows.netflow < -1000) {
|
|
474
|
+
behavior = "Accumulation (outflow dominant)";
|
|
475
|
+
signal = whaleRatio && whaleRatio > 0.5 ? "Whale accumulation - Bullish" : "Accumulation - Bullish";
|
|
476
|
+
}
|
|
477
|
+
else if (flows.netflow > 1000) {
|
|
478
|
+
behavior = "Distribution (inflow dominant)";
|
|
479
|
+
signal = whaleRatio && whaleRatio > 0.5 ? "Whale distribution - Bearish" : "Distribution - Bearish";
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
behavior = "Balanced flow";
|
|
483
|
+
signal = "Neutral";
|
|
484
|
+
}
|
|
485
|
+
return {
|
|
486
|
+
success: true,
|
|
487
|
+
asset: asset.toUpperCase(),
|
|
488
|
+
timeframe,
|
|
489
|
+
whaleRatio: whaleRatio ? Number(whaleRatio.toFixed(4)) : undefined,
|
|
490
|
+
whaleStatus,
|
|
491
|
+
flows,
|
|
492
|
+
behavior,
|
|
493
|
+
signal,
|
|
494
|
+
note: whaleRatio === undefined ? "Whale ratio requires Professional plan. Showing flow data only." : undefined,
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
catch (error) {
|
|
498
|
+
return {
|
|
499
|
+
success: false,
|
|
500
|
+
error: `Failed to fetch whale activity: ${error}`,
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Generate market insight from metrics
|
|
506
|
+
*/
|
|
507
|
+
function generateMarketInsight(metrics) {
|
|
508
|
+
if (!metrics || metrics.length === 0)
|
|
509
|
+
return "Insufficient data for insight.";
|
|
510
|
+
const insights = [];
|
|
511
|
+
for (const m of metrics) {
|
|
512
|
+
if (m.signal === "bullish") {
|
|
513
|
+
if (m.metric === "MVRV")
|
|
514
|
+
insights.push("MVRV suggests undervaluation");
|
|
515
|
+
else if (m.metric === "SOPR")
|
|
516
|
+
insights.push("SOPR indicates capitulation");
|
|
517
|
+
else if (m.metric === "NETFLOW")
|
|
518
|
+
insights.push("Exchange outflows suggest accumulation");
|
|
519
|
+
}
|
|
520
|
+
else if (m.signal === "bearish") {
|
|
521
|
+
if (m.metric === "MVRV")
|
|
522
|
+
insights.push("MVRV shows overheated conditions");
|
|
523
|
+
else if (m.metric === "SOPR")
|
|
524
|
+
insights.push("SOPR shows heavy profit taking");
|
|
525
|
+
else if (m.metric === "NETFLOW")
|
|
526
|
+
insights.push("Exchange inflows suggest distribution");
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return insights.length > 0 ? insights.join(". ") + "." : "Mixed signals across metrics.";
|
|
530
|
+
}
|
|
531
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/ai-sdk/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CryptoQuant AI SDK Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides CryptoQuant on-chain analytics tools for use with Vercel AI SDK.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*
|
|
8
|
+
* @example Quick Start
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // 1. Install dependencies
|
|
11
|
+
* // npm install @cryptoquant_official/mcp ai @ai-sdk/react @ai-sdk/anthropic
|
|
12
|
+
*
|
|
13
|
+
* // 2. Create API route (app/api/chat/route.ts)
|
|
14
|
+
* import { streamText } from 'ai'
|
|
15
|
+
* import { anthropic } from '@ai-sdk/anthropic'
|
|
16
|
+
* import { createCryptoQuantTools } from '@cryptoquant_official/mcp/ai-sdk'
|
|
17
|
+
*
|
|
18
|
+
* export async function POST(req: Request) {
|
|
19
|
+
* const { messages } = await req.json()
|
|
20
|
+
*
|
|
21
|
+
* const result = streamText({
|
|
22
|
+
* model: anthropic('claude-sonnet-4-20250514'),
|
|
23
|
+
* messages,
|
|
24
|
+
* tools: createCryptoQuantTools({
|
|
25
|
+
* cryptoquantApiKey: process.env.CRYPTOQUANT_API_KEY!,
|
|
26
|
+
* }),
|
|
27
|
+
* maxSteps: 5,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* return result.toDataStreamResponse()
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // 3. Use in client component
|
|
34
|
+
* 'use client'
|
|
35
|
+
* import { useChat } from '@ai-sdk/react'
|
|
36
|
+
*
|
|
37
|
+
* export function Chat() {
|
|
38
|
+
* const { messages, input, handleSubmit, handleInputChange } = useChat()
|
|
39
|
+
* // ... render chat UI
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export { createCryptoQuantTools, cryptoQuantTools } from "./tools.js";
|
|
44
|
+
export { createAnthropicTools, createToolExecutor, getToolNames, isValidToolName, toolCacheTTL, } from "./anthropic.js";
|
|
45
|
+
export type { AnthropicTool, CryptoQuantToolName, ToolExecutorFn, } from "./anthropic.js";
|
|
46
|
+
export { CRYPTOQUANT_SYSTEM_PROMPT, CRYPTOQUANT_MINIMAL_PROMPT, } from "./prompts.js";
|
|
47
|
+
export { describeMetricSchema, discoverEndpointsSchema, initializeSchema, marketSummarySchema, queryDataSchema, tradingSignalSchema, whaleActivitySchema, } from "./schemas.js";
|
|
48
|
+
export type { DescribeMetricParams, DiscoverEndpointsParams, InitializeParams, MarketSummaryParams, QueryDataParams, TradingSignalParams, WhaleActivityParams, } from "./schemas.js";
|
|
49
|
+
export type { CryptoQuantToolsConfig, DescribeResult, DiscoverResult, InitializeResult, MarketSummaryResult, MetricScore, MetricSignal, QueryResult, ToolExecutionContext, TradingSignalResult, WhaleActivityResult, } from "./types.js";
|
|
50
|
+
export { executeDescribeMetric, executeDiscoverEndpoints, executeInitialize, executeMarketSummary, executeQueryData, executeTradingSignal, executeWhaleActivity, } from "./execute.js";
|
|
51
|
+
export { METRIC_DEFINITIONS, SCORING_RULES, MARKET_THRESHOLDS, WHALE_THRESHOLDS, CYCLE_PHASES, SIGNAL_LEGEND, INTERPRETATION_SYSTEM_PROMPT, calculateScore, calculateTradingSignal, getMetricSignal, getMetricDefinition, getAvailableMetrics, } from "../shared/metrics-data.generated.js";
|
|
52
|
+
export type { MetricDefinition, MetricThreshold, MetricScoring, ScoringRule, } from "../shared/metrics-data.generated.js";
|
|
53
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAGH,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGtE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,4BAA4B,EAC5B,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CryptoQuant AI SDK Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides CryptoQuant on-chain analytics tools for use with Vercel AI SDK.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*
|
|
8
|
+
* @example Quick Start
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // 1. Install dependencies
|
|
11
|
+
* // npm install @cryptoquant_official/mcp ai @ai-sdk/react @ai-sdk/anthropic
|
|
12
|
+
*
|
|
13
|
+
* // 2. Create API route (app/api/chat/route.ts)
|
|
14
|
+
* import { streamText } from 'ai'
|
|
15
|
+
* import { anthropic } from '@ai-sdk/anthropic'
|
|
16
|
+
* import { createCryptoQuantTools } from '@cryptoquant_official/mcp/ai-sdk'
|
|
17
|
+
*
|
|
18
|
+
* export async function POST(req: Request) {
|
|
19
|
+
* const { messages } = await req.json()
|
|
20
|
+
*
|
|
21
|
+
* const result = streamText({
|
|
22
|
+
* model: anthropic('claude-sonnet-4-20250514'),
|
|
23
|
+
* messages,
|
|
24
|
+
* tools: createCryptoQuantTools({
|
|
25
|
+
* cryptoquantApiKey: process.env.CRYPTOQUANT_API_KEY!,
|
|
26
|
+
* }),
|
|
27
|
+
* maxSteps: 5,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* return result.toDataStreamResponse()
|
|
31
|
+
* }
|
|
32
|
+
*
|
|
33
|
+
* // 3. Use in client component
|
|
34
|
+
* 'use client'
|
|
35
|
+
* import { useChat } from '@ai-sdk/react'
|
|
36
|
+
*
|
|
37
|
+
* export function Chat() {
|
|
38
|
+
* const { messages, input, handleSubmit, handleInputChange } = useChat()
|
|
39
|
+
* // ... render chat UI
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
// Main exports - tools
|
|
44
|
+
export { createCryptoQuantTools, cryptoQuantTools } from "./tools.js";
|
|
45
|
+
// Anthropic SDK exports - for direct use with @anthropic-ai/sdk
|
|
46
|
+
export { createAnthropicTools, createToolExecutor, getToolNames, isValidToolName, toolCacheTTL, } from "./anthropic.js";
|
|
47
|
+
// System prompts - ready-to-use prompts for AI assistants
|
|
48
|
+
export { CRYPTOQUANT_SYSTEM_PROMPT, CRYPTOQUANT_MINIMAL_PROMPT, } from "./prompts.js";
|
|
49
|
+
// Schema exports - for advanced users who want to customize
|
|
50
|
+
export { describeMetricSchema, discoverEndpointsSchema, initializeSchema, marketSummarySchema, queryDataSchema, tradingSignalSchema, whaleActivitySchema, } from "./schemas.js";
|
|
51
|
+
// Execute functions - for direct tool execution without AI SDK
|
|
52
|
+
export { executeDescribeMetric, executeDiscoverEndpoints, executeInitialize, executeMarketSummary, executeQueryData, executeTradingSignal, executeWhaleActivity, } from "./execute.js";
|
|
53
|
+
// Interpretation data and helpers - for custom analysis
|
|
54
|
+
// Re-exported from shared module (single source of truth)
|
|
55
|
+
export { METRIC_DEFINITIONS, SCORING_RULES, MARKET_THRESHOLDS, WHALE_THRESHOLDS, CYCLE_PHASES, SIGNAL_LEGEND, INTERPRETATION_SYSTEM_PROMPT, calculateScore, calculateTradingSignal, getMetricSignal, getMetricDefinition, getAvailableMetrics, } from "../shared/metrics-data.generated.js";
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ai-sdk/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,uBAAuB;AACvB,OAAO,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtE,gEAAgE;AAChE,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,GACb,MAAM,gBAAgB,CAAC;AAOxB,0DAA0D;AAC1D,OAAO,EACL,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AAEtB,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AA0BtB,+DAA+D;AAC/D,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAEtB,wDAAwD;AACxD,0DAA0D;AAC1D,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,4BAA4B,EAC5B,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC"}
|