@dwlf/mcp-server 0.3.0

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/client.d.ts +10 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +87 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +45 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/resources/symbols.d.ts +4 -0
  12. package/dist/resources/symbols.d.ts.map +1 -0
  13. package/dist/resources/symbols.js +15 -0
  14. package/dist/resources/symbols.js.map +1 -0
  15. package/dist/tools/academy.d.ts +3 -0
  16. package/dist/tools/academy.d.ts.map +1 -0
  17. package/dist/tools/academy.js +130 -0
  18. package/dist/tools/academy.js.map +1 -0
  19. package/dist/tools/ai-summary.d.ts +4 -0
  20. package/dist/tools/ai-summary.d.ts.map +1 -0
  21. package/dist/tools/ai-summary.js +53 -0
  22. package/dist/tools/ai-summary.js.map +1 -0
  23. package/dist/tools/backtests.d.ts +4 -0
  24. package/dist/tools/backtests.d.ts.map +1 -0
  25. package/dist/tools/backtests.js +84 -0
  26. package/dist/tools/backtests.js.map +1 -0
  27. package/dist/tools/custom-events.d.ts +4 -0
  28. package/dist/tools/custom-events.d.ts.map +1 -0
  29. package/dist/tools/custom-events.js +72 -0
  30. package/dist/tools/custom-events.js.map +1 -0
  31. package/dist/tools/indicators.d.ts +4 -0
  32. package/dist/tools/indicators.d.ts.map +1 -0
  33. package/dist/tools/indicators.js +61 -0
  34. package/dist/tools/indicators.js.map +1 -0
  35. package/dist/tools/market-data.d.ts +4 -0
  36. package/dist/tools/market-data.d.ts.map +1 -0
  37. package/dist/tools/market-data.js +120 -0
  38. package/dist/tools/market-data.js.map +1 -0
  39. package/dist/tools/portfolio.d.ts +4 -0
  40. package/dist/tools/portfolio.d.ts.map +1 -0
  41. package/dist/tools/portfolio.js +70 -0
  42. package/dist/tools/portfolio.js.map +1 -0
  43. package/dist/tools/signals.d.ts +4 -0
  44. package/dist/tools/signals.d.ts.map +1 -0
  45. package/dist/tools/signals.js +69 -0
  46. package/dist/tools/signals.js.map +1 -0
  47. package/dist/tools/strategies.d.ts +4 -0
  48. package/dist/tools/strategies.d.ts.map +1 -0
  49. package/dist/tools/strategies.js +118 -0
  50. package/dist/tools/strategies.js.map +1 -0
  51. package/dist/tools/symbol-activations.d.ts +4 -0
  52. package/dist/tools/symbol-activations.d.ts.map +1 -0
  53. package/dist/tools/symbol-activations.js +191 -0
  54. package/dist/tools/symbol-activations.js.map +1 -0
  55. package/dist/tools/trades.d.ts +4 -0
  56. package/dist/tools/trades.d.ts.map +1 -0
  57. package/dist/tools/trades.js +180 -0
  58. package/dist/tools/trades.js.map +1 -0
  59. package/dist/tools/watchlist.d.ts +4 -0
  60. package/dist/tools/watchlist.d.ts.map +1 -0
  61. package/dist/tools/watchlist.js +50 -0
  62. package/dist/tools/watchlist.js.map +1 -0
  63. package/package.json +58 -0
@@ -0,0 +1,118 @@
1
+ import { z } from 'zod';
2
+ export function registerStrategyTools(server, client) {
3
+ // 1. List strategies
4
+ server.tool('dwlf_list_strategies', "List the user's visual trading strategies with names, descriptions, and associated symbols.", {}, async () => {
5
+ try {
6
+ const data = await client.get('/visual-strategies');
7
+ return {
8
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
9
+ };
10
+ }
11
+ catch (error) {
12
+ return {
13
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
14
+ isError: true,
15
+ };
16
+ }
17
+ });
18
+ // 2. Get strategy details
19
+ server.tool('dwlf_get_strategy', 'Get full details of a specific strategy including signal definitions, nodes, and edges.', {
20
+ strategyId: z.string().describe('Strategy ID'),
21
+ }, async ({ strategyId }) => {
22
+ try {
23
+ const data = await client.get(`/visual-strategies/${strategyId}`);
24
+ return {
25
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
26
+ };
27
+ }
28
+ catch (error) {
29
+ return {
30
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
31
+ isError: true,
32
+ };
33
+ }
34
+ });
35
+ // 3. Create strategy
36
+ server.tool('dwlf_create_strategy', 'Create a new visual trading strategy. Provide name, description, and signal definitions. ⚠️ IMPORTANT: After creation, the strategy will NOT generate signals until you activate it for specific symbols using dwlf_activate_strategy_symbols. Always ask the user which symbols to activate for, then call that tool.', {
37
+ name: z.string().describe('Strategy name'),
38
+ description: z.string().optional().describe('Strategy description'),
39
+ bodyJson: z.string().optional().describe('Full strategy body as JSON string (nodes, edges, signals). Parse before sending.'),
40
+ }, async ({ name, description, bodyJson }) => {
41
+ try {
42
+ const extra = bodyJson ? JSON.parse(bodyJson) : {};
43
+ const data = await client.post('/visual-strategies', {
44
+ name,
45
+ description,
46
+ ...extra,
47
+ });
48
+ return {
49
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
50
+ };
51
+ }
52
+ catch (error) {
53
+ return {
54
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
55
+ isError: true,
56
+ };
57
+ }
58
+ });
59
+ // 4. Update strategy
60
+ server.tool('dwlf_update_strategy', 'Update an existing visual trading strategy. Provide the strategy ID and updated fields.', {
61
+ strategyId: z.string().describe('Strategy ID to update'),
62
+ name: z.string().optional().describe('Updated strategy name'),
63
+ description: z.string().optional().describe('Updated description'),
64
+ bodyJson: z.string().optional().describe('Updated strategy body as JSON string (nodes, edges, metadata). Parse before sending.'),
65
+ }, async ({ strategyId, name, description, bodyJson }) => {
66
+ try {
67
+ const extra = bodyJson ? JSON.parse(bodyJson) : {};
68
+ const body = { ...extra };
69
+ if (name !== undefined)
70
+ body.name = name;
71
+ if (description !== undefined)
72
+ body.description = description;
73
+ const data = await client.put(`/visual-strategies/${strategyId}`, body);
74
+ return {
75
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
76
+ };
77
+ }
78
+ catch (error) {
79
+ return {
80
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
81
+ isError: true,
82
+ };
83
+ }
84
+ });
85
+ // 5. Compile strategy
86
+ server.tool('dwlf_compile_strategy', 'Compile a visual strategy into an executable trade signal. Must be called after creating or updating a strategy before it can be evaluated or generate signals.', {
87
+ strategyId: z.string().describe('Strategy ID to compile'),
88
+ }, async ({ strategyId }) => {
89
+ try {
90
+ const data = await client.post(`/visual-strategies/${strategyId}/compile`, {});
91
+ return {
92
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
93
+ };
94
+ }
95
+ catch (error) {
96
+ return {
97
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
98
+ isError: true,
99
+ };
100
+ }
101
+ });
102
+ // 6. List public strategies
103
+ server.tool('dwlf_list_public_strategies', 'List community-shared public strategies that can be used as inspiration or cloned.', {}, async () => {
104
+ try {
105
+ const data = await client.get('/visual-strategies/public');
106
+ return {
107
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
113
+ isError: true,
114
+ };
115
+ }
116
+ });
117
+ }
118
+ //# sourceMappingURL=strategies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../src/tools/strategies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { DWLFClient } from '../client.js';
3
+ export declare function registerSymbolActivationTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=symbol-activations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-activations.d.ts","sourceRoot":"","sources":["../../src/tools/symbol-activations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAE3D,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAqPnB"}
@@ -0,0 +1,191 @@
1
+ import { z } from 'zod';
2
+ import { normalizeSymbol } from '../client.js';
3
+ export function registerSymbolActivationTools(server, client) {
4
+ // ─── Custom Event Symbol Activation ───────────────────────────────
5
+ // 1. Activate symbols for a custom event (bulk enable)
6
+ server.tool('dwlf_activate_event_symbols', 'Activate (enable) one or more symbols for a custom event. The event will only fire for symbols that are activated. ⚠️ This MUST be called after creating a custom event — events do NOT fire until symbols are activated.', {
7
+ eventId: z.string().describe('Custom event ID'),
8
+ symbols: z
9
+ .array(z.string())
10
+ .describe('Array of symbols to activate (e.g. ["BTC-USD", "ETH-USD", "NVDA"])'),
11
+ }, async ({ eventId, symbols }) => {
12
+ try {
13
+ const normalized = symbols.map(normalizeSymbol);
14
+ const data = await client.post(`/custom-event-symbols/${eventId}/enable-all`, { symbols: normalized });
15
+ return {
16
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
17
+ };
18
+ }
19
+ catch (error) {
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
25
+ },
26
+ ],
27
+ isError: true,
28
+ };
29
+ }
30
+ });
31
+ // 2. Get active symbols for a custom event
32
+ server.tool('dwlf_get_event_symbols', 'Get the list of symbols currently activated for a custom event.', {
33
+ eventId: z.string().describe('Custom event ID'),
34
+ }, async ({ eventId }) => {
35
+ try {
36
+ const data = await client.get(`/custom-event-symbols/event/${eventId}`);
37
+ return {
38
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
39
+ };
40
+ }
41
+ catch (error) {
42
+ return {
43
+ content: [
44
+ {
45
+ type: 'text',
46
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
47
+ },
48
+ ],
49
+ isError: true,
50
+ };
51
+ }
52
+ });
53
+ // 3. Deactivate symbols for a custom event (bulk disable)
54
+ server.tool('dwlf_deactivate_event_symbols', 'Deactivate (disable) one or more symbols for a custom event. The event will stop firing for these symbols.', {
55
+ eventId: z.string().describe('Custom event ID'),
56
+ symbols: z
57
+ .array(z.string())
58
+ .describe('Array of symbols to deactivate'),
59
+ }, async ({ eventId, symbols }) => {
60
+ try {
61
+ const normalized = symbols.map(normalizeSymbol);
62
+ const data = await client.post(`/custom-event-symbols/${eventId}/disable-all`, { symbols: normalized });
63
+ return {
64
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
65
+ };
66
+ }
67
+ catch (error) {
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
73
+ },
74
+ ],
75
+ isError: true,
76
+ };
77
+ }
78
+ });
79
+ // ─── Strategy Symbol Activation ───────────────────────────────────
80
+ // 4. Activate symbols for a strategy (bulk enable)
81
+ server.tool('dwlf_activate_strategy_symbols', 'Activate (enable) one or more symbols for a strategy. The strategy will only generate signals for symbols that are activated. ⚠️ This MUST be called after creating a strategy — strategies do NOT generate signals until symbols are activated.', {
82
+ strategyId: z.string().describe('Strategy ID'),
83
+ symbols: z
84
+ .array(z.string())
85
+ .describe('Array of symbols to activate (e.g. ["BTC-USD", "ETH-USD", "NVDA"])'),
86
+ }, async ({ strategyId, symbols }) => {
87
+ try {
88
+ const normalized = symbols.map(normalizeSymbol);
89
+ const data = await client.post(`/strategy-symbols/${strategyId}/enable-all`, { symbols: normalized });
90
+ return {
91
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
92
+ };
93
+ }
94
+ catch (error) {
95
+ return {
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
100
+ },
101
+ ],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ // 5. Get active symbols for a strategy
107
+ server.tool('dwlf_get_strategy_symbols', 'Get the list of symbols currently activated for a strategy.', {
108
+ strategyId: z.string().describe('Strategy ID'),
109
+ }, async ({ strategyId }) => {
110
+ try {
111
+ const data = await client.get(`/strategy-symbols/strategy/${strategyId}`);
112
+ return {
113
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
114
+ };
115
+ }
116
+ catch (error) {
117
+ return {
118
+ content: [
119
+ {
120
+ type: 'text',
121
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
122
+ },
123
+ ],
124
+ isError: true,
125
+ };
126
+ }
127
+ });
128
+ // 6. Deactivate symbols for a strategy (bulk disable)
129
+ server.tool('dwlf_deactivate_strategy_symbols', 'Deactivate (disable) one or more symbols for a strategy. The strategy will stop generating signals for these symbols.', {
130
+ strategyId: z.string().describe('Strategy ID'),
131
+ symbols: z
132
+ .array(z.string())
133
+ .describe('Array of symbols to deactivate'),
134
+ }, async ({ strategyId, symbols }) => {
135
+ try {
136
+ const normalized = symbols.map(normalizeSymbol);
137
+ const data = await client.post(`/strategy-symbols/${strategyId}/disable-all`, { symbols: normalized });
138
+ return {
139
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
140
+ };
141
+ }
142
+ catch (error) {
143
+ return {
144
+ content: [
145
+ {
146
+ type: 'text',
147
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
148
+ },
149
+ ],
150
+ isError: true,
151
+ };
152
+ }
153
+ });
154
+ // ─── List all symbol activations ──────────────────────────────────
155
+ // 7. List all user's event AND strategy symbol associations
156
+ server.tool('dwlf_list_all_symbol_activations', "List all the user's symbol activations across both custom events and strategies. Shows which symbols are active for which events/strategies.", {
157
+ activeOnly: z
158
+ .boolean()
159
+ .optional()
160
+ .describe('If true, only return active associations (default: true)'),
161
+ }, async ({ activeOnly }) => {
162
+ try {
163
+ const onlyActive = activeOnly !== false;
164
+ const [eventSymbols, strategySymbols] = await Promise.all([
165
+ client.get('/custom-event-symbols', {
166
+ activeOnly: onlyActive,
167
+ }),
168
+ client.get('/strategy-symbols', { activeOnly: onlyActive }),
169
+ ]);
170
+ const result = {
171
+ eventSymbols,
172
+ strategySymbols,
173
+ };
174
+ return {
175
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
176
+ };
177
+ }
178
+ catch (error) {
179
+ return {
180
+ content: [
181
+ {
182
+ type: 'text',
183
+ text: `Error: ${error instanceof Error ? error.message : String(error)}`,
184
+ },
185
+ ],
186
+ isError: true,
187
+ };
188
+ }
189
+ });
190
+ }
191
+ //# sourceMappingURL=symbol-activations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-activations.js","sourceRoot":"","sources":["../../src/tools/symbol-activations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { DWLFClient } from '../client.js';
3
+ export declare function registerTradeTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=trades.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trades.d.ts","sourceRoot":"","sources":["../../src/tools/trades.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAE3D,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAiNnB"}
@@ -0,0 +1,180 @@
1
+ import { z } from 'zod';
2
+ import { normalizeSymbol } from '../client.js';
3
+ export function registerTradeTools(server, client) {
4
+ // 1. List trades
5
+ server.tool('dwlf_list_trades', 'List trades from the trade journal. Filter by status (open/closed) or symbol.', {
6
+ status: z.enum(['open', 'closed']).optional().describe('Filter by trade status'),
7
+ symbol: z.string().optional().describe('Filter by symbol (e.g. BTC, TSLA)'),
8
+ }, async ({ status, symbol }) => {
9
+ try {
10
+ const params = {};
11
+ if (status)
12
+ params.status = status;
13
+ if (symbol)
14
+ params.symbol = normalizeSymbol(symbol);
15
+ const data = await client.get('/trades', params);
16
+ return {
17
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
18
+ };
19
+ }
20
+ catch (error) {
21
+ return {
22
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
23
+ isError: true,
24
+ };
25
+ }
26
+ });
27
+ // 2. Get trade details
28
+ server.tool('dwlf_get_trade', 'Get full details for a specific trade including notes, executions, and events.', {
29
+ tradeId: z.string().describe('Trade ID'),
30
+ }, async ({ tradeId }) => {
31
+ try {
32
+ const data = await client.get(`/trades/${tradeId}`);
33
+ return {
34
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
40
+ isError: true,
41
+ };
42
+ }
43
+ });
44
+ // 3. Create trade
45
+ server.tool('dwlf_create_trade', 'Log a new trade in the journal. Specify symbol, direction, entry price, and optional stop loss / take profit.', {
46
+ symbol: z.string().describe('Trading symbol (e.g. BTC, TSLA, RIOT)'),
47
+ direction: z.enum(['long', 'short']).describe('Trade direction'),
48
+ entryPrice: z.number().describe('Entry price'),
49
+ positionSize: z.number().optional().describe('Position size (quantity)'),
50
+ initialStop: z.number().optional().describe('Stop loss price'),
51
+ initialTakeProfit: z.number().optional().describe('Take profit price'),
52
+ timeframe: z.string().optional().describe('Timeframe (e.g. 1d, 4h, 1h)'),
53
+ reasonText: z.string().optional().describe('Trade reasoning / thesis'),
54
+ isPaperTrade: z.boolean().optional().describe('Whether this is a paper trade (default: false)'),
55
+ assetType: z.enum(['crypto', 'equity', 'forex']).optional().describe('Asset type'),
56
+ }, async ({ symbol, direction, entryPrice, positionSize, initialStop, initialTakeProfit, timeframe, reasonText, isPaperTrade, assetType }) => {
57
+ try {
58
+ const body = {
59
+ assetSymbol: normalizeSymbol(symbol),
60
+ direction,
61
+ entryPrice,
62
+ entryAt: new Date().toISOString(),
63
+ };
64
+ if (positionSize !== undefined)
65
+ body.positionSize = positionSize;
66
+ if (initialStop !== undefined)
67
+ body.initialStop = initialStop;
68
+ if (initialTakeProfit !== undefined)
69
+ body.initialTakeProfit = initialTakeProfit;
70
+ if (timeframe)
71
+ body.timeframe = timeframe;
72
+ if (reasonText)
73
+ body.reasonText = reasonText;
74
+ if (isPaperTrade !== undefined)
75
+ body.isPaperTrade = isPaperTrade;
76
+ if (assetType)
77
+ body.assetType = assetType;
78
+ const data = await client.post('/trades', body);
79
+ return {
80
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
81
+ };
82
+ }
83
+ catch (error) {
84
+ return {
85
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
86
+ isError: true,
87
+ };
88
+ }
89
+ });
90
+ // 4. Close trade
91
+ server.tool('dwlf_close_trade', 'Close an open trade by specifying the exit price.', {
92
+ tradeId: z.string().describe('Trade ID to close'),
93
+ exitPrice: z.number().describe('Exit price'),
94
+ exitAt: z.string().optional().describe('Exit timestamp (ISO 8601, defaults to now)'),
95
+ }, async ({ tradeId, exitPrice, exitAt }) => {
96
+ try {
97
+ const body = { exitPrice };
98
+ if (exitAt)
99
+ body.exitAt = exitAt;
100
+ const data = await client.post(`/trades/${tradeId}/close`, body);
101
+ return {
102
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
103
+ };
104
+ }
105
+ catch (error) {
106
+ return {
107
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
108
+ isError: true,
109
+ };
110
+ }
111
+ });
112
+ // 5. Add trade note
113
+ server.tool('dwlf_add_trade_note', 'Add a note to an existing trade — observations, adjustments, lessons learned.', {
114
+ tradeId: z.string().describe('Trade ID'),
115
+ content: z.string().describe('Note content'),
116
+ }, async ({ tradeId, content }) => {
117
+ try {
118
+ const data = await client.post(`/trades/${tradeId}/notes`, { content });
119
+ return {
120
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
121
+ };
122
+ }
123
+ catch (error) {
124
+ return {
125
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
126
+ isError: true,
127
+ };
128
+ }
129
+ });
130
+ // 6. Get trade notes
131
+ server.tool('dwlf_get_trade_notes', 'Get all notes for a trade — observations, updates, and lessons recorded during the trade.', {
132
+ tradeId: z.string().describe('Trade ID'),
133
+ }, async ({ tradeId }) => {
134
+ try {
135
+ const data = await client.get(`/trades/${tradeId}/notes`);
136
+ return {
137
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
138
+ };
139
+ }
140
+ catch (error) {
141
+ return {
142
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
143
+ isError: true,
144
+ };
145
+ }
146
+ });
147
+ // 7. List trade plans
148
+ server.tool('dwlf_list_trade_plans', 'List trade plan templates — reusable frameworks for entering trades.', {}, async () => {
149
+ try {
150
+ const data = await client.get('/trade-plans');
151
+ return {
152
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
153
+ };
154
+ }
155
+ catch (error) {
156
+ return {
157
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
158
+ isError: true,
159
+ };
160
+ }
161
+ });
162
+ // 7. Get trade state
163
+ server.tool('dwlf_get_trade_state', 'Get the current state of a trade — including execution history and adjustments.', {
164
+ tradeId: z.string().describe('Trade ID'),
165
+ }, async ({ tradeId }) => {
166
+ try {
167
+ const data = await client.get(`/trades/${tradeId}/state`);
168
+ return {
169
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
170
+ };
171
+ }
172
+ catch (error) {
173
+ return {
174
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
175
+ isError: true,
176
+ };
177
+ }
178
+ });
179
+ }
180
+ //# sourceMappingURL=trades.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trades.js","sourceRoot":"","sources":["../../src/tools/trades.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { DWLFClient } from '../client.js';
3
+ export declare function registerWatchlistTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=watchlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchlist.d.ts","sourceRoot":"","sources":["../../src/tools/watchlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAE3D,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAwDnB"}
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ import { normalizeSymbol } from '../client.js';
3
+ export function registerWatchlistTools(server, client) {
4
+ // 1. Get watchlist
5
+ server.tool('dwlf_get_watchlist', "Get the user's watchlist — symbols they're actively monitoring.", {}, async () => {
6
+ try {
7
+ const data = await client.get('/watchlist');
8
+ return {
9
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
10
+ };
11
+ }
12
+ catch (error) {
13
+ return {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: `Error fetching watchlist: ${error instanceof Error ? error.message : String(error)}`,
18
+ },
19
+ ],
20
+ isError: true,
21
+ };
22
+ }
23
+ });
24
+ // 2. Add symbol to watchlist
25
+ server.tool('dwlf_add_to_watchlist', "Add a trading symbol to the user's watchlist for monitoring.", {
26
+ symbol: z
27
+ .string()
28
+ .describe('Trading symbol to add — accepts BTC, BTC/USD, BTC-USD, BTCUSD, or stock tickers like AAPL, TSLA'),
29
+ }, async ({ symbol }) => {
30
+ try {
31
+ const sym = normalizeSymbol(symbol);
32
+ const data = await client.post('/watchlist', { symbol: sym });
33
+ return {
34
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: `Error adding ${symbol} to watchlist: ${error instanceof Error ? error.message : String(error)}`,
43
+ },
44
+ ],
45
+ isError: true,
46
+ };
47
+ }
48
+ });
49
+ }
50
+ //# sourceMappingURL=watchlist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watchlist.js","sourceRoot":"","sources":["../../src/tools/watchlist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAc,eAAe,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAkB;IAElB,mBAAmB;IACnB,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,iEAAiE,EACjE,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC5C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACjE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC5F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6BAA6B;IAC7B,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,8DAA8D,EAC9D;QACE,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CAAC,iGAAiG,CAAC;KAC/G,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACjE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,gBAAgB,MAAM,kBAAkB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACvG;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}