Source code for tooluniverse.worms_tool
import requests
import urllib.parse
from typing import Any, Dict
from .base_tool import BaseTool
from .tool_registry import register_tool
[docs]
@register_tool("WoRMSRESTTool")
class WoRMSRESTTool(BaseTool):
[docs]
def __init__(self, tool_config: Dict):
super().__init__(tool_config)
self.base_url = "https://www.marinespecies.org/rest"
self.session = requests.Session()
self.session.headers.update({"Accept": "application/json"})
self.timeout = 30
[docs]
def _build_url(self, args: Dict[str, Any]) -> str:
url = self.tool_config["fields"]["endpoint"]
for k, v in args.items():
url = url.replace(f"{{{k}}}", str(v))
return url
[docs]
def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
try:
# Build URL with proper encoding
query = arguments.get("query", "")
if not query:
return {"status": "error", "error": "Query parameter is required"}
# URL encode the query
encoded_query = urllib.parse.quote(query)
url = (
f"https://www.marinespecies.org/rest/AphiaRecordsByName/{encoded_query}"
)
response = self.session.get(url, timeout=self.timeout)
response.raise_for_status()
# Check if response is empty
if not response.text.strip():
return {
"status": "success",
"data": [],
"url": url,
"message": "No results found for this query",
}
data = response.json()
# WoRMS returns array of species, extract first few results
if isinstance(data, list) and len(data) > 0:
# Limit results to first 5 for better performance
limited_data = data[:5]
return {
"status": "success",
"data": limited_data,
"url": url,
"count": len(limited_data),
"total_found": len(data),
}
else:
return {"status": "success", "data": data, "url": url}
except Exception as e:
return {"status": "error", "error": f"WoRMS API error: {str(e)}"}