@cryptoquant_official/mcp 0.0.1

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 (55) hide show
  1. package/README.md +88 -0
  2. package/dist/auth/server.d.ts +3 -0
  3. package/dist/auth/server.d.ts.map +1 -0
  4. package/dist/auth/server.js +405 -0
  5. package/dist/auth/server.js.map +1 -0
  6. package/dist/auth/storage.d.ts +11 -0
  7. package/dist/auth/storage.d.ts.map +1 -0
  8. package/dist/auth/storage.js +53 -0
  9. package/dist/auth/storage.js.map +1 -0
  10. package/dist/cache/storage.d.ts +47 -0
  11. package/dist/cache/storage.d.ts.map +1 -0
  12. package/dist/cache/storage.js +140 -0
  13. package/dist/cache/storage.js.map +1 -0
  14. package/dist/cache/summary.d.ts +16 -0
  15. package/dist/cache/summary.d.ts.map +1 -0
  16. package/dist/cache/summary.js +85 -0
  17. package/dist/cache/summary.js.map +1 -0
  18. package/dist/cache/types.d.ts +76 -0
  19. package/dist/cache/types.d.ts.map +1 -0
  20. package/dist/cache/types.js +6 -0
  21. package/dist/cache/types.js.map +1 -0
  22. package/dist/config.d.ts +18 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +23 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/data/metrics.toon +58 -0
  27. package/dist/discovery.d.ts +70 -0
  28. package/dist/discovery.d.ts.map +1 -0
  29. package/dist/discovery.js +159 -0
  30. package/dist/discovery.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +23 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/permissions.d.ts +36 -0
  36. package/dist/permissions.d.ts.map +1 -0
  37. package/dist/permissions.js +135 -0
  38. package/dist/permissions.js.map +1 -0
  39. package/dist/plan-limits.d.ts +71 -0
  40. package/dist/plan-limits.d.ts.map +1 -0
  41. package/dist/plan-limits.js +400 -0
  42. package/dist/plan-limits.js.map +1 -0
  43. package/dist/tools/auth.d.ts +3 -0
  44. package/dist/tools/auth.d.ts.map +1 -0
  45. package/dist/tools/auth.js +157 -0
  46. package/dist/tools/auth.js.map +1 -0
  47. package/dist/tools/core.d.ts +3 -0
  48. package/dist/tools/core.d.ts.map +1 -0
  49. package/dist/tools/core.js +472 -0
  50. package/dist/tools/core.js.map +1 -0
  51. package/dist/utils.d.ts +32 -0
  52. package/dist/utils.d.ts.map +1 -0
  53. package/dist/utils.js +42 -0
  54. package/dist/utils.js.map +1 -0
  55. package/package.json +62 -0
@@ -0,0 +1,472 @@
1
+ import { z } from "zod";
2
+ import { readFileSync } from "fs";
3
+ import { join, dirname } from "path";
4
+ import { fileURLToPath } from "url";
5
+ import { getPermissionState } from "../permissions.js";
6
+ import { isDiscoveryLoaded, searchEndpoints, getEndpointByPath, getDiscoverySummary, getEndpointCatalog, validateEndpointParams, getParameterOptions, } from "../discovery.js";
7
+ import { hasEndpointAccess, getEndpointWindowLimits, validateDateRange, getRequiredPlan, getPlanLimitsState, parseDurationToDate, } from "../plan-limits.js";
8
+ import { getApiBaseUrl } from "../config.js";
9
+ import { jsonResponse, errorResponse, getPlanNote, capitalizeFirst } from "../utils.js";
10
+ function buildRateLimitInfo(response) {
11
+ const limit = response.headers.get("X-RateLimit-Limit");
12
+ const remaining = response.headers.get("X-RateLimit-Remaining");
13
+ const reset = response.headers.get("X-RateLimit-Reset");
14
+ if (!remaining || !limit)
15
+ return null;
16
+ let info = `${remaining}/${limit} remaining`;
17
+ if (reset) {
18
+ info += ` (resets ${new Date(parseInt(reset) * 1000).toISOString().slice(11, 19)})`;
19
+ }
20
+ return info;
21
+ }
22
+ // Schema definitions for tools
23
+ const discoverEndpointsSchema = {
24
+ asset: z
25
+ .enum(["btc", "eth", "alt", "stablecoin", "erc20", "trx", "xrp"])
26
+ .optional()
27
+ .describe("Asset to discover endpoints for. Omit for all assets."),
28
+ category: z
29
+ .string()
30
+ .optional()
31
+ .describe("Category filter (e.g., market-data, exchange-flows, network-data, miner-flows, etc.)"),
32
+ query: z
33
+ .string()
34
+ .optional()
35
+ .describe("Search term to filter endpoints by path or metric name"),
36
+ include_restricted: z
37
+ .boolean()
38
+ .optional()
39
+ .default(false)
40
+ .describe("Include endpoints not available on your current plan"),
41
+ };
42
+ const queryDataSchema = {
43
+ endpoint: z
44
+ .string()
45
+ .describe("API endpoint path (e.g., /v1/btc/market-data/mvrv)"),
46
+ params: z
47
+ .object({
48
+ window: z.string().optional().describe("Time window granularity (hour, day, block, etc.)"),
49
+ limit: z.number().optional().describe("Number of data points to return (max 1000)"),
50
+ from: z.string().optional().describe("Start date (ISO 8601 format)"),
51
+ to: z.string().optional().describe("End date (ISO 8601 format)"),
52
+ exchange: z.string().optional().describe("Exchange filter (for exchange-specific data)"),
53
+ symbol: z.string().optional().describe("Trading symbol (e.g., btc_usd, btc_usdt)"),
54
+ market: z.string().optional().describe("Market type (spot, perpetual)"),
55
+ token: z.string().optional().describe("Token filter (for alt/erc20 data)"),
56
+ miner: z.string().optional().describe("Miner filter (for miner data)"),
57
+ })
58
+ .optional()
59
+ .describe("Query parameters"),
60
+ };
61
+ const getEndpointInfoSchema = {
62
+ endpoint: z
63
+ .string()
64
+ .describe("API endpoint path to get information about"),
65
+ };
66
+ function requireAuth() {
67
+ const state = getPermissionState();
68
+ if (!state.authenticated) {
69
+ return errorResponse("Not authenticated", { action: "Call initialize() first to authenticate with your API key" });
70
+ }
71
+ return null;
72
+ }
73
+ export function registerCoreTools(server) {
74
+ server.tool("discover_endpoints", "Discover available API endpoints for a specific asset and category. Call initialize() first to get valid asset/category combinations. Returns endpoint paths and parameter options (e.g., window: ['day', 'hour']). Use returned paths with query_data().", discoverEndpointsSchema, async (params) => {
75
+ const authError = requireAuth();
76
+ if (authError)
77
+ return authError;
78
+ if (!isDiscoveryLoaded()) {
79
+ return errorResponse("Discovery data not loaded", {
80
+ action: "Discovery may have failed during initialization. Try reset_session() and initialize() again.",
81
+ });
82
+ }
83
+ const endpoints = searchEndpoints({
84
+ asset: params.asset,
85
+ category: params.category,
86
+ query: params.query,
87
+ });
88
+ const grouped = {};
89
+ for (const ep of endpoints) {
90
+ grouped[ep.asset] ??= {};
91
+ grouped[ep.asset][ep.category] ??= [];
92
+ grouped[ep.asset][ep.category].push(ep);
93
+ }
94
+ const planState = getPlanLimitsState();
95
+ const catalog = Object.entries(grouped).map(([asset, categories]) => ({
96
+ asset,
97
+ categories: Object.entries(categories).map(([category, eps]) => ({
98
+ category,
99
+ endpoints: eps.map((ep) => {
100
+ const accessible = hasEndpointAccess(ep.path);
101
+ const windowLimits = getEndpointWindowLimits(ep.path);
102
+ const requiredPlan = getRequiredPlan(ep.path);
103
+ const planInfo = planState.loaded
104
+ ? {
105
+ accessible,
106
+ ...(Object.keys(windowLimits).length > 0 && { date_limits: windowLimits }),
107
+ ...(!accessible && {
108
+ required_plan: requiredPlan,
109
+ upgrade_hint: `Upgrade to ${capitalizeFirst(requiredPlan)} for access`,
110
+ }),
111
+ }
112
+ : {};
113
+ return {
114
+ path: ep.path,
115
+ metric: ep.metric,
116
+ parameters: ep.parameters,
117
+ required_parameters: ep.required_parameters,
118
+ ...planInfo,
119
+ };
120
+ }),
121
+ })),
122
+ }));
123
+ const summary = getDiscoverySummary();
124
+ return jsonResponse({
125
+ success: true,
126
+ filters: {
127
+ asset: params.asset || "all",
128
+ category: params.category || "all",
129
+ query: params.query || null,
130
+ },
131
+ matched_endpoints: endpoints.length,
132
+ total_available: summary?.total_endpoints || 0,
133
+ ...(planState.loaded && {
134
+ plan_info: { your_plan: planState.plan, note: getPlanNote(planState.plan) },
135
+ }),
136
+ catalog,
137
+ tip: "Use get_endpoint_info(endpoint) to see available parameter values for a specific endpoint",
138
+ });
139
+ });
140
+ server.tool("get_endpoint_info", "Get detailed information about a specific API endpoint including available parameter values.", getEndpointInfoSchema, async (params) => {
141
+ const authError = requireAuth();
142
+ if (authError)
143
+ return authError;
144
+ const endpoint = getEndpointByPath(params.endpoint);
145
+ if (!endpoint) {
146
+ const searchResults = searchEndpoints({ query: params.endpoint.split("/").pop() || "" });
147
+ return errorResponse(`Endpoint not found: ${params.endpoint}`, {
148
+ suggestions: searchResults.slice(0, 5).map((ep) => ep.path),
149
+ tip: "Use discover_endpoints() to browse available endpoints",
150
+ });
151
+ }
152
+ const planState = getPlanLimitsState();
153
+ const accessible = hasEndpointAccess(endpoint.path);
154
+ const windowLimits = getEndpointWindowLimits(endpoint.path);
155
+ const requiredPlan = getRequiredPlan(endpoint.path);
156
+ const dateLimitsInfo = {};
157
+ for (const [window, limit] of Object.entries(windowLimits)) {
158
+ const earliestDate = parseDurationToDate(limit);
159
+ dateLimitsInfo[window] = {
160
+ limit,
161
+ earliest_date: earliestDate ? earliestDate.toISOString().split("T")[0] : null,
162
+ };
163
+ }
164
+ return jsonResponse({
165
+ success: true,
166
+ endpoint: {
167
+ path: endpoint.path,
168
+ asset: endpoint.asset,
169
+ category: endpoint.category,
170
+ metric: endpoint.metric,
171
+ },
172
+ parameters: endpoint.parameters,
173
+ required_parameters: endpoint.required_parameters,
174
+ ...(planState.loaded && {
175
+ plan_access: {
176
+ accessible,
177
+ your_plan: planState.plan,
178
+ ...(Object.keys(dateLimitsInfo).length > 0 && { date_limits: dateLimitsInfo }),
179
+ ...(!accessible && { required_plan: requiredPlan, upgrade_url: "https://cryptoquant.com/pricing" }),
180
+ },
181
+ }),
182
+ example_query: buildExampleQuery(endpoint),
183
+ });
184
+ });
185
+ server.tool("query_data", "Query raw data from CryptoQuant API. Workflow: initialize() → discover_endpoints(asset, category) → query_data(endpoint, params). Use endpoint paths and parameter values from discover_endpoints response.", queryDataSchema, async (params) => {
186
+ const authError = requireAuth();
187
+ if (authError)
188
+ return authError;
189
+ const state = getPermissionState();
190
+ const endpoint = getEndpointByPath(params.endpoint);
191
+ if (!endpoint) {
192
+ return errorResponse(`Unknown endpoint: ${params.endpoint}`, {
193
+ action: "Use discover_endpoints() to find valid endpoints",
194
+ });
195
+ }
196
+ const queryParams = params.params || {};
197
+ const validation = validateEndpointParams(endpoint, queryParams);
198
+ if (!validation.valid) {
199
+ const paramOptions = getParameterOptions(params.endpoint);
200
+ return errorResponse("Invalid parameters", {
201
+ details: validation.errors,
202
+ endpoint: params.endpoint,
203
+ available_parameters: paramOptions?.parameters,
204
+ required_parameters: paramOptions?.required,
205
+ });
206
+ }
207
+ const planState = getPlanLimitsState();
208
+ if (planState.loaded) {
209
+ if (!hasEndpointAccess(params.endpoint)) {
210
+ const requiredPlan = getRequiredPlan(params.endpoint);
211
+ return errorResponse("Endpoint not accessible on your plan", {
212
+ your_plan: planState.plan,
213
+ required_plan: requiredPlan,
214
+ upgrade_url: "https://cryptoquant.com/pricing",
215
+ suggestion: `Upgrade to ${capitalizeFirst(requiredPlan)} plan for access to this endpoint`,
216
+ });
217
+ }
218
+ const fromDate = queryParams.from;
219
+ const windowParam = queryParams.window;
220
+ if (fromDate) {
221
+ const dateValidation = validateDateRange(params.endpoint, fromDate, windowParam);
222
+ if (!dateValidation.valid) {
223
+ return errorResponse(dateValidation.error || "Date range exceeds plan limit", {
224
+ your_plan: planState.plan,
225
+ ...(dateValidation.limit && { limit: dateValidation.limit }),
226
+ ...(dateValidation.earliest_allowed && { earliest_allowed: dateValidation.earliest_allowed }),
227
+ upgrade_url: "https://cryptoquant.com/pricing",
228
+ suggestion: "Upgrade to Premium for unlimited historical data access",
229
+ });
230
+ }
231
+ }
232
+ }
233
+ const apiKey = state.api_key;
234
+ if (!apiKey) {
235
+ return errorResponse("API key not available", { action: "Re-initialize with your API key" });
236
+ }
237
+ try {
238
+ const urlParams = new URLSearchParams();
239
+ for (const [key, value] of Object.entries(queryParams)) {
240
+ if (value !== undefined && value !== null) {
241
+ urlParams.set(key, String(value));
242
+ }
243
+ }
244
+ if (!urlParams.has("limit")) {
245
+ urlParams.set("limit", "100");
246
+ }
247
+ urlParams.set("source", "mcp");
248
+ const apiUrl = getApiBaseUrl();
249
+ const fullUrl = `${apiUrl}${params.endpoint}?${urlParams.toString()}`;
250
+ const response = await fetch(fullUrl, {
251
+ method: "GET",
252
+ headers: { Authorization: `Bearer ${apiKey}` },
253
+ });
254
+ if (!response.ok) {
255
+ const errorBody = await response.text();
256
+ return errorResponse(`API request failed: ${response.status} ${response.statusText}`, {
257
+ details: errorBody,
258
+ endpoint: params.endpoint,
259
+ });
260
+ }
261
+ let data;
262
+ try {
263
+ data = await response.json();
264
+ }
265
+ catch {
266
+ return errorResponse("Failed to parse API response", { endpoint: params.endpoint });
267
+ }
268
+ const rateLimitInfo = buildRateLimitInfo(response);
269
+ return jsonResponse({
270
+ success: true,
271
+ endpoint: params.endpoint,
272
+ params: queryParams,
273
+ ...(rateLimitInfo && { rate_limit: rateLimitInfo }),
274
+ ...data,
275
+ });
276
+ }
277
+ catch (error) {
278
+ return errorResponse(`Network error: ${error}`, { endpoint: params.endpoint });
279
+ }
280
+ });
281
+ server.tool("list_assets", "List all supported assets (cryptocurrencies) with their available data categories.", {}, async () => {
282
+ const state = getPermissionState();
283
+ if (!isDiscoveryLoaded()) {
284
+ const defaultAssets = [
285
+ { asset: "BTC", note: "Bitcoin" },
286
+ { asset: "ETH", note: "Ethereum" },
287
+ { asset: "ALT", note: "Alternative coins" },
288
+ { asset: "STABLECOIN", note: "Stablecoins" },
289
+ { asset: "ERC20", note: "ERC-20 tokens" },
290
+ ];
291
+ const note = state.authenticated
292
+ ? "Discovery data not loaded. Try reset_session() and initialize() again."
293
+ : "Call initialize() to load full endpoint catalog";
294
+ return jsonResponse({ success: true, authenticated: state.authenticated, assets: defaultAssets, note });
295
+ }
296
+ const summary = getDiscoverySummary();
297
+ const catalog = getEndpointCatalog();
298
+ if (!summary || !catalog) {
299
+ return errorResponse("Discovery data not available");
300
+ }
301
+ const assetDetails = summary.assets.map((asset) => {
302
+ const assetEndpoints = catalog.byAsset.get(asset.name) ?? [];
303
+ const categories = new Set(assetEndpoints.map((ep) => ep.category));
304
+ return {
305
+ asset: asset.name.toUpperCase(),
306
+ total_endpoints: asset.count,
307
+ categories: Array.from(categories).sort(),
308
+ };
309
+ });
310
+ return jsonResponse({
311
+ success: true,
312
+ authenticated: state.authenticated,
313
+ total_endpoints: summary.total_endpoints,
314
+ fetched_at: summary.fetched_at,
315
+ assets: assetDetails,
316
+ tip: "Use discover_endpoints(asset='btc') to explore endpoints for a specific asset",
317
+ });
318
+ });
319
+ server.tool("describe_metric", "Get detailed description for a specific metric. Use only when user asks 'what is X?' or metric is unfamiliar. Returns thresholds, interpretation guidance, and category info.", {
320
+ metric_id: z.string().describe("The metric ID to describe (e.g., 'mvrv', 'sopr', 'netflow')"),
321
+ }, async (params) => {
322
+ try {
323
+ const metrics = parseToonMetrics();
324
+ const searchLower = params.metric_id.toLowerCase();
325
+ const metric = metrics.find((m) => m.id.toLowerCase() === searchLower);
326
+ if (!metric) {
327
+ const suggestions = metrics
328
+ .filter((m) => m.id.toLowerCase().includes(searchLower) || m.name.toLowerCase().includes(searchLower))
329
+ .slice(0, 5)
330
+ .map((m) => m.id);
331
+ return errorResponse(`Unknown metric: ${params.metric_id}`, {
332
+ suggestions: suggestions.length > 0 ? suggestions : undefined,
333
+ tip: "Use discover_endpoints() to find available metrics",
334
+ });
335
+ }
336
+ return jsonResponse({
337
+ success: true,
338
+ metric: {
339
+ id: metric.id,
340
+ name: metric.name,
341
+ category: metric.category,
342
+ asset: metric.asset,
343
+ description: metric.description,
344
+ thresholds: metric.thresholds,
345
+ interpretation: metric.interpretation,
346
+ },
347
+ });
348
+ }
349
+ catch (error) {
350
+ return errorResponse(`Failed to load metric data: ${error}`);
351
+ }
352
+ });
353
+ }
354
+ function parseToonMetrics() {
355
+ const __filename = fileURLToPath(import.meta.url);
356
+ const __dirname = dirname(__filename);
357
+ const toonPath = join(__dirname, "..", "data", "metrics.toon");
358
+ let content;
359
+ try {
360
+ content = readFileSync(toonPath, "utf-8");
361
+ }
362
+ catch {
363
+ return getBuiltInMetrics();
364
+ }
365
+ const metrics = [];
366
+ const lines = content.split("\n");
367
+ let schemaFields = [];
368
+ let dataStartIndex = -1;
369
+ for (let i = 0; i < lines.length; i++) {
370
+ const line = lines[i].trim();
371
+ if (line.startsWith("metrics[") && line.includes("{") && line.includes("}:")) {
372
+ const match = line.match(/\{([^}]+)\}/);
373
+ if (match) {
374
+ schemaFields = match[1].split(",").map((f) => f.trim());
375
+ dataStartIndex = i + 1;
376
+ break;
377
+ }
378
+ }
379
+ }
380
+ if (schemaFields.length === 0 || dataStartIndex === -1) {
381
+ return getBuiltInMetrics();
382
+ }
383
+ for (let i = dataStartIndex; i < lines.length; i++) {
384
+ const line = lines[i].trim();
385
+ if (!line || line.startsWith("#"))
386
+ continue;
387
+ const values = line.split(",").map((p) => p.trim());
388
+ if (values.length >= schemaFields.length) {
389
+ const metric = {
390
+ id: values[0] || "",
391
+ name: values[1] || "",
392
+ category: values[2] || "",
393
+ asset: values[3] || "",
394
+ description: values[4] || "",
395
+ thresholds: values[5] || "",
396
+ interpretation: values[6] || "",
397
+ };
398
+ if (metric.id) {
399
+ metrics.push(metric);
400
+ }
401
+ }
402
+ }
403
+ return metrics.length > 0 ? metrics : getBuiltInMetrics();
404
+ }
405
+ function getBuiltInMetrics() {
406
+ return [
407
+ {
408
+ id: "mvrv",
409
+ name: "Market Value to Realized Value",
410
+ category: "market-indicator",
411
+ asset: "btc",
412
+ description: "Compares current market cap to realized cap (aggregate cost basis)",
413
+ thresholds: "<1 undervalued|1-2.5 neutral|2.5-3.7 overheated|>3.7 extreme",
414
+ interpretation: "Primary cycle indicator. Values below 1 historically mark accumulation zones.",
415
+ },
416
+ {
417
+ id: "sopr",
418
+ name: "Spent Output Profit Ratio",
419
+ category: "market-indicator",
420
+ asset: "btc",
421
+ description: "Ratio of price sold to price paid for coins moved on-chain",
422
+ thresholds: "<1 selling at loss|=1 breakeven|>1 selling at profit",
423
+ interpretation: "Real-time profit/loss behavior. SOPR=1 often acts as support/resistance.",
424
+ },
425
+ {
426
+ id: "nupl",
427
+ name: "Net Unrealized Profit/Loss",
428
+ category: "market-indicator",
429
+ asset: "btc",
430
+ description: "Percentage of coins in profit or loss relative to total market cap",
431
+ thresholds: "<0 capitulation|0-0.25 hope|0.25-0.5 belief|0.5-0.75 optimism|>0.75 euphoria",
432
+ interpretation: "Sentiment gauge. Extreme values often precede major reversals.",
433
+ },
434
+ {
435
+ id: "netflow",
436
+ name: "Exchange Netflow",
437
+ category: "exchange-flows",
438
+ asset: "btc",
439
+ description: "Net flow of BTC into (positive) or out of (negative) exchanges",
440
+ thresholds: "positive sell pressure|negative accumulation",
441
+ interpretation: "Key supply dynamics indicator. Sustained outflows suggest accumulation.",
442
+ },
443
+ {
444
+ id: "funding-rates",
445
+ name: "Funding Rates",
446
+ category: "market-data",
447
+ asset: "btc",
448
+ description: "Periodic payment between long and short perpetual swap holders",
449
+ thresholds: "<0 bearish|0-0.03% neutral|>0.1% extreme bullish",
450
+ interpretation: "Leverage sentiment. Extreme positive rates often precede corrections.",
451
+ },
452
+ ];
453
+ }
454
+ function buildExampleQuery(endpoint) {
455
+ const params = [];
456
+ for (const required of endpoint.required_parameters) {
457
+ const values = endpoint.parameters[required];
458
+ if (values && values.length > 0) {
459
+ params.push(`${required}=${values[0]}`);
460
+ }
461
+ }
462
+ if (endpoint.parameters.window && !endpoint.required_parameters.includes("window")) {
463
+ params.push(`window=${endpoint.parameters.window[0]}`);
464
+ }
465
+ params.push("limit=100");
466
+ const paramStr = params.map((p) => {
467
+ const [key, val] = p.split("=");
468
+ return `"${key}": "${val}"`;
469
+ }).join(", ");
470
+ return `query_data(endpoint="${endpoint.path}", params={${paramStr}})`;
471
+ }
472
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/tools/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Shared utility functions for CryptoQuant MCP Server
3
+ */
4
+ import type { UserPlan } from "./plan-limits.js";
5
+ /**
6
+ * Create a JSON response for MCP tools.
7
+ */
8
+ export declare function jsonResponse(data: unknown): {
9
+ content: [{
10
+ type: "text";
11
+ text: string;
12
+ }];
13
+ };
14
+ /**
15
+ * Create an error response for MCP tools.
16
+ */
17
+ export declare function errorResponse(error: string, extra?: Record<string, unknown>): {
18
+ content: [{
19
+ type: "text";
20
+ text: string;
21
+ }];
22
+ };
23
+ /**
24
+ * Get a human-readable note for a plan type.
25
+ * Plan hierarchy: basic < advanced < professional < premium < custom
26
+ */
27
+ export declare function getPlanNote(plan: UserPlan | string): string;
28
+ /**
29
+ * Capitalize the first letter of a string.
30
+ */
31
+ export declare function capitalizeFirst(str: string): string;
32
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAEzF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B;IAAE,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAE/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAe3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD"}
package/dist/utils.js ADDED
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Shared utility functions for CryptoQuant MCP Server
3
+ */
4
+ /**
5
+ * Create a JSON response for MCP tools.
6
+ */
7
+ export function jsonResponse(data) {
8
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
9
+ }
10
+ /**
11
+ * Create an error response for MCP tools.
12
+ */
13
+ export function errorResponse(error, extra) {
14
+ return jsonResponse({ success: false, error, ...extra });
15
+ }
16
+ /**
17
+ * Get a human-readable note for a plan type.
18
+ * Plan hierarchy: basic < advanced < professional < premium < custom
19
+ */
20
+ export function getPlanNote(plan) {
21
+ switch (plan) {
22
+ case "custom":
23
+ return "Custom enterprise plan with tailored access";
24
+ case "premium":
25
+ return "Full access to all data";
26
+ case "professional":
27
+ return "3-year data history limit on most endpoints";
28
+ case "advanced":
29
+ return "Extended endpoint access with some data limits";
30
+ case "basic":
31
+ return "Limited endpoint access. Upgrade for more data.";
32
+ default:
33
+ return "Plan not detected";
34
+ }
35
+ }
36
+ /**
37
+ * Capitalize the first letter of a string.
38
+ */
39
+ export function capitalizeFirst(str) {
40
+ return str.charAt(0).toUpperCase() + str.slice(1);
41
+ }
42
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,KAAa,EACb,KAA+B;IAE/B,OAAO,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAuB;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ;YACX,OAAO,6CAA6C,CAAC;QACvD,KAAK,SAAS;YACZ,OAAO,yBAAyB,CAAC;QACnC,KAAK,cAAc;YACjB,OAAO,6CAA6C,CAAC;QACvD,KAAK,UAAU;YACb,OAAO,gDAAgD,CAAC;QAC1D,KAAK,OAAO;YACV,OAAO,iDAAiD,CAAC;QAC3D;YACE,OAAO,mBAAmB,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@cryptoquant_official/mcp",
3
+ "version": "0.0.1",
4
+ "description": "CryptoQuant MCP Server - On-chain analytics for Claude and AI coding agents",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "cryptoquant-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc && cp -r src/data dist/",
15
+ "start": "node dist/index.js",
16
+ "dev": "tsx watch src/index.ts",
17
+ "lint": "eslint src/",
18
+ "test": "vitest",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "cryptoquant",
23
+ "mcp",
24
+ "model-context-protocol",
25
+ "claude",
26
+ "claude-code",
27
+ "on-chain",
28
+ "bitcoin",
29
+ "ethereum",
30
+ "crypto",
31
+ "analytics",
32
+ "ai-agent"
33
+ ],
34
+ "author": "CryptoQuant",
35
+ "license": "MIT",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/CryptoQuantOfficial/cryptoquant-skills.git",
39
+ "directory": "mcp-server"
40
+ },
41
+ "homepage": "https://github.com/CryptoQuantOfficial/cryptoquant-skills#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/CryptoQuantOfficial/cryptoquant-skills/issues"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "dependencies": {
49
+ "@modelcontextprotocol/sdk": "^1.0.0",
50
+ "zod": "^3.23.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^20.0.0",
54
+ "tsx": "^4.0.0",
55
+ "typescript": "^5.5.0",
56
+ "eslint": "^9.0.0",
57
+ "vitest": "^2.0.0"
58
+ },
59
+ "engines": {
60
+ "node": ">=18.0.0"
61
+ }
62
+ }