The tools.py module#

Summary#

execute_python_code

Execute Python code in the persistent Python session with automatic rule generation.

create_custom_plot

Create a custom plot using Matplotlib or PyVista in the persistent Python session.

Description#

Common tool implementations for PyAnsys MCP servers.

This module provides reusable tool functions that product-specific MCP servers can use or extend. These are not registered tools themselves, but functions that can be called from product-specific tool implementations.

Module detail#

async tools.execute_python_code(ctx: fastmcp.Context, code: str, timeout: int = 60, no_output_timeout: float | None = None) → str#

Execute Python code in the persistent Python session with automatic rule generation.

This function should be used for custom Python code execution. When code execution fails, it automatically generates a rule using LLM analysis to prevent similar errors in the future.

Parameters:
ctxContext

MCP context containing server session and application context.

codestr

Python code to execute.

timeoutint, default: 60

Maximum time in seconds to allow for code execution.

no_output_timeoutfloat or None, default: None

Maximum number of seconds to wait without receiving any output before stopping collection. Useful for code that produces no output for extended periods. If greater than timeout, timeout is raised to match it, since no_output_timeout can never exceed the overall execution timeout. If None, the persistent session’s default is used.

Returns:
str

Execution result or error message. Returns JSON for structured output compatible with both stdio and http transports.

Examples

Execute simple Python code:

code = '''
result = sum([i**2 for i in range(10)])
print(f"Sum of squares: {result}")
'''
await execute_python_code(ctx, code)

Execute code with automatic rule generation on failure:

code = "result = 1/0"  # This will fail
await execute_python_code(ctx, code)

Automatically adds rule like: {"Division Operations": ["Do not divide by zero"]}

tools.create_custom_plot(ctx: fastmcp.Context, plot_code: str, plot_type: str = 'matplotlib', timeout: int = 60) → list[mcp.types.TextContent | mcp.types.ImageContent] | str#

Create a custom plot using Matplotlib or PyVista in the persistent Python session.

Parameters:
ctxContext

MCP context containing server session and application context.

plot_codestr

Python code for creating the plot. You should use matplotlib.pyplot or PyVista. For Matplotlib, the code should create the figure/plot but NOT call plt.show(). Use the save_matplotlib_plot() or ``save_plot() helper functions to return the plot.

plot_typestr, default: “matplotlib”

Type of plot. Options are "matplotlib" or "pyvista".

timeoutint, default: 60

Maximum time in seconds for plot generation.

Returns:
list[TextContent | ImageContent]

List containing: - TextContent with the plot creation status message - ImageContent with the base64-encoded image data if successful or a JSON string with error details if failed.

Examples

Create a custom Matplotlib line plot:

plot_code = '''
import matplotlib.pyplot as plt
import numpy as np

# Extract data from MAPDL
displacements = mapdl.get_array("NODE", item1="U", it1num="Y")

# Create custom plot
plt.figure(figsize=(10, 6))
plt.plot(displacements)
plt.xlabel("Node Number")
plt.ylabel("Displacement (m)")
plt.title("Custom Displacement Plot")
plt.grid(True)
# Save and return
result = save_matplotlib_plot(dpi=150)
print(result)
'''

create_custom_plot(ctx, plot_code, plot_type="matplotlib")