mockserver-client 7.2.0__tar.gz → 7.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/PKG-INFO +136 -2
  2. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/README.md +135 -1
  3. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/__init__.py +80 -0
  4. mockserver_client-7.4.0/mockserver/a2a.py +527 -0
  5. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/async_client.py +515 -3
  6. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/client.py +224 -0
  7. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/llm.py +174 -0
  8. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/models.py +1162 -14
  9. mockserver_client-7.4.0/mockserver/pytest_plugin.py +131 -0
  10. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/websocket_client.py +20 -8
  11. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver_client.egg-info/PKG-INFO +136 -2
  12. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver_client.egg-info/SOURCES.txt +7 -0
  13. mockserver_client-7.4.0/mockserver_client.egg-info/entry_points.txt +2 -0
  14. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/pyproject.toml +4 -1
  15. mockserver_client-7.4.0/tests/test_a2a.py +363 -0
  16. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_async_client.py +226 -0
  17. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_client.py +212 -0
  18. mockserver_client-7.4.0/tests/test_control_plane.py +392 -0
  19. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_integration.py +38 -0
  20. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_llm.py +85 -0
  21. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_models.py +711 -2
  22. mockserver_client-7.4.0/tests/test_pytest_plugin.py +64 -0
  23. mockserver_client-7.4.0/tests/test_roundtrip_fidelity.py +231 -0
  24. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/exceptions.py +0 -0
  25. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/fluent.py +0 -0
  26. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/launcher.py +0 -0
  27. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver/mcp.py +0 -0
  28. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver_client.egg-info/dependency_links.txt +0 -0
  29. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver_client.egg-info/requires.txt +0 -0
  30. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/mockserver_client.egg-info/top_level.txt +0 -0
  31. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/setup.cfg +0 -0
  32. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_auth_tls.py +0 -0
  33. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_breakpoint.py +0 -0
  34. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_exceptions.py +0 -0
  35. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_fluent.py +0 -0
  36. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_init.py +0 -0
  37. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_launcher.py +0 -0
  38. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_mcp.py +0 -0
  39. {mockserver_client-7.2.0 → mockserver_client-7.4.0}/tests/test_websocket_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mockserver-client
3
- Version: 7.2.0
3
+ Version: 7.4.0
4
4
  Summary: Official Python client for MockServer — create expectations, verify requests, and register dynamic callbacks via WebSocket
5
5
  Author-email: James Bloom <jamesdbloom@gmail.com>
6
6
  License-Expression: Apache-2.0
@@ -190,6 +190,63 @@ client.verify_sequence(
190
190
  client.verify_zero_interactions()
191
191
  ```
192
192
 
193
+ ## Request Matching
194
+
195
+ ### JWT matcher
196
+
197
+ Match requests by the claims (and metadata) of a JWT carried in a header. Each
198
+ claim value is exact-or-regex; prefix a value with `!` to negate it.
199
+
200
+ ```python
201
+ from mockserver import HttpRequest, HttpResponse, Jwt
202
+
203
+ client.when(
204
+ HttpRequest.request("/secure")
205
+ .with_method("GET")
206
+ .with_jwt(
207
+ claims={
208
+ "sub": "user-123", # exact match
209
+ "email": "^.+@example.com$", # regex match
210
+ "role": "!admin", # negated — matches any role except admin
211
+ },
212
+ issuer="https://issuer.example.com",
213
+ audience="my-api",
214
+ algorithm="RS256",
215
+ header="authorization", # optional (defaults to Authorization)
216
+ scheme="Bearer", # optional token scheme
217
+ )
218
+ ).respond(
219
+ HttpResponse.response("granted", status_code=200)
220
+ )
221
+
222
+ # ...or pass a Jwt object directly:
223
+ HttpRequest.request("/secure").with_jwt(Jwt(claims={"sub": "user-123"}))
224
+ ```
225
+
226
+ ### allOf body matcher
227
+
228
+ Require a request body to satisfy **all** of several body matchers at once.
229
+
230
+ ```python
231
+ from mockserver import AllOfBody, Body, JsonPathBody, RegexBody, HttpRequest
232
+
233
+ client.when(
234
+ HttpRequest.request("/api/orders")
235
+ .with_method("POST")
236
+ .with_body(AllOfBody(body_all_of=[
237
+ JsonPathBody(json_path="$.name"), # body has a name field
238
+ RegexBody(regex=".*active.*"), # and mentions "active"
239
+ ]))
240
+ ).respond(
241
+ HttpResponse.response("ok")
242
+ )
243
+
244
+ # Shorthand factory:
245
+ HttpRequest.request("/api/orders").with_body(
246
+ Body.all_of(JsonPathBody(json_path="$.name"), RegexBody(regex=".*active.*"))
247
+ )
248
+ ```
249
+
193
250
  ## Retrieval
194
251
 
195
252
  ```python
@@ -228,6 +285,83 @@ if client.has_started():
228
285
  client.stop()
229
286
  ```
230
287
 
288
+ ## AI Protocol Mocking
289
+
290
+ Declarative builders mock an MCP (Model Context Protocol) server or an A2A
291
+ (Agent-to-Agent) server with a single fluent chain. Each builder produces a set of
292
+ HTTP expectations that speak JSON-RPC 2.0 and echo the incoming request id.
293
+
294
+ ```python
295
+ from mockserver import mcp_mock, a2a_mock
296
+
297
+ # Mock an MCP server (Streamable HTTP, JSON-RPC 2.0) on /mcp
298
+ mcp_mock() \
299
+ .with_tool("get_weather") \
300
+ .with_description("Get weather for a city") \
301
+ .with_input_schema('{"type": "object", "properties": {"city": {"type": "string"}}}') \
302
+ .responding_with("72F and sunny") \
303
+ .and_() \
304
+ .apply_to(client)
305
+
306
+ # Mock an A2A agent on /a2a (agent card + tasks/send|get|cancel)
307
+ a2a_mock() \
308
+ .with_agent_name("TranslatorAgent") \
309
+ .with_skill("translate") \
310
+ .with_name("Translation") \
311
+ .with_description("Translates text between languages") \
312
+ .with_tag("i18n") \
313
+ .with_example("Translate hello to Spanish") \
314
+ .and_() \
315
+ .on_task_send() \
316
+ .matching_message("translate.*") \
317
+ .responding_with("Hola") \
318
+ .and_() \
319
+ .apply_to(client)
320
+ ```
321
+
322
+ The A2A builder also supports streaming (SSE) and push notifications:
323
+
324
+ ```python
325
+ a2a_mock() \
326
+ .with_streaming() \
327
+ .with_push_notifications("http://localhost:1234/callback") \
328
+ .apply_to(client)
329
+ ```
330
+
331
+ `build()` returns the list of `Expectation` objects without registering them, so
332
+ you can inspect or persist them; `apply_to(client)` registers them via `upsert`.
333
+
334
+ ## SRE / Resilience
335
+
336
+ Verify a service-level objective over recorded SLI samples, or run a scheduled
337
+ multi-stage chaos experiment. Both require the corresponding server feature to be
338
+ enabled (`sloTrackingEnabled`, chaos experiments).
339
+
340
+ ```python
341
+ # Verify an SLO — a FAIL verdict (HTTP 406) raises MockServerVerificationError
342
+ verdict = client.verify_slo({
343
+ "name": "checkout",
344
+ "minimumSampleCount": 100,
345
+ "objectives": [
346
+ {"sli": "errorRate", "comparator": "LESS_THAN", "threshold": 0.01},
347
+ {"sli": "p99LatencyMs", "comparator": "LESS_THAN", "threshold": 250},
348
+ ],
349
+ })
350
+ print(verdict["result"]) # PASS or INCONCLUSIVE
351
+
352
+ # Start a multi-stage chaos experiment (only one may be active at a time)
353
+ client.start_chaos_experiment({
354
+ "name": "latency-injection",
355
+ "loop": False,
356
+ "stages": [
357
+ {"durationMillis": 60000, "profiles": {"payments.svc": {"latencyMs": 500}}},
358
+ ],
359
+ })
360
+ ```
361
+
362
+ Both methods are available on the async client too (`await client.verify_slo(...)`,
363
+ `await client.start_chaos_experiment(...)`).
364
+
231
365
  ## TLS Support
232
366
 
233
367
  ```python
@@ -352,7 +486,7 @@ launcher_path = ensure_binary() # returns Path to the launcher executable
352
486
  ```python
353
487
  from mockserver.launcher import start
354
488
 
355
- server = start(port=1080, version="7.2.0")
489
+ server = start(port=1080, version="7.4.0")
356
490
  # ...
357
491
  server.stop()
358
492
  ```
@@ -160,6 +160,63 @@ client.verify_sequence(
160
160
  client.verify_zero_interactions()
161
161
  ```
162
162
 
163
+ ## Request Matching
164
+
165
+ ### JWT matcher
166
+
167
+ Match requests by the claims (and metadata) of a JWT carried in a header. Each
168
+ claim value is exact-or-regex; prefix a value with `!` to negate it.
169
+
170
+ ```python
171
+ from mockserver import HttpRequest, HttpResponse, Jwt
172
+
173
+ client.when(
174
+ HttpRequest.request("/secure")
175
+ .with_method("GET")
176
+ .with_jwt(
177
+ claims={
178
+ "sub": "user-123", # exact match
179
+ "email": "^.+@example.com$", # regex match
180
+ "role": "!admin", # negated — matches any role except admin
181
+ },
182
+ issuer="https://issuer.example.com",
183
+ audience="my-api",
184
+ algorithm="RS256",
185
+ header="authorization", # optional (defaults to Authorization)
186
+ scheme="Bearer", # optional token scheme
187
+ )
188
+ ).respond(
189
+ HttpResponse.response("granted", status_code=200)
190
+ )
191
+
192
+ # ...or pass a Jwt object directly:
193
+ HttpRequest.request("/secure").with_jwt(Jwt(claims={"sub": "user-123"}))
194
+ ```
195
+
196
+ ### allOf body matcher
197
+
198
+ Require a request body to satisfy **all** of several body matchers at once.
199
+
200
+ ```python
201
+ from mockserver import AllOfBody, Body, JsonPathBody, RegexBody, HttpRequest
202
+
203
+ client.when(
204
+ HttpRequest.request("/api/orders")
205
+ .with_method("POST")
206
+ .with_body(AllOfBody(body_all_of=[
207
+ JsonPathBody(json_path="$.name"), # body has a name field
208
+ RegexBody(regex=".*active.*"), # and mentions "active"
209
+ ]))
210
+ ).respond(
211
+ HttpResponse.response("ok")
212
+ )
213
+
214
+ # Shorthand factory:
215
+ HttpRequest.request("/api/orders").with_body(
216
+ Body.all_of(JsonPathBody(json_path="$.name"), RegexBody(regex=".*active.*"))
217
+ )
218
+ ```
219
+
163
220
  ## Retrieval
164
221
 
165
222
  ```python
@@ -198,6 +255,83 @@ if client.has_started():
198
255
  client.stop()
199
256
  ```
200
257
 
258
+ ## AI Protocol Mocking
259
+
260
+ Declarative builders mock an MCP (Model Context Protocol) server or an A2A
261
+ (Agent-to-Agent) server with a single fluent chain. Each builder produces a set of
262
+ HTTP expectations that speak JSON-RPC 2.0 and echo the incoming request id.
263
+
264
+ ```python
265
+ from mockserver import mcp_mock, a2a_mock
266
+
267
+ # Mock an MCP server (Streamable HTTP, JSON-RPC 2.0) on /mcp
268
+ mcp_mock() \
269
+ .with_tool("get_weather") \
270
+ .with_description("Get weather for a city") \
271
+ .with_input_schema('{"type": "object", "properties": {"city": {"type": "string"}}}') \
272
+ .responding_with("72F and sunny") \
273
+ .and_() \
274
+ .apply_to(client)
275
+
276
+ # Mock an A2A agent on /a2a (agent card + tasks/send|get|cancel)
277
+ a2a_mock() \
278
+ .with_agent_name("TranslatorAgent") \
279
+ .with_skill("translate") \
280
+ .with_name("Translation") \
281
+ .with_description("Translates text between languages") \
282
+ .with_tag("i18n") \
283
+ .with_example("Translate hello to Spanish") \
284
+ .and_() \
285
+ .on_task_send() \
286
+ .matching_message("translate.*") \
287
+ .responding_with("Hola") \
288
+ .and_() \
289
+ .apply_to(client)
290
+ ```
291
+
292
+ The A2A builder also supports streaming (SSE) and push notifications:
293
+
294
+ ```python
295
+ a2a_mock() \
296
+ .with_streaming() \
297
+ .with_push_notifications("http://localhost:1234/callback") \
298
+ .apply_to(client)
299
+ ```
300
+
301
+ `build()` returns the list of `Expectation` objects without registering them, so
302
+ you can inspect or persist them; `apply_to(client)` registers them via `upsert`.
303
+
304
+ ## SRE / Resilience
305
+
306
+ Verify a service-level objective over recorded SLI samples, or run a scheduled
307
+ multi-stage chaos experiment. Both require the corresponding server feature to be
308
+ enabled (`sloTrackingEnabled`, chaos experiments).
309
+
310
+ ```python
311
+ # Verify an SLO — a FAIL verdict (HTTP 406) raises MockServerVerificationError
312
+ verdict = client.verify_slo({
313
+ "name": "checkout",
314
+ "minimumSampleCount": 100,
315
+ "objectives": [
316
+ {"sli": "errorRate", "comparator": "LESS_THAN", "threshold": 0.01},
317
+ {"sli": "p99LatencyMs", "comparator": "LESS_THAN", "threshold": 250},
318
+ ],
319
+ })
320
+ print(verdict["result"]) # PASS or INCONCLUSIVE
321
+
322
+ # Start a multi-stage chaos experiment (only one may be active at a time)
323
+ client.start_chaos_experiment({
324
+ "name": "latency-injection",
325
+ "loop": False,
326
+ "stages": [
327
+ {"durationMillis": 60000, "profiles": {"payments.svc": {"latencyMs": 500}}},
328
+ ],
329
+ })
330
+ ```
331
+
332
+ Both methods are available on the async client too (`await client.verify_slo(...)`,
333
+ `await client.start_chaos_experiment(...)`).
334
+
201
335
  ## TLS Support
202
336
 
203
337
  ```python
@@ -322,7 +456,7 @@ launcher_path = ensure_binary() # returns Path to the launcher executable
322
456
  ```python
323
457
  from mockserver.launcher import start
324
458
 
325
- server = start(port=1080, version="7.2.0")
459
+ server = start(port=1080, version="7.4.0")
326
460
  # ...
327
461
  server.stop()
328
462
  ```
@@ -1,17 +1,24 @@
1
1
  from mockserver.models import (
2
2
  AfterAction,
3
+ AllOfBody,
3
4
  BinaryResponse,
4
5
  Body,
6
+ CaptureRule,
7
+ CaptureSource,
5
8
  ConnectionOptions,
6
9
  CrossProtocolScenario,
7
10
  CrossProtocolTrigger,
8
11
  Delay,
9
12
  DelayDistribution,
10
13
  DnsRecord,
14
+ DnsRecordClass,
15
+ DnsRecordType,
16
+ DnsRequestDefinition,
11
17
  DnsResponse,
12
18
  Expectation,
13
19
  ExpectationId,
14
20
  ExpectationStep,
21
+ GraphQLBody,
15
22
  GrpcBidiResponse,
16
23
  GrpcBidiRule,
17
24
  GrpcStreamMessage,
@@ -20,6 +27,8 @@ from mockserver.models import (
20
27
  HttpClassCallback,
21
28
  HttpError,
22
29
  HttpForward,
30
+ HttpForwardValidateAction,
31
+ HttpForwardWithFallback,
23
32
  HttpObjectCallback,
24
33
  HttpOverrideForwardedRequest,
25
34
  HttpRequest,
@@ -30,14 +39,33 @@ from mockserver.models import (
30
39
  HttpWebSocketResponse,
31
40
  JsonPathBody,
32
41
  JsonRpcBody,
42
+ JsonSchemaBody,
43
+ Jwt,
33
44
  KeyToMultiValue,
45
+ MultipartBody,
46
+ ParameterBody,
47
+ Protocol,
48
+ RateLimit,
49
+ RateLimitAlgorithm,
50
+ ValidationMode,
51
+ WasmBody,
52
+ XmlBody,
53
+ XmlSchemaBody,
54
+ XPathBody,
55
+ LoadCapture,
56
+ LoadFeeder,
57
+ LoadPacing,
34
58
  LoadProfile,
35
59
  LoadScenario,
60
+ LoadShape,
36
61
  LoadStage,
37
62
  LoadStep,
63
+ LoadThreshold,
64
+ MockMode,
38
65
  OpenAPIDefinition,
39
66
  OpenAPIExpectation,
40
67
  Ports,
68
+ RegexBody,
41
69
  RequestDefinition,
42
70
  ResponseMode,
43
71
  SocketAddress,
@@ -47,10 +75,12 @@ from mockserver.models import (
47
75
  Verification,
48
76
  VerificationSequence,
49
77
  VerificationTimes,
78
+ WebSocketFrameMatcher,
50
79
  WebSocketMessage,
51
80
  )
52
81
  from mockserver.llm import (
53
82
  Completion,
83
+ ContentFilter,
54
84
  ConversationPredicates,
55
85
  EmbeddingResponse,
56
86
  HttpLlmResponse,
@@ -59,14 +89,17 @@ from mockserver.llm import (
59
89
  LlmConversationBuilder,
60
90
  LlmFailoverBuilder,
61
91
  LlmMockBuilder,
92
+ ModerationResponse,
62
93
  NormalizationOptions,
63
94
  Provider,
95
+ RerankResponse,
64
96
  Role,
65
97
  StreamingPhysics,
66
98
  ToolUse,
67
99
  TurnBuilder,
68
100
  Usage,
69
101
  completion,
102
+ content_filter,
70
103
  conversation,
71
104
  cookie,
72
105
  embedding,
@@ -74,7 +107,9 @@ from mockserver.llm import (
74
107
  llm_failover,
75
108
  llm_mock,
76
109
  llm_response,
110
+ moderation,
77
111
  query_parameter,
112
+ rerank,
78
113
  streaming_physics,
79
114
  time_to_first_token,
80
115
  tool_use,
@@ -95,6 +130,12 @@ from mockserver.mcp import (
95
130
  McpToolBuilder,
96
131
  mcp_mock,
97
132
  )
133
+ from mockserver.a2a import (
134
+ A2aMockBuilder,
135
+ A2aSkillBuilder,
136
+ A2aTaskHandlerBuilder,
137
+ a2a_mock,
138
+ )
98
139
  from mockserver.async_client import AsyncMockServerClient
99
140
  from mockserver.launcher import (
100
141
  MockServerProcess,
@@ -107,19 +148,26 @@ from mockserver.launcher import (
107
148
 
108
149
  __all__ = [
109
150
  "AfterAction",
151
+ "AllOfBody",
110
152
  "AsyncMockServerClient",
111
153
  "BinaryResponse",
112
154
  "Body",
155
+ "CaptureRule",
156
+ "CaptureSource",
113
157
  "ConnectionOptions",
114
158
  "CrossProtocolScenario",
115
159
  "CrossProtocolTrigger",
116
160
  "Delay",
117
161
  "DelayDistribution",
118
162
  "DnsRecord",
163
+ "DnsRecordClass",
164
+ "DnsRecordType",
165
+ "DnsRequestDefinition",
119
166
  "DnsResponse",
120
167
  "Expectation",
121
168
  "ExpectationId",
122
169
  "ExpectationStep",
170
+ "GraphQLBody",
123
171
  "GrpcBidiResponse",
124
172
  "GrpcBidiRule",
125
173
  "GrpcStreamMessage",
@@ -128,6 +176,8 @@ __all__ = [
128
176
  "HttpClassCallback",
129
177
  "HttpError",
130
178
  "HttpForward",
179
+ "HttpForwardValidateAction",
180
+ "HttpForwardWithFallback",
131
181
  "HttpObjectCallback",
132
182
  "HttpOverrideForwardedRequest",
133
183
  "HttpRequest",
@@ -138,12 +188,31 @@ __all__ = [
138
188
  "HttpWebSocketResponse",
139
189
  "JsonPathBody",
140
190
  "JsonRpcBody",
191
+ "JsonSchemaBody",
192
+ "Jwt",
141
193
  "KeyToMultiValue",
194
+ "MultipartBody",
195
+ "ParameterBody",
196
+ "Protocol",
197
+ "RateLimit",
198
+ "RateLimitAlgorithm",
199
+ "ValidationMode",
200
+ "WasmBody",
201
+ "XmlBody",
202
+ "XmlSchemaBody",
203
+ "XPathBody",
204
+ "LoadCapture",
205
+ "LoadFeeder",
206
+ "LoadPacing",
142
207
  "LoadProfile",
143
208
  "LoadScenario",
209
+ "LoadShape",
144
210
  "LoadStage",
145
211
  "LoadStep",
212
+ "LoadThreshold",
213
+ "MockMode",
146
214
  "Completion",
215
+ "ContentFilter",
147
216
  "ConversationPredicates",
148
217
  "EmbeddingResponse",
149
218
  "HttpLlmResponse",
@@ -152,14 +221,17 @@ __all__ = [
152
221
  "LlmConversationBuilder",
153
222
  "LlmFailoverBuilder",
154
223
  "LlmMockBuilder",
224
+ "ModerationResponse",
155
225
  "NormalizationOptions",
156
226
  "Provider",
227
+ "RerankResponse",
157
228
  "Role",
158
229
  "StreamingPhysics",
159
230
  "ToolUse",
160
231
  "TurnBuilder",
161
232
  "Usage",
162
233
  "completion",
234
+ "content_filter",
163
235
  "conversation",
164
236
  "cookie",
165
237
  "embedding",
@@ -167,7 +239,9 @@ __all__ = [
167
239
  "llm_failover",
168
240
  "llm_mock",
169
241
  "llm_response",
242
+ "moderation",
170
243
  "query_parameter",
244
+ "rerank",
171
245
  "streaming_physics",
172
246
  "time_to_first_token",
173
247
  "tool_use",
@@ -177,6 +251,10 @@ __all__ = [
177
251
  "McpResourceBuilder",
178
252
  "McpToolBuilder",
179
253
  "mcp_mock",
254
+ "A2aMockBuilder",
255
+ "A2aSkillBuilder",
256
+ "A2aTaskHandlerBuilder",
257
+ "a2a_mock",
180
258
  "MockServerCallbackError",
181
259
  "MockServerClient",
182
260
  "MockServerConnectionError",
@@ -186,6 +264,7 @@ __all__ = [
186
264
  "OpenAPIDefinition",
187
265
  "OpenAPIExpectation",
188
266
  "Ports",
267
+ "RegexBody",
189
268
  "RequestDefinition",
190
269
  "ResponseMode",
191
270
  "SocketAddress",
@@ -195,6 +274,7 @@ __all__ = [
195
274
  "Verification",
196
275
  "VerificationSequence",
197
276
  "VerificationTimes",
277
+ "WebSocketFrameMatcher",
198
278
  "WebSocketMessage",
199
279
  "MockServerProcess",
200
280
  "bundle_base_name",