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.
Files changed (175) hide show
  1. fastmcp/_vendor/__init__.py +1 -0
  2. fastmcp/_vendor/docket_di/README.md +7 -0
  3. fastmcp/_vendor/docket_di/__init__.py +163 -0
  4. fastmcp/cli/cli.py +112 -28
  5. fastmcp/cli/install/claude_code.py +1 -5
  6. fastmcp/cli/install/claude_desktop.py +1 -5
  7. fastmcp/cli/install/cursor.py +1 -5
  8. fastmcp/cli/install/gemini_cli.py +1 -5
  9. fastmcp/cli/install/mcp_json.py +1 -6
  10. fastmcp/cli/run.py +146 -5
  11. fastmcp/client/__init__.py +7 -9
  12. fastmcp/client/auth/oauth.py +18 -17
  13. fastmcp/client/client.py +100 -870
  14. fastmcp/client/elicitation.py +1 -1
  15. fastmcp/client/mixins/__init__.py +13 -0
  16. fastmcp/client/mixins/prompts.py +295 -0
  17. fastmcp/client/mixins/resources.py +325 -0
  18. fastmcp/client/mixins/task_management.py +157 -0
  19. fastmcp/client/mixins/tools.py +397 -0
  20. fastmcp/client/sampling/handlers/anthropic.py +2 -2
  21. fastmcp/client/sampling/handlers/openai.py +1 -1
  22. fastmcp/client/tasks.py +3 -3
  23. fastmcp/client/telemetry.py +47 -0
  24. fastmcp/client/transports/__init__.py +38 -0
  25. fastmcp/client/transports/base.py +82 -0
  26. fastmcp/client/transports/config.py +170 -0
  27. fastmcp/client/transports/http.py +145 -0
  28. fastmcp/client/transports/inference.py +154 -0
  29. fastmcp/client/transports/memory.py +90 -0
  30. fastmcp/client/transports/sse.py +89 -0
  31. fastmcp/client/transports/stdio.py +543 -0
  32. fastmcp/contrib/component_manager/README.md +4 -10
  33. fastmcp/contrib/component_manager/__init__.py +1 -2
  34. fastmcp/contrib/component_manager/component_manager.py +95 -160
  35. fastmcp/contrib/component_manager/example.py +1 -1
  36. fastmcp/contrib/mcp_mixin/example.py +4 -4
  37. fastmcp/contrib/mcp_mixin/mcp_mixin.py +11 -4
  38. fastmcp/decorators.py +41 -0
  39. fastmcp/dependencies.py +12 -1
  40. fastmcp/exceptions.py +4 -0
  41. fastmcp/experimental/server/openapi/__init__.py +18 -15
  42. fastmcp/mcp_config.py +13 -4
  43. fastmcp/prompts/__init__.py +6 -3
  44. fastmcp/prompts/function_prompt.py +465 -0
  45. fastmcp/prompts/prompt.py +321 -271
  46. fastmcp/resources/__init__.py +5 -3
  47. fastmcp/resources/function_resource.py +335 -0
  48. fastmcp/resources/resource.py +325 -115
  49. fastmcp/resources/template.py +215 -43
  50. fastmcp/resources/types.py +27 -12
  51. fastmcp/server/__init__.py +2 -2
  52. fastmcp/server/auth/__init__.py +14 -0
  53. fastmcp/server/auth/auth.py +30 -10
  54. fastmcp/server/auth/authorization.py +190 -0
  55. fastmcp/server/auth/oauth_proxy/__init__.py +14 -0
  56. fastmcp/server/auth/oauth_proxy/consent.py +361 -0
  57. fastmcp/server/auth/oauth_proxy/models.py +178 -0
  58. fastmcp/server/auth/{oauth_proxy.py → oauth_proxy/proxy.py} +24 -778
  59. fastmcp/server/auth/oauth_proxy/ui.py +277 -0
  60. fastmcp/server/auth/oidc_proxy.py +2 -2
  61. fastmcp/server/auth/providers/auth0.py +24 -94
  62. fastmcp/server/auth/providers/aws.py +26 -95
  63. fastmcp/server/auth/providers/azure.py +41 -129
  64. fastmcp/server/auth/providers/descope.py +18 -49
  65. fastmcp/server/auth/providers/discord.py +25 -86
  66. fastmcp/server/auth/providers/github.py +23 -87
  67. fastmcp/server/auth/providers/google.py +24 -87
  68. fastmcp/server/auth/providers/introspection.py +60 -79
  69. fastmcp/server/auth/providers/jwt.py +30 -67
  70. fastmcp/server/auth/providers/oci.py +47 -110
  71. fastmcp/server/auth/providers/scalekit.py +23 -61
  72. fastmcp/server/auth/providers/supabase.py +18 -47
  73. fastmcp/server/auth/providers/workos.py +34 -127
  74. fastmcp/server/context.py +372 -419
  75. fastmcp/server/dependencies.py +541 -251
  76. fastmcp/server/elicitation.py +20 -18
  77. fastmcp/server/event_store.py +3 -3
  78. fastmcp/server/http.py +16 -6
  79. fastmcp/server/lifespan.py +198 -0
  80. fastmcp/server/low_level.py +92 -2
  81. fastmcp/server/middleware/__init__.py +5 -1
  82. fastmcp/server/middleware/authorization.py +312 -0
  83. fastmcp/server/middleware/caching.py +101 -54
  84. fastmcp/server/middleware/middleware.py +6 -9
  85. fastmcp/server/middleware/ping.py +70 -0
  86. fastmcp/server/middleware/tool_injection.py +2 -2
  87. fastmcp/server/mixins/__init__.py +7 -0
  88. fastmcp/server/mixins/lifespan.py +217 -0
  89. fastmcp/server/mixins/mcp_operations.py +392 -0
  90. fastmcp/server/mixins/transport.py +342 -0
  91. fastmcp/server/openapi/__init__.py +41 -21
  92. fastmcp/server/openapi/components.py +16 -339
  93. fastmcp/server/openapi/routing.py +34 -118
  94. fastmcp/server/openapi/server.py +67 -392
  95. fastmcp/server/providers/__init__.py +71 -0
  96. fastmcp/server/providers/aggregate.py +261 -0
  97. fastmcp/server/providers/base.py +578 -0
  98. fastmcp/server/providers/fastmcp_provider.py +674 -0
  99. fastmcp/server/providers/filesystem.py +226 -0
  100. fastmcp/server/providers/filesystem_discovery.py +327 -0
  101. fastmcp/server/providers/local_provider/__init__.py +11 -0
  102. fastmcp/server/providers/local_provider/decorators/__init__.py +15 -0
  103. fastmcp/server/providers/local_provider/decorators/prompts.py +256 -0
  104. fastmcp/server/providers/local_provider/decorators/resources.py +240 -0
  105. fastmcp/server/providers/local_provider/decorators/tools.py +315 -0
  106. fastmcp/server/providers/local_provider/local_provider.py +465 -0
  107. fastmcp/server/providers/openapi/__init__.py +39 -0
  108. fastmcp/server/providers/openapi/components.py +332 -0
  109. fastmcp/server/providers/openapi/provider.py +405 -0
  110. fastmcp/server/providers/openapi/routing.py +109 -0
  111. fastmcp/server/providers/proxy.py +867 -0
  112. fastmcp/server/providers/skills/__init__.py +59 -0
  113. fastmcp/server/providers/skills/_common.py +101 -0
  114. fastmcp/server/providers/skills/claude_provider.py +44 -0
  115. fastmcp/server/providers/skills/directory_provider.py +153 -0
  116. fastmcp/server/providers/skills/skill_provider.py +432 -0
  117. fastmcp/server/providers/skills/vendor_providers.py +142 -0
  118. fastmcp/server/providers/wrapped_provider.py +140 -0
  119. fastmcp/server/proxy.py +34 -700
  120. fastmcp/server/sampling/run.py +341 -2
  121. fastmcp/server/sampling/sampling_tool.py +4 -3
  122. fastmcp/server/server.py +1214 -2171
  123. fastmcp/server/tasks/__init__.py +2 -1
  124. fastmcp/server/tasks/capabilities.py +13 -1
  125. fastmcp/server/tasks/config.py +66 -3
  126. fastmcp/server/tasks/handlers.py +65 -273
  127. fastmcp/server/tasks/keys.py +4 -6
  128. fastmcp/server/tasks/requests.py +474 -0
  129. fastmcp/server/tasks/routing.py +76 -0
  130. fastmcp/server/tasks/subscriptions.py +20 -11
  131. fastmcp/server/telemetry.py +131 -0
  132. fastmcp/server/transforms/__init__.py +244 -0
  133. fastmcp/server/transforms/namespace.py +193 -0
  134. fastmcp/server/transforms/prompts_as_tools.py +175 -0
  135. fastmcp/server/transforms/resources_as_tools.py +190 -0
  136. fastmcp/server/transforms/tool_transform.py +96 -0
  137. fastmcp/server/transforms/version_filter.py +124 -0
  138. fastmcp/server/transforms/visibility.py +526 -0
  139. fastmcp/settings.py +34 -96
  140. fastmcp/telemetry.py +122 -0
  141. fastmcp/tools/__init__.py +10 -3
  142. fastmcp/tools/function_parsing.py +201 -0
  143. fastmcp/tools/function_tool.py +467 -0
  144. fastmcp/tools/tool.py +215 -362
  145. fastmcp/tools/tool_transform.py +38 -21
  146. fastmcp/utilities/async_utils.py +69 -0
  147. fastmcp/utilities/components.py +152 -91
  148. fastmcp/utilities/inspect.py +8 -20
  149. fastmcp/utilities/json_schema.py +12 -5
  150. fastmcp/utilities/json_schema_type.py +17 -15
  151. fastmcp/utilities/lifespan.py +56 -0
  152. fastmcp/utilities/logging.py +12 -4
  153. fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +3 -3
  154. fastmcp/utilities/openapi/parser.py +3 -3
  155. fastmcp/utilities/pagination.py +80 -0
  156. fastmcp/utilities/skills.py +253 -0
  157. fastmcp/utilities/tests.py +0 -16
  158. fastmcp/utilities/timeout.py +47 -0
  159. fastmcp/utilities/types.py +1 -1
  160. fastmcp/utilities/versions.py +285 -0
  161. {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/METADATA +8 -5
  162. fastmcp-3.0.0b1.dist-info/RECORD +228 -0
  163. fastmcp/client/transports.py +0 -1170
  164. fastmcp/contrib/component_manager/component_service.py +0 -209
  165. fastmcp/prompts/prompt_manager.py +0 -117
  166. fastmcp/resources/resource_manager.py +0 -338
  167. fastmcp/server/tasks/converters.py +0 -206
  168. fastmcp/server/tasks/protocol.py +0 -359
  169. fastmcp/tools/tool_manager.py +0 -170
  170. fastmcp/utilities/mcp_config.py +0 -56
  171. fastmcp-2.14.4.dist-info/RECORD +0 -161
  172. /fastmcp/server/{openapi → providers/openapi}/README.md +0 -0
  173. {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/WHEEL +0 -0
  174. {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/entry_points.txt +0 -0
  175. {fastmcp-2.14.4.dist-info → fastmcp-3.0.0b1.dist-info}/licenses/LICENSE +0 -0
@@ -12,48 +12,19 @@ from __future__ import annotations
12
12
 
13
13
  import httpx
14
14
  from key_value.aio.protocols import AsyncKeyValue
15
- from pydantic import AnyHttpUrl, SecretStr, field_validator
16
- from pydantic_settings import BaseSettings, SettingsConfigDict
15
+ from pydantic import AnyHttpUrl
17
16
  from starlette.responses import JSONResponse
18
17
  from starlette.routing import Route
19
18
 
20
19
  from fastmcp.server.auth import AccessToken, RemoteAuthProvider, TokenVerifier
21
20
  from fastmcp.server.auth.oauth_proxy import OAuthProxy
22
21
  from fastmcp.server.auth.providers.jwt import JWTVerifier
23
- from fastmcp.settings import ENV_FILE
24
22
  from fastmcp.utilities.auth import parse_scopes
25
23
  from fastmcp.utilities.logging import get_logger
26
- from fastmcp.utilities.types import NotSet, NotSetT
27
24
 
28
25
  logger = get_logger(__name__)
29
26
 
30
27
 
31
- class WorkOSProviderSettings(BaseSettings):
32
- """Settings for WorkOS OAuth provider."""
33
-
34
- model_config = SettingsConfigDict(
35
- env_prefix="FASTMCP_SERVER_AUTH_WORKOS_",
36
- env_file=ENV_FILE,
37
- extra="ignore",
38
- )
39
-
40
- client_id: str | None = None
41
- client_secret: SecretStr | None = None
42
- authkit_domain: str | None = None # e.g., "https://your-app.authkit.app"
43
- base_url: AnyHttpUrl | str | None = None
44
- issuer_url: AnyHttpUrl | str | None = None
45
- redirect_path: str | None = None
46
- required_scopes: list[str] | None = None
47
- timeout_seconds: int | None = None
48
- allowed_client_redirect_uris: list[str] | None = None
49
- jwt_signing_key: str | None = None
50
-
51
- @field_validator("required_scopes", mode="before")
52
- @classmethod
53
- def _parse_scopes(cls, v):
54
- return parse_scopes(v)
55
-
56
-
57
28
  class WorkOSTokenVerifier(TokenVerifier):
58
29
  """Token verifier for WorkOS OAuth tokens.
59
30
 
@@ -163,17 +134,17 @@ class WorkOSProvider(OAuthProxy):
163
134
  def __init__(
164
135
  self,
165
136
  *,
166
- client_id: str | NotSetT = NotSet,
167
- client_secret: str | NotSetT = NotSet,
168
- authkit_domain: str | NotSetT = NotSet,
169
- base_url: AnyHttpUrl | str | NotSetT = NotSet,
170
- issuer_url: AnyHttpUrl | str | NotSetT = NotSet,
171
- redirect_path: str | NotSetT = NotSet,
172
- required_scopes: list[str] | NotSetT | None = NotSet,
173
- timeout_seconds: int | NotSetT = NotSet,
174
- allowed_client_redirect_uris: list[str] | NotSetT = NotSet,
137
+ client_id: str,
138
+ client_secret: str,
139
+ authkit_domain: str,
140
+ base_url: AnyHttpUrl | str,
141
+ issuer_url: AnyHttpUrl | str | None = None,
142
+ redirect_path: str | None = None,
143
+ required_scopes: list[str] | None = None,
144
+ timeout_seconds: int = 10,
145
+ allowed_client_redirect_uris: list[str] | None = None,
175
146
  client_storage: AsyncKeyValue | None = None,
176
- jwt_signing_key: str | bytes | NotSetT = NotSet,
147
+ jwt_signing_key: str | bytes | None = None,
177
148
  require_authorization_consent: bool = True,
178
149
  ):
179
150
  """Initialize WorkOS OAuth provider.
@@ -187,7 +158,7 @@ class WorkOSProvider(OAuthProxy):
187
158
  to avoid 404s during discovery when mounting under a path.
188
159
  redirect_path: Redirect path configured in WorkOS (defaults to "/auth/callback")
189
160
  required_scopes: Required OAuth scopes (no default)
190
- timeout_seconds: HTTP request timeout for WorkOS API calls
161
+ timeout_seconds: HTTP request timeout for WorkOS API calls (defaults to 10)
191
162
  allowed_client_redirect_uris: List of allowed redirect URI patterns for MCP clients.
192
163
  If None (default), all URIs are allowed. If empty list, no URIs are allowed.
193
164
  client_storage: Storage backend for OAuth state (client registrations, encrypted tokens).
@@ -201,102 +172,45 @@ class WorkOSProvider(OAuthProxy):
201
172
  When False, authorization proceeds directly without user confirmation.
202
173
  SECURITY WARNING: Only disable for local development or testing environments.
203
174
  """
204
-
205
- settings = WorkOSProviderSettings.model_validate(
206
- {
207
- k: v
208
- for k, v in {
209
- "client_id": client_id,
210
- "client_secret": client_secret,
211
- "authkit_domain": authkit_domain,
212
- "base_url": base_url,
213
- "issuer_url": issuer_url,
214
- "redirect_path": redirect_path,
215
- "required_scopes": required_scopes,
216
- "timeout_seconds": timeout_seconds,
217
- "allowed_client_redirect_uris": allowed_client_redirect_uris,
218
- "jwt_signing_key": jwt_signing_key,
219
- }.items()
220
- if v is not NotSet
221
- }
222
- )
223
-
224
- # Validate required settings
225
- if not settings.client_id:
226
- raise ValueError(
227
- "client_id is required - set via parameter or FASTMCP_SERVER_AUTH_WORKOS_CLIENT_ID"
228
- )
229
- if not settings.client_secret:
230
- raise ValueError(
231
- "client_secret is required - set via parameter or FASTMCP_SERVER_AUTH_WORKOS_CLIENT_SECRET"
232
- )
233
- if not settings.authkit_domain:
234
- raise ValueError(
235
- "authkit_domain is required - set via parameter or FASTMCP_SERVER_AUTH_WORKOS_AUTHKIT_DOMAIN"
236
- )
237
-
238
175
  # Apply defaults and ensure authkit_domain is a full URL
239
- authkit_domain_str = settings.authkit_domain
176
+ authkit_domain_str = authkit_domain
240
177
  if not authkit_domain_str.startswith(("http://", "https://")):
241
178
  authkit_domain_str = f"https://{authkit_domain_str}"
242
179
  authkit_domain_final = authkit_domain_str.rstrip("/")
243
- timeout_seconds_final = settings.timeout_seconds or 10
244
- scopes_final = settings.required_scopes or []
245
- allowed_client_redirect_uris_final = settings.allowed_client_redirect_uris
246
-
247
- # Extract secret string from SecretStr
248
- client_secret_str = (
249
- settings.client_secret.get_secret_value() if settings.client_secret else ""
180
+ scopes_final = (
181
+ parse_scopes(required_scopes) if required_scopes is not None else []
250
182
  )
251
183
 
252
184
  # Create WorkOS token verifier
253
185
  token_verifier = WorkOSTokenVerifier(
254
186
  authkit_domain=authkit_domain_final,
255
187
  required_scopes=scopes_final,
256
- timeout_seconds=timeout_seconds_final,
188
+ timeout_seconds=timeout_seconds,
257
189
  )
258
190
 
259
191
  # Initialize OAuth proxy with WorkOS AuthKit endpoints
260
192
  super().__init__(
261
193
  upstream_authorization_endpoint=f"{authkit_domain_final}/oauth2/authorize",
262
194
  upstream_token_endpoint=f"{authkit_domain_final}/oauth2/token",
263
- upstream_client_id=settings.client_id,
264
- upstream_client_secret=client_secret_str,
195
+ upstream_client_id=client_id,
196
+ upstream_client_secret=client_secret,
265
197
  token_verifier=token_verifier,
266
- base_url=settings.base_url,
267
- redirect_path=settings.redirect_path,
268
- issuer_url=settings.issuer_url
269
- or settings.base_url, # Default to base_url if not specified
270
- allowed_client_redirect_uris=allowed_client_redirect_uris_final,
198
+ base_url=base_url,
199
+ redirect_path=redirect_path,
200
+ issuer_url=issuer_url or base_url, # Default to base_url if not specified
201
+ allowed_client_redirect_uris=allowed_client_redirect_uris,
271
202
  client_storage=client_storage,
272
- jwt_signing_key=settings.jwt_signing_key,
203
+ jwt_signing_key=jwt_signing_key,
273
204
  require_authorization_consent=require_authorization_consent,
274
205
  )
275
206
 
276
207
  logger.debug(
277
208
  "Initialized WorkOS OAuth provider for client %s with AuthKit domain %s",
278
- settings.client_id,
209
+ client_id,
279
210
  authkit_domain_final,
280
211
  )
281
212
 
282
213
 
283
- class AuthKitProviderSettings(BaseSettings):
284
- model_config = SettingsConfigDict(
285
- env_prefix="FASTMCP_SERVER_AUTH_AUTHKITPROVIDER_",
286
- env_file=ENV_FILE,
287
- extra="ignore",
288
- )
289
-
290
- authkit_domain: AnyHttpUrl
291
- base_url: AnyHttpUrl
292
- required_scopes: list[str] | None = None
293
-
294
- @field_validator("required_scopes", mode="before")
295
- @classmethod
296
- def _parse_scopes(cls, v):
297
- return parse_scopes(v)
298
-
299
-
300
214
  class AuthKitProvider(RemoteAuthProvider):
301
215
  """AuthKit metadata provider for DCR (Dynamic Client Registration).
302
216
 
@@ -336,9 +250,9 @@ class AuthKitProvider(RemoteAuthProvider):
336
250
  def __init__(
337
251
  self,
338
252
  *,
339
- authkit_domain: AnyHttpUrl | str | NotSetT = NotSet,
340
- base_url: AnyHttpUrl | str | NotSetT = NotSet,
341
- required_scopes: list[str] | NotSetT | None = NotSet,
253
+ authkit_domain: AnyHttpUrl | str,
254
+ base_url: AnyHttpUrl | str,
255
+ required_scopes: list[str] | None = None,
342
256
  token_verifier: TokenVerifier | None = None,
343
257
  ):
344
258
  """Initialize AuthKit metadata provider.
@@ -349,20 +263,13 @@ class AuthKitProvider(RemoteAuthProvider):
349
263
  required_scopes: Optional list of scopes to require for all requests
350
264
  token_verifier: Optional token verifier. If None, creates JWT verifier for AuthKit
351
265
  """
352
- settings = AuthKitProviderSettings.model_validate(
353
- {
354
- k: v
355
- for k, v in {
356
- "authkit_domain": authkit_domain,
357
- "base_url": base_url,
358
- "required_scopes": required_scopes,
359
- }.items()
360
- if v is not NotSet
361
- }
362
- )
266
+ self.authkit_domain = str(authkit_domain).rstrip("/")
267
+ self.base_url = AnyHttpUrl(str(base_url).rstrip("/"))
363
268
 
364
- self.authkit_domain = str(settings.authkit_domain).rstrip("/")
365
- self.base_url = AnyHttpUrl(str(settings.base_url).rstrip("/"))
269
+ # Parse scopes if provided as string
270
+ parsed_scopes = (
271
+ parse_scopes(required_scopes) if required_scopes is not None else None
272
+ )
366
273
 
367
274
  # Create default JWT verifier if none provided
368
275
  if token_verifier is None:
@@ -370,7 +277,7 @@ class AuthKitProvider(RemoteAuthProvider):
370
277
  jwks_uri=f"{self.authkit_domain}/oauth2/jwks",
371
278
  issuer=self.authkit_domain,
372
279
  algorithm="RS256",
373
- required_scopes=settings.required_scopes,
280
+ required_scopes=parsed_scopes,
374
281
  )
375
282
 
376
283
  # Initialize RemoteAuthProvider with AuthKit as the authorization server