itasca-mcp
Connects AI agents to ITASCA geomechanics engines to browse documentation and run, monitor, and control simulations through MCP.
Browse and search command, Python SDK, and reference documentation for PFC, FLAC, 3DEC, MPoint, and MassFlow, with version selection.
Execute Python code synchronously in the running engine as a live REPL, including Itasca commands and plot creation.
Submit Python scripts for asynchronous background execution and retrieve paginated output/progress.
Check task status, list task history, and interrupt pending or running tasks.
Inspect or tune a running simulation live through the shared
__main__namespace without stopping it.Capture Python prints and Itasca console output in task logs.
itasca-mcp
itasca>model new ;now, with LLM.
itasca-mcp connects AI agents to ITASCA's geomechanics simulation software — PFC, FLAC, 3DEC, MPoint, and MassFlow — through the Model Context Protocol. Browse documentation, run simulations, and execute code, all through natural conversation.
itasca>model solve ;LLM solves.

Tools (7)
2 documentation tools — browse by path and search by keywords across the selected engine's commands, Python API, FISH intrinsics, and reference docs. No bridge required.
5 execution tools — interactive REPL, task submission, progress monitoring, interruption, and history. Requires bridge.
Related MCP server: mcp-server-terminal
Example Prompts
"Run a biaxial compression test on a dense specimen and plot the stress–strain curve"
"Build a slope model in FLAC3D and find the factor of safety"
"Model a tunnel excavation in jointed rock with 3DEC and check block displacements around the opening"
"Simulate a landslide runout with MPoint and report the final deposit profile"
"The simulation is still running, check the current unbalanced force without stopping it"
"Look up the
plotcommands in the docs, then plot the contact force chains of the current model""The command I just typed in the console doesn't seem right, take a look"
First-time Setup
Prerequisites
An ITASCA engine installed — PFC, FLAC, 3DEC, MPoint, or MassFlow. 9.0+ recommended; PFC 6.0 / 7.0, FLAC 7.0, and 3DEC 7.0 are also supported.
uv installed (for
uvx)An AI agent — Claude Code, Codex CLI, Gemini CLI, or any MCP-capable client
Agentic Setup (Recommended)
Copy this to your AI agent and let it self-configure:
Fetch and follow this bootstrap guide end-to-end:
https://raw.githubusercontent.com/yusong652/itasca-mcp/main/docs/agentic/itasca-mcp-bootstrap.mdManual Setup
1. Register the MCP server with your agent.
Most agents register it with a single command:
# Claude Code
claude mcp add itasca-mcp -- uvx itasca-mcp
# Codex / Codex-cli
codex mcp add itasca-mcp -- uvx itasca-mcp
# Gemini CLI
gemini mcp add itasca-mcp uvx itasca-mcpOr fill in the MCP config file manually:
{
"mcpServers": {
"itasca-mcp": {
"command": "uvx",
"args": ["itasca-mcp"]
}
}
}2. Start the bridge from inside the ITASCA engine:
Download addon.py, then use either of these two flows inside the engine GUI (PFC, FLAC, 3DEC, ...):
Copy the file contents into the engine's IPython console and run them
Or download the file and execute it in the engine GUI
Verify
Restart your AI agent and ask it to call itasca_execute_code to verify the connection.
Daily Startup
Once first-time setup is done, each new engine session only needs the bridge re-started — run this in the engine's IPython console and you're back online:
import itasca_mcp_bridge
itasca_mcp_bridge.start()start() checks PyPI for a newer bridge release and self-upgrades before starting. The MCP client config persists.
Features
Multi-engine, multi-version corpus - command, Python API, and reference docs for PFC, FLAC, 3DEC, MPoint, and MassFlow across engine versions (PFC: 6.0/7.0/9.0, FLAC: 7.0/9.0, 3DEC: 7.0/9.0), selected via the
softwareandversionparametersDocumentation agents can navigate - agents browse the engine command tree to discover capabilities and boundaries, reducing hallucinated commands, with plot item reference docs supplementing the official documentation
Live REPL alongside running tasks - execute code while a simulation is running: check model state and intermediate results without stopping the task; also useful for quick iteration before writing a full script
Task lifecycle management - submit long-running simulations, monitor progress, interrupt running tasks, and browse task history
Sees what you do in the GUI - cells you run in the engine's IPython pane, commands you enter at its prompt, the plots and data files you open, close or switch to, the items you add to a plot, and the data files you execute from the editor all reach the agent on its next call, so you can work in the GUI and with the agent at the same time
Agent-started bridge - an AI agent can start the bridge itself through the engine's
console.exeMulti-client compatible - works with Claude Code, Codex CLI, Gemini CLI, GitHub Copilot CLI, OpenCode, toyoura-nagisa, and other MCP clients
Troubleshooting
See Troubleshooting in the bootstrap guide.
Development
See Developer Guide: Install and Run from Source.
Contributing
PRs and issues are welcome! See CONTRIBUTING.md for where changes land and how the documentation corpus is structured, and the Developer Guide for the source install.
License
MIT - see LICENSE.
Available Tools
7 toolsitasca_browse_docA
Browse ITASCA documentation by path, like ls + cat over one documentation tree.
source picks the tree: commands (Itasca command syntax and keywords), python_api (the itasca Python SDK), fish (FISH intrinsic functions: name, signature, which versions have it), reference (contact/constitutive/joint model properties, range elements, plot items). Each level lists what is below it, so start at the top of a tree when unsure and descend.
Use itasca_query_doc when you only have keywords; its results are paths for this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Path inside the selected tree; omit for the top level. - commands: the command as the engine spells it ('ball' lists ball commands, 'ball create' is the full doc, 'ball create radius' one keyword or section; a heading such as 'block contact' or 'structure beam' lists its commands, summary.groups names them) - python_api: dotted from itasca ('itasca.ball', 'itasca.ball.create', 'itasca.ball.Ball.pos') - fish: dotted intrinsic name ('ball' lists the namespace, 'ball.pos' shows its signature plus ball.pos.x/y/z) - reference: 'category item sub' ('contact-models linear', 'range-elements cylinder', 'plot-items zone contour', 'contact-models linearpbond pb_ten' one property or section) A page too large for one response leaves parts out (summary.omitted_sections / summary.compacted); summary.hint gives the path to read them. | |
| source | Yes | Documentation tree: 'commands' (Itasca command syntax), 'python_api' (itasca Python SDK), 'fish' (FISH intrinsic functions), 'reference' (model properties, range elements, plot items). | |
| version | No | Documentation version. Defaults to 9.0 (the current 9.x release); PFC also has 6.0 and 7.0, FLAC and 3DEC have 7.0; 9.0-only engines (MPoint, MassFlow) always resolve at 9.0. Gates commands, fish and reference entries by availability; python_api is a single 9.8 baseline whose docs carry their own availability notes. | 9.0 |
| software | Yes | ITASCA engine to query: 'pfc', 'flac', '3dec', 'mpoint', or 'massflow'. Required — there is no default engine. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden well: it explains that each level lists what is below, that large pages omit parts, and that summary.omitted_sections / summary.compacted and summary.hint tell the agent how to continue. It does not explicitly state read-only safety or permissions, but browsing semantics plus the truncation behavior disclosure are strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core analogy and then structured by source tree, traversal, and alternative tool. It is efficient overall, though the source-tree list partially repeats the enum descriptions already present in the schema.
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, the description does not need to explain return values, and it covers the important calling context: how to choose source trees, when to start at the top, version implications, and what to do when content is omitted. Nothing essential for correct invocation 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%, so the schema already documents all four parameters in detail, including path examples and version availability. The description reinforces the role of source and traversal, but much of its path/version detail overlaps with structured schema descriptions, so this sits at the high-coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: browsing ITASCA documentation by path, explicitly framed as 'ls + cat over one documentation tree.' It also distinguishes the four source trees and contrasts itself with itasca_query_doc, so an agent can identify the tool 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 gives explicit traversal guidance ('start at the top of a tree when unsure and descend') and names the alternative: use itasca_query_doc when you only have keywords, since its results are paths for this tool. That is clear when-to-use and alternative-routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itasca_check_task_statusA
Check status and paginated output for a submitted Itasca task.
Output combines Python prints and Itasca console output from itasca.command() calls (table dumps, list output, command summaries) interleaved in execution order. Use skip_newest / limit to paginate, or filter to keep only matching lines.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Output lines per page | |
| filter | No | Only keep output lines containing this text | |
| task_id | Yes | Task ID returned by itasca_execute_task or listed by itasca_list_tasks | |
| skip_newest | No | Skip N newest output lines before pagination | |
| wait_seconds | No | Long-poll: return when the task changes state or after this many seconds. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. It does add real value by describing the return content (Python prints and console output interleaved in execution order), but it omits whether the call is read-only/safe, what happens if the task is still running or the ID is invalid, and it leaves the long-poll semantics of wait_seconds entirely to the schema.
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 paragraphs, front-loaded with the purpose and followed by the one genuinely non-obvious detail (output interleaving). No filler sentences, though the parameter advice could have been folded into the first sentence more tightly.
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 formatting need not be explained, yet the description usefully characterizes the content shape. With no annotations, a small gap remains around safety/read-only status and error or task-not-ready behavior, but for a status-checking tool this is close to sufficient.
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 all five parameters are already documented in structured fields; the description only restates skip_newest, limit and filter. It adds no new information about wait_seconds' long-poll behavior or about how filter interacts with pagination ordering.
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 pair ("Check status and paginated output for a submitted Itasca task") and the second paragraph clarifies what 'output' means (interleaved Python prints and console output). It implicitly separates itself from itasca_list_tasks/itasca_execute_task by scoping to an already-submitted task, but never names those siblings 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?
"Use skip_newest / limit to paginate, or filter to keep only matching lines" gives usage for three parameters but says nothing about when to call this tool versus itasca_list_tasks or how to poll a running task. The when-to-use context is implied by 'submitted task' rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itasca_execute_codeA
Execute Python code synchronously in the running Itasca engine process.
Returns stdout and an optional result variable immediately. Code runs in the engine's main thread, sharing the same main namespace as any running task — side effects persist and are immediately visible to the task on its next cycle.
The tool stays responsive while a task submitted via itasca_execute_task is cycling (calls interleave at cycle gaps), so use it as a live REPL — nothing has to be pre-scripted into the task up front. Typical uses:
Query model state and read Itasca command output: itasca.command('ball list') etc. — table dumps, list output, and command summaries are captured and interleaved with Python prints in execution order
Live inspection and tuning during a running task: check forces or contact statistics, modify parameters, swap callbacks, set sentinel variables the task reads each cycle
Create and export plots: itasca.command('plot ...')
Environment: the engine's embedded Python interpreter (Itasca 9+ → Python 3.10, pre-9 → Python 3.6 or older; the product+version is encoded in sys.executable, e.g. PFC900). When unsure, check sys.version_info before relying on newer syntax.
Code-writing rules (shared with itasca_execute_task):
Multi-line itasca.command("""...""") batches are normalized to one engine call per command, keeping the bridge reachable mid-batch. Normalization recognizes itasca.command through its import name; call it through that name directly — rebinding via intermediate variables (
_it = itasca) bypasses it and the output carries a bridge warning.Pass each FISH definition block (
fish define/fish operator/ legacy baredefine, through its terminating standaloneend) whole, in ONE itasca.command() string; feeding one line-by-line leaves the engine blocked in interactive FISH mode until completed manually in the GUI console. Per-line loops are fine for ordinary commands.program call '<file>'(.p3dat / .p2dat / .dat / ...) is supported: the bridge runs the file inline, one command per engine call, so the bridge stays reachable, the run stays interruptible, and the file's output arrives command by command.
Synchronous semantics: the request blocks until the code finishes or hits the timeout (default 10s, max 20s), and output is returned in full. The call is not tracked by itasca_list_tasks and cannot be interrupted mid-execution. For cancellable, pollable, or background work, submit via itasca_execute_task instead.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Python code to execute in the Itasca engine user console | |
| timeout | No | Seconds before the bridge aborts the snippet; longer work belongs in itasca_execute_task. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses main-thread execution, persistent side effects, blocking until completion or timeout, non-trackability by itasca_list_tasks, inability to interrupt mid-execution, and bridge behavior for command batching and FISH definitions.
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 front-loaded with the core synchronous semantics and well-structured with bullets. The code-writing rules are necessary but lengthy, making it less concise than ideal, though 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?
The definition is complete for a complex code-execution tool with an output schema. It covers environment, runtime semantics, constraints, failure/interruption behavior, parameter handling, and sibling-tool alternatives.
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. The description adds meaningful execution constraints for the code parameter, including itasca.command normalization, whole FISH blocks, and program call behavior, plus timeout usage guidance pointing longer work to itasca_execute_task.
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?
It states a precise verb and resource: execute Python code synchronously in the Itasca engine process. It also distinguishes itself from itasca_execute_task by emphasizing synchronous execution and shared engine state.
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 gives typical uses such as live model inspection, command output capture, parameter tuning, and plot creation. It also names the alternative and condition: cancellable, pollable, or background work should use itasca_execute_task instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itasca_execute_taskA
Submit a Python script file for asynchronous execution in the Itasca engine.
Returns a task_id immediately; the script runs in the background. Companion tools manage the lifecycle:
itasca_check_task_status: poll output, progress, and final status
itasca_interrupt_task: cancel a running task
itasca_list_tasks: browse task history For synchronous, inline execution, use itasca_execute_code instead.
While the task is cycling, itasca_execute_code shares the same main namespace in the engine's main thread, so you can inspect or modify simulation state live — probe progress, tune parameters mid-run, swap callbacks, or trigger early termination via a sentinel variable. Submit with reasonable starting values and refine as the task runs.
Console output from itasca.command() inside the script (table dumps, list output, command summaries) is captured into the task log alongside Python prints, visible through itasca_check_task_status.
Script-writing rules:
Multi-line itasca.command("""...""") batches are normalized to one engine call per command, keeping the task interruptible mid-batch. Normalization recognizes itasca.command through its import name; call it through that name directly — rebinding via intermediate variables (
_it = itasca) bypasses it and logs a bridge warning.Pass each FISH definition block (
fish define/fish operator/ legacy baredefine, through its terminating standaloneend) whole, in ONE itasca.command() string; feeding one line-by-line leaves the engine blocked in interactive FISH mode until completed manually in the GUI console. Per-line loops are fine for ordinary commands.program call '<file>'(.p3dat / .p2dat / .dat / ...) is supported: the bridge runs the file inline, one command per engine call, so the bridge stays reachable, the task stays interruptible, and the file's output lands in the task log command by command.
| Name | Required | Description | Default |
|---|---|---|---|
| description | Yes | Brief task purpose | |
| entry_script | Yes | Absolute path to entry Python script in the Itasca engine workspace |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden and does so: it returns a task_id immediately, runs in the background, captures console and itasca.command() output into the task log, and stays interruptible. It further discloses the shared __main__ namespace with itasca_execute_code during cycling, and what happens on violating the FISH-block or program-call rules (engine blocked in interactive FISH mode, bridge warning).
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, return behavior, and the sibling routing before the long script-writing rules, which is the right order. The scripting-rules section is dense and somewhat lengthy, but each bullet prevents a concrete failure mode rather than restating the schema.
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 shape needn't be explained, and the description still covers the async contract, lifecycle routing, cross-tool concurrency, and script authoring constraints. Nothing an agent needs to invoke this 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; the description goes beyond it by constraining what entry_script may contain — FISH definition blocks must be passed whole in a single itasca.command() string, itasca.command must be called by its import name, and program call files are run one command per engine call. That is real added meaning for the primary parameter, though the description parameter itself is 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?
The first sentence states a specific verb and resource ('Submit a Python script file') plus the execution mode ('asynchronous execution in the Itasca engine'), and later explicitly contrasts with itasca_execute_code for synchronous inline runs. An agent can distinguish it from every sibling 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?
It names the alternative explicitly ('For synchronous, inline execution, use itasca_execute_code instead') and maps the entire lifecycle to companion tools: check status, interrupt, list. The condition that selects each path is stated rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itasca_interrupt_taskA
Request interruption of a pending or running Itasca task.
Returns as soon as the request is accepted; it does not wait for the task to stop. Confirm the stop and read the output produced so far with itasca_check_task_status. Only the script stops; the engine state is preserved, so you can inspect it with itasca_execute_code or continue from it with a new itasca_execute_task. Tasks already completed, failed or interrupted return an error. If the task_id is unknown, find it with itasca_list_tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Task ID returned by itasca_execute_task or listed by itasca_list_tasks |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden — and it does: it discloses the asynchronous acceptance semantics ('Returns as soon as the request is accepted; it does not wait'), the error condition for terminal tasks, and that engine state is preserved rather than torn down. That is exactly the non-obvious behavior an agent needs before calling a mutation tool.
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 action and the async caveat in the first two lines, then layers follow-up, exclusions, and state-preservation notes. No sentence restates the name or title, and each adds a distinct operational fact.
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 instead covers the things the schema cannot: async semantics, error states, state preservation, and the correct next tool. For a single-parameter mutation tool, 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 schema already documents that task_id comes from itasca_execute_task or itasca_list_tasks, so the description is largely redundant here. Its slight value-add is the recovery hint for an unknown id, but that is guidance rather than added meaning about the parameter itself. Baseline 3 applies.
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 ('Request interruption') and resource ('Itasca task') with clear scope: 'pending or running'. An agent can distinguish it from itasca_check_task_status and itasca_execute_task 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?
Names the follow-up tool (itasca_check_task_status) to confirm the stop, the recovery path (itasca_list_tasks) for an unknown task_id, and the exclusion ('Tasks already completed, failed or interrupted return an error'). When-to-use and when-not are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itasca_list_tasksA
List tasks tracked by the bridge, newest first.
Read-only. Each entry carries task_id, status (pending / running / completed / failed / interrupted), description, entry_script, start_time, end_time and elapsed_time; total_count gives the size of the full history for paging via skip_newest + limit.
Task history is persisted in the engine working directory and survives GUI restarts. Use this to recover a task_id from an earlier session, to see what is running or recently finished, or as a cheap bridge-connectivity check. For a task's output and result use itasca_check_task_status; to submit a script use itasca_execute_task.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max tasks to return | |
| skip_newest | No | Skip N most recent tasks before listing |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 declares the tool read-only, describes ordering, explains persistence across GUI restarts, and lists returned fields and paging via total_count. It does not cover permission requirements or error behavior, but for a read-only listing tool that is a minor 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?
The first sentence front-loads the purpose and ordering, and subsequent sentences each add useful information about return fields, paging, persistence, and use cases. There is no redundant restatement of the tool name or schema.
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 the description need not fully explain return values, yet it still enumerates key entry fields and total_count. Combined with clear usage guidance and paging semantics, it is complete for a two-parameter read-only listing tool.
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 schema documents limit and skip_newest. The description adds meaning beyond the schema by explaining how they page over the full history using total_count, which helps an agent use the parameters correctly.
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 tasks tracked by the bridge'), specifies ordering ('newest first'), and distinguishes itself from siblings by naming itasca_check_task_status and itasca_execute_task as alternatives for different tasks.
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 lists when to use it: recovering a task_id from an earlier session, seeing running or recently finished tasks, or checking bridge connectivity. It also names the sibling tools to use for task output and script submission, leaving little inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
itasca_query_docA
Search ITASCA documentation by keywords, like grep; every hit carries a path for itasca_browse_doc.
Without source it searches commands, python_api, fish and reference together, so 'ball pos' shows the FISH intrinsic and the Python method side by side. With source it searches one tree and adds that tree's hints (available categories or namespaces, SDK fallback hints) when nothing matches.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (1-20). | |
| query | Yes | Search keywords or a name fragment. Examples: 'ball create', 'contact force', 'ball.pos', 'mohr-coulomb', 'zone pore pressure'. Case-insensitive. | |
| source | No | Documentation tree to search: 'commands', 'python_api', 'fish' or 'reference'. Omit to search all four at once; each hit is then tagged with its source. | |
| version | No | Documentation version. Defaults to 9.0 (the current 9.x release); PFC also has 6.0 and 7.0, FLAC and 3DEC have 7.0; 9.0-only engines (MPoint, MassFlow) always resolve at 9.0. Gates commands, fish and reference entries by availability; python_api is a single 9.8 baseline whose docs carry their own availability notes. | 9.0 |
| software | Yes | ITASCA engine to query: 'pfc', 'flac', '3dec', 'mpoint', or 'massflow'. Required — there is no default engine. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does provide useful non-obvious behavior: cross-tree searching, source tagging of hits, and source-specific fallback hints when nothing matches. It does not discuss ranking or exhaustive search semantics, but the output schema and parameter descriptions cover result shape and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and compact, with three sentences that each carry useful meaning. The phrases about source-specific hints are slightly dense but still readable and purposeful.
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 read-only search tool with a rich input schema and an output schema, the description gives enough behavioral context to call it correctly. It covers keyword search, cross-source behavior, source scoping, and the handoff path to browsing; remaining details are adequately handled by structured fields.
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. The description adds semantic context for source by explaining combined versus single-tree search and fallback hints, but it does not add meaning beyond the schema for query, software, version, or limit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: searching ITASCA documentation by keywords. It also distinguishes itself from the sibling itasca_browse_doc by explaining that every hit carries a path for browsing. The grep analogy makes the retrieval model immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains the two usage modes: omit source to search all four documentation trees, or provide source to search one tree. The relationship to itasca_browse_doc is implied through hit paths, but the description does not explicitly state when to prefer browsing over searching or vice versa.
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.
7 tool updates
v0.11.1- Removed
itasca_browse_commands - Added
itasca_browse_doc - Removed
itasca_browse_python_api - Removed
itasca_browse_reference - Removed
itasca_query_command - Added
itasca_query_doc - Removed
itasca_query_python_api
2 tool updates
v0.10.6- Changed
itasca_check_task_status1 field changed- changed
Input schema / properties / task_id / descriptionPrevious value: -"Task ID returned by itasca_execute_task"New value: +"Task ID returned by itasca_execute_task or listed by itasca_list_tasks"
- Changed
itasca_interrupt_task1 field changed- changed
Input schema / properties / task_id / descriptionPrevious value: -"Task ID returned by itasca_execute_task"New value: +"Task ID returned by itasca_execute_task or listed by itasca_list_tasks"
20 tool updates
v0.5.1- Added
itasca_browse_commands - Added
itasca_browse_python_api - Added
itasca_browse_reference - Added
itasca_check_task_status - Added
itasca_execute_code - Added
itasca_execute_task - Added
itasca_interrupt_task - Added
itasca_list_tasks - Added
itasca_query_command - Added
itasca_query_python_api - Removed
pfc_browse_commands - Removed
pfc_browse_python_api - Removed
pfc_browse_reference - Removed
pfc_check_task_status - Removed
pfc_execute_code - Removed
pfc_execute_task - Removed
pfc_interrupt_task - Removed
pfc_list_tasks - Removed
pfc_query_command - Removed
pfc_query_python_api
10 tool updates
v0.4.2- Added
pfc_browse_commands - Added
pfc_browse_python_api - Added
pfc_browse_reference - Added
pfc_check_task_status - Added
pfc_execute_code - Added
pfc_execute_task - Added
pfc_interrupt_task - Added
pfc_list_tasks - Added
pfc_query_command - Added
pfc_query_python_api
10 tool updates
v0.4.0- Removed
pfc_browse_commands - Removed
pfc_browse_python_api - Removed
pfc_browse_reference - Removed
pfc_check_task_status - Removed
pfc_execute_code - Removed
pfc_execute_task - Removed
pfc_interrupt_task - Removed
pfc_list_tasks - Removed
pfc_query_command - Removed
pfc_query_python_api
10 tool updates
v0.3.15- Added
pfc_browse_commands - Added
pfc_browse_python_api - Added
pfc_browse_reference - Added
pfc_check_task_status - Added
pfc_execute_code - Added
pfc_execute_task - Added
pfc_interrupt_task - Added
pfc_list_tasks - Added
pfc_query_command - Added
pfc_query_python_api
10 tool updates
v0.3.14- Removed
pfc_browse_commands - Removed
pfc_browse_python_api - Removed
pfc_browse_reference - Removed
pfc_check_task_status - Removed
pfc_execute_code - Removed
pfc_execute_task - Removed
pfc_interrupt_task - Removed
pfc_list_tasks - Removed
pfc_query_command - Removed
pfc_query_python_api
5 tool updates
v0.1.1- Changed
pfc_browse_commands2 fields changed- added
Input schema / $defsAdded value: +{ + "CommandDocVersion": { + "description": "Supported PFC documentation versions for command tools.", + "enum": [ + "6.0", + "7.0", + "9.0" + ], + "type": "string" + } +} - added
Input schema / properties / versionAdded value: +{ + "$ref": "#/$defs/CommandDocVersion", + "default": "7.0", + "description": "PFC documentation version to browse. Defaults to 7.0." +}
- Changed
pfc_browse_reference1 field changed- changed
Input schema / properties / topic / descriptionPrevious value: -"Reference topic to browse (space-separated path). Examples:\n- None or '': List all reference categories\n- 'contact-models': List all contact models\n- 'contact-models linear': Linear model properties\n- 'range-elements': Range elements overview (24 elements)\n- 'range-elements position': Position range syntax\n- 'range-elements cylinder': Cylinder range syntax\n- 'range-elements group': Group range syntax"New value: +"Reference topic to browse (space-separated path). Examples:\n- None or '': List all reference categories\n- 'contact-models': List all contact models\n- 'contact-models linear': Linear model properties\n- 'range-elements': Range elements overview (24 elements)\n- 'range-elements position': Position range syntax\n- 'plot-items': Plot item types (ball, wall, contact keywords)\n- 'plot-items ball': Ball overview + available sub-topics\n- 'plot-items ball color-by': Ball color-by keyword details"
- Removed
pfc_capture_plot - Added
pfc_execute_code - Changed
pfc_query_command2 fields changed- added
Input schema / $defsAdded value: +{ + "CommandDocVersion": { + "description": "Supported PFC documentation versions for command tools.", + "enum": [ + "6.0", + "7.0", + "9.0" + ], + "type": "string" + } +} - added
Input schema / properties / versionAdded value: +{ + "$ref": "#/$defs/CommandDocVersion", + "default": "7.0", + "description": "PFC documentation version to search. Defaults to 7.0." +}
10 tool updates
v0.1.0- First observed
pfc_browse_commands - First observed
pfc_browse_python_api - First observed
pfc_browse_reference - First observed
pfc_capture_plot - First observed
pfc_check_task_status - First observed
pfc_execute_task - First observed
pfc_interrupt_task - First observed
pfc_list_tasks - First observed
pfc_query_command - First observed
pfc_query_python_api
TDQS
Scored across 7 tools
Each tool has a distinct role: async script submission vs synchronous inline execution vs task lifecycle (status/interrupt/list) vs documentation browsing vs keyword search. The execute_task/execute_code pair could overlap, but the descriptions explicitly cross-reference each other and spell out sync vs async semantics, and browse_doc vs query_doc are framed as ls+cat vs grep.
All tools share a consistent itasca_ prefix and snake_case verb_noun pattern (execute_task, execute_code, check_task_status, interrupt_task, list_tasks, browse_doc, query_doc). The one longer name (check_task_status) still follows the same convention and reads unambiguously.
Seven tools is well-scoped for a bridge that runs scripts in a live simulation engine: one submit path, one live-REPL path, three lifecycle tools, and two doc tools. Nothing feels redundant or missing at the count level.
The task lifecycle (submit, poll with pagination/filter, interrupt, list, persisted history) and the doc surface (browse + search) are covered end to end. Minor gaps: no way to delete/clean up task history and no separate result-fetch tool beyond check_task_status, but these are workable.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP server for AI dialogue using various LLM models via AceDataCloud
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseAqualityDmaintenanceA simple MCP server for interacting with OpenAI assistants. This server allows other tools (like Claude Desktop) to create and interact with OpenAI assistants through the Model Context Protocol.939MIT
- AlicenseNot gradedqualityBmaintenanceMCP server enabling AI agents to interact with terminal applications through structured Terminal State Tree representation. Works with any AI assistant that supports the Model Context Protocol.141 npm21MIT
- AlicenseAqualityAmaintenanceyade-mcp connects AI agents to YADE — the open-source discrete element method engine — through the Model Context Protocol. Browse API docs, run simulations, and execute code, all through natural conversation.736 PyPI15MIT
- AlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server for Discord-based AI agent-user communication. Enables AI agents to communicate with users through Discord instead of IDE chat interfaces.58MIT