A standalone HTTP ToolServer for the OmniBioAI ecosystem.
This service implements the REST contract expected by
omnibioai-tes (Tool Execution Service, legacy package name: omnibioai-tes) HttpToolServerAdapter`, enabling secure, validated, and reproducible execution of REST-backed bioinformatics tools (e.g. Enrichr, annotation services, external APIs).
It is designed to run independently and be registered as a remote execution server in OmniBioAI TES.
The ToolServer exposes the following endpoints:
GET /capabilitiesAdvertise supported tools, engines, resources, and runtime policies.POST /validateValidate tool inputs and resource requests.POST /runsSubmit a tool execution request.GET /runs/{id}Retrieve run state (QUEUED,RUNNING,COMPLETED,FAILED).GET /runs/{id}/logsRetrieve execution logs.GET /runs/{id}/resultsRetrieve structured tool results once the run is completed.GET /healthService health check — returns{"ok": true, "service": "omnibioai-toolserver"}
This contract matches the expectations of
omnibioai-tes → HttpToolServerAdapter.
Engine:
http_toolserverTools:
enrichr_pathway— Pathway enrichment via Enrichr (REST, multipart-safe)david_annotation— Functional annotation via DAVID (REST)
Execution model:
- Stateless REST calls
- Structured validation
- Run lifecycle tracking
Designed for:
- OmniBioAI agents
- TES-controlled execution
- Future multi-tool expansion (OMIM, GO, UniProt, etc.)
cd~/Desktop/machine/omnibioai-studio
docker compose up -d toolserverAccess: http://localhost:9090
Via nginx: http://localhost/_svc/toolserver
pip install -r requirements.txt
uvicorn toolserver_app:create_app --factory \
--host 0.0.0.0 --port 9090 --reloadcurl http://localhost:9090/health
# {"ok": true, "service": "omnibioai-toolserver"}
curl http://localhost:9090/capabilities | python -m json.toolRegister this service as a server in omnibioai-tes:
- server_id: enrichment_remotedisplay_name: Enrichment ToolServeradapter_type: http_toolserverconfig:
base_url: "http://127.0.0.1:9090"Then submit runs through TES:
POST /api/runs/submitThe ToolServer is never called directly by the browser or LLM—all execution is mediated by TES.
- Create a new handler:
toolserver/tools/<new_tool>.py
Implement:
def_validate(inputs, resources) -> {
"ok": bool,
"errors": [],
"warnings": []
}
def_run(inputs, resources, log) ->Dict[str, Any]- Register the tool in:
toolserver/tools/__init__.py
registry.register(ToolHandler(...))- Restart the server.
The tool will be automatically advertised via /capabilities.
No changes are required in TES beyond refreshing server capabilities.
cd~/Desktop/machine/omnibioai-toolserver
pytest tests/ -v --cov=.
# 97% coverage (verified 2026-08-07; every toolserver/ module itself is# 100%, setup.py is the only file dragging the --cov=. total down)LLMs never execute tools directly
All execution is validated and audited
Strict separation between:
- intent (agents / UI)
- orchestration (TES)
- execution (ToolServer)
REST-first, container-friendly, and infrastructure-agnostic
| Service | Role |
|---|---|
omnibioai-tes | Primary consumer — routes HTTP tool requests to ToolServer |
omnibioai-api-gateway | JWT enforcement on all ToolServer requests |
omnibioai-control-center | Health monitoring (toolserver:9090) |
omnibioai-studio | Manages ToolServer container lifecycle |
| Feature | Status |
|---|---|
| Enrichr pathway enrichment | ✓ Stable |
| TES HttpToolServerAdapter integration | ✓ Stable |
| Health endpoint | ✓ Stable |
| REST tool lifecycle (submit/poll/results) | ✓ Stable |
| Test coverage | ✓ 97% (100% within toolserver/ itself) |
| Docker Compose deployment | ✓ Stable |