AssetOpsBench - Industry 4.0: A unified benchmark and framework for building, orchestrating, and evaluating domain-specific AI agents for Industry 4.0 asset operations and maintenance, with 460+ scenarios, 5 specialist agents (IoT, FMSR, TSFM, Work Order,...), and multi-agent orchestration blueprints (MetaAgent, AgentHive) over MCP.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport stdio counts 70 tools · 0 res
· 0 prompts
permission surface via code analysis
tools
-
add_failure_modes
-
assess_vibration_severity
-
asset_detail
-
asset_ids
-
assets
-
calculate_bearing_frequencies
-
characterize_series
-
compute_envelope_spectrum
-
compute_fft_spectrum
-
count_features
-
count_models
-
current_date_time
-
current_time_english
-
data_quality
-
deprecate_feature
-
deprecate_model
-
describe_candidates
-
describe_features
-
describe_models
-
diagnose_vibration
-
evaluate
-
extract_features
-
find_assets_by_sensors
-
find_models
-
generate_failure_modes
-
get_asset_catalog
-
get_failure_mode_catalog
-
get_failure_modes
-
get_feature
-
get_feature_lineage
-
get_model_lineage
-
get_result
-
get_run
-
get_sensor_catalog
-
get_vibration_data
-
hf_stats
-
history
-
installed_sensors
-
json_reader
-
latest_reading
-
list_domains
-
list_features
-
list_known_bearings
-
list_models
-
list_results
-
list_runs
-
list_tasks
-
list_vibration_sensors
-
measured_sensors
-
model_template
-
new_feature_version
-
new_model_version
-
profile_series
-
recipe_template
-
register_feature
-
register_finetuned
-
register_model
-
resolve_model
-
run_plan
-
run_recipe
-
run_tabular_recipe
-
search_features
-
search_models
-
select_features
-
sensor_coverage
-
sensor_stats
-
sites
-
stream_extent
-
update_feature
-
update_model
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit 3a7bd23 · analyzer v33 · 1w ago
danger signals1
- dynamic code execution eval()/exec() IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/engine/feature_runner.py :27
exec(code, ns) # noqa: S102 - intentional; sandbox in production
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 194
filesystem 47
- fs IBM-AssetOpsBench-3a7bd23/src/agent/claude_agent/runner.py :21
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/agent/claude_agent/tests/test_runner.py :8
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/deep_agent/runner.py :23
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/agent/deep_agent/tests/test_runner.py :9
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/direct_llm_agent/runner.py :14
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/openai_agent/runner.py :23
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/agent/openai_agent/tests/test_runner.py :8
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/opencode_agent/cli.py :12
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/opencode_agent/runner.py :20
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/agent/opencode_agent/tests/test_runner.py :6
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/plan_execute/executor.py :14
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/plan_execute/runner.py :17
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/runner.py :6
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/stirrup_agent/cli.py :14
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/agent/stirrup_agent/runner.py :34
import shutil - fs (weak) IBM-AssetOpsBench-3a7bd23/src/agent/stirrup_agent/tests/test_runner.py :12
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/agent/tests/test_runner.py :235
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/benchmark/scenario_suite_runner.py :32
import shutil - fs (weak) IBM-AssetOpsBench-3a7bd23/src/benchmark/tests/test_scenario_suite_runner.py :4
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/couchdb/init_data.py :56
with open(DEFAULT_MANIFEST_FILE) as f: - fs IBM-AssetOpsBench-3a7bd23/src/couchdb/loader.py :55
with open(COLLECTIONS_FILE) as f: - fs (weak) IBM-AssetOpsBench-3a7bd23/src/couchdb/tests/test_loader.py :2
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/evaluation/cli.py :8
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/evaluation/evaluator.py :14
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/evaluation/loader.py :7
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/evaluation/report.py :8
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/evaluation/runner.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/evaluation/tests/conftest.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/evaluation/tests/test_evaluator.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/evaluation/tests/test_loader.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/evaluation/tests/test_report.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/evaluation/tests/test_runner.py :6
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/mcphub/__init__.py :131
def open(self, name, cmd, env): - fs IBM-AssetOpsBench-3a7bd23/src/observability/file_exporter.py :18
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/observability/persistence.py :29
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/observability/tests/test_file_exporter.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/observability/tests/test_persistence.py :7
from pathlib import Path - fs IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/io/refs.py :104
json.dump(obj, open(p, "w"), indent=2, default=str) - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/tests/conftest.py :42
for doc in json.load(open(os.path.join(_SEEDS, "model_catalog.json"))): - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/tests/fake_hf_forecaster.py :37
with open(os.path.join(path, "config.json"), "w") as f: - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/tests/test_feature_catalog_store.py :11
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/tests/test_finetune_lifecycle.py :16
import shutil - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/tests/test_run_tools.py :259
payload = json.load(open(refs._path(r["results_file"]))) - fs IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :6
from pathlib import Path - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/utilities/tests/test_utilities.py :125
os.remove(tmp_name) - fs IBM-AssetOpsBench-3a7bd23/src/servers/vibration/sample_data/generate_synthetic_vibration.py :133
with open(out, "w") as f: - fs (weak) IBM-AssetOpsBench-3a7bd23/src/servers/vibration/tests/test_mcp_e2e.py :35
from pathlib import Path
shell / exec 1
- shell (weak) IBM-AssetOpsBench-3a7bd23/src/benchmark/scenario_suite_runner.py :33
import subprocess
network 5
- net IBM-AssetOpsBench-3a7bd23/src/couchdb/loader.py :31
import requests - net (weak) IBM-AssetOpsBench-3a7bd23/src/servers/iot/tests/test_couchdb.py :7
import requests - net IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/core/store.py :112
import requests # lazy - net IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/stores/model_store.py :188
import requests - net IBM-AssetOpsBench-3a7bd23/src/servers/wo/couch.py :16
import httpx
secrets 11
- secrets IBM-AssetOpsBench-3a7bd23/src/couchdb/loader.py :43
os.environ.get("COUCHDB_PASSWORD", "password"), - secrets IBM-AssetOpsBench-3a7bd23/src/llm/litellm.py :50
kwargs["api_key"] = os.environ["WATSONX_APIKEY"] - secrets IBM-AssetOpsBench-3a7bd23/src/servers/fmsr/main.py :32
COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD", "password") - secrets (weak) IBM-AssetOpsBench-3a7bd23/src/servers/fmsr/tests/conftest.py :8
os.environ.get("WATSONX_APIKEY") is None, - secrets IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :53
COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD") - secrets (weak) IBM-AssetOpsBench-3a7bd23/src/servers/iot/tests/conftest.py :21
password = os.environ.get("COUCHDB_PASSWORD") - secrets (weak) IBM-AssetOpsBench-3a7bd23/src/servers/iot/tests/test_couchdb.py :17
COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD", "") - secrets IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/core/store.py :120
os.environ.get("COUCHDB_PASSWORD", "password"), - secrets IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :29
COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD", "password") - secrets IBM-AssetOpsBench-3a7bd23/src/servers/vibration/couchdb_client.py :25
COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD") - secrets IBM-AssetOpsBench-3a7bd23/src/servers/wo/main.py :64
password=os.environ.get("COUCHDB_PASSWORD", "password"),
tool registrations 70
- get_failure_modes IBM-AssetOpsBench-3a7bd23/src/servers/fmsr/main.py :235
- generate_failure_modes IBM-AssetOpsBench-3a7bd23/src/servers/fmsr/main.py :301
- add_failure_modes IBM-AssetOpsBench-3a7bd23/src/servers/fmsr/main.py :357
- sites IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :184
- asset_ids IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :195
- asset_detail IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :230
- measured_sensors IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :301
- installed_sensors IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :339
- assets IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :383
- find_assets_by_sensors IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :441
- stream_extent IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :537
- history IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :644
- latest_reading IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :789
- sensor_coverage IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :885
- sensor_stats IBM-AssetOpsBench-3a7bd23/src/servers/iot/main.py :952
- list_tasks IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :129
- profile_series IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :156
- characterize_series IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :186
- data_quality IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :235
- list_features IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :300
- list_models IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :331
- search_models IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :360
- find_models IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :390
- describe_candidates IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :439
- describe_models IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :471
- count_models IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :522
- list_domains IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :545
- get_model_lineage IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :576
- register_model IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :606
- model_template IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :629
- register_finetuned IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :677
- update_model IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :728
- deprecate_model IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :752
- new_model_version IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :780
- resolve_model IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :860
- hf_stats IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :941
- count_features IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :976
- describe_features IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :996
- extract_features IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1044
- select_features IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1115
- search_features IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1194
- get_feature IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1236
- register_feature IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1269
- update_feature IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1302
- deprecate_feature IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1331
- new_feature_version IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1366
- get_feature_lineage IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1402
- recipe_template IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1447
- run_recipe IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1556
- run_tabular_recipe IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1666
- run_plan IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1730
- evaluate IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1769
- get_result IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1811
- list_results IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1830
- get_run IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1855
- list_runs IBM-AssetOpsBench-3a7bd23/src/servers/tsfm/main.py :1871
- json_reader IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :146
- get_sensor_catalog IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :161
- get_asset_catalog IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :178
- get_failure_mode_catalog IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :198
- current_date_time IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :221
- current_time_english IBM-AssetOpsBench-3a7bd23/src/servers/utilities/main.py :237
- get_vibration_data IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :136
- list_vibration_sensors IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :180
- compute_fft_spectrum IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :204
- compute_envelope_spectrum IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :242
- assess_vibration_severity IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :277
- calculate_bearing_frequencies IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :300
- list_known_bearings IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :330
- diagnose_vibration IBM-AssetOpsBench-3a7bd23/src/servers/vibration/main.py :336
declared dependencies 23
- fastmcp@>=2.14.5
- mcp@>=1.26.0
- couchdb3@>=2.0.2
- pendulum@>=3.2.0
- pydantic@>=2.12.5
- requests@>=2.32.5
- numpy@>=1.24
- pandas@>=2.0
- pyyaml@>=6.0
- litellm@==1.94.0
- openai@>=1.40.0
- claude-agent-sdk@>=0.0.14
- openai-agents@>=0.0.7
- deepagents@>=0.5.3
- langchain-mcp-adapters@>=0.2.2
- langchain-openai@>=1.1.0
- stirrup@>=0.1.12
- python-dotenv@>=1.0
- scipy@>=1.10.0
- sktime@>=0.30
- statsmodels@>=0.14
- PyWavelets@>=1.4
- granite-tsfm@>=0.3.5