Source code for tooluniverse.ebi_proteins_epitope_tool
# ebi_proteins_epitope_tool.py
"""
EBI Proteins API - Epitope endpoint tool for ToolUniverse.
This tool provides access to experimentally-determined epitope regions
on proteins, sourced from the Immune Epitope Database (IEDB). Epitope
data is critical for immunology research, vaccine design, and
understanding immune responses to proteins.
API: https://www.ebi.ac.uk/proteins/api/
No authentication required.
"""
import requests
from typing import Dict, Any
from .base_tool import BaseTool
from .tool_registry import register_tool
EBI_PROTEINS_BASE_URL = "https://www.ebi.ac.uk/proteins/api"
[docs]
@register_tool("EBIProteinsEpitopeTool")
class EBIProteinsEpitopeTool(BaseTool):
"""
Tool for querying protein epitope data from the EBI Proteins API.
Epitopes are regions of proteins recognized by the immune system
(antibodies, T cells). This tool retrieves experimentally-determined
epitope regions from the Immune Epitope Database (IEDB), including
epitope sequences, positions, and supporting literature.
Useful for: vaccine design, therapeutic antibody development,
immunogenicity assessment, B-cell/T-cell epitope mapping.
No authentication required.
"""
[docs]
def __init__(self, tool_config: Dict[str, Any]):
super().__init__(tool_config)
self.timeout = tool_config.get("timeout", 30)
[docs]
def run(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""Execute the EBI Proteins epitope API call."""
try:
return self._get_epitopes(arguments)
except requests.exceptions.Timeout:
return {"error": f"EBI Proteins API timed out after {self.timeout}s"}
except requests.exceptions.ConnectionError:
return {"error": "Failed to connect to EBI Proteins API"}
except requests.exceptions.HTTPError as e:
return {"error": f"EBI Proteins API HTTP error: {e.response.status_code}"}
except Exception as e:
return {"error": f"Unexpected error querying EBI Proteins: {str(e)}"}
[docs]
def _get_epitopes(self, arguments: Dict[str, Any]) -> Dict[str, Any]:
"""Get epitope features for a protein by UniProt accession."""
accession = arguments.get("accession", "")
if not accession:
return {
"error": "accession parameter is required (UniProt accession, e.g., P04637)"
}
url = f"{EBI_PROTEINS_BASE_URL}/epitope/{accession}"
headers = {"Accept": "application/json"}
response = requests.get(url, headers=headers, timeout=self.timeout)
response.raise_for_status()
data = response.json()
# Extract epitope features
features = data.get("features", [])
epitopes = []
for f in features:
evidences = f.get("evidences", [])
pmids = []
iedb_ids = []
for ev in evidences:
src = ev.get("source", {})
if src.get("name") == "PubMed":
pmids.append(src.get("id"))
if src.get("name") == "IEDB":
iedb_ids.append(src.get("id"))
begin_val = f.get("begin")
end_val = f.get("end")
epitopes.append(
{
"type": f.get("type"),
"begin": int(begin_val) if begin_val is not None else None,
"end": int(end_val) if end_val is not None else None,
"sequence": f.get("epitopeSequence"),
"match_score": f.get("matchScore"),
"description": f.get("description"),
"pmids": pmids[:5],
"iedb_ids": iedb_ids[:3],
}
)
return {
"data": {
"accession": data.get("accession"),
"entry_name": data.get("entryName"),
"taxid": data.get("taxid"),
"total_epitopes": len(epitopes),
"epitopes": epitopes,
},
"metadata": {
"source": "EBI Proteins API (IEDB epitopes)",
"accession": accession,
"sequence_length": len(data.get("sequence", "")),
},
}