UNPKG

@chainreactionom/nano-mcp

Version:

NANO cryptocurrency wallet implementation for MCP with comprehensive testing

198 lines (171 loc) 5.22 kB
import { spawn } from 'child_process'; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; // Get the current file's directory const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Path to the built MCP server const MCP_SERVER_PATH = join(__dirname, 'dist', 'index.js'); // Create a promise-based delay function const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); // Test account and block hash for testing const TEST_ACCOUNT = 'nano_3t6k35gi95xu6tergt6p69ck76ogmitsa8mnijtpxm9fkcm736xtoncuohr3'; const TEST_BLOCK = '023B94B7D27B311666C8636954FE17F1FD2EAA97A8BAC27DE5084FBBD5C6B02C'; async function main() { // Spawn the MCP server as a child process const serverProcess = spawn('node', [MCP_SERVER_PATH], { stdio: ['pipe', 'pipe', 'inherit'] }); // Buffer to store incomplete JSON data let buffer = ''; // Handle server responses serverProcess.stdout.on('data', (data) => { buffer += data.toString(); try { // Try to parse complete JSON messages const messages = buffer.split('\n').filter(Boolean); buffer = messages.pop() || ''; for (const message of messages) { const response = JSON.parse(message); console.log('Received response:', JSON.stringify(response, null, 2)); } } catch (error) { // Incomplete JSON, continue buffering } }); try { // Initialize connection console.log('\nSending initialize request...'); const initializeRequest = { jsonrpc: '2.0', id: 1, method: 'initialize', params: { protocolVersion: '2025-03-26', clientInfo: { name: 'nano-mcp-test', version: '1.0.0' }, capabilities: { tools: {} } } }; serverProcess.stdin.write(JSON.stringify(initializeRequest) + '\n'); // Wait for response await delay(1000); // List available tools console.log('\nSending listTools request...'); const listToolsRequest = { jsonrpc: '2.0', id: 2, method: 'listTools' }; serverProcess.stdin.write(JSON.stringify(listToolsRequest) + '\n'); // Wait for response await delay(1000); // Test nano_account_balance console.log('\nTesting nano_account_balance...'); const balanceRequest = { jsonrpc: '2.0', id: 3, method: 'callTool', params: { name: 'nano_account_balance', arguments: { account: TEST_ACCOUNT, unit: 'NANO' } } }; serverProcess.stdin.write(JSON.stringify(balanceRequest) + '\n'); // Wait for response await delay(1000); // Test nano_account_info console.log('\nTesting nano_account_info...'); const infoRequest = { jsonrpc: '2.0', id: 4, method: 'callTool', params: { name: 'nano_account_info', arguments: { account: TEST_ACCOUNT } } }; serverProcess.stdin.write(JSON.stringify(infoRequest) + '\n'); // Wait for response await delay(1000); // Test nano_block_info console.log('\nTesting nano_block_info...'); const blockRequest = { jsonrpc: '2.0', id: 5, method: 'callTool', params: { name: 'nano_block_info', arguments: { hash: TEST_BLOCK } } }; serverProcess.stdin.write(JSON.stringify(blockRequest) + '\n'); // Wait for response await delay(1000); // Test nano_block_count console.log('\nTesting nano_block_count...'); const countRequest = { jsonrpc: '2.0', id: 6, method: 'callTool', params: { name: 'nano_block_count', arguments: {} } }; serverProcess.stdin.write(JSON.stringify(countRequest) + '\n'); // Wait for response await delay(1000); // Test nano_version console.log('\nTesting nano_version...'); const versionRequest = { jsonrpc: '2.0', id: 7, method: 'callTool', params: { name: 'nano_version', arguments: {} } }; serverProcess.stdin.write(JSON.stringify(versionRequest) + '\n'); // Wait for final response await delay(1000); // Test error handling with invalid account console.log('\nTesting error handling with invalid account...'); const invalidRequest = { jsonrpc: '2.0', id: 8, method: 'callTool', params: { name: 'nano_account_balance', arguments: { account: 'invalid_account' } } }; serverProcess.stdin.write(JSON.stringify(invalidRequest) + '\n'); // Wait for error response await delay(1000); console.log('\nTests completed. Terminating server...'); serverProcess.kill(); } catch (error) { console.error('Test error:', error); serverProcess.kill(); process.exit(1); } } main().catch(error => { console.error('Unhandled error:', error); process.exit(1); });