UniProt Protein Database Query
Query the UniProt REST API for protein information.
When to Use
- User asks about a protein's function, sequence, or annotation
- User provides a gene name and wants protein info
- User needs protein accession IDs
- User asks "what does gene X do" (protein level)
How to Execute
import requests
import json
BASE_URL = "https://rest.uniprot.org"
# 1. Search by gene name (default: human, reviewed/Swiss-Prot)
def search_uniprot(gene_name, organism_id=9606, max_results=5):
url = f"{BASE_URL}/uniprotkb/search"
params = {
"query": f"gene_exact:{gene_name} AND organism_id:{organism_id} AND reviewed:true",
"format": "json",
"size": max_results,
"fields": "accession,id,gene_names,protein_name,organism_name,length,cc_function,ft_domain,sequence"
}
r = requests.get(url, params=params)
r.raise_for_status()
return r.json()
# 2. Get by accession ID
def get_uniprot_entry(accession):
url = f"{BASE_URL}/uniprotkb/{accession}.json"
# Request an explicit field set so the response shape is deterministic.
params = {"fields": "accession,id,gene_names,protein_name,organism_name,length,cc_function,ft_domain,sequence"}
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()
return r.json()
# 3. Get FASTA sequence
def get_fasta(accession):
url = f"{BASE_URL}/uniprotkb/{accession}.fasta"
r = requests.get(url)
r.raise_for_status()
return r.text
# Example usage
data = search_uniprot("TP53")
for entry in data.get("results", []):
acc = entry["primaryAccession"]
name = entry.get("proteinDescription", {}).get("recommendedName", {}).get("fullName", {}).get("value", "N/A")
gene = entry.get("genes", [{}])[0].get("geneName", {}).get("value", "N/A")
length = entry.get("sequence", {}).get("length", "N/A")
# Extract function
functions = [c["texts"][0]["value"] for c in entry.get("comments", []) if c["commentType"] == "FUNCTION"]
func_text = functions[0][:200] if functions else "N/A"
print(f"Accession: {acc}")
print(f"Protein: {name}")
print(f"Gene: {gene}")
print(f"Length: {length} aa")
print(f"Function: {func_text}")
Common Search Patterns
- By gene:
gene_exact:BRCA1 AND organism_id:9606
- By keyword:
keyword:kinase AND organism_id:9606
- By disease:
cc_disease:cancer AND organism_id:9606
- By GO term:
go:apoptosis AND organism_id:9606
- Species IDs: Human=9606, Mouse=10090, Rat=10116, Zebrafish=7955, Fly=7227, Yeast=559292
Output Format
Present: Accession, protein name, gene, organism, length, function summary, and UniProt link.
Follow-up Suggestions
- "Want me to get the AlphaFold structure for this protein?"
- "Should I check protein-protein interactions on STRING?"
- "Want me to BLAST this protein sequence?"
1---2name: query-uniprot3description: Query UniProt protein database. Use when user asks about protein sequences, functions, annotations, domains, or protein identifiers. Triggers on "uniprot", "protein function", "protein sequence", "gene product", "protein info".4---56# UniProt Protein Database Query78Query the UniProt REST API for protein information.910## When to Use1112- User asks about a protein's function, sequence, or annotation13- User provides a gene name and wants protein info14- User needs protein accession IDs15- User asks "what does gene X do" (protein level)1617## How to Execute1819```python20import requests21import json2223BASE_URL = "https://rest.uniprot.org"2425# 1. Search by gene name (default: human, reviewed/Swiss-Prot)26def search_uniprot(gene_name, organism_id=9606, max_results=5):27 url = f"{BASE_URL}/uniprotkb/search"28 params = {29 "query": f"gene_exact:{gene_name} AND organism_id:{organism_id} AND reviewed:true",30 "format": "json",31 "size": max_results,32 "fields": "accession,id,gene_names,protein_name,organism_name,length,cc_function,ft_domain,sequence"33 }34 r = requests.get(url, params=params)35 r.raise_for_status()36 return r.json()3738# 2. Get by accession ID39def get_uniprot_entry(accession):40 url = f"{BASE_URL}/uniprotkb/{accession}.json"41 # Request an explicit field set so the response shape is deterministic.42 params = {"fields": "accession,id,gene_names,protein_name,organism_name,length,cc_function,ft_domain,sequence"}43 r = requests.get(url, params=params, timeout=30)44 r.raise_for_status()45 return r.json()4647# 3. Get FASTA sequence48def get_fasta(accession):49 url = f"{BASE_URL}/uniprotkb/{accession}.fasta"50 r = requests.get(url)51 r.raise_for_status()52 return r.text5354# Example usage55data = search_uniprot("TP53")56for entry in data.get("results", []):57 acc = entry["primaryAccession"]58 name = entry.get("proteinDescription", {}).get("recommendedName", {}).get("fullName", {}).get("value", "N/A")59 gene = entry.get("genes", [{}])[0].get("geneName", {}).get("value", "N/A")60 length = entry.get("sequence", {}).get("length", "N/A")61 62 # Extract function63 functions = [c["texts"][0]["value"] for c in entry.get("comments", []) if c["commentType"] == "FUNCTION"]64 func_text = functions[0][:200] if functions else "N/A"65 66 print(f"Accession: {acc}")67 print(f"Protein: {name}")68 print(f"Gene: {gene}")69 print(f"Length: {length} aa")70 print(f"Function: {func_text}")71```7273## Common Search Patterns7475- By gene: `gene_exact:BRCA1 AND organism_id:9606`76- By keyword: `keyword:kinase AND organism_id:9606`77- By disease: `cc_disease:cancer AND organism_id:9606`78- By GO term: `go:apoptosis AND organism_id:9606`79- Species IDs: Human=9606, Mouse=10090, Rat=10116, Zebrafish=7955, Fly=7227, Yeast=5592928081## Output Format8283Present: Accession, protein name, gene, organism, length, function summary, and UniProt link.8485## Follow-up Suggestions8687- "Want me to get the AlphaFold structure for this protein?"88- "Should I check protein-protein interactions on STRING?"89- "Want me to BLAST this protein sequence?"