web3-tools-mcp 1.0.0 → 1.1.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.
- package/README.md +92 -259
- package/dist/client.d.ts +1653 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +142 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -28274
- package/dist/index.js.map +1 -0
- package/dist/package.json +60 -0
- package/dist/src/client.d.ts +1653 -0
- package/dist/src/client.d.ts.map +1 -0
- package/dist/src/client.js +142 -0
- package/dist/src/client.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +88 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/tools/advanced.d.ts +75 -0
- package/dist/src/tools/advanced.d.ts.map +1 -0
- package/dist/src/tools/advanced.js +234 -0
- package/dist/src/tools/advanced.js.map +1 -0
- package/dist/src/tools/balance.d.ts +55 -0
- package/dist/src/tools/balance.d.ts.map +1 -0
- package/dist/src/tools/balance.js +146 -0
- package/dist/src/tools/balance.js.map +1 -0
- package/dist/src/tools/contract-info.d.ts +79 -0
- package/dist/src/tools/contract-info.d.ts.map +1 -0
- package/dist/src/tools/contract-info.js +450 -0
- package/dist/src/tools/contract-info.js.map +1 -0
- package/dist/src/tools/contract.d.ts +79 -0
- package/dist/src/tools/contract.d.ts.map +1 -0
- package/dist/src/tools/contract.js +140 -0
- package/dist/src/tools/contract.js.map +1 -0
- package/dist/src/tools/index.d.ts +3 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +27 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/logs.d.ts +39 -0
- package/dist/src/tools/logs.d.ts.map +1 -0
- package/dist/src/tools/logs.js +231 -0
- package/dist/src/tools/logs.js.map +1 -0
- package/dist/src/tools/signatures.d.ts +83 -0
- package/dist/src/tools/signatures.d.ts.map +1 -0
- package/dist/src/tools/signatures.js +93 -0
- package/dist/src/tools/signatures.js.map +1 -0
- package/dist/src/types.d.ts +22 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils.d.ts +22 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +183 -0
- package/dist/src/utils.js.map +1 -0
- package/dist/test/mcp-client.test.d.ts +2 -0
- package/dist/test/mcp-client.test.d.ts.map +1 -0
- package/dist/test/mcp-client.test.js +376 -0
- package/dist/test/mcp-client.test.js.map +1 -0
- package/dist/test/tools/advanced.test.d.ts +2 -0
- package/dist/test/tools/advanced.test.d.ts.map +1 -0
- package/dist/test/tools/advanced.test.js +235 -0
- package/dist/test/tools/advanced.test.js.map +1 -0
- package/dist/test/tools/balance.test.d.ts +2 -0
- package/dist/test/tools/balance.test.d.ts.map +1 -0
- package/dist/test/tools/balance.test.js +167 -0
- package/dist/test/tools/balance.test.js.map +1 -0
- package/dist/test/tools/contract-info.test.d.ts +2 -0
- package/dist/test/tools/contract-info.test.d.ts.map +1 -0
- package/dist/test/tools/contract-info.test.js +286 -0
- package/dist/test/tools/contract-info.test.js.map +1 -0
- package/dist/test/tools/contract.test.d.ts +2 -0
- package/dist/test/tools/contract.test.d.ts.map +1 -0
- package/dist/test/tools/contract.test.js +234 -0
- package/dist/test/tools/contract.test.js.map +1 -0
- package/dist/test/tools/logs.test.d.ts +2 -0
- package/dist/test/tools/logs.test.d.ts.map +1 -0
- package/dist/test/tools/logs.test.js +196 -0
- package/dist/test/tools/logs.test.js.map +1 -0
- package/dist/test/tools/signatures.test.d.ts +2 -0
- package/dist/test/tools/signatures.test.d.ts.map +1 -0
- package/dist/test/tools/signatures.test.js +112 -0
- package/dist/test/tools/signatures.test.js.map +1 -0
- package/dist/tools/advanced.d.ts +75 -0
- package/dist/tools/advanced.d.ts.map +1 -0
- package/dist/tools/advanced.js +234 -0
- package/dist/tools/advanced.js.map +1 -0
- package/dist/tools/balance.d.ts +55 -0
- package/dist/tools/balance.d.ts.map +1 -0
- package/dist/tools/balance.js +146 -0
- package/dist/tools/balance.js.map +1 -0
- package/dist/tools/batch.d.ts +122 -0
- package/dist/tools/batch.d.ts.map +1 -0
- package/dist/tools/batch.js +243 -0
- package/dist/tools/batch.js.map +1 -0
- package/dist/tools/contract-info.d.ts +79 -0
- package/dist/tools/contract-info.d.ts.map +1 -0
- package/dist/tools/contract-info.js +450 -0
- package/dist/tools/contract-info.js.map +1 -0
- package/dist/tools/contract.d.ts +79 -0
- package/dist/tools/contract.d.ts.map +1 -0
- package/dist/tools/contract.js +140 -0
- package/dist/tools/contract.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/logs.d.ts +39 -0
- package/dist/tools/logs.d.ts.map +1 -0
- package/dist/tools/logs.js +231 -0
- package/dist/tools/logs.js.map +1 -0
- package/dist/tools/signatures.d.ts +83 -0
- package/dist/tools/signatures.d.ts.map +1 -0
- package/dist/tools/signatures.js +93 -0
- package/dist/tools/signatures.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +22 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +183 -0
- package/dist/utils.js.map +1 -0
- package/package.json +35 -23
- package/src/client.ts +160 -0
- package/src/index.ts +96 -0
- package/src/tools/advanced.ts +262 -0
- package/src/tools/balance.ts +176 -0
- package/src/tools/contract-info.ts +582 -0
- package/src/tools/contract.ts +180 -0
- package/src/tools/index.ts +35 -0
- package/src/tools/logs.ts +291 -0
- package/src/tools/signatures.ts +126 -0
- package/src/types.ts +29 -0
- package/src/utils.ts +222 -0
- package/dist/hypersync-client.darwin-arm64-7fegfwn5.node +0 -0
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
import { config } from 'dotenv';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
// Load environment variables from .env file
|
|
8
|
+
config();
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
const projectRoot = join(__dirname, '..');
|
|
12
|
+
class MCPTestClient {
|
|
13
|
+
client;
|
|
14
|
+
transport;
|
|
15
|
+
results = [];
|
|
16
|
+
async connect() {
|
|
17
|
+
// Spawn the MCP server process
|
|
18
|
+
const serverPath = join(projectRoot, 'dist', 'index.js');
|
|
19
|
+
const serverProcess = spawn('node', [
|
|
20
|
+
serverPath,
|
|
21
|
+
'--etherscan-api-key',
|
|
22
|
+
process.env.ETHERSCAN_API_KEY || '',
|
|
23
|
+
'--alchemy-api-key',
|
|
24
|
+
process.env.ALCHEMY_API_KEY || '',
|
|
25
|
+
'--infura-api-key',
|
|
26
|
+
process.env.INFURA_API_KEY || '',
|
|
27
|
+
'--hypersync-api-key',
|
|
28
|
+
process.env.HYPERSYNC_API_KEY || ''
|
|
29
|
+
]);
|
|
30
|
+
this.transport = new StdioClientTransport({
|
|
31
|
+
command: 'node',
|
|
32
|
+
args: [
|
|
33
|
+
serverPath,
|
|
34
|
+
'--etherscan-api-key',
|
|
35
|
+
process.env.ETHERSCAN_API_KEY || '',
|
|
36
|
+
'--alchemy-api-key',
|
|
37
|
+
process.env.ALCHEMY_API_KEY || '',
|
|
38
|
+
'--infura-api-key',
|
|
39
|
+
process.env.INFURA_API_KEY || '',
|
|
40
|
+
'--hypersync-api-key',
|
|
41
|
+
process.env.HYPERSYNC_API_KEY || ''
|
|
42
|
+
]
|
|
43
|
+
});
|
|
44
|
+
this.client = new Client({
|
|
45
|
+
name: 'web3-tools-test-client',
|
|
46
|
+
version: '1.0.0'
|
|
47
|
+
}, {
|
|
48
|
+
capabilities: {}
|
|
49
|
+
});
|
|
50
|
+
await this.client.connect(this.transport);
|
|
51
|
+
console.log('✅ Connected to MCP server');
|
|
52
|
+
}
|
|
53
|
+
async disconnect() {
|
|
54
|
+
await this.client.close();
|
|
55
|
+
console.log('✅ Disconnected from MCP server');
|
|
56
|
+
}
|
|
57
|
+
async runTest(name, testFn) {
|
|
58
|
+
const startTime = Date.now();
|
|
59
|
+
try {
|
|
60
|
+
await testFn();
|
|
61
|
+
const duration = Date.now() - startTime;
|
|
62
|
+
this.results.push({ name, passed: true, duration });
|
|
63
|
+
console.log(`✅ ${name} (${duration}ms)`);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const duration = Date.now() - startTime;
|
|
67
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
68
|
+
this.results.push({ name, passed: false, error: errorMessage, duration });
|
|
69
|
+
console.log(`❌ ${name} (${duration}ms)`);
|
|
70
|
+
console.log(` Error: ${errorMessage}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async runTests() {
|
|
74
|
+
console.log('\n🧪 Starting MCP Server Test Suite\n');
|
|
75
|
+
// Test 1: List available tools
|
|
76
|
+
await this.runTest('List available tools', async () => {
|
|
77
|
+
const tools = await this.client.listTools();
|
|
78
|
+
if (!tools.tools || tools.tools.length === 0) {
|
|
79
|
+
throw new Error('No tools found');
|
|
80
|
+
}
|
|
81
|
+
console.log(` Found ${tools.tools.length} tools`);
|
|
82
|
+
});
|
|
83
|
+
// Test 2: Get function signature
|
|
84
|
+
await this.runTest('Get function signature', async () => {
|
|
85
|
+
const result = await this.client.callTool({
|
|
86
|
+
name: 'get_function_signature',
|
|
87
|
+
arguments: {
|
|
88
|
+
items: [
|
|
89
|
+
{ functionAbi: 'function balanceOf(address owner) view returns (uint256)' },
|
|
90
|
+
{ functionAbi: 'function transfer(address to, uint256 amount) returns (bool)' }
|
|
91
|
+
]
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
const data = JSON.parse(result.content[0].text);
|
|
95
|
+
if (data.length !== 2) {
|
|
96
|
+
throw new Error('Expected 2 function signatures');
|
|
97
|
+
}
|
|
98
|
+
if (!data[0].signature.startsWith('0x')) {
|
|
99
|
+
throw new Error('Invalid function signature format');
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// Test 3: Get event signature
|
|
103
|
+
await this.runTest('Get event signature', async () => {
|
|
104
|
+
const result = await this.client.callTool({
|
|
105
|
+
name: 'get_event_signature',
|
|
106
|
+
arguments: {
|
|
107
|
+
items: [
|
|
108
|
+
{
|
|
109
|
+
eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)'
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
const data = JSON.parse(result.content[0].text);
|
|
115
|
+
if (!data[0].topic0) {
|
|
116
|
+
throw new Error('Missing topic0 in event signature');
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// Test 4: Get error signature
|
|
120
|
+
await this.runTest('Get error signature', async () => {
|
|
121
|
+
const result = await this.client.callTool({
|
|
122
|
+
name: 'get_error_signature',
|
|
123
|
+
arguments: {
|
|
124
|
+
items: [
|
|
125
|
+
{ errorAbi: 'error InsufficientBalance(uint256 available, uint256 required)' }
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
const data = JSON.parse(result.content[0].text);
|
|
130
|
+
if (!data[0].signature) {
|
|
131
|
+
throw new Error('Missing error signature');
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
// Test 5: Check if address is contract
|
|
135
|
+
await this.runTest('Check if address is contract', async () => {
|
|
136
|
+
const result = await this.client.callTool({
|
|
137
|
+
name: 'is_contract',
|
|
138
|
+
arguments: {
|
|
139
|
+
chain: 'mainnet',
|
|
140
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' // USDC
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
const data = JSON.parse(result.content[0].text);
|
|
144
|
+
if (!data.isContract) {
|
|
145
|
+
throw new Error('USDC should be detected as a contract');
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Test 6: Get native balance
|
|
149
|
+
await this.runTest('Get native balance', async () => {
|
|
150
|
+
const result = await this.client.callTool({
|
|
151
|
+
name: 'get_balance',
|
|
152
|
+
arguments: {
|
|
153
|
+
queries: [
|
|
154
|
+
{
|
|
155
|
+
chain: 'mainnet',
|
|
156
|
+
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045' // Vitalik
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
const data = JSON.parse(result.content[0].text);
|
|
162
|
+
if (!data.success || data.results.length !== 1) {
|
|
163
|
+
throw new Error('Failed to get native balance');
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Test 7: Get ERC20 token balance
|
|
167
|
+
await this.runTest('Get ERC20 token balance', async () => {
|
|
168
|
+
const result = await this.client.callTool({
|
|
169
|
+
name: 'get_balance',
|
|
170
|
+
arguments: {
|
|
171
|
+
queries: [
|
|
172
|
+
{
|
|
173
|
+
chain: 'mainnet',
|
|
174
|
+
address: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', // Vitalik
|
|
175
|
+
tokenAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' // USDC
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
const data = JSON.parse(result.content[0].text);
|
|
181
|
+
if (!data.success || data.results.length !== 1) {
|
|
182
|
+
throw new Error('Failed to get ERC20 balance');
|
|
183
|
+
}
|
|
184
|
+
if (!data.results[0].decimals) {
|
|
185
|
+
throw new Error('Missing decimals in balance result');
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
// Test 8: Call contract function (batch)
|
|
189
|
+
await this.runTest('Call contract functions (batch)', async () => {
|
|
190
|
+
const result = await this.client.callTool({
|
|
191
|
+
name: 'call_contract_function',
|
|
192
|
+
arguments: {
|
|
193
|
+
calls: [
|
|
194
|
+
{
|
|
195
|
+
chain: 'mainnet',
|
|
196
|
+
contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
197
|
+
functionAbi: 'function name() view returns (string)',
|
|
198
|
+
label: 'USDC name'
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
chain: 'mainnet',
|
|
202
|
+
contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
203
|
+
functionAbi: 'function symbol() view returns (string)',
|
|
204
|
+
label: 'USDC symbol'
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
chain: 'mainnet',
|
|
208
|
+
contractAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
209
|
+
functionAbi: 'function decimals() view returns (uint8)',
|
|
210
|
+
label: 'USDC decimals'
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
const data = JSON.parse(result.content[0].text);
|
|
216
|
+
if (data.totalCalls !== 3 || data.successfulCalls !== 3) {
|
|
217
|
+
throw new Error('Expected 3 successful contract calls');
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
// Test 9: Get contract ABI (with Etherscan API)
|
|
221
|
+
if (process.env.ETHERSCAN_API_KEY) {
|
|
222
|
+
await this.runTest('Get contract ABI', async () => {
|
|
223
|
+
const result = await this.client.callTool({
|
|
224
|
+
name: 'get_contract_abi',
|
|
225
|
+
arguments: {
|
|
226
|
+
chain: 'mainnet',
|
|
227
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
228
|
+
include: ['abi', 'metadata']
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
const data = JSON.parse(result.content[0].text);
|
|
232
|
+
if (!data.success || !data.abi) {
|
|
233
|
+
throw new Error('Failed to get contract ABI');
|
|
234
|
+
}
|
|
235
|
+
if (!data.isProxy) {
|
|
236
|
+
throw new Error('USDC should be detected as proxy');
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
// Test 10: Get contract source code (testing cache)
|
|
240
|
+
await this.runTest('Get contract source code (should use cache)', async () => {
|
|
241
|
+
const result = await this.client.callTool({
|
|
242
|
+
name: 'get_contract_source_code',
|
|
243
|
+
arguments: {
|
|
244
|
+
chain: 'mainnet',
|
|
245
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
246
|
+
includeSource: 'summary'
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
const data = JSON.parse(result.content[0].text);
|
|
250
|
+
if (!data.success || !data.files) {
|
|
251
|
+
throw new Error('Failed to get contract source code');
|
|
252
|
+
}
|
|
253
|
+
if (!data.implementation) {
|
|
254
|
+
throw new Error('Should include implementation for proxy');
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
// Test 11: Get contract source code with full source
|
|
258
|
+
await this.runTest('Get contract source code (full)', async () => {
|
|
259
|
+
const result = await this.client.callTool({
|
|
260
|
+
name: 'get_contract_source_code',
|
|
261
|
+
arguments: {
|
|
262
|
+
chain: 'mainnet',
|
|
263
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
264
|
+
includeSource: 'full',
|
|
265
|
+
includeImplementation: false
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
const data = JSON.parse(result.content[0].text);
|
|
269
|
+
if (!data.success || !data.sourceFiles) {
|
|
270
|
+
throw new Error('Failed to get full contract source code');
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// Test 12: Get specific contract source file
|
|
274
|
+
await this.runTest('Get specific contract source file', async () => {
|
|
275
|
+
const result = await this.client.callTool({
|
|
276
|
+
name: 'get_contract_source_file',
|
|
277
|
+
arguments: {
|
|
278
|
+
chain: 'mainnet',
|
|
279
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
280
|
+
filePath: 'FiatTokenProxy.sol'
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
const data = JSON.parse(result.content[0].text);
|
|
284
|
+
if (!data.success || !data.content) {
|
|
285
|
+
throw new Error('Failed to get contract source file');
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
console.log('⚠️ Skipping Etherscan API tests (no API key)');
|
|
291
|
+
}
|
|
292
|
+
// Test 13: Get storage at
|
|
293
|
+
await this.runTest('Get storage at', async () => {
|
|
294
|
+
const result = await this.client.callTool({
|
|
295
|
+
name: 'get_storage_at',
|
|
296
|
+
arguments: {
|
|
297
|
+
chain: 'mainnet',
|
|
298
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
299
|
+
slot: '0x0',
|
|
300
|
+
abiType: 'address'
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
const data = JSON.parse(result.content[0].text);
|
|
304
|
+
if (!data.rawValue) {
|
|
305
|
+
throw new Error('Failed to get storage');
|
|
306
|
+
}
|
|
307
|
+
});
|
|
308
|
+
// Test 14: Get block info
|
|
309
|
+
await this.runTest('Get block info', async () => {
|
|
310
|
+
const result = await this.client.callTool({
|
|
311
|
+
name: 'get_block_info',
|
|
312
|
+
arguments: {
|
|
313
|
+
chain: 'mainnet'
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
const data = JSON.parse(result.content[0].text);
|
|
317
|
+
if (!data.blockNumber || !data.timestamp) {
|
|
318
|
+
throw new Error('Failed to get block info');
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// Test 15: Get logs
|
|
322
|
+
await this.runTest('Get logs (Transfer events)', async () => {
|
|
323
|
+
const result = await this.client.callTool({
|
|
324
|
+
name: 'get_logs',
|
|
325
|
+
arguments: {
|
|
326
|
+
chain: 'mainnet',
|
|
327
|
+
address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
328
|
+
eventAbi: 'event Transfer(address indexed from, address indexed to, uint256 value)',
|
|
329
|
+
fromBlock: '21000000',
|
|
330
|
+
toBlock: '21000100'
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
const data = JSON.parse(result.content[0].text);
|
|
334
|
+
if (!data.logs) {
|
|
335
|
+
throw new Error('Failed to get logs');
|
|
336
|
+
}
|
|
337
|
+
console.log(` Found ${data.count} Transfer events`);
|
|
338
|
+
});
|
|
339
|
+
// Print summary
|
|
340
|
+
console.log('\n📊 Test Summary\n');
|
|
341
|
+
const passed = this.results.filter((r) => r.passed).length;
|
|
342
|
+
const failed = this.results.filter((r) => !r.passed).length;
|
|
343
|
+
const total = this.results.length;
|
|
344
|
+
console.log(`Total tests: ${total}`);
|
|
345
|
+
console.log(`✅ Passed: ${passed}`);
|
|
346
|
+
console.log(`❌ Failed: ${failed}`);
|
|
347
|
+
console.log(`📈 Success rate: ${((passed / total) * 100).toFixed(1)}%`);
|
|
348
|
+
if (failed > 0) {
|
|
349
|
+
console.log('\n❌ Failed tests:');
|
|
350
|
+
this.results
|
|
351
|
+
.filter((r) => !r.passed)
|
|
352
|
+
.forEach((r) => {
|
|
353
|
+
console.log(` - ${r.name}: ${r.error}`);
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
// Calculate total time
|
|
357
|
+
const totalTime = this.results.reduce((sum, r) => sum + r.duration, 0);
|
|
358
|
+
console.log(`\n⏱️ Total time: ${totalTime}ms`);
|
|
359
|
+
return failed === 0;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
async function main() {
|
|
363
|
+
const testClient = new MCPTestClient();
|
|
364
|
+
try {
|
|
365
|
+
await testClient.connect();
|
|
366
|
+
const success = await testClient.runTests();
|
|
367
|
+
await testClient.disconnect();
|
|
368
|
+
process.exit(success ? 0 : 1);
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
console.error('❌ Test suite failed:', error);
|
|
372
|
+
process.exit(1);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
main();
|
|
376
|
+
//# sourceMappingURL=mcp-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-client.test.js","sourceRoot":"","sources":["../../test/mcp-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced.test.d.ts","sourceRoot":"","sources":["../../../test/tools/advanced.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { describe, it, expect, beforeAll } from 'vitest';
|
|
2
|
+
import { config } from 'dotenv';
|
|
3
|
+
import { initializeClientManager } from '../../src/client.js';
|
|
4
|
+
import advancedTools from '../../src/tools/advanced.js';
|
|
5
|
+
// Load environment variables
|
|
6
|
+
config();
|
|
7
|
+
describe('Advanced Tools', () => {
|
|
8
|
+
beforeAll(() => {
|
|
9
|
+
// Initialize client manager with config
|
|
10
|
+
initializeClientManager({
|
|
11
|
+
alchemyApiKey: process.env.ALCHEMY_API_KEY,
|
|
12
|
+
infuraApiKey: process.env.INFURA_API_KEY,
|
|
13
|
+
etherscanApiKey: process.env.ETHERSCAN_API_KEY,
|
|
14
|
+
hypersyncApiKey: process.env.HYPERSYNC_API_KEY
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('get_storage_at', () => {
|
|
18
|
+
it('should read storage slot from USDC contract', async () => {
|
|
19
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
20
|
+
const result = await advancedTools.get_storage_at.handler({
|
|
21
|
+
chain: 'mainnet',
|
|
22
|
+
address: USDC_CONTRACT,
|
|
23
|
+
slot: '0x0',
|
|
24
|
+
abiType: 'bytes32'
|
|
25
|
+
});
|
|
26
|
+
const data = JSON.parse(result.content[0].text);
|
|
27
|
+
expect(data.address).toBe(USDC_CONTRACT);
|
|
28
|
+
expect(data.slot).toBe('0x0');
|
|
29
|
+
expect(data.rawValue).toBeDefined();
|
|
30
|
+
expect(data.decodedValue).toBeDefined();
|
|
31
|
+
}, 30000);
|
|
32
|
+
it('should decode uint256 storage value', async () => {
|
|
33
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
34
|
+
const result = await advancedTools.get_storage_at.handler({
|
|
35
|
+
chain: 'mainnet',
|
|
36
|
+
address: USDC_CONTRACT,
|
|
37
|
+
slot: '0x2', // totalSupply slot in USDC
|
|
38
|
+
abiType: 'uint256'
|
|
39
|
+
});
|
|
40
|
+
const data = JSON.parse(result.content[0].text);
|
|
41
|
+
expect(data.decodedValue).toBeDefined();
|
|
42
|
+
expect(typeof data.formattedValue).toBe('string');
|
|
43
|
+
}, 30000);
|
|
44
|
+
it('should decode address storage value', async () => {
|
|
45
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
46
|
+
const result = await advancedTools.get_storage_at.handler({
|
|
47
|
+
chain: 'mainnet',
|
|
48
|
+
address: USDC_CONTRACT,
|
|
49
|
+
slot: '0xa', // owner/admin slot (approximate)
|
|
50
|
+
abiType: 'address'
|
|
51
|
+
});
|
|
52
|
+
const data = JSON.parse(result.content[0].text);
|
|
53
|
+
expect(data.decodedValue).toBeDefined();
|
|
54
|
+
// Should be an address format
|
|
55
|
+
if (data.decodedValue !== '0x0000000000000000000000000000000000000000') {
|
|
56
|
+
expect(data.decodedValue).toMatch(/^0x[a-fA-F0-9]{40}$/);
|
|
57
|
+
}
|
|
58
|
+
}, 30000);
|
|
59
|
+
it('should decode bool storage value', async () => {
|
|
60
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
61
|
+
const result = await advancedTools.get_storage_at.handler({
|
|
62
|
+
chain: 'mainnet',
|
|
63
|
+
address: USDC_CONTRACT,
|
|
64
|
+
slot: '0xc', // paused slot (approximate)
|
|
65
|
+
abiType: 'bool'
|
|
66
|
+
});
|
|
67
|
+
const data = JSON.parse(result.content[0].text);
|
|
68
|
+
expect(data.decodedValue).toBeDefined();
|
|
69
|
+
expect(typeof data.decodedValue).toBe('boolean');
|
|
70
|
+
}, 30000);
|
|
71
|
+
it('should read storage at specific block number', async () => {
|
|
72
|
+
const USDC_CONTRACT = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48';
|
|
73
|
+
const result = await advancedTools.get_storage_at.handler({
|
|
74
|
+
chain: 'mainnet',
|
|
75
|
+
address: USDC_CONTRACT,
|
|
76
|
+
slot: '0x0',
|
|
77
|
+
abiType: 'bytes32',
|
|
78
|
+
blockNumber: '18000000'
|
|
79
|
+
});
|
|
80
|
+
const data = JSON.parse(result.content[0].text);
|
|
81
|
+
expect(data.blockNumber).toBe('18000000');
|
|
82
|
+
}, 30000);
|
|
83
|
+
});
|
|
84
|
+
describe('get_block_info', () => {
|
|
85
|
+
it('should fetch latest block information', async () => {
|
|
86
|
+
const result = await advancedTools.get_block_info.handler({
|
|
87
|
+
chain: 'mainnet'
|
|
88
|
+
});
|
|
89
|
+
const data = JSON.parse(result.content[0].text);
|
|
90
|
+
expect(data.chain).toBe('mainnet');
|
|
91
|
+
expect(data.blockNumber).toBeDefined();
|
|
92
|
+
expect(data.hash).toBeDefined();
|
|
93
|
+
expect(data.timestamp).toBeDefined();
|
|
94
|
+
expect(data.dateIso).toBeDefined();
|
|
95
|
+
}, 30000);
|
|
96
|
+
it('should fetch specific block by number', async () => {
|
|
97
|
+
const BLOCK_NUMBER = '18000000';
|
|
98
|
+
const result = await advancedTools.get_block_info.handler({
|
|
99
|
+
chain: 'mainnet',
|
|
100
|
+
blockNumber: BLOCK_NUMBER
|
|
101
|
+
});
|
|
102
|
+
const data = JSON.parse(result.content[0].text);
|
|
103
|
+
expect(data.blockNumber).toBe(BLOCK_NUMBER);
|
|
104
|
+
expect(data.hash).toBeDefined();
|
|
105
|
+
expect(data.timestamp).toBeDefined();
|
|
106
|
+
expect(data.dateIso).toBeDefined();
|
|
107
|
+
}, 30000);
|
|
108
|
+
it('should include human-readable date', async () => {
|
|
109
|
+
const result = await advancedTools.get_block_info.handler({
|
|
110
|
+
chain: 'mainnet',
|
|
111
|
+
blockNumber: '18000000'
|
|
112
|
+
});
|
|
113
|
+
const data = JSON.parse(result.content[0].text);
|
|
114
|
+
expect(data.dateIso).toBeDefined();
|
|
115
|
+
expect(typeof data.dateIso).toBe('string');
|
|
116
|
+
// Should be ISO format
|
|
117
|
+
expect(data.dateIso).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
|
|
118
|
+
}, 30000);
|
|
119
|
+
it('should work with different chains', async () => {
|
|
120
|
+
const result = await advancedTools.get_block_info.handler({
|
|
121
|
+
chain: 'base'
|
|
122
|
+
});
|
|
123
|
+
const data = JSON.parse(result.content[0].text);
|
|
124
|
+
expect(data.chain).toBe('base');
|
|
125
|
+
expect(data.blockNumber).toBeDefined();
|
|
126
|
+
}, 30000);
|
|
127
|
+
it('should include miner/validator information', async () => {
|
|
128
|
+
const result = await advancedTools.get_block_info.handler({
|
|
129
|
+
chain: 'mainnet',
|
|
130
|
+
blockNumber: '18000000'
|
|
131
|
+
});
|
|
132
|
+
const data = JSON.parse(result.content[0].text);
|
|
133
|
+
expect(data.parentHash).toBeDefined();
|
|
134
|
+
}, 30000);
|
|
135
|
+
});
|
|
136
|
+
describe('trace_transaction', () => {
|
|
137
|
+
it('should trace a simple ETH transfer transaction', async () => {
|
|
138
|
+
// A well-known simple ETH transfer
|
|
139
|
+
const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
|
|
140
|
+
const result = await advancedTools.trace_transaction.handler({
|
|
141
|
+
chain: 'mainnet',
|
|
142
|
+
transactionHash: TX_HASH,
|
|
143
|
+
traceType: 'trace'
|
|
144
|
+
});
|
|
145
|
+
const data = JSON.parse(result.content[0].text);
|
|
146
|
+
expect(data.transactionHash).toBe(TX_HASH);
|
|
147
|
+
expect(data.traceType).toBe('trace');
|
|
148
|
+
expect(data.trace).toBeDefined();
|
|
149
|
+
}, 30000);
|
|
150
|
+
it('should trace a contract interaction transaction', async () => {
|
|
151
|
+
// Use the same real transaction for consistency
|
|
152
|
+
const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
|
|
153
|
+
const result = await advancedTools.trace_transaction.handler({
|
|
154
|
+
chain: 'mainnet',
|
|
155
|
+
transactionHash: TX_HASH,
|
|
156
|
+
traceType: 'trace'
|
|
157
|
+
});
|
|
158
|
+
const data = JSON.parse(result.content[0].text);
|
|
159
|
+
expect(data).toBeDefined();
|
|
160
|
+
expect(data.transactionHash).toBe(TX_HASH);
|
|
161
|
+
expect(data.trace).toBeDefined();
|
|
162
|
+
}, 30000);
|
|
163
|
+
it('should handle vmTrace type', async () => {
|
|
164
|
+
const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
|
|
165
|
+
const result = await advancedTools.trace_transaction.handler({
|
|
166
|
+
chain: 'mainnet',
|
|
167
|
+
transactionHash: TX_HASH,
|
|
168
|
+
traceType: 'vmTrace'
|
|
169
|
+
});
|
|
170
|
+
const data = JSON.parse(result.content[0].text);
|
|
171
|
+
expect(data.transactionHash).toBe(TX_HASH);
|
|
172
|
+
expect(data.traceType).toBe('vmTrace');
|
|
173
|
+
}, 30000);
|
|
174
|
+
it('should handle stateDiff type', async () => {
|
|
175
|
+
const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
|
|
176
|
+
const result = await advancedTools.trace_transaction.handler({
|
|
177
|
+
chain: 'mainnet',
|
|
178
|
+
transactionHash: TX_HASH,
|
|
179
|
+
traceType: 'stateDiff'
|
|
180
|
+
});
|
|
181
|
+
const data = JSON.parse(result.content[0].text);
|
|
182
|
+
expect(data.transactionHash).toBe(TX_HASH);
|
|
183
|
+
expect(data.traceType).toBe('stateDiff');
|
|
184
|
+
}, 30000);
|
|
185
|
+
it('should include call hierarchy in trace', async () => {
|
|
186
|
+
const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
|
|
187
|
+
const result = await advancedTools.trace_transaction.handler({
|
|
188
|
+
chain: 'mainnet',
|
|
189
|
+
transactionHash: TX_HASH,
|
|
190
|
+
traceType: 'trace'
|
|
191
|
+
});
|
|
192
|
+
const data = JSON.parse(result.content[0].text);
|
|
193
|
+
expect(data.success).toBe(true);
|
|
194
|
+
if (data.trace && data.trace.length > 0) {
|
|
195
|
+
const trace = data.trace[0];
|
|
196
|
+
expect(trace.action).toBeDefined();
|
|
197
|
+
expect(trace.result).toBeDefined();
|
|
198
|
+
expect(trace.type).toBeDefined();
|
|
199
|
+
}
|
|
200
|
+
}, 30000);
|
|
201
|
+
it.skip('should handle failed transactions', async () => {
|
|
202
|
+
// Skipping: would need a real failed transaction hash
|
|
203
|
+
const TX_HASH = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef';
|
|
204
|
+
try {
|
|
205
|
+
await advancedTools.trace_transaction.handler({
|
|
206
|
+
chain: 'mainnet',
|
|
207
|
+
transactionHash: TX_HASH,
|
|
208
|
+
traceType: 'trace'
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
expect(error).toBeDefined();
|
|
213
|
+
}
|
|
214
|
+
}, 30000);
|
|
215
|
+
it.skip('should work with different chains', async () => {
|
|
216
|
+
// Skipping: would need a real Base transaction hash
|
|
217
|
+
const TX_HASH = '0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060';
|
|
218
|
+
try {
|
|
219
|
+
const result = await advancedTools.trace_transaction.handler({
|
|
220
|
+
chain: 'base',
|
|
221
|
+
transactionHash: TX_HASH,
|
|
222
|
+
traceType: 'trace'
|
|
223
|
+
});
|
|
224
|
+
const data = JSON.parse(result.content[0].text);
|
|
225
|
+
expect(data.transactionHash).toBe(TX_HASH);
|
|
226
|
+
expect(data.chain).toBe('base');
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
// Transaction might not exist on Base
|
|
230
|
+
expect(error).toBeDefined();
|
|
231
|
+
}
|
|
232
|
+
}, 30000);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
//# sourceMappingURL=advanced.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced.test.js","sourceRoot":"","sources":["../../../test/tools/advanced.test.ts"],"names":[],"mappings":"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"}
|