itasca-mcp
pfc-mcp is an MCP server that gives AI agents access to ITASCA PFC (Particle Flow Code) for browsing documentation, running simulations, and capturing visualizations through natural conversation.
Documentation Tools (no PFC installation required)
Browse PFC command tree (
pfc_browse_commands): Explore commands by category or get full docs for specific commands (e.g.,ball create)Browse Python SDK reference (
pfc_browse_python_api): Navigate the ITASCA Python API (e.g.,itasca.ball,itasca.ball.Ball.pos)Browse reference documentation (
pfc_browse_reference): Look up contact model properties, range element syntax, and other language elementsSearch PFC commands by keyword (
pfc_query_command): BM25-ranked keyword search across all PFC commandsSearch Python API by keyword (
pfc_query_python_api): BM25-ranked keyword search across the PFC Python SDK
Execution Tools (requires bridge running inside a live PFC process)
Submit scripts for execution (
pfc_execute_task): Asynchronously queue and run Python scripts inside a live PFC sessionMonitor task progress (
pfc_check_task_status): Poll real-time status and output with filtering and paginationList all tasks (
pfc_list_tasks): View tracked tasks across sessionsInterrupt running simulations (
pfc_interrupt_task): Gracefully stop long-runningcycle()calls mid-executionCapture plot images (
pfc_capture_plot): Screenshot PFC visualizations with configurable camera position, ball/wall/contact coloring, cut planes, zoom, and projection type
Works with any MCP-compatible client (Claude Code, Codex CLI, Gemini CLI, etc.). The documentation tools serve as a boundary map to reduce hallucinated commands by letting agents discover PFC capabilities directly.
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 (10)
5 documentation tools — browse and search the selected engine's commands, Python API, 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"
"What's different about the
zonecommands between FLAC 7.0 and 9.0?"
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 corpus - command, Python API, and reference docs for PFC, FLAC, 3DEC, MPoint, and MassFlow, selected via the required
softwareparameterMulti-version support - command docs across engine versions (PFC: 6.0/7.0/9.0, FLAC: 7.0/9.0, 3DEC: 7.0/9.0) via the
versionparameterHierarchical documentation browsing - agents navigate the engine command tree to discover capabilities and boundaries, reducing hallucinated commands
Enhanced plot documentation - plot items 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
Multi-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
10 toolspfc_browse_commandsA
Browse PFC command documentation by path (like glob + cat).
Navigation levels:
No command: All command categories overview
Category only (e.g., "ball"): List commands in category
Full command (e.g., "ball create"): Full documentation
When to use:
You know the command category or exact command
You want to explore available commands
Related tools:
pfc_query_command: Search commands by keywords (when path unknown)
pfc_browse_reference: Browse reference docs (e.g., "contact-models linear")
| Name | Required | Description | Default |
|---|---|---|---|
| command | No | PFC command to browse (space-separated, matching PFC syntax). Examples: - None or '': List all command categories - 'ball': List all ball commands - 'ball create': Get ball create documentation - 'contact': List all contact commands - 'contact property': Get contact property command documentation | |
| version | No | PFC documentation version to browse. Defaults to 7.0. | 7.0 |
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 should fully disclose behavior. It explains the three navigation levels and the version parameter, implying read-only browsing. However, it does not explicitly state that no modifications are made or that results are text documentation, which is important for transparency.
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?
Concise and well-structured with bullet points for navigation levels and when-to-use. No redundant sentences; every line adds value.
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 the presence of an output schema (not shown) and the tool's simple purpose, the description covers all necessary aspects: purpose, usage guidelines, parameter details, and related tools. It is fully self-contained.
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% with examples. The description adds context like 'space-separated, matching PFC syntax' and the three navigation levels, but these are already implied in the schema examples. Baseline 3 is correct as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool browses PFC command documentation by path, with specific navigation levels (all categories, category only, full command). It distinguishes from siblings like pfc_query_command and pfc_browse_reference by purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' section tells the agent to use this when the command category or exact command is known, and lists alternatives for other cases (pfc_query_command for keyword search, pfc_browse_reference for reference docs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_browse_python_apiA
Browse PFC Python SDK documentation by path (like glob + cat).
| Name | Required | Description | Default |
|---|---|---|---|
| api | No | PFC Python API path to browse (dot-separated, starting from itasca). Examples: - None or '': Root overview - all modules and objects - 'itasca': Core module functions (command, cycle, gravity, etc.) - 'itasca.ball': Ball module functions (create, find, list, etc.) - 'itasca.ball.create': Specific function documentation - 'itasca.ball.Ball': Ball object method groups - 'itasca.ball.Ball.pos': Specific method documentation - 'itasca.wall.facet': Nested submodule - 'itasca.wall.facet.Facet': Facet object in wall.facet module |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It states 'Browse ... by path (like glob + cat)' which implies read-only behavior (browsing documentation). However, it lacks explicit disclosure of traits like error behavior, rate limits, or whether it modifies state. The behavioral insight is adequate but minimal.
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?
Single sentence with effective analogy, clearly front-loaded. No superfluous content. However, the description could be slightly more informative without sacrificing length (e.g., mentioning it returns structured docs). Still, very concise.
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 the single optional parameter with exhaustive schema examples and presence of an output schema (which covers return values), the description is sufficient for a browse tool. The analogy provides context for expected behavior. Minor gap: no mention of error handling or recursion depth, but not critical.
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 includes detailed examples for the api parameter. The description adds no additional parameter information beyond what the schema provides, so baseline score of 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?
Description explicitly states it browses PFC Python SDK documentation by path, using the analogy 'like glob + cat' which clearly indicates listing and reading. It distinguishes from siblings like pfc_browse_commands (commands) and pfc_browse_reference (reference) by specifying 'Python API' and hierarchical path navigation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternatives mentioned. The analogy 'like glob + cat' and the detailed path examples in the schema imply usage for navigating hierarchical documentation, but no comparison to siblings like pfc_query_python_api or pfc_browse_commands is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_browse_referenceA
Browse PFC reference documentation (syntax elements, model properties).
References are language elements used within commands, not standalone commands.
Navigation levels:
No topic: All reference categories
Category (e.g., "contact-models"): List items in category
Full path (e.g., "contact-models linear"): Full documentation
When to use:
Need contact model property names (kn, ks, fric, pb_*)
Need range filtering syntax (position, cylinder, group, id)
Need plot item configuration (color-by, cut plane, transparency, legend)
Setting up "contact cmat add model ... property ..." commands
Using range filters in any PFC command
Configuring "plot item create" commands
Related tools:
pfc_browse_commands: Command syntax (e.g., "ball create")
pfc_query_command: Search commands by keywords
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Reference topic to browse (space-separated path). Examples: - None or '': List all reference categories - 'contact-models': List all contact models - 'contact-models linear': Linear model properties - 'range-elements': Range elements overview (24 elements) - 'range-elements position': Position range syntax - 'plot-items': Plot item types (ball, wall, contact keywords) - 'plot-items ball': Ball overview + available sub-topics - 'plot-items ball color-by': Ball color-by keyword details | |
| version | No | PFC documentation version (6.0/7.0/9.0). Defaults to 7.0. Filters contact models by version availability; range-elements and plot-items are version-agnostic. | 7.0 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full burden. It explains navigation levels (no topic, category, full path), how the version parameter filters contact models, and that range-elements and plot-items are version-agnostic. This provides essential behavioral context beyond basic read 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?
The description is well-structured with clear sections: main purpose, navigation levels, when-to-use list, and related tools. It is front-loaded with the core purpose and uses bullet points for readability. Every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multi-level navigation, version filtering, multiple use cases) and the presence of an output schema, the description is complete. It covers all necessary information for an agent to understand when and how to use the tool, including examples and version behavior.
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%, but the description adds significant meaning beyond the schema: it explains the navigation structure with concrete examples for the topic parameter and clarifies how version filters contact models while noting version-agnostic topics. This enhances usability for the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it browses PFC reference documentation for syntax elements and model properties, and distinguishes from siblings by specifying that references are language elements used within commands, not standalone commands. It also lists related tools with their purposes.
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 explicitly lists when to use this tool (e.g., need contact model property names, range filtering syntax, plot item configuration) and mentions related tools (pfc_browse_commands for command syntax, pfc_query_command for keyword search), providing clear guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_check_task_statusA
Check status and paginated output for a submitted PFC task.
Output combines Python prints and PFC 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 |
|---|---|---|---|
| task_id | Yes | Task ID returned by pfc_execute_task | |
| skip_newest | No | Skip N newest output lines before pagination | |
| limit | No | Output lines per page | |
| filter | No | Only keep output lines containing this text | |
| wait_seconds | No | Wait time before querying status |
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. It transparently describes the output as 'combined Python prints and PFC console output interleaved in execution order' and explains pagination and filtering behavior. It lacks discussion of error handling or rate limits but is generally sufficient.
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 two sentences with no waste. The first sentence states the purpose, and the second adds key behavioral details. Front-loaded and efficient.
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 5 parameters, no annotations, and an output schema, the description covers the main usage and output structure well. It does not detail edge cases (e.g., task not found) but is complete for normal 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 coverage is 100%, so baseline is 3. The description adds meaning by explaining that skip_newest/limit control pagination, filter selects matching lines, and wait_seconds sets a delay before querying. This goes beyond the schema's bare descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Check status and paginated output' and the resource 'submitted PFC task'. It distinguishes from siblings like pfc_execute_task (submits) and pfc_interrupt_task (interrupts) by focusing on status checking and output retrieval.
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 pagination and filtering mechanics but does not explicitly state when to use this tool versus alternatives (e.g., after submitting a task). The context is implied but not fully articulated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_execute_codeA
Execute Python code synchronously in the running PFC process.
Returns stdout and an optional result variable immediately. Code runs in PFC'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.
This tool remains responsive EVEN WHILE a simulation task is running (submitted via pfc_execute_task), as long as the task is actively cycling — execute_code interleaves at cycle gaps. Use it as a live REPL to inspect simulation state in real time — no need to pre-script print statements, and parameter sweeps or sentinel-based control don't have to be baked into the task script up front.
Environment: PFC's embedded Python interpreter. The version is bundled with PFC (PFC 6/7 → Python 3.6, PFC 9 → 3.10); the PFC version is encoded in sys.executable (e.g. PFC700, PFC900). When unsure, write code compatible with Python 3.6+.
Typical uses:
Query model state: ball/wall/contact counts, current cycle
Issue PFC commands and read their console output: itasca.command('ball list'), itasca.command('model list information'). Table dumps, list output, and command summaries are captured and interleaved with Python prints in execution order — no need to re-implement queries via the SDK just to see what a command would print
Live inspection during a running task: check forces, energy, coordination number, contact statistics
Live tuning during a running task: modify parameters, swap callbacks, or set sentinel variables that the task reads each cycle (e.g. change a servo target, adjust damping, signal early termination)
Create and export plots: itasca.command('plot ...')
Development and REPL-style testing
Do NOT invoke program call '<file>.p3dat' (or .p2dat / .dat)
through this tool. PFC's command-script interpreter blocks the
bridge for the script's entire duration with no cycle-gap
interleaving, so any long model cycle inside the file leaves
the bridge unreachable until PFC is stopped manually. If the
user asks to run a .dat / .p3dat / .p2dat file, read the file
and translate its commands into a sequence of
itasca.command(...) calls in Python instead.
This is a synchronous tool: the request blocks until the code finishes or hits the timeout (default 10s, max 600s). Output is returned in full; the call is NOT tracked by pfc_list_tasks and cannot be interrupted mid-execution. For cancellable, pollable, or background work, submit it via pfc_execute_task instead — and you can still call pfc_execute_code against the task while it cycles.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Python code to execute in PFC user console | |
| timeout | No | Console execution timeout in seconds |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses synchronous blocking, main thread execution, side effects persistence, interleaving with tasks, timeout limits, and non-cancellability. No annotations present, so tool carries full disclosure burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections, front-loaded with core purpose. Slightly verbose with environment details and extensive typical uses, but information is relevant.
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?
Comprehensive given no annotations: covers behavioral traits, environment, typical uses, error conditions (timeout), and distinction from other tools. No gaps for agent decision-making.
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 covers both parameters with descriptions. Description adds context (code runs in main thread, timeout defaults/max) but schema already provides sufficient meaning. High schema coverage reduces need for extra description.
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?
Clearly states it executes Python code synchronously in PFC. Differentiates from pfc_execute_task (synchronous vs. background) and other sibling tools like pfc_query_command.
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 typical uses (REPL, inspection, tuning) and warnings (do not use for .dat files, prefer pfc_execute_task for cancellable work). Provides clear when-to-use and when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_execute_taskA
Submit a Python script file for asynchronous execution in PFC.
Returns a task_id immediately; the script runs in the background. Use the companion tools to manage the task lifecycle:
pfc_check_task_status: poll output, progress, and final status
pfc_interrupt_task: cancel a running task
pfc_list_tasks: browse task history
While the task is cycling, you can call pfc_execute_code at any time to inspect or modify simulation state — including variables the task depends on. This is the standard way to probe progress, tune parameters mid-run, swap callbacks, or trigger early termination via a sentinel variable. Both tools share the same main namespace in PFC's main thread.
Console output from itasca.command() inside the script — table dumps, list output, command summaries — is captured and interleaved with Python prints in the task log, visible through pfc_check_task_status.
Do NOT have the script invoke program call '<file>.p3dat'
(or .p2dat / .dat). PFC's command-script interpreter blocks
the bridge for the script's entire duration with no cycle-gap
interleaving, leaving the bridge unreachable until PFC is
stopped manually. If the user asks to run a .dat / .p3dat /
.p2dat file, read the file and translate its commands into a
sequence of itasca.command(...) calls in the Python script
instead.
This is the async / background execution path: pollable via pfc_check_task_status, cancellable via pfc_interrupt_task. Submission does not lock parameters — start with reasonable values and refine live via pfc_execute_code as the task cycles. For synchronous, inline execution, use pfc_execute_code directly.
Submission uses the bridge's execute_task protocol message. If
a submission times out, the connected bridge may predate it —
confirm its version with pfc_execute_code (import itasca_mcp_bridge; print(itasca_mcp_bridge.__version__)). To
upgrade, fetch and follow the bootstrap guide, then resubmit:
https://raw.githubusercontent.com/yusong652/pfc-mcp/main/docs/agentic/pfc-mcp-bootstrap.md
| Name | Required | Description | Default |
|---|---|---|---|
| entry_script | Yes | Absolute path to entry Python script in PFC workspace | |
| description | Yes | Brief task purpose |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses async behavior, immediate task_id return, background execution, pollable/cancellable nature, ability to modify state during execution via pfc_execute_code, namespace sharing, console output interleaving, and timeout resolution. No annotations exist, so burden is fully on description.
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 primary action, then logically structured with lifecycle details, sync alternative, warnings, and troubleshooting. Every sentence adds information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of async task submission with lifecycle management, the description covers all necessary aspects: async behavior, sibling tools, namespace sharing, console output, .dat file warning, timeout handling, and references to external resources. Output schema existence (task_id) is noted.
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 described 100% of parameters. Description adds context (absolute path, workspace) for entry_script, and purpose for description. While schema already has descriptions, the description integrates parameter usage into the async execution flow, providing added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Submit a Python script file for asynchronous execution in PFC' and differentiates from sibling pfc_execute_code by specifying sync vs async paths. It also contrasts with pfc_check_task_status, pfc_interrupt_task, pfc_list_tasks for lifecycle management.
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 states when to use (async/background) and when not (use pfc_execute_code for sync), provides alternatives for .dat file execution, and warns against blocking practices. Troubleshooting steps for timeouts are included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_interrupt_taskC
Request graceful interruption of a running PFC task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | Task ID returned by pfc_execute_task |
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 full burden. It only adds 'graceful' to indicate cooperative shutdown but does not disclose side effects (e.g., whether it can be called multiple times, if it blocks, or error behavior). The description adds minimal transparency beyond the basic action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, which is front-loaded but minimal. It is concise but could benefit from slightly more detail without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Although the tool is simple (one parameter, output schema exists), the description lacks context about when the task must be running or the outcome if already stopped. The output schema exists, so return description is not required, but usage context 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% (task_id is described as 'Task ID returned by pfc_execute_task'). The tool description adds no further parameter guidance. Baseline of 3 is appropriate since the schema already documents the parameter sufficiently.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('request graceful interruption') and the resource ('running PFC task'). It distinguishes itself from sibling tools like pfc_execute_task (which starts tasks) and pfc_check_task_status (which checks status). However, the term 'graceful' is ambiguous and not elaborated upon.
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 gives no guidance on when to use this tool versus alternatives, no prerequisites (e.g., task must be running), no exclusions (e.g., cannot interrupt completed tasks), and no mention of expected preconditions. The usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_list_tasksB
List tracked PFC tasks with pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| skip_newest | No | Skip N most recent tasks before listing | |
| limit | No | Max tasks to return |
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 full burden. It mentions pagination but does not explain behavioral details like ordering, impact on tasks (read-only?), or how to navigate pages. The schema's skip_newest parameter hints at chronological order but is not explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. However, it could be slightly more informative without losing conciseness.
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 the presence of an output schema and full schema coverage, the description is adequate but could be improved by clarifying ordering or scope (e.g., lists all tracked tasks ordered by creation time).
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%, setting baseline at 3. The description adds only the generic term 'pagination' which loosely relates to limit/skip parameters but does not explain their specific semantics (e.g., skip_newest skips most recent tasks).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'tracked PFC tasks' with the qualifier 'with pagination'. This distinguishes it from siblings like pfc_check_task_status (status checking) and pfc_execute_task (execution).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like pfc_check_task_status or pfc_execute_task. The description lacks any context or exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_query_commandA
Search PFC command documentation by keywords (like grep).
Returns matching command paths. Use pfc_browse_commands for full documentation.
When to use:
You have keywords but don't know exact command path
Example: "ball create", "contact property", "model solve"
Related tools:
pfc_browse_commands: Get full documentation for a known command path
pfc_browse_reference: Browse reference docs (e.g., "contact-models linear")
pfc_query_python_api: Search Python SDK by keywords
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search keywords for PFC commands. Examples: 'ball create', 'contact property', 'model solve'. Case-insensitive. | |
| limit | No | Maximum number of results (1-20). | |
| version | No | PFC documentation version to search. Defaults to 7.0. | 7.0 |
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 burden of behavioral disclosure. It explains that the tool returns matching command paths and accepts search keywords. While it doesn't explicitly state read-only or safety, the functionality implies a safe search operation. The description adds value by mentioning case-insensitivity and version support.
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 concise and well-structured. It starts with the core functionality, then provides usage guidelines, examples, and related tools. Every sentence adds value without redundancy. The structure is front-loaded with the essential purpose.
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 the presence of an output schema (not shown but confirmed), the description is complete. It covers the tool's purpose, parameters, usage recommendations, and links to sibling tools. No critical information is missing for effective tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with each parameter documented. The description adds extra context beyond the schema, such as examples for the query parameter, explanation that results are matching command paths, and default version mention. This enhances the agent's understanding of parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Search PFC command documentation by keywords (like grep)'. It specifies the action (search), resource (command documentation), and method (by keywords). It also differentiates from the sibling tool pfc_browse_commands, which is for full documentation.
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 explicitly provides 'When to use' guidance, stating to use this tool when keywords are known but exact command path is unknown, with examples. It also lists related tools and their distinct purposes, offering clear guidance on alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pfc_query_python_apiA
Search PFC Python SDK documentation by keywords (like grep).
Returns matching API paths with signatures. Use pfc_browse_python_api for full documentation.
When to use:
You have keywords but don't know exact API path
Example: "ball velocity", "create", "contact force"
Related tools:
pfc_browse_python_api: Get full documentation for a known API path
pfc_query_command: Search PFC commands by keywords
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search keywords for PFC Python SDK API. Examples: 'ball pos', 'contact force', 'model solve'. Case-insensitive. | |
| limit | No | Maximum number of results (1-20). |
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. It states the return type (matching API paths with signatures) but does not disclose any other behavioral traits like pagination, case-insensitivity (though in schema), or side effects. For a read-only search, it is minimally adequate but not rich.
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 concise, front-loaded with the core purpose, followed by return info and usage guidelines. Every sentence is useful and well-structured.
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 the presence of an output schema (return values not needed in description), two well-documented parameters, and clear related tools, the description is complete for a simple search 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 description coverage is 100%, so baseline is 3. The description adds overall context and examples but does not significantly enhance parameter understanding beyond the schema descriptions, which already provide examples and constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches PFC Python SDK documentation by keywords, returning matching API paths with signatures. It distinguishes itself from siblings like pfc_browse_python_api (for known paths) and pfc_query_command (for commands), making the purpose 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?
Explicitly provides 'When to use' guidance: when you have keywords but don't know the exact API path, with examples. It also lists related tools with their purposes, giving clear direction on tool selection.
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.
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 10 tools
Each tool has a clearly distinct purpose: browsing vs searching documentation, synchronous vs asynchronous code execution, and task lifecycle management. No overlaps even among similar-looking pairs like browse_commands/query_command.
All tools follow a consistent pfc_verb_noun pattern with underscores. Verbs like browse, query, execute, check, interrupt, list are used uniformly, and nouns are appropriately singular or plural.
10 tools is well-scoped for a simulation environment server, covering documentation browsing/searching, task submission/management, and code execution without redundancy.
The set covers documentation browsing/searching for both commands and Python API, plus full task lifecycle management. The only minor gap is a dedicated simulation state query tool, but that is achievable via pfc_execute_code.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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
- QuallaaOAuthcom.quallaa
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.5319MIT
- 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.713MIT
- 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.59MIT