Skip to content

Custom Tools

github-actions[bot] edited this page Mar 18, 2026 · 11 revisions

Custom Tools

Expose your own MATLAB functions as first-class MCP tools. AI agents can discover and call them directly, with full parameter validation and help text.

How It Works

  1. Write your MATLAB function (.m file)
  2. Describe it in custom_tools.yaml
  3. The server registers it as an MCP tool at startup
  4. Agents see it alongside built-in tools

Configuration

Point your config.yaml to the custom tools file:

custom_tools:
  config_file: "./custom_tools.yaml"

YAML Schema

The custom_tools.yaml file defines tools with the following structure:

tools:
  - name: tool_name                     # MCP tool name (what agents call)
    matlab_function: pkg.func           # MATLAB function to call
    description: "What it does"         # Shown to agents
    parameters:
      - name: param_name
        type: string                    # Parameter type (see table below)
        required: true                  # or false
        description: "What this param does"  # Displayed to agents
      - name: optional_param
        type: float
        required: false
        default: 1.0                    # Default value if not provided
        description: "Optional parameter"
    returns: "Description of return value"

Parameter Types

YAML Type Aliases Python Type MATLAB Type
string str str char / string
float number float double
double float double
int integer int int32 / int64
bool boolean, logical bool logical
list list cell / array
dict dict struct
any Any any type

Complete Example

1. MATLAB Function (mylib/analyze_signal.m)

function result = analyze_signal(signal_path, sample_rate, window_size)
    % ANALYZE_SIGNAL  Frequency analysis of a signal file
    %
    %   result = analyze_signal(signal_path, sample_rate, window_size)
    %
    %   Returns struct with: frequencies, magnitudes, snr, peaks

    data = load(signal_path);
    signal = data.signal;

    N = length(signal);
    Y = fft(signal, window_size);
    f = (0:window_size/2-1) * sample_rate / window_size;
    mag = abs(Y(1:window_size/2)) / N;

    [peaks, locs] = findpeaks(mag, 'MinPeakHeight', max(mag)*0.1);

    result.frequencies = f;
    result.magnitudes = mag;
    result.snr = snr(signal);
    result.peaks = struct('frequencies', f(locs), 'amplitudes', peaks);
end

2. Custom Tool Definition (custom_tools.yaml)

tools:
  - name: analyze_signal
    matlab_function: mylib.analyze_signal
    description: >
      Analyze a signal file and return frequency components, SNR,
      and peak detection results.
    parameters:
      - name: signal_path
        type: string
        required: true
        description: "Path to the signal data file (.mat)"
      - name: sample_rate
        type: double
        required: true
        description: "Sample rate in Hz"
      - name: window_size
        type: int
        required: false
        default: 1024
        description: "FFT window size"
    returns: "Struct with fields: frequencies, magnitudes, snr, peaks"

3. Make Sure MATLAB Can Find It

Add the directory containing your .m files to the workspace paths in config.yaml:

workspace:
  default_paths:
    - "/path/to/mylib"

4. Agent Usage

The agent now sees analyze_signal as a tool and can call it:

"Analyze the signal in data/recording.mat at 44100 Hz sample rate"

The server:

  1. Validates parameters against the YAML schema
  2. Calls analyze_signal('data/recording.mat', 44100, 1024) in MATLAB
  3. Returns the result to the agent

Multiple Tools

tools:
  - name: analyze_signal
    matlab_function: mylib.analyze_signal
    description: "Frequency analysis of signal files"
    parameters:
      - name: signal_path
        type: string
        required: true
        description: "Path to the signal data file (.mat)"
    returns: "Frequency analysis struct"

  - name: train_model
    matlab_function: ml.train_classifier
    description: "Train a classification model"
    parameters:
      - name: dataset_path
        type: string
        required: true
        description: "Path to the training data (.mat or .csv)"
      - name: model_type
        type: string
        required: false
        default: "svm"
        description: "Model type: svm, tree, knn, ensemble"
      - name: validation_split
        type: double
        required: false
        default: 0.2
        description: "Fraction of data for validation (0-1)"
    returns: "Trained model and accuracy metrics"

  - name: process_image
    matlab_function: imgtools.enhance_image
    description: "Image enhancement pipeline"
    parameters:
      - name: image_path
        type: string
        required: true
        description: "Path to the input image"
      - name: denoise_strength
        type: double
        required: false
        default: 0.5
        description: "Denoising strength (0=none, 1=maximum)"
      - name: sharpen
        type: logical
        required: false
        default: false
        description: "Apply sharpening filter"
    returns: "Enhanced image saved to workspace and temp directory"

  - name: compute_statistics
    matlab_function: stats.compute_summary
    description: "Compute summary statistics for a .mat data file"
    parameters:
      - name: data_path
        type: string
        required: true
        description: "Path to the .mat file containing the data variable"
    returns: "Struct with mean, std, median, min, max, histogram data"

Loading and Registration at Startup

When the MATLAB MCP Server starts:

  1. Configuration Loading: The server reads config.yaml and looks for the custom_tools.config_file path
  2. YAML Parsing: The server parses the YAML file using load_custom_tools(), which:
    • Returns an empty list if the file doesn't exist
    • Validates each tool definition against the CustomToolDef pydantic model
    • Logs warnings for invalid tool definitions and continues with valid ones
  3. Handler Generation: For each valid tool, the server calls make_custom_tool_handler() to create:
    • An async handler function with proper inspect.Signature for FastMCP introspection
    • Parameter type annotations matching the YAML definitions
    • Default value bindings for optional parameters
  4. MCP Registration: Each handler is registered as a tool in the MCP server, making it discoverable by agents
  5. Parameter Validation: When an agent calls a custom tool, parameters are validated against the schema before being passed to MATLAB

Tips

  • Function names with packages: Use pkg.func notation to call functions in MATLAB packages (e.g., +mylib/analyze_signal.mmylib.analyze_signal)
  • Parameter descriptions: Include description fields for each parameter so agents understand what each parameter does
  • Type aliases: Both double and float work for floating-point numbers; both logical and bool work for booleans
  • MEX files: Custom tools work with .mex files too — just reference the function name without the extension
  • Error handling: If the MATLAB function throws an error, the MCP server returns a structured error response to the agent
  • Testing: Test your functions in MATLAB first before exposing them as tools
  • Required vs Optional: Mark parameters as required: false and provide a default value for optional parameters; omit both for required parameters

Clone this wiki locally