A Python package for building and optimizing cheminformatics workflows using Bayesian optimization and LLM agents
cmxflow has 8 tools with moderate schema coverage but significant description and naming gaps. Tool names lack clear action verbs (build_workflow, set_workflow_inputs are vague). Most parameter descriptions are present but generic. Output schemas are undocumented. Error handling is minimal, no recovery guidance or actionable error messages. The server conflates multiple concerns in single tools (e.g., build_workflow handles 9 different actions). No tool annotations (readOnlyHint, destructiveHint). Descriptions average ~120 chars, below the 194-char baseline for A+ tools.
Build and manage cheminformatics workflows. Supports creating workflows, adding/removing blocks, validating, clearing, showing current state, making blocks parallel, and getting parameter information.
Get the status of a running or completed optimization task.
Load a previously saved workflow from a file.
Open a PyMOL session to visualize the last workflow output molecules in 3D.
Run Bayesian optimization to find optimal block parameters. Optimization runs in background and can be monitored with get_optimization_status.
Execute the current validated workflow on input molecules and write results to output file.
Save the current workflow to a file for later loading.
build_workflow conflates 9 distinct actions (create, add_block, remove_block, list_blocks, validate, clear, show, make_parallel, get_params) into a single tool with a string 'action' parameter. This violates single-responsibility principle and forces LLMs to reason about which action to invoke. Should split into separate tools: create_workflow, add_workflow_block, remove_workflow_block, list_available_blocks, validate_workflow, clear_workflow, show_workflow, make_workflow_parallel, get_block_parameters.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract required fields. E.g., run_workflow returns results but the response structure is invisible, does it return molecule_count, output_path, success_flag? Undocumented outputs force LLMs to guess and waste tokens parsing unstructured responses.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Set required inputs for the current workflow. Inputs can be file paths, text values, or parameter values.
Tool descriptions lack actionable context. 'Build and manage cheminformatics workflows' (build_workflow) does not explain WHEN to use it vs other tools, what prerequisites exist, or what the LLM should do next. Descriptions should follow: WHAT it does, WHEN to call it, WHAT it returns. Current descriptions average 120 chars; baseline for A+ is 194 chars.
No error handling guidance. If build_workflow fails to add a block (e.g., unknown block_type), the response is {'status': 'error', 'message': '...'} with no recovery hint. Should return: 'Unknown block type: ConformerGenerationBlock. Available blocks: [list]. Call list_available_blocks() to discover valid options.' This enables LLM self-correction.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). run_workflow, save_workflow, and open_pymol_session are destructive/write operations but carry no hint. get_optimization_status is read-only but unmarked. Annotations help LLMs reason about side effects and retry safety.