fastmcp 2.9.2__py3-none-any.whl → 2.10.1__py3-none-any.whl

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. fastmcp/client/auth/oauth.py +5 -82
  2. fastmcp/client/client.py +114 -24
  3. fastmcp/client/elicitation.py +63 -0
  4. fastmcp/client/transports.py +50 -36
  5. fastmcp/contrib/component_manager/README.md +170 -0
  6. fastmcp/contrib/component_manager/__init__.py +4 -0
  7. fastmcp/contrib/component_manager/component_manager.py +186 -0
  8. fastmcp/contrib/component_manager/component_service.py +225 -0
  9. fastmcp/contrib/component_manager/example.py +59 -0
  10. fastmcp/prompts/prompt.py +12 -4
  11. fastmcp/resources/resource.py +8 -3
  12. fastmcp/resources/template.py +5 -0
  13. fastmcp/server/auth/auth.py +15 -0
  14. fastmcp/server/auth/providers/bearer.py +41 -3
  15. fastmcp/server/auth/providers/bearer_env.py +4 -0
  16. fastmcp/server/auth/providers/in_memory.py +15 -0
  17. fastmcp/server/context.py +144 -4
  18. fastmcp/server/elicitation.py +160 -0
  19. fastmcp/server/http.py +1 -9
  20. fastmcp/server/low_level.py +4 -2
  21. fastmcp/server/middleware/__init__.py +14 -1
  22. fastmcp/server/middleware/logging.py +11 -0
  23. fastmcp/server/middleware/middleware.py +10 -6
  24. fastmcp/server/openapi.py +19 -77
  25. fastmcp/server/proxy.py +13 -6
  26. fastmcp/server/server.py +27 -7
  27. fastmcp/settings.py +0 -17
  28. fastmcp/tools/tool.py +209 -57
  29. fastmcp/tools/tool_manager.py +2 -3
  30. fastmcp/tools/tool_transform.py +125 -26
  31. fastmcp/utilities/components.py +5 -1
  32. fastmcp/utilities/json_schema_type.py +648 -0
  33. fastmcp/utilities/openapi.py +69 -0
  34. fastmcp/utilities/types.py +50 -19
  35. {fastmcp-2.9.2.dist-info → fastmcp-2.10.1.dist-info}/METADATA +3 -2
  36. {fastmcp-2.9.2.dist-info → fastmcp-2.10.1.dist-info}/RECORD +39 -31
  37. {fastmcp-2.9.2.dist-info → fastmcp-2.10.1.dist-info}/WHEEL +0 -0
  38. {fastmcp-2.9.2.dist-info → fastmcp-2.10.1.dist-info}/entry_points.txt +0 -0
  39. {fastmcp-2.9.2.dist-info → fastmcp-2.10.1.dist-info}/licenses/LICENSE +0 -0
@@ -39,6 +39,60 @@ ParameterLocation = Literal["path", "query", "header", "cookie"]
39
39
  JsonSchema = dict[str, Any]
40
40
 
41
41
 
42
+ def format_array_parameter(
43
+ values: list, parameter_name: str, is_query_parameter: bool = False
44
+ ) -> str | list:
45
+ """
46
+ Format an array parameter according to OpenAPI specifications.
47
+
48
+ Args:
49
+ values: List of values to format
50
+ parameter_name: Name of the parameter (for error messages)
51
+ is_query_parameter: If True, can return list for explode=True behavior
52
+
53
+ Returns:
54
+ String (comma-separated) or list (for query params with explode=True)
55
+ """
56
+ # For arrays of simple types (strings, numbers, etc.), join with commas
57
+ if all(isinstance(item, str | int | float | bool) for item in values):
58
+ return ",".join(str(v) for v in values)
59
+
60
+ # For complex types, try to create a simpler representation
61
+ try:
62
+ # Try to create a simple string representation
63
+ formatted_parts = []
64
+ for item in values:
65
+ if isinstance(item, dict):
66
+ # For objects, serialize key-value pairs
67
+ item_parts = []
68
+ for k, v in item.items():
69
+ item_parts.append(f"{k}:{v}")
70
+ formatted_parts.append(".".join(item_parts))
71
+ else:
72
+ formatted_parts.append(str(item))
73
+
74
+ return ",".join(formatted_parts)
75
+ except Exception as e:
76
+ param_type = "query" if is_query_parameter else "path"
77
+ logger.warning(
78
+ f"Failed to format complex array {param_type} parameter '{parameter_name}': {e}"
79
+ )
80
+
81
+ if is_query_parameter:
82
+ # For query parameters, fallback to original list
83
+ return values
84
+ else:
85
+ # For path parameters, fallback to string representation without Python syntax
86
+ str_value = (
87
+ str(values)
88
+ .replace("[", "")
89
+ .replace("]", "")
90
+ .replace("'", "")
91
+ .replace('"', "")
92
+ )
93
+ return str_value
94
+
95
+
42
96
  class ParameterInfo(FastMCPBaseModel):
43
97
  """Represents a single parameter for an HTTP operation in our IR."""
44
98
 
@@ -47,6 +101,7 @@ class ParameterInfo(FastMCPBaseModel):
47
101
  required: bool = False
48
102
  schema_: JsonSchema = Field(..., alias="schema") # Target name in IR
49
103
  description: str | None = None
104
+ explode: bool | None = None # OpenAPI explode property for array parameters
50
105
 
51
106
 
52
107
  class RequestBodyInfo(FastMCPBaseModel):
@@ -84,6 +139,7 @@ class HTTPRoute(FastMCPBaseModel):
84
139
  schema_definitions: dict[str, JsonSchema] = Field(
85
140
  default_factory=dict
86
141
  ) # Store component schemas
142
+ extensions: dict[str, Any] = Field(default_factory=dict)
87
143
 
88
144
 
89
145
  # Export public symbols
@@ -358,6 +414,9 @@ class OpenAPIParser(
358
414
  ):
359
415
  param_schema_dict["default"] = resolved_media_schema.default
360
416
 
417
+ # Extract explode property if present
418
+ explode = getattr(parameter, "explode", None)
419
+
361
420
  # Create parameter info object
362
421
  param_info = ParameterInfo(
363
422
  name=parameter.name,
@@ -365,6 +424,7 @@ class OpenAPIParser(
365
424
  required=parameter.required,
366
425
  schema=param_schema_dict,
367
426
  description=parameter.description,
427
+ explode=explode,
368
428
  )
369
429
  extracted_params.append(param_info)
370
430
  except Exception as e:
@@ -591,6 +651,14 @@ class OpenAPIParser(
591
651
  getattr(operation, "responses", None)
592
652
  )
593
653
 
654
+ extensions = {}
655
+ if hasattr(operation, "model_extra") and operation.model_extra:
656
+ extensions = {
657
+ k: v
658
+ for k, v in operation.model_extra.items()
659
+ if k.startswith("x-")
660
+ }
661
+
594
662
  route = HTTPRoute(
595
663
  path=path_str,
596
664
  method=method_upper, # type: ignore[arg-type] # Known valid HTTP method
@@ -602,6 +670,7 @@ class OpenAPIParser(
602
670
  request_body=request_body_info,
603
671
  responses=responses,
604
672
  schema_definitions=schema_definitions,
673
+ extensions=extensions,
605
674
  )
606
675
  routes.append(route)
607
676
  logger.info(
@@ -6,23 +6,18 @@ import mimetypes
6
6
  from collections.abc import Callable
7
7
  from functools import lru_cache
8
8
  from pathlib import Path
9
- from types import UnionType
9
+ from types import EllipsisType, UnionType
10
10
  from typing import Annotated, TypeAlias, TypeVar, Union, get_args, get_origin
11
11
 
12
- from mcp.types import (
13
- Annotations,
14
- AudioContent,
15
- BlobResourceContents,
16
- EmbeddedResource,
17
- ImageContent,
18
- TextContent,
19
- TextResourceContents, # Added import
20
- )
12
+ import mcp.types
13
+ from mcp.types import Annotations
21
14
  from pydantic import AnyUrl, BaseModel, ConfigDict, TypeAdapter, UrlConstraints
22
15
 
23
16
  T = TypeVar("T")
24
17
 
25
- MCPContent: TypeAlias = TextContent | ImageContent | AudioContent | EmbeddedResource
18
+ # sentinel values for optional arguments
19
+ NotSet = ...
20
+ NotSetT: TypeAlias = EllipsisType
26
21
 
27
22
 
28
23
  class FastMCPBaseModel(BaseModel):
@@ -132,7 +127,7 @@ class Image:
132
127
  self,
133
128
  mime_type: str | None = None,
134
129
  annotations: Annotations | None = None,
135
- ) -> ImageContent:
130
+ ) -> mcp.types.ImageContent:
136
131
  """Convert to MCP ImageContent."""
137
132
  if self.path:
138
133
  with open(self.path, "rb") as f:
@@ -142,7 +137,7 @@ class Image:
142
137
  else:
143
138
  raise ValueError("No image data available")
144
139
 
145
- return ImageContent(
140
+ return mcp.types.ImageContent(
146
141
  type="image",
147
142
  data=data,
148
143
  mimeType=mime_type or self._mime_type,
@@ -191,7 +186,7 @@ class Audio:
191
186
  self,
192
187
  mime_type: str | None = None,
193
188
  annotations: Annotations | None = None,
194
- ) -> AudioContent:
189
+ ) -> mcp.types.AudioContent:
195
190
  if self.path:
196
191
  with open(self.path, "rb") as f:
197
192
  data = base64.b64encode(f.read()).decode()
@@ -200,7 +195,7 @@ class Audio:
200
195
  else:
201
196
  raise ValueError("No audio data available")
202
197
 
203
- return AudioContent(
198
+ return mcp.types.AudioContent(
204
199
  type="audio",
205
200
  data=data,
206
201
  mimeType=mime_type or self._mime_type,
@@ -251,7 +246,7 @@ class File:
251
246
  self,
252
247
  mime_type: str | None = None,
253
248
  annotations: Annotations | None = None,
254
- ) -> EmbeddedResource:
249
+ ) -> mcp.types.EmbeddedResource:
255
250
  if self.path:
256
251
  with open(self.path, "rb") as f:
257
252
  raw_data = f.read()
@@ -274,21 +269,57 @@ class File:
274
269
  text = raw_data.decode("utf-8")
275
270
  except UnicodeDecodeError:
276
271
  text = raw_data.decode("latin-1")
277
- resource = TextResourceContents(
272
+ resource = mcp.types.TextResourceContents(
278
273
  text=text,
279
274
  mimeType=mime,
280
275
  uri=uri,
281
276
  )
282
277
  else:
283
278
  data = base64.b64encode(raw_data).decode()
284
- resource = BlobResourceContents(
279
+ resource = mcp.types.BlobResourceContents(
285
280
  blob=data,
286
281
  mimeType=mime,
287
282
  uri=uri,
288
283
  )
289
284
 
290
- return EmbeddedResource(
285
+ return mcp.types.EmbeddedResource(
291
286
  type="resource",
292
287
  resource=resource,
293
288
  annotations=annotations or self.annotations,
294
289
  )
290
+
291
+
292
+ def replace_type(type_, type_map: dict[type, type]):
293
+ """
294
+ Given a (possibly generic, nested, or otherwise complex) type, replaces all
295
+ instances of old_type with new_type.
296
+
297
+ This is useful for transforming types when creating tools.
298
+
299
+ Args:
300
+ type_: The type to replace instances of old_type with new_type.
301
+ old_type: The type to replace.
302
+ new_type: The type to replace old_type with.
303
+
304
+ Examples:
305
+ >>> replace_type(list[int | bool], {int: str})
306
+ list[str | bool]
307
+
308
+ >>> replace_type(list[list[int]], {int: str})
309
+ list[list[str]]
310
+
311
+ """
312
+ if type_ in type_map:
313
+ return type_map[type_]
314
+
315
+ origin = get_origin(type_)
316
+ if not origin:
317
+ return type_
318
+
319
+ args = get_args(type_)
320
+ new_args = tuple(replace_type(arg, type_map) for arg in args)
321
+
322
+ if origin is UnionType:
323
+ return Union[new_args] # type: ignore # noqa: UP007
324
+ else:
325
+ return origin[new_args]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastmcp
3
- Version: 2.9.2
3
+ Version: 2.10.1
4
4
  Summary: The fast, Pythonic way to build MCP servers.
5
5
  Project-URL: Homepage, https://gofastmcp.com
6
6
  Project-URL: Repository, https://github.com/jlowin/fastmcp
@@ -20,8 +20,9 @@ Requires-Python: >=3.10
20
20
  Requires-Dist: authlib>=1.5.2
21
21
  Requires-Dist: exceptiongroup>=1.2.2
22
22
  Requires-Dist: httpx>=0.28.1
23
- Requires-Dist: mcp<1.10.0,>=1.9.4
23
+ Requires-Dist: mcp>=1.10.0
24
24
  Requires-Dist: openapi-pydantic>=0.5.1
25
+ Requires-Dist: pydantic[email]>=2.11.7
25
26
  Requires-Dist: python-dotenv>=1.1.0
26
27
  Requires-Dist: rich>=13.9.4
27
28
  Requires-Dist: typer>=0.15.2
@@ -1,78 +1,86 @@
1
1
  fastmcp/__init__.py,sha256=5ChT4kg3srdFl0-9dZekGqpzCESlpc6ohrfPbWf1aTo,1300
2
2
  fastmcp/exceptions.py,sha256=-krEavxwddQau6T7MESCR4VjKNLfP9KHJrU1p3y72FU,744
3
3
  fastmcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- fastmcp/settings.py,sha256=2IgZ2cOiwr_bVWkFgY4BZxDKFnayZpCN4q3iT_FEfyE,9011
4
+ fastmcp/settings.py,sha256=yC3f0ITEWYeit37-wnF0G12klTw_hjrWjCr6oZtUT8o,8329
5
5
  fastmcp/cli/__init__.py,sha256=Ii284TNoG5lxTP40ETMGhHEq3lQZWxu9m9JuU57kUpQ,87
6
6
  fastmcp/cli/claude.py,sha256=IAlcZ4qZKBBj09jZUMEx7EANZE_IR3vcu7zOBJmMOuU,4567
7
7
  fastmcp/cli/cli.py,sha256=598s1S-KdqIB85mwqvXJaBVen6xYY65ek4v-q3lmY4k,15933
8
8
  fastmcp/cli/run.py,sha256=Pw3vH5wKRHfbmHRn0saIbC4l450KPOzeQbzPFqG4AbY,6208
9
9
  fastmcp/client/__init__.py,sha256=kd2hhSuD8rZuF87c9zlPJP_icJ-Rx3exyNoK0EzfOtE,617
10
- fastmcp/client/client.py,sha256=BmWALAw1PgJGm3Gokpsc0vSamqYES2jM2egEo6q4JHk,25664
10
+ fastmcp/client/client.py,sha256=8Sx7NxnnF5IMv9E-J0MXjTI_TfhlM3j0mD1Rh-LXQJI,29213
11
+ fastmcp/client/elicitation.py,sha256=8eWZpXbRFctZGgulyJ_GGI4GYXqAFf5Zp47vYTRD4fc,2155
11
12
  fastmcp/client/logging.py,sha256=7GJ-BLFW16_IOJPlGTNEWPP0P-yqqRpmsLdiKrlVsw8,757
12
13
  fastmcp/client/messages.py,sha256=NIPjt-5js_DkI5BD4OVdTf6pz-nGjc2dtbgt-vAY234,4329
13
14
  fastmcp/client/oauth_callback.py,sha256=ODAnVX-ettL82RuI5KpfkKf8iDtYMDue3Tnab5sjQtM,10071
14
15
  fastmcp/client/progress.py,sha256=WjLLDbUKMsx8DK-fqO7AGsXb83ak-6BMrLvzzznGmcI,1043
15
16
  fastmcp/client/roots.py,sha256=IxI_bHwHTmg6c2H-s1av1ZgrRnNDieHtYwdGFbzXT5c,2471
16
17
  fastmcp/client/sampling.py,sha256=Q8PzYCERa1W3xGGI9I9QOhhDM-M4i3P5lESb0cp2iI8,1595
17
- fastmcp/client/transports.py,sha256=K_5hBTGuJ7iuseQ4Hkjl1ypgdJwZ-Sdt0xgxxEy1W7w,33472
18
+ fastmcp/client/transports.py,sha256=liHLuOcgKotdlhTJBOiSn73WX0v7mnFa853hJBdu-2E,33898
18
19
  fastmcp/client/auth/__init__.py,sha256=4DNsfp4iaQeBcpds0JDdMn6Mmfud44stWLsret0sVKY,91
19
20
  fastmcp/client/auth/bearer.py,sha256=MFEFqcH6u_V86msYiOsEFKN5ks1V9BnBNiPsPLHUTqo,399
20
- fastmcp/client/auth/oauth.py,sha256=Gu0P4M6875dinVNqjczcJsJJIJNrkoA7UqrSx5NuuwE,14692
21
+ fastmcp/client/auth/oauth.py,sha256=pSyuI0FlRK1qkBA6mvq-bxKzl2B-pMCvPPzIByTJBEo,11745
21
22
  fastmcp/contrib/README.md,sha256=rKknYSI1T192UvSszqwwDlQ2eYQpxywrNTLoj177SYU,878
22
23
  fastmcp/contrib/bulk_tool_caller/README.md,sha256=5aUUY1TSFKtz1pvTLSDqkUCkGkuqMfMZNsLeaNqEgAc,1960
23
24
  fastmcp/contrib/bulk_tool_caller/__init__.py,sha256=xvGSSaUXTQrc31erBoi1Gh7BikgOliETDiYVTP3rLxY,75
24
25
  fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py,sha256=2NcrGS59qvHo1lfbRaT8NSWfCxN66knciLxFvnGwCLY,4165
25
26
  fastmcp/contrib/bulk_tool_caller/example.py,sha256=6og_8pCJN_CabworC5R82zPAwwwM-W7HNJLQQSnS3lU,319
27
+ fastmcp/contrib/component_manager/README.md,sha256=sTan1D51jzkPNnCQTxwd5JXGzWVy4DtkUjrUfNH3-F0,4457
28
+ fastmcp/contrib/component_manager/__init__.py,sha256=4bppVrCOSEepKmBRwVWN-ndu5BYAz1Kv2Z8yhjEUmlo,164
29
+ fastmcp/contrib/component_manager/component_manager.py,sha256=4R1FPVYjCr-j7Mn6OcbHH-psl9-JTdd1hgNZHasC52Y,6412
30
+ fastmcp/contrib/component_manager/component_service.py,sha256=dLIOtXvMpCAu8CGlrqAWb9pX0AhVGqkC4j0uxv6XnXs,8759
31
+ fastmcp/contrib/component_manager/example.py,sha256=AdFrUoN2jhtnF4JE4ywRg6O4oP8lZ3S64ds0mRTH3sg,1604
26
32
  fastmcp/contrib/mcp_mixin/README.md,sha256=X6rzt_4vC_rmq9jbHmrVPqYLGVVlw9b4TVL4H_0SMmQ,4277
27
33
  fastmcp/contrib/mcp_mixin/__init__.py,sha256=aw9IQ1ssNjCgws4ZNt8bkdpossAAGVAwwjBpMp9O5ZQ,153
28
34
  fastmcp/contrib/mcp_mixin/example.py,sha256=GnunkXmtG5hLLTUsM8aW5ZURU52Z8vI4tNLl-fK7Dg0,1228
29
35
  fastmcp/contrib/mcp_mixin/mcp_mixin.py,sha256=sUSJ2o0sTsb061MyPN2xuYP0oI4W6YVQXupY3nnjD50,8687
30
36
  fastmcp/prompts/__init__.py,sha256=An8uMBUh9Hrb7qqcn_5_Hent7IOeSh7EA2IUVsIrtHc,179
31
- fastmcp/prompts/prompt.py,sha256=dtJgKPXL8Yj_rRPy9Oy_6ZQn3IaX2tqieqQ0vIk7xiU,13725
37
+ fastmcp/prompts/prompt.py,sha256=ee7DT32pw0H0k0ON8a63Eu0kQ3G1zMGlWXIFRDV8p7E,13925
32
38
  fastmcp/prompts/prompt_manager.py,sha256=Pt9cg_c9FR2EA0ITIHJT5Utihkd383JzhqhT-y2VnKo,7677
33
39
  fastmcp/resources/__init__.py,sha256=y1iAuqx-GIrS1NqIYzKezIDiYyjNEzzHD35epHpMnXE,463
34
- fastmcp/resources/resource.py,sha256=aiM0T61-P_GcLboIhWC16VPceWomDY4CTHIcIoAUqOY,5896
40
+ fastmcp/resources/resource.py,sha256=fN_ck9fgFG_ciHV9reXDNe-dWzqEZ7XV4p3U7z-yf4k,6050
35
41
  fastmcp/resources/resource_manager.py,sha256=zjhso9ZP0EK_beTpUz_amqJ7XSABqU8mqPSk-JturOE,19777
36
- fastmcp/resources/template.py,sha256=hf5cPEz3aSky1wPjGSEz9npnJNcMcfOZxYhG-v99FXs,10195
42
+ fastmcp/resources/template.py,sha256=rYEfwNWVJZnlTp6uSKbGNL0OlaUqOoKRjmg4hesLXVU,10346
37
43
  fastmcp/resources/types.py,sha256=SiYNLnpXT-mHgNUrzqKUvXYUsY-V3gwJIrYdJfFwDDo,4868
38
44
  fastmcp/server/__init__.py,sha256=bMD4aQD4yJqLz7-mudoNsyeV8UgQfRAg3PRwPvwTEds,119
39
- fastmcp/server/context.py,sha256=425vsDfoiTJ5wVbRdq_eqYr_RkrNqSwFH8YJpENWewY,14525
45
+ fastmcp/server/context.py,sha256=OFkdgT53NkN_VYwwHjdR2C_28CWtPsFln36X0QLM23g,20258
40
46
  fastmcp/server/dependencies.py,sha256=iKJdz1XsVJcrfHo_reXj9ZSldw-HeAwsp9S6lAgfGA8,2358
41
- fastmcp/server/http.py,sha256=gwovXTVKd7UR_mrbMP3WI3eaxFKvZcxwjm3RwKxL6wU,12055
42
- fastmcp/server/low_level.py,sha256=yPusWSidyEzDbrB9kBfXkARBc4pc523KFqYxLuR64Ww,1184
43
- fastmcp/server/openapi.py,sha256=rF8umkOQGLejDVH7Ef36QdMmjv6zwPB5tmkgmQscM7A,39539
44
- fastmcp/server/proxy.py,sha256=nz8DSDMd3LWDgtI2a3l3-EYn2i45wvgxx7zdLMs8C84,14944
45
- fastmcp/server/server.py,sha256=6ds3Z5ruJn5tth0Cg7hP-U1i27AVS9uDoiq00vpCvXI,78824
47
+ fastmcp/server/elicitation.py,sha256=jZIHjV4NjhYbT-w8pBArwd0vNzP8OYwzmsnWDdk6Bd0,6136
48
+ fastmcp/server/http.py,sha256=d0Jij4HVTaAohluRXArSniXLb1HcHP3ytbe-mMHg6nE,11678
49
+ fastmcp/server/low_level.py,sha256=LNmc_nU_wx-fRG8OEHdLPKopZpovcrWlyAxJzKss3TA,1239
50
+ fastmcp/server/openapi.py,sha256=ALIbl0r2T1cvbSeFwz6HpIzut2akdngAtKDdWGyIWHs,36221
51
+ fastmcp/server/proxy.py,sha256=Ofx7P5rU7mKVPDjvvIKjQS7_C1w4-1UiKc78x7AdjN8,15211
52
+ fastmcp/server/server.py,sha256=XKt0vGwQNopBnYvciJtbJ_FVDt1uuwwuxrAcrVBJGa8,79703
46
53
  fastmcp/server/auth/__init__.py,sha256=doHCLwOIElvH1NrTdpeP9JKfnNf3MDYPSpQfdsQ-uI0,84
47
- fastmcp/server/auth/auth.py,sha256=kz02HGwXYU0N0clURZDjFNWdKSpTYmgmCnGJN-jSG3Y,1640
54
+ fastmcp/server/auth/auth.py,sha256=A00OKxglEMrGMMIiMbc6UmpGc2VoWDkEVU5g2pIzDIg,2119
48
55
  fastmcp/server/auth/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- fastmcp/server/auth/providers/bearer.py,sha256=lRtElzrFw23ZXD_eukqCtGNBxKQhKLwO9v-UE-HT3yU,15232
50
- fastmcp/server/auth/providers/bearer_env.py,sha256=zHbJmzT6RhEW9tGG-_aRACQ_t0GwXCvKEAnKQLCO9mY,1892
51
- fastmcp/server/auth/providers/in_memory.py,sha256=_8hRo6KZEVqsSSMNxpseJH48LZEywF4uZ687XuOmqYw,13772
52
- fastmcp/server/middleware/__init__.py,sha256=sKrgbpTlaVdzg_bL8ZI5SGf7EceVqqFUcUr9rvt1r08,112
56
+ fastmcp/server/auth/providers/bearer.py,sha256=iRExt5hRKmrwr7MjsUN-UdQDe-iCSjH7sNCURaK7HBs,16456
57
+ fastmcp/server/auth/providers/bearer_env.py,sha256=NYPCW363Q8u8BdiPPz1FdB3_kwmbCaWT5yKdAO-ZgwA,2081
58
+ fastmcp/server/auth/providers/in_memory.py,sha256=Sb3GOtLL2bWbm8z-T8cEsMz1qcQUSHpPEEgYRvTOQi4,14251
59
+ fastmcp/server/middleware/__init__.py,sha256=m1QJFQ7JW_2JHpJp1FurBNYaxbBUa_HyDn1Bw9mtyvc,367
53
60
  fastmcp/server/middleware/error_handling.py,sha256=SoDatr9i3T2qSIUbSEGWrOnu4WPPyMDymnsF5GR_BiE,7572
54
- fastmcp/server/middleware/logging.py,sha256=igGYQiQ7zvkbhN35kU9LWT7-0cSpH7V-31m6yg6ddSc,5732
55
- fastmcp/server/middleware/middleware.py,sha256=v6nKcphMhCxwDvbtffPYHHl-WYr9V09czaBRNi-ebqI,6882
61
+ fastmcp/server/middleware/logging.py,sha256=UIAoafnKRGWpQa7OX5nzChep-9EhKdyTDBmmcRcEVdo,6239
62
+ fastmcp/server/middleware/middleware.py,sha256=1Zy5KdBCrGzqFIpYZqWlZq9rLK3NDlRiXhJ2j-YGKeQ,6961
56
63
  fastmcp/server/middleware/rate_limiting.py,sha256=VTrCoQFmWCm0BxwOrNfG21CBFDDOKJT7IiSEjpJgmPA,7921
57
64
  fastmcp/server/middleware/timing.py,sha256=lL_xc-ErLD5lplfvd5-HIyWEbZhgNBYkcQ74KFXAMkA,5591
58
65
  fastmcp/tools/__init__.py,sha256=vzqb-Y7Kf0d5T0aOsld-O-FA8kD7-4uFExChewFHEzY,201
59
- fastmcp/tools/tool.py,sha256=sG102iHn7iM58sGXFJ8CIfjUHRyEhh2fxnzgcrZBBSc,11734
60
- fastmcp/tools/tool_manager.py,sha256=TGO17cs9A2CGVnNk6RViu9dgPN8xYQE0x1c8JBfIbgc,7780
61
- fastmcp/tools/tool_transform.py,sha256=pXuYLdRjiutPlil88wssUSiqnit7hHz_51ELY_6EU6E,28001
66
+ fastmcp/tools/tool.py,sha256=DsoF0QNTl4i_w0FqqmdbK_1poZtfj1j6mv5kuf8zH1Y,17524
67
+ fastmcp/tools/tool_manager.py,sha256=Sm_tOO-SY0m7tEN_dofP-tvBnC2HroPRKLU6sp8gnUw,7739
68
+ fastmcp/tools/tool_transform.py,sha256=YY2DZdJZ6fEGtgEP1Djrc49F8rAEyx6fgRGEyIGaxPE,32601
62
69
  fastmcp/utilities/__init__.py,sha256=-imJ8S-rXmbXMWeDamldP-dHDqAPg_wwmPVz-LNX14E,31
63
70
  fastmcp/utilities/cache.py,sha256=aV3oZ-ZhMgLSM9iAotlUlEy5jFvGXrVo0Y5Bj4PBtqY,707
64
- fastmcp/utilities/components.py,sha256=JhXTFWQ2lUe5h2eDVKQLVWnVfvQ77iCbBxE4CYQEuTs,2382
71
+ fastmcp/utilities/components.py,sha256=WIxNVZ7YxCLpdIm_pbTYeP0lAxikvgptVYhIL0LVmCc,2535
65
72
  fastmcp/utilities/exceptions.py,sha256=7Z9j5IzM5rT27BC1Mcn8tkS-bjqCYqMKwb2MMTaxJYU,1350
66
73
  fastmcp/utilities/http.py,sha256=1ns1ymBS-WSxbZjGP6JYjSO52Wa_ls4j4WbnXiupoa4,245
67
74
  fastmcp/utilities/inspect.py,sha256=XNA0dfYM5G-FVbJaVJO8loSUUCNypyLA-QjqTOneJyU,10833
68
75
  fastmcp/utilities/json_schema.py,sha256=K0QH5UazBD_tweBi-TguWYjUu5Lgp9wcM-wT42Fet5w,5022
76
+ fastmcp/utilities/json_schema_type.py,sha256=Sml03nJGOnUfxCGrHWRMwZMultV0X5JThMepUnHIUiA,22377
69
77
  fastmcp/utilities/logging.py,sha256=B1WNO-ZWFjd9wiFSh13YtW1hAKaNmbpscDZleIAhr-g,1317
70
78
  fastmcp/utilities/mcp_config.py,sha256=ryjAfJUPquDSoKdSymPH4M2B0WvuM3pWUGI3cOgAX80,2782
71
- fastmcp/utilities/openapi.py,sha256=llB7T0x3QI0VlPNiL0Qh1L5RkmJLc8EO0TyA0GC70N4,42578
79
+ fastmcp/utilities/openapi.py,sha256=neeaXwwn1OWdUp0Gawhx4SJHLfV78gXU5OMMTFGeD24,45235
72
80
  fastmcp/utilities/tests.py,sha256=O9hRSjnyaYQqu1RJ-CFBw1cIjezlwSQtS-Ea_iqO4sY,3899
73
- fastmcp/utilities/types.py,sha256=XfTwZU1MhBfMCPU5SDNu3z8-D_yaLbw_PfoXCZOm530,9589
74
- fastmcp-2.9.2.dist-info/METADATA,sha256=BRqDiaXqeDy1b2XRGYczSsqxufU4I8XNMKNHhSDqcPk,17763
75
- fastmcp-2.9.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
76
- fastmcp-2.9.2.dist-info/entry_points.txt,sha256=ff8bMtKX1JvXyurMibAacMSKbJEPmac9ffAKU9mLnM8,44
77
- fastmcp-2.9.2.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
78
- fastmcp-2.9.2.dist-info/RECORD,,
81
+ fastmcp/utilities/types.py,sha256=SWtzKpIr9TMeOE6TyPgqSi-SBXpWBPUnA5QPiP4nDzw,10512
82
+ fastmcp-2.10.1.dist-info/METADATA,sha256=I0_44sR-kc7BcTHdA1mLy4f9zASLk6hCiOWjrcxBfk8,17796
83
+ fastmcp-2.10.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
84
+ fastmcp-2.10.1.dist-info/entry_points.txt,sha256=ff8bMtKX1JvXyurMibAacMSKbJEPmac9ffAKU9mLnM8,44
85
+ fastmcp-2.10.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
86
+ fastmcp-2.10.1.dist-info/RECORD,,