Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
747c10b
feat: add Claude Code plugin packaging
gasvn Mar 30, 2026
3c58148
fix: add missing YAML frontmatter to 2 skills
gasvn Mar 30, 2026
04b8f49
fix: improve plugin efficiency based on test results
gasvn Mar 30, 2026
7935380
refactor: CLI-first execution strategy for plugin
gasvn Mar 30, 2026
6cd05dc
plugin: self-contained structure via per-skill symlinks and local mar…
gasvn Apr 15, 2026
c964a44
plugin: route research command to specialized skills and harden skill…
gasvn Apr 15, 2026
e760cfa
fix: force torch CPU to prevent MPS segfault in subprocess
gasvn Apr 16, 2026
0a786b2
plugin: skill routing table + FAERS mandate + ADMET SDK fallback
gasvn Apr 16, 2026
7b01353
plugin: one-step install via root marketplace + install skill
gasvn Apr 16, 2026
e016d59
plugin: rename install skill to tooluniverse-claude-code-plugin
gasvn Apr 16, 2026
7b45ca5
feat: compound tools, MSigDB tool, benchmark harness
gasvn Apr 16, 2026
aa1d948
harness: skill-mapped failure analysis + BixBench convention fixes
gasvn Apr 17, 2026
49bb5f7
harness: update baselines after full 61q BixBench evaluation
gasvn Apr 17, 2026
d8e3b0b
fix: targeted BixBench convention improvements for remaining failures
gasvn Apr 17, 2026
51b6e09
harness: update to 83.6% after retest — 5 more flips
gasvn Apr 17, 2026
2d45b15
eval: full 205-question BixBench dataset + R package setup
gasvn Apr 17, 2026
2549e6f
fix: unified LLM grader for BixBench llm_verifier questions
gasvn Apr 18, 2026
535ff21
harness: full 205-question BixBench evaluation complete — 81.0%
gasvn Apr 18, 2026
755d0bd
fix: remove dataset-specific memorization from BixBench conventions
gasvn Apr 18, 2026
0ef6455
harness: improved categorizer with question enrichment
gasvn Apr 18, 2026
21b72dc
fix: pass categories field in analyze enrichment
gasvn Apr 18, 2026
4087258
harness: complete 205q BixBench with decontaminated skills — 78.5%
gasvn Apr 18, 2026
0405030
fix: Unicode minus sign normalization in grader
gasvn Apr 18, 2026
77eba52
skills: ANOVA aggregation clarity + PhyKIT usage guidance
gasvn Apr 18, 2026
64851ca
harness: update baseline to 81.9% (168/205) after retest
gasvn Apr 19, 2026
e1d2b5b
skills: bundled computational scripts for phylogenetics + expression
gasvn Apr 19, 2026
0bc5234
harness: 83.4% (171/205) after PhyKIT bundled scripts — 3 more flips
gasvn Apr 19, 2026
235b4d9
fix: apply Unicode normalization to ALL grader strategies
gasvn Apr 19, 2026
7db81e9
fix: Unicode superscript scientific notation normalization
gasvn Apr 19, 2026
86042ef
harness: 86.8% (178/205) — exceeds 85% target
gasvn Apr 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "tooluniverse",
"owner": {
"name": "MIMS Harvard",
"url": "https://github.com/mims-harvard"
},
"metadata": {
"description": "ToolUniverse marketplace — 1000+ scientific research tools and 114 specialized skills for biology, chemistry, medicine, and data science.",
"version": "1.1.11"
},
"plugins": [
{
"name": "tooluniverse",
"source": "./plugin",
"description": "1000+ scientific tools (PubMed, UniProt, PubChem, TCGA, FAERS, ClinicalTrials.gov, etc.) + 114 research skills + MCP server + research slash commands.",
"category": "science",
"strict": false
}
]
}
27 changes: 27 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Files to exclude when users run `git archive` (e.g., GitHub release tarballs).
# These are kept in the repo for development but shouldn't ship with the plugin.

# Benchmark data (third-party content)
temp_docs_and_tests/ export-ignore

# Benchmark outputs and harness (not part of the plugin itself)
skills/evals/ export-ignore

# Development-only dirs
tests/ export-ignore
src/tooluniverse/tools_generated/ export-ignore
docs/ export-ignore

# Session / memory
memory/ export-ignore
*_SUMMARY.md export-ignore
*_REPORT.md export-ignore
SESSION_*.md export-ignore

# Build output (regenerated)
dist/ export-ignore

# Version control metadata
.github/ export-ignore
.gitattributes export-ignore
.gitignore export-ignore
100 changes: 100 additions & 0 deletions .github/workflows/release-plugin.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
name: Release Claude Code Plugin

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: 'Tag name to build (e.g., v1.1.12)'
required: true

permissions:
contents: write

jobs:
build-plugin-zip:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{ github.event.inputs.tag || github.ref }}

- name: Determine tag name
id: tag
run: |
TAG="${{ github.event.inputs.tag || github.ref_name }}"
echo "name=$TAG" >> $GITHUB_OUTPUT
echo "Building plugin zip for $TAG"

- name: Build plugin artifact
run: |
set -euo pipefail
TAG="${{ steps.tag.outputs.name }}"
BUILD_DIR="build/tooluniverse-plugin-${TAG}"
mkdir -p "$BUILD_DIR"

# Copy plugin directory, resolving symlinks (skills/ uses symlinks)
cp -rL plugin/. "$BUILD_DIR/"

# Include a copy of the root marketplace manifest for optional
# "unzip and add as local marketplace" install path.
mkdir -p "$BUILD_DIR/../marketplace"
cp -r .claude-plugin "$BUILD_DIR/../marketplace/"

# Rewrite the marketplace source path to the extracted plugin dir
TAG_NAME="$TAG" python3 - <<'PY'
import json, os, pathlib
tag = os.environ["TAG_NAME"]
m = pathlib.Path("build/marketplace/.claude-plugin/marketplace.json")
data = json.loads(m.read_text())
for p in data.get("plugins", []):
if p.get("name") == "tooluniverse":
p["source"] = f"./tooluniverse-plugin-{tag}"
m.write_text(json.dumps(data, indent=2) + "\n")
PY

# Stage a top-level zip root that contains both
ZIP_ROOT="build/zip-root"
mkdir -p "$ZIP_ROOT"
mv "$BUILD_DIR" "$ZIP_ROOT/"
mv build/marketplace/.claude-plugin "$ZIP_ROOT/"

cd "$ZIP_ROOT"
zip -r "../../tooluniverse-plugin-${TAG}.zip" .
cd -

ls -la tooluniverse-plugin-${TAG}.zip
unzip -l tooluniverse-plugin-${TAG}.zip | head -30

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: tooluniverse-plugin-${{ steps.tag.outputs.name }}
path: tooluniverse-plugin-*.zip
if-no-files-found: error

- name: Attach to GitHub Release
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: tooluniverse-plugin-*.zip
fail_on_unmatched_files: true
body: |
### ToolUniverse Claude Code Plugin ${{ steps.tag.outputs.name }}

Install from GitHub (recommended):
```bash
claude plugin marketplace add mims-harvard/ToolUniverse#${{ steps.tag.outputs.name }}
claude plugin install tooluniverse@tooluniverse
```

Or offline: download `tooluniverse-plugin-${{ steps.tag.outputs.name }}.zip`, unzip, then
```bash
claude plugin marketplace add ./unzipped-directory
claude plugin install tooluniverse@tooluniverse
```

Full install guide: `skills/tooluniverse-claude-code-plugin/SKILL.md`
20 changes: 20 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -174,3 +174,23 @@ DEVTU_*.md
# Claude Code configuration
.claude/
.tooluniverse/

# Benchmark outputs (large, machine-generated, no history value)
skills/evals/bixbench/results_*.json
skills/evals/lab-bench/results_*.json
skills/evals/bixbench/retest_*.json
skills/evals/*.log
skills/evals/*/BENCHMARK_REPORT.md
skills/evals/*/BIXBENCH_FULL_REPORT.md

# Per-user auto-memory / private session notes (never push)
memory/
MEMORY.md
CLAUDE.md

# API keys & secrets
.env
.env.local
credentials.json
*_api_key*
*_token*
18 changes: 18 additions & 0 deletions plugin/.claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"name": "tooluniverse-local",
"owner": {
"name": "MIMS Harvard"
},
"metadata": {
"description": "Local marketplace for the ToolUniverse plugin",
"version": "1.1.11"
},
"plugins": [
{
"name": "tooluniverse",
"description": "1000+ scientific research tools for biology, chemistry, medicine, and data science.",
"source": "./",
"strict": false
}
]
}
11 changes: 11 additions & 0 deletions plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "tooluniverse",
"description": "1000+ scientific research tools for biology, chemistry, medicine, and data science. Access PubMed, UniProt, PubChem, TCGA, NHANES, GWAS Catalog, and hundreds more databases through a unified MCP interface. Includes 114 specialized research skills for genomics, drug discovery, clinical analysis, and more.",
"version": "1.1.11",
"author": {
"name": "MIMS Harvard"
},
"homepage": "https://aiscientist.tools",
"repository": "https://github.com/mims-harvard/ToolUniverse",
"license": "Apache-2.0"
}
13 changes: 13 additions & 0 deletions plugin/.mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"mcpServers": {
"tooluniverse": {
"command": "uvx",
"args": ["--refresh", "tooluniverse"],
"env": {
"PYTHONIOENCODING": "utf-8",
"PYTORCH_MPS_HIGH_WATERMARK_RATIO": "0.0",
"PYTORCH_ENABLE_MPS_FALLBACK": "1"
}
}
}
}
81 changes: 81 additions & 0 deletions plugin/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# ToolUniverse Plugin for Claude Code

1000+ scientific research tools for biology, chemistry, medicine, and data science.

## Install

```bash
# 1. Register the marketplace from GitHub
claude plugin marketplace add mims-harvard/ToolUniverse

# 2. Install the plugin
claude plugin install tooluniverse@tooluniverse
```

Restart Claude Code. Done.

**Full install guide** (troubleshooting, API keys, offline zip install, version pinning): see the [`tooluniverse-claude-code-plugin`](../skills/tooluniverse-claude-code-plugin/SKILL.md) skill.

### Local development install

```bash
# From the repo root:
claude plugin marketplace add ./
claude plugin install tooluniverse@tooluniverse
```

## What's Included

- **MCP Server**: Auto-configured via `.mcp.json`. Provides `find_tools`, `list_tools`, `get_tool_info`, `execute_tool` — accessing 1000+ scientific APIs.
- **114 Research Skills**: Specialized workflows for genomics, drug discovery, clinical analysis, statistical modeling, data wrangling, and more.
- **Slash Commands**: `/tooluniverse:find-tools`, `/tooluniverse:run-tool`
- **Research Agent**: `/tooluniverse:researcher` — autonomous agent for complex multi-database research.

## Usage

```
# Discover tools (MCP — good for exploration)
/tooluniverse:find-tools protein structure prediction

# Run a single tool via CLI (one-off Bash query)
tu run UniProt_search '{"query": "BRCA1", "organism": "human"}'

# Research a question (auto-plans tool calls, uses SDK for batches)
/tooluniverse:research What are the top mutated genes in breast cancer?

# Launch research agent for complex multi-database questions
/tooluniverse:researcher What genes are associated with Alzheimer's disease?

# Or just ask — the router skill auto-dispatches
"What do we know about drug resistance mutations in EGFR?"
```

## Design Philosophy: CLI Default, SDK for Large Batches, MCP for Discovery

- **CLI** (`tu run`): Default for most tool calls — simple, direct, output flows into conversation naturally
- **Python SDK** (`from tooluniverse import ToolUniverse`): Use for large batches (5+ calls in a loop) — loads the registry once and avoids per-call startup overhead
- **MCP tools** (`find_tools`, `get_tool_info`): Best for discovering which tools exist and checking parameters

The plugin configures MCP for discovery and teaches the agent to use the CLI for most work, switching to the SDK only when looping over many items.

## API Keys (Optional)

Most tools work without API keys. For enhanced access:

| Key | Source | Free? |
|-----|--------|-------|
| `NCBI_API_KEY` | https://www.ncbi.nlm.nih.gov/account/settings/ | Yes |
| `SEMANTIC_SCHOLAR_API_KEY` | https://www.semanticscholar.org/product/api | Yes |
| `ONCOKB_API_TOKEN` | https://www.oncokb.org/apiAccess | Academic |

Set via environment variables or in the MCP server config.

## Update

The MCP server auto-updates via `uvx --refresh`. To update skills, re-install the plugin.

## Links

- [ToolUniverse Documentation](https://aiscientist.tools)
- [GitHub Repository](https://github.com/mims-harvard/ToolUniverse)
- [Tool Catalog](https://aiscientist.tools/tools)
Loading
Loading