Skip to main content
Glama

avl-mcp

Run reproducible AVL aerodynamic analyses through the Model Context Protocol. The server validates input, runs AVL in an isolated directory, and returns structured results with the original solver files.

Version: 0.2.0. Supports AVL 3.52 only. Native execution is tested on macOS Apple Silicon; other operating systems are not yet verified. This project is an independent wrapper, not an official MIT or AVL release.

繁體中文說明 · Validation

Tools

Tool

Purpose

avl.health

Diagnose Python/native installation, directory access and headless startup

avl.inspect

Read geometry, references, controls and file dependencies

avl.validate

Check supported grammar, dependency paths and mesh budget

avl.run

Calculate one prescribed condition, loads and ST/SB derivatives

avl.sweep

Calculate 1-10000 explicit conditions with shared AVL processes and save CSV

avl.submit

Snapshot inputs and start a detached background job

avl.status

Read progress, counts and the actual job outcome

avl.cancel

Cancel a queued/running job while retaining completed cases

avl.resume

Verify saved inputs/results and recompute only missing or failed cases

avl.results

Page and filter saved results without running AVL

The connector does not expose trim, eigenmodes, geometry editing, interactive graphics, CAD conversion, or automatic OpenVSP comparison. The model validator checks input structure and basic invariants; it does not prove freedom from intersections or aerodynamic suitability. A successful process exit alone is never accepted as a result.

Related MCP server: OpenVSP MCP Server

Installation

Requirements: Python 3.11 or newer and a separately installed AVL 3.52 executable. The Python package does not download or bundle AVL, install system libraries, or modify any MCP client configuration.

python3 -m venv /absolute/local/path/avl-mcp-env
/absolute/local/path/avl-mcp-env/bin/python -m pip install .
/absolute/local/path/avl-mcp-env/bin/avl-mcp --version

For development, install .[dev] in a local environment. Build release artifacts with python -m build; install the resulting wheel for the stdio acceptance test. Keep virtual environments and native libraries on each machine's local disk. Research inputs, results and logs can be stored in a separate project directory.

A compatible prebuilt AVL 3.52 executable can also be used; compiling AVL is not an inherent MCP requirement. See native installation. The v0.2.0 release contains the Python wheel, source distribution and checksums; AVL remains a separate installation.

Building AVL on macOS Apple Silicon

The upstream 3.52 source archive is available at https://web.mit.edu/drela/Public/web/avl/avl3.52.tgz. The archive used for this release has SHA-256 0b588ecea9222f5b625d0af0c87ae31daf3cdba1532cf0bbb36f93d6e854849b.

Upstream requires Fortran/C compilers, a plotting library and numerical libraries. This project includes a helper for a task-local conda-forge environment containing gfortran_osx-arm64=14, xorg-libx11, and xorg-xorgproto. The last package provides the X11 protocol headers needed at build time. Xcode Command Line Tools must already be available. A platform-specific dependency lock records the tested compiler environment in docs/native-dependencies-osx-arm64.lock.

python scripts/build_avl_macos.py \
  --source /absolute/path/to/extracted/AVL3.52rel09032025 \
  --compiler-prefix /absolute/local/path/to/compiler-environment \
  --logs /absolute/path/to/project/logs

The helper modifies only the disposable build copy's plot-library configuration, and overrides compiler/linker flags. It does not patch the numerical solver. scripts/bundle_avl_macos.py can collect the required dylibs into a new local directory and update their relative load paths. The current execution path disables graphics, so a running X server is not required. X11 libraries remain link dependencies. Interactive plotting is not tested or exposed by this MCP.

MCP client configuration

Example Codex configuration, using absolute paths chosen for your machine:

[mcp_servers.avl]
command = "/absolute/local/path/avl-mcp-env/bin/avl-mcp"
args = [
  "--avl-bin", "/absolute/local/path/avl-3.52/bin/avl",
  "--work-root", "/absolute/path/to/project/AVL",
  "--input-root", "/absolute/path/to/approved/model-directory"
]
tool_timeout_sec = 660

--input-root is optional. If supplied, model files must resolve inside that root. Dependencies must remain inside the model's own directory, even without this option. For synchronous calls, set the client timeout above the requested analysis time budget. For long analyses, use avl.submit; its short response does not wait for the solver. Equivalent environment variables are AVL_BIN, AVL_MCP_WORK_ROOT, and AVL_MCP_INPUT_ROOT. The default budget is 5,000 estimated vortices per case; --max-vortices can explicitly raise it up to 20,000. This is an estimate, not a RAM guarantee.

Installing a wheel and testing a standalone MCP process do not register tools in an already running desktop session. Client registration/reload is a separate step.

For connection troubleshooting, run avl-mcp --diagnose or avl-mcp --check-mcp with the same AVL/work-root arguments. They print structured evidence without changing client settings. Diagnostic layers and workflow distinguish native startup, numerical tests, fresh stdio and desktop registration.

Example requests

Inspect an official example:

{"model_path": "/absolute/path/to/avl-mcp/examples/official/vanilla/vanilla.avl"}

Run a prescribed condition with avl.run:

{
  "model_path": "/absolute/path/to/vanilla.avl",
  "condition": {
    "alpha_deg": 3.0,
    "beta_deg": 0.0,
    "mach": 0.2,
    "pb_2v": 0.0,
    "qc_2v": 0.0,
    "rb_2v": 0.0,
    "controls": {"elevator": 1.0}
  },
  "case_name": "vanilla-elevator",
  "timeout_seconds": 120,
  "length_unit": "unspecified"
}

controls maps the CONTROL variable names in the geometry to their values. Local deflection in degrees equals the variable value multiplied by that section's gain; it is not necessarily the physical deflection of every connected surface. Unknown control names are rejected. Omitted controls and angular rates are zero. Omitted Mach uses the geometry header. Nearby .run and .mass files are intentionally not loaded in prescribed-condition analyses.

Use avl.sweep with model_path and a conditions array. Its execution budget is 300 seconds by default (one total budget, not a separate allowance per condition). Cases are grouped by Mach to reuse AVL's matrix factorization and returned in the original request order. Each native process handles at most 128 conditions; the connector explicitly resets every angular rate and control at every point. Execution stops on the first error unless stop_on_error=false; remaining cases then use a fresh process. Timeout/cancellation always stops the attempt. The MCP response includes at most 25 case summaries; use avl.results to page the rest. Completed cases and failed-attempt logs remain available. A partial synchronous sweep returns isError=true. Full results are in result.json.

Select outputs

avl.run, avl.sweep and avl.submit accept outputs. Omit it to retain the previous complete output set. Use ["total"] for forces/moments only, or e.g. ["total", "body"] to add body-axis derivatives. Supported tables are total, stability, body, surfaces, strips. Total output is always retained to verify that AVL used the requested conditions. Skipped tables are not generated or parsed; querying one later reports FIELD_NOT_AVAILABLE rather than rerunning AVL.

Durable background jobs

Call avl.submit with the same model/conditions/output selection as a sweep. It returns a job_id; use that ID with avl.status, avl.cancel, avl.resume and avl.results. Workers run independently of the MCP connection and keep their state under <work-root>/jobs/. At most two background jobs execute at once per work root; additional workers wait. Synchronous calls are outside this queue.

avl.status returns queued, running, completed, failed, cancelled or interrupted, completed/failed counts, and the last error. success=true means the status query succeeded, not that the solver job passed. Cancellation is cooperative: query until acknowledged. Only that worker's owned AVL process is stopped. Completed cases and all native attempts are retained.

An inactive job can be resumed from another MCP connection using the same work root and implementation. Resume checks original geometry and dependencies, staged input hashes, settings, executable hash, and the MCP implementation hash. Changed inputs/solver/code require a new job. Valid successful case checkpoints are reused; missing/damaged outputs and failed cases are recomputed. Timeouts apply per execution attempt (excluding queue time); resume grants the same budget again. A worker lost during startup may take up to 30 seconds to be identified. Do not edit/remove active job files. Cross-machine/network-filesystem locking is not established; use one host per work root.

Query coefficients without invoking a solver:

{
  "job_id": "<id returned by submit, run or sweep>",
  "indices": [0, 3, 8],
  "fields": ["total.fields.CLtot", "body.derivatives.Cmq"],
  "offset": 0,
  "limit": 20
}

avl.results pages cases in original index order (limit 1-100); indices filters that list. Dotted field names preserve case, e.g. stability.control_derivatives.elevator.Cm. With no fields, each row includes total coefficients and saved artifact paths, including strip CSV/JSON when requested. Unfinished cases are absent, not zeros. Large responses are rejected with a request to narrow the selection. Results can be read even when the AVL executable is unavailable. For older runs, the directory basename is the run ID. Job control tools apply only to background jobs.

Optional references must specify all six values: sref, cref, bref, xref, yref, zref. Overrides affect only the staged copy. Cref, Bref, and the three coordinates use the geometry's length unit; Sref uses its square. length_unit labels the data (m, ft, in, or unspecified); it does not convert geometry. For the official Bubble Dancer example, the supplied mass file documents inches.

Results and conventions

Every successful case adds a versioned result_contract, also saved as result-contract.json: actual reference dimensions/point, units, axes, coefficient normalizations, ST/SB derivative variables and section control gains. Compact result_context accompanies sweep summaries and selected saved-result queries. Unknown units stay Lunit; native coefficients are unchanged. Separately calculated derived.wind_forces records the rotation of native stability totals.

See the complete result contract, including two upstream 3.52 caveats exposed by tests: constant CDp with sideslip can make native stability and body force projections differ, and ST alpha derivatives at nonzero p/r can differ from fixed-stability-rate perturbations. Applicable cases carry explicit limitation codes and warnings; no native number is silently corrected.

Synchronous executions use <work-root>/runs/; background jobs use <work-root>/jobs/. Each job retains native process folders and separate per-case outputs:

  • Original input snapshots, staged geometry and dependencies, and SHA-256 records.

  • manifest.json, exact commands.txt, stdout.log, stderr.log, process.json.

  • Raw total.mrf and the other selected MRF tables.

  • Parsed result.json; selected strips add strips.json/strips.csv, synchronous sweeps add summary.csv.

  • Background input snapshots, atomic per-case checkpoints, attempt records and worker logs.

The parser requires MRF VERSION 1.0, complete tables and finite numerical values. It distinguishes missing/truncated output, solver diagnostics, version mismatch, timeouts, changed input, and requested-versus-actual condition mismatch. Logs go to files, never to the MCP protocol's stdout channel.

Quantity

Convention

Geometry coordinates

X aft, Y right, Z up

Input angular rates

Standard body axes: X forward, Y right, Z down; pb/(2V), qc/(2V), rb/(2V)

CXtot, CYtot, CZtot, Cltot, Cmtot, Cntot

Standard body-axis force/moment coefficients

CLtot, CDtot; Cl'tot, Cn'tot

Stability-axis lift/drag; stability-axis roll/yaw moments

stability (ST)

Stability-axis derivatives; alpha/beta derivatives per radian

body (SB)

Body-axis derivatives; normalized velocity and angular-rate variables

Control derivatives

Per CONTROL variable unit, including geometry gains

Moment reference

Xref/Yref/Zref; not necessarily a mass-derived aircraft CG

CDind

Near-field induced contribution

CDff

Trefftz-plane induced drag; keep separate from CDind

CDvis

Supplied profile-drag model; not a viscous flow solution

Raw key case is preserved: CL is lift and Cl is roll moment. At nonzero beta, stability axes and full wind axes differ. Undefined AVL diagnostic sentinels for neutral point/spiral parameter are returned as JSON null, not physical values.

Limits and validation

AVL is a thin lifting-surface, slender-body and quasi-steady potential-flow model. It does not establish stall, separated-flow or transonic accuracy. The connector accepts 0 <= Mach < 0.7 and warns on large angles/high Mach; those limits do not certify physical accuracy. Numerical agreement between wrappers or solvers is not flight validation.

See docs/validation.md for the tested conditions and scope. The included geometries come from the official AVL archive. Regression snapshots are generated outputs on the tested build, not published experimental truth.

AVL_BIN=/absolute/path/to/avl python -m pytest -q
python scripts/verify_stdio.py \
  --command /absolute/path/to/avl-mcp-env/bin/avl-mcp \
  --avl-bin /absolute/path/to/avl \
  --work-root /absolute/path/to/project/AVL \
  --vanilla examples/official/vanilla/vanilla.avl \
  --bd examples/official/bd/bd.avl

Native tests are explicitly skipped if AVL_BIN is absent. Use AVL_TEST_WORK_ROOT to retain native pytest run artifacts in a chosen directory.

Roadmap

  • Add trim and eigenmode analysis with appropriate mass/inertia validation.

  • Add controlled geometry generation and previews after the analysis interface stabilizes.

Research aircraft models and CFD data are not part of this repository.

License and acknowledgements

This repository is released under GPL-2.0-or-later; see LICENSE. AVL is by Mark Drela and Harold Youngren. The official source and MRF readers carry GPL-2.0-or-later notices, with additional contributor credits in their source files. Example inputs retain their upstream content; see THIRD_PARTY_NOTICES.md. The numerical solver is installed separately. Distributing native binaries requires preserving their applicable notices, licenses and corresponding-source obligations, including those of bundled libraries. No native binary is included in the Python wheel.

Available Tools

10 tools
avl.cancelA
Idempotent

Request cooperative cancellation of this job's worker and its owned AVL process. Completed cases and logs remain. Query status until cancellation is acknowledged.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already mark idempotentHint=true and destructiveHint=false, and the description aligns with them, adding that completed cases and logs remain. It also discloses the cooperative/asynchronous nature by instructing the agent to poll status until acknowledgement. No contradiction with annotations.

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?

Three short sentences each add distinct value: the action, the preserved artifacts, and the follow-up. It is front-loaded with the main verb and target, and has no fluff.

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?

For a single-parameter mutation tool with annotations, the description covers the action, side effects, and the need to poll status. It does not specify the response shape or error cases, but the absence of an output schema is partially mitigated by the status-polling instruction.

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?

With 0% schema description coverage, the schema only lists job_id as required. The description clarifies that the parameter identifies the job whose worker and AVL process are cancelled ('this job's worker'), but it does not elaborate on format, validation, or accepted values. It partially compensates for the schema gap.

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?

Description states a clear action ('Request cooperative cancellation') and the target ('this job's worker and its owned AVL process'). It is distinct from read-only siblings like avl.health or avl.status, but it does not explicitly contrast with avl.resume or avl.sweep, so sibling differentiation is missing.

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 description implies the tool is for cancelling a job but never states when to choose it over avl.resume or avl.sweep, nor when cancellation is appropriate. It does provide a follow-up instruction ('Query status until cancellation is acknowledged'), which is a mild usage hint, but the when-vs-alternatives guidance is absent.

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

avl.healthA

Diagnose Python/native dependencies, architecture, directory permissions and AVL startup. Save evidence. Numerical validation and desktop registry refresh remain separate.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations are all false, so the description carries the burden. It discloses that the tool diagnoses and 'saves evidence,' implying a stateful side effect, and explicitly states what remains separate. However, it doesn't clarify whether saving evidence is destructive, where it is saved, or whether the tool modifies anything.

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 compact and front-loaded with the main diagnostic areas. The second sentence adds useful boundary information. It could be slightly more structured, but every sentence earns its place.

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 zero-parameter diagnostic tool, the description covers the main scope and notes exclusions. However, it doesn't describe what 'saving evidence' means, what the output looks like, or how this relates to the sibling tools (e.g., avl.inspect, avl.validate). Given the tool's complexity is low, this is adequate but not complete.

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

Parameters4/5

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

The tool has zero parameters, so the schema provides no parameter semantics. The description compensates by explaining what the tool operates on (dependencies, architecture, permissions, startup), giving the agent enough context to understand the tool's scope without needing parameters.

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 names a specific verb ('Diagnose') and a clear resource scope: Python/native dependencies, architecture, directory permissions, and AVL startup. It distinguishes itself from siblings by listing concrete diagnostic areas, though it doesn't explicitly name a sibling to contrast with.

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 description implies this is the diagnostic/health-check tool among siblings like avl.inspect, avl.validate, and avl.run, but it doesn't explicitly state when to use it versus those alternatives. The phrase 'Numerical validation and desktop registry refresh remain separate' hints at exclusions but doesn't name the alternative tools.

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

avl.inspectA
Read-onlyIdempotent

Read geometry, references, controls and dependencies; original files are unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_pathYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the bar is lower. The description adds plain-language confirmation that 'original files are unchanged' and specifies what data is accessed, which reinforces the safety profile beyond the boolean hints.

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 entire description is one tight sentence that front-loads the verb and resource scope, then adds the key non-destructive guarantee. Every word earns its place and there is no filler.

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?

For a single-parameter read-only tool with strong safety annotations, the description is largely adequate: it states what is read, confirms no modification, and implies the purpose. The main gap is that it does not describe what the tool returns or expand on model_path semantics, but complexity is low and annotations cover the safety context.

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

Parameters2/5

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

Schema description coverage is 0%, so the description carries the burden for explaining model_path. It does not do so directly; the only hint is the property title 'Model Path'. The description never clarifies what kind of path is expected, whether local, remote, or file-format-specific.

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 opens with a specific action verb, 'Read', and names the exact resources it operates on: 'geometry, references, controls and dependencies'. This clearly distinguishes avl.inspect from execution-oriented siblings like avl.run and avl.sweep.

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 clearly establishes that this tool is for read-only inspection because it says it reads data and that 'original files are unchanged'. This gives an agent context for when to choose it over mutation or execution tools, though it does not explicitly name alternatives or exclusions.

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

avl.resultsA
Read-onlyIdempotent

Page saved background or run/sweep results without running AVL. Limit 1-100 cases. Filter by original zero-based indices and dotted fields, e.g. total.fields.CLtot, body.derivatives.Cmq, stability.control_derivatives.elevator.Cm. Missing tables return FIELD_NOT_AVAILABLE; raw/strip artifact paths remain available by default.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
fieldsNo
job_idYes
offsetNo
indicesNo

TDQS

A4.6/5.0
Behavior5/5

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

Even though annotations already declare readOnly, idempotent, and non-destructive behavior, the description adds valuable runtime semantics: limit range, zero-based index filtering, dotted-field syntax, FIELD_NOT_AVAILABLE for missing tables, and artifact path availability by default. There is no contradiction with annotations.

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?

Two dense sentences front-load the core purpose, then add concrete examples and edge-case behavior. There is no wasted wording, and the filter examples are useful rather than decorative.

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?

For a tool with no output schema and five parameters, the description covers a lot: saved-result access, pagination limits, filter syntax, missing-table behavior, and artifact availability. It is slightly incomplete on offset semantics and explicit job_id guidance, but it is still strong enough for an agent to invoke the tool correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the parameter documentation burden. It explains limit (1-100), fields (dotted paths with examples), and indices (zero-based). job_id is only implied as the result selector and offset is implied by 'Page', but not explicitly documented.

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 opens with a specific verb ('Page') and resource ('saved background or run/sweep results'), then explicitly contrasts with 'without running AVL'. This makes the tool's purpose unmistakable and differentiates it from siblings like avl.run and avl.sweep.

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?

It clearly states the context: use this tool to page saved results rather than running AVL. It stops short of naming explicit alternatives like avl.status or avl.inspect, so it provides clear context but not full when/when-not routing.

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

avl.resumeA

Resume an inactive job after verifying input, solver, implementation and output hashes. Recompute only failed, missing or damaged cases. Active jobs cannot be resumed.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

A4.1/5.0
Behavior4/5

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

The description adds meaningful behavior beyond the annotations: it says the operation occurs only after hash verification and that recomputation is limited to failed, missing, or damaged cases. It does not contradict the annotations. Minor ambiguity remains about whether the tool performs the verification or the caller must do it beforehand.

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 compact and front-loaded: the core action appears first, followed by conditions and constraints. Every sentence contributes information, and there is no filler or repetition.

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?

For a single-parameter tool with no output schema, the description covers the core context: when resume applies, what gets recomputed, and what is disallowed. It does not describe return values or error behavior, but those are secondary given the simple interface and absence of an output schema.

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

Parameters2/5

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

With schema description coverage at 0% and only one parameter, job_id, the description needed to compensate by explaining how to identify the job or where the id comes from. It only refers to 'an inactive job' without addressing id format, provenance, or required relationship to prior submissions, so the parameter remains underspecified.

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 opens with a specific verb and resource: 'Resume an inactive job'. It further narrows scope by stating 'Active jobs cannot be resumed' and specifies the action 'Recompute only failed, missing or damaged cases', making it readily distinguishable from siblings like run, submit, status, and cancel.

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 clearly states when to use the tool: for inactive jobs, and only after verifying hashes. It also gives an explicit exclusion: active jobs cannot be resumed. However, it does not name alternative sibling tools or explain what to use for active jobs, so it stops short of full routing guidance.

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

avl.runA

Run one prescribed flight condition. Return forces, ST/SB derivatives, surface loads and links to strip CSV/JSON. Angles in degrees, rates nondimensional BODY axes; CONTROL values use gains defined in geometry. Default controls/rates zero. A references override changes only the staged copy. Ignores nearby .run/.mass.

ParametersJSON Schema
NameRequiredDescriptionDefault
outputsNo
case_nameNocase
conditionNo
model_pathYes
referencesNo
length_unitNounspecified
timeout_secondsNo

TDQS

A4.2/5.0
Behavior4/5

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

With all annotations false, the description carries full behavioral burden. It discloses units (angles in degrees, rates in nondimensional body axes), defaults (controls/rates zero), override semantics (changes only the staged copy), and file interactions (ignores nearby .run/.mass). The only notable gap is whether execution is synchronous or queued, but the provided context is still strong.

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 four dense sentences with no filler. It front-loads the core purpose and outputs, then adds critical conventions, defaults, override semantics, and file-ignoring behavior. Every sentence 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?

For a 7-parameter tool with no output schema and no annotation support, the description covers outputs, units, defaults, override side effects, and file handling. It does not explicitly state what model_path should point to or whether the run is asynchronous, but these are largely inferable from the sibling tool set and the schema requirements.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It adds meaning for condition parameters: angle/rate units, nondimensional body axes, control gains from geometry, and zero defaults. It also clarifies reference override scope. Parameters like outputs, case_name, length_unit, and timeout_seconds are left to schema/enum, but they are less ambiguous.

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 opens with 'Run one prescribed flight condition', a specific verb and resource, and enumerates concrete outputs (forces, ST/SB derivatives, surface loads, strip CSV/JSON links). This clearly differentiates it from sibling tools like avl.sweep (multiple conditions) and avl.submit (submission rather than direct run).

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 description does not explicitly name alternatives or state when to use this tool vs avl.sweep or avl.submit, but 'one prescribed flight condition' implies a single-point analysis rather than a sweep. This is an implied usage signal rather than explicit guidance, so it earns a middle score.

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

avl.statusB
Read-onlyIdempotent

Read queued/running/completed/failed/cancelled/interrupted state and case counts. success=true means the status was read; inspect state/error for solver outcome.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds valuable context beyond those annotations by explaining that success=true merely means the status was read, and that state/error should be inspected for the actual solver outcome. It also lists the possible lifecycle states.

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?

Two concise sentences with no filler. The core action is stated first, and the important caveat about success semantics is front-loaded. Every sentence 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?

For a simple single-parameter status tool with strong annotations and no output schema, the description provides the state enumeration and clarifies how to interpret success/error. It is slightly incomplete in not mentioning the origin or format of job_id, but overall it gives enough context for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0%, and the description does not elaborate on job_id, such as where it comes from or what format it expects. The parameter name 'Job Id' is self-explanatory to some degree, but the description fails 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.

Purpose4/5

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

Description uses a clear verb ('Read') with a specific resource (job state and case counts) and enumerates the relevant state values. It does not explicitly differentiate from siblings like avl.results or avl.health, but the focus on status and solver outcome is sufficiently distinct.

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 such as avl.results or avl.health. The description implies it is for status polling, but it does not state exclusions or direct the agent toward sibling tools when appropriate.

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

avl.submitA

Snapshot inputs and start a detached local AVL job; return job_id immediately. 1-10000 cases, at most two background workers execute per work root. Workers survive MCP client disconnection. Timeout is the execution budget per attempt, excluding queue. outputs=['total'] skips derivatives/surface/strip output; None requests all tables.

ParametersJSON Schema
NameRequiredDescriptionDefault
outputsNo
case_nameNojob
conditionsYes
model_pathYes
referencesNo
length_unitNounspecified
stop_on_errorNo
timeout_secondsNo

TDQS

A3.8/5.0
Behavior4/5

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

With all annotation hints false, the description carries the full burden. It discloses meaningful behaviors: detached execution, workers surviving MCP client disconnection, timeout semantics ('per attempt, excluding queue'), and outputs behavior. This goes well beyond the sparse annotations, though it omits details about input snapshot effects or error handling.

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?

Three dense sentences front-load the core purpose and immediately follow with key constraints. Every sentence adds value: execution model, worker behavior, timeout scope, and output shorthand. No filler or redundancy.

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?

The description covers the job execution model and a couple of parameters, but with 8 parameters, no output schema, and no annotation support, there are gaps. It does not explain how to pass conditions/references or what stop_on_error does, nor how to later retrieve results (though sibling tools exist). It is minimally viable but not fully complete.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It does explain 'outputs' and 'timeout_seconds' partially, but does not clarify 'model_path', 'conditions', 'references', 'length_unit', 'stop_on_error', or 'case_name'. For an 8-parameter tool, this is insufficient compensation.

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 opens with a clear verb and resource: 'Snapshot inputs and start a detached local AVL job; return job_id immediately.' It distinguishes the tool from siblings like avl.run by emphasizing the detached/asynchronous nature and immediate return, so an agent can tell it apart without inspecting other tools.

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 description implies usage for detached background execution, but it never explicitly names alternatives or states when not to use this tool. It does not mention that avl.run might be the synchronous counterpart or provide exclusion criteria, leaving the choice to inference.

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

avl.sweepA

Run 1-10000 conditions in shared AVL processes, grouped by Mach, within one budget. Return cases in requested order; reset all rates and controls at every condition. Select outputs (total is always retained); None preserves all previous tables. Preserve successful and failed cases and write summary.csv. For long jobs use submit. Return partial results and isError=true if any requested case is unsuccessful.

ParametersJSON Schema
NameRequiredDescriptionDefault
outputsNo
case_nameNosweep
conditionsYes
model_pathYes
referencesNo
length_unitNounspecified
stop_on_errorNo
timeout_secondsNo

TDQS

A3.9/5.0
Behavior4/5

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

With all annotations false (no read-only, idempotent, or destructive hints), the description carries the full burden and provides substantial detail: it resets rates and controls, preserves previous tables when outputs is None, retains totals, writes summary.csv, and returns partial results with isError=true on any unsuccessful case. This goes well beyond a minimal disclosure, though it leaves some terms like 'budget' and 'shared AVL processes' somewhat vague.

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 compact and front-loaded with the core action in the first sentence. Each subsequent sentence adds distinct behavioral or routing information without redundancy. It could arguably be slightly longer to explain key parameters, but as written it is efficiently structured.

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?

The tool has 8 parameters, no output schema, and no annotations, so the description must provide substantial context. It explains the major behaviors (result ordering, rate reset, output selection, summary.csv, partial results) but leaves a gap around stop_on_error and timeout semantics, which are essential for an agent to invoke the tool correctly under failure conditions. The 'budget' and 'shared AVL processes' concepts are also under-specified.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must explain the parameters, but it only touches on a few: conditions (via count and grouping), controls (reset), and outputs (selection and preservation). Critically, it omits stop_on_error, which has a direct relationship with the stated partial-results behavior, and ignores timeout_seconds, references, length_unit, and case_name. This is insufficient for an 8-parameter tool with no schema descriptions.

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 states a specific verb ('Run') with a clear resource ('conditions in shared AVL processes'), a scope (1-10000 conditions), and a structural detail (grouped by Mach, within one budget). It also distinguishes the tool from a sibling by pointing to 'submit' for long jobs, making the purpose unmistakable.

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 gives a clear usage boundary: 'For long jobs use submit' explicitly routes to an alternative when the job exceeds the sweep's intended scope. However, it does not explain when to use 'avl.sweep' versus 'avl.run' or other siblings, leaving some inference to the agent.

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

avl.validateA
Read-onlyIdempotent

Validate supported text grammar, dependencies and mesh limits. No solver execution.

ParametersJSON Schema
NameRequiredDescriptionDefault
model_pathYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the key behavioral constraint 'No solver execution,' which confirms the tool is a safe, non-executing check and goes beyond the annotations. It does not contradict the annotations, so no conflict is present.

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 12-word sentence plus a short clarifying clause. It is front-loaded with the essential action and resource, and every word earns its place. There is no filler or repetition of structured fields.

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 one-parameter validation tool, the description covers purpose and safety well, but it does not disclose return value semantics, such as whether validation failures return errors, a report, or exit codes. Since there is no output schema, this absence leaves an agent uncertain about how to interpret the tool's result.

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 one required string 'model_path' with 0% description coverage. The description does not explicitly explain this parameter, though 'text grammar' hints that model_path points to a text-format model file. The parameter name is self-explanatory, but the description still leaves format, path conventions, and required file type to inference.

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 states a clear verb and subject: 'Validate supported text grammar, dependencies and mesh limits.' This makes the tool's purpose explicit. It also adds 'No solver execution,' which helps distinguish it from solver-running siblings, though it does not name those alternatives or clarify what 'text grammar' means in context.

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 explicit. Saying 'No solver execution' suggests this tool is a pre-flight check before running the solver, but it does not provide specific when-to-use guidance or name alternatives like avl.run or avl.inspect. An agent must infer the appropriate context from the sibling list and the word 'Validate.'

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.

  1. 10 tool updatesv0.2.0
    • First observedavl.cancel
    • First observedavl.health
    • First observedavl.inspect
    • First observedavl.results
    • First observedavl.resume
    • First observedavl.run
    • First observedavl.status
    • First observedavl.submit
    • First observedavl.sweep
    • First observedavl.validate

TDQS

A4/5.0

Scored across 10 tools

Disambiguation5/5

Each tool has a clear, distinct role: environment health, input inspection, validation, single run, sweep, async submit, status, cancel, resume, and results retrieval. Overlapping concerns like dependencies appear in multiple tools but are explicitly separated by context (environment vs. input file). There is little risk of an agent selecting the wrong tool.

Naming Consistency4/5

Tool names are uniformly lowercase single-word commands, which is easy to follow. Most are imperative verbs (inspect, validate, run, submit, cancel, resume), but health, status, and results are noun-style names that deviate slightly from a strict verb pattern.

Tool Count5/5

Ten tools cover the AVL workflow without redundancy or bloat. The count is well within the ideal range and each tool contributes a necessary part of the simulation lifecycle.

Completeness5/5

The toolset covers the full workflow: environment checks, inspection, validation, synchronous single/multi-case execution, asynchronous submission, job control, and result retrieval. There are no obvious dead ends, and background jobs can be managed and resumed cleanly.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables AI agents to interact with Nastran FEA models by reading, writing, and analyzing BDF and OP2 files. It provides tools for mesh quality assessment, geometric analysis, and automated report generation for structural engineering workflows.
    3
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides MCP tools for CPACS-oriented TiGL workflows, enabling lifecycle management, inspection, export, and parameter manipulation of aircraft geometry models without native geometry runtimes.
    3
    MIT