Measurement analysis for mechanical test engineers — load messy DAQ files, get answers in one command, and let your LLM drive the whole toolbox over MCP.
You ran the test. Now you have a CSV from one rig, a TDMS file from another, semicolons and decimal commas from the German lab, and a manager who wants a report. auto-manager reads all of it, figures out what each channel is (accelerometer? load cell? thermocouple?), runs the right analysis for each, and writes a self-contained HTML report with plain-English findings:
- Accel_X: dominant frequency 32.5 Hz, Q≈16, broadband RMS 0.84 g (further peaks: 120.0 Hz).
- Load: 186 fatigue cycles counted (rainflow, ASTM E1049), max range 24.6 kN; damage-equivalent constant-amplitude range 14.4 kN (m=5).
- TC_Air: 3 steady plateau(s) at 25.0, 85.1, −20.1; max transition overshoot 5.1.
- Force: possible clipping: 608 samples pinned at the minimum.
No project files, no wiring diagrams, no license server.
pip install "auto-manager @ git+https://github.com/Maxpeng59/auto-manager"
# or, inside a clone: pip install .Python ≥ 3.10. MDF/MF4 support is an extra: pip install "auto-manager[mdf] @ git+...".
automgr samples # writes 3 realistic demo datasets
automgr info samples/weld_fatigue_load.csv # channels, units, detected kinds
automgr report samples/bracket_vibration.csv --open # full HTML report
automgr fatigue samples/weld_fatigue_load.csv -c Last
automgr thermal samples/thermal_chamber.csvThe demo files are deliberately awkward — a German export with semicolons, decimal commas and a metadata preamble; a tab file with ISO timestamps — because that is what real DAQ exports look like.
| command | what you get |
|---|---|
automgr info FILE |
channels, units, auto-detected kinds, sample rate, duration, metadata |
automgr stats FILE [-c CH] |
min/max/mean/RMS/crest factor + data-quality flags (NaN gaps, clipping) |
automgr spectrum FILE -c CH |
Welch PSD: dominant peaks with Q estimates, broadband & band RMS |
automgr fatigue FILE -c CH |
rainflow cycle counting per ASTM E1049 (validated against the standard's worked example), range histogram, damage-equivalent ranges, optional Miner damage with your S-N parameters |
automgr thermal FILE [-c CH] |
soak plateau detection, ramp rates, controller overshoot |
automgr report FILE |
everything above, chosen per channel automatically, as one shareable HTML file with charts, findings and a provenance footer (source hash, tool version) |
automgr mcp |
all of it as MCP tools for Claude / any MCP client |
Every command works with zero flags on a well-formed file; every error message says what to do next (--rate when a file has no time column, channel suggestions on typos, ...).
- CSV / TXT / TSV — auto-detects delimiter (
,;tab), decimal commas, metadata preambles, separate unit rows, units embedded in headers (Load (kN),Accel [g]), datetime or elapsed-time columns, text status columns, NaN gaps. - TDMS (NI LabVIEW/DIAdem) — via npTDMS, including waveform timing and units.
- MDF / MF4 (CANape, INCA, ...) — via asammdf (
[mdf]extra).
The loaders normalise everything into one channel model, so a future live-DAQ backend feeds the same analyses.
Units and names are strongly conventional in test data. g/m/s² → acceleration → PSD. kN/µε/Nm → load/strain/torque → rainflow. °C/TC_1/PT100 → temperature → steady-state detection. You can always override by calling a specific analysis on any channel.
auto-manager ships an MCP server so a model can be your natural-language front end — "load bench_run_042.csv, tell me whether the 32 Hz mode shifted vs. Tuesday's baseline, and write me a report" — while the numbers come from real signal processing, not from a model's imagination.
# Claude Code
claude mcp add automgr -- automgr mcpExposed tools: measurement_info, channel_stats, spectrum, fatigue_rainflow, thermal_steady_states, channel_segment (inspect raw samples), generate_report, supported_formats. The model sees channel kinds and units, so it knows a kN channel gets rainflow, not an FFT.
import auto_manager as am
m = am.load("samples/bracket_vibration.csv") # any supported format
psd = am.welch_psd(m.channel("Accel_X"), m.sample_rate)
print(psd["peaks"][0]) # {'freq_hz': 32.5, 'psd': ..., 'q_estimate': 16.2}
fat = am.rainflow(m.channel("Load"), sn_exponent=5, sn_ref_range=80.0, sn_ref_cycles=2e6)
soaks = am.steady_states(m.channel("TC_Air"), m.sample_rate)
from auto_manager.report import generate_report
generate_report(m) # -> bracket_vibration.report.html- File-based analysis only. Live DAQ (LabJack, VISA/SCPI instruments) is the next milestone — the channel model is already designed for it.
- Steady-state detection is a windowed heuristic; its parameters (
--slope-limit,--min-duration) are exposed and echoed into results for reproducibility. - Miner damage needs your S-N parameters; the reference slopes (m=3, m=5) shown by default are labelled as assumptions, not material data.
- No unit conversion (a
lbfchannel stays in lbf) and no mean-stress correction yet. - Reports are generated automatically — review before you release them.
This is module 1 of a four-module plan for an AI-native hardware+software test bench (see research/2026-07-02-landscape-and-architecture.md for the full landscape study):
- Natural-language analysis over measurement files ← you are here
- Auto-control of external hardware (asyncio hardware-abstraction service as the LLM's tool surface; human approval on state-changing writes; simulation/dry-run backend)
- LLM-generated firmware for a fixed companion dev-board kit (two-domain firmware: frozen safety kernel + MPU-restricted app partition; sim→HIL pipeline; A/B rollback)
- Custom companion PCB (demand-gated)
uv venv && uv pip install -e ".[dev]"
uv run pytest # 47 tests, incl. ASTM E1049 vector & MCP stdio handshake
python examples/generate_sample_data.py # regenerate examples/dataMIT