diff --git a/Plugins/BlueprintMCP/LICENSE.txt b/Plugins/BlueprintMCP/LICENSE.txt new file mode 100644 index 00000000..c52ca1d5 --- /dev/null +++ b/Plugins/BlueprintMCP/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 BlueprintMCP Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Plugins/BlueprintMCP/README.md b/Plugins/BlueprintMCP/README.md new file mode 100644 index 00000000..2f1d7fa7 --- /dev/null +++ b/Plugins/BlueprintMCP/README.md @@ -0,0 +1,72 @@ += History + +This plugin was originally vibe-coded by Claude Code. It +was then posted to David Gundry's github account, here: + + https://github.com/mirno-ehf/ue5-mcp + +He released it under the MIT license. + +How do I know it was vibe coded? Because he says so: + +> For Humans: +> +> You're welcome here, but probably not in the way you'd +> expect. This project is built and maintained entirely by +> AI coding agents — Claude Code, Cursor, Copilot Workspace, +> and the like. We don't accept human-written code or +> human-opened issues. + +Huh, interesting. I (Josh Yelon) downloaded the code, and +evaluated it. I was curious what vibe coding could do. +Here's what I found: + +* The code, overall, had issues, but in the end, it wasn't +that bad. It did work, mostly - and that matters. I wanted +my own working MCP server, and starting from a place where +you have working code is a lot easier than starting from +a blank slate. + +* Claude really doesn't build any mechanisms to enforce +consistency. For example: there were all the handlers, and +then in a different file, declarations of all the handlers, +then in another file registrations of all the handlers with +the webserver, then in another place a list of all the +handlers that require undo support, then in an entirely +other directory, a list of all the handlers and their +parameters. If any of these lists got out of sync, it would +break. + +* Claude doesn't seem to care at all about extra layers upon +layers, or about dependencies. Rather than building an MCP +server in an unreal plugin, it built a *web* server in an +unreal plugin, then built an MCP-to-web translation program +in *javascript*. Requests to the server were getting +translated from json into URL parameters and then back into +json. Ouch. The javascript required installation of about +a thousand javascript libraries, some of which were not easy +to install. Why not just build an MCP server in the Unreal +plugin directly, skipping all the dependencies and +translation layers? + +* Claude will repeat code over and over. I found endless +places where there were 10 copies of the same function, with +trivial variations, that could have all been merged into one +function with a parameter or two. When it does repeat code, +the repetitions are not generally consistent with each other: +one variant might have a bug, whereas another is fine. + +* There were lots of little edge-case bugs throughout the +code. Claude is actually not bad about noticing edge cases, +but it misses some. + +Despite all this, it was much easier to start from something +than to start from nothing. + +So, I undertook a massive refactoring effort. I did use +Claude Code extensively - in fact, I'd say Claude did 70% of +the work. But I monitored every step, and constantly pushed +Claude hard to use better software engineering practices. + +The result, I think, is a pretty clean MCP server. + diff --git a/Plugins/BlueprintMCP/endpoint-rename-plan.md b/Plugins/BlueprintMCP/endpoint-rename-plan.md deleted file mode 100644 index d6feca04..00000000 --- a/Plugins/BlueprintMCP/endpoint-rename-plan.md +++ /dev/null @@ -1,206 +0,0 @@ -# BlueprintMCP Endpoint Naming Plan - -Convention: every endpoint is `verb_noun`. Names should be descriptive enough that you can guess what the endpoint does without reading documentation. Verbs: -- **dump** — return the entire contents of a single object (blueprint, graph, material, etc.) -- **list** — enumerate assets or sub-elements from the asset registry (cheap, no loading) -- **search** — deep search that loads assets, inspects their contents, and returns matches -- **find** — look up references or locate specific items by criteria -- **create** — make a new asset/graph/struct/enum -- **add** — add a sub-element to an existing thing (variable, component, parameter, etc.) -- **remove/delete** — remove a sub-element or asset -- **set/change** — change a property value or type -- **rename** — rename something -- **connect/disconnect** — wire/unwire pins -- **validate/compile** — compile and report errors -- **snapshot/diff/restore** — capture, compare, and restore graph state - -## Blueprint — Read/Query - -| Current | Proposed | Description | -|---------|----------|-------------| -| `list` | `list_blueprint_assets` | List all blueprint and level blueprint assets from the asset registry (no loading). Optional `query` filters by name/path substring. Optional `parentClass` filters by parent class name. Returns name, path, and parent class for each. | -| `blueprint` | `dump_blueprint` | Load one blueprint by name and dump everything: variables, graph list, interfaces, and parent class. | -| `graph` | `dump_blueprint_graph` | Load one graph by blueprint name + graph name. Dumps all nodes with their pins, connections, positions, and metadata. | -| `search` | `search_within_blueprints` | Deep search: loads every blueprint, iterates all graphs/nodes, and finds nodes whose title, function name, event name, or variable name matches the query. Returns blueprint, graph, and node info for each match. | -| `references` | `find_asset_references` | Given an asset path, queries the asset registry for all packages that reference it. Separates results into blueprint referencers and other referencers. | -| `search_by_type` | `search_type_usage_in_blueprints` | Deep search: loads every blueprint and finds variables, function parameters, and pin types that use a given type name (struct, class, or enum). Returns usage location and context for each match. | -| `get_pin_info` | `get_pin_details` | Get detailed type and connection info for a specific pin (by blueprint, nodeId, pinName). | -| `check_pin_compatibility` | `check_pin_connection_compatibility` | Check whether two specific pins (source and target) can be connected. Returns compatibility and any error message. | -| `test_save` | `test_save_blueprint_package` | Diagnostic: load a blueprint and save its package with no modifications, to verify the save pipeline works. | - -## Blueprint — Discovery (Unreal reflection) - -| Current | Proposed | Description | -|---------|----------|-------------| -| `list_classes` | `search_unreal_classes` | Search all UClasses in the engine. Optional `query` filters by class name substring. Optional `parentClass` restricts to subclasses. Returns class name, path, parent, and flags. | -| `list_functions` | `list_class_functions` | List all UFunctions on a given class. Optional `query` filters by function name substring. Returns name, parameters, return type, and flags for each. | -| `list_properties` | `list_class_properties` | List all UProperties on a given class. Optional `query` filters by property name substring. Returns name, type, flags, and metadata for each. | - -## Blueprint — Validation - -| Current | Proposed | Description | -|---------|----------|-------------| -| `validate_blueprint` | `compile_blueprint` | Compile one blueprint and report any errors/warnings with graph, node, and message details. | -| `validate_all_blueprints` | `compile_all_blueprints` | Compile all blueprints (optional `query` to filter which ones). Returns per-blueprint pass/fail with error details. Supports pagination. | - -## Blueprint — Creation/Structure - -| Current | Proposed | Description | -|---------|----------|-------------| -| `create_blueprint` | `create_blueprint_asset` | Create a new Blueprint asset with a given name, path, and parent class. | -| `create_graph` | `create_blueprint_graph` | Create a new function or macro graph inside a blueprint. | -| `delete_graph` | `delete_blueprint_graph` | Delete a graph from a blueprint. | -| `rename_graph` | `rename_blueprint_graph` | Rename a graph inside a blueprint. | -| `reparent_blueprint` | `reparent_blueprint` | Change a blueprint's parent class. | -| `create_struct` | `create_struct_asset` | Create a new user-defined struct asset. | -| `create_enum` | `create_enum_asset` | Create a new user-defined enum asset. | -| `add_struct_property` | `add_struct_field` | Add a field to a user-defined struct. | -| `remove_struct_property` | `remove_struct_field` | Remove a field from a user-defined struct. | - -## Blueprint — Variables - -| Current | Proposed | Description | -|---------|----------|-------------| -| `add_variable` | `add_blueprint_variable` | Add a variable to a blueprint with a given name and type. | -| `remove_variable` | `remove_blueprint_variable` | Remove a variable from a blueprint by name. | -| `change_variable_type` | `change_blueprint_variable_type` | Change an existing blueprint variable's type. | -| `set_variable_metadata` | `set_blueprint_variable_metadata` | Set variable metadata (category, tooltip, replication, etc.). | - -## Blueprint — Functions/Parameters - -| Current | Proposed | Description | -|---------|----------|-------------| -| `add_function_parameter` | `add_function_parameter` | Add an input or output parameter to a function graph. | -| `remove_function_parameter` | `remove_function_parameter` | Remove a parameter from a function graph. | -| `change_function_param_type` | `change_function_parameter_type` | Change the type of an existing function parameter. | - -## Blueprint — Event Dispatchers - -| Current | Proposed | Description | -|---------|----------|-------------| -| `add_event_dispatcher` | `add_event_dispatcher` | Add an event dispatcher to a blueprint. | -| `list_event_dispatchers` | `list_event_dispatchers` | List all event dispatchers on a blueprint with their delegate signatures. | - -## Blueprint — Components - -| Current | Proposed | Description | -|---------|----------|-------------| -| `add_component` | `add_blueprint_component` | Add a component to a blueprint's component hierarchy. | -| `remove_component` | `remove_blueprint_component` | Remove a component from a blueprint. | -| `list_components` | `list_blueprint_components` | List all components in a blueprint's component hierarchy. | - -## Blueprint — Interfaces (new-style) - -| Current | Proposed | Description | -|---------|----------|-------------| -| `list_interfaces` | `list_blueprint_interfaces` | List all interfaces implemented by a blueprint, with the function stubs each provides. | -| `add_interface` | `add_blueprint_interface` | Add an interface implementation to a blueprint. Creates function stub graphs. | -| `remove_interface` | `remove_blueprint_interface` | Remove an interface implementation from a blueprint. Optionally preserves function graphs. | - -## Blueprint — Node Mutation (new-style) - -| Current | Proposed | Description | -|---------|----------|-------------| -| `search_node_types` | `search_spawnable_node_types` | Search the blueprint action database (the right-click menu) for spawnable node types matching a query string. Returns full action names like "Utilities\|Flow Control\|Branch". | -| `spawn_node` | `spawn_node_in_graph` | Create one or more nodes in a graph by exact action name (from search_spawnable_node_types). Invokes the spawner and returns the new node details. | -| `delete_node` | `delete_node_from_graph` | Delete a node from a graph by GUID. | -| `move_node` | `set_node_position` | Set a node's X/Y position in the graph editor. | -| `duplicate_nodes` | `duplicate_nodes_in_graph` | Duplicate one or more nodes within a graph. | -| `connect_pins` | `connect_blueprint_pins` | Connect two pins (by blueprint, source node+pin, target node+pin). | -| `disconnect_pin` | `disconnect_blueprint_pin` | Break connections on a pin (all connections, or a specific one). | -| `set_pin_default` | `set_pin_default_value` | Set a pin's default value string. | -| `get_node_comment` | `get_node_comment` | Get the comment text on a node. | -| `set_node_comment` | `set_node_comment` | Set or clear the comment text on a node. | -| `replace_function_calls` | `replace_function_calls_in_blueprint` | Bulk-replace all calls to one function with calls to another across a blueprint. | -| `refresh_all_nodes` | `refresh_all_nodes_in_graph` | Refresh (reconstruct) all nodes in a graph to pick up signature changes. | -| `change_struct_node_type` | `change_struct_node_type` | Change which struct a Break/Make/Set-Members node operates on. | -| `set_blueprint_default` | `set_class_default_value` | Set a property value on the blueprint's Class Default Object (CDO). | -| `rename_asset` | `rename_asset` | Rename or move an asset to a new name/path. | -| `delete_asset` | `delete_asset` | Delete an asset from the project. | -| `diff_blueprints` | `diff_two_blueprints` | Compare two blueprints and return structural differences (added/removed/changed nodes, connections, variables). | - -## Blueprint — Snapshots - -| Current | Proposed | Description | -|---------|----------|-------------| -| `snapshot_graph` | `snapshot_blueprint_graph` | Capture a snapshot of a blueprint's graphs (nodes and connections) for later diffing or restore. | -| `diff_graph` | `diff_blueprint_graph_vs_snapshot` | Diff the current state of a blueprint's graphs against a previously captured snapshot. Returns added/removed/changed nodes and connections. | -| `restore_graph` | `restore_blueprint_graph_from_snapshot` | Restore a blueprint's graphs to the state captured in a snapshot (recreates nodes and connections). | -| `find_disconnected_pins` | `find_pins_disconnected_since_snapshot` | Compare current graphs against a snapshot and find pins that were previously connected but are now disconnected. | -| `analyze_rebuild_impact` | `analyze_cpp_rebuild_impact` | Given a C++ module name, find all blueprints that use structs/classes from that module and report which nodes/pins would be affected by a rebuild. | - -## Materials — Read - -| Current | Proposed | Description | -|---------|----------|-------------| -| `materials` | `list_material_assets` | List all material and material instance assets from the asset registry (no loading). Optional `query` filters by name/path substring. Optional `type` filters to "material" or "instance" only. | -| `material` | `dump_material` | Load one material by name and dump everything: properties (domain, blend mode, shading model, two-sided, etc.) and expression summary. | -| `material_graph` | `dump_material_expression_graph` | Load one material and dump its full expression graph: every expression node with type, position, parameter values, and all pin connections. | -| `describe_material` | `describe_material_in_english` | Load a material and generate a human-readable text description by tracing the expression graph backwards from each material output pin. | -| `search_materials` | `search_within_materials` | Deep search: loads every material, inspects expression nodes, and finds materials/expressions whose name, class, description, or parameter name matches the query. | -| `material_references` | `find_material_references` | Given a material name, query the asset registry for all assets that reference it. | - -## Materials — Mutation - -| Current | Proposed | Description | -|---------|----------|-------------| -| `create_material` | `create_material_asset` | Create a new material asset. | -| `set_material_property` | `set_material_property` | Set a top-level material property (blend mode, shading model, two-sided, etc.). | -| `add_material_expression` | `add_material_expression` | Add a material expression node to a material's graph. | -| `delete_material_expression` | `delete_material_expression` | Remove a material expression node from a material's graph. | -| `connect_material_pins` | `connect_material_expression_pins` | Connect two expression pins in a material graph. | -| `disconnect_material_pin` | `disconnect_material_expression_pin` | Disconnect a pin in a material graph. | -| `set_expression_value` | `set_material_expression_property` | Set a property on a material expression node (e.g. constant value, texture, parameter name). | -| `move_material_expression` | `set_material_expression_position` | Set X/Y position of a material expression in the graph editor. | -| `validate_material` | `compile_material` | Compile a material and report errors. | - -## Material Instances - -| Current | Proposed | Description | -|---------|----------|-------------| -| `create_material_instance` | `create_material_instance_asset` | Create a new material instance constant with a given parent material. | -| `set_material_instance_parameter` | `set_material_instance_parameter` | Set a parameter override on a material instance (scalar, vector, texture, etc.). | -| `material_instance_params` | `dump_material_instance_parameters` | Dump all parameter values on a material instance, showing both overridden and inherited values. | -| `reparent_material_instance` | `reparent_material_instance` | Change a material instance's parent material. | - -## Material Functions - -| Current | Proposed | Description | -|---------|----------|-------------| -| `material_functions` | `list_material_function_assets` | List all material function assets from the asset registry. Optional `query` filters by name/path substring. | -| `material_function` | `dump_material_function` | Load one material function and dump its expressions, inputs, and outputs. | -| `create_material_function` | `create_material_function_asset` | Create a new material function asset. | - -## Material Snapshots - -| Current | Proposed | Description | -|---------|----------|-------------| -| `snapshot_material_graph` | `snapshot_material_expression_graph` | Capture a snapshot of a material's expression graph. | -| `diff_material_graph` | `diff_material_graph_vs_snapshot` | Diff a material's current expression graph against a snapshot. | -| `restore_material_graph` | `restore_material_graph_from_snapshot` | Restore a material's expression graph from a snapshot. | - -## Animation Blueprints - -| Current | Proposed | Description | -|---------|----------|-------------| -| `create_anim_blueprint` | `create_anim_blueprint_asset` | Create a new Animation Blueprint asset with a given skeleton. | -| `add_anim_state` | `add_anim_state_to_machine` | Add a state node to a state machine graph. | -| `remove_anim_state` | `remove_anim_state_from_machine` | Remove a state node from a state machine graph. | -| `add_anim_transition` | `add_anim_state_transition` | Add a transition between two states in a state machine. | -| `set_transition_rule` | `set_anim_transition_rule` | Set the boolean condition expression for a state machine transition. | -| `add_anim_node` | `add_anim_graph_node` | Add an animation node (sequence player, blend space player, etc.) to a state's graph. | -| `add_state_machine` | `add_anim_state_machine` | Add a state machine sub-graph to an anim blueprint's AnimGraph. | -| `set_state_animation` | `set_anim_state_animation` | Set which animation sequence a state plays. | -| `list_anim_slots` | `list_anim_slot_names` | List all animation slot names available in the skeleton's slot groups. | -| `list_sync_groups` | `list_anim_sync_groups` | List all animation sync groups defined in the project. | -| `create_blend_space` | `create_blend_space_asset` | Create a new Blend Space asset. | -| `set_blend_space_samples` | `set_blend_space_sample_points` | Set the sample points (animation + coordinates) on a blend space. | -| `set_state_blend_space` | `set_anim_state_blend_space` | Set a state to play a blend space instead of a single animation. | - -## System - -| Current | Proposed | Description | -|---------|----------|-------------| -| `health` | `health` | Returns server status, mode, and asset counts. Answered on HTTP thread, no game-thread access. | -| `rescan` | `rescan_asset_registry` | Re-scan the asset registry and refresh all cached asset lists. | -| `shutdown` | `shutdown` | Request graceful engine exit. Only available in commandlet mode. |