database-lookup について
database-lookup は、科学・公共データベースの情報を取得・統合する Agent Skills のスキルです。クエリの振り分け、結果の正規化、レスポンスのキャッシュにより、再現可能な研究を支援します。
主な機能
- 0178以上の科学・公共データベースを検索
- 02データ分野に応じてクエリを振り分け
- 03レスポンスを DataFrame に正規化
- 04ページネーションと API エラーに対応
- 05結果をキャッシュしてオフライン分析
活用シーン
- 01PubChem または ChEMBL から化合物データを取得
- 02UniProt でタンパク質情報を検索
- 03ClinicalTrials.gov で研究を検索
- 04複数の研究データベースの情報を統合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itallstartedwithaidea/ agent-skills --skill database-lookupインストール後、Claude Code で/database-lookupを入力して読み込まれたか確認します。
詳細
データベース検索
googleadsagent.ai™ による Agent Skills™ の一部です
説明
Database Lookup は、化学(PubChem、ChEMBL)、生物学(UniProt、COSMIC、Ensembl)、臨床(ClinicalTrials.gov、FDA)、経済(FRED、World Bank)、知的財産(USPTO、EPO)にまたがる78以上の科学・公共データベースに、統一されたプログラム経由でアクセスできる機能を提供します。エージェントはAPIクエリを構築し、ページネーションを処理し、レスポンスを正規化して、再現可能な研究ワークフローのために結果をキャッシュします。
科学研究では、複数の異種データベースからデータを統合することがますます重要になっています。創薬プロジェクトでは、1つの研究課題に対して、ChEMBLで生物活性データを、UniProtで標的タンパク質の情報を、PubChemで化合物の特性を、ClinicalTrials.govで関連する臨床試験を、FREDで医療費の傾向を検索することがあります。このスキルは、APIごとの違いを抽象化し、統一されたクエリインターフェースを提供します。
各データベースコネクターは、認証、レート制限、レスポンスの解析、エラー回復を処理します。結果は、ソースAPIの形式(REST JSON、XML、CSV、SPARQL)にかかわらず、一貫したスキーマ(型付き列を持つDataFrame)に正規化されます。キャッシュにより、APIへの重複した呼び出しを防ぎ、以前に取得したデータを使ったオフライン分析が可能になります。
使用する場面
- PubChemまたはChEMBLから化合物データを取得する
- UniProtからタンパク質配列または注釈を検索する
- ClinicalTrials.govで臨床試験を検索する
- FREDまたはWorld Bankから経済指標を取得する
- USPTOで特許情報を検索する
- 複数の科学データベースにまたがるデータを統合する
仕組み
graph TD
A[Research Query] --> B[Query Router]
B --> C{Database Selection}
C -->|Chemistry| D[PubChem / ChEMBL / DrugBank]
C -->|Biology| E[UniProt / Ensembl / COSMIC]
C -->|Clinical| F[ClinicalTrials.gov / FDA / OMIM]
C -->|Economics| G[FRED / World Bank / BLS]
C -->|Patents| H[USPTO / EPO / WIPO]
D --> I[API Request + Rate Limiting]
E --> I
F --> I
G --> I
H --> I
I --> J[Response Normalization]
J --> K[Cache Layer]
K --> L[Unified DataFrame Output]
クエリルーターは、クエリの種類とエンティティに基づいて適切なデータベースを特定します。すべてのレスポンスは正規化され、列名と型が標準化された一貫性のあるDataFrameが生成されます。
実装
import requests
import pandas as pd
from functools import lru_cache
from time import sleep
class DatabaseClient:
BASE_URLS = {
"pubchem": "https://pubchem.ncbi.nlm.nih.gov/rest/pug",
"chembl": "https://www.ebi.ac.uk/chembl/api/data",
"uniprot": "https://rest.uniprot.org/uniprotkb",
"clinicaltrials": "https://clinicaltrials.gov/api/v2/studies",
"fred": "https://api.stlouisfed.org/fred/series/observations",
}
def __init__(self, cache_dir: str = ".db_cache"):
self.session = requests.Session()
self.session.headers["User-Agent"] = "AgentSkills/1.0 (research)"
def pubchem_compound(self, name: str) -> dict:
url = f"{self.BASE_URLS['pubchem']}/compound/name/{name}/JSON"
resp = self._get(url)
props = resp["PC_Compounds"][0]["props"]
return {
"cid": resp["PC_Compounds"][0]["id"]["id"]["cid"],
"name": name,
"properties": {p["urn"]["label"]: p["value"] for p in props},
}
def chembl_target(self, uniprot_id: str) -> pd.DataFrame:
url = f"{self.BASE_URLS['chembl']}/target.json"
resp = self._get(url, params={
"target_components__accession": uniprot_id,
"limit": 100,
})
return pd.json_normalize(resp["targets"])
def uniprot_search(self, query: str, limit: int = 25) -> pd.DataFrame:
url = f"{self.BASE_URLS['uniprot']}/search"
resp = self._get(url, params={
"query": query,
"format": "json",
"size": limit,
"fields": "accession,id,protein_name,organism_name,length,sequence",
})
return pd.json_normalize(resp["results"])
def clinical_trials(self, condition: str, status: str = "RECRUITING") -> pd.DataFrame:
url = self.BASE_URLS["clinicaltrials"]
resp = self._get(url, params={
"query.cond": condition,
"filter.overallStatus": status,
"pageSize": 50,
})
return pd.json_normalize(resp["studies"])
def fred_series(self, series_id: str, api_key: str) -> pd.DataFrame:
url = self.BASE_URLS["fred"]
resp = self._get(url, params={
"series_id": series_id,
"api_key": api_key,
"file_type": "json",
})
df = pd.DataFrame(resp["observations"])
df["value"] = pd.to_numeric(df["value"], errors="coerce")
df["date"] = pd.to_datetime(df["date"])
return df
def _get(self, url: str, params: dict = None) -> dict:
sleep(0.25)
resp = self.session.get(url, params=params, timeout=30)
resp.raise_for_status()
return resp.json()
ベストプラクティス
- レート制限を遵守してください。PubChemは5 req/s、ChEMBLは1 req/s、UniProtは3 req/sです
- オフライン分析を可能にし、サーバー負荷を軽減するため、APIレスポンスをすべてローカルにキャッシュしてください
- データベースをまたいで結合する前に、識別子(CID、ChEMBL ID、UniProt accession)を正規化してください
- 大量の結果を取得する場合はページネーションを処理してください。すべての結果が1回のレスポンスに収まると想定しないでください
- 再現性を確保するため、タイムスタンプとレスポンスハッシュを含め、すべてのAPIクエリをログに記録してください
- ツール名と連絡先情報を示すUser-Agentヘッダーを設定してください
プラットフォームの互換性
| プラットフォーム | サポート | 備考 |
|---|---|---|
| Cursor | 完全対応 | Python + HTTPクライアント |
| VS Code | 完全対応 | RESTクライアント統合 |
| Windsurf | 完全対応 | APIクエリに対応 |
| Claude Code | 完全対応 | データベースクエリの生成 |
| Cline | 完全対応 | API統合 |
| aider | 部分対応 | コードレベルでサポート |
関連スキル
キーワード
database-lookup pubchem chembl uniprot clinical-trials fred scientific-databases api-integration data-retrieval
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License