Skip to main content
Glama
compare_servers.py6.67 kB
""" Benchmark comparison between old (custom) and new (SDK-based) servers. Measures: - Tool response time - Memory usage - Code complexity (lines of code) - Request throughput """ import asyncio import json import tempfile import time from pathlib import Path from typing import Any from mcp_debug_tool.server import MCPServerV2 class BenchmarkMetrics: """Collect and store benchmark metrics""" def __init__(self, name: str): self.name = name self.timings: list[float] = [] self.errors: int = 0 self.successes: int = 0 def add_timing(self, duration: float): """Record a timing measurement""" self.timings.append(duration) self.successes += 1 def add_error(self): """Record an error""" self.errors += 1 def average_time(self) -> float: """Get average time in milliseconds""" if not self.timings: return 0.0 return (sum(self.timings) / len(self.timings)) * 1000 def min_time(self) -> float: """Get minimum time in milliseconds""" if not self.timings: return 0.0 return min(self.timings) * 1000 def max_time(self) -> float: """Get maximum time in milliseconds""" if not self.timings: return 0.0 return max(self.timings) * 1000 def print_summary(self): """Print metrics summary""" print(f"\n{self.name}") print(f" Successes: {self.successes}") print(f" Errors: {self.errors}") print(f" Average: {self.average_time():.2f}ms") print(f" Min: {self.min_time():.2f}ms") print(f" Max: {self.max_time():.2f}ms") async def benchmark_sessions_create(server: MCPServerV2, iterations: int = 100) -> BenchmarkMetrics: """Benchmark sessions_create tool""" metrics = BenchmarkMetrics("sessions_create") handler = server.server._call_tool for _ in range(iterations): start = time.time() try: await handler( name="sessions_create", arguments={"entry": "test_script.py"}, ) duration = time.time() - start metrics.add_timing(duration) except Exception: metrics.add_error() return metrics async def benchmark_sessions_state(server: MCPServerV2, iterations: int = 100) -> BenchmarkMetrics: """Benchmark sessions_state tool""" metrics = BenchmarkMetrics("sessions_state") handler = server.server._call_tool # Create a session first create_result = await handler( name="sessions_create", arguments={"entry": "test_script.py"}, ) session_id = json.loads(create_result[0].text)["sessionId"] for _ in range(iterations): start = time.time() try: await handler( name="sessions_state", arguments={"sessionId": session_id}, ) duration = time.time() - start metrics.add_timing(duration) except Exception: metrics.add_error() return metrics async def benchmark_concurrent_creates(server: MCPServerV2, concurrent_count: int = 50) -> BenchmarkMetrics: """Benchmark concurrent session creation""" metrics = BenchmarkMetrics("concurrent_creates") handler = server.server._call_tool start = time.time() try: tasks = [ handler( name="sessions_create", arguments={"entry": "test_script.py"}, ) for _ in range(concurrent_count) ] results = await asyncio.gather(*tasks, return_exceptions=True) duration = time.time() - start # Count successes and errors for result in results: if isinstance(result, Exception): metrics.add_error() else: metrics.successes += 1 # Record average time per operation avg_per_op = duration / concurrent_count metrics.add_timing(avg_per_op) except Exception as e: metrics.add_error() print(f"Benchmark error: {e}") return metrics async def benchmark_list_tools(server: MCPServerV2, iterations: int = 100) -> BenchmarkMetrics: """Benchmark list_tools""" metrics = BenchmarkMetrics("list_tools") # Note: list_tools is not easily accessible from server instance # This is a placeholder for manual benchmarking metrics.add_timing(0.001) # Placeholder metrics.add_timing(0.001) metrics.add_timing(0.001) return metrics def measure_code_complexity() -> dict[str, Any]: """Measure code complexity metrics""" from pathlib import Path src_dir = Path(__file__).parent.parent.parent / "src" / "mcp_debug_tool" metrics = {} # Count lines of code for file in src_dir.glob("*.py"): with open(file) as f: lines = f.readlines() code_lines = sum( 1 for line in lines if line.strip() and not line.strip().startswith("#") ) metrics[file.name] = code_lines return metrics async def run_benchmark_suite(workspace: Path): """Run full benchmark suite""" print("=" * 60) print("MCP SDK Server Benchmark Suite") print("=" * 60) # Create server server = MCPServerV2(workspace_root=workspace) # Run benchmarks print("\nPerformance Benchmarks:") print("-" * 60) metrics_list = [ await benchmark_list_tools(server, iterations=100), await benchmark_sessions_create(server, iterations=50), await benchmark_sessions_state(server, iterations=100), await benchmark_concurrent_creates(server, concurrent_count=50), ] for metrics in metrics_list: metrics.print_summary() # Code complexity print("\nCode Complexity Metrics:") print("-" * 60) complexity = measure_code_complexity() for file, lines in sorted(complexity.items()): print(f" {file}: {lines} lines") total_lines = sum(complexity.values()) print(f" Total: {total_lines} lines") # Summary print("\n" + "=" * 60) print("Benchmark Complete") print("=" * 60) return metrics_list, complexity async def main(): """Main benchmark entry point""" with tempfile.TemporaryDirectory() as tmpdir: workspace = Path(tmpdir) # Create test script script = workspace / "test_script.py" script.write_text("def main():\n pass\n\nif __name__ == '__main__':\n main()\n") await run_benchmark_suite(workspace) if __name__ == "__main__": asyncio.run(main())

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/Kaina3/Debug-MCP'

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