@cryptoquant_official/mcp 0.0.5 → 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.
Files changed (126) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +329 -59
  3. package/dist/ai-sdk/anthropic.d.ts +125 -0
  4. package/dist/ai-sdk/anthropic.d.ts.map +1 -0
  5. package/dist/ai-sdk/anthropic.js +278 -0
  6. package/dist/ai-sdk/anthropic.js.map +1 -0
  7. package/dist/ai-sdk/execute.d.ts +35 -0
  8. package/dist/ai-sdk/execute.d.ts.map +1 -0
  9. package/dist/ai-sdk/execute.js +531 -0
  10. package/dist/ai-sdk/execute.js.map +1 -0
  11. package/dist/ai-sdk/index.d.ts +53 -0
  12. package/dist/ai-sdk/index.d.ts.map +1 -0
  13. package/dist/ai-sdk/index.js +56 -0
  14. package/dist/ai-sdk/index.js.map +1 -0
  15. package/dist/ai-sdk/prompts.d.ts +34 -0
  16. package/dist/ai-sdk/prompts.d.ts.map +1 -0
  17. package/dist/ai-sdk/prompts.js +74 -0
  18. package/dist/ai-sdk/prompts.js.map +1 -0
  19. package/dist/ai-sdk/schemas.d.ts +66 -0
  20. package/dist/ai-sdk/schemas.d.ts.map +1 -0
  21. package/dist/ai-sdk/schemas.js +136 -0
  22. package/dist/ai-sdk/schemas.js.map +1 -0
  23. package/dist/ai-sdk/tools.d.ts +165 -0
  24. package/dist/ai-sdk/tools.d.ts.map +1 -0
  25. package/dist/ai-sdk/tools.js +152 -0
  26. package/dist/ai-sdk/tools.js.map +1 -0
  27. package/dist/ai-sdk/types.d.ts +149 -0
  28. package/dist/ai-sdk/types.d.ts.map +1 -0
  29. package/dist/ai-sdk/types.js +5 -0
  30. package/dist/ai-sdk/types.js.map +1 -0
  31. package/dist/core/auth/storage.d.ts.map +1 -0
  32. package/dist/core/auth/storage.js.map +1 -0
  33. package/dist/core/cache/storage.d.ts +110 -0
  34. package/dist/core/cache/storage.d.ts.map +1 -0
  35. package/dist/core/cache/storage.js +356 -0
  36. package/dist/core/cache/storage.js.map +1 -0
  37. package/dist/core/cache/summary.d.ts.map +1 -0
  38. package/dist/core/cache/summary.js.map +1 -0
  39. package/dist/{cache → core/cache}/types.d.ts +25 -0
  40. package/dist/{cache → core/cache}/types.d.ts.map +1 -1
  41. package/dist/core/cache/types.js.map +1 -0
  42. package/dist/core/config.d.ts.map +1 -0
  43. package/dist/core/config.js.map +1 -0
  44. package/dist/core/discovery.d.ts.map +1 -0
  45. package/dist/core/discovery.js.map +1 -0
  46. package/dist/core/index.d.ts +16 -0
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +19 -0
  49. package/dist/core/index.js.map +1 -0
  50. package/dist/{permissions.d.ts → core/permissions.d.ts} +1 -1
  51. package/dist/core/permissions.d.ts.map +1 -0
  52. package/dist/{permissions.js → core/permissions.js} +6 -6
  53. package/dist/core/permissions.js.map +1 -0
  54. package/dist/core/plan-limits.d.ts.map +1 -0
  55. package/dist/core/plan-limits.js.map +1 -0
  56. package/dist/core/utils.d.ts.map +1 -0
  57. package/dist/{utils.js → core/utils.js} +2 -2
  58. package/dist/core/utils.js.map +1 -0
  59. package/dist/http/chat-proxy.d.ts +32 -0
  60. package/dist/http/chat-proxy.d.ts.map +1 -0
  61. package/dist/http/chat-proxy.js +310 -0
  62. package/dist/http/chat-proxy.js.map +1 -0
  63. package/dist/http/index.d.ts +12 -0
  64. package/dist/http/index.d.ts.map +1 -0
  65. package/dist/http/index.js +30 -0
  66. package/dist/http/index.js.map +1 -0
  67. package/dist/http/server.d.ts +20 -0
  68. package/dist/http/server.d.ts.map +1 -0
  69. package/dist/http/server.js +231 -0
  70. package/dist/http/server.js.map +1 -0
  71. package/dist/shared/metrics-data.generated.d.ts +176 -0
  72. package/dist/shared/metrics-data.generated.d.ts.map +1 -0
  73. package/dist/shared/metrics-data.generated.js +3077 -0
  74. package/dist/shared/metrics-data.generated.js.map +1 -0
  75. package/dist/stdio/index.d.ts +10 -0
  76. package/dist/stdio/index.d.ts.map +1 -0
  77. package/dist/stdio/index.js +30 -0
  78. package/dist/stdio/index.js.map +1 -0
  79. package/dist/stdio/tools/auth.d.ts.map +1 -0
  80. package/dist/{tools → stdio/tools}/auth.js +10 -8
  81. package/dist/stdio/tools/auth.js.map +1 -0
  82. package/dist/stdio/tools/core.d.ts.map +1 -0
  83. package/dist/{tools → stdio/tools}/core.js +32 -145
  84. package/dist/stdio/tools/core.js.map +1 -0
  85. package/package.json +52 -13
  86. package/dist/auth/storage.d.ts.map +0 -1
  87. package/dist/auth/storage.js.map +0 -1
  88. package/dist/cache/storage.d.ts +0 -47
  89. package/dist/cache/storage.d.ts.map +0 -1
  90. package/dist/cache/storage.js +0 -140
  91. package/dist/cache/storage.js.map +0 -1
  92. package/dist/cache/summary.d.ts.map +0 -1
  93. package/dist/cache/summary.js.map +0 -1
  94. package/dist/cache/types.js.map +0 -1
  95. package/dist/config.d.ts.map +0 -1
  96. package/dist/config.js.map +0 -1
  97. package/dist/discovery.d.ts.map +0 -1
  98. package/dist/discovery.js.map +0 -1
  99. package/dist/index.d.ts +0 -18
  100. package/dist/index.d.ts.map +0 -1
  101. package/dist/index.js +0 -47
  102. package/dist/index.js.map +0 -1
  103. package/dist/permissions.d.ts.map +0 -1
  104. package/dist/permissions.js.map +0 -1
  105. package/dist/plan-limits.d.ts.map +0 -1
  106. package/dist/plan-limits.js.map +0 -1
  107. package/dist/tools/auth.d.ts.map +0 -1
  108. package/dist/tools/auth.js.map +0 -1
  109. package/dist/tools/core.d.ts.map +0 -1
  110. package/dist/tools/core.js.map +0 -1
  111. package/dist/utils.d.ts.map +0 -1
  112. package/dist/utils.js.map +0 -1
  113. /package/dist/{auth → core/auth}/storage.d.ts +0 -0
  114. /package/dist/{auth → core/auth}/storage.js +0 -0
  115. /package/dist/{cache → core/cache}/summary.d.ts +0 -0
  116. /package/dist/{cache → core/cache}/summary.js +0 -0
  117. /package/dist/{cache → core/cache}/types.js +0 -0
  118. /package/dist/{config.d.ts → core/config.d.ts} +0 -0
  119. /package/dist/{config.js → core/config.js} +0 -0
  120. /package/dist/{discovery.d.ts → core/discovery.d.ts} +0 -0
  121. /package/dist/{discovery.js → core/discovery.js} +0 -0
  122. /package/dist/{plan-limits.d.ts → core/plan-limits.d.ts} +0 -0
  123. /package/dist/{plan-limits.js → core/plan-limits.js} +0 -0
  124. /package/dist/{utils.d.ts → core/utils.d.ts} +0 -0
  125. /package/dist/{tools → stdio/tools}/auth.d.ts +0 -0
  126. /package/dist/{tools → stdio/tools}/core.d.ts +0 -0
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HTTP module - HTTP server and chat proxy
4
+ *
5
+ * Can be used as:
6
+ * 1. Standalone: node dist/http/index.js
7
+ * 2. Library: import { startHttpServer } from '@cryptoquant_official/mcp/http'
8
+ */
9
+ export { startHttpServer, cleanupStaleSessions } from "./server.js";
10
+ export { handleChat, getToolsSchema } from "./chat-proxy.js";
11
+ export type { ChatRequest, ChatResponse, ToolCall } from "./chat-proxy.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAKH,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HTTP module - HTTP server and chat proxy
4
+ *
5
+ * Can be used as:
6
+ * 1. Standalone: node dist/http/index.js
7
+ * 2. Library: import { startHttpServer } from '@cryptoquant_official/mcp/http'
8
+ */
9
+ import { logger } from "../core/utils.js";
10
+ // Re-exports for library usage
11
+ export { startHttpServer, cleanupStaleSessions } from "./server.js";
12
+ export { handleChat, getToolsSchema } from "./chat-proxy.js";
13
+ /**
14
+ * HTTP server main entry point
15
+ */
16
+ async function main() {
17
+ const { startHttpServer } = await import("./server.js");
18
+ await startHttpServer({
19
+ port: parseInt(process.env.MCP_HTTP_PORT ?? "3100", 10),
20
+ host: process.env.MCP_HTTP_HOST ?? "127.0.0.1",
21
+ corsOrigins: process.env.MCP_CORS_ORIGINS ?? "http://localhost:3000,http://localhost:5173",
22
+ enableLegacySse: process.env.MCP_ENABLE_LEGACY_SSE === "true",
23
+ });
24
+ logger.info("CryptoQuant HTTP Server started");
25
+ }
26
+ main().catch((error) => {
27
+ logger.error("Failed to start HTTP server:", error);
28
+ process.exit(1);
29
+ });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAG7D;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IAExD,MAAM,eAAe,CAAC;QACpB,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC;QACvD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,WAAW;QAC9C,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,6CAA6C;QAC1F,eAAe,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,MAAM;KAC9D,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;AACjD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * HTTP Transport Server for MCP
3
+ * Enables web applications to connect to the MCP server via HTTP/SSE
4
+ */
5
+ interface HttpServerConfig {
6
+ port?: number;
7
+ host?: string;
8
+ corsOrigins?: string | string[];
9
+ enableLegacySse?: boolean;
10
+ }
11
+ /**
12
+ * Start HTTP server with Streamable HTTP transport
13
+ */
14
+ export declare function startHttpServer(config?: HttpServerConfig): Promise<void>;
15
+ /**
16
+ * Clean up stale sessions (older than 1 hour)
17
+ */
18
+ export declare function cleanupStaleSessions(): void;
19
+ export {};
20
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA4BD;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqNlF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAW3C"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * HTTP Transport Server for MCP
3
+ * Enables web applications to connect to the MCP server via HTTP/SSE
4
+ */
5
+ import express from "express";
6
+ import cors from "cors";
7
+ import rateLimit from "express-rate-limit";
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
10
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
11
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
12
+ import { randomUUID } from "crypto";
13
+ import { registerAuthTools } from "../stdio/tools/auth.js";
14
+ import { registerCoreTools } from "../stdio/tools/core.js";
15
+ import { logger } from "../core/utils.js";
16
+ import { handleChat, getToolsSchema } from "./chat-proxy.js";
17
+ // Session storage for Streamable HTTP
18
+ const sessions = new Map();
19
+ // Legacy SSE transport storage - Map for multi-client support
20
+ const legacySseSessions = new Map();
21
+ /**
22
+ * Create and configure the MCP server instance
23
+ */
24
+ function createMcpServer() {
25
+ const server = new McpServer({
26
+ name: "cryptoquant",
27
+ version: "1.0.0",
28
+ });
29
+ registerAuthTools(server);
30
+ registerCoreTools(server);
31
+ return server;
32
+ }
33
+ /**
34
+ * Start HTTP server with Streamable HTTP transport
35
+ */
36
+ export async function startHttpServer(config = {}) {
37
+ const port = config.port ?? parseInt(process.env.MCP_HTTP_PORT ?? "3100", 10);
38
+ const host = config.host ?? process.env.MCP_HTTP_HOST ?? "127.0.0.1";
39
+ const corsOriginsRaw = config.corsOrigins ?? process.env.MCP_CORS_ORIGINS ?? "http://localhost:3000,http://localhost:5173";
40
+ // Parse comma-separated origins into array, or use as-is if already an array
41
+ const corsOrigins = Array.isArray(corsOriginsRaw)
42
+ ? corsOriginsRaw
43
+ : corsOriginsRaw.split(",").map((origin) => origin.trim());
44
+ const enableLegacySse = config.enableLegacySse ?? process.env.MCP_ENABLE_LEGACY_SSE === "true";
45
+ const app = express();
46
+ // Rate limiting - general limiter for all routes
47
+ const generalLimiter = rateLimit({
48
+ windowMs: 15 * 60 * 1000, // 15 minutes
49
+ max: 100, // 100 requests per 15 minutes
50
+ message: { error: "Too many requests, please try again later" },
51
+ standardHeaders: true,
52
+ legacyHeaders: false,
53
+ });
54
+ // Stricter rate limit for /chat endpoint (uses external API)
55
+ const chatLimiter = rateLimit({
56
+ windowMs: 15 * 60 * 1000, // 15 minutes
57
+ max: 30, // 30 requests per 15 minutes
58
+ message: { error: "Too many chat requests, please try again later" },
59
+ standardHeaders: true,
60
+ legacyHeaders: false,
61
+ });
62
+ // Middleware
63
+ app.use(generalLimiter);
64
+ app.use(cors({
65
+ origin: corsOrigins,
66
+ credentials: true,
67
+ exposedHeaders: ["mcp-session-id"],
68
+ }));
69
+ app.use(express.json());
70
+ // Health check endpoint - minimal info to avoid information disclosure
71
+ app.get("/health", (_req, res) => {
72
+ res.json({ status: "ok" });
73
+ });
74
+ // =========================================================================
75
+ // Chat Proxy Endpoints (Claude API Integration)
76
+ // =========================================================================
77
+ // POST /chat - Chat with Claude + automatic tool execution
78
+ app.post("/chat", chatLimiter, async (req, res) => {
79
+ const chatRequest = req.body;
80
+ if (!chatRequest.message) {
81
+ res.status(400).json({ error: "message is required" });
82
+ return;
83
+ }
84
+ if (!chatRequest.claude_api_key) {
85
+ res.status(400).json({ error: "claude_api_key is required" });
86
+ return;
87
+ }
88
+ try {
89
+ const result = await handleChat(chatRequest);
90
+ res.json(result);
91
+ }
92
+ catch (error) {
93
+ // Only log error message, not full error object to avoid leaking sensitive data
94
+ const errorMessage = error instanceof Error ? error.message : "Chat request failed";
95
+ logger.error("[/chat] error:", errorMessage);
96
+ res.status(500).json({
97
+ success: false,
98
+ error: errorMessage,
99
+ });
100
+ }
101
+ });
102
+ // GET /tools/schema - Get Claude-compatible tool definitions
103
+ app.get("/tools/schema", (_req, res) => {
104
+ res.json({
105
+ tools: getToolsSchema(),
106
+ usage: "Use these tool definitions with Claude API's tool_use feature",
107
+ });
108
+ });
109
+ // =========================================================================
110
+ // Streamable HTTP Transport (Modern)
111
+ // =========================================================================
112
+ // POST /mcp - Handle MCP requests
113
+ app.post("/mcp", async (req, res) => {
114
+ const sessionId = req.headers["mcp-session-id"];
115
+ const session = sessionId ? sessions.get(sessionId) : undefined;
116
+ // Check if this is an initialization request
117
+ const isInit = isInitializeRequest(req.body);
118
+ if (isInit || !session) {
119
+ // Create new session
120
+ const newSessionId = randomUUID();
121
+ const server = createMcpServer();
122
+ const transport = new StreamableHTTPServerTransport({
123
+ sessionIdGenerator: () => newSessionId,
124
+ onsessioninitialized: (id) => {
125
+ logger.info(`Session initialized: ${id}`);
126
+ sessions.set(id, { transport, createdAt: Date.now() });
127
+ },
128
+ });
129
+ transport.onclose = () => {
130
+ logger.info(`Session closed: ${newSessionId}`);
131
+ sessions.delete(newSessionId);
132
+ };
133
+ await server.connect(transport);
134
+ await transport.handleRequest(req, res, req.body);
135
+ }
136
+ else {
137
+ // Use existing session
138
+ await session.transport.handleRequest(req, res, req.body);
139
+ }
140
+ });
141
+ // GET /mcp - SSE stream for server-to-client notifications
142
+ app.get("/mcp", async (req, res) => {
143
+ const sessionId = req.headers["mcp-session-id"];
144
+ if (!sessionId) {
145
+ res.status(400).json({ error: "Missing mcp-session-id header" });
146
+ return;
147
+ }
148
+ const session = sessions.get(sessionId);
149
+ if (!session) {
150
+ res.status(404).json({ error: "Session not found" });
151
+ return;
152
+ }
153
+ await session.transport.handleRequest(req, res);
154
+ });
155
+ // DELETE /mcp - Close session
156
+ app.delete("/mcp", async (req, res) => {
157
+ const sessionId = req.headers["mcp-session-id"];
158
+ if (!sessionId) {
159
+ res.status(400).json({ error: "Missing mcp-session-id header" });
160
+ return;
161
+ }
162
+ const session = sessions.get(sessionId);
163
+ if (!session) {
164
+ res.status(404).json({ error: "Session not found" });
165
+ return;
166
+ }
167
+ await session.transport.close();
168
+ sessions.delete(sessionId);
169
+ res.status(204).send();
170
+ });
171
+ // =========================================================================
172
+ // Legacy SSE Transport (for backwards compatibility)
173
+ // =========================================================================
174
+ if (enableLegacySse) {
175
+ // GET /sse - Establish SSE connection
176
+ app.get("/sse", async (_req, res) => {
177
+ const sessionId = randomUUID();
178
+ logger.info(`Legacy SSE connection requested: ${sessionId}`);
179
+ const server = createMcpServer();
180
+ // Include session ID in the messages endpoint path
181
+ const transport = new SSEServerTransport(`/messages?sessionId=${sessionId}`, res);
182
+ legacySseSessions.set(sessionId, transport);
183
+ transport.onclose = () => {
184
+ logger.info(`Legacy SSE connection closed: ${sessionId}`);
185
+ legacySseSessions.delete(sessionId);
186
+ };
187
+ await server.connect(transport);
188
+ });
189
+ // POST /messages - Handle client messages for legacy SSE
190
+ app.post("/messages", async (req, res) => {
191
+ const sessionId = req.query.sessionId;
192
+ if (!sessionId) {
193
+ res.status(400).json({ error: "Missing sessionId query parameter" });
194
+ return;
195
+ }
196
+ const transport = legacySseSessions.get(sessionId);
197
+ if (!transport) {
198
+ res.status(404).json({ error: "Session not found or expired" });
199
+ return;
200
+ }
201
+ await transport.handlePostMessage(req, res);
202
+ });
203
+ }
204
+ // Start server
205
+ app.listen(port, host, () => {
206
+ logger.info(`CryptoQuant MCP HTTP Server running at http://${host}:${port}`);
207
+ logger.info(` - Chat Proxy: POST /chat`);
208
+ logger.info(` - Tool Schema: GET /tools/schema`);
209
+ logger.info(` - Streamable HTTP: POST/GET/DELETE /mcp`);
210
+ if (enableLegacySse) {
211
+ logger.info(` - Legacy SSE: GET /sse, POST /messages`);
212
+ }
213
+ });
214
+ }
215
+ /**
216
+ * Clean up stale sessions (older than 1 hour)
217
+ */
218
+ export function cleanupStaleSessions() {
219
+ const maxAge = 60 * 60 * 1000; // 1 hour
220
+ const now = Date.now();
221
+ for (const [id, session] of sessions) {
222
+ if (now - session.createdAt > maxAge) {
223
+ logger.info(`Cleaning up stale session: ${id}`);
224
+ session.transport.close();
225
+ sessions.delete(id);
226
+ }
227
+ }
228
+ }
229
+ // Run cleanup every 15 minutes
230
+ setInterval(cleanupStaleSessions, 15 * 60 * 1000);
231
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/http/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
3
+ *
4
+ * Generated by: npm run sync-skills
5
+ * Source files:
6
+ * - skills/crypto/INTERPRETATION.md
7
+ * - data/metrics.toon
8
+ *
9
+ * To update, edit the source files and run: npm run sync-skills
10
+ */
11
+ export interface MetricThreshold {
12
+ range: string;
13
+ signal: "bullish" | "neutral" | "caution" | "bearish";
14
+ emoji: string;
15
+ meaning: string;
16
+ }
17
+ export interface ScoringRule {
18
+ condition: (value: number) => boolean;
19
+ score: number;
20
+ }
21
+ export interface MetricScoring {
22
+ weight: number;
23
+ rules: ScoringRule[];
24
+ }
25
+ export interface MetricDefinition {
26
+ id: string;
27
+ name: string;
28
+ category: string;
29
+ asset: string;
30
+ definition: string;
31
+ interpretation: string;
32
+ thresholds: MetricThreshold[];
33
+ keyInsights: string[];
34
+ endpoint: string;
35
+ scoring?: MetricScoring;
36
+ }
37
+ export declare const SIGNAL_LEGEND: {
38
+ readonly bullish: {
39
+ readonly emoji: "🟢";
40
+ readonly label: "Bullish / Buy opportunity";
41
+ readonly action: "Consider accumulating";
42
+ };
43
+ readonly neutral: {
44
+ readonly emoji: "🟡";
45
+ readonly label: "Neutral";
46
+ readonly action: "Hold / Wait for clearer signal";
47
+ };
48
+ readonly caution: {
49
+ readonly emoji: "🟠";
50
+ readonly label: "Caution";
51
+ readonly action: "Be cautious, potential reversal";
52
+ };
53
+ readonly bearish: {
54
+ readonly emoji: "🔴";
55
+ readonly label: "Bearish / Sell signal";
56
+ readonly action: "Consider reducing exposure";
57
+ };
58
+ };
59
+ export declare const METRIC_DEFINITIONS: Record<string, MetricDefinition>;
60
+ export declare const SCORING_RULES: Record<string, MetricScoring>;
61
+ /**
62
+ * Get metric definition by ID
63
+ */
64
+ export declare function getMetricDefinition(metricId: string): MetricDefinition | undefined;
65
+ /**
66
+ * Get all available metric IDs
67
+ */
68
+ export declare function getAvailableMetrics(): string[];
69
+ /**
70
+ * Calculate score for a metric value
71
+ */
72
+ export declare function calculateScore(metricId: string, value: number): number;
73
+ /**
74
+ * Calculate weighted trading signal score
75
+ */
76
+ export declare function calculateTradingSignal(metrics: Record<string, number>): {
77
+ score: number;
78
+ signal: string;
79
+ confidence: number;
80
+ };
81
+ /**
82
+ * Get signal for a metric value
83
+ */
84
+ export declare function getMetricSignal(metricId: string, value: number): {
85
+ signal: string;
86
+ emoji: string;
87
+ meaning: string;
88
+ } | null;
89
+ export declare const MARKET_THRESHOLDS: {
90
+ mvrv: {
91
+ bullish: {
92
+ max: number;
93
+ };
94
+ neutral: {
95
+ min: number;
96
+ max: number;
97
+ };
98
+ bearish: {
99
+ min: number;
100
+ };
101
+ };
102
+ sopr: {
103
+ bullish: {
104
+ max: number;
105
+ };
106
+ neutral: {
107
+ min: number;
108
+ max: number;
109
+ };
110
+ bearish: {
111
+ min: number;
112
+ };
113
+ };
114
+ netflow: {
115
+ bullish: {
116
+ max: number;
117
+ };
118
+ neutral: {
119
+ min: number;
120
+ max: number;
121
+ };
122
+ bearish: {
123
+ min: number;
124
+ };
125
+ };
126
+ };
127
+ export declare const WHALE_THRESHOLDS: {
128
+ ratio: {
129
+ retail: {
130
+ max: number;
131
+ };
132
+ mixed: {
133
+ min: number;
134
+ max: number;
135
+ };
136
+ whaleHeavy: {
137
+ min: number;
138
+ max: number;
139
+ };
140
+ whaleDominated: {
141
+ min: number;
142
+ max: number;
143
+ };
144
+ extreme: {
145
+ min: number;
146
+ };
147
+ };
148
+ };
149
+ export declare const CYCLE_PHASES: {
150
+ accumulation: {
151
+ name: string;
152
+ mvrv: string;
153
+ sopr: string;
154
+ netflow: string;
155
+ };
156
+ markupEarlyBull: {
157
+ name: string;
158
+ mvrv: string;
159
+ sopr: string;
160
+ netflow: string;
161
+ };
162
+ distribution: {
163
+ name: string;
164
+ mvrv: string;
165
+ sopr: string;
166
+ netflow: string;
167
+ };
168
+ markdownBear: {
169
+ name: string;
170
+ mvrv: string;
171
+ sopr: string;
172
+ netflow: string;
173
+ };
174
+ };
175
+ export declare const INTERPRETATION_SYSTEM_PROMPT = "\nYou are a crypto market analyst with access to CryptoQuant on-chain data.\n\n## Key Metrics Interpretation\n\n### Valuation (MVRV)\n- < 1.0: \uD83D\uDFE2 Undervalued (buy zone)\n- 1.0-2.5: \uD83D\uDFE1 Fair value\n- > 3.5: \uD83D\uDD34 Overheated (sell zone)\n\n### Profit Behavior (SOPR)\n- < 0.95: \uD83D\uDFE2 Capitulation (contrarian buy)\n- 0.95-1.05: \uD83D\uDFE1 Normal\n- > 1.10: \uD83D\uDD34 Heavy profit taking\n\n### Exchange Flows (Netflow)\n- < -1,000 BTC: \uD83D\uDFE2 Accumulation\n- \u00B11,000 BTC: \uD83D\uDFE1 Neutral\n- > +5,000 BTC: \uD83D\uDD34 Distribution\n\n### Funding Rate\n- < -0.03%: \uD83D\uDFE2 Shorts overcrowded\n- \u00B10.01%: \uD83D\uDFE1 Neutral\n- > 0.05%: \uD83D\uDD34 Longs overcrowded\n\n## Trading Signal Weights\n- MVRV: 30%\n- SOPR: 25%\n- Netflow: 25%\n- Funding: 20%\n\nScore > 70: BUY | 40-70: HOLD | < 40: SELL\n\n## Important Notes\n- No single metric is definitive - use multiple confirmations\n- Context matters - same values mean different things in bull vs bear\n- This is not financial advice - metrics are informational only\n";
176
+ //# sourceMappingURL=metrics-data.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-data.generated.d.ts","sourceRoot":"","sources":["../../src/shared/metrics-data.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAMD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;CAKhB,CAAC;AAMX,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA8yF/D,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA0CvD,CAAC;AAMF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAElF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUtE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAwBvD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAO3D;AAMD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAI7B,CAAC;AAMF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;CAQ5B,CAAC;AAMF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAC;AAMF,eAAO,MAAM,4BAA4B,+jCAqCxC,CAAC"}