关于 pubchem-mcp-server
pubchem-mcp-server 将 PubChem 化学数据库的化合物与生物测定数据提供给科研人员和化学信息工作流。它支持多种结构检索,并可查询安全性、生物活性、交叉引用和分子结构。
主要功能
- 01按名称、标识符或结构检索化合物
- 02获取理化性质与药物相似性
- 03查询 GHS 危害分类
- 04筛选生物活性与靶点数据
- 05检索生物测定和实体摘要
适用场景
- 01查找候选化合物并查看性质
- 02核对化学品危害信息
- 03研究化合物的测定结果与分子靶点
- 04获取化合物的结构图或三维结构
MCP 相关
提供 10 个工具和 6 个资源,通过 STDIO 或 Streamable HTTP 暴露 PubChem 查询能力,并有公开托管服务。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://pubchem.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-pubchem https://pubchem.caseyjhand.com/mcp{"mcpServers":{"cyanheads-pubchem":{"type":"http","url":"https://pubchem.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-pubchem":{"type":"http","url":"https://pubchem.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-pubchem":{"type":"http","url":"https://pubchem.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-pubchem":{"serverUrl":"https://pubchem.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
10| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| aid | integer | 否 | 测定搜索必填。要列出的化合物所属的 PubChem 测定 ID(AID),范围为 1 到 2147483647,例如 1000。使用 pubchem_search_assays 查找生物靶标的 AID。 |
| query | string | 否 | 子结构/超结构/相似度搜索必填。SMILES 字符串(例如 "CC(=O)O")或字符串形式的 PubChem CID,范围为 1 到 2147483647(例如 "2244")。 |
| offset | integer | 否 | 要返回的第一个 CID 的从零开始的索引。传入上一次调用返回的 nextOffset,以读取下一页。标识符查找会预先解析所有匹配项,因此分页不产生额外开销;测定搜索仅获取请求的页面。分子式、子结构、超结构和相似度搜索则必须向 PubChem 请求 offset + maxResults 条记录才能到达目标页,因此越深入的页面,上游开销越高——这就是上限为 10000 的原因。默认值:0。 |
| formula | string | 否 | 分子式搜索必填。Hill 记法的分子式(例如 "C6H12O6"、"CaH2O2")。 |
| queryType | enum | 否 | 结构/相似度搜索必填。查询格式:"smiles" 或 "cid"。smiles | cid |
| threshold | number | 否 | 仅用于相似性搜索。最低 Tanimoto 相似度(70–100)。近似类似物使用 90+,骨架跃迁使用 70–80。默认值:90。 |
| activeOnly | boolean | 否 | 仅用于生物测定搜索。为 true(默认值)时,仅列出测定结果标记为活性的化合物;为 false 时,列出所有受测化合物。 |
| maxResults | integer | 否 | 每页返回的最大 CID 数。每次调用上限为 200:较大的值(最高 1000)仍会返回 200 条,并在 cappedInputs 中报告。使用 offset 获取此页之后的匹配项。默认值:20。 |
| properties | array | 否 | 可选:为每个结果获取这些属性,避免后续再调用详情接口。例如:["MolecularFormula", "MolecularWeight", "CanonicalSMILES"]。 |
| searchType | enum | 是 | 搜索策略;每种模式都需要各自的字段。"identifier":按名称/SMILES/InChIKey 查找——需要 identifierType 和 identifiers。"formula":按分子式查找——需要 formula。"substructure":查找包含查询结构作为子结构的化合物。"superstructure":查找自身是查询结构子结构的化合物。"similarity":计算与查询结构的 2D Tanimoto 相似度。substructure、superstructure 和 similarity 需要 query 和 queryType。"assay":查找在 PubChem 生物测定中受测的化合物——需要 aid;activeOnly(默认值为 true)仅保留测定结果标记为活性的化合物。identifier | formula | substructure | superstructure | similarity | assay |
| identifiers | array | 否 | 标识符搜索必填。要解析的标识符数组。每次调用上限为 25:先查询前 25 个,其余项(总计最多 1000 个)按输入顺序返回在 unprocessed 中,并在 cappedInputs 中报告。示例:名称查询使用 ["aspirin", "ibuprofen"];SMILES 查询使用 ["CC(=O)OC1=CC=CC=C1C(=O)O"];inchikey 查询使用 ["BSYNRYMUTXBXSQ-UHFFFAOYSA-N"](27 字符块格式;查询前会转为大写,接受任意大小写)。 |
| identifierType | enum | 否 | 标识符搜索必填。化学标识符类型:"name"、"smiles" 或 "inchikey"。name | smiles | inchikey |
| allowOtherElements | boolean | 否 | 仅用于分子式搜索。为 true 时,包含除分子式所列元素之外还含有其他元素的化合物。 |
详细介绍
@cyanheads/pubchem-mcp-server
通过 MCP 搜索 PubChem 化学数据库中的化合物、属性、安全数据、生物活性、交叉引用和实体摘要。支持 STDIO 或 Streamable HTTP。
概述
PubChem 中的化学化合物和生物测定。按名称、分子式或结构搜索化合物;获取属性、安全数据、生物活性、药物与食物相互作用、分子靶点和 3D 结构;并按生物靶点查找生物测定。
工具
| 工具 | 描述 |
|---|---|
pubchem_search_compounds | 按名称、SMILES、InChI、InChIKey、分子式、子结构、超结构或二维相似性搜索化合物,或列出某项生物测定发现具有活性的化合物。 |
pubchem_get_compound_details | 按 CID 获取化合物的理化性质、描述、同义词、类药性和分类信息。 |
pubchem_get_compound_image | 按 CID 获取化合物的二维结构图(PNG)。 |
pubchem_get_compound_3d_structure | 按 CID 获取化合物的三维构象(原子坐标和键),格式为已解析的 JSON 或原始 SDF。 |
pubchem_get_compound_xrefs | 获取外部数据库交叉引用(PubMed、专利、基因、CAS 和 EC 编号等)。 |
pubchem_get_compound_safety | 按 CID 获取一个或多个化合物的 GHS 危害分类和安全数据(批量)。 |
pubchem_get_bioactivity | 获取化合物的生物活性概况:测定结果、靶标、活性值、测定类型和引用的 PubMed ID;可按结果、分子靶标或测定类型筛选。 |
pubchem_get_compound_interactions | 获取化合物的药物-食物相互作用及其测定中提及的分子靶标,并列出各项的测定次数和最强活性值。 |
pubchem_search_assays | 按生物靶标(基因符号、蛋白质、Gene ID、UniProt 登录号)查找生物测定。 |
pubchem_get_summary | 获取 PubChem 实体的摘要:测定、基因、蛋白质、分类学。 |
资源
化合物和测定记录也会以 URI 模板资源的形式提供,底层使用与工具相同的客户端方法;许多 MCP 客户端仅支持工具,不会显示资源。
| 资源 | 描述 |
|---|---|
pubchem://compound/{cid} | 核心理化性质(JSON)。 |
pubchem://compound/{cid}/safety | GHS 危害分类(JSON)。 |
pubchem://compound/{cid}/image | 二维结构图(PNG)。 |
pubchem://compound/{cid}/xrefs | 外部交叉引用(JSON)。 |
pubchem://compound/{cid}/bioactivity | 生物测定活性概况(JSON)。 |
pubchem://assay/{aid} | BioAssay 摘要(JSON)。 |
能力参考
pubchem_search_compounds 工具
- 六种搜索策略:标识符(
identifierType+identifiers;名称/SMILES/InChI/InChIKey,每次调用 25 个,其余返回在unprocessed中)、分子式(formula,Hill 表示法,可选allowOtherElements)、子结构/超结构和二维相似性(query+queryType;相似性阈值为 70-100,默认为 90),或测定(aid;生物测定标记为活性的化合物,或使用activeOnly: false获取所有受测化合物) - 每页最多返回 200 个 CID(默认为 20;更大的
maxResults会按 200 提供,并在cappedInputs中报告);offset可将标识符和测定搜索分页至所有匹配结果,将分子式、子结构、超结构和相似性搜索分页至 10,000 条(更深页数会以offset_ceiling_exceeded失败)。可选的properties可省去后续调用pubchem_get_compound_details - 返回
totalFound;若上游搜索结果已达上限,则返回下限值totalFoundAtLeast;对于没有 CID 的输入,返回unresolvedIdentifiers。未知 AID 会报错aid_not_found;PubChem 无法执行的查询会报错search_query_rejected(并附带提示)
pubchem_get_compound_details 工具
- 每次调用最多处理 100 个 CID(其余返回在
unprocessed中);提供 27 项属性,默认返回其中 14 项核心属性 - 可选的描述(
descriptionOffset/maxDescriptions,默认为 3,最多 20 条)和分类信息(FDA、MeSH、ATC)仅涵盖前 10 个 CID,其余列在skippedCids中。可选的同义词(synonymOffset/maxSynonyms,默认为 20,最多 100 个)和 Lipinski/Veber 类药性检查会涵盖所有找到的 CID - 每个 CID 的
found: false可区分不存在的 CID 与没有数据的化合物
pubchem_get_compound_image 工具
- 单个 CID;
size为"small"(100x100)或"large"(300x300,默认值) - 返回经过 Base64 编码的 PNG,以及宽度和高度
- 如果 PubChem 中没有该 CID 的记录,则返回类型化的
cid_not_found错误
pubchem_get_compound_3d_structure 工具
- 单个 CID;
format="json"(默认值)返回已解析的原子(元素 + x/y/z)和键;format="sdf"返回原始 V2000 SDF 文本 maxAtoms/maxBonds限制 JSON 预览内容(默认值均为 200);atomCount/bondCount始终报告完整总数,并通过补充信息说明是否进行了限制includeRawSdf可绕过原始 SDF 文本默认的 500 行上限- 可选的
includeAlternateConformerIds会列出默认值之外的构象 ID - 如果 PubChem 没有计算出的 3D 坐标(大型分子、混合物、某些盐类),则返回类型化的
no_3d_structure错误
pubchem_get_compound_xrefs 工具
- 单个 CID;一个或多个
xrefTypes:CAS、EC、RN、RegistryID、PatentID、PubMedID、GeneID、ProteinGI、TaxonomyID CAS和EC是为该化合物提交的编号,包含每个不同的值,并按提交该值的来源记录数量排序;这些数量列在sourceCounts中。RN是 PubChem 未排序的注册号列表:CAS 号与已弃用及相关的 CAS RN 和 EC 编号并列- PubChem 当前无法为
ProteinGI返回数据;请使用GeneID查询基因/蛋白质关联 maxPerType最高为 500(默认值为 50),单个offset会应用于每种类型;每种类型都会报告totalAvailable和truncated。PubMedID按从新到旧的顺序排列- 加载失败的类型会列在
failedTypes中,其他类型仍会返回;只有当某种类型加载失败,且除 ProteinGI(PubChem 已不再提供)外没有任何类型加载成功时,调用才会失败。空结果会说明该化合物没有所请求的类型,或 CID 可能有误
pubchem_get_compound_safety 工具
- 每次调用最多处理 25 个 CID(其余 CID 会列在
unprocessed中) - 返回合并自多个来源的 GHS 信号词、象形图、H 代码和 P 代码,以及包含各来源自身标签的
classifications[];预防性说明带有decoded标志 - 每个 CID 的
status为:ok、not_classified(通知方未发现 GHS 危害)、no_ghs_data(没有提交的分类信息)或cid_not_found,因此错误的 CID 不会被误报为“无危害记录”
pubchem_get_bioactivity 工具
- 单个 CID;可通过
outcomeFilter(active/inactive/all,默认值为all)、targetGeneId/targetAccession和assayType(可为confirmatory/screening/summary/other中的任意值)筛选;测定必须通过所有已设置的筛选条件 - 靶标筛选条件会匹配与同一靶标关联的任何标识符,因此 Gene ID 5742、UniProt P23219 和 RefSeq NP_542158 都能找到相同的 COX-1 测定
- 每条结果都包含测定的
assayType及其引用的 PubMed ID(pmids,按从新到旧的顺序排列) - 每页最多返回 100 条结果(默认值为 20);
offset可用于获取其余结果。针对多个靶标的测定会报告匹配的靶标,并将其他靶标列在otherTargets下 - 报告整个化合物的
totalAssays/activeCount/inactiveCount,以及当前页的filteredCount/returnedCount;提示信息会说明无数据、筛选条件排除了所有结果,或offset超出结果范围
pubchem_get_compound_interactions 工具
- 单个 CID;一个或多个
kinds——drug-food(PUG View)、target、drug-drug(DrugBank);默认为["drug-food"],空的 drug-food 页面会指向target target会为化合物检测摘要中列出的每个靶标返回一条记录:一个 Gene ID 及表格与其配对的登录号,或一个表格从未与其配对的标识符。即使 Gene ID 和登录号指向同一种蛋白质,只要没有任何行将二者配对,它们就会作为单独的记录出现(厄洛替尼的 ERBB2 会分别显示为accession:P04626和GeneID:2064)。每条记录会列出通过批量基因或蛋白质摘要查询获取的靶标名称,以及pubchem_get_bioactivity用于筛选的GeneID:或accession:值,并注明各结果的检测数量,以及效力最高的 Active 值和对应的 AID。Active 靶标排在前面,并按效力从高到低排序。如果名称查询失败,或几秒内没有响应,记录会保留标识符,并注明这一情况- 每页每种类型的
maxEntries(上限为 50,默认为 10);offset按记录计数(target中为靶标),最大为 2,147,483,646。每种类型单独分页,结果显示在paging[](totalRecords/nextOffset/truncated)中 - 失败的类型会列在
failedKinds中,其他类型仍会返回。drug-drug数据来自 PubChem 的 SDQ 服务,该服务会拒绝自动请求,因此它会列入failedKinds,重试也无济于事
pubchem_search_assays 工具
- 按
targetType搜索:genesymbol/proteinname(文本)、geneid(NCBI Gene ID)、proteinaccession(UniProt) - 每页最多 200 个 AID(默认为 50);
offset用于翻页浏览结果 - 如果
targetQuery为空白,或geneid不是数字,则拒绝请求 - 返回
totalFound,并区分“无匹配项”和“offset 超出结果范围”
pubchem_get_summary 工具
entityType:assay(AID)、gene(NCBI Gene ID)、protein(UniProt 登录号)或taxonomy(Tax ID);每次调用最多 10 个标识符- 以逗号连接的字符串会拆分为多个标识符;超过前 10 个的部分会返回在
unprocessed中,超过 1000 个时会以too_many_identifiers失败 - AID、Gene ID 和 Tax ID 必须是大于 0 且不超过 2147483647 的整数;其他部分会返回
invalid: true的行,只有在没有任何可用标识符时,调用才会以invalid_identifier失败 - 每个标识符都有
found标志;字段因entityType而异(taxonomy:有序的lineage;gene:symbol/taxonomy;assay:method、前 25 个targets及targetCount、已测试/活性化合物数量、lastDataChange)
pubchem://compound/{cid} 资源
- 核心理化性质(与
pubchem_get_compound_details的默认 14 个属性集相同),格式为application/json - 如果 CID 在 PubChem 中不存在,则抛出类型化的未找到错误
- 如需选择特定属性或添加描述、同义词、类药性和分类信息,请使用
pubchem_get_compound_details
pubchem://compound/{cid}/safety 资源
- GHS 危害分类,格式为
application/json,包括各来源的ghs.classifications和贡献者source列表 status(ok/not_classified/no_ghs_data/cid_not_found)是唯一能区分无效 CID 和未提交分类的化合物的信号——资源读取没有通知提示面
pubchem://compound/{cid}/image 资源
- 2D 结构图,300x300 PNG,以 base64 blob 的形式返回
- 如需 100x100 尺寸选项,请使用
pubchem_get_compound_image
pubchem://compound/{cid}/xrefs 资源
- 精简的默认集合——
RN、RegistryID、PubMedID、CAS(含sourceCounts)——每种类型最多 25 个 ID,格式为application/json;PubMed ID 按分配时间从新到旧排列,返回最新分配的 25 个。无法加载的类型会列在failedTypes中 - 如需完整的交叉引用类型集合、提高每种类型的上限以及按偏移量分页,请使用
pubchem_get_compound_xrefs
pubchem://compound/{cid}/bioactivity 资源
- 以
application/json返回最多 25 个测定结果,每个结果包含assayType和pmids;还会返回整个化合物的totalAssays/activeCount;多靶点测定会在otherTargets中列出其余靶点 - 使用
pubchem_get_bioactivity按结果、靶点或测定类型筛选,提高上限,或使用偏移量分页
pubchem://assay/{aid} 资源
- 以
application/json返回 BioAssay 摘要——名称、描述、来源、方案、物质数量 - 如果 AID 不存在,则抛出带类型的未找到错误
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),并支持结构化日志记录和可选的 OpenTelemetry 跟踪。
PubChem 专属功能:
- 覆盖 PUG REST 和 PUG View 端点,以及用于药物相互作用的 SDQ
- 具有限流功能的客户端(5 req/s),支持请求排队,并在发生暂时性故障时重试一次
- 每次调用的预算为 50 s;上游响应缓慢时会以
Timeout失败,调用被取消时会以RequestCancelled失败 - 内置 V2000 SDF 解析器,可解析 3D 构象;药物相似性根据已获取的属性计算
- 所有工具均为只读且幂等,无需 API 密钥
适合 Agent 的输出:
- 每个 CID 都有
status和found标志,调用方可据此判断数据,而不必匹配错误字符串 - 批量工具会返回各项结果,以及
unresolvedIdentifiers、skippedCids、failedKinds和failedTypes,而不是让整个调用失败 - 对列表进行截断时会注明
truncated、shown/cap和nextOffset;超出大小上限的批次会在上限范围内处理,其余部分通过cappedInputs和unprocessed报告 - 失败结果包含带类型的
reason(例如cid_not_found、missing_identifier_args、invalid_cid_query)以及恢复提示
入门
公共托管实例
公共实例可通过 https://pubchem.caseyjhand.com/mcp 使用——无需安装。将任意 MCP 客户端通过 Streamable HTTP 指向该实例:
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "streamable-http",
"url": "https://pubchem.caseyjhand.com/mcp"
}
}
}
自托管 / 本地
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/pubchem-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio"
}
}
}
}
也可以使用 npx(无需 Bun):
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/pubchem-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio"
}
}
}
}
也可以使用 Docker:
{
"mcpServers": {
"pubchem-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/pubchem-mcp-server:latest"]
}
}
}
要使用 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前置条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥——PubChem 的 API 可免费访问。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/pubchem-mcp-server.git
- 进入目录:
cd pubchem-mcp-server
- 安装依赖:
bun install
- 配置环境(可选):
cp .env.example .env
# edit .env to override transport, session mode, storage, or logging defaults
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务的端口。 | 3010 |
MCP_HTTP_HOST | HTTP 服务的主机。 | 127.0.0.1 |
MCP_SESSION_MODE | stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证模式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(RFC 5424)。 | info |
STORAGE_PROVIDER_TYPE | 存储后端。 | in-memory |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的可选覆盖项列表见 .env.example。
运行服务
本地开发
-
构建并运行:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t pubchem-mcp-server .
docker run --rm -p 3010:3010 pubchem-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/pubchem-mcp-server。默认会安装 OpenTelemetry 对等依赖;构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点——注册工具和资源,并初始化 PubChem 客户端。 |
src/mcp-server/tools/definitions/ | 工具定义(*.tool.ts)。 |
src/mcp-server/resources/definitions/ | 资源定义(*.resource.ts)。 |
src/services/pubchem/ | PubChem API 客户端——速率限制、重试以及响应/SDF 解析。 |
scripts/ | 构建、清理、开发检查和目录树生成脚本。 |
tests/ | 单元测试和集成测试。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简要说明:
- 处理程序抛出异常,框架负责捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log进行请求级日志记录 - 封装外部 API 调用:验证原始 PubChem 响应 → 规范化为领域类型 → 返回输出架构;绝不编造缺失字段
- 在
index.ts汇总文件中注册新工具和资源
贡献
欢迎提交问题。提交前请运行检查:
bun run devcheck
bun run test
许可证
Apache-2.0——详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。