Qiao-MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Qiao-MCPcreate a simple beam bridge model with 5 spans"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
๐ 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 |
| Connection, model state and edit readiness |
| Open, save and initialize a project |
| Definitions, entity searches and geometry checks |
| Nodes, elements and bridge layouts |
| Materials, sections, thickness and time effects |
| Ground supports, node links and beam-end releases |
| Groups, stages, activation and deactivation |
| Static cases, combinations and physical loads |
| Solver settings, dynamics and structural analysis |
| Tendon properties, geometry and prestress |
| Moving, transversal and international live loads |
| Model checking snapshots and current code-check context |
| Structural, modal, live-load and tendon results |
| Display settings, stage views, screenshots and plots |
| 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 |
BS |
|
EN1991 | Axles |
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 |
| Model overview |
| Material list |
| Section list |
| Load cases |
| Construction stages |
| Structure groups |
| Boundary conditions |
๐ฌ Prompts (5 workflows)
Prompt | Description |
| Simple beam bridge design workflow (็ฎๆฏๆข่ฎพ่ฎก) |
| Continuous beam bridge design (่ฟ็ปญๆข่ฎพ่ฎก) |
| Structural code checking (็ปๆๆฃ็ฎ) |
| Construction stage analysis (ๆฝๅทฅ้ถๆฎตๅๆ) |
| 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 documentationThe 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:
QTModel (
qtmodel, default) โ QiaoTong (ๆกฅ้) bridge analysis software (user manual)
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
qtmodel2.6.3 โ 2.9.x, except 2.9.0 (installed byuv 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-mcpConfigure 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-mcpTransport:
stdio(keep default)Command:
uv --directory /path/to/qiao-mcp run qiao-mcpReplace
/path/to/qiao-mcpwith your actual project pathWindows: use backslashes
D:\path\to\qiao-mcpmacOS/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
--directoryprefix needed)Replace
/path/to/qiao-mcpwith your actual project path
Click ไฟๅญ to save.
Test with MCP Inspector
npx @modelcontextprotocol/inspector uv run qiao-mcpLAN 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.pyThen 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 -qThe 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
qtmodelmust match exactly, otherwisecheck_qiaotong_connectionreportsversion_mismatchand refuses to connect.qtmodel 2.8.2 removed that handshake. Any QiaoTong that exposes the Python API connects, so
version_mismatchno longer occurs. The trade-off is that an older QiaoTong may simply lack newer commands;get_model_statussurfaces that asstate_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-DEFORMATIONreturns an incorrectrz, equal toryin 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_systemis 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-STIRRUPandSET-CHECK-CASEare 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
massfor equal translational mass along X, Y and Z, for example{"node_id": 1, "mass": 10}. Optionalmass_x/mass_y/mass_zoverride individual directions; omitted directions usemass, whose default is zero.mass_rmis removed. Specify the intended rotational inertia axis withrot_x,rot_yorrot_z; do not mechanically rename the old parameter.Unequal directional masses require an SDK with
mass_xyzsupport (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
CommandOutcomeUnknownErrorand 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_infofor custom materials.Nodal mass layout.
add_nodal_massdocumentsmass_infoas(mass, inertia X, Y, Z)and addsmass_xyzfor 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_materialaddsis_orthotropic/ey;set_supportandadd_elastic_supportaddcoordinate,extra_enabledand eight-valueextra_parameters. Unidirectional elastic supports also accept signedaxis_direction.add_influence_planeaddsalways_divided_by_beam_shape, andcreate_live_load_caseadds the per-sub-case boolean listsub_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_stageexposes all four case lists, including transversal cases. The gateway methodupdate_operation_stage_settingremains available; supply all intended case lists because omitted/empty lists disable their analysis.remove_materialdefaults tocascade=True(also deletes associated tendon properties and tendons).remove_tendon_propertydefaults toFalse;Truedeletes 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 withupdate_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-existingensure_running,set_url,set_version,export_qt_helperandwait_solve(polls without a time limit; userun_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:
ac4dbadmoves model queries fromodbtomdb. Qiao-MCP prefers the new namespace and falls back toodbwhen the method is absent. Existing-model section geometry usesmdb.get_model_section_shape;mdb.get_section_shaperemains the local geometry builder. Analysis results and views stay onodb.bc1ee99returns typed model records supportingto_dict()andMapping. 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 ascalculate_section_propertystill require model-write permission.6821413splits model objects into domain modules and keepscore.model_dbas a compatibility export. The adapter does not depend on those internal paths.The September 7โ8 updates add
t_outto thickness definitions,show_viewto 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 -q0.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 toolsaccess_backendNative API discovery and calls / ๅ็ API ๆฃ็ดขไธ่ฐ็จADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ็ปๆๆฑ่งฃไธๅจๅ่ฎพ็ฝฎADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ๆฏๆฟ่ฟๆฅไธ็บฆๆADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ๅ็ปไธๆฝๅทฅ้ถๆฎตADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ่็นๅๅ
ไธๆกฅๆขๅธ็ฝฎADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 / ้ๅ่ท่ฝฝไธ็ปๅADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ้ขๆๅ ไฝไธ้ขๅบๅADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ๆๆๆช้ขไธๆถๅๅฑๆงADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ็งปๅจไธๆจชๅๆดป่ฝฝADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 / ่ฟๆฅไธๅฐฑ็ปช็ถๆARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 / ่ง่ๆฃ็ฎๅฎไนไธๆง่กADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 / ๆจกๅๆไปถไธๅๅงๅADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ๆจกๅๆฐๆฎไธๅ ไฝๆฃๆฅARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 / ็ปๆๅๅบไธ้ขๆ็ปๆARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
| Name | Required | Description |
|---|---|---|
| status | Yes | The tool completed without an execution error. |
| message | Yes | Operation summary, query results, or instructions for the next step. |
TDQS
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.
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.
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.
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.
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.
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 / ๆก้ขๆพ็คบไธๅพๅADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | Choose 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
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.
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.
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.
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.
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.
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.
147 tool updates
v0.6.0- Added
access_backend - Removed
activate_structure - Removed
add_beam_constraint - Removed
add_beam_section_temperature - Removed
add_cable_length_load - Removed
add_check_load_combination - Removed
add_check_stirrup - Removed
add_constraint_equation - Removed
add_construction_stage - Removed
add_creep_function - Removed
add_custom_temperature - Removed
add_distribute_plane_load - Removed
add_effective_width - Removed
add_elastic_link - Removed
add_elastic_support - Removed
add_elements_to_group - Removed
add_gradient_temperature - Removed
add_influence_plane - Removed
add_initial_tension_load - Removed
add_load_combine - Removed
add_load_to_mass - Removed
add_master_slave_link - Removed
add_nodal_mass - Removed
add_node_tandem - Removed
add_parametric_reinforcement - Removed
add_plate_element_load - Removed
add_shrink_function - Removed
add_spectrum_case - Removed
add_spectrum_function - Removed
add_standard_vehicle - Removed
add_support_settlement - Removed
add_system_temperature - Removed
add_tapper_section_group - Removed
add_tendon_3d - Removed
add_thickness - Removed
add_time_history_case - Removed
add_time_history_function - Removed
add_time_parameter - Removed
add_to_structure_group - Removed
add_traffic_lane - Added
analyze_model - Removed
apply_beam_distributed_load - Removed
apply_nodal_force - Removed
apply_prestress - Removed
assign_element_stirrup - Removed
assign_tendon_elements - Removed
calc_section_property - Removed
calculate_section_property - Removed
call_qtmodel_api - Removed
change_construct_stage - Removed
check_qiaotong_connection - Removed
configure_analysis - Removed
configure_check_analysis - Removed
create_beam_element - Removed
create_beam_elements_linear - Removed
create_boundary_group - Removed
create_continuous_beam_bridge - Removed
create_elements - Removed
create_line_width_section - Removed
create_live_load_case - Removed
create_load_case - Removed
create_load_group - Removed
create_material - Removed
create_nodes - Removed
create_nodes_linear - Removed
create_polygon_section - Removed
create_section - Removed
create_section_from_properties - Removed
create_simple_beam_bridge - Removed
create_structure_group - Removed
create_tapered_section - Removed
create_tendon_2d - Removed
create_tendon_property - Removed
display_ids - Added
edit_boundaries - Added
edit_construction - Added
edit_geometry - Added
edit_loads - Added
edit_prestress - Added
edit_properties - Added
edit_traffic - Removed
find_entities - Removed
get_analysis_results - Removed
get_check_data - Removed
get_live_load_results - Removed
get_model_data - Removed
get_model_info - Removed
get_special_results - Removed
get_tendon_info - Removed
get_tendon_length_result - Removed
get_tendon_loss_results - Removed
get_tendon_position_result - Removed
initialize_model - Added
inspect_bridge - Removed
list_group_members - Removed
list_qtmodel_api - Removed
manage_check_case_file - Removed
manage_check_stirrup - Added
manage_checks - Added
manage_model_files - Removed
merge_nodes - Removed
merge_operation_stage - Removed
move_nodes - Removed
open_model_file - Removed
plot_analysis_result - Added
query_model - Added
query_results - Removed
remove_boundary - Removed
remove_construction_stage - Removed
remove_elements - Removed
remove_from_structure_group - Removed
remove_nodes - Removed
remove_section - Removed
remove_structure_group - Removed
remove_unused_sections - Removed
renumber_elements - Removed
renumber_nodes - Removed
reset_display - Removed
revert_local_orientation - Removed
run_analysis - Removed
run_concrete_check - Removed
save_model_file - Removed
save_model_screenshot - Removed
set_gravity - Removed
set_render - Removed
set_self_weight_stage - Removed
set_support - Removed
set_unit - Removed
set_view_angle - Removed
setup_concrete_check - Removed
switch_display_stage - Removed
update_bulking_setting - Removed
update_construction_stage - Removed
update_element - Removed
update_element_beta - Removed
update_element_id - Removed
update_element_material - Removed
update_element_nodes - Removed
update_element_section - Removed
update_node - Removed
update_node_id - Removed
update_section_bias - Removed
update_section_property - Removed
update_structure_group_name - Removed
update_vertical_steel_tendon - Removed
validate_model - Added
view_model
132 tool updates
v0.3.1- First observed
activate_structure - First observed
add_beam_constraint - First observed
add_beam_section_temperature - First observed
add_cable_length_load - First observed
add_check_load_combination - First observed
add_check_stirrup - First observed
add_constraint_equation - First observed
add_construction_stage - First observed
add_creep_function - First observed
add_custom_temperature - First observed
add_distribute_plane_load - First observed
add_effective_width - First observed
add_elastic_link - First observed
add_elastic_support - First observed
add_elements_to_group - First observed
add_gradient_temperature - First observed
add_influence_plane - First observed
add_initial_tension_load - First observed
add_load_combine - First observed
add_load_to_mass - First observed
add_master_slave_link - First observed
add_nodal_mass - First observed
add_node_tandem - First observed
add_parametric_reinforcement - First observed
add_plate_element_load - First observed
add_shrink_function - First observed
add_spectrum_case - First observed
add_spectrum_function - First observed
add_standard_vehicle - First observed
add_support_settlement - First observed
add_system_temperature - First observed
add_tapper_section_group - First observed
add_tendon_3d - First observed
add_thickness - First observed
add_time_history_case - First observed
add_time_history_function - First observed
add_time_parameter - First observed
add_to_structure_group - First observed
add_traffic_lane - First observed
apply_beam_distributed_load - First observed
apply_nodal_force - First observed
apply_prestress - First observed
assign_element_stirrup - First observed
assign_tendon_elements - First observed
calc_section_property - First observed
calculate_section_property - First observed
call_qtmodel_api - First observed
change_construct_stage - First observed
check_qiaotong_connection - First observed
configure_analysis - First observed
configure_check_analysis - First observed
create_beam_element - First observed
create_beam_elements_linear - First observed
create_boundary_group - First observed
create_continuous_beam_bridge - First observed
create_elements - First observed
create_line_width_section - First observed
create_live_load_case - First observed
create_load_case - First observed
create_load_group - First observed
create_material - First observed
create_nodes - First observed
create_nodes_linear - First observed
create_polygon_section - First observed
create_section - First observed
create_section_from_properties - First observed
create_simple_beam_bridge - First observed
create_structure_group - First observed
create_tapered_section - First observed
create_tendon_2d - First observed
create_tendon_property - First observed
display_ids - First observed
find_entities - First observed
get_analysis_results - First observed
get_check_data - First observed
get_live_load_results - First observed
get_model_data - First observed
get_model_info - First observed
get_special_results - First observed
get_tendon_info - First observed
get_tendon_length_result - First observed
get_tendon_loss_results - First observed
get_tendon_position_result - First observed
initialize_model - First observed
list_group_members - First observed
list_qtmodel_api - First observed
manage_check_case_file - First observed
manage_check_stirrup - First observed
merge_nodes - First observed
merge_operation_stage - First observed
move_nodes - First observed
open_model_file - First observed
plot_analysis_result - First observed
remove_boundary - First observed
remove_construction_stage - First observed
remove_elements - First observed
remove_from_structure_group - First observed
remove_nodes - First observed
remove_section - First observed
remove_structure_group - First observed
remove_unused_sections - First observed
renumber_elements - First observed
renumber_nodes - First observed
reset_display - First observed
revert_local_orientation - First observed
run_analysis - First observed
run_concrete_check - First observed
save_model_file - First observed
save_model_screenshot - First observed
set_gravity - First observed
set_render - First observed
set_self_weight_stage - First observed
set_support - First observed
set_unit - First observed
set_view_angle - First observed
setup_concrete_check - First observed
switch_display_stage - First observed
update_bulking_setting - First observed
update_construction_stage - First observed
update_element - First observed
update_element_beta - First observed
update_element_id - First observed
update_element_material - First observed
update_element_nodes - First observed
update_element_section - First observed
update_node - First observed
update_node_id - First observed
update_section_bias - First observed
update_section_property - First observed
update_structure_group_name - First observed
update_vertical_steel_tendon - First observed
validate_model
TDQS
Scored across 15 tools
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.
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.
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.
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
Related MCP Connectors
AI Hub for AEC โ 50+ 3D formats, clash detection, ACC integration via Autodesk Platform Services.
Connects AI assistants to QCDatabase.AI for everyday construction quality-control work.
AI-powered project controls tools for Primavera P6 and Primavera Unifier.
AI-callable calculators and engineering models with real formulas. No hallucinated math.
Related MCP Servers
- AlicenseAqualityDmaintenanceConnects AI assistants to CSI ETABS for structural engineering tasks, enabling model creation, analysis, design, and seismic checks via the COM API.699MIT
- AlicenseAqualityDmaintenanceEnables 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.5MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude to directly control Midas Civil NX for bridge structural analysis, allowing users to model, apply loads, and perform analysis through natural language descriptions.2MIT
- AlicenseAqualityAmaintenanceEnables AI agents to interact with Bentley STAAD.Pro models for tasks like load case definition, data extraction, and property setting through natural language.549MIT