Create pubmed.py
Browse files- mcp/pubmed.py +46 -0
mcp/pubmed.py
ADDED
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# mcp/pubmed.py
|
2 |
+
|
3 |
+
import httpx
|
4 |
+
import xmltodict
|
5 |
+
import os
|
6 |
+
|
7 |
+
PUBMED_ESEARCH = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi"
|
8 |
+
PUBMED_EFETCH = "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi"
|
9 |
+
PUB_KEY = os.environ.get("PUB_KEY")
|
10 |
+
|
11 |
+
async def fetch_pubmed(query: str, max_results: int = 5):
|
12 |
+
"""Fetch latest PubMed articles for the query."""
|
13 |
+
async with httpx.AsyncClient() as client:
|
14 |
+
params = {
|
15 |
+
"db": "pubmed",
|
16 |
+
"term": query,
|
17 |
+
"retmax": max_results,
|
18 |
+
"retmode": "json",
|
19 |
+
"api_key": PUB_KEY
|
20 |
+
}
|
21 |
+
resp = await client.get(PUBMED_ESEARCH, params=params)
|
22 |
+
ids = resp.json()["esearchresult"]["idlist"]
|
23 |
+
if not ids:
|
24 |
+
return []
|
25 |
+
efetch_params = {
|
26 |
+
"db": "pubmed",
|
27 |
+
"id": ",".join(ids),
|
28 |
+
"retmode": "xml",
|
29 |
+
"api_key": PUB_KEY
|
30 |
+
}
|
31 |
+
efetch_resp = await client.get(PUBMED_EFETCH, params=efetch_params)
|
32 |
+
articles = xmltodict.parse(efetch_resp.text)["PubmedArticleSet"].get("PubmedArticle", [])
|
33 |
+
if not isinstance(articles, list): # Single article
|
34 |
+
articles = [articles]
|
35 |
+
results = []
|
36 |
+
for a in articles:
|
37 |
+
art = a["MedlineCitation"]["Article"]
|
38 |
+
results.append({
|
39 |
+
"title": art["ArticleTitle"],
|
40 |
+
"authors": ", ".join([a["LastName"] + " " + a["ForeName"] for a in art.get("AuthorList", {}).get("Author", []) if "LastName" in a and "ForeName" in a]),
|
41 |
+
"summary": art.get("Abstract", {}).get("AbstractText", [""])[0],
|
42 |
+
"link": f"https://pubmed.ncbi.nlm.nih.gov/{a['MedlineCitation']['PMID']['#text']}/",
|
43 |
+
"published": art.get("ArticleDate", [{}])[0].get("Year", ""),
|
44 |
+
"source": "PubMed"
|
45 |
+
})
|
46 |
+
return results
|