NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #2889 most downloaded on npm
The industry standard for API mocking in JavaScript.
Last release 2 days ago
03 Oct 2026
Release timing varies
gaps range from 8 days to 3 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
340 releases · first in 2018
vite: support virtual:msw imports in vitest ( #2802 ) ( e73c381 ) @kettanaito
virtual:msw imports in vitest (#2802) (e73c381) @kettanaitotreat CONNECT requests as the transport mechanism ( #2796 ) ( 7cad86a ) @kettanaito
CONNECT requests as the transport mechanism (#2796) (7cad86a) @kettanaitoOne column per quarter.
Deprecate support for Node.js v18 and v20 ( #2729 ). The minimal supported Node.js version is v22.
msw/native is removed in favor of @msw/react-native.worker.stop() returns a Promise (#2724). Awaiting it is relevant only for in-flight critical scenarios.graphql is now exported as msw/graphql (#2691). GraphQL is now handled as a proper optional peer dependency.handleRequest() utility. Please use the defineNetwork() API instead.GraphQLLinkHandlers type has been renamed to GraphQLLink.file:// requests now throw in Node.js as they normally do (not supported by fetch).Content-Length request header is now removed by bypass().fetch() now throw in Node.js as they normally do (not supported by fetch).connection life cycle event has been renamed to websocket:connection (#2783).onUnhandledRequest option has been renamed to onUnhandledFrame.setTimeout to circumvent fake timers in test runners. You should advance the fake timers normally for delayed mocked responses to resolve.request.headers.get('cookie') in the handlers. It returns null in all environments. Please use the cookies resolver argument to have cookie-based logic.delay or passthrough, from the new msw/utils entrypoint for smaller footprint on your bundle.path-to-regexp to @msw/url (#2678).graphqlpath-to-regexppicocolorsstatusesstrict-event-emitterwebsocket:error life cycle event to listen to WebSocket connection errors (#2784).beforeunload listener would unregister the MSW worker (#1105).maxWorkers: 1 (#2726).worker.stop() (#2724, #2597).localStorage would cause a maximum quota exceeded errors.sse: invoke finalize on response stream end ( #2741 ) ( 7fae0cc ) @kettanaito
finalize on response stream end (#2741) (7fae0cc) @kettanaitosse: proper logging for concurrent requests ( #2762 ) ( 5c0ae1c ) @kettanaito
defineNetwork: prevent event forwarding manually ( #2740 ) ( ccb40e0 ) @kettanaito
ws: remove all frame listeners on client closure ( #2739 ) ( 91a5d41 ) @kettanaito
add finalize API for handler cleanup ( #2738 ) ( a288f54 ) @kettanaito
prevent frame abort listener leak ( #2737 ) ( c4567d2 ) @kettanaito
export the NetworkApi type ( #2734 ) ( f0c0321 ) @kettanaito
export default handler controllers ( #2733 ) ( f8dc874 ) @kettanaito
support ws.onUpgrade for handling connection upgrades ( #2732 ) ( e00e4d6 ) @kettanaito
ws.onUpgrade for handling connection upgrades (#2732) (e00e4d6) @kettanaitoWebSocketHandler: add public test() method ( #2727 ) ( 3da7048 ) @kettanaito
test() method (#2727) (3da7048) @kettanaitoreset generator state on .resetHandlers()/.restoreHandlers() (#2725) (8d16801cacd89e5aff336c43e888df19fad04417) @kettanaito
.resetHandlers()/.restoreHandlers() (#2725) (8d16801cacd89e5aff336c43e888df19fad04417) @kettanaitoimplement proper ServiceWorkerSource singleton pattern (#2715) (580256b09df54ad8f1b41143e78dabc626ecf20c) @kettanaito
ServiceWorkerSource singleton pattern (#2715) (580256b09df54ad8f1b41143e78dabc626ecf20c) @kettanaitoverbatimModuleSyntax consistently in exports (#2702) (9dedf52fc88c355610f6d472c921fe10c54af050) @christoph-fricke @kettanaitorequest.signal for the underlying stream (#2718) (429e05ca2395b5ec695b91107600d6e14f4be0f9) @kettanaitoupdate rettime to 0.11.7 (#2711) (feee3ed65ca2b78da1ca53b8a99a7eaa87417fc6) @kettanaito
rettime to 0.11.7 (#2711) (feee3ed65ca2b78da1ca53b8a99a7eaa87417fc6) @kettanaitodelay: prevent infinite mode from throwing (#2697) (613d4a1d6cd96e006af126d6a13e32e884f48733) @kettanaito
infinite mode from throwing (#2697) (613d4a1d6cd96e006af126d6a13e32e884f48733) @kettanaitoannotate life-cycle events correctly (#2694) (e7890e91627c828bd4d788f09e179bffbc8a8506) @kettanaito
use the network source architecture (defineNetwork) (#2650) (2b73790082d412580047c430519340958025226d) @kettanaito @felmonon
defineNetwork) (#2650) (2b73790082d412580047c430519340958025226d) @kettanaito @felmononinstanceof check. Instead, the kind property of the handler is used.support wildcard ports in url matching (#2677) (f90bf49954db8cdf573627000fc9320acde19cd7) @trknhr @kettanaito
GraphQL: support application/graphql-response+json response content-type (#2513) (4b8c330ac0dec25a61d21693ac38a097250f1255) @phryneas @kettanaito
application/graphql-response+json response content-type (#2513) (4b8c330ac0dec25a61d21693ac38a097250f1255) @phryneas @kettanaitocontent-type headers with a symbol (#2675) (98716e7b337aba0090695c2f70895f2f97afa3ee) @kettanaitominor improvements (#2672) (cd528734805ac233f727f3256a5086ed57b6c644) @kettanaito
postinstall script (#2649) (b79d7aeff41bcea2f8125b5cda718c246d69b5d1) @aloisklink @kettanaitonode: avoid open handles for infinite delays (#2669) (3ccc8a3c6c6f9e1e1d685a2b6a68135843abf700) @FelmonFekadu @kettanaito
export AnyHandler type (#2663) (90f9be4f96b7fb071ef655a8044eca3c15910404) @kettanaito
AnyHandler type (#2663) (90f9be4f96b7fb071ef655a8044eca3c15910404) @kettanaitows: support relative urls in ws.link (#2661) (2f1d23c1c4392638a7dfbc95d00ede6062aeae6c) @kettanaito
ws.link (#2661) (2f1d23c1c4392638a7dfbc95d00ede6062aeae6c) @kettanaitoupdate @mswjs/interceptors to fix a memory leak (#2659) (e5e905f60c4ad8dd621e720cde26390c84104362) @kettanaito
@mswjs/interceptors to fix a memory leak (#2659) (e5e905f60c4ad8dd621e720cde26390c84104362) @kettanaitorettime (#2657) (3a7b4510138bc6e7ab5078f53e623d6a25cfd9ac) @kettanaitographql: export the GraphQLLinkHandlers type (#2647) (cfab780e1d8110736567ebda129a4094e35f4c00) @kettanaito
GraphQLLinkHandlers type (#2647) (cfab780e1d8110736567ebda129a4094e35f4c00) @kettanaitoTypedDocumentString as request predicate (#2646) (494d5e88791913ae2758b3d9c2b78987d3ac0adf) @kettanaitoDocumentNode union (#2645) (0f6e28f6a5ef903d5958348c16b495223820c164) @kettanaitosse: respect the worker quiet option (#2644) (d50f73e72b04122a676617ce84f394b800e623fd) @kettanaito
quiet option (#2644) (d50f73e72b04122a676617ce84f394b800e623fd) @kettanaitosse: handle multi-line messages (#2643) (1266f612b2399eaea25219020fe93c027dc3fa7a) @BSteffaniak @kettanaito
handle incomplete localStorage in Node.js v25 (#2636) (3da2c762abb923eda60ad220f0534354d1683678) @rvagg
localStorage in Node.js v25 (#2636) (3da2c762abb923eda60ad220f0534354d1683678) @rvaggpublish the types used in HttpHandler (#2560) (1af6cee52f47a39a297f901610acb4daae17c7ea) @SerkanSipahi @kettanaito
HttpHandler (#2560) (1af6cee52f47a39a297f901610acb4daae17c7ea) @SerkanSipahi @kettanaitonode: move browser and react-native export conditions lower (#2627) (102d85a1fdb60558f07e778621edf33393ae18b5) @vidschofelix
browser and react-native export conditions lower (#2627) (102d85a1fdb60558f07e778621edf33393ae18b5) @vidschofelixsetupWorker: fix response init in response:* events (#2621) (7f48f21189f1c04349890bb8523f772f6ae9eb08) @jbms
response:* events (#2621) (7f48f21189f1c04349890bb8523f772f6ae9eb08) @jbmssupport server-sent events (SSE) (#2299) (d5a16d8fdf0a9fa5e1ed0d66133ed87214d2e403) @kettanaito @Andarist
update @mswjs/interceptors to 0.40.0 (#2613) (50028b7f61b2f6ba9998ed111d9e517ef08bf538) @kettanaito
@mswjs/interceptors to 0.40.0 (#2613) (50028b7f61b2f6ba9998ed111d9e517ef08bf538) @kettanaitoexport onUnhandledRequest for use in @msw/playwright (#2562) (54ce91965796ebbdf04426c3f84e23e627d273bc) @zachatrocity @kettanaito
onUnhandledRequest for use in @msw/playwright (#2562) (54ce91965796ebbdf04426c3f84e23e627d273bc) @zachatrocity @kettanaitoadd missing parameter documentation for getResponse function (#2580) (f33fb47c098be4f46d57fad16ea1c6b1d06ef471) @djpremier @kettanaito
getResponse function (#2580) (f33fb47c098be4f46d57fad16ea1c6b1d06ef471) @djpremier @kettanaitostatuses as a shim (#2607) (fee715c503d1cd00ca70f0688dd28b6c297aa158) @kettanaitocookie directly via a shim (#2606) (29d0b53b8088e773ed9e7acb3abd7457b8a29965) @kettanaitoWorkerChannel access in fallback mode (#2594) (1e653c9b06e9bc3e59f71d3500f31ced73f538cb) @kettanaitodeferNetworkRequestsUntil (#2595) (44d13d23ef1c9a75820c89961585cd01049a323c) @kettanaitomigrate to until-async (#2590) (7087b1e29eb7ca0a414eff36ed3c98d03147044b) @kettanaito
until-async (#2590) (7087b1e29eb7ca0a414eff36ed3c98d03147044b) @kettanaitosetupWorker: handle in-flight requests after calling worker.stop() (#2578) (97cf4c744d9b1a17f42ca65ac8ef93b2632b935b) @kettanaito
worker.stop() (#2578) (97cf4c744d9b1a17f42ca65ac8ef93b2632b935b) @kettanaitouse tough-cookie@6 directly (#2453) (6ce3b9511821e997a8e21f1d7578bbf824a3deb6) @sampsonjoliver @SamMousa @kettanaito
tough-cookie@6 directly (#2453) (6ce3b9511821e997a8e21f1d7578bbf824a3deb6) @sampsonjoliver @SamMousa @kettanaitoHttpResponse.arrayBuffer (#2575) (ad3d7c1c130a38bf9f5e5886782b725d2aa53745) @kettanaitocustom request predicate function (#2541) (a05405bd5ba7c82ad3e80990c176cbf6cb94dee7) @ytoshiki @kettanaito
export the GraphQLResponseBody type (#2565) (642523d3258bd1996df986ea0c9270be150bec3d) @breadadams
GraphQLResponseBody type (#2565) (642523d3258bd1996df986ea0c9270be150bec3d) @breadadamsHttpHandler: use correct query parameters docs link (#2547) (6cdce81de5576e5049899a729ab3a1424550c003) @kettanaito
ws: support resolutionContext on parse and run (#2544) (024568571990b6068601a0ba9f03e143ccbbfffb) @kettanaito
resolutionContext on parse and run (#2544) (024568571990b6068601a0ba9f03e143ccbbfffb) @kettanaitoresolutionContext argument (#2543) (ce3ab1fdd3b353d6a1d8db3c69532bde44483a8a) @kettanaitoTypeScript: support Response.error() and HttpResponse.error() as mocked responses (#2132) (72cc8ddac8f030f747b674148b03e5a025e412d2) @jacquesg @kettan
Response.error() and HttpResponse.error() as mocked responses (#2132) (72cc8ddac8f030f747b674148b03e5a025e412d2) @jacquesg @kettanaitoupdate @mswjs/interceptors to support WebSocket server protocol (#2528) (6704fa042a3eaa71b68eb7b9028a7464b2b30cef) @kettanaito
@mswjs/interceptors to support WebSocket server protocol (#2528) (6704fa042a3eaa71b68eb7b9028a7464b2b30cef) @kettanaitoWebSocketHandler: add run method (#2527) (94fc78ea50bd8c3334945d3047650c8b82c2f754) @kettanaito
run method (#2527) (94fc78ea50bd8c3334945d3047650c8b82c2f754) @kettanaitosend request reference within the RESPONSE event (#2510) (425635161dddb3457eea37b996b41b7c731fc69f) @kettanaito
request reference within the RESPONSE event (#2510) (425635161dddb3457eea37b996b41b7c731fc69f) @kettanaitoupdate links to the documentation (#2519) (56f24d52a8dd6510d7430b9b2de5a816db1d8c9e) @kettanaito
browser: set the default entrypoint to commonjs (#2516) (ee44fab147c83d45095bd2c14fdfffbff876d721) @kettanaito
HttpResponse: strictly annotate all response methods (#2509) (2cdc2b1d4436e600f00a54568ae5999a0dc97b77) @kettanaito
@mswjs/interceptors to 0.38.7 (#2508) (b06fd0e83af70a94303489062de7a5c49fb80ae7) @kettanaitosupport nullable GraphQL queries (#2403) (594e8ca16b53294900ca26150eeba42ea9d686e5) @huuyafwww @kettanaito
HttpResponse: export StrictResponse type again with added deprecation notice (#2500) (a5bbe977481139ce0ea34d065054e76e75befa7a) @christoph-fricke
StrictResponse type again with added deprecation notice (#2500) (a5bbe977481139ce0ea34d065054e76e75befa7a) @christoph-frickecatch postinstall errors (#2498) (6d3013c62cc2217231bed02722ee5f63fb6c4513) @kettanaito
postinstall errors (#2498) (6d3013c62cc2217231bed02722ee5f63fb6c4513) @kettanaitodo not append .mjs to .d.ts core imports (#2496) (6ae6b2930da292a4fb6cdd00c572bf9b4aaa1383) @kettanaito
.mjs to .d.ts core imports (#2496) (6ae6b2930da292a4fb6cdd00c572bf9b4aaa1383) @kettanaitosupport typescript 5.6 - 5.8 (#2493) (3fce59462cb302ec3472218a19ad5dc4bb5020e9) @kettanaito
null type argument (#2118) (50ce6a4682aa7200e510f286fdad5803e23fc27b) @kettanaitoremove unused dependencies (#2484) (436cbcb33bddeb2daa4dce9d5a43d6b7e7b96b92) @kettanaito
ws: ignore /socket.io/ path prefix during url matching (#2476) (69ae82d866aedbe4d72ae1914805798dc14e94d4) @kettanaito
/socket.io/ path prefix during url matching (#2476) (69ae82d866aedbe4d72ae1914805798dc14e94d4) @kettanaitoresolve relative URLs against location.href (#2471) (fa9b07f7b98ed2f5e2ef53a5ee0c2daa6770a256) @kettanaito
location.href (#2471) (fa9b07f7b98ed2f5e2ef53a5ee0c2daa6770a256) @kettanaitoextensions property to the GraphQLResponseBody type (#2468) (827a5dc0552f0c07822c0b178c85d6bca3d3bd6c) @ytoshikido not treat static asset requests as unhandled by default (#2440, docs) (eb45e7a93e2e4525c955ff0df1ec149c6b9de70e) @kettanaito
Your coding agent can read these notes before it upgrades. Set up the MCP server →