@baixfeng/godot-mcp-cli 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +187 -0
- package/addons/godot_mcp/command_handler.gd +161 -0
- package/addons/godot_mcp/command_handler.gd.uid +1 -0
- package/addons/godot_mcp/commands/base_command_processor.gd +221 -0
- package/addons/godot_mcp/commands/base_command_processor.gd.uid +1 -0
- package/addons/godot_mcp/commands/debugger_commands.gd +221 -0
- package/addons/godot_mcp/commands/debugger_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/editor_commands.gd +237 -0
- package/addons/godot_mcp/commands/editor_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/editor_script_commands.gd +365 -0
- package/addons/godot_mcp/commands/editor_script_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/input_commands.gd +337 -0
- package/addons/godot_mcp/commands/input_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/node_commands.gd +222 -0
- package/addons/godot_mcp/commands/node_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/project_commands.gd +298 -0
- package/addons/godot_mcp/commands/project_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/scene_commands.gd +337 -0
- package/addons/godot_mcp/commands/scene_commands.gd.uid +1 -0
- package/addons/godot_mcp/commands/script_commands.gd +349 -0
- package/addons/godot_mcp/commands/script_commands.gd.uid +1 -0
- package/addons/godot_mcp/mcp_asset_commands.gd +153 -0
- package/addons/godot_mcp/mcp_asset_commands.gd.uid +1 -0
- package/addons/godot_mcp/mcp_debug_output_publisher.gd +1669 -0
- package/addons/godot_mcp/mcp_debug_output_publisher.gd.uid +1 -0
- package/addons/godot_mcp/mcp_debugger_bridge.gd +1455 -0
- package/addons/godot_mcp/mcp_debugger_bridge.gd.uid +1 -0
- package/addons/godot_mcp/mcp_enhanced_commands.gd +1083 -0
- package/addons/godot_mcp/mcp_enhanced_commands.gd.uid +1 -0
- package/addons/godot_mcp/mcp_input_handler.gd +545 -0
- package/addons/godot_mcp/mcp_input_handler.gd.uid +1 -0
- package/addons/godot_mcp/mcp_runtime_debugger_bridge.gd +464 -0
- package/addons/godot_mcp/mcp_runtime_debugger_bridge.gd.uid +1 -0
- package/addons/godot_mcp/mcp_script_resource_commands.gd +165 -0
- package/addons/godot_mcp/mcp_script_resource_commands.gd.uid +1 -0
- package/addons/godot_mcp/mcp_server.gd +260 -0
- package/addons/godot_mcp/mcp_server.gd.uid +1 -0
- package/addons/godot_mcp/plugin.cfg +7 -0
- package/addons/godot_mcp/runtime_debugger.gd +81 -0
- package/addons/godot_mcp/runtime_debugger.gd.uid +1 -0
- package/addons/godot_mcp/ui/mcp_panel.gd +94 -0
- package/addons/godot_mcp/ui/mcp_panel.gd.uid +1 -0
- package/addons/godot_mcp/ui/mcp_panel.tscn +96 -0
- package/addons/godot_mcp/utils/node_utils.gd +82 -0
- package/addons/godot_mcp/utils/node_utils.gd.uid +1 -0
- package/addons/godot_mcp/utils/resource_utils.gd +81 -0
- package/addons/godot_mcp/utils/resource_utils.gd.uid +1 -0
- package/addons/godot_mcp/utils/script_utils.gd +114 -0
- package/addons/godot_mcp/utils/script_utils.gd.uid +1 -0
- package/addons/godot_mcp/websocket_server.gd +197 -0
- package/addons/godot_mcp/websocket_server.gd.uid +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +561 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +156 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/asset_resources.d.ts +29 -0
- package/dist/resources/asset_resources.js +145 -0
- package/dist/resources/asset_resources.js.map +1 -0
- package/dist/resources/debug_resources.d.ts +11 -0
- package/dist/resources/debug_resources.js +106 -0
- package/dist/resources/debug_resources.js.map +1 -0
- package/dist/resources/debugger_resources.d.ts +62 -0
- package/dist/resources/debugger_resources.js +201 -0
- package/dist/resources/debugger_resources.js.map +1 -0
- package/dist/resources/editor_resources.d.ts +47 -0
- package/dist/resources/editor_resources.js +155 -0
- package/dist/resources/editor_resources.js.map +1 -0
- package/dist/resources/project_resources.d.ts +33 -0
- package/dist/resources/project_resources.js +137 -0
- package/dist/resources/project_resources.js.map +1 -0
- package/dist/resources/scene_resources.d.ts +33 -0
- package/dist/resources/scene_resources.js +160 -0
- package/dist/resources/scene_resources.js.map +1 -0
- package/dist/resources/script_resources.d.ts +51 -0
- package/dist/resources/script_resources.js +203 -0
- package/dist/resources/script_resources.js.map +1 -0
- package/dist/tools/asset_tools.d.ts +5 -0
- package/dist/tools/asset_tools.js +125 -0
- package/dist/tools/asset_tools.js.map +1 -0
- package/dist/tools/debugger_tools.d.ts +2 -0
- package/dist/tools/debugger_tools.js +342 -0
- package/dist/tools/debugger_tools.js.map +1 -0
- package/dist/tools/editor_tools.d.ts +2 -0
- package/dist/tools/editor_tools.js +165 -0
- package/dist/tools/editor_tools.js.map +1 -0
- package/dist/tools/enhanced_tools.d.ts +5 -0
- package/dist/tools/enhanced_tools.js +706 -0
- package/dist/tools/enhanced_tools.js.map +1 -0
- package/dist/tools/input_tools.d.ts +2 -0
- package/dist/tools/input_tools.js +408 -0
- package/dist/tools/input_tools.js.map +1 -0
- package/dist/tools/node_tools.d.ts +5 -0
- package/dist/tools/node_tools.js +217 -0
- package/dist/tools/node_tools.js.map +1 -0
- package/dist/tools/project_tools.d.ts +5 -0
- package/dist/tools/project_tools.js +162 -0
- package/dist/tools/project_tools.js.map +1 -0
- package/dist/tools/scene_tools.d.ts +5 -0
- package/dist/tools/scene_tools.js +260 -0
- package/dist/tools/scene_tools.js.map +1 -0
- package/dist/tools/script_resource_tools.d.ts +5 -0
- package/dist/tools/script_resource_tools.js +5 -0
- package/dist/tools/script_resource_tools.js.map +1 -0
- package/dist/tools/script_tools.d.ts +5 -0
- package/dist/tools/script_tools.js +154 -0
- package/dist/tools/script_tools.js.map +1 -0
- package/dist/utils/godot_connection.d.ts +30 -0
- package/dist/utils/godot_connection.js +285 -0
- package/dist/utils/godot_connection.js.map +1 -0
- package/dist/utils/types.d.ts +16 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
@tool
|
|
2
|
+
class_name MCPAssetCommands
|
|
3
|
+
extends Node
|
|
4
|
+
|
|
5
|
+
var _websocket_server = null
|
|
6
|
+
|
|
7
|
+
func process_command(client_id: int, command_type: String, params: Dictionary, command_id: String) -> bool:
|
|
8
|
+
match command_type:
|
|
9
|
+
"list_project_files":
|
|
10
|
+
_handle_list_project_files(client_id, params, command_id)
|
|
11
|
+
return true
|
|
12
|
+
"list_assets_by_type":
|
|
13
|
+
_handle_list_assets_by_type(client_id, params, command_id)
|
|
14
|
+
return true
|
|
15
|
+
|
|
16
|
+
# Command not handled by this processor
|
|
17
|
+
return false
|
|
18
|
+
|
|
19
|
+
# ---- Project File Listing ----
|
|
20
|
+
|
|
21
|
+
func _handle_list_project_files(client_id: int, params: Dictionary, command_id: String) -> void:
|
|
22
|
+
var extensions = params.get("extensions", [])
|
|
23
|
+
|
|
24
|
+
var result = list_project_files(extensions)
|
|
25
|
+
|
|
26
|
+
var response = {
|
|
27
|
+
"status": "success",
|
|
28
|
+
"result": result
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if not command_id.is_empty():
|
|
32
|
+
response["commandId"] = command_id
|
|
33
|
+
|
|
34
|
+
_websocket_server.send_response(client_id, response)
|
|
35
|
+
|
|
36
|
+
func list_project_files(extensions: Array) -> Dictionary:
|
|
37
|
+
var result = []
|
|
38
|
+
|
|
39
|
+
# Get all files recursively
|
|
40
|
+
var dir = DirAccess.open("res://")
|
|
41
|
+
if dir:
|
|
42
|
+
_list_files_recursive(dir, "res://", extensions, result)
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
"files": result
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Helper function to recursively list files
|
|
49
|
+
func _list_files_recursive(dir: DirAccess, path: String, extensions: Array, result: Array) -> void:
|
|
50
|
+
# Open the directory
|
|
51
|
+
dir.list_dir_begin()
|
|
52
|
+
|
|
53
|
+
# Loop through all files and directories
|
|
54
|
+
var file_name = dir.get_next()
|
|
55
|
+
while file_name != "":
|
|
56
|
+
if file_name != "." and file_name != "..":
|
|
57
|
+
var full_path = path.path_join(file_name)
|
|
58
|
+
if dir.current_is_dir():
|
|
59
|
+
# Recursively process subdirectories
|
|
60
|
+
var subdir = DirAccess.open(full_path)
|
|
61
|
+
if subdir:
|
|
62
|
+
_list_files_recursive(subdir, full_path, extensions, result)
|
|
63
|
+
else:
|
|
64
|
+
# If extensions are specified, filter by them
|
|
65
|
+
if extensions.size() == 0:
|
|
66
|
+
result.append(full_path)
|
|
67
|
+
else:
|
|
68
|
+
for ext in extensions:
|
|
69
|
+
if file_name.ends_with(ext):
|
|
70
|
+
result.append(full_path)
|
|
71
|
+
break
|
|
72
|
+
|
|
73
|
+
file_name = dir.get_next()
|
|
74
|
+
|
|
75
|
+
dir.list_dir_end()
|
|
76
|
+
|
|
77
|
+
# ---- Asset Type Listing ----
|
|
78
|
+
|
|
79
|
+
func _handle_list_assets_by_type(client_id: int, params: Dictionary, command_id: String) -> void:
|
|
80
|
+
var type = params.get("type", "all")
|
|
81
|
+
|
|
82
|
+
var result = list_assets_by_type(type)
|
|
83
|
+
|
|
84
|
+
var response = {
|
|
85
|
+
"status": "success",
|
|
86
|
+
"result": result
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if not command_id.is_empty():
|
|
90
|
+
response["commandId"] = command_id
|
|
91
|
+
|
|
92
|
+
_websocket_server.send_response(client_id, response)
|
|
93
|
+
|
|
94
|
+
func list_assets_by_type(type: String) -> Dictionary:
|
|
95
|
+
# Define file extensions for each asset type
|
|
96
|
+
var extension_map = {
|
|
97
|
+
"images": [".png", ".jpg", ".jpeg", ".webp", ".svg", ".bmp", ".tga"],
|
|
98
|
+
"audio": [".ogg", ".mp3", ".wav", ".opus"],
|
|
99
|
+
"fonts": [".ttf", ".otf", ".fnt", ".font"],
|
|
100
|
+
"models": [".glb", ".gltf", ".obj", ".fbx"],
|
|
101
|
+
"shaders": [".gdshader", ".shader"],
|
|
102
|
+
"resources": [".tres", ".res", ".theme", ".material"],
|
|
103
|
+
"scripts": [".gd"],
|
|
104
|
+
"scenes": [".tscn"],
|
|
105
|
+
"all": [] # Will retrieve everything
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
# Get extensions for the requested type
|
|
109
|
+
var extensions = []
|
|
110
|
+
if extension_map.has(type):
|
|
111
|
+
extensions = extension_map[type]
|
|
112
|
+
else:
|
|
113
|
+
# If type not found, return empty result
|
|
114
|
+
return {
|
|
115
|
+
"assetType": type,
|
|
116
|
+
"extensions": [],
|
|
117
|
+
"count": 0,
|
|
118
|
+
"files": [],
|
|
119
|
+
"organizedFiles": {},
|
|
120
|
+
"error": "Unknown asset type: %s. Valid types are: %s" % [type, ", ".join(extension_map.keys())]
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
# Get files
|
|
124
|
+
var file_result = list_project_files(extensions)
|
|
125
|
+
var files = file_result.get("files", [])
|
|
126
|
+
|
|
127
|
+
# Group by folder structure for better navigation
|
|
128
|
+
var organized_files = {}
|
|
129
|
+
for file_path in files:
|
|
130
|
+
var parts = file_path.split("/")
|
|
131
|
+
var current = organized_files
|
|
132
|
+
|
|
133
|
+
# Skip the first "res://" part if present
|
|
134
|
+
var start_idx = 1 if parts[0] == "res:" else 0
|
|
135
|
+
|
|
136
|
+
# Process path parts
|
|
137
|
+
for i in range(start_idx, parts.size() - 1):
|
|
138
|
+
var part = parts[i]
|
|
139
|
+
if not current.has(part):
|
|
140
|
+
current[part] = {}
|
|
141
|
+
current = current[part]
|
|
142
|
+
|
|
143
|
+
# For the leaf/filename
|
|
144
|
+
var file_name = parts[parts.size() - 1]
|
|
145
|
+
current[file_name] = file_path
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
"assetType": type,
|
|
149
|
+
"extensions": extensions,
|
|
150
|
+
"count": files.size(),
|
|
151
|
+
"files": files,
|
|
152
|
+
"organizedFiles": organized_files
|
|
153
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
uid://bwwfto3i8qyjy
|