fastmcp 2.13.0.1__py3-none-any.whl → 2.13.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.
- fastmcp/cli/cli.py +3 -4
- fastmcp/cli/install/cursor.py +12 -6
- fastmcp/client/auth/oauth.py +11 -6
- fastmcp/client/client.py +86 -20
- fastmcp/client/transports.py +4 -4
- fastmcp/experimental/utilities/openapi/director.py +13 -14
- fastmcp/experimental/utilities/openapi/parser.py +18 -15
- fastmcp/mcp_config.py +1 -1
- fastmcp/resources/resource_manager.py +3 -3
- fastmcp/server/auth/__init__.py +4 -0
- fastmcp/server/auth/auth.py +28 -9
- fastmcp/server/auth/handlers/authorize.py +7 -5
- fastmcp/server/auth/oauth_proxy.py +170 -30
- fastmcp/server/auth/oidc_proxy.py +28 -9
- fastmcp/server/auth/providers/azure.py +26 -5
- fastmcp/server/auth/providers/debug.py +114 -0
- fastmcp/server/auth/providers/descope.py +1 -1
- fastmcp/server/auth/providers/in_memory.py +25 -1
- fastmcp/server/auth/providers/jwt.py +38 -26
- fastmcp/server/auth/providers/oci.py +233 -0
- fastmcp/server/auth/providers/supabase.py +21 -5
- fastmcp/server/auth/providers/workos.py +1 -1
- fastmcp/server/context.py +50 -8
- fastmcp/server/dependencies.py +8 -2
- fastmcp/server/middleware/caching.py +9 -2
- fastmcp/server/middleware/logging.py +2 -2
- fastmcp/server/middleware/middleware.py +2 -2
- fastmcp/server/proxy.py +1 -1
- fastmcp/server/server.py +11 -5
- fastmcp/tools/tool.py +33 -8
- fastmcp/utilities/components.py +2 -2
- fastmcp/utilities/json_schema.py +4 -4
- fastmcp/utilities/logging.py +13 -9
- fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +1 -1
- fastmcp/utilities/openapi.py +2 -2
- fastmcp/utilities/types.py +28 -15
- fastmcp/utilities/ui.py +1 -1
- {fastmcp-2.13.0.1.dist-info → fastmcp-2.13.1.dist-info}/METADATA +14 -11
- {fastmcp-2.13.0.1.dist-info → fastmcp-2.13.1.dist-info}/RECORD +42 -40
- {fastmcp-2.13.0.1.dist-info → fastmcp-2.13.1.dist-info}/WHEEL +0 -0
- {fastmcp-2.13.0.1.dist-info → fastmcp-2.13.1.dist-info}/entry_points.txt +0 -0
- {fastmcp-2.13.0.1.dist-info → fastmcp-2.13.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -46,7 +46,7 @@ class BaseLoggingMiddleware(Middleware):
|
|
|
46
46
|
|
|
47
47
|
return payload
|
|
48
48
|
|
|
49
|
-
def _format_message(self, message: dict[str, str | int]) -> str:
|
|
49
|
+
def _format_message(self, message: dict[str, str | int | float]) -> str:
|
|
50
50
|
"""Format a message for logging."""
|
|
51
51
|
if self.structured_logging:
|
|
52
52
|
return json.dumps(message)
|
|
@@ -55,7 +55,7 @@ class BaseLoggingMiddleware(Middleware):
|
|
|
55
55
|
|
|
56
56
|
def _create_before_message(
|
|
57
57
|
self, context: MiddlewareContext[Any]
|
|
58
|
-
) -> dict[str, str | int]:
|
|
58
|
+
) -> dict[str, str | int | float]:
|
|
59
59
|
message = {
|
|
60
60
|
"event": context.type + "_start",
|
|
61
61
|
"method": context.method or "unknown",
|
|
@@ -149,8 +149,8 @@ class Middleware:
|
|
|
149
149
|
|
|
150
150
|
async def on_initialize(
|
|
151
151
|
self,
|
|
152
|
-
context: MiddlewareContext[mt.
|
|
153
|
-
call_next: CallNext[mt.
|
|
152
|
+
context: MiddlewareContext[mt.InitializeRequest],
|
|
153
|
+
call_next: CallNext[mt.InitializeRequest, None],
|
|
154
154
|
) -> None:
|
|
155
155
|
return await call_next(context)
|
|
156
156
|
|
fastmcp/server/proxy.py
CHANGED
fastmcp/server/server.py
CHANGED
|
@@ -79,6 +79,7 @@ from fastmcp.utilities.types import NotSet, NotSetT
|
|
|
79
79
|
|
|
80
80
|
if TYPE_CHECKING:
|
|
81
81
|
from fastmcp.client import Client
|
|
82
|
+
from fastmcp.client.client import FastMCP1Server
|
|
82
83
|
from fastmcp.client.transports import ClientTransport, ClientTransportT
|
|
83
84
|
from fastmcp.experimental.server.openapi import FastMCPOpenAPI as FastMCPOpenAPINew
|
|
84
85
|
from fastmcp.experimental.server.openapi.routing import (
|
|
@@ -1045,7 +1046,11 @@ class FastMCP(Generic[LifespanResultT]):
|
|
|
1045
1046
|
|
|
1046
1047
|
async def _call_tool_mcp(
|
|
1047
1048
|
self, key: str, arguments: dict[str, Any]
|
|
1048
|
-
) ->
|
|
1049
|
+
) -> (
|
|
1050
|
+
list[ContentBlock]
|
|
1051
|
+
| tuple[list[ContentBlock], dict[str, Any]]
|
|
1052
|
+
| mcp.types.CallToolResult
|
|
1053
|
+
):
|
|
1049
1054
|
"""
|
|
1050
1055
|
Handle MCP 'callTool' requests.
|
|
1051
1056
|
|
|
@@ -1488,7 +1493,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|
|
1488
1493
|
icons=icons,
|
|
1489
1494
|
tags=tags,
|
|
1490
1495
|
output_schema=output_schema,
|
|
1491
|
-
annotations=
|
|
1496
|
+
annotations=annotations,
|
|
1492
1497
|
exclude_args=exclude_args,
|
|
1493
1498
|
meta=meta,
|
|
1494
1499
|
serializer=self._tool_serializer,
|
|
@@ -1721,7 +1726,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|
|
1721
1726
|
mime_type=mime_type,
|
|
1722
1727
|
tags=tags,
|
|
1723
1728
|
enabled=enabled,
|
|
1724
|
-
annotations=
|
|
1729
|
+
annotations=annotations,
|
|
1725
1730
|
meta=meta,
|
|
1726
1731
|
)
|
|
1727
1732
|
self.add_template(template)
|
|
@@ -1737,7 +1742,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|
|
1737
1742
|
mime_type=mime_type,
|
|
1738
1743
|
tags=tags,
|
|
1739
1744
|
enabled=enabled,
|
|
1740
|
-
annotations=
|
|
1745
|
+
annotations=annotations,
|
|
1741
1746
|
meta=meta,
|
|
1742
1747
|
)
|
|
1743
1748
|
self.add_resource(resource)
|
|
@@ -2582,6 +2587,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|
|
2582
2587
|
Client[ClientTransportT]
|
|
2583
2588
|
| ClientTransport
|
|
2584
2589
|
| FastMCP[Any]
|
|
2590
|
+
| FastMCP1Server
|
|
2585
2591
|
| AnyUrl
|
|
2586
2592
|
| Path
|
|
2587
2593
|
| MCPConfig
|
|
@@ -2624,7 +2630,7 @@ class FastMCP(Generic[LifespanResultT]):
|
|
|
2624
2630
|
|
|
2625
2631
|
client_factory = fresh_client_factory
|
|
2626
2632
|
else:
|
|
2627
|
-
base_client = ProxyClient(backend)
|
|
2633
|
+
base_client = ProxyClient(backend) # type: ignore
|
|
2628
2634
|
|
|
2629
2635
|
# Fresh client created from transport - use fresh sessions per request
|
|
2630
2636
|
def proxy_client_factory():
|
fastmcp/tools/tool.py
CHANGED
|
@@ -16,7 +16,7 @@ from typing import (
|
|
|
16
16
|
|
|
17
17
|
import mcp.types
|
|
18
18
|
import pydantic_core
|
|
19
|
-
from mcp.types import ContentBlock, Icon, TextContent, ToolAnnotations
|
|
19
|
+
from mcp.types import CallToolResult, ContentBlock, Icon, TextContent, ToolAnnotations
|
|
20
20
|
from mcp.types import Tool as MCPTool
|
|
21
21
|
from pydantic import Field, PydanticSchemaGenerationError
|
|
22
22
|
from typing_extensions import TypeVar
|
|
@@ -68,6 +68,7 @@ class ToolResult:
|
|
|
68
68
|
self,
|
|
69
69
|
content: list[ContentBlock] | Any | None = None,
|
|
70
70
|
structured_content: dict[str, Any] | Any | None = None,
|
|
71
|
+
meta: dict[str, Any] | None = None,
|
|
71
72
|
):
|
|
72
73
|
if content is None and structured_content is None:
|
|
73
74
|
raise ValueError("Either content or structured_content must be provided")
|
|
@@ -75,6 +76,7 @@ class ToolResult:
|
|
|
75
76
|
content = structured_content
|
|
76
77
|
|
|
77
78
|
self.content: list[ContentBlock] = _convert_to_content(result=content)
|
|
79
|
+
self.meta: dict[str, Any] | None = meta
|
|
78
80
|
|
|
79
81
|
if structured_content is not None:
|
|
80
82
|
try:
|
|
@@ -96,7 +98,15 @@ class ToolResult:
|
|
|
96
98
|
|
|
97
99
|
def to_mcp_result(
|
|
98
100
|
self,
|
|
99
|
-
) ->
|
|
101
|
+
) -> (
|
|
102
|
+
list[ContentBlock] | tuple[list[ContentBlock], dict[str, Any]] | CallToolResult
|
|
103
|
+
):
|
|
104
|
+
if self.meta is not None:
|
|
105
|
+
return CallToolResult(
|
|
106
|
+
structuredContent=self.structured_content,
|
|
107
|
+
content=self.content,
|
|
108
|
+
_meta=self.meta,
|
|
109
|
+
)
|
|
100
110
|
if self.structured_content is None:
|
|
101
111
|
return self.content
|
|
102
112
|
return self.content, self.structured_content
|
|
@@ -284,10 +294,11 @@ class FunctionTool(Tool):
|
|
|
284
294
|
# Note: explicit schemas (dict) are used as-is without auto-wrapping
|
|
285
295
|
|
|
286
296
|
# Validate that explicit schemas are object type for structured content
|
|
297
|
+
# (resolving $ref references for self-referencing types)
|
|
287
298
|
if final_output_schema is not None and isinstance(final_output_schema, dict):
|
|
288
|
-
if final_output_schema
|
|
299
|
+
if not _is_object_schema(final_output_schema):
|
|
289
300
|
raise ValueError(
|
|
290
|
-
f
|
|
301
|
+
f"Output schemas must represent object types due to MCP spec limitations. Received: {final_output_schema!r}"
|
|
291
302
|
)
|
|
292
303
|
|
|
293
304
|
return cls(
|
|
@@ -356,6 +367,21 @@ class FunctionTool(Tool):
|
|
|
356
367
|
)
|
|
357
368
|
|
|
358
369
|
|
|
370
|
+
def _is_object_schema(schema: dict[str, Any]) -> bool:
|
|
371
|
+
"""Check if a JSON schema represents an object type."""
|
|
372
|
+
# Direct object type
|
|
373
|
+
if schema.get("type") == "object":
|
|
374
|
+
return True
|
|
375
|
+
|
|
376
|
+
# Schema with properties but no explicit type is treated as object
|
|
377
|
+
if "properties" in schema:
|
|
378
|
+
return True
|
|
379
|
+
|
|
380
|
+
# Self-referencing types use $ref pointing to $defs
|
|
381
|
+
# The referenced type is always an object in our use case
|
|
382
|
+
return "$ref" in schema and "$defs" in schema
|
|
383
|
+
|
|
384
|
+
|
|
359
385
|
@dataclass
|
|
360
386
|
class ParsedFunction:
|
|
361
387
|
fn: Callable[..., Any]
|
|
@@ -468,10 +494,9 @@ class ParsedFunction:
|
|
|
468
494
|
|
|
469
495
|
# Generate schema for wrapped type if it's non-object
|
|
470
496
|
# because MCP requires that output schemas are objects
|
|
471
|
-
if
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
):
|
|
497
|
+
# Check if schema is an object type, resolving $ref references
|
|
498
|
+
# (self-referencing types use $ref at root level)
|
|
499
|
+
if wrap_non_object_output_schema and not _is_object_schema(base_schema):
|
|
475
500
|
# Use the wrapped result schema directly
|
|
476
501
|
wrapped_type = _WrappedResult[clean_output_type]
|
|
477
502
|
wrapped_adapter = get_cached_typeadapter(wrapped_type)
|
fastmcp/utilities/components.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from collections.abc import Sequence
|
|
4
|
-
from typing import Annotated, Any, TypedDict
|
|
4
|
+
from typing import Annotated, Any, TypedDict, cast
|
|
5
5
|
|
|
6
6
|
from mcp.types import Icon
|
|
7
7
|
from pydantic import BeforeValidator, Field, PrivateAttr
|
|
@@ -117,7 +117,7 @@ class FastMCPComponent(FastMCPBaseModel):
|
|
|
117
117
|
copy = super().model_copy(update=update, deep=deep)
|
|
118
118
|
if key is not None:
|
|
119
119
|
copy._key = key
|
|
120
|
-
return copy
|
|
120
|
+
return cast(Self, copy)
|
|
121
121
|
|
|
122
122
|
def __eq__(self, other: object) -> bool:
|
|
123
123
|
if type(self) is not type(other):
|
fastmcp/utilities/json_schema.py
CHANGED
|
@@ -98,7 +98,7 @@ def _single_pass_optimize(
|
|
|
98
98
|
if isinstance(node, dict):
|
|
99
99
|
# Collect $ref references for unused definition removal
|
|
100
100
|
if prune_defs:
|
|
101
|
-
ref = node.get("$ref")
|
|
101
|
+
ref = node.get("$ref") # type: ignore
|
|
102
102
|
if isinstance(ref, str) and ref.startswith("#/$defs/"):
|
|
103
103
|
referenced_def = ref.split("/")[-1]
|
|
104
104
|
if current_def_name:
|
|
@@ -127,13 +127,13 @@ def _single_pass_optimize(
|
|
|
127
127
|
"required",
|
|
128
128
|
]
|
|
129
129
|
):
|
|
130
|
-
node.pop("title")
|
|
130
|
+
node.pop("title") # type: ignore
|
|
131
131
|
|
|
132
132
|
if (
|
|
133
133
|
prune_additional_properties
|
|
134
|
-
and node.get("additionalProperties") is False
|
|
134
|
+
and node.get("additionalProperties") is False # type: ignore
|
|
135
135
|
):
|
|
136
|
-
node.pop("additionalProperties")
|
|
136
|
+
node.pop("additionalProperties") # type: ignore
|
|
137
137
|
|
|
138
138
|
# Recursive traversal
|
|
139
139
|
for key, value in node.items():
|
fastmcp/utilities/logging.py
CHANGED
|
@@ -74,15 +74,19 @@ def configure_logging(
|
|
|
74
74
|
import mcp
|
|
75
75
|
import pydantic
|
|
76
76
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
77
|
+
# Build traceback kwargs with defaults that can be overridden
|
|
78
|
+
traceback_kwargs = {
|
|
79
|
+
"console": Console(stderr=True),
|
|
80
|
+
"show_path": False,
|
|
81
|
+
"show_level": False,
|
|
82
|
+
"rich_tracebacks": enable_rich_tracebacks,
|
|
83
|
+
"tracebacks_max_frames": 3,
|
|
84
|
+
"tracebacks_suppress": [fastmcp, mcp, pydantic],
|
|
85
|
+
}
|
|
86
|
+
# Override defaults with user-provided values
|
|
87
|
+
traceback_kwargs.update(rich_kwargs)
|
|
88
|
+
|
|
89
|
+
traceback_handler = RichHandler(**traceback_kwargs) # type: ignore[arg-type]
|
|
86
90
|
traceback_handler.setFormatter(formatter)
|
|
87
91
|
|
|
88
92
|
traceback_handler.addFilter(lambda record: record.exc_info is not None)
|
|
@@ -217,7 +217,7 @@ class MCPServerConfig(BaseModel):
|
|
|
217
217
|
"""
|
|
218
218
|
if isinstance(v, dict):
|
|
219
219
|
return Deployment(**v) # type: ignore[arg-type]
|
|
220
|
-
return cast(Deployment, v)
|
|
220
|
+
return cast(Deployment, v) # type: ignore[return-value]
|
|
221
221
|
|
|
222
222
|
@classmethod
|
|
223
223
|
def from_file(cls, file_path: Path) -> MCPServerConfig:
|
fastmcp/utilities/openapi.py
CHANGED
|
@@ -1371,7 +1371,7 @@ def _combine_schemas(route: HTTPRoute) -> dict[str, Any]:
|
|
|
1371
1371
|
if used_refs:
|
|
1372
1372
|
result["$defs"] = {
|
|
1373
1373
|
name: def_schema
|
|
1374
|
-
for name, def_schema in result["$defs"].items()
|
|
1374
|
+
for name, def_schema in result["$defs"].items() # type: ignore[index]
|
|
1375
1375
|
if name in used_refs
|
|
1376
1376
|
}
|
|
1377
1377
|
else:
|
|
@@ -1556,7 +1556,7 @@ def extract_output_schema_from_responses(
|
|
|
1556
1556
|
if used_refs:
|
|
1557
1557
|
output_schema["$defs"] = {
|
|
1558
1558
|
name: def_schema
|
|
1559
|
-
for name, def_schema in output_schema["$defs"].items()
|
|
1559
|
+
for name, def_schema in output_schema["$defs"].items() # type: ignore[index]
|
|
1560
1560
|
if name in used_refs
|
|
1561
1561
|
}
|
|
1562
1562
|
else:
|
fastmcp/utilities/types.py
CHANGED
|
@@ -190,34 +190,33 @@ class Image:
|
|
|
190
190
|
if path is not None and data is not None:
|
|
191
191
|
raise ValueError("Only one of path or data can be provided")
|
|
192
192
|
|
|
193
|
-
self.path =
|
|
193
|
+
self.path = self._get_expanded_path(path)
|
|
194
194
|
self.data = data
|
|
195
195
|
self._format = format
|
|
196
196
|
self._mime_type = self._get_mime_type()
|
|
197
197
|
self.annotations = annotations
|
|
198
198
|
|
|
199
|
+
@staticmethod
|
|
200
|
+
def _get_expanded_path(path: str | Path | None) -> Path | None:
|
|
201
|
+
"""Expand environment variables and user home in path."""
|
|
202
|
+
return Path(os.path.expandvars(str(path))).expanduser() if path else None
|
|
203
|
+
|
|
199
204
|
def _get_mime_type(self) -> str:
|
|
200
205
|
"""Get MIME type from format or guess from file extension."""
|
|
201
206
|
if self._format:
|
|
202
207
|
return f"image/{self._format.lower()}"
|
|
203
208
|
|
|
204
209
|
if self.path:
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
".webp": "image/webp",
|
|
212
|
-
}.get(suffix, "application/octet-stream")
|
|
210
|
+
# Workaround for WEBP in Py3.10
|
|
211
|
+
mimetypes.add_type("image/webp", ".webp")
|
|
212
|
+
resp = mimetypes.guess_type(self.path, strict=False)
|
|
213
|
+
if resp and resp[0] is not None:
|
|
214
|
+
return resp[0]
|
|
215
|
+
return "application/octet-stream"
|
|
213
216
|
return "image/png" # default for raw binary data
|
|
214
217
|
|
|
215
|
-
def
|
|
216
|
-
|
|
217
|
-
mime_type: str | None = None,
|
|
218
|
-
annotations: Annotations | None = None,
|
|
219
|
-
) -> mcp.types.ImageContent:
|
|
220
|
-
"""Convert to MCP ImageContent."""
|
|
218
|
+
def _get_data(self) -> str:
|
|
219
|
+
"""Get raw image data as base64-encoded string."""
|
|
221
220
|
if self.path:
|
|
222
221
|
with open(self.path, "rb") as f:
|
|
223
222
|
data = base64.b64encode(f.read()).decode()
|
|
@@ -225,6 +224,15 @@ class Image:
|
|
|
225
224
|
data = base64.b64encode(self.data).decode()
|
|
226
225
|
else:
|
|
227
226
|
raise ValueError("No image data available")
|
|
227
|
+
return data
|
|
228
|
+
|
|
229
|
+
def to_image_content(
|
|
230
|
+
self,
|
|
231
|
+
mime_type: str | None = None,
|
|
232
|
+
annotations: Annotations | None = None,
|
|
233
|
+
) -> mcp.types.ImageContent:
|
|
234
|
+
"""Convert to MCP ImageContent."""
|
|
235
|
+
data = self._get_data()
|
|
228
236
|
|
|
229
237
|
return mcp.types.ImageContent(
|
|
230
238
|
type="image",
|
|
@@ -233,6 +241,11 @@ class Image:
|
|
|
233
241
|
annotations=annotations or self.annotations,
|
|
234
242
|
)
|
|
235
243
|
|
|
244
|
+
def to_data_uri(self, mime_type: str | None = None) -> str:
|
|
245
|
+
"""Get image as a data URI."""
|
|
246
|
+
data = self._get_data()
|
|
247
|
+
return f"data:{mime_type or self._mime_type};base64,{data}"
|
|
248
|
+
|
|
236
249
|
|
|
237
250
|
class Audio:
|
|
238
251
|
"""Helper class for returning audio from tools."""
|
fastmcp/utilities/ui.py
CHANGED
|
@@ -454,7 +454,7 @@ def create_page(
|
|
|
454
454
|
content: str,
|
|
455
455
|
title: str = "FastMCP",
|
|
456
456
|
additional_styles: str = "",
|
|
457
|
-
csp_policy: str = "default-src 'none'; style-src 'unsafe-inline'; img-src https:; base-uri 'none'",
|
|
457
|
+
csp_policy: str = "default-src 'none'; style-src 'unsafe-inline'; img-src https: data:; base-uri 'none'",
|
|
458
458
|
) -> str:
|
|
459
459
|
"""
|
|
460
460
|
Create a complete HTML page with FastMCP styling.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastmcp
|
|
3
|
-
Version: 2.13.
|
|
3
|
+
Version: 2.13.1
|
|
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
|
|
@@ -18,19 +18,20 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
18
18
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
19
19
|
Classifier: Typing :: Typed
|
|
20
20
|
Requires-Python: >=3.10
|
|
21
|
-
Requires-Dist: authlib>=1.5
|
|
22
|
-
Requires-Dist: cyclopts>=
|
|
21
|
+
Requires-Dist: authlib>=1.6.5
|
|
22
|
+
Requires-Dist: cyclopts>=4.0.0
|
|
23
23
|
Requires-Dist: exceptiongroup>=1.2.2
|
|
24
24
|
Requires-Dist: httpx>=0.28.1
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
25
|
+
Requires-Dist: jsonschema-path>=0.3.4
|
|
26
|
+
Requires-Dist: mcp!=1.21.1,<2.0.0,>=1.19.0
|
|
27
27
|
Requires-Dist: openapi-pydantic>=0.5.1
|
|
28
28
|
Requires-Dist: platformdirs>=4.0.0
|
|
29
|
-
Requires-Dist: py-key-value-aio[disk,keyring,memory]<0.3.0,>=0.2.
|
|
29
|
+
Requires-Dist: py-key-value-aio[disk,keyring,memory]<0.3.0,>=0.2.8
|
|
30
30
|
Requires-Dist: pydantic[email]>=2.11.7
|
|
31
31
|
Requires-Dist: pyperclip>=1.9.0
|
|
32
32
|
Requires-Dist: python-dotenv>=1.1.0
|
|
33
33
|
Requires-Dist: rich>=13.9.4
|
|
34
|
+
Requires-Dist: uvicorn>=0.35
|
|
34
35
|
Requires-Dist: websockets>=15.0.1
|
|
35
36
|
Provides-Extra: openai
|
|
36
37
|
Requires-Dist: openai>=1.102.0; extra == 'openai'
|
|
@@ -181,6 +182,8 @@ uv pip install fastmcp
|
|
|
181
182
|
|
|
182
183
|
For full installation instructions, including verification, upgrading from the official MCPSDK, and developer setup, see the [**Installation Guide**](https://gofastmcp.com/getting-started/installation).
|
|
183
184
|
|
|
185
|
+
**Dependency Licensing:** FastMCP depends on Cyclopts for CLI functionality. Cyclopts v4 includes docutils as a transitive dependency, which has complex licensing that may trigger compliance reviews in some organizations. If this is a concern, you can install Cyclopts v5 alpha (`pip install "cyclopts>=5.0.0a1"`) which removes this dependency, or wait for the stable v5 release. See [this issue](https://github.com/BrianPugh/cyclopts/issues/672) for details.
|
|
186
|
+
|
|
184
187
|
## Core Concepts
|
|
185
188
|
|
|
186
189
|
These are the building blocks for creating MCP servers and clients with FastMCP.
|
|
@@ -519,20 +522,20 @@ uv run pytest --cov=src --cov=examples --cov-report=html
|
|
|
519
522
|
|
|
520
523
|
### Static Checks
|
|
521
524
|
|
|
522
|
-
FastMCP uses `
|
|
525
|
+
FastMCP uses `prek` for code formatting, linting, and type-checking. All PRs must pass these checks (they run automatically in CI).
|
|
523
526
|
|
|
524
527
|
Install the hooks locally:
|
|
525
528
|
|
|
526
529
|
```bash
|
|
527
|
-
uv run
|
|
530
|
+
uv run prek install
|
|
528
531
|
```
|
|
529
532
|
|
|
530
533
|
The hooks will now run automatically on `git commit`. You can also run them manually at any time:
|
|
531
534
|
|
|
532
535
|
```bash
|
|
533
|
-
|
|
536
|
+
prek run --all-files
|
|
534
537
|
# or via uv
|
|
535
|
-
uv run
|
|
538
|
+
uv run prek run --all-files
|
|
536
539
|
```
|
|
537
540
|
|
|
538
541
|
### Pull Requests
|
|
@@ -540,7 +543,7 @@ uv run pre-commit run --all-files
|
|
|
540
543
|
1. Fork the repository on GitHub.
|
|
541
544
|
2. Create a feature branch from `main`.
|
|
542
545
|
3. Make your changes, including tests and documentation updates.
|
|
543
|
-
4. Ensure tests and
|
|
546
|
+
4. Ensure tests and prek hooks pass.
|
|
544
547
|
5. Commit your changes and push to your fork.
|
|
545
548
|
6. Open a pull request against the `main` branch of `jlowin/fastmcp`.
|
|
546
549
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
fastmcp/__init__.py,sha256=oKNRn6cUVk3nabmXR9SFEvKz-yotC8tVDNYRorxX-Wk,1544
|
|
2
2
|
fastmcp/exceptions.py,sha256=-krEavxwddQau6T7MESCR4VjKNLfP9KHJrU1p3y72FU,744
|
|
3
|
-
fastmcp/mcp_config.py,sha256=
|
|
3
|
+
fastmcp/mcp_config.py,sha256=YXZ0piljrxFgPYEwYSwPw6IiPwU3Cwp2VzlT9CWxutc,11397
|
|
4
4
|
fastmcp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
5
|
fastmcp/settings.py,sha256=RqtXzbIGFWLFbgK82pGOx-OGWtrVKZe3KcBWinCgACY,13936
|
|
6
6
|
fastmcp/cli/__init__.py,sha256=Ii284TNoG5lxTP40ETMGhHEq3lQZWxu9m9JuU57kUpQ,87
|
|
7
|
-
fastmcp/cli/cli.py,sha256=
|
|
7
|
+
fastmcp/cli/cli.py,sha256=FMrda7kHwNDCflUiJTSWD_w3vuuQsgSj2IuWk8ZZsEM,29108
|
|
8
8
|
fastmcp/cli/run.py,sha256=HeaiHYcVY17JpHg4UjnIHkP5ttU0PNd1bZIL3brif8A,7047
|
|
9
9
|
fastmcp/cli/install/__init__.py,sha256=FUrwjMVaxONgz1qO7suzJNz1xosRfR3TOHlr3Z77JXA,797
|
|
10
10
|
fastmcp/cli/install/claude_code.py,sha256=vGv8hbMUM6p5uQ1scy6E7Qxn0BZ2_INATF0xmSl5QWQ,7617
|
|
11
11
|
fastmcp/cli/install/claude_desktop.py,sha256=aX_BrH5ODEN6UPHdw-Gnh0r5g8TojvTA7trqQRCEdAw,6832
|
|
12
|
-
fastmcp/cli/install/cursor.py,sha256=
|
|
12
|
+
fastmcp/cli/install/cursor.py,sha256=0qSkKp4JuZj2dGOAsPph9XS_LswV8rQ8CqAuEx7TNhA,10685
|
|
13
13
|
fastmcp/cli/install/gemini_cli.py,sha256=G7NhKnH21893baQjmVbFpwRyMbYIq7bocPQz1CBUH_8,7630
|
|
14
14
|
fastmcp/cli/install/mcp_json.py,sha256=l7b0sWB10YlbcXtcwJv1X2iHEP9V9EwuuD63PyTMvXI,5832
|
|
15
15
|
fastmcp/cli/install/shared.py,sha256=_1MNGCqf7BsAL6ntwA75wn86-0g-248ppQSAPQ8uTXk,5103
|
|
16
16
|
fastmcp/client/__init__.py,sha256=QHvSGJCLejQkQ4o070vsUdKNB8vUhxckBByvHjnteTQ,663
|
|
17
|
-
fastmcp/client/client.py,sha256=
|
|
17
|
+
fastmcp/client/client.py,sha256=_CiqszJLahHsNDgaOpkf5v8csJ6D1dDdpv3TiDsNwzs,38899
|
|
18
18
|
fastmcp/client/elicitation.py,sha256=VNWgeBe2KipLp9mCc-6AApmfYAU1OlH9_3JdskfW_Wc,2521
|
|
19
19
|
fastmcp/client/logging.py,sha256=WBByRoBIB-Bl3ZUJVFvHqRt4teYPAvqC8MnJ358Elg8,1939
|
|
20
20
|
fastmcp/client/messages.py,sha256=NIPjt-5js_DkI5BD4OVdTf6pz-nGjc2dtbgt-vAY234,4329
|
|
@@ -22,10 +22,10 @@ fastmcp/client/oauth_callback.py,sha256=3xqL5_HD1QS9eGfw31HzoVF94QQelq_0TTqS7qWD
|
|
|
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=MEXgywI46X-E78gCLCKEiQ14iu4uQqohLav-MNCtD_U,1819
|
|
25
|
-
fastmcp/client/transports.py,sha256=
|
|
25
|
+
fastmcp/client/transports.py,sha256=sYbh50h0qcgB5C6OLdzHSF1hn2IOfty3XJEu2Dlg42o,40993
|
|
26
26
|
fastmcp/client/auth/__init__.py,sha256=4DNsfp4iaQeBcpds0JDdMn6Mmfud44stWLsret0sVKY,91
|
|
27
27
|
fastmcp/client/auth/bearer.py,sha256=MFEFqcH6u_V86msYiOsEFKN5ks1V9BnBNiPsPLHUTqo,399
|
|
28
|
-
fastmcp/client/auth/oauth.py,sha256=
|
|
28
|
+
fastmcp/client/auth/oauth.py,sha256=RJSazIALhLoNtqbJk1lsktYjVypJ89OtJE7_tjjQHgE,12445
|
|
29
29
|
fastmcp/contrib/README.md,sha256=rKknYSI1T192UvSszqwwDlQ2eYQpxywrNTLoj177SYU,878
|
|
30
30
|
fastmcp/contrib/bulk_tool_caller/README.md,sha256=5aUUY1TSFKtz1pvTLSDqkUCkGkuqMfMZNsLeaNqEgAc,1960
|
|
31
31
|
fastmcp/contrib/bulk_tool_caller/__init__.py,sha256=xvGSSaUXTQrc31erBoi1Gh7BikgOliETDiYVTP3rLxY,75
|
|
@@ -51,82 +51,84 @@ fastmcp/experimental/server/openapi/routing.py,sha256=hAhQCtode5NuEDVfzeMj5vK03T
|
|
|
51
51
|
fastmcp/experimental/server/openapi/server.py,sha256=WQeUA3v69ZhrzN1-cbrDTC8EsaOXHwDSQT_NPgYrECk,16099
|
|
52
52
|
fastmcp/experimental/utilities/openapi/README.md,sha256=pOXftamuVXxEMlOt-JAfpuvHeRGauC3l46ntD1WzM-A,8604
|
|
53
53
|
fastmcp/experimental/utilities/openapi/__init__.py,sha256=6FTQyP-kWvFg5Ykq53j7byBhPuysOyMYSrFTdUAKeO0,1592
|
|
54
|
-
fastmcp/experimental/utilities/openapi/director.py,sha256=
|
|
54
|
+
fastmcp/experimental/utilities/openapi/director.py,sha256=bsK5W8-vdydbB85xMLy5WsQJewnObXaDrtAIS5HdKjY,7956
|
|
55
55
|
fastmcp/experimental/utilities/openapi/formatters.py,sha256=1RCd8DwPU8_4uF51pj8Qp3oSZkZmoxL5VUwxBzokAMg,15540
|
|
56
56
|
fastmcp/experimental/utilities/openapi/json_schema_converter.py,sha256=z8FjEDedsvAU1tT_ztl7oL_ERbjGufS3meVO-WKJhuE,13089
|
|
57
57
|
fastmcp/experimental/utilities/openapi/models.py,sha256=-kfndwZSe92tVtKAgOuFn5rk1tN7oydCZKtLOEMEalA,2805
|
|
58
|
-
fastmcp/experimental/utilities/openapi/parser.py,sha256=
|
|
58
|
+
fastmcp/experimental/utilities/openapi/parser.py,sha256=qsa68Ro1c8ov77kdEP20IwZqD74E4IGKjtfeIkn3HdE,34338
|
|
59
59
|
fastmcp/experimental/utilities/openapi/schemas.py,sha256=84nPtnOlfjNoFGDoVoWLs0dh_7Ps92p3AuHgpVA5a-s,23349
|
|
60
60
|
fastmcp/prompts/__init__.py,sha256=BQ5ooDJcNhb5maYBcg2mF1VaHAY_A64cEU3UiCQ3Lw8,179
|
|
61
61
|
fastmcp/prompts/prompt.py,sha256=G-P_Ln1xTQRy-bTyMFy2v--9guTNpn92e30cmysX1Q0,14335
|
|
62
62
|
fastmcp/prompts/prompt_manager.py,sha256=5ZyT0blp5owuaN5pz_TQsyH6zUGFoUiVTGfiEnqBuj8,4262
|
|
63
63
|
fastmcp/resources/__init__.py,sha256=si8aT_9taxUNN0vkfbifst_SCId56DZmYi4YOb4mtlE,463
|
|
64
64
|
fastmcp/resources/resource.py,sha256=Rt260JyWuC_7Ufo3TtKxjPyKCTV-3zfsFF9wqHL8yWw,7168
|
|
65
|
-
fastmcp/resources/resource_manager.py,sha256=
|
|
65
|
+
fastmcp/resources/resource_manager.py,sha256=R-dtlhCYHcH1bnGuD0QW5aRUo_12_NeLkn9VLp4xmmU,13308
|
|
66
66
|
fastmcp/resources/template.py,sha256=vu9InVUKc5CvEOUvlTXsZ8-tpet_-kf8yX-rNrxE4Pw,14802
|
|
67
67
|
fastmcp/resources/types.py,sha256=efFLGD1Xc5Xq3sxlPaZ_8gtJ2UOixueTBV4KQTi4cOU,4936
|
|
68
68
|
fastmcp/server/__init__.py,sha256=qxNmIJcqsrpxpUvCv0mhdEAaUn1UZd1xLd8XRoWUlfY,119
|
|
69
|
-
fastmcp/server/context.py,sha256=
|
|
70
|
-
fastmcp/server/dependencies.py,sha256=
|
|
69
|
+
fastmcp/server/context.py,sha256=TYPUb7zr2rnNNmZSvaKbWy0J94dhdsL210eWl1HMPzQ,28650
|
|
70
|
+
fastmcp/server/dependencies.py,sha256=6p1fkx2N5kNnYPbjVWLRUF2jlTUv11o-EuD1DruFhZo,4239
|
|
71
71
|
fastmcp/server/elicitation.py,sha256=WYsj-H9U-t3b6awcLUWl1b1EA5X48Ef6_kvLhxYgYGs,8777
|
|
72
72
|
fastmcp/server/http.py,sha256=IMggGikJxIMg1CkHH1du3BiKtbD2SU4wDyS0xvLG1O8,12032
|
|
73
73
|
fastmcp/server/low_level.py,sha256=b1Sx0_Py0QxeLXSLdDA5PjR9Dd9ANB7KSNkkGSr1AeE,5490
|
|
74
74
|
fastmcp/server/openapi.py,sha256=xWiQC3mjk81G7ZWhXF3PpECuCM1arD2tiHF9EM9kUyU,42332
|
|
75
|
-
fastmcp/server/proxy.py,sha256=
|
|
76
|
-
fastmcp/server/server.py,sha256=
|
|
77
|
-
fastmcp/server/auth/__init__.py,sha256=
|
|
78
|
-
fastmcp/server/auth/auth.py,sha256=
|
|
75
|
+
fastmcp/server/proxy.py,sha256=VMz0Zr7kDRB5M3pg65NcEaGO2seaGFq940GLzpp8ux4,25805
|
|
76
|
+
fastmcp/server/server.py,sha256=kNjyox_v2a1Wez8cZx_K7Pg3WiWsrX9pcoQ91s1FX9I,109491
|
|
77
|
+
fastmcp/server/auth/__init__.py,sha256=1VZ3MhZhlByvo7QCWT1tMIdRdMppUw4_TeqclSPJeiI,820
|
|
78
|
+
fastmcp/server/auth/auth.py,sha256=YjRM4zHvTlAfQYB97HEnXfCgOXA60Kcrb5O2nHsyka8,14524
|
|
79
79
|
fastmcp/server/auth/jwt_issuer.py,sha256=lJYvrpC1ygI4jkoJlL_nTH6m7FKdTw2lbEycKo4eHLY,7197
|
|
80
80
|
fastmcp/server/auth/middleware.py,sha256=xwj3fUCLSlJK6n1Ehp-FN1qnjKqEz8b7LGAGMTqQ8Hk,3284
|
|
81
|
-
fastmcp/server/auth/oauth_proxy.py,sha256=
|
|
82
|
-
fastmcp/server/auth/oidc_proxy.py,sha256
|
|
81
|
+
fastmcp/server/auth/oauth_proxy.py,sha256=cWPs5k-fZBHWG9tbDxou5emw_0GRz0sO2XY76lmXPbE,89518
|
|
82
|
+
fastmcp/server/auth/oidc_proxy.py,sha256=-S3X0NjV34X07pR4zeXxfZWfa7Kk_mpehspuEhifWE8,15806
|
|
83
83
|
fastmcp/server/auth/redirect_validation.py,sha256=Jlhela9xpTbw4aWnQ04A5Z-TW0HYOC3f9BMsq3NXx1Q,2000
|
|
84
|
-
fastmcp/server/auth/handlers/authorize.py,sha256=
|
|
84
|
+
fastmcp/server/auth/handlers/authorize.py,sha256=1zrmXqRUhjiWSHgUhfj0CcCkj3uSlGkTnxHzaic0xYs,11617
|
|
85
85
|
fastmcp/server/auth/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
86
|
fastmcp/server/auth/providers/auth0.py,sha256=dZkc7hppii20YWota_6_Y3vdNw-DZSq0OyModbly-RA,7814
|
|
87
87
|
fastmcp/server/auth/providers/aws.py,sha256=MXoEEnXmeIlRjaHqTeNCmJ90iTx9jwUdEdpyLUmzfIc,10852
|
|
88
|
-
fastmcp/server/auth/providers/azure.py,sha256=
|
|
88
|
+
fastmcp/server/auth/providers/azure.py,sha256=pzXt6ZM5QurUNtvrPXdwNJJq8Y4RBewadQRfBqS97ZY,16919
|
|
89
89
|
fastmcp/server/auth/providers/bearer.py,sha256=LwkCfDJS48BxBxZwrIrauqNfCtDrJtGqYyEWnJjUq7s,923
|
|
90
|
-
fastmcp/server/auth/providers/
|
|
90
|
+
fastmcp/server/auth/providers/debug.py,sha256=92erHZGQB1ATsl6PwrXui6h3WJ4wLxE9ACbI3JutmWY,3881
|
|
91
|
+
fastmcp/server/auth/providers/descope.py,sha256=n2_9CE7L7rrOS8OBy3G997yUikS2DmkExZznqjKYiWs,6360
|
|
91
92
|
fastmcp/server/auth/providers/github.py,sha256=xsv-Qj1VJRc64YcRuUG4a61xFH1nqqVX_biC7B1su9U,12414
|
|
92
93
|
fastmcp/server/auth/providers/google.py,sha256=5e-XnbAB1xWV0wVPiTg4Lmn_oyniP07wfZ2OKZPDQDM,13629
|
|
93
|
-
fastmcp/server/auth/providers/in_memory.py,sha256=
|
|
94
|
+
fastmcp/server/auth/providers/in_memory.py,sha256=y8a8sfLQXctSB78yGpR3ZyG9x5pWRvI_t0LHgSZ4nvI,15444
|
|
94
95
|
fastmcp/server/auth/providers/introspection.py,sha256=v2hlcuxxwug5myCr4KcTZlawwazAWYVHuRb0d3er13w,10733
|
|
95
|
-
fastmcp/server/auth/providers/jwt.py,sha256=
|
|
96
|
+
fastmcp/server/auth/providers/jwt.py,sha256=c-2Wji-CvuYt3U3unxjJR-5-EABRDks_755EpxKBDH8,20798
|
|
97
|
+
fastmcp/server/auth/providers/oci.py,sha256=-XXDCmxnyBYJ9kdv_Y3iLJ4MxLSOgUjZdJrGwH3vPrE,9849
|
|
96
98
|
fastmcp/server/auth/providers/scalekit.py,sha256=_CEdJ5S9eT24gnNlVYzRMhNAjrkoysVOAPDoyAz8Pxw,6628
|
|
97
|
-
fastmcp/server/auth/providers/supabase.py,sha256=
|
|
98
|
-
fastmcp/server/auth/providers/workos.py,sha256=
|
|
99
|
+
fastmcp/server/auth/providers/supabase.py,sha256=9aK9fZ2OtccOF-ittMJnwj6sEzUNUTIrRPWAPLMwCac,7321
|
|
100
|
+
fastmcp/server/auth/providers/workos.py,sha256=_KWsgKPV4OJ6a37FaVgq2LIzM3Nx26G5QQhgS8x2MO4,17244
|
|
99
101
|
fastmcp/server/middleware/__init__.py,sha256=LXT2IcZI4gbAtR4TnA7v_1lOWBR6eaHiE3Cp32Pv0bc,155
|
|
100
|
-
fastmcp/server/middleware/caching.py,sha256=
|
|
102
|
+
fastmcp/server/middleware/caching.py,sha256=xYUXkFeuoLaIJ_TB2570qEBS1TtneJClJOpJGNsNbu8,18414
|
|
101
103
|
fastmcp/server/middleware/error_handling.py,sha256=eSMKrmIxDcnhzLGyOL49hup5k5e0iwvH_n2XVxJ69W8,7726
|
|
102
|
-
fastmcp/server/middleware/logging.py,sha256=
|
|
103
|
-
fastmcp/server/middleware/middleware.py,sha256=
|
|
104
|
+
fastmcp/server/middleware/logging.py,sha256=Reta-f4z8suYkJn4rPyJWYrNBeU25w8Y40U0uaV9ygo,9427
|
|
105
|
+
fastmcp/server/middleware/middleware.py,sha256=qCzUFJ8vZfd2HwQFl8vcZ_waaaIpQEZgcBnNRahgRwk,6599
|
|
104
106
|
fastmcp/server/middleware/rate_limiting.py,sha256=MwhMOhgsIhZjYwEQB8H8961hohV5564JlTwwYy_9ctU,7915
|
|
105
107
|
fastmcp/server/middleware/timing.py,sha256=lL_xc-ErLD5lplfvd5-HIyWEbZhgNBYkcQ74KFXAMkA,5591
|
|
106
108
|
fastmcp/server/middleware/tool_injection.py,sha256=zElqBN-yjZvcTADp57e0dn86kpxT9xsFqvYztiXuA08,3595
|
|
107
109
|
fastmcp/server/sampling/handler.py,sha256=yjLzvxlGllE-EY4bc6djsijEmwMT24PCpV6vJl-sPcI,580
|
|
108
110
|
fastmcp/tools/__init__.py,sha256=XGcaMkBgwr-AHzbNjyjdb3ATgp5TQ0wzSq0nsrBD__E,201
|
|
109
|
-
fastmcp/tools/tool.py,sha256=
|
|
111
|
+
fastmcp/tools/tool.py,sha256=DG09yKLzHC7zzTsKhTU92fsQtK2S7OuMRe9XygbQFPk,21118
|
|
110
112
|
fastmcp/tools/tool_manager.py,sha256=pCQGvKimXYEigcUqRHBd6_mbfJwD2KN3i0SmFj9Fj_c,5913
|
|
111
113
|
fastmcp/tools/tool_transform.py,sha256=P6f2WVnqqFq9PEsN16go9FzpoRuV8sumxTShzKc6G8U,38462
|
|
112
114
|
fastmcp/utilities/__init__.py,sha256=-imJ8S-rXmbXMWeDamldP-dHDqAPg_wwmPVz-LNX14E,31
|
|
113
115
|
fastmcp/utilities/auth.py,sha256=ZVHkNb4YBpLE1EmmFyhvFB2qfWDZdEYNH9TRI9jylOE,1140
|
|
114
116
|
fastmcp/utilities/cli.py,sha256=46gyOddE8kWhUV2lHFM7kA2v0YNyzcajvIX3Db8gJXk,12174
|
|
115
|
-
fastmcp/utilities/components.py,sha256=
|
|
117
|
+
fastmcp/utilities/components.py,sha256=WY2Bmc4KOLFnDP3YVYB17q4tCCu8ky_naJ9MXFGX-6o,6009
|
|
116
118
|
fastmcp/utilities/exceptions.py,sha256=7Z9j5IzM5rT27BC1Mcn8tkS-bjqCYqMKwb2MMTaxJYU,1350
|
|
117
119
|
fastmcp/utilities/http.py,sha256=1ns1ymBS-WSxbZjGP6JYjSO52Wa_ls4j4WbnXiupoa4,245
|
|
118
120
|
fastmcp/utilities/inspect.py,sha256=3wYUuQH1xCCCdzZwALHNqaRABH6iqpA43dIXEhqVb5Q,18030
|
|
119
|
-
fastmcp/utilities/json_schema.py,sha256
|
|
121
|
+
fastmcp/utilities/json_schema.py,sha256=-XjtAVzCaaJ_S-HoWo7Aabvlu8ubBqyoOinm9E85F4o,8888
|
|
120
122
|
fastmcp/utilities/json_schema_type.py,sha256=AjBhZtAj9-g6goCZbzrSyFthlwrRrfrE4DzgCuphYdw,22250
|
|
121
|
-
fastmcp/utilities/logging.py,sha256=
|
|
123
|
+
fastmcp/utilities/logging.py,sha256=61wVk5yQ62km3K8kZtkKtT_3EN26VL85GYW0aMtnwKA,7175
|
|
122
124
|
fastmcp/utilities/mcp_config.py,sha256=qATTXMGiYET-7PflOixQOgiw3aOizX-RlloRjAo7nwI,1796
|
|
123
|
-
fastmcp/utilities/openapi.py,sha256=
|
|
125
|
+
fastmcp/utilities/openapi.py,sha256=Q3DD3Yc3JwoUG0usSI75OxbLT1ASq9FQwOymx1F8YZk,63339
|
|
124
126
|
fastmcp/utilities/tests.py,sha256=ChjKv-k5vf9y4ZHqItagBtooqPNrQiiJLAARUVOEP6M,8922
|
|
125
|
-
fastmcp/utilities/types.py,sha256=
|
|
126
|
-
fastmcp/utilities/ui.py,sha256=
|
|
127
|
+
fastmcp/utilities/types.py,sha256=BUuL-CeFSPMEXmW_Xtxh5hjSNXoh4LeoimrUs-Rqbm8,15275
|
|
128
|
+
fastmcp/utilities/ui.py,sha256=5UGjbkUEavFIPhL0OYIZ89cDXumjtYDmkqYtiC4FahY,14016
|
|
127
129
|
fastmcp/utilities/mcp_server_config/__init__.py,sha256=hHBxEwRsrgN0Q-1bvj28X6UVGDpfG6dt3yfSBGsOY80,791
|
|
128
130
|
fastmcp/utilities/mcp_server_config/v1/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
129
|
-
fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py,sha256=
|
|
131
|
+
fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py,sha256=9XHryV-JnAcPP5YR_EzAkUDmj5Fm3PE8lNUgTflYZfs,15467
|
|
130
132
|
fastmcp/utilities/mcp_server_config/v1/schema.json,sha256=ymDNFOWzcpnhIMeJmVPTw9b-NtHoHoru8Mc0WlSVxUY,8602
|
|
131
133
|
fastmcp/utilities/mcp_server_config/v1/environments/__init__.py,sha256=Tkv0dmJ6tKKotOBo-tho09QVdvEjy37iBsvBbEwH0EA,256
|
|
132
134
|
fastmcp/utilities/mcp_server_config/v1/environments/base.py,sha256=fbC1C25jI1whwXLlIQtmji5B4UEHLgKvw5K8NICb33Y,826
|
|
@@ -134,8 +136,8 @@ fastmcp/utilities/mcp_server_config/v1/environments/uv.py,sha256=DPVAXM5JDTN89wO
|
|
|
134
136
|
fastmcp/utilities/mcp_server_config/v1/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
135
137
|
fastmcp/utilities/mcp_server_config/v1/sources/base.py,sha256=Y5MCxJyoDsaxcBN1zDL0CZtF5oAXxT_yqQOI-ze9b34,967
|
|
136
138
|
fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py,sha256=eFX47XNXz2oKHW8MZvx60dqyHkBxdg2FMOrHcyAS28g,8106
|
|
137
|
-
fastmcp-2.13.
|
|
138
|
-
fastmcp-2.13.
|
|
139
|
-
fastmcp-2.13.
|
|
140
|
-
fastmcp-2.13.
|
|
141
|
-
fastmcp-2.13.
|
|
139
|
+
fastmcp-2.13.1.dist-info/METADATA,sha256=CA-GT_D_ov8yP-Fpb0MSFD7UgcFPvFfmBRxpS2H_Rkg,20507
|
|
140
|
+
fastmcp-2.13.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
141
|
+
fastmcp-2.13.1.dist-info/entry_points.txt,sha256=ff8bMtKX1JvXyurMibAacMSKbJEPmac9ffAKU9mLnM8,44
|
|
142
|
+
fastmcp-2.13.1.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
|
|
143
|
+
fastmcp-2.13.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|