Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Makefile.common
Original file line number Diff line number Diff line change
Expand Up @@ -2405,6 +2405,15 @@ ifeq ($(HAVE_NETWORKING), 1)
network/netplay/netplay_frontend.o \
network/netplay/netplay_room_parse.o

# MCP Server
ifeq ($(HAVE_MCP), 1)
DEFINES += -DHAVE_MCP
OBJ += network/mcp/mcp_server.o \
network/mcp/mcp_http_transport.o \
network/mcp/mcp_adapter.o \
network/mcp/mcp_adapter_tool_list.o
endif

# RetroAchievements
ifeq ($(HAVE_CHEEVOS), 1)
DEFINES += -DHAVE_CHEEVOS -DRC_CLIENT_SUPPORTS_HASH
Expand Down
5 changes: 5 additions & 0 deletions config.def.h
Original file line number Diff line number Diff line change
Expand Up @@ -1469,6 +1469,11 @@
#define DEFAULT_NETWORK_REMOTE_BASE_PORT 55400
#define DEFAULT_STDIN_CMD_ENABLE false

/* Enable MCP (Model Context Protocol) server. */
#define DEFAULT_MCP_SERVER_ENABLE false
#define DEFAULT_MCP_SERVER_ADDRESS "127.0.0.1"
#define DEFAULT_MCP_SERVER_PORT 7878

#define DEFAULT_NETWORK_BUILDBOT_AUTO_EXTRACT_ARCHIVE true
#define DEFAULT_NETWORK_BUILDBOT_SHOW_EXPERIMENTAL_CORES false

Expand Down
11 changes: 11 additions & 0 deletions configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -1602,6 +1602,10 @@ static struct config_array_setting *populate_settings_array(

#ifdef HAVE_NETWORKING
SETTING_ARRAY("netplay_mitm_server", settings->arrays.netplay_mitm_server, false, NULL, true);
#ifdef HAVE_MCP
SETTING_ARRAY("mcp_server_address", settings->arrays.mcp_server_address, true, DEFAULT_MCP_SERVER_ADDRESS, false);
SETTING_ARRAY("mcp_server_password", settings->arrays.mcp_server_password, false, NULL, true);
#endif
SETTING_ARRAY("webdav_url", settings->arrays.webdav_url, false, NULL, true);
SETTING_ARRAY("webdav_username", settings->arrays.webdav_username, false, NULL, true);
SETTING_ARRAY("webdav_password", settings->arrays.webdav_password, false, NULL, true);
Expand Down Expand Up @@ -2226,6 +2230,10 @@ static struct config_bool_setting *populate_settings_bool(
SETTING_BOOL("stdin_cmd_enable", &settings->bools.stdin_cmd_enable, true, DEFAULT_STDIN_CMD_ENABLE, false);
#endif

#ifdef HAVE_MCP
SETTING_BOOL("mcp_server_enable", &settings->bools.mcp_server_enable, true, DEFAULT_MCP_SERVER_ENABLE, false);
#endif

#ifdef HAVE_NETWORKING
SETTING_BOOL("netplay_show_only_connectable", &settings->bools.netplay_show_only_connectable, true, DEFAULT_NETPLAY_SHOW_ONLY_CONNECTABLE, false);
SETTING_BOOL("netplay_show_only_installed_cores", &settings->bools.netplay_show_only_installed_cores, true, DEFAULT_NETPLAY_SHOW_ONLY_INSTALLED_CORES, false);
Expand Down Expand Up @@ -2624,6 +2632,9 @@ static struct config_uint_setting *populate_settings_uint(
#ifdef HAVE_COMMAND
SETTING_UINT("network_cmd_port", &settings->uints.network_cmd_port, true, DEFAULT_NETWORK_CMD_PORT, false);
#endif
#ifdef HAVE_MCP
SETTING_UINT("mcp_server_port", &settings->uints.mcp_server_port, true, DEFAULT_MCP_SERVER_PORT, false);
#endif
#ifdef HAVE_NETWORKGAMEPAD
SETTING_UINT("network_remote_base_port", &settings->uints.network_remote_base_port, true, DEFAULT_NETWORK_REMOTE_BASE_PORT, false);
#endif
Expand Down
10 changes: 10 additions & 0 deletions configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,9 @@ typedef struct settings
unsigned replay_max_keep;
unsigned savestate_max_keep;
unsigned network_cmd_port;
#ifdef HAVE_MCP
unsigned mcp_server_port;
#endif
unsigned network_remote_base_port;
unsigned keymapper_port;
unsigned cloud_sync_sync_mode;
Expand Down Expand Up @@ -539,6 +542,10 @@ typedef struct settings
char audio_device[NAME_MAX_LENGTH];
char camera_device[NAME_MAX_LENGTH];
char netplay_mitm_server[NAME_MAX_LENGTH];
#ifdef HAVE_MCP
char mcp_server_address[64];
char mcp_server_password[NAME_MAX_LENGTH];
#endif
char webdav_url[NAME_MAX_LENGTH];
char webdav_username[NAME_MAX_LENGTH];
char webdav_password[NAME_MAX_LENGTH];
Expand Down Expand Up @@ -1061,6 +1068,9 @@ typedef struct settings
bool save_file_compression;
bool savestate_file_compression;
bool network_cmd_enable;
#ifdef HAVE_MCP
bool mcp_server_enable;
#endif
bool stdin_cmd_enable;
bool keymapper_enable;
bool network_remote_enable;
Expand Down
10 changes: 10 additions & 0 deletions griffin/griffin.c
Original file line number Diff line number Diff line change
Expand Up @@ -1708,6 +1708,16 @@ STEAM INTEGRATION USING MIST
#include "../network/presence.c"
#endif

/*============================================================
MCP SERVER
============================================================ */
#ifdef HAVE_MCP
#include "../network/mcp/mcp_server.c"
#include "../network/mcp/mcp_http_transport.c"
#include "../network/mcp/mcp_adapter.c"
#include "../network/mcp/mcp_adapter_tool_list.c"
#endif

/*============================================================
CLOUD SYNC
============================================================ */
Expand Down
16 changes: 16 additions & 0 deletions intl/msg_hash_lbl.h
Original file line number Diff line number Diff line change
Expand Up @@ -2506,6 +2506,22 @@ MSG_HASH(
MENU_ENUM_LABEL_NETWORK_CMD_PORT,
"network_cmd_port"
)
MSG_HASH(
MENU_ENUM_LABEL_MCP_SERVER_ENABLE,
"mcp_server_enable"
)
MSG_HASH(
MENU_ENUM_LABEL_MCP_SERVER_ADDRESS,
"mcp_server_address"
)
MSG_HASH(
MENU_ENUM_LABEL_MCP_SERVER_PORT,
"mcp_server_port"
)
MSG_HASH(
MENU_ENUM_LABEL_MCP_SERVER_PASSWORD,
"mcp_server_password"
)
MSG_HASH(
MENU_ENUM_LABEL_NETWORK_INFORMATION,
"network_information"
Expand Down
32 changes: 32 additions & 0 deletions intl/msg_hash_us.h
Original file line number Diff line number Diff line change
Expand Up @@ -7606,6 +7606,38 @@ MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETWORK_CMD_PORT,
"Network Command Port"
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MCP_SERVER_ENABLE,
"MCP Server"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MCP_SERVER_ENABLE,
"Enable the Model Context Protocol (MCP) server for AI assistant integration."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MCP_SERVER_ADDRESS,
"MCP Server Address"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MCP_SERVER_ADDRESS,
"Bind address for the MCP HTTP server (e.g. 127.0.0.1)."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MCP_SERVER_PORT,
"MCP Server Port"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MCP_SERVER_PORT,
"Port for the MCP HTTP server to listen on."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_MCP_SERVER_PASSWORD,
"MCP Server Password"
)
MSG_HASH(
MENU_ENUM_SUBLABEL_MCP_SERVER_PASSWORD,
"Password for MCP server authentication (Bearer token). Leave empty to disable auth."
)
MSG_HASH(
MENU_ENUM_LABEL_VALUE_NETWORK_REMOTE_ENABLE,
"Network RetroPad"
Expand Down
20 changes: 20 additions & 0 deletions menu/cbs/menu_cbs_sublabel.c
Original file line number Diff line number Diff line change
Expand Up @@ -944,6 +944,12 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_require_slaves, MENU_
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_check_frames, MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_nat_traversal, MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_stdin_cmd_enable, MENU_ENUM_SUBLABEL_STDIN_CMD_ENABLE)
#ifdef HAVE_MCP
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_mcp_server_enable, MENU_ENUM_SUBLABEL_MCP_SERVER_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_mcp_server_address, MENU_ENUM_SUBLABEL_MCP_SERVER_ADDRESS)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_mcp_server_port, MENU_ENUM_SUBLABEL_MCP_SERVER_PORT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_mcp_server_password, MENU_ENUM_SUBLABEL_MCP_SERVER_PASSWORD)
#endif
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_mouse_enable, MENU_ENUM_SUBLABEL_MOUSE_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_pointer_enable, MENU_ENUM_SUBLABEL_POINTER_ENABLE)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_icon_thumbnails, MENU_ENUM_SUBLABEL_ICON_THUMBNAILS)
Expand Down Expand Up @@ -3769,6 +3775,20 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
case MENU_ENUM_LABEL_STDIN_CMD_ENABLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_stdin_cmd_enable);
break;
#ifdef HAVE_MCP
case MENU_ENUM_LABEL_MCP_SERVER_ENABLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_mcp_server_enable);
break;
case MENU_ENUM_LABEL_MCP_SERVER_ADDRESS:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_mcp_server_address);
break;
case MENU_ENUM_LABEL_MCP_SERVER_PORT:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_mcp_server_port);
break;
case MENU_ENUM_LABEL_MCP_SERVER_PASSWORD:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_mcp_server_password);
break;
#endif
case MENU_ENUM_LABEL_NETPLAY_PUBLIC_ANNOUNCE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_netplay_public_announce);
break;
Expand Down
23 changes: 23 additions & 0 deletions menu/menu_displaylist.c
Original file line number Diff line number Diff line change
Expand Up @@ -9474,6 +9474,29 @@ unsigned menu_displaylist_build_list(
MENU_ENUM_LABEL_STDIN_CMD_ENABLE,
PARSE_ONLY_BOOL, false) == 0)
count++;

#ifdef HAVE_MCP
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_MCP_SERVER_ENABLE,
PARSE_ONLY_BOOL, false) == 0)
count++;

if (settings->bools.mcp_server_enable)
{
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_MCP_SERVER_ADDRESS,
PARSE_ONLY_STRING, false) == 0)
count++;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_MCP_SERVER_PORT,
PARSE_ONLY_UINT, false) == 0)
count++;
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
MENU_ENUM_LABEL_MCP_SERVER_PASSWORD,
PARSE_ONLY_STRING, false) == 0)
count++;
}
#endif
}
break;
case DISPLAYLIST_NETPLAY_LOBBY_FILTERS_LIST:
Expand Down
93 changes: 93 additions & 0 deletions menu/menu_setting.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,10 @@
#endif
#endif

#ifdef HAVE_MCP
#include "../network/mcp/mcp_server.h"
#endif

#if defined(HAVE_OVERLAY)
#include "../input/input_overlay.h"
#endif
Expand Down Expand Up @@ -9633,6 +9637,22 @@ static void timezone_change_handler(rarch_setting_t *setting)
}
#endif

#ifdef HAVE_MCP
static void mcp_setting_change_handler(rarch_setting_t *setting)
{
(void)setting;
mcp_server_deinit();
}

static size_t setting_get_string_representation_mcp_password(
rarch_setting_t *setting, char *s, size_t len)
{
if (setting && !string_is_empty(setting->value.target.string))
return strlcpy(s, "********", len);
return 0;
}
#endif

static void appicon_change_handler(rarch_setting_t *setting)
{
uico_driver_state_t *uico_st = uico_state_get_ptr();
Expand Down Expand Up @@ -23938,6 +23958,79 @@ static bool setting_append_list(
general_write_handler,
general_read_handler,
SD_FLAG_ADVANCED);

#ifdef HAVE_MCP
CONFIG_BOOL(
list, list_info,
&settings->bools.mcp_server_enable,
MENU_ENUM_LABEL_MCP_SERVER_ENABLE,
MENU_ENUM_LABEL_VALUE_MCP_SERVER_ENABLE,
DEFAULT_MCP_SERVER_ENABLE,
MENU_ENUM_LABEL_VALUE_OFF,
MENU_ENUM_LABEL_VALUE_ON,
&group_info,
&subgroup_info,
parent_group,
general_write_handler,
general_read_handler,
SD_FLAG_NONE);
(*list)[list_info->index - 1].action_ok = &setting_bool_action_left_with_refresh;
(*list)[list_info->index - 1].action_left = &setting_bool_action_left_with_refresh;
(*list)[list_info->index - 1].action_right = &setting_bool_action_right_with_refresh;

CONFIG_STRING(
list, list_info,
settings->arrays.mcp_server_address,
sizeof(settings->arrays.mcp_server_address),
MENU_ENUM_LABEL_MCP_SERVER_ADDRESS,
MENU_ENUM_LABEL_VALUE_MCP_SERVER_ADDRESS,
"",
&group_info,
&subgroup_info,
parent_group,
NULL,
NULL);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_STRING_LINE_EDIT;
(*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
(*list)[list_info->index - 1].change_handler = mcp_setting_change_handler;

CONFIG_UINT(
list, list_info,
&settings->uints.mcp_server_port,
MENU_ENUM_LABEL_MCP_SERVER_PORT,
MENU_ENUM_LABEL_VALUE_MCP_SERVER_PORT,
DEFAULT_MCP_SERVER_PORT,
&group_info,
&subgroup_info,
parent_group,
NULL,
NULL);
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
(*list)[list_info->index - 1].offset_by = 1;
menu_settings_list_current_add_range(list, list_info, 0, 65535, 1, true, true);
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
(*list)[list_info->index - 1].change_handler = mcp_setting_change_handler;

CONFIG_STRING(
list, list_info,
settings->arrays.mcp_server_password,
sizeof(settings->arrays.mcp_server_password),
MENU_ENUM_LABEL_MCP_SERVER_PASSWORD,
MENU_ENUM_LABEL_VALUE_MCP_SERVER_PASSWORD,
"",
&group_info,
&subgroup_info,
parent_group,
NULL,
NULL);
(*list)[list_info->index - 1].get_string_representation =
&setting_get_string_representation_mcp_password;
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT);
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_PASSWORD_LINE_EDIT;
(*list)[list_info->index - 1].action_start = setting_generic_action_start_default;
(*list)[list_info->index - 1].change_handler = mcp_setting_change_handler;
#endif
#endif
CONFIG_BOOL(
list, list_info,
Expand Down
4 changes: 4 additions & 0 deletions msg_hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -2924,6 +2924,10 @@ enum msg_hash_enums
MENU_LABEL(NETWORK_CMD_ENABLE),
MENU_LABEL(NETWORK_CMD_PORT),
MENU_LABEL(STDIN_CMD_ENABLE),
MENU_LABEL(MCP_SERVER_ENABLE),
MENU_LABEL(MCP_SERVER_ADDRESS),
MENU_LABEL(MCP_SERVER_PORT),
MENU_LABEL(MCP_SERVER_PASSWORD),
MENU_LABEL(NETWORK_REMOTE_ENABLE),
MENU_LABEL(NETWORK_REMOTE_PORT),
MENU_LABEL(NETWORK_ON_DEMAND_THUMBNAILS),
Expand Down
Loading
Loading