@catalyst-team/poly-mcp 0.1.1 → 0.1.2
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/README.md +240 -21
- package/dist/errors.d.ts +11 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +13 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -5
- package/dist/index.js.map +1 -1
- package/dist/sdk-instance.d.ts +27 -0
- package/dist/sdk-instance.d.ts.map +1 -0
- package/dist/sdk-instance.js +64 -0
- package/dist/sdk-instance.js.map +1 -0
- package/dist/server.d.ts +13 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -27
- package/dist/server.js.map +1 -1
- package/dist/tools/guide.d.ts.map +1 -1
- package/dist/tools/guide.js +159 -1
- package/dist/tools/guide.js.map +1 -1
- package/dist/tools/index.d.ts +8 -4
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +20 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/insider-detection.d.ts +175 -0
- package/dist/tools/insider-detection.d.ts.map +1 -0
- package/dist/tools/insider-detection.js +654 -0
- package/dist/tools/insider-detection.js.map +1 -0
- package/dist/tools/insider-signals.d.ts +56 -0
- package/dist/tools/insider-signals.d.ts.map +1 -0
- package/dist/tools/insider-signals.js +170 -0
- package/dist/tools/insider-signals.js.map +1 -0
- package/dist/tools/market.d.ts +25 -1
- package/dist/tools/market.d.ts.map +1 -1
- package/dist/tools/market.js +504 -12
- package/dist/tools/market.js.map +1 -1
- package/dist/tools/onchain.d.ts +240 -0
- package/dist/tools/onchain.d.ts.map +1 -0
- package/dist/tools/onchain.js +610 -0
- package/dist/tools/onchain.js.map +1 -0
- package/dist/tools/order.d.ts.map +1 -1
- package/dist/tools/order.js +13 -6
- package/dist/tools/order.js.map +1 -1
- package/dist/tools/trade.d.ts +15 -0
- package/dist/tools/trade.d.ts.map +1 -1
- package/dist/tools/trade.js +216 -39
- package/dist/tools/trade.js.map +1 -1
- package/dist/tools/trader.d.ts +4 -1
- package/dist/tools/trader.d.ts.map +1 -1
- package/dist/tools/trader.js +316 -4
- package/dist/tools/trader.js.map +1 -1
- package/dist/tools/wallet-classification.d.ts +166 -0
- package/dist/tools/wallet-classification.d.ts.map +1 -0
- package/dist/tools/wallet-classification.js +455 -0
- package/dist/tools/wallet-classification.js.map +1 -0
- package/dist/tools/wallet.d.ts +56 -7
- package/dist/tools/wallet.d.ts.map +1 -1
- package/dist/tools/wallet.js +141 -20
- package/dist/tools/wallet.js.map +1 -1
- package/dist/types.d.ts +269 -10
- package/dist/types.d.ts.map +1 -1
- package/dist/wallet-manager.d.ts +67 -0
- package/dist/wallet-manager.d.ts.map +1 -0
- package/dist/wallet-manager.js +180 -0
- package/dist/wallet-manager.js.map +1 -0
- package/docs/01-mcp.md +554 -32
- package/docs/02-wallet-deep-research.md +344 -0
- package/docs/e2e-02/00-gap-analysis.md +211 -0
- package/docs/e2e-02/01-test-scenarios.md +530 -0
- package/docs/e2e-02/02-implementation-plan.md +190 -0
- package/docs/e2e-02/README.md +102 -0
- package/docs/reports/simonbanza-strategy-analysis-2025-12-25.md +420 -0
- package/docs/reports/smart-money-analysis-2025-12-23-cn.md +840 -0
- package/docs/reports/smart-money-trading-strategies-2025-12-25.md +440 -0
- package/docs/reports/weekly/01-v2.5.md +352 -0
- package/docs/reports/weekly/01.md +402 -0
- package/docs/reports/weekly/02-deep.md +558 -0
- package/docs/reports/weekly/02.md +505 -0
- package/docs/reports/weekly/03.md +437 -0
- package/docs/reports/weekly/04.md +418 -0
- package/docs/reports/weekly/05.md +485 -0
- package/docs/reports/weekly/06.md +436 -0
- package/docs/reports/weekly/07.md +381 -0
- package/docs/reports/weekly/08.md +502 -0
- package/docs/reports/weekly/09.md +441 -0
- package/docs/reports/weekly/10.md +511 -0
- package/docs/reports/weekly/README.md +188 -0
- package/docs/reports/weekly/prompt-v2.5.md +1019 -0
- package/docs/reports/weekly/prompt-v3.md +432 -0
- package/docs/reports/weekly/prompt.md +841 -0
- package/package.json +3 -2
- package/src/errors.ts +13 -2
- package/src/index.ts +286 -1
- package/src/sdk-instance.ts +78 -0
- package/src/server.ts +30 -28
- package/src/tools/guide.ts +160 -1
- package/src/tools/index.ts +65 -0
- package/src/tools/insider-detection.ts +899 -0
- package/src/tools/insider-signals.ts +213 -0
- package/src/tools/market.ts +569 -12
- package/src/tools/onchain.ts +738 -0
- package/src/tools/order.ts +25 -12
- package/src/tools/trade.ts +265 -53
- package/src/tools/trader.ts +350 -4
- package/src/tools/wallet-classification.ts +587 -0
- package/src/tools/wallet.ts +172 -23
- package/src/types.ts +294 -11
- package/src/wallet-manager.ts +209 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Insider Signals MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for managing insider detection signals.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ToolDefinition } from '../types.js';
|
|
8
|
+
import type { PolymarketSDK } from '@catalyst-team/poly-sdk';
|
|
9
|
+
import {
|
|
10
|
+
InsiderSignalService,
|
|
11
|
+
type InsiderSignalType,
|
|
12
|
+
type InsiderSignalSeverity,
|
|
13
|
+
} from '@catalyst-team/smart-money';
|
|
14
|
+
import { join } from 'node:path';
|
|
15
|
+
import { wrapError } from '../errors.js';
|
|
16
|
+
|
|
17
|
+
// Initialize service
|
|
18
|
+
let signalService: InsiderSignalService | null = null;
|
|
19
|
+
|
|
20
|
+
function getSignalService(): InsiderSignalService {
|
|
21
|
+
if (!signalService) {
|
|
22
|
+
const dataDir = process.env.DATA_DIR || join(process.cwd(), 'data');
|
|
23
|
+
signalService = new InsiderSignalService({
|
|
24
|
+
dataDir: join(dataDir, 'signals'),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return signalService;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ============= Tool Definitions =============
|
|
31
|
+
|
|
32
|
+
export const insiderSignalsToolDefinitions: ToolDefinition[] = [
|
|
33
|
+
{
|
|
34
|
+
name: 'get_insider_signals',
|
|
35
|
+
description: 'Get insider detection signals with optional filtering. Returns alerts for new insider wallets discovered, large trades by insiders, and cluster activity.',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
type: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
enum: ['insider_new', 'insider_large_trade', 'insider_cluster'],
|
|
42
|
+
description: 'Filter by signal type. insider_new: new wallet discovered, insider_large_trade: large trade detected, insider_cluster: multiple insiders trading same market.',
|
|
43
|
+
},
|
|
44
|
+
severity: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
enum: ['low', 'medium', 'high'],
|
|
47
|
+
description: 'Filter by severity level.',
|
|
48
|
+
},
|
|
49
|
+
unreadOnly: {
|
|
50
|
+
type: 'boolean',
|
|
51
|
+
default: false,
|
|
52
|
+
description: 'Only return unread signals.',
|
|
53
|
+
},
|
|
54
|
+
limit: {
|
|
55
|
+
type: 'number',
|
|
56
|
+
default: 20,
|
|
57
|
+
description: 'Maximum signals to return (max 100).',
|
|
58
|
+
},
|
|
59
|
+
since: {
|
|
60
|
+
type: 'number',
|
|
61
|
+
description: 'Only return signals after this Unix timestamp (milliseconds).',
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'get_insider_signal_count',
|
|
68
|
+
description: 'Get the count of unread insider signals. Useful for displaying notification badges.',
|
|
69
|
+
inputSchema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: {},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: 'mark_insider_signal_read',
|
|
76
|
+
description: 'Mark an insider signal as read.',
|
|
77
|
+
inputSchema: {
|
|
78
|
+
type: 'object',
|
|
79
|
+
properties: {
|
|
80
|
+
id: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Signal ID to mark as read.',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
required: ['id'],
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: 'mark_all_insider_signals_read',
|
|
90
|
+
description: 'Mark all insider signals as read.',
|
|
91
|
+
inputSchema: {
|
|
92
|
+
type: 'object',
|
|
93
|
+
properties: {},
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
// ============= Input Types =============
|
|
99
|
+
|
|
100
|
+
interface GetInsiderSignalsInput {
|
|
101
|
+
type?: InsiderSignalType;
|
|
102
|
+
severity?: InsiderSignalSeverity;
|
|
103
|
+
unreadOnly?: boolean;
|
|
104
|
+
limit?: number;
|
|
105
|
+
since?: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
interface MarkInsiderSignalReadInput {
|
|
109
|
+
id: string;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ============= Handlers =============
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get insider signals with optional filtering
|
|
116
|
+
*/
|
|
117
|
+
export async function handleGetInsiderSignals(
|
|
118
|
+
_sdk: PolymarketSDK,
|
|
119
|
+
input: GetInsiderSignalsInput
|
|
120
|
+
) {
|
|
121
|
+
try {
|
|
122
|
+
const service = getSignalService();
|
|
123
|
+
|
|
124
|
+
const result = service.getSignals({
|
|
125
|
+
type: input.type,
|
|
126
|
+
severity: input.severity,
|
|
127
|
+
unreadOnly: input.unreadOnly ?? false,
|
|
128
|
+
limit: Math.min(input.limit ?? 20, 100),
|
|
129
|
+
since: input.since,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
signals: result.signals,
|
|
134
|
+
total: result.total,
|
|
135
|
+
unreadCount: result.unreadCount,
|
|
136
|
+
filters: {
|
|
137
|
+
type: input.type || 'all',
|
|
138
|
+
severity: input.severity || 'all',
|
|
139
|
+
unreadOnly: input.unreadOnly ?? false,
|
|
140
|
+
limit: input.limit ?? 20,
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
} catch (err) {
|
|
144
|
+
throw wrapError(err);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Get count of unread insider signals
|
|
150
|
+
*/
|
|
151
|
+
export async function handleGetInsiderSignalCount(
|
|
152
|
+
_sdk: PolymarketSDK,
|
|
153
|
+
_input: Record<string, never>
|
|
154
|
+
) {
|
|
155
|
+
try {
|
|
156
|
+
const service = getSignalService();
|
|
157
|
+
const count = service.getUnreadCount();
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
unreadCount: count,
|
|
161
|
+
};
|
|
162
|
+
} catch (err) {
|
|
163
|
+
throw wrapError(err);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Mark a single insider signal as read
|
|
169
|
+
*/
|
|
170
|
+
export async function handleMarkInsiderSignalRead(
|
|
171
|
+
_sdk: PolymarketSDK,
|
|
172
|
+
input: MarkInsiderSignalReadInput
|
|
173
|
+
) {
|
|
174
|
+
try {
|
|
175
|
+
const service = getSignalService();
|
|
176
|
+
const success = service.markAsRead(input.id);
|
|
177
|
+
|
|
178
|
+
if (!success) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
message: 'Signal not found or already read',
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
success: true,
|
|
187
|
+
message: `Signal ${input.id} marked as read`,
|
|
188
|
+
};
|
|
189
|
+
} catch (err) {
|
|
190
|
+
throw wrapError(err);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Mark all insider signals as read
|
|
196
|
+
*/
|
|
197
|
+
export async function handleMarkAllInsiderSignalsRead(
|
|
198
|
+
_sdk: PolymarketSDK,
|
|
199
|
+
_input: Record<string, never>
|
|
200
|
+
) {
|
|
201
|
+
try {
|
|
202
|
+
const service = getSignalService();
|
|
203
|
+
const count = service.markAllAsRead();
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
success: true,
|
|
207
|
+
markedCount: count,
|
|
208
|
+
message: `Marked ${count} signals as read`,
|
|
209
|
+
};
|
|
210
|
+
} catch (err) {
|
|
211
|
+
throw wrapError(err);
|
|
212
|
+
}
|
|
213
|
+
}
|