/** * Basic MCP Client Example * * This example demonstrates how to use the McpClient class to: * 1. Connect to an MCP server using stdio transport * 2. Discover available tools * 3. Execute tool calls * 4. List and read resources * 5. Handle errors * 6. Clean up resources */ import { McpClient, StdioClientTransport } from '../../src/index.js'; async function main() { // Create client const client = new McpClient( { name: 'example-client', version: '1.0.0' }, { capabilities: { resources: {}, tools: {}, prompts: {} }, requestTimeout: 10000 } ); try { console.log('Creating transport...'); // Create transport to a local server process // This example uses the echo server included with the toolkit const transport = new StdioClientTransport({ command: 'node', args: ['../../src/tools/echo-server.js'], inherit: false, env: { NODE_ENV: 'production' } }); console.log('Connecting to server...'); // Connect to server await client.connect(transport); console.log('Connected to server'); // Get server info const serverInfo = await client.getServerInfo(); console.log('Server info:', serverInfo); // List available tools console.log('\nDiscovering tools...'); const tools = await client.listTools(); console.log(`Found ${tools.length} tools:`); tools.forEach(tool => { console.log(`- ${tool.name}: ${tool.description || 'No description'}`); }); // Call the echo tool if (tools.some(tool => tool.name === 'echo')) { console.log('\nCalling echo tool...'); const result = await client.callTool('echo', { message: 'Hello, MCP!' }); console.log('Tool result:', result); } // List available resources console.log('\nDiscovering resources...'); const resources = await client.listResources(); console.log(`Found ${resources.length} resources:`); resources.forEach(resource => { console.log(`- ${resource.uri}: ${resource.description || 'No description'}`); }); // Read a resource if (resources.length > 0) { console.log('\nReading resource...'); const resourceContent = await client.readResource(resources[0].uri); console.log('Resource content:', resourceContent); } // Subscribe to resource updates if (resources.length > 0) { console.log('\nSubscribing to resource updates...'); await client.subscribeResource(resources[0].uri); // Set up event listener for resource updates client.onResourceUpdated((event) => { console.log('Resource updated:', event); }); console.log('Subscribed to resource updates'); } // Handle connection events client.onDisconnect(() => { console.log('Disconnected from server'); }); } catch (error) { console.error('Error:', error); } finally { // Clean up and close the connection console.log('\nClosing connection...'); await client.close(); console.log('Connection closed'); } } // Run the main function main().catch(error => { console.error('Unhandled error:', error); process.exit(1); });