From 08afdcc50e220f276ea30f71ebbf9104c6bc1604 Mon Sep 17 00:00:00 2001 From: Jacob Magar Date: Sat, 14 Mar 2026 14:19:42 -0400 Subject: [PATCH] refactor(creds): remove per-tool elicitation from unraid_settings --- unraid_mcp/tools/settings.py | 142 +++++------------------------------ 1 file changed, 20 insertions(+), 122 deletions(-) diff --git a/unraid_mcp/tools/settings.py b/unraid_mcp/tools/settings.py index a38a81a..49f0ad7 100644 --- a/unraid_mcp/tools/settings.py +++ b/unraid_mcp/tools/settings.py @@ -6,21 +6,11 @@ configuration, time settings, UPS, API settings, and Unraid Connect. from typing import Any, Literal, get_args -from fastmcp import Context as _Context from fastmcp import FastMCP from ..config.logging import logger from ..core.client import make_graphql_request -from ..core.exceptions import CredentialsNotConfiguredError as _CredErr from ..core.exceptions import ToolError, tool_error_handler -from ..core.setup import elicit_and_configure as _elicit - - -# Re-export at module scope so tests can patch "unraid_mcp.tools.settings.elicit_and_configure" -# and "unraid_mcp.tools.settings.CredentialsNotConfiguredError" -elicit_and_configure = _elicit -CredentialsNotConfiguredError = _CredErr -Context = _Context MUTATIONS: dict[str, str] = { @@ -121,7 +111,6 @@ def register_settings_tool(mcp: FastMCP) -> None: access_url_ipv4: str | None = None, access_url_ipv6: str | None = None, dynamic_enabled: bool | None = None, - ctx: Context | None = None, ) -> dict[str, Any]: """Update Unraid system settings, time, UPS, and remote access configuration. @@ -148,19 +137,7 @@ def register_settings_tool(mcp: FastMCP) -> None: if action == "update": if settings_input is None: raise ToolError("settings_input is required for 'update' action") - try: - data = await make_graphql_request( - MUTATIONS["update"], {"input": settings_input} - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["update"], {"input": settings_input} - ) + data = await make_graphql_request(MUTATIONS["update"], {"input": settings_input}) return {"success": True, "action": "update", "data": data.get("updateSettings")} if action == "update_temperature": @@ -168,19 +145,9 @@ def register_settings_tool(mcp: FastMCP) -> None: raise ToolError( "temperature_config is required for 'update_temperature' action" ) - try: - data = await make_graphql_request( - MUTATIONS["update_temperature"], {"input": temperature_config} - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["update_temperature"], {"input": temperature_config} - ) + data = await make_graphql_request( + MUTATIONS["update_temperature"], {"input": temperature_config} + ) return { "success": True, "action": "update_temperature", @@ -201,19 +168,7 @@ def register_settings_tool(mcp: FastMCP) -> None: raise ToolError( "update_time requires at least one of: time_zone, use_ntp, ntp_servers, manual_datetime" ) - try: - data = await make_graphql_request( - MUTATIONS["update_time"], {"input": time_input} - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["update_time"], {"input": time_input} - ) + data = await make_graphql_request(MUTATIONS["update_time"], {"input": time_input}) return { "success": True, "action": "update_time", @@ -223,19 +178,9 @@ def register_settings_tool(mcp: FastMCP) -> None: if action == "configure_ups": if ups_config is None: raise ToolError("ups_config is required for 'configure_ups' action") - try: - data = await make_graphql_request( - MUTATIONS["configure_ups"], {"config": ups_config} - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["configure_ups"], {"config": ups_config} - ) + data = await make_graphql_request( + MUTATIONS["configure_ups"], {"config": ups_config} + ) return { "success": True, "action": "configure_ups", @@ -254,15 +199,7 @@ def register_settings_tool(mcp: FastMCP) -> None: raise ToolError( "update_api requires at least one of: access_type, forward_type, port" ) - try: - data = await make_graphql_request(MUTATIONS["update_api"], {"input": api_input}) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request(MUTATIONS["update_api"], {"input": api_input}) + data = await make_graphql_request(MUTATIONS["update_api"], {"input": api_input}) return { "success": True, "action": "update_api", @@ -282,19 +219,9 @@ def register_settings_tool(mcp: FastMCP) -> None: user_info["avatar"] = avatar if user_info: sign_in_input["userInfo"] = user_info - try: - data = await make_graphql_request( - MUTATIONS["connect_sign_in"], {"input": sign_in_input} - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["connect_sign_in"], {"input": sign_in_input} - ) + data = await make_graphql_request( + MUTATIONS["connect_sign_in"], {"input": sign_in_input} + ) return { "success": True, "action": "connect_sign_in", @@ -302,15 +229,7 @@ def register_settings_tool(mcp: FastMCP) -> None: } if action == "connect_sign_out": - try: - data = await make_graphql_request(MUTATIONS["connect_sign_out"]) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request(MUTATIONS["connect_sign_out"]) + data = await make_graphql_request(MUTATIONS["connect_sign_out"]) return { "success": True, "action": "connect_sign_out", @@ -325,19 +244,9 @@ def register_settings_tool(mcp: FastMCP) -> None: remote_input["forwardType"] = forward_type if port is not None: remote_input["port"] = port - try: - data = await make_graphql_request( - MUTATIONS["setup_remote_access"], {"input": remote_input} - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["setup_remote_access"], {"input": remote_input} - ) + data = await make_graphql_request( + MUTATIONS["setup_remote_access"], {"input": remote_input} + ) return { "success": True, "action": "setup_remote_access", @@ -361,21 +270,10 @@ def register_settings_tool(mcp: FastMCP) -> None: if access_url_ipv6 is not None: url_input["ipv6"] = access_url_ipv6 dra_vars = {"input": {"url": url_input, "enabled": dynamic_enabled}} - try: - data = await make_graphql_request( - MUTATIONS["enable_dynamic_remote_access"], - dra_vars, - ) - except CredentialsNotConfiguredError: - configured = await elicit_and_configure(ctx) - if not configured: - raise ToolError( - "Credentials required. Run `unraid_health action=setup` to configure." - ) - data = await make_graphql_request( - MUTATIONS["enable_dynamic_remote_access"], - dra_vars, - ) + data = await make_graphql_request( + MUTATIONS["enable_dynamic_remote_access"], + dra_vars, + ) return { "success": True, "action": "enable_dynamic_remote_access",