Matlab Use Package Manager
MathWorksOfficialCreated by MathWorks
- Skill
- Tool integration
- Software development
- BSD-2-Clause
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides guidance on using the in-product MATLAB Package Manager (mpm) to handle package lifecycles, including installation, updates, and repository management. It is specifically designed for MATLAB R2026b and later, distinguishing between MPM packages and other MATLAB add-ons or toolboxes. The skill emphasizes safe, non-interactive workflows suitable for automated environments and provides patterns for dependency management using matlab.toml projects.
What it does
- Installs, updates, and uninstalls MATLAB packages using the mpm command family.
- Searches indexed repositories and resolves package dependencies.
- Manages custom and File Exchange repositories within the MATLAB environment.
- Supports project-based dependency declaration via matlab.toml files.
- Provides mechanisms to preview changes with DryRun before execution.
- Handles package metadata inspection using the matlab.mpm.Package object.
When to use it
- When working in MATLAB R2026b or later and needing to manage external packages.
- When you need to automate package installation or updates in a non-interactive session.
- When resolving package dependencies for a project defined by a matlab.toml file.
- When you need to inspect the properties or installation status of specific packages.
- When adding or configuring custom or authenticated package repositories.
Advantages
- Enables reproducible environments through project-based dependency management.
- Prevents interactive hangs in automated workflows by enforcing non-interactive flags.
- Provides clear separation between package management and product/toolbox installation.
- Offers safe previewing of installation and update operations.
- Facilitates integration with custom and authenticated repository services.
Usage examples
- “Install the Battery package version 1.1.0.”
- The agent executes mpminstall('[email protected]', Prompt=false) to install the specified version.
- “What packages are currently installed in my MATLAB session?”
- The agent calls mpmlist() and returns a summary of the installed matlab.mpm.Package objects.
- “Check if the Edge package is available before installing.”
- The agent runs mpminstall('Edge', DryRun=true, Prompt=false) to verify availability without modifying the system.
- “Add a custom repository for my organization.”
- The agent uses matlab.mpm.RepositoryConfiguration to load a configuration file and registers it via mpmAddRepository.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/matlab/matlab-use-package-manager/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip matlab-use-package-manager.zip -d .agents/skills
Documentation by MathWorks
Use the MATLAB Package Manager (mpm)
Manage MATLAB packages from inside a running MATLAB session with the in-product
MATLAB Package Manager — the mpm* command family and the matlab.mpm.* classes.
Targets MATLAB R2026b or later (declared in manifest.yaml) and encodes the
non-obvious behavior that trips up agents: the interactive-prompt trap, project
provisioning, destructive flags, and safe package-property inspection.
Run all code through the MATLAB MCP tools. For project structure, matlab.toml
schema, and reference projects, use the matlab-configure-toml-project skill.
This is in-product mpm — mpm* commands run inside a MATLAB session. The
identically-named OS-level mpm shell executable that installs MATLAB, Simulink,
and toolboxes is a different tool (→ matlab-install-products).
When to Use
Install, uninstall, update, search, or list any MATLAB package
Ask "what packages are installed?", "what does X depend on?", "where does X live?", or "what versions exist?"
Resolve a known package name or check the installation status of a package declared in a
matlab.tomlprojectInstall a shareable
.mltbxpackageAdd, remove, or list a repository, or diagnose "Unable to locate dependency" errors
When NOT to Use
Installing MATLAB, Simulink, or toolboxes from a shell (
mpm install --products …) — usematlab-install-products. Same acronym, different binary.The full
.mltbxauthoring pipeline (define API → analyze deps → project → document → build → publish) — usematlab-package-toolbox.Editing project configuration or using reference projects — use
matlab-configure-toml-project. A{ path, absolute }dependency makes another project's source available; it does not install a package.Code-file / product dependency analysis via
requiredFilesAndProducts— a different concern from declared package dependencies.MATLAB namespaces (
+folder) with no mpm involvement, or licensed toolboxes (usever).MATLAB older than R2026b — the in-product
mpm*workflow isn't the intended path; suggest the Add-On Manager GUI.
Critical Rules
These apply to EVERY workflow below; violating any one causes a failure.
Always pass
Prompt=falsetompminstall,mpmuninstall,mpmupdate, andopenProject. The interactive confirmation can't be answered in a non-interactive session (MCP /-batch) and hangs — surfacing as a misleading "Array indices must be positive integers" error, not a question.Only
mpmsearch(Name=…)is case-sensitive. Everything else (mpminstall/mpmuninstall/mpmupdate,mpmsearch(PackageSpecifier=…)) matches names case-insensitively.Use
mpmsearchonly to search indexed repositories. File Exchange and custom/service-backed (Artifactory/MPRS) repos are not indexed, so an empty result never means "not found". Discover a File Exchange submission by keyword through the MathWorks search endpoint and install itspackage_name(Recipe C); enumerate a custom/service-backed repo through its REST API (Recipe C) or try package names withmpminstall(..., DryRun=true, Prompt=false).Use
mpminstall(..., DryRun=true, Prompt=false)to resolve package names. It searches every configured repository and reports the selected repository without installing anything. Prefer this command overmpmsearchto confirm a package name or version.Use projects and
matlab.tomlfor reproducibility. A-batchinstall does not persist because of MATLAB settings, and a long-lived MCP session can cache its registry at startup. In R2026b, opening a TOML project withPrompt=falseadditively installs missing declared packages, so declare the project environment instead of relying on an earlier session's install.Package files and the MATLAB path are separate. Packages typically live under
%APPDATA%\MathWorks\MATLAB Add-Ons\on Windows,~/Library/Application Support/MathWorks/MATLAB Add-Ons/on macOS, and~/MATLAB Add-Ons/on Linux. Installing makes their folders available on the MATLAB path.mpmuninstallremoves that package exposure but leaves files on disk unlessDelete=trueis supplied.Temporary=trueis not ephemeral and has no queryable property.All package installs are global. There is no project-scoped package store. A project's
[dependencies]declaration is provisioned when the TOML project opens; usempmlistto inspect the installed global package.Keep packages separate from reference projects. Use the project package form
{ version = "…", id = "…" }for packages. Usematlab-configure-toml-projectfor{ path, absolute }reference projects.Force=trueis destructive. On install it can remove other installed packages; on uninstall it cascades to dependents. Confirm with the user and say what will be removed first.
Router
| The user wants to… | Recipe |
|---|---|
| Install / acquire a package to use it | A. Consume a package |
| Know what's installed / what a package is / what it depends on | B. Inspect package info |
| Search indexed repositories / find a File Exchange submission / enumerate a custom repo / list every available version | C. Search & enumerate versions |
Build a shareable MATLAB package (.mltbx) | D. MATLAB package authoring |
Declare / edit / read dependencies in matlab.toml | E. Project (matlab.toml) dependencies |
| Upgrade an installed package | F. Update a package |
| Fix "Unable to locate dependency" / add a repository | G. Repository setup |
| Work on cloned package code | Use a reference project through matlab-configure-toml-project |
| Remove packages / reclaim disk | H. Uninstall & cleanup |
Load references/api-and-gotchas.md when a recipe points there or an unexpected error appears.
A. Consume a Package
In a project (recommended for R2026b and later):
Declare the package in the project's matlab.toml, then open the project with
Prompt=false. MATLAB additively installs missing declared packages.
See E and use matlab-configure-toml-project for the full
project schema.
Without a project:
mpminstall("Battery", DryRun=true, Prompt=false) % probe the name resolves
mpminstall("[email protected]", Prompt=false) % install a specific version
mpmlist("Battery") % confirm it landedInstallDependencies=true is the default (transitive deps come along). Specify as much as
reproducibility needs: "Name", "Name@Version", or "Name@Version@id" for an
exact match.
B. Inspect Package Info
Answer "what packages / what does X depend on" via mpmlist and
matlab.mpm.Package — never matlab.addons.installedAddons,
installedToolboxes. Package properties are authoritative. Only the Package object
surfaces the source Repository, resolved dependency versions, and the
DirectlyInstalled / Installed flags.
pkgs = mpmlist; % all installed -> matlab.mpm.Package array
pkg = mpmlist("Battery"); % filter to oneRead properties directly, for example pkg.Name, pkg.Version, pkg.ID, and
pkg.PackageRoot. For dependency values, index pkg.Dependencies and read the needed
properties such as .Name, .VersionRange, .ResolvedVersion, and .ID.
Displaying is the trap: string(pkg) / fprintf("%s",…) on a Package, or on an
object-valued property (Provider, Dependencies, Repository, Folders), throws —
read the scalar leaf field instead (pkg.Folders(1).Path, not string(pkg.Folders)).
Scalar disp(pkg) works; converting a whole object array does not.
pkg.MissingDependencies empty ⇒ all resolved. Don't use proj.Dependencies for
packages — that's the file-dependency digraph (empty until Dependency Analyzer runs).
The property list and display caveats are in references/api-and-gotchas.md.
C. Search & Enumerate Versions
In MATLAB (mpmsearch)
mpmsearch has three query forms — pick by what you have:
found = mpmsearch("battery"); % 1. free-text KEYWORD search (positional)
found = mpmsearch(Name="Battery", VersionSelectionPolicy="all"); % 2. exact name — every version
found = mpmsearch(PackageSpecifier="[email protected]"); % 3. a name@version specifier
% loop found(k): .Name, .Version, .Repository.Name (as in Recipe B — don't disp the array)Keyword (positional) when you don't know the name;
PackageSpecifier=(orName=+VersionRange=) for a name+version — never a compositeName="[email protected]"(throws).VersionSelectionPolicy="all"is required to list every version (default"highestByRepository"hides older ones). Filter by repo withRepository=(singular —Repositories=errors); other filters:VersionRange=,ID=,Provider=,CompatibleWithRelease=.FX and custom/service-backed repos aren't indexed — empty ≠ "not found" (Rule 3). Resolve a known package with
mpminstall(..., DryRun=true, Prompt=false)before concluding it is unavailable.
File Exchange keyword discovery (the search endpoint)
mpmsearch never returns File Exchange results. Discover an FX submission by keyword
through the MathWorks search endpoint
(.../searchresults/results?…&request_handler=select) and read its package_name —
that is the identifier mpminstall needs. A submission's page title, the URL's numeric
id, and its slug are not installable specifiers, and uuid only disambiguates
same-titled submissions. File Exchange is a default repository in R2026b, so once you
have the name:
mpminstall("knownPackageName", DryRun=true, Prompt=false) % confirm it resolves
mpminstall("knownPackageName", Prompt=false) % or "[email protected]" for a versionFX versions can't be enumerated programmatically; DryRun reports the version the
registry resolves, which can lag the FX web page (the result url is the current
source). For the curl, the fl= field list, and the response schema, see
references/api-and-gotchas.md § Finding a File Exchange submission.
Custom / service-backed repositories (REST)
A custom or Artifactory-backed (MPRS) repository isn't indexed either, so mpmsearch
returns empty with no error — that is by design, not a missing package. Query the
service's REST API directly: /v1/packages/by-name/<name>.json for a candidate name,
/v1/packages/index.json to enumerate everything, with an Authorization: Bearer
header whose token comes from the environment and never a literal. Discovery only —
install still goes through mpminstall once the repo is registered (Recipe G). The
endpoints, the in-MATLAB webread form, the manifest fields, and the
by-name-vs-index rule are in references/api-and-gotchas.md
§ Searching a custom repository.
D. MATLAB Package Authoring
Build shareable MATLAB packages as .mltbx files through
matlab-package-toolbox. It owns the authoring pipeline, including package
metadata, declared package dependencies, documentation, and build validation.
Use this skill after authoring to install a resulting .mltbx with mpminstall
and verify it with mpmlist.
E. Project (matlab.toml) Dependencies
Declare a package dependency, then open the project with Prompt=false so MATLAB
additively installs any missing packages.
[dependencies]
Battery = { version = ">=1.1.0", id = "c1438758-4eaf-438f-b04f-6a7279735de5" }Use the inline { version, id } package form. For reference projects
({ path, absolute }) and the full matlab.toml schema, use matlab-configure-toml-project.
proj = openProject("/path/to/proj", Prompt=false); % auto-installs declared deps
reload(proj) % re-resolve after editing matlab.toml
runChecks(proj) % treat any Missing/Unresolved as failureTo read declared package dependencies, parse the [dependencies] section directly,
then cross-reference mpmlist for install status — do not open the project just to list
them. After editing, proj.ProjectDependencies should show resolved package identity and
version. A stale open project silently suppresses auto-install — if another project is
already open, openProject is a no-op for provisioning; close(currentProject) first.
F. Update a Package
Update an installed package with mpmupdate:
mpmupdate("Edge", DryRun=true, Prompt=false) % preview first — changes nothing on disk
mpmupdate("Edge", Prompt=false) % newest available version
mpmupdate("Edge", "3.2.10", Prompt=false) % specify exact version (plain string, not ">=")The version range defaults to "*" (any version newer than installed — no
within-major ceiling). Dependency handling is conservative: UpdateDependencies
defaults to "necessary", so transitive deps move only when required. Update
won't cross package identity — a version with a different ID/provider is a
different package sharing the name; swap it deliberately with
mpminstall("[email protected]", AllowVersionReplacement=true, Prompt=false).
G. Repository Setup
repos = mpmListRepositories; % loop repos to read Name + Location
mpmAddRepository("File Exchange", matlab.mpm.FileExchange) % not configured by default everywhere
mpmAddRepository("myRepo", "/path/to/repo") % folder repo (UNC on Windows)
mpmRemoveRepository("myRepo")Custom/authenticated repository (Artifactory, etc.): register it from a
repo-config.json via matlab.mpm.RepositoryConfiguration:
% Consumer: set the token env var first (ARTIFACTORY_TOKEN), then:
jsonFile = "/path/to/repo-config.json";
cfg = matlab.mpm.RepositoryConfiguration(jsonFile);
mpmAddRepository(cfg)Each entry in the file's repository_configuration array (schema_version "1.0.0")
has name, url (the Package Repository Service base URL — not raw Artifactory),
type "custom", and an auth.access_token that is an env-var placeholder
"${ARTIFACTORY_TOKEN}", never a literal token (resolved at runtime, or from a
setSecret secret) — safe to share. See references/api-and-gotchas.md
§ repo-config.json schema for the annotated JSON.
Unable to locate dependency '…' almost always means the hosting repository isn't
registered — check mpmListRepositories first. mpminstall has no Repository
argument (it resolves across all registered repos); scope by repo only on mpmsearch.
H. Uninstall & Cleanup
mpmuninstall("Pkg", Prompt=false) % remove package from the MATLAB path; leave files on disk
mpmuninstall("Pkg", Prompt=false, Delete=true) % explicitly remove package files from disk
installed = mpmlist;
mpmuninstall(installed([installed.Name] ~= "mpmUtilities"), Prompt=false, Delete=true) % filtered batchmpmuninstall accepts a matlab.mpm.Package array — filter and pass it, do not loop.
KeepUnusedDependencies defaults to false (orphaned dependencies are auto-removed);
Delete=true is what actually reclaims disk. Never use matlab.addons.uninstall.
Key Functions
All available in the baseline, MATLAB R2026b or later.
| Function | Purpose |
|---|---|
mpminstall | Install package(s) from configured repositories or a completed .mltbx file (resolves deps) |
mpmuninstall | Remove package(s); Delete=true clears disk |
mpmupdate | Update to the newest available version (deps only as necessary) |
mpmlist | List installed packages as a matlab.mpm.Package array |
mpmsearch | Search configured repositories; enumerate versions |
mpmAddRepository / mpmRemoveRepository / mpmListRepositories | Manage the repository search list |
matlab.mpm.RepositoryConfiguration | Load a repo-config.json for authenticated/custom repos |
matlab.mpm.Package | Installed-package metadata object (20 properties) |
openProject | Open a TOML project and additively provision declared packages |
Conventions
Beyond the Critical Rules: preview package installation and updates with DryRun=true,
then re-check with a fresh mpmlist / runChecks(proj); use
VersionSelectionPolicy="all" to list every version; keep Verbosity to
"quiet"/"normal"/"detailed". Ask first
before adding/removing a repository or installing a package the user did not name
(supply-chain risk).
For the complete gotcha list (Repositories= plural, Temporary without cleanup, and
more), see references/api-and-gotchas.md.
References
references/api-and-gotchas.md— exact MPM syntax, package-property display caveats, the File Exchange search endpoint, the custom-repository REST API, and the full package-manager gotcha catalog. Load for a lookup or unexpected error.matlab-configure-toml-projectskill — for TOML schema, project references, project paths, and conversion between project definition formats.matlab-read-documentationskill — for exactmpm*/matlab.mpm.*syntax.
Copyright 2026 The MathWorks, Inc.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.1 KiB
- LICENSELicence file added by AutoGineer1.4 KiB
- SKILL.md18.1 KiB
- manifest.yaml485 B
- references/api-and-gotchas.md17.3 KiB
references/api-and-gotchas.md
mpm API, matlab.toml schema & gotcha catalog
Load when you need exact command syntax, the full matlab.toml schema, matlab.mpm.Package
properties, or the complete gotcha list. SKILL.md carries the workflow; this file carries the
lookup detail.
Command reference
Repository management
mpmListRepositories % list configured repositories
mpmAddRepository("File Exchange", matlab.mpm.FileExchange) % add File Exchange (not default everywhere)
mpmAddRepository("myRepo", "/path/to/repo") % add a folder-based repo
mpmRemoveRepository("myRepo")
% Custom/authenticated repo via RepositoryConfiguration (e.g. Artifactory):
jsonFile = "/path/to/repo-config.json";
cfg = matlab.mpm.RepositoryConfiguration(jsonFile);
mpmAddRepository(cfg)repo-config.json schema
{
"schema_version": "1.0.0",
"repository_configuration": [
{
"name": "corp-repo",
"url": "https://mprs.corp.com:8080/",
"type": "custom",
"auth": {
"type": "token",
"access_token": "${ARTIFACTORY_TOKEN}"
}
}
]
}schema_version— always"1.0.0"repository_configuration— array of repository objectsname— display name formpmListRepositoriesurl— base URL of the Package Repository Service (not raw Artifactory)type—"custom"for service-backed reposauth.type—"token"(bearer token authentication)auth.access_token— env-var placeholder"${VAR_NAME}"resolved at runtime; never a literal token
The ${…} placeholder is resolved from the user's environment at runtime,
or from a MATLAB secret set with setSecret (e.g.
setSecret("ARTIFACTORY_TOKEN")). Tokens are never stored in the file itself.
Set the env var in the shell profile (e.g.
export ARTIFACTORY_TOKEN=<your-read-token>) or store it as a MATLAB secret
before launching MATLAB.
Search & discovery
mpmsearch("keyword") % free-text KEYWORD search across indexed repos
mpmsearch(Name="Battery") % by exact name (case-sensitive)
mpmsearch(PackageSpecifier="[email protected]") % by a name@version specifier
mpmsearch(Name="Battery", VersionRange="1.1.0") % equivalently, split name + version range
mpmsearch(Name="Edge", VersionSelectionPolicy="all") % list all versions, not just newest
mpmsearch(Name="Edge", Repository="myRepo") % scope to one repo (singular)Three query forms: positional keyword (mpmsearch("keyword")), exact Name=, and
PackageSpecifier= (or Name= + VersionRange=) for name+version. Do not fuse a
version into Name= — Name="[email protected]" throws (Name must be a valid MATLAB
identifier). Keyword search is supported; it just only covers indexed repositories.
File Exchange and custom/service-backed (Artifactory/MPRS) repos are not indexed and return
empty with no error, so an empty result never means "not found" — discover File Exchange
submissions through the search endpoint (§ Finding a File Exchange submission), and query a
custom/service-backed repo through its REST API (§ Searching a custom repository) or try
names with mpminstall(..., DryRun=true, Prompt=false).
Install / uninstall
mpminstall("Battery", Prompt=false)
mpminstall("[email protected]", Prompt=false) % specify version
mpminstall("[email protected]@c1438758-4eaf-438f-b04f-6a7279735de5", Prompt=false) % specify version AND id
mpminstall("/path/to/package.mltbx", Prompt=false) % install a completed MATLAB package
mpminstall("Battery", InstallDependencies=true, Prompt=false) % default true — transitive resolution
mpminstall("Battery", DryRun=true, Prompt=false) % preview, commit nothing
mpminstall("Battery", Temporary=true, Prompt=false) % NOT re-registered on restart; files still land globally
mpminstall("[email protected]", AllowVersionReplacement=true, Prompt=false) % replace a same-name/different-id package
mpmuninstall("Battery", Prompt=false) % remove package from the MATLAB path; retain files
mpmuninstall("Battery", Delete=true, Prompt=false) % actually delete files from disk
mpmuninstall("Battery", Force=true, Prompt=false) % remove even if depended on (may drop unrelated deps)
mpmuninstall("Battery", KeepUnusedDependencies=true, Prompt=false) % default false: orphaned deps auto-removedmpmuninstall accepts a matlab.mpm.Package array — filter mpmlist() and pass the array, don't loop.
Update
mpmupdate("Edge", Prompt=false) % newest available version (default range "*")
mpmupdate("Edge", "3.2.10", Prompt=false) % specify exact version (string, NOT ">=")
mpmupdate("Edge", Force=true, Prompt=false) % override dependency/version-conflict guards
mpmupdate("Edge", DryRun=true, Prompt=false) % preview
mpmupdate("Edge", UpdateDependencies="necessary", Prompt=false) % default — update deps only if requiredBy default mpmupdate targets the newest available version — the version range defaults to
"*" (any version above the installed one); there is no within-major ceiling. The conservative
part is dependency handling: UpdateDependencies defaults to "necessary", so transitive deps
move only when the new version requires it. mpmupdate refuses to treat a same-name/different-id
package as a version of the installed one — use AllowVersionReplacement=true on mpminstall to
swap identities.
List & inspect
mpmlist % all installed -> matlab.mpm.Package array
mpmlist("Battery") % one package
mpmlist(Name="Battery") % name-value formFor TOML project creation, package declarations, and project references, use the
matlab-configure-toml-project skill. For .mltbx authoring, use
matlab-package-toolbox.
matlab.mpm.Package properties
20 public properties:
Identity:
.Name.DisplayName.FormerNames.Version.IDDescriptive:
.Summary.Readme.Tags.ReleaseCompatibility.ProviderStatus (logical):
.Installed.DirectlyInstalledLocation:
.PackageRoot·.Folders(folders added to the path) ·.RepositoryPlatform:
.SupportedPlatformsDependencies:
.Dependencies(each has.Name.VersionRange.ResolvedVersion.ID) ·.InstalledDependencies·.MissingDependencies(empty means all resolved)
On packages returned by mpmsearch (not yet installed), .Folders, .Readme, and
.Dependencies are empty — full metadata exists only after install. There is no Temporary
property, so you cannot tell after the fact which installs were temporary.
Read the property needed for the answer directly. For example, use .PackageRoot,
.Repository, .Folders(k).Path, .SupportedPlatforms(k).Platform, or
.Dependencies(k).ResolvedVersion. string(pkg) / fprintf("%s",…) on a Package, or
on an object-valued property (Provider, Dependencies, Repository, Folders,
SupportedPlatforms), throws — index to the scalar leaf field first (.Folders(k).Path,
not string(.Folders)). Scalar disp(pkg) works; converting a whole object array does not.
Finding a File Exchange submission
mpmsearch never returns File Exchange (FX) results — the FX adapter is noIndex. To
discover an FX submission by keyword, call the MathWorks search endpoint directly and
read the package_name field: that is the identifier mpminstall needs.
curl -sS "https://www.mathworks.com/searchresults/results\
?c%5B%5D=fileexchange&q=<url-encoded keywords>\
&fl=title_en,url,summary_en,package_name,uuid&request_handler=select"c[]=fileexchangescopes to File Exchange;request_handler=selectselects the lower-level handler that exposespackage_name. The default agent search API (/api/v1/agent/search) does not return it.fl=is the field list. Requestpackage_nameanduuidexplicitly; unknown field names are silently dropped, andfl=*is rejected (returnsnull).Response is Solr JSON:
response.docs[], each with:package_name— the MPM install identifier. Feed this tompminstall. It is a short identifier, and a distinct string from both the URL's numeric id and its slug.uuid(=container_uuid;asset_idis the same value with anadd-ons:prefix) — equals the resolvedPackage.ID. Use it only to disambiguate two same-titled submissions; it is not anmpminstallspecifier.title_en,url(/matlabcentral/fileexchange/<id>-<slug>),summary_en,body_en— for presenting candidates to the user.
response.numFoundis the total match count; page with&page=N/&rows=N.
File Exchange is a default known repository in R2026b (no mpmAddRepository needed; on
older setups add it with mpmAddRepository("File Exchange", matlab.mpm.FileExchange)).
Once you have the name:
p = mpminstall("knownPackageName", DryRun=true, Prompt=false); % resolves -> p.Version, p.ID, deps
mpminstall("knownPackageName", Prompt=false); % or "[email protected]" for a versionThe search endpoint carries no version field, and FX versions cannot be enumerated
programmatically at all — mpmsearch(Name=…, VersionSelectionPolicy="all") returns
empty because FX is noIndex. A DryRun install reports the version the configured
registry resolves, which can lag the version shown on the submission's FX web page (a
pre-release MATLAB may point at an integration registry — matlab.mpm.FileExchange
returns whatever URL the session targets, so never hardcode one). The FX web page (the
result url) is the only source of current version and full version history.
To confirm exact mpm* / matlab.mpm.* function syntax, use the matlab-read-documentation
skill — it owns MATLAB documentation lookup.
Searching a custom repository (Repository Server REST API)
A custom/service-backed repository (an Artifactory-backed Package Repository Service) is
not indexed for mpmsearch either — it returns empty with no error. Query the service's
REST API directly; a bearer token is all that's required.
# A known name (case-insensitive; returns every version of that one package):
curl -sS -H "Authorization: Bearer ${ARTIFACTORY_TOKEN}" \
<server_url>/v1/packages/by-name/<name>.json
# A known UUID:
curl -sS -H "Authorization: Bearer ${ARTIFACTORY_TOKEN}" \
<server_url>/v1/packages/by-uuid/<uuid>.json
# Every package and version — the only way to enumerate the repository:
curl -sS -H "Authorization: Bearer ${ARTIFACTORY_TOKEN}" \
<server_url>/v1/packages/index.jsonThe same calls from inside MATLAB, when no shell is available:
opts = weboptions("HeaderFields", ["Authorization", "Bearer " + getenv("ARTIFACTORY_TOKEN")]);
manifests = webread(serverUrl + "/v1/packages/index.json", opts);<server_url> is the MPRS service base URL — the same url used in
repo-config.json, not the raw Artifactory browse host (which has no
/v1/packages/ shape). Each manifest object carries name, displayName, id,
version, summary, provider.name, provider.organization, releaseCompatibility,
supportedPlatforms, and dependencies.
Decision rule: use by-name when you already have a candidate name — it avoids
downloading the whole index. Use index.json to enumerate the repository, or for
attribute queries (by provider, platform, release compatibility, or keyword substring).
If by-name returns 404 and the name could be a substring, retry against the index and
substring-match. These endpoints are read-only discovery: install still goes through
mpminstall once the repository is registered (§ Repository management).
Gotcha catalog (highest-impact first)
Interactive prompts hang non-interactive sessions. Pass
Prompt=falseon every install/uninstall/update and onopenProject. A quiet, blocked session looks like a crash.Use a TOML project for a reproducible package environment. In R2026b, opening a TOML project with
Prompt=falseadditively installs its missing packages. Usematlab-configure-toml-projectfor project references and the full schema.Package dependencies use the package form
{ version, id }. The identity key isid, neveruuid— even though its value is a UUID (e.g.id = "c1438758-…");uuid =is not a recognized key. Usematlab-configure-toml-projectfor the project schema and reference projects.Only
mpmsearch(Name=…)is case-sensitive.mpminstall/mpmuninstall/mpmupdateandmpmsearch(PackageSpecifier=…)match names case-insensitively; onlympmsearch(Name="Battery")is exact-case.mpmsearchcan miss whatmpminstallresolves, so resolve a known name withmpminstall(..., DryRun=true, Prompt=false).Same name, different ID = different packages.
mpmupdatewon't cross them; useAllowVersionReplacement=true(or uninstall then install) to swap identity.mpmupdategoes to the newest available version by default (version range defaults to"*", no within-major ceiling). What's conservative is dependency handling —UpdateDependencies="necessary"moves transitive deps only when the new version requires it.Force=trueis destructive. On install it can remove other installed packages; on uninstall it can drop unrelated deps. Warn the user before running it.Temporary=trueisn't ephemeral — files persist globally. Normal uninstall removes the package from the MATLAB path; useDelete=trueto remove files from disk. No way to query which installs were temporary.File Exchange: install by
package_name; a default repo in R2026b.mpmsearchnever returns File Exchange results — discover a submission via the MathWorks search endpoint (request_handler=select) and install itspackage_name(see § Finding a File Exchange submission). A page title, the FX URL's numeric id, and its slug are not installable specifiers; neither is theuuid(disambiguation only). Resolve the name withmpminstall(..., DryRun=true, Prompt=false)before installing. FX versions cannot be enumerated programmatically.proj.Dependenciesis the project file digraph, not packages. Usempmlistfor package dependency information.Legacy File Exchange packages can break across releases. Example: GUI Layout Toolbox v1 (
layout1) uses the removedhandle.listener; v2 (layout2,uix.*namespace) is current.layout1andlayout2cannot coexist — this is a structural conflict, not a transient error. Check.ReleaseCompatibilityand choose the compatible major.No pre-install content preview or restore command. You see full metadata only after installation. Declare packages in
matlab.tomland open the project withPrompt=falseto provision them reproducibly.A stale open project silently suppresses auto-install.
openProject(..., Prompt=false)only auto-installs declared deps when it actually opens this project. If another project is already open (currentProjectreturns it), the call is a no-op for provisioning andmpmliststays empty with no error. Close any open project first (close(currentProject)/ checkmatlab.project.rootProject) before opening the target.mpminstallhas noRepositoryargument. It resolves across all registered repos; passingRepository=throwsInvalid argument name. Scope by repo only onmpmsearch; for install, register the repo (mpmAddRepository) first, then install by name. Clear the on-disk cache withmatlab.mpm.internal.clearCache(internal — test/cleanup only, not for shipped skill code).
Additional notes (from the merged skills)
Credentials. An install/update against an authenticated repo (Artifactory, private) can fail with
UnresolvedCredentialException— the fix is user-side token /.netrc/ credential-helper config, not a code change; flag it for the user. If credentials are unavailable and you have a local.mltbx,matlab.addons.toolbox.installToolboxinstalls it without dependency resolution as a last-resort fallback (prefermpminstallotherwise).UNC / folder-repo paths are platform-specific. Linux/macOS use forward slashes (
"//server/share/path"); Windows uses the UNC form ("\\server\share"). If a folder add fails with'location' must be path to a folder, invert the slashes.mpmAddRepositoryadds to the top of the search list (search-first); on a name collision the first hit wins — remove and re-add to reorder.Verbosityaccepts only"quiet","normal", or"detailed"onmpminstall/mpmupdate/mpmuninstall. Any other word ("concise","verbose", …) errors.Variable shadowing. A package name reused as a variable, or a package function whose name shadows a built-in (a
Filterpackage shadowingfilter), can mask the installation. Confirm viampmlist+isfolder(pkg.PackageRoot), andwhich -all <name>to detect shadowing.Diagnosing masked errors. The MCP session can mask the real error behind "Array indices must be positive integers" (the hung-prompt symptom). A one-off MATLAB
-batchrun reveals the true error text — use it for diagnosis only (its installs do not persist).
Copyright 2026 The MathWorks, Inc.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Security
What our scanner noticed· Medium risk
- References to credential files
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- MathWorks
- Publisher
- MathWorks (Official)
- Source
- matlab/matlab-agentic-toolkit · skills-catalog/matlab-software-development/matlab-use-package-manager · commit 2a7f215
- Licence
- BSD 2-Clause License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by MathWorks or MathWorks.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download matlab-use-package-manager.zip