All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Embedded dashboard now includes the connection-management UI — the 0.7.0 binary bundled an older build of the web dashboard, so the unified connections view that accompanies 0.7.0's connection-management backend was not present in the embedded UI. The bundled dashboard has been rebuilt so the connections view ships in the binary.
- WebSocket connection management API —
GET /websocket/connections,GET /websocket/connections/{id},DELETE /websocket/connections/{id},POST /websocket/connections/{id}/send,GET /websocket/statsadded to the Admin API for real-time visibility, control, and server-initiated messaging of active WebSocket connections - SSE connection management API —
GET /sse/connections,GET /sse/connections/{id},DELETE /sse/connections/{id},GET /sse/statsfor managing active SSE connections with auto-disconnect on mock update - SSE response type improvements — SSE connection list responses now include full stats alongside connections
- MQTT connection management API —
GET /mqtt-connections,GET /mqtt-connections/{id},DELETE /mqtt-connections/{id},GET /mqtt-connections/statsfor managing active MQTT client connections with connection time tracking - gRPC stream tracking and management —
GET /grpc/connections,GET /grpc/connections/{id},DELETE /grpc/connections/{id},GET /grpc/statsfor managing active gRPC streaming RPCs with proper Canceled vs Unavailable status codes - CLI connection management commands —
mockd connections list,mockd connections get,mockd connections closefor all protocols (WebSocket, SSE, MQTT, gRPC) - Connection management UI — unified connections view in the web dashboard showing all active connections across protocols with real-time stats, search, and filtering
- WebSocket auto-reconnect on mock update — updating or deleting a WebSocket mock now automatically closes all active connections with close code 1012 (Service Restart) so clients reconnect and pick up the new configuration immediately
- Workspace-scoped stateful resources — stateful resources, custom operations, and request logs are now isolated per workspace
--workspacepersistent CLI flag — scope any CLI command to a specific workspace without switching context?workspaceId=API parameter — all admin API endpoints now accept workspace filtering- MCP workspace filtering — MCP tools automatically scope to the session's active workspace
manage_workspace createMCP action — create workspaces directly from AI agents
- gRPC: multiple mocks on one RPC (#30) — multiple gRPC mocks on the same service+method with different match conditions are now supported via ordered match variants (a specific match always wins over an unconditioned default, regardless of the order they were added), instead of the second mock being rejected or silently overwriting the first.
- GraphQL
__typenameon nested objects (#32) — nested objects now resolve__typenameto the actual schema type name instead of the hardcoded"Object". - Proxy mode always returning 502 (#35) — a request sent directly to the proxy in origin-form (without configuring the client to use it as an HTTP proxy) no longer self-loops into a 502; it returns a clear
400with guidance. - gRPC stream cancellation —
DELETE /grpc/connections/{id}(and cancel-on-mock-update) now reliably unblocks an idle stream and returnscodes.Unavailable, instead of returning200while the stream stayed blocked. - SSE active-connections gauge leak — closing SSE connections via a mock update now decrements the active-connections gauge.
- Quick installer hardened (#34) —
install.shnow fails loudly on a missing or invalid release asset (usescurl -f) instead of silently writing an HTTP error body as the binary or its checksum.
- Admin API: cross-origin localhost takeover via the localhost auth bypass — When the Admin API key was enabled with the default localhost bypass, a website opened in a browser on the same machine could drive the Admin API without a key: the bypass trusted any request from the loopback socket, but a browser
fetch()from any origin also originates from loopback, and the Admin API additionally returnedAccess-Control-Allow-Origin: *. The localhost bypass now refuses cross-site / foreign-origin browser requests (identified via the unforgeableSec-Fetch-*headers, with anOriginfallback) and validates theHostheader against the loopback allowlist as an anti-DNS-rebinding control; the same gating is applied to the engine-registration endpoints. The Admin API CORS default no longer echoes arbitrary origins — it allows loopback origins only. Non-browser clients (themockdCLI and MCP client) keep keyless localhost access for read-only requests. Reported by an external researcher against v0.6.5. - Admin API: unauthenticated
/openapi.jsonand/insomnia.jsonexports — The dashboard static-asset auth exemption matched any request path ending in.jsonor.map, which exposed the OpenAPI and Insomnia exports — the full mock configuration, which can embed credentials and internal URLs — without the API key even when auth was enabled. The exemption no longer matches by those extensions, so both exports now require authentication, consistent with their/openapi.yamland/insomnia.yamlequivalents. Reported by an external researcher against v0.6.5. - Toolchain and dependency updates for stdlib/library CVEs — Go build and CI pinned to 1.26.4 (fixes the
net/textprotoGO-2026-5039,crypto/x509GO-2026-5037,net/mail,html/template,net, andnet/httpstandard-library advisories) andgolang.org/x/netbumped to v0.55.0 (fixes theidnaGO-2026-5026 andhttp2GO-2026-4918 advisories).
- Hosted tunnel relay paused — The hosted relay at
relay.mockd.iois temporarily offline.mockd tunnelandmockd up --tunnelagainst the default endpoint now print a clear message; point--relay <host[:port]>at a self-hosted relay to use tunnels in the meantime.
- Go 1.25.7 → 1.26.1 — Fixes 5 stdlib vulnerabilities: GO-2026-4599 and GO-2026-4600 (crypto/x509), GO-2026-4601 (net/url), GO-2026-4602 (os), GO-2026-4603 (html/template)
- mTLS CN/OU filtering uses
VerifyConnection— ReplacedVerifyPeerCertificatecallback withVerifyConnection, which is invoked on every connection including resumed TLS sessions, preventing potential bypass via session ticket resumption
- All gosec/staticcheck findings resolved — 30 findings across 18 files addressed with golangci-lint v2.11.2: targeted
//nolintannotations for false positives (taint analysis on config-sourced data),fmt.Fprintfrefactors to avoid unnecessary allocations, and file-level G120 exclusion for mock OAuth handler
0.5.0 - 2026-03-05
- Embedded web dashboard — Built-in Svelte UI served from the admin port (
http://localhost:4290) in release builds. Manage mocks for all 7 protocols visually with a VS Code-style tabbed editor, command palette (Ctrl+K), mock tree with folders/search/sort, request log viewer with near-miss debugging, recording sessions, stateful resources, custom operations, workspace management, and import/export dialogs. No extra flags needed — included in Docker images and all release packages - Workspace base path routing — Workspaces can define a
basePaththat prefixes all mock routes in that workspace, enabling namespace isolation across teams. Routes are automatically rewritten at the engine level with per-engine root alias support - Route collision detection — Namespace-level detection prevents conflicting routes across workspaces. Same-workspace duplicate paths are allowed for priority-based matching
- gRPC inline proto support —
mockd add grpc --proto-content '...'accepts inline protobuf definitions, andprotoFilefield now supports import-from-file semantics for config files - Stateful chaos faults — Four new advanced fault types:
circuit_breaker(CLOSED/OPEN/HALF_OPEN state machine),retry_after(429/503 with Retry-After header),progressive_degradation(increasing latency per request),chunked_dribble(timed chunk delivery) - Chaos fault introspection API —
GET /chaos/faultsreturns live state of all active stateful fault instances - Manual circuit breaker control —
POST /chaos/circuit-breakers/{key}/tripandPOST /chaos/circuit-breakers/{key}/resetfor manual state override - MCP tools for stateful faults —
get_stateful_faults,manage_circuit_breaker, enhancedset_chaos_configwith rawrulesparameter - Chaos config from YAML —
serverConfig.chaossection in YAML config files applied at startup mock://chaosMCP resource enhanced — Now includes stateful fault status
- Dashboard PATCH, CSP, and CORS — Enabled PATCH method for mock updates, relaxed Content-Security-Policy for embedded UI, and configured CORS for local development
- Workspace assignments for local engine —
GET /enginesnow properly populates workspace assignments - Docker prerelease tags — Skip
latest/major/minor Docker tags on prerelease builds to avoid polluting stable tags - Dashboard dist download — Release workflow uses matching tag for cross-repo artifact download with latest-release fallback
0.4.7 - 2026-02-28
- Schema-driven response generation — OpenAPI imports now auto-generate realistic responses using faker functions. Maps JSON Schema formats to faker types (16 format mappings), respects constraints (min/max, enum, minLength, minItems), handles
$refwith cycle detection,allOfmerging,oneOf/anyOf. 60+ tests - Multi-engine fan-out (CP/DP Phase 1) — Mock writes now fan out to all registered engines in parallel with per-engine error handling. Dedup prevents double-push to local engine
- Template engine unification — MQTT templates now use the same engine as all other protocols. All 34 faker types work in MQTT context. Removed 200+ lines of duplicate code
mockd enginecommand — Headless engine mode for CI:mockd engine --config mocks.yaml. No admin API, auto-port assignment with--port 0 --print-url, health endpoint- Mockoon import —
mockd import mockoon environment.json. Converts routes, Handlebars templates, Faker.js helpers, and CRUD routes to mockd format - Seeded reproducible responses —
?_mockd_seed=42orX-Mockd-Seed: 42header for deterministic faker/random/uuid output. Per-mockseedconfig field. Same seed = identical response every time - Stateful chaos faults — Circuit breaker, retry-after, progressive degradation, chunked dribble fault types with full admin API + MCP integration
- Template engine and chaos bugs — Case-insensitive faker, chaos config JSON shape, Mockoon import edge cases
- Chaos config DRY/KISS — Canonical converter in
chaos_convert.go, eliminated 3-way duplication - Request template case sensitivity —
{{request.header.X-Id}}now case-insensitive
0.4.6 - 2026-02-28
- CI smoke tests — setup-mockd action compatibility job, smoke tests against released binary
- Agent configs — Windsurf, JetBrains, Copilot MCP configuration files deployed to standard locations
- Documentation audit — 23 doc pages updated across two audit phases: fixed stale protocol lists, incorrect examples, missing chaos config reference, inaccurate CRUD pagination defaults, TLS/validation/JSON schema errors
- WireMock comparison table — Corrected protocol support claims
0.4.5 - 2026-02-27
- Near-miss debugging — When no mock matches a request, the 404 response now includes a
nearMissesarray with detailed field-by-field breakdown (method, path, headers, query params) showing what almost matched and why. Each near-miss includes match percentage, score, and a human-readable reason likepath matched, but method expected "GET", got "DELETE". Response includesX-Mockd-Near-Missesheader with count - Unmatched request filtering —
GET /requests?unmatchedOnly=truereturns only unmatched requests. CLI:mockd logs --requests --unmatched. MCP tool:get_request_logswithunmatchedOnly: true. Near-miss data is attached to request log entries for post-hoc debugging mockd mcpauto-start — MCP server now auto-starts a background daemon if no mockd server is running, so AI assistants work with zero setup. The daemon survives the MCP session and is shared across multiple sessions. Use--data-dirfor project-scoped isolation with a separate daemon. Stop withmockd stop--chaos-profilestartup flag —mockd serve --chaos-profile flakyapplies a built-in chaos profile at startup. Available profiles:slow-api,degraded,flaky,offline,timeout,rate-limited,mobile-3g,satellite,dns-flaky,overloaded. Validates profile name and rejects conflicting flags (--chaos-enabled,--chaos-latency,--chaos-error-rate)- goreleaser-based release pipeline — Migrated from hand-rolled CI to goreleaser v2 with: deb/rpm/apk Linux packages (via nFPM), cosign keyless signing (Sigstore), SBOM generation (Syft/SPDX), multi-arch Docker images (amd64 + arm64), Scoop bucket for Windows, shell completions in archives,
-trimpathreproducible builds
- Bare binary checksum sidecars — goreleaser
format: binaryarchives don't produce standalone files indist/; release workflow now extracts checksums fromchecksums.txtfor setup-mockd compatibility
0.4.4 - 2026-02-27
- Stateful Protocol Bridge — SOAP operations can now read/write stateful CRUD resources that were previously HTTP-only. A REST
POST /api/userscreates a user that a SOAPGetUsercan retrieve, and vice versa. All protocols share the same in-memory state store. - SOAP stateful operations — New
statefulResourceandstatefulActionfields on SOAP operation configs wire operations directly to stateful resources with automatic XML↔map conversion and SOAP fault mapping - Custom operations with
expr-lang/expr— Define multi-step operations that compose reads, writes, and expression-evaluated transforms against stateful resources (e.g.,TransferFundsthat debits one account and credits another atomically) - WSDL import —
mockd soap import <wsdl-file>generates SOAP mock configs from WSDL 1.1 service definitions with--statefulflag for automatic CRUD heuristics; WSDL also supported viamockd import service.wsdl customOperationstop-level config — YAML/JSON configs can define custom operations with named step pipelines (read,update,delete,create,set) and response expression maps- Cross-protocol state verification — Integration tests proving REST↔Bridge (SOAP path) bidirectional state sharing
- WSDL format in admin API —
GET /formatsnow includes WSDL in supported import formats - Config export completeness —
Export()now includesstatefulResourcesandcustomOperations(previously only exported mocks) - Config merge completeness —
MergeProjectConfigs()now mergescustomOperationsby name - Custom-op validation CLI improvements —
mockd stateful custom validatenow supports--strict(fail on warnings) and--check-expressions-runtimewith--fixtures-filefor no-write runtime expression checks before registration - MCP tool expansion — 16 multiplexed tools (consolidated from 19 via action-based dispatching):
manage_mock,manage_state,manage_context,manage_workspace, plus 3 chaos tools (get_chaos_config,set_chaos_config,reset_chaos_stats), 3 verification tools (verify_mock,get_mock_invocations,reset_verification), custom operations tool (manage_custom_operation), and 2 MCP resources (mock://chaos,mock://verification/{mockId}) - 10 built-in chaos profiles — Pre-configured chaos scenarios:
slow-api,degraded,flaky,offline,timeout,rate-limited,mobile-3g,satellite,dns-flaky,overloaded. Apply withmockd chaos apply <name>orPOST /chaos/profiles/{name}/apply - 23 new faker types (34 total) — Internet (
ipv4,ipv6,macAddress,userAgent), Finance (creditCardwith Luhn validation,creditCardExp,cvv,currencyCode,currency,iban), Commerce (price,productName,color,hexColor), Identity (ssn,passport,jobTitle), Geo (latitude,longitude), Text (words,slug), Data (mimeType,fileExtension). Parameterized syntax:{{faker.words(5)}} POST /state/resourcesendpoint — Dedicated REST endpoint for creating stateful resources at runtime through all layers (engine → admin → CLI → MCP), replacing the previousImportConfigwrappermockd verifyCLI command — Full verification command tree (status,check,invocations,reset) for asserting mock call counts and inspecting request details from the CLI.checkreturns non-zero exit codes on failure for CI scripting. Supports--exactly,--at-least,--at-most, and--neverassertion flags- MCP Registry metadata —
server.jsonfor official MCP Registry submission (io.mockd/mockd) with OCI container label for registry verification
- SOAP validation rejected stateful operations — Validator required
responseorfaulton every SOAP operation, blocking stateful-only operations that get their response from the stateful resource. Now acceptsstatefulResourceas a valid alternative. - Custom operations silently ignored —
loadCollection()parsedcustomOperationsfrom config but never registered them on the stateful Bridge. They now wire through correctly. - StatefulAction validation — Added validation that
statefulActionis a valid CRUD action and thatstatefulResourceandstatefulActionare set together (both or neither) - MCP drift — GetStats endpoint —
get_server_statuswas calling/statsinstead of/status, returning empty data. Fixed to call the correct endpoint - MCP drift — toggle_mock atomicity —
toggle_mockwas using GET+PUT workaround instead ofPATCH /mocks/{id}. Fixed to use atomic PATCH - Chaos config JSON shape — MCP
set_chaos_configwas sending flat fields (latencyMinMs,errorRate) but admin API expects nested typed structs (latency.min,errorRate.probability). Fixed to build correct nested shape. Profile activation usesPOST /chaos/profiles/{name}/applyendpoint - Data race in engine handler tests — Added mutex to
mockEngineServerinengine_handlers_test.goto eliminate race condition in CI --chaos-enabledstartup flag was dead code —mockd serve --chaos-enabled --chaos-error-rate 0.5created a chaos injector but never wired it to the engine. Chaos flags now apply via the engine control API after health check, same path as runtimemockd chaos apply
- Added
github.com/expr-lang/exprv1.17.8 for expression evaluation in custom operations (zero transitive dependencies, ~0.5MB)
0.4.0 - 2026-02-24
- Auto-generate mock IDs — config files no longer require
idfields;fillMockDefaults()generates deterministic IDs and inferstypefrom populated spec fields (DX-1) - Flexible
response.body— YAML/JSON config now accepts objects and arrays directly forresponse.body(auto-marshaled to JSON string); customUnmarshalJSON/UnmarshalYAMLon bothmock.HTTPResponseandconfig.HTTPResponse(DX-5) - Import from stdin —
mockd import -orcat mocks.yaml | mockd import(DX-2) - Import directories —
mockd import ./mocks/recursively loads.yaml,.yml, and.jsonfiles (DX-3) --statefulflag onmockd add—mockd add http --path /api/users --statefulcreates a stateful CRUD resource in one command (DX-4)- Doc config regression test —
tests/unit/doc_config_test.goscans all doc.mdfiles, extracts YAML/JSON config blocks, and validates them throughconfig.ParseYAML/ParseJSON
- 24 documentation bugs found by live-testing every example across all 30 doc files against a running mockd server:
tls-https.md:mockd cert generateandmockd cert generate-cacommands don't exist; replaced with--tls-autoflag and OpenSSL commands; fixed--https/--cert/--key→--tls-auto/--tls-cert/--tls-key/--https-portobservability.md: Prometheus metric names corrected (mockd_http_requests_total→mockd_requests_total,mockd_http_request_duration_seconds_bucket→mockd_request_duration_seconds_bucket); added 3 missing metricsvalidation.md: Error response format corrected to includelocation,code,received,expected,hintfieldsresponse-templating.md: Removed 7 non-existent template functions; added documentation for actual functions (faker.*, sequence(), uuid.short, etc.)mqtt.md: Allmqtt subscribeexamples were missing requiredbroker:portpositional argumentreplay-modes.md: Replay start response fieldreplayId→sessionId; statusconfigobject → top-levelmodestream-recording.md: Start response format, recordingformatVersion→version, stats field names correctedgrpc.md:-Iflag →--import;grpc listoutput format correctedwebsocket.md: Non-upgrade response returns 404, not 400sharing-mocks.md: Non-existent--keepaliveflag;--mqtttunnel-quic onlystateful-mocking.md: List response format (plain array → paginated{data, meta}); IDs (integers → UUIDs)chaos-engineering.md:PUT /chaosbody format (flat → nested objects)mock-verification.md: 3 wrong response field namestroubleshooting.md:--limit→--lines; missing--requestsflag- Plus fixes in concepts.md, request-matching.md, admin-api.md, configuration.md, json-schema.md, crud-api.md, integration-testing.md, sse.md, cli.md, proxy-recording.md, basic-mocks.md, import-export.md
- README examples corrected (chaos, stateful, proxy, import sections)
0.3.3 - 2026-02-23
- Positional type argument for
mockd add—mockd add http --path /apinow works alongsidemockd add --type httpandmockd http addsyntax forms --mutationshorthand flag for GraphQLaddcommands (bothmockd add graphqlandmockd graphql add)--actionflag alias for--operationon the unifiedaddcommand (SOAP consistency)--jsonoutput standardization across all non-streaming CLI commands viaprintResult/printListhelpers- 18
--jsoncontract tests ensuring structured output compliance - Comprehensive docs overhaul: expanded all 7 protocol pages with CLI
addsections, new chaos engineering and import/export guides, rewritten quickstart, expanded troubleshooting
mockd psnow handles both PID file formats (serve/start vs up/down) without crashing- Duplicate workspace name creation now correctly returns 409 Conflict
- Engine startup rollback on HTTP/HTTPS listen failures no longer leaks resources
- gRPC docs output example corrected (was showing merge format for initial creation)
- Broken links in sharing-mocks guide fixed
- Installation docs updated with Homebrew tap and get.mockd.io script
- README overhauled with comparison table, demo GIF, and tighter structure (369→212 lines)
- goreleaser homepage corrected to mockd.io, description updated
- Homebrew auto-update job enabled in release workflow
0.3.2 - 2026-02-22
- MQTT broker deadlock —
Broker.Stop()held the write lock while callingsimulator.Stop(), which waits for goroutines that need the read lock via mochi hooks. Moved simulator shutdown outside the lock so in-flight publishes can drain - Benchmark workflow port collision on CI runners (moved to non-colliding ports 14280/14290)
- Binary size test threshold bumped to 45 MB for Cobra + Charmbracelet huh dependencies
0.3.1 - 2026-02-22
- Full Cobra CLI migration — all commands use
spf13/cobrawithcharmbracelet/huhinteractive forms (zero remainingflag.NewFlagSetorDisableFlagParsing) - Native Go e2e and integration test suites replacing BATS scripts
- Engine heartbeat protocol for
uporchestration with split registration - Dynamic version detection via
debug.ReadBuildInfo
- 30+ engine/admin/protocol bug fixes — chaos probability, SSE race, file store lock, MQTT ACL, validation middleware, nil guards, error codes
- Admin-url flag shadowing removed across 15+ CLI subcommands
- Engine startup teardown leak, client.go URL concatenation, workspace port validation
- SSE
recordingHookFactoryrace condition (added mutex) - Admin pagination negative offset/limit handling
- Workspace 409 conflict handling in
up.go - ~55
time.Sleepreadiness waits replaced with polling helpers in tests - HTTP client errors no longer swallowed in 32 test helpers
- Resolved all golangci-lint warnings (11→0 issues): perfsprint, bodyclose, copyloopvar, gocritic, unparam, gocyclo
start --admin-urlrenamed to--register-urlto avoid shadowing root persistent flag- CLI
serveandstartfollow Docker patterns:serve= foreground,start= background/detached,stop= shutdown - Removed dead code:
export.goreorderArgs, SSE Graceful dead field, stale CLI bridge functions - Moved
parseOptionalBoolto sharedquery_parse.go
0.3.0 - 2026-02-20
--cors-originsflag onservecommand--rate-limitflag onservecommand--no-persistflag onservecommand--watchflag onservecommand--match-body-containsflag onmockd http addcommand--path-patternflag onmockd http addcommandmockd oauth addcommand with--issuer,--client-id,--client-secret,--oauth-user,--oauth-password- Protocol utility commands:
grpc call,soap call,soap validate,mqtt publish,mqtt subscribe,mqtt status,graphql query,graphql validate {{random.string(N)}}template function{{mtls.san.ip}}and{{mtls.san.uri}}template variables{{sequence("name", start)}}works in all contexts (not just MQTT)- MCP stateful tools now work through admin API
- Stateful item-level CRUD admin endpoints
- 20+ new tests (chaos, template, mTLS)
- SSE template expressions now resolve (was returning literal strings)
- OpenAPI body validation errors now include field paths
- Health endpoint zero timestamp in Docker (startTime race condition)
- Install script version display uses installed binary instead of PATH lookup
- Content-Type auto-detection: JSON bodies get
application/jsoninstead oftext/plain bodyFilerelative path resolution (resolves relative to config file directory)- Validation mode "warn" now adds warning headers instead of blocking
- Validation mode "permissive" now skips validation entirely
- Stateful capacity error returns 507 instead of 500
- Chaos probability values clamped to [0.0, 1.0]
- Chaos per-path rules now properly preempt global rules
- SSE rate limit headers now sent when configured
- Unknown CLI command now shows helpful error with available commands
- Port range validation (0-65535) prevents misleading OS errors
--match-querynow accepts bothkey=valueandkey:valueformats{{default}}template function now properly resolves context values
- Template engine
New()always initializes a SequenceStore
0.2.9 - 2026-02-19
- CLI UX improvements:
mockd <protocol> addupserts by method+path,mockd list -w,mockd delete --path/--method/--yes,mockd rmalias - README overhauled
- Homebrew tap renamed to
getmockd/homebrew-tap - Helm chart bumped
0.2.8 - 2026-02-15
- 5 test fixes (envelope unwrapping, SOAP WSDL, E2E import)
- 53 commits pushed to origin, all CI green
- First public push
0.2.7 - 2026-02-12
- Validation body double-read elimination (halves peak memory)
- 9 P3 cosmetic fixes: MCP version wiring, timestamps, seed IDs, export options, variable shadow, log IDs, modulo bias, Insomnia export
- Protocol interface documentation
- Template engine boundary documentation
0.2.6 - 2026-02-12
- 59 recording tests (WebSocket, SOAP handler, SOAP converter)
- 39 tests across various subsystems
- 12 P3/cosmetic fixes and dead code cleanup
- Marketing audit on mockd-ui
0.2.5 - 2026-02-12
- 22 bug fixes across admin, portability, CLI, MCP, tracing, stateful
- 67 new tests (chaos, portability, stateful, CLI config)
0.2.4 - 2026-02-04
- MCP server overhaul — 16 multiplexed tools across all protocols with session-scoped context switching, chaos engineering, mock verification, stateful resource management, and both stdio and HTTP transports (
mockd mcp/mockd serve --mcp) - OpenRouter AI provider — First-class support via
MOCKD_AI_PROVIDER=openrouterwith google/gemini-2.5-flash default. Access 200+ models through a single API key - AI mock validation pipeline — Generated mocks are now validated before export, with invalid mocks skipped and warnings printed
- Multi-protocol QUIC tunnel (
mockd tunnel-quic) — Expose local mocks to the internet through a single QUIC connection. All 7 protocols tunneled through port 443 with zero configuration - gRPC tunnel support — Native HTTP/2 with trailer forwarding via streaming chunked body framing
- MQTT tunnel support — MQTT connections routed via TLS ALPN on port 443
- WebSocket tunnel support — Bidirectional WebSocket frames proxied through QUIC
- Tunnel authentication — Protect tunnel URLs with token auth, HTTP Basic Auth, or IP allowlists
- Field-level validation — Validate request bodies with type checking, constraints, patterns, and formats
- OAuth token introspection (
POST /introspect) — RFC 7662 compliant - YAML export for proxy recordings
- SSE rate limiting
- AI generation prompt now requests
{param}path syntax (not Express-style:param) - AI provider default
maxTokensincreased from 500 to 4096 to prevent truncated responses - Unified admin API create endpoint now validates mocks before storing
- Chaos API
ErrorRateConfigusesstatusCodesarray anddefaultCode /enginesendpoint includes local engine in response
- MQTT broker shutdown deadlock —
Stop()held the broker mutex whileserver.Close()triggered hook callbacks that also needed the mutex. Fixed with atomic stopping flag and lock release before close - AI code fence parsing — LLMs wrapping JSON in markdown fences now stripped before parsing
- Express-style path params — AI-generated
:parampaths automatically normalized to{param} - Graceful degradation — MCP tools and CLI commands now return actionable error messages when mockd server is unreachable
- CVE patches — Upgraded quic-go v0.49→v0.57 and x/crypto v0.44→v0.47
- Chaos injection CLI no longer nests config under a
globalkey the API ignores
- gRPC recording — Only recorded traffic from mockd's own server. External service recording deferred pending community demand
- Duplicate docs workflow file
- quic-go and x/crypto upgraded to resolve known CVEs
0.2.0 - 2026-01-21
- gRPC/MQTT port merging: automatically merge services/topics when creating mocks on the same port
- Port conflict detection with actionable error messages
mockd portscommand to list all ports in use- CLI merge output shows added and total services/topics
- Metrics path normalization for UUIDs, MongoDB ObjectIDs, and numeric IDs
- Shared test helpers for port allocation stability
- Version reset to 0.2.0 to reflect pre-release status
- Improved CLI help text for gRPC and MQTT flags (documents merge behavior)
- CLI handling of merge responses (HTTP 200 vs 201)
- Bulk create and update handlers properly detect merge targets as conflicts
- Integration test port allocation stability
0.1.0 - 2026-01-17
- Multi-protocol mock server support: HTTP, WebSocket, gRPC, MQTT, SSE, GraphQL, SOAP
- CLI with 30+ commands for mock management
- Admin API for runtime mock configuration
- Proxy recording mode for capturing real API traffic
- Stateful mocking for simulating CRUD operations
- Chaos engineering features: latency injection, error rates, timeouts
- mTLS support with certificate matching
- OpenTelemetry tracing integration
- Prometheus metrics endpoint
- OAuth mock provider for testing auth flows
- MCP server for AI agent integration
- Shell completion support for bash, zsh, and fish
- Import/export support for OpenAPI, Postman, WireMock, HAR, and cURL formats
- Docker container support
- Helm chart for Kubernetes deployment
- kubectl-style context management for switching between mockd deployments
- Workspace CLI commands for organizing mocks into logical groups
- Config file permissions restricted to
0600(owner read/write only) - Config directory permissions restricted to
0700 - Auth tokens masked in JSON output
- Initial public release (pre-1.0)
- Licensed under Apache 2.0