# Biomni MCP Tool Scaling Experiment This experiment studies how Biomni behaves when the MCP tool background grows from about 100 tools to about 500, 1000, 1500, and 2000 tools on bioagent-bench. ## Generated Configs The configs are generated from `/225040511/project/Biomni/mcp_generated` and can be registered directly with Biomni: ```python from biomni.agent import A1 agent = A1(use_tool_retriever=True) agent.add_mcp( "/225040511/project/Biomni/experiments/bioagent_bench/configs/mcp_scale_100.yaml" ) ``` Generated files: - `configs/mcp_scale_100.yaml`: 10 MCP servers, 107 tools - `configs/mcp_scale_500.yaml`: 96 MCP servers, 504 tools - `configs/mcp_scale_1000.yaml`: 276 MCP servers, 1003 tools - `configs/mcp_scale_1500.yaml`: 378 MCP servers, 1527 tools - `configs/mcp_scale_2000.yaml`: 526 MCP servers, 2000 tools - `configs/mcp_scale_manifest.json`: exact server/tool counts and selected server order - `configs/mcp_server_inventory.json`: parseable MCP inventory The generator writes explicit `tools` metadata into YAML, so `A1.add_mcp()` does not have to start every server just to discover schemas. The runtime command for each tool still points to the corresponding generated MCP server file. ## Regenerate ```bash cd /225040511/project/Biomni python experiments/bioagent_bench/scripts/generate_mcp_scale_configs.py ``` The generator prioritizes benchmark-relevant tools first, then fills each tier by whole MCP server units until the target tool count is reached. ## Benchmark Design Use the tasks in `/225040511/project/bioagent-bench/src/task_metadata.json`. For each task, run Biomni once per tool tier: 1. Create a fresh run directory named like: `runs//_/` 2. Initialize Biomni with `use_tool_retriever=True`. 3. Register exactly one tier config with `agent.add_mcp(config_path=...)`. 4. Run the bioagent-bench task prompt with the same data policy used in your existing runs. 5. Save `retrieval_plan.json`, `execution_log.json`, `execution_log.txt`, `run_metadata.json`, `run_summary.json`, `output_validation.json`, and final deliverables in the run directory. Use identical model, decoding settings, timeout, conda environment, and benchmark data policy across tiers. Repeat each task at least 3 times if you want confidence intervals, because LLM tool retrieval and planning can vary. ## Metrics Metric definitions used here: - `Retrieval Recall@k`: fraction of task gold tools/servers present in the first `k` retrieved candidates from `retrieval_plan.json`. The table export uses a primary `k` value, defaulting to `10`. - `Workflow Validity`: whether observed tool/log evidence covers the task's gold workflow stages in order. - `Execution Success Rate`: whether benchmark output validation or required output paths indicate the pipeline completed. - `Context Tokens`: rough planning-context token count from `retrieval_plan.json/planning_context_text`. - `Planning Latency`: retrieval/planning latency recorded by the agent during tool selection. - `Hallucinated Tool Rate`: fraction of executed MCP tools mentioned in the execution trace that were not present in the retrieved candidate tool set persisted in `retrieval_plan.json`. - `Data-Type Mismatch Rate`: heuristic rate of execution attempts that emitted argument/schema/type mismatch errors, estimated from execution-log patterns. - `Biological Constraint Error Rate`: heuristic rate of execution attempts that violated benchmark biological/data constraints, such as sibling-task data access, truth/results access, or external installs/downloads. Gold tool and workflow definitions are in `gold_tools.json`. They are deliberately pattern based, because MCP wrapper names differ across generated servers. ## Aggregate Existing Runs ```bash python experiments/bioagent_bench/scripts/evaluate_mcp_scaling_runs.py \ --runs-root /path/to/runs/scale_100 \ --out experiments/bioagent_bench/results/scale_100_metrics.json ``` Run this once per tier, then compare the aggregate blocks or the exported table: - `results/scale__mcp_metrics.json` - `results/experiment1_scaling_table.json` - `results/experiment1_scaling_table.csv`