go-mdbus-mcp Part 2: Git History as an Engineering Timeline
A stage-by-stage story of how go-mdbus-mcp moved from a fast prototype to a safer, test-driven release.
On this page
go-mdbus-mcp Build Story — this post is part of a series
- Part 1: go-mdbus-mcp Part 1: Why This Stack and Architecture
- Part 2: go-mdbus-mcp Part 2: Git History as an Engineering Timeline
- Part 3: go-mdbus-mcp Part 3: Benchmark Results and Competitive Comparison
Part 1 covered stack and architecture. This part tells the build journey as it actually happened.
Stage 1: make it talk to real devices #
The first version was straightforward: read data from Modbus and expose it to an MCP client.
That sounds simple until you run it against real hardware for more than a few minutes. Idle disconnects, timeout edges, and inconsistent field behavior show up immediately. Early work in this stage focused on making read/write paths functionally complete and getting the project into a usable modular shape.
At this point, it was a useful prototype, but still fragile.
Stage 2: stop treating reliability as an afterthought #
The next wave of changes came from operational pain:
- reconnect behavior needed to be explicit,
- default tool inputs needed safer behavior,
- write operations needed policy gates,
- recovery settings needed to be tunable.
Instead of only adding new tools, the project started to define “safe behavior under bad conditions” as a first-class requirement.
This is usually the stage where projects either become trustworthy or stall as demoware.
Stage 3: move from raw addresses to semantic operations #
Once the core was stable, developer and operator ergonomics became the bottleneck.
Raw register addressing works for protocol experts, but it is a poor fit for AI-assisted workflows and team collaboration. The project added semantic tag mapping, CSV-driven definitions, typed reads/writes, and mock mode for no-hardware validation.
That changed day-to-day usage from:
“Read register 40017”
to:
“Read line_pressure”
The difference is not cosmetic. It improves clarity, reviewability, and safety.
Stage 4: prove behavior, don’t just claim it #
After feature depth and reliability work, the question shifted to evidence.
A staged validation model was introduced:
- protocol and core behavior,
- policy and negative paths,
- stress/performance,
- external comparison against other MCP servers.
This stage turned the project from “looks solid” into “can be evaluated consistently.”
Release progression as maturity markers #
The release tags (v0.0.1 to v0.0.4) map to visible maturity shifts:
- from basic functionality,
- to MCP alignment and safer defaults,
- to semantic usability and broader verification,
- to stronger typed-write coverage and competitive validation.
What this journey taught me #
- Reliability work is not separate from product work; it is product work.
- Semantic abstractions are not “extra” for industrial systems; they reduce human error.
- Benchmarks matter only when backed by repeatable methodology.
In Part 3, I cover that benchmarking and external comparison setup in detail.
Next: go-mdbus-mcp Part 3: Benchmark Results and Competitive Comparison