-
Notifications
You must be signed in to change notification settings - Fork 0
Custom Tools
github-actions[bot] edited this page Mar 18, 2026
·
11 revisions
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 registers it as an MCP tool at startup
- Agents see it alongside built-in tools
Point your config.yaml to the custom tools file:
custom_tools:
config_file: "./custom_tools.yaml"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"| 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 |
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
required: false
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
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
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"When the MATLAB MCP Server starts:
-
Configuration Loading: The server reads
config.yamland looks for thecustom_tools.config_filepath -
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
CustomToolDefpydantic model - Logs warnings for invalid tool definitions and continues with valid ones
-
Handler Generation: For each valid tool, the server calls
make_custom_tool_handler()to create:- An async handler function with proper
inspect.Signaturefor FastMCP introspection - Parameter type annotations matching the YAML definitions
- Default value bindings for optional parameters
- An async handler function with proper
- MCP Registration: Each handler is registered as a tool in the MCP server, making it discoverable by agents
- Parameter Validation: When an agent calls a custom tool, parameters are validated against the schema before being passed to MATLAB
-
Function names with packages: Use
pkg.funcnotation to call functions in MATLAB packages (e.g.,+mylib/analyze_signal.m→mylib.analyze_signal) -
Parameter descriptions: Include
descriptionfields for each parameter so agents understand what each parameter does -
Type aliases: Both
doubleandfloatwork for floating-point numbers; bothlogicalandboolwork for booleans -
MEX files: Custom tools work with
.mexfiles 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: falseand provide adefaultvalue for optional parameters; omit both for required parameters