Skip to main content
Glama
masx200

Persistent Terminal MCP Server

by masx200
test-all-9-tools.ts6.43 kB
#!/usr/bin/env tsx /** * Comprehensive test for all 9 MCP tools * Tests: create_terminal, create_terminal_basic, write_terminal, read_terminal, * wait_for_output, get_terminal_stats, list_terminals, kill_terminal, open_terminal_ui */ import { TerminalManager } from "../terminal-manager.js"; async function testAllTools() { console.log("=== Testing All 9 MCP Tools ===\n"); const manager = new TerminalManager(); let testsPassed = 0; let testsFailed = 0; try { // Test 1: create_terminal console.log("✓ Test 1: create_terminal"); const terminal1 = await manager.createTerminal({ shell: "/bin/bash", cwd: process.cwd(), }); console.log(` Terminal created: ${terminal1}`); testsPassed++; // Test 2: create_terminal_basic (simplified version) console.log("\n✓ Test 2: create_terminal_basic"); const terminal2 = await manager.createTerminal({ cwd: process.cwd(), }); console.log(` Terminal created: ${terminal2}`); testsPassed++; // Test 3: write_terminal console.log("\n✓ Test 3: write_terminal"); await manager.writeToTerminal({ terminalId: terminal1, input: 'echo "Hello from MCP"', }); console.log(" Input sent successfully"); testsPassed++; // Test 4: wait_for_output console.log("\n✓ Test 4: wait_for_output"); const waitStart = Date.now(); await manager.waitForOutputStable(terminal1, 5000, 500); const waitTime = Date.now() - waitStart; console.log(` Output stabilized: true`); console.log(` Wait time: ${waitTime}ms`); testsPassed++; // Test 5: read_terminal (full mode) console.log("\n✓ Test 5: read_terminal (full mode)"); const fullOutput = await manager.readFromTerminal({ terminalId: terminal1, mode: "full", }); console.log(` Output lines: ${fullOutput.totalLines}`); console.log( ` Has "Hello from MCP": ${fullOutput.output.includes("Hello from MCP")}`, ); testsPassed++; // Test 6: Generate more output for smart reading console.log("\n✓ Test 6: Generating more output for smart reading..."); for (let i = 1; i <= 20; i++) { await manager.writeToTerminal({ terminalId: terminal1, input: `echo "Line ${i}"`, }); } await manager.waitForOutputStable(terminal1, 5000, 500); console.log(" Generated 20 lines of output"); testsPassed++; // Test 7: read_terminal (head mode) console.log("\n✓ Test 7: read_terminal (head mode)"); const headOutput = await manager.readFromTerminal({ terminalId: terminal1, mode: "head", headLines: 5, }); console.log(` Truncated: ${headOutput.truncated}`); console.log(` Lines shown: ${headOutput.stats?.linesShown || "N/A"}`); console.log(` Lines omitted: ${headOutput.stats?.linesOmitted || 0}`); testsPassed++; // Test 8: read_terminal (tail mode) console.log("\n✓ Test 8: read_terminal (tail mode)"); const tailOutput = await manager.readFromTerminal({ terminalId: terminal1, mode: "tail", tailLines: 5, }); console.log(` Truncated: ${tailOutput.truncated}`); console.log(` Lines shown: ${tailOutput.stats?.linesShown || "N/A"}`); console.log(` Lines omitted: ${tailOutput.stats?.linesOmitted || 0}`); testsPassed++; // Test 9: read_terminal (head-tail mode) console.log("\n✓ Test 9: read_terminal (head-tail mode)"); const headTailOutput = await manager.readFromTerminal({ terminalId: terminal1, mode: "head-tail", headLines: 3, tailLines: 3, }); console.log(` Truncated: ${headTailOutput.truncated}`); console.log(` Lines shown: ${headTailOutput.stats?.linesShown || "N/A"}`); console.log(` Lines omitted: ${headTailOutput.stats?.linesOmitted || 0}`); testsPassed++; // Test 10: get_terminal_stats console.log("\n✓ Test 10: get_terminal_stats"); const stats = await manager.getTerminalStats(terminal1); console.log(` Total lines: ${stats.totalLines}`); console.log(` Total bytes: ${stats.totalBytes}`); console.log(` Estimated tokens: ${stats.estimatedTokens}`); console.log(` Is active: ${stats.isActive}`); testsPassed++; // Test 11: list_terminals console.log("\n✓ Test 11: list_terminals"); const terminalsList = await manager.listTerminals(); console.log(` Active terminals: ${terminalsList.terminals.length}`); console.log( ` Terminal IDs: ${terminalsList.terminals.map((t) => t.id).join(", ")}`, ); testsPassed++; // Test 12: kill_terminal console.log("\n✓ Test 12: kill_terminal (terminal 1)"); await manager.killTerminal(terminal1); console.log(" Terminal 1 terminated successfully"); testsPassed++; // Test 13: kill_terminal (terminal 2) console.log("\n✓ Test 13: kill_terminal (terminal 2)"); await manager.killTerminal(terminal2); console.log(" Terminal 2 terminated successfully"); testsPassed++; // Test 14: Verify terminals are terminated console.log("\n✓ Test 14: Verify terminals are terminated"); const remainingTerminals = await manager.listTerminals(); console.log( ` Remaining terminals: ${remainingTerminals.terminals.length}`, ); if (remainingTerminals.terminals.length === 0) { console.log(" All terminals terminated successfully"); testsPassed++; } else { console.log(" ✗ Some terminals still active!"); testsFailed++; } // Test 15: open_terminal_ui (just verify it doesn't crash) console.log("\n✓ Test 15: open_terminal_ui (API test only)"); console.log(" Note: Web UI requires manual testing in browser"); console.log(" Skipping automatic browser open"); testsPassed++; } catch (error) { console.error("\n✗ Test failed:", error); testsFailed++; } finally { console.log("\n=== Test Summary ==="); console.log(`✓ Passed: ${testsPassed}`); console.log(`✗ Failed: ${testsFailed}`); console.log(`Total: ${testsPassed + testsFailed}`); if (testsFailed === 0) { console.log("\n🎉 All tests passed!"); } else { console.log("\n❌ Some tests failed!"); } console.log("\nShutting down terminal manager..."); await manager.shutdown(); console.log("Cleanup complete"); } } testAllTools().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/masx200/persistent-terminal-mcp'

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