{"name":"io.github.WagoAlex/wago-plc-mcp-server","slug":"wagoalex-wago-plc-mcp-server","title":"WAGO PLC","description":"Read and monitor WAGO PLC parameters over the WDA REST API. Read-only unless writes are allowed.","url":"https://mcp.market/server/wagoalex-wago-plc-mcp-server","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":24,"stars":3,"forks":1,"downloads_week":null,"last_push_at":"2026-09-30T10:36:19.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/WagoAlex/wago-plc-mcp-server","website":"https://github.com/WagoAlex/wago-plc-mcp-server","version":"2.4.4","remotes":[],"packages":[{"registryType":"pypi","identifier":"wago-plc-mcp-server","version":"2.4.4","runtimeHint":"uvx","transport":{"type":"stdio"},"environmentVariables":[{"description":"MCP transport. Fixed to stdio for this package.","isRequired":true,"value":"stdio","name":"TRANSPORT"},{"description":"Comma-separated IPs of the WAGO PLCs, reachable from this machine","isRequired":true,"placeholder":"192.168.1.10,192.168.1.11","name":"WAGO_PLC_HOSTS"},{"description":"WBM username on the PLCs","isRequired":true,"default":"admin","name":"DEFAULT_PLC_USERNAME"},{"description":"WBM password, same on all listed PLCs","isRequired":true,"isSecret":true,"name":"DEFAULT_PLC_PASSWORD"},{"description":"WDA request timeout. CC100 needs 45 or more, other controllers work with 15","format":"number","default":"45","name":"WAGO_TIMEOUT_SECONDS"},{"description":"true lets the agent change parameters, run methods and upload files. Anything else keeps every PLC read-only","isRequired":true,"format":"boolean","default":"false","choices":["false","true"],"name":"WAGO_ALLOW_WRITES"},{"description":"Optional path for the tamper-evident audit log of writes and refusals","format":"filepath","name":"AUDIT_LOG_FILE"}]},{"registryType":"oci","identifier":"docker.io/wagoalex/wago-plc-mcp-server:2.4.4","runtimeHint":"docker","transport":{"type":"stdio"},"runtimeArguments":[{"description":"PLC subnets are routed via the host network","value":"host","type":"named","name":"--network"}],"environmentVariables":[{"description":"MCP transport. Fixed to stdio for this package.","isRequired":true,"value":"stdio","name":"TRANSPORT"},{"description":"Comma-separated IPs of the WAGO PLCs, reachable from this machine","isRequired":true,"placeholder":"192.168.1.10,192.168.1.11","name":"WAGO_PLC_HOSTS"},{"description":"WBM username on the PLCs","isRequired":true,"default":"admin","name":"DEFAULT_PLC_USERNAME"},{"description":"WBM password, same on all listed PLCs","isRequired":true,"isSecret":true,"name":"DEFAULT_PLC_PASSWORD"},{"description":"WDA request timeout. CC100 needs 45 or more, other controllers work with 15","format":"number","default":"45","name":"WAGO_TIMEOUT_SECONDS"},{"description":"true lets the agent change parameters, run methods and upload files. Anything else keeps every PLC read-only","isRequired":true,"format":"boolean","default":"false","choices":["false","true"],"name":"WAGO_ALLOW_WRITES"},{"description":"Optional path for the tamper-evident audit log of writes and refusals","format":"filepath","name":"AUDIT_LOG_FILE"}]}],"tools":[{"name":"create_file","description":"Allocate a file_id for uploading content into a file_id-typed parameter.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_watchlist","description":"Create a server-side watchlist of parameters for efficient repeated polling.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_method_run","description":"Free a server-side run result before it expires on its own. Optional housekeeping, not required for correctness.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_watchlist","description":"Delete a watchlist to free server resources before timeout.","write_action":true,"price_micros":0,"input_schema":null},{"name":"describe_plc","description":"Get capability summary for a PLC: counts + feature names. Cheap, cached.","write_action":false,"price_micros":0,"input_schema":null},{"name":"download_file","description":"Download a file's content as base64. Pairs with a parameter whose dataType is file_id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_methods","description":"Search method IDs by substring/fuzzy match. Returns up to `limit` matches (default 20).","write_action":false,"price_micros":0,"input_schema":null},{"name":"find_parameters","description":"Search parameter IDs by substring/fuzzy match. Returns up to `limit` matches (default 20, max 255).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_device","description":"Get a device resource plus the features it exposes (one call).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_enum_definition","description":"Get an enum definition's cases (value → stringValue). Useful to inspect an enum's full case list directly.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_feature","description":"Get a feature plus its composition: nested features, contained parameter/method definitions (one call).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_file_metadata","description":"HEAD a file_id — size/content-type without downloading the body.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_method","description":"Get method metadata with inline inArgs/outArgs signatures. One call gives the full schema needed for invoke_method.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_method_run","description":"Poll an async method run. Use after invoke_method(wait=False) to check status.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_parameter","description":"Read a single parameter value. Resolves enum values to human-readable labels.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_parameter_definition","description":"Get a parameter's definition: writeable, userSetting, dataType, related enum — without reading its value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_parameter_instance","description":"Get one class-parameter instance: its device, own parameters, and methods (one call).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_parameter_referenced_instances","description":"For an instance_identity_ref-typed parameter: the class instances that reference it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_parameters_bulk","description":"Read one parameter from multiple PLCs in parallel — one call instead of N.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_plc_audit_log","description":"Return recent audit log entries, newest first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"invoke_method","description":"Invoke a method. Pass `arguments` as a flat dict {name: value}.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_method_runs","description":"List past runs of a method still held server-side (audit/inspection use).","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_parameter_instances","description":"List instance numbers of a class-typed parameter (dataType 'instantiations'). Use get_parameter_instance for detail.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_plcs","description":"List all reachable WAGO PLCs. Use first to find a target IP.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_watchlists","description":"List watchlist IDs still active server-side (e.g. after a restart, to find orphans).","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_watchlist","description":"Read current values from an existing watchlist. Resets the timeout.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_parameter","description":"Write a single parameter. Prefer set_parameters for more than one — same PATCH-per-call cost either way.","write_action":true,"price_micros":0,"input_schema":null},{"name":"set_parameters","description":"Write multiple parameters in one PATCH call. Pre-validates writeability from cache.","write_action":true,"price_micros":0,"input_schema":null},{"name":"upload_file","description":"Upload whole file content (base64-encoded) to a file_id from create_file.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-10-02T22:41:48.678Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-02T22:41:48.638Z","components":{"code":{"score":25,"max":25,"notes":["13 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"wago-plc-mcp-server","version":"2.4.4","found":true,"dependencyCount":6,"publishedAt":"2026-09-21T12:19:25.721265Z","repositoryUrl":"https://github.com/WagoAlex/wago-plc-mcp-server"}],"repo":{"found":true,"owner":"WagoAlex","repo":"wago-plc-mcp-server","archived":false,"pushedAt":"2026-09-30T10:36:19Z","stars":3,"forks":1,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/40886443?v=4","ownerCreatedAt":"2018-07-06T09:05:38Z","license":"NOASSERTION"},"icon":{"url":"https://avatars.githubusercontent.com/u/40886443?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":3,"forks":1,"downloadsWeek":null,"license":"NOASSERTION","lastPushAt":"2026-09-30T10:36:19.000Z","score":24}}}},"grade_history":[],"reviews":[]}