{"_id":"@cyanheads/chembl-mcp-server","_rev":"8-d8c61691974fe0c7ed079aaceb479936","name":"@cyanheads/chembl-mcp-server","dist-tags":{"latest":"0.3.2"},"versions":{"0.2.0":{"name":"@cyanheads/chembl-mcp-server","version":"0.2.0","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"cyanheads <casey@caseyjhand.com> (https://github.com/cyanheads/chembl-mcp-server#readme)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.2.0","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"357b58930c5c56a6720a9312749bc38b1e474992","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.2.0.tgz","fileCount":71,"integrity":"sha512-UCKk9IppG0eFZmwCQwyaLi4J3TBd5fohSAVLsNmP7KdxVXYmKRBhYvJOKGNazOT8o33IY3xE0zkTT5yt6VFAcQ==","signatures":[{"sig":"MEUCIGbvreNLePtrp4Dy0ayeS+j8MpGcOHIn3zA31NB+1zS6AiEAsBtC33BuEsOKLF38GXRKWwEd/iTB8lidhPDNAnifENc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":298551},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"357b58930c5c56a6720a9312749bc38b1e474992","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-UCKk9IppG0eFZmwCQwyaLi4J3TBd5fohSAVLsNmP7KdxVXYmKRBhYvJOKGNazOT8o33IY3xE0zkTT5yt6VFAcQ==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.4-r.1","@cyanheads/mcp-ts-core":"^0.10.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.11","devDependencies":{"ignore":"^7.0.5","vitest":"^4.1.8","depcheck":"^1.4.7","tsc-alias":"^1.8.17","typescript":"^6.0.3","@types/node":"^26.0.1","@biomejs/biome":"2.5.1"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.2.0_1782621680704_0.7884510220269576","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@cyanheads/chembl-mcp-server","version":"0.2.1","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.2.1","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"8a13d13e87c97393dace67c8b20f258b1afbfef7","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.2.1.tgz","fileCount":72,"integrity":"sha512-05fLj4M5S7jxasGC7wJy/DrjlH78uh0Wb85qbSXoFZAPtmio0adNTSwOKCwdndFz59NiiJB2SJIXAc7VdEVMWQ==","signatures":[{"sig":"MEQCIFn3TSSv8L1QZ4a5YBrJUcDXvf0Glws/6HtuUvL3wuIpAiB6vYHWQ5UyQqq0XdBem0NNHkdiPfCIkASK0hiMnvw9IQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":331068},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"8a13d13e87c97393dace67c8b20f258b1afbfef7","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-05fLj4M5S7jxasGC7wJy/DrjlH78uh0Wb85qbSXoFZAPtmio0adNTSwOKCwdndFz59NiiJB2SJIXAc7VdEVMWQ==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.1","@cyanheads/mcp-ts-core":"^0.11.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"ignore":"^7.0.6","vitest":"^4.1.10","depcheck":"^1.4.7","tsc-alias":"^1.9.1","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"2.5.6","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.2.1_1786597064403_0.9950736104729179","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@cyanheads/chembl-mcp-server","version":"0.2.2","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.2.2","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"e5aceb5e88fe14b8795fee791c16961a8f296375","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.2.2.tgz","fileCount":73,"integrity":"sha512-+OxKA2riCfSj2VVTOLg7TFyxdsy5UX2oown9zl+LJfY3hydydssuMvTi8fUyfUMUBIMiZ39oGri2I7AM/s9o/g==","signatures":[{"sig":"MEUCIGU4UXVetduH1DnAU4I8Gfw57aP7ctDpsTUyVlrbkWmXAiEA/Hw5zqikIZk8jrFMeVJ372fZCYZgkjNJ87Fde+1lVC0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":353882},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"e5aceb5e88fe14b8795fee791c16961a8f296375","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-+OxKA2riCfSj2VVTOLg7TFyxdsy5UX2oown9zl+LJfY3hydydssuMvTi8fUyfUMUBIMiZ39oGri2I7AM/s9o/g==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.1","@cyanheads/mcp-ts-core":"^0.11.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"ignore":"^7.0.6","vitest":"^4.1.10","depcheck":"^1.4.7","tsc-alias":"^1.9.1","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"2.5.6","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.2.2_1786602255349_0.5755785066838617","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@cyanheads/chembl-mcp-server","version":"0.2.3","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.2.3","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"49966330010018ad66e3efe22c733827b10b1e68","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.2.3.tgz","fileCount":74,"integrity":"sha512-yOOT1LGdnvEbJYZ/hVCwGz4rLBry+5dTXfxqPFWlpWZ9LSAVX8GOWk5YR7R5t+6Vscf9jzgGrM8Zq/Its/l27w==","signatures":[{"sig":"MEUCIDgbkylJcywh8sHs9kYG4skCXoM50uEsavrYf6/y9OydAiEA6PQK8eR+A8Vyt0uosd9BUOWDF2ss0zXJ2QE00C7zlPk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371879},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"49966330010018ad66e3efe22c733827b10b1e68","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-yOOT1LGdnvEbJYZ/hVCwGz4rLBry+5dTXfxqPFWlpWZ9LSAVX8GOWk5YR7R5t+6Vscf9jzgGrM8Zq/Its/l27w==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"24.3.0","dependencies":{"zod":"^4.4.3","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.1","@cyanheads/mcp-ts-core":"^0.11.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.3.14","devDependencies":{"ignore":"^7.0.6","vitest":"^4.1.10","depcheck":"^1.4.7","tsc-alias":"^1.9.1","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"2.5.6","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.2.3_1786607518904_0.34011988715689623","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@cyanheads/chembl-mcp-server","version":"0.2.4","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.2.4","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"7da716ffa25e8240636696ab6177149526f23640","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.2.4.tgz","fileCount":75,"integrity":"sha512-4d4FATkm5roZTkIWKBwpWukmmixzhQZ9WOw5SeGyFC0uSlneEFGPBErSVoeZ5tIuIbtKvNtKMBMZfiF0FVZRrQ==","signatures":[{"sig":"MEQCICkqI0RMLbIIfAlmp/xDsxcz24+OAaWgypSKMghvniK3AiBhkFRSXOq0rnhpD5BcwT6t3qmkObaaUOfHjoMMK65Mgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":376203},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"7da716ffa25e8240636696ab6177149526f23640","engines":{"bun":">=1.3.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-4d4FATkm5roZTkIWKBwpWukmmixzhQZ9WOw5SeGyFC0uSlneEFGPBErSVoeZ5tIuIbtKvNtKMBMZfiF0FVZRrQ==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.4","@cyanheads/mcp-ts-core":"^0.12.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.6","vitest":"^4.1.11","depcheck":"^1.4.7","tsc-alias":"^1.9.2","typescript":"^7.0.2","@types/node":"^26.2.0","@biomejs/biome":"2.5.10","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.2.4_1787646679977_0.9736312912064908","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@cyanheads/chembl-mcp-server","version":"0.3.0","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.3.0","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"a5f775d568dde354b91453f928d50082974e0591","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.3.0.tgz","fileCount":76,"integrity":"sha512-yB3zh6evBMTVx2836fqzn7j83PZ7+wpH8ZEo2MCqhjfErFzkuh2z0o9Y18TFZ/NgPwvYJAJqjDIlHrcwiv1ysA==","signatures":[{"sig":"MEQCIHWexZyFprC9LtPtsyvLryUaPTIdgMvYlvAhgWx/krIcAiBMk0pSwYGqdZJV+AVbHu2BZtpziigBKrAnqeYYMwhrzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDSOK8T8NtdiBIZzjbYJyj57JjsYDHD9SAHtS+Tq2z8DAIhANM37Rs3UrBsxfgQx3yqfypq07mdUpUp7ICJ/FXfQQBZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387128},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"a5f775d568dde354b91453f928d50082974e0591","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-yB3zh6evBMTVx2836fqzn7j83PZ7+wpH8ZEo2MCqhjfErFzkuh2z0o9Y18TFZ/NgPwvYJAJqjDIlHrcwiv1ysA==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.5","@cyanheads/mcp-ts-core":"^0.13.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.0","devDependencies":{"ignore":"^7.0.9","vitest":"^4.1.11","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"^26.6.1","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.2"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.3.0_1789851963048_0.07822685546538843","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@cyanheads/chembl-mcp-server","version":"0.3.1","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","_id":"@cyanheads/chembl-mcp-server@0.3.1","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"bin":{"chembl-mcp-server":"dist/index.js"},"dist":{"shasum":"5bf16c897b1611ebe0f8efb0bcd745d8d1537e6e","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.3.1.tgz","fileCount":77,"integrity":"sha512-YA9cxHCNpGEeuhlncPARQj7Qzk7J/9BofXqW5n7fuyCRXC90x/WK+6FRKaK2M2V8LUuc2AlqVlZqR1oF5Ib4nw==","signatures":[{"sig":"MEUCIQD3THq1k6PVcOD8gw9uybiqd9kRawZBS4goCQc5FTLXmgIgK/FuExwNNKV0vzkHzg8Hl2ioomT2YuM5sp3f0Bt5zaI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDbMOr6dF+6LKbs7BbYn3YI3KfFUtiXOVbQ4XQzj5nCRwIgHv2EnfVAETBs6kgs/r1f/QcT7pqgnruG8CTgpqPeY7s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":406306},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","shasum":"5bf16c897b1611ebe0f8efb0bcd745d8d1537e6e","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"_integrity":"sha512-YA9cxHCNpGEeuhlncPARQj7Qzk7J/9BofXqW5n7fuyCRXC90x/WK+6FRKaK2M2V8LUuc2AlqVlZqR1oF5Ib4nw==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.5","@cyanheads/mcp-ts-core":"^0.13.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"ignore":"^7.0.10","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"^26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.3"},"_npmOperationalInternal":{"tmp":"tmp/chembl-mcp-server_0.3.1_1790460594736_0.42971209453215553","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"_id":"@cyanheads/chembl-mcp-server@0.3.2","bin":{"chembl-mcp-server":"dist/index.js"},"bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"dist":{"shasum":"ad31cfcfa26fd801ce1b3615095ab9d6127830c9","tarball":"https://registry.npmjs.org/@cyanheads/chembl-mcp-server/-/chembl-mcp-server-0.3.2.tgz","fileCount":78,"integrity":"sha512-xYuntndKX689C4krKX7Q/nlsfXNwhsuwQo4qq+2sb2n+DqqYP88l/jj5gLaztDkzeGynpDtP5F8z0sxrQQ4Bug==","signatures":[{"sig":"MEUCIGpd005MJ7G3c+hBxfYMPeEKPWPh/YjkY5PWoBzVR13AAiEAmNGbLvlcrpjbGUO6b7Ry7twVrYTjfKtYK1DVRzeUnnQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEcZSrbCh/AhybVeQ6yr3ZtNRwptpRehnU84l8h4t4HyAiEA1O2WRY4AEfjY9RUGVu05AVO3spQR+AOag2QhNj6w6R0="}],"unpackedSize":407729},"main":"dist/index.js","name":"@cyanheads/chembl-mcp-server","type":"module","types":"dist/index.d.ts","author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","shasum":"ad31cfcfa26fd801ce1b3615095ab9d6127830c9","engines":{"bun":">=1.4.0","node":">=24.0.0"},"funding":[{"url":"https://github.com/sponsors/cyanheads","type":"github"},{"url":"https://www.buymeacoffee.com/cyanheads","type":"buy_me_a_coffee"}],"license":"Apache-2.0","mcpName":"io.github.cyanheads/chembl-mcp-server","scripts":{"test":"vitest run","tree":"bun run scripts/tree.ts","build":"bun run scripts/build.ts","clean":"bun run scripts/clean.ts","start":"node dist/index.js","bundle":"bun run build && npx -y @anthropic-ai/mcpb pack . dist/chembl-mcp-server.mcpb && bun run scripts/clean-mcpb.ts dist/chembl-mcp-server.mcpb","format":"biome check --write .","rebuild":"bun run scripts/clean.ts && bun run scripts/build.ts","devcheck":"bun run scripts/devcheck.ts","lint:mcp":"bun run scripts/lint-mcp.ts","audit:fix":"bun audit fix","start:http":"MCP_TRANSPORT_TYPE=http node dist/index.js","list-skills":"bun run scripts/list-skills.ts","publish-mcp":"mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish","start:stdio":"MCP_TRANSPORT_TYPE=stdio node dist/index.js","audit:refresh":"rm -f bun.lock && bun install && bun audit","format:unsafe":"biome check --write --unsafe .","lint:packaging":"bun run scripts/lint-packaging.ts","release:github":"bun run scripts/release-github.ts","changelog:build":"bun run scripts/build-changelog.ts","changelog:check":"bun run scripts/build-changelog.ts --check"},"version":"0.3.2","_npmUser":{"name":"cyanheads","email":"casey@caseyjhand.com"},"homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"_integrity":"sha512-xYuntndKX689C4krKX7Q/nlsfXNwhsuwQo4qq+2sb2n+DqqYP88l/jj5gLaztDkzeGynpDtP5F8z0sxrQQ4Bug==","repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"_npmVersion":"10.8.3","description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","directories":{},"maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.6.5","pino-pretty":"^13.1.3","@duckdb/node-api":"^1.5.5-r.5","@cyanheads/mcp-ts-core":"^0.13.9"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"bun@1.4.2","devDependencies":{"ignore":"^7.0.10","vitest":"^5.0.1","depcheck":"^1.4.7","tsc-alias":"^1.9.5","typescript":"^7.0.2","@types/node":"^26.6.2","@biomejs/biome":"2.5.14","@socketsecurity/bun-security-scanner":"^1.1.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chembl-mcp-server_0.3.2_1790461943169_0.9891483248169979"}}},"time":{"created":"2026-06-28T04:41:20.511Z","modified":"2026-09-26T22:32:23.407Z","0.2.0":"2026-06-28T04:41:20.846Z","0.2.1":"2026-08-13T04:57:44.555Z","0.2.2":"2026-08-13T06:24:15.508Z","0.2.3":"2026-08-13T07:51:59.026Z","0.2.4":"2026-08-25T08:31:20.133Z","0.3.0":"2026-09-19T21:06:03.240Z","0.3.1":"2026-09-26T22:09:54.826Z","0.3.2":"2026-09-26T22:32:23.261Z"},"bugs":{"url":"https://github.com/cyanheads/chembl-mcp-server/issues"},"author":"Casey Hand <casey@caseyjhand.com> (https://caseyjhand.com)","license":"Apache-2.0","homepage":"https://github.com/cyanheads/chembl-mcp-server#readme","keywords":["mcp","mcp-server","model-context-protocol","typescript","bun","stdio","streamable-http","chembl","drug-discovery","bioactivity","cheminformatics","compounds","protein-targets","medicinal-chemistry","ai-agent"],"repository":{"url":"git+https://github.com/cyanheads/chembl-mcp-server.git","type":"git"},"description":"Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.","maintainers":[{"name":"cyanheads","email":"casey@caseyjhand.com"}],"readme":"<div align=\"center\">\n  <h1>@cyanheads/chembl-mcp-server</h1>\n  <p><b>Link compounds to protein targets, rank bioactivity (IC50/Ki/EC50), and look up drug mechanisms and indications over ChEMBL via MCP. STDIO or Streamable HTTP.</b>\n  <div>7 Tools (+1 opt-in) • 2 Resources</div>\n  </p>\n</div>\n\n<div align=\"center\">\n\n[![Version](https://img.shields.io/badge/Version-0.3.2-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/chembl-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-^2.1.0-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/chembl-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/chembl-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.2-blueviolet.svg?style=flat-square)](https://bun.sh/)\n\n</div>\n\n<div align=\"center\">\n\n[![Install in Claude Desktop](https://img.shields.io/badge/Install_in-Claude_Desktop-D97757?style=for-the-badge&logo=anthropic&logoColor=white)](https://github.com/cyanheads/chembl-mcp-server/releases/latest/download/chembl-mcp-server.mcpb) [![Install in Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en/install-mcp?name=chembl-mcp-server&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBjeWFuaGVhZHMvY2hlbWJsLW1jcC1zZXJ2ZXIiXX0=) [![Install in VS Code](https://img.shields.io/badge/VS_Code-Install_Server-0098FF?style=for-the-badge&logo=visualstudiocode&logoColor=white)](https://vscode.dev/redirect?url=vscode:mcp/install?%7B%22name%22%3A%22chembl-mcp-server%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40cyanheads%2Fchembl-mcp-server%22%5D%7D)\n\n[![Framework](https://img.shields.io/badge/Built%20on-@cyanheads/mcp--ts--core-67E8F9?style=flat-square)](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)\n\n</div>\n\n<div align=\"center\">\n\n**Public Hosted Server:** [https://chembl.caseyjhand.com/mcp](https://chembl.caseyjhand.com/mcp)\n\n</div>\n\n---\n\n## Overview\n\nDrug-discovery data over ChEMBL (EBI) — the curated link between compounds, protein targets, and measured bioactivity (IC50/Ki/EC50), plus drug mechanisms and indications. Search compounds by name, ID, or structure, resolve protein targets, rank bioactivity measurements, and look up drug mechanisms and indications from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.\n\n### Tools\n\n| Tool | Description |\n|:---|:---|\n| `chembl_search_molecules` | Find compounds by name / ChEMBL ID / InChIKey, or run a structure search (exact \\| similarity \\| substructure) from a SMILES. |\n| `chembl_get_bioactivities` | The flagship compound↔target bridge: bioactivity measurements for a molecule, a target, or **both** (the compound×target pair), ranked on `pchembl_value`, or the measurements without one via `potency_view`. Large sets spill to a canvas. |\n| `chembl_search_targets` | Resolve a protein / gene symbol / UniProt accession to the ChEMBL target ID `chembl_get_bioactivities` needs. |\n| `chembl_get_drug_info` | Drug pharmacology — mechanism(s) of action, molecular target(s), action type, first-approval year, and clinical indications. |\n| `chembl_get_assay` | Assay provenance behind a bioactivity row — type, target, organism, and ChEMBL's 1–9 confidence score. |\n| `chembl_dataframe_query` | Run a read-only SQL `SELECT` over the bioactivity rows spilled to a canvas — rank, group, dedupe, aggregate across the full set. |\n| `chembl_dataframe_describe` | List the tables and columns staged on a canvas, so you can write correct SQL before querying. |\n| `chembl_dataframe_drop` | Drop a named staged table from a canvas. Opt-in via `CHEMBL_DATAFRAME_DROP_ENABLED=true` — absent from `tools/list` when off, since TTL already reclaims staged tables. |\n\n### Resources\n\n| Resource | Description |\n|:---|:---|\n| `chembl://molecule/{chemblId}` | A molecule record by ChEMBL ID — the same shape a `chembl_search_molecules` row carries. |\n| `chembl://target/{chemblId}` | A target record by ChEMBL target ID — preferred name, type, organism, and component UniProt accessions + gene symbols. |\n\nAll resource data is also reachable via the tools, so tool-only MCP clients lose nothing. There are no prompts — the canonical workflows are short tool chains an agent composes directly, and the cross-server chain guidance ships as server-level `instructions` instead.\n\n## Capability reference\n\n### `chembl_search_molecules` <sub>tool</sub>\n\n- Default `search_type=name` matches drug names, synonyms, ChEMBL IDs, and InChIKeys in one query; a query that is exactly a ChEMBL ID or InChIKey routes to ChEMBL's single-record lookup instead of the fuzzy text index (`totalCount: 1`)\n- Structure search via `search_type`: `exact`, `similarity` (Tanimoto ≥ `similarity_threshold`, integer 40–100, default 70), or `substructure` — supply `structure` as a SMILES; `max_phase_min` (name search only) restricts to compounds at or above a max clinical phase\n- Every row carries `max_phase`, MW, AlogP, Lipinski rule-of-five violations, and QED; only `search_type=similarity` results carry a Tanimoto `similarity` percent — absent, not null, on other modes\n- Paginated via `nextCursor` / `cursor`, omitted (not null) on the last page — redeem a cursor with the same filters that minted it\n- Chain `molecule_chembl_id` into `chembl_get_bioactivities` or `chembl_get_drug_info`\n\n---\n\n### `chembl_get_bioactivities` <sub>tool</sub>\n\n- Supply at least one of `molecule_chembl_id` or `target_chembl_id`; supplying both narrows to that compound–target pair — neither is a `missing_filter` error\n- Filter by `standard_type` (IC50/Ki/EC50/…), `pchembl_value_min`, `assay_type`, `organism`; ranked on `pchembl_value` — comparable only within one `standard_type`\n- `potency_view` selects `potency_ranked` (default, measurements with a derivable `pchembl_value`) or `null_potency` (the excluded rows); `pchembl_value_min` with `null_potency` is a `contradictory_potency_filter` error, and `totalCount` spans both views\n- Numerics are coerced to `number | null` at the service boundary — a missing potency reads as `null`, never `0`\n- Large sets spill to a DataCanvas table per view (`bioactivities` / `bioactivities_null_potency`), capped at `CHEMBL_MAX_SPILL_ROWS` (default 50,000) and reported `truncated: true` + `staged_row_count` when hit; requires `CANVAS_PROVIDER_TYPE=duckdb`\n- The inline preview is always capped at `limit` (default 25) regardless of spill status; the optional `canvas_id` reuses a canvas, but re-querying the same view replaces its prior rows\n\n---\n\n### `chembl_search_targets` <sub>tool</sub>\n\n- Supply at least one of `accession` (UniProt, e.g. `P00533`), `gene_symbol`, or `query` (free-text); narrow with `organism` and `target_type` — none supplied is a `missing_input` error\n- A UniProt accession is the most precise input — chain it from a `uniprot`/`protein` server\n- Each row carries target type, organism, and component UniProt accessions + gene symbols, flattened from ChEMBL's nested component synonyms\n- Paginated via `nextCursor` / `cursor`, the same contract as `chembl_search_molecules`\n- Chain `target_chembl_id` into `chembl_get_bioactivities`\n\n---\n\n### `chembl_get_drug_info` <sub>tool</sub>\n\n- Supply `molecule_chembl_id`; returns mechanism(s) of action, molecular target(s), action type, first-approval year, and clinical indications with the max phase reached for each\n- Mechanisms and indications are fetched with `Promise.allSettled`, so a rejected list degrades to a disclosed partial result rather than failing the call\n- Each list carries its own `mechanisms_status` / `indications_status` (`complete` / `truncated` / `failed`) next to a `*_total_count` — an empty array is authoritative only when the status is `complete`\n- A mechanism's `target_chembl_id` chains into `chembl_get_bioactivities`\n\n---\n\n### `chembl_get_assay` <sub>tool</sub>\n\n- Supply `assay_chembl_id` from a `chembl_get_bioactivities` row\n- Returns description, assay type (binding / functional / ADMET / toxicity), the target measured, organism, and ChEMBL's 1–9 confidence score (9 = direct assay on the protein target, lower = homologous or indirect)\n- Call it to judge whether two measurements are comparable before ranking them together\n\n---\n\n### `chembl_dataframe_query` <sub>tool</sub>\n\n- Accepts a single read-only `SELECT` against a `canvas_id` from a spilled `chembl_get_bioactivities` call; writes, DDL, and non-SELECT statements are rejected by the framework SQL gate\n- Reference each staged table by the name `chembl_get_bioactivities` returned — `bioactivities` (potency_ranked) or `bioactivities_null_potency` (null_potency); discover columns with `chembl_dataframe_describe` first\n- Two independent bounds, each disclosed: `truncated` is the canvas engine's own query-result cap; `rendered_rows` is how many rows the `content[]` markdown table holds under its character budget — either can trip without the other; page past both with SQL `LIMIT`/`OFFSET`\n- `structuredContent.rows` always carries the full materialized result regardless of the render bound\n- Requires `CANVAS_PROVIDER_TYPE=duckdb`, else a `canvas_disabled` error\n\n---\n\n### `chembl_dataframe_describe` <sub>tool</sub>\n\n- Supply a `canvas_id` from a spilled `chembl_get_bioactivities` call\n- Returns each staged table/view with its row count, kind, and column names + types\n- Requires `CANVAS_PROVIDER_TYPE=duckdb`, else a `canvas_disabled` error\n\n---\n\n### `chembl_dataframe_drop` <sub>tool</sub>\n\n- Opt-in — registered only when `CHEMBL_DATAFRAME_DROP_ENABLED=true`; absent from `tools/list` when off, though it still appears in the server manifest carrying the enable hint\n- Drops a named staged table by `canvas_id` + `table_name`; returns `dropped: true` if it existed, `false` if already gone\n- Rarely needed — per-table and per-canvas TTL already reclaim staged tables; reach for it only to free a large table early in a long session\n- Requires `CANVAS_PROVIDER_TYPE=duckdb`\n\n---\n\n### `chembl://molecule/{chemblId}` <sub>resource</sub>\n\n- Molecule record as `application/json` — the same shape a `chembl_search_molecules` row carries (ID, names, structures, properties, max clinical phase)\n- `chemblId` is validated against the `CHEMBL\\d+` pattern\n- Fully covered by the tool surface — a convenience injectable-context mirror of the per-record fetch\n\n---\n\n### `chembl://target/{chemblId}` <sub>resource</sub>\n\n- Target record as `application/json` — preferred name, type, organism, and component UniProt accessions + gene symbols\n- `chemblId` is validated against the `CHEMBL\\d+` pattern\n- Fully covered by the tool surface — a convenience injectable-context mirror of the per-record fetch\n\n## Features\n\nBuilt on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core): stdio and Streamable HTTP transports, pluggable auth (`none` / `jwt` / `oauth`), swappable storage (`in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`), structured logging with optional OpenTelemetry tracing.\n\nChEMBL-specific:\n\n- Bidirectional bioactivity bridge — one tool serves both compound→target and target→compound, ranked on `pchembl_value`\n- Structure search (exact / similarity / substructure) consolidated under one discovery tool via a `search_type` enum\n- String → `number | null` numeric coercion at the service boundary — a missing potency becomes `null`, never `0`\n- DataCanvas spill on the flagship tool — tens-of-thousands-of-row activity sets stream to a DuckDB table you inspect with `chembl_dataframe_describe` and query via `chembl_dataframe_query`\n- Server-level `instructions` carry the cross-server chain guidance and the ChEMBL CC BY-SA 3.0 attribution requirement\n\nAgent-friendly output:\n\n- Provenance on every response — total-found counts, applied-filter echo, and a spill notice so agents know whether the preview is the full set or a slice of a canvas table\n- Truncation disclosure — capped searches report `shown` / `cap` / `totalCount`, and spilled tables report `truncated` + `staged_row_count`, so a page or slice is never mistaken for the complete set\n- Typed, recoverable errors — `missing_filter` / `missing_input` / `contradictory_potency_filter` / `canvas_disabled` carry recovery hints, so callers correct the call without parsing prose\n- Never fabricates — normalization and `format()` preserve `null` potency / units; a missing measurement renders as \"not reported\", never `0`\n\n## Getting started\n\n### Public Hosted Instance\n\nA public instance is available at `https://chembl.caseyjhand.com/mcp` — no installation required. Point any MCP client at it via Streamable HTTP:\n\n```json\n{\n  \"mcpServers\": {\n    \"chembl-mcp-server\": {\n      \"type\": \"streamable-http\",\n      \"url\": \"https://chembl.caseyjhand.com/mcp\"\n    }\n  }\n}\n```\n\n### Self-Hosted / Local\n\nChEMBL is keyless — no API key or account is required.\n\nAdd the following to your MCP client configuration file:\n\n```json\n{\n  \"mcpServers\": {\n    \"chembl-mcp-server\": {\n      \"type\": \"stdio\",\n      \"command\": \"bunx\",\n      \"args\": [\"@cyanheads/chembl-mcp-server@latest\"],\n      \"env\": {\n        \"MCP_TRANSPORT_TYPE\": \"stdio\",\n        \"MCP_LOG_LEVEL\": \"info\"\n      }\n    }\n  }\n}\n```\n\nOr with npx (no Bun required):\n\n```json\n{\n  \"mcpServers\": {\n    \"chembl-mcp-server\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@cyanheads/chembl-mcp-server@latest\"],\n      \"env\": {\n        \"MCP_TRANSPORT_TYPE\": \"stdio\",\n        \"MCP_LOG_LEVEL\": \"info\"\n      }\n    }\n  }\n}\n```\n\nOr with Docker:\n\n```json\n{\n  \"mcpServers\": {\n    \"chembl-mcp-server\": {\n      \"type\": \"stdio\",\n      \"command\": \"docker\",\n      \"args\": [\"run\", \"-i\", \"--rm\", \"-e\", \"MCP_TRANSPORT_TYPE=stdio\", \"ghcr.io/cyanheads/chembl-mcp-server:latest\"]\n    }\n  }\n}\n```\n\nFor Streamable HTTP, set the transport and start the server:\n\n```sh\nMCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http\n# Server listens at http://localhost:3010/mcp\n```\n\nTo unlock the analytical SQL path (the `bioactivities` spill and the `chembl_dataframe_*` tools), add `\"CANVAS_PROVIDER_TYPE\": \"duckdb\"` to the `env`.\n\n### Prerequisites\n\n- [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).\n- Optional: set `CANVAS_PROVIDER_TYPE=duckdb` to enable the DataCanvas SQL path for large bioactivity sets.\n\n### Installation\n\n1. **Clone the repository:**\n\n```sh\ngit clone https://github.com/cyanheads/chembl-mcp-server.git\n```\n\n2. **Navigate into the directory:**\n\n```sh\ncd chembl-mcp-server\n```\n\n3. **Install dependencies:**\n\n```sh\nbun install\n```\n\n4. **Configure environment:**\n\n```sh\ncp .env.example .env\n# edit .env to override any defaults (all optional)\n```\n\n## Configuration\n\nAll configuration is validated at startup via Zod schemas in `src/config/server-config.ts`. ChEMBL is keyless, so every variable is optional.\n\n| Variable | Description | Default |\n|:---|:---|:---|\n| `CANVAS_PROVIDER_TYPE` | Set to `duckdb` to enable the bioactivity spill and the `chembl_dataframe_*` SQL tools. When `none`, large sets inline a preview but never spill. | `none` |\n| `CHEMBL_API_BASE_URL` | Base URL for the ChEMBL REST data API. Override for a private mirror or pinned host. | `https://www.ebi.ac.uk/chembl/api/data` |\n| `CHEMBL_REQUEST_TIMEOUT_MS` | Per-request timeout in milliseconds for upstream ChEMBL fetches. | `30000` |\n| `CHEMBL_MAX_PAGE_SIZE` | ChEMBL per-page cap when streaming activity pages for the spill (max 1000). | `1000` |\n| `CHEMBL_DEFAULT_LIMIT` | Default result limit applied when callers omit it. | `25` |\n| `CHEMBL_MAX_SPILL_ROWS` | Ceiling on rows `chembl_get_bioactivities` stages to a canvas table, and so on the upstream page drain behind it. Over the cap the response reports `truncated: true`. | `50000` |\n| `CHEMBL_DATAFRAME_DROP_ENABLED` | Register the opt-in `chembl_dataframe_drop` tool (absent from `tools/list` when off). | `false` |\n| `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |\n| `MCP_HTTP_PORT` | Port for the HTTP server. | `3010` |\n| `MCP_SESSION_MODE` | HTTP session posture; `stateless`, `stateful`, or `auto` (resolves to `stateful`). Overrides the server's stateless declaration. | `stateless` |\n| `MCP_AUTH_MODE` | Auth mode: `none`, `jwt`, or `oauth`. | `none` |\n| `MCP_LOG_LEVEL` | Log level (RFC 5424). | `info` |\n| `LOGS_DIR` | Directory for log files (Node.js only). | `<project-root>/logs` |\n| `LOG_TOOL_FAILURE_PAYLOADS` | Log failed calls' arguments and results with key-name redaction; secrets inside free-form values remain visible. | `false` |\n| `LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES` | UTF-8 byte cap per logged input/result payload. | `16384` |\n| `OTEL_ENABLED` | Enable [OpenTelemetry instrumentation](https://github.com/cyanheads/mcp-ts-core/tree/main/docs/telemetry). | `false` |\n| `OTEL_EXPORTER_OTLP_ENDPOINT` | Base URL for traces and metrics, using `/v1/traces` and `/v1/metrics`. | — |\n| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Explicit full endpoint for OTLP log export. Requires the optional log peers; included in the default Docker build. | — |\n\nSee [`.env.example`](./.env.example) for the full list of optional overrides.\n\n## Running the server\n\n### Local development\n\n- **Build and run:**\n\n  ```sh\n  # One-time build\n  bun run rebuild\n\n  # Run the built server\n  bun run start:stdio\n  # or\n  bun run start:http\n  ```\n\n- **Run checks and tests:**\n\n  ```sh\n  bun run devcheck   # Lint, format, typecheck, security, changelog sync\n  bun run test       # Vitest test suite\n  bun run lint:mcp   # Validate MCP definitions against spec\n  ```\n\n### Docker\n\n```sh\ndocker build -t chembl-mcp-server .\ndocker run --rm -e MCP_TRANSPORT_TYPE=stdio chembl-mcp-server\n```\n\nThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to `/var/log/chembl-mcp-server`. OpenTelemetry peer dependencies are installed by default — build with `--build-arg OTEL_ENABLED=false` to omit them. Dependency installation and security scanning run on the builder's native platform, with Bun's `--cpu` and `--os` selecting DuckDB bindings for the target `linux/amd64` or `linux/arm64` image. The slim runtime receives that production dependency tree, so `CANVAS_PROVIDER_TYPE=duckdb` works on either image architecture.\n\n## Project structure\n\n| Directory | Purpose |\n|:---|:---|\n| `src/index.ts` | `createApp()` entry point — registers tools/resources and inits the ChEMBL service + optional canvas. |\n| `src/config` | Server-specific environment variable parsing and validation with Zod. |\n| `src/mcp-server/tools/definitions` | Tool definitions (`*.tool.ts`). Five ChEMBL tools plus the three `chembl_dataframe_*` canvas tools. |\n| `src/mcp-server/resources/definitions` | Resource definitions (`*.resource.ts`). Molecule and target record mirrors. |\n| `src/services/chembl` | The single ChEMBL upstream client — URL builder, pagination, numeric coercion, nested-structure flattening, activity page stream. |\n| `src/services/canvas-accessor.ts` | Module-level holder for the optional `DataCanvas` wired in `createApp({ setup })`. |\n| `tests/` | Unit and integration tests mirroring `src/`. |\n\n## Development guide\n\nSee [`CLAUDE.md`/`AGENTS.md`](./CLAUDE.md) for development guidelines and architectural rules. The short version:\n\n- Handlers throw, framework catches — no `try/catch` in tool logic\n- Use `ctx.log` for request-scoped logging, `ctx.state` for tenant-scoped storage\n- Register new tools and resources in the `createApp()` arrays\n- Wrap the ChEMBL API: validate raw → normalize to the flat domain type → return the output schema; never fabricate missing fields (absent numerics become `null`, never `0`)\n\n## Contributing\n\nIssues are welcome. Run checks and tests before submitting:\n\n```sh\nbun run devcheck\nbun run test\n```\n\n## License\n\nApache-2.0 — see [LICENSE](./LICENSE) for details.\n","readmeFilename":"README.md"}