matlab/roadrunner-core
Foundation skill for all RoadRunner workflows: MATLAB path setup, connection, project/scene/scenario lifecycle, world settings, handle management, status, and close. Use when connecting to RoadRunner, managing projects/scenes/scenarios, setting world origin, checking status, closing RoadRunner, or when any downstream RoadRunner skill needs initialization.
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill roadrunner-core
Foundation skill for all RoadRunner agent workflows. Manages the RoadRunner connection, project/scene/scenario lifecycle, and handle management from MATLAB. Produces the rrApp handle used by all downstream RoadRunner skills.
Execution: all MATLAB code runs via evaluate_matlab_code MCP tool. Never matlab -batch.
rrApp initializationroadrunner class and related APIs are not available in earlier releasesrrApp already exists and is valid — re-running rrCoreInitialize is safe (it's idempotent) but unnecessary; prefer checking exist('rrApp','var') first to avoid the overheadrrCoreInitialize handles setup automatically using a two-tier approach:
| Tier | Condition | What happens |
|------|-----------|--------------|
| 1 | Settings valid + roadrunner class on path | Setup skipped — already configured |
| 2 | Agent has installFolder and projectPath variables | Programmatic setup: addpath, savepath, writes MATLAB settings. No GUI. |
Just run rrCoreInitialize. The script automatically:
roadrunner.connect())roadrunner()) using saved settingsPathsRequired — then ask the user for installFolder and projectPath, set them, and re-runOnce setup succeeds, it persists forever (across MATLAB sessions). Never needed again.
No GUI dialogs. This skill never calls roadrunnerSetup. All configuration is done programmatically.
rrCoreInitialize can be found): addpath("<absolute-path-to-this-skill>/scripts");
Replace <absolute-path-to-this-skill> with the actual filesystem path to this skill's directory (the folder containing this SKILL.md file).
rrCoreInitialize → it handles everything: connects to a running instance, or launches one using saved settings, or errors with a clear message if not configured.PathsRequired → ask the user for installFolder and projectPath, set them as variables, re-run rrCoreInitialize.exist('rrApp','var') — if missing, re-run rrCoreInitializescripts/rrCoreCommands.m under the matching %% headingevaluate_matlab_codeNever improvise API calls. Before every RoadRunner operation, read the matching %% section from rrCoreCommands.m and reproduce it exactly. Do not guess function names, argument syntax, or parameter orders from memory. This prevents hallucinated function names, missing guard rails, and forgotten handle invalidation.
If you are unsure of the correct syntax for any operation, stop and read the pattern file before attempting the call.
| File | Role |
|------|------|
| scripts/rrCoreInitialize.m | Runs directly. Bootstraps path + connection + validation. |
| scripts/rrCoreCommands.m | Pattern reference. Agent reads %% section, substitutes placeholders, executes. |
On first use, the agent ensures the RoadRunner API is on the MATLAB path (one-time savepath). The scripts in this skill are pattern references — the agent reads them and reproduces the patterns via evaluate_matlab_code.
| User Intent | Pattern (%% section) | Placeholders to substitute |
|-------------|------------------------|---------------------------|
| Connect / initialize | INIT | — |
| Connect without launching | CONNECT_ONLY | — (errors if no instance running) |
| Create a new project | NEW_PROJECT or NEW_PROJECT_WITH_ASSETS | projectPath — ask user whether to include base assets (asset library). Always rrCoreInitialize first (RoadRunner must be running with any project before newProject can be called). |
| Open an existing project | OPEN_PROJECT | projectPath |
| Save the project | SAVE_PROJECT | — |
| Create a new scene | NEW_SCENE | — |
| Open a scene | OPEN_SCENE | sceneName — if not found, use LIST_SCENES and present options |
| List available scenes | LIST_SCENES | — |
| Save the scene | SAVE_SCENE or SAVE_SCENE_AS | Ask user: "Save in place, or save with a new name?" If new name → use SAVE_SCENE_AS with sceneName |
| Create a new scenario | NEW_SCENARIO | — |
| Open a scenario | OPEN_SCENARIO | scenarioName — if not found, use LIST_SCENARIOS and present options |
| List available scenarios | LIST_SCENARIOS | — |
| Save the scenario | SAVE_SCENARIO | — |
| Set world origin | CHANGE_WORLD_ORIGIN | lat, lon |
| Set scene center and extents | CHANGE_SCENE_BOUNDS | x, y, w, h |
| Set scene center only | CHANGE_SCENE_CENTER | x, y |
| Set scene extents only | CHANGE_SCENE_EXTENTS | w, h |
| Clear world projection | CLEAR_WORLD_PROJECTION | — |
| Check status | STATUS | — |
| Close RoadRunner | CLOSE | — |
> Available From: changeWorldSettings requires R2023b or later. All other operations are available from R2022a.
rrCoreInitialize)After first-time setup, rrCoreInitialize automatically launches RoadRunner using saved defaults if no instance is running. Manual launch is only needed for non-default modes:
rrApp = roadrunner(ProjectFolder=projectPath, InstallationFolder=installFolder);
| Mode | Add this argument |
|------|-------------------|
| Headless (no UI) | NoDisplay=true |
| No desktop + graphics | NoDesktop=true |
| Custom ports | Ports=[apiPort, cosimPort] |
Manual launch still requires explicit user permission.
These are the variable names used in rrCoreCommands.m. The agent substitutes them with actual values before executing.
| Placeholder | Type | Example |
|-------------|------|---------|
| SKILL_SCRIPTS_DIR | string | *(absolute path to this skill's scripts/ folder)* |
| rrApp | roadrunner | *(from rrCoreInitialize, never reassigned)* |
| projectPath | string | "D:/Projects/HighwayProject" |
| sceneName | string | "FourWaySignal.rrscene" |
| scenarioName | string | "CutInScenario" |
| lat | double | 42.3021 |
| lon | double | -71.3747 |
| x, y | double | 1445, 1237 |
| w, h | double | 160, 465 |
| installFolder | string | "C:/Program Files/RoadRunner R2026a" |
This skill produces rrApp via rrCoreInitialize. Operations that change state (NEW_SCENE, OPEN_SCENE, NEW_SCENARIO, OPEN_SCENARIO, OPEN_PROJECT, CLOSE) include clear statements to remove stale handles.
RoadRunner API path is added to MATLAB's saved path on first use. No config files or environment variables needed.
The agent runs savepath after adding the API path — this persists across MATLAB sessions. If the user upgrades RoadRunner, the agent detects the failure (roadrunner class missing or version mismatch) and asks for the new installation folder.
rrCoreInitialize first — never call RoadRunner APIs without a validated rrApproadrunner(ProjectFolder=...)rrApp per session — never create a second connectionrrCoreCommands.m, find the %% section, reproduce it exactly. Do not guess syntax from memory.NEW_SCENE, NEW_SCENARIO, and CLOSE patterns detect unsaved changes but do NOT save automatically. Always ask the user whether to save, save-as, or discard. Saving with the same name overwrites the original and can break backwards compatibility if the file was created with an older version.rrApp.Version and report it. If the user requested a specific version, warn if it doesn't match.openScene or openScenario fails because the name doesn't exist, list available scenes/scenarios using dir and present options to the user<project>/Scenes/10. Unicode not supported in paths
11. Handle invalidation is automatic — patterns include clear statements
12. All execution via MCP — never matlab -batch
13. close(rrApp) terminates RoadRunner entirely — the process exits. After close, roadrunner.connect() will fail. A fresh roadrunner() launch is required to reconnect.
14. Scene is NOT restored on relaunch — after close + relaunch, RoadRunner opens the project but shows a blank scene. The agent must explicitly reopen the desired scene.
roadrunner(ProjectFolder=...) when already connected — this launches a duplicate instanceroadrunner.connect(port, port) — use single portrrAppclear statements from the patternsrrCoreCommands.m (e.g., no save(rrApp), no saveSceneAs, no switchScenario, no Latitude=lat)rrCoreInitializesaveScene(rrApp, name) silently overwrites existing files<RoadRunner Project>/
├── Assets/ 3D models, materials, textures
├── Scenes/ .rrscene files
├── Scenarios/ .rrscenario files
├── Exports/ Exported output
├── Project/ Project metadata
└── Scripts/ User scripts (optional)
newProject creates any missing parent foldersopenProject targets an already-open project, a new blank scene is still created<project>/Scenes/.rrscene extension is optional — RoadRunner appends it if missingsaveScene(rrApp, name) silently overwrites if the name already exists — no confirmationsaveScene(rrApp) on an unnamed (new) scene errors — must provide a name"Scenarios/subfolder/Name")newScenario, openScenario, saveScenario available since R2022a| Parameter | Type | Description |
|-----------|------|-------------|
| WorldOrigin | [lat lon] | Geospatial world origin |
| SceneCenter | [x y] | Center of scene workspace |
| SceneExtents | [w h] | Scene workspace dimensions |
| ClearWorldProjection | logical | Clear current projection |
Available since R2023b.
rrStatus = status(rrApp);
rrStatus.Project.Filename % Current project path
rrStatus.Project.UnsavedChanges % true/false
rrStatus.Scene.Filename % Current scene path
rrStatus.Scene.UnsavedChanges % true/false
rrStatus.Scenario.Filename % Current scenario path
rrStatus.Scenario.UnsavedChanges % true/false
| Property | Description |
|----------|-------------|
| rrApp.InstallationFolder | RoadRunner install path |
| rrApp.Version | Version string |
| rrApp.NoDisplay | Console mode flag |
| rrApp.NoDesktop | No-desktop mode flag |
close(rrApp) does NOT prompt to save — always save before closingroadrunner object — do not reuse the variable after closingroadrunner.connect() will fail (nothing to connect to)roadrunner(), the project is restored but the scene is NOT — a blank scene appearsrrApp = roadrunner.connect(); % Default port 35707
rrApp = roadrunner.connect(portNumber); % Explicit port
| Mode | Syntax | Use case |
|------|--------|----------|
| GUI (default) | roadrunner(ProjectFolder=...) | Interactive use |
| Headless | roadrunner(ProjectFolder=..., NoDisplay=true) | Batch/CI, no UI |
| No desktop + graphics | roadrunner(ProjectFolder=..., NoDesktop=true) | Export needing render |
| Custom ports | roadrunner(ProjectFolder=..., Ports=[apiPort, cosimPort]) | Multi-instance |
----
Copyright 2026 The MathWorks, Inc.
----
Take matlab/roadrunner-core 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.