-
Notifications
You must be signed in to change notification settings - Fork 0
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.
- Write your MATLAB function (
.mfile) - Describe it in
custom_tools.yaml - The server loads and registers it as an MCP tool at startup
- Agents see it alongside built-in tools and can call it with validated parameters
Point your config.yaml to the custom tools file:
custom_tools:
config_file: "./custom_tools.yaml"tools:
- name: tool_name # MCP tool name (what agents call)
matlab_function: pkg.func # MATLAB function to call (use pkg.func for packaged functions)
description: "What it does" # Shown to agents
parameters:
- name: param_name
type: string # Parameter type (see table below)
required: true # or false
default: null # Default value if not provided
description: "Parameter help" # Optional: shown to agents
returns: "Description of return value"| YAML Type | Aliases | Python Type | Notes |
|---|---|---|---|
string |
str |
str |
Text parameter |
int |
integer |
int |
Integer parameter |
float |
number, double
|
float |
Floating-point parameter |
bool |
boolean, logical
|
bool |
Boolean parameter |
list |
— | list |
Array/list parameter |
dict |
— | dict |
Struct/dictionary parameter |
any |
— | Any |
Any type (unvalidated) |
Custom tools are loaded at server startup via the load_custom_tools() function:
- The server reads the YAML file path from
config.yaml - Each tool definition is validated against the
CustomToolDefschema - For each valid tool, a handler function is created with
make_custom_tool_handler() - The handler is registered as an MCP tool with FastMCP
- Invalid definitions are logged as warnings but do not prevent startup
If the config file does not exist or contains no tools section, an empty list is returned and no custom tools are registered.
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);
endtools:
- 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
default: 1024
description: "FFT window size"
returns: "Struct with fields: frequencies, magnitudes, snr, peaks"Add the directory containing your .m files to the workspace paths in config.yaml:
workspace:
default_paths:
- "/path/to/mylib"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:
- Validates parameters against the YAML schema
- Calls
mylib.analyze_signal('data/recording.mat', 44100, 1024)in MATLAB - Returns the result to the agent
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
default: "svm"
description: "Model type: svm, tree, knn, ensemble"
- name: validation_split
type: double
default: 0.2
description: "Fraction of data to use 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
default: 0.5
description: "Denoising strength (0=none, 1=maximum)"
- name: sharpen
type: logical
default: false
description: "Apply sharpening filter"
returns: "Processed image saved to 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"When a custom tool is registered, the server creates a typed async handler function using make_custom_tool_handler(). This factory:
- Builds an
inspect.Signaturebased on the parameter definitions - Creates an async coroutine with the correct signature
- Registers it with FastMCP, which introspects the signature to understand parameter names and types
- Validates incoming arguments before calling the MATLAB function
This ensures that agents receive accurate parameter information and requests are validated before reaching MATLAB.
-
Function names with packages: Use
pkg.funcnotation to call functions in MATLAB packages (e.g.,+mylib/analyze_signal.m→mylib.analyze_signal) -
MEX files: Custom tools work with
.mexfiles too — just reference the function name without the extension -
Parameter descriptions: Include
descriptionfields for parameters to help agents understand what each parameter does - Type compatibility: The YAML types are converted to Python types for validation; ensure your MATLAB function accepts the corresponding types
- 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
-
Default values: Use
defaultto make parameters optional; if omitted, parameters are required