Matlab Use Opcua Client
MathWorksOfficialCreated by MathWorks
- Skill
- Tool integration
- Automation and integrations
- BSD-2-Clause
- No issues found
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach for using the Industrial Communication Toolbox to interact with OPC UA servers. It covers the full lifecycle of OPC UA communication, including network discovery via the Local Discovery Service (LDS), secure client-server connection establishment, certificate management, and programmatic navigation of complex server address spaces. The skill emphasizes robust error handling, security best practices, and efficient node traversal patterns to ensure reliable data access in industrial environments.
What it does
- Discovers OPC UA servers on a network using LDS or direct endpoint URLs.
- Establishes secure client connections with support for username/password or certificate-based authentication.
- Configures message security modes and channel policies for encrypted communication.
- Provides workflows for resolving common certificate trust and hostname mismatch errors.
- Enables programmatic browsing and navigation of server address spaces via node hierarchies.
- Supports method invocation and batch-processing of large namespaces.
When to use it
- When you need to connect MATLAB to industrial OPC UA servers for data acquisition.
- When troubleshooting connection failures, certificate trust issues, or empty discovery results.
- When you need to programmatically explore or search for specific nodes within an OPC UA server.
- When implementing secure communication between MATLAB and industrial hardware or software.
Advantages
- Standardizes connection and security patterns to prevent common configuration errors.
- Provides clear escalation paths for resolving certificate trust and authentication issues.
- Promotes efficient node navigation by avoiding blocking GUI-based browsing in scripts.
- Ensures compatibility with modern OPC UA security standards and best practices.
Usage examples
- “How do I find all OPC UA servers running on my local machine?”
- The agent will guide you to use opcuaserverinfo('localhost') to query the Local Discovery Service and return a list of registered servers.
- “My connection to the OPC UA server is failing with a certificate trust error.”
- The agent will instruct you to use opc.ua.trustServerCertificate with the path to the server's .der certificate to add it to the MATLAB trusted store.
- “How can I find a specific node in the OPC UA namespace without using the GUI?”
- The agent will provide a script pattern to traverse the uaClient.Namespace and .Children properties level-by-level to locate the target node.
- “How do I securely connect to an OPC UA server using a certificate?”
- The agent will show you the correct connect() function signature that accepts the public key, private key, and password.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/matlab/matlab-use-opcua-client/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip matlab-use-opcua-client.zip -d .agents/skills
Documentation by MathWorks
OPC UA Discovery, Connection, and Node Navigation
Discover OPC UA servers, create client connections, and browse server address spaces in MATLAB using the Industrial Communication Toolbox.
Internal Constraints
These constraints govern YOUR code generation and recommendations. Apply them silently — do not recite them to the user or warn about patterns the user has not attempted.
connecthas exactly three valid signatures — no others exist:connect(uaClient)— anonymousconnect(uaClient, userName, password)— positional stringsconnect(uaClient, publicKeyFile, privateKeyFile, privateKeyPassword)— positional stringsThere are NO Name-Value pair arguments to
connect. Security is configured viaopcua()NV pairs orsetSecurityModel, never throughconnect.
opcua()defaults to the highest available security. Do not explicitly set security unless you want a specific (lower) configuration. Never usesetSecurityModel(uaClient, "Best")— it is redundant.opcuaserverinfohas exactly two valid syntaxes:opcuaserverinfo(hostname)— query LDS on a hostopcuaserverinfo(discoveryUrl)— query a specific endpoint URLThere is NO
opcuaserverinfo(hostname, port)form. To specify a port:opcuaserverinfo('opc.tcp://host:port').
LDS-based discovery returns all registered servers from a single call. Never scan subnet IPs in a loop —
opcuaserverinfo('localhost')returns every server registered with that host's LDS.Certificate trust escalation order (never skip steps):
opc.ua.trustServerCertificate(certPath)— always first (R2026a+)opcua(..., "TrustServerTemporarily", true)— only if cert file unavailablesetSecurityModel(uaClient, "None", "None")— only after user explicitly confirms no security needed
Property correctness:
opc.ua.ServerInfohasDescription, notName(which belongs toopc.ua.Client).EndpointUrlbelongs toopc.ua.EndpointDescription, notServerInfo.
Do not move or copy certificate files without user confirmation. Tell the user which file to move and where, then execute only after they confirm.
Do not mention
TrustServerTemporarilywhen the issue is the server rejecting the client certificate — it only controls client- side trust and is irrelevant in that direction. Simply omit it.browseNamespaceis GUI-only — never call it in scripts or agent workflows. It opens an interactive dialog that blocks the MATLAB session. UseuaClient.Namespaceand.Childrentraversal instead.opcuanodedoes NOT accept browse paths. Passing a slash- separated string (e.g.,'Demo/Mass/Nested/7') silently creates a node withNodeType: 'Unknown'. Use.Childrenlevel-by-level.Check a method node's
Parentproperty and signature beforeinvoke(). IfParentis empty,invoke()fails with "Specified node has no parent information" — re-resolve the node viafindNodeById, which retains parent info. IfParentis non-empty, invoke it directly. Do not unconditionally avoidopcuanodefor method nodes; branch on whether the node has a parent. Before callinginvoke, inspectNumInputsandNumOutputsto verify the argument count matches your intended call.Before iterating any
.Childrenarray, issue a separate tool call that only counts nodes. Never combine counting and processing in the same tool call. Process in batches of 200 with progress reporting.Never search the entire namespace. If the user does not provide a path or parent folder, ask them to specify one. List top-level nodes to help them narrow scope. Skip the
Serverfolder (ns=0 infrastructure nodes) unless the user explicitly asks about server properties.opcua()caches endpoints at construction time. If the server's available policies change after client creation, the existing client object will not reflect them. Recreate the client withopcua(url)to re-discover endpoints. Explain this to the user when they ask about switching to a newly-available policy.
When to Use
Discovering OPC UA servers on the network (endpoint URL unknown, or user explicitly requests discovery given a hostname or discovery URL)
Getting server endpoint details and supported security policies
Creating an OPC UA client connection to a server
Authenticating with username/password or user certificates
Configuring message security mode and channel security policy
Handling "server certificate not trusted" errors
Handling "client certificate rejected by server" errors
Fixing hostname mismatch warnings
Troubleshooting OPC UA connection failures or empty discovery results
Inspecting an OPC UA certificate (
.der/.pem) for compliance issuesBrowsing an OPC UA server's address space programmatically
Searching for nodes by name, partial name, or NodeId
Navigating a node hierarchy to reach a specific node
Accessing a node directly by namespace index and identifier
Goal-driven node discovery (e.g., "find all temperature sensors")
Discovering nodes before reading, writing, invoking, or subscribing
When NOT to Use
OPC Classic (OPC DA / OPC HDA) connections
PI Data Archive / PI AF / OSIsoft / AVEVA PI systems
Non-OPC UA protocols (Modbus, MQTT)
OPC UA server-side development
References
Load the relevant reference file for detailed procedures:
| Task | Reference |
|---|---|
| Server discovery, LDS setup, empty discovery results | references/lds-setup-and-troubleshooting.md |
| Server cert trust, client cert export, cert inspection | references/certificate-trust-workflows.md |
| Connection errors, server logs, diagnostic workflow | references/troubleshooting-connection-errors.md |
| Node navigation patterns, batch processing, method invocation | references/node-navigation.md |
| Function syntax for findNodeById, opcuanode, getNamespace | references/node-functions-reference.md |
| Syntax pitfalls and invalid API patterns | references/common-mistakes.md |
Workflow
0. Discover servers (optional)
Use this step when the endpoint URL is not known, or when the user explicitly asks to discover servers given a hostname or discovery URL. Skip this step if the endpoint URL is already known.
Prerequisites — before calling opcuaserverinfo, ensure:
The OPC UA Local Discovery Service (LDS) is installed and running
The target server is registered with the LDS
The server's certificate is trusted by the LDS certificate store at
C:\ProgramData\OPC Foundation\UA\pki\trusted\certs\
See references/lds-setup-and-troubleshooting.md for details.
% TEMPLATE — not executable (shows alternative discovery forms)
% LDS-based discovery (preferred — finds all registered servers)
serverInfo = opcuaserverinfo('localhost');
% Direct endpoint discovery (when you know the server URL)
serverInfo = opcuaserverinfo('opc.tcp://myserver:53530/OPCUA/SimulationServer');
% Pass discovery result directly to opcua()
uaClient = opcua(serverInfo(1));
connect(uaClient);1. Create the OPC UA client
serverUrl = "opc.tcp://hostname:port/path";
uaClient = opcua(serverUrl);The opcua function also accepts a ServerInfo object directly from
opcuaserverinfo.
2. Configure security (only if non-default needed)
% TEMPLATE — not executable (shows two alternative security-config forms)
% R2025a+ (preferred) — Name-Value pairs in constructor
uaClient = opcua(serverUrl, ...
MessageSecurityMode="Sign", ...
ChannelSecurityPolicy="Basic256Sha256");
% R2020a+ (backward-compatible) — setSecurityModel after construction
uaClient = opcua(serverUrl);
setSecurityModel(uaClient, "Sign", "Basic256Sha256");3. Handle certificate trust (if needed)
If the server's certificate is not yet trusted by MATLAB, the connection will fail. Follow the escalation order in Internal Constraints. Load references/certificate-trust-workflows.md for details.
4. Connect
connect(uaClient); % anonymous
connect(uaClient, "myuser", "mypassword"); % username/password
connect(uaClient, "cert.der", "key.pem", "keypass"); % certificate5. Verify connection
if isConnected(uaClient)
fprintf("Connected to %s\n", uaClient.EndpointUrl);
end6. Find nodes (once connected)
Load references/node-navigation.md for full decision logic, workflows, batch processing, and method invocation patterns.
7. Disconnect
disconnect(uaClient);Key Functions
| Function | Purpose | Available From |
|---|---|---|
opcuaserverinfo | Discover OPC UA servers via LDS or direct URL | R2015b |
opcua | Create OPC UA client (from URL or ServerInfo) | R2015b |
connect | Connect to server | R2015b |
disconnect | Disconnect from server | R2015b |
isConnected | Check connection status | R2015b |
setSecurityModel | Configure security mode/policy | R2020a |
opc.ua.exportClientCertificate | Export MATLAB client cert to file | R2020a |
opc.ua.trustServerCertificate | Trust a server cert (file path) | R2026a |
opc.ua.rejectServerCertificate | Reject a server cert (file path) | R2026a |
findDescription | Filter ServerInfo array by description text | R2015b |
findAuthentication | Filter ServerInfo array by auth type | R2015b |
findNodeById | Find node by namespace index and identifier (retains parent) | R2015b |
opcuanode | Create node directly from known NodeId (check Parent before invoke) | R2015b |
getNamespace | Get one layer of namespace tree (or use uaClient.Namespace) | R2015b |
Properties Quick Reference
opc.ua.Client
| Property | Type | Description |
|---|---|---|
Hostname | string | Server hostname |
Port | double | Server port |
Name | string | Client name |
EndpointUrl | string | Selected endpoint URL |
Status | string | Connection status |
Timeout | double | Connection timeout (seconds) |
MessageSecurityMode | enum | Active security mode |
ChannelSecurityPolicy | enum | Active channel policy |
UserAuthTypes | cell | Available auth types on server |
Endpoints | array | Available endpoint descriptions |
Does NOT have: UserName, Password, IsConnected, Security,
SecurityMode, SecurityPolicy, Certificate, PrivateKey.
Use isConnected(uaClient) (method) to check connection status.
opc.ua.ServerInfo
| Property | Type | Description |
|---|---|---|
Hostname | char | Host name |
Port | double | TCP port |
Description | char | Human-readable server description |
UserTokenTypes | cell | Supported auth types |
BestMessageSecurity | enum | Highest message security |
BestChannelSecurity | enum | Highest channel security policy |
Endpoints | array | opc.ua.EndpointDescription objects |
opc.ua.EndpointDescription
| Property | Type | Description |
|---|---|---|
EndpointUrl | char | Full endpoint URL |
MessageSecurityMode | enum | Security mode for this endpoint |
ChannelSecurityPolicy | enum | Channel security policy |
UserAuthTypes | cell | Auth types on this endpoint |
opc.ua.Node
| Property | Type | Description |
|---|---|---|
Name | char | Node display name |
NodeType | char | 'Object', 'Variable', 'Method', or 'Unknown' |
NamespaceIndex | double | Namespace index |
Identifier | varies | Node identifier (numeric or string) |
Children | array | Child nodes (lazy-loaded from server) |
Parent | node | Parent node (may be empty for opcuanode-created nodes; check before invoke) |
ServerDataType | char | Data type for Variable nodes |
NumInputs | double | Number of input arguments (Method nodes) |
NumOutputs | double | Number of output arguments (Method nodes) |
Patterns
Discovery
% TEMPLATE — not executable (shows discover-only vs discover-and-connect)
% Discover all servers via LDS
serverInfo = opcuaserverinfo('localhost');
% Discover and connect
serverInfo = opcuaserverinfo('localhost');
uaClient = opcua(serverInfo(1));
connect(uaClient);Connection with authentication
% Default (highest) security, anonymous
uaClient = opcua("opc.tcp://myserver:53530/OPCUA/SimulationServer");
connect(uaClient);
% Username/password
connect(uaClient, "myuser", "mypassword");
% User certificate
connect(uaClient, "C:/certs/user.der", "C:/certs/user.key", "keypassword");Hostname mismatch fix
% TEMPLATE — not executable (shows R2025a+ vs pre-R2025a forms)
% R2025a+
uaClient = opcua("opc.tcp://myserver:53530/OPCUA/SimulationServer", ...
UseDiscoveryHostname=true);
% Pre-R2025a — resolve via discovery
serverInfo = opcuaserverinfo("myserver");
uaClient = opcua(serverInfo(1));
connect(uaClient);Certificate inspection
Load references/certificate-trust-workflows.md, then run:
inspectOpcUaCertificate("path/to/server_cert.der");Navigate a browse path
ns = uaClient.Namespace;
idx = arrayfun(@(n) strcmp(n.Name, 'Demo'), ns);
level1 = ns(idx);
children = level1.Children;
idx = arrayfun(@(n) strcmp(n.Name, 'Mass'), children);
level2 = children(idx);Direct node lookup by NodeId
% TEMPLATE — not executable (shows two alternative lookup forms)
% Quick access from a known NodeId
node = opcuanode(3, 1002, uaClient);
% Always retains parent info
node = findNodeById(uaClient.Namespace, 3, 1002);Find and invoke a method node
invoke requires parent information. Before invoking, check the node's
Parent property — if it is empty, re-resolve the node via
findNodeById (or .Children navigation) so parent info is populated;
if it is non-empty, invoke directly.
methodNode = opcuanode(6, 'MyMethod', uaClient);
% Ensure parent info is present before invoking
if isempty(methodNode.Parent)
methodNode = findNodeById(uaClient.Namespace, 6, 'MyMethod');
end
% Verify argument count before calling invoke
fprintf("Inputs: %d, Outputs: %d\n", methodNode.NumInputs, methodNode.NumOutputs);
[result, timestamp, quality] = invoke(uaClient, methodNode, arg1, arg2);Troubleshooting Quick Reference
| Error | Fix |
|---|---|
opcuaserverinfo returns empty | Check LDS prerequisites; see references/lds-setup-and-troubleshooting.md |
| "Server certificate not trusted" | opc.ua.trustServerCertificate(certPath) |
| "Client certificate rejected" | Export via opc.ua.exportClientCertificate, add to server |
| "BadIdentityTokenRejected" | Check uaClient.UserAuthTypes |
| "Hostname mismatch" warning | UseDiscoveryHostname=true (R2025a+) |
| "BadSecurityChecksFailed" | Run inspectOpcUaCertificate; see references/troubleshooting-connection-errors.md |
NodeType: 'Unknown' after opcuanode | Node doesn't exist or path passed as id; use .Children traversal |
| "Specified node has no parent information" | Node's Parent is empty; re-resolve via findNodeById (or .Children) before invoke |
browseNamespace blocks session | Never use; replace with uaClient.Namespace + .Children |
For detailed error-to-fix mapping, load references/troubleshooting-connection-errors.md.
Copyright 2026 The MathWorks, Inc.
Files
- ATTRIBUTION.mdAdded by AutoGineer1.0 KiB
- LICENSELicence file added by AutoGineer1.4 KiB
- SKILL.md17.1 KiB
- manifest.yaml493 B
- references/certificate-trust-workflows.md5.7 KiB
- references/common-mistakes.md4.3 KiB
- references/lds-setup-and-troubleshooting.md4.8 KiB
- references/node-functions-reference.md7.2 KiB
- references/node-navigation.md7.7 KiB
- references/troubleshooting-connection-errors.md5.6 KiB
- scripts/inspectOpcUaCertificate.m7.0 KiB
scripts/inspectOpcUaCertificate.m
function inspectOpcUaCertificate(certFile)
%inspectOpcUaCertificate Check certificate for OPC UA Part 6 compliance.
% inspectOpcUaCertificate(certFile) inspects an OPC UA certificate (.der
% or .pem) and reports PASS/FAIL on Part 6 Section 6.2.2 fields: RSA key
% length, signature algorithm, key usage, Subject Alternative Name,
% validity, and Basic Constraints (end-entity).
%
% Uses openssl when available; falls back to Java's CertificateFactory
% when openssl is not on PATH.
%
% Example:
% inspectOpcUaCertificate("C:/certs/server_cert.der")
arguments
certFile (1, 1) string {mustBeFile}
end
if hasOpenssl()
inspectWithOpenssl(certFile);
elseif hasJava()
inspectWithJava(certFile);
else
error("inspectOpcUaCertificate:NoBackend", ...
"Neither openssl nor a Java X.509 API is available. " + ...
"Install openssl and ensure it is on PATH.");
end
end
function tf = hasOpenssl()
if ispc
cmd = "where openssl";
else
cmd = "command -v openssl";
end
[status, ~] = system(cmd);
tf = status == 0;
end
function tf = hasJava()
tf = usejava("jvm");
end
function inspectWithOpenssl(certFile)
[status, output] = system(sprintf( ...
'openssl x509 -in "%s" -inform DER -text -noout', certFile));
if status ~= 0
error("openssl failed: %s", output);
end
text = string(output);
fprintf("=== OPC UA Certificate Compliance (openssl) ===\n");
fprintf("File: %s\n", certFile);
fprintf("%s\n", extractField(text, "Subject:"));
fprintf("%s\n", extractField(text, "Issuer:"));
fprintf("Serial: %s\n", strtrim(extractField(text, "Serial Number:")));
fprintf("Not Before:%s\n", erase(extractField(text, "Not Before:"), "Not Before:"));
fprintf("Not After :%s\n", erase(extractField(text, "Not After :"), "Not After :"));
keyBitsTok = regexp(text, "Public-Key:\s*\((\d+)\s*bit\)", "tokens", "once");
if ~isempty(keyBitsTok)
keyLen = str2double(keyBitsTok{1});
fprintf("RSA Key Length: %d bits %s\n", keyLen, ...
ternary(keyLen >= 2048, "[PASS]", "[FAIL needs >=2048]"));
end
sigAlgTok = regexp(text, "Signature Algorithm:\s*(\S+)", "tokens", "once");
if ~isempty(sigAlgTok)
sigAlg = string(sigAlgTok{1});
isSha2Plus = contains(sigAlg, ["sha256", "sha384", "sha512"], ...
IgnoreCase=true);
fprintf("Signature: %s %s\n", sigAlg, ...
ternary(isSha2Plus, "[PASS]", "[FAIL needs SHA-256+]"));
end
kuTok = regexp(text, "X509v3 Key Usage:[^\n]*\n\s*([^\n]+)", ...
"tokens", "once");
if ~isempty(kuTok)
kuLine = string(kuTok{1});
hasDigSig = contains(kuLine, "Digital Signature");
hasNonRep = contains(kuLine, "Non Repudiation");
hasKeyEnc = contains(kuLine, "Key Encipherment");
hasDataEnc = contains(kuLine, "Data Encipherment");
allPresent = hasDigSig && hasNonRep && hasKeyEnc && hasDataEnc;
fprintf("Key Usage: DigSig=%d NonRep=%d KeyEnc=%d DataEnc=%d %s\n", ...
hasDigSig, hasNonRep, hasKeyEnc, hasDataEnc, ...
ternary(allPresent, "[PASS]", "[FAIL missing required bits]"));
else
fprintf("Key Usage: [FAIL extension missing]\n");
end
sanTok = regexp(text, ...
"X509v3 Subject Alternative Name:[^\n]*\n\s*([^\n]+)", ...
"tokens", "once");
if ~isempty(sanTok)
fprintf("Subject Alt Names: [PASS]\n %s\n", string(sanTok{1}));
else
fprintf("Subject Alt Names: [FAIL missing]\n");
end
bcTok = regexp(text, ...
"X509v3 Basic Constraints:[^\n]*\n\s*([^\n]+)", "tokens", "once");
if ~isempty(bcTok)
bcLine = string(bcTok{1});
isCa = contains(bcLine, "CA:TRUE");
fprintf("Basic Constraints: %s %s\n", strtrim(bcLine), ...
ternary(~isCa, "[PASS end-entity]", "[FAIL must be end-entity]"));
end
end
function value = extractField(text, label)
tok = regexp(text, label + "[^\n]*", "match", "once");
if isempty(tok)
value = label + " (not found)";
else
value = strtrim(string(tok));
end
end
function inspectWithJava(certFile)
fis = java.io.FileInputStream(certFile);
cleanup = onCleanup(@() fis.close());
cf = java.security.cert.CertificateFactory.getInstance("X.509");
cert = cf.generateCertificate(fis);
fprintf("=== OPC UA Certificate Compliance (Java fallback) ===\n");
fprintf("File: %s\n", certFile);
fprintf("Subject: %s\n", string(cert.getSubjectX500Principal()));
fprintf("Issuer: %s\n", string(cert.getIssuerX500Principal()));
fprintf("Serial: %s\n", string(cert.getSerialNumber().toString(16)));
fprintf("Not Before: %s\n", string(cert.getNotBefore()));
fprintf("Not After: %s\n", string(cert.getNotAfter()));
pubKey = cert.getPublicKey();
if isa(pubKey, "java.security.interfaces.RSAPublicKey")
keyLen = pubKey.getModulus().bitLength();
fprintf("RSA Key Length: %d bits %s\n", keyLen, ...
ternary(keyLen >= 2048, "[PASS]", "[FAIL needs >=2048]"));
else
fprintf("Public Key Algorithm: %s (non-RSA)\n", ...
string(pubKey.getAlgorithm()));
end
sigAlg = string(cert.getSigAlgName());
isSha2Plus = contains(sigAlg, ["SHA256", "SHA384", "SHA512"]);
fprintf("Signature: %s %s\n", sigAlg, ...
ternary(isSha2Plus, "[PASS]", "[FAIL needs SHA-256+]"));
ku = cert.getKeyUsage();
if ~isempty(ku)
hasDigSig = ku(1);
hasNonRep = ku(2);
hasKeyEnc = ku(3);
hasDataEnc = ku(4);
allPresent = hasDigSig && hasNonRep && hasKeyEnc && hasDataEnc;
fprintf("Key Usage: DigSig=%d NonRep=%d KeyEnc=%d DataEnc=%d %s\n", ...
hasDigSig, hasNonRep, hasKeyEnc, hasDataEnc, ...
ternary(allPresent, "[PASS]", "[FAIL missing required bits]"));
else
fprintf("Key Usage: [FAIL extension missing]\n");
end
try
san = cert.getSubjectAlternativeNames();
if isempty(san)
fprintf("Subject Alt Names: [FAIL missing]\n");
else
fprintf("Subject Alt Names: [PASS]\n");
it = san.iterator();
while it.hasNext()
entry = it.next();
typeId = entry.get(0);
value = entry.get(1);
fprintf(" type=%s value=%s\n", string(typeId), string(value));
end
end
catch ME
fprintf("Subject Alt Names: error reading (%s)\n", ME.message);
end
try
cert.checkValidity();
fprintf("Validity: [PASS]\n");
catch
fprintf("Validity: [FAIL expired or not yet valid]\n");
end
bc = cert.getBasicConstraints();
fprintf("Basic Constraints: CA=%s %s\n", ...
ternary(bc == -1, "false", "true (path len " + bc + ")"), ...
ternary(bc == -1, "[PASS end-entity]", "[FAIL must be end-entity]"));
end
function result = ternary(condition, trueVal, falseVal)
if condition
result = trueVal;
else
result = falseVal;
end
end
% 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.
Needs: Needs Node.js
Security
No issues found by our static scan· No issues found
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/test-and-measurement/matlab-use-opcua-client · 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-opcua-client.zip