avl-mcp
This server wraps AVL 3.52 to inspect/validate models and run reproducible aerodynamic analyses, trims, sweeps, and durable background jobs, then page saved results.
Diagnose AVL/Python installation, architecture, directory permissions, and headless startup with
avl.health.Read geometry, references, controls, and dependencies with
avl.inspectwithout changing original files.Validate supported AVL text grammar, dependency paths, and mesh limits without running the solver.
Run one prescribed flight condition and return forces, ST/SB derivatives, surface loads, and strip outputs.
Solve aerodynamic lift/pitch trim by varying alpha plus one CONTROL, with bounds and independent verification.
Run 1–10,000 prescribed conditions or trim targets in sweeps, grouped by Mach, with saved CSV/summary results.
Submit detached background jobs that survive client disconnection; monitor, cancel, resume, and page results via
avl.status,avl.cancel,avl.resume, andavl.results.Query saved results by job ID, case index, and dotted field names without rerunning AVL.
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.5.0. Supports AVL 3.52 only. Native acceptance covers macOS Apple Silicon and Ubuntu 24.04 x86_64; other platforms are unverified. This project is an independent wrapper, not an official MIT or AVL release.
繁體中文說明 · Documentation index · Validation
Version 0.5.0 adds synchronous and durable background trim batches, retaining each point's acceptance bounds, residual checks and independent replay. It also adds a reproducible Linux native build and acceptance job alongside macOS. It also adds general mesh sensitivity and mass/weight, speed and CG trim inputs, with explicit unit conversion and saved provenance. See batch trim, Ubuntu installation, trim conventions and acceptance. See the 0.5.0 release notes for artifacts and upgrade scope. Installing a release does not update an existing client's configuration automatically.
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 |
| Solve alpha and one CONTROL variable for target CL/Cm, then independently verify |
| Compare coefficients across refined surface meshes and save JSON/CSV/Markdown |
| Convert explicit mass/weight, airspeed and CG to CL targets and references without running AVL |
| Run independently verified trim from dimensional inputs and retain conversion provenance |
| Calculate 1-10000 prescribed conditions or independently verified trim targets and save CSV |
| Snapshot prescribed conditions or trim targets 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 eigenmodes, general 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: tigl-mcp
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. Python release artifacts are a wheel, source distribution and checksums; AVL remains a separate installation. The existing optional native bundle is retained on the v0.1.0a1 release.
For Ubuntu 24.04 x86_64, use the Linux build and validation guide. It builds verified upstream source with GNU compilers, X11 and the numerical libraries shipped in the AVL archive. Headless analysis does not require an X server.
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.
Longitudinal aerodynamic trim
Call avl.trim to solve alpha and one named CONTROL variable at a required Mach:
{
"model_path": "/absolute/path/to/vanilla.avl",
"request": {
"control": "elevator",
"target_cl": 0.6,
"target_cm": 0.0,
"mach": 0.2,
"alpha_bounds_deg": [-10.0, 15.0],
"control_bounds": [-30.0, 30.0],
"fixed_controls": {"flap": 0.0},
"cl_tolerance": 0.000001,
"cm_tolerance": 0.000001
},
"case_name": "vanilla-trim",
"timeout_seconds": 120,
"outputs": ["total"]
}Beta and all angular rates are zero. Other controls are fixed at the requested
values, defaulting to zero. CONTROL values retain the geometry's gains and signs;
they are not automatically physical elevator deflections. Cm refers to the model's
moment reference, or an explicit references override, which is not necessarily
the aircraft CG. No .mass or .run file is loaded.
AVL's native solver is unconstrained: the required bounds decide whether its
solution is acceptable and do not clip the result or constrain its iterations.
A successful result must meet CL/Cm residual tolerances and bounds, then pass
a fresh fixed-condition run at the solved alpha and control values. The saved
trim metadata separates the request, solved condition, residuals, bounds and
verification. This is aerodynamic lift/pitch-moment trim, without weight/thrust
balance. See the full trim contract and failure behavior.
Use avl.sweep with model_path and exactly one of conditions or trim_requests.
For prescribed conditions, 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.
For trim batches, pass trim_requests: [<TrimRequest>, ...] instead of conditions.
Each request has the same required targets, control and bounds as avl.trim above.
Every point runs a fresh native trim followed by independent prescribed-condition
verification; all points and replays share the total timeout budget. The same
input works with avl.submit for cancellation, verified resume and progress.
See batch examples, saved results and failure semantics.
Select outputs
avl.run, avl.trim, avl.trim_physical, 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 or trim_requests, and outputs 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, trim 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 verifies all 30 ST or 36 SB derivatives, every declared CONTROL/DESIGN column,
integer counts, unique fields, load indices and matching load references. Missing
rows, duplicate records and truncated DESIGN tails fail instead of returning partial success.
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 explicit control mixing and mass/inertia-dependent flight trim or eigenmode analysis after their input and verification contracts are defined.
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
14 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.mesh_sensitivityA
Compare a fixed flight condition across 2-8 increasing mesh factors starting at 1. Refine surface chord/span counts on staged copies; body discretization stays fixed. Preflight every mesh against the configured vortex budget. Save coefficients, baseline/adjacent differences, JSON, CSV and Markdown with one total timeout. Optional absolute tolerances only assess the final adjacent difference; no automatic mesh-convergence claim, Richardson extrapolation, or geometry suitability proof.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | ||
| case_name | No | mesh-sensitivity | |
| 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 annotations only covering the safety profile (readOnly=false, destructive=false, idempotent=false), the description adds substantial behavior: work happens on staged copies rather than the source model, every mesh is preflighted against the vortex budget, one total timeout bounds the whole run, and artifacts (JSON, CSV, Markdown) are written. It also bounds the interpretation of results — tolerances apply only to the final adjacent pair, and no Richardson extrapolation or geometry suitability proof is produced.
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?
Front-loaded with the core operation in sentence one and zero filler; the trailing caveat sentence is dense but earns its place by preventing a false convergence claim. Slight cost in readability from cramming four distinct facts into the final sentence.
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 complex, file-writing study tool with six parameters, no output schema, and no annotation coverage, the description does well on outputs and runtime semantics (artifact formats, single total timeout, tolerance scope). Gaps remain around required inputs (model_path), where artifacts land, behavior on preflight failure, and the what-happens-next story if a mesh exceeds the vortex budget.
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 carry the load, and it does for the highest-risk parameters: 'factors' gains an implicit starting-at-1/increasing constraint (tighter than the schema's minItems 2/maxItems 8) and 'absolute_tolerances' is characterized as assessing only the final adjacent difference. It says nothing about model_path, references/References, length_unit, case_name, or the metrics selection, leaving a meaningful share of the six parameters unexplained.
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 first sentence names a specific verb and resource (compare a fixed flight condition across 2-8 increasing mesh factors) and states the scope constraint (starting at 1). The following sentences sharpen the mechanism — chord/span refinement on staged copies with fixed body discretization — so the agent knows exactly what operation this is, well beyond the bare tool name.
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 context is implied by the study framing (mesh sensitivity/convergence work) and by the explicit disclaimer that no convergence claim is made, but there is no statement of when to prefer this over siblings like avl.sweep or avl.run, nor prerequisites such as the vortex budget configuration being mandatory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avl.prepare_trimARead-onlyIdempotent
Convert explicit SI mass/weight, density and speed to target CL without running AVL. Require geometry length units and a CG with units; set the moment reference to CG. Return a TrimRequest and References usable in trim/sweep/submit, plus provenance. Assumes unbanked steady level lift=weight, zero beta/rates and target Cm=0. Mach is supplied separately; no inferred atmosphere, thrust balance or inertia model.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | ||
| model_path | Yes | ||
| references | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the read-only/idempotent annotations: it does not run AVL, returns a TrimRequest and References with provenance, assumes unbanked steady level flight with lift=weight, zero beta/rates and target Cm=0, and explicitly excludes inferred atmosphere, thrust balance and inertia modeling.
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 front-loaded with the core action and purpose, followed by requirements, return values, assumptions and exclusions. Each sentence carries useful information without 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?
For a complex nested request with no output schema, the description adequately states what is returned (TrimRequest, References, provenance) and the key physical assumptions. Some details, such as the role of model_path and optional references, are left to the schema, but the core completeness is strong.
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 description adds useful meaning for key inputs: SI mass/weight, density and speed, geometry length units, CG units, and Mach as a separate explicit input. However, it does not explain several nested request fields such as alpha_bounds_deg, control_bounds, control, fixed_controls, or tolerances, and the reported schema description coverage is low at the top level.
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 and resource: convert explicit SI mass/weight, density and speed to target CL. It distinguishes this preparation step from the actual AVL execution by saying 'without running AVL' and notes the outputs are usable in trim/sweep/submit.
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 establishes the usage context: prepare trim inputs without running AVL, with the result usable by downstream trim/sweep/submit tools. It does not explicitly name alternatives such as avl.trim_physical or state when not to use this tool, but the intended workflow is clear.
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. Supply exactly one of conditions or trim_requests. Every trim requires its own fresh verification; cancel interrupts candidate/replay and resume reuses verified cases only. outputs=['total'] skips derivatives/surface/strip output; None requests all tables.
| Name | Required | Description | Default |
|---|---|---|---|
| outputs | No | ||
| case_name | No | job | |
| conditions | No | ||
| model_path | Yes | ||
| references | No | ||
| length_unit | No | unspecified | |
| stop_on_error | No | ||
| trim_requests | No | ||
| timeout_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish a non-read-only, non-destructive, non-idempotent job submission. The description adds valuable context beyond that: jobs are detached, workers survive MCP client disconnection, concurrency is limited to two workers per work root, and timeout excludes queue time. It is rich but does not cover failure behavior or auth needs.
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 front-loaded with the main action and return value, then adds operational constraints. It is dense but every sentence contributes useful information; no obvious filler is present.
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 9-parameter job submission with no output schema, the description covers the key behavioral and lifecycle details, including return of job_id. It is not fully complete because several parameters, especially references, are left unexplained, but the core call semantics are present.
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 carry parameter meaning. It explains the conditions/trim_requests exclusivity, outputs behavior, and timeout semantics, but it omits model_path, references, length_unit, stop_on_error, and case_name; references in particular is complex and undocumented.
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 resource: 'Snapshot inputs and start a detached local AVL job; return job_id immediately.' This distinguishes it from a synchronous analysis tool, but it does not explicitly differentiate from siblings such as avl.run, avl.trim, or 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 gives a concrete usage constraint: 'Supply exactly one of conditions or trim_requests,' and mentions cancel/resume behavior. However, it does not say when to choose avl.submit over avl.run, avl.trim, or avl.sweep, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avl.sweepA
Supply exactly one of conditions or trim_requests, each containing 1-10000 cases. Prescribed conditions share AVL processes grouped by Mach, resetting rates/controls. Trim requests run sequentially: each solves alpha/CONTROL for CL/Cm and independently replays in a fresh process. All cases and replays share one total timeout budget. Return cases in requested order with trim residuals, bounds and verification metadata. 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 | No | ||
| model_path | Yes | ||
| references | No | ||
| length_unit | No | unspecified | |
| stop_on_error | No | ||
| trim_requests | No | ||
| timeout_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond annotations: a shared total timeout budget, sequential trim replays in fresh processes, output selection semantics, preservation of successful and failed cases, summary.csv writing, and partial-result/isError behavior. These details materially help an agent understand execution and failure semantics.
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 dense but front-loaded and structured around execution rules, outputs, and failure behavior. Every sentence contributes useful information for a complex tool.
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 9-parameter tool with no output schema, it covers the core execution model, result ordering, output selection, and error behavior well. It is not fully complete because several invocation parameters and their effects remain undocumented, but the agent has enough to use the tool correctly in most cases.
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?
Top-level schema description coverage is reported at 0%, so the description carries much of the parameter burden. It explains the conditions vs trim_requests exclusivity, the 1-10000 case limit, output selection, and shared timeout, but leaves several top-level parameters such as model_path, references, length_unit, stop_on_error, and case_name unexplained.
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 clearly identifies this as a sweep tool that runs either prescribed flight conditions or trim requests through AVL processes, including sequential trim solves for alpha/CONTROL and CL/Cm. It is specific about the operation but does not broadly differentiate itself from nearby siblings such as avl.trim or avl.run beyond pointing long jobs to avl.submit.
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 explicitly says to supply exactly one of conditions or trim_requests and that long jobs should use submit. That gives clear routing context, though it does not fully explain when to choose this over other trim-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avl.trimA
Solve alpha and one existing CONTROL for target CL/Cm at zero beta/body rates. CONTROL values retain section gains, not automatically physical deflection degrees. Bounds accept/reject the native solution, not constrain iterations. Success requires residual/bounds checks and a fresh fixed-condition solve. Moments use the explicit geometry/override reference point, not an inferred CG. No mass/thrust balance.
| Name | Required | Description | Default |
|---|---|---|---|
| outputs | No | ||
| request | Yes | ||
| case_name | No | trim | |
| 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?
Goes well beyond annotations by disclosing that CONTROL values are section gains, that bounds accept/reject rather than constrain iterations, success requires residual/bounds checks and a fresh fixed-condition solve, and moments use the explicit reference point. 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?
Dense and front-loaded: purpose first, then caveats. Every sentence carries operational or domain meaning; 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 complex trim solver with no output schema and 0% parameter-description coverage, the description covers purpose, scope, and success checks but omits return values and several parameter semantics, leaving gaps an agent would need to fill elsewhere.
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 property description coverage is 0%, so the description must compensate. It clarifies the core scientific parameters (control semantics, bounds behavior, reference point) but leaves model_path, case_name, outputs, fixed_controls, tolerances, length_unit, and timeout_seconds unexplained.
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?
States a specific verb (Solve) and the exact unknowns/targets: alpha and one existing CONTROL for CL/Cm at zero beta/body rates. It is clear but does not explicitly differentiate itself from siblings such as avl.sweep or avl.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?
Gives clear applicability constraints (zero beta/body rates, no mass/thrust balance) but does not name an alternative tool or explicitly say when to choose avl.trim over avl.sweep/avl.run.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
avl.trim_physicalA
Prepare lift=weight and zero pitching moment about explicit CG, then verify trim. Takes SI mass/weight, density and speed plus declared geometry/CG length units. Solves alpha and one CONTROL with bounds/residual checks and independent replay. Save dimensional inputs and conversion provenance with native results, including numerical failures. Mach remains explicit. No thrust balance, mass file or eigenmodes.
| Name | Required | Description | Default |
|---|---|---|---|
| outputs | No | ||
| request | Yes | ||
| case_name | No | physical-trim | |
| model_path | Yes | ||
| references | No | ||
| timeout_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readonly, non-destructive, non-idempotent; the description adds substance beyond that: bounded alpha/control solve with residual checks and an independent replay, and reporting of numerical failures rather than silent failure. Provenance/dimensional-input persistence on the native results is disclosed too. It stops short of saying what a converged-vs-failed response looks like.
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?
Five short sentences, goal front-loaded, no filler. The telegraphic style ('Mach remains explicit') is dense but each clause carries information; a slightly more explicit subject in the middle sentences would help.
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?
With no output schema, the description still says results are saved with dimensional inputs and conversion provenance and that numerical failures are surfaced, which is the key return-value behavior for a solver. Combined with the annotations covering the safety profile, an agent has enough to call this 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?
Reported schema description coverage is 0%, so the description carries the burden and does cover the important physical inputs (SI mass/weight, density, speed, declared geometry and CG length units, explicit Mach). But it says nothing about model_path, references, outputs, case_name or timeout_seconds, so several parameters remain undocumented by either channel.
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?
States a specific verb and resource: 'Prepare lift=weight and zero pitching moment about explicit CG, then verify trim', plus that it solves alpha and one control. The physical-loading framing (mass/weight, density, speed) separates it from the plain avl.trim family, though it never names the sibling it supersedes, leaving the agent to infer which trim variant to pick.
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 thrust balance, mass file or eigenmodes' and 'Mach remains explicit' give real cues about what this tool is not for, which helps routing. There is still no explicit 'use avl.trim instead when X' statement, so alternatives must be inferred from the other tools' names.
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.
5 tool updates
v0.5.0- Added
avl.mesh_sensitivity - Added
avl.prepare_trim - Changed
avl.submit7 fields changed- added
Input schema / $defs / TrimRequestAdded value: +{ + "additionalProperties": false, + "description": "Two native unknowns: alpha and one CONTROL, at zero beta/body rates.\n\nBounds accept or reject a native solution; they do not constrain AVL's iterations.\nCONTROL bounds use the geometry's variable units, not inferred physical angles.", + "properties": { + "alpha_bounds_deg": { + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "title": "Alpha Bounds Deg", + "type": "array" + }, + "cl_tolerance": { + "default": 0.000001, + "exclusiveMinimum": 0, + "title": "Cl Tolerance", + "type": "number" + }, + "cm_tolerance": { + "default": 0.000001, + "exclusiveMinimum": 0, + "title": "Cm Tolerance", + "type": "number" + }, + "control": { + "maxLength": 80, + "minLength": 1, + "title": "Control", + "type": "string" + }, + "control_bounds": { + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "title": "Control Bounds", + "type": "array" + }, + "fixed_controls": { + "additionalProperties": { + "type": "number" + }, + "title": "Fixed Controls", + "type": "object" + }, + "mach": { + "exclusiveMaximum": 0.7, + "minimum": 0, + "title": "Mach", + "type": "number" + }, + "target_cl": { + "title": "Target Cl", + "type": "number" + }, + "target_cm": { + "default": 0, + "title": "Target Cm", + "type": "number" + } + }, + "required": [ + "control", + "target_cl", + "mach", + "alpha_bounds_deg", + "control_bounds" + ], + "title": "TrimRequest", + "type": "object" +} - added
Input schema / properties / conditions / anyOfAdded value: +[ + { + "items": { + "$ref": "#/$defs/FlightCondition" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / conditions / defaultAdded value: +null - removed
Input schema / properties / conditions / itemsRemoved value: -{ - "$ref": "#/$defs/FlightCondition" -} - removed
Input schema / properties / conditions / typeRemoved value: -"array" - added
Input schema / properties / trim_requestsAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/TrimRequest" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Trim Requests" +} - changed
Input schema / requiredPrevious value: -[ - "model_path", - "conditions" -]New value: +[ + "model_path" +]
- Changed
avl.sweep7 fields changed- added
Input schema / $defs / TrimRequestAdded value: +{ + "additionalProperties": false, + "description": "Two native unknowns: alpha and one CONTROL, at zero beta/body rates.\n\nBounds accept or reject a native solution; they do not constrain AVL's iterations.\nCONTROL bounds use the geometry's variable units, not inferred physical angles.", + "properties": { + "alpha_bounds_deg": { + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "title": "Alpha Bounds Deg", + "type": "array" + }, + "cl_tolerance": { + "default": 0.000001, + "exclusiveMinimum": 0, + "title": "Cl Tolerance", + "type": "number" + }, + "cm_tolerance": { + "default": 0.000001, + "exclusiveMinimum": 0, + "title": "Cm Tolerance", + "type": "number" + }, + "control": { + "maxLength": 80, + "minLength": 1, + "title": "Control", + "type": "string" + }, + "control_bounds": { + "maxItems": 2, + "minItems": 2, + "prefixItems": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "title": "Control Bounds", + "type": "array" + }, + "fixed_controls": { + "additionalProperties": { + "type": "number" + }, + "title": "Fixed Controls", + "type": "object" + }, + "mach": { + "exclusiveMaximum": 0.7, + "minimum": 0, + "title": "Mach", + "type": "number" + }, + "target_cl": { + "title": "Target Cl", + "type": "number" + }, + "target_cm": { + "default": 0, + "title": "Target Cm", + "type": "number" + } + }, + "required": [ + "control", + "target_cl", + "mach", + "alpha_bounds_deg", + "control_bounds" + ], + "title": "TrimRequest", + "type": "object" +} - added
Input schema / properties / conditions / anyOfAdded value: +[ + { + "items": { + "$ref": "#/$defs/FlightCondition" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / conditions / defaultAdded value: +null - removed
Input schema / properties / conditions / itemsRemoved value: -{ - "$ref": "#/$defs/FlightCondition" -} - removed
Input schema / properties / conditions / typeRemoved value: -"array" - added
Input schema / properties / trim_requestsAdded value: +{ + "anyOf": [ + { + "items": { + "$ref": "#/$defs/TrimRequest" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Trim Requests" +} - changed
Input schema / requiredPrevious value: -[ - "model_path", - "conditions" -]New value: +[ + "model_path" +]
- Added
avl.trim_physical
1 tool update
v0.4.0- Added
avl.trim
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 14 tools
Most tools have clearly distinct roles: single-case run, multi-case sweep, detached submit, and job control/status/results are readily separable. The main ambiguity is within the trim family (prepare_trim, trim, trim_physical), though their descriptions clarify whether AVL is executed and what inputs are required.
All names use lower snake_case under the avl. namespace, which is consistent at the lexical level. However, the set mixes imperative verbs (run, sweep, submit, inspect) with noun-like resource names (status, results, health) and compound descriptive forms (mesh_sensitivity, trim_physical), so it is readable but not a predictable verb_noun convention.
Fourteen tools is well within the appropriate range for a complex AVL analysis server. Each major phase—inspection, validation, execution, background job control, and result retrieval—has a dedicated tool without obvious filler.
The surface covers the core AVL lifecycle: inspect/validate/health, trim preparation, run/sweep/submit, status/cancel/resume, and results retrieval. Minor gaps such as a job-list operation or explicit geometry/setup management are not central to the apparent analysis scope, but there is no obvious dead end.
Maintenance
Related MCP Connectors
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.
Hosted MCP for creating, checking, deploying, and hosting static sites for AI agents.
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
- AlicenseBqualityBmaintenanceProvides MCP tools for CPACS-oriented TiGL workflows, enabling lifecycle management, inspection, export, and parameter manipulation of aircraft geometry models without native geometry runtimes.113MIT
- AlicenseNot gradedqualityBmaintenanceEnables interaction with SU2 CFD solver for session lifecycle management, config editing, solver execution, and results inspection, with optional CPACS integration for aircraft analysis.6MIT
- FlicenseAqualityDmaintenanceProvides aerodynamic analysis tools through MCP, enabling geometry generation, meshing, CFD solving, and visualization for 2D airfoils.7-