← Back to Engineering Notes

May 14, 2026

Why MockForge Stayed Multi-Protocol

There's a reason almost every commercial mock service is HTTP-only. We picked the harder path anyway. This is the calculation behind it.

The shape of the market

When you look at the mock-services market — WireMock Cloud, Postman Mock Server, Beeceptor, Mocky.io — the pattern is identical. HTTP-only. Request matching by URL/method/header. Saved-example responses. The pricing is per-seat or per-request, and the value proposition is "save your team the time of running a stub server."

It's not a coincidence. HTTP is universal, easy to mock, and the demand is mostly from frontend or API-consumer teams who need a fake backend for development. Building one is a contained problem. Building a Kafka mock or a gRPC streaming mock is a different category of work — you're implementing a protocol, not parsing a request line.

Why we did it anyway

Two reasons.

Most production systems aren't HTTP-only. A typical service-oriented architecture today has REST APIs at the edge, gRPC between services, Kafka or NATS for async events, maybe a WebSocket layer for live data, SMTP for transactional email, and a sprinkle of legacy TCP somewhere. Mocking only the HTTP layer means your tests stop at the doorway. The interesting failure modes — partial Kafka delivery, gRPC deadline propagation, WebSocket reconnection storms — happen at the protocols nobody else mocks.

Spec-driven mocking generalizes better than collection-driven mocking. If your source of truth is "examples saved in a Postman collection," you're locked into one tool's editor and your mocks drift the moment the spec changes. If your source of truth is the proto file, the OpenAPI spec, or the GraphQL schema, the mock is regenerated from the contract automatically — and it covers every method, not just the ones someone remembered to add an example for.

The cost of the choice

It was real. Each new protocol meant a domain learning curve, a separate listener implementation, and a fresh set of edge cases — gRPC's deadline semantics, Kafka's consumer rebalancing, AMQP's prefetch, MQTT's QoS-2 four-step handshake. The Kafka work alone surprised us; we'd budgeted "a couple weeks for the wire protocol" and ended up shipping it across multiple releases as request types kept showing up that the JVM clients all assumed were trivial. Two years in, the codebase has a separate crate per protocol — mockforge-grpc, mockforge-kafka, mockforge-mqtt, and a few more — and a shared core that handles cross-cutting concerns like chaos injection, data drift, and the admin UI.

The win is that those concerns generalize across protocols. Add latency injection once, it works for HTTP, gRPC, and WebSocket simultaneously. The fault-injection primitives we wrote for the HTTP listener got reused verbatim when we added Kafka. The data-drift simulation that came with the OpenAPI work made gRPC responses feel realistic without separate effort.

When HTTP-only is actually enough

For frontend teams mocking a single REST API, an HTTP-only tool is fine — sometimes better, because the editor experience is more polished and the team already lives in Postman. We've watched users churn back to those tools for that exact reason and we don't think it's a mistake.

The question is whether your test surface stays HTTP-only as the company grows. Most don't. The first time someone needs to mock a Kafka topic for a CI test, the team starts shopping for something new — and the cost of switching mock tools mid-project is high. MockForge is a bet on teams that want to make the decision once.

What this implies for the product

A few things, in case it's useful for anyone making a similar bet:

Two years in, the bet looks right. Multi-protocol is the thing nobody else does — and the thing the teams who try us most often need.