Source code for tooluniverse.cdc_tool
import requests
from typing import Dict, Any, Optional
from urllib.parse import urlencode
from .base_tool import BaseTool
from .tool_registry import register_tool
CDC_DATA_BASE_URL = "https://data.cdc.gov"
[docs]
@register_tool("CDCRESTTool")
class CDCRESTTool(BaseTool):
"""CDC Data.CDC.gov REST API tool (Socrata-based open data portal)."""
[docs]
def __init__(self, tool_config):
super().__init__(tool_config)
self.endpoint_template = tool_config["fields"]["endpoint"]
[docs]
def _build_url(self, arguments: Dict[str, Any]) -> str:
"""Build the full CDC Data API URL with path parameters and query string."""
endpoint = self.endpoint_template
# Replace path parameters
if "{dataset_id}" in endpoint:
if "dataset_id" not in arguments:
raise ValueError("dataset_id is required")
endpoint = endpoint.replace("{dataset_id}", arguments["dataset_id"])
url = f"{CDC_DATA_BASE_URL}{endpoint}"
# Build query parameters (Socrata API format)
query_params = {}
# Handle search query
if "search_query" in arguments and arguments["search_query"]:
query_params["$q"] = arguments["search_query"]
# Handle category
if "category" in arguments and arguments["category"]:
query_params["category"] = arguments["category"]
# Handle limit ($limit in Socrata)
limit = arguments.get("limit", 50)
if limit:
query_params["$limit"] = min(limit, 1000) if "views.json" in endpoint else min(limit, 50000)
# Handle offset ($offset in Socrata)
offset = arguments.get("offset", 0)
if offset:
query_params["$offset"] = offset
# Handle WHERE clause
if "where_clause" in arguments and arguments["where_clause"]:
query_params["$where"] = arguments["where_clause"]
# Handle ORDER BY
if "order_by" in arguments and arguments["order_by"]:
query_params["$order"] = arguments["order_by"]
# Add query string
if query_params:
url += "?" + urlencode(query_params)
return url
[docs]
def _make_request(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""Make HTTP request to CDC Data API."""
try:
url = self._build_url(arguments)
except ValueError as e:
return {"error": str(e)}
try:
resp = requests.get(url, timeout=30)
resp.raise_for_status()
data = resp.json()
return {
"data": data,
"metadata": {
"source": "CDC Data.CDC.gov",
"endpoint": url.split("?")[0],
"query": arguments,
},
}
except requests.exceptions.RequestException as e:
return {"error": f"Request failed: {str(e)}"}
except ValueError as e:
return {"error": f"Failed to parse JSON: {str(e)}"}
[docs]
def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""Execute the CDC Data tool."""
# Validate required parameters
if "{dataset_id}" in self.endpoint_template:
if "dataset_id" not in arguments:
return {"error": "dataset_id is required"}
return self._make_request(arguments)