csibridge-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., "@csibridge-mcpwhat's the maximum deflection in the open CSiBridge model?"
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.
csibridge-mcp
An MCP server that lets an AI assistant drive a running CSiBridge: build and edit models, run analyses, and read results, by calling CSiBridge's own API. It works with any client that speaks the Model Context Protocol: Claude Code, GitHub Copilot in VS Code or Visual Studio, and, over HTTP, remote clients such as Microsoft 365 Copilot.
How it works
CSiBridge exposes its API through COM, which exists only on Windows. So the server runs on the same Windows machine as CSiBridge, attaches to the CSiBridge instance you already have open, and works in that live session: you see every change on screen as it happens.
MCP client --stdio or HTTPS--> csibridge-mcp --COM (comtypes)--> CSiBridgeRather than wrapping a hand-picked subset of the API, the server exposes all of it:
call/batchinvoke any API function by its documented path, such asSapModel.FrameObj.AddByCoord.api_search/api_describe/api_enumread function signatures and enum values from the type library of the CSiBridge version that is actually installed, so the assistant checks a signature instead of guessing it. This includes the parametric Bridge Modeler API (SapModel.BridgeModeler_1, CSiBridge v25 and later).list_tables/get_table/edit_tableread and edit CSiBridge's database tables, which cover model definitions (including bridge layout lines, deck sections and bridge objects) and all analysis and design results.
Because CSiBridge cannot run on macOS or Linux, the server also has a mock backend: a small fake of the API, shaped like the real COM wrappers, that makes it possible to develop and test here.
Related MCP server: ETABS MCP Server
Setup on Windows
Requirements: CSiBridge installed and licensed, and an MCP client. Then pick one of two ways to get the server onto the machine.
Option A: the portable zip (nothing to install)
For locked-down or non-technical machines. The zip bundles the official embeddable Python, so it needs no Python, uv, git or admin rights.
Download
csibridge-mcp-portable-win64.zipfrom the releases page (every CI run also produces it as a build artifact) and unzip it anywhere, for example in Documents.Start CSiBridge, then double-click
Self-test.cmd. It attaches to CSiBridge, reads the API's type library, makes a few read-only calls and prints a pass/fail report. It changes nothing in your model.Connect your client (see below). The server command is the
python\python.exeinside the folder with the arguments-m csibridge_mcp;Register with Claude Code.cmddoes this for Claude Code.
Option B: from source with uv
Needs uv (winget install astral-sh.uv).
git clone https://github.com/austinulfers/csibridge-mcp.git
cd csibridge-mcp
uv sync
uv run csibridge-mcp selftestThe server command is then uv run --directory C:\path\to\csibridge-mcp csibridge-mcp.
Connecting a client on the same machine
Claude Code
claude mcp add --scope user csibridge -- uv run --directory C:\path\to\csibridge-mcp csibridge-mcp(Or the portable folder's python\python.exe -m csibridge_mcp in place of the uv run ... part.)
Run /mcp inside Claude Code to confirm csibridge is connected.
VS Code (GitHub Copilot agent mode) — add the server with the "MCP: Add Server" command, or
put this in .vscode/mcp.json in your workspace:
{
"servers": {
"csibridge": {
"type": "stdio",
"command": "C:\\path\\to\\csibridge-mcp\\python\\python.exe",
"args": ["-m", "csibridge_mcp"]
}
}
}Visual Studio 2022 (17.14 or later) — the same servers block in a .mcp.json next to your
solution.
Then ask the assistant something like "What model is open in CSiBridge?"
Notes:
CSiBridge and the MCP client must run as the same Windows user at the same elevation (both normal, or both "as administrator"); otherwise the running instance cannot be found.
The server attaches to a running CSiBridge. It only starts CSiBridge when asked to (
connectwithmode="launch"); pass--no-launchto forbid that.The first call after installing is slow, because comtypes generates Python wrappers for the whole API once and caches them.
Python must be 64-bit, like CSiBridge. The portable zip and uv's default both are.
--helper-progidand--progidselect a different CSI API library or product object. The defaults areCSiAPIv1.HelperandCSI.CSiBridge.API.SapObject.
Remote access over HTTP (Microsoft 365 Copilot, online agents)
Clients that run in the cloud cannot start a program on your PC, so for them the server can be served over HTTP instead of stdio. Access is locked down with per-person tokens: the server refuses every request that does not carry a valid one, tokens are issued and revoked by whoever hosts the server, and each request is logged under the name the token was issued to.
Create a token for each person (or client) allowed in. The token is shown once; it is stored hashed in
~/.csibridge-mcp/tokens.json.uv run csibridge-mcp token add "Jane Doe"(
token listandtoken revoke "Jane Doe"manage them; revoking takes effect immediately on a running server. The portable folder hasAdd access token.cmdfor this.)Start the server over HTTP. With CSiBridge open:
uv run csibridge-mcp serve --http(Portable folder:
Start HTTP server.cmd.) By default it listens only on this machine, athttp://localhost:8765/mcp, and refuses to start if no tokens exist.Make it reachable over HTTPS — never expose it as plain HTTP. Any of these work:
A tunnel, which also handles certificates and firewalls:
cloudflared tunnel --url http://localhost:8765prints a publichttps://…address.A reverse proxy (IIS, Caddy, nginx) that terminates TLS and forwards to
localhost:8765.Direct, if you have a certificate:
serve --http --host 0.0.0.0 --tls-cert cert.pem --tls-key key.pem.
Point the client at
https://<your address>/mcpwith the token as a header, eitherAuthorization: Bearer <token>orX-API-Key: <token>:Microsoft 365 Copilot — in Copilot Studio, add a tool of type Model Context Protocol with that URL, authentication API key, sent in the
X-API-Keyheader. Share the resulting agent only with the people who should have it: that, plus the token, is the lock-down.Claude Code (from another machine):
claude mcp add --transport http csibridge https://<your address>/mcp --header "Authorization: Bearer <token>"VS Code:
"type": "http", "url": "https://<your address>/mcp", "headers": {"X-API-Key": "<token>"}.
Things to understand before sharing a token:
A token gives full use of the CSiBridge session on the hosting machine, including saving files there as the hosting user. Issue tokens only to people you would let sit at that computer.
Everyone with a token works in the same CSiBridge session and model. Calls run one at a time.
Claude.ai and ChatGPT custom connectors require OAuth sign-in rather than a static token, so they cannot use this server yet.
Tools
Tool | Purpose |
| Whether CSiBridge is attached, the open model, units, lock state, anything still running |
| Attach to a specific instance, re-attach, or launch CSiBridge |
| Call any API function by path |
| Run many calls in one round trip |
| Find functions by name; returns full signatures |
| List an interface's functions, or show one function's exact signature |
| List the values of an enum such as |
| Model files |
| Run the analysis |
| Keep waiting for a long operation |
| Database tables: definitions and results |
Conventions worth knowing:
A call returns
{"ret": ..., "outputs": {...}, "ok": ...}.outputsholds the function'srefparameters by name. For most functionsretis a status code where 0 means success, andokis false when it is nonzero.refparameters can be left out of a call, and arguments can be given by name.An operation that outlasts its
wait_seconds(an analysis, typically) returns{"pending": true, "job_id": ...}and keeps running;job_waitcollects the result.Calls run one at a time, in order, because the CSI API is not re-entrant.
The server sends clients a short set of usage instructions (conventions like the ones above). Clients that do not pass server instructions to the model still get the essentials, which are repeated in each tool's description.
Developing on macOS or Linux
uv sync
uv run pytest # the test suite, against the mock backend
uv run csibridge-mcp selftest --mock # the same report the Windows self-test prints
uv run csibridge-mcp serve --http --mock --token csib_dev # the HTTP transport, locallyThis folder carries a csibridge-mock server entry for Claude Code (.mcp.json) and for VS Code
(.vscode/mcp.json): the real MCP server running on the mock backend, so the tools can be tried
in either client without Windows.
The mock (src/csibridge_mcp/mock_csi.py) implements a few dozen functions: enough to build a small
frame model, "analyse" it and read tables. Its numbers are placeholders, not structural results.
Code layout, in src/csibridge_mcp/:
File | Role |
| The MCP tools |
| Owns the CSiBridge connection; runs requests one at a time on a worker thread; the real (COM) and mock backends; the self-test |
| Reads function signatures from the type library; converts arguments and labels results |
| Access tokens and the auth layer for the HTTP transport |
| The fake API used off Windows |
| Command line entry point |
The portable zip is built by scripts/build-portable.ps1 (launchers in scripts/portable/); CI
(.github/workflows/ci.yml) runs the tests on Windows, macOS and Linux, builds the zip on every
push, and attaches it to the release for tags named v*.
What has and has not been verified
This was developed on a Mac, where CSiBridge cannot run.
Verified: the MCP server and every tool, end to end over stdio and over HTTP (including the token check), against the mock backend (
uv run pytest).Verified: the assumptions the real backend makes about comtypes, by running the introspection and result-labelling code against comtypes' own member-spec and calling-convention code (
tests/test_comtypes_contract.py). CI on Windows additionally checks that the COM path gets as far as looking for CSiBridge and reports its absence cleanly.Not yet verified: anything against a real CSiBridge. The COM backend in
engine.pyfollows CSI's published Python example and comtypes' source, but it has never been executed against the program. The three table tools also rely on the argument order of theSapModel.DatabaseTablesfunctions as CSI documents them.
So the first run on a machine with CSiBridge is the real test. Run the self-test there first; its report shows which layer fails, if any.
License
Functional Source License 1.1, MIT future license (FSL-1.1-MIT). You may use, modify and share it freely, including inside a company and for paid engineering work; what you may not do is offer it to others as a competing commercial product or service. Each version becomes MIT-licensed two years after its release.
Available Tools
15 toolsapi_describeARead-only
Describe part of the CSiBridge API, read from the installed version's type library.
Args: path: A function path ("SapModel.FrameObj.AddByCoord") for its exact parameters, an interface path ("SapModel.FrameObj") to list its functions, or empty for the tree of all interfaces. filter: When listing an interface, only show functions whose name contains this text.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and the output schema covers the return shape. The description adds the useful fact that content comes from the installed version's type library (so results reflect the local install, not a remote catalog), but says nothing about performance, caching, or behavior on an invalid path.
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 a single sentence, followed by a tidy Args block. Little waste; the formatting is appropriate for a two-parameter introspection tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and both parameters are fully described, so the essentials are covered for a read-only introspection tool. The remaining gap is routing relative to the sibling API-discovery tools, which matters in a toolset this dense.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and largely meets it: it enumerates all three path modes with concrete examples and explains that filter is conditional ('When listing an interface'). This is well above the baseline the schema would otherwise provide, though edge cases like a nonexistent path are unaddressed.
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 ('Describe part of the CSiBridge API') plus the source of truth ('read from the installed version's type library'). This is clear enough to act on, but it never distinguishes itself from the closely-related siblings api_search and api_enum, so an agent must infer which API-introspection tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The three modes of the path argument imply how the tool is used (function path, interface path, empty), which is useful context. However, there is no explicit statement of when to reach for this tool over api_search or api_enum, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_enumARead-only
List the values of an API enum such as eUnits, eMatType or eLoadPatternType.
Give an enum name, or part of an enum or member name to find it. Empty lists all enums.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, and 'List' is consistent with that. The description adds the partial-match and empty-input semantics, but discloses nothing about result size, rate limits, or whether member values are included alongside enum names.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose first, parameter behavior second, with concrete examples inline. No filler and nothing that could be cut without losing 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?
An output schema exists, so return values need not be described, and the parameter behavior is fully covered. For a one-parameter lookup tool this is close to complete; only the absence of any sibling differentiation keeps it from the top score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'name' parameter has no schema text at all, so the description must carry it — and it does: full name, partial enum/member name, or empty for everything. It only lacks edge details like case sensitivity or matching behavior when a partial string is ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the values of an API enum') and grounds it with concrete examples (eUnits, eMatType, eLoadPatternType). It does not explicitly distinguish itself from the nearby api_search/api_describe siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how to invoke it (give a full enum name, a partial name, or leave empty to list all), which is useful operational guidance. However, it never says when to reach for this tool versus api_search or api_describe, and there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_searchARead-only
Search the installed CSiBridge API for functions by name.
Matches every word of the query against function paths and parameter names, and returns full signatures, e.g. query "frame distributed load" or "BridgeModeler span".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries the rest of the burden and does so reasonably: it discloses the matching algorithm (every word matched against function paths AND parameter names) and the shape of the result (full signatures). It does not mention result ordering, truncation behavior, or what happens when nothing matches.
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 action, then one sentence on matching semantics, then examples. Short and mostly waste-free, though the examples could be folded into the same sentence without losing clarity.
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 spelled out, and the description adds useful matching detail. But with 0% schema coverage and no explanation of 'limit', plus no differentiation from the api_describe/api_enum siblings, the definition is not fully complete for a search tool in a crowded namespace.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It partially does for 'query' by explaining the matching semantics and giving examples, but 'limit' (default 30) is never mentioned or explained, leaving one of two parameters undocumented anywhere.
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: search the installed CSiBridge API for functions by name, with concrete example queries. An agent can tell this is a function-lookup tool, but the description never contrasts it with the sibling api_describe or api_enum, which likely overlap.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The two example queries ('frame distributed load', 'BridgeModeler span') imply how to phrase a search, and the all-words-must-match rule implies expected precision. However, there is no explicit when-to-use or when-not-to-use guidance, and no pointer to api_describe/api_enum as follow-up or alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batchA
Run many API calls in order in one round trip.
Use this to build or query a model efficiently (for example adding dozens of objects).
Args:
calls: [{"method": "...", "args": [...], "kwargs": {...}}, ...], each with the same
meaning as the call tool.
stop_on_error: Stop at the first call that fails (default) rather than continuing.
wait_seconds: How long to wait before returning a pending job_id instead.
| Name | Required | Description | Default |
|---|---|---|---|
| calls | Yes | ||
| wait_seconds | No | ||
| stop_on_error | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden, and it does disclose meaningful traits: execution order is preserved, stop_on_error aborts on first failure by default, and wait_seconds can return a pending job_id (async behavior). It stops short of stating mutation/destructive impact, auth needs, or partial-failure semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, followed by usage and then a compact Args block. Every sentence earns its place with no 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?
An output schema exists so return values need no explanation, and the description covers ordering, error handling, and async job behavior. It is nearly complete for a batching tool but leaves out safety/permission context that annotations would otherwise supply.
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 0%, so the description must compensate, and it explains all three parameters: the `calls` array structure and its per-entry meaning via the `call` tool, plus the default behavior of stop_on_error and wait_seconds. This is strong compensation, though the item shape is delegated by reference rather than fully specified.
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+scope: run many API calls in order in one round trip. It implicitly distinguishes itself from the single-call sibling `call` by emphasizing batching and ordering, so an agent can tell the two apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context (build or query a model efficiently, e.g. adding dozens of objects) and ties `calls` semantics back to the `call` tool. It does not name an explicit when-not or spell out the alternative for single calls, so it falls short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
callA
Call any CSiBridge API function by its documented path.
Returns {"ret": return value, "outputs": {ref parameter: value}, "ok": bool}. For most
functions ret is a status code and 0 means success. Check a function's signature with
api_describe or api_search before calling it for the first time.
Args:
method: The function path, e.g. "SapModel.FrameObj.AddByCoord".
args: Input arguments in signature order. Trailing optional and ref parameters may
be left off. An object of name: value is also accepted.
kwargs: Input arguments by parameter name, instead of or after positional ones.
wait_seconds: How long to wait before returning a pending job_id instead.
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| kwargs | No | ||
| method | Yes | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the return contract (ret/outputs/ok), the convention that a status code of 0 means success, how ref/optional trailing parameters are handled, and that long-running work may surface as a pending job_id governed by wait_seconds. It does not warn that arbitrary model-mutating or file-level API functions can be destructive, nor does it mention auth or model-state requirements, which is the remaining gap.
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, followed by the return contract and the one piece of operational guidance, then a tight Args block. Every sentence carries information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained (the description does so anyway with useful semantics). The main missing context is failure behavior (what ok=false plus a nonzero ret implies) and any caution that some API paths mutate the model or files. For a generic dispatch tool of this complexity, it is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description fully compensates: method is explained with a concrete path example, args covers positional ordering plus the object form and omission of trailing optional/ref params, kwargs covers named arguments, and wait_seconds explains when a pending job_id is returned. Nothing about the four parameters is left undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Call any CSiBridge API function by its documented path') and implicitly positions itself as the generic dispatch sibling against api_search/api_describe, which it names explicitly. An agent can tell what this does 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?
Gives an explicit prerequisite workflow: 'Check a function's signature with api_describe or api_search before calling it for the first time.' That is actionable context. It stops short of any exclusion or routing guidance (e.g., when to prefer batch or a typed tool like edit_table over this escape hatch), so it is clear context without alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connectA
Attach to a running CSiBridge, or start one.
The other tools attach to a running CSiBridge automatically, so this is only needed to start CSiBridge (mode="launch"), to choose between several running instances (pid), or to re-attach after CSiBridge was restarted.
Args: mode: "attach" to use a running instance, "launch" to start a new one. pid: With "attach", the process id of the instance to use. program_path: With "launch", the full path of a specific CSiBridge.exe. Defaults to the latest installed version.
| Name | Required | Description | Default |
|---|---|---|---|
| pid | No | ||
| mode | No | attach | |
| program_path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose real behavioral traits: sibling tools auto-attach, this is normally unnecessary, and re-attachment is needed after a restart. It stops short of describing failure modes (no instance found, invalid pid, launch errors) or whether launching spawns a blocking GUI process.
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 purpose and the usage conditions before the Args block, which is the right ordering. The Args section partially restates the prose above, so there is mild redundancy, but the conditional applicability detail earns most of its space.
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 values need not be described, and with zero required parameters the tool is low-complexity. The description covers when to call it and what each parameter does; only error/failure behavior is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does: each of the three parameters is explained, including the conditional scoping that pid applies only with 'attach' and program_path only with 'launch', plus the default of latest installed version. It does not explain how to obtain a pid, which is the one practical gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource pair ('Attach to a running CSiBridge, or start one') and immediately differentiates itself from the other tools, which attach automatically. An agent can tell from the first sentence exactly what this tool does and how it relates to the rest of the toolset.
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 enumerates the three conditions that justify calling it: launching via mode="launch", disambiguating multiple running instances via pid, and re-attaching after a CSiBridge restart. It also states the default condition (do nothing, since other tools attach automatically), which is an unusually clear when-not-to-use signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_tableADestructive
Replace the contents of an editable database table (CSiBridge's interactive database editing).
The rows given become the table's entire contents: records left out are removed from the model. So read the table with get_table(for_editing=True), change what is needed, and send every row back. The model must be unlocked for most tables. Returns CSiBridge's import log.
Args:
table_key: The table's key, from list_tables.
fields: Field keys, in the order used by each row.
rows: The records, each a list of values in fields order or an object keyed by field.
table_version: The table_version returned by get_table(for_editing=True). Looked up if omitted.
apply: Apply the edit to the model now. With false the edit is only staged, to be
applied together with other tables by a later edit_table call.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| apply | No | ||
| fields | Yes | ||
| table_key | Yes | ||
| table_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the critical destructive semantics beyond the annotation: 'The rows given become the table's entire contents: records left out are removed from the model.' This is consistent with destructiveHint=true and far more informative. It also names the lock prerequisite and the return value (CSiBridge's import log).
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 the destructive warning and workflow before the Args block, and each sentence earns its place. Slightly long, but the Args section is justified given 0% schema coverage rather than being padding.
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?
Complete for a destructive mutation tool: destructive scope, prerequisites, workflow, staging behavior, and return value are all covered. The output schema handles the import-log shape, so nothing essential 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 0%, so the description carries the full burden and does: table_key provenance (from list_tables), fields ordering, rows accepting either positional lists or field-keyed objects (schema types rows items as untyped {}), table_version lookup fallback, and the subtle staged-edit meaning of apply=false.
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 ('Replace the contents of an editable database table') and immediately contrasts with the read path by naming get_table(for_editing=True) as the prerequisite. An agent can distinguish this from get_table and list_tables 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 an explicit read-modify-write workflow: read with get_table(for_editing=True), change, send every row back, and use the returned table_version. It also states the precondition ('The model must be unlocked for most tables') and explains the staged-vs-applied alternative via `apply`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tableARead-only
Read a CSiBridge database table as {"fields": [...], "rows": [[...], ...]}.
Works for model definition tables and, after an analysis, result tables. All values are text, in the model's present units.
Args: table_key: The table's key, from list_tables. fields: Only these fields. Default: all fields. group: Only objects in this group. Default: all objects. where: Only rows whose fields equal these values, e.g. {"OutputCase": "DEAD"}. limit: Maximum number of rows to return. offset: Number of matching rows to skip, for paging. for_editing: Read the table in the form edit_table expects (all fields, plus the table_version to pass back). load_cases: For result tables, the load cases to report. load_combos: For result tables, the load combinations to report. load_patterns: For result tables, the load patterns to report.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| limit | No | ||
| where | No | ||
| fields | No | ||
| offset | No | ||
| table_key | Yes | ||
| load_cases | No | ||
| for_editing | No | ||
| load_combos | No | ||
| load_patterns | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already establishes the safety profile, so the description's job is to add context. It does: all values are text in the model's present units, and for_editing returns a table_version to pass back to edit_table. It does not discuss error behavior or limits beyond the paging defaults, but with annotations covering safety this is solid.
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 the operation and return shape in one sentence, then a well-labeled Args list with one line per parameter. No padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still supplies the shape. All parameters, the key source, the units caveat, and the editing round-trip are covered — nothing needed to invoke 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 0%, so the description carries the full burden and does so, documenting all ten parameters. The where filter gets a concrete example ({"OutputCase": "DEAD"}), and for_editing explicitly says it returns all fields plus the table_version for edit_table.
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 ('Read a CSiBridge database table') and even specifies the return shape. It clarifies scope by noting it covers model definition tables and, post-analysis, result tables, and references list_tables as the source of the key, which distinguishes it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: the key comes from list_tables, result tables require an analysis to have been run, and for_editing selects the form edit_table expects. It stops short of explicit when-not guidance or naming edit_table as the write-side alternative, but the routing signals are strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
job_waitBRead-only
Wait for a pending operation (one that returned a job_id) and return its result.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ||
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a non-mutating operation, so the safety profile is covered. The description adds that the call blocks ('Wait') and returns the job result, but says nothing about timeout behavior, whether it errors or returns partial state if wait_seconds elapses, or how it interacts with concurrent polling.
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?
A single compact sentence with the action and the identifying precondition front-loaded. It is efficient, though arguably too terse for a blocking tool whose timeout semantics matter.
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 described. However, for a blocking wait tool the missing piece is what happens when the job does not finish within wait_seconds, which the description and schema both leave unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It usefully explains where job_id comes from ('one that returned a job_id'), but wait_seconds is never mentioned in the description and the schema gives it only a title and a default of 50, leaving the blocking window and its implications undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (wait), the resource (a pending operation that returned a job_id), and the outcome (returns its result). That distinguishes it from polling siblings like status or call, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(one that returned a job_id)' implies the precondition for use, but there is no explicit when-to-use versus when-not, no named alternative such as status, and no guidance on repeated invocation or what to do if the wait expires.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesARead-only
List CSiBridge database tables: model definitions and analysis/design results.
Each entry has the table key (used by get_table) and its import_type: 0 = read-only, 1 = editable only by file import, 2 = editable with edit_table while the model is unlocked, 3 = editable with edit_table at any time.
Args: filter: Only tables whose key contains every word, e.g. "bridge section" or "joint". include_empty: Also list tables that have no data in the current model. limit: Maximum number of tables to return.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| filter | No | ||
| include_empty | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, yet the description adds real behavioral context beyond that: the import_type scale (0 read-only through 3 editable anytime) plus the lock-state requirement for type 2. It omits pagination/ordering behavior around limit, which keeps it short of a 5.
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 the one-line purpose, then the entry structure, then args — good ordering with no filler. The Args block is partly a restatement of the schema, which is minor redundancy but it does add semantics.
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 values need not be spelled out, yet the description still explains the shape of each entry (table key + import_type) which is the critical piece for chaining into get_table. Combined with the filter/empty/limit semantics, 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 description coverage is 0%, so the description must carry all three parameters, and it does: filter matches tables whose key contains every word (with examples), include_empty includes tables with no data, and limit caps the returned count. Each definition adds meaning the bare schema does not.
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 ('List CSiBridge database tables') and qualifies the scope as model definitions plus analysis/design results. It references get_table as the consumer of the returned table keys, which implicitly separates it from that sibling, but it never explicitly contrasts itself with get_table/edit_table.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is a discovery step before get_table/edit_table, and the import_type legend hints at which tables are editable. There is no explicit 'use this when...' statement, no exclusion, and no naming of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
new_modelADestructive
Start a new blank model, replacing the model currently open.
Unsaved changes to the current model are lost, so save it first if they matter.
Args: units: Present units for the new model, one of: lb_in_F, lb_ft_F, kip_in_F, kip_ft_F, kN_mm_C, kN_m_C, kgf_mm_C, kgf_m_C, N_mm_C, N_m_C, Ton_mm_C, Ton_m_C, kN_cm_C, kgf_cm_C, N_cm_C, Ton_cm_C.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | kN_m_C |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, and the description earns credit by specifying exactly what is destroyed: unsaved changes to the currently open model are lost. That is concrete, non-obvious data-loss context beyond the annotation, though there is no mention of undo, recovery, or whether the discard is immediate.
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 destructive warning is front-loaded in the second sentence, and the Args block is tight. The 16-value units enumeration is long but necessary given the missing enum, so it earns its space.
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. With one optional parameter defaulting to kN_m_C, the description covers the side effect, the prerequisite, and the valid values, leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema has no enum for units, so the description carries the full burden. It enumerates all 16 valid unit strings and notes the parameter controls present units, adding substantial meaning the schema does not provide.
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 ('Start a new blank model') plus the key side effect ('replacing the model currently open'). It clearly separates the tool from siblings like open_model and save_model by implication, though it never names them outright.
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 a clear condition ('replacing the model currently open') and an actionable prerequisite ('save it first if they matter'), which routes the agent to save_model when needed. It does not explicitly say when to prefer open_model instead of starting blank, so the alternative 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.
open_modelADestructive
Open a CSiBridge model file (.bdb), replacing the model currently open.
Unsaved changes to the current model are lost, so save it first if they matter.
Args: path: Full Windows path of the model on the machine running CSiBridge.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags this as destructive, but the description earns credit by spelling out what exactly is destroyed (unsaved changes to the current model are lost) and by stating the path must be a full Windows path on the machine running CSiBridge. Missing detail: whether a missing/invalid file errors out or leaves the prior model intact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences (plus one arg line): what it does, the destructive consequence, and the argument. The consequence is front-loaded immediately after the action, which is exactly where an agent needs it.
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 described, and the agent gets the action, the destruction warning, and the path contract. Minor gaps remain: error behavior on a nonexistent path, and whether the open-model state affects subsequent calls (e.g., status/run_analysis).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'path' parameter, so the description must compensate, and it does: it specifies a full Windows path referencing a file on the CSiBridge host machine, plus the .bdb extension. It stops short of giving an example path or quoting/escaping guidance.
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 (open) and resource (CSiBridge model file, .bdb) and adds the crucial scope note that it replaces the currently open model. That 'replacing the model currently open' clause is what separates it from the sibling new_model, so an agent can pick 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?
Usage is implied but not routed: the reader learns the tool is for loading an existing .bdb file and that unsaved work should be saved first (implicitly pointing at save_model), yet neither save_model nor new_model is named, and no explicit when-to-use/when-not statement is given. Adequate but leaves the alternative choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_analysisA
Run the analysis of the open model.
The model must already have been saved to a file. Running locks the model. Large models take a while: if this returns pending, keep waiting with job_wait.
| Name | Required | Description | Default |
|---|---|---|---|
| wait_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the save-to-file prerequisite, that running locks the model (a stateful side effect), and that large models run long and may return a pending status. It does not say whether the lock is released, what permissions are needed, or whether the operation is destructive.
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?
Short and front-loaded: the action comes first, then prerequisite, then locking behavior, then the async caveat. Each sentence adds information, though the fragmented line breaks make it slightly less scannable than a single tight 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 described. Combined with the prerequisite, lock disclosure, and pending/job_wait guidance, the definition is nearly complete for a stateful long-running analysis tool; only the lone parameter remains unexplained.
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?
There is one parameter (wait_seconds) at 0% schema description coverage, and the description never mentions it. The passing reference to waiting via job_wait does not explain what wait_seconds controls or its default of 50, so the single parameter is effectively undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Run the analysis of the open model'), and the reference to the 'open model' links it to the open_model sibling. However, 'the analysis' is left undefined — an agent cannot tell what kind of analysis is executed or what it operates on beyond the currently open model.
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 a concrete prerequisite ('The model must already have been saved to a file') and an explicit follow-up path when the call is asynchronous ('if this returns pending, keep waiting with job_wait'), naming the sibling tool. It lacks a when-not-to-use clause, but the conditional routing is genuinely actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_modelA
Save the open model.
Args: path: Full Windows path (.bdb) to save as. Empty saves to the model's current file, which fails if the model has never been saved.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does disclose one genuinely non-obvious trait — an empty path targets the current file and fails if the model was never saved — but says nothing about overwriting existing files, permissions, path validation, or atomicity for what is a write/save operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action, followed by a compact arg description. The 'Args:' block is slightly redundant with the single-parameter schema but adds the format detail, 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 no explanation, and the single parameter is fully covered including its default behavior. The remaining gap is the absence of any annotation-equivalent safety detail for a save operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it largely does: it specifies a full Windows path, the .bdb extension, and the exact semantics of the empty default (save to current file). It stops short of stating directory-existence or overwrite requirements.
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 ('Save the open model'), which is immediately distinguishable from siblings like open_model, new_model, and edit_table. It does not explicitly position itself against those siblings, but the action is 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?
Usage is implied rather than stated: it operates on the currently open model, so an agent can infer it applies after open_model/new_model. There is no explicit when-to-use/when-not guidance or named alternative, though the empty-path failure condition gives some operational context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusARead-only
Show whether CSiBridge is attached and what is open in it.
Reports the program version, the open model file, present units, whether the model is locked, and whether a long operation is still running. Call this first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds genuinely useful state context: that the report includes lock status and whether a long operation is still running, which tells the agent this call can surface contended/busy conditions. It does not say whether the tool blocks or waits on a running operation, which is the one behavioral detail left open.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose and ending with the routing instruction. The enumerated report fields (version, file, units, lock, running operation) partially duplicate the output schema, so it is slightly longer than strictly necessary, but each item still helps an agent decide whether status answers its question.
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?
Because an output schema exists, the description is not obliged to define return values, yet it still summarizes them for routing purposes. Combined with the explicit 'call this first' sequencing guidance and zero-parameter simplicity, nothing an agent needs to invoke 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?
The tool takes zero parameters, so the baseline of 4 applies; there is nothing for the description to disambiguate beyond what the empty schema already conveys.
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 ('Show') and a specific resource (attachment state and contents of the CSiBridge session), which cleanly separates it from the sibling 'connect' (which attaches) and 'open_model' (which loads a file). An agent can identify the tool's role 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?
The closing directive 'Call this first.' gives an explicit sequencing rule for the whole toolset, which is strong, actionable guidance. It stops short of naming alternatives or conditions under which you would skip it, so it is clear context rather than a full when/when-not rule set.
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.
15 tool updates
v0.1.0- First observed
api_describe - First observed
api_enum - First observed
api_search - First observed
batch - First observed
call - First observed
connect - First observed
edit_table - First observed
get_table - First observed
job_wait - First observed
list_tables - First observed
new_model - First observed
open_model - First observed
run_analysis - First observed
save_model - First observed
status
TDQS
Scored across 15 tools
Most tools target clearly distinct actions (status vs connect, list/get/edit_table, call vs batch, job_wait). The three discovery tools api_search/api_describe/api_enum overlap somewhat in intent, and the generic `call` tool conceptually overlaps with many specific tools, but descriptions differentiate them reasonably well.
Predominantly consistent snake_case with verb_noun or noun_action patterns (list_tables, get_table, edit_table, run_analysis, open_model, save_model, api_search). A few single-word tools (status, connect, call, batch) deviate slightly but remain clear and idiomatic.
15 tools is well within a healthy range for a complex bridge-engineering API. Each tool earns its place: lifecycle (new/open/save), execution (run_analysis/job_wait), table I/O (list/get/edit), discovery (api_*), and generic escape hatches (call/batch).
Covers connection, model lifecycle, analysis, table read/write, discovery, and arbitrary API calls plus batching, giving near-complete coverage via the generic `call`. Minor gaps like closing/disconnecting a model or instance explicitly are absent but workable around.
Maintenance
Related MCP Connectors
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Serves your design system and coding standards to coding agents, so they stop guessing.
Human-input bridge for AI agents with voice-first answer links, MCP tools, and HTTP APIs.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Autodesk Civil 3D, allowing them to retrieve project data, create/modify/delete drawing elements, and execute code to automate Civil 3D operations.339MIT
- 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
- 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