From cec254b4327cab9a54a3ebbd38003f852d3419d6 Mon Sep 17 00:00:00 2001 From: Jacob Magar Date: Sat, 14 Mar 2026 04:17:17 -0400 Subject: [PATCH] feat(elicitation): add ctx + credential elicitation to unraid_users --- unraid_mcp/tools/users.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/unraid_mcp/tools/users.py b/unraid_mcp/tools/users.py index cea4cc4..b94973c 100644 --- a/unraid_mcp/tools/users.py +++ b/unraid_mcp/tools/users.py @@ -6,11 +6,21 @@ Note: Unraid GraphQL API does not support user management operations (list, add, from typing import Any, Literal +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.users.elicit_and_configure" +# and "unraid_mcp.tools.users.CredentialsNotConfiguredError" +elicit_and_configure = _elicit +CredentialsNotConfiguredError = _CredErr +Context = _Context QUERIES: dict[str, str] = { @@ -30,7 +40,10 @@ def register_users_tool(mcp: FastMCP) -> None: """Register the unraid_users tool with the FastMCP instance.""" @mcp.tool() - async def unraid_users(action: USER_ACTIONS = "me") -> dict[str, Any]: + async def unraid_users( + action: USER_ACTIONS = "me", + ctx: Context | None = None, + ) -> dict[str, Any]: """Query current authenticated user. Actions: @@ -43,7 +56,15 @@ def register_users_tool(mcp: FastMCP) -> None: with tool_error_handler("users", action, logger): logger.info("Executing unraid_users action=me") - data = await make_graphql_request(QUERIES["me"]) + try: + data = await make_graphql_request(QUERIES["me"]) + 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(QUERIES["me"]) return data.get("me") or {} logger.info("Users tool registered successfully")