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/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 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"