fastmcp 2.11.2__py3-none-any.whl → 2.11.3__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.
fastmcp/server/server.py CHANGED
@@ -49,7 +49,7 @@ from fastmcp.prompts import Prompt, PromptManager
49
49
  from fastmcp.prompts.prompt import FunctionPrompt
50
50
  from fastmcp.resources import Resource, ResourceManager
51
51
  from fastmcp.resources.template import ResourceTemplate
52
- from fastmcp.server.auth.auth import AuthProvider
52
+ from fastmcp.server.auth import AuthProvider
53
53
  from fastmcp.server.auth.registry import get_registered_provider
54
54
  from fastmcp.server.http import (
55
55
  StarletteWithLifespan,
@@ -1891,7 +1891,7 @@ class FastMCP(Generic[LifespanResultT]):
1891
1891
  # Import tools from the server
1892
1892
  for key, tool in (await server.get_tools()).items():
1893
1893
  if prefix:
1894
- tool = tool.with_key(f"{prefix}_{key}")
1894
+ tool = tool.model_copy(key=f"{prefix}_{key}")
1895
1895
  self._tool_manager.add_tool(tool)
1896
1896
 
1897
1897
  # Import resources and templates from the server
@@ -1900,7 +1900,9 @@ class FastMCP(Generic[LifespanResultT]):
1900
1900
  resource_key = add_resource_prefix(
1901
1901
  key, prefix, self.resource_prefix_format
1902
1902
  )
1903
- resource = resource.with_key(resource_key)
1903
+ resource = resource.model_copy(
1904
+ update={"name": f"{prefix}_{resource.name}"}, key=resource_key
1905
+ )
1904
1906
  self._resource_manager.add_resource(resource)
1905
1907
 
1906
1908
  for key, template in (await server.get_resource_templates()).items():
@@ -1908,13 +1910,15 @@ class FastMCP(Generic[LifespanResultT]):
1908
1910
  template_key = add_resource_prefix(
1909
1911
  key, prefix, self.resource_prefix_format
1910
1912
  )
1911
- template = template.with_key(template_key)
1913
+ template = template.model_copy(
1914
+ update={"name": f"{prefix}_{template.name}"}, key=template_key
1915
+ )
1912
1916
  self._resource_manager.add_template(template)
1913
1917
 
1914
1918
  # Import prompts from the server
1915
1919
  for key, prompt in (await server.get_prompts()).items():
1916
1920
  if prefix:
1917
- prompt = prompt.with_key(f"{prefix}_{key}")
1921
+ prompt = prompt.model_copy(key=f"{prefix}_{key}")
1918
1922
  self._prompt_manager.add_prompt(prompt)
1919
1923
 
1920
1924
  if prefix:
fastmcp/settings.py CHANGED
@@ -222,9 +222,9 @@ class Settings(BaseSettings):
222
222
  # HTTP settings
223
223
  host: str = "127.0.0.1"
224
224
  port: int = 8000
225
- sse_path: str = "/sse/"
225
+ sse_path: str = "/sse"
226
226
  message_path: str = "/messages/"
227
- streamable_http_path: str = "/mcp/"
227
+ streamable_http_path: str = "/mcp"
228
228
  debug: bool = False
229
229
 
230
230
  # error handling
fastmcp/tools/tool.py CHANGED
@@ -8,7 +8,6 @@ from typing import (
8
8
  Annotated,
9
9
  Any,
10
10
  Generic,
11
- Literal,
12
11
  TypeVar,
13
12
  get_type_hints,
14
13
  )
@@ -163,7 +162,7 @@ class Tool(FastMCPComponent):
163
162
  tags: set[str] | None = None,
164
163
  annotations: ToolAnnotations | None = None,
165
164
  exclude_args: list[str] | None = None,
166
- output_schema: dict[str, Any] | None | NotSetT | Literal[False] = NotSet,
165
+ output_schema: dict[str, Any] | None | NotSetT = NotSet,
167
166
  serializer: Callable[[Any], str] | None = None,
168
167
  meta: dict[str, Any] | None = None,
169
168
  enabled: bool | None = None,
@@ -199,17 +198,18 @@ class Tool(FastMCPComponent):
199
198
  def from_tool(
200
199
  cls,
201
200
  tool: Tool,
202
- transform_fn: Callable[..., Any] | None = None,
201
+ *,
203
202
  name: str | None = None,
204
203
  title: str | None | NotSetT = NotSet,
205
- transform_args: dict[str, ArgTransform] | None = None,
206
204
  description: str | None | NotSetT = NotSet,
207
205
  tags: set[str] | None = None,
208
- annotations: ToolAnnotations | None = None,
209
- output_schema: dict[str, Any] | None | Literal[False] = None,
206
+ annotations: ToolAnnotations | None | NotSetT = NotSet,
207
+ output_schema: dict[str, Any] | None | NotSetT = NotSet,
210
208
  serializer: Callable[[Any], str] | None = None,
211
209
  meta: dict[str, Any] | None | NotSetT = NotSet,
210
+ transform_args: dict[str, ArgTransform] | None = None,
212
211
  enabled: bool | None = None,
212
+ transform_fn: Callable[..., Any] | None = None,
213
213
  ) -> TransformedTool:
214
214
  from fastmcp.tools.tool_transform import TransformedTool
215
215
 
@@ -242,7 +242,7 @@ class FunctionTool(Tool):
242
242
  tags: set[str] | None = None,
243
243
  annotations: ToolAnnotations | None = None,
244
244
  exclude_args: list[str] | None = None,
245
- output_schema: dict[str, Any] | None | NotSetT | Literal[False] = NotSet,
245
+ output_schema: dict[str, Any] | None | NotSetT = NotSet,
246
246
  serializer: Callable[[Any], str] | None = None,
247
247
  meta: dict[str, Any] | None = None,
248
248
  enabled: bool | None = None,
@@ -75,7 +75,9 @@ class ToolManager:
75
75
  child_dict = {t.key: t for t in child_results}
76
76
  if mounted.prefix:
77
77
  for tool in child_dict.values():
78
- prefixed_tool = tool.with_key(f"{mounted.prefix}_{tool.key}")
78
+ prefixed_tool = tool.model_copy(
79
+ key=f"{mounted.prefix}_{tool.key}"
80
+ )
79
81
  all_tools[prefixed_tool.key] = prefixed_tool
80
82
  else:
81
83
  all_tools.update(child_dict)
@@ -6,6 +6,7 @@ from contextvars import ContextVar
6
6
  from dataclasses import dataclass
7
7
  from typing import Annotated, Any, Literal
8
8
 
9
+ import pydantic_core
9
10
  from mcp.types import ToolAnnotations
10
11
  from pydantic import ConfigDict
11
12
  from pydantic.fields import Field
@@ -312,11 +313,9 @@ class TransformedTool(Tool):
312
313
  # Custom function returns ToolResult - preserve its content
313
314
  return result
314
315
  else:
315
- # Forwarded call with disabled schema - strip structured content
316
- return ToolResult(
317
- content=result.content,
318
- structured_content=None,
319
- )
316
+ # Forwarded call with no explicit schema - preserve parent's structured content
317
+ # The parent tool may have generated structured content via its own fallback logic
318
+ return result
320
319
  elif self.output_schema.get(
321
320
  "type"
322
321
  ) != "object" and not self.output_schema.get("x-fastmcp-wrap-result"):
@@ -334,17 +333,23 @@ class TransformedTool(Tool):
334
333
  result, serializer=self.serializer
335
334
  )
336
335
 
337
- # Handle structured content based on output schema
336
+ structured_output = None
337
+ # First handle structured content based on output schema, if any
338
338
  if self.output_schema is not None:
339
339
  if self.output_schema.get("x-fastmcp-wrap-result"):
340
340
  # Schema says wrap - always wrap in result key
341
341
  structured_output = {"result": result}
342
342
  else:
343
- # Object schemas - use result directly
344
- # User is responsible for returning dict-compatible data
345
343
  structured_output = result
346
- else:
347
- structured_output = None
344
+ # If no output schema, try to serialize the result. If it is a dict, use
345
+ # it as structured content. If it is not a dict, ignore it.
346
+ if structured_output is None:
347
+ try:
348
+ structured_output = pydantic_core.to_jsonable_python(result)
349
+ if not isinstance(structured_output, dict):
350
+ structured_output = None
351
+ except Exception:
352
+ pass
348
353
 
349
354
  return ToolResult(
350
355
  content=unstructured_result,
@@ -363,9 +368,9 @@ class TransformedTool(Tool):
363
368
  tags: set[str] | None = None,
364
369
  transform_fn: Callable[..., Any] | None = None,
365
370
  transform_args: dict[str, ArgTransform] | None = None,
366
- annotations: ToolAnnotations | None = None,
367
- output_schema: dict[str, Any] | None | Literal[False] = None,
368
- serializer: Callable[[Any], str] | None = None,
371
+ annotations: ToolAnnotations | None | NotSetT = NotSet,
372
+ output_schema: dict[str, Any] | None | NotSetT = NotSet,
373
+ serializer: Callable[[Any], str] | None | NotSetT = NotSet,
369
374
  meta: dict[str, Any] | None | NotSetT = NotSet,
370
375
  enabled: bool | None = None,
371
376
  ) -> TransformedTool:
@@ -445,6 +450,11 @@ class TransformedTool(Tool):
445
450
  """
446
451
  transform_args = transform_args or {}
447
452
 
453
+ if transform_fn is not None:
454
+ parsed_fn = ParsedFunction.from_function(transform_fn, validate=False)
455
+ else:
456
+ parsed_fn = None
457
+
448
458
  # Validate transform_args
449
459
  parent_params = set(tool.parameters.get("properties", {}).keys())
450
460
  unknown_args = set(transform_args.keys()) - parent_params
@@ -457,16 +467,11 @@ class TransformedTool(Tool):
457
467
  # Always create the forwarding transform
458
468
  schema, forwarding_fn = cls._create_forwarding_transform(tool, transform_args)
459
469
 
460
- # Handle output schema with smart fallback
461
- if output_schema is False:
462
- final_output_schema = None
463
- elif output_schema is not None:
464
- # Explicit schema provided - use as-is
465
- final_output_schema = output_schema
466
- else:
467
- # Smart fallback: try custom function, then parent, then None
470
+ # Handle output schema
471
+ if output_schema is NotSet:
472
+ # Use smart fallback: try custom function, then parent
468
473
  if transform_fn is not None:
469
- parsed_fn = ParsedFunction.from_function(transform_fn, validate=False)
474
+ assert parsed_fn is not None
470
475
  final_output_schema = parsed_fn.output_schema
471
476
  if final_output_schema is None:
472
477
  # Check if function returns ToolResult - if so, don't fall back to parent
@@ -479,15 +484,17 @@ class TransformedTool(Tool):
479
484
  final_output_schema = tool.output_schema
480
485
  else:
481
486
  final_output_schema = tool.output_schema
487
+ else:
488
+ assert isinstance(output_schema, dict | None)
489
+ final_output_schema = output_schema
482
490
 
483
491
  if transform_fn is None:
484
492
  # User wants pure transformation - use forwarding_fn as the main function
485
493
  final_fn = forwarding_fn
486
494
  final_schema = schema
487
495
  else:
496
+ assert parsed_fn is not None
488
497
  # User provided custom function - merge schemas
489
- if "parsed_fn" not in locals():
490
- parsed_fn = ParsedFunction.from_function(transform_fn, validate=False)
491
498
  final_fn = transform_fn
492
499
 
493
500
  has_kwargs = cls._function_has_kwargs(transform_fn)
@@ -552,6 +559,13 @@ class TransformedTool(Tool):
552
559
  )
553
560
  final_title = title if not isinstance(title, NotSetT) else tool.title
554
561
  final_meta = meta if not isinstance(meta, NotSetT) else tool.meta
562
+ final_annotations = (
563
+ annotations if not isinstance(annotations, NotSetT) else tool.annotations
564
+ )
565
+ final_serializer = (
566
+ serializer if not isinstance(serializer, NotSetT) else tool.serializer
567
+ )
568
+ final_enabled = enabled if enabled is not None else tool.enabled
555
569
 
556
570
  transformed_tool = cls(
557
571
  fn=final_fn,
@@ -563,11 +577,11 @@ class TransformedTool(Tool):
563
577
  parameters=final_schema,
564
578
  output_schema=final_output_schema,
565
579
  tags=tags or tool.tags,
566
- annotations=annotations or tool.annotations,
567
- serializer=serializer or tool.serializer,
580
+ annotations=final_annotations,
581
+ serializer=final_serializer,
568
582
  meta=final_meta,
569
583
  transform_args=transform_args,
570
- enabled=enabled if enabled is not None else True,
584
+ enabled=final_enabled,
571
585
  )
572
586
 
573
587
  return transformed_tool
@@ -91,12 +91,27 @@ class FastMCPComponent(FastMCPBaseModel):
91
91
 
92
92
  return meta or None
93
93
 
94
- def with_key(self, key: str) -> Self:
94
+ def model_copy(
95
+ self,
96
+ *,
97
+ update: dict[str, Any] | None = None,
98
+ deep: bool = False,
99
+ key: str | None = None,
100
+ ) -> Self:
101
+ """
102
+ Create a copy of the component.
103
+
104
+ Args:
105
+ update: A dictionary of fields to update.
106
+ deep: Whether to deep copy the component.
107
+ key: The key to use for the copy.
108
+ """
95
109
  # `model_copy` has an `update` parameter but it doesn't work for certain private attributes
96
110
  # https://github.com/pydantic/pydantic/issues/12116
97
- # So we manually set the private attribute here instead
98
- copy = self.model_copy()
99
- copy._key = key
111
+ # So we manually set the private attribute here instead, such as _key
112
+ copy = super().model_copy(update=update, deep=deep)
113
+ if key is not None:
114
+ copy._key = key
100
115
  return copy
101
116
 
102
117
  def __eq__(self, other: object) -> bool:
@@ -212,7 +212,7 @@ def parse_openapi_to_http_routes(openapi_dict: dict[str, Any]) -> list[HTTPRoute
212
212
  if openapi_version.startswith("3.0"):
213
213
  # Use OpenAPI 3.0 models
214
214
  openapi_30 = OpenAPI_30.model_validate(openapi_dict)
215
- logger.info(
215
+ logger.debug(
216
216
  f"Successfully parsed OpenAPI 3.0 schema version: {openapi_30.openapi}"
217
217
  )
218
218
  parser = OpenAPIParser(
@@ -230,7 +230,7 @@ def parse_openapi_to_http_routes(openapi_dict: dict[str, Any]) -> list[HTTPRoute
230
230
  else:
231
231
  # Default to OpenAPI 3.1 models
232
232
  openapi_31 = OpenAPI.model_validate(openapi_dict)
233
- logger.info(
233
+ logger.debug(
234
234
  f"Successfully parsed OpenAPI 3.1 schema version: {openapi_31.openapi}"
235
235
  )
236
236
  parser = OpenAPIParser(
@@ -713,7 +713,7 @@ class OpenAPIParser(
713
713
  openapi_version=self.openapi_version,
714
714
  )
715
715
  routes.append(route)
716
- logger.info(
716
+ logger.debug(
717
717
  f"Successfully extracted route: {method_upper} {path_str}"
718
718
  )
719
719
  except ValueError as op_error:
@@ -734,7 +734,7 @@ class OpenAPIParser(
734
734
  exc_info=True,
735
735
  )
736
736
 
737
- logger.info(f"Finished parsing. Extracted {len(routes)} HTTP routes.")
737
+ logger.debug(f"Finished parsing. Extracted {len(routes)} HTTP routes.")
738
738
  return routes
739
739
 
740
740
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastmcp
3
- Version: 2.11.2
3
+ Version: 2.11.3
4
4
  Summary: The fast, Pythonic way to build MCP servers and clients.
5
5
  Project-URL: Homepage, https://gofastmcp.com
6
6
  Project-URL: Repository, https://github.com/jlowin/fastmcp
@@ -21,7 +21,7 @@ Requires-Dist: authlib>=1.5.2
21
21
  Requires-Dist: cyclopts>=3.0.0
22
22
  Requires-Dist: exceptiongroup>=1.2.2
23
23
  Requires-Dist: httpx>=0.28.1
24
- Requires-Dist: mcp>=1.10.0
24
+ Requires-Dist: mcp<2.0.0,>=1.12.4
25
25
  Requires-Dist: openapi-core>=0.19.5
26
26
  Requires-Dist: openapi-pydantic>=0.5.1
27
27
  Requires-Dist: pydantic[email]>=2.11.7
@@ -2,7 +2,7 @@ fastmcp/__init__.py,sha256=B_FAqsxbTJmwvJKyIDMOZWpUUdmO806bKo8RR32oZL0,1503
2
2
  fastmcp/exceptions.py,sha256=-krEavxwddQau6T7MESCR4VjKNLfP9KHJrU1p3y72FU,744
3
3
  fastmcp/mcp_config.py,sha256=jf6VyGHli3GcZNg4spdV1L_lPOeNCKTJh-nGIBaMgn4,10324
4
4
  fastmcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- fastmcp/settings.py,sha256=LxSDlUmWX2SJLZRjX5ih07jAVIHaFZFRK7RCQPPKAGI,11081
5
+ fastmcp/settings.py,sha256=voLqpLRrTvq4zOSH024ISmROn0s1rCiTMcnw50q9BFc,11079
6
6
  fastmcp/cli/__init__.py,sha256=Ii284TNoG5lxTP40ETMGhHEq3lQZWxu9m9JuU57kUpQ,87
7
7
  fastmcp/cli/claude.py,sha256=IAlcZ4qZKBBj09jZUMEx7EANZE_IR3vcu7zOBJmMOuU,4567
8
8
  fastmcp/cli/cli.py,sha256=32OKZ49JKq3INqIlHXnZfFNTxQ2XYE1UkW3x5iTvtlI,15699
@@ -16,13 +16,13 @@ fastmcp/cli/install/shared.py,sha256=T-0R3-WMlmq5uRHYMEVbdItvm6zThzFET4AlI_foG7s
16
16
  fastmcp/client/__init__.py,sha256=J-RcLU2WcnYnstXWoW01itGtAg7DEjvCsWyqQKQljoo,663
17
17
  fastmcp/client/client.py,sha256=GniETS28L8B-ahzztU2ZLI_XSCcEib-miGzE2ZnG4Xc,34054
18
18
  fastmcp/client/elicitation.py,sha256=Jf9yqna8R7r1hqedXAyh9a2-QNVzbCSKUDZhkFHqHqg,2403
19
- fastmcp/client/logging.py,sha256=7GJ-BLFW16_IOJPlGTNEWPP0P-yqqRpmsLdiKrlVsw8,757
19
+ fastmcp/client/logging.py,sha256=uIC9aWGKqgTbxhRqkMBlnYfYjtanC1fqyWbRu5FY6AY,1670
20
20
  fastmcp/client/messages.py,sha256=NIPjt-5js_DkI5BD4OVdTf6pz-nGjc2dtbgt-vAY234,4329
21
21
  fastmcp/client/oauth_callback.py,sha256=2btKmVWEDqQDY7XaK_pt1gcV3LgaodDhljn33XmSSP4,10829
22
22
  fastmcp/client/progress.py,sha256=WjLLDbUKMsx8DK-fqO7AGsXb83ak-6BMrLvzzznGmcI,1043
23
23
  fastmcp/client/roots.py,sha256=IxI_bHwHTmg6c2H-s1av1ZgrRnNDieHtYwdGFbzXT5c,2471
24
24
  fastmcp/client/sampling.py,sha256=Q8PzYCERa1W3xGGI9I9QOhhDM-M4i3P5lESb0cp2iI8,1595
25
- fastmcp/client/transports.py,sha256=_uOTkKbMmVuG8lYQWdpBU8DOHWrGd11KLcFoTvLoKHc,35601
25
+ fastmcp/client/transports.py,sha256=EHhhy1aG0RszHSSjve5laz0goVcMbgkfP9lqZg1V9W0,35626
26
26
  fastmcp/client/auth/__init__.py,sha256=4DNsfp4iaQeBcpds0JDdMn6Mmfud44stWLsret0sVKY,91
27
27
  fastmcp/client/auth/bearer.py,sha256=MFEFqcH6u_V86msYiOsEFKN5ks1V9BnBNiPsPLHUTqo,399
28
28
  fastmcp/client/auth/oauth.py,sha256=qV-dfrJz34UN4kYVqkQyZ2ApAMI8ZFez0qx2zfs654k,10772
@@ -43,40 +43,40 @@ fastmcp/contrib/mcp_mixin/mcp_mixin.py,sha256=sUSJ2o0sTsb061MyPN2xuYP0oI4W6YVQXu
43
43
  fastmcp/experimental/server/openapi/README.md,sha256=1Mc1Ur15OxMn-wAPEa1rZIiNNSMdv9sboQ3YpvNpUXM,9886
44
44
  fastmcp/experimental/server/openapi/__init__.py,sha256=f1Mc7dkuRRJb_6-3umSHuyuXtvXTzH72t8gw1GBHgZU,772
45
45
  fastmcp/experimental/server/openapi/components.py,sha256=jp5xy0xkn14cFRk9FYlp3LpW-j44C0KcXvMQmdWVpB8,13237
46
- fastmcp/experimental/server/openapi/routing.py,sha256=qZuY0YeM51y_tTeAAeQMqI3BNRzA469tX1QhlzIn-JI,4174
47
- fastmcp/experimental/server/openapi/server.py,sha256=UV75LCZLtctqTBbcCeOs8-mmVP2bAs5v4l8ubWOgykY,16973
46
+ fastmcp/experimental/server/openapi/routing.py,sha256=d0lDBnWAayN2x--BXjdBlA7MC09TL_NiCaqCk2QUBHE,4165
47
+ fastmcp/experimental/server/openapi/server.py,sha256=gXxLWDewE1oaKsDESZpd0k5syRM20nbtgkA9f0srfz0,16255
48
48
  fastmcp/experimental/utilities/openapi/README.md,sha256=pOXftamuVXxEMlOt-JAfpuvHeRGauC3l46ntD1WzM-A,8604
49
- fastmcp/experimental/utilities/openapi/__init__.py,sha256=0I1BpkGbOeqveRKCvyKv6InZgsaUZBhIzeV1OXGy6aY,1671
49
+ fastmcp/experimental/utilities/openapi/__init__.py,sha256=4uba3nOrt8hAv1I91BWkg2hMo3O0VmYlSNG058xwmiA,1677
50
50
  fastmcp/experimental/utilities/openapi/director.py,sha256=0YnazKmfaSPkBRAz5aI6blFN9nzXJWru3fvU6llYltA,7859
51
- fastmcp/experimental/utilities/openapi/formatters.py,sha256=rtNuU-H6XqkPFiEAdcx1BdWnmHEM-zearPueMTuXdQY,14242
51
+ fastmcp/experimental/utilities/openapi/formatters.py,sha256=1RCd8DwPU8_4uF51pj8Qp3oSZkZmoxL5VUwxBzokAMg,15540
52
52
  fastmcp/experimental/utilities/openapi/json_schema_converter.py,sha256=W_40IPyuYnstcYtGf--eyTquecmwpvFYBK0W-XQ7OAw,12921
53
- fastmcp/experimental/utilities/openapi/models.py,sha256=KegqsEWTKddQafyOPHKpN1sBhsuVNy406ArF368g9JQ,2640
54
- fastmcp/experimental/utilities/openapi/parser.py,sha256=h-yxYbkEzMCaK2WrPw49EihizCYg2est3mR3kWSCyGM,26399
55
- fastmcp/experimental/utilities/openapi/schemas.py,sha256=-rkuL36YqPRe1YJuY9hOI5XZ7taxhEZe6Oy8RkKRgoU,20521
53
+ fastmcp/experimental/utilities/openapi/models.py,sha256=tgqrHdTbiDfMjiaNVHW5ndbXJ5lg_sajK0S5u9JQL6A,2805
54
+ fastmcp/experimental/utilities/openapi/parser.py,sha256=CBm-3yiX7ZzVmTS7RsdN5YKiFfYvK0qNhH1V7BaPEK0,33110
55
+ fastmcp/experimental/utilities/openapi/schemas.py,sha256=WZ1nQECX4McLIZ2Kmgr7VnlI1zGM8_hNofhzBboeEo0,21923
56
56
  fastmcp/prompts/__init__.py,sha256=An8uMBUh9Hrb7qqcn_5_Hent7IOeSh7EA2IUVsIrtHc,179
57
57
  fastmcp/prompts/prompt.py,sha256=lxlxQi9gylLW36-eVKUyH7PwndoxhA6ii8m4Cok6MEU,14158
58
- fastmcp/prompts/prompt_manager.py,sha256=lErodAnqVHRu_1FttfHTh-arWf9rkCOCGTxZzZP_3SE,7707
58
+ fastmcp/prompts/prompt_manager.py,sha256=o1rFhgnH1blAAZJ1BSRRZ5GhRpP1GNb7Ap01YDR-SPM,7713
59
59
  fastmcp/resources/__init__.py,sha256=y1iAuqx-GIrS1NqIYzKezIDiYyjNEzzHD35epHpMnXE,463
60
60
  fastmcp/resources/resource.py,sha256=IW2PToUgBOWDuZ1q8tiT7s0iSeh7a1mIFr56UyYbJ1E,6727
61
- fastmcp/resources/resource_manager.py,sha256=jmnKAkA7jevvKeccAVDsAAeXvI0IkrQeIXHCC36tf_0,19837
61
+ fastmcp/resources/resource_manager.py,sha256=e-sGhrLEP1-fjFfPiTmnhpkdvXdT4nmUMORvvf4b28k,20167
62
62
  fastmcp/resources/template.py,sha256=HXL_T1hUXMwv1h0962NTtszGY68R1TbumjJMvC0PjjU,11030
63
63
  fastmcp/resources/types.py,sha256=SiYNLnpXT-mHgNUrzqKUvXYUsY-V3gwJIrYdJfFwDDo,4868
64
64
  fastmcp/server/__init__.py,sha256=bMD4aQD4yJqLz7-mudoNsyeV8UgQfRAg3PRwPvwTEds,119
65
65
  fastmcp/server/context.py,sha256=ooVwF4RoIbLB2S043E5HtK_dCyAWQkDm1YWCkqfUPzs,22638
66
- fastmcp/server/dependencies.py,sha256=gfb1l3KD2m3h7BpN8lgKWrHY3_OJdDrlnJXCvzmU5YM,2487
66
+ fastmcp/server/dependencies.py,sha256=1X-07RfaQ5MsEMeD-Hdqu0CSId5KbjwNHr_V2G6mlWE,3374
67
67
  fastmcp/server/elicitation.py,sha256=jZIHjV4NjhYbT-w8pBArwd0vNzP8OYwzmsnWDdk6Bd0,6136
68
- fastmcp/server/http.py,sha256=idZGs4kRm_eLMscMrlEBIBpX21aiuTlvon9Fizmjswo,11648
68
+ fastmcp/server/http.py,sha256=vFWNwOKicjQQfHL1J-kftuayUa9I-pHqtz_Lfb6poJ8,11904
69
69
  fastmcp/server/low_level.py,sha256=LNmc_nU_wx-fRG8OEHdLPKopZpovcrWlyAxJzKss3TA,1239
70
70
  fastmcp/server/openapi.py,sha256=-7-pKwQ1hT-UV9OnLlWrjbbXXRfZld8YJqa4Duybhtw,42102
71
71
  fastmcp/server/proxy.py,sha256=soKobVa-c-1Vex7IYnz-jAT526Do2Z4Rs1FaT5ruLro,25651
72
- fastmcp/server/server.py,sha256=PBDHMx2N2Zr6qVeEs7XEcZrCNObnsAoIrPbK9DlArGk,87634
73
- fastmcp/server/auth/__init__.py,sha256=ldv13Dsxr2r-VdUV6af6P5qa3wMPQ-MP_yKxsWdlb-4,550
74
- fastmcp/server/auth/auth.py,sha256=FMkCcht4BMEqKx-SwvfzVC5l7X2moiIzS_ZevaHBq08,10536
75
- fastmcp/server/auth/registry.py,sha256=4ftVbbuyAi-8zBiJL9-dYIKLU_EOpxY-pFdzHMrmjV8,1306
72
+ fastmcp/server/server.py,sha256=SrZjAPi-k_2hnb2zDtVP9bfAY7uq-ghV-9pFNo97_WE,87821
73
+ fastmcp/server/auth/__init__.py,sha256=Uu0NXP1kwfwGajFg9vUrBoMQhVv3iCxqvTlCnISvyTs,641
74
+ fastmcp/server/auth/auth.py,sha256=pa3z42Gr8lL6mA55Hxwxdeui6C03pYjmz2zIv7GYRq4,11057
75
+ fastmcp/server/auth/registry.py,sha256=bGbQ2JgKxAMfa509FFpRTjgGzcWPGiwEH4bE0OVmy9M,1301
76
76
  fastmcp/server/auth/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  fastmcp/server/auth/providers/bearer.py,sha256=iu4pUj7TF5pT1wPuAGzDuM6lt5WtzenBN3c0otUleQY,923
78
78
  fastmcp/server/auth/providers/in_memory.py,sha256=tlUwbUZK5stUC_wjezcDs61PxjaHjykXbd8aH0cnW6k,14359
79
- fastmcp/server/auth/providers/jwt.py,sha256=7pAH8kuudl_lbY2skeVDlLkxFMhs5-3axpAoGVVp_MU,18882
79
+ fastmcp/server/auth/providers/jwt.py,sha256=79AB0SrnIYDMTc1HgyGrOHk7YgwTfFjWNwdIO0xwNwY,18887
80
80
  fastmcp/server/auth/providers/workos.py,sha256=jedSq4uhttDxYDYSZFrb4u_q1X9JeHgvKupJPpu0tSM,5590
81
81
  fastmcp/server/middleware/__init__.py,sha256=vh5C9ubN6q-y5QND32P4mQ4zDT89C7XYK39yqhELNAk,155
82
82
  fastmcp/server/middleware/error_handling.py,sha256=SoDatr9i3T2qSIUbSEGWrOnu4WPPyMDymnsF5GR_BiE,7572
@@ -85,12 +85,12 @@ fastmcp/server/middleware/middleware.py,sha256=9_4zjkVVIa6pfUTHq57gKGxRDiIU-xKrG
85
85
  fastmcp/server/middleware/rate_limiting.py,sha256=VTrCoQFmWCm0BxwOrNfG21CBFDDOKJT7IiSEjpJgmPA,7921
86
86
  fastmcp/server/middleware/timing.py,sha256=lL_xc-ErLD5lplfvd5-HIyWEbZhgNBYkcQ74KFXAMkA,5591
87
87
  fastmcp/tools/__init__.py,sha256=vzqb-Y7Kf0d5T0aOsld-O-FA8kD7-4uFExChewFHEzY,201
88
- fastmcp/tools/tool.py,sha256=s6kWgXwxmmQIDoHDKeO2KmAikPEUvJ2jh_Sk-CUtBfQ,18613
89
- fastmcp/tools/tool_manager.py,sha256=Pr6BI7IInvhkTw2S4ENWj8qMewdYi2CpzbOBiJIk40c,9032
90
- fastmcp/tools/tool_transform.py,sha256=f8Bt79qdmOM8Zietm7lXb5_5DlJLu02ovGmQBQJ6orw,36671
88
+ fastmcp/tools/tool.py,sha256=Gh0H8xuDZpRBWcvrVnd3zy4SXImfquXrU5A7sIoZSmA,18584
89
+ fastmcp/tools/tool_manager.py,sha256=lHNXvp07BSZGP5ahfEq6ODRPWkkosq5Gdw75pmnwU-0,9092
90
+ fastmcp/tools/tool_transform.py,sha256=c70ScvDipLw1LKGTvXBrMXO0EAxxRUGHhLgbW4vq1mo,37227
91
91
  fastmcp/utilities/__init__.py,sha256=-imJ8S-rXmbXMWeDamldP-dHDqAPg_wwmPVz-LNX14E,31
92
92
  fastmcp/utilities/cli.py,sha256=TXuSyALFAGJwi7tWEBwBmaGhYZBdF1aG6dLgl3zjM1w,3272
93
- fastmcp/utilities/components.py,sha256=wmo1XZBqf_tcOMMN1a-r8d1pT7g--Zmf75f5-vXx5FA,5333
93
+ fastmcp/utilities/components.py,sha256=pbcfyJHIIklpoHDzcnOvFDVeaWT4w8nxdYCXdACPK6Q,5763
94
94
  fastmcp/utilities/exceptions.py,sha256=7Z9j5IzM5rT27BC1Mcn8tkS-bjqCYqMKwb2MMTaxJYU,1350
95
95
  fastmcp/utilities/http.py,sha256=1ns1ymBS-WSxbZjGP6JYjSO52Wa_ls4j4WbnXiupoa4,245
96
96
  fastmcp/utilities/inspect.py,sha256=VLCrh8oMnIg49uuwVO899rUcHhxszPJ1nU0RZ8q2HX8,10639
@@ -98,11 +98,11 @@ fastmcp/utilities/json_schema.py,sha256=Nk6qQKtp0-MlMbRQmx8ps8SJ7SW9CpuWhSes1VAS
98
98
  fastmcp/utilities/json_schema_type.py,sha256=fSG-af3OPGgOhuhY_xb0-JsTu5tqi275zXlUw4ItjNo,22287
99
99
  fastmcp/utilities/logging.py,sha256=1y7oNmy8WrR0NsfNVw1LPoKu92OFdmzIO65syOKi_BI,1388
100
100
  fastmcp/utilities/mcp_config.py,sha256=zzs4VWHqG0eWEnEUwVve7mef_JFThwfvqBYt7nx3jXc,871
101
- fastmcp/utilities/openapi.py,sha256=Jcxu0s9VdA8RSkx1iyoTQwvsny4YCusuuJahyy-TvE8,63300
101
+ fastmcp/utilities/openapi.py,sha256=mfkY2XfWAmAOlKexArlrmDdD0Tkdqcn4TshsATaxB_o,63304
102
102
  fastmcp/utilities/tests.py,sha256=9FVLmGYfUjqfn0pPH33awlTgvg-JCNbnZnraJHNSYTg,6156
103
103
  fastmcp/utilities/types.py,sha256=zrF8Oc_L_BdzGj0pqU5ZalM02BisC0_D-d8kcRGccS0,13984
104
- fastmcp-2.11.2.dist-info/METADATA,sha256=6OE28R9_gx-82MA3st0SR6dCxsfoH4oftu0jhSjbL10,17839
105
- fastmcp-2.11.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
106
- fastmcp-2.11.2.dist-info/entry_points.txt,sha256=ff8bMtKX1JvXyurMibAacMSKbJEPmac9ffAKU9mLnM8,44
107
- fastmcp-2.11.2.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
108
- fastmcp-2.11.2.dist-info/RECORD,,
104
+ fastmcp-2.11.3.dist-info/METADATA,sha256=0i55hhGwfKs2lmqC0ASIS9PxDrJfTaI3WJLu6JjKwbg,17846
105
+ fastmcp-2.11.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
106
+ fastmcp-2.11.3.dist-info/entry_points.txt,sha256=ff8bMtKX1JvXyurMibAacMSKbJEPmac9ffAKU9mLnM8,44
107
+ fastmcp-2.11.3.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
108
+ fastmcp-2.11.3.dist-info/RECORD,,