Skip to main content
Glama

CFD FastAPI Server

將 2D 翼型空氣動力分析包裝成一般 FastAPI HTTP API,讓前端、腳本或其他服務可以直接呼叫完整的「幾何 → 網格 → 求解 → 後處理 → 視覺化」流程。

Client ──▶ FastAPI Server ──▶ aerosandbox / NeuralFoil / SU2
                              └─▶ Cp 分布 / 極曲線 / dashboard / artifact downloads

功能

API

功能

POST /api/geometry/airfoil

從 NACA 4/5 位數代碼生成翼型座標 (.dat)

POST /api/meshes/2d

生成 2D 網格,支援 placeholder 與 SU2/Gmsh

POST /api/solver/run

執行 NeuralFoil,或提交非同步 SU2 求解

GET /api/solver/results/{job_id}

查詢 job 狀態;完成後回傳 CL / CD / CM / Cpmin / 轉捩點

POST /api/workflow/airfoil

一次完成 geometry -> mesh -> solver;SU2 只提交背景求解

POST /api/visualizations

生成視覺化 artifact metadata

GET /artifacts/{artifact_id}

在瀏覽器 inline 預覽視覺化圖檔

GET /artifacts/{artifact_id}/download

下載視覺化圖檔

/mcp/

Streamable HTTP MCP endpoint,提供同一套 CFD workflow tools

視覺化模式

plot_kind

內容

summary

翼型形狀 + 結果數字

cp

沿翼型表面真 Cp 分布

polar

CL/CD vs alpha 雙軸極曲線

drag_polar

CL vs CD 拖力極曲線

mesh

網格預覽圖

dashboard

綜合 dashboard 與網格預覽

mach

馬赫數分佈圖 (SU2)

pressure

壓力分佈圖 (SU2)

POST /api/visualizations 會回傳:

{
  "status": "success",
  "summary": "...",
  "artifact": {
    "artifact_id": "vis_abc123",
    "filename": "dashboard_vis_abc123.jpg",
    "mimeType": "image/jpeg",
    "size_bytes": 170868
  }
}

圖檔不直接塞進 JSON body,而是落地成 artifact。用回傳的 artifact_idGET /artifacts/{artifact_id} 在瀏覽器預覽,或組 GET /artifacts/{artifact_id}/download 下載。

HTTP API 只回傳資源 id,不回傳伺服器端檔案路徑。手動流程請依序傳遞 geometry_idmesh_idjob_idartifact_id

SU2 求解是非同步工作。POST /api/solver/runPOST /api/workflow/airfoil 使用 solver_backend="su2" 時會回傳 status: "submitted"job_id;之後用 GET /api/solver/results/{job_id} 輪詢,直到狀態變成 convergedfailed。NeuralFoil surrogate 仍同步回傳結果。

Related MCP server: OpenVSP MCP Server

快速開始

環境需求

  • Python 3.11+

  • uv

本機啟動

uv sync
uv run python -m cfd_server

啟動後可用:

  • Swagger UI: http://localhost:8765/docs

  • OpenAPI: http://localhost:8765/openapi.json

  • Health check: http://localhost:8765/healthz

  • MCP endpoint: http://localhost:8765/mcp/

執行測試

uv run --group dev pytest

Docker

docker build -t cfd-server:su2-local .
docker run --rm -p 8765:8765 -v "$PWD/jobs:/app/jobs" cfd-server:su2-local

檢查 SU2 與 Gmsh:

docker run --rm cfd-server:su2-local SU2_CFD --help
docker run --rm cfd-server:su2-local gmsh --version

Docker Compose

docker compose up --build cfd-server

API 範例

建立翼型

curl -X POST http://localhost:8765/api/geometry/airfoil \
  -H "content-type: application/json" \
  -d '{
    "naca_code": "0012",
    "chord_length": 1.0,
    "n_points_per_side": 180,
    "normalize_geometry": true
  }'

一鍵工作流

curl -X POST http://localhost:8765/api/workflow/airfoil \
  -H "content-type: application/json" \
  -d '{
    "naca_code": "0012",
    "velocity": 30.0,
    "angle_of_attack": 5.0,
    "solver_backend": "neuralfoil"
  }'

SU2 一鍵工作流會先產生 SU2/Gmsh mesh,然後提交背景求解:

curl -X POST http://localhost:8765/api/workflow/airfoil \
  -H "content-type: application/json" \
  -d '{
    "naca_code": "0012",
    "velocity": 30.0,
    "angle_of_attack": 5.0,
    "mesh_format": "su2",
    "solver_backend": "su2",
    "max_iterations": 500
  }'

查詢背景求解:

curl http://localhost:8765/api/solver/results/06936164e5a7

視覺化

curl -X POST http://localhost:8765/api/visualizations \
  -H "content-type: application/json" \
  -d '{
    "job_id": "06936164e5a7",
    "plot_kind": "dashboard",
    "image_format": "jpeg"
  }'

MCP

這個服務現在同時提供 Streamable HTTP MCP,直接重用現有 service layer,不需要另外維護第二套 CFD 邏輯。

MCP tools:

  • generate_airfoil_geometry

  • generate_2d_mesh

  • run_cfd_solver

  • check_solver_results

  • run_airfoil_workflow

  • visualize_cfd_results

  • get_visualization_artifact

本機啟動 HTTP + MCP:

uv run python -m cfd_server

用 MCP Inspector 連線:

npx -y @modelcontextprotocol/inspector

連到:

http://localhost:8765/mcp/

如果你要用 stdio 模式直接跑 MCP server:

uv run python -m cfd_server.app.interfaces.mcp.server

測試

  • tests/conftest.py: 共用 FastAPI TestClient 與 workflow fixture

  • tests/test_http_workflow.py: 幾何、網格、求解、結果查詢、路由註冊

  • tests/test_async_su2_solver.py: SU2 非同步提交與狀態轉換

  • tests/test_visualization_artifacts.py: artifact metadata 與落地檔案

  • tests/test_artifact_download.py: artifact HTTP download endpoint

  • tests/test_su2_config.py: SU2 config 單元測試

專案結構

cfd-server/
├── cfd_server/
│   ├── __main__.py
│   ├── app/
│   │   ├── interfaces/
│   │   │   └── http/        # FastAPI app, routers, request schemas
│   │   └── services/        # workflow / visualization service layer
│   ├── server.py            # 相容 wrapper
│   ├── core/
│   ├── mesh/
│   ├── solvers/
│   ├── visualization/
│   └── models/
├── tests/
├── pyproject.toml
├── Dockerfile
└── README.md

Available Tools

7 tools
check_solver_resultsA

Check the current status and coefficients for an existing CFD job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesjob_id returned by run_cfd_solver or run_airfoil_workflow.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the tool 'checks' status and coefficients, implying a read-only operation, but does not explicitly mention that it is non-destructive, how it behaves if the job does not exist, or any polling/blocking behavior. This lack of detail leaves significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, front-loaded with the action ('Check') and efficiently conveys the tool's purpose without unnecessary words. Every word contributes to meaning, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and an output schema, the description is minimally adequate, but it lacks guidance on when to use it relative to siblings and does not disclose behavioral specifics (e.g., job lifecycle). The schema covers parameters and output, but the absence of annotations and usage context makes it less complete than ideal.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for the single parameter job_id, with a helpful description indicating it is returned by run_cfd_solver or run_airfoil_workflow. This provides meaning beyond the parameter name, but the tool description itself adds no additional parameter semantics, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks the current status and coefficients of an existing CFD job, using a specific verb ('Check') and resource ('current status and coefficients'). This distinguishes it from sibling tools that generate geometry, mesh, run the solver, visualize results, or get visualization artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than explicitly stated. The mention of 'existing CFD job' suggests it should be used after a job is created, and the parameter description clarifies that job_id comes from run_cfd_solver or run_airfoil_workflow. However, there is no explicit 'use this when' or exclusion of alternatives, relying on the agent to infer the workflow order.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_2d_meshA

Generate a 2D mesh from a geometry_id for NeuralFoil or SU2 workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
domain_sizeNoFarfield domain size in chord lengths.
geometry_idYesgeometry_id returned by generate_airfoil_geometry.
growth_rateNoBoundary-layer growth ratio between successive inflation layers.
mesh_formatNoMesh format. Use 'placeholder' for NeuralFoil or 'su2' for solver-effective meshes.placeholder
wake_lengthNoWake extension length downstream of the trailing edge in chord lengths.
mesh_densityNoMesh density preset: coarse, medium, or fine.medium
target_y_plusNoTarget wall y+ used to infer first_cell_height for SU2 meshes.
surface_pointsNoNumber of discretization points placed around the airfoil surface.
first_cell_heightNoFirst boundary-layer cell height in chord units.
gmsh_timeout_secondsNoMaximum wall-clock time allowed for the Gmsh subprocess.
boundary_layer_layersNoNumber of boundary-layer inflation layers for SU2/Gmsh meshes.
reference_reynolds_numberNoReference Reynolds number used with target_y_plus to infer first_cell_height.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It only says 'Generate a 2D mesh' and does not mention that it invokes a Gmsh subprocess, can be time-consuming, or has side effects like creating mesh files. The output format and dependencies (e.g., valid geometry_id) are not described, leaving a significant transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence (15 words) that starts with action and object. It contains no filler and effectively communicates the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 12 parameters and no annotations, the description should provide more high-level context about prerequisites, runtime, and workflow position. It mentions geometry_id but does not explicitly state that the geometry must be generated first or that this mesh is required for subsequent solver calls. The output schema exists, mitigating the need to describe return values, but gaps in workflow context remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with detailed descriptions (e.g., domain_size, growth_rate, target_y_plus). The tool description adds only the workflow context and mentions geometry_id, which is already in the schema. Since the schema does the heavy lifting, the description provides marginal added value, fitting the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: generating a 2D mesh from a geometry_id for NeuralFoil or SU2 workflows. It uses a specific verb ('Generate') and resource ('2D mesh'), and the mention of geometry_id distinguishes it from geometry-generation and solver tools. The sibling tools reinforce its role as the meshing step in the pipeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used after generate_airfoil_geometry (via geometry_id) and before solver tools (for NeuralFoil or SU2 workflows). It provides context but does not explicitly state when not to use it or name alternatives. The guidance is clear enough for an agent familiar with the workflow, but lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_airfoil_geometryB

Generate a NACA 4/5-digit airfoil geometry and return a reusable geometry_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
naca_codeYesNACA 4- or 5-digit airfoil code, for example '0012' or '23012'.
chord_lengthNoAirfoil chord length in meters.
n_points_per_sideNoNumber of coordinate points sampled on each airfoil side.
normalize_geometryNoNormalize the generated airfoil to unit chord before scaling.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, but it only states the basic action and output. It does not disclose side effects, persistence behavior, error conditions, or safety aspects, beyond implying the geometry is stored for reuse.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that front-loads the primary action and output, with no unnecessary detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (four parameters) and the presence of detailed parameter schemas and an output schema, the description is mostly sufficient. The only gap is the lack of usage guidance, which is already penalized in that dimension.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds no additional parameter meaning, aligning with the baseline of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's action: 'Generate a NACA 4/5-digit airfoil geometry' and the output: 'return a reusable geometry_id'. This specific verb and resource distinguish it from sibling tools like mesh generation or solving.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description does not mention downstream steps, exclusions, or prerequisites, leaving the agent to infer usage from the tool's name and the mention of a 'reusable geometry_id'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_visualization_artifactB

Load a previously generated visualization artifact as an MCP image result.

ParametersJSON Schema
NameRequiredDescriptionDefault
artifact_idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does disclose the output behavior (MCP image result), but it does not mention related traits such as whether the artifact is consumed, what happens if the ID is invalid, or any prerequisites. This is minimal but non-contradictory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no unnecessary words. Every element contributes to understanding the tool's function and output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is too sparse for a tool in a multi-step workflow. It lacks context about where the artifact comes from (likely from visualize_cfd_results), what to do if the artifact doesn't exist, and how the returned MCP image result should be used. The absence of an output schema and annotations increases the need for descriptive context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has one required parameter (artifact_id) with 0% schema description coverage. The description does not elaborate on what artifact_id means, how to obtain it, or any format expectations, completely failing to compensate for the missing schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool loads a previously generated visualization artifact and converts it to an MCP image result. This specific verb-resource pairing distinguishes it from sibling tools like visualize_cfd_results, which generate artifacts, while this one retrieves them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'previously generated' implies usage after a generation step, but it does not explicitly mention when to use this tool vs alternatives, nor does it exclude scenarios. There is no explicit guidance or naming of prerequisite tools like visualize_cfd_results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_airfoil_workflowB

Run geometry, mesh generation, and CFD as one MCP tool call.

ParametersJSON Schema
NameRequiredDescriptionDefault
machNoOptional Mach number override. If omitted, it is computed from velocity and speed_of_sound.
velocityYesFreestream velocity in meters per second.
naca_codeYesNACA 4- or 5-digit airfoil code, for example '0012' or '23012'.
cfl_numberNoSU2 CFL number.
domain_sizeNoFarfield domain size in chord lengths.
growth_rateNoBoundary-layer growth ratio between successive inflation layers.
mesh_formatNoMesh format. Use 'placeholder' for NeuralFoil or 'su2' for solver-effective meshes.placeholder
wake_lengthNoWake extension length downstream of the trailing edge in chord lengths.
chord_lengthNoAirfoil chord length in meters.
mesh_densityNoMesh density preset: coarse, medium, or fine.medium
low_mach_precNoEnable SU2 low-Mach preconditioning.
target_y_plusNoTarget wall y+ used to infer first_cell_height for SU2 meshes.
max_iterationsNoMaximum nonlinear iterations for the selected solver backend.
solver_backendNoSolver backend: 'neuralfoil' or 'su2'.neuralfoil
surface_pointsNoNumber of discretization points placed around the airfoil surface.
angle_of_attackYesAngle of attack in degrees.
reynolds_numberNoOptional Reynolds number override. If omitted, it is computed from velocity and chord.
turbulence_modelNoSU2 flow model: EULER, NAVIER_STOKES, or RANS.RANS
first_cell_heightNoFirst boundary-layer cell height in chord units.
n_points_per_sideNoNumber of coordinate points sampled on each airfoil side.
normalize_geometryNoNormalize the generated airfoil to unit chord before scaling.
su2_timeout_secondsNoMaximum wall-clock time allowed for the SU2 subprocess.
convergence_residualNoSU2 convergence target expressed as log10 residual.
gmsh_timeout_secondsNoMaximum wall-clock time allowed for the Gmsh subprocess.
boundary_layer_layersNoNumber of boundary-layer inflation layers for SU2/Gmsh meshes.
reference_reynolds_numberNoReference Reynolds number used with target_y_plus to infer first_cell_height.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must disclose behavioral traits, but it only lists the three steps without mentioning runtime expectations, resource consumption, side effects like intermediate file writes, or any caveats about the workflow. For a complex multi-stage tool, this is a significant transparency gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence that efficiently communicates the core purpose without any redundant or irrelevant information. It is appropriately front-loaded and concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having a full input schema and an output schema, the description is far too sparse for a tool orchestrating three complex simulation stages. It omits any information about what the workflow returns, expected execution time, or how it differs from chaining the sibling tools manually, leaving substantial gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents all 26 parameters with descriptions, so the baseline is 3. The description adds no extra semantic context about how parameters relate to the workflow or any non-obvious interactions, but the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool runs a composite workflow of geometry generation, mesh generation, and CFD simulation in one MCP call. It distinguishes itself from sibling tools like generate_airfoil_geometry and run_cfd_solver by being the aggregate workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus invoking the sibling tools separately. It does not mention scenarios where a full workflow is preferred or when individual steps should be used instead, leaving usage entirely implied by the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_cfd_solverC

Run NeuralFoil synchronously or submit an SU2 background job from a mesh_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
machNoOptional Mach number override. If omitted, it is computed from velocity and speed_of_sound.
n_critNoNeuralFoil e^N critical amplification factor.
mesh_idYesmesh_id returned by generate_2d_mesh.
velocityYesFreestream velocity in meters per second.
xtr_lowerNoForced transition location on the lower surface as x/c in [0, 1].
xtr_upperNoForced transition location on the upper surface as x/c in [0, 1].
cfl_numberNoSU2 CFL number.
model_sizeNoNeuralFoil surrogate model size preset.large
low_mach_precNoEnable SU2 low-Mach preconditioning.
max_iterationsNoMaximum nonlinear iterations for the selected solver backend.
solver_backendNoSolver backend: 'neuralfoil' or 'su2'.neuralfoil
speed_of_soundNoSpeed of sound in meters per second used to compute Mach.
angle_of_attackYesAngle of attack in degrees.
reynolds_numberNoOptional Reynolds number override. If omitted, it is computed from velocity and chord.
turbulence_modelNoSU2 flow model: EULER, NAVIER_STOKES, or RANS.RANS
kinematic_viscosityNoFluid kinematic viscosity in square meters per second.
su2_timeout_secondsNoMaximum wall-clock time allowed for the SU2 subprocess.
convergence_residualNoSU2 convergence target expressed as log10 residual.
include_360_deg_effectsNoEnable NeuralFoil's 360-degree post-stall correction model.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses synchronous execution for NeuralFoil and background job submission for SU2, but omits side effects, job lifecycle, result retrieval mechanisms, and failure behavior. This is minimal behavioral context for a complex solver tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no wasted words, front-loading the verb and backend modes. However, given the tool's complexity, the brevity borders on under-specification rather than elegant conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a high-complexity tool with 19 parameters, dual backend modes, and asynchronous behavior, yet the description is one sentence. It does not explain the background job workflow, how results are obtained, or tie into sibling tools like check_solver_results. The presence of an output schema helps but does not compensate for missing operational context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 19 parameters have detailed schema descriptions (100% coverage), so the baseline is 3. The description adds only backend-mode context (synchronous vs. background), which is useful but does not significantly enhance parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Run' and clearly names 'NeuralFoil' and 'SU2' backends, scoped 'from a mesh_id.' It does not explicitly differentiate from sibling tools like run_airfoil_workflow or check_solver_results, but the core purpose is identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or alternative guidance is provided. The phrase 'from a mesh_id' implies a prerequisite, but there is no instruction on choosing between NeuralFoil and SU2 backends or how this relates to run_airfoil_workflow or check_solver_results.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

visualize_cfd_resultsA

Create a visualization artifact for a converged job and return its artifact_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesjob_id returned by run_cfd_solver or run_airfoil_workflow.
alpha_maxNoMaximum angle of attack in degrees for sweep-based plots.
alpha_minNoMinimum angle of attack in degrees for sweep-based plots.
plot_kindNoVisualization type: dashboard, cp, polar, drag_polar, summary, mesh, field, mach, or pressure.dashboard
alpha_pointsNoNumber of angle-of-attack samples used for sweep-based plots.
image_formatNoOutput artifact format: png or jpeg.jpeg

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden. It clearly states the tool creates an artifact and returns its artifact_id, which is a key behavioral trait. However, it does not disclose potential limitations, error conditions (e.g., what happens if the job is not converged), or persistence details. This is adequate for a simple creation tool but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that states the action, condition, and return value without any filler. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (6 params) and the existence of an output schema (which likely documents the artifact_id return), the description is sufficient for an agent to select and invoke the tool. The only minor gap is the lack of explicit relationship to sibling tools like get_visualization_artifact for retrieving the artifact, but this is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides 100% coverage with descriptions for all six parameters. The description adds no additional parameter semantics beyond what the schema already states, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Create') and a clear resource ('a visualization artifact for a converged job'), and explicitly mentions returning an 'artifact_id'. It clearly distinguishes from siblings like get_visualization_artifact (which retrieves) and run_cfd_solver (which runs the simulation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for a converged job' implies the tool should be used after a solver job has completed, but there is no explicit mention of when not to use it or alternatives. The job_id parameter description in the schema provides more context, but the description itself offers limited usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 7 tool updatesv0.1.0
    • First observedcheck_solver_results
    • First observedgenerate_2d_mesh
    • First observedgenerate_airfoil_geometry
    • First observedget_visualization_artifact
    • First observedrun_airfoil_workflow
    • First observedrun_cfd_solver
    • First observedvisualize_cfd_results

TDQS

A3.7/5.0
Disambiguation5/5

Each tool maps to a distinct stage of the CFD workflow: geometry, meshing, solver execution, status checking, combined workflow, visualization, and artifact retrieval. The only near-overlap is run_cfd_solver versus run_airfoil_workflow, but their descriptions clearly separate step-by-step execution from end-to-end orchestration.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case (generate_, run_, check_, visualize_, get_). This uniformity makes the toolset predictable and easy to navigate.

Tool Count5/5

Seven tools is well-scoped for an airfoil CFD pipeline, covering geometry generation, meshing, solver execution, result checking, visualization, and artifact retrieval without redundancy. Each tool earns its place.

Completeness5/5

The set covers the entire airfoil simulation lifecycle from geometry generation through visualization and artifact access. The inclusion of a combined workflow tool fills a potential gap for users who want a single-call solution. No essential operation appears missing.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/DaveFan-NCHC/MCP-Server-for-CFD'

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