avl-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@avl-mcpRun AVL analysis on wing.avl at alpha 5, Mach 0.3"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
Tools
Tool | Purpose |
| Diagnose Python/native installation, directory access and headless startup |
| Read geometry, references, controls and file dependencies |
| Check supported grammar, dependency paths and mesh budget |
| Calculate one prescribed condition, loads and ST/SB derivatives |
| Calculate 1-10000 explicit conditions with shared AVL processes and save CSV |
| Snapshot inputs and start a detached background job |
| Read progress, counts and the actual job outcome |
| Cancel a queued/running job while retaining completed cases |
| Verify saved inputs/results and recompute only missing or failed cases |
| 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 --versionFor 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/logsThe 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, exactcommands.txt,stdout.log,stderr.log,process.json.Raw
total.mrfand the other selected MRF tables.Parsed
result.json; selected strips addstrips.json/strips.csv, synchronous sweeps addsummary.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) |
| Standard body-axis force/moment coefficients |
| Stability-axis lift/drag; stability-axis roll/yaw moments |
| Stability-axis derivatives; alpha/beta derivatives per radian |
| 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 |
| Near-field induced contribution |
| Trefftz-plane induced drag; keep separate from CDind |
| 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.avlNative 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 toolsavl.cancelAIdempotent
Request cooperative cancellation of this job's worker and its owned AVL process. Completed cases and logs remain. Query status until cancellation is acknowledged.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.inspectARead-onlyIdempotent
Read geometry, references, controls and dependencies; original files are unchanged.
| Name | Required | Description | Default |
|---|---|---|---|
| model_path | Yes |
TDQS
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.
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.
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.
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.
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.
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.resultsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| fields | No | ||
| job_id | Yes | ||
| offset | No | ||
| indices | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| outputs | No | ||
| case_name | No | case | |
| condition | No | ||
| model_path | Yes | ||
| references | No | ||
| length_unit | No | unspecified | |
| timeout_seconds | No |
TDQS
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.
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.
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.
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.
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.
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.statusBRead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| outputs | No | ||
| case_name | No | job | |
| conditions | Yes | ||
| model_path | Yes | ||
| references | No | ||
| length_unit | No | unspecified | |
| stop_on_error | No | ||
| timeout_seconds | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| outputs | No | ||
| case_name | No | sweep | |
| conditions | Yes | ||
| model_path | Yes | ||
| references | No | ||
| length_unit | No | unspecified | |
| stop_on_error | No | ||
| timeout_seconds | No |
TDQS
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.
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.
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.
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.
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.
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.validateARead-onlyIdempotent
Validate supported text grammar, dependencies and mesh limits. No solver execution.
| Name | Required | Description | Default |
|---|---|---|---|
| model_path | Yes |
TDQS
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.
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.
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.
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.
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.
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.
10 tool updates
v0.2.0- First observed
avl.cancel - First observed
avl.health - First observed
avl.inspect - First observed
avl.results - First observed
avl.resume - First observed
avl.run - First observed
avl.status - First observed
avl.submit - First observed
avl.sweep - First observed
avl.validate
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
Physics-based validation of simulation results: receipts with per-check verdicts, via MCP.
MCP server for aerospace calculations: orbital mechanics, ephemeris, DSN operations, ...
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Create, browse, remix, collaborate on, and run durable AI workflow nodes from MCP hosts.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables aerodynamic analysis through XFOIL polar computations. Provides typed models and tools to run airfoil performance analyses from agents or automation workflows.1MIT
- AlicenseAqualityDmaintenanceEnables automated geometry editing and aerodynamic analysis using OpenVSP and VSPAero through natural language. Provides tools to modify aircraft geometry parameters and run computational fluid dynamics simulations programmatically.436MIT
- AlicenseNot gradedqualityCmaintenanceAn 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.3MIT
- AlicenseNot gradedqualityBmaintenanceProvides MCP tools for CPACS-oriented TiGL workflows, enabling lifecycle management, inspection, export, and parameter manipulation of aircraft geometry models without native geometry runtimes.3MIT