-
Notifications
You must be signed in to change notification settings - Fork 0
Custom Tools
github-actions[bot] edited this page Mar 22, 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"Each tool definition in custom_tools.yaml must include:
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: # List of parameter definitions
- name: param_name
type: string # Parameter type (see table below)
required: true # or false
description: "What this parameter does" # Optional, shown to agents
- name: optional_param
type: double
default: 1.0 # Default value if not provided
returns: "Description of return value" # What the function returns| YAML Type | Aliases | Python Type | Notes |
|---|---|---|---|
string |
str |
str |
Text input |
float |
number |
float |
Floating-point numbers |
double |
— | float |
Alias for float
|
int |
integer |
int |
Integer numbers |
bool |
boolean, logical
|
bool |
True/false values |
list |
— | list |
Array/list input |
dict |
— | dict |
Structured data (key-value) |
any |
— | Any |
Accept 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
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
When the MATLAB MCP server starts:
-
Config Loading: The server reads
custom_tools.config_filefromconfig.yaml -
YAML Parsing:
load_custom_tools()parses the YAML file and validates each tool definition usingCustomToolDefpydantic model -
Parameter Validation: Each parameter is validated:
- Type must be a recognized YAML type (string, int, float, bool, list, dict, any)
- Required parameters must not have defaults
- Default values are type-checked
-
Handler Generation: For each valid tool,
make_custom_tool_handler()creates an async handler function with:- Proper
inspect.Signaturefor FastMCP introspection - Parameter validation using type hints
- Error handling and structured error responses
- Proper
- Tool Registration: Each handler is registered with FastMCP as a tool, making it discoverable by agents
Error Handling:
- If the YAML file is missing, an empty tool list is returned (no error)
- If a tool definition is invalid, a warning is logged and that tool is skipped
- If a MATLAB function throws an error, the server returns a structured error response 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: "Enhanced 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"-
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 a
descriptionfield for each parameter to help agents understand what each parameter does -
Type consistency: Ensure parameter types match MATLAB function expectations. Use
logicalfor MATLAB boolean values - 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
-
Return value documentation: Provide clear
returnsdescriptions so agents understand what to expect