From 5b17f547d970dbc3c03a2f8d3db6fe02d4a513ae Mon Sep 17 00:00:00 2001 From: vsoch Date: Mon, 20 Apr 2026 23:33:48 -0700 Subject: [PATCH 1/2] tweak: ensure repeated tool is noted to user Signed-off-by: vsoch --- mcpserver/cli/manager.py | 3 +++ mcpserver/tools/manager.py | 2 ++ mcpserver/tools/system/system.py | 13 +++++++++---- mcpserver/version.py | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/mcpserver/cli/manager.py b/mcpserver/cli/manager.py index d85a623..3324358 100644 --- a/mcpserver/cli/manager.py +++ b/mcpserver/cli/manager.py @@ -22,6 +22,9 @@ def get_manager(mcp, cfg: MCPConfig): # Handle explicit registration of specific paths (Tools, Prompts, Resources) for endpoint, emoji in register_explicit_capabilities(mcp, cfg): + # A repeated function will return None + if not endpoint: + continue print(f" {emoji} Registered: {endpoint.name}") # Handle SSL diff --git a/mcpserver/tools/manager.py b/mcpserver/tools/manager.py index 201f220..445e987 100644 --- a/mcpserver/tools/manager.py +++ b/mcpserver/tools/manager.py @@ -7,6 +7,7 @@ from fastmcp.tools import Tool from mcpserver.events import get_event_manager +from mcpserver.logger import logger from .base import BaseTool from .system.system import SystemTool @@ -110,6 +111,7 @@ def register_tool(self, mcp, tool_path: str, name: str = None): func = self.load_function(tool_path) actual_name = name or func.__name__ if f"tool:{actual_name}" in self.registered_keys: + logger.warning(f"tool {actual_name} is already registered.") return endpoint = Tool.from_function(func, name=actual_name) mcp.add_tool(endpoint) diff --git a/mcpserver/tools/system/system.py b/mcpserver/tools/system/system.py index a679d70..bda88ac 100644 --- a/mcpserver/tools/system/system.py +++ b/mcpserver/tools/system/system.py @@ -10,11 +10,18 @@ class SystemTool(BaseTool): Primary interface for cluster identity and negotiation. """ - def setup(self, manager=None): + def setup_providers(self): from resource_secretary.providers import discover_providers - self.manager = manager self.catalog = discover_providers() + self.active_providers = [inst for category in self.catalog.values() for inst in category] + + def setup(self, manager=None): + self.manager = manager + try: + self.setup_providers() + except: + self.active_providers = [] # Capture model config from environment or manager defaults # manager.args would contain the CLI values from populate_start_args @@ -24,8 +31,6 @@ def setup(self, manager=None): "base": os.getenv("RESOURCE_SECRETARY_API_BASE"), } - self.active_providers = [inst for category in self.catalog.values() for inst in category] - def build_manifest(self) -> Dict[str, Any]: manifest = {} for category, instances in self.catalog.items(): diff --git a/mcpserver/version.py b/mcpserver/version.py index 19149e1..5316e92 100644 --- a/mcpserver/version.py +++ b/mcpserver/version.py @@ -1,4 +1,4 @@ -__version__ = "0.0.17" +__version__ = "0.0.18" AUTHOR = "Vanessa Sochat" AUTHOR_EMAIL = "vsoch@users.noreply.github.com" NAME = "mcp-serve" From 2bb578a03cb16213ed62f478c455ce16c69e7c8b Mon Sep 17 00:00:00 2001 From: vsoch Date: Tue, 21 Apr 2026 14:49:06 -0700 Subject: [PATCH 2/2] bug: do not require resource provider import Signed-off-by: vsoch --- mcpserver/core/base.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mcpserver/core/base.py b/mcpserver/core/base.py index 98547ba..41f17d8 100644 --- a/mcpserver/core/base.py +++ b/mcpserver/core/base.py @@ -2,6 +2,8 @@ import json import time +from rich import print + import mcpserver.utils as utils from mcpserver.logger import logger @@ -42,6 +44,19 @@ def init_providers(self, mock=False): Probe the local system on startup. E.g., "we found spack, flux, etc." These can be faux (mock) or real discovered providers """ + catalog = {} + try: + catalog = self.init_resource_providers(mock) + except ImportError: + print( + "[red]WARN[/red]: Provider interfaces require [green]pip install resource-secretary[/green]." + ) + self.catalog = catalog + + def init_resource_providers(self, mock=False): + """ + Initialize resource secretary providers (real and mock) + """ # Not required unless serving a worker or hub. from resource_secretary.apps import discover_applications from resource_secretary.providers import discover_providers