mcpField
D
database-lookup

database-lookup

github.com/itallstartedwithaidea数据与数据库4479 次安装29 周前更新
代码仓库

关于 database-lookup

database-lookup 是一项用于查询和整合科学及公共数据库的 Agent Skills 技能。它可路由查询、统一结果格式并缓存响应,支持可复现的研究工作流。

主要功能

  1. 01查询 78+ 个科学及公共数据库
  2. 02按数据领域路由查询
  3. 03将响应统一为 DataFrame
  4. 04处理分页与 API 错误
  5. 05缓存结果以供离线分析

适用场景

  1. 01从 PubChem 或 ChEMBL 获取化合物数据
  2. 02在 UniProt 查询蛋白质信息
  3. 03搜索 ClinicalTrials.gov 上的研究
  4. 04整合多个研究数据库的数据

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill database-lookup

安装后在 Claude Code 中输入/database-lookup确认已加载。

详细介绍

数据库查询

Agent Skills™ 的一部分,由 googleadsagent.ai™ 提供

描述

Database Lookup 提供对 78 个以上科学和公共数据库的统一编程访问,涵盖化学(PubChem、ChEMBL)、生物学(UniProt、COSMIC、Ensembl)、临床(ClinicalTrials.gov、FDA)、经济学(FRED、World Bank)和知识产权(USPTO、EPO)。Agent 会构建 API 查询、处理分页、规范化响应,并缓存结果,以支持可复现的研究工作流。

科学研究日益依赖整合多个异构数据库中的数据。一个药物发现项目可能需要针对单个研究问题,查询 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 登录号)
  • 对大型结果集进行分页处理,切勿假设所有结果都能在一次响应中返回
  • 记录每次 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 许可证

评论

支持 Markdown