ToolUniverse is a collection of tools, interfaces, and supporting components for building AI systems that perform scientific work. It is for developers creating AI scientist agents that use APIs, databases, machine-learning tools, and domain-specific utilities. The catalogue includes skills, commands, an MCP server, an agent, and a hook for working with the ecosystem.
Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add mims-harvard/ToolUniverse --skill devtu-remote-providergit clone --depth 1 https://github.com/mims-harvard/ToolUniverseWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/mims-harvard/tooluniverse/devtu-remote-provider)<a href="https://agentmods.dev/skills/mims-harvard/tooluniverse/devtu-remote-provider"><img src="https://agentmods.dev/badge/skills/mims-harvard/tooluniverse/devtu-remote-provider/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/mims-harvard/tooluniverse/devtu-remote-provider"><img src="https://agentmods.dev/badge/skills/mims-harvard/tooluniverse/devtu-remote-provider.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00093 | $0.08850 |
| Opus 5.5 | $0.00037 | $0.03540 |
| Sonnet 5.5 | $0.00019 | $0.01770 |
| Haiku 4.5 | $0.00009 | $0.00885 |
Grade A, and why
devtu-remote-provider scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 498 lines — stays where its author put it; the contents beside it link to each section on GitHub.
ToolUniverse remote provider
A remote tool is a model you host yourself, exposed over MCP. The contract lives
in src/tooluniverse/remote_resident/STANDARD.md; read it before changing a
provider. This page is how to apply it and how to read what it refuses.
The shape
agent ──MCP──> remote/<slug>/<slug>_mcp_server.py ToolUniverse's env, CPU only
│
│ Unix socket, one request at a time
▼
remote/<slug>/resident/<slug>_worker.py the model's own env
Two environments because their pinned stacks conflict. Boltz-2 needs torch
2.12.0+cu130 / triton 3.7.0 / numpy 1.26.4, which cannot be installed alongside
ToolUniverse's other 1000+ tools. The MCP server must not import the model's
dependencies, and the worker must not import ToolUniverse — the shared surface
is one dependency-free file (remote_resident/protocol.py) loaded by path.
Top mistakes
- Requiring the model's CLI at tool construction.
shutil.which("boltz")in__init__fails on a correctly separated deployment. Accept either route. - Trusting weights because the download exited 0. A
boltz2_conf.ckptarrived as 1.2 % of itself and served predictions for a month. Declaresizeandsha256; nothing is fetched implicitly at request time. - Starting the model per request. Measured on a GB10: 110 s per call as a subprocess, ~54 s held. Most of the difference is not kernels — it is CUDA graphs captured on one request and replayed on the next, which a worker that exits cannot collect.
- Letting a worker outlive its server.
start_new_session=Truekeeps a Ctrl-C from killing a prediction, and also orphans the worker; SIGKILLing the MCP server left two processes holding the GPU. Workers need the idle timeout and the orphan watchdog. - Claiming
status = "verified"without hardware. It must carryverified_on. A bare "verified" claims every machine. - Hashing gigabytes on every check. Use the digest memo; pass
deep=Trueonly in setup, where what is certified should have been read. - Forgetting package data. A built wheel carries only
.pyunderremote/. Provider JSON,provider.toml, lock files, smoke inputs and the R halves of R-backed providers need globs inpyproject.toml. - Believing exit 0. OpenFold3's smoke exited 0 in 29 s, reported a GPU
peak, and produced no structure: upstream caught the per-query exception,
wrote "Failed Queries: 1" to a summary file and returned normally. Declare
[runtime] outputs(globs) oroutput_keys(reply fields); the manifest refusesstatus = "verified"without one and the smoke step refuses when nothing matched. - Quoting a budget from the smoke. RFdiffusion3's 60-mer smoke reserves 2.12 GiB; a 400-residue, 4-design request reserves 12.49. When peak tracks input size, measure a ladder and declare the envelope alongside the number.
- Forking a loader out of a resident worker. The parent has CUDA and the
kit's threads initialised long before a request arrives. Set
num_workers = 0unconditionally — it is a property of the resident route, not of one kit. - Accepting a smoke as verification. One request is not a test of a resident provider. openfold3 produced five real structures and then failed deterministically on the SECOND request of the same shape, because a lever dropped a CUDA graph on moved storage while keeping its emptied pool handle. Run at least four consecutive identical requests, then a mixed-shape sequence. Four different shapes pass on a build that cannot serve a repeat.
- Assuming
levers_offreaches the kit. boltzgen'smodes.pynever readsMODEL_OPT_LEVERS_OFF, and itsstack.activate()overwrites a caller's value for any switch the mode exports. Check the ACTIVE line: if the lever is still listed the door did not open, and shipping the setting anyway is worse than saying so. - Quoting wall times from a contended card. The same fold read 15-19 s
quiet and 28-56 s with another session on the GPU. Peak reserved reproduced
to the hundredth of a GiB in both. Report peaks from any run; report wall
times only from an idle card. And utilisation alone is not evidence that
YOUR process is computing — a 40-minute boltzgen stall was read as progress
because the card showed 86-91%, which belonged to someone else. The usable
signal is utilisation plus
/proc/<pid>/statCPU, on a quiet card. - Letting a library fork.
num_workers = 0covers the loader and nothing else. boltzgen's DataLoader worker sat intorch.cdist→at::parallel_for→ an OpenMP region, alive and at 0% CPU, waiting on a poolfork()did not carry over — up only because the kit's levers had done host-tensor work during activation. The rule that covers all three observed shapes: a resident worker that has run any host-tensor work must not let a library fork, and[kit.env] OMP_NUM_THREADS = "1"is the cheapest guarantee. - An
outputsglob that matches a file written regardless of success. boltzgen'sconfigurewritesdesign_spec.cif— a picture of the specification — whether or not anything is designed, so*.cifwould have passed a run that produced nothing. Test the glob against a failing run, not only a passing one. - Reading four identical requests as the acceptance test. They are the WEAKER half. A held engine is built once and replayed, so N identical requests exercise exactly one build — they cannot show the worker can build a SECOND one. genie3 would have passed four and raised on the first request that changed its engine key, because upstream's sampling config is a module-level mutable permitting one build per process. Run four identical requests then at least one that changes the engine key; the rebuild is the danger, not the new shape. Before writing a worker, call the upstream config or model builder twice in one process — one minute, and invisible to the repeats test.
- An input ceiling that the budget cannot cover. progen2's tool allowed 16 sequences × 1024 tokens; each is sane, the product costs 116.93 GiB, essentially the whole card. Bound the product, and check the ceilings against the budget rather than only against each other.
- Trusting a probe that does nothing afterwards. protenix's stock LayerNorm
emits SASS with no PTX above sm_100, so the call returns,
synchronize()PASSES, and the next unrelated op raisesno kernel image is available. The first probe printed "LAUNCH OK" twice because it stopped there. - Assuming a wheel that installs will run. tokenizers 0.10.x publishes
well-formed aarch64 wheels that
Illegal instruction (core dumped)at import. In a worker that is asmoke_protocolerrorwith no traceback, because SIGILL is uncatchable. Import every compiled pin in[env] verify. - Assuming pip honours requirement order. A lock with two CUDA generations
gets whichever of a colliding pair pip reaches last — measured,
libcudnn.so.9at 124,920 bytes instead of 6,328,728. Declare ordered passes with# --- pass break ---. - Sizing an ablation to the smoke. Every kernel lever of the atlasfold kit
is gated at
min_tokens = 512; its 35-residue smoke exercises none. Seven ablated levers fold 35 residues and abort at 600; thirteen fold both. Size the ablation for the largest input the provider accepts — and check whether stock itself survives that size, because atlasfold's does not.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 498 lines · 93 tokens per session scan A c7086330a9a0
devtu-remote-provider is a skill published in the GitHub repository mims-harvard/ToolUniverse (1,754 stars, last pushed 2d ago), licensed Apache-2.0. It adds 93 tokens to every session and 8,850 once invoked, about $0.0004 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-10-20.
Other skills, from other repositories
ai-agent-tool-routing
Use when designing or reviewing an AI agent tool registry or MCP router: document parameter schemas, caller authorization, execution limits, replay-safe retries and verification evidence.
azure-resource-manager-sql-dotnet
Azure Resource Manager SDK for Azure SQL in .NET. Use for MANAGEMENT PLANE operations: creating/managing SQL servers, databases, elastic pools, firewall rules, and failover groups via Azure Resource Manager. NOT for data plane operations (executing queries) - use Microsoft.Data.SqlClient for that. Triggers: "SQL…
azure-mgmt-botservice-dotnet
Azure Resource Manager SDK for Bot Service in .NET. Management plane operations for creating and managing Azure Bot resources, channels (Teams, DirectLine, Slack), and connection settings. Triggers: "Bot Service", "BotResource", "Azure Bot", "DirectLine channel", "Teams channel", "bot management .NET", "create bot".
airunway-aks-setup
Set up AI Runway on AKS — from bare cluster to running model. Covers cluster verification, controller install, GPU assessment, provider setup, and first deployment. WHEN: "setup AI Runway", "onboard AKS cluster", "install AI Runway", "airunway setup", "deploy model to AKS", "GPU inference on AKS", "KAITO setup on…
azure-cloud-migrate
Assess and migrate cross-cloud workloads to Azure with reports and code conversion. Supports Lambda→Functions, Beanstalk/Heroku/App Engine→App Service, Fargate/Kubernetes/Cloud Run/Spring Boot→Container Apps. WHEN: migrate Lambda to Functions, AWS to Azure, migrate Beanstalk, migrate Heroku, migrate App Engine, Cloud…
gateway-workers
Build, debug, or review Cloudflare Workers invoked by the Forward action in Gateway HTTP policies, including the GatewayMiddleware entrypoint, Gateway types, context, and continuation.