Skip to content
Merged
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
3 changes: 3 additions & 0 deletions mcpserver/cli/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions mcpserver/core/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
import json
import time

from rich import print

import mcpserver.utils as utils
from mcpserver.logger import logger

Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions mcpserver/tools/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
13 changes: 9 additions & 4 deletions mcpserver/tools/system/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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():
Expand Down
2 changes: 1 addition & 1 deletion mcpserver/version.py
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
Loading