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
135 changes: 68 additions & 67 deletions mcpgateway/services/gateway_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -2043,6 +2043,7 @@ async def _handle_gateway_failure(self, gateway: DbGateway) -> None:
None

Examples:
>>> from mcpgateway.services.gateway_service import GatewayService
>>> service = GatewayService()
>>> gateway = type('Gateway', (), {
... 'id': 'gw1', 'name': 'test_gw', 'enabled': True, 'reachable': True
Expand Down Expand Up @@ -3463,76 +3464,76 @@ def get_httpx_client_factory(
if tools:
logger.info(f"Fetched {len(tools)} tools from gateway")

# Fetch resources if supported
resources = []
logger.debug(f"Checking for resources support: {capabilities.get('resources')}")
if capabilities.get("resources"):
try:
response = await session.list_resources()
raw_resources = response.resources
for resource in raw_resources:
resource_data = resource.model_dump(by_alias=True, exclude_none=True)
# Convert AnyUrl to string if present
if "uri" in resource_data and hasattr(resource_data["uri"], "unicode_string"):
resource_data["uri"] = str(resource_data["uri"])
# Add default content if not present
if "content" not in resource_data:
resource_data["content"] = ""
try:
resources.append(ResourceCreate.model_validate(resource_data))
except Exception:
# If validation fails, create minimal resource
resources.append(
ResourceCreate(
uri=str(resource_data.get("uri", "")),
name=resource_data.get("name", ""),
description=resource_data.get("description"),
mime_type=resource_data.get("mimeType"),
uri_template=resource_data.get("uriTemplate") or None,
content="",
)
# Fetch resources if supported
resources = []
logger.debug(f"Checking for resources support: {capabilities.get('resources')}")
if capabilities.get("resources"):
try:
response = await session.list_resources()
raw_resources = response.resources
for resource in raw_resources:
resource_data = resource.model_dump(by_alias=True, exclude_none=True)
# Convert AnyUrl to string if present
if "uri" in resource_data and hasattr(resource_data["uri"], "unicode_string"):
resource_data["uri"] = str(resource_data["uri"])
# Add default content if not present
if "content" not in resource_data:
resource_data["content"] = ""
try:
resources.append(ResourceCreate.model_validate(resource_data))
except Exception:
# If validation fails, create minimal resource
resources.append(
ResourceCreate(
uri=str(resource_data.get("uri", "")),
name=resource_data.get("name", ""),
description=resource_data.get("description"),
mime_type=resource_data.get("mimeType"),
uri_template=resource_data.get("uriTemplate") or None,
content="",
)
logger.info(f"Fetched {len(resources)} resources from gateway")
except Exception as e:
logger.warning(f"Failed to fetch resources: {e}")

# resource template URI
try:
response_templates = await session.list_resource_templates()
raw_resources_templates = response_templates.resourceTemplates
resource_templates = []
for resource_template in raw_resources_templates:
resource_template_data = resource_template.model_dump(by_alias=True, exclude_none=True)

if "uriTemplate" in resource_template_data: # and hasattr(resource_template_data["uriTemplate"], "unicode_string"):
resource_template_data["uri_template"] = str(resource_template_data["uriTemplate"])
resource_template_data["uri"] = str(resource_template_data["uriTemplate"])

if "content" not in resource_template_data:
resource_template_data["content"] = ""
)
logger.info(f"Fetched {len(resources)} resources from gateway")
except Exception as e:
logger.warning(f"Failed to fetch resources: {e}")

resources.append(ResourceCreate.model_validate(resource_template_data))
resource_templates.append(ResourceCreate.model_validate(resource_template_data))
logger.info(f"Fetched {len(resource_templates)} resource templates from gateway")
except Exception as e:
logger.warning(f"Failed to fetch resource templates: {e}")
# resource template URI
try:
response_templates = await session.list_resource_templates()
raw_resources_templates = response_templates.resourceTemplates
resource_templates = []
for resource_template in raw_resources_templates:
resource_template_data = resource_template.model_dump(by_alias=True, exclude_none=True)

if "uriTemplate" in resource_template_data: # and hasattr(resource_template_data["uriTemplate"], "unicode_string"):
resource_template_data["uri_template"] = str(resource_template_data["uriTemplate"])
resource_template_data["uri"] = str(resource_template_data["uriTemplate"])

if "content" not in resource_template_data:
resource_template_data["content"] = ""

resources.append(ResourceCreate.model_validate(resource_template_data))
resource_templates.append(ResourceCreate.model_validate(resource_template_data))
logger.info(f"Fetched {len(resource_templates)} resource templates from gateway")
except Exception as e:
logger.warning(f"Failed to fetch resource templates: {e}")

# Fetch prompts if supported
prompts = []
logger.debug(f"Checking for prompts support: {capabilities.get('prompts')}")
if capabilities.get("prompts"):
try:
response = await session.list_prompts()
raw_prompts = response.prompts
for prompt in raw_prompts:
prompt_data = prompt.model_dump(by_alias=True, exclude_none=True)
# Add default template if not present
if "template" not in prompt_data:
prompt_data["template"] = ""
prompts.append(PromptCreate.model_validate(prompt_data))
logger.info(f"Fetched {len(prompts)} prompts from gateway")
except Exception as e:
logger.warning(f"Failed to fetch prompts: {e}")
# Fetch prompts if supported
prompts = []
logger.debug(f"Checking for prompts support: {capabilities.get('prompts')}")
if capabilities.get("prompts"):
try:
response = await session.list_prompts()
raw_prompts = response.prompts
for prompt in raw_prompts:
prompt_data = prompt.model_dump(by_alias=True, exclude_none=True)
# Add default template if not present
if "template" not in prompt_data:
prompt_data["template"] = ""
prompts.append(PromptCreate.model_validate(prompt_data))
logger.info(f"Fetched {len(prompts)} prompts from gateway")
except Exception as e:
logger.warning(f"Failed to fetch prompts: {e}")

return capabilities, tools, resources, prompts
raise GatewayConnectionError(f"Failed to initialize gateway at{server_url}")
Loading
Loading