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/client/logging.py +25 -1
- fastmcp/client/transports.py +4 -3
- fastmcp/experimental/server/openapi/routing.py +1 -1
- fastmcp/experimental/server/openapi/server.py +10 -23
- fastmcp/experimental/utilities/openapi/__init__.py +2 -2
- fastmcp/experimental/utilities/openapi/formatters.py +34 -0
- fastmcp/experimental/utilities/openapi/models.py +5 -2
- fastmcp/experimental/utilities/openapi/parser.py +248 -70
- fastmcp/experimental/utilities/openapi/schemas.py +135 -106
- fastmcp/prompts/prompt_manager.py +2 -2
- fastmcp/resources/resource_manager.py +12 -6
- fastmcp/server/auth/__init__.py +9 -1
- fastmcp/server/auth/auth.py +17 -1
- fastmcp/server/auth/providers/jwt.py +3 -4
- fastmcp/server/auth/registry.py +1 -1
- fastmcp/server/dependencies.py +32 -2
- fastmcp/server/http.py +41 -34
- fastmcp/server/server.py +9 -5
- fastmcp/settings.py +2 -2
- fastmcp/tools/tool.py +7 -7
- fastmcp/tools/tool_manager.py +3 -1
- fastmcp/tools/tool_transform.py +41 -27
- fastmcp/utilities/components.py +19 -4
- fastmcp/utilities/openapi.py +4 -4
- {fastmcp-2.11.2.dist-info → fastmcp-2.11.3.dist-info}/METADATA +2 -2
- {fastmcp-2.11.2.dist-info → fastmcp-2.11.3.dist-info}/RECORD +29 -29
- {fastmcp-2.11.2.dist-info → fastmcp-2.11.3.dist-info}/WHEEL +0 -0
- {fastmcp-2.11.2.dist-info → fastmcp-2.11.3.dist-info}/entry_points.txt +0 -0
- {fastmcp-2.11.2.dist-info → fastmcp-2.11.3.dist-info}/licenses/LICENSE +0 -0
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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 =
|
|
209
|
-
output_schema: dict[str, Any] | 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
|
|
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,
|
fastmcp/tools/tool_manager.py
CHANGED
|
@@ -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.
|
|
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)
|
fastmcp/tools/tool_transform.py
CHANGED
|
@@ -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
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
|
|
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
|
-
|
|
347
|
-
|
|
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 =
|
|
367
|
-
output_schema: dict[str, Any] | None |
|
|
368
|
-
serializer: Callable[[Any], str] | 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
|
|
461
|
-
if output_schema is
|
|
462
|
-
|
|
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
|
|
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=
|
|
567
|
-
serializer=
|
|
580
|
+
annotations=final_annotations,
|
|
581
|
+
serializer=final_serializer,
|
|
568
582
|
meta=final_meta,
|
|
569
583
|
transform_args=transform_args,
|
|
570
|
-
enabled=
|
|
584
|
+
enabled=final_enabled,
|
|
571
585
|
)
|
|
572
586
|
|
|
573
587
|
return transformed_tool
|
fastmcp/utilities/components.py
CHANGED
|
@@ -91,12 +91,27 @@ class FastMCPComponent(FastMCPBaseModel):
|
|
|
91
91
|
|
|
92
92
|
return meta or None
|
|
93
93
|
|
|
94
|
-
def
|
|
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 =
|
|
99
|
-
|
|
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:
|
fastmcp/utilities/openapi.py
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
47
|
-
fastmcp/experimental/server/openapi/server.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
54
|
-
fastmcp/experimental/utilities/openapi/parser.py,sha256=
|
|
55
|
-
fastmcp/experimental/utilities/openapi/schemas.py,sha256
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
73
|
-
fastmcp/server/auth/__init__.py,sha256=
|
|
74
|
-
fastmcp/server/auth/auth.py,sha256=
|
|
75
|
-
fastmcp/server/auth/registry.py,sha256=
|
|
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=
|
|
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=
|
|
89
|
-
fastmcp/tools/tool_manager.py,sha256=
|
|
90
|
-
fastmcp/tools/tool_transform.py,sha256=
|
|
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=
|
|
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=
|
|
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.
|
|
105
|
-
fastmcp-2.11.
|
|
106
|
-
fastmcp-2.11.
|
|
107
|
-
fastmcp-2.11.
|
|
108
|
-
fastmcp-2.11.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|