{"name":"io.github.asqi-carter/ftx-mcp","slug":"asqi-carter-ftx-mcp","title":"FTX MCP — FactoryTalk Optix MCP Server","description":"MCP server for FactoryTalk Optix: author, preview, and verify Studio changes via the emulator.","url":"https://mcp.market/server/asqi-carter-ftx-mcp","rating":null,"grade":"A","score":92,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":35,"stars":18,"forks":6,"downloads_week":41,"last_push_at":"2026-10-15T20:36:52.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/asqi-carter/ftx-mcp","website":null,"version":"1.0.9","remotes":[],"packages":[{"registryType":"pypi","identifier":"ftx-mcp","version":"1.0.9","transport":{"type":"streamable-http","url":"http://127.0.0.1:8766/mcp"}}],"tools":[{"name":"_wrapper","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_active_target","description":"Which deployment target Studio's dropdown has selected — the thing an F5 (optix_emulator action=\"run\") would actually run.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_add_model_variable","description":"Author an edit adding a read+write variable to Model — does NOT deploy.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_add_widget","description":"Author an edit that adds widget(s) to a screen — does NOT deploy.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_add_bound_widget","description":"Create a widget, position it, and bind one property — in ONE call.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_add_label","description":"Add a Label with text (+ optional position) in ONE call via the live bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_add_navigation_panel_item","description":"Add a tab to a NavigationPanel in ONE call: create the item (auto- routed into Panels), set its Title, and point it at a screen.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_add_translation","description":"Add or update a translation for a LocalizedText key via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_add_translations","description":"Add (or overwrite) SEVERAL translation rows in one call via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_arm","description":"Arm or stop the design-time bridge for a project WITHOUT a human at the keyboard — ONE tool, pick an `action`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_attach_expression","description":"Attach an ExpressionEvaluator converter to a property via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_attach_formatter","description":"Attach a FORMATTED DYNAMIC LINK to a property via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_bind_property","description":"Bind a node's property to a model variable (DynamicLink) via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_convert_to_type","description":"Convert a LIVE instance into a reusable ObjectType — Studio's right-click \"Convert to Type\" refactor, which has no public API.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_alias","description":"Create an alias under a node — the parameter slot of a reusable component/template.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_folder","description":"Create a structural FOLDER in the LIVE model via the design-time bridge.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_netlogic","description":"Register a NetLogic (C#) node in the LIVE model via the bridge — the authoring step that used to require Studio's \"New -> NetLogic\" menu.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_object","description":"Create a plain OBJECT container — or an INSTANCE of a custom type — in the LIVE model via the design-time bridge.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_type","description":"Create an OBJECT TYPE (reusable template) in the LIVE model.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_variable","description":"Create a model variable in the LIVE model via the design-time bridge.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_create_widget","description":"Create a UI widget on a screen in the LIVE model via the bridge.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_delete_node","description":"Delete a node from the live model via the bridge.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_edit","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_ensure_web_engine","description":"Ensure a Web presentation engine exists so the runtime serves a canvas.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_import_tags","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_invoke_method","description":"Execute an exported UAMethod on a live-model object via the bridge.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_log_tail","description":"Tail the design-time bridge's transport diagnostics — the forensic trail for bridge drops/timeouts (why did :8768 go unreachable?).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_move_node","description":"MOVE (reparent) a live instance to a new parent — e.g. an existing column of widgets into a freshly-created ScrollView.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_remove_translation","description":"NOT SUPPORTED: the Optix SDK cannot remove a translation row.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_bridge_reorder","description":"Change a node's z-order among its siblings via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_retype","description":"Change an existing VARIABLE's DataType in place via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_set_modelling_rule","description":"Set the ModellingRule of a TYPE MEMBER via the bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_set_property","description":"Set a property on a LIVE-model node via the design-time bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_set_text_key","description":"Set a text property to a TRANSLATION KEY (LocalizedText with a TextId).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_status","description":"Status of the design-time read-bridge(s) (NetLogic HTTP listener(s) in Studio).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_validate_expression","description":"Syntax-check an ExpressionEvaluator formula WITHOUT attaching it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_bridge_wire_event","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_build_check","description":"Compile the project's NetSolution C# and report errors — a safe pre-flight that never touches Studio's build or runs the emulator.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_click","description":"Click (x, y) on the Optix runtime canvas via CDP — the RELIABLE path.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_diff","description":"Compare two optix_cdp_sweep capture directories screen-by-screen — a visual regression check, no CDP session needed (pure file comparison).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_fill","description":"Update a field on the running HMI in ONE call: click (x, y), type `text`, commit with `submit` (default Enter — values don't stick without it).","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_cdp_find_text","description":"Locate `text` on the runtime canvas via tesseract word boxes — to find a labeled control to click, or to build a navigation route.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_key","description":"Press one named key on the running Optix HMI (CDP dispatchKeyEvent, keyDown+keyUp).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_navigate","description":"Zero-screenshot navigation to a banked screen: replays a sequence of clicks from a routes JSON file instead of screenshot -> locate -> click, click again.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_ocr","description":"OCR the runtime canvas via tesseract — an OPT-IN, text-only read-back.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_read_text","description":"OCR a region of the runtime canvas via tesseract — THE cheap check for \"does the screen/widget say X\" — zero vision tokens.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_restart","description":"Recover the chrome-cdp instance that screenshot/click drive.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_screenshot","description":"Screenshot the running Optix HMI (emulator or deployed runtime) via CDP — THE way to visually verify a change.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_sweep","description":"Capture a full-frame screenshot (+ OCR text, if tesseract is installed) of every route in a banked routes file, in ONE CDP session — builds the visual baseline optix_cdp_diff compares against.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_cdp_type","description":"Type a string into the focused field on the running Optix HMI (CDP Input.insertText).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_deploy","description":"Apply edits and deploy via FTOptixStudio export -> tree swap -> runtime bounce (v0.2.x).","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_deploy_preflight","description":"Run every deploy precondition without launching Studio.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_deploy_updatesvc","description":"Deploy a saved project via the FT Optix Application Update Service.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_describe_node","description":"Introspect one node in the LIVE model via the design-time bridge.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_describe_type","description":"Property schema of a builtin UI type from the LIVE model — the \"shape\" of a control (which properties it has, their datatypes), so an edit can be composed against the real schema instead of guessed YAML. `type_name` is a catalog name from optix_list_ui_types (e.g. \"Label\", \"Button\"). Bridge-only (else `bridge_unavailable`); `node_not_found` for an unknown type.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_emulator","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_execute_method","description":"Right-click -> Execute a design-time [ExportMethod] on a NetLogic node, WITHOUT a human at the keyboard.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_find","description":"Search a project's text files for a literal string — server-side.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_get_project_map","description":"Component map of the project (names + nesting) in ONE call — the cheap way to learn structure instead of walking it with repeated optix_describe_node.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_get_skill","description":"Full content of one bundled playbook by name (from optix_list_skills).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_interact","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_list_projects","description":"List Optix projects under OPTIX_PROJECTS_ROOT. You RARELY need this: every project-scoped tool defaults to the project open in Studio when `project` is omitted.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_list_screens","description":"List the Screen / Panel / Dialog nodes in a project's UI — the starting point for any UI edit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_list_skills","description":"Catalog of the bundled authoring playbooks — one line each (proven recipes for navigation, bound controls, styles, expressions, alarms). Scan for a matching pattern, then optix_get_skill(name) for just that one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_list_ui_types","description":"List the builtin UI type catalog from the LIVE model — \"what controls exist?\" (Label, Button, Rectangle, Panel, DataGrid, Trend, …), read from Studio's type system, not guessed. Bridge-only (else `bridge_unavailable`). Pair with optix_describe_type for a type's property schema.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_observe","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_project","description":"Studio project lifecycle via its CLI — ONE tool, pick an `action`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_read_file","description":"Read a UTF-8 file under an Optix project, optionally a line range.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_read_netlogic","description":"Read a NetLogic C# source file by class name from ProjectFiles/NetSolution.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_routes","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_runtime_start","description":"Launch FTOptixRuntime against the swapped runtime tree for `project`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_runtime_status","description":"Probe a runtime instance's reachability.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_runtime_stop","description":"Stop FTOptixRuntime processes attached to `project`'s runtime tree.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_save","description":"Persist the open project to disk (sends Ctrl+S to Studio).","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_schema","description":"Studio type-schema operations — ONE tool, pick an `action`. Consolidates the optix_schema_dump / _list / _diff family (each formerly its own tool); replaced cleanly, no deprecated aliases.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_set_property","description":"Author a find/replace edit changing one inline property — no deploy.","write_action":false,"price_micros":0,"input_schema":null},{"name":"optix_status","description":"Deploy-stack status family — ONE tool, pick an `action`. Consolidates optix_health / optix_doctor / optix_services_status / optix_studio_version (each formerly its own tool); replaced cleanly, no deprecated aliases.","write_action":true,"price_micros":0,"input_schema":null},{"name":"optix_studio_log","description":"Tail Studio's own log, FTOptixStudio.0.log — the only place Studio reports that it REJECTED an optix_execute_method call (which optix_execute_method now surfaces itself as state=\"rejected\").","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":92,"grade":"A","scanned_at":"2026-10-31T17:28:10.008Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-31T17:28:09.966Z","components":{"code":{"score":25,"max":25,"notes":["25 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":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 16 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":"ftx-mcp","version":"1.0.9","found":true,"weeklyDownloads":41,"license":"MIT","dependencyCount":15,"publishedAt":"2026-10-15T20:39:43.101785Z","repositoryUrl":"https://github.com/asqi-carter/ftx-mcp"}],"repo":{"found":true,"owner":"asqi-carter","repo":"ftx-mcp","archived":false,"pushedAt":"2026-10-15T20:36:52Z","stars":18,"forks":6,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/213105644?v=4","ownerCreatedAt":"2025-05-23T17:46:45Z","license":"NOASSERTION"},"icon":{"url":"https://avatars.githubusercontent.com/u/213105644?v=4&s=128","source":"registry","width":128,"height":128},"presence":{"stars":18,"forks":6,"downloadsWeek":41,"license":"NOASSERTION","lastPushAt":"2026-10-15T20:36:52.000Z","score":35}}}},"grade_history":[],"reviews":[]}