OPC-UA MCP Server

السجل الرسمي البحث والويب

Read, write, browse, search, and subscribe to live data on an OPC-UA industrial automation server.

ماذا يمكنك أن تفعل مع OPC-UA MCP Server؟

  • Read / write node values, with type validation on writes so a
  • Browse the address space one level at a time or recursively, and look
  • Subscribe to push-based live updates - subscriptions persist across
  • Cache reads, browse results, and type info on disk (bbolt), so repeat
  • Discover and search the address space in the background, indexed with
  • Anonymous, username/password, or certificate auth, with configurable

التثبيت

أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: ‏.cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).

OCI package ghcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4
Claude Code
claude mcp add opc-ua-mcp-server -e 'OPCUA_ENDPOINT=opc.tcp://localhost:4840' -e 'OPCUA_AUTH_MODE=anonymous' -e 'OPCUA_USERNAME=<OPCUA_USERNAME>' -e 'OPCUA_PASSWORD=<your opcua_password>' -e 'OPCUA_SECURITY_POLICY=None' -e 'OPCUA_SECURITY_MODE=None' -e 'SERVER_TRANSPORT=stdio' -- docker run -i --rm ghcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4
إعداد JSON (Claude Desktop وCursor وVS Code)
{
    "mcpServers": {
        "opc-ua-mcp-server": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "ghcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4"
            ],
            "env": {
                "OPCUA_ENDPOINT": "opc.tcp://localhost:4840",
                "OPCUA_AUTH_MODE": "anonymous",
                "OPCUA_USERNAME": "<OPCUA_USERNAME>",
                "OPCUA_PASSWORD": "<your opcua_password>",
                "OPCUA_SECURITY_POLICY": "None",
                "OPCUA_SECURITY_MODE": "None",
                "SERVER_TRANSPORT": "stdio"
            }
        }
    }
}

متغيرات البيئة

  • OPCUA_ENDPOINT إلزامي OPC-UA server endpoint to connect to, e.g. opc.tcp://your-plc-host:4840
  • OPCUA_AUTH_MODE Authentication mode against the OPC-UA server
  • OPCUA_USERNAME Username, required if OPCUA_AUTH_MODE=username
  • OPCUA_PASSWORD سري Password, required if OPCUA_AUTH_MODE=username
  • OPCUA_SECURITY_POLICY OPC-UA transport security policy, e.g. Basic256Sha256
  • OPCUA_SECURITY_MODE OPC-UA transport security mode, e.g. SignAndEncrypt
  • SERVER_TRANSPORT MCP transport: stdio (for local MCP clients) or http (for remote/hosted deployments)

التوثيق

مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.

المحتويات
  1. OPC-UA MCP Server
  2. Quick start
  3. What it does
  4. MCP tools
  5. MCP resources
  6. Configuration
  7. Telemetry
  8. Docker
  9. Development
  10. Contributing
  11. License

OPC-UA MCP Server

An MCP server that lets an LLM read, write, browse, search, and subscribe to live data on an OPC-UA industrial automation server - over stdio or HTTP, with a persistent cache and a searchable index of the address space built in.

https://github.com/user-attachments/assets/0b676e6e-17ce-42f5-918f-9a615e939008

Quick start

The fastest way to see it working end-to-end, using the bundled Microsoft OPC-UA test server and a public tunnel Claude can reach:

git clone https://github.com/mwieczorkiewicz/opcua-mcp.git
cd opcua-mcp
make compose-up        # starts a test OPC-UA server, opcua-mcp, and a public HTTPS tunnel
make connector-url      # prints a URL like https://xyz.trycloudflare.com/mcp

Paste that URL into Claude at Settings → Connectors → Add custom connector, then ask it to browse the server or read a value. Stop with make compose-down when you're done - see docs/deployment.md for what that tunnel exposes and how to run against your own OPC-UA server instead.

Building and running locally
go build -o opcua-mcp ./cmd/opcua-mcp.go

# stdio (default) - no OPC-UA connection until the client calls opcua_connect
./opcua-mcp

# HTTP - connects eagerly at startup
SERVER_TRANSPORT=http OPCUA_ENDPOINT=opc.tcp://localhost:4840 ./opcua-mcp

Requires Go 1.26+ and, optionally, Docker for the test server / containerized deployment.

What it does

  • Read / write node values, with type validation on writes so a mismatched value is rejected before it reaches the device.
  • Browse the address space one level at a time or recursively, and look nodes up by name instead of by node ID.
  • Subscribe to push-based live updates - subscriptions persist across restarts and are automatically re-established on reconnect.
  • Cache reads, browse results, and type info on disk (bbolt), so repeat lookups don't round-trip to the device; writes invalidate the relevant entry automatically.
  • Discover and search the address space in the background, indexed with Bleve for fuzzy/partial browse-name lookups.
  • Anonymous, username/password, or certificate auth, with configurable OPC-UA security policy and mode.

See docs/architecture.md for how the caching layer, subscription manager, and discovery index fit together.

MCP tools

ToolDescription
opcua_readRead one or more node values. Subscribed nodes are served from the live cache; others go live unless max_age_ms allows a cached value.
opcua_writeWrite a value to a node. Validates the value's type against the node before writing.
opcua_get_valueRead a single node's value - a convenience wrapper over opcua_read.
opcua_get_value_by_nameRead a value by browse name instead of node ID, via the discovery index.
opcua_browseList a node's immediate children.
opcua_browse_nodesRecursively browse from a node up to a depth limit, nesting children under their parent.
opcua_node_infoGet a node's metadata (data type, access level, etc.).
opcua_find_similar_nodesFuzzy-match browse names against the discovery index.
opcua_subscribeStart push-based updates for one or more nodes at a given interval.
opcua_unsubscribeCancel a subscription, by ID or by naming one of its nodes.
opcua_list_subscriptionsList active subscriptions.
opcua_connect / opcua_disconnectManage the connection explicitly (mainly relevant in stdio mode).
opcua_server_infoGet OPC-UA server metadata.
opcua_discovery_statsStats on the background discovery cache (node count, depth distribution, enabled flags).
opcua_force_discoveryTrigger an immediate discovery refresh instead of waiting for the next cycle.
opcua_debug_search / opcua_ensure_server_nodesDiagnostics for troubleshooting why a node isn't showing up in search.

MCP resources

ResourceDescription
opcua://node/{node_id}Node data, e.g. opcua://node/ns=2;i=1. Accepts a comma-separated list for multiple nodes.
opcua://serverOPC-UA server information.

Configuration

Configuration is loaded (via viper) from three sources, in ascending order of precedence:

  1. Built-in defaults (shown in the tables below).
  2. An optional config file - TOML, YAML, JSON, or any other format viper supports. By default ./config.{yaml,yml,toml,json,...} is read if present; point at an explicit path with CONFIG_FILE=/path/to/config.toml. A config file is entirely optional - env vars alone are still enough.
  3. Environment variables (SERVER_*, OPCUA_*, MCP_*, SEARCH_*, STORE_*) - always win over the config file, so existing env-var-only deployments keep working unchanged.

A config file mirrors the env var names, lowercased and nested under each prefix, e.g. SERVER_HTTP_PORT becomes:

server:
  http_port: "8080"
Server
VariableDefaultDescription
SERVER_TRANSPORTstdiostdio or http
SERVER_HTTP_PORT8080Port for HTTP transport
SERVER_LOG_LEVELinfodebug, info, warn, error
SERVER_LOG_FORMATjsonjson or text
SERVER_LOG_OUTPUTstdoutstdout, stderr, or file (forced to stderr in stdio mode, since stdout carries the MCP stream)
SERVER_LOG_FILE-Log file path, required if SERVER_LOG_OUTPUT=file
SERVER_LOG_ADD_SOURCEfalseAdd source file/line to log entries
OPC-UA connection
VariableDefaultDescription
OPCUA_ENDPOINTopc.tcp://localhost:4840Server endpoint
OPCUA_AUTH_MODEanonymousanonymous, username, or certificate
OPCUA_USERNAME / OPCUA_PASSWORD-Required if AUTH_MODE=username
OPCUA_CERT_FILE / OPCUA_KEY_FILE-Required if AUTH_MODE=certificate
OPCUA_SERVER_CERT-Server certificate file path
OPCUA_SECURITY_POLICYNoneNone, Basic128Rsa15, Basic256, Basic256Sha256, Aes128_Sha256_RsaOaep
OPCUA_SECURITY_MODENoneNone, Sign, SignAndEncrypt
OPCUA_REQUEST_TIMEOUT30sPer-request timeout
OPCUA_SESSION_TIMEOUT60sSession timeout
OPCUA_MAX_RETRIES3Connection retry attempts
OPCUA_RETRY_DELAY1sDelay between retries
MCP
VariableDefaultDescription
MCP_NAMEOPC-UA MCP ServerServer name reported to clients
MCP_VERSION1.0.0Server version reported to clients
MCP_ENABLE_TOOLStrueEnable tools
MCP_ENABLE_RESOURCEStrueEnable resources
MCP_ENABLE_PROMPTSfalseEnable prompts
MCP_HTTP_PATH/mcpHTTP endpoint path
VariableDefaultDescription
SEARCH_ENABLE_DISCOVERYtrueEnable background node discovery
SEARCH_DISCOVERY_INTERVAL30sHow often to re-crawl the address space
SEARCH_DISCOVERY_ROOT_NODEi=85Root node to crawl from (Objects folder)
SEARCH_MAX_DISCOVERY_DEPTH10Maximum crawl depth
SEARCH_MAX_NODES_PER_BROWSE10000Cap on nodes returned per browse call
SEARCH_ENABLE_SEARCHtrueEnable the Bleve search index
SEARCH_INDEX_PATH./search_indexSearch index directory
SEARCH_MAX_RESULTS100Max results per search
SEARCH_MIN_SCORE0.1Minimum match score
SEARCH_ENABLE_CACHEtrueMaster switch for read-through caching. false makes every opcua_read/opcua_write/opcua_browse_nodes call go live, matching pre-cache behavior exactly
Persistent store

Backs read-through caching and subscription persistence with an on-disk bbolt database.

VariableDefaultDescription
STORE_DB_PATHmcp_opcua_store.dbDatabase file path
STORE_OPEN_TIMEOUT5sHow long to wait for the file lock on open
STORE_TYPEINFO_TTL24hFreshness window for cached type info
STORE_BROWSE_TTL5mFreshness window for cached browse results
STORE_BATCH_WINDOW25msHow often subscription notifications flush to the store
STORE_BATCH_MAX_ITEMS250Max notifications flushed per batch
STORE_NOTIFY_CHAN_BUFFER1024Buffer size for incoming subscription notifications

If the store fails to open (e.g. a stale lock from a prior ungraceful shutdown, or a read-only filesystem), the server logs a warning and keeps running with caching forced off and subscription tools returning an error - every other tool is unaffected.

Telemetry

opcua-mcp collects anonymous, aggregate usage telemetry (which tools get used, cache hit rate, error categories - never node IDs, endpoint URLs, node values, or credentials) to help prioritize maintenance of this open-source project. It's on by default; see docs/telemetry.md for exactly what is and isn't collected.

Opt out with either:

VariableEffect
DO_NOT_TRACK=1The cross-project community convention (consoledonottrack.com)
OPCUA_MCP_TELEMETRY=falseThis project's own switch

Docker

docker build -t opcua-mcp .
docker run -p 8080:8080 -e SERVER_TRANSPORT=http -e OPCUA_ENDPOINT=opc.tcp://your-server:4840 opcua-mcp

Multi-stage build on Chainguard's minimal Go image, running from scratch - no shell, small attack surface. Mount ./search_index and ./mcp_opcua_store.db as volumes to persist discovery/cache/subscription state across restarts. Full auth-mode examples, the Compose dev stack, and the Claude-connector tunnel setup are in docs/deployment.md.

Development

make start-opcua-server      # Microsoft OPC-UA test server in Docker
make run-with-test-server    # run the app against it (auto start/stop)

go test ./...                # unit tests
go test -race ./...
make test-integration        # real Subscribe/reconnect/cache behavior via testcontainers-go (needs Docker)

VS Code launch configs are in .vscode/launch.example.json - copy to .vscode/launch.json to get stdio/HTTP/auth debug targets that start and stop the test server automatically. make help lists every available target.

Tests are table-driven and mock the OPC-UA client at the opcuaClient interface seam (internal/opcua/mock_client_test.go) rather than against a live/simulated server - see docs/architecture.md for how the pieces being tested fit together, and docs/COMMIT_CONVENTION.md for this repo's commit message format.

Contributing

Fork it, make your changes, open a PR - see CONTRIBUTING.md.

License

MIT

الأسئلة الشائعة

ما هو OPC-UA MCP Server؟

Read, write, browse, search, and subscribe to live data on an OPC-UA industrial automation server.

كيف أثبّت OPC-UA MCP Server؟

يعمل على جهازك. في Claude Code: claude mcp add opc-ua-mcp-server -e 'OPCUA_ENDPOINT=opc.tcp://localhost:4840' -e 'OPCUA_AUTH_MODE=anonymous' -e 'OPCUA_USERNAME=<OPCUA_USERNAME>' -e 'OPCUA_PASSWORD=<your opcua_password>' -e 'OPCUA_SECURITY_POLICY=None' -e 'OPCUA_SECURITY_MODE=None' -e 'SERVER_TRANSPORT=stdio' -- docker run -i --rm ghcr.io/mwieczorkiewicz/opcua-mcp:main-29734c4. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.

هل يحتاج OPC-UA MCP Server إلى مفتاح API؟

نعم. يتطلب OPCUA_ENDPOINT, OPCUA_PASSWORD، وتضبطها في إعداداته.

هل OPC-UA MCP Server مفتوح المصدر؟

نعم. شيفرته متاحة على GitHub بترخيص MIT.

من يصون OPC-UA MCP Server؟

ينشره mwieczorkiewicz. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.

من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.