@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.
- package/LICENSE +21 -0
- package/README.md +329 -59
- 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/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} +1 -1
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/{permissions.js → core/permissions.js} +6 -6
- 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/core/utils.d.ts.map +1 -0
- package/dist/{utils.js → core/utils.js} +2 -2
- package/dist/core/utils.js.map +1 -0
- 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.map +1 -0
- package/dist/{tools → stdio/tools}/auth.js +10 -8
- package/dist/stdio/tools/auth.js.map +1 -0
- package/dist/stdio/tools/core.d.ts.map +1 -0
- package/dist/{tools → stdio/tools}/core.js +32 -145
- package/dist/stdio/tools/core.js.map +1 -0
- package/package.json +52 -13
- 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 -47
- 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.map +0 -1
- package/dist/tools/auth.js.map +0 -1
- 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/{discovery.js → core/discovery.js} +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
- /package/dist/{utils.d.ts → core/utils.d.ts} +0 -0
- /package/dist/{tools → stdio/tools}/auth.d.ts +0 -0
- /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"}
|