Skip to main content
Glama
SorataYang

Qiao-MCP

๐ŸŒ‰ Qiao-MCP

English ยท ็ฎ€ไฝ“ไธญๆ–‡

Full-lifecycle bridge structural analysis โ€” modeling, staging, code checks
ๆกฅๆขๅ…จ่ฟ‡็จ‹็ป“ๆž„ๅˆ†ๆž MCP ๆœๅŠกๅ™จ โ€” ๅปบๆจกใ€ๆ–ฝๅทฅ้˜ถๆฎตใ€่ง„่Œƒ้ชŒ็ฎ—

Qiao-MCP is a Model Context Protocol (MCP) server that enables AI assistants to interact with bridge structural analysis software. It provides tools for creating bridge models, applying loads, running structural analysis, and reviewing results.

Features

๐Ÿ”ง Tools (15 domain entry points, 153 operations)

Version 0.6.0 exposes 15 domain tools. Each takes a request with an operation selector and the matching fields; its schema includes every operation's full parameter descriptions, defaults and constraints. All 153 legacy names remain directly callable with their original arguments.

Domain tool

Scope

inspect_bridge

Connection, model state and edit readiness

manage_model_files

Open, save and initialize a project

query_model

Definitions, entity searches and geometry checks

edit_geometry

Nodes, elements and bridge layouts

edit_properties

Materials, sections, thickness and time effects

edit_boundaries

Ground supports, node links and beam-end releases

edit_construction

Groups, stages, activation and deactivation

edit_loads

Static cases, combinations and physical loads

analyze_model

Solver settings, dynamics and structural analysis

edit_prestress

Tendon properties, geometry and prestress

edit_traffic

Moving, transversal and international live loads

manage_checks

Model checking snapshots and current code-check context

query_results

Structural, modal, live-load and tendon results

view_model

Display settings, stage views, screenshots and plots

access_backend

Native method discovery and long-tail API calls

For example, send {"request":{"operation":"get_model_status"}} to inspect_bridge. See request examples and compatibility. Set QIAO_MCP_CATALOG_LAYOUT=flat to list the original 153 names instead. Version 0.5.1 used the flat catalog by default.

The 151 non-image operations retain their output schemas and MCP structured content ({status, message, ...}). Connection diagnostics also expose connection_status and connected; bridge templates return the resolved node, element and property IDs. get_model_status preserves QiaoTong's state in status. The two image-capable tools return viewable MCP image content or a text summary. At domain level, 14 entry points publish combined output schemas; view_model supports mixed image/text content. Tool failures use typed MCP errors, and read-only, destructive, and open-world operations carry MCP tool annotations. The server instructions include the full tool-group overview; use list_qtmodel_api before calling an uncovered backend method through the gateway.

Input schemas include parameter descriptions, closed-set selectors, pagination bounds and fixed-size coordinate/DOF arrays. Invalid schema inputs are rejected before a backend call. A beam end release_i / release_j flag means True = release; omitting an end keeps all six DOFs connected. Load combination components use [case_type, case_name, factor], with combine_type=3 for an envelope.

Support overrides preserve omitted coordinate/additional settings. Supplying extra_parameters enables them unless extra_enabled=False explicitly clears them; this behavior also applies to older SDKs that support these options.

0.6.0: domain tools and qtmodel 2.9.3

Version 0.6.0 combines the local 0.5.2โ€“0.5.9 improvements since GitHub release 0.5.1. It retains all 153 operations and legacy calls behind 15 domain entry points, including the corrections documented in the tool audit. See the release and upgrade notes. Section creation/deletion, stage deletion and vertical prestress checking now explain their prerequisites, selection boundaries and write behavior. Iteration results are recorded in the optimization log. add_custom_temperature accepts native [reference, height, temperature] rows (reference 1=top, 2=bottom; orientation 1=local Z, 2=local Y). Two-value rows are rejected because they omit the reference. Mutation selections reject blank, Boolean and fractional IDs; renumbering requires BOTH complete lists, or BOTH omitted to intentionally renumber the whole model.

Screenshots and plots now retrieve PNG bytes for storage on the MCP host. Partial updates require unique, complete readback; checking queries preserve typed fields. Live-load results expose envelope_type=1 (maximum) or 2 (minimum). Inspect the audit for solver, section-numbering, group-query and idealized support corrections.

Locked installs now use qtmodel 2.9.3. With its instance context and a desktop advertising model_instance_guard=1, mutations and commits carry the same model instance identifier, including analysis worker threads. Gateway undo_model also checks model/history revisions when model_revision_schema=1; pending or uncertain edits block that Undo. On mismatch, inspect the active model and command history before deciding whether to issue another operation. Older protocols keep existing state checks. Initialize/open and legacy raw-path file routes retain their existing contracts and cannot carry this new binding; it does not provide transaction rollback or bind separate client requests into one reviewed plan.

Choosing operations

Complete Args text is published in parameter schemas; each domain lists the operations it accepts. Select the operation matching the intended effect.

Choose absolute node edits with update_node, offsets with move_nodes, and numbering with update_node_id/renumber_nodes. For sections, calc_section_property evaluates supplied geometry, get_model_data reads stored properties, and calculate_section_property rewrites all existing sections. Tendon definitions, computed losses and coordinates have separate query tools. Automatic self-weight is controlled by stages, not by creating a case named ่‡ช้‡.

See the selection scenarios and catalog decisions, audit and release notes.

0.5.0: queries, transversal analysis, check snapshots and international loads

This version implements B1โ€“B4 with 20 new tools and one workflow prompt. It includes all changes since 0.3.3, including work previously labeled 0.4.0. See the release notes, upgrading from 0.3.3, and the offline validation. New commands require a supporting QiaoTong build. The live validation records successful basic statics, partial B1 coverage and the known backend limitations.

get_model_edit_readiness is read-only and remains accessible when model operations are blocked. Its success status means a response was received, not that editing is safe; inspect the raw readiness object. No token is retained/reused, and no stages/results are changed.

query_model_data takes a typed request, for example:

{"request": {"kind": "nodes", "structure_group_names": ["MainGirder"], "limit": 20, "offset": 0}}

Kinds: nodes, elements, boundaries, loads, node_local_axes, section_summaries. Names are lists; IDs are positive integers/lists, not range strings. Nodes need at least one filter; near and tolerance must be paired. Qiao-MCP caps filter lists/pages at 500; section summaries allow only 100 explicit IDs and 100 items per page. The structured data field preserves native page metadata without recomputing totals or slicing again. Unsupported endpoints fail explicitly rather than downloading everything for local filtering.

get_model_data additionally supports material_summaries, material_detail, load_case_summaries, load_case_detail, load_combination_summaries, load_combination_detail, construction_stage_summaries, element_section and spans. New details use one positive integer (or one-item integer list) in ids; element_section uses position=0|1. Load-case/combination detail pagination runs on the server; other list kinds retain their existing text pagination. Summaries are not full write-back snapshots, and construction stage IDs follow stage order.

configure_live_load_system explicitly selects one of the five live-load systems; clearing old definitions defaults to off. configure_operation_stage requires all four case lists; [] disables that family. These tools commit settings without running analysis.

Transversal definitions use set_transversal_vehicle / set_transversal_lane with a complete typed request and action="add"|"update". Both may replace existing definitions. Select china_transversal first. Loads use kN and lengths use m regardless of display units. Lane nodes remain in input order and must be directly joined by beam elements; distribution_widths are meters. Use the returned data.index or get_transversal_data for references. Readback retains the native lane field load_factors; map it to distribution_widths when editing.

set_transversal_case validates the referenced vehicle/lane IDs and accepts positive reduction_factors for 1..N lanes plus greater_lane_factor for more than N. remove_transversal_data requires an explicit target; vehicle/lane deletion defaults to cascade=False. Case deletion does not accept cascade. Combination and operation-stage references must be removed explicitly first.

Base-model reinforcement uses set_section_reinforcement with a complete UI-exported snapshot, or remove_section_reinforcement with an explicit full section identifier (1, 1-I, 1-J, G7-2). Every snapshot field is required; empty arrays clear that part. Six-entry outer/inner rows and model length units differ from the legacy parametric tool. Current CSAN queries are not lossless model snapshots. The new tools require model-write permission and commit once.

set_check_stirrup_snapshot preserves the full exported definition and accepts original_id for renumbering. set_element_stirrups replaces complete shear (five entries) and torsion (three entries) assignments independently: null keeps a family, [] clears it, and stirrup ID 0 means unassigned. These are separate from the legacy current-CSAN stirrup tools.

manage_check_material sets a full exported override or resets an explicit ID to its base material. manage_check_case_definition sets/removes concrete, seismic and strengthening model definitions with native enum values. The existing run_concrete_check imports the named concrete case after these commits; it does not run seismic or strengthening checks. Preserve the complete exported material properties/parameters and stored units instead of constructing partial snapshots. Reported failed, canceled or other non-success completion states are tool errors, including on older SDKs whose waiters return them without raising.

International vehicles use set_international_vehicle with a request discriminated by standard="AASHTO"|"BS"|"EN1991". Select the matching model system first. parameters and load_items must be explicit, even for {}/[]. Both add and update replace the definition; omitted/null scalars use new-definition defaults. Update locates the original name and retains its actual ID/references. Writes commit once and return a definition read back by exact name.

Standard

Native units and conventions

AASHTO

Axles [N, m], w N/m, lengths m, r percent (90 = 90%)

BS

pa/pb kN, w3 kN/m, lengths m; w1/w2 formula coefficients and dimensionless exponents

EN1991

Axles [kN, m], uniform loads kN/m, point load kN, lengths m; loaded lengths and spacings are distinct

The SDK does not specify the BS axle-force unit. Use verified native BS axle export/query values unchanged; do not infer their unit from another standard. get_international_live_load_data(kind="vehicles"|"cases") retains complete native fields; selection and pagination run locally over its native whole-list response. Vehicle exports may contain inactive parameters for other standards: select the documented fields for the typed tool, or use the existing gateway to replay an unchanged full native definition. No global unit conversion is applied.

create_en1991_vehicle selects a native source="standard"|"user" factory with an explicit name. Standard vehicles expose effective factory controls only; their code-generated uniform loads/lengths/spacings cannot be overridden. User vehicles retain those fields plus p/dis, load_length, num and point_load; LM71 uses four 250 kN axles when both p/dis are null. Factory writes also read back the actual vehicle ID. For example, after selecting en1991:

{"request": {"source": "standard", "name": "LM71", "load_type": "LM71"}}

set_planned_lane requires the plane, reference tandem, width, vehicle count, signed offset and direction. It uses its own endpoint, distinct from add_traffic_lane(optimize=True). There is no independent planned-lane getter; its response confirms the commit, and model export/UI inspection verifies the definition. Gateway deletion must pass lane_kind="planned" to remove_lane_line.

set_international_live_load_case checks each vehicle's exact name and expected standard before writing. Subcases select ordinary/planned lanes with optimized=False|True; EN1991 rejects duplicate lane assignments. QiaoTong checks lane existence, lane kind and influence-plane membership. Factor objects use complete native field names and values; null means server defaults, including on update. Configure live_load_cases explicitly with configure_operation_stage, then use run_analysis and get_analysis_results(case_name_mode="full") with a result identifier verified from QiaoTong. Definitions never start analysis. Vehicle/case deletion remains available through remove_international_vehicle and remove_live_load_case in the existing gateway.

0.5.0 also tracks upstream 0687ffe through the existing gateway for mass/stiffness factors, flange/effective-width definitions, statistics and structure merges. See the API alignment record. Model weight queries use fixed N, independent of display units.

๐Ÿ“ฆ Resources (7 resources)

URI

Description

bridge://model/summary

Model overview

bridge://model/materials

Material list

bridge://model/sections

Section list

bridge://model/load-cases

Load cases

bridge://model/stages

Construction stages

bridge://model/structure-groups

Structure groups

bridge://model/boundaries

Boundary conditions

๐Ÿ’ฌ Prompts (5 workflows)

Prompt

Description

design_simple_beam

Simple beam bridge design workflow (็ฎ€ๆ”ฏๆข่ฎพ่ฎก)

design_continuous_beam

Continuous beam bridge design (่ฟž็ปญๆข่ฎพ่ฎก)

check_structure

Structural code checking (็ป“ๆž„ๆฃ€็ฎ—)

construction_stage_analysis

Construction stage analysis (ๆ–ฝๅทฅ้˜ถๆฎตๅˆ†ๆž)

analyze_transversal

Explicit transversal definitions, configuration, solve and verified result identifiers

For ordinary static cases, get_analysis_results keeps its automatic ST: prefix. Use case_name_mode="full" with a complete identifier verified from QiaoTong results/UI for other result families. It is passed unchanged; TV/MV combination codes are not evidence of a result endpoint's naming convention.

Related MCP server: OpenSTAAD MCP Server

Architecture

qiao-mcp/
โ”œโ”€โ”€ src/qiao_mcp/
โ”‚   โ”œโ”€โ”€ server.py              # MCP server entry point
โ”‚   โ”œโ”€โ”€ tools/                 # MCP Tools (envelope-wrapped)
โ”‚   โ”œโ”€โ”€ resources/             # MCP Resources
โ”‚   โ”œโ”€โ”€ prompts/               # MCP Prompts
โ”‚   โ””โ”€โ”€ providers/             # Backend adapters
โ”‚       โ”œโ”€โ”€ __init__.py        # BridgeProvider abstract base
โ”‚       โ””โ”€โ”€ qtmodel_provider.py  # QiaoTong adapter
โ”œโ”€โ”€ tests/                     # Offline unit, integration, and API contract tests
โ””โ”€โ”€ reference-docs/            # Review notes and project documentation

The Provider pattern keeps the 153 operations decoupled from any single backend. Select one with BRIDGE_PROVIDER; each provider declares its own software-specific rules, so the LLM adapts without prompt changes. Currently supports:

Adding a backend means implementing BridgeProvider and registering one line โ€” no tool-layer changes. See Backend Selection.

Quick Start

Prerequisites

  • Python >= 3.11

  • uv package manager

  • qtmodel 2.6.3 โ€“ 2.9.x, except 2.9.0 (installed by uv sync; 2.9.3 is the current lock)

  • QiaoTong software running when calling backend model, analysis, or visualization operations (see Compatibility for which versions pair with which)

The MCP server can start without QiaoTong. Use check_qiaotong_connection to distinguish a connected server from software that is not running, and get_model_status to see whether a model is open and which operations the current QiaoTong state allows.

Install & Run

# Install dependencies
uv sync

# Run the server
uv run qiao-mcp

Configure in Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "qiao-mcp": {
      "command": "uv",
      "args": ["--directory", "/path/to/qiao-mcp", "run", "qiao-mcp"]
    }
  }
}

Configure in Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "qiao-mcp": {
      "command": "uv",
      "args": ["--directory", "/path/to/qiao-mcp", "run", "qiao-mcp"]
    }
  }
}

Configure in Reasonix (UI)

Open Settings โ†’ MCP & Tools, then add a new MCP server:

  • Name: qiao-mcp

  • Transport: stdio (keep default)

  • Command: uv --directory /path/to/qiao-mcp run qiao-mcp

    • Replace /path/to/qiao-mcp with your actual project path

    • Windows: use backslashes D:\path\to\qiao-mcp

    • macOS/Linux: use forward slashes /path/to/qiao-mcp

  • Environment (optional): UV_PYTHON=3.11

Click Add to save.

Configure in Cherry Studio (UI)

Open ่ฎพ็ฝฎ โ†’ ๆ‰ฉๅฑ• โ†’ MCP Servers, then add a new server:

  • ๅ็งฐ (Name): qiao-mcp

  • ๆ่ฟฐ (Description): Optional description

  • ็ฑปๅž‹ (Type): ๆ ‡ๅ‡†่พ“ๅ…ฅ / ่พ“ๅ‡บ (stdio)

  • ๅ‘ฝไปค (Command): uv

  • ๅŒ…็ฎก็†ๅ™จ (Package Manager): Select ้ป˜่ฎค (Default)

  • ๅ‚ๆ•ฐ (Args):

    /path/to/qiao-mcp
    run
    qiao-mcp

    (Each line is one argument, no --directory prefix needed)

    • Replace /path/to/qiao-mcp with your actual project path

Click ไฟๅญ˜ to save.

Test with MCP Inspector

npx @modelcontextprotocol/inspector uv run qiao-mcp

LAN debugging proxy

For cross-machine debugging, scripts/qiaotong_lan_proxy.py forwards a LAN-facing port to the QiaoTong API on the same machine. It uses 45125 for the proxy and forwards to the selected QiaoTong process on 127.0.0.1:55125:

python scripts/qiaotong_lan_proxy.py

Then point the client machine at:

from qtmodel import mdb

mdb.set_url("http://<proxy-machine-LAN-IP>:45125/pythonForQt/")

The proxy prints each forwarded request and response. When several QiaoTong processes are running, keep one process on 55125 for this fixed proxy, or use separate proxy instances and ports for separate processes.

An SSH tunnel is an alternative that does not expose the API port on the LAN:

ssh -N -L 45125:127.0.0.1:55125 <user>@<qiaotong-machine-LAN-IP>

Use http://localhost:45125/pythonForQt/ in the client machine while the tunnel is running. Windows HTTP.sys validates the Host header and rejects 127.0.0.1 with 400 Invalid Hostname in this setup.

Development

# Install in dev mode (includes ruff, mypy, pytest)
uv sync

# Run directly
uv run python -m qiao_mcp.server

# Quality checks and offline regression tests
uv run ruff check src/ tests/
uv run mypy src/qiao_mcp/
uv run pytest tests/ --ignore=tests/test_end_to_end.py -q

The command above runs offline โ€” it does not require the QiaoTong software. Provider/tool calls are validated against the installed qtmodel API signatures (contract tests) and dispatched against an in-process fake backend. The excluded end-to-end test requires a disposable QiaoTong model: it clears and rebuilds the active model before solving.

Backend: QTModel (ๆกฅ้€š)

This MCP server wraps the qtmodel Python API which provides access to:

  • mdb โ€” Model database: querying, building & modifying bridge models

  • odb โ€” Output database: querying analysis results & visualization

  • cdb โ€” Check database: structural verification & code checking

Versioning

Qiao-MCP versions independently from qtmodel โ€” the project iterates on its own (bug fixes, new tools, docs) without waiting for a backend release, and a backend release does not force a version bump here. The backend requirement is expressed where it belongs: in the dependency constraint.

Compatibility

Qiao-MCP

qtmodel

QiaoTong software

0.6.0

2.6.3 โ€“ 2.9.x, not 2.9.0

Same backend requirements; 15 domain tools with all 153 legacy operations

0.5.1

2.6.3 โ€“ 2.9.x, not 2.9.0

With 2.9.x, QiaoTong must report model state; new commands require server support

0.5.0

2.6.3 โ€“ 2.9.x, not 2.9.0

With 2.9.x, QiaoTong must report model state; new commands require server support

0.3.2 โ€“ 0.3.3

2.6.3 โ€“ 2.8.x

2.6.3+; 2.8.x pairs are no longer pinned

0.3.0 โ€“ 0.3.1

2.6.3 โ€“ 2.6.x

2.6.3 (exact match enforced by qtmodel)

0.2.x

2.5.0 โ€“ 2.5.x

2.5.0

Known lower-bound limitation: qtmodel 2.6.3 lacks get_load_group_names, so the one-shot bridge workflow tools cannot run on that version. This is an existing limitation; use 2.6.4 or later for those workflows (2.9.0 remains excluded). The dependency range does not guarantee every new tool on every build: missing methods or incompatible parameters fail explicitly before writes. See the current audit matrix for capability differences: PyPI 2.6.3, 2.6.4, 2.8.2, 2.9.1, 2.9.2 and 2.9.3, plus reference 0687ffe. These tests verify software contracts; complete engineering acceptance remains pending. qtmodel 2.9.3 explicitly rejects historical check-snapshot and planned-lane add/update routes with API_NOT_OPEN; a method appearing in the SDK catalog does not prove that its desktop route exists.

How the two sides are matched changed in qtmodel 2.8.2:

  • qtmodel 2.6 / 2.7 perform a strict version handshake โ€” the QiaoTong API version and the installed qtmodel must match exactly, otherwise check_qiaotong_connection reports version_mismatch and refuses to connect.

  • qtmodel 2.8.2 removed that handshake. Any QiaoTong that exposes the Python API connects, so version_mismatch no longer occurs. The trade-off is that an older QiaoTong may simply lack newer commands; get_model_status surfaces that as state_unknown (the software predates the model-state handshake) so tools fail closed instead of writing blind.

Different builds report qtmodel 2.8.2: the PyPI wheel (2026-08-20) does not include QtServer.get_model_state, while the upstream source at the same version does. Qiao-MCP detects the capability rather than the version โ€” without it the model-state guard is skipped (guard_unavailable) and tools behave as in 0.3.1; with it, every tool is gated on the state QiaoTong reports. qtmodel 2.9.0 is the first PyPI release that includes it, so on 2.9.x the guard is always active.

Live-tested backend limitations

Live testing on 2026-10-12 used QiaoTong 26.1.116.1010 with qtmodel 2.9.2. An isolated cantilever model passed reaction, bending-moment and translation checks; tip displacement differed from the shear-inclusive hand calculation by about 0.00125%. The same run confirmed these backend limitations:

  • GET-DEFORMATION returns an incorrect rz, equal to ry in the tested cases. The solver database contains the correct Rz. Do not rely on the API Rz from this build; Qiao-MCP does not invent a replacement value.

  • configure_live_load_system is rejected with ๆœช็Ÿฅๅ‚ๆ•ฐ๏ผšclear_existing. The transversal workflow stops at system selection. International workflows share that prerequisite and were not run; individual international interfaces were not established as unsupported by this test.

  • SET-SECTION-REINFORCEMENT, SET-CHECK-STIRRUP and SET-CHECK-CASE are rejected as unknown commands. Full reinforcement/check-snapshot acceptance remains open.

connected or compatible does not certify these features. Use a supporting QiaoTong build and verify it against the live-test record. BS axle-force units also remain unconfirmed upstream.

Upgrading from 0.3.3

0.5.0 includes an incompatible correction to add_nodal_mass:

  • Use mass for equal translational mass along X, Y and Z, for example {"node_id": 1, "mass": 10}. Optional mass_x/mass_y/mass_z override individual directions; omitted directions use mass, whose default is zero.

  • mass_rm is removed. Specify the intended rotational inertia axis with rot_x, rot_y or rot_z; do not mechanically rename the old parameter.

  • Unequal directional masses require an SDK with mass_xyz support (the supported PyPI 2.9 builds are 2.9.1 and 2.9.2). Older builds reject them before writing.

Earlier versions put some translational mass arguments into rotational fields. Upgrading the package does not repair existing models: read back previously written nodal masses and check them against the intended engineering values. Also review the changelog for stricter creep/material validation, fractional stage durations and the model-state requirements above.

Upstream qtmodel 2.9 alignment

The current reference is 0687ffe, labeled 2.9.2 but different from the PyPI 2.9.2 wheel. The earlier local baseline was 8ae651e, whose package matched that wheel apart from its older version label. See the API alignment record for the subsequent changes.

  • Write safety. A write whose reply is lost raises CommandOutcomeUnknownError and is no longer resent. Qiao-MCP reports it as an unknown outcome and tells the client to read the model back before doing anything else.

  • Client-side validation. Many writes now reject malformed values before sending them. Qiao-MCP's schemas match: nonempty creep/shrink curves, 26- or 29-value section property tables, per-code creep parameter counts and data_info for custom materials.

  • Nodal mass layout. add_nodal_mass documents mass_info as (mass, inertia X, Y, Z) and adds mass_xyz for direction-specific masses. Qiao-MCP now sends that layout (see the changelog for the corrected fields).

  • Existing tools expose new parameters. Construction stages support fractional durations and sub_steps; create_material adds is_orthotropic / ey; set_support and add_elastic_support add coordinate, extra_enabled and eight-value extra_parameters. Unidirectional elastic supports also accept signed axis_direction. add_influence_plane adds always_divided_by_beam_shape, and create_live_load_case adds the per-sub-case boolean list sub_case_optimized. Omitted options keep legacy behavior; explicit options are checked against the installed signature before writing. Fractional stage creation is rejected on builds that would truncate it. These additions are included in 0.5.0; its catalog has 153 tools.

  • Operation settings and cascade deletion. configure_operation_stage exposes all four case lists, including transversal cases. The gateway method update_operation_stage_setting remains available; supply all intended case lists because omitted/empty lists disable their analysis. remove_material defaults to cascade=True (also deletes associated tendon properties and tendons). remove_tendon_property defaults to False; True deletes referencing tendons and their loads without a dialog. Confirm the deletion scope first; omitting both name and index targets all objects.

  • Dedicated tools and long-tail APIs. 0.5.0 adds dedicated transversal, international/planned-lane, reinforcement/check-snapshot and edit-readiness tools. Exact object deletion (delete_model_object), factors, effective widths, statistics and structure merges remain available through the gateway. Every MDB write and the explicit CDB model-snapshot methods commit with update_model.

  • Blocked in the gateway. post_python_file (reads a local file and posts it to any URL for execution), prepare_model_edit (can irreversibly delete results; for the host application after user approval), export_api_help (writes SDK help to any local path), and the pre-existing ensure_running, set_url, set_version, export_qt_helper and wait_solve (polls without a time limit; use run_analysis).

Upstream Source Changes (2026-09-04โ€“08)

These changes, first synced at 2316654 while still labeled 2.8.2, are part of 2.9.0:

  • ac4dbad moves model queries from odb to mdb. Qiao-MCP prefers the new namespace and falls back to odb when the method is absent. Existing-model section geometry uses mdb.get_model_section_shape; mdb.get_section_shape remains the local geometry builder. Analysis results and views stay on odb.

  • bc1ee99 returns typed model records supporting to_dict() and Mapping. The provider recursively converts them to plain JSON data for tools, resources and the API gateway, preserving original server fields. MDB query calls use read permission, not model-write permission, and never refresh the model. State-changing calls such as calculate_section_property still require model-write permission.

  • 6821413 splits model objects into domain modules and keeps core.model_db as a compatibility export. The adapter does not depend on those internal paths.

  • The September 7โ€“8 updates add t_out to thickness definitions, show_view to solving, twelve analysis-setting reset APIs and three batch thickness APIs. Qiao-MCP exposes the two new options on its existing tools; the fifteen management APIs are available through the discover-then-call gateway.

Build compatibility: these options and management APIs ship in the PyPI 2.9.x releases; the PyPI 2.8.2 build (August 20) lacks them. Default tool calls keep working on either; explicit t_out or show_view=True requests fail before writing or starting a solve if the installed API does not accept them. A matching version label alone does not establish feature support.

MCP tool-call examples with a supporting qtmodel build:

add_thickness(name="Deck", t=0.20, t_out=0.30, thick_type=0)
run_analysis(read_timeout=3600, show_view=True)
list_qtmodel_api(api_object="mdb", pattern="thickness")
call_qtmodel_api(api_object="mdb", method="copy_thicknesses", kwargs={"ids": [1, 2]})
list_qtmodel_api(api_object="mdb", pattern="reset_")

thick_type means 0 = ordinary plate, 1 = ribbed plate, not equal/unequal in-plane and out-of-plane thickness. Omitting t_out uses t for both. show_view controls the QiaoTong progress window only: solving still uses background execution, polling and MCP progress heartbeats.

Batch thickness APIs accept positive integer IDs or lists, not range strings. remove_thicknesses([]) deletes nothing. Analysis resets delete settings, and arrange_thickness_ids changes IDs and references; discover the intended method and confirm the intended change before calling these write APIs.

To test the reference source without replacing the installed package (macOS/Linux):

PYTHONPATH=reference_codes/qtmodel-release/packages/qtmodel/src:src uv run pytest tests/ --ignore=tests/test_end_to_end.py -q

0.x signals the API is still free to change; it is not a statement about release quality. When moving to a new qtmodel minor line, raise the dependency bound and add a row to the table above.

License

Copyright 2026 Sorata (https://github.com/SorataYang)

Licensed under the Apache License, Version 2.0. See LICENSE. Additional attribution notices are available in NOTICE.

Available Tools

15 tools
access_backendNative API discovery and calls / ๅŽŸ็”Ÿ API ๆฃ€็ดขไธŽ่ฐƒ็”จA
Destructive

Discover installed qtmodel methods and call a native API when a dedicated domain operation does not expose the required feature (ๆฃ€็ดขๅนถ่ฐƒ็”จ้•ฟๅฐพๅŽŸ็”ŸๆŽฅๅฃ).

Start with list_qtmodel_api for the mdb/odb/cdb object and a method pattern; then call_qtmodel_api with the verified method name and keyword arguments. Prefer the relevant domain operation for supported tasks because it supplies typed arguments and engineering guidance. Use inspect_bridge for connection diagnostics; method discovery alone does not establish desktop route availability or permission to mutate a model.

request.operation distinguishes inspection from execution. kwargs are native backend parameters with method-specific units; do not translate field names, invent signatures or infer units from another endpoint. Calls retain model-state guards and gateway management rules, but the selected method may overwrite/delete data or perform external effects. Review its discovered contract and current state before execution. The result is the normalized native response; unsupported routes and failed calls are errors. A lost write reply has an unknown outcome: inspect the affected objects before any retry, since no automatic rollback is offered.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructive/open-world/non-idempotent, and the description goes well beyond them: model-state guards persist, the selected method may overwrite/delete or trigger external effects, unsupported routes and failed calls are errors, and a lost write reply has unknown outcome with no automatic rollback, so objects must be inspected before retry. Nested branch docs add permission tiers, update_model commit semantics, and cascade defaults for removals. No contradiction with destructiveHint=true.

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

Conciseness4/5

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

The top-level description is front-loaded โ€” purpose first, workflow second, hazard warning last โ€” and every sentence carries a constraint. It is dense but justified for a destructive escape hatch; the very large nested branch documentation (

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

Completeness5/5

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

With an output schema present, return-value documentation is unnecessary, and safety hints are already in annotations, yet the description still covers auth/permission implications, state guards, forbidden methods, no-rollback retry policy, and the discovery prerequisite. Nothing an agent needs before invoking a destructive native call is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description lifts it by saying kwargs are native backend parameters with method-specific units, that field names must not be translated, that signatures must not be invented or units inferred from another endpoint, and that operation distinguishes inspection from execution. These are genuinely useful usage constraints, though they are meta-rules rather than per-parameter meaning.

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

Purpose5/5

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

States a specific two-part verb+resource: discover installed qtmodel methods and call a native API, explicitly scoped to cases where "a dedicated domain operation does not expose the required feature." It separates itself from curated siblings and names the two sub-operations (list_qtmodel_api, call_qtmodel_api) plus the diagnostic sibling (inspect_bridge), so an agent can route without opening a schema.

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

Usage Guidelines5/5

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

Gives an explicit when-to-use condition (curated tool lacks the feature), an explicit preference/exclusion ("Prefer the relevant domain operation for supported tasks because it supplies typed arguments and engineering guidance"), a mandated two-step workflow, and a redirect for a related need (inspect_bridge for connection diagnostics). The nested branch docs reinforce this with a list of forbidden methods and their designated replacements.

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

analyze_modelStructural analysis and dynamics / ็ป“ๆž„ๆฑ‚่งฃไธŽๅŠจๅŠ›่ฎพ็ฝฎA
Destructive

Configure and run structural analysis, including masses, response spectra, time-history functions/cases and buckling settings (้…็ฝฎๅนถๆ‰ง่กŒ็ป“ๆž„ๅˆ†ๆž).

configure_analysis sets construction/creep/modal solver switches; update_bulking_setting sets basic buckling controls. Mass and dynamic function/case operations define solver inputs. set_gravity writes the project gravity setting. These configuration operations do not solve: choose run_analysis explicitly after model, loads and stages are ready. Use query_results for solved responses and manage_checks for concrete code verification, which is a separate computation.

request.operation selects its own fields and units. Spectrum/time-history functions and cases must be linked through the appropriate backend settings; use access_backend for options absent from a dedicated operation. Configuration defaults can overwrite prior settings: read them first when preserving an existing setup. run_analysis reports periodic progress while the solver runs, and only a successful terminal state is completion. Its read_timeout limits waiting, not the backend computation; timeout or connection loss does not cancel the solve. Check inspect_bridge before retrying. Neither a completed solve nor a configuration confirmation establishes structural safety or a passing code check.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and idempotentHint=false; the description earns credit by explaining why: configuration defaults overwrite prior settings, so prior setup is not preserved. It also discloses non-obvious runtime behavior โ€” progress heartbeats, success only on a successful terminal state, read_timeout bounding the wait rather than the solve, and the fact that timeout does not cancel the computation. The disclaimer that neither a completed solve nor a confirmation implies code-check safety adds further value.

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

Conciseness4/5

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

Purpose is front-loaded in the first sentence, and the length is defensible for a ten-operation dispatcher. However, the middle sections are dense and mix sibling routing, sequencing, timeout semantics and safety caveats without strong visual separation, making some sentences carry multiple ideas. Slightly tighter grouping would improve scanability.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, and the description correctly focuses on what is missing elsewhere: per-operation routing, execution order, the no-solve-vs-solve distinction, and the overwrite caveat. For a dispatcher spanning configuration, dynamic inputs and solving, this covers everything an agent needs to invoke the right branch correctly.

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

Parameters3/5

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

The single top-level parameter has 100% schema description coverage, and the per-operation sub-schemas document fields, units and defaults in detail, so the schema does the heavy lifting. The description's note that 'request.operation selects its own fields and units' largely restates the discriminator guidance already present in the schema. This meets the baseline for a well-covered schema without adding much beyond it.

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

Purpose5/5

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

The opening sentence names a specific verb+resource ('Configure and run structural analysis') and enumerates the concrete sub-domains it covers (masses, response spectra, time-history functions/cases, buckling). It also routes explicitly against siblings, noting query_results for solved responses, manage_checks for concrete verification, and access_backend for options lacking a dedicated operation. An agent can place this tool in the workflow without opening the schema.

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

Usage Guidelines5/5

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

States when to use it (after model, loads and stages are ready), when it does NOT act ('These configuration operations do not solve: choose run_analysis explicitly'), and names alternatives for adjacent concerns (configure_analysis, update_bulking_setting, query_results, manage_checks). Practical sequencing guidance is included ('read them first when preserving an existing setup', 'Check inspect_bridge before retrying').

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

edit_boundariesSupports, links and constraints / ๆ”ฏๆ‰ฟ่ฟžๆŽฅไธŽ็บฆๆŸA
Destructive

Edit mechanical boundary conditions on existing nodes and frame elements (็ผ–่พ‘ๅทฒๆœ‰่Š‚็‚นๅ’Œๆ†็ณปๅ•ๅ…ƒ็š„ๅŠ›ๅญฆ่พน็•Œๆกไปถ).

Use this domain for restraint or connection behavior. Choose request.operation by the physical relationship:

  • Node to ground: set_support for fixed/free DOFs; add_elastic_support for finite stiffness or one-way contact.

  • Node to node: add_elastic_link for a two-node connection; add_master_slave_link for one master and multiple coupled slaves.

  • Frame end: add_beam_constraint for I/J-end releases or end springs.

  • Weighted DOF relation: add_constraint_equation; remove_boundary removes a selected family using its node, element, name or boundary selector.

For group creation or stage activation use edit_construction; for actual node connectivity use edit_geometry. Resolve existing IDs with query_model. The same boolean has different mechanical meanings: True fixes a DOF in set_support, couples it in add_master_slave_link, and RELEASES it in add_beam_constraint. Use the selected branch's DOF order and stiffness units. For support extras, supplied extra_parameters enables them by default; extra_enabled=False clears them, while omitting both preserves the setting.

Writes can overwrite supports/releases or remove constraints and change stability. There is no backup, undo or automatic solve. The response is a confirmation, not a verified saved definition. Read boundaries back and check local axes before analyze_model; inspect an uncertain write before retrying to avoid duplicating a link or removing the wrong constraint.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and non-idempotent, and the description reinforces this beyond the annotation alone: writes can overwrite supports/releases, remove constraints and change stability, there is no backup/undo/auto-solve, and the response is a confirmation rather than a verified saved definition. The most valuable addition is the warning that the same boolean means fix/couple/release in different branches, which annotations cannot express.

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

Conciseness4/5

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

Well front-loaded (purpose, then operation-selection routing, then semantic caveats, then write-safety warnings) and every paragraph carries distinct information. It is longer than average but the length is justified by the seven-branch discriminated union; only the embedded Chinese translations add some redundancy.

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

Completeness5/5

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

For a complex multi-branch mutation tool with an output schema present, the description covers operation selection, permission/existence prerequisites, boolean cross-branch semantics, overwrite behavior, readback guidance before analyze_model, and retry caution. Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds genuine cross-branch semantics the schema cannot: the identical boolean flag has three different mechanical meanings depending on the selected operation, and extra_parameters is enabled by default when supplied while extra_enabled=False clears it. This meaning-per-branch guidance materially aids correct invocation.

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

Purpose5/5

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

States a specific verb+resource ('Edit mechanical boundary conditions on existing nodes and frame elements') and then enumerates the seven sub-operations by physical relationship (node-to-ground, node-to-node, frame end, weighted DOF). An agent can distinguish it from edit_geometry, edit_construction, and query_model without opening the schema.

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

Usage Guidelines5/5

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

Explicitly routes each case: node-to-ground uses set_support/add_elastic_support, node-to-node uses add_elastic_link/add_master_slave_link, and it names edit_construction and edit_geometry as the alternatives for their own concerns plus query_model for ID resolution. When-to-use and when-not-to-use are both covered.

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

edit_constructionGroups and construction schedules / ๅˆ†็ป„ไธŽๆ–ฝๅทฅ้˜ถๆฎตA
Destructive

Manage structure/boundary/load groups and construction or operation-stage schedules, including activation and deactivation (็ฎก็†ๅˆ†็ป„ไธŽ้˜ถๆฎตๆฟ€ๆดปใ€้’ๅŒ–).

Group operations create/rename/remove groups or change memberships; add_to_structure_group accepts nodes and elements, and add_elements_to_group is its element-only compatibility form. add_construction_stage creates a stage; update_construction_stage edits its activation/deactivation lists. delete_structures/delete_boundaries/delete_loads deactivate groups in that stage without deleting their definitions. remove_construction_stage removes stages; merge_operation_stage builds the operation stage. set_self_weight_stage assigns self-weight timing and configure_operation_stage selects case families. Use edit_loads for physical loads and view_model for stage display only.

Select request.operation and its fields. Group names are exact references in three separate namespaces; referenced definitions must already exist. A missing optional list and an explicit empty list have different effects. configure_operation_stage requires all four case-family lists; [] disables that family. Removing a group does not remove its model entities; removing a stage and deactivating a group are separate operations. Writes refresh the model, with no solve or automatic schedule rollback. Read groups/stages through query_model before and after changing an existing schedule.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructive=true, idempotent=false and openWorld=false, but the description adds substantial non-redundant behavior: writes 'refresh the model, with no solve or automatic schedule rollback', group removal leaves model entities intact, and that a missing optional list differs from an explicit empty list. These are mutation-safety facts an agent cannot derive from the annotation hints alone, so it exceeds the lowered bar for annotated tools.

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

Conciseness4/5

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

Purpose is front-loaded, followed by operation inventory, routing guidance, and semantics, with no filler sentences. It is dense and slightly prose-heavy for a 14-branch dispatch tool, but each clause carries routing or behavior information. A bulleted per-operation list would scan faster, which is the only reason it falls short of 5.

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

Completeness5/5

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

Output schema exists, so return-value explanation is unnecessary and the description does not waste space on it. For a 14-operation destructive dispatch tool it covers the prerequisites (referenced definitions must already exist), the empty-vs-missing trap, non-rollback, no-solve, and read-before/after practice. Nothing an agent needs to invoke a branch correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the per-operation branch schemas are themselves richly documented, so the baseline is 3. The description nonetheless adds cross-cutting semantics the schema does not state at the dispatch level: three separate group namespaces with exact-name references, empty-list vs omitted-list divergence, and the requirement that configure_operation_stage receive all four case-family lists with [] as an explicit disable.

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

Purpose5/5

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

States a specific domain verb ('Manage') over concrete resources (structure/boundary/load groups plus construction/operation-stage schedules) and names the activation/deactivation scope explicitly. It routes away from siblings by name ('Use edit_loads for physical loads and view_model for stage display only'), so an agent can distinguish it from edit_loads, edit_boundaries and view_model without opening the schema. The clause enumerating the constituent operations makes the dispatch surface unambiguous.

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

Usage Guidelines5/5

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

Explicit alternatives with conditions are given: edit_loads for physical loads, view_model for stage display only, and query_model for reading groups/stages 'before and after changing an existing schedule'. It also supplies a read-before-write workflow and distinguishes remove-a-group from deactivate-a-group and remove-a-stage from deactivate-in-a-stage. Nothing about when to reach for this tool is left to inference.

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

edit_geometryNodes, elements and bridge layouts / ่Š‚็‚นๅ•ๅ…ƒไธŽๆกฅๆขๅธƒ็ฝฎA
Destructive

Create, edit, renumber, merge or remove model nodes and elements, including standard straight-girder workflows (็ผ–่พ‘่Š‚็‚นใ€ๅ•ๅ…ƒไธŽๆ ‡ๅ‡†็›ด็บฟๆขๅธƒ็ฝฎ).

Choose explicit coordinate rows or evenly spaced nodes, one frame or a node chain, and native element rows for plates/mixed batches. Targeted update_element_* operations change one property; update_element edits a record. update_node sets absolute coordinates, move_nodes adds offsets, and renumbering changes IDs. Simple/continuous bridge workflows create geometry and supports with their documented bearing assumptions. Use edit_properties to define materials/sections, edit_boundaries for other supports, and view_model to change only the display.

Supply request.operation and that branch's fields. Referenced materials, sections and nodes must exist; plate thickness is distinct from a frame section. Explicit IDs can be reassigned or reused by merging, so read query_model before constructing dependent connectivity. Renumbering requires both paired lists, or neither for a global renumber; deletion of all entities requires the operation's explicit confirmation.

Writes require an editable model and can invalidate solved data. Batch and workflow calls are not transactions: earlier writes can remain after failure. Inspect actual IDs/connectivity before retrying; a confirmation is not always a readback. Solving is a separate analyze_model operation.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Adds substantial behavior beyond the annotations (destructive=true, idempotent=false): 'Writes require an editable model and can invalidate solved data,' 'Batch and workflow calls are not transactions: earlier writes can remain after failure,' and 'a confirmation is not always a readback.' These tell the agent about partial-failure risk and required readback, which the annotations do not. It stops short of a 5 only because per-operation specifics (already covered in nested schemas) carry much of the remaining detail.

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

Conciseness4/5

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

Front-loaded with the verb/resource statement, then routing, then constraints, then write semantics - a logical order with no filler sentences. It is dense and clause-heavy in the routing paragraph, and the length is driven by legitimate complexity (22 branches), so it earns its size without being padded.

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

Completeness5/5

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

Covers everything an agent needs before calling a destructive, non-idempotent geometry editor: prerequisites (referenced entities must exist), enumeration-selection guidance, ID-assignment pitfalls, confirmation-vs-readback caveats, and the reminder that analysis is a separate step. Return values are handled by the output schema and the per-branch 'Returns:' blocks, so the description is complete for this complexity.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-cutting meaning the schema does not: 'Referenced materials, sections and nodes must exist; plate thickness is distinct from a frame section,' 'Explicit IDs can be reassigned or reused by merging,' and the renumber pairing rule ('both paired lists, or neither for a global renumber'). The routing sentence ('Supply request.operation and that branch's fields') clarifies the discriminator contract.

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

Purpose4/5

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

States specific verbs and resources ('Create, edit, renumber, merge or remove model nodes and elements') plus the domain ('standard straight-girder workflows'), and it explicitly carves out sibling territory (edit_properties for materials/sections, edit_boundaries for supports, view_model for display). The only reason it isn't a 5 is that the top-level statement spans 22 discriminated operations, so the single 'purpose' is broad and only fully resolved by the nested branch schemas.

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

Usage Guidelines5/5

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

Gives explicit routing both internally and externally: 'Targeted update_element_* operations change one property; update_element edits a record. update_node sets absolute coordinates, move_nodes adds offsets, and renumbering changes IDs,' and 'Use edit_properties ... edit_boundaries ... view_model to change only the display.' It also closes the loop with 'Solving is a separate analyze_model operation,' leaving nothing to inference.

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

edit_loadsStatic load definitions / ้™ๅŠ›่ท่ฝฝไธŽ็ป„ๅˆA
Destructive

Define static load cases/combinations and apply physical loads to existing nodes or elements (ๅฎšไน‰้™ๅŠ›ๅทฅๅ†ต็ป„ๅˆ๏ผŒๅ‘ๅทฒๆœ‰่Š‚็‚นๆˆ–ๅ•ๅ…ƒๆ–ฝๅŠ ่ฝฝ่ท).

Select request.operation for the target and load law:

  • create_load_case creates the case referenced by later assignments; add_load_combine defines combinations of existing case results.

  • apply_nodal_force targets nodes; apply_beam_distributed_load targets frames; add_plate_element_load targets plates. add_distribute_plane_load places a previously defined pattern, created natively via access_backend.

  • Temperature choices are final uniform temperature, linear difference, code-based section gradient or explicit custom layer rows.

  • Cable initial-tension, unstressed-length and support-settlement loads are separate physical inputs with their own native conventions.

Use edit_prestress for named tendon loads and edit_traffic for vehicle/lane cases. Group definitions, self-weight timing and stage activation belong to edit_construction. case_name selects the load case; group_name selects its activation group, so matching strings do not make them the same object. A static "ๆดป่ฝฝ" category does not create a moving-load case.

Combination rows are [case_type, case_name, factor]: ["ST","Dead",1.2] references a static case; combine_type=1 adds effects and 3 forms an envelope. Replacing a combination writes its complete component list; None/[] supplies an empty definition. For forces and temperatures, use the selected operation's directions, row layout and units without inferring a conversion from a sibling.

Writes refresh the model and return confirmations, without solving or activating a stage. They can overwrite definitions or accumulate loads; there is no rollback of earlier calls. Query affected loads/cases before retrying an uncertain write, then explicitly configure stages and solve.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructive=true, idempotent=false, readOnly=false, but the description goes well beyond them: writes refresh the model and return confirmations without solving or activating a stage, calls can overwrite definitions or accumulate loads, there is no rollback of earlier calls, and the agent should query affected loads before retrying an uncertain write. That is precisely the operational context the annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the routing bullets before the finer semantics, and the mutation/retry warning closes the definition where an agent needs it. It is dense and somewhat long, but for a thirteen-branch discriminated union almost every sentence corresponds to a real decision the caller must make, so little is wasted.

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

Completeness5/5

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

An output schema exists so return values need not be explained; the description still covers the write contract (refresh, confirmation, no solve, no stage activation, no rollback), unit-verification expectations, and the required follow-up (configure stages and solve). For a tool of this complexity nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 100% and each union branch carries its own parameter documentation, so the schema does the heavy lifting (baseline 3). The description adds cross-cutting meaning the schema does not: combination rows are [case_type, case_name, factor] with combine_type=1 adding effects and 3 forming an envelope, None/[] yields an empty definition, and 'case_name selects the load case; group_name selects its activation group' warns the two are distinct objects.

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

Purpose5/5

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

The opening sentence names a specific verb+resource ('Define static load cases/combinations and apply physical loads to existing nodes or elements') and the bullets enumerate all thirteen operations with their targets (nodes, frames, plates, plane patterns). An agent can tell the tool's scope apart from edit_prestress, edit_traffic and edit_construction purely from the description.

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

Usage Guidelines5/5

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

Explicit routing is given per operation ('create_load_case creates the case referenced by later assignments', 'apply_nodal_force targets nodes; apply_beam_distributed_load targets frames') plus explicit boundaries against siblings ('Use edit_prestress for named tendon loads and edit_traffic for vehicle/lane cases'). It also warns which cases are not what they look like ('A static "ๆดป่ฝฝ" category does not create a moving-load case') and clarifies the case_name/group_name distinction.

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

edit_prestressTendon geometry and prestress / ้’ขๆŸๅ‡ ไฝ•ไธŽ้ข„ๅบ”ๅŠ›A
Destructive

Define named tendon paths and apply their prestressing loads to the model (ๅฎšไน‰ๅ…ทๅ้’ขๆŸ็บฟๅฝขๅนถๆ–ฝๅŠ ๅฏนๅบ”้ข„ๅบ”ๅŠ›่ท่ฝฝ).

Choose one request.operation at each step:

  • create_tendon_property defines mechanical and loss parameters.

  • create_tendon_2d places a planar profile; add_tendon_3d places a spatial path. Both reference an existing property by its exact name.

  • assign_tendon_elements matches tendons to model elements.

  • apply_prestress targets existing tendon names in an existing load case.

Use edit_loads for cable-element initial-force/length loads, manage_checks for vertical-tendon checking parameters, query_model for saved definitions and query_results for discretized geometry or solved losses. A tendon property, its geometry and its applied load are three separate definitions.

For create_tendon_2d, position_type changes point_insert from coordinates to [end, direction, element_id] track positioning; its num counts tendons, not control points. Preserve the intended point order and positioning fields when replacing a path. apply_prestress accepts one name or a list; tension_type selects start, end or both ends. Its force is forwarded without conversion: match units to a verified QiaoTong prestress export.

Reusing a tendon name can replace its complete geometry; load assignment is not a promise that repeating the call is harmless. Writes refresh the model and return requested names/load summaries, not verified coordinates or effective prestress. No backup, rollback or analysis is performed. Read back geometry and assignments before retrying an uncertain write, then activate the load through edit_construction and run analyze_model before requesting loss/effective-stress results.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, and the description goes well beyond them: it states no backup/rollback/analysis is performed, that writes refresh the model, that returns are requested names/load summaries rather than verified coordinates or effective prestress, that reusing a tendon name can replace complete geometry, and that load assignment is not a promise of idempotency, with a read-back-before-retry instruction. This is exactly the extra context annotations cannot carry.

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

Conciseness4/5

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

Front-loaded with purpose, then operations, then caveats, which is the right order for a five-branch dispatcher, and each sentence carries information. It is nonetheless long and repeats the destructive/name-reuse warning across the top-level description and the nested branch descriptions, costing a little density.

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

Completeness5/5

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

For a multi-operation destructive write tool with an output schema, the description supplies everything an agent needs: branch selection, prerequisite ordering (material โ†’ property โ†’ geometry โ†’ element assignment โ†’ load), the fact that no analysis or rollback occurs, and the follow-up activation/analysis path. Return-value details are covered by the output schema, so nothing material is missing.

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

Parameters5/5

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

Schema coverage is 100% (baseline 3), and the description still adds cross-parameter semantics the schema states only in fragments: position_type flips point_insert from coordinates to [end, direction, element_id], num counts tendons rather than control points, apply_prestress accepts one name or a list, tension_type selects start/end/both, and force is forwarded without unit conversion against a verified export. These interactions materially improve correct invocation.

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

Purpose5/5

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

The opening sentence names the specific verb+resource (define named tendon paths and apply prestressing loads), and the bulleted list enumerates each of the five operations with a distinct verb (defines, places, matches, targets). It explicitly separates itself from edit_loads, manage_checks, query_model and query_results, so an agent can route without opening the schema.

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

Usage Guidelines5/5

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

Explicit when-to-use rules are given per operation (create_tendon_property for mechanical/loss params, create_tendon_2d for planar profiles, add_tendon_3d for spatial paths, assign_tendon_elements to match elements, apply_prestress to target existing names in an existing load case), plus named alternatives for adjacent concerns (edit_loads, manage_checks, query_model, query_results) and a stated workflow order ending in edit_construction and analyze_model.

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

edit_propertiesMaterials, sections and time effects / ๆๆ–™ๆˆช้ขไธŽๆ—ถๅ˜ๅฑžๆ€งA
Destructive

Create or modify the shared material, section and thickness definitions used by structural elements (็ผ–่พ‘ๅ•ๅ…ƒๅ…ฑ็”จ็š„ๆๆ–™ใ€ๆˆช้ขๅ’ŒๆฟๅŽšๅฎšไน‰).

Choose request.operation by how the property is specified:

  • create_material and time/creep/shrinkage operations define material data.

  • create_section uses a parameterized shape; create_polygon_section uses closed loops/holes; create_line_width_section uses thin-wall segments; create_section_from_properties uses supplied engineering properties.

  • create_tapered_section references two existing end-section IDs; add_tapper_section_group sets variation along selected frame elements.

  • add_thickness supplies a plate thickness definition, not a frame section.

Use edit_geometry to assign an existing definition to elements; edit_prestress defines tendon properties. query_model reads saved values or trial-calculates candidate geometry without storing it. The selected branch determines shape fields and units: a thickness ID and a section ID occupy different namespaces even if their integers match.

update_section_property writes one full property vector at the selected end; calculate_section_property recalculates and stores properties for ALL existing sections. Do not use the latter as a readback of a manual override. remove_section deletes an explicit selection, while remove_unused_sections lets the bridge identify unreferenced definitions. Check element references before overwriting or removing shared data.

Writes refresh the model and return status/message confirmations. Requested IDs are not a guaranteed allocation result: read saved IDs and values through query_model before assigning them. There is no automatic backup, rollback or solve, and a definition change can affect many existing elements. Inspect an uncertain write before repeating it.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds material context beyond them: no automatic backup, rollback or solve; a definition change can affect many existing elements; requested IDs are not a guaranteed allocation result and must be read back via query_model; distinct ID namespaces for thickness vs section. This is exactly the 'what gets destroyed / what is not reversible' disclosure a mutation tool needs.

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

Conciseness4/5

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

It is long, but the length is justified by a 17-branch polymorphic schema; the purpose is front-loaded and the middle is organized by branch family rather than prose bloat. Some routing sentences lightly restate per-branch schema descriptions, which keeps it short of a 5.

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

Completeness5/5

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

For a high-complexity write tool with an output schema, the description supplies everything an agent still needs: return shape is a status/message confirmation (not the allocated ID), the mechanism for getting real IDs, cross-tool handoffs (edit_geometry to assign, query_model to verify), and the no-backup warning. Nothing material is left implicit.

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

Parameters4/5

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

Schema description coverage is 100%, so the per-branch field docs do the heavy lifting and a baseline 3 applies. The description nonetheless adds genuine meaning the schema does not: the selection rule for request.operation ('Choose request.operation by how the property is specified') and the namespace caveat that a thickness ID and a section ID are distinct even when their integers coincide.

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

Purpose5/5

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

The opening sentence gives a precise verb+resource ('Create or modify the shared material, section and thickness definitions used by structural elements') and immediately distinguishes the tool from named siblings (edit_geometry for assignment, edit_prestress for tendons, query_model for reads). An agent can tell what this tool owns without opening the 17-branch oneOf schema.

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

Usage Guidelines5/5

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

It routes the agent across every operation branch (create_material vs add_time_parameter vs the five section-creation variants, add_thickness vs frame sections) and states explicit exclusions, e.g. 'Do not use the latter [calculate_section_property] as a readback of a manual override' and 'remove_section deletes an explicit selection, while remove_unused_sections lets the bridge identify unreferenced definitions.' When-not conditions and alternatives are both present.

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

edit_trafficMoving and transversal traffic / ็งปๅŠจไธŽๆจชๅ‘ๆดป่ฝฝA
Destructive

Configure the live-load system and define moving, transversal or international vehicles, lanes and cases (้…็ฝฎๆดป่ฝฝไฝ“็ณปๅŠ่ฝฆ่พ†่ฝฆ้“ๅทฅๅ†ต).

Select the matching system explicitly. Traditional moving-load setup uses node tandem, influence plane, lane, vehicle and create_live_load_case. set_transversal_vehicle/lane/case define the transverse family; set_international_vehicle, create_en1991_vehicle, set_planned_lane and set_international_live_load_case handle AASHTO/BS/EN1991 definitions. remove_transversal_data removes an explicit transverse target. Use edit_loads for static loads, query_model for saved definitions, edit_construction to include cases in the operation stage and query_results for solved envelopes.

request.operation selects the family's exact schema. Operations with a typed request keep that request nested. Names/IDs refer to existing matching definitions; unit conventions differ between standards and must follow the selected schema rather than a blanket conversion. Full-definition updates reset omitted scalar fields; preserve verified exported values when retaining settings. Switching systems clears old definitions only with explicit clear_existing=true. Writes refresh the model without analysis; API availability also depends on the desktop build. Read back actual IDs/names before case activation and solving.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructive=true and non-idempotent, and the description adds real behavioral context beyond them: full-definition updates reset omitted scalar fields, system switching clears definitions only with explicit clear_existing=true, writes refresh the model without running analysis, API availability depends on the desktop build, and actual IDs must be read back before activation. Units are also flagged as standard-specific rather than blanket-convertible.

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

Conciseness4/5

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

Front-loaded with purpose, then routing, then caveats, so the important content comes first. It is long but justified by a 14-branch tool; the main waste is the duplicated Chinese parenthetical restating each English clause and a slightly list-like middle paragraph.

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

Completeness4/5

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

An output schema exists so return values need not be explained, and the description covers the cross-cutting concerns an umbrella tool must: system selection prerequisite, per-standard units, definition-replacement semantics, clear_existing behavior, and the define-then-stage-then-solve workflow. Per-operation detail is correctly delegated to the nested schemas, though the breadth of 14 operations means the top-level text cannot address each one.

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

Parameters3/5

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

Schema description coverage is 100% and the single 'request' parameter is a discriminated union whose branch schemas already document every field, so the baseline is 3. The description's note that 'request.operation selects the family's exact schema' and that typed requests 'stay nested' largely restates the discriminator already declared in the schema.

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

Purpose5/5

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

States a specific verb and resource ('Configure the live-load system and define moving, transversal or international vehicles, lanes and cases'), then enumerates the operation families it owns (node tandem, influence plane, lane, vehicle, cases) so an agent can tell it apart from edit_loads, query_model and edit_construction without opening the schema.

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

Usage Guidelines5/5

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

Explicit routing is provided both inside the tool ('set_transversal_vehicle/lane/case define the transverse family'; 'remove_transversal_data removes an explicit transverse target') and to siblings with conditions ('Use edit_loads for static loads, query_model for saved definitions, edit_construction to include cases in the operation stage and query_results for solved envelopes'). 'Select the matching system explicitly' states the prerequisite for the whole tool.

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

inspect_bridgeBridge connection and readiness / ่ฟžๆŽฅไธŽๅฐฑ็ปช็Šถๆ€A
Read-onlyIdempotent

Diagnose the QiaoTong connection, active model state and edit readiness before choosing an engineering operation (ๅช่ฏปๆฃ€ๆŸฅ่ฟžๆŽฅใ€ๆจกๅž‹็Šถๆ€ไธŽ็ผ–่พ‘ๆกไปถ).

Start with check_qiaotong_connection; get_model_status reports the active phase and allowed operations, while get_model_edit_readiness explains why an edit is blocked. These are diagnostics, not requests to open a model, clear results, prepare edits or switch stages. Use query_model for engineering records and manage_model_files to open/save a project.

Supply request.operation only; these diagnostic operations have no arguments. They return structured state and suggested next actions, including an unavailable connection as data. A successful diagnostic call does not itself mean the bridge is connected or editable. Read connected/status and capability fields before proceeding; the state can change between this check and a later command.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral context: diagnostics return an unavailable connection as data, a successful call does not mean the bridge is connected or editable, the state can change between check and command, and operations take no arguments. These are non-obvious traits an agent could otherwise misread.

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

Conciseness4/5

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

Front-loaded with the core purpose and the starting operation, then routing, then behavioral caveats. It is dense and somewhat long for a 1-parameter tool, and the bilingual parenthetical duplicates add length, but every sentence carries operative information.

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

Completeness5/5

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

Although an output schema exists (so return fields need not be enumerated), the description still explains return semantics (structured state, suggested next actions, unavailable connection as data) and tells the agent to read connected/status and capability fields. Nothing needed to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the request schema documents the operation discriminator and each branch. The description adds one useful clarification beyond the schema โ€“ 'Supply request.operation only; these diagnostic operations have no arguments' โ€“ which preempts an agent over-filling the nested request.

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

Purpose5/5

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

States a specific verb (diagnose) and resource (QiaoTong connection, active model state, edit readiness) and immediately contrasts itself with engineering operations. The description also names the three sub-operations, so an agent can distinguish inspect_bridge from edit_* / query_* siblings without opening the schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('before choosing an engineering operation', 'start with check_qiaotong_connection') and explicit when-not ('these are diagnostics, not requests to open a model, clear results, prepare edits or switch stages'). It routes to named alternatives: query_model for engineering records and manage_model_files to open/save a project.

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

manage_checksCode-check definitions and execution / ่ง„่Œƒๆฃ€็ฎ—ๅฎšไน‰ไธŽๆ‰ง่กŒA
Destructive

Set up, edit, execute and inspect code-checking data, with distinct model snapshots and current concrete-checking context (็ฎก็†ๆจกๅž‹ๆฃ€็ฎ—ๅฎšไน‰ๅŠๅฝ“ๅ‰ๆฃ€็ฎ—็ช—ๅฃ).

Model snapshot operations manage check materials/cases, reinforcement and stirrups using complete native definitions. setup_concrete_check imports an existing concrete case; check-context operations configure combinations, reinforcement, stirrups and analysis options, and manage_check_case_file opens/saves separate check files. run_concrete_check imports the named case and executes verification. get_check_data reads context definitions, settings or computed checking results. Use edit_properties for structural materials/sections and analyze_model for the structural solve.

request.operation selects the namespace, units and replacement behavior. Snapshot inputs preserve native exported units/enums; convenience length fields can use meters with documented internal conversions. A context read is not a lossless model snapshot. Full replacements require carrying forward retained values, and explicit empty assignment lists can clear data. Desktop capabilities are checked; unavailable routes fail without a successful commit. Save important data before destructive updates. Verification timeout does not cancel background computation; inspect state before retrying. Completion means the calculation finished, not that the structure passed: read and interpret the engineering results.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare destructive/not-read-only/non-idempotent. The description goes well beyond: native-unit vs meters conventions with internal conversions, that a context read is not a lossless snapshot, that full replacements require carrying forward retained values, that empty assignment lists clear data, that verification timeout does not cancel background computation, that completion โ‰  passing, and to save before destructive updates. This is exactly the behavioral context annotations cannot express.

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

Conciseness4/5

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

Front-loaded with purpose and capped by a dense but organized behavioral paragraph; for a 17-operation mega-tool the length is largely earned. It is slightly packed (units, replacement, timeout, and completion caveats run together), but no sentence is pure filler.

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

Completeness4/5

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

Given an output schema exists and each sub-operation carries its own rich description, the top-level text needn't restate returns. It covers the two families, unit conventions, replacement hazards, and timeout semantics well, though it does not mention every branch (e.g. update_vertical_steel_tendon, add/remove_section_reinforcement, manage_check_material), leaving the reader to the schema for those.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3 and the heavy per-field semantics already live in the schema. The description still adds cross-cutting parameter meaning โ€” 'request.operation selects the namespace, units and replacement behavior' plus the native-unit vs meters rule โ€” which is genuine value over the schema's per-branch defaults.

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

Purpose5/5

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

The opening sentence names a specific verb set and resource ('Set up, edit, execute and inspect code-checking data') and immediately frames the two sub-families (model snapshots vs current concrete-checking context). It then enumerates key operations (setup_concrete_check, run_concrete_check, get_check_data, manage_check_case_file) and explicitly names the siblings edit_properties and analyze_model as different concerns. An agent can route correctly without opening the schema.

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

Usage Guidelines5/5

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

Provides both a workflow chain (setup_concrete_check imports โ†’ configure โ†’ run_concrete_check โ†’ get_check_data) and explicit alternatives ('Use edit_properties for structural materials/sections and analyze_model for the structural solve'). It even states when-not: this is concrete code checking, not the general structural solve.

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

manage_model_filesModel files and initialization / ๆจกๅž‹ๆ–‡ไปถไธŽๅˆๅง‹ๅŒ–A
Destructive

Open, save or initialize the active bridge project (ๆ‰“ๅผ€ใ€ไฟๅญ˜ๆˆ–ๅˆๅง‹ๅŒ–ๆจกๅž‹).

Choose save_model_file to persist current work, open_model_file to replace the active project with a saved one, or initialize_model to clear it for a new model. Use edit_geometry for entity edits and manage_checks for separate concrete-checking files. Inspect connection/readiness first.

request.operation selects the matching fields. File paths are interpreted by the QiaoTong host, which may be a remote Windows machine, not by the MCP client's local filesystem. initialize_model requires confirm=true; open can discard unsaved work and save can overwrite an existing file. No automatic backup or rollback is provided. Save important work first and verify the active model after opening or initializing. Returns a completion message, without model contents or analysis results.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag destructiveHint=true, but the description goes well beyond them: paths are interpreted by the QiaoTong host (possibly a remote Windows machine) rather than the MCP client, initialize_model requires confirm=true, open can discard unsaved work, save can overwrite, and there is no automatic backup or rollback. It also warns to verify the active model and discloses the return shape (a completion message, not model contents).

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

Conciseness4/5

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

Front-loads purpose, then routing, then behavioral caveats in a logical order. It is longer than one operation would justify, but the length is earned by three distinct destructive-ish sub-operations. The closing 'save important work first, verify after' mildly repeats the earlier unsaved-work warning, keeping it just short of a 5.

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

Completeness5/5

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

For a polymorphic, destructive file tool this covers everything an agent needs: operation routing, host path semantics, the confirm gate, overwrite/discard risk, absence of backup, and post-call verification. Returns are summarized and an output schema exists, so no further return-value detail is required.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a genuine cross-cutting clarification: request.operation selects the matching branch fields, and file paths are resolved on the host rather than the client's local filesystem. That host-vs-client distinction materially changes how an agent should populate file_path, though the per-field detail still lives in the schema.

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

Purpose5/5

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

States specific verbs and a resource ('Open, save or initialize the active bridge project') and enumerates the three operations it multiplexes. It actively distinguishes itself from siblings by naming edit_geometry and manage_checks as the tools for entity edits and separate check files, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use routing per operation ('save_model_file to persist current work, open_model_file to replace the active project, initialize_model to clear it for a new model') plus named alternatives for adjacent concerns and a precondition ('Inspect connection/readiness first'). Nothing is left to inference.

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

query_modelModel records and geometry checks / ๆจกๅž‹ๆ•ฐๆฎไธŽๅ‡ ไฝ•ๆฃ€ๆŸฅA
Read-onlyIdempotent

Read saved model definitions, locate entities or inspect model geometry without changing it (ๅช่ฏปๆŸฅ่ฏขๆจกๅž‹ๅฎšไน‰ใ€ๅฎžไฝ“ไธŽๅ‡ ไฝ•).

get_model_info counts entities; get_model_data reads records by kind; query_model_data uses typed server filters/pages; find_entities locates IDs by geometry or attributes. list_group_members reads memberships. Named tendon, transversal and international getters read definitions. calc_section_property evaluates supplied candidate geometry without storing a section; validate_model checks connectivity and definition consistency, not structural adequacy. Use inspect_bridge for connection and permission diagnostics, query_results for solved responses, and manage_checks for the current concrete-checking context.

request.operation selects one schema branch. For query_model_data, its own typed request remains nested, e.g. operation="query_model_data", request={"kind":"nodes","node_ids":[1,2]}. IDs and names refer to the current model. List pagination belongs to the selected operation: generic getters slice locally, native queries page on the bridge. Preserve selectors between pages and inspect truncation metadata. These calls neither solve nor make the model editable; empty data is not proof of a missing entity when a filter or unavailable backend is involved.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the bar is lower, and the description still adds real behavioral content: calls neither solve nor make the model editable, generic getters slice locally while native queries page on the bridge, selectors must be preserved between pages, and 'empty data is not proof of a missing entity when a filter or unavailable backend is involved.' It stops short of covering failure modes or auth requirements in depth.

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

Conciseness4/5

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

Front-loaded with purpose, then operations, then alternatives, then routing mechanics โ€” a logical progression. It is long and dense, but the length is justified by ten discriminated branches; a few clauses (e.g., the bilingual parenthetical) are redundant but not wasteful.

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

Completeness4/5

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

For a ten-branch dispatcher with rich nested schemas and an output schema, the description supplies the routing model, sibling disambiguation, and empty-result/pagination caveats, so the agent needn't be told about return values. Coverage is strong; per-branch units and edge constraints are left to the nested schemas, which is appropriate.

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

Parameters4/5

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

With 100% schema coverage and only one top-level parameter (request), the baseline is 3; the description earns extra by explaining the dispatch contract: 'request.operation selects one schema branch' and that query_model_data's typed request remains nested, with a concrete example. It clarifies that IDs/names refer to the current model.

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

Purpose5/5

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

The opening sentence states a specific verb+resource+constraint ('Read saved model definitions, locate entities or inspect model geometry without changing it'), then enumerates each of the ten operation branches (get_model_info, get_model_data, query_model_data, find_entities, list_group_members, tendon/transversal/international getters, calc_section_property, validate_model) with what each does. An agent can identify this tool's scope without opening the schema.

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

Usage Guidelines5/5

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

It explicitly routes the agent away to alternatives by condition: 'Use inspect_bridge for connection and permission diagnostics, query_results for solved responses, and manage_checks for the current concrete-checking context.' It also sub-differentiates within the tool, noting validate_model checks connectivity/definition consistency 'not structural adequacy' and that calc_section_property evaluates candidate geometry without storing it.

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

query_resultsStructural responses and tendon results / ็ป“ๆž„ๅ“ๅบ”ไธŽ้’ขๆŸ็ป“ๆžœA
Read-onlyIdempotent

Retrieve numerical structural responses from the bridge's result data (ไปŽๆกฅ้€š็ป“ๆžœๆ•ฐๆฎ่ฏปๅ–็ป“ๆž„ๆ•ฐๅ€ผๅ“ๅบ”).

Use after analyze_model has completed the relevant solve. Choose request.operation for the result family:

  • get_analysis_results: displacement/reaction uses node IDs; force/stress uses element IDs. stage_id=-1 is operation, 0 is the stage envelope, and a positive value selects one construction stage.

  • get_special_results: use kind plus mode for modal output, or the documented node/link/element selector for concurrent and special results.

  • get_live_load_results: request one maximum or minimum envelope extreme; get_tendon_loss_results reads losses for a named, activated stage tendon.

  • get_tendon_position_result/get_tendon_length_result: discretized tendon geometry; pre-solve availability depends on the bridge.

Example: request={"operation":"get_analysis_results","result_type":"force", "ids":[10,11],"stage_id":-1,"case_name":"Dead"} selects static operation results for elements 10 and 11. Full case identifiers must come from QiaoTong results/UI; never derive TV:/MV: prefixes from combination codes. Use query_model for saved definitions, manage_checks for code-check results and view_model for plots. Envelopes do not represent simultaneous loads.

Returns status/message with formatted numerical data. For paged list operations, follow the next-offset hint with unchanged selectors; slicing occurs locally after backend retrieval. Tendon and live-load operations have no pagination fields. These calls do not solve, refresh or certify result freshness. An empty response can indicate an absent case, inactive tendon or unavailable results; verify context before interpreting it as zero. Multiple calls need a stable solved model for comparison.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYesThe tool completed without an execution error.
messageYesOperation summary, query results, or instructions for the next step.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds real behavioral context: 'These calls do not solve, refresh or certify result freshness', an empty response may mean an absent case or inactive tendon rather than zero, paged operations slice locally after backend retrieval with a next-offset hint, and 'Envelopes do not represent simultaneous loads'.

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

Conciseness4/5

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

Front-loaded with purpose and organized into scannable bullets plus a concrete example request, which is appropriate for a six-branch dispatcher. It is long and repeats some per-branch details already in the schema descriptions, so a little of the text does not earn its place beyond structured fields.

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

Completeness4/5

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

Given a six-way discriminated union and an existing output schema, the description covers preconditions, empty-result interpretation, pagination behavior and sibling routing adequately. Minor gaps remain around unit conventions and per-operation availability nuances, which live only in the branch schemas.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds cross-cutting parameter meaning: stage_id=-1/0/positive semantics, the ID namespace rule (node vs element by result_type) and the concrete worked example request. It also warns that full case identifiers must come from QiaoTong results/UI rather than derived from combination codes, which is operational guidance beyond field-level docs.

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

Purpose5/5

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

Opens with a specific verb+resource ('Retrieve numerical structural responses from the bridge's result data') and then enumerates the six operation families with what each returns (analysis results, special/modal results, live-load envelopes, tendon loss/position/length). It explicitly distinguishes itself from siblings ('Use query_model for saved definitions, manage_checks for code-check results and view_model for plots'), so an agent can route without opening each schema.

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

Usage Guidelines5/5

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

States the precondition ('Use after analyze_model has completed the relevant solve') and gives per-branch selection rules, e.g. get_live_load_results 'request one maximum or minimum envelope extreme' and tendon geometry available pre-solve 'depends on the bridge'. Altern</br>atives are named with the condition that selects them (query_model/manage_checks/view_model), which is exactly when-to-use guidance.

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

view_modelDesktop view and images / ๆกŒ้ขๆ˜พ็คบไธŽๅ›พๅƒA
Destructive

Control the desktop view and capture PNG images of the model or existing analysis results (ๆŽงๅˆถๆกŒ้ข่ง†ๅ›พๅนถๆˆชๅ–ๆจกๅž‹ๆˆ–ๅทฒๆœ‰็ป“ๆžœๅ›พๅƒ).

Choose request.operation for the presentation task:

  • set_view_angle, set_render, display_ids, activate_structure and reset_display control camera, shading, labels and visible entities.

  • switch_display_stage selects a modeling stage by name; change_construct_stage selects a results stage by integer index.

  • save_model_screenshot captures the view; plot_analysis_result draws a selected solved component. Use query_results for numerical values.

  • set_unit changes display units; tool input units remain as documented.

Defaults are assignments, not toggles: set_render(flag=true) requests solid shading; display_ids applies BOTH flags and an omitted flag hides that label family. set_unit sends both force and length units each time. A screenshot defaults to the iso camera; view_angle="current" preserves the camera. If applying a preset fails, the current view is captured and the reply is a saved-path warning even when return_image=true.

A connected desktop view is required. Display operations return a confirmation and change presentation only; edit_geometry and edit_construction change entities and schedules. The two image operations write PNG bytes to file_path on the MCP host and overwrite that path. Use a distinct path to retain an earlier capture. return_image=true normally returns MCP Image content; false returns a saved-path message. No solve runs and no previous view is restored automatically. Confirm the selected stage/component before treating a plot as evidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesChoose operation and supply only its matching fields. Each branch retains its original defaults, units and validation; an operation's nested request stays nested (้€‰ๆ‹ฉๆ“ไฝœๅนถๆŒ‰ๅฏนๅบ”ๅˆ†ๆ”ฏๅกซๅ†™ๅ‚ๆ•ฐ๏ผŒไฟ็•™ๅŽŸๆœ‰ๅตŒๅฅ— request).

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnlyHint=false, destructiveHint=true, openWorldHint=false, idempotentHint=false; the description goes well beyond them. It discloses that the two image operations write PNG bytes to file_path on the MCP host and OVERWRITE that path (justifying the destructive hint), that return_image=false yields a saved-path message, that a failed preset still captures the current view and returns a warning instead of image content, that no solve runs and no prior view is restored, and that defaults are assignments rather than toggles.

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

Conciseness4/5

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

Front-loaded with the two core capabilities, then organized into an operation-routing block and a cross-cutting constraints block, which is appropriate for a ten-branch discriminator schema. However, it is dense and repeats some branch-level schema facts (set_unit defaults, display_ids omission behavior, screenshot overwrite), so a little trimming would help.

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

Completeness5/5

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

No output schema exists, and the description compensates by explaining return shapes: confirmations for display operations, inline MCP Image content versus a saved-path message, and the text warning when a preset fails. Combined with write-path/overwrite behavior, authentication/connection requirements, and the no-solve/no-restore caveats, an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3 and the per-operation field docs already do the heavy lifting. The description adds cross-cutting semantics not obvious from any single branch: defaults are assignments not toggles, display_ids applies BOTH flags and an omitted flag hides that label family, set_unit sends both units every time, and view_angle='current' preserves the camera. These are useful, but several restate what the nested $defs already say, so it does not fully clear the bar for a 5.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: control the desktop view and capture PNG images of the model or existing analysis results. It then enumerates all ten operations with a one-line role for each (camera/shading/labels/visibility, stage selection, screenshot, result plotting, units), so an agent can tell what the tool covers without reading the schema. It also names siblings it is NOT (query_results for numerical values, edit_geometry/edit_construction for entity/schedule edits).

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

Usage Guidelines5/5

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

Explicit routing guidance: 'Use query_results for numerical values' versus plot_analysis_result for contours, and 'edit_geometry and edit_construction change entities and schedules' versus display-only operations. Prerequisites are stated (a connected desktop view is required) and the when-to-use split between save_model_screenshot and plot_analysis_result is clear. Nothing is left to inference.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 147 tool updatesv0.6.0
    • Addedaccess_backend
    • Removedactivate_structure
    • Removedadd_beam_constraint
    • Removedadd_beam_section_temperature
    • Removedadd_cable_length_load
    • Removedadd_check_load_combination
    • Removedadd_check_stirrup
    • Removedadd_constraint_equation
    • Removedadd_construction_stage
    • Removedadd_creep_function
    • Removedadd_custom_temperature
    • Removedadd_distribute_plane_load
    • Removedadd_effective_width
    • Removedadd_elastic_link
    • Removedadd_elastic_support
    • Removedadd_elements_to_group
    • Removedadd_gradient_temperature
    • Removedadd_influence_plane
    • Removedadd_initial_tension_load
    • Removedadd_load_combine
    • Removedadd_load_to_mass
    • Removedadd_master_slave_link
    • Removedadd_nodal_mass
    • Removedadd_node_tandem
    • Removedadd_parametric_reinforcement
    • Removedadd_plate_element_load
    • Removedadd_shrink_function
    • Removedadd_spectrum_case
    • Removedadd_spectrum_function
    • Removedadd_standard_vehicle
    • Removedadd_support_settlement
    • Removedadd_system_temperature
    • Removedadd_tapper_section_group
    • Removedadd_tendon_3d
    • Removedadd_thickness
    • Removedadd_time_history_case
    • Removedadd_time_history_function
    • Removedadd_time_parameter
    • Removedadd_to_structure_group
    • Removedadd_traffic_lane
    • Addedanalyze_model
    • Removedapply_beam_distributed_load
    • Removedapply_nodal_force
    • Removedapply_prestress
    • Removedassign_element_stirrup
    • Removedassign_tendon_elements
    • Removedcalc_section_property
    • Removedcalculate_section_property
    • Removedcall_qtmodel_api
    • Removedchange_construct_stage
    • Removedcheck_qiaotong_connection
    • Removedconfigure_analysis
    • Removedconfigure_check_analysis
    • Removedcreate_beam_element
    • Removedcreate_beam_elements_linear
    • Removedcreate_boundary_group
    • Removedcreate_continuous_beam_bridge
    • Removedcreate_elements
    • Removedcreate_line_width_section
    • Removedcreate_live_load_case
    • Removedcreate_load_case
    • Removedcreate_load_group
    • Removedcreate_material
    • Removedcreate_nodes
    • Removedcreate_nodes_linear
    • Removedcreate_polygon_section
    • Removedcreate_section
    • Removedcreate_section_from_properties
    • Removedcreate_simple_beam_bridge
    • Removedcreate_structure_group
    • Removedcreate_tapered_section
    • Removedcreate_tendon_2d
    • Removedcreate_tendon_property
    • Removeddisplay_ids
    • Addededit_boundaries
    • Addededit_construction
    • Addededit_geometry
    • Addededit_loads
    • Addededit_prestress
    • Addededit_properties
    • Addededit_traffic
    • Removedfind_entities
    • Removedget_analysis_results
    • Removedget_check_data
    • Removedget_live_load_results
    • Removedget_model_data
    • Removedget_model_info
    • Removedget_special_results
    • Removedget_tendon_info
    • Removedget_tendon_length_result
    • Removedget_tendon_loss_results
    • Removedget_tendon_position_result
    • Removedinitialize_model
    • Addedinspect_bridge
    • Removedlist_group_members
    • Removedlist_qtmodel_api
    • Removedmanage_check_case_file
    • Removedmanage_check_stirrup
    • Addedmanage_checks
    • Addedmanage_model_files
    • Removedmerge_nodes
    • Removedmerge_operation_stage
    • Removedmove_nodes
    • Removedopen_model_file
    • Removedplot_analysis_result
    • Addedquery_model
    • Addedquery_results
    • Removedremove_boundary
    • Removedremove_construction_stage
    • Removedremove_elements
    • Removedremove_from_structure_group
    • Removedremove_nodes
    • Removedremove_section
    • Removedremove_structure_group
    • Removedremove_unused_sections
    • Removedrenumber_elements
    • Removedrenumber_nodes
    • Removedreset_display
    • Removedrevert_local_orientation
    • Removedrun_analysis
    • Removedrun_concrete_check
    • Removedsave_model_file
    • Removedsave_model_screenshot
    • Removedset_gravity
    • Removedset_render
    • Removedset_self_weight_stage
    • Removedset_support
    • Removedset_unit
    • Removedset_view_angle
    • Removedsetup_concrete_check
    • Removedswitch_display_stage
    • Removedupdate_bulking_setting
    • Removedupdate_construction_stage
    • Removedupdate_element
    • Removedupdate_element_beta
    • Removedupdate_element_id
    • Removedupdate_element_material
    • Removedupdate_element_nodes
    • Removedupdate_element_section
    • Removedupdate_node
    • Removedupdate_node_id
    • Removedupdate_section_bias
    • Removedupdate_section_property
    • Removedupdate_structure_group_name
    • Removedupdate_vertical_steel_tendon
    • Removedvalidate_model
    • Addedview_model
  2. 132 tool updatesv0.3.1
    • First observedactivate_structure
    • First observedadd_beam_constraint
    • First observedadd_beam_section_temperature
    • First observedadd_cable_length_load
    • First observedadd_check_load_combination
    • First observedadd_check_stirrup
    • First observedadd_constraint_equation
    • First observedadd_construction_stage
    • First observedadd_creep_function
    • First observedadd_custom_temperature
    • First observedadd_distribute_plane_load
    • First observedadd_effective_width
    • First observedadd_elastic_link
    • First observedadd_elastic_support
    • First observedadd_elements_to_group
    • First observedadd_gradient_temperature
    • First observedadd_influence_plane
    • First observedadd_initial_tension_load
    • First observedadd_load_combine
    • First observedadd_load_to_mass
    • First observedadd_master_slave_link
    • First observedadd_nodal_mass
    • First observedadd_node_tandem
    • First observedadd_parametric_reinforcement
    • First observedadd_plate_element_load
    • First observedadd_shrink_function
    • First observedadd_spectrum_case
    • First observedadd_spectrum_function
    • First observedadd_standard_vehicle
    • First observedadd_support_settlement
    • First observedadd_system_temperature
    • First observedadd_tapper_section_group
    • First observedadd_tendon_3d
    • First observedadd_thickness
    • First observedadd_time_history_case
    • First observedadd_time_history_function
    • First observedadd_time_parameter
    • First observedadd_to_structure_group
    • First observedadd_traffic_lane
    • First observedapply_beam_distributed_load
    • First observedapply_nodal_force
    • First observedapply_prestress
    • First observedassign_element_stirrup
    • First observedassign_tendon_elements
    • First observedcalc_section_property
    • First observedcalculate_section_property
    • First observedcall_qtmodel_api
    • First observedchange_construct_stage
    • First observedcheck_qiaotong_connection
    • First observedconfigure_analysis
    • First observedconfigure_check_analysis
    • First observedcreate_beam_element
    • First observedcreate_beam_elements_linear
    • First observedcreate_boundary_group
    • First observedcreate_continuous_beam_bridge
    • First observedcreate_elements
    • First observedcreate_line_width_section
    • First observedcreate_live_load_case
    • First observedcreate_load_case
    • First observedcreate_load_group
    • First observedcreate_material
    • First observedcreate_nodes
    • First observedcreate_nodes_linear
    • First observedcreate_polygon_section
    • First observedcreate_section
    • First observedcreate_section_from_properties
    • First observedcreate_simple_beam_bridge
    • First observedcreate_structure_group
    • First observedcreate_tapered_section
    • First observedcreate_tendon_2d
    • First observedcreate_tendon_property
    • First observeddisplay_ids
    • First observedfind_entities
    • First observedget_analysis_results
    • First observedget_check_data
    • First observedget_live_load_results
    • First observedget_model_data
    • First observedget_model_info
    • First observedget_special_results
    • First observedget_tendon_info
    • First observedget_tendon_length_result
    • First observedget_tendon_loss_results
    • First observedget_tendon_position_result
    • First observedinitialize_model
    • First observedlist_group_members
    • First observedlist_qtmodel_api
    • First observedmanage_check_case_file
    • First observedmanage_check_stirrup
    • First observedmerge_nodes
    • First observedmerge_operation_stage
    • First observedmove_nodes
    • First observedopen_model_file
    • First observedplot_analysis_result
    • First observedremove_boundary
    • First observedremove_construction_stage
    • First observedremove_elements
    • First observedremove_from_structure_group
    • First observedremove_nodes
    • First observedremove_section
    • First observedremove_structure_group
    • First observedremove_unused_sections
    • First observedrenumber_elements
    • First observedrenumber_nodes
    • First observedreset_display
    • First observedrevert_local_orientation
    • First observedrun_analysis
    • First observedrun_concrete_check
    • First observedsave_model_file
    • First observedsave_model_screenshot
    • First observedset_gravity
    • First observedset_render
    • First observedset_self_weight_stage
    • First observedset_support
    • First observedset_unit
    • First observedset_view_angle
    • First observedsetup_concrete_check
    • First observedswitch_display_stage
    • First observedupdate_bulking_setting
    • First observedupdate_construction_stage
    • First observedupdate_element
    • First observedupdate_element_beta
    • First observedupdate_element_id
    • First observedupdate_element_material
    • First observedupdate_element_nodes
    • First observedupdate_element_section
    • First observedupdate_node
    • First observedupdate_node_id
    • First observedupdate_section_bias
    • First observedupdate_section_property
    • First observedupdate_structure_group_name
    • First observedupdate_vertical_steel_tendon
    • First observedvalidate_model

TDQS

A4.5/5.0

Scored across 15 tools

Disambiguation4/5

The 15 tools map to distinct engineering domains (geometry, properties, boundaries, loads, prestress, traffic, construction, analysis, results, checks, files, view), and descriptions explicitly cross-reference siblings to guide selection. Minor overlap remains between edit_loads and edit_traffic (both load cases) and between query_model and query_results, but the descriptions clearly separate static vs moving loads and definitions vs solved results.

Naming Consistency5/5

All names follow a consistent snake_case verb_noun pattern (edit_geometry, edit_loads, query_model, query_results, manage_checks, analyze_model, view_model, access_backend). The verb prefixes (edit_, query_, manage_, inspect_, analyze_, view_, access_) are used consistently across the set.

Tool Count5/5

With 15 tools for a complex bridge-analysis domain, each tool covers a broad but distinct engineering area (e.g., one tool each for geometry, loads, prestress, traffic, checks). No tool appears redundant, and the count stays within a well-scoped 3-15 range for the domain complexity.

Completeness4/5

The surface covers the full structural lifecycle: model file management, geometry, properties, boundaries, static loads, prestress, moving loads, construction stages, analysis, results retrieval, code checks, and viewing. Minor gaps exist (e.g., no explicit load-case deletion or reporting tool), but access_backend is provided to reach the native long-tail API, making the set practically complete.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Connects AI assistants to CSI ETABS for structural engineering tasks, enabling model creation, analysis, design, and seismic checks via the COM API.
    69
    9
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to interact with Bentley STAAD.Pro models for tasks like load case definition, data extraction, and property setting, running locally with multi-instance support and no cloud dependency.
    5
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude to directly control Midas Civil NX for bridge structural analysis, allowing users to model, apply loads, and perform analysis through natural language descriptions.
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to interact with Bentley STAAD.Pro models for tasks like load case definition, data extraction, and property setting through natural language.
    5
    49
    MIT