validate_simulation_deck
Validate ECLIPSE simulation decks by checking INCLUDE file references, identifying missing files, and optionally creating complete archives for sharing or archiving.
Instructions
Validate and process ECLIPSE simulation deck with INCLUDE files.
DECK MANAGEMENT TOOL - Recursively process ECLIPSE/Intersect simulation decks to find all INCLUDE files, validate references, and optionally create a complete archive.
What It Does:
Parses main DATA file for INCLUDE keywords
Recursively follows INCLUDE chains
Validates all referenced files exist
Identifies missing or broken references
Optionally creates zip archive with all files
Applications:
Deck Validation: Ensure all files present before submission
Deck Transfer: Create complete archive for sharing
Version Control: Bundle all files for archiving
QC Check: Verify deck completeness before cluster runs
Workflow:
Specify main DATA file(s) to check
Tool recursively finds all INCLUDE files
Validates each file exists
Reports missing files or broken paths
Optionally creates zip with all referenced files
INCLUDE File Support:
Absolute paths: /full/path/to/file.inc
Relative paths: ../INCLUDE/GRID.GRDECL
Same directory: SCHEDULE.INC
Nested INCLUDE chains: INCLUDE files that reference other INCLUDE files
Output Formats:
Summary of all files found
List of missing/broken references
Optional: ZIP archive with complete deck
Args: request: List of DATA files, zip option, console output preference
Returns: Dictionary with file inventory, validation results, and optional zip path
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes |
Implementation Reference
- Handler function decorated with @mcp.tool() that implements the core logic: parses simulation decks, validates INCLUDE files recursively, checks for missing files, and optionally creates a ZIP archive.@mcp.tool() def validate_simulation_deck(request: ZipSimDeckRequest) -> dict: """Validate and process ECLIPSE simulation deck with INCLUDE files. **DECK MANAGEMENT TOOL** - Recursively process ECLIPSE/Intersect simulation decks to find all INCLUDE files, validate references, and optionally create a complete archive. **What It Does:** - Parses main DATA file for INCLUDE keywords - Recursively follows INCLUDE chains - Validates all referenced files exist - Identifies missing or broken references - Optionally creates zip archive with all files **Applications:** - **Deck Validation:** Ensure all files present before submission - **Deck Transfer:** Create complete archive for sharing - **Version Control:** Bundle all files for archiving - **QC Check:** Verify deck completeness before cluster runs **Workflow:** 1. Specify main DATA file(s) to check 2. Tool recursively finds all INCLUDE files 3. Validates each file exists 4. Reports missing files or broken paths 5. Optionally creates zip with all referenced files **INCLUDE File Support:** - Absolute paths: /full/path/to/file.inc - Relative paths: ../INCLUDE/GRID.GRDECL - Same directory: SCHEDULE.INC - Nested INCLUDE chains: INCLUDE files that reference other INCLUDE files **Output Formats:** - Summary of all files found - List of missing/broken references - Optional: ZIP archive with complete deck Args: request: List of DATA files, zip option, console output preference Returns: Dictionary with file inventory, validation results, and optional zip path """ try: # Process simulation deck results = simtools.zip_check_sim_deck( files2scrape=request.files2scrape, tozip=request.tozip, console_summary=request.console_summary ) # Parse results (format depends on pyrestoolbox implementation) if isinstance(results, dict): found_files = results.get("found_files", []) missing_files = results.get("missing_files", []) zip_path = results.get("zip_path", None) else: # If results is a list of files found_files = results if isinstance(results, list) else [] missing_files = [] zip_path = None return { "deck_validation": { "main_files": request.files2scrape, "total_files_found": len(found_files), "total_files_missing": len(missing_files), "status": "VALID" if len(missing_files) == 0 else "INCOMPLETE", }, "found_files": found_files, "missing_files": missing_files, "zip_archive": zip_path if request.tozip else None, "method": "Recursive INCLUDE file parsing", "inputs": request.model_dump(), "note": "All referenced files must exist for successful simulation run", } except FileNotFoundError as e: return { "error": f"Main deck file not found: {e}", "suggestion": "Verify paths to DATA files are correct", "inputs": request.model_dump(), } except Exception as e: return { "error": str(e), "inputs": request.model_dump(), }
- Pydantic BaseModel defining the input parameters for the tool: files2scrape (list of main DATA files), tozip (create archive), console_summary.class ZipSimDeckRequest(BaseModel): """Request model for simulation deck file checking.""" model_config = ConfigDict( json_schema_extra={ "example": { "files2scrape": ["CASE.DATA"], "tozip": False, "console_summary": True, } } ) files2scrape: List[str] = Field(..., min_length=1, description="List of deck files to process (e.g., ['CASE.DATA'])") tozip: bool = Field(False, description="Create zip archive of all referenced files") console_summary: bool = Field(True, description="Print summary to console")
- src/pyrestoolbox_mcp/server.py:27-27 (registration)Call to register_simtools_tools(mcp) in the main server.py, which registers all simtools including validate_simulation_deck via its @mcp.tool() decorator.register_simtools_tools(mcp)