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_toolserver -
Tools:
enrichr_pathway— Pathway enrichment via Enrichr (REST, multipart-safe)
-
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_remote
display_name: Enrichment ToolServer
adapter_type: http_toolserver
config:
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=.
# 100% coverage-
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 | ✓ 100% |
| Docker Compose deployment | ✓ Stable |