An MCP server for DAFoam (Discrete Adjoint based on OpenFOAM) providing tools for aerodynamic mesh generation, CFD simulation, and optimization for airfoil and wing geometries
19 tools with STDIO transport and partial schema coverage. Tool naming is consistent (verb_noun format: airfoil_generate_mesh, wing_run_cfd_simulation) and action-oriented, which is good. However, descriptions vary significantly in quality, some are detailed (airfoil_generate_mesh: 195 chars with inputs/outputs documented), while others are bare (wing_view_mesh: 52 chars with no input documentation). Input schemas are present for most tools but incomplete: parameters lack type constraints (enums, min/max bounds), and output schemas are entirely absent. No error handling guidance, no recovery hints, and no parameter relationship documentation. The server suppresses logging ('logging.basicConfig(level=logging.CRITICAL)'), which aligns with the move away from deprecated Logging patterns, but no structured error responses are visible in the code sample. Airfoil and wing modules have significant redundancy (view_mesh, view_flow_field, view_pressure_profile, view_residual, view_function, view_optimization_history duplicated across modules), no composition guidance linking tool outputs to downstream tool inputs. Overall, definitions meet minimum MCP standards but fall short of production-grade tool design.
Airfoil module: Generate the airfoil mesh. Call airfoil_view_mesh after airfoil_generate_mesh to plot the mesh image image_airfoil_mesh.png
Airfoil module: Run CFD simulation/analysis to compute airfoil flow fields, such as velocity, pressure, and temperature.
Airfoil module: Run CFD-based aerodynamic optimization. Objective: drag coefficient. Design variables: airfoil shape and angle of attack. Constraints: lift, thickness, volume, and leading edge radius. NOTE: other optimization formulations are not supported at this moment!
Airfoil module: Plot the flow field variable (velocity, pressure, temperature, etc.) at a given iteration. The plot will be saved to plots/airfoil_flow_field_<iter>.png
Airfoil module: Plot the convergence history of aerodynamic functions (CD, CL, CM) from the CFD simulation. Plots are saved to plots/airfoil_function_cd.png, plots/airfoil_function_cl.png, and plots/airfoil_function_cm.png
Airfoil module: View and plot the mesh. Plot three views: overall, leading edge, and trailing edge. Save plots to plots/airfoil_mesh_overview.png, plots/airfoil_mesh_le.png, and plots/airfoil_mesh_te.png
Output schemas entirely absent. No tool documents what fields/structure it returns. LLMs cannot plan downstream tool calls or extract required data for follow-up operations.
Parameter constraints missing (enums, min/max bounds). Numeric parameters unbounded (mesh_cells, mach_number, reynolds_number, cpu_cores can accept any value). String parameters accept free-form input (airfoil_profile, wing_name, flow_field should be enums).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 34 | - | v1 |
Airfoil module: Plot the optimization history for CD, CL, angle of attack, and shape variables from the .hst file. Plots are saved to plots/airfoil_opt_hst_*.png
Airfoil module: Plot the pressure coefficient distribution on the airfoil surface for a given time step. Plots are saved to plots/airfoil_pressure_profile_<iter>.png
Airfoil module: Plot the convergence history of residuals for CFD simulation and adjoint solver. Plots are saved to plots/airfoil_residual_cfd.png and plots/airfoil_residual_adjoint.png
Check whether the cfd simulation or optimization finished
Wing module: Generate the wing mesh. Call wing_view_mesh after wing_generate_mesh to plot the mesh image
Wing module: Run CFD simulation/analysis to compute wing flow fields, such as velocity, pressure, and temperature.
Wing module: Run CFD-based aerodynamic optimization for wing geometry.
Wing module: Plot the flow field variable at a given iteration
Wing module: Plot the convergence history of aerodynamic functions (CD, CL, CM)
Wing module: View and plot the wing mesh. Plot multiple views and save plots to plots/ directory
Wing module: Plot the optimization history from the .hst file
Wing module: Plot the pressure coefficient distribution on the wing surface
Wing module: Plot the convergence history of residuals for CFD simulation and adjoint solver
Inconsistent and minimal descriptions across wing module. airfoil_generate_mesh documents outputs (195 chars, excellent); wing_generate_mesh is 60 chars with no output details. airfoil_run_optimization documents constraints/objectives (180 chars); wing_run_optimization is 50 chars with none. wing_view_* tools average 50 - 60 chars, lack examples, and omit guidance on when to call them.
No error handling or recovery guidance. Code suppresses logging (logging.basicConfig(level=logging.CRITICAL)) and subprocess calls have 'check=True' (raises CalledProcessError on failure) but no try/except beyond airfoil_generate_mesh sample. LLM receives raw stack traces or exit codes with no actionable guidance.
Redundant tool pairs across airfoil/wing modules (view_mesh, view_flow_field, view_pressure_profile, view_residual, view_function, view_optimization_history duplicated). No composition guidance linking outputs. E.g., airfoil_view_mesh mentions 'Call airfoil_view_mesh after airfoil_generate_mesh' but doesn't document what files it reads or what the output PNG paths enable downstream.
Parameter descriptions lack format/constraint details. log_file parameters (airfoil_view_residual, wing_view_residual, etc.) document default 'log_cfd_simulation.txt' but don't clarify: is this a relative path? Absolute? In what directory? Same for hist_file, wing_name, airfoil_profile.
Special parameter values inconsistently documented. time_step=-1 (plot all), end_time_cfd=-1 (plot to end), same semantic, different naming across tools. Not documented in schema or consistently explained in descriptions. LLM must infer behavior.