Source: https://github.com/aipoch/medical-research-skills
When to Use
- You need to search UniProtKB with Lucene-style queries (e.g., by gene name, organism, reviewed status).
- You want to fetch the full details of a specific protein entry by UniProt accession (e.g.,
P12345).
- You need to map identifiers between databases (e.g., gene names, Ensembl IDs, RefSeq IDs ↔ UniProt accessions).
- You are building pipelines that require automated protein annotation retrieval in JSON/TSV/FASTA formats.
- You need a lightweight client that talks directly to UniProt’s REST API without additional SDKs.
Key Features
- Protein search via UniProtKB REST endpoint using Lucene query syntax.
- Entry retrieval by accession with selectable output formats.
- Identifier mapping between supported source/target databases using UniProt ID mapping service.
- Format control (default
json) for consistent downstream parsing.
- Reference docs for query syntax and available API fields:
references/query_syntax.md
references/api_fields.md
Dependencies
- Python
>=3.8
requests >=2.31.0
Example Usage
import time
import requests
BASE = "https://rest.uniprot.org"
def search_protein(query: str, fmt: str = "json", size: int = 5):
"""
Search UniProtKB using Lucene-style query syntax.
"""
url = f"{BASE}/uniprotkb/search"
params = {"query": query, "format": fmt, "size": size}
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()
return r.json() if fmt == "json" else r.text
def retrieve_entry(accession: str, fmt: str = "json"):
"""
Retrieve a UniProtKB entry by accession.
"""
url = f"{BASE}/uniprotkb/{accession}"
params = {"format": fmt}
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()
return r.json() if fmt == "json" else r.text
def id_mapping(from_db: str, to_db: str, ids, poll_interval_s: float = 1.0):
"""
Map identifiers using UniProt ID Mapping.
ids can be a list of strings or a comma-separated string.
"""
if isinstance(ids, (list, tuple)):
ids = ",".join(ids)
# 1) Submit mapping job
submit_url = f"{BASE}/idmapping/run"
r = requests.post(
submit_url,
data={"from": from_db, "to": to_db, "ids": ids},
timeout=30,
)
r.raise_for_status()
job_id = r.json()["jobId"]
# 2) Poll job status
status_url = f"{BASE}/idmapping/status/{job_id}"
while True:
s = requests.get(status_url, timeout=30)
s.raise_for_status()
payload = s.json()
if payload.get("jobStatus") in (None, "FINISHED"):
break
if payload.get("jobStatus") == "FAILED":
raise RuntimeError(f"ID mapping failed: {payload}")
time.sleep(poll_interval_s)
# 3) Fetch results (JSON)
results_url = f"{BASE}/idmapping/results/{job_id}"
res = requests.get(results_url, params={"format": "json"}, timeout=30)
res.raise_for_status()
return res.json()
if __name__ == "__main__":
# Search example: human BRCA1
search = search_protein("gene:BRCA1 AND organism_id:9606", size=3)
print("Search results (first accessions):",
[item["primaryAccession"] for item in search.get("results", [])])
# Retrieve entry example
entry = retrieve_entry("P38398") # UniProt accession for human BRCA1 (example)
print("Entry primaryAccession:", entry.get("primaryAccession"))
print("Protein name:", entry.get("proteinDescription", {}).get("recommendedName", {}).get("fullName", {}).get("value"))
# ID mapping example: gene name -> UniProtKB
mapping = id_mapping(from_db="Gene_Name", to_db="UniProtKB", ids=["BRCA1"])
print("Mapping results keys:", mapping.keys())
Implementation Details
Search Protein
- Uses
GET /uniprotkb/search
- Key parameters:
query: Lucene-style query string (see references/query_syntax.md)
format: output format (default json)
- Optional common parameters:
size, fields, sort
- Returns parsed JSON when
format=json, otherwise raw text.
Retrieve Entry
- Uses
GET /uniprotkb/{accession}
- Key parameters:
accession: UniProt accession (e.g., P12345)
format: output format (default json)
- Suitable for fetching full record details for a known accession.
ID Mapping
- Uses UniProt asynchronous mapping workflow:
POST /idmapping/run with from, to, ids
- Poll
GET /idmapping/status/{jobId} until finished
- Fetch
GET /idmapping/results/{jobId}?format=json
ids accepts either a list or a comma-separated string.
- Recommended parameters:
poll_interval_s: controls polling frequency to avoid excessive requests.
from_db / to_db must match UniProt-supported database identifiers (consult UniProt mapping documentation as needed).
1---2name: uniprot-database-23description: Direct REST API access to UniProt for protein search, entry retrieval, and identifier mapping; use when you need programmatic UniProtKB queries or cross-database ID conversion.4license: MIT5---6> **Source**: [https://github.com/aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills)78## When to Use910- You need to search UniProtKB with Lucene-style queries (e.g., by gene name, organism, reviewed status).11- You want to fetch the full details of a specific protein entry by UniProt accession (e.g., `P12345`).12- You need to map identifiers between databases (e.g., gene names, Ensembl IDs, RefSeq IDs ↔ UniProt accessions).13- You are building pipelines that require automated protein annotation retrieval in JSON/TSV/FASTA formats.14- You need a lightweight client that talks directly to UniProt’s REST API without additional SDKs.1516## Key Features1718- **Protein search** via UniProtKB REST endpoint using Lucene query syntax.19- **Entry retrieval** by accession with selectable output formats.20- **Identifier mapping** between supported source/target databases using UniProt ID mapping service.21- **Format control** (default `json`) for consistent downstream parsing.22- **Reference docs** for query syntax and available API fields:23 - `references/query_syntax.md`24 - `references/api_fields.md`2526## Dependencies2728- Python `>=3.8`29- `requests >=2.31.0`3031## Example Usage3233```python34import time35import requests3637BASE = "https://rest.uniprot.org"3839def search_protein(query: str, fmt: str = "json", size: int = 5):40 """41 Search UniProtKB using Lucene-style query syntax.42 """43 url = f"{BASE}/uniprotkb/search"44 params = {"query": query, "format": fmt, "size": size}45 r = requests.get(url, params=params, timeout=30)46 r.raise_for_status()47 return r.json() if fmt == "json" else r.text4849def retrieve_entry(accession: str, fmt: str = "json"):50 """51 Retrieve a UniProtKB entry by accession.52 """53 url = f"{BASE}/uniprotkb/{accession}"54 params = {"format": fmt}55 r = requests.get(url, params=params, timeout=30)56 r.raise_for_status()57 return r.json() if fmt == "json" else r.text5859def id_mapping(from_db: str, to_db: str, ids, poll_interval_s: float = 1.0):60 """61 Map identifiers using UniProt ID Mapping.62 ids can be a list of strings or a comma-separated string.63 """64 if isinstance(ids, (list, tuple)):65 ids = ",".join(ids)6667 # 1) Submit mapping job68 submit_url = f"{BASE}/idmapping/run"69 r = requests.post(70 submit_url,71 data={"from": from_db, "to": to_db, "ids": ids},72 timeout=30,73 )74 r.raise_for_status()75 job_id = r.json()["jobId"]7677 # 2) Poll job status78 status_url = f"{BASE}/idmapping/status/{job_id}"79 while True:80 s = requests.get(status_url, timeout=30)81 s.raise_for_status()82 payload = s.json()83 if payload.get("jobStatus") in (None, "FINISHED"):84 break85 if payload.get("jobStatus") == "FAILED":86 raise RuntimeError(f"ID mapping failed: {payload}")87 time.sleep(poll_interval_s)8889 # 3) Fetch results (JSON)90 results_url = f"{BASE}/idmapping/results/{job_id}"91 res = requests.get(results_url, params={"format": "json"}, timeout=30)92 res.raise_for_status()93 return res.json()9495if __name__ == "__main__":96 # Search example: human BRCA197 search = search_protein("gene:BRCA1 AND organism_id:9606", size=3)98 print("Search results (first accessions):",99 [item["primaryAccession"] for item in search.get("results", [])])100101 # Retrieve entry example102 entry = retrieve_entry("P38398") # UniProt accession for human BRCA1 (example)103 print("Entry primaryAccession:", entry.get("primaryAccession"))104 print("Protein name:", entry.get("proteinDescription", {}).get("recommendedName", {}).get("fullName", {}).get("value"))105106 # ID mapping example: gene name -> UniProtKB107 mapping = id_mapping(from_db="Gene_Name", to_db="UniProtKB", ids=["BRCA1"])108 print("Mapping results keys:", mapping.keys())109```110111## Implementation Details112113- **Search Protein**114 - Uses `GET /uniprotkb/search`115 - Key parameters:116 - `query`: Lucene-style query string (see `references/query_syntax.md`)117 - `format`: output format (default `json`)118 - Optional common parameters: `size`, `fields`, `sort`119 - Returns parsed JSON when `format=json`, otherwise raw text.120121- **Retrieve Entry**122 - Uses `GET /uniprotkb/{accession}`123 - Key parameters:124 - `accession`: UniProt accession (e.g., `P12345`)125 - `format`: output format (default `json`)126 - Suitable for fetching full record details for a known accession.127128- **ID Mapping**129 - Uses UniProt asynchronous mapping workflow:130 1. `POST /idmapping/run` with `from`, `to`, `ids`131 2. Poll `GET /idmapping/status/{jobId}` until finished132 3. Fetch `GET /idmapping/results/{jobId}?format=json`133 - `ids` accepts either a list or a comma-separated string.134 - Recommended parameters:135 - `poll_interval_s`: controls polling frequency to avoid excessive requests.136 - `from_db` / `to_db` must match UniProt-supported database identifiers (consult UniProt mapping documentation as needed).