@oobe-protocol-labs/sap-mcp-server 0.9.38 → 0.9.50
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/dist/config/env.d.ts +19 -0
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +9 -2
- package/dist/config/env.js.map +1 -1
- package/dist/payments/monetization-gate.d.ts +5 -0
- package/dist/payments/monetization-gate.d.ts.map +1 -1
- package/dist/payments/monetization-gate.js +39 -2
- package/dist/payments/monetization-gate.js.map +1 -1
- package/dist/payments/prepaid-credit-store.d.ts +111 -0
- package/dist/payments/prepaid-credit-store.d.ts.map +1 -0
- package/dist/payments/prepaid-credit-store.js +230 -0
- package/dist/payments/prepaid-credit-store.js.map +1 -0
- package/dist/payments/pricing.d.ts.map +1 -1
- package/dist/payments/pricing.js +1 -0
- package/dist/payments/pricing.js.map +1 -1
- package/dist/payments/schema-validation.d.ts +52 -0
- package/dist/payments/schema-validation.d.ts.map +1 -0
- package/dist/payments/schema-validation.js +112 -0
- package/dist/payments/schema-validation.js.map +1 -0
- package/dist/payments/x402-paid-call.d.ts +21 -0
- package/dist/payments/x402-paid-call.d.ts.map +1 -1
- package/dist/payments/x402-paid-call.js +108 -3
- package/dist/payments/x402-paid-call.js.map +1 -1
- package/dist/perps/adrena/adrena-builder-commodity.d.ts +63 -0
- package/dist/perps/adrena/adrena-builder-commodity.d.ts.map +1 -0
- package/dist/perps/adrena/adrena-builder-commodity.js +200 -0
- package/dist/perps/adrena/adrena-builder-commodity.js.map +1 -0
- package/dist/perps/adrena/adrena-builder-core.d.ts +319 -0
- package/dist/perps/adrena/adrena-builder-core.d.ts.map +1 -0
- package/dist/perps/adrena/adrena-builder-core.js +517 -0
- package/dist/perps/adrena/adrena-builder-core.js.map +1 -0
- package/dist/perps/adrena/adrena-builder-liquidity.d.ts +50 -0
- package/dist/perps/adrena/adrena-builder-liquidity.d.ts.map +1 -0
- package/dist/perps/adrena/adrena-builder-liquidity.js +196 -0
- package/dist/perps/adrena/adrena-builder-liquidity.js.map +1 -0
- package/dist/perps/adrena/adrena-builder-staking.d.ts +57 -0
- package/dist/perps/adrena/adrena-builder-staking.d.ts.map +1 -0
- package/dist/perps/adrena/adrena-builder-staking.js +368 -0
- package/dist/perps/adrena/adrena-builder-staking.js.map +1 -0
- package/dist/perps/adrena/adrena-builder-trading.d.ts +160 -0
- package/dist/perps/adrena/adrena-builder-trading.d.ts.map +1 -0
- package/dist/perps/adrena/adrena-builder-trading.js +835 -0
- package/dist/perps/adrena/adrena-builder-trading.js.map +1 -0
- package/dist/perps/adrena/adrena-builder.d.ts +14 -293
- package/dist/perps/adrena/adrena-builder.d.ts.map +1 -1
- package/dist/perps/adrena/adrena-builder.js +14 -1140
- package/dist/perps/adrena/adrena-builder.js.map +1 -1
- package/dist/perps/adrena/adrena-constants.d.ts +33 -5
- package/dist/perps/adrena/adrena-constants.d.ts.map +1 -1
- package/dist/perps/adrena/adrena-constants.js +29 -7
- package/dist/perps/adrena/adrena-constants.js.map +1 -1
- package/dist/perps/adrena/adrena-idl.d.ts +15084 -0
- package/dist/perps/adrena/adrena-idl.d.ts.map +1 -0
- package/dist/perps/adrena/adrena-idl.js +29903 -0
- package/dist/perps/adrena/adrena-idl.js.map +1 -0
- package/dist/perps/adrena/adrena-pda.d.ts +5 -4
- package/dist/perps/adrena/adrena-pda.d.ts.map +1 -1
- package/dist/perps/adrena/adrena-pda.js +6 -10
- package/dist/perps/adrena/adrena-pda.js.map +1 -1
- package/dist/perps/adrena/index.d.ts +1 -0
- package/dist/perps/adrena/index.d.ts.map +1 -1
- package/dist/perps/adrena/index.js +1 -0
- package/dist/perps/adrena/index.js.map +1 -1
- package/dist/perps/chart-indicators.d.ts +27 -0
- package/dist/perps/chart-indicators.d.ts.map +1 -0
- package/dist/perps/chart-indicators.js +345 -0
- package/dist/perps/chart-indicators.js.map +1 -0
- package/dist/perps/chart-tools.d.ts +45 -0
- package/dist/perps/chart-tools.d.ts.map +1 -0
- package/dist/perps/chart-tools.js +341 -0
- package/dist/perps/chart-tools.js.map +1 -0
- package/dist/perps/perp-analytics-tools.d.ts +20 -0
- package/dist/perps/perp-analytics-tools.d.ts.map +1 -0
- package/dist/perps/perp-analytics-tools.js +868 -0
- package/dist/perps/perp-analytics-tools.js.map +1 -0
- package/dist/perps/perp-constants.d.ts +362 -0
- package/dist/perps/perp-constants.d.ts.map +1 -0
- package/dist/perps/perp-constants.js +210 -0
- package/dist/perps/perp-constants.js.map +1 -0
- package/dist/perps/perp-decoders.d.ts +47 -0
- package/dist/perps/perp-decoders.d.ts.map +1 -0
- package/dist/perps/perp-decoders.js +332 -0
- package/dist/perps/perp-decoders.js.map +1 -0
- package/dist/policy/policy-engine.d.ts +42 -0
- package/dist/policy/policy-engine.d.ts.map +1 -1
- package/dist/policy/policy-engine.js +43 -0
- package/dist/policy/policy-engine.js.map +1 -1
- package/dist/premium/activation-manager.d.ts.map +1 -1
- package/dist/premium/activation-manager.js +20 -2
- package/dist/premium/activation-manager.js.map +1 -1
- package/dist/prompts/context/sap-agent-context.prompt.js +15 -1
- package/dist/prompts/context/sap-agent-context.prompt.js.map +1 -1
- package/dist/server/server-metadata.d.ts +13 -0
- package/dist/server/server-metadata.d.ts.map +1 -1
- package/dist/server/server-metadata.js +15 -2
- package/dist/server/server-metadata.js.map +1 -1
- package/dist/solana/ata-utils.d.ts +39 -0
- package/dist/solana/ata-utils.d.ts.map +1 -0
- package/dist/solana/ata-utils.js +49 -0
- package/dist/solana/ata-utils.js.map +1 -0
- package/dist/strategies/trade-journal.d.ts +78 -0
- package/dist/strategies/trade-journal.d.ts.map +1 -0
- package/dist/strategies/trade-journal.js +92 -0
- package/dist/strategies/trade-journal.js.map +1 -0
- package/dist/tools/adrena/adrena-commodity-tools.d.ts +15 -0
- package/dist/tools/adrena/adrena-commodity-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-commodity-tools.js +137 -0
- package/dist/tools/adrena/adrena-commodity-tools.js.map +1 -0
- package/dist/tools/adrena/adrena-data-tools.d.ts +23 -0
- package/dist/tools/adrena/adrena-data-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-data-tools.js +437 -0
- package/dist/tools/adrena/adrena-data-tools.js.map +1 -0
- package/dist/tools/adrena/adrena-helpers.d.ts +46 -0
- package/dist/tools/adrena/adrena-helpers.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-helpers.js +41 -0
- package/dist/tools/adrena/adrena-helpers.js.map +1 -0
- package/dist/tools/adrena/adrena-index.d.ts +20 -0
- package/dist/tools/adrena/adrena-index.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-index.js +75 -0
- package/dist/tools/adrena/adrena-index.js.map +1 -0
- package/dist/tools/adrena/adrena-limit-order-tools.d.ts +22 -0
- package/dist/tools/adrena/adrena-limit-order-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-limit-order-tools.js +91 -0
- package/dist/tools/adrena/adrena-limit-order-tools.js.map +1 -0
- package/dist/tools/adrena/adrena-liquidity-tools.d.ts +15 -0
- package/dist/tools/adrena/adrena-liquidity-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-liquidity-tools.js +108 -0
- package/dist/tools/adrena/adrena-liquidity-tools.js.map +1 -0
- package/dist/tools/adrena/adrena-snapshot-tools.d.ts +42 -0
- package/dist/tools/adrena/adrena-snapshot-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-snapshot-tools.js +124 -0
- package/dist/tools/adrena/adrena-snapshot-tools.js.map +1 -0
- package/dist/tools/adrena/adrena-staking-tools.d.ts +15 -0
- package/dist/tools/adrena/adrena-staking-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-staking-tools.js +139 -0
- package/dist/tools/adrena/adrena-staking-tools.js.map +1 -0
- package/dist/tools/adrena/adrena-trading-tools.d.ts +78 -0
- package/dist/tools/adrena/adrena-trading-tools.d.ts.map +1 -0
- package/dist/tools/adrena/adrena-trading-tools.js +556 -0
- package/dist/tools/adrena/adrena-trading-tools.js.map +1 -0
- package/dist/tools/adrena-tools.d.ts +1 -66
- package/dist/tools/adrena-tools.d.ts.map +1 -1
- package/dist/tools/adrena-tools.js +1 -1061
- package/dist/tools/adrena-tools.js.map +1 -1
- package/dist/tools/client-sdk-tools.js +1 -1
- package/dist/tools/client-sdk-tools.js.map +1 -1
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +170 -0
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/perp-tools.d.ts +6 -174
- package/dist/tools/perp-tools.d.ts.map +1 -1
- package/dist/tools/perp-tools.js +6 -1716
- package/dist/tools/perp-tools.js.map +1 -1
- package/dist/tools/premium-tools.d.ts.map +1 -1
- package/dist/tools/premium-tools.js +123 -5
- package/dist/tools/premium-tools.js.map +1 -1
- package/dist/tools/transaction-tools.d.ts +21 -1
- package/dist/tools/transaction-tools.d.ts.map +1 -1
- package/dist/tools/transaction-tools.js +114 -30
- package/dist/tools/transaction-tools.js.map +1 -1
- package/dist/tools/x402-paid-call-tool.d.ts.map +1 -1
- package/dist/tools/x402-paid-call-tool.js +288 -0
- package/dist/tools/x402-paid-call-tool.js.map +1 -1
- package/package.json +3 -2
- package/server.json +3 -3
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name tools/adrena/adrena-data-tools
|
|
3
|
+
* @description Data API and on-chain market reader tool registrations for Adrena.
|
|
4
|
+
*
|
|
5
|
+
* @module tools/adrena/adrena-data-tools
|
|
6
|
+
*/
|
|
7
|
+
import { PublicKey } from '@solana/web3.js';
|
|
8
|
+
import { createTextResponse } from '../../adapters/mcp/tool-response.js';
|
|
9
|
+
import { registerTool } from '../../adapters/mcp/sdk-compat.js';
|
|
10
|
+
import { adrenaDataApi, } from '../../perps/adrena/index.js';
|
|
11
|
+
import { ADRENA_CUSTODIES, ADRENA_MAIN_POOL_ADDRESS, ADRENA_COMMODITIES_POOL_ADDRESS } from '../../perps/adrena/adrena-constants.js';
|
|
12
|
+
import { getConnection, } from './adrena-helpers.js';
|
|
13
|
+
/* ═══════════════════════════════════════════════════════════════════
|
|
14
|
+
* Data API Tools
|
|
15
|
+
* ═══════════════════════════════════════════════════════════════════ */
|
|
16
|
+
/**
|
|
17
|
+
* @name registerAdrenaDataApiTools
|
|
18
|
+
* @description Register Adrena Data API (REST) tools for market data and analytics.
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export function registerAdrenaDataApiTools(server, context) {
|
|
22
|
+
// Get positions
|
|
23
|
+
registerTool(server, 'sap_adrena_get_positions', {
|
|
24
|
+
description: 'Fetch position history for a wallet from the Adrena Data API. Returns closed and open positions with P&L, entry/exit prices, and status.',
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: {
|
|
28
|
+
wallet: { type: 'string', description: 'Wallet public key (base58).' },
|
|
29
|
+
},
|
|
30
|
+
required: ['wallet'],
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
},
|
|
33
|
+
}, async (args) => {
|
|
34
|
+
const wallet = String(args['wallet'] ?? '').trim();
|
|
35
|
+
if (!wallet) {
|
|
36
|
+
return createTextResponse(JSON.stringify({ error: 'wallet is required' }), { isError: true });
|
|
37
|
+
}
|
|
38
|
+
const positions = await adrenaDataApi.getPositions(wallet);
|
|
39
|
+
if (positions === null) {
|
|
40
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch positions from Adrena Data API', wallet }), { isError: true });
|
|
41
|
+
}
|
|
42
|
+
return createTextResponse(JSON.stringify({ wallet, positions, count: positions.length }, null, 2));
|
|
43
|
+
});
|
|
44
|
+
// Get pool info — reads directly from on-chain Pool account (Data API endpoint is broken)
|
|
45
|
+
registerTool(server, 'sap_adrena_get_pool_info', {
|
|
46
|
+
description: 'Read Adrena pool statistics directly from the on-chain Pool account. Returns TVL (AUM), LP token price, pool name, custody list, trade/swap flags, and fees debt. This bypasses the broken datapi.adrena.trade REST endpoint and reads real data from Solana mainnet. Use this before opening positions to check pool health and available custodies.',
|
|
47
|
+
inputSchema: {
|
|
48
|
+
type: 'object',
|
|
49
|
+
properties: {
|
|
50
|
+
poolName: { type: 'string', description: 'Pool name. Supported: main-pool (default), commodities-pool.', enum: ['main-pool', 'commodities-pool'] },
|
|
51
|
+
},
|
|
52
|
+
additionalProperties: false,
|
|
53
|
+
},
|
|
54
|
+
}, async (args) => {
|
|
55
|
+
try {
|
|
56
|
+
const poolName = args['poolName'] === 'commodities-pool' ? 'commodities-pool' : 'main-pool';
|
|
57
|
+
const connection = getConnection(context);
|
|
58
|
+
const poolAddress = poolName === 'commodities-pool'
|
|
59
|
+
? ADRENA_COMMODITIES_POOL_ADDRESS
|
|
60
|
+
: ADRENA_MAIN_POOL_ADDRESS;
|
|
61
|
+
const accountInfo = await connection.getAccountInfo(new PublicKey(poolAddress), 'confirmed');
|
|
62
|
+
if (!accountInfo || !accountInfo.data || accountInfo.data.length < 48) {
|
|
63
|
+
return createTextResponse(JSON.stringify({ error: `Pool account ${poolAddress} not found or too small` }), { isError: true });
|
|
64
|
+
}
|
|
65
|
+
const d = accountInfo.data;
|
|
66
|
+
// Pool layout (release/39): 8 disc + 1 bump + 1 lpBump + 1 nbStable + 1 init + 1 allowTrade + 1 allowSwap + 1 liqState + 1 custodyCount + 32 name + 256 custodies(8×32) + ...
|
|
67
|
+
const allowTrade = d[12] === 1;
|
|
68
|
+
const allowSwap = d[13] === 1;
|
|
69
|
+
const custodyCount = d[15];
|
|
70
|
+
// Name is a LimitedString at offset 16 (31 bytes + 1 length byte at offset 47)
|
|
71
|
+
const nameLen = d[47];
|
|
72
|
+
const name = d.subarray(16, 16 + Math.min(nameLen, 31)).toString('utf8').replace(/\0/g, '');
|
|
73
|
+
// Custodies array at offset 48 (8 × 32 bytes = 256 bytes)
|
|
74
|
+
const custodies = [];
|
|
75
|
+
for (let i = 0; i < Math.min(custodyCount, 8); i++) {
|
|
76
|
+
const off = 48 + i * 32;
|
|
77
|
+
if (off + 32 > d.length)
|
|
78
|
+
break;
|
|
79
|
+
custodies.push(new PublicKey(d.subarray(off, off + 32)).toBase58());
|
|
80
|
+
}
|
|
81
|
+
// LP token price at offset 328 (u64, USD 6 decimals)
|
|
82
|
+
const lpTokenPriceUsd = Number(d.readBigUInt64LE(328)) / 1e6;
|
|
83
|
+
// AUM at offset 448 (u64, USD 6 decimals)
|
|
84
|
+
const aumUsd = Number(d.readBigUInt64LE(448)) / 1e6;
|
|
85
|
+
// Fees debt at offset 304 (u64)
|
|
86
|
+
const feesDebtUsd = Number(d.readBigUInt64LE(304)) / 1e6;
|
|
87
|
+
// Referrers fee debt at offset 312
|
|
88
|
+
const referrersFeeDebtUsd = Number(d.readBigUInt64LE(312)) / 1e6;
|
|
89
|
+
return createTextResponse(JSON.stringify({
|
|
90
|
+
poolName: name || poolName,
|
|
91
|
+
poolAddress,
|
|
92
|
+
allowTrade,
|
|
93
|
+
allowSwap,
|
|
94
|
+
custodyCount,
|
|
95
|
+
custodies,
|
|
96
|
+
lpTokenPriceUsd,
|
|
97
|
+
aumUsd,
|
|
98
|
+
tvlUsd: aumUsd,
|
|
99
|
+
feesDebtUsd,
|
|
100
|
+
referrersFeeDebtUsd,
|
|
101
|
+
dataLength: d.length,
|
|
102
|
+
source: 'on-chain-rpc',
|
|
103
|
+
}, null, 2));
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to read pool info from on-chain account', message: err instanceof Error ? err.message : 'Unknown error' }), { isError: true });
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
// Get custody info
|
|
110
|
+
registerTool(server, 'sap_adrena_get_custody_info', {
|
|
111
|
+
description: 'Fetch per-asset custody statistics from the Adrena Data API. Returns open interest, utilization, volume, and fees for each custody.',
|
|
112
|
+
inputSchema: {
|
|
113
|
+
type: 'object',
|
|
114
|
+
properties: {
|
|
115
|
+
symbol: { type: 'string', description: 'Optional symbol filter (e.g. JITOSOL, WBTC).' },
|
|
116
|
+
},
|
|
117
|
+
additionalProperties: false,
|
|
118
|
+
},
|
|
119
|
+
}, async (args) => {
|
|
120
|
+
const symbol = typeof args['symbol'] === 'string' ? args['symbol'] : undefined;
|
|
121
|
+
const custodies = await adrenaDataApi.getCustodyInfo(symbol);
|
|
122
|
+
if (custodies === null) {
|
|
123
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch custody info from Adrena Data API' }), { isError: true });
|
|
124
|
+
}
|
|
125
|
+
return createTextResponse(JSON.stringify({ custodies, count: custodies.length }, null, 2));
|
|
126
|
+
});
|
|
127
|
+
// Get trader info
|
|
128
|
+
registerTool(server, 'sap_adrena_get_trader_info', {
|
|
129
|
+
description: 'Fetch trader performance metrics from the Adrena Data API. Returns total volume, P&L, fees, win rate, and rank.',
|
|
130
|
+
inputSchema: {
|
|
131
|
+
type: 'object',
|
|
132
|
+
properties: {
|
|
133
|
+
wallet: { type: 'string', description: 'Trader wallet public key (base58).' },
|
|
134
|
+
},
|
|
135
|
+
required: ['wallet'],
|
|
136
|
+
additionalProperties: false,
|
|
137
|
+
},
|
|
138
|
+
}, async (args) => {
|
|
139
|
+
const wallet = String(args['wallet'] ?? '').trim();
|
|
140
|
+
if (!wallet) {
|
|
141
|
+
return createTextResponse(JSON.stringify({ error: 'wallet is required' }), { isError: true });
|
|
142
|
+
}
|
|
143
|
+
const trader = await adrenaDataApi.getTraderInfo(wallet);
|
|
144
|
+
if (trader === null) {
|
|
145
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch trader info from Adrena Data API', wallet }), { isError: true });
|
|
146
|
+
}
|
|
147
|
+
return createTextResponse(JSON.stringify(trader, null, 2));
|
|
148
|
+
});
|
|
149
|
+
// Get trader leaderboard
|
|
150
|
+
registerTool(server, 'sap_adrena_get_trader_leaderboard', {
|
|
151
|
+
description: 'Fetch trader leaderboard from the Adrena Data API. Returns top traders by volume and P&L.',
|
|
152
|
+
inputSchema: {
|
|
153
|
+
type: 'object',
|
|
154
|
+
properties: {
|
|
155
|
+
limit: { type: 'number', description: 'Optional limit. Default 50.', minimum: 1, maximum: 500 },
|
|
156
|
+
},
|
|
157
|
+
additionalProperties: false,
|
|
158
|
+
},
|
|
159
|
+
}, async (args) => {
|
|
160
|
+
const limit = typeof args['limit'] === 'number' ? args['limit'] : undefined;
|
|
161
|
+
const traders = await adrenaDataApi.getTraderProfiles(limit);
|
|
162
|
+
if (traders === null) {
|
|
163
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch trader leaderboard from Adrena Data API' }), { isError: true });
|
|
164
|
+
}
|
|
165
|
+
return createTextResponse(JSON.stringify({ traders, count: traders.length }, null, 2));
|
|
166
|
+
});
|
|
167
|
+
// Get mutagen points
|
|
168
|
+
registerTool(server, 'sap_adrena_get_mutagen', {
|
|
169
|
+
description: 'Fetch Mutagen points for a wallet from the Adrena Data API. Returns total points, rank, and breakdown.',
|
|
170
|
+
inputSchema: {
|
|
171
|
+
type: 'object',
|
|
172
|
+
properties: {
|
|
173
|
+
wallet: { type: 'string', description: 'Wallet public key (base58).' },
|
|
174
|
+
},
|
|
175
|
+
required: ['wallet'],
|
|
176
|
+
additionalProperties: false,
|
|
177
|
+
},
|
|
178
|
+
}, async (args) => {
|
|
179
|
+
const wallet = String(args['wallet'] ?? '').trim();
|
|
180
|
+
if (!wallet) {
|
|
181
|
+
return createTextResponse(JSON.stringify({ error: 'wallet is required' }), { isError: true });
|
|
182
|
+
}
|
|
183
|
+
const mutagen = await adrenaDataApi.getMutagen(wallet);
|
|
184
|
+
if (mutagen === null) {
|
|
185
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch mutagen points from Adrena Data API', wallet }), { isError: true });
|
|
186
|
+
}
|
|
187
|
+
return createTextResponse(JSON.stringify(mutagen, null, 2));
|
|
188
|
+
});
|
|
189
|
+
// Get mutagen leaderboard
|
|
190
|
+
registerTool(server, 'sap_adrena_get_mutagen_leaderboard', {
|
|
191
|
+
description: 'Fetch Mutagen points leaderboard from the Adrena Data API. Returns top wallets by points.',
|
|
192
|
+
inputSchema: {
|
|
193
|
+
type: 'object',
|
|
194
|
+
properties: {
|
|
195
|
+
limit: { type: 'number', description: 'Optional limit. Default 50.', minimum: 1, maximum: 500 },
|
|
196
|
+
},
|
|
197
|
+
additionalProperties: false,
|
|
198
|
+
},
|
|
199
|
+
}, async (args) => {
|
|
200
|
+
const limit = typeof args['limit'] === 'number' ? args['limit'] : undefined;
|
|
201
|
+
const leaderboard = await adrenaDataApi.getMutagenLeaderboard(limit);
|
|
202
|
+
if (leaderboard === null) {
|
|
203
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch mutagen leaderboard from Adrena Data API' }), { isError: true });
|
|
204
|
+
}
|
|
205
|
+
return createTextResponse(JSON.stringify({ leaderboard, count: leaderboard.length }, null, 2));
|
|
206
|
+
});
|
|
207
|
+
// Get prices (ADX/ALP)
|
|
208
|
+
registerTool(server, 'sap_adrena_get_prices', {
|
|
209
|
+
description: 'Fetch current ADX and ALP token prices from the Adrena Data API.',
|
|
210
|
+
inputSchema: {
|
|
211
|
+
type: 'object',
|
|
212
|
+
properties: {},
|
|
213
|
+
additionalProperties: false,
|
|
214
|
+
},
|
|
215
|
+
}, async () => {
|
|
216
|
+
const prices = await adrenaDataApi.getPrice();
|
|
217
|
+
if (prices === null) {
|
|
218
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch prices from Adrena Data API' }), { isError: true });
|
|
219
|
+
}
|
|
220
|
+
return createTextResponse(JSON.stringify(prices, null, 2));
|
|
221
|
+
});
|
|
222
|
+
// Get last trading prices
|
|
223
|
+
registerTool(server, 'sap_adrena_get_trading_prices', {
|
|
224
|
+
description: 'Fetch latest oracle trading prices for all Adrena assets. Returns price and custody address for each traded asset.',
|
|
225
|
+
inputSchema: {
|
|
226
|
+
type: 'object',
|
|
227
|
+
properties: {},
|
|
228
|
+
additionalProperties: false,
|
|
229
|
+
},
|
|
230
|
+
}, async () => {
|
|
231
|
+
const prices = await adrenaDataApi.getLastTradingPrices();
|
|
232
|
+
if (prices === null) {
|
|
233
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch trading prices from Adrena Data API' }), { isError: true });
|
|
234
|
+
}
|
|
235
|
+
return createTextResponse(JSON.stringify({ prices, count: prices.length }, null, 2));
|
|
236
|
+
});
|
|
237
|
+
// Get position status (live P&L)
|
|
238
|
+
registerTool(server, 'sap_adrena_get_position_status', {
|
|
239
|
+
description: 'Fetch live position status (P&L, size, liquidation price, entry price, oracle price) from the Adrena Data API for a specific wallet and token.',
|
|
240
|
+
inputSchema: {
|
|
241
|
+
type: 'object',
|
|
242
|
+
properties: {
|
|
243
|
+
wallet: { type: 'string', description: 'Wallet public key (base58).' },
|
|
244
|
+
principalToken: { type: 'string', description: 'Principal token symbol (e.g. JITOSOL, WBTC, BONK, XAU).' },
|
|
245
|
+
side: { type: 'string', description: 'Position side.', enum: ['long', 'short'] },
|
|
246
|
+
},
|
|
247
|
+
required: ['wallet', 'principalToken', 'side'],
|
|
248
|
+
additionalProperties: false,
|
|
249
|
+
},
|
|
250
|
+
}, async (args) => {
|
|
251
|
+
const wallet = String(args['wallet'] ?? '').trim();
|
|
252
|
+
const principalToken = String(args['principalToken'] ?? '').trim().toUpperCase();
|
|
253
|
+
const side = args['side'] === 'short' ? 'short' : 'long';
|
|
254
|
+
if (!wallet || !principalToken) {
|
|
255
|
+
return createTextResponse(JSON.stringify({ error: 'wallet and principalToken are required' }), { isError: true });
|
|
256
|
+
}
|
|
257
|
+
const positions = await adrenaDataApi.getPositions(wallet);
|
|
258
|
+
if (positions === null) {
|
|
259
|
+
return createTextResponse(JSON.stringify({ error: 'Failed to fetch positions from Adrena Data API' }), { isError: true });
|
|
260
|
+
}
|
|
261
|
+
const matching = positions.filter(p => p.principalToken?.toUpperCase() === principalToken &&
|
|
262
|
+
p.side?.toLowerCase() === side);
|
|
263
|
+
if (matching.length === 0) {
|
|
264
|
+
return createTextResponse(JSON.stringify({ wallet, principalToken, side, status: 'no_open_position', message: `No ${side} position found for ${principalToken}` }));
|
|
265
|
+
}
|
|
266
|
+
return createTextResponse(JSON.stringify({ wallet, principalToken, side, positions: matching, count: matching.length }, null, 2));
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
/* ═══════════════════════════════════════════════════════════════════
|
|
270
|
+
* On-chain Markets Reader
|
|
271
|
+
* ═══════════════════════════════════════════════════════════════════ */
|
|
272
|
+
/**
|
|
273
|
+
* @name registerAdrenaGetMarketsTool
|
|
274
|
+
* @description Register sap_adrena_get_markets — reads all custody accounts on-chain
|
|
275
|
+
* and returns real market data: mint, decimals, max leverage, trade/swap flags,
|
|
276
|
+
* oracle feed IDs, open interest, and collateral stats.
|
|
277
|
+
* @internal
|
|
278
|
+
*/
|
|
279
|
+
export function registerAdrenaGetMarketsTool(server, context) {
|
|
280
|
+
registerTool(server, 'sap_adrena_get_markets', {
|
|
281
|
+
description: 'Read all Adrena custody accounts directly from Solana mainnet and return real market data for every supported asset: mint address, decimals, max initial leverage, max leverage, allowTrade/allowSwap flags, oracle feed IDs, open interest (long/short USD), locked amounts, borrow rates, and funding rates. This is the authoritative source for what markets Adrena supports and their current on-chain parameters. Use this before opening positions to verify leverage limits and trade availability.',
|
|
282
|
+
inputSchema: {
|
|
283
|
+
type: 'object',
|
|
284
|
+
properties: {
|
|
285
|
+
poolName: {
|
|
286
|
+
type: 'string',
|
|
287
|
+
description: 'Optional pool filter. Supported: main-pool, commodities-pool. Omit for all pools.',
|
|
288
|
+
enum: ['main-pool', 'commodities-pool'],
|
|
289
|
+
},
|
|
290
|
+
},
|
|
291
|
+
additionalProperties: false,
|
|
292
|
+
},
|
|
293
|
+
}, async (args) => {
|
|
294
|
+
try {
|
|
295
|
+
const poolFilter = args['poolName'] === 'commodities-pool'
|
|
296
|
+
? 'commodities-pool'
|
|
297
|
+
: args['poolName'] === 'main-pool'
|
|
298
|
+
? 'main-pool'
|
|
299
|
+
: null;
|
|
300
|
+
const connection = getConnection(context);
|
|
301
|
+
const allCustodies = Object.entries(ADRENA_CUSTODIES).map(([symbol, info]) => ({
|
|
302
|
+
symbol,
|
|
303
|
+
address: info.address,
|
|
304
|
+
pool: info.pool === ADRENA_MAIN_POOL_ADDRESS ? 'main-pool' : 'commodities-pool',
|
|
305
|
+
kind: info.kind,
|
|
306
|
+
}));
|
|
307
|
+
const markets = [];
|
|
308
|
+
for (const cust of allCustodies) {
|
|
309
|
+
if (poolFilter && cust.pool !== poolFilter)
|
|
310
|
+
continue;
|
|
311
|
+
try {
|
|
312
|
+
const accountInfo = await connection.getAccountInfo(new PublicKey(cust.address), 'confirmed');
|
|
313
|
+
if (!accountInfo || !accountInfo.data || accountInfo.data.length < 916) {
|
|
314
|
+
markets.push({
|
|
315
|
+
symbol: cust.symbol,
|
|
316
|
+
custodyAddress: cust.address,
|
|
317
|
+
pool: cust.pool,
|
|
318
|
+
kind: cust.kind,
|
|
319
|
+
error: 'Custody account not found or too small',
|
|
320
|
+
});
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
const d = accountInfo.data;
|
|
324
|
+
const mintRaw = new PublicKey(d.subarray(48, 80)).toBase58();
|
|
325
|
+
const tokenAccount = new PublicKey(d.subarray(80, 112)).toBase58();
|
|
326
|
+
// Leverage values are in BPS: divide by 10000 for human-readable
|
|
327
|
+
const maxInitialLeverageBps = d.readUInt32LE(176);
|
|
328
|
+
const maxLeverageBps = d.readUInt32LE(180);
|
|
329
|
+
const maxPositionLockedUsd = Number(d.readBigUInt64LE(184)) / 1e6; // USD 6 decimals
|
|
330
|
+
// Open interest
|
|
331
|
+
const longOiUsd = Number(d.readBigUInt64LE(408)) / 1e6;
|
|
332
|
+
const shortOiUsd = Number(d.readBigUInt64LE(608)) / 1e6;
|
|
333
|
+
// Collateral
|
|
334
|
+
const longCollateralUsd = Number(d.readBigUInt64LE(472)) / 1e6;
|
|
335
|
+
const shortCollateralUsd = Number(d.readBigUInt64LE(672)) / 1e6;
|
|
336
|
+
// Locked amounts
|
|
337
|
+
const longLockedRaw = d.readBigUInt64LE(424).toString();
|
|
338
|
+
const shortLockedRaw = d.readBigUInt64LE(624).toString();
|
|
339
|
+
// Position counts
|
|
340
|
+
const longCount = Number(d.readBigUInt64LE(400));
|
|
341
|
+
const shortCount = Number(d.readBigUInt64LE(600));
|
|
342
|
+
// Borrow rate
|
|
343
|
+
const borrowRateRaw = d.readBigUInt64LE(800).toString();
|
|
344
|
+
const borrowRateLastUpdate = Number(d.readBigUInt64LE(808));
|
|
345
|
+
// Funding
|
|
346
|
+
const fundingLongToShortRaw = d.readBigUInt64LE(864).toString();
|
|
347
|
+
const fundingLastUpdate = Number(d.readBigUInt64LE(872));
|
|
348
|
+
const fundingMaxHourlyRateRaw = d.readBigUInt64LE(840).toString();
|
|
349
|
+
const minTotalOiUsd = Number(d.readBigUInt64LE(848)) / 1e6;
|
|
350
|
+
const imbalanceSensitivityBps = d.readUInt32LE(856);
|
|
351
|
+
// Flags
|
|
352
|
+
const allowTrade = d[10] === 1;
|
|
353
|
+
const allowSwap = d[11] === 1;
|
|
354
|
+
const oracleFeedId = d[914];
|
|
355
|
+
const tradeOracleFeedId = d[915];
|
|
356
|
+
// Assets
|
|
357
|
+
const assetsCollateralRaw = d.readBigUInt64LE(376).toString();
|
|
358
|
+
const assetsOwnedRaw = d.readBigUInt64LE(384).toString();
|
|
359
|
+
const assetsLockedRaw = d.readBigUInt64LE(392).toString();
|
|
360
|
+
const isSystemMint = mintRaw === '11111111111111111111111111111111';
|
|
361
|
+
markets.push({
|
|
362
|
+
symbol: cust.symbol,
|
|
363
|
+
custodyAddress: cust.address,
|
|
364
|
+
pool: cust.pool,
|
|
365
|
+
kind: cust.kind,
|
|
366
|
+
mint: isSystemMint ? null : mintRaw,
|
|
367
|
+
mintIsSynthetic: isSystemMint,
|
|
368
|
+
decimals: d[12],
|
|
369
|
+
tokenAccount,
|
|
370
|
+
allowTrade,
|
|
371
|
+
allowSwap,
|
|
372
|
+
maxInitialLeverage: maxInitialLeverageBps / 10000,
|
|
373
|
+
maxLeverage: maxLeverageBps / 10000,
|
|
374
|
+
maxInitialLeverageBps,
|
|
375
|
+
maxLeverageBps,
|
|
376
|
+
maxPositionLockedUsd,
|
|
377
|
+
openInterest: {
|
|
378
|
+
longUsd: longOiUsd,
|
|
379
|
+
shortUsd: shortOiUsd,
|
|
380
|
+
longPositions: longCount,
|
|
381
|
+
shortPositions: shortCount,
|
|
382
|
+
},
|
|
383
|
+
collateral: {
|
|
384
|
+
longUsd: longCollateralUsd,
|
|
385
|
+
shortUsd: shortCollateralUsd,
|
|
386
|
+
},
|
|
387
|
+
lockedAmounts: {
|
|
388
|
+
longRaw: longLockedRaw,
|
|
389
|
+
shortRaw: shortLockedRaw,
|
|
390
|
+
},
|
|
391
|
+
assets: {
|
|
392
|
+
collateralRaw: assetsCollateralRaw,
|
|
393
|
+
ownedRaw: assetsOwnedRaw,
|
|
394
|
+
lockedRaw: assetsLockedRaw,
|
|
395
|
+
},
|
|
396
|
+
borrowRate: {
|
|
397
|
+
raw: borrowRateRaw,
|
|
398
|
+
lastUpdate: borrowRateLastUpdate,
|
|
399
|
+
},
|
|
400
|
+
funding: {
|
|
401
|
+
currentLongToShortRaw: fundingLongToShortRaw,
|
|
402
|
+
maxHourlyRateRaw: fundingMaxHourlyRateRaw,
|
|
403
|
+
lastUpdate: fundingLastUpdate,
|
|
404
|
+
minTotalOiUsd,
|
|
405
|
+
imbalanceSensitivityBps,
|
|
406
|
+
},
|
|
407
|
+
oracle: {
|
|
408
|
+
feedId: oracleFeedId,
|
|
409
|
+
tradeFeedId: tradeOracleFeedId,
|
|
410
|
+
},
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
catch (err) {
|
|
414
|
+
markets.push({
|
|
415
|
+
symbol: cust.symbol,
|
|
416
|
+
custodyAddress: cust.address,
|
|
417
|
+
pool: cust.pool,
|
|
418
|
+
kind: cust.kind,
|
|
419
|
+
error: err instanceof Error ? err.message : 'Failed to read custody account',
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return createTextResponse(JSON.stringify({
|
|
424
|
+
poolFilter: poolFilter ?? 'all',
|
|
425
|
+
marketCount: markets.length,
|
|
426
|
+
markets,
|
|
427
|
+
}, null, 2));
|
|
428
|
+
}
|
|
429
|
+
catch (err) {
|
|
430
|
+
return createTextResponse(JSON.stringify({
|
|
431
|
+
error: 'Failed to read Adrena markets from on-chain custody accounts',
|
|
432
|
+
message: err instanceof Error ? err.message : 'Unknown error',
|
|
433
|
+
}), { isError: true });
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
//# sourceMappingURL=adrena-data-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adrena-data-tools.js","sourceRoot":"","sources":["../../../src/tools/adrena/adrena-data-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name tools/adrena/adrena-helpers
|
|
3
|
+
* @description Shared helpers, constants, and JSON schema types for Adrena tool modules.
|
|
4
|
+
*
|
|
5
|
+
* @module tools/adrena/adrena-helpers
|
|
6
|
+
*/
|
|
7
|
+
import { PublicKey, Connection } from '@solana/web3.js';
|
|
8
|
+
import type { SapMcpContext } from '../../core/types.js';
|
|
9
|
+
export interface JsonSchemaProperty {
|
|
10
|
+
readonly type: string;
|
|
11
|
+
readonly description: string;
|
|
12
|
+
readonly enum?: readonly string[];
|
|
13
|
+
readonly minimum?: number;
|
|
14
|
+
readonly maximum?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface JsonSchema {
|
|
17
|
+
readonly type: 'object';
|
|
18
|
+
readonly properties: Record<string, JsonSchemaProperty>;
|
|
19
|
+
readonly required?: readonly string[];
|
|
20
|
+
readonly additionalProperties?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/** Supported principal tokens for the main pool. */
|
|
23
|
+
export declare const MAIN_POOL_TOKENS: readonly ["JITOSOL", "WBTC", "BONK"];
|
|
24
|
+
/** Supported commodity tokens. */
|
|
25
|
+
export declare const COMMODITY_TOKENS: readonly ["XAU", "XAG", "WTI"];
|
|
26
|
+
/** Supported collateral tokens. */
|
|
27
|
+
export declare const COLLATERAL_TOKENS: readonly ["USDC", "JITOSOL", "WBTC", "BONK"];
|
|
28
|
+
/**
|
|
29
|
+
* Convert a human-readable price to Adrena raw price (10^10 scaling).
|
|
30
|
+
* @param priceUsd — Price in USD.
|
|
31
|
+
* @returns Raw price as bigint.
|
|
32
|
+
*/
|
|
33
|
+
export declare function priceToRaw(priceUsd: number): bigint;
|
|
34
|
+
/**
|
|
35
|
+
* Get the connection from context.
|
|
36
|
+
* @param context — SAP MCP context.
|
|
37
|
+
* @returns Solana connection.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getConnection(context: SapMcpContext): Connection;
|
|
40
|
+
/**
|
|
41
|
+
* Parse and validate a public key.
|
|
42
|
+
* @param value — Base58 public key string.
|
|
43
|
+
* @returns PublicKey or throws.
|
|
44
|
+
*/
|
|
45
|
+
export declare function parsePublicKey(value: string): PublicKey;
|
|
46
|
+
//# sourceMappingURL=adrena-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adrena-helpers.d.ts","sourceRoot":"","sources":["../../../src/tools/adrena/adrena-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CACzC;AAMD,oDAAoD;AACpD,eAAO,MAAM,gBAAgB,sCAAuC,CAAC;AAErE,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,gCAAiC,CAAC;AAE/D,mCAAmC;AACnC,eAAO,MAAM,iBAAiB,8CAA+C,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,UAAU,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAEvD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name tools/adrena/adrena-helpers
|
|
3
|
+
* @description Shared helpers, constants, and JSON schema types for Adrena tool modules.
|
|
4
|
+
*
|
|
5
|
+
* @module tools/adrena/adrena-helpers
|
|
6
|
+
*/
|
|
7
|
+
import { PublicKey } from '@solana/web3.js';
|
|
8
|
+
/* ═══════════════════════════════════════════════════════════════════
|
|
9
|
+
* Helpers
|
|
10
|
+
* ═══════════════════════════════════════════════════════════════════ */
|
|
11
|
+
/** Supported principal tokens for the main pool. */
|
|
12
|
+
export const MAIN_POOL_TOKENS = ['JITOSOL', 'WBTC', 'BONK'];
|
|
13
|
+
/** Supported commodity tokens. */
|
|
14
|
+
export const COMMODITY_TOKENS = ['XAU', 'XAG', 'WTI'];
|
|
15
|
+
/** Supported collateral tokens. */
|
|
16
|
+
export const COLLATERAL_TOKENS = ['USDC', 'JITOSOL', 'WBTC', 'BONK'];
|
|
17
|
+
/**
|
|
18
|
+
* Convert a human-readable price to Adrena raw price (10^10 scaling).
|
|
19
|
+
* @param priceUsd — Price in USD.
|
|
20
|
+
* @returns Raw price as bigint.
|
|
21
|
+
*/
|
|
22
|
+
export function priceToRaw(priceUsd) {
|
|
23
|
+
return BigInt(Math.floor(priceUsd * Math.pow(10, 10)));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the connection from context.
|
|
27
|
+
* @param context — SAP MCP context.
|
|
28
|
+
* @returns Solana connection.
|
|
29
|
+
*/
|
|
30
|
+
export function getConnection(context) {
|
|
31
|
+
return context.connection;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parse and validate a public key.
|
|
35
|
+
* @param value — Base58 public key string.
|
|
36
|
+
* @returns PublicKey or throws.
|
|
37
|
+
*/
|
|
38
|
+
export function parsePublicKey(value) {
|
|
39
|
+
return new PublicKey(value);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=adrena-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adrena-helpers.js","sourceRoot":"","sources":["../../../src/tools/adrena/adrena-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAc,MAAM,iBAAiB,CAAC;AAsBxD;;yEAEyE;AAEzE,oDAAoD;AACpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAErE,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAE/D,mCAAmC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAE9E;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAsB;IAClD,OAAO,OAAO,CAAC,UAAU,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @name tools/adrena/adrena-index
|
|
3
|
+
* @description Main entry point for Adrena tool registration. Re-exports
|
|
4
|
+
* registerAdrenaTools which calls all sub-registrations.
|
|
5
|
+
*
|
|
6
|
+
* @module tools/adrena/adrena-index
|
|
7
|
+
*/
|
|
8
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
9
|
+
import type { SapMcpContext } from '../../core/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* @name registerAdrenaTools
|
|
12
|
+
* @description Register all Adrena perps protocol tools: trading builders, commodity builders, liquidity/swap, staking, and Data API.
|
|
13
|
+
*
|
|
14
|
+
* @param server — MCP server instance.
|
|
15
|
+
* @param context — Shared runtime context with Solana connection.
|
|
16
|
+
*
|
|
17
|
+
* @usedBy `register-tools.ts`
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerAdrenaTools(server: Server, context: SapMcpContext): void;
|
|
20
|
+
//# sourceMappingURL=adrena-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adrena-index.d.ts","sourceRoot":"","sources":["../../../src/tools/adrena/adrena-index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA2BzD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CA+ChF"}
|