Add credits and license to blueprint-MCP

This commit is contained in:
2026-03-07 00:42:14 -05:00
parent 3a2cb775e0
commit b7b28e9336
3 changed files with 93 additions and 206 deletions

View File

@@ -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.

View File

@@ -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.

View File

@@ -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. |