fastmcp 2.14.4__py3-none-any.whl → 3.0.0b1__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/_vendor/__init__.py +1 -0
- fastmcp/_vendor/docket_di/README.md +7 -0
- fastmcp/_vendor/docket_di/__init__.py +163 -0
- fastmcp/cli/cli.py +112 -28
- fastmcp/cli/install/claude_code.py +1 -5
- fastmcp/cli/install/claude_desktop.py +1 -5
- fastmcp/cli/install/cursor.py +1 -5
- fastmcp/cli/install/gemini_cli.py +1 -5
- fastmcp/cli/install/mcp_json.py +1 -6
- fastmcp/cli/run.py +146 -5
- fastmcp/client/__init__.py +7 -9
- fastmcp/client/auth/oauth.py +18 -17
- fastmcp/client/client.py +100 -870
- fastmcp/client/elicitation.py +1 -1
- fastmcp/client/mixins/__init__.py +13 -0
- fastmcp/client/mixins/prompts.py +295 -0
- fastmcp/client/mixins/resources.py +325 -0
- fastmcp/client/mixins/task_management.py +157 -0
- fastmcp/client/mixins/tools.py +397 -0
- fastmcp/client/sampling/handlers/anthropic.py +2 -2
- fastmcp/client/sampling/handlers/openai.py +1 -1
- fastmcp/client/tasks.py +3 -3
- fastmcp/client/telemetry.py +47 -0
- fastmcp/client/transports/__init__.py +38 -0
- fastmcp/client/transports/base.py +82 -0
- fastmcp/client/transports/config.py +170 -0
- fastmcp/client/transports/http.py +145 -0
- fastmcp/client/transports/inference.py +154 -0
- fastmcp/client/transports/memory.py +90 -0
- fastmcp/client/transports/sse.py +89 -0
- fastmcp/client/transports/stdio.py +543 -0
- fastmcp/contrib/component_manager/README.md +4 -10
- fastmcp/contrib/component_manager/__init__.py +1 -2
- fastmcp/contrib/component_manager/component_manager.py +95 -160
- fastmcp/contrib/component_manager/example.py +1 -1
- fastmcp/contrib/mcp_mixin/example.py +4 -4
- fastmcp/contrib/mcp_mixin/mcp_mixin.py +11 -4
- fastmcp/decorators.py +41 -0
- fastmcp/dependencies.py +12 -1
- fastmcp/exceptions.py +4 -0
- fastmcp/experimental/server/openapi/__init__.py +18 -15
- fastmcp/mcp_config.py +13 -4
- fastmcp/prompts/__init__.py +6 -3
- fastmcp/prompts/function_prompt.py +465 -0
- fastmcp/prompts/prompt.py +321 -271
- fastmcp/resources/__init__.py +5 -3
- fastmcp/resources/function_resource.py +335 -0
- fastmcp/resources/resource.py +325 -115
- fastmcp/resources/template.py +215 -43
- fastmcp/resources/types.py +27 -12
- fastmcp/server/__init__.py +2 -2
- fastmcp/server/auth/__init__.py +14 -0
- fastmcp/server/auth/auth.py +30 -10
- fastmcp/server/auth/authorization.py +190 -0
- fastmcp/server/auth/oauth_proxy/__init__.py +14 -0
- fastmcp/server/auth/oauth_proxy/consent.py +361 -0
- fastmcp/server/auth/oauth_proxy/models.py +178 -0
- fastmcp/server/auth/{oauth_proxy.py → oauth_proxy/proxy.py} +24 -778
- fastmcp/server/auth/oauth_proxy/ui.py +277 -0
- fastmcp/server/auth/oidc_proxy.py +2 -2
- fastmcp/server/auth/providers/auth0.py +24 -94
- fastmcp/server/auth/providers/aws.py +26 -95
- fastmcp/server/auth/providers/azure.py +41 -129
- fastmcp/server/auth/providers/descope.py +18 -49
- fastmcp/server/auth/providers/discord.py +25 -86
- fastmcp/server/auth/providers/github.py +23 -87
- fastmcp/server/auth/providers/google.py +24 -87
- fastmcp/server/auth/providers/introspection.py +60 -79
- fastmcp/server/auth/providers/jwt.py +30 -67
- fastmcp/server/auth/providers/oci.py +47 -110
- fastmcp/server/auth/providers/scalekit.py +23 -61
- fastmcp/server/auth/providers/supabase.py +18 -47
- fastmcp/server/auth/providers/workos.py +34 -127
- fastmcp/server/context.py +372 -419
- fastmcp/server/dependencies.py +541 -251
- fastmcp/server/elicitation.py +20 -18
- fastmcp/server/event_store.py +3 -3
- fastmcp/server/http.py +16 -6
- fastmcp/server/lifespan.py +198 -0
- fastmcp/server/low_level.py +92 -2
- fastmcp/server/middleware/__init__.py +5 -1
- fastmcp/server/middleware/authorization.py +312 -0
- fastmcp/server/middleware/caching.py +101 -54
- fastmcp/server/middleware/middleware.py +6 -9
- fastmcp/server/middleware/ping.py +70 -0
- fastmcp/server/middleware/tool_injection.py +2 -2
- fastmcp/server/mixins/__init__.py +7 -0
- fastmcp/server/mixins/lifespan.py +217 -0
- fastmcp/server/mixins/mcp_operations.py +392 -0
- fastmcp/server/mixins/transport.py +342 -0
- fastmcp/server/openapi/__init__.py +41 -21
- fastmcp/server/openapi/components.py +16 -339
- fastmcp/server/openapi/routing.py +34 -118
- fastmcp/server/openapi/server.py +67 -392
- fastmcp/server/providers/__init__.py +71 -0
- fastmcp/server/providers/aggregate.py +261 -0
- fastmcp/server/providers/base.py +578 -0
- fastmcp/server/providers/fastmcp_provider.py +674 -0
- fastmcp/server/providers/filesystem.py +226 -0
- fastmcp/server/providers/filesystem_discovery.py +327 -0
- fastmcp/server/providers/local_provider/__init__.py +11 -0
- fastmcp/server/providers/local_provider/decorators/__init__.py +15 -0
- fastmcp/server/providers/local_provider/decorators/prompts.py +256 -0
- fastmcp/server/providers/local_provider/decorators/resources.py +240 -0
- fastmcp/server/providers/local_provider/decorators/tools.py +315 -0
- fastmcp/server/providers/local_provider/local_provider.py +465 -0
- fastmcp/server/providers/openapi/__init__.py +39 -0
- fastmcp/server/providers/openapi/components.py +332 -0
- fastmcp/server/providers/openapi/provider.py +405 -0
- fastmcp/server/providers/openapi/routing.py +109 -0
- fastmcp/server/providers/proxy.py +867 -0
- fastmcp/server/providers/skills/__init__.py +59 -0
- fastmcp/server/providers/skills/_common.py +101 -0
- fastmcp/server/providers/skills/claude_provider.py +44 -0
- fastmcp/server/providers/skills/directory_provider.py +153 -0
- fastmcp/server/providers/skills/skill_provider.py +432 -0
- fastmcp/server/providers/skills/vendor_providers.py +142 -0
- fastmcp/server/providers/wrapped_provider.py +140 -0
- fastmcp/server/proxy.py +34 -700
- fastmcp/server/sampling/run.py +341 -2
- fastmcp/server/sampling/sampling_tool.py +4 -3
- fastmcp/server/server.py +1214 -2171
- fastmcp/server/tasks/__init__.py +2 -1
- fastmcp/server/tasks/capabilities.py +13 -1
- fastmcp/server/tasks/config.py +66 -3
- fastmcp/server/tasks/handlers.py +65 -273
- fastmcp/server/tasks/keys.py +4 -6
- fastmcp/server/tasks/requests.py +474 -0
- fastmcp/server/tasks/routing.py +76 -0
- fastmcp/server/tasks/subscriptions.py +20 -11
- fastmcp/server/telemetry.py +131 -0
- fastmcp/server/transforms/__init__.py +244 -0
- fastmcp/server/transforms/namespace.py +193 -0
- fastmcp/server/transforms/prompts_as_tools.py +175 -0
- fastmcp/server/transforms/resources_as_tools.py +190 -0
- fastmcp/server/transforms/tool_transform.py +96 -0
- fastmcp/server/transforms/version_filter.py +124 -0
- fastmcp/server/transforms/visibility.py +526 -0
- fastmcp/settings.py +34 -96
- fastmcp/telemetry.py +122 -0
- fastmcp/tools/__init__.py +10 -3
- fastmcp/tools/function_parsing.py +201 -0
- fastmcp/tools/function_tool.py +467 -0
- fastmcp/tools/tool.py +215 -362
- fastmcp/tools/tool_transform.py +38 -21
- fastmcp/utilities/async_utils.py +69 -0
- fastmcp/utilities/components.py +152 -91
- fastmcp/utilities/inspect.py +8 -20
- fastmcp/utilities/json_schema.py +12 -5
- fastmcp/utilities/json_schema_type.py +17 -15
- fastmcp/utilities/lifespan.py +56 -0
- fastmcp/utilities/logging.py +12 -4
- fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +3 -3
- fastmcp/utilities/openapi/parser.py +3 -3
- fastmcp/utilities/pagination.py +80 -0
- fastmcp/utilities/skills.py +253 -0
- fastmcp/utilities/tests.py +0 -16
- fastmcp/utilities/timeout.py +47 -0
- fastmcp/utilities/types.py +1 -1
- fastmcp/utilities/versions.py +285 -0
- {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/METADATA +8 -5
- fastmcp-3.0.0b1.dist-info/RECORD +228 -0
- fastmcp/client/transports.py +0 -1170
- fastmcp/contrib/component_manager/component_service.py +0 -209
- fastmcp/prompts/prompt_manager.py +0 -117
- fastmcp/resources/resource_manager.py +0 -338
- fastmcp/server/tasks/converters.py +0 -206
- fastmcp/server/tasks/protocol.py +0 -359
- fastmcp/tools/tool_manager.py +0 -170
- fastmcp/utilities/mcp_config.py +0 -56
- fastmcp-2.14.4.dist-info/RECORD +0 -161
- /fastmcp/server/{openapi → providers/openapi}/README.md +0 -0
- {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/WHEEL +0 -0
- {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/entry_points.txt +0 -0
- {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"""WrappedProvider for immutable transform composition.
|
|
2
|
+
|
|
3
|
+
This module provides `_WrappedProvider`, an internal class that wraps a provider
|
|
4
|
+
with an additional transform. Created by `Provider.wrap_transform()`.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from collections.abc import AsyncIterator, Sequence
|
|
10
|
+
from contextlib import asynccontextmanager
|
|
11
|
+
from typing import TYPE_CHECKING
|
|
12
|
+
|
|
13
|
+
from fastmcp.server.providers.base import Provider
|
|
14
|
+
from fastmcp.utilities.versions import VersionSpec
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from fastmcp.prompts.prompt import Prompt
|
|
18
|
+
from fastmcp.resources.resource import Resource
|
|
19
|
+
from fastmcp.resources.template import ResourceTemplate
|
|
20
|
+
from fastmcp.server.transforms import Transform
|
|
21
|
+
from fastmcp.tools.tool import Tool
|
|
22
|
+
from fastmcp.utilities.components import FastMCPComponent
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class _WrappedProvider(Provider):
|
|
26
|
+
"""Internal provider that wraps another provider with a transform.
|
|
27
|
+
|
|
28
|
+
Created by Provider.wrap_transform(). Delegates all component sourcing
|
|
29
|
+
to the inner provider's public methods (which apply inner's transforms),
|
|
30
|
+
then applies the wrapper's transform on top.
|
|
31
|
+
|
|
32
|
+
This enables immutable transform composition - the inner provider is
|
|
33
|
+
unchanged, and the wrapper adds its transform layer.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(self, inner: Provider, transform: Transform) -> None:
|
|
37
|
+
"""Initialize wrapped provider.
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
inner: The provider to wrap.
|
|
41
|
+
transform: The transform to apply on top of inner's results.
|
|
42
|
+
"""
|
|
43
|
+
super().__init__()
|
|
44
|
+
self._inner = inner
|
|
45
|
+
# Add the transform to this provider's transform list
|
|
46
|
+
# It will be applied via the normal transform chain
|
|
47
|
+
self._transforms.append(transform)
|
|
48
|
+
|
|
49
|
+
def __repr__(self) -> str:
|
|
50
|
+
return f"_WrappedProvider({self._inner!r}, transforms={self._transforms!r})"
|
|
51
|
+
|
|
52
|
+
# -------------------------------------------------------------------------
|
|
53
|
+
# Delegate to inner provider's public methods (which apply inner's transforms)
|
|
54
|
+
# -------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
async def _list_tools(self) -> Sequence[Tool]:
|
|
57
|
+
"""Delegate to inner's list_tools (includes inner's transforms)."""
|
|
58
|
+
return await self._inner.list_tools()
|
|
59
|
+
|
|
60
|
+
async def _get_tool(
|
|
61
|
+
self, name: str, version: VersionSpec | None = None
|
|
62
|
+
) -> Tool | None:
|
|
63
|
+
"""Delegate to inner's get_tool (includes inner's transforms)."""
|
|
64
|
+
return await self._inner.get_tool(name, version)
|
|
65
|
+
|
|
66
|
+
async def _list_resources(self) -> Sequence[Resource]:
|
|
67
|
+
"""Delegate to inner's list_resources (includes inner's transforms)."""
|
|
68
|
+
return await self._inner.list_resources()
|
|
69
|
+
|
|
70
|
+
async def _get_resource(
|
|
71
|
+
self, uri: str, version: VersionSpec | None = None
|
|
72
|
+
) -> Resource | None:
|
|
73
|
+
"""Delegate to inner's get_resource (includes inner's transforms)."""
|
|
74
|
+
return await self._inner.get_resource(uri, version)
|
|
75
|
+
|
|
76
|
+
async def _list_resource_templates(self) -> Sequence[ResourceTemplate]:
|
|
77
|
+
"""Delegate to inner's list_resource_templates (includes inner's transforms)."""
|
|
78
|
+
return await self._inner.list_resource_templates()
|
|
79
|
+
|
|
80
|
+
async def _get_resource_template(
|
|
81
|
+
self, uri: str, version: VersionSpec | None = None
|
|
82
|
+
) -> ResourceTemplate | None:
|
|
83
|
+
"""Delegate to inner's get_resource_template (includes inner's transforms)."""
|
|
84
|
+
return await self._inner.get_resource_template(uri, version)
|
|
85
|
+
|
|
86
|
+
async def _list_prompts(self) -> Sequence[Prompt]:
|
|
87
|
+
"""Delegate to inner's list_prompts (includes inner's transforms)."""
|
|
88
|
+
return await self._inner.list_prompts()
|
|
89
|
+
|
|
90
|
+
async def _get_prompt(
|
|
91
|
+
self, name: str, version: VersionSpec | None = None
|
|
92
|
+
) -> Prompt | None:
|
|
93
|
+
"""Delegate to inner's get_prompt (includes inner's transforms)."""
|
|
94
|
+
return await self._inner.get_prompt(name, version)
|
|
95
|
+
|
|
96
|
+
async def get_tasks(self) -> Sequence[FastMCPComponent]:
|
|
97
|
+
"""Delegate to inner's get_tasks and apply wrapper's transforms."""
|
|
98
|
+
# Import here to avoid circular imports
|
|
99
|
+
from fastmcp.prompts.prompt import Prompt
|
|
100
|
+
from fastmcp.resources.resource import Resource
|
|
101
|
+
from fastmcp.resources.template import ResourceTemplate
|
|
102
|
+
from fastmcp.tools.tool import Tool
|
|
103
|
+
|
|
104
|
+
# Get tasks from inner (already has inner's transforms)
|
|
105
|
+
components = list(await self._inner.get_tasks())
|
|
106
|
+
|
|
107
|
+
# Apply this wrapper's transforms to the components
|
|
108
|
+
# We need to apply transforms per component type
|
|
109
|
+
tools = [c for c in components if isinstance(c, Tool)]
|
|
110
|
+
resources = [c for c in components if isinstance(c, Resource)]
|
|
111
|
+
templates = [c for c in components if isinstance(c, ResourceTemplate)]
|
|
112
|
+
prompts = [c for c in components if isinstance(c, Prompt)]
|
|
113
|
+
|
|
114
|
+
# Apply this wrapper's transforms sequentially
|
|
115
|
+
for transform in self.transforms:
|
|
116
|
+
tools = await transform.list_tools(tools)
|
|
117
|
+
resources = await transform.list_resources(resources)
|
|
118
|
+
templates = await transform.list_resource_templates(templates)
|
|
119
|
+
prompts = await transform.list_prompts(prompts)
|
|
120
|
+
|
|
121
|
+
return [
|
|
122
|
+
c
|
|
123
|
+
for c in [
|
|
124
|
+
*tools,
|
|
125
|
+
*resources,
|
|
126
|
+
*templates,
|
|
127
|
+
*prompts,
|
|
128
|
+
]
|
|
129
|
+
if c.task_config.supports_tasks()
|
|
130
|
+
]
|
|
131
|
+
|
|
132
|
+
# -------------------------------------------------------------------------
|
|
133
|
+
# Lifecycle - combine with inner
|
|
134
|
+
# -------------------------------------------------------------------------
|
|
135
|
+
|
|
136
|
+
@asynccontextmanager
|
|
137
|
+
async def lifespan(self) -> AsyncIterator[None]:
|
|
138
|
+
"""Combine lifespan with inner provider."""
|
|
139
|
+
async with self._inner.lifespan():
|
|
140
|
+
yield
|