matlab/matlab-review-code
Review MATLAB code for quality, performance, maintainability, and adherence to MathWorks coding standards. Uses check_matlab_code and matlab_coding_guidelines. Use when reviewing code, checking style, finding code smells, assessing quality, or preparing code for handoff or publication.
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-review-code
Systematically review MATLAB code for quality, correctness, performance, and adherence to MathWorks coding conventions using static analysis and manual inspection patterns.
matlab-debugging insteadmatlab-testing insteadcheck_matlab_code MCP tool on all target filesmatlab_coding_guidelines MCP resourceUse the check_matlab_code MCP tool on each file. Then inspect results programmatically:
info = checkcode("src/computeArea.m", "-struct");
for k = 1:numel(info)
fprintf('Line %d (col %d-%d): %s\n', ...
info(k).line, info(k).column(1), info(k).column(end), info(k).message);
end
For directory-wide analysis (R2022b+):
issues = codeIssues("src");
disp(issues.Issues);
Read the matlab_coding_guidelines MCP resource to get the authoritative MathWorks coding standards. Use these as the baseline for all naming, formatting, and structural checks.
| Element | Convention | Example |
|---------|-----------|---------|
| Functions | lowerCamelCase, verb phrase | computeArea, loadData |
| Classes | PascalCase | SensorReader, DataProcessor |
| Variables | lowerCamelCase, descriptive | sampleRate not sr |
| Constants | UPPER_SNAKE or Constant property | MAX_ITERATIONS |
| Test files | t prefix | tComputeArea.m |
| App files | PascalCase | DashboardApp.m |
| File = function | File name matches primary function | computeArea.m → function computeArea |
| Check | Standard | Severity |
|-------|----------|----------|
| Input count | Max 6 positional inputs | Warning |
| Output count | Max 4 outputs | Warning |
| Validation | arguments block present | Warning |
| Name-value args | options.Name pattern (not varargin) | Suggestion |
| Length | Flag if >50 lines | Suggestion |
| Nesting | Flag if >3 levels deep | Warning |
| end keyword | All functions terminated with end | Warning |
| Help text | H1 line present for public functions | Suggestion |
| Check | Modern | Legacy (flag it) |
|-------|--------|-------------------|
| Multi-panel figures | tiledlayout/nexttile | subplot |
| Date/time | datetime | datenum/datestr |
| Strings | string type | char arrays for text |
| Vectorization | .*, ./, logical indexing | Loops over elements |
| Preallocation | zeros(n,1) before loop | Growing arrays in loops |
| Data containers | table/timetable | Raw matrices for named data |
| Dynamic eval | Direct function calls | eval, evalin, assignin |
These should always be reported as errors:
eval, assignin, or evalin — security and maintainability risksum = 5 shadows sum()arguments block in public-facing functionscheck_matlab_code does NOT catch all issues. After running static analysis, always scan the source code for these common problems that require visual inspection:
subplot usage — not flagged by checkcode, but should use tiledlayout/nexttilesum = 0 shadows sum(), checkcode may not flag itif length(x) > 10)Do not skip Steps 3-6 of the workflow just because checkcode returns few results.
function complexity = assessComplexity(filePath)
%assessComplexity Estimate cyclomatic complexity of a MATLAB function.
arguments
filePath (1,1) string {mustBeFile}
end
code = fileread(filePath);
branchKeywords = ["if " "elseif " "case " "while " "for " "catch "];
complexity = 1;
for kw = branchKeywords
complexity = complexity + numel(strfind(code, kw));
end
end
[files, products] = matlab.codetools.requiredFilesAndProducts('src/myFunction.m');
fprintf('Required products:\n');
for k = 1:numel(products)
fprintf(' %s (ID: %d)\n', products(k).Name, products(k).ProductNumber);
end
Present findings in this format:
## Code Review: computeArea.m
### Static Analysis (checkcode)
- 2 warnings, 0 errors
### Naming ✓
- [x] Function: lowerCamelCase
- [x] Variables: descriptive
- [x] File name matches function
### Structure
- [x] arguments block present
- [x] Function under 50 lines
- [ ] ⚠ Nesting depth reaches 4 levels (line 32)
### Patterns
- [x] Vectorized
- [x] Modern graphics API
- [ ] ⚠ Uses datenum (line 18) — migrate to datetime
### Suggestions
1. Extract nested logic at line 32 into a local function
2. Replace datenum with datetime for date handling
check_matlab_code as the first step — it catches issues automaticallymatlab_coding_guidelines for the authoritative standardeval, assignin, or evalin as high-severityrequiredFilesAndProducts to verify toolbox dependencies are documentedcodeIssues for directory-wide analysis (R2022b+)matlab-modernize-code skill----
Copyright 2026 The MathWorks, Inc.
----
Take matlab/matlab-review-code from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.