@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,84 @@
1
+ import { z } from 'zod';
2
+ import { normalizeSymbol } from '../client.js';
3
+ export function registerBacktestTools(server, client) {
4
+ // 1. Run a backtest
5
+ server.tool('dwlf_run_backtest', 'Trigger a backtest for a strategy. Backtests are async — this returns a requestId. Use dwlf_get_backtest_results to poll for results.', {
6
+ strategyId: z.string().describe('Strategy ID to backtest'),
7
+ symbols: z.array(z.string()).optional().describe('Symbols to backtest against (e.g. ["BTC", "TSLA"]). Defaults to strategy assets.'),
8
+ symbol: z.string().optional().describe('Single symbol shorthand (e.g. BTC, TSLA). Use "symbols" for multiple.'),
9
+ startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),
10
+ endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),
11
+ }, async ({ strategyId, symbols, symbol, startDate, endDate }) => {
12
+ try {
13
+ const body = { strategyId };
14
+ if (symbols && symbols.length > 0) {
15
+ body.symbols = symbols.map(normalizeSymbol);
16
+ }
17
+ else if (symbol) {
18
+ body.symbols = [normalizeSymbol(symbol)];
19
+ }
20
+ if (startDate)
21
+ body.startDate = startDate;
22
+ if (endDate)
23
+ body.endDate = endDate;
24
+ const data = await client.post('/backtests', body);
25
+ return {
26
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
27
+ };
28
+ }
29
+ catch (error) {
30
+ return {
31
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
32
+ isError: true,
33
+ };
34
+ }
35
+ });
36
+ // 2. Get backtest results
37
+ server.tool('dwlf_get_backtest_results', 'Get results for a backtest by requestId. If status is not "complete", poll again shortly.', {
38
+ requestId: z.string().describe('Backtest request ID'),
39
+ }, async ({ requestId }) => {
40
+ try {
41
+ const data = await client.get(`/backtests/${requestId}/results`);
42
+ return {
43
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
44
+ };
45
+ }
46
+ catch (error) {
47
+ return {
48
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
49
+ isError: true,
50
+ };
51
+ }
52
+ });
53
+ // 3. List backtests
54
+ server.tool('dwlf_list_backtests', 'List all backtests with their status and summary.', {}, async () => {
55
+ try {
56
+ const data = await client.get('/backtests');
57
+ return {
58
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
59
+ };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
64
+ isError: true,
65
+ };
66
+ }
67
+ });
68
+ // 4. Get backtest summary
69
+ server.tool('dwlf_get_backtest_summary', 'Get a summary of all backtests — aggregated performance stats.', {}, async () => {
70
+ try {
71
+ const data = await client.get('/backtests/summary');
72
+ return {
73
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
74
+ };
75
+ }
76
+ catch (error) {
77
+ return {
78
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
79
+ isError: true,
80
+ };
81
+ }
82
+ });
83
+ }
84
+ //# sourceMappingURL=backtests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtests.js","sourceRoot":"","sources":["../../src/tools/backtests.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 registerCustomEventTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=custom-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-events.d.ts","sourceRoot":"","sources":["../../src/tools/custom-events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAyFnB"}
@@ -0,0 +1,72 @@
1
+ import { z } from 'zod';
2
+ export function registerCustomEventTools(server, client) {
3
+ // 1. List custom events
4
+ server.tool('dwlf_list_custom_events', "List the user's custom event definitions — user-created indicator-based events.", {}, async () => {
5
+ try {
6
+ const data = await client.get('/custom-events');
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 custom event details
19
+ server.tool('dwlf_get_custom_event', 'Get details of a specific custom event including conditions and trigger history.', {
20
+ eventId: z.string().describe('Custom event ID'),
21
+ }, async ({ eventId }) => {
22
+ try {
23
+ const data = await client.get(`/custom-events/${eventId}`);
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. Compile custom event
36
+ server.tool('dwlf_compile_custom_event', 'Compile a custom event into an executable event definition. Must be called after creating or updating a custom event.', {
37
+ eventId: z.string().describe('Custom event ID to compile'),
38
+ }, async ({ eventId }) => {
39
+ try {
40
+ const data = await client.post(`/custom-events/${eventId}/compile`, {});
41
+ return {
42
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
52
+ // 4. Create custom event
53
+ server.tool('dwlf_create_custom_event', 'Create a new custom event definition. Custom events fire when indicator conditions are met. ⚠️ IMPORTANT: After creation, the event will NOT fire until you activate it for specific symbols using dwlf_activate_event_symbols. Always ask the user which symbols to activate for, then call that tool.', {
54
+ name: z.string().describe('Event name'),
55
+ bodyJson: z.string().describe('Full event definition body as JSON string (conditions, parameters). Parse before sending.'),
56
+ }, async ({ name, bodyJson }) => {
57
+ try {
58
+ const extra = JSON.parse(bodyJson);
59
+ const data = await client.post('/custom-events', { name, ...extra });
60
+ return {
61
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
62
+ };
63
+ }
64
+ catch (error) {
65
+ return {
66
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
67
+ isError: true,
68
+ };
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=custom-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-events.js","sourceRoot":"","sources":["../../src/tools/custom-events.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 registerIndicatorTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=indicators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicators.d.ts","sourceRoot":"","sources":["../../src/tools/indicators.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,QAmEnB"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ import { normalizeSymbol } from '../client.js';
3
+ export function registerIndicatorTools(server, client) {
4
+ // 1. Get computed chart indicators
5
+ server.tool('dwlf_get_indicators', 'Get computed technical indicators for a symbol (RSI, MACD, moving averages, Bollinger Bands, etc.). Returns current indicator values and states.', {
6
+ symbol: z
7
+ .string()
8
+ .describe('Trading symbol — accepts BTC, BTC/USD, BTC-USD, BTCUSD, or stock tickers like AAPL, TSLA'),
9
+ interval: z
10
+ .enum(['1d', '4h', '1h'])
11
+ .optional()
12
+ .describe('Chart interval (default: 1d)'),
13
+ }, async ({ symbol, interval }) => {
14
+ try {
15
+ const sym = normalizeSymbol(symbol);
16
+ const data = await client.get(`/chart-indicators/${sym}`, {
17
+ interval,
18
+ });
19
+ return {
20
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
21
+ };
22
+ }
23
+ catch (error) {
24
+ return {
25
+ content: [
26
+ {
27
+ type: 'text',
28
+ text: `Error fetching indicators for ${symbol}: ${error instanceof Error ? error.message : String(error)}`,
29
+ },
30
+ ],
31
+ isError: true,
32
+ };
33
+ }
34
+ });
35
+ // 2. Get detected trendlines
36
+ server.tool('dwlf_get_trendlines', 'Get automatically detected trendlines for a symbol. Returns trend direction, slope, and key touch points.', {
37
+ symbol: z
38
+ .string()
39
+ .describe('Trading symbol — accepts BTC, BTC/USD, BTC-USD, BTCUSD, or stock tickers like AAPL, TSLA'),
40
+ }, async ({ symbol }) => {
41
+ try {
42
+ const sym = normalizeSymbol(symbol);
43
+ const data = await client.get(`/trendlines/${sym}`);
44
+ return {
45
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `Error fetching trendlines for ${symbol}: ${error instanceof Error ? error.message : String(error)}`,
54
+ },
55
+ ],
56
+ isError: true,
57
+ };
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=indicators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indicators.js","sourceRoot":"","sources":["../../src/tools/indicators.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,mCAAmC;IACnC,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,kJAAkJ,EAClJ;QACE,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CAAC,0FAA0F,CAAC;QACvG,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;aACxB,QAAQ,EAAE;aACV,QAAQ,CAAC,8BAA8B,CAAC;KAC5C,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,GAAG,EAAE,EAAE;gBACxD,QAAQ;aACT,CAAC,CAAC;YACH,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,iCAAiC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3G;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6BAA6B;IAC7B,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,2GAA2G,EAC3G;QACE,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CAAC,0FAA0F,CAAC;KACxG,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,GAAG,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YACpD,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,iCAAiC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC3G;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { DWLFClient } from '../client.js';
3
+ export declare function registerMarketDataTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=market-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-data.d.ts","sourceRoot":"","sources":["../../src/tools/market-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAE3D,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAwInB"}
@@ -0,0 +1,120 @@
1
+ import { z } from 'zod';
2
+ import { normalizeSymbol } from '../client.js';
3
+ export function registerMarketDataTools(server, client) {
4
+ // 1. Get OHLCV candle data
5
+ server.tool('dwlf_get_market_data', 'Get OHLCV candle data for a trading symbol. Returns open, high, low, close, volume over time.', {
6
+ symbol: z
7
+ .string()
8
+ .describe('Trading symbol — accepts BTC, BTC/USD, BTC-USD, BTCUSD, or stock tickers like AAPL, TSLA'),
9
+ interval: z
10
+ .enum(['1d', '4h', '1h'])
11
+ .optional()
12
+ .describe('Candle interval (default: 1d)'),
13
+ limit: z
14
+ .number()
15
+ .optional()
16
+ .describe('Number of candles to return (default: 50)'),
17
+ }, async ({ symbol, interval, limit }) => {
18
+ try {
19
+ const sym = normalizeSymbol(symbol);
20
+ const data = await client.get(`/market-data/${sym}`, {
21
+ interval,
22
+ limit,
23
+ });
24
+ return {
25
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
26
+ };
27
+ }
28
+ catch (error) {
29
+ return {
30
+ content: [
31
+ {
32
+ type: 'text',
33
+ text: `Error fetching market data for ${symbol}: ${error instanceof Error ? error.message : String(error)}`,
34
+ },
35
+ ],
36
+ isError: true,
37
+ };
38
+ }
39
+ });
40
+ // 2. List all symbols
41
+ server.tool('dwlf_list_symbols', 'List all available trading symbols with metadata. Use this to discover what symbols are available on DWLF.', {}, async () => {
42
+ try {
43
+ const data = await client.get('/market-data/symbols');
44
+ return {
45
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
46
+ };
47
+ }
48
+ catch (error) {
49
+ return {
50
+ content: [
51
+ {
52
+ type: 'text',
53
+ text: `Error fetching symbols: ${error instanceof Error ? error.message : String(error)}`,
54
+ },
55
+ ],
56
+ isError: true,
57
+ };
58
+ }
59
+ });
60
+ // 3. Get support/resistance levels
61
+ server.tool('dwlf_get_support_resistance', 'Get support and resistance levels for a trading symbol. These are key price levels where buying/selling pressure is expected.', {
62
+ symbol: z
63
+ .string()
64
+ .describe('Trading symbol — accepts BTC, BTC/USD, BTC-USD, BTCUSD, or stock tickers like AAPL, TSLA'),
65
+ }, async ({ symbol }) => {
66
+ try {
67
+ const sym = normalizeSymbol(symbol);
68
+ const data = await client.get(`/support-resistance/${sym}`);
69
+ return {
70
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
71
+ };
72
+ }
73
+ catch (error) {
74
+ return {
75
+ content: [
76
+ {
77
+ type: 'text',
78
+ text: `Error fetching support/resistance for ${symbol}: ${error instanceof Error ? error.message : String(error)}`,
79
+ },
80
+ ],
81
+ isError: true,
82
+ };
83
+ }
84
+ });
85
+ // 4. Get indicator events
86
+ server.tool('dwlf_get_events', 'Get indicator events (crossovers, breakouts, divergences, etc.) for a symbol. Events represent significant technical analysis occurrences.', {
87
+ symbol: z
88
+ .string()
89
+ .optional()
90
+ .describe('Filter by trading symbol — accepts BTC, BTC/USD, BTC-USD, BTCUSD, or stock tickers'),
91
+ type: z
92
+ .string()
93
+ .optional()
94
+ .describe('Filter by event type (e.g., crossover, breakout, divergence)'),
95
+ limit: z
96
+ .number()
97
+ .optional()
98
+ .describe('Number of events to return (default: 20)'),
99
+ }, async ({ symbol, type, limit }) => {
100
+ try {
101
+ const sym = symbol ? normalizeSymbol(symbol) : undefined;
102
+ const data = await client.get('/events', { symbol: sym, type, limit });
103
+ return {
104
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
105
+ };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ content: [
110
+ {
111
+ type: 'text',
112
+ text: `Error fetching events: ${error instanceof Error ? error.message : String(error)}`,
113
+ },
114
+ ],
115
+ isError: true,
116
+ };
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=market-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-data.js","sourceRoot":"","sources":["../../src/tools/market-data.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 registerPortfolioTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=portfolio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.d.ts","sourceRoot":"","sources":["../../src/tools/portfolio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAuFnB"}
@@ -0,0 +1,70 @@
1
+ import { z } from 'zod';
2
+ export function registerPortfolioTools(server, client) {
3
+ // 1. List portfolios
4
+ server.tool('dwlf_list_portfolios', "List the user's portfolios.", {}, async () => {
5
+ try {
6
+ const data = await client.get('/portfolios');
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 portfolio details
19
+ server.tool('dwlf_get_portfolio', 'Get portfolio details including holdings.', {
20
+ portfolioId: z.string().describe('Portfolio ID'),
21
+ }, async ({ portfolioId }) => {
22
+ try {
23
+ const data = await client.get(`/portfolios/${portfolioId}`);
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. Get portfolio holdings with details
36
+ server.tool('dwlf_get_holdings', 'Get detailed holdings for a portfolio with current values and P&L.', {
37
+ portfolioId: z.string().describe('Portfolio ID'),
38
+ }, async ({ portfolioId }) => {
39
+ try {
40
+ const data = await client.get(`/portfolios/${portfolioId}/holdings/details`);
41
+ return {
42
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
52
+ // 4. Get portfolio snapshots
53
+ server.tool('dwlf_get_portfolio_snapshots', 'Get historical snapshots for a portfolio — shows value over time.', {
54
+ portfolioId: z.string().describe('Portfolio ID'),
55
+ }, async ({ portfolioId }) => {
56
+ try {
57
+ const data = await client.get(`/portfolios/${portfolioId}/snapshots`);
58
+ return {
59
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
60
+ };
61
+ }
62
+ catch (error) {
63
+ return {
64
+ content: [{ type: 'text', text: `Error: ${error instanceof Error ? error.message : String(error)}` }],
65
+ isError: true,
66
+ };
67
+ }
68
+ });
69
+ }
70
+ //# sourceMappingURL=portfolio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portfolio.js","sourceRoot":"","sources":["../../src/tools/portfolio.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 registerSignalTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../src/tools/signals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,QAgFxE"}
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ export function registerSignalTools(server, client) {
3
+ // 1. Get active trade signals
4
+ server.tool('dwlf_get_active_signals', 'Get currently active trade signals. These are open positions or pending entries that DWLF is tracking.', {}, async () => {
5
+ try {
6
+ const data = await client.get('/user/trade-signals/active');
7
+ return {
8
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
9
+ };
10
+ }
11
+ catch (error) {
12
+ return {
13
+ content: [
14
+ {
15
+ type: 'text',
16
+ text: `Error fetching active signals: ${error instanceof Error ? error.message : String(error)}`,
17
+ },
18
+ ],
19
+ isError: true,
20
+ };
21
+ }
22
+ });
23
+ // 2. Get recent trade signals
24
+ server.tool('dwlf_get_recent_signals', 'Get recent trade signals including completed ones. Shows signal history with entry/exit prices, P&L, and outcomes.', {
25
+ limit: z
26
+ .number()
27
+ .optional()
28
+ .describe('Number of recent signals to return (default: 20)'),
29
+ }, async ({ limit }) => {
30
+ try {
31
+ const data = await client.get('/user/trade-signals/recent', { limit });
32
+ return {
33
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
34
+ };
35
+ }
36
+ catch (error) {
37
+ return {
38
+ content: [
39
+ {
40
+ type: 'text',
41
+ text: `Error fetching recent signals: ${error instanceof Error ? error.message : String(error)}`,
42
+ },
43
+ ],
44
+ isError: true,
45
+ };
46
+ }
47
+ });
48
+ // 3. Get signal performance stats
49
+ server.tool('dwlf_get_signal_stats', 'Get signal performance statistics — win rate, average P&L, total signals, and performance breakdown.', {}, async () => {
50
+ try {
51
+ const data = await client.get('/user/trade-signals/stats');
52
+ return {
53
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],
54
+ };
55
+ }
56
+ catch (error) {
57
+ return {
58
+ content: [
59
+ {
60
+ type: 'text',
61
+ text: `Error fetching signal stats: ${error instanceof Error ? error.message : String(error)}`,
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../src/tools/signals.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAkB;IACvE,8BAA8B;IAC9B,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,wGAAwG,EACxG,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC5D,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,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACjG;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,8BAA8B;IAC9B,MAAM,CAAC,IAAI,CACT,yBAAyB,EACzB,oHAAoH,EACpH;QACE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kDAAkD,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvE,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,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACjG;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,kCAAkC;IAClC,MAAM,CAAC,IAAI,CACT,uBAAuB,EACvB,sGAAsG,EACtG,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YAC3D,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,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC/F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { DWLFClient } from '../client.js';
3
+ export declare function registerStrategyTools(server: McpServer, client: DWLFClient): void;
4
+ //# sourceMappingURL=strategies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../src/tools/strategies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAC;AAE3D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,UAAU,QAgJnB"}