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.
- package/README.md +28 -4
- package/dist/package.json +5 -2
- package/dist/src/tools/ens.d.ts +119 -0
- package/dist/src/tools/ens.d.ts.map +1 -0
- package/dist/src/tools/ens.js +425 -0
- package/dist/src/tools/ens.js.map +1 -0
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +3 -1
- package/dist/src/tools/index.js.map +1 -1
- package/dist/test/tools/ens.test.d.ts +2 -0
- package/dist/test/tools/ens.test.d.ts.map +1 -0
- package/dist/test/tools/ens.test.js +236 -0
- package/dist/test/tools/ens.test.js.map +1 -0
- package/package.json +5 -2
- package/src/tools/ens.ts +493 -0
- package/src/tools/index.ts +3 -1
- package/dist/client.d.ts +0 -1653
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -142
- package/dist/client.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -88
- package/dist/index.js.map +0 -1
- package/dist/test/mcp-client.test.d.ts +0 -2
- package/dist/test/mcp-client.test.d.ts.map +0 -1
- package/dist/test/mcp-client.test.js +0 -376
- package/dist/test/mcp-client.test.js.map +0 -1
- package/dist/tools/advanced.d.ts +0 -75
- package/dist/tools/advanced.d.ts.map +0 -1
- package/dist/tools/advanced.js +0 -234
- package/dist/tools/advanced.js.map +0 -1
- package/dist/tools/balance.d.ts +0 -55
- package/dist/tools/balance.d.ts.map +0 -1
- package/dist/tools/balance.js +0 -146
- package/dist/tools/balance.js.map +0 -1
- package/dist/tools/batch.d.ts +0 -122
- package/dist/tools/batch.d.ts.map +0 -1
- package/dist/tools/batch.js +0 -243
- package/dist/tools/batch.js.map +0 -1
- package/dist/tools/contract-info.d.ts +0 -79
- package/dist/tools/contract-info.d.ts.map +0 -1
- package/dist/tools/contract-info.js +0 -450
- package/dist/tools/contract-info.js.map +0 -1
- package/dist/tools/contract.d.ts +0 -79
- package/dist/tools/contract.d.ts.map +0 -1
- package/dist/tools/contract.js +0 -140
- package/dist/tools/contract.js.map +0 -1
- package/dist/tools/index.d.ts +0 -3
- package/dist/tools/index.d.ts.map +0 -1
- package/dist/tools/index.js +0 -27
- package/dist/tools/index.js.map +0 -1
- package/dist/tools/logs.d.ts +0 -39
- package/dist/tools/logs.d.ts.map +0 -1
- package/dist/tools/logs.js +0 -231
- package/dist/tools/logs.js.map +0 -1
- package/dist/tools/signatures.d.ts +0 -83
- package/dist/tools/signatures.d.ts.map +0 -1
- package/dist/tools/signatures.js +0 -93
- package/dist/tools/signatures.js.map +0 -1
- package/dist/types.d.ts +0 -22
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts +0 -22
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js +0 -183
- package/dist/utils.js.map +0 -1
package/dist/client.d.ts.map
DELETED
|
@@ -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
|
package/dist/client.js.map
DELETED
|
@@ -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
package/dist/index.d.ts.map
DELETED
|
@@ -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 +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
|