Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.json +1775 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_0_of_4.json +0 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_1_of_4.json +0 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_2_of_4.json +0 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_3_of_4.json +0 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/Dockerfile +40 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/abundancebin_server.py +134 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/abundancebin_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/requirements.txt +1 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/requirements.txt +2 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/app/anarci_server.py +183 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/app/anarci_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/Dockerfile +40 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/app/requirements.txt +1 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/requirements.txt +2 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/Dockerfile +40 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/app/bioconductor-alabaster.spatial_server.py +289 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/app/bioconductor-alabaster.spatial_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/requirements.txt +2 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-annotationhub/requirements.txt +2 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/Dockerfile +40 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/bioconductor-awaggregator_server.py +214 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/bioconductor-awaggregator_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/requirements.txt +1 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/requirements.txt +2 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-bsgenome/app/bioconductor-bsgenome_server.py +270 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-bsgenome/app/bioconductor-bsgenome_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/Dockerfile +40 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/bioconductor-cardspa_server.py +181 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/bioconductor-cardspa_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/requirements.txt +1 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/requirements.txt +2 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/Dockerfile +40 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/app/bioconductor-cellid_server.py +280 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/app/bioconductor-cellid_shim_server.py +45 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/docker-compose.yml +22 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/environment.yaml +10 -0
- BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/requirements.txt +2 -0
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.json
ADDED
|
@@ -0,0 +1,1775 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[
|
| 2 |
+
{
|
| 3 |
+
"tool_name": "anansescanpy",
|
| 4 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/anansescanpy.manual_bundle.txt",
|
| 5 |
+
"run_help_command": false,
|
| 6 |
+
"status": "skipped_existing",
|
| 7 |
+
"error": "",
|
| 8 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anansescanpy/app/anansescanpy_server.py",
|
| 9 |
+
"dockerfile_ready": true
|
| 10 |
+
},
|
| 11 |
+
{
|
| 12 |
+
"tool_name": "aria2",
|
| 13 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/aria2.manual_bundle.txt",
|
| 14 |
+
"run_help_command": false,
|
| 15 |
+
"status": "skipped_existing",
|
| 16 |
+
"error": "",
|
| 17 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_aria2/app/aria2_server.py",
|
| 18 |
+
"dockerfile_ready": true
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
"tool_name": "bcbio-nextgen",
|
| 22 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bcbio-nextgen.manual_bundle.txt",
|
| 23 |
+
"run_help_command": false,
|
| 24 |
+
"status": "skipped_existing",
|
| 25 |
+
"error": "",
|
| 26 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bcbio-nextgen/app/bcbio-nextgen_server.py",
|
| 27 |
+
"dockerfile_ready": true
|
| 28 |
+
},
|
| 29 |
+
{
|
| 30 |
+
"tool_name": "bin2cell",
|
| 31 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bin2cell.manual_bundle.txt",
|
| 32 |
+
"run_help_command": false,
|
| 33 |
+
"status": "success",
|
| 34 |
+
"error": "",
|
| 35 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bin2cell/app/bin2cell_server.py",
|
| 36 |
+
"dockerfile_ready": true
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"tool_name": "bioconda-repodata-patches",
|
| 40 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconda-repodata-patches.manual_bundle.txt",
|
| 41 |
+
"run_help_command": false,
|
| 42 |
+
"status": "skipped_existing",
|
| 43 |
+
"error": "",
|
| 44 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconda-repodata-patches/app/bioconda-repodata-patches_server.py",
|
| 45 |
+
"dockerfile_ready": true
|
| 46 |
+
},
|
| 47 |
+
{
|
| 48 |
+
"tool_name": "bioconductor-alabaster",
|
| 49 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-alabaster.manual_bundle.txt",
|
| 50 |
+
"run_help_command": false,
|
| 51 |
+
"status": "success",
|
| 52 |
+
"error": "",
|
| 53 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster/app/bioconductor-alabaster_server.py",
|
| 54 |
+
"dockerfile_ready": true
|
| 55 |
+
},
|
| 56 |
+
{
|
| 57 |
+
"tool_name": "bioconductor-alabaster.sfe",
|
| 58 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-alabaster.sfe.manual_bundle.txt",
|
| 59 |
+
"run_help_command": false,
|
| 60 |
+
"status": "success",
|
| 61 |
+
"error": "",
|
| 62 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.sfe/app/bioconductor-alabaster.sfe_server.py",
|
| 63 |
+
"dockerfile_ready": true
|
| 64 |
+
},
|
| 65 |
+
{
|
| 66 |
+
"tool_name": "bioconductor-alabaster.spatial",
|
| 67 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-alabaster.spatial.manual_bundle.txt",
|
| 68 |
+
"run_help_command": false,
|
| 69 |
+
"status": "skipped_existing",
|
| 70 |
+
"error": "",
|
| 71 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/app/bioconductor-alabaster.spatial_server.py",
|
| 72 |
+
"dockerfile_ready": true
|
| 73 |
+
},
|
| 74 |
+
{
|
| 75 |
+
"tool_name": "bioconductor-apl",
|
| 76 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-apl.manual_bundle.txt",
|
| 77 |
+
"run_help_command": false,
|
| 78 |
+
"status": "success",
|
| 79 |
+
"error": "",
|
| 80 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-apl/app/bioconductor-apl_server.py",
|
| 81 |
+
"dockerfile_ready": true
|
| 82 |
+
},
|
| 83 |
+
{
|
| 84 |
+
"tool_name": "bioconductor-benchdamic",
|
| 85 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-benchdamic.manual_bundle.txt",
|
| 86 |
+
"run_help_command": false,
|
| 87 |
+
"status": "skipped_existing",
|
| 88 |
+
"error": "",
|
| 89 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-benchdamic/app/bioconductor-benchdamic_server.py",
|
| 90 |
+
"dockerfile_ready": true
|
| 91 |
+
},
|
| 92 |
+
{
|
| 93 |
+
"tool_name": "bioconductor-blase",
|
| 94 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-blase.manual_bundle.txt",
|
| 95 |
+
"run_help_command": false,
|
| 96 |
+
"status": "success",
|
| 97 |
+
"error": "",
|
| 98 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-blase/app/bioconductor-blase_server.py",
|
| 99 |
+
"dockerfile_ready": true
|
| 100 |
+
},
|
| 101 |
+
{
|
| 102 |
+
"tool_name": "bioconductor-bulksignalr",
|
| 103 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-bulksignalr.manual_bundle.txt",
|
| 104 |
+
"run_help_command": false,
|
| 105 |
+
"status": "success",
|
| 106 |
+
"error": "",
|
| 107 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-bulksignalr/app/bioconductor-bulksignalr_server.py",
|
| 108 |
+
"dockerfile_ready": true
|
| 109 |
+
},
|
| 110 |
+
{
|
| 111 |
+
"tool_name": "bioconductor-cardspa",
|
| 112 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-cardspa.manual_bundle.txt",
|
| 113 |
+
"run_help_command": false,
|
| 114 |
+
"status": "success",
|
| 115 |
+
"error": "",
|
| 116 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/bioconductor-cardspa_server.py",
|
| 117 |
+
"dockerfile_ready": true
|
| 118 |
+
},
|
| 119 |
+
{
|
| 120 |
+
"tool_name": "bioconductor-catscradle",
|
| 121 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-catscradle.manual_bundle.txt",
|
| 122 |
+
"run_help_command": false,
|
| 123 |
+
"status": "failed",
|
| 124 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 125 |
+
"output_file": "",
|
| 126 |
+
"dockerfile_ready": false
|
| 127 |
+
},
|
| 128 |
+
{
|
| 129 |
+
"tool_name": "bioconductor-cdi",
|
| 130 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-cdi.manual_bundle.txt",
|
| 131 |
+
"run_help_command": false,
|
| 132 |
+
"status": "success",
|
| 133 |
+
"error": "",
|
| 134 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cdi/app/bioconductor-cdi_server.py",
|
| 135 |
+
"dockerfile_ready": true
|
| 136 |
+
},
|
| 137 |
+
{
|
| 138 |
+
"tool_name": "bioconductor-cellhashr",
|
| 139 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-cellhashr.manual_bundle.txt",
|
| 140 |
+
"run_help_command": false,
|
| 141 |
+
"status": "success",
|
| 142 |
+
"error": "",
|
| 143 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellhashr/app/bioconductor-cellhashr_server.py",
|
| 144 |
+
"dockerfile_ready": true
|
| 145 |
+
},
|
| 146 |
+
{
|
| 147 |
+
"tool_name": "bioconductor-cellid",
|
| 148 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-cellid.manual_bundle.txt",
|
| 149 |
+
"run_help_command": false,
|
| 150 |
+
"status": "skipped_existing",
|
| 151 |
+
"error": "",
|
| 152 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/app/bioconductor-cellid_server.py",
|
| 153 |
+
"dockerfile_ready": true
|
| 154 |
+
},
|
| 155 |
+
{
|
| 156 |
+
"tool_name": "bioconductor-cellmigration",
|
| 157 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-cellmigration.manual_bundle.txt",
|
| 158 |
+
"run_help_command": false,
|
| 159 |
+
"status": "success",
|
| 160 |
+
"error": "",
|
| 161 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellmigration/app/bioconductor-cellmigration_server.py",
|
| 162 |
+
"dockerfile_ready": true
|
| 163 |
+
},
|
| 164 |
+
{
|
| 165 |
+
"tool_name": "bioconductor-clusterfoldsimilarity",
|
| 166 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-clusterfoldsimilarity.manual_bundle.txt",
|
| 167 |
+
"run_help_command": false,
|
| 168 |
+
"status": "failed",
|
| 169 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 170 |
+
"output_file": "",
|
| 171 |
+
"dockerfile_ready": false
|
| 172 |
+
},
|
| 173 |
+
{
|
| 174 |
+
"tool_name": "bioconductor-concordexr",
|
| 175 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-concordexr.manual_bundle.txt",
|
| 176 |
+
"run_help_command": false,
|
| 177 |
+
"status": "success",
|
| 178 |
+
"error": "",
|
| 179 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-concordexr/app/bioconductor-concordexr_server.py",
|
| 180 |
+
"dockerfile_ready": true
|
| 181 |
+
},
|
| 182 |
+
{
|
| 183 |
+
"tool_name": "bioconductor-cotan",
|
| 184 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-cotan.manual_bundle.txt",
|
| 185 |
+
"run_help_command": false,
|
| 186 |
+
"status": "skipped_existing",
|
| 187 |
+
"error": "",
|
| 188 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cotan/app/bioconductor-cotan_server.py",
|
| 189 |
+
"dockerfile_ready": true
|
| 190 |
+
},
|
| 191 |
+
{
|
| 192 |
+
"tool_name": "bioconductor-csoa",
|
| 193 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-csoa.manual_bundle.txt",
|
| 194 |
+
"run_help_command": false,
|
| 195 |
+
"status": "success",
|
| 196 |
+
"error": "",
|
| 197 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-csoa/app/bioconductor-csoa_server.py",
|
| 198 |
+
"dockerfile_ready": true
|
| 199 |
+
},
|
| 200 |
+
{
|
| 201 |
+
"tool_name": "bioconductor-ctsv",
|
| 202 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-ctsv.manual_bundle.txt",
|
| 203 |
+
"run_help_command": false,
|
| 204 |
+
"status": "success",
|
| 205 |
+
"error": "",
|
| 206 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-ctsv/app/bioconductor-ctsv_server.py",
|
| 207 |
+
"dockerfile_ready": true
|
| 208 |
+
},
|
| 209 |
+
{
|
| 210 |
+
"tool_name": "bioconductor-curatedatlasqueryr",
|
| 211 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-curatedatlasqueryr.manual_bundle.txt",
|
| 212 |
+
"run_help_command": false,
|
| 213 |
+
"status": "success",
|
| 214 |
+
"error": "",
|
| 215 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-curatedatlasqueryr/app/bioconductor-curatedatlasqueryr_server.py",
|
| 216 |
+
"dockerfile_ready": true
|
| 217 |
+
},
|
| 218 |
+
{
|
| 219 |
+
"tool_name": "bioconductor-decontx",
|
| 220 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-decontx.manual_bundle.txt",
|
| 221 |
+
"run_help_command": false,
|
| 222 |
+
"status": "skipped_existing",
|
| 223 |
+
"error": "",
|
| 224 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-decontx/app/bioconductor-decontx_server.py",
|
| 225 |
+
"dockerfile_ready": true
|
| 226 |
+
},
|
| 227 |
+
{
|
| 228 |
+
"tool_name": "bioconductor-deconvobuddies",
|
| 229 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-deconvobuddies.manual_bundle.txt",
|
| 230 |
+
"run_help_command": false,
|
| 231 |
+
"status": "success",
|
| 232 |
+
"error": "",
|
| 233 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-deconvobuddies/app/bioconductor-deconvobuddies_server.py",
|
| 234 |
+
"dockerfile_ready": true
|
| 235 |
+
},
|
| 236 |
+
{
|
| 237 |
+
"tool_name": "bioconductor-despace",
|
| 238 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-despace.manual_bundle.txt",
|
| 239 |
+
"run_help_command": false,
|
| 240 |
+
"status": "success",
|
| 241 |
+
"error": "",
|
| 242 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-despace/app/bioconductor-despace_server.py",
|
| 243 |
+
"dockerfile_ready": true
|
| 244 |
+
},
|
| 245 |
+
{
|
| 246 |
+
"tool_name": "bioconductor-dino",
|
| 247 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-dino.manual_bundle.txt",
|
| 248 |
+
"run_help_command": false,
|
| 249 |
+
"status": "skipped_existing",
|
| 250 |
+
"error": "",
|
| 251 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-dino/app/bioconductor-dino_server.py",
|
| 252 |
+
"dockerfile_ready": true
|
| 253 |
+
},
|
| 254 |
+
{
|
| 255 |
+
"tool_name": "bioconductor-escher",
|
| 256 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-escher.manual_bundle.txt",
|
| 257 |
+
"run_help_command": false,
|
| 258 |
+
"status": "success",
|
| 259 |
+
"error": "",
|
| 260 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-escher/app/bioconductor-escher_server.py",
|
| 261 |
+
"dockerfile_ready": true
|
| 262 |
+
},
|
| 263 |
+
{
|
| 264 |
+
"tool_name": "bioconductor-experimentsubset",
|
| 265 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-experimentsubset.manual_bundle.txt",
|
| 266 |
+
"run_help_command": false,
|
| 267 |
+
"status": "success",
|
| 268 |
+
"error": "",
|
| 269 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-experimentsubset/app/bioconductor-experimentsubset_server.py",
|
| 270 |
+
"dockerfile_ready": true
|
| 271 |
+
},
|
| 272 |
+
{
|
| 273 |
+
"tool_name": "bioconductor-geomxtools",
|
| 274 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-geomxtools.manual_bundle.txt",
|
| 275 |
+
"run_help_command": false,
|
| 276 |
+
"status": "skipped_existing",
|
| 277 |
+
"error": "",
|
| 278 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-geomxtools/app/bioconductor-geomxtools_server.py",
|
| 279 |
+
"dockerfile_ready": true
|
| 280 |
+
},
|
| 281 |
+
{
|
| 282 |
+
"tool_name": "bioconductor-ggsc",
|
| 283 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-ggsc.manual_bundle.txt",
|
| 284 |
+
"run_help_command": false,
|
| 285 |
+
"status": "skipped_existing",
|
| 286 |
+
"error": "",
|
| 287 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-ggsc/app/bioconductor-ggsc_server.py",
|
| 288 |
+
"dockerfile_ready": true
|
| 289 |
+
},
|
| 290 |
+
{
|
| 291 |
+
"tool_name": "bioconductor-ggspavis",
|
| 292 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-ggspavis.manual_bundle.txt",
|
| 293 |
+
"run_help_command": false,
|
| 294 |
+
"status": "success",
|
| 295 |
+
"error": "",
|
| 296 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-ggspavis/app/bioconductor-ggspavis_server.py",
|
| 297 |
+
"dockerfile_ready": true
|
| 298 |
+
},
|
| 299 |
+
{
|
| 300 |
+
"tool_name": "bioconductor-hcatonsildata",
|
| 301 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-hcatonsildata.manual_bundle.txt",
|
| 302 |
+
"run_help_command": false,
|
| 303 |
+
"status": "success",
|
| 304 |
+
"error": "",
|
| 305 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-hcatonsildata/app/bioconductor-hcatonsildata_server.py",
|
| 306 |
+
"dockerfile_ready": true
|
| 307 |
+
},
|
| 308 |
+
{
|
| 309 |
+
"tool_name": "bioconductor-hoodscanr",
|
| 310 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-hoodscanr.manual_bundle.txt",
|
| 311 |
+
"run_help_command": false,
|
| 312 |
+
"status": "failed",
|
| 313 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 314 |
+
"output_file": "",
|
| 315 |
+
"dockerfile_ready": false
|
| 316 |
+
},
|
| 317 |
+
{
|
| 318 |
+
"tool_name": "bioconductor-imcdatasets",
|
| 319 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-imcdatasets.manual_bundle.txt",
|
| 320 |
+
"run_help_command": false,
|
| 321 |
+
"status": "success",
|
| 322 |
+
"error": "",
|
| 323 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-imcdatasets/app/bioconductor-imcdatasets_server.py",
|
| 324 |
+
"dockerfile_ready": true
|
| 325 |
+
},
|
| 326 |
+
{
|
| 327 |
+
"tool_name": "bioconductor-imcrtools",
|
| 328 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-imcrtools.manual_bundle.txt",
|
| 329 |
+
"run_help_command": false,
|
| 330 |
+
"status": "success",
|
| 331 |
+
"error": "",
|
| 332 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-imcrtools/app/bioconductor-imcrtools_server.py",
|
| 333 |
+
"dockerfile_ready": true
|
| 334 |
+
},
|
| 335 |
+
{
|
| 336 |
+
"tool_name": "bioconductor-irisfgm",
|
| 337 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-irisfgm.manual_bundle.txt",
|
| 338 |
+
"run_help_command": false,
|
| 339 |
+
"status": "skipped_existing",
|
| 340 |
+
"error": "",
|
| 341 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-irisfgm/app/bioconductor-irisfgm_server.py",
|
| 342 |
+
"dockerfile_ready": true
|
| 343 |
+
},
|
| 344 |
+
{
|
| 345 |
+
"tool_name": "bioconductor-lisaclust",
|
| 346 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-lisaclust.manual_bundle.txt",
|
| 347 |
+
"run_help_command": false,
|
| 348 |
+
"status": "success",
|
| 349 |
+
"error": "",
|
| 350 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-lisaclust/app/bioconductor-lisaclust_server.py",
|
| 351 |
+
"dockerfile_ready": true
|
| 352 |
+
},
|
| 353 |
+
{
|
| 354 |
+
"tool_name": "bioconductor-mastr",
|
| 355 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-mastr.manual_bundle.txt",
|
| 356 |
+
"run_help_command": false,
|
| 357 |
+
"status": "success",
|
| 358 |
+
"error": "",
|
| 359 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-mastr/app/bioconductor-mastr_server.py",
|
| 360 |
+
"dockerfile_ready": true
|
| 361 |
+
},
|
| 362 |
+
{
|
| 363 |
+
"tool_name": "bioconductor-merfishdata",
|
| 364 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-merfishdata.manual_bundle.txt",
|
| 365 |
+
"run_help_command": false,
|
| 366 |
+
"status": "success",
|
| 367 |
+
"error": "",
|
| 368 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-merfishdata/app/bioconductor-merfishdata_server.py",
|
| 369 |
+
"dockerfile_ready": true
|
| 370 |
+
},
|
| 371 |
+
{
|
| 372 |
+
"tool_name": "bioconductor-moleculeexperiment",
|
| 373 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-moleculeexperiment.manual_bundle.txt",
|
| 374 |
+
"run_help_command": false,
|
| 375 |
+
"status": "success",
|
| 376 |
+
"error": "",
|
| 377 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-moleculeexperiment/app/bioconductor-moleculeexperiment_server.py",
|
| 378 |
+
"dockerfile_ready": true
|
| 379 |
+
},
|
| 380 |
+
{
|
| 381 |
+
"tool_name": "bioconductor-mousegastrulationdata",
|
| 382 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-mousegastrulationdata.manual_bundle.txt",
|
| 383 |
+
"run_help_command": false,
|
| 384 |
+
"status": "success",
|
| 385 |
+
"error": "",
|
| 386 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-mousegastrulationdata/app/bioconductor-mousegastrulationdata_server.py",
|
| 387 |
+
"dockerfile_ready": true
|
| 388 |
+
},
|
| 389 |
+
{
|
| 390 |
+
"tool_name": "bioconductor-nnsvg",
|
| 391 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-nnsvg.manual_bundle.txt",
|
| 392 |
+
"run_help_command": false,
|
| 393 |
+
"status": "success",
|
| 394 |
+
"error": "",
|
| 395 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-nnsvg/app/bioconductor-nnsvg_server.py",
|
| 396 |
+
"dockerfile_ready": true
|
| 397 |
+
},
|
| 398 |
+
{
|
| 399 |
+
"tool_name": "bioconductor-partcnv",
|
| 400 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-partcnv.manual_bundle.txt",
|
| 401 |
+
"run_help_command": false,
|
| 402 |
+
"status": "success",
|
| 403 |
+
"error": "",
|
| 404 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-partcnv/app/bioconductor-partcnv_server.py",
|
| 405 |
+
"dockerfile_ready": true
|
| 406 |
+
},
|
| 407 |
+
{
|
| 408 |
+
"tool_name": "bioconductor-pipecomp",
|
| 409 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-pipecomp.manual_bundle.txt",
|
| 410 |
+
"run_help_command": false,
|
| 411 |
+
"status": "success",
|
| 412 |
+
"error": "",
|
| 413 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-pipecomp/app/bioconductor-pipecomp_server.py",
|
| 414 |
+
"dockerfile_ready": true
|
| 415 |
+
},
|
| 416 |
+
{
|
| 417 |
+
"tool_name": "bioconductor-reactomegsa.data",
|
| 418 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-reactomegsa.data.manual_bundle.txt",
|
| 419 |
+
"run_help_command": false,
|
| 420 |
+
"status": "skipped_existing",
|
| 421 |
+
"error": "",
|
| 422 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-reactomegsa.data/app/bioconductor-reactomegsa.data_server.py",
|
| 423 |
+
"dockerfile_ready": true
|
| 424 |
+
},
|
| 425 |
+
{
|
| 426 |
+
"tool_name": "bioconductor-regionalst",
|
| 427 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-regionalst.manual_bundle.txt",
|
| 428 |
+
"run_help_command": false,
|
| 429 |
+
"status": "skipped_existing",
|
| 430 |
+
"error": "",
|
| 431 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-regionalst/app/bioconductor-regionalst_server.py",
|
| 432 |
+
"dockerfile_ready": true
|
| 433 |
+
},
|
| 434 |
+
{
|
| 435 |
+
"tool_name": "bioconductor-scalign",
|
| 436 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scalign.manual_bundle.txt",
|
| 437 |
+
"run_help_command": false,
|
| 438 |
+
"status": "skipped_existing",
|
| 439 |
+
"error": "",
|
| 440 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scalign/app/bioconductor-scalign_server.py",
|
| 441 |
+
"dockerfile_ready": true
|
| 442 |
+
},
|
| 443 |
+
{
|
| 444 |
+
"tool_name": "bioconductor-scannotatr",
|
| 445 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scannotatr.manual_bundle.txt",
|
| 446 |
+
"run_help_command": false,
|
| 447 |
+
"status": "skipped_existing",
|
| 448 |
+
"error": "",
|
| 449 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scannotatr/app/bioconductor-scannotatr_server.py",
|
| 450 |
+
"dockerfile_ready": true
|
| 451 |
+
},
|
| 452 |
+
{
|
| 453 |
+
"tool_name": "bioconductor-scarray.sat",
|
| 454 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scarray.sat.manual_bundle.txt",
|
| 455 |
+
"run_help_command": false,
|
| 456 |
+
"status": "skipped_existing",
|
| 457 |
+
"error": "",
|
| 458 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scarray.sat/app/bioconductor-scarray.sat_server.py",
|
| 459 |
+
"dockerfile_ready": true
|
| 460 |
+
},
|
| 461 |
+
{
|
| 462 |
+
"tool_name": "bioconductor-scbubbletree",
|
| 463 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scbubbletree.manual_bundle.txt",
|
| 464 |
+
"run_help_command": false,
|
| 465 |
+
"status": "skipped_existing",
|
| 466 |
+
"error": "",
|
| 467 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scbubbletree/app/bioconductor-scbubbletree_server.py",
|
| 468 |
+
"dockerfile_ready": true
|
| 469 |
+
},
|
| 470 |
+
{
|
| 471 |
+
"tool_name": "bioconductor-scclassifr",
|
| 472 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scclassifr.manual_bundle.txt",
|
| 473 |
+
"run_help_command": false,
|
| 474 |
+
"status": "skipped_existing",
|
| 475 |
+
"error": "",
|
| 476 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scclassifr/app/bioconductor-scclassifr_server.py",
|
| 477 |
+
"dockerfile_ready": true
|
| 478 |
+
},
|
| 479 |
+
{
|
| 480 |
+
"tool_name": "bioconductor-scdotplot",
|
| 481 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scdotplot.manual_bundle.txt",
|
| 482 |
+
"run_help_command": false,
|
| 483 |
+
"status": "success",
|
| 484 |
+
"error": "",
|
| 485 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scdotplot/app/bioconductor-scdotplot_server.py",
|
| 486 |
+
"dockerfile_ready": true
|
| 487 |
+
},
|
| 488 |
+
{
|
| 489 |
+
"tool_name": "bioconductor-scfeatures",
|
| 490 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scfeatures.manual_bundle.txt",
|
| 491 |
+
"run_help_command": false,
|
| 492 |
+
"status": "success",
|
| 493 |
+
"error": "",
|
| 494 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scfeatures/app/bioconductor-scfeatures_server.py",
|
| 495 |
+
"dockerfile_ready": true
|
| 496 |
+
},
|
| 497 |
+
{
|
| 498 |
+
"tool_name": "bioconductor-scider",
|
| 499 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scider.manual_bundle.txt",
|
| 500 |
+
"run_help_command": false,
|
| 501 |
+
"status": "success",
|
| 502 |
+
"error": "",
|
| 503 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scider/app/bioconductor-scider_server.py",
|
| 504 |
+
"dockerfile_ready": true
|
| 505 |
+
},
|
| 506 |
+
{
|
| 507 |
+
"tool_name": "bioconductor-scqtltools",
|
| 508 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scqtltools.manual_bundle.txt",
|
| 509 |
+
"run_help_command": false,
|
| 510 |
+
"status": "success",
|
| 511 |
+
"error": "",
|
| 512 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scqtltools/app/bioconductor-scqtltools_server.py",
|
| 513 |
+
"dockerfile_ready": true
|
| 514 |
+
},
|
| 515 |
+
{
|
| 516 |
+
"tool_name": "bioconductor-scrnaseqapp",
|
| 517 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scrnaseqapp.manual_bundle.txt",
|
| 518 |
+
"run_help_command": false,
|
| 519 |
+
"status": "success",
|
| 520 |
+
"error": "",
|
| 521 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scrnaseqapp/app/bioconductor-scrnaseqapp_server.py",
|
| 522 |
+
"dockerfile_ready": true
|
| 523 |
+
},
|
| 524 |
+
{
|
| 525 |
+
"tool_name": "bioconductor-sctreeviz",
|
| 526 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-sctreeviz.manual_bundle.txt",
|
| 527 |
+
"run_help_command": false,
|
| 528 |
+
"status": "success",
|
| 529 |
+
"error": "",
|
| 530 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-sctreeviz/app/bioconductor-sctreeviz_server.py",
|
| 531 |
+
"dockerfile_ready": true
|
| 532 |
+
},
|
| 533 |
+
{
|
| 534 |
+
"tool_name": "bioconductor-scvir",
|
| 535 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-scvir.manual_bundle.txt",
|
| 536 |
+
"run_help_command": false,
|
| 537 |
+
"status": "success",
|
| 538 |
+
"error": "",
|
| 539 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-scvir/app/bioconductor-scvir_server.py",
|
| 540 |
+
"dockerfile_ready": true
|
| 541 |
+
},
|
| 542 |
+
{
|
| 543 |
+
"tool_name": "bioconductor-seraster",
|
| 544 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-seraster.manual_bundle.txt",
|
| 545 |
+
"run_help_command": false,
|
| 546 |
+
"status": "success",
|
| 547 |
+
"error": "",
|
| 548 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-seraster/app/bioconductor-seraster_server.py",
|
| 549 |
+
"dockerfile_ready": true
|
| 550 |
+
},
|
| 551 |
+
{
|
| 552 |
+
"tool_name": "bioconductor-signifinder",
|
| 553 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-signifinder.manual_bundle.txt",
|
| 554 |
+
"run_help_command": false,
|
| 555 |
+
"status": "success",
|
| 556 |
+
"error": "",
|
| 557 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-signifinder/app/bioconductor-signifinder_server.py",
|
| 558 |
+
"dockerfile_ready": true
|
| 559 |
+
},
|
| 560 |
+
{
|
| 561 |
+
"tool_name": "bioconductor-singlecelltk",
|
| 562 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-singlecelltk.manual_bundle.txt",
|
| 563 |
+
"run_help_command": false,
|
| 564 |
+
"status": "failed",
|
| 565 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 566 |
+
"output_file": "",
|
| 567 |
+
"dockerfile_ready": false
|
| 568 |
+
},
|
| 569 |
+
{
|
| 570 |
+
"tool_name": "bioconductor-smoppix",
|
| 571 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-smoppix.manual_bundle.txt",
|
| 572 |
+
"run_help_command": false,
|
| 573 |
+
"status": "success",
|
| 574 |
+
"error": "",
|
| 575 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-smoppix/app/bioconductor-smoppix_server.py",
|
| 576 |
+
"dockerfile_ready": true
|
| 577 |
+
},
|
| 578 |
+
{
|
| 579 |
+
"tool_name": "bioconductor-sosta",
|
| 580 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-sosta.manual_bundle.txt",
|
| 581 |
+
"run_help_command": false,
|
| 582 |
+
"status": "failed",
|
| 583 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 584 |
+
"output_file": "",
|
| 585 |
+
"dockerfile_ready": false
|
| 586 |
+
},
|
| 587 |
+
{
|
| 588 |
+
"tool_name": "bioconductor-spacetrooper",
|
| 589 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spacetrooper.manual_bundle.txt",
|
| 590 |
+
"run_help_command": false,
|
| 591 |
+
"status": "success",
|
| 592 |
+
"error": "",
|
| 593 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spacetrooper/app/bioconductor-spacetrooper_server.py",
|
| 594 |
+
"dockerfile_ready": true
|
| 595 |
+
},
|
| 596 |
+
{
|
| 597 |
+
"tool_name": "bioconductor-spanorm",
|
| 598 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spanorm.manual_bundle.txt",
|
| 599 |
+
"run_help_command": false,
|
| 600 |
+
"status": "success",
|
| 601 |
+
"error": "",
|
| 602 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spanorm/app/bioconductor-spanorm_server.py",
|
| 603 |
+
"dockerfile_ready": true
|
| 604 |
+
},
|
| 605 |
+
{
|
| 606 |
+
"tool_name": "bioconductor-spari",
|
| 607 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spari.manual_bundle.txt",
|
| 608 |
+
"run_help_command": false,
|
| 609 |
+
"status": "success",
|
| 610 |
+
"error": "",
|
| 611 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spari/app/bioconductor-spari_server.py",
|
| 612 |
+
"dockerfile_ready": true
|
| 613 |
+
},
|
| 614 |
+
{
|
| 615 |
+
"tool_name": "bioconductor-spasim",
|
| 616 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spasim.manual_bundle.txt",
|
| 617 |
+
"run_help_command": false,
|
| 618 |
+
"status": "success",
|
| 619 |
+
"error": "",
|
| 620 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spasim/app/bioconductor-spasim_server.py",
|
| 621 |
+
"dockerfile_ready": true
|
| 622 |
+
},
|
| 623 |
+
{
|
| 624 |
+
"tool_name": "bioconductor-spatialdatasets",
|
| 625 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatialdatasets.manual_bundle.txt",
|
| 626 |
+
"run_help_command": false,
|
| 627 |
+
"status": "success",
|
| 628 |
+
"error": "",
|
| 629 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatialdatasets/app/bioconductor-spatialdatasets_server.py",
|
| 630 |
+
"dockerfile_ready": true
|
| 631 |
+
},
|
| 632 |
+
{
|
| 633 |
+
"tool_name": "bioconductor-spatialde",
|
| 634 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatialde.manual_bundle.txt",
|
| 635 |
+
"run_help_command": false,
|
| 636 |
+
"status": "success",
|
| 637 |
+
"error": "",
|
| 638 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatialde/app/bioconductor-spatialde_server.py",
|
| 639 |
+
"dockerfile_ready": true
|
| 640 |
+
},
|
| 641 |
+
{
|
| 642 |
+
"tool_name": "bioconductor-spatialdmelxsim",
|
| 643 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatialdmelxsim.manual_bundle.txt",
|
| 644 |
+
"run_help_command": false,
|
| 645 |
+
"status": "success",
|
| 646 |
+
"error": "",
|
| 647 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatialdmelxsim/app/bioconductor-spatialdmelxsim_server.py",
|
| 648 |
+
"dockerfile_ready": true
|
| 649 |
+
},
|
| 650 |
+
{
|
| 651 |
+
"tool_name": "bioconductor-spatialfeatureexperiment",
|
| 652 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatialfeatureexperiment.manual_bundle.txt",
|
| 653 |
+
"run_help_command": false,
|
| 654 |
+
"status": "success",
|
| 655 |
+
"error": "",
|
| 656 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatialfeatureexperiment/app/bioconductor-spatialfeatureexperiment_server.py",
|
| 657 |
+
"dockerfile_ready": true
|
| 658 |
+
},
|
| 659 |
+
{
|
| 660 |
+
"tool_name": "bioconductor-spatiallibd",
|
| 661 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatiallibd.manual_bundle.txt",
|
| 662 |
+
"run_help_command": false,
|
| 663 |
+
"status": "success",
|
| 664 |
+
"error": "",
|
| 665 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatiallibd/app/bioconductor-spatiallibd_server.py",
|
| 666 |
+
"dockerfile_ready": true
|
| 667 |
+
},
|
| 668 |
+
{
|
| 669 |
+
"tool_name": "bioconductor-spatialomicsoverlay",
|
| 670 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatialomicsoverlay.manual_bundle.txt",
|
| 671 |
+
"run_help_command": false,
|
| 672 |
+
"status": "success",
|
| 673 |
+
"error": "",
|
| 674 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatialomicsoverlay/app/bioconductor-spatialomicsoverlay_server.py",
|
| 675 |
+
"dockerfile_ready": true
|
| 676 |
+
},
|
| 677 |
+
{
|
| 678 |
+
"tool_name": "bioconductor-spatialsimgp",
|
| 679 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spatialsimgp.manual_bundle.txt",
|
| 680 |
+
"run_help_command": false,
|
| 681 |
+
"status": "success",
|
| 682 |
+
"error": "",
|
| 683 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spatialsimgp/app/bioconductor-spatialsimgp_server.py",
|
| 684 |
+
"dockerfile_ready": true
|
| 685 |
+
},
|
| 686 |
+
{
|
| 687 |
+
"tool_name": "bioconductor-speckle",
|
| 688 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-speckle.manual_bundle.txt",
|
| 689 |
+
"run_help_command": false,
|
| 690 |
+
"status": "failed",
|
| 691 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 692 |
+
"output_file": "",
|
| 693 |
+
"dockerfile_ready": false
|
| 694 |
+
},
|
| 695 |
+
{
|
| 696 |
+
"tool_name": "bioconductor-spiat",
|
| 697 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spiat.manual_bundle.txt",
|
| 698 |
+
"run_help_command": false,
|
| 699 |
+
"status": "success",
|
| 700 |
+
"error": "",
|
| 701 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spiat/app/bioconductor-spiat_server.py",
|
| 702 |
+
"dockerfile_ready": true
|
| 703 |
+
},
|
| 704 |
+
{
|
| 705 |
+
"tool_name": "bioconductor-spicyr",
|
| 706 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spicyr.manual_bundle.txt",
|
| 707 |
+
"run_help_command": false,
|
| 708 |
+
"status": "success",
|
| 709 |
+
"error": "",
|
| 710 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spicyr/app/bioconductor-spicyr_server.py",
|
| 711 |
+
"dockerfile_ready": true
|
| 712 |
+
},
|
| 713 |
+
{
|
| 714 |
+
"tool_name": "bioconductor-spoon",
|
| 715 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spoon.manual_bundle.txt",
|
| 716 |
+
"run_help_command": false,
|
| 717 |
+
"status": "success",
|
| 718 |
+
"error": "",
|
| 719 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spoon/app/bioconductor-spoon_server.py",
|
| 720 |
+
"dockerfile_ready": true
|
| 721 |
+
},
|
| 722 |
+
{
|
| 723 |
+
"tool_name": "bioconductor-spotclean",
|
| 724 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spotclean.manual_bundle.txt",
|
| 725 |
+
"run_help_command": false,
|
| 726 |
+
"status": "success",
|
| 727 |
+
"error": "",
|
| 728 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spotclean/app/bioconductor-spotclean_server.py",
|
| 729 |
+
"dockerfile_ready": true
|
| 730 |
+
},
|
| 731 |
+
{
|
| 732 |
+
"tool_name": "bioconductor-spotsweeper",
|
| 733 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-spotsweeper.manual_bundle.txt",
|
| 734 |
+
"run_help_command": false,
|
| 735 |
+
"status": "success",
|
| 736 |
+
"error": "",
|
| 737 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-spotsweeper/app/bioconductor-spotsweeper_server.py",
|
| 738 |
+
"dockerfile_ready": true
|
| 739 |
+
},
|
| 740 |
+
{
|
| 741 |
+
"tool_name": "bioconductor-standr",
|
| 742 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-standr.manual_bundle.txt",
|
| 743 |
+
"run_help_command": false,
|
| 744 |
+
"status": "success",
|
| 745 |
+
"error": "",
|
| 746 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-standr/app/bioconductor-standr_server.py",
|
| 747 |
+
"dockerfile_ready": true
|
| 748 |
+
},
|
| 749 |
+
{
|
| 750 |
+
"tool_name": "bioconductor-statial",
|
| 751 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-statial.manual_bundle.txt",
|
| 752 |
+
"run_help_command": false,
|
| 753 |
+
"status": "failed",
|
| 754 |
+
"error": "refine failed (retry=2): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 755 |
+
"output_file": "",
|
| 756 |
+
"dockerfile_ready": false
|
| 757 |
+
},
|
| 758 |
+
{
|
| 759 |
+
"tool_name": "bioconductor-stexampledata",
|
| 760 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-stexampledata.manual_bundle.txt",
|
| 761 |
+
"run_help_command": false,
|
| 762 |
+
"status": "success",
|
| 763 |
+
"error": "",
|
| 764 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-stexampledata/app/bioconductor-stexampledata_server.py",
|
| 765 |
+
"dockerfile_ready": true
|
| 766 |
+
},
|
| 767 |
+
{
|
| 768 |
+
"tool_name": "bioconductor-stjoincount",
|
| 769 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-stjoincount.manual_bundle.txt",
|
| 770 |
+
"run_help_command": false,
|
| 771 |
+
"status": "success",
|
| 772 |
+
"error": "",
|
| 773 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-stjoincount/app/bioconductor-stjoincount_server.py",
|
| 774 |
+
"dockerfile_ready": true
|
| 775 |
+
},
|
| 776 |
+
{
|
| 777 |
+
"tool_name": "bioconductor-stpipe",
|
| 778 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-stpipe.manual_bundle.txt",
|
| 779 |
+
"run_help_command": false,
|
| 780 |
+
"status": "success",
|
| 781 |
+
"error": "",
|
| 782 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-stpipe/app/bioconductor-stpipe_server.py",
|
| 783 |
+
"dockerfile_ready": true
|
| 784 |
+
},
|
| 785 |
+
{
|
| 786 |
+
"tool_name": "bioconductor-subcellularspatialdata",
|
| 787 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-subcellularspatialdata.manual_bundle.txt",
|
| 788 |
+
"run_help_command": false,
|
| 789 |
+
"status": "success",
|
| 790 |
+
"error": "",
|
| 791 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-subcellularspatialdata/app/bioconductor-subcellularspatialdata_server.py",
|
| 792 |
+
"dockerfile_ready": true
|
| 793 |
+
},
|
| 794 |
+
{
|
| 795 |
+
"tool_name": "bioconductor-svp",
|
| 796 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-svp.manual_bundle.txt",
|
| 797 |
+
"run_help_command": false,
|
| 798 |
+
"status": "success",
|
| 799 |
+
"error": "",
|
| 800 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-svp/app/bioconductor-svp_server.py",
|
| 801 |
+
"dockerfile_ready": true
|
| 802 |
+
},
|
| 803 |
+
{
|
| 804 |
+
"tool_name": "bioconductor-synergyfinder",
|
| 805 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-synergyfinder.manual_bundle.txt",
|
| 806 |
+
"run_help_command": false,
|
| 807 |
+
"status": "success",
|
| 808 |
+
"error": "",
|
| 809 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-synergyfinder/app/bioconductor-synergyfinder_server.py",
|
| 810 |
+
"dockerfile_ready": true
|
| 811 |
+
},
|
| 812 |
+
{
|
| 813 |
+
"tool_name": "bioconductor-tenxvisiumdata",
|
| 814 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-tenxvisiumdata.manual_bundle.txt",
|
| 815 |
+
"run_help_command": false,
|
| 816 |
+
"status": "success",
|
| 817 |
+
"error": "",
|
| 818 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-tenxvisiumdata/app/bioconductor-tenxvisiumdata_server.py",
|
| 819 |
+
"dockerfile_ready": true
|
| 820 |
+
},
|
| 821 |
+
{
|
| 822 |
+
"tool_name": "bioconductor-tidyomics",
|
| 823 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-tidyomics.manual_bundle.txt",
|
| 824 |
+
"run_help_command": false,
|
| 825 |
+
"status": "success",
|
| 826 |
+
"error": "",
|
| 827 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-tidyomics/app/bioconductor-tidyomics_server.py",
|
| 828 |
+
"dockerfile_ready": true
|
| 829 |
+
},
|
| 830 |
+
{
|
| 831 |
+
"tool_name": "bioconductor-tidyspatialexperiment",
|
| 832 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-tidyspatialexperiment.manual_bundle.txt",
|
| 833 |
+
"run_help_command": false,
|
| 834 |
+
"status": "success",
|
| 835 |
+
"error": "",
|
| 836 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-tidyspatialexperiment/app/bioconductor-tidyspatialexperiment_server.py",
|
| 837 |
+
"dockerfile_ready": true
|
| 838 |
+
},
|
| 839 |
+
{
|
| 840 |
+
"tool_name": "bioconductor-tpsvg",
|
| 841 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-tpsvg.manual_bundle.txt",
|
| 842 |
+
"run_help_command": false,
|
| 843 |
+
"status": "success",
|
| 844 |
+
"error": "",
|
| 845 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-tpsvg/app/bioconductor-tpsvg_server.py",
|
| 846 |
+
"dockerfile_ready": true
|
| 847 |
+
},
|
| 848 |
+
{
|
| 849 |
+
"tool_name": "bioconductor-vectrapolarisdata",
|
| 850 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-vectrapolarisdata.manual_bundle.txt",
|
| 851 |
+
"run_help_command": false,
|
| 852 |
+
"status": "success",
|
| 853 |
+
"error": "",
|
| 854 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-vectrapolarisdata/app/bioconductor-vectrapolarisdata_server.py",
|
| 855 |
+
"dockerfile_ready": true
|
| 856 |
+
},
|
| 857 |
+
{
|
| 858 |
+
"tool_name": "bioconductor-visiumio",
|
| 859 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-visiumio.manual_bundle.txt",
|
| 860 |
+
"run_help_command": false,
|
| 861 |
+
"status": "success",
|
| 862 |
+
"error": "",
|
| 863 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-visiumio/app/bioconductor-visiumio_server.py",
|
| 864 |
+
"dockerfile_ready": true
|
| 865 |
+
},
|
| 866 |
+
{
|
| 867 |
+
"tool_name": "bioconductor-voyager",
|
| 868 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-voyager.manual_bundle.txt",
|
| 869 |
+
"run_help_command": false,
|
| 870 |
+
"status": "success",
|
| 871 |
+
"error": "",
|
| 872 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-voyager/app/bioconductor-voyager_server.py",
|
| 873 |
+
"dockerfile_ready": true
|
| 874 |
+
},
|
| 875 |
+
{
|
| 876 |
+
"tool_name": "bioconductor-weberdivechalcdata",
|
| 877 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-weberdivechalcdata.manual_bundle.txt",
|
| 878 |
+
"run_help_command": false,
|
| 879 |
+
"status": "success",
|
| 880 |
+
"error": "",
|
| 881 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-weberdivechalcdata/app/bioconductor-weberdivechalcdata_server.py",
|
| 882 |
+
"dockerfile_ready": true
|
| 883 |
+
},
|
| 884 |
+
{
|
| 885 |
+
"tool_name": "bioconductor-xeniumio",
|
| 886 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-xeniumio.manual_bundle.txt",
|
| 887 |
+
"run_help_command": false,
|
| 888 |
+
"status": "success",
|
| 889 |
+
"error": "",
|
| 890 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-xeniumio/app/bioconductor-xeniumio_server.py",
|
| 891 |
+
"dockerfile_ready": true
|
| 892 |
+
},
|
| 893 |
+
{
|
| 894 |
+
"tool_name": "bioconductor-xenlite",
|
| 895 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bioconductor-xenlite.manual_bundle.txt",
|
| 896 |
+
"run_help_command": false,
|
| 897 |
+
"status": "success",
|
| 898 |
+
"error": "",
|
| 899 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-xenlite/app/bioconductor-xenlite_server.py",
|
| 900 |
+
"dockerfile_ready": true
|
| 901 |
+
},
|
| 902 |
+
{
|
| 903 |
+
"tool_name": "bwa",
|
| 904 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/bwa.manual_bundle.txt",
|
| 905 |
+
"run_help_command": false,
|
| 906 |
+
"status": "success",
|
| 907 |
+
"error": "",
|
| 908 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bwa/app/bwa_server.py",
|
| 909 |
+
"dockerfile_ready": true
|
| 910 |
+
},
|
| 911 |
+
{
|
| 912 |
+
"tool_name": "cascade-reg",
|
| 913 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cascade-reg.manual_bundle.txt",
|
| 914 |
+
"run_help_command": false,
|
| 915 |
+
"status": "skipped_existing",
|
| 916 |
+
"error": "",
|
| 917 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cascade-reg/app/cascade-reg_server.py",
|
| 918 |
+
"dockerfile_ready": true
|
| 919 |
+
},
|
| 920 |
+
{
|
| 921 |
+
"tool_name": "cell2cell",
|
| 922 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cell2cell.manual_bundle.txt",
|
| 923 |
+
"run_help_command": false,
|
| 924 |
+
"status": "skipped_existing",
|
| 925 |
+
"error": "",
|
| 926 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cell2cell/app/cell2cell_server.py",
|
| 927 |
+
"dockerfile_ready": true
|
| 928 |
+
},
|
| 929 |
+
{
|
| 930 |
+
"tool_name": "cellitac",
|
| 931 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cellitac.manual_bundle.txt",
|
| 932 |
+
"run_help_command": false,
|
| 933 |
+
"status": "success",
|
| 934 |
+
"error": "",
|
| 935 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cellitac/app/cellitac_server.py",
|
| 936 |
+
"dockerfile_ready": true
|
| 937 |
+
},
|
| 938 |
+
{
|
| 939 |
+
"tool_name": "cellqc",
|
| 940 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cellqc.manual_bundle.txt",
|
| 941 |
+
"run_help_command": false,
|
| 942 |
+
"status": "success",
|
| 943 |
+
"error": "",
|
| 944 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cellqc/app/cellqc_server.py",
|
| 945 |
+
"dockerfile_ready": true
|
| 946 |
+
},
|
| 947 |
+
{
|
| 948 |
+
"tool_name": "cellsnake",
|
| 949 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cellsnake.manual_bundle.txt",
|
| 950 |
+
"run_help_command": false,
|
| 951 |
+
"status": "success",
|
| 952 |
+
"error": "",
|
| 953 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cellsnake/app/cellsnake_server.py",
|
| 954 |
+
"dockerfile_ready": true
|
| 955 |
+
},
|
| 956 |
+
{
|
| 957 |
+
"tool_name": "celltypist-so",
|
| 958 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/celltypist-so.manual_bundle.txt",
|
| 959 |
+
"run_help_command": false,
|
| 960 |
+
"status": "success",
|
| 961 |
+
"error": "",
|
| 962 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_celltypist-so/app/celltypist-so_server.py",
|
| 963 |
+
"dockerfile_ready": true
|
| 964 |
+
},
|
| 965 |
+
{
|
| 966 |
+
"tool_name": "checkatlas",
|
| 967 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/checkatlas.manual_bundle.txt",
|
| 968 |
+
"run_help_command": false,
|
| 969 |
+
"status": "success",
|
| 970 |
+
"error": "",
|
| 971 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_checkatlas/app/checkatlas_server.py",
|
| 972 |
+
"dockerfile_ready": true
|
| 973 |
+
},
|
| 974 |
+
{
|
| 975 |
+
"tool_name": "comebin",
|
| 976 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/comebin.manual_bundle.txt",
|
| 977 |
+
"run_help_command": false,
|
| 978 |
+
"status": "success",
|
| 979 |
+
"error": "",
|
| 980 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_comebin/app/comebin_server.py",
|
| 981 |
+
"dockerfile_ready": true
|
| 982 |
+
},
|
| 983 |
+
{
|
| 984 |
+
"tool_name": "cosg",
|
| 985 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cosg.manual_bundle.txt",
|
| 986 |
+
"run_help_command": false,
|
| 987 |
+
"status": "skipped_existing",
|
| 988 |
+
"error": "",
|
| 989 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cosg/app/cosg_server.py",
|
| 990 |
+
"dockerfile_ready": true
|
| 991 |
+
},
|
| 992 |
+
{
|
| 993 |
+
"tool_name": "cospar",
|
| 994 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/cospar.manual_bundle.txt",
|
| 995 |
+
"run_help_command": false,
|
| 996 |
+
"status": "success",
|
| 997 |
+
"error": "",
|
| 998 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_cospar/app/cospar_server.py",
|
| 999 |
+
"dockerfile_ready": true
|
| 1000 |
+
},
|
| 1001 |
+
{
|
| 1002 |
+
"tool_name": "dca",
|
| 1003 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/dca.manual_bundle.txt",
|
| 1004 |
+
"run_help_command": false,
|
| 1005 |
+
"status": "success",
|
| 1006 |
+
"error": "",
|
| 1007 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_dca/app/dca_server.py",
|
| 1008 |
+
"dockerfile_ready": true
|
| 1009 |
+
},
|
| 1010 |
+
{
|
| 1011 |
+
"tool_name": "doubletdetection",
|
| 1012 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/doubletdetection.manual_bundle.txt",
|
| 1013 |
+
"run_help_command": false,
|
| 1014 |
+
"status": "skipped_existing",
|
| 1015 |
+
"error": "",
|
| 1016 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_doubletdetection/app/doubletdetection_server.py",
|
| 1017 |
+
"dockerfile_ready": true
|
| 1018 |
+
},
|
| 1019 |
+
{
|
| 1020 |
+
"tool_name": "dropkick",
|
| 1021 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/dropkick.manual_bundle.txt",
|
| 1022 |
+
"run_help_command": false,
|
| 1023 |
+
"status": "success",
|
| 1024 |
+
"error": "",
|
| 1025 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_dropkick/app/dropkick_server.py",
|
| 1026 |
+
"dockerfile_ready": true
|
| 1027 |
+
},
|
| 1028 |
+
{
|
| 1029 |
+
"tool_name": "easy_vitessce",
|
| 1030 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/easy_vitessce.manual_bundle.txt",
|
| 1031 |
+
"run_help_command": false,
|
| 1032 |
+
"status": "failed",
|
| 1033 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180) | gemini-2.5-flash: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180)",
|
| 1034 |
+
"output_file": "",
|
| 1035 |
+
"dockerfile_ready": false
|
| 1036 |
+
},
|
| 1037 |
+
{
|
| 1038 |
+
"tool_name": "echidna",
|
| 1039 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/echidna.manual_bundle.txt",
|
| 1040 |
+
"run_help_command": false,
|
| 1041 |
+
"status": "success",
|
| 1042 |
+
"error": "",
|
| 1043 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_echidna/app/echidna_server.py",
|
| 1044 |
+
"dockerfile_ready": true
|
| 1045 |
+
},
|
| 1046 |
+
{
|
| 1047 |
+
"tool_name": "episcanpy",
|
| 1048 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/episcanpy.manual_bundle.txt",
|
| 1049 |
+
"run_help_command": false,
|
| 1050 |
+
"status": "success",
|
| 1051 |
+
"error": "",
|
| 1052 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_episcanpy/app/episcanpy_server.py",
|
| 1053 |
+
"dockerfile_ready": true
|
| 1054 |
+
},
|
| 1055 |
+
{
|
| 1056 |
+
"tool_name": "flagx",
|
| 1057 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/flagx.manual_bundle.txt",
|
| 1058 |
+
"run_help_command": false,
|
| 1059 |
+
"status": "success",
|
| 1060 |
+
"error": "",
|
| 1061 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_flagx/app/flagx_server.py",
|
| 1062 |
+
"dockerfile_ready": true
|
| 1063 |
+
},
|
| 1064 |
+
{
|
| 1065 |
+
"tool_name": "gene-trajectory-python",
|
| 1066 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/gene-trajectory-python.manual_bundle.txt",
|
| 1067 |
+
"run_help_command": false,
|
| 1068 |
+
"status": "success",
|
| 1069 |
+
"error": "",
|
| 1070 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_gene-trajectory-python/app/gene-trajectory-python_server.py",
|
| 1071 |
+
"dockerfile_ready": true
|
| 1072 |
+
},
|
| 1073 |
+
{
|
| 1074 |
+
"tool_name": "genecircuitry",
|
| 1075 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/genecircuitry.manual_bundle.txt",
|
| 1076 |
+
"run_help_command": false,
|
| 1077 |
+
"status": "failed",
|
| 1078 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1079 |
+
"output_file": "",
|
| 1080 |
+
"dockerfile_ready": false
|
| 1081 |
+
},
|
| 1082 |
+
{
|
| 1083 |
+
"tool_name": "htslib",
|
| 1084 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/htslib.manual_bundle.txt",
|
| 1085 |
+
"run_help_command": false,
|
| 1086 |
+
"status": "failed",
|
| 1087 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1088 |
+
"output_file": "",
|
| 1089 |
+
"dockerfile_ready": false
|
| 1090 |
+
},
|
| 1091 |
+
{
|
| 1092 |
+
"tool_name": "kb-python",
|
| 1093 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/kb-python.manual_bundle.txt",
|
| 1094 |
+
"run_help_command": false,
|
| 1095 |
+
"status": "skipped_existing",
|
| 1096 |
+
"error": "",
|
| 1097 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_kb-python/app/kb-python_server.py",
|
| 1098 |
+
"dockerfile_ready": true
|
| 1099 |
+
},
|
| 1100 |
+
{
|
| 1101 |
+
"tool_name": "khipu-metabolomics",
|
| 1102 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/khipu-metabolomics.manual_bundle.txt",
|
| 1103 |
+
"run_help_command": false,
|
| 1104 |
+
"status": "skipped_existing",
|
| 1105 |
+
"error": "",
|
| 1106 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_khipu-metabolomics/app/khipu-metabolomics_server.py",
|
| 1107 |
+
"dockerfile_ready": true
|
| 1108 |
+
},
|
| 1109 |
+
{
|
| 1110 |
+
"tool_name": "last",
|
| 1111 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/last.manual_bundle.txt",
|
| 1112 |
+
"run_help_command": false,
|
| 1113 |
+
"status": "success",
|
| 1114 |
+
"error": "",
|
| 1115 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_last/app/last_server.py",
|
| 1116 |
+
"dockerfile_ready": true
|
| 1117 |
+
},
|
| 1118 |
+
{
|
| 1119 |
+
"tool_name": "liana",
|
| 1120 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/liana.manual_bundle.txt",
|
| 1121 |
+
"run_help_command": false,
|
| 1122 |
+
"status": "failed",
|
| 1123 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180) | gemini-2.5-flash: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180)",
|
| 1124 |
+
"output_file": "",
|
| 1125 |
+
"dockerfile_ready": false
|
| 1126 |
+
},
|
| 1127 |
+
{
|
| 1128 |
+
"tool_name": "mameshiba",
|
| 1129 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/mameshiba.manual_bundle.txt",
|
| 1130 |
+
"run_help_command": false,
|
| 1131 |
+
"status": "success",
|
| 1132 |
+
"error": "",
|
| 1133 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_mameshiba/app/mameshiba_server.py",
|
| 1134 |
+
"dockerfile_ready": true
|
| 1135 |
+
},
|
| 1136 |
+
{
|
| 1137 |
+
"tool_name": "markerrepo",
|
| 1138 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/markerrepo.manual_bundle.txt",
|
| 1139 |
+
"run_help_command": false,
|
| 1140 |
+
"status": "success",
|
| 1141 |
+
"error": "",
|
| 1142 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_markerrepo/app/markerrepo_server.py",
|
| 1143 |
+
"dockerfile_ready": true
|
| 1144 |
+
},
|
| 1145 |
+
{
|
| 1146 |
+
"tool_name": "mobivision-m",
|
| 1147 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/mobivision-m.manual_bundle.txt",
|
| 1148 |
+
"run_help_command": false,
|
| 1149 |
+
"status": "failed",
|
| 1150 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180) | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1151 |
+
"output_file": "",
|
| 1152 |
+
"dockerfile_ready": false
|
| 1153 |
+
},
|
| 1154 |
+
{
|
| 1155 |
+
"tool_name": "msproteomicstools",
|
| 1156 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/msproteomicstools.manual_bundle.txt",
|
| 1157 |
+
"run_help_command": false,
|
| 1158 |
+
"status": "failed",
|
| 1159 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180)",
|
| 1160 |
+
"output_file": "",
|
| 1161 |
+
"dockerfile_ready": false
|
| 1162 |
+
},
|
| 1163 |
+
{
|
| 1164 |
+
"tool_name": "multiqc-xenium-extra",
|
| 1165 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/multiqc-xenium-extra.manual_bundle.txt",
|
| 1166 |
+
"run_help_command": false,
|
| 1167 |
+
"status": "skipped_existing",
|
| 1168 |
+
"error": "",
|
| 1169 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_multiqc-xenium-extra/app/multiqc-xenium-extra_server.py",
|
| 1170 |
+
"dockerfile_ready": true
|
| 1171 |
+
},
|
| 1172 |
+
{
|
| 1173 |
+
"tool_name": "ngs-smap",
|
| 1174 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/ngs-smap.manual_bundle.txt",
|
| 1175 |
+
"run_help_command": false,
|
| 1176 |
+
"status": "success",
|
| 1177 |
+
"error": "",
|
| 1178 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ngs-smap/app/ngs-smap_server.py",
|
| 1179 |
+
"dockerfile_ready": true
|
| 1180 |
+
},
|
| 1181 |
+
{
|
| 1182 |
+
"tool_name": "novae",
|
| 1183 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/novae.manual_bundle.txt",
|
| 1184 |
+
"run_help_command": false,
|
| 1185 |
+
"status": "success",
|
| 1186 |
+
"error": "",
|
| 1187 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_novae/app/novae_server.py",
|
| 1188 |
+
"dockerfile_ready": true
|
| 1189 |
+
},
|
| 1190 |
+
{
|
| 1191 |
+
"tool_name": "openms-thirdparty",
|
| 1192 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/openms-thirdparty.manual_bundle.txt",
|
| 1193 |
+
"run_help_command": false,
|
| 1194 |
+
"status": "success",
|
| 1195 |
+
"error": "",
|
| 1196 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_openms-thirdparty/app/openms-thirdparty_server.py",
|
| 1197 |
+
"dockerfile_ready": true
|
| 1198 |
+
},
|
| 1199 |
+
{
|
| 1200 |
+
"tool_name": "opticlust",
|
| 1201 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/opticlust.manual_bundle.txt",
|
| 1202 |
+
"run_help_command": false,
|
| 1203 |
+
"status": "failed",
|
| 1204 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1205 |
+
"output_file": "",
|
| 1206 |
+
"dockerfile_ready": false
|
| 1207 |
+
},
|
| 1208 |
+
{
|
| 1209 |
+
"tool_name": "ourotools",
|
| 1210 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/ourotools.manual_bundle.txt",
|
| 1211 |
+
"run_help_command": false,
|
| 1212 |
+
"status": "failed",
|
| 1213 |
+
"error": "refine failed (retry=1): Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1214 |
+
"output_file": "",
|
| 1215 |
+
"dockerfile_ready": false
|
| 1216 |
+
},
|
| 1217 |
+
{
|
| 1218 |
+
"tool_name": "palantir",
|
| 1219 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/palantir.manual_bundle.txt",
|
| 1220 |
+
"run_help_command": false,
|
| 1221 |
+
"status": "skipped_existing",
|
| 1222 |
+
"error": "",
|
| 1223 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_palantir/app/palantir_server.py",
|
| 1224 |
+
"dockerfile_ready": true
|
| 1225 |
+
},
|
| 1226 |
+
{
|
| 1227 |
+
"tool_name": "paste-bio",
|
| 1228 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/paste-bio.manual_bundle.txt",
|
| 1229 |
+
"run_help_command": false,
|
| 1230 |
+
"status": "skipped_existing",
|
| 1231 |
+
"error": "",
|
| 1232 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_paste-bio/app/paste-bio_server.py",
|
| 1233 |
+
"dockerfile_ready": true
|
| 1234 |
+
},
|
| 1235 |
+
{
|
| 1236 |
+
"tool_name": "pcdl",
|
| 1237 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/pcdl.manual_bundle.txt",
|
| 1238 |
+
"run_help_command": false,
|
| 1239 |
+
"status": "success",
|
| 1240 |
+
"error": "",
|
| 1241 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_pcdl/app/pcdl_server.py",
|
| 1242 |
+
"dockerfile_ready": true
|
| 1243 |
+
},
|
| 1244 |
+
{
|
| 1245 |
+
"tool_name": "peakqc",
|
| 1246 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/peakqc.manual_bundle.txt",
|
| 1247 |
+
"run_help_command": false,
|
| 1248 |
+
"status": "success",
|
| 1249 |
+
"error": "",
|
| 1250 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_peakqc/app/peakqc_server.py",
|
| 1251 |
+
"dockerfile_ready": true
|
| 1252 |
+
},
|
| 1253 |
+
{
|
| 1254 |
+
"tool_name": "peptides",
|
| 1255 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/peptides.manual_bundle.txt",
|
| 1256 |
+
"run_help_command": false,
|
| 1257 |
+
"status": "success",
|
| 1258 |
+
"error": "",
|
| 1259 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_peptides/app/peptides_server.py",
|
| 1260 |
+
"dockerfile_ready": true
|
| 1261 |
+
},
|
| 1262 |
+
{
|
| 1263 |
+
"tool_name": "piaso",
|
| 1264 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/piaso.manual_bundle.txt",
|
| 1265 |
+
"run_help_command": false,
|
| 1266 |
+
"status": "success",
|
| 1267 |
+
"error": "",
|
| 1268 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_piaso/app/piaso_server.py",
|
| 1269 |
+
"dockerfile_ready": true
|
| 1270 |
+
},
|
| 1271 |
+
{
|
| 1272 |
+
"tool_name": "pixelator",
|
| 1273 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/pixelator.manual_bundle.txt",
|
| 1274 |
+
"run_help_command": false,
|
| 1275 |
+
"status": "success",
|
| 1276 |
+
"error": "",
|
| 1277 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_pixelator/app/pixelator_server.py",
|
| 1278 |
+
"dockerfile_ready": true
|
| 1279 |
+
},
|
| 1280 |
+
{
|
| 1281 |
+
"tool_name": "proteomiqon-peptidedb",
|
| 1282 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/proteomiqon-peptidedb.manual_bundle.txt",
|
| 1283 |
+
"run_help_command": false,
|
| 1284 |
+
"status": "success",
|
| 1285 |
+
"error": "",
|
| 1286 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_proteomiqon-peptidedb/app/proteomiqon-peptidedb_server.py",
|
| 1287 |
+
"dockerfile_ready": true
|
| 1288 |
+
},
|
| 1289 |
+
{
|
| 1290 |
+
"tool_name": "pyrovelocity",
|
| 1291 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/pyrovelocity.manual_bundle.txt",
|
| 1292 |
+
"run_help_command": false,
|
| 1293 |
+
"status": "failed",
|
| 1294 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1295 |
+
"output_file": "",
|
| 1296 |
+
"dockerfile_ready": false
|
| 1297 |
+
},
|
| 1298 |
+
{
|
| 1299 |
+
"tool_name": "qcatch",
|
| 1300 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/qcatch.manual_bundle.txt",
|
| 1301 |
+
"run_help_command": false,
|
| 1302 |
+
"status": "success",
|
| 1303 |
+
"error": "",
|
| 1304 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_qcatch/app/qcatch_server.py",
|
| 1305 |
+
"dockerfile_ready": true
|
| 1306 |
+
},
|
| 1307 |
+
{
|
| 1308 |
+
"tool_name": "r-archr",
|
| 1309 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-archr.manual_bundle.txt",
|
| 1310 |
+
"run_help_command": false,
|
| 1311 |
+
"status": "success",
|
| 1312 |
+
"error": "",
|
| 1313 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-archr/app/r-archr_server.py",
|
| 1314 |
+
"dockerfile_ready": true
|
| 1315 |
+
},
|
| 1316 |
+
{
|
| 1317 |
+
"tool_name": "r-azimuth",
|
| 1318 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-azimuth.manual_bundle.txt",
|
| 1319 |
+
"run_help_command": false,
|
| 1320 |
+
"status": "success",
|
| 1321 |
+
"error": "",
|
| 1322 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-azimuth/app/r-azimuth_server.py",
|
| 1323 |
+
"dockerfile_ready": true
|
| 1324 |
+
},
|
| 1325 |
+
{
|
| 1326 |
+
"tool_name": "r-beyondcell",
|
| 1327 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-beyondcell.manual_bundle.txt",
|
| 1328 |
+
"run_help_command": false,
|
| 1329 |
+
"status": "success",
|
| 1330 |
+
"error": "",
|
| 1331 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-beyondcell/app/r-beyondcell_server.py",
|
| 1332 |
+
"dockerfile_ready": true
|
| 1333 |
+
},
|
| 1334 |
+
{
|
| 1335 |
+
"tool_name": "r-cdseq",
|
| 1336 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-cdseq.manual_bundle.txt",
|
| 1337 |
+
"run_help_command": false,
|
| 1338 |
+
"status": "success",
|
| 1339 |
+
"error": "",
|
| 1340 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-cdseq/app/r-cdseq_server.py",
|
| 1341 |
+
"dockerfile_ready": true
|
| 1342 |
+
},
|
| 1343 |
+
{
|
| 1344 |
+
"tool_name": "r-dwls",
|
| 1345 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-dwls.manual_bundle.txt",
|
| 1346 |
+
"run_help_command": false,
|
| 1347 |
+
"status": "success",
|
| 1348 |
+
"error": "",
|
| 1349 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-dwls/app/r-dwls_server.py",
|
| 1350 |
+
"dockerfile_ready": true
|
| 1351 |
+
},
|
| 1352 |
+
{
|
| 1353 |
+
"tool_name": "r-epitrace",
|
| 1354 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-epitrace.manual_bundle.txt",
|
| 1355 |
+
"run_help_command": false,
|
| 1356 |
+
"status": "success",
|
| 1357 |
+
"error": "",
|
| 1358 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-epitrace/app/r-epitrace_server.py",
|
| 1359 |
+
"dockerfile_ready": true
|
| 1360 |
+
},
|
| 1361 |
+
{
|
| 1362 |
+
"tool_name": "r-flanders",
|
| 1363 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-flanders.manual_bundle.txt",
|
| 1364 |
+
"run_help_command": false,
|
| 1365 |
+
"status": "success",
|
| 1366 |
+
"error": "",
|
| 1367 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-flanders/app/r-flanders_server.py",
|
| 1368 |
+
"dockerfile_ready": true
|
| 1369 |
+
},
|
| 1370 |
+
{
|
| 1371 |
+
"tool_name": "r-mams",
|
| 1372 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-mams.manual_bundle.txt",
|
| 1373 |
+
"run_help_command": false,
|
| 1374 |
+
"status": "success",
|
| 1375 |
+
"error": "",
|
| 1376 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-mams/app/r-mams_server.py",
|
| 1377 |
+
"dockerfile_ready": true
|
| 1378 |
+
},
|
| 1379 |
+
{
|
| 1380 |
+
"tool_name": "r-redeemr",
|
| 1381 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-redeemr.manual_bundle.txt",
|
| 1382 |
+
"run_help_command": false,
|
| 1383 |
+
"status": "success",
|
| 1384 |
+
"error": "",
|
| 1385 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-redeemr/app/r-redeemr_server.py",
|
| 1386 |
+
"dockerfile_ready": true
|
| 1387 |
+
},
|
| 1388 |
+
{
|
| 1389 |
+
"tool_name": "r-sceasy",
|
| 1390 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-sceasy.manual_bundle.txt",
|
| 1391 |
+
"run_help_command": false,
|
| 1392 |
+
"status": "success",
|
| 1393 |
+
"error": "",
|
| 1394 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-sceasy/app/r-sceasy_server.py",
|
| 1395 |
+
"dockerfile_ready": true
|
| 1396 |
+
},
|
| 1397 |
+
{
|
| 1398 |
+
"tool_name": "r-scopfunctions",
|
| 1399 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-scopfunctions.manual_bundle.txt",
|
| 1400 |
+
"run_help_command": false,
|
| 1401 |
+
"status": "success",
|
| 1402 |
+
"error": "",
|
| 1403 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-scopfunctions/app/r-scopfunctions_server.py",
|
| 1404 |
+
"dockerfile_ready": true
|
| 1405 |
+
},
|
| 1406 |
+
{
|
| 1407 |
+
"tool_name": "r-seurat-data",
|
| 1408 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-seurat-data.manual_bundle.txt",
|
| 1409 |
+
"run_help_command": false,
|
| 1410 |
+
"status": "failed",
|
| 1411 |
+
"error": "autogenerate_mcp_tool failed: Gemini request failed across all models. gemini-2.5-pro: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n | gemini-3-flash-preview: exception HTTPSConnectionPool(host='generativelanguage.googleapis.com', port=443): Read timed out. (read timeout=180) | gemini-2.5-flash: HTTP 400 - {\n \"error\": {\n \"code\": 400,\n \"message\": \"User location is not supported for the API use.\",\n \"status\": \"FAILED_PRECONDITION\"\n }\n}\n",
|
| 1412 |
+
"output_file": "",
|
| 1413 |
+
"dockerfile_ready": false
|
| 1414 |
+
},
|
| 1415 |
+
{
|
| 1416 |
+
"tool_name": "r-seurat-disk",
|
| 1417 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/r-seurat-disk.manual_bundle.txt",
|
| 1418 |
+
"run_help_command": false,
|
| 1419 |
+
"status": "success",
|
| 1420 |
+
"error": "",
|
| 1421 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_r-seurat-disk/app/r-seurat-disk_server.py",
|
| 1422 |
+
"dockerfile_ready": true
|
| 1423 |
+
},
|
| 1424 |
+
{
|
| 1425 |
+
"tool_name": "sage-proteomics",
|
| 1426 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sage-proteomics.manual_bundle.txt",
|
| 1427 |
+
"run_help_command": false,
|
| 1428 |
+
"status": "skipped_existing",
|
| 1429 |
+
"error": "",
|
| 1430 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sage-proteomics/app/sage-proteomics_server.py",
|
| 1431 |
+
"dockerfile_ready": true
|
| 1432 |
+
},
|
| 1433 |
+
{
|
| 1434 |
+
"tool_name": "samap",
|
| 1435 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/samap.manual_bundle.txt",
|
| 1436 |
+
"run_help_command": false,
|
| 1437 |
+
"status": "success",
|
| 1438 |
+
"error": "",
|
| 1439 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_samap/app/samap_server.py",
|
| 1440 |
+
"dockerfile_ready": true
|
| 1441 |
+
},
|
| 1442 |
+
{
|
| 1443 |
+
"tool_name": "samtools",
|
| 1444 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/samtools.manual_bundle.txt",
|
| 1445 |
+
"run_help_command": false,
|
| 1446 |
+
"status": "success",
|
| 1447 |
+
"error": "",
|
| 1448 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_samtools/app/samtools_server.py",
|
| 1449 |
+
"dockerfile_ready": true
|
| 1450 |
+
},
|
| 1451 |
+
{
|
| 1452 |
+
"tool_name": "sc-musketeers",
|
| 1453 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sc-musketeers.manual_bundle.txt",
|
| 1454 |
+
"run_help_command": false,
|
| 1455 |
+
"status": "success",
|
| 1456 |
+
"error": "",
|
| 1457 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sc-musketeers/app/sc-musketeers_server.py",
|
| 1458 |
+
"dockerfile_ready": true
|
| 1459 |
+
},
|
| 1460 |
+
{
|
| 1461 |
+
"tool_name": "scaden",
|
| 1462 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scaden.manual_bundle.txt",
|
| 1463 |
+
"run_help_command": false,
|
| 1464 |
+
"status": "success",
|
| 1465 |
+
"error": "",
|
| 1466 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scaden/app/scaden_server.py",
|
| 1467 |
+
"dockerfile_ready": true
|
| 1468 |
+
},
|
| 1469 |
+
{
|
| 1470 |
+
"tool_name": "scanpy-cli",
|
| 1471 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scanpy-cli.manual_bundle.txt",
|
| 1472 |
+
"run_help_command": false,
|
| 1473 |
+
"status": "success",
|
| 1474 |
+
"error": "",
|
| 1475 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scanpy-cli/app/scanpy-cli_server.py",
|
| 1476 |
+
"dockerfile_ready": true
|
| 1477 |
+
},
|
| 1478 |
+
{
|
| 1479 |
+
"tool_name": "scanpy-scripts",
|
| 1480 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scanpy-scripts.manual_bundle.txt",
|
| 1481 |
+
"run_help_command": false,
|
| 1482 |
+
"status": "success",
|
| 1483 |
+
"error": "",
|
| 1484 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scanpy-scripts/app/scanpy-scripts_server.py",
|
| 1485 |
+
"dockerfile_ready": true
|
| 1486 |
+
},
|
| 1487 |
+
{
|
| 1488 |
+
"tool_name": "sccellfie",
|
| 1489 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sccellfie.manual_bundle.txt",
|
| 1490 |
+
"run_help_command": false,
|
| 1491 |
+
"status": "success",
|
| 1492 |
+
"error": "",
|
| 1493 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sccellfie/app/sccellfie_server.py",
|
| 1494 |
+
"dockerfile_ready": true
|
| 1495 |
+
},
|
| 1496 |
+
{
|
| 1497 |
+
"tool_name": "scepia",
|
| 1498 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scepia.manual_bundle.txt",
|
| 1499 |
+
"run_help_command": false,
|
| 1500 |
+
"status": "success",
|
| 1501 |
+
"error": "",
|
| 1502 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scepia/app/scepia_server.py",
|
| 1503 |
+
"dockerfile_ready": true
|
| 1504 |
+
},
|
| 1505 |
+
{
|
| 1506 |
+
"tool_name": "scglue",
|
| 1507 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scglue.manual_bundle.txt",
|
| 1508 |
+
"run_help_command": false,
|
| 1509 |
+
"status": "success",
|
| 1510 |
+
"error": "",
|
| 1511 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scglue/app/scglue_server.py",
|
| 1512 |
+
"dockerfile_ready": true
|
| 1513 |
+
},
|
| 1514 |
+
{
|
| 1515 |
+
"tool_name": "scib",
|
| 1516 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scib.manual_bundle.txt",
|
| 1517 |
+
"run_help_command": false,
|
| 1518 |
+
"status": "skipped_existing",
|
| 1519 |
+
"error": "",
|
| 1520 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scib/app/scib_server.py",
|
| 1521 |
+
"dockerfile_ready": true
|
| 1522 |
+
},
|
| 1523 |
+
{
|
| 1524 |
+
"tool_name": "scirpy",
|
| 1525 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scirpy.manual_bundle.txt",
|
| 1526 |
+
"run_help_command": false,
|
| 1527 |
+
"status": "skipped_existing",
|
| 1528 |
+
"error": "",
|
| 1529 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scirpy/app/scirpy_server.py",
|
| 1530 |
+
"dockerfile_ready": true
|
| 1531 |
+
},
|
| 1532 |
+
{
|
| 1533 |
+
"tool_name": "scmidas",
|
| 1534 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scmidas.manual_bundle.txt",
|
| 1535 |
+
"run_help_command": false,
|
| 1536 |
+
"status": "skipped_existing",
|
| 1537 |
+
"error": "",
|
| 1538 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scmidas/app/scmidas_server.py",
|
| 1539 |
+
"dockerfile_ready": true
|
| 1540 |
+
},
|
| 1541 |
+
{
|
| 1542 |
+
"tool_name": "scrnasim-toolz",
|
| 1543 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scrnasim-toolz.manual_bundle.txt",
|
| 1544 |
+
"run_help_command": false,
|
| 1545 |
+
"status": "success",
|
| 1546 |
+
"error": "",
|
| 1547 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scrnasim-toolz/app/scrnasim-toolz_server.py",
|
| 1548 |
+
"dockerfile_ready": true
|
| 1549 |
+
},
|
| 1550 |
+
{
|
| 1551 |
+
"tool_name": "scspectra",
|
| 1552 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scspectra.manual_bundle.txt",
|
| 1553 |
+
"run_help_command": false,
|
| 1554 |
+
"status": "success",
|
| 1555 |
+
"error": "",
|
| 1556 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scspectra/app/scspectra_server.py",
|
| 1557 |
+
"dockerfile_ready": true
|
| 1558 |
+
},
|
| 1559 |
+
{
|
| 1560 |
+
"tool_name": "scstem",
|
| 1561 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scstem.manual_bundle.txt",
|
| 1562 |
+
"run_help_command": false,
|
| 1563 |
+
"status": "success",
|
| 1564 |
+
"error": "",
|
| 1565 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scstem/app/scstem_server.py",
|
| 1566 |
+
"dockerfile_ready": true
|
| 1567 |
+
},
|
| 1568 |
+
{
|
| 1569 |
+
"tool_name": "sctriangulate",
|
| 1570 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sctriangulate.manual_bundle.txt",
|
| 1571 |
+
"run_help_command": false,
|
| 1572 |
+
"status": "success",
|
| 1573 |
+
"error": "",
|
| 1574 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sctriangulate/app/sctriangulate_server.py",
|
| 1575 |
+
"dockerfile_ready": true
|
| 1576 |
+
},
|
| 1577 |
+
{
|
| 1578 |
+
"tool_name": "scvi",
|
| 1579 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scvi.manual_bundle.txt",
|
| 1580 |
+
"run_help_command": false,
|
| 1581 |
+
"status": "skipped_existing",
|
| 1582 |
+
"error": "",
|
| 1583 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scvi/app/scvi_server.py",
|
| 1584 |
+
"dockerfile_ready": true
|
| 1585 |
+
},
|
| 1586 |
+
{
|
| 1587 |
+
"tool_name": "scvi-tools",
|
| 1588 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scvi-tools.manual_bundle.txt",
|
| 1589 |
+
"run_help_command": false,
|
| 1590 |
+
"status": "skipped_existing",
|
| 1591 |
+
"error": "",
|
| 1592 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scvi-tools/app/scvi-tools_server.py",
|
| 1593 |
+
"dockerfile_ready": true
|
| 1594 |
+
},
|
| 1595 |
+
{
|
| 1596 |
+
"tool_name": "scvis",
|
| 1597 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scvis.manual_bundle.txt",
|
| 1598 |
+
"run_help_command": false,
|
| 1599 |
+
"status": "success",
|
| 1600 |
+
"error": "",
|
| 1601 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scvis/app/scvis_server.py",
|
| 1602 |
+
"dockerfile_ready": true
|
| 1603 |
+
},
|
| 1604 |
+
{
|
| 1605 |
+
"tool_name": "scvis_galaxy",
|
| 1606 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scvis_galaxy.manual_bundle.txt",
|
| 1607 |
+
"run_help_command": false,
|
| 1608 |
+
"status": "success",
|
| 1609 |
+
"error": "",
|
| 1610 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scvis_galaxy/app/scvis_galaxy_server.py",
|
| 1611 |
+
"dockerfile_ready": true
|
| 1612 |
+
},
|
| 1613 |
+
{
|
| 1614 |
+
"tool_name": "scxmatch",
|
| 1615 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/scxmatch.manual_bundle.txt",
|
| 1616 |
+
"run_help_command": false,
|
| 1617 |
+
"status": "success",
|
| 1618 |
+
"error": "",
|
| 1619 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_scxmatch/app/scxmatch_server.py",
|
| 1620 |
+
"dockerfile_ready": true
|
| 1621 |
+
},
|
| 1622 |
+
{
|
| 1623 |
+
"tool_name": "sdeper",
|
| 1624 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sdeper.manual_bundle.txt",
|
| 1625 |
+
"run_help_command": false,
|
| 1626 |
+
"status": "success",
|
| 1627 |
+
"error": "",
|
| 1628 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sdeper/app/sdeper_server.py",
|
| 1629 |
+
"dockerfile_ready": true
|
| 1630 |
+
},
|
| 1631 |
+
{
|
| 1632 |
+
"tool_name": "seacells",
|
| 1633 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/seacells.manual_bundle.txt",
|
| 1634 |
+
"run_help_command": false,
|
| 1635 |
+
"status": "success",
|
| 1636 |
+
"error": "",
|
| 1637 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_seacells/app/seacells_server.py",
|
| 1638 |
+
"dockerfile_ready": true
|
| 1639 |
+
},
|
| 1640 |
+
{
|
| 1641 |
+
"tool_name": "shiba",
|
| 1642 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/shiba.manual_bundle.txt",
|
| 1643 |
+
"run_help_command": false,
|
| 1644 |
+
"status": "success",
|
| 1645 |
+
"error": "",
|
| 1646 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_shiba/app/shiba_server.py",
|
| 1647 |
+
"dockerfile_ready": true
|
| 1648 |
+
},
|
| 1649 |
+
{
|
| 1650 |
+
"tool_name": "simo-omics",
|
| 1651 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/simo-omics.manual_bundle.txt",
|
| 1652 |
+
"run_help_command": false,
|
| 1653 |
+
"status": "success",
|
| 1654 |
+
"error": "",
|
| 1655 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_simo-omics/app/simo-omics_server.py",
|
| 1656 |
+
"dockerfile_ready": true
|
| 1657 |
+
},
|
| 1658 |
+
{
|
| 1659 |
+
"tool_name": "sincei",
|
| 1660 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sincei.manual_bundle.txt",
|
| 1661 |
+
"run_help_command": false,
|
| 1662 |
+
"status": "success",
|
| 1663 |
+
"error": "",
|
| 1664 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sincei/app/sincei_server.py",
|
| 1665 |
+
"dockerfile_ready": true
|
| 1666 |
+
},
|
| 1667 |
+
{
|
| 1668 |
+
"tool_name": "sopa",
|
| 1669 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/sopa.manual_bundle.txt",
|
| 1670 |
+
"run_help_command": false,
|
| 1671 |
+
"status": "success",
|
| 1672 |
+
"error": "",
|
| 1673 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_sopa/app/sopa_server.py",
|
| 1674 |
+
"dockerfile_ready": true
|
| 1675 |
+
},
|
| 1676 |
+
{
|
| 1677 |
+
"tool_name": "spagrn",
|
| 1678 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/spagrn.manual_bundle.txt",
|
| 1679 |
+
"run_help_command": false,
|
| 1680 |
+
"status": "success",
|
| 1681 |
+
"error": "",
|
| 1682 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_spagrn/app/spagrn_server.py",
|
| 1683 |
+
"dockerfile_ready": true
|
| 1684 |
+
},
|
| 1685 |
+
{
|
| 1686 |
+
"tool_name": "spapros",
|
| 1687 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/spapros.manual_bundle.txt",
|
| 1688 |
+
"run_help_command": false,
|
| 1689 |
+
"status": "success",
|
| 1690 |
+
"error": "",
|
| 1691 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_spapros/app/spapros_server.py",
|
| 1692 |
+
"dockerfile_ready": true
|
| 1693 |
+
},
|
| 1694 |
+
{
|
| 1695 |
+
"tool_name": "spatialleiden",
|
| 1696 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/spatialleiden.manual_bundle.txt",
|
| 1697 |
+
"run_help_command": false,
|
| 1698 |
+
"status": "success",
|
| 1699 |
+
"error": "",
|
| 1700 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_spatialleiden/app/spatialleiden_server.py",
|
| 1701 |
+
"dockerfile_ready": true
|
| 1702 |
+
},
|
| 1703 |
+
{
|
| 1704 |
+
"tool_name": "switchtfi",
|
| 1705 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/switchtfi.manual_bundle.txt",
|
| 1706 |
+
"run_help_command": false,
|
| 1707 |
+
"status": "success",
|
| 1708 |
+
"error": "",
|
| 1709 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_switchtfi/app/switchtfi_server.py",
|
| 1710 |
+
"dockerfile_ready": true
|
| 1711 |
+
},
|
| 1712 |
+
{
|
| 1713 |
+
"tool_name": "talon",
|
| 1714 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/talon.manual_bundle.txt",
|
| 1715 |
+
"run_help_command": false,
|
| 1716 |
+
"status": "success",
|
| 1717 |
+
"error": "",
|
| 1718 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_talon/app/talon_server.py",
|
| 1719 |
+
"dockerfile_ready": true
|
| 1720 |
+
},
|
| 1721 |
+
{
|
| 1722 |
+
"tool_name": "tirank",
|
| 1723 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/tirank.manual_bundle.txt",
|
| 1724 |
+
"run_help_command": false,
|
| 1725 |
+
"status": "success",
|
| 1726 |
+
"error": "",
|
| 1727 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_tirank/app/tirank_server.py",
|
| 1728 |
+
"dockerfile_ready": true
|
| 1729 |
+
},
|
| 1730 |
+
{
|
| 1731 |
+
"tool_name": "vitessce-python",
|
| 1732 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/vitessce-python.manual_bundle.txt",
|
| 1733 |
+
"run_help_command": false,
|
| 1734 |
+
"status": "skipped_existing",
|
| 1735 |
+
"error": "",
|
| 1736 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_vitessce-python/app/vitessce-python_server.py",
|
| 1737 |
+
"dockerfile_ready": true
|
| 1738 |
+
},
|
| 1739 |
+
{
|
| 1740 |
+
"tool_name": "vpt",
|
| 1741 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/vpt.manual_bundle.txt",
|
| 1742 |
+
"run_help_command": false,
|
| 1743 |
+
"status": "success",
|
| 1744 |
+
"error": "",
|
| 1745 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_vpt/app/vpt_server.py",
|
| 1746 |
+
"dockerfile_ready": true
|
| 1747 |
+
},
|
| 1748 |
+
{
|
| 1749 |
+
"tool_name": "wasp2",
|
| 1750 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/wasp2.manual_bundle.txt",
|
| 1751 |
+
"run_help_command": false,
|
| 1752 |
+
"status": "success",
|
| 1753 |
+
"error": "",
|
| 1754 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_wasp2/app/wasp2_server.py",
|
| 1755 |
+
"dockerfile_ready": true
|
| 1756 |
+
},
|
| 1757 |
+
{
|
| 1758 |
+
"tool_name": "xclone",
|
| 1759 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/xclone.manual_bundle.txt",
|
| 1760 |
+
"run_help_command": false,
|
| 1761 |
+
"status": "success",
|
| 1762 |
+
"error": "",
|
| 1763 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_xclone/app/xclone_server.py",
|
| 1764 |
+
"dockerfile_ready": true
|
| 1765 |
+
},
|
| 1766 |
+
{
|
| 1767 |
+
"tool_name": "zol",
|
| 1768 |
+
"manual": "/225040511/project/BioScientist/agent_system/toolbase/output/help_docs/manual_bundle_txt/zol.manual_bundle.txt",
|
| 1769 |
+
"run_help_command": false,
|
| 1770 |
+
"status": "success",
|
| 1771 |
+
"error": "",
|
| 1772 |
+
"output_file": "/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_zol/app/zol_server.py",
|
| 1773 |
+
"dockerfile_ready": true
|
| 1774 |
+
}
|
| 1775 |
+
]
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_0_of_4.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_1_of_4.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_2_of_4.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/conversion_report.shard_3_of_4.json
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/Dockerfile
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
# Install system dependencies
|
| 5 |
+
RUN apt-get update && apt-get install -y default-jre wget curl && apt-get clean && rm -rf /var/lib/apt/lists/*
|
| 6 |
+
|
| 7 |
+
# Install Miniconda
|
| 8 |
+
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/conda && rm /tmp/miniconda.sh
|
| 9 |
+
|
| 10 |
+
# Add conda to PATH
|
| 11 |
+
ENV PATH="/opt/conda/bin:$PATH"
|
| 12 |
+
|
| 13 |
+
# Install abundancebin via conda (e.g., from bioconda)
|
| 14 |
+
RUN conda install -c bioconda abundancebin -y && conda clean -a
|
| 15 |
+
|
| 16 |
+
# Install Python dependencies
|
| 17 |
+
RUN pip install uv
|
| 18 |
+
RUN uv pip install --system fastmcp
|
| 19 |
+
|
| 20 |
+
# Create app directory
|
| 21 |
+
WORKDIR /app
|
| 22 |
+
|
| 23 |
+
# Copy your MCP server
|
| 24 |
+
COPY app/abundancebin_server.py /app/
|
| 25 |
+
|
| 26 |
+
# Create workspace and output directories
|
| 27 |
+
RUN mkdir -p /app/workspace /app/output
|
| 28 |
+
|
| 29 |
+
# Make sure the server script is executable
|
| 30 |
+
RUN chmod +x /app/abundancebin_server.py
|
| 31 |
+
|
| 32 |
+
# Expose port for MCP over HTTP (optional)
|
| 33 |
+
EXPOSE 8000
|
| 34 |
+
|
| 35 |
+
# Health check
|
| 36 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)"
|
| 37 |
+
|
| 38 |
+
# Default command runs the MCP server via stdio
|
| 39 |
+
CMD ["python", "/app/abundancebin_server.py"]
|
| 40 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/abundancebin_server.py
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
import tempfile
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from typing import Optional, List
|
| 5 |
+
|
| 6 |
+
# This is a placeholder for the MCP decorator.
|
| 7 |
+
# In a real MCP environment, this would be imported from the MCP library.
|
| 8 |
+
def tool(*args, **kwargs):
|
| 9 |
+
def decorator(f):
|
| 10 |
+
return f
|
| 11 |
+
return decorator
|
| 12 |
+
|
| 13 |
+
mcp = type("mcp", (), {"tool": tool})
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
@mcp.tool()
|
| 17 |
+
def abundancebin(
|
| 18 |
+
input_file: Path,
|
| 19 |
+
kmer_len: int = 20,
|
| 20 |
+
output: Optional[Path] = None,
|
| 21 |
+
exclude: Optional[int] = None,
|
| 22 |
+
exclude_max: Optional[int] = None,
|
| 23 |
+
output_fasta: bool = False,
|
| 24 |
+
bin_num: Optional[int] = None,
|
| 25 |
+
recursive_classification: bool = False,
|
| 26 |
+
):
|
| 27 |
+
"""
|
| 28 |
+
Bins sequences based on k-mer composition and abundance.
|
| 29 |
+
|
| 30 |
+
This tool can either classify sequences into a predefined number of bins
|
| 31 |
+
or use a recursive classification approach.
|
| 32 |
+
|
| 33 |
+
Args:
|
| 34 |
+
input_file: Path to the input filename.
|
| 35 |
+
kmer_len: Composition length (k-mer size). Defaults to 20.
|
| 36 |
+
output: Path to the output file. Defaults to inputfile.log.
|
| 37 |
+
exclude: Exclude sequences with a count below this value.
|
| 38 |
+
exclude_max: Exclude sequences with a count above this value.
|
| 39 |
+
output_fasta: If set, output results in FASTA format.
|
| 40 |
+
bin_num: The number of bins to classify sequences into.
|
| 41 |
+
recursive_classification: If set, undergo recursive classification.
|
| 42 |
+
Cannot be used with bin_num.
|
| 43 |
+
|
| 44 |
+
Returns:
|
| 45 |
+
A dictionary containing the command executed, stdout, stderr, and a list of output files.
|
| 46 |
+
"""
|
| 47 |
+
# --- Input Validation ---
|
| 48 |
+
if not input_file.is_file():
|
| 49 |
+
raise FileNotFoundError(f"Input file not found: {input_file}")
|
| 50 |
+
|
| 51 |
+
if kmer_len <= 0:
|
| 52 |
+
raise ValueError("kmer_len must be a positive integer.")
|
| 53 |
+
|
| 54 |
+
if exclude is not None and exclude < 0:
|
| 55 |
+
raise ValueError("The 'exclude' count must be a non-negative integer.")
|
| 56 |
+
|
| 57 |
+
if exclude_max is not None and exclude_max < 0:
|
| 58 |
+
raise ValueError("The 'exclude_max' count must be a non-negative integer.")
|
| 59 |
+
|
| 60 |
+
if bin_num is not None and bin_num <= 0:
|
| 61 |
+
raise ValueError("The 'bin_num' must be a positive integer.")
|
| 62 |
+
|
| 63 |
+
if bin_num is not None and recursive_classification:
|
| 64 |
+
raise ValueError(
|
| 65 |
+
"Cannot specify both 'bin_num' and 'recursive_classification'. "
|
| 66 |
+
"Please choose one method for classification."
|
| 67 |
+
)
|
| 68 |
+
|
| 69 |
+
# --- Command Construction ---
|
| 70 |
+
cmd = ["abundancebin"]
|
| 71 |
+
|
| 72 |
+
cmd.extend(["-input", str(input_file)])
|
| 73 |
+
|
| 74 |
+
# Handle default output file path
|
| 75 |
+
if output:
|
| 76 |
+
output_path = output
|
| 77 |
+
else:
|
| 78 |
+
output_path = input_file.with_suffix('.log')
|
| 79 |
+
|
| 80 |
+
cmd.extend(["-output", str(output_path)])
|
| 81 |
+
|
| 82 |
+
cmd.extend(["-kmer_len", str(kmer_len)])
|
| 83 |
+
|
| 84 |
+
if exclude is not None:
|
| 85 |
+
cmd.extend(["-exclude", str(exclude)])
|
| 86 |
+
|
| 87 |
+
if exclude_max is not None:
|
| 88 |
+
cmd.extend(["-exclude_max", str(exclude_max)])
|
| 89 |
+
|
| 90 |
+
if output_fasta:
|
| 91 |
+
cmd.append("-OUTPUT_FASTA")
|
| 92 |
+
|
| 93 |
+
if bin_num is not None:
|
| 94 |
+
cmd.extend(["-bin_num", str(bin_num)])
|
| 95 |
+
|
| 96 |
+
if recursive_classification:
|
| 97 |
+
cmd.append("-RECURSIVE_CLASSIFICATION")
|
| 98 |
+
|
| 99 |
+
command_executed = " ".join(cmd)
|
| 100 |
+
|
| 101 |
+
# --- Subprocess Execution ---
|
| 102 |
+
try:
|
| 103 |
+
result = subprocess.run(
|
| 104 |
+
cmd,
|
| 105 |
+
capture_output=True,
|
| 106 |
+
text=True,
|
| 107 |
+
check=True
|
| 108 |
+
)
|
| 109 |
+
stdout = result.stdout
|
| 110 |
+
stderr = result.stderr
|
| 111 |
+
except FileNotFoundError:
|
| 112 |
+
return {
|
| 113 |
+
"command_executed": command_executed,
|
| 114 |
+
"stdout": "",
|
| 115 |
+
"stderr": "Error: 'abundancebin' command not found. Make sure it is installed and in your PATH.",
|
| 116 |
+
"output_files": []
|
| 117 |
+
}
|
| 118 |
+
except subprocess.CalledProcessError as e:
|
| 119 |
+
return {
|
| 120 |
+
"command_executed": command_executed,
|
| 121 |
+
"stdout": e.stdout,
|
| 122 |
+
"stderr": e.stderr,
|
| 123 |
+
"output_files": []
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
# --- Structured Result Return ---
|
| 127 |
+
output_files = [str(output_path)] if output_path.exists() else []
|
| 128 |
+
|
| 129 |
+
return {
|
| 130 |
+
"command_executed": command_executed,
|
| 131 |
+
"stdout": stdout,
|
| 132 |
+
"stderr": stderr,
|
| 133 |
+
"output_files": output_files
|
| 134 |
+
}
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/abundancebin_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/abundancebin_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_abundancebin'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/app/requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-abundancebin:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-abundancebin:latest
|
| 7 |
+
container_name: mcp-abundancebin
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=abundancebin
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- abundancebin
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_abundancebin/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/app/anarci_server.py
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
import subprocess
|
| 3 |
+
from typing import Optional, List, Union
|
| 4 |
+
|
| 5 |
+
@mcp.tool()
|
| 6 |
+
def run_anarci(
|
| 7 |
+
sequence: Optional[str] = None,
|
| 8 |
+
input_file: Optional[str] = None,
|
| 9 |
+
output_file: Optional[str] = None,
|
| 10 |
+
scheme: str = "imgt",
|
| 11 |
+
restrict: Optional[str] = None,
|
| 12 |
+
species: Optional[str] = None,
|
| 13 |
+
csv: bool = False,
|
| 14 |
+
ncpu: int = 1,
|
| 15 |
+
bit_score_threshold: float = 80.0,
|
| 16 |
+
assign_germline: bool = False,
|
| 17 |
+
name: Optional[str] = None,
|
| 18 |
+
verbose: bool = False
|
| 19 |
+
):
|
| 20 |
+
"""
|
| 21 |
+
ANARCI: Antibody Numbering and Antigen Receptor ClassIfication.
|
| 22 |
+
Numbers amino-acid sequences of antibody and T-cell receptor variable domains.
|
| 23 |
+
|
| 24 |
+
Args:
|
| 25 |
+
sequence: A single amino acid sequence to number.
|
| 26 |
+
input_file: Path to a FASTA file containing sequences to number.
|
| 27 |
+
output_file: Path to the output file. If not provided, results are printed to stdout.
|
| 28 |
+
scheme: Numbering scheme to use. Options: 'imgt', 'kabat', 'chothia', 'martin', 'aho'. (Default: 'imgt')
|
| 29 |
+
restrict: Restrict numbering to specific domain types. Options: 'ig' (immunoglobulins), 'tr' (T-cell receptors).
|
| 30 |
+
species: Restrict germline search to specific species (e.g., 'human', 'mouse', 'rat', 'rabbit', 'rhesus', 'pig', 'alpaca').
|
| 31 |
+
csv: If True, output results in CSV format (horizontal). If False, uses plain text (vertical).
|
| 32 |
+
ncpu: Number of CPUs to use for parallel processing. (Default: 1)
|
| 33 |
+
bit_score_threshold: HMMER bit score threshold for domain identification. (Default: 80.0)
|
| 34 |
+
assign_germline: If True, assign germline species and gene information.
|
| 35 |
+
name: Name to assign to the single sequence (used with 'sequence' parameter).
|
| 36 |
+
verbose: If True, produce verbose output.
|
| 37 |
+
"""
|
| 38 |
+
|
| 39 |
+
# Input validation
|
| 40 |
+
if not sequence and not input_file:
|
| 41 |
+
raise ValueError("Either 'sequence' or 'input_file' must be provided.")
|
| 42 |
+
|
| 43 |
+
if sequence and input_file:
|
| 44 |
+
raise ValueError("Provide either 'sequence' or 'input_file', not both.")
|
| 45 |
+
|
| 46 |
+
valid_schemes = ["imgt", "kabat", "chothia", "martin", "aho"]
|
| 47 |
+
if scheme.lower() not in valid_schemes:
|
| 48 |
+
raise ValueError(f"Invalid scheme '{scheme}'. Must be one of {valid_schemes}")
|
| 49 |
+
|
| 50 |
+
if restrict and restrict.lower() not in ["ig", "tr"]:
|
| 51 |
+
raise ValueError("Restrict must be either 'ig' or 'tr'.")
|
| 52 |
+
|
| 53 |
+
# Build command
|
| 54 |
+
# The CLI tool is typically named 'ANARCI' (uppercase)
|
| 55 |
+
cmd = ["ANARCI"]
|
| 56 |
+
|
| 57 |
+
if sequence:
|
| 58 |
+
cmd.extend(["--sequence", sequence])
|
| 59 |
+
if name:
|
| 60 |
+
cmd.extend(["--name", name])
|
| 61 |
+
|
| 62 |
+
if input_file:
|
| 63 |
+
input_path = Path(input_file)
|
| 64 |
+
if not input_path.exists():
|
| 65 |
+
raise FileNotFoundError(f"Input file not found: {input_file}")
|
| 66 |
+
cmd.extend(["--input", str(input_path)])
|
| 67 |
+
|
| 68 |
+
if output_file:
|
| 69 |
+
cmd.extend(["--outfile", output_file])
|
| 70 |
+
|
| 71 |
+
cmd.extend(["--scheme", scheme.lower()])
|
| 72 |
+
|
| 73 |
+
if restrict:
|
| 74 |
+
cmd.extend(["--restrict", restrict.lower()])
|
| 75 |
+
|
| 76 |
+
if species:
|
| 77 |
+
cmd.extend(["--species", species.lower()])
|
| 78 |
+
|
| 79 |
+
if csv:
|
| 80 |
+
cmd.append("--csv")
|
| 81 |
+
|
| 82 |
+
if assign_germline:
|
| 83 |
+
cmd.append("--assign_germline")
|
| 84 |
+
|
| 85 |
+
if verbose:
|
| 86 |
+
cmd.append("--verbose")
|
| 87 |
+
|
| 88 |
+
cmd.extend(["--ncpu", str(ncpu)])
|
| 89 |
+
cmd.extend(["--bit_score_threshold", str(bit_score_threshold)])
|
| 90 |
+
|
| 91 |
+
try:
|
| 92 |
+
# Execute the tool
|
| 93 |
+
result = subprocess.run(
|
| 94 |
+
cmd,
|
| 95 |
+
capture_output=True,
|
| 96 |
+
text=True,
|
| 97 |
+
check=True
|
| 98 |
+
)
|
| 99 |
+
|
| 100 |
+
output_files = []
|
| 101 |
+
if output_file:
|
| 102 |
+
# ANARCI often appends suffixes depending on the format
|
| 103 |
+
# e.g., .csv or .txt
|
| 104 |
+
actual_output = Path(output_file)
|
| 105 |
+
if actual_output.exists():
|
| 106 |
+
output_files.append(str(actual_output))
|
| 107 |
+
else:
|
| 108 |
+
# Check for common suffixes if the exact file isn't found
|
| 109 |
+
for suffix in [".csv", ".txt"]:
|
| 110 |
+
p = Path(f"{output_file}{suffix}")
|
| 111 |
+
if p.exists():
|
| 112 |
+
output_files.append(str(p))
|
| 113 |
+
|
| 114 |
+
return {
|
| 115 |
+
"command_executed": " ".join(cmd),
|
| 116 |
+
"stdout": result.stdout,
|
| 117 |
+
"stderr": result.stderr,
|
| 118 |
+
"output_files": output_files
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
except subprocess.CalledProcessError as e:
|
| 122 |
+
return {
|
| 123 |
+
"command_executed": " ".join(cmd),
|
| 124 |
+
"stdout": e.stdout,
|
| 125 |
+
"stderr": e.stderr,
|
| 126 |
+
"error": f"ANARCI failed with return code {e.returncode}"
|
| 127 |
+
}
|
| 128 |
+
except Exception as e:
|
| 129 |
+
return {
|
| 130 |
+
"command_executed": " ".join(cmd),
|
| 131 |
+
"error": str(e)
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
@mcp.tool()
|
| 135 |
+
def list_anarci_species():
|
| 136 |
+
"""
|
| 137 |
+
Returns a list of species supported by ANARCI for germline alignment.
|
| 138 |
+
Note: This is an informational tool based on ANARCI's standard database.
|
| 139 |
+
"""
|
| 140 |
+
# Standard species supported by ANARCI
|
| 141 |
+
species_list = [
|
| 142 |
+
"human", "mouse", "rat", "rabbit", "rhesus", "pig", "alpaca",
|
| 143 |
+
"dog", "chicken", "cow", "horse", "monkey", "macaque"
|
| 144 |
+
]
|
| 145 |
+
|
| 146 |
+
return {
|
| 147 |
+
"supported_species": species_list,
|
| 148 |
+
"note": "Availability may depend on the specific ANARCI version and installed HMM databases."
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
@mcp.tool()
|
| 152 |
+
def get_anarci_version():
|
| 153 |
+
"""
|
| 154 |
+
Retrieves the version information for the installed ANARCI tool.
|
| 155 |
+
"""
|
| 156 |
+
try:
|
| 157 |
+
# ANARCI doesn't always have a simple --version flag in older versions,
|
| 158 |
+
# but we can try to run it to see the help header or use pip/conda info.
|
| 159 |
+
# Most modern versions support --version.
|
| 160 |
+
result = subprocess.run(
|
| 161 |
+
["ANARCI", "--version"],
|
| 162 |
+
capture_output=True,
|
| 163 |
+
text=True,
|
| 164 |
+
check=False
|
| 165 |
+
)
|
| 166 |
+
|
| 167 |
+
# If --version fails, try to get it from the help output
|
| 168 |
+
if result.returncode != 0:
|
| 169 |
+
result = subprocess.run(
|
| 170 |
+
["ANARCI", "--help"],
|
| 171 |
+
capture_output=True,
|
| 172 |
+
text=True,
|
| 173 |
+
check=False
|
| 174 |
+
)
|
| 175 |
+
|
| 176 |
+
return {
|
| 177 |
+
"stdout": result.stdout,
|
| 178 |
+
"stderr": result.stderr
|
| 179 |
+
}
|
| 180 |
+
except Exception as e:
|
| 181 |
+
return {
|
| 182 |
+
"error": f"Could not determine ANARCI version: {str(e)}"
|
| 183 |
+
}
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/app/anarci_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/app/anarci_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_anarci'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-anarci:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-anarci:latest
|
| 7 |
+
container_name: mcp-anarci
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=anarci
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_anarci/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- anarci
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/Dockerfile
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
# Install system dependencies
|
| 5 |
+
RUN apt-get update && apt-get install -y default-jre wget curl && apt-get clean && rm -rf /var/lib/apt/lists/*
|
| 6 |
+
|
| 7 |
+
# Install Miniconda
|
| 8 |
+
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/conda && rm /tmp/miniconda.sh
|
| 9 |
+
|
| 10 |
+
# Add conda to PATH
|
| 11 |
+
ENV PATH="/opt/conda/bin:$PATH"
|
| 12 |
+
|
| 13 |
+
# Install ariba via conda (e.g., from bioconda)
|
| 14 |
+
RUN conda install -c bioconda ariba -y && conda clean -a
|
| 15 |
+
|
| 16 |
+
# Install Python dependencies
|
| 17 |
+
RUN pip install uv
|
| 18 |
+
RUN uv pip install --system fastmcp
|
| 19 |
+
|
| 20 |
+
# Create app directory
|
| 21 |
+
WORKDIR /app
|
| 22 |
+
|
| 23 |
+
# Copy your MCP server
|
| 24 |
+
COPY app/ariba_server.py /app/
|
| 25 |
+
|
| 26 |
+
# Create workspace and output directories
|
| 27 |
+
RUN mkdir -p /app/workspace /app/output
|
| 28 |
+
|
| 29 |
+
# Make sure the server script is executable
|
| 30 |
+
RUN chmod +x /app/ariba_server.py
|
| 31 |
+
|
| 32 |
+
# Expose port for MCP over HTTP (optional)
|
| 33 |
+
EXPOSE 8000
|
| 34 |
+
|
| 35 |
+
# Health check
|
| 36 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)"
|
| 37 |
+
|
| 38 |
+
# Default command runs the MCP server via stdio
|
| 39 |
+
CMD ["python", "/app/ariba_server.py"]
|
| 40 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/app/requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-ariba:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-ariba:latest
|
| 7 |
+
container_name: mcp-ariba
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=ariba
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- ariba
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_ariba/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/Dockerfile
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
# Install system dependencies
|
| 5 |
+
RUN apt-get update && apt-get install -y default-jre wget curl && apt-get clean && rm -rf /var/lib/apt/lists/*
|
| 6 |
+
|
| 7 |
+
# Install Miniconda
|
| 8 |
+
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/conda && rm /tmp/miniconda.sh
|
| 9 |
+
|
| 10 |
+
# Add conda to PATH
|
| 11 |
+
ENV PATH="/opt/conda/bin:$PATH"
|
| 12 |
+
|
| 13 |
+
# Install bioconductor-alabaster.spatial via conda (e.g., from bioconda)
|
| 14 |
+
RUN conda install -c bioconda bioconductor-alabaster.spatial -y && conda clean -a
|
| 15 |
+
|
| 16 |
+
# Install Python dependencies
|
| 17 |
+
RUN pip install uv
|
| 18 |
+
RUN uv pip install --system fastmcp
|
| 19 |
+
|
| 20 |
+
# Create app directory
|
| 21 |
+
WORKDIR /app
|
| 22 |
+
|
| 23 |
+
# Copy your MCP server
|
| 24 |
+
COPY app/bioconductor-alabaster.spatial_server.py /app/
|
| 25 |
+
|
| 26 |
+
# Create workspace and output directories
|
| 27 |
+
RUN mkdir -p /app/workspace /app/output
|
| 28 |
+
|
| 29 |
+
# Make sure the server script is executable
|
| 30 |
+
RUN chmod +x /app/bioconductor-alabaster.spatial_server.py
|
| 31 |
+
|
| 32 |
+
# Expose port for MCP over HTTP (optional)
|
| 33 |
+
EXPOSE 8000
|
| 34 |
+
|
| 35 |
+
# Health check
|
| 36 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)"
|
| 37 |
+
|
| 38 |
+
# Default command runs the MCP server via stdio
|
| 39 |
+
CMD ["python", "/app/bioconductor-alabaster.spatial_server.py"]
|
| 40 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/app/bioconductor-alabaster.spatial_server.py
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
import tempfile
|
| 3 |
+
import os
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
from typing import Optional, List, Dict, Any
|
| 6 |
+
|
| 7 |
+
# No need to import mcp as per instructions.
|
| 8 |
+
|
| 9 |
+
def _run_r_script(script_content: str, cwd: Path) -> Dict[str, Any]:
|
| 10 |
+
"""
|
| 11 |
+
Executes an R script and captures its output.
|
| 12 |
+
|
| 13 |
+
Args:
|
| 14 |
+
script_content: The R script as a string.
|
| 15 |
+
cwd: The current working directory for the R script execution.
|
| 16 |
+
|
| 17 |
+
Returns:
|
| 18 |
+
A dictionary containing execution details, including command, stdout, stderr,
|
| 19 |
+
and an error message if the script fails.
|
| 20 |
+
"""
|
| 21 |
+
with tempfile.NamedTemporaryFile(mode="w", suffix=".R", delete=False) as r_script_file:
|
| 22 |
+
r_script_file.write(script_content)
|
| 23 |
+
r_script_path = Path(r_script_file.name)
|
| 24 |
+
|
| 25 |
+
command = ["Rscript", str(r_script_path)]
|
| 26 |
+
|
| 27 |
+
stdout = ""
|
| 28 |
+
stderr = ""
|
| 29 |
+
try:
|
| 30 |
+
process = subprocess.run(
|
| 31 |
+
command,
|
| 32 |
+
capture_output=True,
|
| 33 |
+
text=True,
|
| 34 |
+
check=True,
|
| 35 |
+
cwd=cwd # Run R script in the specified working directory
|
| 36 |
+
)
|
| 37 |
+
stdout = process.stdout
|
| 38 |
+
stderr = process.stderr
|
| 39 |
+
except subprocess.CalledProcessError as e:
|
| 40 |
+
return {
|
| 41 |
+
"command_executed": " ".join(command),
|
| 42 |
+
"stdout": e.stdout,
|
| 43 |
+
"stderr": e.stderr,
|
| 44 |
+
"error": f"R script execution failed with exit code {e.returncode}",
|
| 45 |
+
"output_files": [],
|
| 46 |
+
}
|
| 47 |
+
finally:
|
| 48 |
+
os.remove(r_script_path)
|
| 49 |
+
|
| 50 |
+
return {
|
| 51 |
+
"command_executed": " ".join(command),
|
| 52 |
+
"stdout": stdout,
|
| 53 |
+
"stderr": stderr,
|
| 54 |
+
"output_files": [], # This will be populated by the calling function
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
@mcp.tool()
|
| 58 |
+
def save_spatial_experiment(
|
| 59 |
+
input_spatial_experiment_rds: Path,
|
| 60 |
+
output_directory: Path,
|
| 61 |
+
precomputed: bool = True,
|
| 62 |
+
deferred: bool = False,
|
| 63 |
+
compression_level: Optional[int] = None,
|
| 64 |
+
compression_filter: Optional[str] = None,
|
| 65 |
+
) -> Dict[str, Any]:
|
| 66 |
+
"""
|
| 67 |
+
Saves a SpatialExperiment object and its images into file artifacts.
|
| 68 |
+
|
| 69 |
+
This function serializes an R SpatialExperiment object (provided as an RDS file)
|
| 70 |
+
into a directory structure of file artifacts, offering a portable alternative
|
| 71 |
+
to direct RDS serialization. The `alabaster.spatial` package handles the
|
| 72 |
+
conversion and storage of the object and its associated images.
|
| 73 |
+
|
| 74 |
+
Args:
|
| 75 |
+
input_spatial_experiment_rds: Path to an RDS file containing the SpatialExperiment object.
|
| 76 |
+
This file must exist.
|
| 77 |
+
output_directory: Path to the directory where the file artifacts will be saved.
|
| 78 |
+
This directory will be created if it does not exist.
|
| 79 |
+
precomputed: Logical, whether to save precomputed results. Defaults to TRUE.
|
| 80 |
+
deferred: Logical, whether to defer saving of certain components. Defaults to FALSE.
|
| 81 |
+
compression_level: Integer, compression level for HDF5 files (0-9).
|
| 82 |
+
If None, R's default (typically 6) will be used.
|
| 83 |
+
compression_filter: String, compression filter for HDF5 files (e.g., "gzip", "lzf").
|
| 84 |
+
If None, no specific filter is applied.
|
| 85 |
+
|
| 86 |
+
Returns:
|
| 87 |
+
A dictionary containing execution details, including the command executed,
|
| 88 |
+
stdout, stderr, and a list of generated output files/directories.
|
| 89 |
+
Returns an error if input file is not found, output path is invalid,
|
| 90 |
+
compression_level is out of range, or R script execution fails.
|
| 91 |
+
"""
|
| 92 |
+
# Input validation
|
| 93 |
+
if not input_spatial_experiment_rds.is_file():
|
| 94 |
+
return {
|
| 95 |
+
"command_executed": "",
|
| 96 |
+
"stdout": "",
|
| 97 |
+
"stderr": f"Error: Input RDS file not found at '{input_spatial_experiment_rds}'",
|
| 98 |
+
"output_files": [],
|
| 99 |
+
}
|
| 100 |
+
|
| 101 |
+
if output_directory.exists() and not output_directory.is_dir():
|
| 102 |
+
return {
|
| 103 |
+
"command_executed": "",
|
| 104 |
+
"stdout": "",
|
| 105 |
+
"stderr": f"Error: Output path '{output_directory}' exists but is not a directory.",
|
| 106 |
+
"output_files": [],
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
try:
|
| 110 |
+
output_directory.mkdir(parents=True, exist_ok=True)
|
| 111 |
+
except OSError as e:
|
| 112 |
+
return {
|
| 113 |
+
"command_executed": "",
|
| 114 |
+
"stdout": "",
|
| 115 |
+
"stderr": f"Error: Could not create output directory '{output_directory}': {e}",
|
| 116 |
+
"output_files": [],
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
if compression_level is not None and not (0 <= compression_level <= 9):
|
| 120 |
+
return {
|
| 121 |
+
"command_executed": "",
|
| 122 |
+
"stdout": "",
|
| 123 |
+
"stderr": f"Error: 'compression_level' must be an integer between 0 and 9, got {compression_level}",
|
| 124 |
+
"output_files": [],
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
# Construct R script
|
| 128 |
+
r_script_template = """
|
| 129 |
+
suppressPackageStartupMessages({{
|
| 130 |
+
library(alabaster.spatial)
|
| 131 |
+
library(SpatialExperiment)
|
| 132 |
+
library(S4Vectors)
|
| 133 |
+
library(alabaster.base)
|
| 134 |
+
library(rhdf5) # Explicitly load for HDF5 operations
|
| 135 |
+
}})
|
| 136 |
+
|
| 137 |
+
input_rds_path <- "{input_rds_path}"
|
| 138 |
+
output_dir_path <- "{output_dir_path}"
|
| 139 |
+
|
| 140 |
+
# Load the SpatialExperiment object
|
| 141 |
+
if (!file.exists(input_rds_path)) {{
|
| 142 |
+
stop(paste0("Input RDS file not found: ", input_rds_path))
|
| 143 |
+
}}
|
| 144 |
+
se_object <- readRDS(input_rds_path)
|
| 145 |
+
|
| 146 |
+
# Ensure it's a SpatialExperiment object
|
| 147 |
+
if (!is(se_object, "SpatialExperiment")) {{
|
| 148 |
+
stop("Loaded object is not a SpatialExperiment object.")
|
| 149 |
+
}}
|
| 150 |
+
|
| 151 |
+
# Prepare additional arguments for saveObject
|
| 152 |
+
save_args <- list(
|
| 153 |
+
x = se_object,
|
| 154 |
+
path = output_dir_path,
|
| 155 |
+
precomputed = {precomputed_r},
|
| 156 |
+
deferred = {deferred_r}
|
| 157 |
+
)
|
| 158 |
+
{compression_level_r}
|
| 159 |
+
{compression_filter_r}
|
| 160 |
+
|
| 161 |
+
# Call saveObject
|
| 162 |
+
do.call(alabaster.spatial::saveObject, save_args)
|
| 163 |
+
|
| 164 |
+
message(paste0("SpatialExperiment object saved to: ", output_dir_path))
|
| 165 |
+
"""
|
| 166 |
+
|
| 167 |
+
compression_level_r = f"save_args$compression_level <- {compression_level}" if compression_level is not None else ""
|
| 168 |
+
compression_filter_r = f"save_args$compression_filter <- '{compression_filter}'" if compression_filter is not None else ""
|
| 169 |
+
|
| 170 |
+
r_script_content = r_script_template.format(
|
| 171 |
+
input_rds_path=input_spatial_experiment_rds.resolve(),
|
| 172 |
+
output_dir_path=output_directory.resolve(),
|
| 173 |
+
precomputed_r=str(precomputed).upper(),
|
| 174 |
+
deferred_r=str(deferred).upper(),
|
| 175 |
+
compression_level_r=compression_level_r,
|
| 176 |
+
compression_filter_r=compression_filter_r,
|
| 177 |
+
)
|
| 178 |
+
|
| 179 |
+
# Execute R script
|
| 180 |
+
result = _run_r_script(r_script_content, output_directory.parent) # Run in parent dir to allow output_directory creation
|
| 181 |
+
if "error" in result:
|
| 182 |
+
return result
|
| 183 |
+
|
| 184 |
+
result["output_files"] = [str(output_directory.resolve())]
|
| 185 |
+
return result
|
| 186 |
+
|
| 187 |
+
|
| 188 |
+
@mcp.tool()
|
| 189 |
+
def read_spatial_experiment(
|
| 190 |
+
input_directory: Path,
|
| 191 |
+
output_spatial_experiment_rds: Path,
|
| 192 |
+
metadata_only: bool = False,
|
| 193 |
+
image_format: Optional[str] = None,
|
| 194 |
+
) -> Dict[str, Any]:
|
| 195 |
+
"""
|
| 196 |
+
Loads a SpatialExperiment object and its images from file artifacts.
|
| 197 |
+
|
| 198 |
+
This function reconstructs an R SpatialExperiment object from a directory
|
| 199 |
+
of file artifacts previously saved by `save_spatial_experiment`.
|
| 200 |
+
|
| 201 |
+
Args:
|
| 202 |
+
input_directory: Path to the directory containing the file artifacts.
|
| 203 |
+
This directory must exist and be valid.
|
| 204 |
+
output_spatial_experiment_rds: Path to the output RDS file where the
|
| 205 |
+
reconstructed SpatialExperiment object will be saved.
|
| 206 |
+
The parent directory will be created if it does not exist.
|
| 207 |
+
metadata_only: Logical, whether to only load metadata and not the full data.
|
| 208 |
+
Defaults to FALSE.
|
| 209 |
+
image_format: String, desired image format for loading (e.g., "png", "jpeg", "tiff").
|
| 210 |
+
If None, images are loaded in their original format.
|
| 211 |
+
|
| 212 |
+
Returns:
|
| 213 |
+
A dictionary containing execution details, including the command executed,
|
| 214 |
+
stdout, stderr, and a list of generated output files.
|
| 215 |
+
Returns an error if input directory is not found, output path is invalid,
|
| 216 |
+
or R script execution fails.
|
| 217 |
+
"""
|
| 218 |
+
# Input validation
|
| 219 |
+
if not input_directory.is_dir():
|
| 220 |
+
return {
|
| 221 |
+
"command_executed": "",
|
| 222 |
+
"stdout": "",
|
| 223 |
+
"stderr": f"Error: Input directory not found at '{input_directory}'",
|
| 224 |
+
"output_files": [],
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
if output_spatial_experiment_rds.exists() and not output_spatial_experiment_rds.is_file():
|
| 228 |
+
return {
|
| 229 |
+
"command_executed": "",
|
| 230 |
+
"stdout": "",
|
| 231 |
+
"stderr": f"Error: Output path '{output_spatial_experiment_rds}' exists but is not a file.",
|
| 232 |
+
"output_files": [],
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
try:
|
| 236 |
+
output_spatial_experiment_rds.parent.mkdir(parents=True, exist_ok=True)
|
| 237 |
+
except OSError as e:
|
| 238 |
+
return {
|
| 239 |
+
"command_executed": "",
|
| 240 |
+
"stdout": "",
|
| 241 |
+
"stderr": f"Error: Could not create parent directory for output RDS file '{output_spatial_experiment_rds}': {e}",
|
| 242 |
+
"output_files": [],
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
# Construct R script
|
| 246 |
+
r_script_template = """
|
| 247 |
+
suppressPackageStartupMessages({{
|
| 248 |
+
library(alabaster.spatial)
|
| 249 |
+
library(SpatialExperiment)
|
| 250 |
+
library(S4Vectors)
|
| 251 |
+
library(alabaster.base)
|
| 252 |
+
library(rhdf5) # Explicitly load for HDF5 operations
|
| 253 |
+
}})
|
| 254 |
+
|
| 255 |
+
input_dir_path <- "{input_dir_path}"
|
| 256 |
+
output_rds_path <- "{output_rds_path}"
|
| 257 |
+
|
| 258 |
+
# Prepare additional arguments for readObject
|
| 259 |
+
read_args <- list(
|
| 260 |
+
path = input_dir_path,
|
| 261 |
+
metadata.only = {metadata_only_r}
|
| 262 |
+
)
|
| 263 |
+
{image_format_r}
|
| 264 |
+
|
| 265 |
+
# Call readObject
|
| 266 |
+
se_object <- do.call(alabaster.spatial::readObject, read_args)
|
| 267 |
+
|
| 268 |
+
# Save the SpatialExperiment object to RDS
|
| 269 |
+
saveRDS(se_object, file = output_rds_path)
|
| 270 |
+
|
| 271 |
+
message(paste0("SpatialExperiment object loaded from: ", input_dir_path, " and saved to: ", output_rds_path))
|
| 272 |
+
"""
|
| 273 |
+
|
| 274 |
+
image_format_r = f"read_args$image.format <- '{image_format}'" if image_format is not None else ""
|
| 275 |
+
|
| 276 |
+
r_script_content = r_script_template.format(
|
| 277 |
+
input_dir_path=input_directory.resolve(),
|
| 278 |
+
output_rds_path=output_spatial_experiment_rds.resolve(),
|
| 279 |
+
metadata_only_r=str(metadata_only).upper(),
|
| 280 |
+
image_format_r=image_format_r,
|
| 281 |
+
)
|
| 282 |
+
|
| 283 |
+
# Execute R script
|
| 284 |
+
result = _run_r_script(r_script_content, output_spatial_experiment_rds.parent)
|
| 285 |
+
if "error" in result:
|
| 286 |
+
return result
|
| 287 |
+
|
| 288 |
+
result["output_files"] = [str(output_spatial_experiment_rds.resolve())]
|
| 289 |
+
return result
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/app/bioconductor-alabaster.spatial_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/app/bioconductor-alabaster.spatial_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_bioconductor_alabaster_spatial'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-bioconductor-alabaster.spatial:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-bioconductor-alabaster.spatial:latest
|
| 7 |
+
container_name: mcp-bioconductor-alabaster.spatial
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=bioconductor-alabaster.spatial
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- bioconductor-alabaster.spatial
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-alabaster.spatial/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-annotationhub/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/Dockerfile
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
# Install system dependencies
|
| 5 |
+
RUN apt-get update && apt-get install -y default-jre wget curl && apt-get clean && rm -rf /var/lib/apt/lists/*
|
| 6 |
+
|
| 7 |
+
# Install Miniconda
|
| 8 |
+
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/conda && rm /tmp/miniconda.sh
|
| 9 |
+
|
| 10 |
+
# Add conda to PATH
|
| 11 |
+
ENV PATH="/opt/conda/bin:$PATH"
|
| 12 |
+
|
| 13 |
+
# Install bioconductor-awaggregator via conda (e.g., from bioconda)
|
| 14 |
+
RUN conda install -c bioconda bioconductor-awaggregator -y && conda clean -a
|
| 15 |
+
|
| 16 |
+
# Install Python dependencies
|
| 17 |
+
RUN pip install uv
|
| 18 |
+
RUN uv pip install --system fastmcp
|
| 19 |
+
|
| 20 |
+
# Create app directory
|
| 21 |
+
WORKDIR /app
|
| 22 |
+
|
| 23 |
+
# Copy your MCP server
|
| 24 |
+
COPY app/bioconductor-awaggregator_server.py /app/
|
| 25 |
+
|
| 26 |
+
# Create workspace and output directories
|
| 27 |
+
RUN mkdir -p /app/workspace /app/output
|
| 28 |
+
|
| 29 |
+
# Make sure the server script is executable
|
| 30 |
+
RUN chmod +x /app/bioconductor-awaggregator_server.py
|
| 31 |
+
|
| 32 |
+
# Expose port for MCP over HTTP (optional)
|
| 33 |
+
EXPOSE 8000
|
| 34 |
+
|
| 35 |
+
# Health check
|
| 36 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)"
|
| 37 |
+
|
| 38 |
+
# Default command runs the MCP server via stdio
|
| 39 |
+
CMD ["python", "/app/bioconductor-awaggregator_server.py"]
|
| 40 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/bioconductor-awaggregator_server.py
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from typing import Dict, List
|
| 4 |
+
|
| 5 |
+
# MCP decorator is assumed to be available in the execution environment.
|
| 6 |
+
# No import is needed as per the instructions.
|
| 7 |
+
# class mcp:
|
| 8 |
+
# @staticmethod
|
| 9 |
+
# def tool():
|
| 10 |
+
# def decorator(func):
|
| 11 |
+
# return func
|
| 12 |
+
# return decorator
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
def _run_awaggregator_cli(cmd: List[str], output_map: Dict[str, Path]) -> Dict:
|
| 16 |
+
"""
|
| 17 |
+
A private helper function to execute the awaggregator wrapper script,
|
| 18 |
+
handle subprocess execution, and format the output.
|
| 19 |
+
"""
|
| 20 |
+
command_executed = " ".join(map(str, cmd))
|
| 21 |
+
try:
|
| 22 |
+
result = subprocess.run(
|
| 23 |
+
cmd,
|
| 24 |
+
capture_output=True,
|
| 25 |
+
text=True,
|
| 26 |
+
check=True,
|
| 27 |
+
)
|
| 28 |
+
return {
|
| 29 |
+
"command_executed": command_executed,
|
| 30 |
+
"stdout": result.stdout,
|
| 31 |
+
"stderr": result.stderr,
|
| 32 |
+
"output_files": {key: str(path) for key, path in output_map.items()},
|
| 33 |
+
}
|
| 34 |
+
except FileNotFoundError:
|
| 35 |
+
# This error is raised if 'Rscript' or the wrapper is not in PATH
|
| 36 |
+
return {
|
| 37 |
+
"command_executed": command_executed,
|
| 38 |
+
"stdout": "",
|
| 39 |
+
"stderr": "Error: 'Rscript' or the wrapper script 'run_awaggregator.R' not found. "
|
| 40 |
+
"Please ensure R and the tool's wrapper script are in the system's PATH.",
|
| 41 |
+
"output_files": {},
|
| 42 |
+
"error": "Executable not found."
|
| 43 |
+
}
|
| 44 |
+
except subprocess.CalledProcessError as e:
|
| 45 |
+
# This error is raised for non-zero exit codes from the tool
|
| 46 |
+
return {
|
| 47 |
+
"command_executed": command_executed,
|
| 48 |
+
"stdout": e.stdout,
|
| 49 |
+
"stderr": e.stderr,
|
| 50 |
+
"output_files": {},
|
| 51 |
+
"error": f"Tool execution failed with exit code {e.returncode}",
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
@mcp.tool()
|
| 56 |
+
def aw_weight(
|
| 57 |
+
expression_matrix: Path,
|
| 58 |
+
design_matrix: Path,
|
| 59 |
+
output_weights_file: Path,
|
| 60 |
+
):
|
| 61 |
+
"""
|
| 62 |
+
Computes adaptive weights for gene expression data meta-analysis.
|
| 63 |
+
|
| 64 |
+
This tool wraps the `aw.weight` function from the Bioconductor `awaggregator` package.
|
| 65 |
+
It takes an expression data matrix and a design matrix to compute weights for each study.
|
| 66 |
+
The resulting weights matrix can be used with the `aw_mean` or `aw_median` tools.
|
| 67 |
+
|
| 68 |
+
Args:
|
| 69 |
+
expression_matrix: Path to the input expression data matrix file (e.g., CSV, TSV).
|
| 70 |
+
Rows should represent genes and columns should represent samples.
|
| 71 |
+
design_matrix: Path to the input design matrix file (e.g., CSV, TSV).
|
| 72 |
+
This matrix describes the experimental design.
|
| 73 |
+
output_weights_file: Path to save the computed weights matrix.
|
| 74 |
+
|
| 75 |
+
Returns:
|
| 76 |
+
A dictionary containing the execution command, stdout, stderr, and a
|
| 77 |
+
path to the output weights file.
|
| 78 |
+
"""
|
| 79 |
+
# --- Input Validation ---
|
| 80 |
+
if not expression_matrix.is_file():
|
| 81 |
+
raise FileNotFoundError(f"Input expression matrix file not found: {expression_matrix}")
|
| 82 |
+
if not design_matrix.is_file():
|
| 83 |
+
raise FileNotFoundError(f"Input design matrix file not found: {design_matrix}")
|
| 84 |
+
|
| 85 |
+
output_dir = output_weights_file.parent
|
| 86 |
+
if not output_dir.is_dir():
|
| 87 |
+
raise NotADirectoryError(f"Output directory does not exist: {output_dir}")
|
| 88 |
+
|
| 89 |
+
# --- Command Construction ---
|
| 90 |
+
# Assumes a wrapper script 'run_awaggregator.R' is available that handles CLI parsing.
|
| 91 |
+
cmd = [
|
| 92 |
+
"Rscript",
|
| 93 |
+
"run_awaggregator.R",
|
| 94 |
+
"--method",
|
| 95 |
+
"weight",
|
| 96 |
+
"--expression",
|
| 97 |
+
expression_matrix,
|
| 98 |
+
"--design",
|
| 99 |
+
design_matrix,
|
| 100 |
+
"--output",
|
| 101 |
+
output_weights_file,
|
| 102 |
+
]
|
| 103 |
+
|
| 104 |
+
return _run_awaggregator_cli(cmd, {"weights_matrix": output_weights_file})
|
| 105 |
+
|
| 106 |
+
|
| 107 |
+
@mcp.tool()
|
| 108 |
+
def aw_mean(
|
| 109 |
+
data_matrix: Path,
|
| 110 |
+
weights_matrix: Path,
|
| 111 |
+
output_file: Path,
|
| 112 |
+
na_rm: bool = False,
|
| 113 |
+
):
|
| 114 |
+
"""
|
| 115 |
+
Performs adaptive-weighted mean aggregation on gene expression data.
|
| 116 |
+
|
| 117 |
+
This tool wraps the `aw.mean` function from the Bioconductor `awaggregator` package.
|
| 118 |
+
It takes a data matrix and a corresponding weights matrix to compute the weighted mean
|
| 119 |
+
for each gene (row) across studies (columns).
|
| 120 |
+
|
| 121 |
+
Args:
|
| 122 |
+
data_matrix: Path to the input data matrix file (e.g., CSV, TSV).
|
| 123 |
+
Rows should represent genes and columns should represent studies.
|
| 124 |
+
weights_matrix: Path to the input weights matrix file (e.g., CSV, TSV).
|
| 125 |
+
Must have the same dimensions as the data matrix.
|
| 126 |
+
output_file: Path to save the aggregated results.
|
| 127 |
+
na_rm: If True, NA values will be removed before computation. Defaults to False.
|
| 128 |
+
|
| 129 |
+
Returns:
|
| 130 |
+
A dictionary containing the execution command, stdout, stderr, and a
|
| 131 |
+
path to the output file.
|
| 132 |
+
"""
|
| 133 |
+
# --- Input Validation ---
|
| 134 |
+
if not data_matrix.is_file():
|
| 135 |
+
raise FileNotFoundError(f"Input data matrix file not found: {data_matrix}")
|
| 136 |
+
if not weights_matrix.is_file():
|
| 137 |
+
raise FileNotFoundError(f"Input weights matrix file not found: {weights_matrix}")
|
| 138 |
+
|
| 139 |
+
output_dir = output_file.parent
|
| 140 |
+
if not output_dir.is_dir():
|
| 141 |
+
raise NotADirectoryError(f"Output directory does not exist: {output_dir}")
|
| 142 |
+
|
| 143 |
+
# --- Command Construction ---
|
| 144 |
+
cmd = [
|
| 145 |
+
"Rscript",
|
| 146 |
+
"run_awaggregator.R",
|
| 147 |
+
"--method",
|
| 148 |
+
"mean",
|
| 149 |
+
"--data",
|
| 150 |
+
data_matrix,
|
| 151 |
+
"--weights",
|
| 152 |
+
weights_matrix,
|
| 153 |
+
"--output",
|
| 154 |
+
output_file,
|
| 155 |
+
]
|
| 156 |
+
if na_rm:
|
| 157 |
+
cmd.append("--na-rm")
|
| 158 |
+
|
| 159 |
+
return _run_awaggregator_cli(cmd, {"aggregated_data": output_file})
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
@mcp.tool()
|
| 163 |
+
def aw_median(
|
| 164 |
+
data_matrix: Path,
|
| 165 |
+
weights_matrix: Path,
|
| 166 |
+
output_file: Path,
|
| 167 |
+
na_rm: bool = False,
|
| 168 |
+
):
|
| 169 |
+
"""
|
| 170 |
+
Performs adaptive-weighted median aggregation on gene expression data.
|
| 171 |
+
|
| 172 |
+
This tool wraps the `aw.median` function from the Bioconductor `awaggregator` package.
|
| 173 |
+
It takes a data matrix and a corresponding weights matrix to compute the weighted median
|
| 174 |
+
for each gene (row) across studies (columns).
|
| 175 |
+
|
| 176 |
+
Args:
|
| 177 |
+
data_matrix: Path to the input data matrix file (e.g., CSV, TSV).
|
| 178 |
+
Rows should represent genes and columns should represent studies.
|
| 179 |
+
weights_matrix: Path to the input weights matrix file (e.g., CSV, TSV).
|
| 180 |
+
Must have the same dimensions as the data matrix.
|
| 181 |
+
output_file: Path to save the aggregated results.
|
| 182 |
+
na_rm: If True, NA values will be removed before computation. Defaults to False.
|
| 183 |
+
|
| 184 |
+
Returns:
|
| 185 |
+
A dictionary containing the execution command, stdout, stderr, and a
|
| 186 |
+
path to the output file.
|
| 187 |
+
"""
|
| 188 |
+
# --- Input Validation ---
|
| 189 |
+
if not data_matrix.is_file():
|
| 190 |
+
raise FileNotFoundError(f"Input data matrix file not found: {data_matrix}")
|
| 191 |
+
if not weights_matrix.is_file():
|
| 192 |
+
raise FileNotFoundError(f"Input weights matrix file not found: {weights_matrix}")
|
| 193 |
+
|
| 194 |
+
output_dir = output_file.parent
|
| 195 |
+
if not output_dir.is_dir():
|
| 196 |
+
raise NotADirectoryError(f"Output directory does not exist: {output_dir}")
|
| 197 |
+
|
| 198 |
+
# --- Command Construction ---
|
| 199 |
+
cmd = [
|
| 200 |
+
"Rscript",
|
| 201 |
+
"run_awaggregator.R",
|
| 202 |
+
"--method",
|
| 203 |
+
"median",
|
| 204 |
+
"--data",
|
| 205 |
+
data_matrix,
|
| 206 |
+
"--weights",
|
| 207 |
+
weights_matrix,
|
| 208 |
+
"--output",
|
| 209 |
+
output_file,
|
| 210 |
+
]
|
| 211 |
+
if na_rm:
|
| 212 |
+
cmd.append("--na-rm")
|
| 213 |
+
|
| 214 |
+
return _run_awaggregator_cli(cmd, {"aggregated_data": output_file})
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/bioconductor-awaggregator_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/bioconductor-awaggregator_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_bioconductor_awaggregator'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/app/requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-bioconductor-awaggregator:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-bioconductor-awaggregator:latest
|
| 7 |
+
container_name: mcp-bioconductor-awaggregator
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=bioconductor-awaggregator
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- bioconductor-awaggregator
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-awaggregator/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-bsgenome/app/bioconductor-bsgenome_server.py
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
from pathlib import Path
|
| 3 |
+
from typing import Optional, List, Dict, Any
|
| 4 |
+
|
| 5 |
+
# No need to import mcp as per instructions.
|
| 6 |
+
|
| 7 |
+
def _run_r_command(r_code: str) -> Dict[str, Any]:
|
| 8 |
+
"""
|
| 9 |
+
Executes an R command using Rscript.
|
| 10 |
+
|
| 11 |
+
Args:
|
| 12 |
+
r_code: The R code string to execute.
|
| 13 |
+
|
| 14 |
+
Returns:
|
| 15 |
+
A dictionary containing command execution details, stdout, stderr, and any output files.
|
| 16 |
+
"""
|
| 17 |
+
command = ["Rscript", "-e", r_code]
|
| 18 |
+
try:
|
| 19 |
+
process = subprocess.run(
|
| 20 |
+
command,
|
| 21 |
+
capture_output=True,
|
| 22 |
+
text=True,
|
| 23 |
+
check=True
|
| 24 |
+
)
|
| 25 |
+
return {
|
| 26 |
+
"command_executed": " ".join(command),
|
| 27 |
+
"stdout": process.stdout,
|
| 28 |
+
"stderr": process.stderr,
|
| 29 |
+
"output_files": [],
|
| 30 |
+
}
|
| 31 |
+
except subprocess.CalledProcessError as e:
|
| 32 |
+
return {
|
| 33 |
+
"command_executed": " ".join(command),
|
| 34 |
+
"stdout": e.stdout,
|
| 35 |
+
"stderr": e.stderr,
|
| 36 |
+
"error": str(e),
|
| 37 |
+
"output_files": [],
|
| 38 |
+
}
|
| 39 |
+
except FileNotFoundError:
|
| 40 |
+
return {
|
| 41 |
+
"command_executed": " ".join(command),
|
| 42 |
+
"stdout": "",
|
| 43 |
+
"stderr": "Error: Rscript command not found. Please ensure R is installed and in your PATH.",
|
| 44 |
+
"error": "Rscript not found",
|
| 45 |
+
"output_files": [],
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
@mcp.tool()
|
| 49 |
+
def install_bsgenome_base_package(
|
| 50 |
+
bioc_manager_repo: str = "https://bioconductor.org/packages/release/bioc",
|
| 51 |
+
) -> Dict[str, Any]:
|
| 52 |
+
"""
|
| 53 |
+
Installs the core 'BSgenome' R package and 'BiocManager' if not already present.
|
| 54 |
+
|
| 55 |
+
This function is a prerequisite for using BSgenome data packages or functionalities.
|
| 56 |
+
It ensures that the necessary R infrastructure is in place.
|
| 57 |
+
|
| 58 |
+
Args:
|
| 59 |
+
bioc_manager_repo: The Bioconductor repository URL to use for installation.
|
| 60 |
+
Defaults to the standard release repository.
|
| 61 |
+
|
| 62 |
+
Returns:
|
| 63 |
+
A dictionary containing command execution details, stdout, stderr, and any output files.
|
| 64 |
+
"""
|
| 65 |
+
# Input validation
|
| 66 |
+
if not isinstance(bioc_manager_repo, str) or not bioc_manager_repo:
|
| 67 |
+
raise ValueError("Bioconductor repository URL must be a non-empty string.")
|
| 68 |
+
|
| 69 |
+
r_code = f"""
|
| 70 |
+
if (!require("BiocManager", quietly = TRUE)) {{
|
| 71 |
+
install.packages("BiocManager", repos="https://cloud.r-project.org")
|
| 72 |
+
}}
|
| 73 |
+
BiocManager::install("BSgenome", update=FALSE, ask=FALSE, siteRepos="{bioc_manager_repo}")
|
| 74 |
+
"""
|
| 75 |
+
return _run_r_command(r_code)
|
| 76 |
+
|
| 77 |
+
@mcp.tool()
|
| 78 |
+
def install_bsgenome_data_package(
|
| 79 |
+
data_package_name: str,
|
| 80 |
+
bioc_manager_repo: str = "https://bioconductor.org/packages/release/bioc",
|
| 81 |
+
) -> Dict[str, Any]:
|
| 82 |
+
"""
|
| 83 |
+
Installs a specific BSgenome data package (e.g., 'BSgenome.Hsapiens.UCSC.hg38').
|
| 84 |
+
|
| 85 |
+
These data packages contain the actual genome sequences. The core 'BSgenome'
|
| 86 |
+
package must be installed first using `install_bsgenome_base_package`.
|
| 87 |
+
|
| 88 |
+
Args:
|
| 89 |
+
data_package_name: The exact name of the BSgenome data package to install
|
| 90 |
+
(e.g., "BSgenome.Hsapiens.UCSC.hg38").
|
| 91 |
+
bioc_manager_repo: The Bioconductor repository URL to use for installation.
|
| 92 |
+
Defaults to the standard release repository.
|
| 93 |
+
|
| 94 |
+
Returns:
|
| 95 |
+
A dictionary containing command execution details, stdout, stderr, and any output files.
|
| 96 |
+
"""
|
| 97 |
+
# Input validation
|
| 98 |
+
if not isinstance(data_package_name, str) or not data_package_name:
|
| 99 |
+
raise ValueError("Data package name must be a non-empty string.")
|
| 100 |
+
if not data_package_name.startswith("BSgenome."):
|
| 101 |
+
raise ValueError(f"Invalid BSgenome data package name: '{data_package_name}'. "
|
| 102 |
+
"It should start with 'BSgenome.'.")
|
| 103 |
+
if not isinstance(bioc_manager_repo, str) or not bioc_manager_repo:
|
| 104 |
+
raise ValueError("Bioconductor repository URL must be a non-empty string.")
|
| 105 |
+
|
| 106 |
+
r_code = f"""
|
| 107 |
+
if (!require("BiocManager", quietly = TRUE)) {{
|
| 108 |
+
install.packages("BiocManager", repos="https://cloud.r-project.org")
|
| 109 |
+
}}
|
| 110 |
+
BiocManager::install("{data_package_name}", update=FALSE, ask=FALSE, siteRepos="{bioc_manager_repo}")
|
| 111 |
+
"""
|
| 112 |
+
return _run_r_command(r_code)
|
| 113 |
+
|
| 114 |
+
@mcp.tool()
|
| 115 |
+
def get_genome_sequence(
|
| 116 |
+
data_package_name: str,
|
| 117 |
+
seqname: str,
|
| 118 |
+
start: int,
|
| 119 |
+
end: int,
|
| 120 |
+
masked: bool = False,
|
| 121 |
+
output_file: Optional[Path] = None,
|
| 122 |
+
) -> Dict[str, Any]:
|
| 123 |
+
"""
|
| 124 |
+
Retrieves a specific genomic sequence from an installed BSgenome data package.
|
| 125 |
+
|
| 126 |
+
The specified BSgenome data package must be installed prior to calling this function
|
| 127 |
+
using `install_bsgenome_data_package`.
|
| 128 |
+
|
| 129 |
+
Args:
|
| 130 |
+
data_package_name: The name of the installed BSgenome data package
|
| 131 |
+
(e.g., "BSgenome.Hsapiens.UCSC.hg38").
|
| 132 |
+
seqname: The name of the sequence (e.g., "chr1", "X").
|
| 133 |
+
start: The 1-based start coordinate of the sequence to retrieve. Must be a positive integer.
|
| 134 |
+
end: The 1-based end coordinate of the sequence to retrieve. Must be an integer
|
| 135 |
+
greater than or equal to start.
|
| 136 |
+
masked: If True, masked regions (e.g., repeats) will be returned as 'N's.
|
| 137 |
+
If False, the actual sequence will be returned. Defaults to False.
|
| 138 |
+
output_file: Optional path to a file where the retrieved sequence will be written.
|
| 139 |
+
If not provided, the sequence will be returned in stdout.
|
| 140 |
+
|
| 141 |
+
Returns:
|
| 142 |
+
A dictionary containing command execution details, stdout, stderr, and any output files.
|
| 143 |
+
"""
|
| 144 |
+
# Input validation
|
| 145 |
+
if not isinstance(data_package_name, str) or not data_package_name:
|
| 146 |
+
raise ValueError("Data package name must be a non-empty string.")
|
| 147 |
+
if not data_package_name.startswith("BSgenome."):
|
| 148 |
+
raise ValueError(f"Invalid BSgenome data package name: '{data_package_name}'. "
|
| 149 |
+
"It should start with 'BSgenome.'.")
|
| 150 |
+
if not isinstance(seqname, str) or not seqname:
|
| 151 |
+
raise ValueError("Sequence name (seqname) must be a non-empty string.")
|
| 152 |
+
if not isinstance(start, int) or start <= 0:
|
| 153 |
+
raise ValueError("Start coordinate must be a positive integer.")
|
| 154 |
+
if not isinstance(end, int) or end < start:
|
| 155 |
+
raise ValueError("End coordinate must be an integer greater than or equal to the start coordinate.")
|
| 156 |
+
if not isinstance(masked, bool):
|
| 157 |
+
raise ValueError("Masked parameter must be a boolean.")
|
| 158 |
+
if output_file is not None and not isinstance(output_file, Path):
|
| 159 |
+
raise ValueError("Output file must be a Path object or None.")
|
| 160 |
+
|
| 161 |
+
# Prepare R code
|
| 162 |
+
r_masked_val = "TRUE" if masked else "FALSE"
|
| 163 |
+
|
| 164 |
+
if output_file:
|
| 165 |
+
output_file_path = Path(output_file)
|
| 166 |
+
# Ensure parent directory exists
|
| 167 |
+
output_file_path.parent.mkdir(parents=True, exist_ok=True)
|
| 168 |
+
|
| 169 |
+
# Modify R code to write to file
|
| 170 |
+
r_code = f"""
|
| 171 |
+
library({data_package_name})
|
| 172 |
+
genome_obj <- get(data_package_name)
|
| 173 |
+
seq <- getSeq(genome_obj, "{seqname}", start={start}, end={end}, masked={r_masked_val})
|
| 174 |
+
writeLines(as.character(seq), con="{output_file_path.resolve()}")
|
| 175 |
+
"""
|
| 176 |
+
result = _run_r_command(r_code)
|
| 177 |
+
if "error" not in result:
|
| 178 |
+
result["output_files"].append(str(output_file_path.resolve()))
|
| 179 |
+
return result
|
| 180 |
+
else:
|
| 181 |
+
r_code = f"""
|
| 182 |
+
library({data_package_name})
|
| 183 |
+
genome_obj <- get(data_package_name)
|
| 184 |
+
seq <- getSeq(genome_obj, "{seqname}", start={start}, end={end}, masked={r_masked_val})
|
| 185 |
+
cat(as.character(seq))
|
| 186 |
+
"""
|
| 187 |
+
return _run_r_command(r_code)
|
| 188 |
+
|
| 189 |
+
@mcp.tool()
|
| 190 |
+
def list_available_sequences(
|
| 191 |
+
data_package_name: str,
|
| 192 |
+
) -> Dict[str, Any]:
|
| 193 |
+
"""
|
| 194 |
+
Lists the available sequence names (e.g., chromosomes) within an installed BSgenome data package.
|
| 195 |
+
|
| 196 |
+
The specified BSgenome data package must be installed prior to calling this function
|
| 197 |
+
using `install_bsgenome_data_package`.
|
| 198 |
+
|
| 199 |
+
Args:
|
| 200 |
+
data_package_name: The name of the installed BSgenome data package
|
| 201 |
+
(e.g., "BSgenome.Hsapiens.UCSC.hg38").
|
| 202 |
+
|
| 203 |
+
Returns:
|
| 204 |
+
A dictionary containing command execution details, stdout, stderr, and any output files.
|
| 205 |
+
The stdout will contain a newline-separated list of sequence names.
|
| 206 |
+
"""
|
| 207 |
+
# Input validation
|
| 208 |
+
if not isinstance(data_package_name, str) or not data_package_name:
|
| 209 |
+
raise ValueError("Data package name must be a non-empty string.")
|
| 210 |
+
if not data_package_name.startswith("BSgenome."):
|
| 211 |
+
raise ValueError(f"Invalid BSgenome data package name: '{data_package_name}'. "
|
| 212 |
+
"It should start with 'BSgenome.'.")
|
| 213 |
+
|
| 214 |
+
r_code = f"""
|
| 215 |
+
library({data_package_name})
|
| 216 |
+
genome_obj <- get(data_package_name)
|
| 217 |
+
cat(seqnames(genome_obj), sep="\\n")
|
| 218 |
+
"""
|
| 219 |
+
return _run_r_command(r_code)
|
| 220 |
+
|
| 221 |
+
@mcp.tool()
|
| 222 |
+
def get_sequence_lengths(
|
| 223 |
+
data_package_name: str,
|
| 224 |
+
seqname: Optional[str] = None,
|
| 225 |
+
) -> Dict[str, Any]:
|
| 226 |
+
"""
|
| 227 |
+
Retrieves the lengths of sequences (e.g., chromosomes) within an installed BSgenome data package.
|
| 228 |
+
|
| 229 |
+
The specified BSgenome data package must be installed prior to calling this function
|
| 230 |
+
using `install_bsgenome_data_package`.
|
| 231 |
+
|
| 232 |
+
Args:
|
| 233 |
+
data_package_name: The name of the installed BSgenome data package
|
| 234 |
+
(e.g., "BSgenome.Hsapiens.UCSC.hg38").
|
| 235 |
+
seqname: Optional. If provided, returns the length of only this specific sequence.
|
| 236 |
+
If None, returns lengths for all sequences.
|
| 237 |
+
|
| 238 |
+
Returns:
|
| 239 |
+
A dictionary containing command execution details, stdout, stderr, and any output files.
|
| 240 |
+
The stdout will contain sequence names and their lengths, typically one per line.
|
| 241 |
+
"""
|
| 242 |
+
# Input validation
|
| 243 |
+
if not isinstance(data_package_name, str) or not data_package_name:
|
| 244 |
+
raise ValueError("Data package name must be a non-empty string.")
|
| 245 |
+
if not data_package_name.startswith("BSgenome."):
|
| 246 |
+
raise ValueError(f"Invalid BSgenome data package name: '{data_package_name}'. "
|
| 247 |
+
"It should start with 'BSgenome.'.")
|
| 248 |
+
if seqname is not None and (not isinstance(seqname, str) or not seqname):
|
| 249 |
+
raise ValueError("Sequence name (seqname) must be a non-empty string if provided.")
|
| 250 |
+
|
| 251 |
+
if seqname:
|
| 252 |
+
r_code = f"""
|
| 253 |
+
library({data_package_name})
|
| 254 |
+
genome_obj <- get(data_package_name)
|
| 255 |
+
len <- seqlengths(genome_obj)["{seqname}"]
|
| 256 |
+
if (is.na(len)) {{
|
| 257 |
+
stop("Sequence '{seqname}' not found in package '{data_package_name}'.")
|
| 258 |
+
}}
|
| 259 |
+
cat("{seqname}:", len, "\\n")
|
| 260 |
+
"""
|
| 261 |
+
else:
|
| 262 |
+
r_code = f"""
|
| 263 |
+
library({data_package_name})
|
| 264 |
+
genome_obj <- get(data_package_name)
|
| 265 |
+
lengths <- seqlengths(genome_obj)
|
| 266 |
+
for (i in seq_along(lengths)) {{
|
| 267 |
+
cat(names(lengths)[i], ": ", lengths[i], "\\n", sep="")
|
| 268 |
+
}}
|
| 269 |
+
"""
|
| 270 |
+
return _run_r_command(r_code)
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-bsgenome/app/bioconductor-bsgenome_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-bsgenome/app/bioconductor-bsgenome_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_bioconductor_bsgenome'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/Dockerfile
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
# Install system dependencies
|
| 5 |
+
RUN apt-get update && apt-get install -y default-jre wget curl && apt-get clean && rm -rf /var/lib/apt/lists/*
|
| 6 |
+
|
| 7 |
+
# Install Miniconda
|
| 8 |
+
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/conda && rm /tmp/miniconda.sh
|
| 9 |
+
|
| 10 |
+
# Add conda to PATH
|
| 11 |
+
ENV PATH="/opt/conda/bin:$PATH"
|
| 12 |
+
|
| 13 |
+
# Install bioconductor-cardspa via conda (e.g., from bioconda)
|
| 14 |
+
RUN conda install -c bioconda bioconductor-cardspa -y && conda clean -a
|
| 15 |
+
|
| 16 |
+
# Install Python dependencies
|
| 17 |
+
RUN pip install uv
|
| 18 |
+
RUN uv pip install --system fastmcp
|
| 19 |
+
|
| 20 |
+
# Create app directory
|
| 21 |
+
WORKDIR /app
|
| 22 |
+
|
| 23 |
+
# Copy your MCP server
|
| 24 |
+
COPY app/bioconductor-cardspa_server.py /app/
|
| 25 |
+
|
| 26 |
+
# Create workspace and output directories
|
| 27 |
+
RUN mkdir -p /app/workspace /app/output
|
| 28 |
+
|
| 29 |
+
# Make sure the server script is executable
|
| 30 |
+
RUN chmod +x /app/bioconductor-cardspa_server.py
|
| 31 |
+
|
| 32 |
+
# Expose port for MCP over HTTP (optional)
|
| 33 |
+
EXPOSE 8000
|
| 34 |
+
|
| 35 |
+
# Health check
|
| 36 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)"
|
| 37 |
+
|
| 38 |
+
# Default command runs the MCP server via stdio
|
| 39 |
+
CMD ["python", "/app/bioconductor-cardspa_server.py"]
|
| 40 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/bioconductor-cardspa_server.py
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
import tempfile
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from typing import Dict, List, Literal, Union
|
| 5 |
+
|
| 6 |
+
# This is a placeholder for the MCP framework's decorator.
|
| 7 |
+
# The user's environment will provide the actual mcp.tool implementation.
|
| 8 |
+
class Mcp:
|
| 9 |
+
def tool(self):
|
| 10 |
+
def decorator(f):
|
| 11 |
+
return f
|
| 12 |
+
return decorator
|
| 13 |
+
mcp = Mcp()
|
| 14 |
+
|
| 15 |
+
|
| 16 |
+
@mcp.tool()
|
| 17 |
+
def cardspa(
|
| 18 |
+
sce_object: Path,
|
| 19 |
+
output_path: Path,
|
| 20 |
+
phenotype_col: str,
|
| 21 |
+
location_col_1: str = "row",
|
| 22 |
+
location_col_2: str = "col",
|
| 23 |
+
method: Literal["Giotto", "SpaGCN", "BayesSpace"] = "Giotto",
|
| 24 |
+
num_results: int = 10,
|
| 25 |
+
num_core: int = 1,
|
| 26 |
+
min_cells: int = 10,
|
| 27 |
+
min_pairs: int = 10,
|
| 28 |
+
) -> Dict[str, Union[str, List[str], int]]:
|
| 29 |
+
"""
|
| 30 |
+
Performs spatial analysis on single-cell data using the cardspa R package.
|
| 31 |
+
|
| 32 |
+
This tool wraps the main `cardspa` function, which can utilize different
|
| 33 |
+
backend methods like Giotto, SpaGCN, or BayesSpace to identify significant
|
| 34 |
+
co-enrichment of cell types in spatial transcriptomics data.
|
| 35 |
+
|
| 36 |
+
Args:
|
| 37 |
+
sce_object: Path to the input SingleCellExperiment object in RDS format.
|
| 38 |
+
output_path: Path to save the output results object in RDS format.
|
| 39 |
+
phenotype_col: The column name in the SCE object's colData that contains cell type annotations.
|
| 40 |
+
location_col_1: The column name for the first spatial coordinate (e.g., 'row', 'x').
|
| 41 |
+
location_col_2: The column name for the second spatial coordinate (e.g., 'col', 'y').
|
| 42 |
+
method: The computational method to use for the analysis.
|
| 43 |
+
num_results: The number of top co-enriched cell type pairs to return.
|
| 44 |
+
num_core: The number of CPU cores to use for parallel processing.
|
| 45 |
+
min_cells: The minimum number of cells required for a cell type to be included in the analysis.
|
| 46 |
+
min_pairs: The minimum number of interacting pairs for a result to be considered significant.
|
| 47 |
+
|
| 48 |
+
Returns:
|
| 49 |
+
A dictionary containing the executed command, stdout, stderr, and a list of output files.
|
| 50 |
+
In case of an error, it includes an error message and return code.
|
| 51 |
+
"""
|
| 52 |
+
# --- Input Validation ---
|
| 53 |
+
if not sce_object.is_file():
|
| 54 |
+
raise FileNotFoundError(f"Input file not found: {sce_object}")
|
| 55 |
+
|
| 56 |
+
if not output_path.parent.is_dir():
|
| 57 |
+
try:
|
| 58 |
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
| 59 |
+
except OSError as e:
|
| 60 |
+
raise NotADirectoryError(
|
| 61 |
+
f"Output directory does not exist and could not be created: {output_path.parent}"
|
| 62 |
+
) from e
|
| 63 |
+
|
| 64 |
+
if num_results <= 0:
|
| 65 |
+
raise ValueError("num_results must be a positive integer.")
|
| 66 |
+
if num_core <= 0:
|
| 67 |
+
raise ValueError("num_core must be a positive integer.")
|
| 68 |
+
if min_cells <= 0:
|
| 69 |
+
raise ValueError("min_cells must be a positive integer.")
|
| 70 |
+
if min_pairs <= 0:
|
| 71 |
+
raise ValueError("min_pairs must be a positive integer.")
|
| 72 |
+
|
| 73 |
+
# R script to be executed. It includes package installation for portability.
|
| 74 |
+
r_script_content = """
|
| 75 |
+
# run_cardspa.R
|
| 76 |
+
options(warn=-1)
|
| 77 |
+
suppressPackageStartupMessages({
|
| 78 |
+
if (!requireNamespace("argparser", quietly = TRUE)) {
|
| 79 |
+
install.packages("argparser", repos = "http://cran.us.r-project.org", quiet = TRUE)
|
| 80 |
+
}
|
| 81 |
+
if (!requireNamespace("BiocManager", quietly = TRUE)) {
|
| 82 |
+
install.packages("BiocManager", repos = "http://cran.us.r-project.org", quiet = TRUE)
|
| 83 |
+
}
|
| 84 |
+
if (!requireNamespace("cardspa", quietly = TRUE)) {
|
| 85 |
+
BiocManager::install("cardspa", update=FALSE, ask=FALSE, quiet = TRUE)
|
| 86 |
+
}
|
| 87 |
+
if (!requireNamespace("SingleCellExperiment", quietly = TRUE)) {
|
| 88 |
+
BiocManager::install("SingleCellExperiment", update=FALSE, ask=FALSE, quiet = TRUE)
|
| 89 |
+
}
|
| 90 |
+
library(argparser)
|
| 91 |
+
library(cardspa)
|
| 92 |
+
library(SingleCellExperiment)
|
| 93 |
+
})
|
| 94 |
+
|
| 95 |
+
p <- arg_parser("Run cardspa analysis")
|
| 96 |
+
p <- add_argument(p, "--sce_object", help="Path to the input SingleCellExperiment RDS file", type="character")
|
| 97 |
+
p <- add_argument(p, "--output_path", help="Path to save the output RDS file", type="character")
|
| 98 |
+
p <- add_argument(p, "--phenotype_col", help="Column name for cell types", type="character")
|
| 99 |
+
p <- add_argument(p, "--location_col_1", help="First column name for spatial coordinates", default="row", type="character")
|
| 100 |
+
p <- add_argument(p, "--location_col_2", help="Second column name for spatial coordinates", default="col", type="character")
|
| 101 |
+
p <- add_argument(p, "--method", help="Method for spatial analysis (Giotto, SpaGCN, BayesSpace)", default="Giotto", type="character")
|
| 102 |
+
p <- add_argument(p, "--num_results", help="Number of top results to return", default=10, type="integer")
|
| 103 |
+
p <- add_argument(p, "--num_core", help="Number of cores for parallel processing", default=1, type="integer")
|
| 104 |
+
p <- add_argument(p, "--min_cells", help="Minimum number of cells for a cell type", default=10, type="integer")
|
| 105 |
+
p <- add_argument(p, "--min_pairs", help="Minimum number of interacting pairs", default=10, type="integer")
|
| 106 |
+
|
| 107 |
+
argv <- parse_args(p)
|
| 108 |
+
|
| 109 |
+
if (is.na(argv$sce_object) || is.na(argv$output_path) || is.na(argv$phenotype_col)) {
|
| 110 |
+
stop("Missing required arguments: --sce_object, --output_path, or --phenotype_col", call. = FALSE)
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
cat("Reading input SCE object from:", argv$sce_object, "\\n")
|
| 114 |
+
sce <- readRDS(argv$sce_object)
|
| 115 |
+
|
| 116 |
+
cat("Running cardspa analysis with method:", argv$method, "\\n")
|
| 117 |
+
results <- cardspa(
|
| 118 |
+
sce_object = sce,
|
| 119 |
+
location_col = c(argv$location_col_1, argv$location_col_2),
|
| 120 |
+
phenotype_col = argv$phenotype_col,
|
| 121 |
+
method = argv$method,
|
| 122 |
+
num_results = argv$num_results,
|
| 123 |
+
num_core = argv$num_core,
|
| 124 |
+
min_cells = argv$min_cells,
|
| 125 |
+
min_pairs = argv$min_pairs
|
| 126 |
+
)
|
| 127 |
+
|
| 128 |
+
cat("Saving results to:", argv$output_path, "\\n")
|
| 129 |
+
saveRDS(results, file = argv$output_path)
|
| 130 |
+
cat("cardspa analysis complete. Results saved to:", argv$output_path, "\\n")
|
| 131 |
+
"""
|
| 132 |
+
|
| 133 |
+
# --- Subprocess Execution ---
|
| 134 |
+
with tempfile.NamedTemporaryFile(mode='w', suffix=".R", delete=False) as r_script_file:
|
| 135 |
+
r_script_file.write(r_script_content)
|
| 136 |
+
r_script_path = Path(r_script_file.name)
|
| 137 |
+
|
| 138 |
+
cmd = [
|
| 139 |
+
"Rscript", str(r_script_path),
|
| 140 |
+
"--sce_object", str(sce_object.resolve()),
|
| 141 |
+
"--output_path", str(output_path.resolve()),
|
| 142 |
+
"--phenotype_col", phenotype_col,
|
| 143 |
+
"--location_col_1", location_col_1,
|
| 144 |
+
"--location_col_2", location_col_2,
|
| 145 |
+
"--method", method,
|
| 146 |
+
"--num_results", str(num_results),
|
| 147 |
+
"--num_core", str(num_core),
|
| 148 |
+
"--min_cells", str(min_cells),
|
| 149 |
+
"--min_pairs", str(min_pairs),
|
| 150 |
+
]
|
| 151 |
+
command_executed = " ".join(cmd)
|
| 152 |
+
|
| 153 |
+
try:
|
| 154 |
+
result = subprocess.run(
|
| 155 |
+
cmd,
|
| 156 |
+
check=True,
|
| 157 |
+
capture_output=True,
|
| 158 |
+
text=True,
|
| 159 |
+
encoding='utf-8'
|
| 160 |
+
)
|
| 161 |
+
return {
|
| 162 |
+
"command_executed": command_executed,
|
| 163 |
+
"stdout": result.stdout,
|
| 164 |
+
"stderr": result.stderr,
|
| 165 |
+
"output_files": [str(output_path.resolve())]
|
| 166 |
+
}
|
| 167 |
+
except FileNotFoundError:
|
| 168 |
+
raise RuntimeError("Rscript command not found. Please ensure R is installed and in your system's PATH.")
|
| 169 |
+
except subprocess.CalledProcessError as e:
|
| 170 |
+
return {
|
| 171 |
+
"command_executed": command_executed,
|
| 172 |
+
"stdout": e.stdout,
|
| 173 |
+
"stderr": e.stderr,
|
| 174 |
+
"error": "cardspa execution failed.",
|
| 175 |
+
"return_code": e.returncode,
|
| 176 |
+
"output_files": []
|
| 177 |
+
}
|
| 178 |
+
finally:
|
| 179 |
+
# Ensure temporary script is always removed
|
| 180 |
+
if r_script_path.exists():
|
| 181 |
+
r_script_path.unlink()
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/bioconductor-cardspa_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/bioconductor-cardspa_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_bioconductor_cardspa'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/app/requirements.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-bioconductor-cardspa:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-bioconductor-cardspa:latest
|
| 7 |
+
container_name: mcp-bioconductor-cardspa
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=bioconductor-cardspa
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- bioconductor-cardspa
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cardspa/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/Dockerfile
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
FROM python:3.10-slim
|
| 3 |
+
|
| 4 |
+
# Install system dependencies
|
| 5 |
+
RUN apt-get update && apt-get install -y default-jre wget curl && apt-get clean && rm -rf /var/lib/apt/lists/*
|
| 6 |
+
|
| 7 |
+
# Install Miniconda
|
| 8 |
+
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /tmp/miniconda.sh && bash /tmp/miniconda.sh -b -p /opt/conda && rm /tmp/miniconda.sh
|
| 9 |
+
|
| 10 |
+
# Add conda to PATH
|
| 11 |
+
ENV PATH="/opt/conda/bin:$PATH"
|
| 12 |
+
|
| 13 |
+
# Install bioconductor-cellid via conda (e.g., from bioconda)
|
| 14 |
+
RUN conda install -c bioconda bioconductor-cellid -y && conda clean -a
|
| 15 |
+
|
| 16 |
+
# Install Python dependencies
|
| 17 |
+
RUN pip install uv
|
| 18 |
+
RUN uv pip install --system fastmcp
|
| 19 |
+
|
| 20 |
+
# Create app directory
|
| 21 |
+
WORKDIR /app
|
| 22 |
+
|
| 23 |
+
# Copy your MCP server
|
| 24 |
+
COPY app/bioconductor-cellid_server.py /app/
|
| 25 |
+
|
| 26 |
+
# Create workspace and output directories
|
| 27 |
+
RUN mkdir -p /app/workspace /app/output
|
| 28 |
+
|
| 29 |
+
# Make sure the server script is executable
|
| 30 |
+
RUN chmod +x /app/bioconductor-cellid_server.py
|
| 31 |
+
|
| 32 |
+
# Expose port for MCP over HTTP (optional)
|
| 33 |
+
EXPOSE 8000
|
| 34 |
+
|
| 35 |
+
# Health check
|
| 36 |
+
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 CMD python -c "import sys; sys.exit(0)"
|
| 37 |
+
|
| 38 |
+
# Default command runs the MCP server via stdio
|
| 39 |
+
CMD ["python", "/app/bioconductor-cellid_server.py"]
|
| 40 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/app/bioconductor-cellid_server.py
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import subprocess
|
| 2 |
+
import os
|
| 3 |
+
from pathlib import Path
|
| 4 |
+
from typing import Optional, List, Union
|
| 5 |
+
import tempfile
|
| 6 |
+
|
| 7 |
+
def run_r_command(script_content: str):
|
| 8 |
+
"""Helper function to execute R code via Rscript"""
|
| 9 |
+
with tempfile.NamedTemporaryFile(mode='w', suffix='.R', delete=False) as tmp:
|
| 10 |
+
tmp.write(script_content)
|
| 11 |
+
tmp_path = tmp.name
|
| 12 |
+
|
| 13 |
+
try:
|
| 14 |
+
result = subprocess.run(
|
| 15 |
+
["Rscript", tmp_path],
|
| 16 |
+
capture_output=True,
|
| 17 |
+
text=True,
|
| 18 |
+
check=True
|
| 19 |
+
)
|
| 20 |
+
return result.stdout, result.stderr
|
| 21 |
+
except subprocess.CalledProcessError as e:
|
| 22 |
+
raise RuntimeError(f"R execution failed: {e.stderr}\nStdout: {e.stdout}")
|
| 23 |
+
finally:
|
| 24 |
+
if os.path.exists(tmp_path):
|
| 25 |
+
os.remove(tmp_path)
|
| 26 |
+
|
| 27 |
+
@mcp.tool()
|
| 28 |
+
def cellid_run_mca(
|
| 29 |
+
input_rds: str,
|
| 30 |
+
output_rds: str,
|
| 31 |
+
nmcs: int = 50,
|
| 32 |
+
assay: str = "RNA",
|
| 33 |
+
slot: str = "counts",
|
| 34 |
+
features: Optional[List[str]] = None
|
| 35 |
+
):
|
| 36 |
+
"""
|
| 37 |
+
Performs Multiple Correspondence Analysis (MCA) on a SingleCellExperiment or Seurat object.
|
| 38 |
+
MCA allows for the simultaneous representation of cells and genes in a common low-dimensional space.
|
| 39 |
+
"""
|
| 40 |
+
input_path = Path(input_rds)
|
| 41 |
+
output_path = Path(output_rds)
|
| 42 |
+
|
| 43 |
+
if not input_path.exists():
|
| 44 |
+
return {"error": f"Input file {input_rds} not found."}
|
| 45 |
+
|
| 46 |
+
if nmcs <= 0:
|
| 47 |
+
return {"error": "nmcs must be a positive integer."}
|
| 48 |
+
|
| 49 |
+
features_r = "NULL"
|
| 50 |
+
if features:
|
| 51 |
+
features_formatted = ", ".join([f"'{f}'" for f in features])
|
| 52 |
+
features_r = f"c({features_formatted})"
|
| 53 |
+
|
| 54 |
+
r_script = f"""
|
| 55 |
+
library(CelliD)
|
| 56 |
+
library(Seurat)
|
| 57 |
+
library(SingleCellExperiment)
|
| 58 |
+
|
| 59 |
+
obj <- readRDS("{input_path}")
|
| 60 |
+
|
| 61 |
+
# Run MCA
|
| 62 |
+
obj <- RunMCA(obj, nmcs = {nmcs}, assay = "{assay}", slot = "{slot}", features = {features_r})
|
| 63 |
+
|
| 64 |
+
saveRDS(obj, "{output_path}")
|
| 65 |
+
"""
|
| 66 |
+
|
| 67 |
+
try:
|
| 68 |
+
stdout, stderr = run_r_command(r_script)
|
| 69 |
+
return {
|
| 70 |
+
"command_executed": "RunMCA",
|
| 71 |
+
"stdout": stdout,
|
| 72 |
+
"stderr": stderr,
|
| 73 |
+
"output_files": [str(output_path)]
|
| 74 |
+
}
|
| 75 |
+
except Exception as e:
|
| 76 |
+
return {"error": str(e)}
|
| 77 |
+
|
| 78 |
+
@mcp.tool()
|
| 79 |
+
def cellid_get_cell_gene_set(
|
| 80 |
+
input_rds: str,
|
| 81 |
+
output_csv: str,
|
| 82 |
+
dims: int = 50,
|
| 83 |
+
n_features: int = 200
|
| 84 |
+
):
|
| 85 |
+
"""
|
| 86 |
+
Extracts the top gene signatures for each individual cell based on MCA coordinates.
|
| 87 |
+
"""
|
| 88 |
+
input_path = Path(input_rds)
|
| 89 |
+
output_path = Path(output_csv)
|
| 90 |
+
|
| 91 |
+
if not input_path.exists():
|
| 92 |
+
return {"error": f"Input file {input_rds} not found."}
|
| 93 |
+
|
| 94 |
+
if dims <= 0 or n_features <= 0:
|
| 95 |
+
return {"error": "dims and n_features must be positive integers."}
|
| 96 |
+
|
| 97 |
+
r_script = f"""
|
| 98 |
+
library(CelliD)
|
| 99 |
+
library(Seurat)
|
| 100 |
+
library(SingleCellExperiment)
|
| 101 |
+
library(data.table)
|
| 102 |
+
|
| 103 |
+
obj <- readRDS("{input_path}")
|
| 104 |
+
|
| 105 |
+
# Extract gene sets per cell
|
| 106 |
+
# dims is treated as 1:dims
|
| 107 |
+
gene_sets <- GetCellGeneSet(obj, dims = 1:{dims}, n.features = {n_features})
|
| 108 |
+
|
| 109 |
+
# Convert list to a data table for export
|
| 110 |
+
# Each column is a cell, rows are top genes
|
| 111 |
+
max_len <- max(sapply(gene_sets, length))
|
| 112 |
+
dt <- as.data.frame(lapply(gene_sets, function(x) c(x, rep(NA, max_len - length(x)))))
|
| 113 |
+
|
| 114 |
+
write.csv(dt, "{output_path}", row.names = FALSE)
|
| 115 |
+
"""
|
| 116 |
+
|
| 117 |
+
try:
|
| 118 |
+
stdout, stderr = run_r_command(r_script)
|
| 119 |
+
return {
|
| 120 |
+
"command_executed": "GetCellGeneSet",
|
| 121 |
+
"stdout": stdout,
|
| 122 |
+
"stderr": stderr,
|
| 123 |
+
"output_files": [str(output_path)]
|
| 124 |
+
}
|
| 125 |
+
except Exception as e:
|
| 126 |
+
return {"error": str(e)}
|
| 127 |
+
|
| 128 |
+
@mcp.tool()
|
| 129 |
+
def cellid_run_cell_hgt(
|
| 130 |
+
input_rds: str,
|
| 131 |
+
pathways_gmt: str,
|
| 132 |
+
output_rds: str,
|
| 133 |
+
dims: int = 50,
|
| 134 |
+
n_features: int = 200,
|
| 135 |
+
min_size: int = 5
|
| 136 |
+
):
|
| 137 |
+
"""
|
| 138 |
+
Performs cell-type assignment or functional enrichment using a Hypergeometric Test (HGT).
|
| 139 |
+
Matches per-cell gene signatures against a reference database (GMT format).
|
| 140 |
+
"""
|
| 141 |
+
input_path = Path(input_rds)
|
| 142 |
+
gmt_path = Path(pathways_gmt)
|
| 143 |
+
output_path = Path(output_rds)
|
| 144 |
+
|
| 145 |
+
if not input_path.exists():
|
| 146 |
+
return {"error": f"Input RDS {input_rds} not found."}
|
| 147 |
+
if not gmt_path.exists():
|
| 148 |
+
return {"error": f"GMT file {pathways_gmt} not found."}
|
| 149 |
+
|
| 150 |
+
r_script = f"""
|
| 151 |
+
library(CelliD)
|
| 152 |
+
library(Seurat)
|
| 153 |
+
library(SingleCellExperiment)
|
| 154 |
+
library(fgsea)
|
| 155 |
+
|
| 156 |
+
obj <- readRDS("{input_path}")
|
| 157 |
+
pathways <- gmtPathways("{gmt_path}")
|
| 158 |
+
|
| 159 |
+
# Run Hypergeometric Test
|
| 160 |
+
# Returns a matrix of -log10(p-value)
|
| 161 |
+
hgt_matrix <- RunCellHGT(obj, pathways = pathways, dims = 1:{dims}, n.features = {n_features}, minSize = {min_size})
|
| 162 |
+
|
| 163 |
+
# If Seurat, we can add it as an assay or metadata
|
| 164 |
+
if(inherits(obj, "Seurat")) {{
|
| 165 |
+
obj[["HGT"]] <- CreateAssayObject(counts = hgt_matrix)
|
| 166 |
+
}} else {{
|
| 167 |
+
# For SCE, add to altExp
|
| 168 |
+
altExp(obj, "HGT") <- SummarizedExperiment(assays = list(counts = hgt_matrix))
|
| 169 |
+
}}
|
| 170 |
+
|
| 171 |
+
saveRDS(obj, "{output_path}")
|
| 172 |
+
"""
|
| 173 |
+
|
| 174 |
+
try:
|
| 175 |
+
stdout, stderr = run_r_command(r_script)
|
| 176 |
+
return {
|
| 177 |
+
"command_executed": "RunCellHGT",
|
| 178 |
+
"stdout": stdout,
|
| 179 |
+
"stderr": stderr,
|
| 180 |
+
"output_files": [str(output_path)]
|
| 181 |
+
}
|
| 182 |
+
except Exception as e:
|
| 183 |
+
return {"error": str(e)}
|
| 184 |
+
|
| 185 |
+
@mcp.tool()
|
| 186 |
+
def cellid_run_gsea(
|
| 187 |
+
input_rds: str,
|
| 188 |
+
pathways_gmt: str,
|
| 189 |
+
output_rds: str,
|
| 190 |
+
dims: int = 50
|
| 191 |
+
):
|
| 192 |
+
"""
|
| 193 |
+
Performs Gene Set Enrichment Analysis (GSEA) on cells using the MCA gene rankings.
|
| 194 |
+
"""
|
| 195 |
+
input_path = Path(input_rds)
|
| 196 |
+
gmt_path = Path(pathways_gmt)
|
| 197 |
+
output_path = Path(output_rds)
|
| 198 |
+
|
| 199 |
+
if not input_path.exists():
|
| 200 |
+
return {"error": f"Input RDS {input_rds} not found."}
|
| 201 |
+
if not gmt_path.exists():
|
| 202 |
+
return {"error": f"GMT file {pathways_gmt} not found."}
|
| 203 |
+
|
| 204 |
+
r_script = f"""
|
| 205 |
+
library(CelliD)
|
| 206 |
+
library(Seurat)
|
| 207 |
+
library(SingleCellExperiment)
|
| 208 |
+
library(fgsea)
|
| 209 |
+
|
| 210 |
+
obj <- readRDS("{input_path}")
|
| 211 |
+
pathways <- gmtPathways("{gmt_path}")
|
| 212 |
+
|
| 213 |
+
# Run GSEA
|
| 214 |
+
# This calculates enrichment scores for each cell and each pathway
|
| 215 |
+
gsea_res <- RunGSEA(obj, pathways = pathways, dims = 1:{dims})
|
| 216 |
+
|
| 217 |
+
# Save results (usually returns a matrix of NES)
|
| 218 |
+
if(inherits(obj, "Seurat")) {{
|
| 219 |
+
obj[["GSEA"]] <- CreateAssayObject(counts = gsea_res)
|
| 220 |
+
}} else {{
|
| 221 |
+
altExp(obj, "GSEA") <- SummarizedExperiment(assays = list(counts = gsea_res))
|
| 222 |
+
}}
|
| 223 |
+
|
| 224 |
+
saveRDS(obj, "{output_path}")
|
| 225 |
+
"""
|
| 226 |
+
|
| 227 |
+
try:
|
| 228 |
+
stdout, stderr = run_r_command(r_script)
|
| 229 |
+
return {
|
| 230 |
+
"command_executed": "RunGSEA",
|
| 231 |
+
"stdout": stdout,
|
| 232 |
+
"stderr": stderr,
|
| 233 |
+
"output_files": [str(output_path)]
|
| 234 |
+
}
|
| 235 |
+
except Exception as e:
|
| 236 |
+
return {"error": str(e)}
|
| 237 |
+
|
| 238 |
+
@mcp.tool()
|
| 239 |
+
def cellid_run_group_mca(
|
| 240 |
+
input_rds: str,
|
| 241 |
+
group_by: str,
|
| 242 |
+
output_rds: str,
|
| 243 |
+
nmcs: int = 50,
|
| 244 |
+
assay: str = "RNA",
|
| 245 |
+
slot: str = "counts"
|
| 246 |
+
):
|
| 247 |
+
"""
|
| 248 |
+
Performs MCA on grouped cells (e.g., by cluster or cell type) rather than individual cells.
|
| 249 |
+
Useful for extracting group-specific gene signatures.
|
| 250 |
+
"""
|
| 251 |
+
input_path = Path(input_rds)
|
| 252 |
+
output_path = Path(output_rds)
|
| 253 |
+
|
| 254 |
+
if not input_path.exists():
|
| 255 |
+
return {"error": f"Input file {input_rds} not found."}
|
| 256 |
+
|
| 257 |
+
r_script = f"""
|
| 258 |
+
library(CelliD)
|
| 259 |
+
library(Seurat)
|
| 260 |
+
library(SingleCellExperiment)
|
| 261 |
+
|
| 262 |
+
obj <- readRDS("{input_path}")
|
| 263 |
+
|
| 264 |
+
# Run Group MCA
|
| 265 |
+
# This aggregates cells by the specified metadata column before MCA
|
| 266 |
+
group_mca <- RunGroupMCA(obj, group.by = "{group_by}", nmcs = {nmcs}, assay = "{assay}", slot = "{slot}")
|
| 267 |
+
|
| 268 |
+
saveRDS(group_mca, "{output_path}")
|
| 269 |
+
"""
|
| 270 |
+
|
| 271 |
+
try:
|
| 272 |
+
stdout, stderr = run_r_command(r_script)
|
| 273 |
+
return {
|
| 274 |
+
"command_executed": "RunGroupMCA",
|
| 275 |
+
"stdout": stdout,
|
| 276 |
+
"stderr": stderr,
|
| 277 |
+
"output_files": [str(output_path)]
|
| 278 |
+
}
|
| 279 |
+
except Exception as e:
|
| 280 |
+
return {"error": str(e)}
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/app/bioconductor-cellid_shim_server.py
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
from __future__ import annotations
|
| 3 |
+
|
| 4 |
+
import ast
|
| 5 |
+
from pathlib import Path
|
| 6 |
+
|
| 7 |
+
from mcp.server.fastmcp import FastMCP
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
SOURCE_SERVER = Path('/225040511/project/BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/app/bioconductor-cellid_server.py')
|
| 11 |
+
SERVER_NAME = 'biosci_bioconductor_cellid'
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
class _ShimMCP:
|
| 15 |
+
@staticmethod
|
| 16 |
+
def tool():
|
| 17 |
+
def _decorator(fn):
|
| 18 |
+
return fn
|
| 19 |
+
return _decorator
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
def _load_functions():
|
| 23 |
+
code = SOURCE_SERVER.read_text(encoding="utf-8")
|
| 24 |
+
tree = ast.parse(code, filename=str(SOURCE_SERVER))
|
| 25 |
+
function_names = [n.name for n in tree.body if isinstance(n, ast.FunctionDef) and not n.name.startswith("_")]
|
| 26 |
+
namespace = {
|
| 27 |
+
"__name__": "__mcp_source__",
|
| 28 |
+
"mcp": _ShimMCP(),
|
| 29 |
+
}
|
| 30 |
+
exec(compile(code, str(SOURCE_SERVER), "exec"), namespace, namespace)
|
| 31 |
+
loaded = []
|
| 32 |
+
for name in function_names:
|
| 33 |
+
fn = namespace.get(name)
|
| 34 |
+
if callable(fn):
|
| 35 |
+
loaded.append(fn)
|
| 36 |
+
return loaded
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
mcp = FastMCP(SERVER_NAME)
|
| 40 |
+
for _fn in _load_functions():
|
| 41 |
+
mcp.tool()(_fn)
|
| 42 |
+
|
| 43 |
+
|
| 44 |
+
if __name__ == "__main__":
|
| 45 |
+
mcp.run(transport="stdio")
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/docker-compose.yml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version: '3.8'
|
| 2 |
+
|
| 3 |
+
services:
|
| 4 |
+
mcp-bioconductor-cellid:
|
| 5 |
+
build: .
|
| 6 |
+
image: mcp-bioconductor-cellid:latest
|
| 7 |
+
container_name: mcp-bioconductor-cellid
|
| 8 |
+
ports:
|
| 9 |
+
- "8000:8000"
|
| 10 |
+
environment:
|
| 11 |
+
- MCP_SERVER_NAME=bioconductor-cellid
|
| 12 |
+
volumes:
|
| 13 |
+
- ./workspace:/app/workspace
|
| 14 |
+
- ./output:/app/output
|
| 15 |
+
restart: unless-stopped
|
| 16 |
+
healthcheck:
|
| 17 |
+
test: ["CMD", "python", "-c", "import sys; sys.exit(0)"]
|
| 18 |
+
interval: 30s
|
| 19 |
+
timeout: 10s
|
| 20 |
+
retries: 3
|
| 21 |
+
start_period: 5s
|
| 22 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/environment.yaml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
name: mcp-tool
|
| 3 |
+
channels:
|
| 4 |
+
- bioconda
|
| 5 |
+
- conda-forge
|
| 6 |
+
- defaults
|
| 7 |
+
dependencies:
|
| 8 |
+
- bioconductor-cellid
|
| 9 |
+
- python=3.10
|
| 10 |
+
|
BioScientist/agent_system/toolbase/mcp_batch_from_manual_txt/mcp_bioconductor-cellid/requirements.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastmcp
|
| 2 |
+
mcp
|