Skip to main content
Glama
test-client.ts2.97 kB
#!/usr/bin/env tsx import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; import { spawn } from 'child_process'; async function testPeekabooServer() { console.log('Starting Peekaboo MCP test client...\n'); // Spawn the server process const serverProcess = spawn('tsx', ['src/index.ts'], { env: { ...process.env, PEEKABOO_ROOT: process.cwd() }, stdio: ['pipe', 'pipe', 'inherit'] }); const transport = new StdioClientTransport({ command: 'tsx', args: ['src/index.ts'], env: { PEEKABOO_ROOT: process.cwd() } }); const client = new Client({ name: 'test-client', version: '1.0.0' }, { capabilities: {} }); try { await client.connect(transport); console.log('✓ Connected to Peekaboo server\n'); // Test 1: List resources (recursive by default) console.log('Test 1: Listing root directory resources recursively...'); const resources = await client.listResources(); console.log(`Found ${resources.resources.length} total items (including nested):`); // Show directory structure const directories = resources.resources.filter(r => r.mimeType === 'inode/directory').slice(0, 5); const files = resources.resources.filter(r => r.mimeType === 'text/plain').slice(0, 5); console.log('Directories:'); directories.forEach(r => { const depth = r.name.split('/').length - 1; const indent = ' '.repeat(depth); console.log(`${indent}- ${r.name}`); }); console.log('\nFiles:'); files.forEach(r => { console.log(` - ${r.name}`); }); if (resources.resources.length > 10) { console.log(`\n ... and ${resources.resources.length - 10} more items`); } console.log(); // Test 2: Read a file const readmeResource = resources.resources.find(r => r.name === 'README.md'); if (readmeResource) { console.log('Test 2: Reading README.md...'); const content = await client.readResource({ uri: readmeResource.uri }); const text = content.contents[0].text; console.log(`Content preview (first 200 chars):`); console.log(text.substring(0, 200) + '...\n'); } // Test 3: Try to read outside root (should fail) console.log('Test 3: Testing path traversal protection...'); try { await client.readResource({ uri: 'file://../../etc/passwd' }); console.log('❌ Path traversal protection FAILED - this should not happen!'); } catch (error) { console.log('✓ Path traversal blocked successfully'); console.log(` Error: ${error instanceof Error ? error.message : 'Unknown error'}\n`); } console.log('All tests completed successfully! 🎉'); } catch (error) { console.error('Test failed:', error); } finally { await client.close(); serverProcess.kill(); process.exit(0); } } testPeekabooServer().catch(console.error);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/davstr1/peekabooMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server