72 lines
2.1 KiB
GDScript
72 lines
2.1 KiB
GDScript
@tool
|
|
class_name McpClientRegistry
|
|
extends RefCounted
|
|
|
|
## Central enumeration of every supported MCP client. Adding a new client
|
|
## means: drop a file in clients/, then append one preload below.
|
|
|
|
const _CLIENT_SCRIPTS := [
|
|
preload("res://addons/godot_ai/clients/claude_code.gd"),
|
|
preload("res://addons/godot_ai/clients/claude_desktop.gd"),
|
|
preload("res://addons/godot_ai/clients/codex.gd"),
|
|
preload("res://addons/godot_ai/clients/antigravity.gd"),
|
|
preload("res://addons/godot_ai/clients/cursor.gd"),
|
|
preload("res://addons/godot_ai/clients/windsurf.gd"),
|
|
preload("res://addons/godot_ai/clients/vscode.gd"),
|
|
preload("res://addons/godot_ai/clients/vscode_insiders.gd"),
|
|
preload("res://addons/godot_ai/clients/zed.gd"),
|
|
preload("res://addons/godot_ai/clients/gemini_cli.gd"),
|
|
preload("res://addons/godot_ai/clients/cline.gd"),
|
|
preload("res://addons/godot_ai/clients/kilo_code.gd"),
|
|
preload("res://addons/godot_ai/clients/roo_code.gd"),
|
|
preload("res://addons/godot_ai/clients/kiro.gd"),
|
|
preload("res://addons/godot_ai/clients/trae.gd"),
|
|
preload("res://addons/godot_ai/clients/cherry_studio.gd"),
|
|
preload("res://addons/godot_ai/clients/opencode.gd"),
|
|
preload("res://addons/godot_ai/clients/qwen_code.gd"),
|
|
preload("res://addons/godot_ai/clients/kimi_code.gd"),
|
|
]
|
|
|
|
static var _instances: Array[McpClient] = []
|
|
static var _by_id: Dictionary = {}
|
|
|
|
|
|
static func all() -> Array[McpClient]:
|
|
if _instances.is_empty():
|
|
_load()
|
|
return _instances
|
|
|
|
|
|
static func get_by_id(id: String) -> McpClient:
|
|
if _instances.is_empty():
|
|
_load()
|
|
return _by_id.get(id, null)
|
|
|
|
|
|
static func ids() -> PackedStringArray:
|
|
var out := PackedStringArray()
|
|
for c in all():
|
|
out.append(c.id)
|
|
return out
|
|
|
|
|
|
static func has_id(id: String) -> bool:
|
|
if _instances.is_empty():
|
|
_load()
|
|
return _by_id.has(id)
|
|
|
|
|
|
static func _load() -> void:
|
|
_instances.clear()
|
|
_by_id.clear()
|
|
for script in _CLIENT_SCRIPTS:
|
|
var inst: McpClient = script.new()
|
|
if inst.id.is_empty():
|
|
push_warning("MCP | client descriptor %s has empty id" % script.resource_path)
|
|
continue
|
|
if _by_id.has(inst.id):
|
|
push_warning("MCP | duplicate client id: %s" % inst.id)
|
|
continue
|
|
_instances.append(inst)
|
|
_by_id[inst.id] = inst
|