# CtrEditor MCP Server - LLM Guide *MCP 2025-06-18 compliant | Compatible: Claude Desktop + Cursor* ## 🎯 **September 2025 Update - CPython Migration Completed** ⚡ **✅ IronPython Elimination Complete:** - Migrated from IronPython to CPython for unified Python environment - Now uses the same TSNet Python environment across all components - Improved performance and reduced dependencies - Async Python execution with proper timeout handling - Enhanced error handling and process management **✅ System Architecture:** - **Python Runtime**: CPython 3.12 (shared with TSNet) - **Execution Method**: Process-based (via temporary scripts) - **Environment Path**: `D:\Proyectos\VisualStudio\CtrEditor\bin\Debug\net8.0-windows8.0\tsnet` - **Integration**: PythonInterop.cs for seamless C#-Python communication ## ⚡ Command Efficiency Tiers ### 🚀 **Ultra-Fast** (Use Liberally) - `get_simulation_status` → ~25 tokens, instant - `get_ctreditor_status` → ~20 tokens, instant - `start/stop_simulation` → ~15 tokens, 2-3 sec ### 🟡 **Medium** (Use When Needed) - `get_debug_stats` → ~30 tokens, instant - `search_debug_log` → 50-200 tokens (max_lines=3-10) - `build_project` → 100-500 tokens (errors only) - `execute_python` → 50-500 tokens (depends on script) - `execute_tsnet_direct` → ~50 tokens, 3-5 sec (bypasses Python) - `python_help` → 100-300 tokens - `clear_debug_buffer` → ~20 tokens, instant ### 🔴 **Heavy** (Use Sparingly) - `list_objects` → 500-2000+ tokens - `take_screenshot` → 100-300 tokens + file ## 🔧 Core Operations ### Process Management ```json {"tool": "start_ctreditor", "parameters": {}} {"tool": "get_ctreditor_status", "parameters": {}} {"tool": "stop_ctreditor", "parameters": {}} ``` ### Build & Debug **Sistema de debug logging circular completamente refactorizado y validado ✅** - Buffer circular automático: mantiene últimos 1000 eventos - Captura en tiempo real: System.Diagnostics.Trace integration - Timer de limpieza automática: previene memory leaks - Thread-safe: ConcurrentQueue para alta concurrencia - Performance validada: maneja miles de eventos sin degradación ```json {"tool": "build_project", "parameters": {}} {"tool": "get_debug_stats", "parameters": {}} {"tool": "search_debug_log", "parameters": {"pattern": "error|exception", "max_lines": 5}} {"tool": "search_debug_log", "parameters": {"pattern": "Tanque.*Nivel|PIPE.*Apply", "max_lines": 10}} {"tool": "clear_debug_buffer", "parameters": {}} ``` ### Simulation Control ```json {"tool": "get_simulation_status", "parameters": {}} {"tool": "start_simulation", "parameters": {}} {"tool": "stop_simulation", "parameters": {}} {"tool": "execute_tsnet_direct", "parameters": {}} ``` ### TSNet Direct Execution ⚡ **NEW September 2025** **Revolutionary bypass of Python mocks for real C# object access:** - **Purpose**: Execute TSNet hydraulic simulation directly using real C# objects - **Bypass**: Eliminates Python mock objects and validation issues - **Speed**: 3-5 seconds (faster than Python-based execution) - **Validation**: Uses real tank configurations, not serialized data - **Debug**: Enhanced validation logging with detailed value inspection ```json {"tool": "execute_tsnet_direct", "parameters": {}} ``` **Key Benefits:** - ✅ **Real Objects**: Direct access to C# osHydTank, osHydPump objects - ✅ **No Mocks**: Bypasses Python serialization limitations - ✅ **Enhanced Debugging**: Detailed validation logs with actual values - ✅ **Faster Execution**: Native C# method calls vs Python interop - ✅ **Accurate Validation**: Uses real CurrentLevelM, MinLevelM, MaxLevelM values ### Object Management ```json {"tool": "list_objects", "parameters": {}} {"tool": "create_object", "parameters": {"type": "osHydPump", "x": 10, "y": 5}} {"tool": "update_object", "parameters": {"id": "123", "properties": {"PumpHead": 75.0}}} {"tool": "delete_objects", "parameters": {"ids": ["123", "456"]}} ``` ### Python Debug Scripts ⚡ ENHANCED **Post-Migration Benefits (September 2025):** - **Unified Environment**: Same CPython used for TSNet and MCP - **Better Performance**: Process-based execution with proper isolation - **Enhanced Reliability**: Async execution with timeout protection - **Improved Error Handling**: Clear error messages and stack traces ```json {"tool": "execute_python", "parameters": {"code": "print(f'Total objects: {len(objects)}')"}} {"tool": "execute_python", "parameters": { "code": "result = [obj for obj in objects if 'Pump' in str(type(obj))]", "return_variables": ["result"] }} {"tool": "python_help", "parameters": {"object_name": "app"}} ``` ## ⚡ Optimal Workflows ### Quick Development Cycle ```json {"tool": "get_ctreditor_status", "parameters": {}} {"tool": "build_project", "parameters": {}} {"tool": "start_simulation", "parameters": {}} {"tool": "execute_python", "parameters": {"code": "print(f'Objects: {len(objects)}, Running: {app.IsSimulationRunning}')"}} {"tool": "get_simulation_status", "parameters": {}} ``` ### TSNet Development & Testing ⚡ **NEW** ```json {"tool": "get_ctreditor_status", "parameters": {}} {"tool": "execute_tsnet_direct", "parameters": {}} {"tool": "search_debug_log", "parameters": {"pattern": "VALIDACION ERROR|TSNet Direct|InitialLevelM", "max_lines": 5}} {"tool": "get_simulation_status", "parameters": {}} ``` ### Bug Investigation & Performance Testing ```json {"tool": "get_debug_stats", "parameters": {}} {"tool": "search_debug_log", "parameters": {"pattern": "error|exception|fail", "max_lines": 5}} {"tool": "search_debug_log", "parameters": {"pattern": "MCP Server.*herramienta", "max_lines": 3}} {"tool": "execute_python", "parameters": {"code": "print([type(obj).__name__ for obj in objects[:5]])"}} {"tool": "get_simulation_status", "parameters": {}} ``` ### Debug Log Stress Testing 🔥 NEW ```json {"tool": "start_simulation", "parameters": {}} {"tool": "get_debug_stats", "parameters": {}} {"tool": "search_debug_log", "parameters": {"pattern": "Tanque.*Nivel|Bomba.*MaxFlow", "max_lines": 10}} {"tool": "stop_simulation", "parameters": {}} {"tool": "get_debug_stats", "parameters": {}} ``` ### System Recovery ```json {"tool": "stop_ctreditor", "parameters": {}} {"tool": "start_ctreditor", "parameters": {}} ``` ## 📊 Key Object Properties ### Python Debug Variables (CPython Environment) - **app**: MainViewModel (simulation state, canvas, objects) - **canvas**: MainCanvas (Width, Height, visual elements) - **objects**: ObservableCollection of all simulable objects - **get_objects()**: Returns List for easier manipulation **✅ CPython Integration Benefits:** - Consistent Python version across TSNet and MCP (3.12) - Better debugging with full CPython stack traces - Shared environment reduces memory footprint - Improved script execution reliability ### Hydraulic Components - **osHydTank**: `TankPressure`, `MaxLevel`, `MinLevel`, `IsFixedPressure` - **osHydPump**: `PumpHead`, `MaxFlow`, `SpeedRatio`, `IsRunning` - **osHydPipe**: `Length`, `Diameter`, `CurrentFlow`, `PressureDrop` ### Common Properties - **Position**: `Left`, `Top` (meters) - **Dimensions**: `Ancho`, `Alto` (meters) - **Connections**: `Id_ComponenteA`, `Id_ComponenteB` ## 🖼️ Screenshots ### Full Canvas ```json {"tool": "take_screenshot", "parameters": {}} ``` ### Targeted Area ```json {"tool": "take_screenshot", "parameters": { "x": 39.0, "y": 19.0, "width": 7.0, "height": 3.0 }} ``` ## 🔍 Debug Search Patterns **Validated patterns from stress testing with thousands of events:** ### High-Value Production Patterns - **Critical System**: `"error|exception|fail"` (max_lines=3) - **MCP Operations**: `"MCP Server.*herramienta|Cliente.*conectado"` (max_lines=5) - **Hydraulic System**: `"Tanque.*Nivel|Bomba.*MaxFlow|PIPE.*Apply"` (max_lines=10) - **Background Tasks**: `"3D Background|Timing adaptativo"` (max_lines=5) - **Performance**: `"fps|slow|memory|Simulation.*stopped"` (max_lines=3) ### Load Testing Patterns - **High-frequency events**: `"Tanque.*Nivel"` (thousands during simulation) - **Pipe processing**: `"PIPE.*ApplyHydraulicResults"` (continuous flow analysis) - **System timing**: `"Timing adaptativo.*reseteados"` (performance monitoring) ## 🐍 Python Debug Examples (CPython 3.12) ### Quick Inspections ```python # Object count by type types = {} for obj in objects: t = type(obj).__name__ types[t] = types.get(t, 0) + 1 print(types) # Canvas info print(f"Canvas: {canvas.Width}x{canvas.Height}") print(f"Simulation: {app.IsSimulationRunning}") # Find specific objects pumps = [obj for obj in objects if 'Pump' in str(type(obj))] print(f"Found {len(pumps)} pumps") # Advanced debugging with CPython features import json tank_data = { 'id': obj.Id, 'level': obj.TankLevel if hasattr(obj, 'TankLevel') else 'N/A' for obj in objects if 'Tank' in str(type(obj)) } print(json.dumps(tank_data, indent=2)) ``` **✅ CPython Advantages:** - Full Python standard library available - Better error messages and stack traces - Consistent behavior with TSNet scripts - Improved JSON serialization for complex data structures ## 📋 Debug System Validation Results **Stress Test Results (September 2025):** - ✅ **Buffer Capacity**: Successfully handled 1600+ events - ✅ **Circular Management**: Automatic cleanup maintains 1000-event limit - ✅ **Real-time Search**: Pattern matching works during high-load simulation - ✅ **Memory Safety**: No leaks observed during 41-second stress test - ✅ **Event Types Captured**: MCP operations, hydraulic calculations, system events - ✅ **Performance**: No degradation under continuous event generation **Common Event Categories Found in Production:** ``` [MCP Server] Nueva conexión aceptada [MCP Server] Ejecutando herramienta: search_debug_log Tanque Tanque Origen: Nivel=1,00m (50,0%), Flujo_neto=0,00L/min [PIPE] ApplyHydraulicResults for Tubería Hidráulica [3D Background] ✅ Imagen de fondo agregada con convenciones WPF-BEPU Timing adaptativo: Contadores y intervalos reseteados Bomba Bomba Hidráulica: MaxFlow establecido a 0,015000 m³/s ``` ## 🚨 Troubleshooting ### Debug Logging Issues ⚡ NEW ```json {"tool": "get_debug_stats", "parameters": {}} {"tool": "search_debug_log", "parameters": {"pattern": "MCP Server.*Error|Stack trace", "max_lines": 3}} {"tool": "clear_debug_buffer", "parameters": {}} ``` **Debug System Status Indicators:** - `current_log_count`: Current events in buffer (0-1000+) - `is_buffer_full`: true = circular buffer active (normal under load) - `cleanup_timer_enabled`: true = automatic memory management active ### Build Issues ```json {"tool": "get_ctreditor_status", "parameters": {}} {"tool": "stop_ctreditor", "parameters": {}} {"tool": "clean_project", "parameters": {}} {"tool": "build_project", "parameters": {}} ``` ### Python Execution Issues ⚡ NEW (Post-CPython Migration) ```json {"tool": "execute_python", "parameters": {"code": "import sys; print(f'Python: {sys.version}\\nPath: {sys.executable}')"}} {"tool": "python_help", "parameters": {}} {"tool": "get_debug_stats", "parameters": {}} ``` ### TSNet Execution Issues ⚡ **NEW September 2025** ```json {"tool": "execute_tsnet_direct", "parameters": {}} {"tool": "search_debug_log", "parameters": {"pattern": "VALIDACION ERROR|InitialLevelM|TSNet Direct", "max_lines": 10}} {"tool": "search_debug_log", "parameters": {"pattern": "Tanque.*debe estar entre", "max_lines": 5}} ``` **TSNet Direct Troubleshooting:** - **Validation errors**: Check tank level configurations with detailed debug logs - **Real vs Mock data**: `execute_tsnet_direct` uses actual C# objects, not Python mocks - **Enhanced debugging**: New validation logs show exact values being compared - **Tank configuration**: Logs display CurrentLevelM, MinLevelM, MaxLevelM with precision - **Bypass benefits**: Eliminates Python serialization issues and type conversion errors **Common CPython Migration Issues & Solutions:** - **Script timeout**: Default 30s limit - use shorter scripts or increase timeout - **Import errors**: All standard library modules now available (json, os, sys, etc.) - **Path issues**: TSNet environment automatically configured - **Variable return**: Use `return_variables` parameter for complex data structures - **Error debugging**: Full Python stack traces now available in error messages ### Connection Issues 1. Use `get_simulation_status` to test connectivity 2. Check CtrEditor is running with `get_ctreditor_status` 3. Verify MCP server is active on port 5006 ### MCP Client Issues - **Red LED in Cursor**: Proxy now handles all standard MCP methods correctly - **Connection timeout**: CtrEditor must be running for tool calls to work - **Build errors**: Use `build_project` to see only error output ## 💡 Best Practices ### Debug Logging Best Practices ⚡ NEW - **Monitoring buffer health**: Use `get_debug_stats` to check system status - **Efficient searching**: Use specific regex patterns with low max_lines (3-10) - **Load testing**: Start simulation to generate thousands of events safely - **Buffer management**: System automatically maintains 1000-event limit - **Memory safety**: Circular buffer prevents memory leaks under heavy load - **Performance**: Validated to handle 1600+ events without degradation ### General Best Practices - Always use `get_simulation_status` before expensive operations - Call `list_objects` only when object data is actually needed - **ENHANCED**: Use `execute_python` for quick object inspections instead of `list_objects` - Stop simulation before major structural changes - Use appropriate units: meters, Pascal, m³/s - **Python scripts**: Keep under 30 seconds, use `return_variables` for results - **Debug logs**: Available automatically from app start, no setup required - **Production ready**: Debug system validated for high-load environments - **CPython Integration**: Leverage full Python 3.12 capabilities for advanced debugging - **Unified Environment**: Same Python runtime used for TSNet ensures consistency - Proxy works with both Claude Desktop and Cursor (MCP 2025-06-18)