web3-tools-mcp 1.1.0 → 1.2.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 (68) hide show
  1. package/README.md +28 -4
  2. package/dist/package.json +5 -2
  3. package/dist/src/tools/ens.d.ts +119 -0
  4. package/dist/src/tools/ens.d.ts.map +1 -0
  5. package/dist/src/tools/ens.js +425 -0
  6. package/dist/src/tools/ens.js.map +1 -0
  7. package/dist/src/tools/index.d.ts.map +1 -1
  8. package/dist/src/tools/index.js +3 -1
  9. package/dist/src/tools/index.js.map +1 -1
  10. package/dist/test/tools/ens.test.d.ts +2 -0
  11. package/dist/test/tools/ens.test.d.ts.map +1 -0
  12. package/dist/test/tools/ens.test.js +236 -0
  13. package/dist/test/tools/ens.test.js.map +1 -0
  14. package/package.json +5 -2
  15. package/src/tools/ens.ts +493 -0
  16. package/src/tools/index.ts +3 -1
  17. package/dist/client.d.ts +0 -1653
  18. package/dist/client.d.ts.map +0 -1
  19. package/dist/client.js +0 -142
  20. package/dist/client.js.map +0 -1
  21. package/dist/index.d.ts +0 -3
  22. package/dist/index.d.ts.map +0 -1
  23. package/dist/index.js +0 -88
  24. package/dist/index.js.map +0 -1
  25. package/dist/test/mcp-client.test.d.ts +0 -2
  26. package/dist/test/mcp-client.test.d.ts.map +0 -1
  27. package/dist/test/mcp-client.test.js +0 -376
  28. package/dist/test/mcp-client.test.js.map +0 -1
  29. package/dist/tools/advanced.d.ts +0 -75
  30. package/dist/tools/advanced.d.ts.map +0 -1
  31. package/dist/tools/advanced.js +0 -234
  32. package/dist/tools/advanced.js.map +0 -1
  33. package/dist/tools/balance.d.ts +0 -55
  34. package/dist/tools/balance.d.ts.map +0 -1
  35. package/dist/tools/balance.js +0 -146
  36. package/dist/tools/balance.js.map +0 -1
  37. package/dist/tools/batch.d.ts +0 -122
  38. package/dist/tools/batch.d.ts.map +0 -1
  39. package/dist/tools/batch.js +0 -243
  40. package/dist/tools/batch.js.map +0 -1
  41. package/dist/tools/contract-info.d.ts +0 -79
  42. package/dist/tools/contract-info.d.ts.map +0 -1
  43. package/dist/tools/contract-info.js +0 -450
  44. package/dist/tools/contract-info.js.map +0 -1
  45. package/dist/tools/contract.d.ts +0 -79
  46. package/dist/tools/contract.d.ts.map +0 -1
  47. package/dist/tools/contract.js +0 -140
  48. package/dist/tools/contract.js.map +0 -1
  49. package/dist/tools/index.d.ts +0 -3
  50. package/dist/tools/index.d.ts.map +0 -1
  51. package/dist/tools/index.js +0 -27
  52. package/dist/tools/index.js.map +0 -1
  53. package/dist/tools/logs.d.ts +0 -39
  54. package/dist/tools/logs.d.ts.map +0 -1
  55. package/dist/tools/logs.js +0 -231
  56. package/dist/tools/logs.js.map +0 -1
  57. package/dist/tools/signatures.d.ts +0 -83
  58. package/dist/tools/signatures.d.ts.map +0 -1
  59. package/dist/tools/signatures.js +0 -93
  60. package/dist/tools/signatures.js.map +0 -1
  61. package/dist/types.d.ts +0 -22
  62. package/dist/types.d.ts.map +0 -1
  63. package/dist/types.js +0 -2
  64. package/dist/types.js.map +0 -1
  65. package/dist/utils.d.ts +0 -22
  66. package/dist/utils.d.ts.map +0 -1
  67. package/dist/utils.js +0 -183
  68. package/dist/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js DELETED
@@ -1,142 +0,0 @@
1
- import { http, createPublicClient } from 'viem';
2
- import { arbitrum, base, celo, localhost, mainnet, optimism, polygon } from 'viem/chains';
3
- // Enhanced RPC configuration with API keys
4
- function getRpcUrl(chainName, config) {
5
- // Check for custom RPC URLs first
6
- if (config.customRpcUrls?.[chainName]) {
7
- return config.customRpcUrls[chainName];
8
- }
9
- // Enhanced RPC URLs with API keys
10
- const enhancedRpcs = {
11
- mainnet: config.alchemyApiKey
12
- ? `https://eth-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
13
- : config.infuraApiKey
14
- ? `https://mainnet.infura.io/v3/${config.infuraApiKey}`
15
- : 'https://eth.llamarpc.com',
16
- base: config.alchemyApiKey
17
- ? `https://base-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
18
- : 'https://base.llamarpc.com',
19
- arbitrum: config.alchemyApiKey
20
- ? `https://arb-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
21
- : config.infuraApiKey
22
- ? `https://arbitrum-mainnet.infura.io/v3/${config.infuraApiKey}`
23
- : 'https://arb1.arbitrum.io/rpc',
24
- polygon: config.alchemyApiKey
25
- ? `https://polygon-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
26
- : config.infuraApiKey
27
- ? `https://polygon-mainnet.infura.io/v3/${config.infuraApiKey}`
28
- : 'https://polygon-rpc.com/',
29
- optimism: config.alchemyApiKey
30
- ? `https://opt-mainnet.g.alchemy.com/v2/${config.alchemyApiKey}`
31
- : config.infuraApiKey
32
- ? `https://optimism-mainnet.infura.io/v3/${config.infuraApiKey}`
33
- : 'https://mainnet.optimism.io',
34
- celo: 'https://celo.drpc.org',
35
- localhost: 'http://localhost:8545'
36
- };
37
- return enhancedRpcs[chainName] ?? 'https://eth.llamarpc.com';
38
- }
39
- // Supported chains with their RPC endpoints (now dynamic)
40
- export const CHAINS = (config) => ({
41
- mainnet: {
42
- chain: mainnet,
43
- get rpc() {
44
- return getRpcUrl('mainnet', config);
45
- }
46
- },
47
- base: {
48
- chain: base,
49
- get rpc() {
50
- return getRpcUrl('base', config);
51
- }
52
- },
53
- arbitrum: {
54
- chain: arbitrum,
55
- get rpc() {
56
- return getRpcUrl('arbitrum', config);
57
- }
58
- },
59
- polygon: {
60
- chain: polygon,
61
- get rpc() {
62
- return getRpcUrl('polygon', config);
63
- }
64
- },
65
- optimism: {
66
- chain: optimism,
67
- get rpc() {
68
- return getRpcUrl('optimism', config);
69
- }
70
- },
71
- celo: {
72
- chain: celo,
73
- get rpc() {
74
- return getRpcUrl('celo', config);
75
- }
76
- },
77
- localhost: {
78
- chain: localhost,
79
- get rpc() {
80
- return getRpcUrl('localhost', config);
81
- }
82
- }
83
- });
84
- // Hypersync URLs for supported chains (localhost is not supported)
85
- export const HYPERSYNC_URLS = {
86
- base: 'https://base.hypersync.xyz',
87
- arbitrum: 'https://arbitrum.hypersync.xyz',
88
- mainnet: 'https://eth.hypersync.xyz',
89
- polygon: 'https://polygon.hypersync.xyz',
90
- optimism: 'https://optimism.hypersync.xyz'
91
- // celo and localhost are not supported by hypersync
92
- };
93
- export const SUPPORTED_CHAINS = ['mainnet', 'base', 'arbitrum', 'polygon', 'optimism', 'celo', 'localhost'];
94
- // Client manager
95
- export class ClientManager {
96
- clients = new Map();
97
- config;
98
- constructor(config) {
99
- this.config = config;
100
- }
101
- getClient(chainName) {
102
- if (!this.clients.has(chainName)) {
103
- const chains = CHAINS(this.config);
104
- const { chain, rpc } = chains[chainName];
105
- const client = createPublicClient({
106
- chain,
107
- transport: http(rpc)
108
- });
109
- this.clients.set(chainName, client);
110
- }
111
- const client = this.clients.get(chainName);
112
- if (!client) {
113
- throw new Error(`Failed to create client for chain: ${chainName}`);
114
- }
115
- return client;
116
- }
117
- getEtherscanDomain(chainName) {
118
- const domains = {
119
- mainnet: 'etherscan.io',
120
- base: 'basescan.org',
121
- arbitrum: 'arbiscan.io',
122
- polygon: 'polygonscan.com',
123
- optimism: 'optimistic.etherscan.io',
124
- celo: 'celoscan.io',
125
- localhost: 'etherscan.io'
126
- };
127
- return domains[chainName] || 'etherscan.io';
128
- }
129
- }
130
- // Export a global client manager instance
131
- let clientManager = null;
132
- export function initializeClientManager(config) {
133
- clientManager = new ClientManager(config);
134
- return clientManager;
135
- }
136
- export function getClientManager() {
137
- if (!clientManager) {
138
- throw new Error('Client manager not initialized');
139
- }
140
- return clientManager;
141
- }
142
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js DELETED
@@ -1,88 +0,0 @@
1
- #!/usr/bin/env node
2
- import packageJson from "../package.json" with { type: "json" };
3
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
- import { initializeClientManager } from "./client.js";
6
- import { registerAllTools } from "./tools/index.js";
7
- import { parseCommandLineArgs } from "./utils.js";
8
- // Parse configuration
9
- const config = parseCommandLineArgs();
10
- // Show help if requested
11
- if (config.showHelp) {
12
- console.log(`
13
- Web3 Tools MCP Server v${packageJson.version}
14
- ${packageJson.description}
15
-
16
- USAGE:
17
- npx web3-tools-mcp [OPTIONS]
18
-
19
- OPTIONS:
20
- --help, -h Show this help message
21
- --etherscan-api-key <key> Etherscan API key (for contract ABI retrieval)
22
- --alchemy-api-key <key> Alchemy API key (for enhanced RPC)
23
- --infura-api-key <key> Infura API key (for alternative RPC)
24
- --hypersync-api-key <key> Hypersync API key (for fast event queries)
25
- --custom-rpc <json> Custom RPC URLs as JSON object
26
- Example: '{"mainnet":"https://...", "base":"https://..."}'
27
-
28
- ENVIRONMENT VARIABLES:
29
- ETHERSCAN_API_KEY Alternative to --etherscan-api-key
30
- ALCHEMY_API_KEY Alternative to --alchemy-api-key
31
- INFURA_API_KEY Alternative to --infura-api-key
32
- HYPERSYNC_API_KEY Alternative to --hypersync-api-key
33
-
34
- SUPPORTED CHAINS:
35
- mainnet, base, arbitrum, polygon, optimism, celo, localhost
36
-
37
- EXAMPLES:
38
- # Use with npx (recommended)
39
- npx web3-tools-mcp --etherscan-api-key YOUR_KEY
40
-
41
- # Use environment variables
42
- export ETHERSCAN_API_KEY=your_key
43
- npx web3-tools-mcp
44
-
45
- # Use custom RPC
46
- npx web3-tools-mcp --custom-rpc '{"mainnet":"https://my-rpc.com"}'
47
-
48
- DOCUMENTATION:
49
- GitHub: ${packageJson.repository.url.replace('git+', '').replace('.git', '')}
50
- Issues: ${packageJson.bugs.url}
51
-
52
- For MCP client configuration, see the README.md file.
53
- `);
54
- process.exit(0);
55
- }
56
- // Log configuration info
57
- if (config.etherscanApiKey) {
58
- console.error("[MCP] Etherscan API key configured");
59
- }
60
- if (config.alchemyApiKey) {
61
- console.error("[MCP] Alchemy API key configured");
62
- }
63
- if (config.infuraApiKey) {
64
- console.error("[MCP] Infura API key configured");
65
- }
66
- if (config.customRpcUrls) {
67
- console.error("[MCP] Custom RPC URLs:", Object.keys(config.customRpcUrls));
68
- }
69
- // Initialize client manager
70
- initializeClientManager(config);
71
- // Create MCP server instance
72
- const server = new McpServer({
73
- name: "web3-tools-mcp",
74
- version: packageJson.version,
75
- });
76
- // Register all tools
77
- registerAllTools(server);
78
- // Start server
79
- async function main() {
80
- const transport = new StdioServerTransport();
81
- await server.connect(transport);
82
- console.error("Web3 Tools MCP Server running on stdio");
83
- }
84
- main().catch((error) => {
85
- console.error("Fatal error:", error);
86
- process.exit(1);
87
- });
88
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,sBAAsB;AACtB,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAC;AAEtC,yBAAyB;AACzB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC;yBACW,WAAW,CAAC,OAAO;EAC1C,WAAW,CAAC,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAmCb,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAClE,WAAW,CAAC,IAAI,CAAC,GAAG;;;CAG/B,CAAC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,yBAAyB;AACzB,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;AACtD,CAAC;AACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;AACpD,CAAC;AACD,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;IACxB,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACnD,CAAC;AACD,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;IACzB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,4BAA4B;AAC5B,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAEhC,6BAA6B;AAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,WAAW,CAAC,OAAO;CAC7B,CAAC,CAAC;AAEH,qBAAqB;AACrB,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,eAAe;AACf,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;AAC1D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mcp-client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-client.test.d.ts","sourceRoot":"","sources":["../../test/mcp-client.test.ts"],"names":[],"mappings":""}
@@ -1,376 +0,0 @@
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